aboutsummaryrefslogtreecommitdiff
path: root/documentation/content/ru/books
diff options
context:
space:
mode:
Diffstat (limited to 'documentation/content/ru/books')
-rw-r--r--documentation/content/ru/books/arch-handbook/_index.adoc57
-rw-r--r--documentation/content/ru/books/arch-handbook/_index.po71
-rw-r--r--documentation/content/ru/books/arch-handbook/bibliography/_index.adoc51
-rw-r--r--documentation/content/ru/books/arch-handbook/bibliography/_index.po45
-rw-r--r--documentation/content/ru/books/arch-handbook/book.adoc49
-rw-r--r--documentation/content/ru/books/arch-handbook/book.po71
-rw-r--r--documentation/content/ru/books/arch-handbook/boot/_index.adoc1351
-rw-r--r--documentation/content/ru/books/arch-handbook/boot/_index.po4415
-rw-r--r--documentation/content/ru/books/arch-handbook/driverbasics/_index.adoc347
-rw-r--r--documentation/content/ru/books/arch-handbook/driverbasics/_index.po867
-rw-r--r--documentation/content/ru/books/arch-handbook/isa/_index.adoc1121
-rw-r--r--documentation/content/ru/books/arch-handbook/isa/_index.po4237
-rw-r--r--documentation/content/ru/books/arch-handbook/jail/_index.adoc529
-rw-r--r--documentation/content/ru/books/arch-handbook/jail/_index.po1452
-rw-r--r--documentation/content/ru/books/arch-handbook/kobj/_index.adoc259
-rw-r--r--documentation/content/ru/books/arch-handbook/kobj/_index.po622
-rw-r--r--documentation/content/ru/books/arch-handbook/locking/_index.adoc145
-rw-r--r--documentation/content/ru/books/arch-handbook/locking/_index.po390
-rw-r--r--documentation/content/ru/books/arch-handbook/mac/_index.adoc5080
-rw-r--r--documentation/content/ru/books/arch-handbook/mac/_index.po8639
-rw-r--r--documentation/content/ru/books/arch-handbook/newbus/_index.adoc213
-rw-r--r--documentation/content/ru/books/arch-handbook/newbus/_index.po711
-rw-r--r--documentation/content/ru/books/arch-handbook/parti.adoc13
-rw-r--r--documentation/content/ru/books/arch-handbook/parti.po31
-rw-r--r--documentation/content/ru/books/arch-handbook/partii.adoc12
-rw-r--r--documentation/content/ru/books/arch-handbook/partii.po31
-rw-r--r--documentation/content/ru/books/arch-handbook/partiii.adoc12
-rw-r--r--documentation/content/ru/books/arch-handbook/partiii.po31
-rw-r--r--documentation/content/ru/books/arch-handbook/pccard/_index.adoc209
-rw-r--r--documentation/content/ru/books/arch-handbook/pccard/_index.po710
-rw-r--r--documentation/content/ru/books/arch-handbook/pci/_index.adoc424
-rw-r--r--documentation/content/ru/books/arch-handbook/pci/_index.po1071
-rw-r--r--documentation/content/ru/books/arch-handbook/scsi/_index.adoc1367
-rw-r--r--documentation/content/ru/books/arch-handbook/scsi/_index.po4280
-rw-r--r--documentation/content/ru/books/arch-handbook/smp/_index.adoc360
-rw-r--r--documentation/content/ru/books/arch-handbook/smp/_index.po1983
-rw-r--r--documentation/content/ru/books/arch-handbook/sound/_index.adoc351
-rw-r--r--documentation/content/ru/books/arch-handbook/sound/_index.po1125
-rw-r--r--documentation/content/ru/books/arch-handbook/sysinit/_index.adoc165
-rw-r--r--documentation/content/ru/books/arch-handbook/sysinit/_index.po393
-rw-r--r--documentation/content/ru/books/arch-handbook/usb/_index.adoc186
-rw-r--r--documentation/content/ru/books/arch-handbook/usb/_index.po1200
-rw-r--r--documentation/content/ru/books/arch-handbook/vm/_index.adoc127
-rw-r--r--documentation/content/ru/books/arch-handbook/vm/_index.po551
-rw-r--r--documentation/content/ru/books/design-44bsd/_index.adoc235
-rw-r--r--documentation/content/ru/books/design-44bsd/_index.po3677
-rw-r--r--documentation/content/ru/books/dev-model/_index.adoc903
-rw-r--r--documentation/content/ru/books/dev-model/_index.po3865
-rw-r--r--documentation/content/ru/books/developers-handbook/_index.adoc253
-rw-r--r--documentation/content/ru/books/developers-handbook/_index.po70
-rw-r--r--documentation/content/ru/books/developers-handbook/bibliography/_index.adoc62
-rw-r--r--documentation/content/ru/books/developers-handbook/bibliography/_index.po92
-rw-r--r--documentation/content/ru/books/developers-handbook/book.adoc84
-rw-r--r--documentation/content/ru/books/developers-handbook/book.po70
-rw-r--r--documentation/content/ru/books/developers-handbook/introduction/_index.adoc86
-rw-r--r--documentation/content/ru/books/developers-handbook/introduction/_index.po185
-rw-r--r--documentation/content/ru/books/developers-handbook/ipv6/_index.adoc687
-rw-r--r--documentation/content/ru/books/developers-handbook/ipv6/_index.po2818
-rw-r--r--documentation/content/ru/books/developers-handbook/kernelbuild/_index.adoc94
-rw-r--r--documentation/content/ru/books/developers-handbook/kernelbuild/_index.po140
-rw-r--r--documentation/content/ru/books/developers-handbook/kerneldebug/_index.adoc773
-rw-r--r--documentation/content/ru/books/developers-handbook/kerneldebug/_index.po2243
-rw-r--r--documentation/content/ru/books/developers-handbook/l10n/_index.adoc228
-rw-r--r--documentation/content/ru/books/developers-handbook/l10n/_index.po659
-rw-r--r--documentation/content/ru/books/developers-handbook/parti.adoc12
-rw-r--r--documentation/content/ru/books/developers-handbook/parti.po31
-rw-r--r--documentation/content/ru/books/developers-handbook/partii.adoc12
-rw-r--r--documentation/content/ru/books/developers-handbook/partii.po31
-rw-r--r--documentation/content/ru/books/developers-handbook/partiii.adoc12
-rw-r--r--documentation/content/ru/books/developers-handbook/partiii.po31
-rw-r--r--documentation/content/ru/books/developers-handbook/partiv.adoc12
-rw-r--r--documentation/content/ru/books/developers-handbook/partiv.po31
-rw-r--r--documentation/content/ru/books/developers-handbook/partv.adoc12
-rw-r--r--documentation/content/ru/books/developers-handbook/partv.po31
-rw-r--r--documentation/content/ru/books/developers-handbook/policies/_index.adoc148
-rw-r--r--documentation/content/ru/books/developers-handbook/policies/_index.po523
-rw-r--r--documentation/content/ru/books/developers-handbook/secure/_index.adoc230
-rw-r--r--documentation/content/ru/books/developers-handbook/secure/_index.po824
-rw-r--r--documentation/content/ru/books/developers-handbook/sockets/_index.adoc909
-rw-r--r--documentation/content/ru/books/developers-handbook/sockets/_index.po3021
-rw-r--r--documentation/content/ru/books/developers-handbook/testing/_index.adoc187
-rw-r--r--documentation/content/ru/books/developers-handbook/testing/_index.po802
-rw-r--r--documentation/content/ru/books/developers-handbook/tools/_index.adoc1428
-rw-r--r--documentation/content/ru/books/developers-handbook/tools/_index.po4483
-rw-r--r--documentation/content/ru/books/developers-handbook/x86/_index.adoc3864
-rw-r--r--documentation/content/ru/books/developers-handbook/x86/_index.po11160
-rw-r--r--documentation/content/ru/books/faq/_index.adoc2993
-rw-r--r--documentation/content/ru/books/faq/_index.po1811
-rw-r--r--documentation/content/ru/books/fdp-primer/_index.adoc59
-rw-r--r--documentation/content/ru/books/fdp-primer/_index.po68
-rw-r--r--documentation/content/ru/books/fdp-primer/asciidoctor-primer/_index.adoc338
-rw-r--r--documentation/content/ru/books/fdp-primer/asciidoctor-primer/_index.po795
-rw-r--r--documentation/content/ru/books/fdp-primer/book.adoc102
-rw-r--r--documentation/content/ru/books/fdp-primer/book.po68
-rw-r--r--documentation/content/ru/books/fdp-primer/doc-build/_index.adoc662
-rw-r--r--documentation/content/ru/books/fdp-primer/doc-build/_index.po1562
-rw-r--r--documentation/content/ru/books/fdp-primer/editor-config/_index.adoc323
-rw-r--r--documentation/content/ru/books/fdp-primer/editor-config/_index.po697
-rw-r--r--documentation/content/ru/books/fdp-primer/examples/_index.adoc139
-rw-r--r--documentation/content/ru/books/fdp-primer/examples/_index.po261
-rw-r--r--documentation/content/ru/books/fdp-primer/manual-pages/_index.adoc531
-rw-r--r--documentation/content/ru/books/fdp-primer/manual-pages/_index.po1454
-rw-r--r--documentation/content/ru/books/fdp-primer/overview/_index.adoc321
-rw-r--r--documentation/content/ru/books/fdp-primer/overview/_index.po721
-rw-r--r--documentation/content/ru/books/fdp-primer/po-translations/_index.adoc365
-rw-r--r--documentation/content/ru/books/fdp-primer/po-translations/_index.po1041
-rw-r--r--documentation/content/ru/books/fdp-primer/preface/_index.adoc155
-rw-r--r--documentation/content/ru/books/fdp-primer/preface/_index.po319
-rw-r--r--documentation/content/ru/books/fdp-primer/rosetta/_index.adoc321
-rw-r--r--documentation/content/ru/books/fdp-primer/rosetta/_index.po793
-rw-r--r--documentation/content/ru/books/fdp-primer/see-also/_index.adoc77
-rw-r--r--documentation/content/ru/books/fdp-primer/see-also/_index.po127
-rw-r--r--documentation/content/ru/books/fdp-primer/structure/_index.adoc386
-rw-r--r--documentation/content/ru/books/fdp-primer/structure/_index.po1340
-rw-r--r--documentation/content/ru/books/fdp-primer/tools/_index.adoc70
-rw-r--r--documentation/content/ru/books/fdp-primer/tools/_index.po113
-rw-r--r--documentation/content/ru/books/fdp-primer/trademarks/_index.adoc95
-rw-r--r--documentation/content/ru/books/fdp-primer/trademarks/_index.po197
-rw-r--r--documentation/content/ru/books/fdp-primer/translations/_index.adoc227
-rw-r--r--documentation/content/ru/books/fdp-primer/translations/_index.po683
-rw-r--r--documentation/content/ru/books/fdp-primer/weblate/_index.adoc456
-rw-r--r--documentation/content/ru/books/fdp-primer/weblate/_index.po1259
-rw-r--r--documentation/content/ru/books/fdp-primer/working-copy/_index.adoc140
-rw-r--r--documentation/content/ru/books/fdp-primer/working-copy/_index.po336
-rw-r--r--documentation/content/ru/books/fdp-primer/writing-style/_index.adoc326
-rw-r--r--documentation/content/ru/books/fdp-primer/writing-style/_index.po1035
-rw-r--r--documentation/content/ru/books/porters-handbook/_index.adoc20
-rw-r--r--documentation/content/ru/books/porters-handbook/_index.po37
-rw-r--r--documentation/content/ru/books/porters-handbook/book.adoc17
-rw-r--r--documentation/content/ru/books/porters-handbook/book.po37
-rw-r--r--documentation/content/ru/books/porters-handbook/flavors/_index.adoc359
-rw-r--r--documentation/content/ru/books/porters-handbook/flavors/_index.po801
-rw-r--r--documentation/content/ru/books/porters-handbook/keeping-up/_index.adoc39
-rw-r--r--documentation/content/ru/books/porters-handbook/keeping-up/_index.po270
-rw-r--r--documentation/content/ru/books/porters-handbook/makefiles/_index.adoc4265
-rw-r--r--documentation/content/ru/books/porters-handbook/makefiles/_index.po14066
-rw-r--r--documentation/content/ru/books/porters-handbook/new-port/_index.adoc14
-rw-r--r--documentation/content/ru/books/porters-handbook/new-port/_index.po101
-rw-r--r--documentation/content/ru/books/porters-handbook/order/_index.adoc260
-rw-r--r--documentation/content/ru/books/porters-handbook/order/_index.po780
-rw-r--r--documentation/content/ru/books/porters-handbook/pkg-files/_index.adoc228
-rw-r--r--documentation/content/ru/books/porters-handbook/pkg-files/_index.po873
-rw-r--r--documentation/content/ru/books/porters-handbook/plist/_index.adoc548
-rw-r--r--documentation/content/ru/books/porters-handbook/plist/_index.po1731
-rw-r--r--documentation/content/ru/books/porters-handbook/porting-dads/_index.adoc214
-rw-r--r--documentation/content/ru/books/porters-handbook/porting-dads/_index.po1473
-rw-r--r--documentation/content/ru/books/porters-handbook/porting-samplem/_index.adoc138
-rw-r--r--documentation/content/ru/books/porters-handbook/porting-samplem/_index.po412
-rw-r--r--documentation/content/ru/books/porters-handbook/porting-why/_index.adoc10
-rw-r--r--documentation/content/ru/books/porters-handbook/porting-why/_index.po61
-rw-r--r--documentation/content/ru/books/porters-handbook/quick-porting/_index.adoc166
-rw-r--r--documentation/content/ru/books/porters-handbook/quick-porting/_index.po767
-rw-r--r--documentation/content/ru/books/porters-handbook/security/_index.adoc158
-rw-r--r--documentation/content/ru/books/porters-handbook/security/_index.po858
-rw-r--r--documentation/content/ru/books/porters-handbook/slow-porting/_index.adoc173
-rw-r--r--documentation/content/ru/books/porters-handbook/slow-porting/_index.po1017
-rw-r--r--documentation/content/ru/books/porters-handbook/special/_index.adoc4192
-rw-r--r--documentation/content/ru/books/porters-handbook/special/_index.po14978
-rw-r--r--documentation/content/ru/books/porters-handbook/testing/_index.adoc460
-rw-r--r--documentation/content/ru/books/porters-handbook/testing/_index.po1685
-rw-r--r--documentation/content/ru/books/porters-handbook/upgrading/_index.adoc181
-rw-r--r--documentation/content/ru/books/porters-handbook/upgrading/_index.po688
-rw-r--r--documentation/content/ru/books/porters-handbook/uses/_index.adoc2185
-rw-r--r--documentation/content/ru/books/porters-handbook/uses/_index.po9971
-rw-r--r--documentation/content/ru/books/porters-handbook/versions/_index.adoc6184
-rw-r--r--documentation/content/ru/books/porters-handbook/versions/_index.po33861
166 files changed, 208684 insertions, 8732 deletions
diff --git a/documentation/content/ru/books/arch-handbook/_index.adoc b/documentation/content/ru/books/arch-handbook/_index.adoc
new file mode 100644
index 0000000000..7417861a9b
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/_index.adoc
@@ -0,0 +1,57 @@
+---
+add_single_page_link: true
+authors:
+ -
+ author: 'The FreeBSD Documentation Project'
+bookOrder: 50
+copyright: '2000-2006, 2012-2023 The FreeBSD Documentation Project'
+description: 'Для разработчиков систем FreeBSD. В этой книге рассматриваются архитектурные особенности многих важных подсистем ядра FreeBSD'
+next: books/arch-handbook/parti
+params:
+ path: /books/arch-handbook/
+showBookMenu: true
+tags: ["Arch Handbook", "FreeBSD"]
+title: 'Руководство по архитектуре FreeBSD'
+trademarks: ["freebsd", "apple", "microsoft", "unix", "general"]
+weight: 0
+---
+
+= Руководство по архитектуре FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[.abstract-title]
+Аннотация
+
+Добро пожаловать в Руководство по архитектуре FreeBSD. Это руководство находится _в стадии разработки_ и создаётся усилиями многих участников. Многие разделы пока не написаны, а существующие могут требовать обновления. Если вы хотите помочь в работе над этим проектом, напишите на электронную почту списка рассылки {freebsd-doc}.
+
+Актуальная версия этого документа всегда доступна на https://www.FreeBSD.org/[официальном веб-сервере FreeBSD]. Его также можно загрузить в различных форматах и с разными вариантами сжатия с https://download.freebsd.org/doc/[сервера загрузок FreeBSD] или одного из многочисленных зеркал extref:{handbook}mirrors/[mirror sites, mirrors].
+
+'''
diff --git a/documentation/content/ru/books/arch-handbook/_index.po b/documentation/content/ru/books/arch-handbook/_index.po
new file mode 100644
index 0000000000..980f503404
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/_index.po
@@ -0,0 +1,71 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-08-16 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbook_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/arch-handbook/_index.adoc:1
+#, no-wrap
+msgid "For FreeBSD system developers. This book covers the architectural details of many important FreeBSD kernel subsystems"
+msgstr "Для разработчиков систем FreeBSD. В этой книге рассматриваются архитектурные особенности многих важных подсистем ядра FreeBSD"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/_index.adoc:18
+#, no-wrap
+msgid "FreeBSD Architecture Handbook"
+msgstr "Руководство по архитектуре FreeBSD"
+
+#. type: .abstract-title
+#: documentation/content/en/books/arch-handbook/_index.adoc:51
+msgid "Abstract"
+msgstr "Аннотация"
+
+#. type: .abstract-title
+#: documentation/content/en/books/arch-handbook/_index.adoc:53
+msgid ""
+"Welcome to the FreeBSD Architecture Handbook. This manual is a _work in "
+"progress_ and is the work of many individuals. Many sections do not yet "
+"exist and some of those that do exist need to be updated. If you are "
+"interested in helping with this project, send email to the {freebsd-doc}."
+msgstr ""
+"Добро пожаловать в Руководство по архитектуре FreeBSD. Это руководство "
+"находится _в стадии разработки_ и создаётся усилиями многих участников. "
+"Многие разделы пока не написаны, а существующие могут требовать обновления. "
+"Если вы хотите помочь в работе над этим проектом, напишите на электронную "
+"почту списка рассылки {freebsd-doc}."
+
+#. type: .abstract-title
+#: documentation/content/en/books/arch-handbook/_index.adoc:55
+msgid ""
+"The latest version of this document is always available from the "
+"link:https://www.FreeBSD.org/[FreeBSD World Wide Web server]. It may also be "
+"downloaded in a variety of formats and compression options from the https://"
+"download.freebsd.org/doc/[FreeBSD download server] or one of the numerous "
+"extref:{handbook}[mirror sites, mirrors]."
+msgstr ""
+"Актуальная версия этого документа всегда доступна на https://www.FreeBSD.org/"
+"[официальном веб-сервере FreeBSD]. Его также можно загрузить в различных "
+"форматах и с разными вариантами сжатия с https://download.freebsd.org/doc/"
+"[сервера загрузок FreeBSD] или одного из многочисленных зеркал extref:"
+"{handbook}mirrors/[mirror sites, mirrors]."
+
+#. type: .abstract-title
+#: documentation/content/en/books/arch-handbook/_index.adoc:56
+msgid "'''"
+msgstr "'''"
diff --git a/documentation/content/ru/books/arch-handbook/bibliography/_index.adoc b/documentation/content/ru/books/arch-handbook/bibliography/_index.adoc
new file mode 100644
index 0000000000..96ff388686
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/bibliography/_index.adoc
@@ -0,0 +1,51 @@
+---
+description: 'Библиография Руководства по архитектуре FreeBSD'
+params:
+ path: /books/arch-handbook/bibliography/
+prev: books/arch-handbook/partiii
+showBookMenu: true
+tags: ["bibliography", "Arch Handbook", "FreeBSD"]
+title: Библиография
+weight: 20
+---
+
+[appendix]
+[[bibliography]]
+= Библиография
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: A
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[1] _Marshall Kirk McKusick, Keith Bostic, Michael J Karels, and John S Quarterman._ Copyright © 1996 Addison-Wesley Publishing Company, Inc.. 0-201-54979-4. Издано Addison-Wesley Publishing Company, Inc.. The Design and Implementation of the 4.4 BSD Operating System. 1-2.
diff --git a/documentation/content/ru/books/arch-handbook/bibliography/_index.po b/documentation/content/ru/books/arch-handbook/bibliography/_index.po
new file mode 100644
index 0000000000..c5253e7d57
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/bibliography/_index.po
@@ -0,0 +1,45 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-07-12 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookbibliography_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/arch-handbook/bibliography/_index.adoc:1
+#, no-wrap
+msgid "Bibliography of the FreeBSD Architecture Handbook"
+msgstr "Библиография Руководства по архитектуре FreeBSD"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/bibliography/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/bibliography/_index.adoc:14
+#, no-wrap
+msgid "Bibliography"
+msgstr "Библиография"
+
+#. type: appendix
+#: documentation/content/en/books/arch-handbook/bibliography/_index.adoc:51
+msgid ""
+"[1] _Marshall Kirk McKusick, Keith Bostic, Michael J Karels, and John S "
+"Quarterman._ Copyright © 1996 Addison-Wesley Publishing Company, Inc.. "
+"0-201-54979-4. Addison-Wesley Publishing Company, Inc.. The Design and "
+"Implementation of the 4.4 BSD Operating System. 1-2."
+msgstr ""
+"[1] _Marshall Kirk McKusick, Keith Bostic, Michael J Karels, and John S "
+"Quarterman._ Copyright © 1996 Addison-Wesley Publishing Company, Inc.. "
+"0-201-54979-4. Издано Addison-Wesley Publishing Company, Inc.. The Design "
+"and Implementation of the 4.4 BSD Operating System. 1-2."
diff --git a/documentation/content/ru/books/arch-handbook/book.adoc b/documentation/content/ru/books/arch-handbook/book.adoc
index 02d82d2ae2..22f9cfba0b 100644
--- a/documentation/content/ru/books/arch-handbook/book.adoc
+++ b/documentation/content/ru/books/arch-handbook/book.adoc
@@ -1,14 +1,16 @@
---
-title: FreeBSD Architecture Handbook
-authors:
- - author: The FreeBSD Documentation Project
-copyright: 2000-2006, 2012-2013 The FreeBSD Documentation Project
-description: FreeBSD Architecture Handbook
-trademarks: ["freebsd", "apple", "microsoft", "unix", "general"]
+add_split_page_link: true
+authors:
+ -
+ author: 'The FreeBSD Documentation Project'
+copyright: '2000-2006, 2012-2023 The FreeBSD Documentation Project'
+description: 'Для разработчиков систем FreeBSD. В этой книге рассматриваются архитектурные особенности многих важных подсистем ядра FreeBSD'
tags: ["Arch Handbook", "FreeBSD"]
+title: 'Руководство по архитектуре FreeBSD'
+trademarks: ["freebsd", "apple", "microsoft", "unix", "general"]
---
-= FreeBSD Architecture Handbook
+= Руководство по архитектуре FreeBSD
:doctype: book
:toc: macro
:toclevels: 2
@@ -20,7 +22,6 @@ tags: ["Arch Handbook", "FreeBSD"]
:experimental:
:book: true
:pdf: false
-:images-path: books/arch-handbook/
ifdef::env-beastie[]
ifdef::backend-html5[]
@@ -44,15 +45,39 @@ ifndef::env-beastie[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
+[.abstract-title]
+Аннотация
+
+Добро пожаловать в Руководство по архитектуре FreeBSD. Это руководство находится _в стадии разработки_ и создаётся усилиями многих участников. Многие разделы пока не написаны, а существующие могут требовать обновления. Если вы хотите помочь в работе над этим проектом, напишите на электронную почту списка рассылки {freebsd-doc}.
+
+Актуальная версия этого документа всегда доступна на https://www.FreeBSD.org/[официальном веб-сервере FreeBSD]. Его также можно загрузить в различных форматах и с разными вариантами сжатия с https://download.freebsd.org/doc/[сервера загрузок FreeBSD] или одного из многочисленных зеркал extref:{handbook}mirrors/[mirror sites, mirrors].
+
'''
toc::[]
// Section one
-
-include::{chapters-path}locking/chapter.adoc[leveloffset=+1]
+include::{chapters-path}parti.adoc[]
+include::{chapters-path}boot/_index.adoc[leveloffset=+1]
+include::{chapters-path}locking/_index.adoc[leveloffset=+1]
+include::{chapters-path}kobj/_index.adoc[leveloffset=+1]
+include::{chapters-path}jail/_index.adoc[leveloffset=+1]
+include::{chapters-path}sysinit/_index.adoc[leveloffset=+1]]
+include::{chapters-path}mac/_index.adoc[leveloffset=+1]
+include::{chapters-path}vm/_index.adoc[leveloffset=+1]
+include::{chapters-path}smp/_index.adoc[leveloffset=+1]
// Section two
+include::{chapters-path}partii.adoc[]
+include::{chapters-path}driverbasics/_index.adoc[leveloffset=+1]
+include::{chapters-path}isa/_index.adoc[leveloffset=+1]
+include::{chapters-path}pci/_index.adoc[leveloffset=+1]
+include::{chapters-path}scsi/_index.adoc[leveloffset=+1]
+include::{chapters-path}usb/_index.adoc[leveloffset=+1]
+include::{chapters-path}newbus/_index.adoc[leveloffset=+1]
+include::{chapters-path}sound/_index.adoc[leveloffset=+1]
+include::{chapters-path}pccard/_index.adoc[leveloffset=+1]
-include::{chapters-path}driverbasics/chapter.adoc[leveloffset=+1]
-include::{chapters-path}sound/chapter.adoc[leveloffset=+1]
+// Section three
+include::{chapters-path}partiii.adoc[]
+include::{chapters-path}bibliography/_index.adoc[leveloffset=+1]
diff --git a/documentation/content/ru/books/arch-handbook/book.po b/documentation/content/ru/books/arch-handbook/book.po
new file mode 100644
index 0000000000..a099efa2f7
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/book.po
@@ -0,0 +1,71 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-08-16 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookbook/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/arch-handbook/book.adoc:1
+#, no-wrap
+msgid "For FreeBSD system developers. This book covers the architectural details of many important FreeBSD kernel subsystems"
+msgstr "Для разработчиков систем FreeBSD. В этой книге рассматриваются архитектурные особенности многих важных подсистем ядра FreeBSD"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/book.adoc:1
+#: documentation/content/en/books/arch-handbook/book.adoc:12
+#, no-wrap
+msgid "FreeBSD Architecture Handbook"
+msgstr "Руководство по архитектуре FreeBSD"
+
+#. type: .abstract-title
+#: documentation/content/en/books/arch-handbook/book.adoc:49
+msgid "Abstract"
+msgstr "Аннотация"
+
+#. type: .abstract-title
+#: documentation/content/en/books/arch-handbook/book.adoc:51
+msgid ""
+"Welcome to the FreeBSD Architecture Handbook. This manual is a _work in "
+"progress_ and is the work of many individuals. Many sections do not yet "
+"exist and some of those that do exist need to be updated. If you are "
+"interested in helping with this project, send email to the {freebsd-doc}."
+msgstr ""
+"Добро пожаловать в Руководство по архитектуре FreeBSD. Это руководство "
+"находится _в стадии разработки_ и создаётся усилиями многих участников. "
+"Многие разделы пока не написаны, а существующие могут требовать обновления. "
+"Если вы хотите помочь в работе над этим проектом, напишите на электронную "
+"почту списка рассылки {freebsd-doc}."
+
+#. type: .abstract-title
+#: documentation/content/en/books/arch-handbook/book.adoc:53
+msgid ""
+"The latest version of this document is always available from the "
+"link:https://www.FreeBSD.org/[FreeBSD World Wide Web server]. It may also be "
+"downloaded in a variety of formats and compression options from the https://"
+"download.freebsd.org/doc/[FreeBSD download server] or one of the numerous "
+"extref:{handbook}[mirror sites, mirrors]."
+msgstr ""
+"Актуальная версия этого документа всегда доступна на https://www.FreeBSD.org/"
+"[официальном веб-сервере FreeBSD]. Его также можно загрузить в различных "
+"форматах и с разными вариантами сжатия с https://download.freebsd.org/doc/"
+"[сервера загрузок FreeBSD] или одного из многочисленных зеркал extref:"
+"{handbook}mirrors/[mirror sites, mirrors]."
+
+#. type: .abstract-title
+#: documentation/content/en/books/arch-handbook/book.adoc:55
+msgid "'''"
+msgstr "'''"
diff --git a/documentation/content/ru/books/arch-handbook/boot/_index.adoc b/documentation/content/ru/books/arch-handbook/boot/_index.adoc
new file mode 100644
index 0000000000..5b356b42ac
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/boot/_index.adoc
@@ -0,0 +1,1351 @@
+---
+description: 'Начальная загрузка и инициализация ядра'
+next: books/arch-handbook/locking
+params:
+ path: /books/arch-handbook/boot/
+prev: books/arch-handbook/parti
+showBookMenu: true
+tags: ["boot", "BIOS", "kernel", "MBR", "FreeBSD"]
+title: 'Глава 1. Начальная загрузка и инициализация ядра'
+weight: 2
+---
+
+[[boot]]
+= Начальная загрузка и инициализация ядра
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 1
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[boot-synopsis]]
+== Обзор
+
+Эта глава представляет собой обзор процессов загрузки и инициализации системы, начиная с POST в BIOS (микропрограмме) и заканчивая созданием первого пользовательского процесса. Поскольку начальные этапы загрузки системы сильно зависят от архитектуры, в качестве примера используется архитектура IA-32. Однако архитектуры AMD64 и ARM64 гораздо важнее и интереснее, и их следует рассмотреть в ближайшем будущем в соответствии с темой этого документа.
+
+Процесс загрузки FreeBSD может быть удивительно сложным. После передачи управления от BIOS необходимо выполнить значительный объем низкоуровневой настройки перед загрузкой и выполнением ядра. Эта настройка должна быть выполнена простым и гибким способом, предоставляя пользователю широкие возможности для настройки и адаптации.
+
+[[boot-overview]]
+== Обзор
+
+Процесс загрузки — это операция, крайне зависимая от оборудования. Не только для каждой архитектуры компьютера должен быть написан код, но также могут существовать различные типы загрузки в рамках одной архитектуры. Например, список файлов в каталоге [.filename]#stand# показывает большое количество кода, зависящего от архитектуры. Для каждой из поддерживаемых архитектур существует отдельный каталог. FreeBSD поддерживает стандарт загрузки CSM (Compatibility Support Module). Таким образом, CSM поддерживается (как с GPT, так и с MBR разметкой), а также загрузка через UEFI (GPT полностью поддерживается, MBR — в основном). Также поддерживается загрузка файлов с ext2fs, MSDOS, UFS и ZFS. FreeBSD поддерживает функцию загрузочного окружения ZFS, которая позволяет основной ОС передавать детали о том, что загружать, выходящие за рамки простого раздела, как это было возможно ранее. Однако в наши дни UEFI более актуален, чем CSM. В следующем примере показана загрузка компьютера x86 с жёсткого диска с MBR-разметкой, где используется мультизагрузчик FreeBSD [.filename]#boot0#, сохранённый в самом первом секторе. Этот загрузочный код запускает трёхэтапный процесс загрузки FreeBSD.
+
+Ключ к пониманию этого процесса заключается в том, что он состоит из последовательных стадий возрастающей сложности. Эти стадии — [.filename]#boot1#, [.filename]#boot2# и [.filename]#loader# (подробнее см. man:boot[8]). Система загрузки выполняет каждую стадию последовательно. Последняя стадия, [.filename]#loader#, отвечает за загрузку ядра FreeBSD. Каждая стадия рассматривается в следующих разделах.
+
+Вот пример вывода, сгенерированного на различных этапах загрузки. Фактический вывод может отличаться в зависимости от машины:
+
+[.informaltable]
+[cols="20%,80%", frame="none"]
+|===
+
+|*Компонент FreeBSD*
+|*Вывод (может отличаться)*
+
+|`boot0`
+a|
+
+[source,bash]
+....
+F1 FreeBSD
+F2 BSD
+F5 Disk 2
+....
+
+|`boot2` footnote:[Это приглашение появится, если пользователь нажмет клавишу сразу после выбора ОС для загрузки на этапе boot0.]
+a|
+
+[source,bash]
+....
+>>FreeBSD/x86 BOOT
+Default: 0:ad(0p4)/boot/loader
+boot:
+....
+
+|[.filename]#loader#
+a|
+
+[source,bash]
+....
+BTX loader 1.00 BTX version is 1.02
+Consoles: internal video/keyboard
+BIOS drive C: is disk0
+BIOS 639kB/2096064kB available memory
+
+FreeBSD/x86 bootstrap loader, Revision 1.1
+Console internal video/keyboard
+(root@releng1.nyi.freebsd.org, Fri Apr 9 04:04:45 UTC 2021)
+Loading /boot/defaults/loader.conf
+/boot/kernel/kernel text=0xed9008 data=0x117d28+0x176650 syms=[0x8+0x137988+0x8+0x1515f8]
+....
+
+|ядро системы
+a|
+
+[source,bash]
+....
+Copyright (c) 1992-2021 The FreeBSD Project.
+Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
+ The Regents of the University of California. All rights reserved.
+FreeBSD is a registered trademark of The FreeBSD Foundation.
+FreeBSD 13.0-RELEASE 0 releng/13.0-n244733-ea31abc261f: Fri Apr 9 04:04:45 UTC 2021
+ root@releng1.nyi.freebsd.org:/usr/obj/usr/src/i386.i386/sys/GENERIC i386
+FreeBSD clang version 11.0.1 (git@github.com:llvm/llvm-project.git llvmorg-11.0.1-0-g43ff75f2c3fe)
+....
+
+|===
+
+[[boot-bios]]
+== BIOS
+
+При включении компьютера регистры процессора устанавливаются в некоторые предопределённые значения. Один из регистров — это регистр _указателя команд_, и его значение после включения питания чётко определено: это 32-битное значение `0xfffffff0`. Регистр указателя команд (также известный как Счётчик Команд) указывает на код, который должен быть выполнен процессором. Ещё один важный регистр — это 32-битный управляющий регистр `cr0`, и его значение сразу после перезагрузки равно `0`. Один из битов ``cr0``, бит PE (Protection Enabled, Защита Включена), указывает, работает ли процессор в 32-битном защищённом режиме или 16-битном реальном режиме. Поскольку этот бит сброшен при загрузке, процессор запускается в 16-битном реальном режиме. Реальный режим означает, среди прочего, что линейные и физические адреса идентичны. Причина, по которой процессор не запускается сразу в 32-битном защищённом режиме, — это обратная совместимость. В частности, процесс загрузки зависит от услуг, предоставляемых BIOS, а сам BIOS работает в устаревшем 16-битном коде.
+
+Значение `0xfffffff0` немного меньше 4 ГБ, поэтому, если в машине нет 4 ГБ физической памяти, оно не может указывать на действительный адрес памяти. Аппаратное обеспечение компьютера преобразует этот адрес так, чтобы он указывал на блок памяти BIOS.
+
+BIOS (Basic Input Output System) — это микросхема на материнской плате, которая содержит относительно небольшой объем памяти только для чтения (ROM). Эта память включает различные низкоуровневые процедуры, специфичные для оборудования, поставляемого с материнской платой. Процессор сначала переходит по адресу 0xfffffff0, который фактически находится в памяти BIOS. Обычно по этому адресу содержится инструкция перехода к процедурам POST BIOS.
+
+POST (Power On Self Test) — это набор процедур, включающих проверку памяти, проверку системной шины и другую низкоуровневую инициализацию, чтобы процессор мог правильно настроить компьютер. Важным этапом на этой стадии является определение загрузочного устройства. Современные реализации BIOS позволяют выбирать загрузочное устройство, обеспечивая загрузку с дискеты, CD-ROM, жесткого диска или других устройств.
+
+Самым последним действием в POST является инструкция `INT 0x19`. Обработчик `INT 0x19` считывает 512 байт из первого сектора загрузочного устройства в память по адресу `0x7c00`. Термин _первый сектор_ происходит из архитектуры жёстких дисков, где магнитная пластина разделена на множество цилиндрических дорожек. Дорожки нумеруются, и каждая дорожка разделена на несколько (обычно 64) секторов. Нумерация дорожек начинается с 0, но нумерация секторов начинается с 1. Дорожка 0 находится на внешней стороне магнитной пластины, а сектор 1, первый сектор, имеет особое назначение. Он также называется MBR (Master Boot Record) или Главная Загрузочная Запись. Остальные секторы на первой дорожке не используются.
+
+Этот сектор является нашей точкой входа в последовательность загрузки. Как мы увидим, этот сектор содержит копию нашей программы [.filename]#boot0#. BIOS выполняет переход по адресу `0x7c00`, и она начинает выполняться.
+
+[[boot-boot0]]
+== Главная загрузочная запись (`boot0`)
+
+После получения управления от BIOS по адресу памяти `0x7c00` начинает выполняться [.filename]#boot0#. Это первый код, который управляется FreeBSD. Задача [.filename]#boot0# довольно проста: просканировать таблицу разделов и позволить пользователю выбрать, с какого раздела загружаться. Таблица разделов — это специальная стандартная структура данных, встроенная в MBR (а значит, и в [.filename]#boot0#), которая описывает четыре стандартных PC-раздела. [.filename]#boot0# находится в файловой системе как [.filename]#/boot/boot0#. Это небольшой файл размером 512 байт, и именно его процедура установки FreeBSD записывает в MBR жёсткого диска, если во время установки была выбрана опция "bootmanager". Действительно, [.filename]#boot0# _и есть_ MBR.
+
+Как упоминалось ранее, мы вызываем прерывание BIOS `INT 0x19` для загрузки MBR ([.filename]#boot0#) в память по адресу `0x7c00`. Исходный файл для [.filename]#boot0# можно найти в [.filename]#stand/i386/boot0/boot0.S# — это впечатляющий фрагмент кода, написанный Робертом Нордье.
+
+Особая структура, начинающаяся со смещения `0x1be` в MBR, называется _таблицей разделов_. Она содержит четыре записи по 16 байт каждая, называемые _записями разделов_, которые определяют, как разделён жёсткий диск, или, в терминологии FreeBSD, нарезан. Один из этих 16 байт указывает, является ли раздел (срез) загрузочным или нет. Ровно одна запись должна быть с этом установленным флагом, иначе код [.filename]#boot0# откажется продолжать работу.
+
+Запись о разделе содержит следующие поля:
+
+* 1-байтовый тип файловой системы
+* 1-байтовый флаг загрузки (`bootable`)
+* 6-байтовый дескриптор в формате CHS
+* 8-байтовый дескриптор в формате LBA
+
+Дескриптор записи раздела содержит информацию о том, где именно раздел расположен на диске. Оба дескриптора, LBA и CHS, описывают одну и ту же информацию, но разными способами: LBA (Logical Block Addressing) содержит начальный сектор раздела и его длину, тогда как CHS (Cylinder Head Sector) содержит координаты первого и последнего секторов раздела. Таблица разделов завершается специальной сигнатурой `0xaa55`.
+
+MBR должен помещаться в 512 байт, один сектор диска. Эта программа использует низкоуровневые «трюки», такие как использование побочных эффектов определённых инструкций и повторное использование значений регистров из предыдущих операций, чтобы максимально эффективно использовать минимально возможное количество инструкций. Также необходимо соблюдать осторожность при работе с таблицей разделов, которая встроена в сам MBR. По этим причинам будьте очень внимательны при изменении [.filename]#boot0.S#.
+
+Обратите внимание, что исходный файл [.filename]#boot0.S# ассемблируется "как есть": инструкции переводятся одна за одной в бинарный код без дополнительной информации (например, без формата файла ELF). Такой низкоуровневый контроль достигается на этапе компоновки с помощью специальных флагов, передаваемых компоновщику. Например, текстовая секция программы располагается по адресу `0x600`. На практике это означает, что [.filename]#boot0# должен быть загружен в память по адресу `0x600` для корректной работы.
+
+Стоит взглянуть на [.filename]#Makefile# для [.filename]#boot0# ([.filename]#stand/i386/boot0/Makefile#), так как он определяет некоторые аспекты поведения [.filename]#boot0# во время выполнения. Например, если для ввода-вывода используется терминал, подключённый к последовательному порту (COM1), необходимо определить макрос `SIO` (`-DSIO`). `-DPXE` включает загрузку через PXE при нажатии kbd:[F6]. Кроме того, программа определяет набор _флагов_, которые позволяют дополнительно настроить её поведение. Всё это проиллюстрировано в [.filename]#Makefile#. Например, обратите внимание на директивы компоновщика, которые предписывают ему начинать секцию текста с адреса `0x600` и создавать выходной файл "как есть" (удаляя любое форматирование файла):
+
+[.programlisting]
+....
+ BOOT_BOOT0_ORG?=0x600
+ ORG=${BOOT_BOOT0_ORG}
+....
+
+.[.filename]#stand/i386/boot0/Makefile# [[boot-boot0-makefile-as-is]]
+Приступим к изучению MBR, или [.filename]#boot0#, начиная с точки входа.
+
+[NOTE]
+====
+В некоторые инструкции были внесены изменения для лучшего изложения. Например, некоторые макросы раскрыты, а некоторые проверки макросов опущены, когда результат проверки известен. Это относится ко всем приведённым примерам кода.
+====
+
+[.programlisting]
+....
+start:
+ cld # String ops inc
+ xorw %ax,%ax # Zero
+ movw %ax,%es # Address
+ movw %ax,%ds # data
+ movw %ax,%ss # Set up
+ movw $LOAD,%sp # stack
+....
+
+.[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-entrypoint]]
+Этот первый блок кода является точкой входа программы. Именно сюда BIOS передаёт управление. Сначала он гарантирует, что строковые операции автоматически увеличивают указатели операндов (инструкция `cld`) footnote:[В случае сомнений мы отсылаем читателя к официальным руководствам Intel, где описана точная семантика каждой инструкции: .]. Затем, не делая предположений о состоянии сегментных регистров, он их инициализирует. Наконец, он устанавливает регистр указателя стека (`%sp`) в ($LOAD = адрес `0x7c00`), чтобы обеспечить работоспособный стек.
+
+Следующий блок отвечает за перемещение и последующий переход к перемещенному коду.
+
+[.programlisting]
+....
+ movw %sp,%si # Source
+ movw $start,%di # Destination
+ movw $0x100,%cx # Word count
+ rep # Relocate
+ movsw # code
+ movw %di,%bp # Address variables
+ movb $0x8,%cl # Words to clear
+ rep # Zero
+ stosw # them
+ incb -0xe(%di) # Set the S field to 1
+ jmp main-LOAD+ORIGIN # Jump to relocated code
+....
+
+.[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-relocation]]
+Так как [.filename]#boot0# загружается BIOS по адресу `0x7C00`, он копирует себя по адресу `0x600` и передаёт управление туда (напомним, что он был слинкован для выполнения по адресу `0x600`). Исходный адрес, `0x7c00`, копируется в регистр `%si`. Конечный адрес, `0x600`, — в регистр `%di`. Количество слов для копирования, `256` (размер программы = 512 байт), копируется в регистр `%cx`. Далее инструкция `rep` повторяет следующую за ней инструкцию, то есть `movsw`, количество раз, указанное в регистре `%cx`. Инструкция `movsw` копирует слово, на которое указывает `%si`, по адресу, на который указывает `%di`. Это повторяется ещё 255 раз. При каждом повторении оба регистра, исходный и конечный, `%si` и `%di`, увеличиваются на единицу. Таким образом, по завершении копирования 256 слов (512 байт), `%di` имеет значение `0x600`+`512`= `0x800`, а `%si` — значение `0x7c00`+`512`= `0x7e00`; таким образом, мы завершили _перемещение_ кода. С момента последнего обновления этого документа инструкции копирования в коде изменились, поэтому вместо movsb и stosb были введены movsw и stosw, которые копируют 2 байта (1 слово) за одну итерацию.
+
+Затем регистр назначения `%di` копируется в `%bp`. `%bp` получает значение `0x800`. Значение `8` копируется в `%cl` для подготовки новой строковой операции (как в предыдущей `movsw`). Теперь `stosw` выполняется 8 раз. Эта инструкция копирует значение `0` по адресу, на который указывает регистр назначения (`%di`, то есть `0x800`), и увеличивает его. Это повторяется ещё 7 раз, так что `%di` в итоге получает значение `0x810`. Фактически это очищает диапазон адресов `0x800`-`0x80f`. Этот диапазон используется как (фиктивная) таблица разделов для записи MBR обратно на диск. Наконец, полю сектора для CHS-адресации этого фиктивного раздела присваивается значение 1, и выполняется переход к основной функции из перемещённого кода. Обратите внимание, что до этого перехода к перемещённому коду любые ссылки на абсолютные адреса избегались.
+
+Следующий блок кода проверяет, следует ли использовать номер диска, предоставленный BIOS, или тот, что хранится в [.filename]#boot0#.
+
+[.programlisting]
+....
+main:
+ testb $SETDRV,_FLAGS(%bp) # Set drive number?
+#ifndef CHECK_DRIVE /* disable drive checks */
+ jz save_curdrive # no, use the default
+#else
+ jnz disable_update # Yes
+ testb %dl,%dl # Drive number valid?
+ js save_curdrive # Possibly (0x80 set)
+#endif
+....
+
+.[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-drivenumber]]
+Этот код проверяет бит `SETDRV` (`0x20`) в переменной _flags_. Напомним, что регистр `%bp` указывает на адрес `0x800`, поэтому проверка выполняется для переменной _flags_ по адресу `0x800`-`69`= `0x7bb`. Это пример типа изменений, которые можно внести в [.filename]#boot0#. Флаг `SETDRV` не установлен по умолчанию, но его можно задать в [.filename]#Makefile#. Если он установлен, используется номер диска, сохранённый в MBR, вместо предоставленного BIOS. Мы предполагаем значения по умолчанию и то, что BIOS предоставил корректный номер диска, поэтому переходим к `save_curdrive`.
+
+Следующий блок сохраняет номер диска, предоставленный BIOS, и вызывает `putn` для вывода новой строки на экран.
+
+[.programlisting]
+....
+save_curdrive:
+ movb %dl, (%bp) # Save drive number
+ pushw %dx # Also in the stack
+#ifdef TEST /* test code, print internal bios drive */
+ rolb $1, %dl
+ movw $drive, %si
+ call putkey
+#endif
+ callw putn # Print a newline
+....
+
+.[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-savedrivenumber]]
+Обратите внимание, что мы предполагаем, что `TEST` не определён, поэтому условный код в нём не собирается и не появится в нашем исполняемом файле [.filename]#boot0#.
+
+Следующий блок реализует фактическое сканирование таблицы разделов. Он выводит на экран тип раздела для каждой из четырёх записей в таблице разделов. Каждый тип сравнивается со списком известных файловых систем операционных систем. Примерами распознаваемых типов разделов являются NTFS (Windows(R), ID 0x7), `ext2fs` (Linux(R), ID 0x83) и, конечно же, `ffs`/`ufs2` (FreeBSD, ID 0xa5). Реализация довольно проста.
+
+[.programlisting]
+....
+ movw $(partbl+0x4),%bx # Partition table (+4)
+ xorw %dx,%dx # Item number
+
+read_entry:
+ movb %ch,-0x4(%bx) # Zero active flag (ch == 0)
+ btw %dx,_FLAGS(%bp) # Entry enabled?
+ jnc next_entry # No
+ movb (%bx),%al # Load type
+ test %al, %al # skip empty partition
+ jz next_entry
+ movw $bootable_ids,%di # Lookup tables
+ movb $(TLEN+1),%cl # Number of entries
+ repne # Locate
+ scasb # type
+ addw $(TLEN-1), %di # Adjust
+ movb (%di),%cl # Partition
+ addw %cx,%di # description
+ callw putx # Display it
+
+next_entry:
+ incw %dx # Next item
+ addb $0x10,%bl # Next entry
+ jnc read_entry # Till done
+....
+
+.[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-partition-scan]]
+Важно отметить, что флаг активности для каждой записи сбрасывается, поэтому после сканирования _ни одна_ запись о разделе не активна в нашей копии [.filename]#boot0# в памяти. Позже флаг активности будет установлен для выбранного раздела. Это гарантирует, что только один активный раздел существует, если пользователь решит записать изменения обратно на диск.
+
+Следующий блок проверяет наличие других дисков. При запуске BIOS записывает количество дисков, присутствующих в компьютере, по адресу `0x475`. Если есть другие диски, [.filename]#boot0# выводит текущий диск на экран. Пользователь может позже дать команду [.filename]#boot0# просканировать разделы на другом диске.
+
+[.programlisting]
+....
+ popw %ax # Drive number
+ subb $0x80-0x1,%al # Does next
+ cmpb NHRDRV,%al # drive exist? (from BIOS?)
+ jb print_drive # Yes
+ decw %ax # Already drive 0?
+ jz print_prompt # Yes
+....
+
+.[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-test-drives]]
+Мы предполагаем, что присутствует только один диск, поэтому переход к `print_drive` не выполняется. Также мы предполагаем, что ничего необычного не произошло, поэтому переходим к `print_prompt`.
+
+Следующий блок просто выводит приглашение с последующим вариантом по умолчанию:
+
+[.programlisting]
+....
+print_prompt:
+ movw $prompt,%si # Display
+ callw putstr # prompt
+ movb _OPT(%bp),%dl # Display
+ decw %si # default
+ callw putkey # key
+ jmp start_input # Skip beep
+....
+
+.[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-prompt]]
+Наконец, выполняется переход к `start_input`, где используются сервисы BIOS для запуска таймера и чтения пользовательского ввода с клавиатуры; если таймер истекает, будет выбран вариант по умолчанию:
+
+[.programlisting]
+....
+start_input:
+ xorb %ah,%ah # BIOS: Get
+ int $0x1a # system time
+ movw %dx,%di # Ticks when
+ addw _TICKS(%bp),%di # timeout
+read_key:
+ movb $0x1,%ah # BIOS: Check
+ int $0x16 # for keypress
+ jnz got_key # Have input
+ xorb %ah,%ah # BIOS: int 0x1a, 00
+ int $0x1a # get system time
+ cmpw %di,%dx # Timeout?
+ jb read_key # No
+....
+
+.[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-start-input]]
+Прерывание запрашивается с номером `0x1a` и аргументом `0` в регистре `%ah`. BIOS имеет предопределённый набор сервисов, запрашиваемых приложениями как программно-генерируемые прерывания через инструкцию `int`, с получением аргументов в регистрах (в данном случае, `%ah`). Здесь, в частности, запрашивается количество тиков часов с момента последней полуночи; это значение вычисляется BIOS через RTC (Real Time Clock). Эти часы могут быть настроены на работу с частотой от 2 Гц до 8192 Гц. BIOS устанавливает их на 18,2 Гц при запуске. Когда запрос выполнен, 32-битный результат возвращается BIOS в регистрах `%cx` и `%dx` (младшие байты в `%dx`). Этот результат (часть `%dx`) копируется в регистр `%di`, и к `%di` добавляется значение переменной `TICKS`. Эта переменная находится в [.filename]#boot0# по смещению `_TICKS` (отрицательное значение) от регистра `%bp` (который, напомним, указывает на `0x800`). Значение этой переменной по умолчанию — `0xb6` (182 в десятичной системе). Идея заключается в том, что [.filename]#boot0# постоянно запрашивает время у BIOS, и когда значение, возвращённое в регистре `%dx`, становится больше значения, хранящегося в `%di`, время истекает и будет сделан выбор по умолчанию. Поскольку RTC тикает 18,2 раза в секунду, это условие выполнится через 10 секунд (это поведение по умолчанию можно изменить в [.filename]#Makefile#). До истечения этого времени [.filename]#boot0# непрерывно опрашивает BIOS на предмет ввода пользователя; это делается через `int 0x16`, аргумент `1` в `%ah`.
+
+Была нажата клавиша или истекло время, последующий код проверяет выбор. В зависимости от выбора, регистр `%si` устанавливается так, чтобы указывать на соответствующую запись раздела в таблице разделов. Этот новый выбор переопределяет предыдущий выбор по умолчанию. Действительно, он становится новым значением по умолчанию. Наконец, устанавливается флаг ACTIVE выбранного раздела. Если это было разрешено при компиляции, версия [.filename]#boot0# в памяти с этими изменёнными значениями записывается обратно в MBR на диске. Мы оставляем детали этой реализации читателю.
+
+Мы завершаем наше изучение последним блоком кода из программы [.filename]#boot0#:
+
+[.programlisting]
+....
+ movw $LOAD,%bx # Address for read
+ movb $0x2,%ah # Read sector
+ callw intx13 # from disk
+ jc beep # If error
+ cmpw $MAGIC,0x1fe(%bx) # Bootable?
+ jne beep # No
+ pushw %si # Save ptr to selected part.
+ callw putn # Leave some space
+ popw %si # Restore, next stage uses it
+ jmp *%bx # Invoke bootstrap
+....
+
+.[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-check-bootable]]
+Вспомним, что `%si` указывает на выбранную запись раздела. Эта запись сообщает нам, где начинается раздел на диске. Мы предполагаем, конечно, что выбранный раздел действительно является срезом FreeBSD.
+
+[NOTE]
+====
+Отныне мы будем отдавать предпочтение использованию технически более точного термина "слайс" вместо "раздел".
+====
+
+Буфер передачи установлен в `0x7c00` (регистр `%bx`), и запрос на чтение первого сектора слайса FreeBSD выполняется вызовом `intx13`. Мы предполагаем, что всё прошло успешно, поэтому переход к `beep` не выполняется. В частности, новый прочитанный сектор должен заканчиваться магической последовательностью `0xaa55`. Наконец, значение в `%si` (указатель на выбранную таблицу разделов) сохраняется для использования на следующем этапе, и выполняется переход по адресу `0x7c00`, где начинается выполнение нашего следующего этапа (только что прочитанного блока).
+
+[[boot-boot1]]
+== Этап `boot1`
+
+До сих пор мы прошли следующую последовательность:
+
+* BIOS выполнил первоначальную инициализацию оборудования, включая POST. MBR ([.filename]#boot0#) был загружен по адресу `0x7c00` из абсолютного сектора один с диска. Управление выполнением было передано по этому адресу.
+* [.filename]#boot0# переместил себя по адресу, по которому он был скомпонован для выполнения (`0x600`), после чего выполнил переход для продолжения выполнения в соответствующем месте. В завершение, [.filename]#boot0# загрузил первый сектор диска из раздела FreeBSD по адресу `0x7c00`. Управление выполнением было передано по этому адресу.
+
+[.filename]#boot1# — это следующий шаг в последовательности загрузки. Это первая из трех стадий загрузки. Обратите внимание, что до сих пор мы работали исключительно с секторами диска. Действительно, BIOS загружает самый первый сектор, а [.filename]#boot0# загружает первый сектор раздела FreeBSD. Обе загрузки происходят по адресу `0x7c00`. Мы можем концептуально представлять эти секторы диска как содержащие файлы [.filename]#boot0# и [.filename]#boot1#, соответственно, но на самом деле это не совсем верно для [.filename]#boot1#. Строго говоря, в отличие от [.filename]#boot0#, [.filename]#boot1# не является частью загрузочных блоков footnote:[Файл /boot/boot1 существует, но он не записывается в начало раздела FreeBSD. Вместо этого он объединяется с boot2, формируя файл boot, который записывается в начало раздела FreeBSD и считывается во время загрузки.]. Вместо этого, единый полноценный файл [.filename]#boot# ([.filename]#/boot/boot#) в итоге записывается на диск. Этот файл представляет собой комбинацию [.filename]#boot1#, [.filename]#boot2# и `Boot Extender` (или BTX). Этот единый файл превышает размер одного сектора (больше 512 байт). К счастью, [.filename]#boot1# занимает _ровно_ первые 512 байт этого файла, поэтому, когда [.filename]#boot0# загружает первый сектор раздела FreeBSD (512 байт), он фактически загружает [.filename]#boot1# и передает ему управление.
+
+Основная задача [.filename]#boot1# — загрузить следующий этап загрузки. Этот следующий этап несколько сложнее. Он состоит из сервера под названием "Boot Extender" (BTX) и клиента под названием [.filename]#boot2#. Как мы увидим, последний этап загрузки, [.filename]#loader#, также является клиентом сервера BTX.
+
+Давайте теперь подробно рассмотрим, что именно делает [.filename]#boot1#, начиная, как мы это делали для [.filename]#boot0#, с точки входа:
+
+[.programlisting]
+....
+start:
+ jmp main
+....
+
+.[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-entry]]
+Точка входа `start` просто переходит через специальную область данных к метке `main`, которая, в свою очередь, выглядит следующим образом:
+
+[.programlisting]
+....
+main:
+ cld # String ops inc
+ xor %cx,%cx # Zero
+ mov %cx,%es # Address
+ mov %cx,%ds # data
+ mov %cx,%ss # Set up
+ mov $start,%sp # stack
+ mov %sp,%si # Source
+ mov $MEM_REL,%di # Destination
+ incb %ch # Word count
+ rep # Copy
+ movsw # code
+....
+
+.[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-main]]
+Как и [.filename]#boot0#, этот код перемещает [.filename]#boot1#, на этот раз по адресу `0x700`. Однако, в отличие от [.filename]#boot0#, он не переходит туда. [.filename]#boot1# скомпонован для выполнения по адресу `0x7c00`, фактически там, куда он был изначально загружен. Причина этого перемещения будет рассмотрена далее.
+
+Далее идет цикл, который ищет слайс FreeBSD. Хотя [.filename]#boot0# загрузил [.filename]#boot1# из слайса FreeBSD, ему не была передана информация об этом footnote:[На самом деле мы передали указатель на адрес слайса в регистре %si. Однако boot1 не предполагает, что он был загружен boot0 (возможно, его загрузил другой MBR и не передал эту информацию), поэтому он ничего не предполагает.], поэтому [.filename]#boot1# должен повторно просканировать таблицу разделов, чтобы найти начало слайса FreeBSD. Для этого он перечитывает MBR:
+
+[.programlisting]
+....
+ mov $part4,%si # Partition
+ cmpb $0x80,%dl # Hard drive?
+ jb main.4 # No
+ movb $0x1,%dh # Block count
+ callw nread # Read MBR
+....
+
+.[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-find-freebsd]]
+В приведённом выше коде регистр `%dl` содержит информацию о загрузочном устройстве. Эти данные передаются BIOS и сохраняются MBR. Числа `0x80` и выше указывают на то, что мы имеем дело с жёстким диском, поэтому вызывается `nread`, где считывается MBR. Аргументы для `nread` передаются через `%si` и `%dh`. Адрес памяти по метке `part4` копируется в `%si`. Этот адрес памяти содержит "фальшивый раздел", который будет использован `nread`. Ниже приведены данные фальшивого раздела:
+
+[.programlisting]
+....
+ part4:
+ .byte 0x80, 0x00, 0x01, 0x00
+ .byte 0xa5, 0xfe, 0xff, 0xff
+ .byte 0x00, 0x00, 0x00, 0x00
+ .byte 0x50, 0xc3, 0x00, 0x00
+....
+
+.[.filename]#stand/i386/boot2/boot1.S# [[boot-boot2-make-fake-partition]]
+В частности, LBA для этой фиктивной раздела жестко закодирован как ноль. Это используется как аргумент для BIOS при чтении абсолютного сектора один с жесткого диска. Альтернативно, может использоваться адресация CHS. В этом случае, фиктивный раздел содержит цилиндр 0, головку 0 и сектор 1, что эквивалентно абсолютному сектору один.
+
+Продолжим, рассмотрев `nread`:
+
+[.programlisting]
+....
+nread:
+ mov $MEM_BUF,%bx # Transfer buffer
+ mov 0x8(%si),%ax # Get
+ mov 0xa(%si),%cx # LBA
+ push %cs # Read from
+ callw xread.1 # disk
+ jnc return # If success, return
+....
+
+.[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-nread]]
+Напомним, что `%si` указывает на поддельный раздел. Слово footnote:[В контексте 16-битного реального режима слово — это 2 байта.] по смещению `0x8` копируется в регистр `%ax`, а слово по смещению `0xa` — в `%cx`. BIOS интерпретирует их как младшее 4-байтовое значение, обозначающее LBA для чтения (старшие четыре байта предполагаются нулевыми). Регистр `%bx` содержит адрес памяти, куда будет загружен MBR. Инструкция, помещающая `%cs` в стек, очень интересна. В данном контексте она ничего не делает. Однако, как мы скоро увидим, [.filename]#boot2# в сочетании с сервером BTX также использует `xread.1`. Этот механизм будет рассмотрен в следующем разделе.
+
+Код в `xread.1` далее вызывает функцию `read`, которая фактически обращается к BIOS с запросом на чтение сектора диска:
+
+[.programlisting]
+....
+xread.1:
+ pushl $0x0 # absolute
+ push %cx # block
+ push %ax # number
+ push %es # Address of
+ push %bx # transfer buffer
+ xor %ax,%ax # Number of
+ movb %dh,%al # blocks to
+ push %ax # transfer
+ push $0x10 # Size of packet
+ mov %sp,%bp # Packet pointer
+ callw read # Read from disk
+ lea 0x10(%bp),%sp # Clear stack
+ lret # To far caller
+....
+
+.[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-xread1]]
+Обратите внимание на длинную инструкцию возврата в конце этого блока. Эта инструкция извлекает регистр `%cs`, помещённый в стек `nread`, и возвращает управление. В конце `nread` также возвращает управление.
+
+С загрузкой MBR в память начинается фактический цикл поиска слайса FreeBSD:
+
+[.programlisting]
+....
+ mov $0x1,%cx # Two passes
+main.1:
+ mov $MEM_BUF+PRT_OFF,%si # Partition table
+ movb $0x1,%dh # Partition
+main.2:
+ cmpb $PRT_BSD,0x4(%si) # Our partition type?
+ jne main.3 # No
+ jcxz main.5 # If second pass
+ testb $0x80,(%si) # Active?
+ jnz main.5 # Yes
+main.3:
+ add $0x10,%si # Next entry
+ incb %dh # Partition
+ cmpb $0x1+PRT_NUM,%dh # In table?
+ jb main.2 # Yes
+ dec %cx # Do two
+ jcxz main.1 # passes
+....
+
+.[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-find-part]]
+Если обнаружен слайс FreeBSD, выполнение продолжается на метке `main.5`. Обратите внимание, что при обнаружении слайса FreeBSD `%si` указывает на соответствующую запись в таблице разделов, а `%dh` содержит номер раздела. Мы предполагаем, что слайс FreeBSD найден, поэтому продолжаем выполнение на метке `main.5`:
+
+[.programlisting]
+....
+main.5:
+ mov %dx,MEM_ARG # Save args
+ movb $NSECT,%dh # Sector count
+ callw nread # Read disk
+ mov $MEM_BTX,%bx # BTX
+ mov 0xa(%bx),%si # Get BTX length and set
+ add %bx,%si # %si to start of boot2.bin
+ mov $MEM_USR+SIZ_PAG*2,%di # Client page 2
+ mov $MEM_BTX+(NSECT-1)*SIZ_SEC,%cx # Byte
+ sub %si,%cx # count
+ rep # Relocate
+ movsb # client
+....
+
+.[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-main5]]
+Напомним, что в данный момент регистр `%si` указывает на запись среза FreeBSD в таблице разделов MBR, поэтому вызов `nread` фактически прочитает секторы в начале этого раздела. Аргумент, переданный в регистре `%dh`, указывает `nread` прочитать 16 секторов диска. Напомним, что первые 512 байт, или первый сектор слайса FreeBSD, совпадает с программой [.filename]#boot1#. Также напомним, что файл, записанный в начало слайса FreeBSD, это не [.filename]#/boot/boot1#, а [.filename]#/boot/boot#. Давайте посмотрим на размер этих файлов в файловой системе:
+
+[source, bash]
+....
+-r--r--r-- 1 root wheel 512B Jan 8 00:15 /boot/boot0
+-r--r--r-- 1 root wheel 512B Jan 8 00:15 /boot/boot1
+-r--r--r-- 1 root wheel 7.5K Jan 8 00:15 /boot/boot2
+-r--r--r-- 1 root wheel 8.0K Jan 8 00:15 /boot/boot
+....
+
+Оба файла [.filename]#boot0# и [.filename]#boot1# имеют размер 512 байт каждый, поэтому они занимают _ровно_ один сектор диска. [.filename]#boot2# значительно больше, так как содержит как сервер BTX, так и клиент [.filename]#boot2#. Наконец, файл под названием просто [.filename]#boot# на 512 байт больше, чем [.filename]#boot2#. Этот файл представляет собой объединение [.filename]#boot1# и [.filename]#boot2#. Как уже отмечалось, [.filename]#boot0# записывается в самый первый сектор диска (MBR), а [.filename]#boot# записывается в первый сектор раздела FreeBSD; [.filename]#boot1# и [.filename]#boot2# _не_ записываются на диск. Команда, используемая для объединения [.filename]#boot1# и [.filename]#boot2# в единый файл [.filename]#boot#, выглядит просто как `cat boot1 boot2 > boot`.
+
+Итак, [.filename]#boot1# занимает ровно первые 512 байт [.filename]#boot#, и, поскольку [.filename]#boot# записывается в первый сектор слайса FreeBSD, [.filename]#boot1# полностью помещается в этот первый сектор. Когда `nread` читает первые 16 секторов слайса FreeBSD, он фактически читает весь файл [.filename]#boot# footnote:[512*16=8192 байта, ровно размер boot]. Более подробно о том, как [.filename]#boot# формируется из [.filename]#boot1# и [.filename]#boot2#, мы увидим в следующем разделе.
+
+Напомним, что `nread` использует адрес памяти `0x8c00` в качестве буфера передачи для хранения прочитанных секторов. Этот адрес выбран не случайно. Действительно, поскольку [.filename]#boot1# принадлежит первым 512 байтам, он оказывается в диапазоне адресов `0x8c00`-`0x8dff`. Следующие 512 байт (диапазон `0x8e00`-`0x8fff`) используются для хранения _bsdlabel_ footnote:[Исторически известной как disklabel. Если вам когда-либо было интересно, где FreeBSD хранит эту информацию, она находится в этой области — см. man:bsdlabel[8]].
+
+Начиная с адреса `0x9000` находится начало сервера BTX, и сразу за ним следует клиент [.filename]#boot2#. Сервер BTX действует как ядро и выполняется в защищённом режиме с наивысшим уровнем привилегий. В отличие от этого, клиенты BTX (например, [.filename]#boot2#) выполняются в пользовательском режиме. Мы увидим, как это реализовано, в следующем разделе. Код после вызова `nread` находит начало [.filename]#boot2# в буфере памяти и копирует его по адресу `0xc000`. Это связано с тем, что сервер BTX размещает [.filename]#boot2# для выполнения в сегменте, начинающемся с `0xa000`. Мы подробно рассмотрим это в следующем разделе.
+
+Последний блок кода в [.filename]#boot1# разрешает доступ к памяти выше 1MB footnote:[Это необходимо по историческим причинам. Заинтересованные читатели могут обратиться к .] и завершается переходом к начальной точке сервера BTX:
+
+[.programlisting]
+....
+seta20:
+ cli # Disable interrupts
+seta20.1:
+ dec %cx # Timeout?
+ jz seta20.3 # Yes
+
+ inb $0x64,%al # Get status
+ testb $0x2,%al # Busy?
+ jnz seta20.1 # Yes
+ movb $0xd1,%al # Command: Write
+ outb %al,$0x64 # output port
+seta20.2:
+ inb $0x64,%al # Get status
+ testb $0x2,%al # Busy?
+ jnz seta20.2 # Yes
+ movb $0xdf,%al # Enable
+ outb %al,$0x60 # A20
+seta20.3:
+ sti # Enable interrupts
+ jmp 0x9010 # Start BTX
+....
+
+.[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-seta20]]
+Обратите внимание, что непосредственно перед переходом прерывания включаются.
+
+[[btx-server]]
+== Сервер BTX
+
+Далее в нашей последовательности загрузки идёт сервер BTX. Давайте быстро вспомним, как мы сюда попали:
+
+* BIOS загружает абсолютный сектор один (MBR или [.filename]#boot0#) по адресу `0x7c00` и переходит туда.
+* [.filename]#boot0# перемещает себя по адресу `0x600`, по которому он был слинкован для выполнения, и переходит туда. Затем он читает первый сектор среза FreeBSD (который содержит [.filename]#boot1#) в адрес `0x7c00` и переходит туда.
+* [.filename]#boot1# загружает первые 16 секторов среза FreeBSD по адресу `0x8c00`. Эти 16 секторов, или 8192 байта, представляют собой весь файл [.filename]#boot#. Файл является объединением [.filename]#boot1# и [.filename]#boot2#. [.filename]#boot2#, в свою очередь, содержит сервер BTX и клиент [.filename]#boot2#. Наконец, выполняется переход по адресу `0x9010`, точке входа сервера BTX.
+
+Прежде чем изучать сервер BTX подробно, давайте рассмотрим, как создается единый, всеобъемлющий файл [.filename]#boot#. Способ сборки [.filename]#boot# определен в его [.filename]#Makefile# ([.filename]#stand/i386/boot2/Makefile#). Рассмотрим правило, которое создает файл [.filename]#boot#:
+
+[.programlisting]
+....
+ boot: boot1 boot2
+ cat boot1 boot2 > boot
+....
+
+.[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot]]
+Это говорит нам, что [.filename]#boot1# и [.filename]#boot2# необходимы, и правило просто объединяет их для создания одного файла с именем [.filename]#boot#. Правила для создания [.filename]#boot1# также довольно просты:
+
+[.programlisting]
+....
+ boot1: boot1.out
+ ${OBJCOPY} -S -O binary boot1.out ${.TARGET}
+
+ boot1.out: boot1.o
+ ${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} boot1.o
+....
+
+.[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot1]]
+Для применения правила создания [.filename]#boot1# необходимо собрать [.filename]#boot1.out#. Это, в свою очередь, зависит от наличия [.filename]#boot1.o#. Последний файл является результатом ассемблирования нашего знакомого [.filename]#boot1.S# без компоновки. Теперь применяется правило создания [.filename]#boot1.out#. Оно указывает, что [.filename]#boot1.o# должен быть скомпонован с точкой входа `start` и начальным адресом `0x7c00`. Наконец, [.filename]#boot1# создается из [.filename]#boot1.out# применением соответствующего правила. Это команда [.filename]#objcopy#, применяемая к [.filename]#boot1.out#. Обратите внимание на флаги, передаваемые [.filename]#objcopy#: `-S` указывает на удаление всей информации о перемещении и символов; `-O binary` указывает формат вывода, то есть простой, неформатированный двоичный файл.
+
+Имея [.filename]#boot1#, давайте посмотрим, как устроен [.filename]#boot2#:
+
+[.programlisting]
+....
+ boot2: boot2.ld
+ @set -- `ls -l ${.ALLSRC}`; x=$$((${BOOT2SIZE}-$$5)); \
+ echo "$$x bytes available"; test $$x -ge 0
+ ${DD} if=${.ALLSRC} of=${.TARGET} bs=${BOOT2SIZE} conv=sync
+
+ boot2.ld: boot2.ldr boot2.bin ${BTXKERN}
+ btxld -v -E ${ORG2} -f bin -b ${BTXKERN} -l boot2.ldr \
+ -o ${.TARGET} -P 1 boot2.bin
+
+ boot2.ldr:
+ ${DD} if=/dev/zero of=${.TARGET} bs=512 count=1
+
+ boot2.bin: boot2.out
+ ${OBJCOPY} -S -O binary boot2.out ${.TARGET}
+
+ boot2.out: ${BTXCRT} boot2.o sio.o ashldi3.o
+ ${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC}
+
+ boot2.h: boot1.out
+ ${NM} -t d ${.ALLSRC} | awk '/([0-9])+ T xread/ \
+ { x = $$1 - ORG1; \
+ printf("#define XREADORG %#x\n", REL1 + x) }' \
+ ORG1=`printf "%d" ${ORG1}` \
+ REL1=`printf "%d" ${REL1}` > ${.TARGET}
+....
+
+.[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot2]]
+Механизм сборки [.filename]#boot2# гораздо сложнее. Отметим наиболее важные моменты. Список зависимостей выглядит следующим образом:
+
+[.programlisting]
+....
+ boot2: boot2.ld
+ boot2.ld: boot2.ldr boot2.bin ${BTXDIR}
+ boot2.bin: boot2.out
+ boot2.out: ${BTXDIR} boot2.o sio.o ashldi3.o
+ boot2.h: boot1.out
+....
+
+.[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot2-more]]
+Отметим, что изначально файл заголовка [.filename]#boot2.h# отсутствует, но его создание зависит от [.filename]#boot1.out#, который у нас уже есть. Правило его создания немного лаконично, но важно то, что результат, [.filename]#boot2.h#, выглядит примерно так:
+
+[.programlisting]
+....
+#define XREADORG 0x725
+....
+
+.[.filename]#stand/i386/boot2/boot2.h# [[boot-boot1-make-boot2h]]
+Напомним, что [.filename]#boot1# был перемещён (т.е. скопирован из `0x7c00` в `0x700`). Это перемещение теперь обретает смысл, потому что, как мы увидим, сервер BTX освобождает часть памяти, включая область, куда [.filename]#boot1# был изначально загружен. Однако серверу BTX необходим доступ к функции `xread` из [.filename]#boot1#; согласно выводу [.filename]#boot2.h#, эта функция находится по адресу `0x725`. Действительно, сервер BTX использует функцию `xread` из перемещённого кода [.filename]#boot1#. Теперь эта функция доступна из клиента [.filename]#boot2#.
+
+Следующее правило указывает компоновщику на необходимость связать различные файлы ([.filename]#ashldi3.o#, [.filename]#boot2.o# и [.filename]#sio.o#). Обратите внимание, что выходной файл [.filename]#boot2.out# компонуется для выполнения по адресу `0x2000` (${ORG2}). Напомним, что [.filename]#boot2# будет выполняться в пользовательском режиме внутри специального пользовательского сегмента, созданного сервером BTX. Этот сегмент начинается с адреса `0xa000`. Также помните, что часть [.filename]#boot2# в [.filename]#boot# была скопирована по адресу `0xc000`, то есть со смещением `0x2000` от начала пользовательского сегмента, поэтому [.filename]#boot2# будет работать корректно при передаче управления на него. Далее, [.filename]#boot2.bin# создается из [.filename]#boot2.out# путем удаления символов и информации о формате; boot2.bin представляет собой _сырой_ бинарный файл. Теперь обратите внимание, что файл [.filename]#boot2.ldr# создается как 512-байтный файл, заполненный нулями. Это пространство зарезервировано для bsdlabel.
+
+Теперь, когда у нас есть файлы [.filename]#boot1#, [.filename]#boot2.bin# и [.filename]#boot2.ldr#, осталось только добавить сервер BTX перед созданием универсального файла [.filename]#boot#. Сервер BTX находится в [.filename]#stand/i386/btx/btx#; у него есть собственный [.filename]#Makefile# со своим набором правил для сборки. Важно отметить, что он также компилируется как _сырой_ бинарный файл и линкуется для выполнения по адресу `0x9000`. Подробности можно найти в [.filename]#stand/i386/btx/btx/Makefile#.
+
+Имея файлы, составляющие программу [.filename]#boot#, последним шагом является их _объединение_. Это выполняется специальной программой под названием [.filename]#btxld# (исходный код расположен в [.filename]#/usr/src/usr.sbin/btxld#). Некоторые аргументы этой программы включают имя выходного файла ([.filename]#boot#), его точку входа (`0x2000`) и формат файла (бинарный). Различные файлы окончательно объединяются этой утилитой в файл [.filename]#boot#, который состоит из [.filename]#boot1#, [.filename]#boot2#, `bsdlabel` и сервера BTX. Этот файл, занимающий ровно 16 секторов или 8192 байта, записывается в начало раздела FreeBSD во время установки. Теперь перейдем к изучению программы сервера BTX.
+
+Сервер BTX подготавливает простое окружение и переключается из 16-битного реального режима в 32-битный защищённый режим, непосредственно перед передачей управления клиенту. Это включает инициализацию и обновление следующих структур данных:
+
+* Изменяет `Таблицу Векторов Прерываний (IVT)`. IVT предоставляет обработчики исключений и прерываний для кода в Реальном Режиме.
+* Создается `Таблица дескрипторов прерываний (IDT)`. В ней предусмотрены записи для исключений процессора, аппаратных прерываний, двух системных вызовов и интерфейса V86. IDT предоставляет обработчики исключений и прерываний для кода в защищенном режиме.
+* Создается `Сегмент состояния задачи (TSS)`. Это необходимо, потому что процессор работает на _наименее_ привилегированном уровне при выполнении клиента ([.filename]#boot2#), но на _наиболее_ привилегированном уровне при выполнении сервера BTX.
+* Устанавливается GDT (Глобальная Таблица Дескрипторов). Создаются записи (дескрипторы) для кода и данных супервизора, кода и данных пользователя, а также кода и данных реального режима. footnote:[Код и данные реального режима необходимы при переключении обратно в реальный режим из защищённого режима, как указано в руководствах Intel.]
+
+Приступим к изучению фактической реализации. Напомним, что [.filename]#boot1# выполнил переход на адрес `0x9010` — точку входа сервера BTX. Прежде чем изучать выполнение программы там, обратите внимание, что сервер BTX имеет специальный заголовок в диапазоне адресов `0x9000-0x900f`, непосредственно перед точкой входа. Этот заголовок определён следующим образом:
+
+[.programlisting]
+....
+start: # Start of code
+/*
+ * BTX header.
+ */
+btx_hdr: .byte 0xeb # Machine ID
+ .byte 0xe # Header size
+ .ascii "BTX" # Magic
+ .byte 0x1 # Major version
+ .byte 0x2 # Minor version
+ .byte BTX_FLAGS # Flags
+ .word PAG_CNT-MEM_ORG>>0xc # Paging control
+ .word break-start # Text size
+ .long 0x0 # Entry address
+....
+
+.[.filename]#stand/i386/btx/btx/btx.S# [[btx-header]]
+Обратите внимание, что первые два байта — это `0xeb` и `0xe`. В архитектуре IA-32 эти два байта интерпретируются как относительный переход за заголовок к точке входа, поэтому теоретически [.filename]#boot1# мог бы перейти сюда (адрес `0x9000`) вместо адреса `0x9010`. Обратите внимание, что последнее поле в заголовке BTX — это указатель на точку входа клиента ([.filename]#boot2#)b2. Это поле исправляется во время компоновки.
+
+Сразу после заголовка следует точка входа сервера BTX:
+
+[.programlisting]
+....
+/*
+ * Initialization routine.
+ */
+init: cli # Disable interrupts
+ xor %ax,%ax # Zero/segment
+ mov %ax,%ss # Set up
+ mov $MEM_ESP0,%sp # stack
+ mov %ax,%es # Address
+ mov %ax,%ds # data
+ pushl $0x2 # Clear
+ popfl # flags
+....
+
+.[.filename]#stand/i386/btx/btx/btx.S# [[btx-init]]
+Этот код отключает прерывания, устанавливает рабочий стек (начиная с адреса `0x1800`) и очищает флаги в регистре EFLAGS. Обратите внимание, что инструкция `popfl` извлекает двойное слово (4 байта) из стека и помещает его в регистр EFLAGS. Поскольку извлекаемое значение фактически равно `2`, регистр EFLAGS эффективно очищается (IA-32 требует, чтобы бит 2 регистра EFLAGS всегда был равен 1).
+
+Следующий блок кода очищает (устанавливает в `0`) диапазон памяти `0x5e00-0x8fff`. В этом диапазоне будут созданы различные структуры данных:
+
+[.programlisting]
+....
+/*
+ * Initialize memory.
+ */
+ mov $MEM_IDT,%di # Memory to initialize
+ mov $(MEM_ORG-MEM_IDT)/2,%cx # Words to zero
+ rep # Zero-fill
+ stosw # memory
+....
+
+.[.filename]#stand/i386/btx/btx/btx.S# [[btx-clear-mem]]
+Напомним, что [.filename]#boot1# изначально загружался по адресу `0x7c00`, поэтому при такой инициализации памяти эта копия фактически исчезла. Однако также напомним, что [.filename]#boot1# был перемещён на адрес `0x700`, поэтому _эта_ копия всё ещё находится в памяти, и сервер BTX будет её использовать.
+
+Далее обновляется таблица векторов прерываний (IVT) в реальном режиме. IVT представляет собой массив пар сегмент/смещение для обработчиков исключений и прерываний. BIOS обычно сопоставляет аппаратные прерывания с векторами прерываний `0x8`–`0xf` и `0x70`–`0x77`, но, как будет показано, программируемый контроллер прерываний 8259A, микросхема, управляющая фактическим сопоставлением аппаратных прерываний с векторами прерываний, программируется для переназначения этих векторов прерываний с `0x8`–`0xf` на `0x20`–`0x27` и с `0x70`–`0x77` на `0x28`–`0x2f`. Таким образом, обработчики прерываний предоставляются для векторов прерываний `0x20`–`0x2f`. Причина, по которой обработчики, предоставляемые BIOS, не используются напрямую, заключается в том, что они работают в 16-битном реальном режиме, но не в 32-битном защищённом режиме. Вскоре будет выполнен переход в 32-битный защищённый режим. Однако сервер BTX настраивает механизм для эффективного использования обработчиков, предоставляемых BIOS:
+
+[.programlisting]
+....
+/*
+ * Update real mode IDT for reflecting hardware interrupts.
+ */
+ mov $intr20,%bx # Address first handler
+ mov $0x10,%cx # Number of handlers
+ mov $0x20*4,%di # First real mode IDT entry
+init.0: mov %bx,(%di) # Store IP
+ inc %di # Address next
+ inc %di # entry
+ stosw # Store CS
+ add $4,%bx # Next handler
+ loop init.0 # Next IRQ
+....
+
+.[.filename]#stand/i386/btx/btx/btx.S# [[btx-ivt]]
+Следующий блок создает IDT (таблицу дескрипторов прерываний). IDT в защищенном режиме аналогична IVT в реальном режиме. То есть, IDT описывает различные обработчики исключений и прерываний, используемые, когда процессор работает в защищенном режиме. По сути, она также состоит из массива пар сегмент/смещение, хотя структура несколько сложнее, поскольку сегменты в защищенном режиме отличаются от реального режима, и применяются различные механизмы защиты:
+
+[.programlisting]
+....
+/*
+ * Create IDT.
+ */
+ mov $MEM_IDT,%di # IDT's address
+ mov $idtctl,%si # Control string
+init.1: lodsb # Get entry
+ cbw # count
+ xchg %ax,%cx # as word
+ jcxz init.4 # If done
+ lodsb # Get segment
+ xchg %ax,%dx # P:DPL:type
+ lodsw # Get control
+ xchg %ax,%bx # set
+ lodsw # Get handler offset
+ mov $SEL_SCODE,%dh # Segment selector
+init.2: shr %bx # Handle this int?
+ jnc init.3 # No
+ mov %ax,(%di) # Set handler offset
+ mov %dh,0x2(%di) # and selector
+ mov %dl,0x5(%di) # Set P:DPL:type
+ add $0x4,%ax # Next handler
+init.3: lea 0x8(%di),%di # Next entry
+ loop init.2 # Till set done
+ jmp init.1 # Continue
+....
+
+.[.filename]#stand/i386/btx/btx/btx.S# [[btx-idt]]
+Каждая запись в `IDT` имеет длину 8 байт. Помимо информации о сегменте/смещении, они также описывают тип сегмента, уровень привилегий и присутствует ли сегмент в памяти. Структура организована так, что векторы прерываний от `0` до `0xf` (исключения) обрабатываются функцией `intx00`; вектор `0x10` (также исключение) обрабатывается `intx10`; аппаратные прерывания, которые позже настраиваются начиная с вектора `0x20` и до вектора `0x2f`, обрабатываются функцией `intx20`. Наконец, вектор прерывания `0x30`, используемый для системных вызовов, обрабатывается `intx30`, а векторы `0x31` и `0x32` обрабатываются `intx31`. Необходимо отметить, что только дескрипторы для векторов прерываний `0x30`, `0x31` и `0x32` имеют уровень привилегий 3, такой же, как у клиента [.filename]#boot2#, что означает, что клиент может выполнить программно-генерируемое прерывание к этим векторам через инструкцию `int` без ошибки (это способ, которым [.filename]#boot2# использует сервисы, предоставляемые сервером BTX). Также обратите внимание, что _только_ программно-генерируемые прерывания защищены от кода, выполняющегося на более низких уровнях привилегий. Аппаратно-генерируемые прерывания и исключения, генерируемые процессором, _всегда_ обрабатываются корректно, независимо от фактических привилегий.
+
+Следующий шаг — инициализация TSS (сегмента состояния задачи). TSS — это аппаратная функция, которая помогает операционной системе или исполнительному ПО реализовать многозадачность через абстракцию процессов. Архитектура IA-32 требует создания и использования _как минимум_ одного TSS, если используются механизмы многозадачности или определены различные уровни привилегий. Поскольку клиент [.filename]#boot2# выполняется на уровне привилегий 3, а сервер BTX работает на уровне привилегий 0, необходимо определить TSS:
+
+[.programlisting]
+....
+/*
+ * Initialize TSS.
+ */
+init.4: movb $_ESP0H,TSS_ESP0+1(%di) # Set ESP0
+ movb $SEL_SDATA,TSS_SS0(%di) # Set SS0
+ movb $_TSSIO,TSS_MAP(%di) # Set I/O bit map base
+....
+
+.[.filename]#stand/i386/btx/btx/btx.S# [[btx-tss]]
+Обратите внимание, что в TSS указано значение для указателя стека и сегмента стека уровня привилегий 0. Это необходимо, потому что если прерывание или исключение получено во время выполнения [.filename]#boot2# на уровне привилегий 3, процессор автоматически переключается на уровень привилегий 0, поэтому требуется новый рабочий стек. Наконец, полю базового адреса карты ввода-вывода TSS присваивается значение, которое представляет собой 16-битное смещение от начала TSS до битовой карты разрешений ввода-вывода и битовой карты перенаправления прерываний.
+
+После создания IDT и TSS процессор готов к переходу в защищённый режим. Это выполняется в следующем блоке:
+
+[.programlisting]
+....
+/*
+ * Bring up the system.
+ */
+ mov $0x2820,%bx # Set protected mode
+ callw setpic # IRQ offsets
+ lidt idtdesc # Set IDT
+ lgdt gdtdesc # Set GDT
+ mov %cr0,%eax # Switch to protected
+ inc %ax # mode
+ mov %eax,%cr0 #
+ ljmp $SEL_SCODE,$init.8 # To 32-bit code
+ .code32
+init.8: xorl %ecx,%ecx # Zero
+ movb $SEL_SDATA,%cl # To 32-bit
+ movw %cx,%ss # stack
+....
+
+.[.filename]#stand/i386/btx/btx/btx.S# [[btx-prot]]
+Сначала вызывается `setpic` для программирования 8259A PIC (программируемого контроллера прерываний). Этот чип подключен к нескольким источникам аппаратных прерываний. При получении прерывания от устройства он сигнализирует процессору соответствующим вектором прерывания. Это можно настроить так, чтобы определенные прерывания были связаны с конкретными векторами прерываний, как объяснялось ранее. Затем регистры IDTR (Interrupt Descriptor Table Register) и GDTR (Global Descriptor Table Register) загружаются инструкциями `lidt` и `lgdt` соответственно. Эти регистры загружаются базовым адресом и предельным адресом для IDT и GDT. Следующие три инструкции устанавливают бит Protection Enable (PE) в регистре `%cr0`. Это фактически переключает процессор в 32-битный защищенный режим. Затем выполняется дальний переход на `init.8` с использованием селектора сегмента SEL_SCODE, который выбирает сегмент кода супервизора (Supervisor Code Segment). После этого перехода процессор фактически работает на уровне CPL 0 — наиболее привилегированном уровне. Наконец, для стека выбирается сегмент данных супервизора (Supervisor Data Segment) путем присвоения селектора сегмента SEL_SDATA регистру `%ss`. Этот сегмент данных также имеет уровень привилегий `0`.
+
+Наш последний блок кода отвечает за загрузку TR (Регистра Задач) с селектором сегмента для TSS, который мы создали ранее, и настройку окружения пользовательского режима перед передачей управления исполнения клиенту [.filename]#boot2#.
+
+[.programlisting]
+....
+/*
+ * Launch user task.
+ */
+ movb $SEL_TSS,%cl # Set task
+ ltr %cx # register
+ movl $MEM_USR,%edx # User base address
+ movzwl %ss:BDA_MEM,%eax # Get free memory
+ shll $0xa,%eax # To bytes
+ subl $ARGSPACE,%eax # Less arg space
+ subl %edx,%eax # Less base
+ movb $SEL_UDATA,%cl # User data selector
+ pushl %ecx # Set SS
+ pushl %eax # Set ESP
+ push $0x202 # Set flags (IF set)
+ push $SEL_UCODE # Set CS
+ pushl btx_hdr+0xc # Set EIP
+ pushl %ecx # Set GS
+ pushl %ecx # Set FS
+ pushl %ecx # Set DS
+ pushl %ecx # Set ES
+ pushl %edx # Set EAX
+ movb $0x7,%cl # Set remaining
+init.9: push $0x0 # general
+ loop init.9 # registers
+#ifdef BTX_SERIAL
+ call sio_init # setup the serial console
+#endif
+ popa # and initialize
+ popl %es # Initialize
+ popl %ds # user
+ popl %fs # segment
+ popl %gs # registers
+ iret # To user mode
+....
+
+.[.filename]#stand/i386/btx/btx/btx.S# [[btx-end]]
+Обратите внимание, что среда клиента включает селектор сегмента стека и указатель стека (регистры `%ss` и `%esp`). Действительно, как только TR загружается соответствующим селектором сегмента стека (инструкция `ltr`), указатель стека вычисляется и помещается в стек вместе с селектором сегмента стека. Затем значение `0x202` помещается в стек; это значение, которое EFLAGS получит при передаче управления клиенту. Также в стек помещаются селектор сегмента кода пользовательского режима и точка входа клиента. Напомним, что эта точка входа прописывается в заголовке BTX во время компоновки. Наконец, селекторы сегментов (хранящиеся в регистре `%ecx`) для регистров сегментов `%gs, %fs, %ds и %es` помещаются в стек вместе со значением из `%edx` (`0xa000`). Примите во внимание эти значения, помещенные в стек (они скоро будут извлечены). Затем значения для оставшихся регистров общего назначения также помещаются в стек (обратите внимание на цикл `loop`, который помещает значение `0` семь раз). Теперь начнётся извлечение значений из стека. Сначала инструкция `popa` извлекает из стека последние семь помещённых значений. Они сохраняются в регистрах общего назначения в порядке `%edi, %esi, %ebp, %ebx, %edx, %ecx, %eax`. Затем различные селекторы сегментов, помещённые в стек, извлекаются в соответствующие регистры сегментов. В стеке остаются ещё пять значений. Они извлекаются при выполнении инструкции `iret`. Эта инструкция сначала извлекает значение, которое было помещено из заголовка BTX. Это значение является указателем на точку входа [.filename]#boot2#. Оно помещается в регистр `%eip` — регистр указателя инструкций. Затем селектор сегмента кода пользователя извлекается и копируется в регистр `%cs`. Помните, что уровень привилегий этого сегмента — 3, наименее привилегированный уровень. Это означает, что мы должны предоставить значения для стека этого уровня привилегий. Именно поэтому процессор, помимо дальнейшего извлечения значения для регистра EFLAGS, выполняет ещё два извлечения из стека. Эти значения попадают в указатель стека (`%esp`) и сегмент стека (`%ss`). Теперь выполнение продолжается с точки входа ``boot0``.
+
+Важно отметить, как определяется сегмент пользовательского кода. _Базовый адрес_ этого сегмента установлен на `0xa000`. Это означает, что адреса памяти кода являются _относительными_ к адресу 0xa000; если код, который выполняется, извлекается из адреса `0x2000`, _фактический_ адрес в памяти будет `0xa000+0x2000=0xc000`.
+
+[[boot2]]
+== Этап загрузки boot2
+
+`boot2` определяет важную структуру, `struct bootinfo`. Эта структура инициализируется `boot2` и передается загрузчику, а затем ядру. Некоторые узлы этой структуры устанавливаются `boot2`, остальные — загрузчиком. Эта структура, среди прочей информации, содержит имя файла ядра, геометрию жесткого диска в BIOS, номер диска в BIOS для загрузочного устройства, доступную физическую память, указатель `envp` и т.д. Ее определение выглядит так:
+
+[.programlisting]
+....
+/usr/include/machine/bootinfo.h:
+struct bootinfo {
+ u_int32_t bi_version;
+ u_int32_t bi_kernelname; /* represents a char * */
+ u_int32_t bi_nfs_diskless; /* struct nfs_diskless * */
+ /* End of fields that are always present. */
+#define bi_endcommon bi_n_bios_used
+ u_int32_t bi_n_bios_used;
+ u_int32_t bi_bios_geom[N_BIOS_GEOM];
+ u_int32_t bi_size;
+ u_int8_t bi_memsizes_valid;
+ u_int8_t bi_bios_dev; /* bootdev BIOS unit number */
+ u_int8_t bi_pad[2];
+ u_int32_t bi_basemem;
+ u_int32_t bi_extmem;
+ u_int32_t bi_symtab; /* struct symtab * */
+ u_int32_t bi_esymtab; /* struct symtab * */
+ /* Items below only from advanced bootloader */
+ u_int32_t bi_kernend; /* end of kernel space */
+ u_int32_t bi_envp; /* environment */
+ u_int32_t bi_modulep; /* preloaded modules */
+};
+....
+
+`boot2` входит в бесконечный цикл, ожидая ввода пользователя, затем вызывает `load()`. Если пользователь ничего не нажимает, цикл прерывается по таймауту, и `load()` загружает файл по умолчанию ([.filename]#/boot/loader#). Функции `ino_t lookup(char *filename)` и `int xfsread(ino_t inode, void *buf, size_t nbyte)` используются для чтения содержимого файла в память. [.filename]#/boot/loader# — это ELF-бинарный файл, но с заголовком ELF, перед которым добавлена структура `struct exec` из [.filename]#a.out#. `load()` анализирует ELF-заголовок загрузчика, загружает содержимое [.filename]#/boot/loader# в память и передаёт управление на точку входа загрузчика:
+
+[.programlisting]
+....
+stand/i386/boot2/boot2.c:
+ __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),
+ MAKEBOOTDEV(dev_maj[dsk.type], dsk.slice, dsk.unit, dsk.part),
+ 0, 0, 0, VTOP(&bootinfo));
+....
+
+[[boot-loader]]
+== Этап загрузчика (loader)
+
+Загрузчик также является клиентом BTX. Я не буду подробно описывать его здесь, существует исчерпывающая man-страница, написанная Майком Смитом: man:loader[8]. Основные механизмы и BTX были рассмотрены выше.
+
+Основная задача загрузчика — загрузить ядро. Когда ядро загружено в память, загрузчик вызывает его:
+
+[.programlisting]
+....
+stand/common/boot.c:
+ /* Call the exec handler from the loader matching the kernel */
+ file_formats[fp->f_loader]->l_exec(fp);
+....
+
+[[boot-kernel]]
+== Инициализация ядра
+
+Давайте рассмотрим команду, которая компонует ядро. Это поможет определить точное местоположение, где загрузчик передает выполнение ядру. Это местоположение является фактической точкой входа ядра. Данная команда теперь исключена из [.filename]#sys/conf/Makefile.i386#. Интересующее нас содержимое можно найти в [.filename]#/usr/obj/usr/src/i386.i386/sys/GENERIC/#.
+
+[.programlisting]
+....
+/usr/obj/usr/src/i386.i386/sys/GENERIC/kernel.meta:
+ld -m elf_i386_fbsd -Bdynamic -T /usr/src/sys/conf/ldscript.i386 --build-id=sha1 --no-warn-mismatch \
+--warn-common --export-dynamic --dynamic-linker /red/herring -X -o kernel locore.o
+<lots of kernel .o files>
+....
+
+Вот несколько интересных наблюдений. Во-первых, ядро представляет собой динамически связанный бинарный файл ELF, но динамический компоновщик для ядра — это [.filename]#/red/herring#, что явно является фиктивным файлом. Во-вторых, взглянув на файл [.filename]#sys/conf/ldscript.i386#, можно понять, какие параметры ld используются при компиляции ядра. Читая первые несколько строк, видим, что строка
+
+[.programlisting]
+....
+sys/conf/ldscript.i386:
+ENTRY(btext)
+....
+
+говорит, что точка входа ядра — это символ `btext`. Этот символ определён в [.filename]#locore.s#:
+
+[.programlisting]
+....
+sys/i386/i386/locore.s:
+ .text
+/**********************************************************************
+ *
+ * This is where the bootblocks start us, set the ball rolling...
+ *
+ */
+NON_GPROF_ENTRY(btext)
+....
+
+Сначала регистр EFLAGS устанавливается в предопределённое значение 0x00000002. Затем инициализируются все сегментные регистры:
+
+[.programlisting]
+....
+sys/i386/i386/locore.s:
+/* Don't trust what the BIOS gives for eflags. */
+ pushl $PSL_KERNEL
+ popfl
+
+/*
+ * Don't trust what the BIOS gives for %fs and %gs. Trust the bootstrap
+ * to set %cs, %ds, %es and %ss.
+ */
+ mov %ds, %ax
+ mov %ax, %fs
+ mov %ax, %gs
+....
+
+btext вызывает подпрограммы `recover_bootinfo()` и `identify_cpu()`, которые также определены в [.filename]#locore.s#. Вот описание их функций:
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|`recover_bootinfo`
+|Эта процедура разбирает параметры, переданные ядру при загрузке.
+Ядро могло быть загружено тремя способами: загрузчиком (как описано выше), старыми загрузочными блоками диска или по старой процедуре загрузки без диска.
+Эта функция определяет метод загрузки и сохраняет структуру `struct bootinfo` в памяти ядра.
+
+|`identify_cpu`
+|Эта функция пытается определить, на каком процессоре она выполняется, сохраняя найденное значение в переменной `_cpu`.
+|===
+
+Следующие шаги включают активацию VME, если процессор поддерживает эту функцию:
+
+[.programlisting]
+....
+sys/i386/i386/mpboot.s:
+ testl $CPUID_VME,%edx
+ jz 3f
+ orl $CR4_VME,%eax
+3: movl %eax,%cr4
+....
+
+Затем, включение подкачки:
+
+[.programlisting]
+....
+sys/i386/i386/mpboot.s:
+/* Now enable paging */
+ movl IdlePTD_nopae, %eax
+ movl %eax,%cr3 /* load ptd addr into mmu */
+ movl %cr0,%eax /* get control word */
+ orl $CR0_PE|CR0_PG,%eax /* enable paging */
+ movl %eax,%cr0 /* and let's page NOW! */
+....
+
+Следующие три строки кода необходимы, потому что была установлена подкачка, поэтому требуется переход для продолжения выполнения в виртуализированном адресном пространстве:
+
+[.programlisting]
+....
+sys/i386/i386/mpboot.s:
+ pushl $mp_begin /* jump to high mem */
+ ret
+
+/* now running relocated at KERNBASE where the system is linked to run */
+mp_begin: /* now running relocated at KERNBASE */
+....
+
+Функция `init386()` вызывается с указателем на первую свободную физическую страницу, после чего следует вызов `mi_startup()`. `init386` — это архитектурно-зависимая функция инициализации, а `mi_startup()` — архитектурно-независимая (префикс 'mi_' означает Machine Independent, то есть «независимая от машины»). Ядро никогда не возвращается из `mi_startup()`, и, вызывая её, завершает загрузку:
+
+[.programlisting]
+....
+sys/i386/i386/locore.s:
+ pushl physfree /* value of first for init386(first) */
+ call init386 /* wire 386 chip for unix operation */
+ addl $4,%esp
+ movl %eax,%esp /* Switch to true top of stack. */
+ call mi_startup /* autoconfiguration, mountroot etc */
+ /* NOTREACHED */
+....
+
+=== `init386()`
+
+`init386()` определена в [.filename]#sys/i386/i386/machdep.c# и выполняет низкоуровневую инициализацию, специфичную для чипа i386. Переход в защищённый режим был выполнен загрузчиком. Загрузчик создал самую первую задачу, в которой ядро продолжает работать. Прежде чем рассматривать код, рассмотрим задачи, которые процессор должен выполнить для инициализации выполнения в защищённом режиме:
+
+* Инициализировать настраиваемые параметры ядра, переданные из загрузочной программы.
+* Подготовить GDT.
+* Подготовить IDT.
+* Инициализировать системную консоль.
+* Инициализировать DDB, если он скомпилирован в ядро.
+* Инициализировать TSS.
+* Подготовить LDT.
+* Настройка pcb для thread0.
+
+`init386()` инициализирует настраиваемые параметры, переданные из bootstrap, устанавливая указатель окружения (envp) и вызывая `init_param1()`. Указатель envp был передан из loader в структуре `bootinfo`:
+
+[.programlisting]
+....
+sys/i386/i386/machdep.c:
+ /* Init basic tunables, hz etc */
+ init_param1();
+....
+
+`init_param1()` определена в [.filename]#sys/kern/subr_param.c#. Этот файл содержит ряд sysctl, а также две функции, `init_param1()` и `init_param2()`, которые вызываются из `init386()`:
+
+[.programlisting]
+....
+sys/kern/subr_param.c:
+ hz = -1;
+ TUNABLE_INT_FETCH("kern.hz", &hz);
+ if (hz == -1)
+ hz = vm_guest > VM_GUEST_NO ? HZ_VM : HZ;
+....
+
+`TUNABLE_<typename>_FETCH` используется для получения значения из окружения:
+
+[.programlisting]
+....
+/usr/src/sys/sys/kernel.h:
+#define TUNABLE_INT_FETCH(path, var) getenv_int((path), (var))
+....
+
+Sysctl `kern.hz` представляет собой такт системных часов. Кроме того, эти параметры sysctl устанавливаются функцией `init_param1()`: `kern.maxswzone, kern.maxbcache, kern.maxtsiz, kern.dfldsiz, kern.maxdsiz, kern.dflssiz, kern.maxssiz, kern.sgrowsiz`.
+
+Затем `init386()` подготавливает Глобальную Таблицу Дескрипторов
+(GDT). Каждая задача на x86 выполняется в своем собственном виртуальном
+адресном пространстве, и это пространство адресуется парой
+сегмент:смещение. Например, если текущая инструкция, которую должен
+выполнить процессор, находится по адресу CS:EIP, то линейный виртуальный
+адрес этой инструкции будет "виртуальный адрес кодового сегмента CS" +
+EIP. Для удобства сегменты начинаются с виртуального адреса 0 и
+заканчиваются на границе 4 ГБ. Таким образом, линейный виртуальный адрес
+инструкции в данном примере будет просто значением EIP. Сегментные регистры,
+такие как CS, DS и другие, являются селекторами, то есть индексами в GDT
+(если быть более точным, индекс — это не сам селектор, а поле INDEX в
+селекторе). GDT в FreeBSD содержит дескрипторы для 15 селекторов на каждый
+CPU:
+
+[.programlisting]
+....
+sys/i386/i386/machdep.c:
+union descriptor gdt0[NGDT]; /* initial global descriptor table */
+union descriptor *gdt = gdt0; /* global descriptor table */
+
+sys/x86/include/segments.h:
+/*
+ * Entries in the Global Descriptor Table (GDT)
+ */
+#define GNULL_SEL 0 /* Null Descriptor */
+#define GPRIV_SEL 1 /* SMP Per-Processor Private Data */
+#define GUFS_SEL 2 /* User %fs Descriptor (order critical: 1) */
+#define GUGS_SEL 3 /* User %gs Descriptor (order critical: 2) */
+#define GCODE_SEL 4 /* Kernel Code Descriptor (order critical: 1) */
+#define GDATA_SEL 5 /* Kernel Data Descriptor (order critical: 2) */
+#define GUCODE_SEL 6 /* User Code Descriptor (order critical: 3) */
+#define GUDATA_SEL 7 /* User Data Descriptor (order critical: 4) */
+#define GBIOSLOWMEM_SEL 8 /* BIOS low memory access (must be entry 8) */
+#define GPROC0_SEL 9 /* Task state process slot zero and up */
+#define GLDT_SEL 10 /* Default User LDT */
+#define GUSERLDT_SEL 11 /* User LDT */
+#define GPANIC_SEL 12 /* Task state to consider panic from */
+#define GBIOSCODE32_SEL 13 /* BIOS interface (32bit Code) */
+#define GBIOSCODE16_SEL 14 /* BIOS interface (16bit Code) */
+#define GBIOSDATA_SEL 15 /* BIOS interface (Data) */
+#define GBIOSUTIL_SEL 16 /* BIOS interface (Utility) */
+#define GBIOSARGS_SEL 17 /* BIOS interface (Arguments) */
+#define GNDIS_SEL 18 /* For the NDIS layer */
+#define NGDT 19
+....
+
+Обратите внимание, что эти `#defines` не являются самими селекторами, а лишь полем `INDEX` селектора, поэтому они точно соответствуют индексам GDT. Например, реальный селектор для кода ядра (`GCODE_SEL`) имеет значение `0x20`.
+
+Следующий шаг — инициализация таблицы дескрипторов прерываний (IDT). Эта таблица используется процессором при возникновении программного или аппаратного прерывания. Например, чтобы выполнить системный вызов, пользовательское приложение использует инструкцию `INT 0x80`. Это программное прерывание, поэтому аппаратное обеспечение процессора ищет запись с индексом 0x80 в IDT. Эта запись указывает на процедуру обработки данного прерывания, в данном конкретном случае это будет шлюз системных вызовов ядра. IDT может содержать максимум 256 (0x100) записей. Ядро выделяет NIDT записей для IDT, где NIDT — это максимум (256):
+
+[.programlisting]
+....
+sys/i386/i386/machdep.c:
+static struct gate_descriptor idt0[NIDT];
+struct gate_descriptor *idt = &idt0[0]; /* interrupt descriptor table */
+....
+
+Для каждого прерывания устанавливается соответствующий обработчик. Также настраивается шлюз системного вызова для `INT 0x80`:
+
+[.programlisting]
+....
+sys/i386/i386/machdep.c:
+ setidt(IDT_SYSCALL, &IDTVEC(int0x80_syscall),
+ SDT_SYS386IGT, SEL_UPL, GSEL(GCODE_SEL, SEL_KPL));
+....
+
+Итак, когда пользовательское приложение выполняет инструкцию `INT 0x80`, управление передаётся функции `_Xint0x80_syscall`, которая находится в сегменте кода ядра и будет выполнена с привилегиями супервизора.
+
+Консоль и DDB инициализируются:
+
+[.programlisting]
+....
+sys/i386/i386/machdep.c:
+ cninit();
+/* skipped */
+ kdb_init();
+#ifdef KDB
+ if (boothowto & RB_KDB)
+ kdb_enter(KDB_WHY_BOOTFLAGS, "Boot flags requested debugger");
+#endif
+....
+
+Сегмент состояния задачи (TSS) — это еще одна структура защищенного режима x86, используемая оборудованием для хранения информации о задаче при переключении задач.
+
+Локальная таблица дескрипторов (LDT) используется для ссылки на код и данные пользовательского пространства. Определено несколько селекторов, указывающих на LDT, включая шлюзы системных вызовов, а также селекторы кода и данных пользователя:
+
+[.programlisting]
+....
+sys/x86/include/segments.h:
+#define LSYS5CALLS_SEL 0 /* forced by intel BCS */
+#define LSYS5SIGR_SEL 1
+#define LUCODE_SEL 3
+#define LUDATA_SEL 5
+#define NLDT (LUDATA_SEL + 1)
+....
+
+Далее инициализируется структура Блока Управления Процессом (`struct pcb`) для proc0. proc0 — это структура `struct proc`, описывающая процесс ядра. Она всегда присутствует во время работы ядра, поэтому связана с thread0:
+
+[.programlisting]
+....
+sys/i386/i386/machdep.c:
+register_t
+init386(int first)
+{
+ /* ... skipped ... */
+
+ proc_linkup0(&proc0, &thread0);
+ /* ... skipped ... */
+}
+....
+
+Структура `struct pcb` является частью структуры proc. Она определена в [.filename]#/usr/include/machine/pcb.h# и содержит информацию процесса, специфичную для архитектуры i386, такую как значения регистров.
+
+=== `mi_startup()`
+
+Эта функция выполняет сортировку пузырьком всех объектов инициализации системы, а затем вызывает вход каждого объекта по очереди:
+
+[.programlisting]
+....
+sys/kern/init_main.c:
+ for (sipp = sysinit; sipp < sysinit_end; sipp++) {
+
+ /* ... skipped ... */
+
+ /* Call function */
+ (*((*sipp)->func))((*sipp)->udata);
+ /* ... skipped ... */
+ }
+....
+
+Хотя фреймворк sysinit описан в link:/books/developers-handbook[Руководстве разработчика], я рассмотрю его внутреннее устройство.
+
+Каждый объект инициализации системы (объект sysinit) создается путем вызова макроса SYSINIT(). Возьмем, к примеру, объект sysinit `announce`. Этот объект выводит сообщение об авторских правах:
+
+[.programlisting]
+....
+sys/kern/init_main.c:
+static void
+print_caddr_t(void *data __unused)
+{
+ printf("%s", (char *)data);
+}
+/* ... skipped ... */
+SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, copyright);
+....
+
+Идентификатор подсистемы для этого объекта — SI_SUB_COPYRIGHT (0x0800001). Таким образом, сообщение об авторских правах будет выведено первым, сразу после инициализации консоли.
+
+Давайте рассмотрим, что именно делает макрос `SYSINIT()`. Он раскрывается в макрос `C_SYSINIT()`. Макрос `C_SYSINIT()` затем раскрывается в статическое объявление структуры `struct sysinit` с вызовом другого макроса `DATA_SET`:
+
+[.programlisting]
+....
+/usr/include/sys/kernel.h:
+ #define C_SYSINIT(uniquifier, subsystem, order, func, ident) \
+ static struct sysinit uniquifier ## _sys_init = { \ subsystem, \
+ order, \ func, \ (ident) \ }; \ DATA_WSET(sysinit_set,uniquifier ##
+ _sys_init);
+
+#define SYSINIT(uniquifier, subsystem, order, func, ident) \
+ C_SYSINIT(uniquifier, subsystem, order, \
+ (sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)(ident))
+....
+
+Макрос `DATA_SET()` раскрывается в `_MAKE_SET()`, и именно в этом макросе скрыта вся магия инициализации системы:
+
+[.programlisting]
+....
+/usr/include/linker_set.h:
+#define TEXT_SET(set, sym) _MAKE_SET(set, sym)
+#define DATA_SET(set, sym) _MAKE_SET(set, sym)
+....
+
+После выполнения этих макросов в ядре были созданы различные разделы, включая `set.sysinit_set`. Запустив objdump для бинарного файла ядра, можно заметить наличие таких небольших разделов:
+
+[source, bash]
+....
+% llvm-objdump -h /kernel
+Sections:
+Idx Name Size VMA Type
+ 10 set_sysctl_set 000021d4 01827078 DATA
+ 16 set_kbddriver_set 00000010 0182a4d0 DATA
+ 20 set_scterm_set 0000000c 0182c75c DATA
+ 21 set_cons_set 00000014 0182c768 DATA
+ 33 set_scrndr_set 00000024 0182c828 DATA
+ 41 set_sysinit_set 000014d8 018fabb0 DATA
+....
+
+Это содержимое экрана показывает, что размер раздела set.sysinit_set составляет 0x14d8 байт, поэтому `0x14d8/sizeof(void *)` объектов sysinit скомпилировано в ядро. Другие разделы, такие как `set.sysctl_set`, представляют другие наборы компоновщика.
+
+Определяя переменную типа `struct sysinit`, содержимое раздела `set.sysinit_set` будет "собрано" в эту переменную:
+
+[.programlisting]
+....
+sys/kern/init_main.c:
+ SET_DECLARE(sysinit_set, struct sysinit);
+....
+
+`struct sysinit` определена следующим образом:
+
+[.programlisting]
+....
+sys/sys/kernel.h:
+ struct sysinit {
+ enum sysinit_sub_id subsystem; /* subsystem identifier*/
+ enum sysinit_elem_order order; /* init order within subsystem*/
+ sysinit_cfunc_t func; /* function */
+ const void *udata; /* multiplexer/argument */
+};
+....
+
+Возвращаясь к обсуждению `mi_startup()`, теперь должно быть понятно, как организованы объекты sysinit. Функция `mi_startup()` сортирует их и вызывает каждый. Самый последний объект — это системный планировщик:
+
+[.programlisting]
+....
+/usr/include/sys/kernel.h:
+enum sysinit_sub_id {
+ SI_SUB_DUMMY = 0x0000000, /* not executed; for linker*/
+ SI_SUB_DONE = 0x0000001, /* processed*/
+ SI_SUB_TUNABLES = 0x0700000, /* establish tunable values */
+ SI_SUB_COPYRIGHT = 0x0800001, /* first use of console*/
+...
+ SI_SUB_LAST = 0xfffffff /* final initialization */
+};
+....
+
+Системный планировщик sysinit определен в файле [.filename]#sys/vm/vm_glue.c#, а точка входа для этого объекта — `scheduler()`. Эта функция фактически представляет собой бесконечный цикл и описывает процесс с PID 0, известный как процесс swapper. Структура thread0, упомянутая ранее, используется для его описания.
+
+Первый пользовательский процесс, называемый _init_, создаётся объектом sysinit `init`:
+
+[.programlisting]
+....
+sys/kern/init_main.c:
+static void
+create_init(const void *udata __unused)
+{
+ struct fork_req fr;
+ struct ucred *newcred, *oldcred;
+ struct thread *td;
+ int error;
+
+ bzero(&fr, sizeof(fr));
+ fr.fr_flags = RFFDG | RFPROC | RFSTOPPED;
+ fr.fr_procp = &initproc;
+ error = fork1(&thread0, &fr);
+ if (error)
+ panic("cannot fork init: %d\n", error);
+ KASSERT(initproc->p_pid == 1, ("create_init: initproc->p_pid != 1"));
+ /* divorce init's credentials from the kernel's */
+ newcred = crget();
+ sx_xlock(&proctree_lock);
+ PROC_LOCK(initproc);
+ initproc->p_flag |= P_SYSTEM | P_INMEM;
+ initproc->p_treeflag |= P_TREE_REAPER;
+ oldcred = initproc->p_ucred;
+ crcopy(newcred, oldcred);
+#ifdef MAC
+ mac_cred_create_init(newcred);
+#endif
+#ifdef AUDIT
+ audit_cred_proc1(newcred);
+#endif
+ proc_set_cred(initproc, newcred);
+ td = FIRST_THREAD_IN_PROC(initproc);
+ crcowfree(td);
+ td->td_realucred = crcowget(initproc->p_ucred);
+ td->td_ucred = td->td_realucred;
+ PROC_UNLOCK(initproc);
+ sx_xunlock(&proctree_lock);
+ crfree(oldcred);
+ cpu_fork_kthread_handler(FIRST_THREAD_IN_PROC(initproc), start_init, NULL);
+}
+SYSINIT(init, SI_SUB_CREATE_INIT, SI_ORDER_FIRST, create_init, NULL);
+....
+
+Функция `create_init()` выделяет новый процесс, вызывая `fork1()`, но не помечает его как готовый к выполнению. Когда этот новый процесс будет запланирован для выполнения планировщиком, будет вызвана функция `start_init()`. Эта функция определена в [.filename]#init_main.c#. Она пытается загрузить и выполнить бинарный файл [.filename]#init#, сначала проверяя [.filename]#/sbin/init#, затем [.filename]#/sbin/oinit#, [.filename]#/sbin/init.bak# и, наконец, [.filename]#/rescue/init#:
+
+[.programlisting]
+....
+sys/kern/init_main.c:
+static char init_path[MAXPATHLEN] =
+#ifdef INIT_PATH
+ __XSTRING(INIT_PATH);
+#else
+ "/sbin/init:/sbin/oinit:/sbin/init.bak:/rescue/init";
+#endif
+....
diff --git a/documentation/content/ru/books/arch-handbook/boot/_index.po b/documentation/content/ru/books/arch-handbook/boot/_index.po
new file mode 100644
index 0000000000..171dbcf2b3
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/boot/_index.po
@@ -0,0 +1,4415 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-07-02 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookboot_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:14
+#, no-wrap
+msgid "Bootstrapping and Kernel Initialization"
+msgstr "Начальная загрузка и инициализация ядра"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1
+#, no-wrap
+msgid "Chapter 1. Bootstrapping and Kernel Initialization"
+msgstr "Глава 1. Начальная загрузка и инициализация ядра"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:52
+#, no-wrap
+msgid "Synopsis"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:57
+msgid ""
+"This chapter is an overview of the boot and system initialization processes, "
+"starting from the BIOS (firmware) POST, to the first user process creation. "
+"Since the initial steps of system startup are very architecture dependent, "
+"the IA-32 architecture is used as an example. But the AMD64 and ARM64 "
+"architectures are much more important and compelling examples and should be "
+"explained in the near future according to the topic of this document."
+msgstr ""
+"Эта глава представляет собой обзор процессов загрузки и инициализации "
+"системы, начиная с POST в BIOS (микропрограмме) и заканчивая созданием "
+"первого пользовательского процесса. Поскольку начальные этапы загрузки "
+"системы сильно зависят от архитектуры, в качестве примера используется "
+"архитектура IA-32. Однако архитектуры AMD64 и ARM64 гораздо важнее и "
+"интереснее, и их следует рассмотреть в ближайшем будущем в соответствии с "
+"темой этого документа."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:61
+msgid ""
+"The FreeBSD boot process can be surprisingly complex. After control is "
+"passed from the BIOS, a considerable amount of low-level configuration must "
+"be done before the kernel can be loaded and executed. This setup must be "
+"done in a simple and flexible manner, allowing the user a great deal of "
+"customization possibilities."
+msgstr ""
+"Процесс загрузки FreeBSD может быть удивительно сложным. После передачи "
+"управления от BIOS необходимо выполнить значительный объем низкоуровневой "
+"настройки перед загрузкой и выполнением ядра. Эта настройка должна быть "
+"выполнена простым и гибким способом, предоставляя пользователю широкие "
+"возможности для настройки и адаптации."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:63
+#, no-wrap
+msgid "Overview"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:76
+msgid ""
+"The boot process is an extremely machine-dependent activity. Not only must "
+"code be written for every computer architecture, but there may also be "
+"multiple types of booting on the same architecture. For example, a "
+"directory listing of [.filename]#stand# reveals a great amount of "
+"architecture-dependent code. There is a directory for each of the various "
+"supported architectures. FreeBSD supports the CSM boot standard "
+"(Compatibility Support Module). So CSM is supported (with both GPT and MBR "
+"partitioning support) and UEFI booting (GPT is totally supported, MBR is "
+"mostly supported). It also supports loading files from ext2fs, MSDOS, UFS "
+"and ZFS. FreeBSD also supports the boot environment feature of ZFS which "
+"allows the HOST OS to communicate details about what to boot that go beyond "
+"a simple partition as was possible in the past. But UEFI is more relevant "
+"than the CSM these days. The example that follows shows booting an x86 "
+"computer from an MBR-partitioned hard drive with the FreeBSD "
+"[.filename]#boot0# multi-boot loader stored in the very first sector. That "
+"boot code starts the FreeBSD three-stage boot process."
+msgstr ""
+"Процесс загрузки — это операция, крайне зависимая от оборудования. Не только "
+"для каждой архитектуры компьютера должен быть написан код, но также могут "
+"существовать различные типы загрузки в рамках одной архитектуры. Например, "
+"список файлов в каталоге [.filename]#stand# показывает большое количество "
+"кода, зависящего от архитектуры. Для каждой из поддерживаемых архитектур "
+"существует отдельный каталог. FreeBSD поддерживает стандарт загрузки CSM "
+"(Compatibility Support Module). Таким образом, CSM поддерживается (как с "
+"GPT, так и с MBR разметкой), а также загрузка через UEFI (GPT полностью "
+"поддерживается, MBR — в основном). Также поддерживается загрузка файлов с "
+"ext2fs, MSDOS, UFS и ZFS. FreeBSD поддерживает функцию загрузочного "
+"окружения ZFS, которая позволяет основной ОС передавать детали о том, что "
+"загружать, выходящие за рамки простого раздела, как это было возможно ранее. "
+"Однако в наши дни UEFI более актуален, чем CSM. В следующем примере показана "
+"загрузка компьютера x86 с жёсткого диска с MBR-разметкой, где используется "
+"мультизагрузчик FreeBSD [.filename]#boot0#, сохранённый в самом первом "
+"секторе. Этот загрузочный код запускает трёхэтапный процесс загрузки FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:82
+msgid ""
+"The key to understanding this process is that it is a series of stages of "
+"increasing complexity. These stages are [.filename]#boot1#, "
+"[.filename]#boot2#, and [.filename]#loader# (see man:boot[8] for more "
+"detail). The boot system executes each stage in sequence. The last stage, "
+"[.filename]#loader#, is responsible for loading the FreeBSD kernel. Each "
+"stage is examined in the following sections."
+msgstr ""
+"Ключ к пониманию этого процесса заключается в том, что он состоит из "
+"последовательных стадий возрастающей сложности. Эти стадии — "
+"[.filename]#boot1#, [.filename]#boot2# и [.filename]#loader# (подробнее см. "
+"man:boot[8]). Система загрузки выполняет каждую стадию последовательно. "
+"Последняя стадия, [.filename]#loader#, отвечает за загрузку ядра FreeBSD. "
+"Каждая стадия рассматривается в следующих разделах."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:85
+msgid ""
+"Here is an example of the output generated by the different boot stages. "
+"Actual output may differ from machine to machine:"
+msgstr ""
+"Вот пример вывода, сгенерированного на различных этапах загрузки. "
+"Фактический вывод может отличаться в зависимости от машины:"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:91
+#, no-wrap
+msgid "*FreeBSD Component*"
+msgstr "*Компонент FreeBSD*"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:93
+#, no-wrap
+msgid "*Output (may vary)*"
+msgstr "*Вывод (может отличаться)*"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:94
+#, no-wrap
+msgid "`boot0`"
+msgstr "`boot0`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:103
+#, no-wrap
+msgid ""
+"[source,bash]\n"
+"....\n"
+"F1 FreeBSD\n"
+"F2 BSD\n"
+"F5 Disk 2\n"
+"...."
+msgstr ""
+"[source,bash]\n"
+"....\n"
+"F1 FreeBSD\n"
+"F2 BSD\n"
+"F5 Disk 2\n"
+"...."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:104
+#, no-wrap
+msgid "`boot2` footnote:[This prompt will appear if the user presses a key just after selecting an OS to boot at the boot0 stage.]"
+msgstr "`boot2` footnote:[Это приглашение появится, если пользователь нажмет клавишу сразу после выбора ОС для загрузки на этапе boot0.]"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:113
+#, no-wrap
+msgid ""
+"[source,bash]\n"
+"....\n"
+">>FreeBSD/x86 BOOT\n"
+"Default: 0:ad(0p4)/boot/loader\n"
+"boot:\n"
+"...."
+msgstr ""
+"[source,bash]\n"
+"....\n"
+">>FreeBSD/x86 BOOT\n"
+"Default: 0:ad(0p4)/boot/loader\n"
+"boot:\n"
+"...."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:114
+#, no-wrap
+msgid "[.filename]#loader#"
+msgstr "[.filename]#loader#"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:130
+#, no-wrap
+msgid ""
+"[source,bash]\n"
+"....\n"
+"BTX loader 1.00 BTX version is 1.02\n"
+"Consoles: internal video/keyboard\n"
+"BIOS drive C: is disk0\n"
+"BIOS 639kB/2096064kB available memory\n"
+"\n"
+"FreeBSD/x86 bootstrap loader, Revision 1.1\n"
+"Console internal video/keyboard\n"
+"(root@releng1.nyi.freebsd.org, Fri Apr 9 04:04:45 UTC 2021)\n"
+"Loading /boot/defaults/loader.conf\n"
+"/boot/kernel/kernel text=0xed9008 data=0x117d28+0x176650 syms=[0x8+0x137988+0x8+0x1515f8]\n"
+"...."
+msgstr ""
+"[source,bash]\n"
+"....\n"
+"BTX loader 1.00 BTX version is 1.02\n"
+"Consoles: internal video/keyboard\n"
+"BIOS drive C: is disk0\n"
+"BIOS 639kB/2096064kB available memory\n"
+"\n"
+"FreeBSD/x86 bootstrap loader, Revision 1.1\n"
+"Console internal video/keyboard\n"
+"(root@releng1.nyi.freebsd.org, Fri Apr 9 04:04:45 UTC 2021)\n"
+"Loading /boot/defaults/loader.conf\n"
+"/boot/kernel/kernel text=0xed9008 data=0x117d28+0x176650 syms=[0x8+0x137988+0x8+0x1515f8]\n"
+"...."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:131
+#, no-wrap
+msgid "kernel"
+msgstr "ядро системы"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:144
+#, no-wrap
+msgid ""
+"[source,bash]\n"
+"....\n"
+"Copyright (c) 1992-2021 The FreeBSD Project.\n"
+"Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994\n"
+" The Regents of the University of California. All rights reserved.\n"
+"FreeBSD is a registered trademark of The FreeBSD Foundation.\n"
+"FreeBSD 13.0-RELEASE 0 releng/13.0-n244733-ea31abc261f: Fri Apr 9 04:04:45 UTC 2021\n"
+" root@releng1.nyi.freebsd.org:/usr/obj/usr/src/i386.i386/sys/GENERIC i386\n"
+"FreeBSD clang version 11.0.1 (git@github.com:llvm/llvm-project.git llvmorg-11.0.1-0-g43ff75f2c3fe)\n"
+"...."
+msgstr ""
+"[source,bash]\n"
+"....\n"
+"Copyright (c) 1992-2021 The FreeBSD Project.\n"
+"Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994\n"
+" The Regents of the University of California. All rights reserved.\n"
+"FreeBSD is a registered trademark of The FreeBSD Foundation.\n"
+"FreeBSD 13.0-RELEASE 0 releng/13.0-n244733-ea31abc261f: Fri Apr 9 04:04:45 UTC 2021\n"
+" root@releng1.nyi.freebsd.org:/usr/obj/usr/src/i386.i386/sys/GENERIC i386\n"
+"FreeBSD clang version 11.0.1 (git@github.com:llvm/llvm-project.git llvmorg-11.0.1-0-g43ff75f2c3fe)\n"
+"...."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:147
+#, no-wrap
+msgid "The BIOS"
+msgstr "BIOS"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:158
+msgid ""
+"When the computer powers on, the processor's registers are set to some "
+"predefined values. One of the registers is the _instruction pointer_ "
+"register, and its value after a power on is well defined: it is a 32-bit "
+"value of `0xfffffff0`. The instruction pointer register (also known as the "
+"Program Counter) points to code to be executed by the processor. Another "
+"important register is the `cr0` 32-bit control register, and its value just "
+"after a reboot is `0`. One of ``cr0``'s bits, the PE (Protection Enabled) "
+"bit, indicates whether the processor is running in 32-bit protected mode or "
+"16-bit real mode. Since this bit is cleared at boot time, the processor "
+"boots in 16-bit real mode. Real mode means, among other things, that linear "
+"and physical addresses are identical. The reason for the processor not to "
+"start immediately in 32-bit protected mode is backwards compatibility. In "
+"particular, the boot process relies on the services provided by the BIOS, "
+"and the BIOS itself works in legacy, 16-bit code."
+msgstr ""
+"При включении компьютера регистры процессора устанавливаются в некоторые "
+"предопределённые значения. Один из регистров — это регистр _указателя "
+"команд_, и его значение после включения питания чётко определено: это 32-"
+"битное значение `0xfffffff0`. Регистр указателя команд (также известный как "
+"Счётчик Команд) указывает на код, который должен быть выполнен процессором. "
+"Ещё один важный регистр — это 32-битный управляющий регистр `cr0`, и его "
+"значение сразу после перезагрузки равно `0`. Один из битов ``cr0``, бит PE "
+"(Protection Enabled, Защита Включена), указывает, работает ли процессор в 32-"
+"битном защищённом режиме или 16-битном реальном режиме. Поскольку этот бит "
+"сброшен при загрузке, процессор запускается в 16-битном реальном режиме. "
+"Реальный режим означает, среди прочего, что линейные и физические адреса "
+"идентичны. Причина, по которой процессор не запускается сразу в 32-битном "
+"защищённом режиме, — это обратная совместимость. В частности, процесс "
+"загрузки зависит от услуг, предоставляемых BIOS, а сам BIOS работает в "
+"устаревшем 16-битном коде."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:161
+msgid ""
+"The value of `0xfffffff0` is slightly less than 4 GB, so unless the machine "
+"has 4 GB of physical memory, it cannot point to a valid memory address. The "
+"computer's hardware translates this address so that it points to a BIOS "
+"memory block."
+msgstr ""
+"Значение `0xfffffff0` немного меньше 4 ГБ, поэтому, если в машине нет 4 ГБ "
+"физической памяти, оно не может указывать на действительный адрес памяти. "
+"Аппаратное обеспечение компьютера преобразует этот адрес так, чтобы он "
+"указывал на блок памяти BIOS."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:166
+msgid ""
+"The BIOS (Basic Input Output System) is a chip on the motherboard that has a "
+"relatively small amount of read-only memory (ROM). This memory contains "
+"various low-level routines that are specific to the hardware supplied with "
+"the motherboard. The processor will first jump to the address 0xfffffff0, "
+"which really resides in the BIOS's memory. Usually this address contains a "
+"jump instruction to the BIOS's POST routines."
+msgstr ""
+"BIOS (Basic Input Output System) — это микросхема на материнской плате, "
+"которая содержит относительно небольшой объем памяти только для чтения "
+"(ROM). Эта память включает различные низкоуровневые процедуры, специфичные "
+"для оборудования, поставляемого с материнской платой. Процессор сначала "
+"переходит по адресу 0xfffffff0, который фактически находится в памяти BIOS. "
+"Обычно по этому адресу содержится инструкция перехода к процедурам POST BIOS."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:170
+msgid ""
+"The POST (Power On Self Test) is a set of routines including the memory "
+"check, system bus check, and other low-level initialization so the CPU can "
+"set up the computer properly. The important step of this stage is "
+"determining the boot device. Modern BIOS implementations permit the "
+"selection of a boot device, allowing booting from a floppy, CD-ROM, hard "
+"disk, or other devices."
+msgstr ""
+"POST (Power On Self Test) — это набор процедур, включающих проверку памяти, "
+"проверку системной шины и другую низкоуровневую инициализацию, чтобы "
+"процессор мог правильно настроить компьютер. Важным этапом на этой стадии "
+"является определение загрузочного устройства. Современные реализации BIOS "
+"позволяют выбирать загрузочное устройство, обеспечивая загрузку с дискеты, "
+"CD-ROM, жесткого диска или других устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:179
+msgid ""
+"The very last thing in the POST is the `INT 0x19` instruction. The `INT "
+"0x19` handler reads 512 bytes from the first sector of boot device into the "
+"memory at address `0x7c00`. The term _first sector_ originates from hard "
+"drive architecture, where the magnetic plate is divided into a number of "
+"cylindrical tracks. Tracks are numbered, and every track is divided into a "
+"number (usually 64) of sectors. Track numbers start at 0, but sector "
+"numbers start from 1. Track 0 is the outermost on the magnetic plate, and "
+"sector 1, the first sector, has a special purpose. It is also called the "
+"MBR, or Master Boot Record. The remaining sectors on the first track are "
+"never used."
+msgstr ""
+"Самым последним действием в POST является инструкция `INT 0x19`. Обработчик "
+"`INT 0x19` считывает 512 байт из первого сектора загрузочного устройства в "
+"память по адресу `0x7c00`. Термин _первый сектор_ происходит из архитектуры "
+"жёстких дисков, где магнитная пластина разделена на множество цилиндрических "
+"дорожек. Дорожки нумеруются, и каждая дорожка разделена на несколько (обычно "
+"64) секторов. Нумерация дорожек начинается с 0, но нумерация секторов "
+"начинается с 1. Дорожка 0 находится на внешней стороне магнитной пластины, а "
+"сектор 1, первый сектор, имеет особое назначение. Он также называется MBR "
+"(Master Boot Record) или Главная Загрузочная Запись. Остальные секторы на "
+"первой дорожке не используются."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:183
+msgid ""
+"This sector is our boot-sequence starting point. As we will see, this "
+"sector contains a copy of our [.filename]#boot0# program. A jump is made by "
+"the BIOS to address `0x7c00` so it starts executing."
+msgstr ""
+"Этот сектор является нашей точкой входа в последовательность загрузки. Как "
+"мы увидим, этот сектор содержит копию нашей программы [.filename]#boot0#. "
+"BIOS выполняет переход по адресу `0x7c00`, и она начинает выполняться."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:185
+#, no-wrap
+msgid "The Master Boot Record (`boot0`)"
+msgstr "Главная загрузочная запись (`boot0`)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:194
+msgid ""
+"After control is received from the BIOS at memory address `0x7c00`, "
+"[.filename]#boot0# starts executing. It is the first piece of code under "
+"FreeBSD control. The task of [.filename]#boot0# is quite simple: scan the "
+"partition table and let the user choose which partition to boot from. The "
+"Partition Table is a special, standard data structure embedded in the MBR "
+"(hence embedded in [.filename]#boot0#) describing the four standard PC "
+"\"partitions\". [.filename]#boot0# resides in the filesystem as "
+"[.filename]#/boot/boot0#. It is a small 512-byte file, and it is exactly "
+"what FreeBSD's installation procedure wrote to the hard disk's MBR if you "
+"chose the \"bootmanager\" option at installation time. Indeed, "
+"[.filename]#boot0# _is_ the MBR."
+msgstr ""
+"После получения управления от BIOS по адресу памяти `0x7c00` начинает "
+"выполняться [.filename]#boot0#. Это первый код, который управляется FreeBSD. "
+"Задача [.filename]#boot0# довольно проста: просканировать таблицу разделов и "
+"позволить пользователю выбрать, с какого раздела загружаться. Таблица "
+"разделов — это специальная стандартная структура данных, встроенная в MBR (а "
+"значит, и в [.filename]#boot0#), которая описывает четыре стандартных PC-"
+"раздела. [.filename]#boot0# находится в файловой системе как [.filename]#/"
+"boot/boot0#. Это небольшой файл размером 512 байт, и именно его процедура "
+"установки FreeBSD записывает в MBR жёсткого диска, если во время установки "
+"была выбрана опция \"bootmanager\". Действительно, [.filename]#boot0# _и "
+"есть_ MBR."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:197
+msgid ""
+"As mentioned previously, we're calling the BIOS `INT 0x19` to load the MBR "
+"([.filename]#boot0#) into memory at address `0x7c00`. The source file for "
+"[.filename]#boot0# can be found in [.filename]#stand/i386/boot0/boot0.S# - "
+"which is an awesome piece of code written by Robert Nordier."
+msgstr ""
+"Как упоминалось ранее, мы вызываем прерывание BIOS `INT 0x19` для загрузки "
+"MBR ([.filename]#boot0#) в память по адресу `0x7c00`. Исходный файл для "
+"[.filename]#boot0# можно найти в [.filename]#stand/i386/boot0/boot0.S# — это "
+"впечатляющий фрагмент кода, написанный Робертом Нордье."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:202
+msgid ""
+"A special structure starting from offset `0x1be` in the MBR is called the "
+"_partition table_. It has four records of 16 bytes each, called _partition "
+"records_, which represent how the hard disk is partitioned, or, in FreeBSD's "
+"terminology, sliced. One byte of those 16 says whether a partition (slice) "
+"is bootable or not. Exactly one record must have that flag set, otherwise "
+"[.filename]#boot0#'s code will refuse to proceed."
+msgstr ""
+"Особая структура, начинающаяся со смещения `0x1be` в MBR, называется "
+"_таблицей разделов_. Она содержит четыре записи по 16 байт каждая, "
+"называемые _записями разделов_, которые определяют, как разделён жёсткий "
+"диск, или, в терминологии FreeBSD, нарезан. Один из этих 16 байт указывает, "
+"является ли раздел (срез) загрузочным или нет. Ровно одна запись должна быть "
+"с этом установленным флагом, иначе код [.filename]#boot0# откажется "
+"продолжать работу."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:204
+msgid "A partition record has the following fields:"
+msgstr "Запись о разделе содержит следующие поля:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:206
+msgid "the 1-byte filesystem type"
+msgstr "1-байтовый тип файловой системы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:207
+msgid "the 1-byte bootable flag"
+msgstr "1-байтовый флаг загрузки (`bootable`)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:208
+msgid "the 6 byte descriptor in CHS format"
+msgstr "6-байтовый дескриптор в формате CHS"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:209
+msgid "the 8 byte descriptor in LBA format"
+msgstr "8-байтовый дескриптор в формате LBA"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:213
+msgid ""
+"A partition record descriptor contains information about where exactly the "
+"partition resides on the drive. Both descriptors, LBA and CHS, describe the "
+"same information, but in different ways: LBA (Logical Block Addressing) has "
+"the starting sector for the partition and the partition's length, while CHS "
+"(Cylinder Head Sector) has coordinates for the first and last sectors of the "
+"partition. The partition table ends with the special signature `0xaa55`."
+msgstr ""
+"Дескриптор записи раздела содержит информацию о том, где именно раздел "
+"расположен на диске. Оба дескриптора, LBA и CHS, описывают одну и ту же "
+"информацию, но разными способами: LBA (Logical Block Addressing) содержит "
+"начальный сектор раздела и его длину, тогда как CHS (Cylinder Head Sector) "
+"содержит координаты первого и последнего секторов раздела. Таблица разделов "
+"завершается специальной сигнатурой `0xaa55`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:218
+msgid ""
+"The MBR must fit into 512 bytes, a single disk sector. This program uses "
+"low-level \"tricks\" like taking advantage of the side effects of certain "
+"instructions and reusing register values from previous operations to make "
+"the most out of the fewest possible instructions. Care must also be taken "
+"when handling the partition table, which is embedded in the MBR itself. For "
+"these reasons, be very careful when modifying [.filename]#boot0.S#."
+msgstr ""
+"MBR должен помещаться в 512 байт, один сектор диска. Эта программа "
+"использует низкоуровневые «трюки», такие как использование побочных эффектов "
+"определённых инструкций и повторное использование значений регистров из "
+"предыдущих операций, чтобы максимально эффективно использовать минимально "
+"возможное количество инструкций. Также необходимо соблюдать осторожность при "
+"работе с таблицей разделов, которая встроена в сам MBR. По этим причинам "
+"будьте очень внимательны при изменении [.filename]#boot0.S#."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:223
+msgid ""
+"Note that the [.filename]#boot0.S# source file is assembled \"as is\": "
+"instructions are translated one by one to binary, with no additional "
+"information (no ELF file format, for example). This kind of low-level "
+"control is achieved at link time through special control flags passed to the "
+"linker. For example, the text section of the program is set to be located "
+"at address `0x600`. In practice this means that [.filename]#boot0# must be "
+"loaded to memory address `0x600` in order to function properly."
+msgstr ""
+"Обратите внимание, что исходный файл [.filename]#boot0.S# ассемблируется "
+"\"как есть\": инструкции переводятся одна за одной в бинарный код без "
+"дополнительной информации (например, без формата файла ELF). Такой "
+"низкоуровневый контроль достигается на этапе компоновки с помощью "
+"специальных флагов, передаваемых компоновщику. Например, текстовая секция "
+"программы располагается по адресу `0x600`. На практике это означает, что "
+"[.filename]#boot0# должен быть загружен в память по адресу `0x600` для "
+"корректной работы."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:230
+msgid ""
+"It is worth looking at the [.filename]#Makefile# for [.filename]#boot0# "
+"([.filename]#stand/i386/boot0/Makefile#), as it defines some of the run-time "
+"behavior of [.filename]#boot0#. For instance, if a terminal connected to "
+"the serial port (COM1) is used for I/O, the macro `SIO` must be defined (`-"
+"DSIO`). `-DPXE` enables boot through PXE by pressing kbd:[F6]. "
+"Additionally, the program defines a set of _flags_ that allow further "
+"modification of its behavior. All of this is illustrated in the "
+"[.filename]#Makefile#. For example, look at the linker directives which "
+"command the linker to start the text section at address `0x600`, and to "
+"build the output file \"as is\" (strip out any file formatting):"
+msgstr ""
+"Стоит взглянуть на [.filename]#Makefile# для [.filename]#boot0# "
+"([.filename]#stand/i386/boot0/Makefile#), так как он определяет некоторые "
+"аспекты поведения [.filename]#boot0# во время выполнения. Например, если для "
+"ввода-вывода используется терминал, подключённый к последовательному порту "
+"(COM1), необходимо определить макрос `SIO` (`-DSIO`). `-DPXE` включает "
+"загрузку через PXE при нажатии kbd:[F6]. Кроме того, программа определяет "
+"набор _флагов_, которые позволяют дополнительно настроить её поведение. Всё "
+"это проиллюстрировано в [.filename]#Makefile#. Например, обратите внимание "
+"на директивы компоновщика, которые предписывают ему начинать секцию текста с "
+"адреса `0x600` и создавать выходной файл \"как есть\" (удаляя любое "
+"форматирование файла):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:235
+#, no-wrap
+msgid ""
+" BOOT_BOOT0_ORG?=0x600\n"
+" ORG=${BOOT_BOOT0_ORG}\n"
+msgstr ""
+" BOOT_BOOT0_ORG?=0x600\n"
+" ORG=${BOOT_BOOT0_ORG}\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:237
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/Makefile# [[boot-boot0-makefile-as-is]]"
+msgstr "[.filename]#stand/i386/boot0/Makefile# [[boot-boot0-makefile-as-is]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:239
+msgid ""
+"Let us now start our study of the MBR, or [.filename]#boot0#, starting where "
+"execution begins."
+msgstr ""
+"Приступим к изучению MBR, или [.filename]#boot0#, начиная с точки входа."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:245
+msgid ""
+"Some modifications have been made to some instructions in favor of better "
+"exposition. For example, some macros are expanded, and some macro tests are "
+"omitted when the result of the test is known. This applies to all of the "
+"code examples shown."
+msgstr ""
+"В некоторые инструкции были внесены изменения для лучшего изложения. "
+"Например, некоторые макросы раскрыты, а некоторые проверки макросов опущены, "
+"когда результат проверки известен. Это относится ко всем приведённым "
+"примерам кода."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:256
+#, no-wrap
+msgid ""
+"start:\n"
+" cld\t\t\t# String ops inc\n"
+" xorw %ax,%ax\t\t# Zero\n"
+" movw %ax,%es\t\t# Address\n"
+" movw %ax,%ds\t\t# data\n"
+" movw %ax,%ss\t\t# Set up\n"
+" movw $LOAD,%sp\t\t# stack\n"
+msgstr ""
+"start:\n"
+" cld\t\t\t# String ops inc\n"
+" xorw %ax,%ax\t\t# Zero\n"
+" movw %ax,%es\t\t# Address\n"
+" movw %ax,%ds\t\t# data\n"
+" movw %ax,%ss\t\t# Set up\n"
+" movw $LOAD,%sp\t\t# stack\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:258
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-entrypoint]]"
+msgstr "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-entrypoint]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:264
+msgid ""
+"This first block of code is the entry point of the program. It is where the "
+"BIOS transfers control. First, it makes sure that the string operations "
+"autoincrement its pointer operands (the `cld` instruction) footnote:[When in "
+"doubt, we refer the reader to the official Intel manuals, which describe the "
+"exact semantics for each instruction: .]. Then, as it makes no assumption "
+"about the state of the segment registers, it initializes them. Finally, it "
+"sets the stack pointer register (`%sp`) to ($LOAD = address `0x7c00`), so we "
+"have a working stack."
+msgstr ""
+"Этот первый блок кода является точкой входа программы. Именно сюда BIOS "
+"передаёт управление. Сначала он гарантирует, что строковые операции "
+"автоматически увеличивают указатели операндов (инструкция `cld`) footnote:[В "
+"случае сомнений мы отсылаем читателя к официальным руководствам Intel, где "
+"описана точная семантика каждой инструкции: .]. Затем, не делая "
+"предположений о состоянии сегментных регистров, он их инициализирует. "
+"Наконец, он устанавливает регистр указателя стека (`%sp`) в ($LOAD = адрес "
+"`0x7c00`), чтобы обеспечить работоспособный стек."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:266
+msgid ""
+"The next block is responsible for the relocation and subsequent jump to the "
+"relocated code."
+msgstr ""
+"Следующий блок отвечает за перемещение и последующий переход к перемещенному "
+"коду."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:280
+#, no-wrap
+msgid ""
+" movw %sp,%si # Source\n"
+" movw $start,%di\t\t# Destination\n"
+" movw $0x100,%cx\t\t# Word count\n"
+" rep\t\t\t# Relocate\n"
+" movsw\t\t\t# code\n"
+" movw %di,%bp\t\t# Address variables\n"
+" movb $0x8,%cl\t\t# Words to clear\n"
+" rep\t\t\t# Zero\n"
+" stosw\t\t\t# them\n"
+" incb -0xe(%di)\t\t# Set the S field to 1\n"
+" jmp main-LOAD+ORIGIN\t# Jump to relocated code\n"
+msgstr ""
+" movw %sp,%si # Source\n"
+" movw $start,%di\t\t# Destination\n"
+" movw $0x100,%cx\t\t# Word count\n"
+" rep\t\t\t# Relocate\n"
+" movsw\t\t\t# code\n"
+" movw %di,%bp\t\t# Address variables\n"
+" movb $0x8,%cl\t\t# Words to clear\n"
+" rep\t\t\t# Zero\n"
+" stosw\t\t\t# them\n"
+" incb -0xe(%di)\t\t# Set the S field to 1\n"
+" jmp main-LOAD+ORIGIN\t# Jump to relocated code\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:282
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-relocation]]"
+msgstr "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-relocation]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:293
+msgid ""
+"As [.filename]#boot0# is loaded by the BIOS to address `0x7C00`, it copies "
+"itself to address `0x600` and then transfers control there (recall that it "
+"was linked to execute at address `0x600`). The source address, `0x7c00`, is "
+"copied to register `%si`. The destination address, `0x600`, to register "
+"`%di`. The number of words to copy, `256` (the program's size = 512 bytes), "
+"is copied to register `%cx`. Next, the `rep` instruction repeats the "
+"instruction that follows, that is, `movsw`, the number of times dictated by "
+"the `%cx` register. The `movsw` instruction copies the word pointed to by "
+"`%si` to the address pointed to by `%di`. This is repeated another 255 "
+"times. On each repetition, both the source and destination registers, `%si` "
+"and `%di`, are incremented by one. Thus, upon completion of the 256-word "
+"(512-byte) copy, `%di` has the value `0x600`+`512`= `0x800`, and `%si` has "
+"the value `0x7c00`+`512`= `0x7e00`; we have thus completed the code "
+"_relocation_. Since the last update of this document, the copy instructions "
+"have changed in the code, so instead of the movsb and stosb, movsw and stosw "
+"have been introduced, which copy 2 bytes(1 word) in one iteration."
+msgstr ""
+"Так как [.filename]#boot0# загружается BIOS по адресу `0x7C00`, он копирует "
+"себя по адресу `0x600` и передаёт управление туда (напомним, что он был "
+"слинкован для выполнения по адресу `0x600`). Исходный адрес, `0x7c00`, "
+"копируется в регистр `%si`. Конечный адрес, `0x600`, — в регистр `%di`. "
+"Количество слов для копирования, `256` (размер программы = 512 байт), "
+"копируется в регистр `%cx`. Далее инструкция `rep` повторяет следующую за "
+"ней инструкцию, то есть `movsw`, количество раз, указанное в регистре `%cx`. "
+"Инструкция `movsw` копирует слово, на которое указывает `%si`, по адресу, на "
+"который указывает `%di`. Это повторяется ещё 255 раз. При каждом повторении "
+"оба регистра, исходный и конечный, `%si` и `%di`, увеличиваются на единицу. "
+"Таким образом, по завершении копирования 256 слов (512 байт), `%di` имеет "
+"значение `0x600`+`512`= `0x800`, а `%si` — значение `0x7c00`+`512`= "
+"`0x7e00`; таким образом, мы завершили _перемещение_ кода. С момента "
+"последнего обновления этого документа инструкции копирования в коде "
+"изменились, поэтому вместо movsb и stosb были введены movsw и stosw, которые "
+"копируют 2 байта (1 слово) за одну итерацию."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:304
+msgid ""
+"Next, the destination register `%di` is copied to `%bp`. `%bp` gets the "
+"value `0x800`. The value `8` is copied to `%cl` in preparation for a new "
+"string operation (like our previous `movsw`). Now, `stosw` is executed 8 "
+"times. This instruction copies a `0` value to the address pointed to by the "
+"destination register (`%di`, which is `0x800`), and increments it. This is "
+"repeated another 7 times, so `%di` ends up with value `0x810`. Effectively, "
+"this clears the address range `0x800`-`0x80f`. This range is used as a "
+"(fake) partition table for writing the MBR back to disk. Finally, the "
+"sector field for the CHS addressing of this fake partition is given the "
+"value 1 and a jump is made to the main function from the relocated code. "
+"Note that until this jump to the relocated code, any reference to an "
+"absolute address was avoided."
+msgstr ""
+"Затем регистр назначения `%di` копируется в `%bp`. `%bp` получает значение "
+"`0x800`. Значение `8` копируется в `%cl` для подготовки новой строковой "
+"операции (как в предыдущей `movsw`). Теперь `stosw` выполняется 8 раз. Эта "
+"инструкция копирует значение `0` по адресу, на который указывает регистр "
+"назначения (`%di`, то есть `0x800`), и увеличивает его. Это повторяется ещё "
+"7 раз, так что `%di` в итоге получает значение `0x810`. Фактически это "
+"очищает диапазон адресов `0x800`-`0x80f`. Этот диапазон используется как "
+"(фиктивная) таблица разделов для записи MBR обратно на диск. Наконец, полю "
+"сектора для CHS-адресации этого фиктивного раздела присваивается значение 1, "
+"и выполняется переход к основной функции из перемещённого кода. Обратите "
+"внимание, что до этого перехода к перемещённому коду любые ссылки на "
+"абсолютные адреса избегались."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:306
+msgid ""
+"The following code block tests whether the drive number provided by the BIOS "
+"should be used, or the one stored in [.filename]#boot0#."
+msgstr ""
+"Следующий блок кода проверяет, следует ли использовать номер диска, "
+"предоставленный BIOS, или тот, что хранится в [.filename]#boot0#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:318
+#, no-wrap
+msgid ""
+"main:\n"
+" testb $SETDRV,_FLAGS(%bp)\t# Set drive number?\n"
+"#ifndef CHECK_DRIVE\t/* disable drive checks */\n"
+" jz save_curdrive\t\t# no, use the default\n"
+"#else\n"
+" jnz disable_update\t# Yes\n"
+" testb %dl,%dl\t\t# Drive number valid?\n"
+" js save_curdrive\t\t# Possibly (0x80 set)\n"
+"#endif\n"
+msgstr ""
+"main:\n"
+" testb $SETDRV,_FLAGS(%bp)\t# Set drive number?\n"
+"#ifndef CHECK_DRIVE\t/* disable drive checks */\n"
+" jz save_curdrive\t\t# no, use the default\n"
+"#else\n"
+" jnz disable_update\t# Yes\n"
+" testb %dl,%dl\t\t# Drive number valid?\n"
+" js save_curdrive\t\t# Possibly (0x80 set)\n"
+"#endif\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:320
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-drivenumber]]"
+msgstr "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-drivenumber]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:327
+msgid ""
+"This code tests the `SETDRV` bit (`0x20`) in the _flags_ variable. Recall "
+"that register `%bp` points to address location `0x800`, so the test is done "
+"to the _flags_ variable at address `0x800`-`69`= `0x7bb`. This is an "
+"example of the type of modifications that can be done to "
+"[.filename]#boot0#. The `SETDRV` flag is not set by default, but it can be "
+"set in the [.filename]#Makefile#. When set, the drive number stored in the "
+"MBR is used instead of the one provided by the BIOS. We assume the "
+"defaults, and that the BIOS provided a valid drive number, so we jump to "
+"`save_curdrive`."
+msgstr ""
+"Этот код проверяет бит `SETDRV` (`0x20`) в переменной _flags_. Напомним, что "
+"регистр `%bp` указывает на адрес `0x800`, поэтому проверка выполняется для "
+"переменной _flags_ по адресу `0x800`-`69`= `0x7bb`. Это пример типа "
+"изменений, которые можно внести в [.filename]#boot0#. Флаг `SETDRV` не "
+"установлен по умолчанию, но его можно задать в [.filename]#Makefile#. Если "
+"он установлен, используется номер диска, сохранённый в MBR, вместо "
+"предоставленного BIOS. Мы предполагаем значения по умолчанию и то, что BIOS "
+"предоставил корректный номер диска, поэтому переходим к `save_curdrive`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:329
+msgid ""
+"The next block saves the drive number provided by the BIOS, and calls `putn` "
+"to print a new line on the screen."
+msgstr ""
+"Следующий блок сохраняет номер диска, предоставленный BIOS, и вызывает "
+"`putn` для вывода новой строки на экран."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:341
+#, no-wrap
+msgid ""
+"save_curdrive:\n"
+" movb %dl, (%bp)\t\t# Save drive number\n"
+" pushw %dx\t\t\t# Also in the stack\n"
+"#ifdef\tTEST\t/* test code, print internal bios drive */\n"
+" rolb $1, %dl\n"
+" movw $drive, %si\n"
+" call putkey\n"
+"#endif\n"
+" callw putn\t\t# Print a newline\n"
+msgstr ""
+"save_curdrive:\n"
+" movb %dl, (%bp)\t\t# Save drive number\n"
+" pushw %dx\t\t\t# Also in the stack\n"
+"#ifdef\tTEST\t/* test code, print internal bios drive */\n"
+" rolb $1, %dl\n"
+" movw $drive, %si\n"
+" call putkey\n"
+"#endif\n"
+" callw putn\t\t# Print a newline\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:343
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-savedrivenumber]]"
+msgstr "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-savedrivenumber]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:345
+msgid ""
+"Note that we assume `TEST` is not defined, so the conditional code in it is "
+"not assembled and will not appear in our executable [.filename]#boot0#."
+msgstr ""
+"Обратите внимание, что мы предполагаем, что `TEST` не определён, поэтому "
+"условный код в нём не собирается и не появится в нашем исполняемом файле "
+"[.filename]#boot0#."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:351
+msgid ""
+"Our next block implements the actual scanning of the partition table. It "
+"prints to the screen the partition type for each of the four entries in the "
+"partition table. It compares each type with a list of well-known operating "
+"system file systems. Examples of recognized partition types are NTFS "
+"(Windows(R), ID 0x7), `ext2fs` (Linux(R), ID 0x83), and, of course, `ffs`/"
+"`ufs2` (FreeBSD, ID 0xa5). The implementation is fairly simple."
+msgstr ""
+"Следующий блок реализует фактическое сканирование таблицы разделов. Он "
+"выводит на экран тип раздела для каждой из четырёх записей в таблице "
+"разделов. Каждый тип сравнивается со списком известных файловых систем "
+"операционных систем. Примерами распознаваемых типов разделов являются NTFS "
+"(Windows(R), ID 0x7), `ext2fs` (Linux(R), ID 0x83) и, конечно же, `ffs`/"
+"`ufs2` (FreeBSD, ID 0xa5). Реализация довольно проста."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:356
+#, no-wrap
+msgid ""
+" movw $(partbl+0x4),%bx\t# Partition table (+4)\n"
+" xorw %dx,%dx\t\t# Item number\n"
+msgstr ""
+" movw $(partbl+0x4),%bx\t# Partition table (+4)\n"
+" xorw %dx,%dx\t\t# Item number\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:372
+#, no-wrap
+msgid ""
+"read_entry:\n"
+" movb %ch,-0x4(%bx)\t# Zero active flag (ch == 0)\n"
+" btw %dx,_FLAGS(%bp)\t# Entry enabled?\n"
+" jnc next_entry\t\t# No\n"
+" movb (%bx),%al\t\t# Load type\n"
+" test %al, %al\t\t# skip empty partition\n"
+" jz next_entry\n"
+" movw $bootable_ids,%di\t# Lookup tables\n"
+" movb $(TLEN+1),%cl\t# Number of entries\n"
+" repne\t\t\t# Locate\n"
+" scasb\t\t\t# type\n"
+" addw $(TLEN-1), %di\t# Adjust\n"
+" movb (%di),%cl\t\t# Partition\n"
+" addw %cx,%di\t\t# description\n"
+" callw putx\t\t# Display it\n"
+msgstr ""
+"read_entry:\n"
+" movb %ch,-0x4(%bx)\t# Zero active flag (ch == 0)\n"
+" btw %dx,_FLAGS(%bp)\t# Entry enabled?\n"
+" jnc next_entry\t\t# No\n"
+" movb (%bx),%al\t\t# Load type\n"
+" test %al, %al\t\t# skip empty partition\n"
+" jz next_entry\n"
+" movw $bootable_ids,%di\t# Lookup tables\n"
+" movb $(TLEN+1),%cl\t# Number of entries\n"
+" repne\t\t\t# Locate\n"
+" scasb\t\t\t# type\n"
+" addw $(TLEN-1), %di\t# Adjust\n"
+" movb (%di),%cl\t\t# Partition\n"
+" addw %cx,%di\t\t# description\n"
+" callw putx\t\t# Display it\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:377
+#, no-wrap
+msgid ""
+"next_entry:\n"
+" incw %dx\t\t\t# Next item\n"
+" addb $0x10,%bl\t\t# Next entry\n"
+" jnc read_entry\t\t# Till done\n"
+msgstr ""
+"next_entry:\n"
+" incw %dx\t\t\t# Next item\n"
+" addb $0x10,%bl\t\t# Next entry\n"
+" jnc read_entry\t\t# Till done\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:379
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-partition-scan]]"
+msgstr "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-partition-scan]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:383
+msgid ""
+"It is important to note that the active flag for each entry is cleared, so "
+"after the scanning, _no_ partition entry is active in our memory copy of "
+"[.filename]#boot0#. Later, the active flag will be set for the selected "
+"partition. This ensures that only one active partition exists if the user "
+"chooses to write the changes back to disk."
+msgstr ""
+"Важно отметить, что флаг активности для каждой записи сбрасывается, поэтому "
+"после сканирования _ни одна_ запись о разделе не активна в нашей копии "
+"[.filename]#boot0# в памяти. Позже флаг активности будет установлен для "
+"выбранного раздела. Это гарантирует, что только один активный раздел "
+"существует, если пользователь решит записать изменения обратно на диск."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:388
+msgid ""
+"The next block tests for other drives. At startup, the BIOS writes the "
+"number of drives present in the computer to address `0x475`. If there are "
+"any other drives present, [.filename]#boot0# prints the current drive to "
+"screen. The user may command [.filename]#boot0# to scan partitions on "
+"another drive later."
+msgstr ""
+"Следующий блок проверяет наличие других дисков. При запуске BIOS записывает "
+"количество дисков, присутствующих в компьютере, по адресу `0x475`. Если есть "
+"другие диски, [.filename]#boot0# выводит текущий диск на экран. Пользователь "
+"может позже дать команду [.filename]#boot0# просканировать разделы на другом "
+"диске."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:397
+#, no-wrap
+msgid ""
+" popw %ax\t\t\t# Drive number\n"
+" subb $0x80-0x1,%al\t\t# Does next\n"
+" cmpb NHRDRV,%al\t\t# drive exist? (from BIOS?)\n"
+" jb print_drive\t\t# Yes\n"
+" decw %ax\t\t\t# Already drive 0?\n"
+" jz print_prompt\t\t# Yes\n"
+msgstr ""
+" popw %ax\t\t\t# Drive number\n"
+" subb $0x80-0x1,%al\t\t# Does next\n"
+" cmpb NHRDRV,%al\t\t# drive exist? (from BIOS?)\n"
+" jb print_drive\t\t# Yes\n"
+" decw %ax\t\t\t# Already drive 0?\n"
+" jz print_prompt\t\t# Yes\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:399
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-test-drives]]"
+msgstr "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-test-drives]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:402
+msgid ""
+"We make the assumption that a single drive is present, so the jump to "
+"`print_drive` is not performed. We also assume nothing strange happened, so "
+"we jump to `print_prompt`."
+msgstr ""
+"Мы предполагаем, что присутствует только один диск, поэтому переход к "
+"`print_drive` не выполняется. Также мы предполагаем, что ничего необычного "
+"не произошло, поэтому переходим к `print_prompt`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:404
+msgid ""
+"This next block just prints out a prompt followed by the default option:"
+msgstr ""
+"Следующий блок просто выводит приглашение с последующим вариантом по "
+"умолчанию:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:414
+#, no-wrap
+msgid ""
+"print_prompt:\n"
+" movw $prompt,%si\t\t# Display\n"
+" callw putstr\t\t# prompt\n"
+" movb _OPT(%bp),%dl\t# Display\n"
+" decw %si\t\t\t# default\n"
+" callw putkey\t\t# key\n"
+" jmp start_input\t\t# Skip beep\n"
+msgstr ""
+"print_prompt:\n"
+" movw $prompt,%si\t\t# Display\n"
+" callw putstr\t\t# prompt\n"
+" movb _OPT(%bp),%dl\t# Display\n"
+" decw %si\t\t\t# default\n"
+" callw putkey\t\t# key\n"
+" jmp start_input\t\t# Skip beep\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:416
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-prompt]]"
+msgstr "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-prompt]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:418
+msgid ""
+"Finally, a jump is performed to `start_input`, where the BIOS services are "
+"used to start a timer and for reading user input from the keyboard; if the "
+"timer expires, the default option will be selected:"
+msgstr ""
+"Наконец, выполняется переход к `start_input`, где используются сервисы BIOS "
+"для запуска таймера и чтения пользовательского ввода с клавиатуры; если "
+"таймер истекает, будет выбран вариант по умолчанию:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:434
+#, no-wrap
+msgid ""
+"start_input:\n"
+" xorb %ah,%ah\t\t# BIOS: Get\n"
+" int $0x1a\t\t\t# system time\n"
+" movw %dx,%di\t\t# Ticks when\n"
+" addw _TICKS(%bp),%di\t# timeout\n"
+"read_key:\n"
+" movb $0x1,%ah\t\t# BIOS: Check\n"
+" int $0x16\t\t\t# for keypress\n"
+" jnz got_key\t\t# Have input\n"
+" xorb %ah,%ah\t\t# BIOS: int 0x1a, 00\n"
+" int $0x1a\t\t\t# get system time\n"
+" cmpw %di,%dx\t\t# Timeout?\n"
+" jb read_key\t\t# No\n"
+msgstr ""
+"start_input:\n"
+" xorb %ah,%ah\t\t# BIOS: Get\n"
+" int $0x1a\t\t\t# system time\n"
+" movw %dx,%di\t\t# Ticks when\n"
+" addw _TICKS(%bp),%di\t# timeout\n"
+"read_key:\n"
+" movb $0x1,%ah\t\t# BIOS: Check\n"
+" int $0x16\t\t\t# for keypress\n"
+" jnz got_key\t\t# Have input\n"
+" xorb %ah,%ah\t\t# BIOS: int 0x1a, 00\n"
+" int $0x1a\t\t\t# get system time\n"
+" cmpw %di,%dx\t\t# Timeout?\n"
+" jb read_key\t\t# No\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:436
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-start-input]]"
+msgstr "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-start-input]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:449
+msgid ""
+"An interrupt is requested with number `0x1a` and argument `0` in register "
+"`%ah`. The BIOS has a predefined set of services, requested by applications "
+"as software-generated interrupts through the `int` instruction and receiving "
+"arguments in registers (in this case, `%ah`). Here, particularly, we are "
+"requesting the number of clock ticks since last midnight; this value is "
+"computed by the BIOS through the RTC (Real Time Clock). This clock can be "
+"programmed to work at frequencies ranging from 2 Hz to 8192 Hz. The BIOS "
+"sets it to 18.2 Hz at startup. When the request is satisfied, a 32-bit "
+"result is returned by the BIOS in registers `%cx` and `%dx` (lower bytes in "
+"`%dx`). This result (the `%dx` part) is copied to register `%di`, and the "
+"value of the `TICKS` variable is added to `%di`. This variable resides in "
+"[.filename]#boot0# at offset `_TICKS` (a negative value) from register `%bp` "
+"(which, recall, points to `0x800`). The default value of this variable is "
+"`0xb6` (182 in decimal). Now, the idea is that [.filename]#boot0# "
+"constantly requests the time from the BIOS, and when the value returned in "
+"register `%dx` is greater than the value stored in `%di`, the time is up and "
+"the default selection will be made. Since the RTC ticks 18.2 times per "
+"second, this condition will be met after 10 seconds (this default behavior "
+"can be changed in the [.filename]#Makefile#). Until this time has passed, "
+"[.filename]#boot0# continually asks the BIOS for any user input; this is "
+"done through `int 0x16`, argument `1` in `%ah`."
+msgstr ""
+"Прерывание запрашивается с номером `0x1a` и аргументом `0` в регистре `%ah`. "
+"BIOS имеет предопределённый набор сервисов, запрашиваемых приложениями как "
+"программно-генерируемые прерывания через инструкцию `int`, с получением "
+"аргументов в регистрах (в данном случае, `%ah`). Здесь, в частности, "
+"запрашивается количество тиков часов с момента последней полуночи; это "
+"значение вычисляется BIOS через RTC (Real Time Clock). Эти часы могут быть "
+"настроены на работу с частотой от 2 Гц до 8192 Гц. BIOS устанавливает их на "
+"18,2 Гц при запуске. Когда запрос выполнен, 32-битный результат возвращается "
+"BIOS в регистрах `%cx` и `%dx` (младшие байты в `%dx`). Этот результат "
+"(часть `%dx`) копируется в регистр `%di`, и к `%di` добавляется значение "
+"переменной `TICKS`. Эта переменная находится в [.filename]#boot0# по "
+"смещению `_TICKS` (отрицательное значение) от регистра `%bp` (который, "
+"напомним, указывает на `0x800`). Значение этой переменной по умолчанию — "
+"`0xb6` (182 в десятичной системе). Идея заключается в том, что "
+"[.filename]#boot0# постоянно запрашивает время у BIOS, и когда значение, "
+"возвращённое в регистре `%dx`, становится больше значения, хранящегося в "
+"`%di`, время истекает и будет сделан выбор по умолчанию. Поскольку RTC "
+"тикает 18,2 раза в секунду, это условие выполнится через 10 секунд (это "
+"поведение по умолчанию можно изменить в [.filename]#Makefile#). До истечения "
+"этого времени [.filename]#boot0# непрерывно опрашивает BIOS на предмет ввода "
+"пользователя; это делается через `int 0x16`, аргумент `1` в `%ah`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:457
+msgid ""
+"Whether a key was pressed or the time expired, subsequent code validates the "
+"selection. Based on the selection, the register `%si` is set to point to "
+"the appropriate partition entry in the partition table. This new selection "
+"overrides the previous default one. Indeed, it becomes the new default. "
+"Finally, the ACTIVE flag of the selected partition is set. If it was "
+"enabled at compile time, the in-memory version of [.filename]#boot0# with "
+"these modified values is written back to the MBR on disk. We leave the "
+"details of this implementation to the reader."
+msgstr ""
+"Была нажата клавиша или истекло время, последующий код проверяет выбор. В "
+"зависимости от выбора, регистр `%si` устанавливается так, чтобы указывать на "
+"соответствующую запись раздела в таблице разделов. Этот новый выбор "
+"переопределяет предыдущий выбор по умолчанию. Действительно, он становится "
+"новым значением по умолчанию. Наконец, устанавливается флаг ACTIVE "
+"выбранного раздела. Если это было разрешено при компиляции, версия "
+"[.filename]#boot0# в памяти с этими изменёнными значениями записывается "
+"обратно в MBR на диске. Мы оставляем детали этой реализации читателю."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:459
+msgid ""
+"We now end our study with the last code block from the [.filename]#boot0# "
+"program:"
+msgstr ""
+"Мы завершаем наше изучение последним блоком кода из программы "
+"[.filename]#boot0#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:472
+#, no-wrap
+msgid ""
+" movw $LOAD,%bx\t\t# Address for read\n"
+" movb $0x2,%ah\t\t# Read sector\n"
+" callw intx13\t\t# from disk\n"
+" jc beep\t\t\t# If error\n"
+" cmpw $MAGIC,0x1fe(%bx)\t# Bootable?\n"
+" jne beep\t\t\t# No\n"
+" pushw %si\t\t\t# Save ptr to selected part.\n"
+" callw putn\t\t# Leave some space\n"
+" popw %si\t\t\t# Restore, next stage uses it\n"
+" jmp *%bx\t\t\t# Invoke bootstrap\n"
+msgstr ""
+" movw $LOAD,%bx\t\t# Address for read\n"
+" movb $0x2,%ah\t\t# Read sector\n"
+" callw intx13\t\t# from disk\n"
+" jc beep\t\t\t# If error\n"
+" cmpw $MAGIC,0x1fe(%bx)\t# Bootable?\n"
+" jne beep\t\t\t# No\n"
+" pushw %si\t\t\t# Save ptr to selected part.\n"
+" callw putn\t\t# Leave some space\n"
+" popw %si\t\t\t# Restore, next stage uses it\n"
+" jmp *%bx\t\t\t# Invoke bootstrap\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:474
+#, no-wrap
+msgid "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-check-bootable]]"
+msgstr "[.filename]#stand/i386/boot0/boot0.S# [[boot-boot0-check-bootable]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:478
+msgid ""
+"Recall that `%si` points to the selected partition entry. This entry tells "
+"us where the partition begins on disk. We assume, of course, that the "
+"partition selected is actually a FreeBSD slice."
+msgstr ""
+"Вспомним, что `%si` указывает на выбранную запись раздела. Эта запись "
+"сообщает нам, где начинается раздел на диске. Мы предполагаем, конечно, что "
+"выбранный раздел действительно является срезом FreeBSD."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:482
+msgid ""
+"From now on, we will favor the use of the technically more accurate term "
+"\"slice\" rather than \"partition\"."
+msgstr ""
+"Отныне мы будем отдавать предпочтение использованию технически более точного "
+"термина \"слайс\" вместо \"раздел\"."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:488
+msgid ""
+"The transfer buffer is set to `0x7c00` (register `%bx`), and a read for the "
+"first sector of the FreeBSD slice is requested by calling `intx13`. We "
+"assume that everything went okay, so a jump to `beep` is not performed. In "
+"particular, the new sector read must end with the magic sequence `0xaa55`. "
+"Finally, the value at `%si` (the pointer to the selected partition table) is "
+"preserved for use by the next stage, and a jump is performed to address "
+"`0x7c00`, where execution of our next stage (the just-read block) is started."
+msgstr ""
+"Буфер передачи установлен в `0x7c00` (регистр `%bx`), и запрос на чтение "
+"первого сектора слайса FreeBSD выполняется вызовом `intx13`. Мы "
+"предполагаем, что всё прошло успешно, поэтому переход к `beep` не "
+"выполняется. В частности, новый прочитанный сектор должен заканчиваться "
+"магической последовательностью `0xaa55`. Наконец, значение в `%si` "
+"(указатель на выбранную таблицу разделов) сохраняется для использования на "
+"следующем этапе, и выполняется переход по адресу `0x7c00`, где начинается "
+"выполнение нашего следующего этапа (только что прочитанного блока)."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:490
+#, no-wrap
+msgid "`boot1` Stage"
+msgstr "Этап `boot1`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:493
+msgid "So far we have gone through the following sequence:"
+msgstr "До сих пор мы прошли следующую последовательность:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:497
+msgid ""
+"The BIOS did some early hardware initialization, including the POST. The "
+"MBR ([.filename]#boot0#) was loaded from absolute disk sector one to address "
+"`0x7c00`. Execution control was passed to that location."
+msgstr ""
+"BIOS выполнил первоначальную инициализацию оборудования, включая POST. MBR "
+"([.filename]#boot0#) был загружен по адресу `0x7c00` из абсолютного сектора "
+"один с диска. Управление выполнением было передано по этому адресу."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:500
+msgid ""
+"[.filename]#boot0# relocated itself to the location it was linked to execute "
+"(`0x600`), followed by a jump to continue execution at the appropriate "
+"place. Finally, [.filename]#boot0# loaded the first disk sector from the "
+"FreeBSD slice to address `0x7c00`. Execution control was passed to that "
+"location."
+msgstr ""
+"[.filename]#boot0# переместил себя по адресу, по которому он был скомпонован "
+"для выполнения (`0x600`), после чего выполнил переход для продолжения "
+"выполнения в соответствующем месте. В завершение, [.filename]#boot0# "
+"загрузил первый сектор диска из раздела FreeBSD по адресу `0x7c00`. "
+"Управление выполнением было передано по этому адресу."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:513
+msgid ""
+"[.filename]#boot1# is the next step in the boot-loading sequence. It is the "
+"first of three boot stages. Note that we have been dealing exclusively with "
+"disk sectors. Indeed, the BIOS loads the absolute first sector, while "
+"[.filename]#boot0# loads the first sector of the FreeBSD slice. Both loads "
+"are to address `0x7c00`. We can conceptually think of these disk sectors as "
+"containing the files [.filename]#boot0# and [.filename]#boot1#, "
+"respectively, but in reality this is not entirely true for "
+"[.filename]#boot1#. Strictly speaking, unlike [.filename]#boot0#, "
+"[.filename]#boot1# is not part of the boot blocks footnote:[There is a file /"
+"boot/boot1, but it is not the written to the beginning of the FreeBSD "
+"slice. Instead, it is concatenated with boot2 to form boot, which is "
+"written to the beginning of the FreeBSD slice and read at boot time.]. "
+"Instead, a single, full-blown file, [.filename]#boot# ([.filename]#/boot/"
+"boot#), is what ultimately is written to disk. This file is a combination "
+"of [.filename]#boot1#, [.filename]#boot2# and the `Boot Extender` (or BTX). "
+"This single file is greater in size than a single sector (greater than 512 "
+"bytes). Fortunately, [.filename]#boot1# occupies _exactly_ the first 512 "
+"bytes of this single file, so when [.filename]#boot0# loads the first sector "
+"of the FreeBSD slice (512 bytes), it is actually loading [.filename]#boot1# "
+"and transferring control to it."
+msgstr ""
+"[.filename]#boot1# — это следующий шаг в последовательности загрузки. Это "
+"первая из трех стадий загрузки. Обратите внимание, что до сих пор мы "
+"работали исключительно с секторами диска. Действительно, BIOS загружает "
+"самый первый сектор, а [.filename]#boot0# загружает первый сектор раздела "
+"FreeBSD. Обе загрузки происходят по адресу `0x7c00`. Мы можем концептуально "
+"представлять эти секторы диска как содержащие файлы [.filename]#boot0# и "
+"[.filename]#boot1#, соответственно, но на самом деле это не совсем верно для "
+"[.filename]#boot1#. Строго говоря, в отличие от [.filename]#boot0#, "
+"[.filename]#boot1# не является частью загрузочных блоков footnote:[Файл /"
+"boot/boot1 существует, но он не записывается в начало раздела FreeBSD. "
+"Вместо этого он объединяется с boot2, формируя файл boot, который "
+"записывается в начало раздела FreeBSD и считывается во время загрузки.]. "
+"Вместо этого, единый полноценный файл [.filename]#boot# ([.filename]#/boot/"
+"boot#) в итоге записывается на диск. Этот файл представляет собой комбинацию "
+"[.filename]#boot1#, [.filename]#boot2# и `Boot Extender` (или BTX). Этот "
+"единый файл превышает размер одного сектора (больше 512 байт). К счастью, "
+"[.filename]#boot1# занимает _ровно_ первые 512 байт этого файла, поэтому, "
+"когда [.filename]#boot0# загружает первый сектор раздела FreeBSD (512 байт), "
+"он фактически загружает [.filename]#boot1# и передает ему управление."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:518
+msgid ""
+"The main task of [.filename]#boot1# is to load the next boot stage. This "
+"next stage is somewhat more complex. It is composed of a server called the "
+"\"Boot Extender\", or BTX, and a client, called [.filename]#boot2#. As we "
+"will see, the last boot stage, [.filename]#loader#, is also a client of the "
+"BTX server."
+msgstr ""
+"Основная задача [.filename]#boot1# — загрузить следующий этап загрузки. Этот "
+"следующий этап несколько сложнее. Он состоит из сервера под названием \"Boot "
+"Extender\" (BTX) и клиента под названием [.filename]#boot2#. Как мы увидим, "
+"последний этап загрузки, [.filename]#loader#, также является клиентом "
+"сервера BTX."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:520
+msgid ""
+"Let us now look in detail at what exactly is done by [.filename]#boot1#, "
+"starting like we did for [.filename]#boot0#, at its entry point:"
+msgstr ""
+"Давайте теперь подробно рассмотрим, что именно делает [.filename]#boot1#, "
+"начиная, как мы это делали для [.filename]#boot0#, с точки входа:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:525
+#, no-wrap
+msgid ""
+"start:\n"
+"\tjmp main\n"
+msgstr ""
+"start:\n"
+"\tjmp main\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:527
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-entry]]"
+msgstr "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-entry]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:529
+msgid ""
+"The entry point at `start` simply jumps past a special data area to the "
+"label `main`, which in turn looks like this:"
+msgstr ""
+"Точка входа `start` просто переходит через специальную область данных к "
+"метке `main`, которая, в свою очередь, выглядит следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:544
+#, no-wrap
+msgid ""
+"main:\n"
+" cld\t\t\t# String ops inc\n"
+" xor %cx,%cx\t\t# Zero\n"
+" mov %cx,%es\t\t# Address\n"
+" mov %cx,%ds\t\t# data\n"
+" mov %cx,%ss\t\t# Set up\n"
+" mov $start,%sp\t\t# stack\n"
+" mov %sp,%si\t\t# Source\n"
+" mov $MEM_REL,%di\t\t# Destination\n"
+" incb %ch\t\t\t# Word count\n"
+" rep\t\t\t# Copy\n"
+" movsw\t\t\t# code\n"
+msgstr ""
+"main:\n"
+" cld\t\t\t# String ops inc\n"
+" xor %cx,%cx\t\t# Zero\n"
+" mov %cx,%es\t\t# Address\n"
+" mov %cx,%ds\t\t# data\n"
+" mov %cx,%ss\t\t# Set up\n"
+" mov $start,%sp\t\t# stack\n"
+" mov %sp,%si\t\t# Source\n"
+" mov $MEM_REL,%di\t\t# Destination\n"
+" incb %ch\t\t\t# Word count\n"
+" rep\t\t\t# Copy\n"
+" movsw\t\t\t# code\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:546
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-main]]"
+msgstr "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-main]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:551
+msgid ""
+"Just like [.filename]#boot0#, this code relocates [.filename]#boot1#, this "
+"time to memory address `0x700`. However, unlike [.filename]#boot0#, it does "
+"not jump there. [.filename]#boot1# is linked to execute at address "
+"`0x7c00`, effectively where it was loaded in the first place. The reason "
+"for this relocation will be discussed shortly."
+msgstr ""
+"Как и [.filename]#boot0#, этот код перемещает [.filename]#boot1#, на этот "
+"раз по адресу `0x700`. Однако, в отличие от [.filename]#boot0#, он не "
+"переходит туда. [.filename]#boot1# скомпонован для выполнения по адресу "
+"`0x7c00`, фактически там, куда он был изначально загружен. Причина этого "
+"перемещения будет рассмотрена далее."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:556
+msgid ""
+"Next comes a loop that looks for the FreeBSD slice. Although "
+"[.filename]#boot0# loaded [.filename]#boot1# from the FreeBSD slice, no "
+"information was passed to it about this footnote:[Actually we did pass a "
+"pointer to the slice entry in register %si. However, boot1 does not assume "
+"that it was loaded by boot0 (perhaps some other MBR loaded it, and did not "
+"pass this information), so it assumes nothing.], so [.filename]#boot1# must "
+"rescan the partition table to find where the FreeBSD slice starts. "
+"Therefore it rereads the MBR:"
+msgstr ""
+"Далее идет цикл, который ищет слайс FreeBSD. Хотя [.filename]#boot0# "
+"загрузил [.filename]#boot1# из слайса FreeBSD, ему не была передана "
+"информация об этом footnote:[На самом деле мы передали указатель на адрес "
+"слайса в регистре %si. Однако boot1 не предполагает, что он был загружен "
+"boot0 (возможно, его загрузил другой MBR и не передал эту информацию), "
+"поэтому он ничего не предполагает.], поэтому [.filename]#boot1# должен "
+"повторно просканировать таблицу разделов, чтобы найти начало слайса FreeBSD. "
+"Для этого он перечитывает MBR:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:564
+#, no-wrap
+msgid ""
+" mov $part4,%si\t\t# Partition\n"
+" cmpb $0x80,%dl\t\t# Hard drive?\n"
+" jb main.4\t\t\t# No\n"
+" movb $0x1,%dh\t\t# Block count\n"
+" callw nread\t\t# Read MBR\n"
+msgstr ""
+" mov $part4,%si\t\t# Partition\n"
+" cmpb $0x80,%dl\t\t# Hard drive?\n"
+" jb main.4\t\t\t# No\n"
+" movb $0x1,%dh\t\t# Block count\n"
+" callw nread\t\t# Read MBR\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:566
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-find-freebsd]]"
+msgstr "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-find-freebsd]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:574
+msgid ""
+"In the code above, register `%dl` maintains information about the boot "
+"device. This is passed on by the BIOS and preserved by the MBR. Numbers "
+"`0x80` and greater tells us that we are dealing with a hard drive, so a call "
+"is made to `nread`, where the MBR is read. Arguments to `nread` are passed "
+"through `%si` and `%dh`. The memory address at label `part4` is copied to "
+"`%si`. This memory address holds a \"fake partition\" to be used by "
+"`nread`. The following is the data in the fake partition:"
+msgstr ""
+"В приведённом выше коде регистр `%dl` содержит информацию о загрузочном "
+"устройстве. Эти данные передаются BIOS и сохраняются MBR. Числа `0x80` и "
+"выше указывают на то, что мы имеем дело с жёстким диском, поэтому вызывается "
+"`nread`, где считывается MBR. Аргументы для `nread` передаются через `%si` "
+"и `%dh`. Адрес памяти по метке `part4` копируется в `%si`. Этот адрес "
+"памяти содержит \"фальшивый раздел\", который будет использован `nread`. "
+"Ниже приведены данные фальшивого раздела:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:582
+#, no-wrap
+msgid ""
+" part4:\n"
+"\t.byte 0x80, 0x00, 0x01, 0x00\n"
+"\t.byte 0xa5, 0xfe, 0xff, 0xff\n"
+"\t.byte 0x00, 0x00, 0x00, 0x00\n"
+"\t.byte 0x50, 0xc3, 0x00, 0x00\n"
+msgstr ""
+" part4:\n"
+"\t.byte 0x80, 0x00, 0x01, 0x00\n"
+"\t.byte 0xa5, 0xfe, 0xff, 0xff\n"
+"\t.byte 0x00, 0x00, 0x00, 0x00\n"
+"\t.byte 0x50, 0xc3, 0x00, 0x00\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:584
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot2-make-fake-partition]]"
+msgstr "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot2-make-fake-partition]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:589
+msgid ""
+"In particular, the LBA for this fake partition is hardcoded to zero. This "
+"is used as an argument to the BIOS for reading absolute sector one from the "
+"hard drive. Alternatively, CHS addressing could be used. In this case, the "
+"fake partition holds cylinder 0, head 0 and sector 1, which is equivalent to "
+"absolute sector one."
+msgstr ""
+"В частности, LBA для этой фиктивной раздела жестко закодирован как ноль. Это "
+"используется как аргумент для BIOS при чтении абсолютного сектора один с "
+"жесткого диска. Альтернативно, может использоваться адресация CHS. В этом "
+"случае, фиктивный раздел содержит цилиндр 0, головку 0 и сектор 1, что "
+"эквивалентно абсолютному сектору один."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:591
+msgid "Let us now proceed to take a look at `nread`:"
+msgstr "Продолжим, рассмотрев `nread`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:601
+#, no-wrap
+msgid ""
+"nread:\n"
+" mov $MEM_BUF,%bx\t\t# Transfer buffer\n"
+" mov 0x8(%si),%ax\t\t# Get\n"
+" mov 0xa(%si),%cx\t\t# LBA\n"
+" push %cs\t\t\t# Read from\n"
+" callw xread.1\t\t# disk\n"
+" jnc return\t\t# If success, return\n"
+msgstr ""
+"nread:\n"
+" mov $MEM_BUF,%bx\t\t# Transfer buffer\n"
+" mov 0x8(%si),%ax\t\t# Get\n"
+" mov 0xa(%si),%cx\t\t# LBA\n"
+" push %cs\t\t\t# Read from\n"
+" callw xread.1\t\t# disk\n"
+" jnc return\t\t# If success, return\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:603
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-nread]]"
+msgstr "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-nread]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:612
+msgid ""
+"Recall that `%si` points to the fake partition. The word footnote:[In the "
+"context of 16-bit real mode, a word is 2 bytes.] at offset `0x8` is copied "
+"to register `%ax` and word at offset `0xa` to `%cx`. They are interpreted "
+"by the BIOS as the lower 4-byte value denoting the LBA to be read (the upper "
+"four bytes are assumed to be zero). Register `%bx` holds the memory address "
+"where the MBR will be loaded. The instruction pushing `%cs` onto the stack "
+"is very interesting. In this context, it accomplishes nothing. However, as "
+"we will see shortly, [.filename]#boot2#, in conjunction with the BTX server, "
+"also uses `xread.1`. This mechanism will be discussed in the next section."
+msgstr ""
+"Напомним, что `%si` указывает на поддельный раздел. Слово footnote:[В "
+"контексте 16-битного реального режима слово — это 2 байта.] по смещению "
+"`0x8` копируется в регистр `%ax`, а слово по смещению `0xa` — в `%cx`. BIOS "
+"интерпретирует их как младшее 4-байтовое значение, обозначающее LBA для "
+"чтения (старшие четыре байта предполагаются нулевыми). Регистр `%bx` "
+"содержит адрес памяти, куда будет загружен MBR. Инструкция, помещающая `%cs` "
+"в стек, очень интересна. В данном контексте она ничего не делает. Однако, "
+"как мы скоро увидим, [.filename]#boot2# в сочетании с сервером BTX также "
+"использует `xread.1`. Этот механизм будет рассмотрен в следующем разделе."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:614
+msgid ""
+"The code at `xread.1` further calls the `read` function, which actually "
+"calls the BIOS asking for the disk sector:"
+msgstr ""
+"Код в `xread.1` далее вызывает функцию `read`, которая фактически обращается "
+"к BIOS с запросом на чтение сектора диска:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:631
+#, no-wrap
+msgid ""
+"xread.1:\n"
+"\tpushl $0x0\t\t# absolute\n"
+"\tpush %cx\t\t# block\n"
+"\tpush %ax\t\t# number\n"
+"\tpush %es\t\t# Address of\n"
+"\tpush %bx\t\t# transfer buffer\n"
+"\txor %ax,%ax\t\t# Number of\n"
+"\tmovb %dh,%al\t\t# blocks to\n"
+"\tpush %ax\t\t# transfer\n"
+"\tpush $0x10\t\t# Size of packet\n"
+"\tmov %sp,%bp\t\t# Packet pointer\n"
+"\tcallw read\t\t# Read from disk\n"
+"\tlea 0x10(%bp),%sp\t# Clear stack\n"
+"\tlret\t\t\t# To far caller\n"
+msgstr ""
+"xread.1:\n"
+"\tpushl $0x0\t\t# absolute\n"
+"\tpush %cx\t\t# block\n"
+"\tpush %ax\t\t# number\n"
+"\tpush %es\t\t# Address of\n"
+"\tpush %bx\t\t# transfer buffer\n"
+"\txor %ax,%ax\t\t# Number of\n"
+"\tmovb %dh,%al\t\t# blocks to\n"
+"\tpush %ax\t\t# transfer\n"
+"\tpush $0x10\t\t# Size of packet\n"
+"\tmov %sp,%bp\t\t# Packet pointer\n"
+"\tcallw read\t\t# Read from disk\n"
+"\tlea 0x10(%bp),%sp\t# Clear stack\n"
+"\tlret\t\t\t# To far caller\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:633
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-xread1]]"
+msgstr "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-xread1]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:637
+msgid ""
+"Note the long return instruction at the end of this block. This instruction "
+"pops out the `%cs` register pushed by `nread`, and returns. Finally, "
+"`nread` also returns."
+msgstr ""
+"Обратите внимание на длинную инструкцию возврата в конце этого блока. Эта "
+"инструкция извлекает регистр `%cs`, помещённый в стек `nread`, и возвращает "
+"управление. В конце `nread` также возвращает управление."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:639
+msgid ""
+"With the MBR loaded to memory, the actual loop for searching the FreeBSD "
+"slice begins:"
+msgstr ""
+"С загрузкой MBR в память начинается фактический цикл поиска слайса FreeBSD:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:659
+#, no-wrap
+msgid ""
+"\tmov $0x1,%cx\t\t # Two passes\n"
+"main.1:\n"
+"\tmov $MEM_BUF+PRT_OFF,%si # Partition table\n"
+"\tmovb $0x1,%dh\t\t # Partition\n"
+"main.2:\n"
+"\tcmpb $PRT_BSD,0x4(%si)\t # Our partition type?\n"
+"\tjne main.3\t\t # No\n"
+"\tjcxz main.5\t\t # If second pass\n"
+"\ttestb $0x80,(%si)\t # Active?\n"
+"\tjnz main.5\t\t # Yes\n"
+"main.3:\n"
+"\tadd $0x10,%si\t\t # Next entry\n"
+"\tincb %dh\t\t # Partition\n"
+"\tcmpb $0x1+PRT_NUM,%dh\t\t # In table?\n"
+"\tjb main.2\t\t # Yes\n"
+"\tdec %cx\t\t\t # Do two\n"
+"\tjcxz main.1\t\t # passes\n"
+msgstr ""
+"\tmov $0x1,%cx\t\t # Two passes\n"
+"main.1:\n"
+"\tmov $MEM_BUF+PRT_OFF,%si # Partition table\n"
+"\tmovb $0x1,%dh\t\t # Partition\n"
+"main.2:\n"
+"\tcmpb $PRT_BSD,0x4(%si)\t # Our partition type?\n"
+"\tjne main.3\t\t # No\n"
+"\tjcxz main.5\t\t # If second pass\n"
+"\ttestb $0x80,(%si)\t # Active?\n"
+"\tjnz main.5\t\t # Yes\n"
+"main.3:\n"
+"\tadd $0x10,%si\t\t # Next entry\n"
+"\tincb %dh\t\t # Partition\n"
+"\tcmpb $0x1+PRT_NUM,%dh\t\t # In table?\n"
+"\tjb main.2\t\t # Yes\n"
+"\tdec %cx\t\t\t # Do two\n"
+"\tjcxz main.1\t\t # passes\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:661
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-find-part]]"
+msgstr "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-find-part]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:665
+msgid ""
+"If a FreeBSD slice is identified, execution continues at `main.5`. Note "
+"that when a FreeBSD slice is found `%si` points to the appropriate entry in "
+"the partition table, and `%dh` holds the partition number. We assume that a "
+"FreeBSD slice is found, so we continue execution at `main.5`:"
+msgstr ""
+"Если обнаружен слайс FreeBSD, выполнение продолжается на метке `main.5`. "
+"Обратите внимание, что при обнаружении слайса FreeBSD `%si` указывает на "
+"соответствующую запись в таблице разделов, а `%dh` содержит номер раздела. "
+"Мы предполагаем, что слайс FreeBSD найден, поэтому продолжаем выполнение на "
+"метке `main.5`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:680
+#, no-wrap
+msgid ""
+"main.5:\n"
+"\tmov %dx,MEM_ARG\t\t\t # Save args\n"
+"\tmovb $NSECT,%dh\t\t\t # Sector count\n"
+"\tcallw nread\t\t\t # Read disk\n"
+"\tmov $MEM_BTX,%bx\t\t\t # BTX\n"
+"\tmov 0xa(%bx),%si\t\t # Get BTX length and set\n"
+"\tadd %bx,%si\t\t\t # %si to start of boot2.bin\n"
+"\tmov $MEM_USR+SIZ_PAG*2,%di\t\t\t # Client page 2\n"
+"\tmov $MEM_BTX+(NSECT-1)*SIZ_SEC,%cx\t\t\t # Byte\n"
+"\tsub %si,%cx\t\t\t # count\n"
+"\trep\t\t\t\t # Relocate\n"
+"\tmovsb\t\t\t\t # client\n"
+msgstr ""
+"main.5:\n"
+"\tmov %dx,MEM_ARG\t\t\t # Save args\n"
+"\tmovb $NSECT,%dh\t\t\t # Sector count\n"
+"\tcallw nread\t\t\t # Read disk\n"
+"\tmov $MEM_BTX,%bx\t\t\t # BTX\n"
+"\tmov 0xa(%bx),%si\t\t # Get BTX length and set\n"
+"\tadd %bx,%si\t\t\t # %si to start of boot2.bin\n"
+"\tmov $MEM_USR+SIZ_PAG*2,%di\t\t\t # Client page 2\n"
+"\tmov $MEM_BTX+(NSECT-1)*SIZ_SEC,%cx\t\t\t # Byte\n"
+"\tsub %si,%cx\t\t\t # count\n"
+"\trep\t\t\t\t # Relocate\n"
+"\tmovsb\t\t\t\t # client\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:682
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-main5]]"
+msgstr "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-main5]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:688
+msgid ""
+"Recall that at this point, register `%si` points to the FreeBSD slice entry "
+"in the MBR partition table, so a call to `nread` will effectively read "
+"sectors at the beginning of this partition. The argument passed on register "
+"`%dh` tells `nread` to read 16 disk sectors. Recall that the first 512 "
+"bytes, or the first sector of the FreeBSD slice, coincides with the "
+"[.filename]#boot1# program. Also recall that the file written to the "
+"beginning of the FreeBSD slice is not [.filename]#/boot/boot1#, but "
+"[.filename]#/boot/boot#. Let us look at the size of these files in the "
+"filesystem:"
+msgstr ""
+"Напомним, что в данный момент регистр `%si` указывает на запись среза "
+"FreeBSD в таблице разделов MBR, поэтому вызов `nread` фактически прочитает "
+"секторы в начале этого раздела. Аргумент, переданный в регистре `%dh`, "
+"указывает `nread` прочитать 16 секторов диска. Напомним, что первые 512 "
+"байт, или первый сектор слайса FreeBSD, совпадает с программой "
+"[.filename]#boot1#. Также напомним, что файл, записанный в начало слайса "
+"FreeBSD, это не [.filename]#/boot/boot1#, а [.filename]#/boot/boot#. Давайте "
+"посмотрим на размер этих файлов в файловой системе:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:695
+#, no-wrap
+msgid ""
+"-r--r--r-- 1 root wheel 512B Jan 8 00:15 /boot/boot0\n"
+"-r--r--r-- 1 root wheel 512B Jan 8 00:15 /boot/boot1\n"
+"-r--r--r-- 1 root wheel 7.5K Jan 8 00:15 /boot/boot2\n"
+"-r--r--r-- 1 root wheel 8.0K Jan 8 00:15 /boot/boot\n"
+msgstr ""
+"-r--r--r-- 1 root wheel 512B Jan 8 00:15 /boot/boot0\n"
+"-r--r--r-- 1 root wheel 512B Jan 8 00:15 /boot/boot1\n"
+"-r--r--r-- 1 root wheel 7.5K Jan 8 00:15 /boot/boot2\n"
+"-r--r--r-- 1 root wheel 8.0K Jan 8 00:15 /boot/boot\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:703
+msgid ""
+"Both [.filename]#boot0# and [.filename]#boot1# are 512 bytes each, so they "
+"fit _exactly_ in one disk sector. [.filename]#boot2# is much bigger, "
+"holding both the BTX server and the [.filename]#boot2# client. Finally, a "
+"file called simply [.filename]#boot# is 512 bytes larger than "
+"[.filename]#boot2#. This file is a concatenation of [.filename]#boot1# and "
+"[.filename]#boot2#. As already noted, [.filename]#boot0# is the file "
+"written to the absolute first disk sector (the MBR), and [.filename]#boot# "
+"is the file written to the first sector of the FreeBSD slice; "
+"[.filename]#boot1# and [.filename]#boot2# are _not_ written to disk. The "
+"command used to concatenate [.filename]#boot1# and [.filename]#boot2# into a "
+"single [.filename]#boot# is merely `cat boot1 boot2 > boot`."
+msgstr ""
+"Оба файла [.filename]#boot0# и [.filename]#boot1# имеют размер 512 байт "
+"каждый, поэтому они занимают _ровно_ один сектор диска. [.filename]#boot2# "
+"значительно больше, так как содержит как сервер BTX, так и клиент "
+"[.filename]#boot2#. Наконец, файл под названием просто [.filename]#boot# на "
+"512 байт больше, чем [.filename]#boot2#. Этот файл представляет собой "
+"объединение [.filename]#boot1# и [.filename]#boot2#. Как уже отмечалось, "
+"[.filename]#boot0# записывается в самый первый сектор диска (MBR), а "
+"[.filename]#boot# записывается в первый сектор раздела FreeBSD; "
+"[.filename]#boot1# и [.filename]#boot2# _не_ записываются на диск. Команда, "
+"используемая для объединения [.filename]#boot1# и [.filename]#boot2# в "
+"единый файл [.filename]#boot#, выглядит просто как `cat boot1 boot2 > boot`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:707
+msgid ""
+"So [.filename]#boot1# occupies exactly the first 512 bytes of "
+"[.filename]#boot# and, because [.filename]#boot# is written to the first "
+"sector of the FreeBSD slice, [.filename]#boot1# fits exactly in this first "
+"sector. When `nread` reads the first 16 sectors of the FreeBSD slice, it "
+"effectively reads the entire [.filename]#boot# file footnote:[512*16=8192 "
+"bytes, exactly the size of boot]. We will see more details about how "
+"[.filename]#boot# is formed from [.filename]#boot1# and [.filename]#boot2# "
+"in the next section."
+msgstr ""
+"Итак, [.filename]#boot1# занимает ровно первые 512 байт [.filename]#boot#, "
+"и, поскольку [.filename]#boot# записывается в первый сектор слайса FreeBSD, "
+"[.filename]#boot1# полностью помещается в этот первый сектор. Когда `nread` "
+"читает первые 16 секторов слайса FreeBSD, он фактически читает весь файл "
+"[.filename]#boot# footnote:[512*16=8192 байта, ровно размер boot]. Более "
+"подробно о том, как [.filename]#boot# формируется из [.filename]#boot1# и "
+"[.filename]#boot2#, мы увидим в следующем разделе."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:713
+msgid ""
+"Recall that `nread` uses memory address `0x8c00` as the transfer buffer to "
+"hold the sectors read. This address is conveniently chosen. Indeed, "
+"because [.filename]#boot1# belongs to the first 512 bytes, it ends up in the "
+"address range `0x8c00`-`0x8dff`. The 512 bytes that follows (range `0x8e00`-"
+"`0x8fff`) is used to store the _bsdlabel_ footnote:[Historically known as "
+"disklabel. If you ever wondered where FreeBSD stored this information, it "
+"is in this region - see man:bsdlabel[8]]."
+msgstr ""
+"Напомним, что `nread` использует адрес памяти `0x8c00` в качестве буфера "
+"передачи для хранения прочитанных секторов. Этот адрес выбран не случайно. "
+"Действительно, поскольку [.filename]#boot1# принадлежит первым 512 байтам, "
+"он оказывается в диапазоне адресов `0x8c00`-`0x8dff`. Следующие 512 байт "
+"(диапазон `0x8e00`-`0x8fff`) используются для хранения _bsdlabel_ footnote:"
+"[Исторически известной как disklabel. Если вам когда-либо было интересно, "
+"где FreeBSD хранит эту информацию, она находится в этой области — см. "
+"man:bsdlabel[8]]."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:721
+msgid ""
+"Starting at address `0x9000` is the beginning of the BTX server, and "
+"immediately following is the [.filename]#boot2# client. The BTX server acts "
+"as a kernel, and executes in protected mode in the most privileged level. "
+"In contrast, the BTX clients ([.filename]#boot2#, for example), execute in "
+"user mode. We will see how this is accomplished in the next section. The "
+"code after the call to `nread` locates the beginning of [.filename]#boot2# "
+"in the memory buffer, and copies it to memory address `0xc000`. This is "
+"because the BTX server arranges [.filename]#boot2# to execute in a segment "
+"starting at `0xa000`. We explore this in detail in the following section."
+msgstr ""
+"Начиная с адреса `0x9000` находится начало сервера BTX, и сразу за ним "
+"следует клиент [.filename]#boot2#. Сервер BTX действует как ядро и "
+"выполняется в защищённом режиме с наивысшим уровнем привилегий. В отличие от "
+"этого, клиенты BTX (например, [.filename]#boot2#) выполняются в "
+"пользовательском режиме. Мы увидим, как это реализовано, в следующем "
+"разделе. Код после вызова `nread` находит начало [.filename]#boot2# в буфере "
+"памяти и копирует его по адресу `0xc000`. Это связано с тем, что сервер BTX "
+"размещает [.filename]#boot2# для выполнения в сегменте, начинающемся с "
+"`0xa000`. Мы подробно рассмотрим это в следующем разделе."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:724
+msgid ""
+"The last code block of [.filename]#boot1# enables access to memory above 1MB "
+"footnote:[This is necessary for legacy reasons. Interested readers should "
+"see .] and concludes with a jump to the starting point of the BTX server:"
+msgstr ""
+"Последний блок кода в [.filename]#boot1# разрешает доступ к памяти выше 1MB "
+"footnote:[Это необходимо по историческим причинам. Заинтересованные читатели "
+"могут обратиться к .] и завершается переходом к начальной точке сервера BTX:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:732
+#, no-wrap
+msgid ""
+"seta20:\n"
+"\tcli\t\t\t# Disable interrupts\n"
+"seta20.1:\n"
+"\tdec %cx\t\t\t# Timeout?\n"
+"\tjz seta20.3\t\t# Yes\n"
+msgstr ""
+"seta20:\n"
+"\tcli\t\t\t# Disable interrupts\n"
+"seta20.1:\n"
+"\tdec %cx\t\t\t# Timeout?\n"
+"\tjz seta20.3\t\t# Yes\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:747
+#, no-wrap
+msgid ""
+"\tinb $0x64,%al\t\t# Get status\n"
+"\ttestb $0x2,%al\t\t# Busy?\n"
+"\tjnz seta20.1\t\t# Yes\n"
+"\tmovb $0xd1,%al\t\t# Command: Write\n"
+"\toutb %al,$0x64\t\t# output port\n"
+"seta20.2:\n"
+"\tinb $0x64,%al\t\t# Get status\n"
+"\ttestb $0x2,%al\t\t# Busy?\n"
+"\tjnz seta20.2\t\t# Yes\n"
+"\tmovb $0xdf,%al\t\t# Enable\n"
+"\toutb %al,$0x60\t\t# A20\n"
+"seta20.3:\n"
+"\tsti\t\t\t# Enable interrupts\n"
+"\tjmp 0x9010\t\t# Start BTX\n"
+msgstr ""
+"\tinb $0x64,%al\t\t# Get status\n"
+"\ttestb $0x2,%al\t\t# Busy?\n"
+"\tjnz seta20.1\t\t# Yes\n"
+"\tmovb $0xd1,%al\t\t# Command: Write\n"
+"\toutb %al,$0x64\t\t# output port\n"
+"seta20.2:\n"
+"\tinb $0x64,%al\t\t# Get status\n"
+"\ttestb $0x2,%al\t\t# Busy?\n"
+"\tjnz seta20.2\t\t# Yes\n"
+"\tmovb $0xdf,%al\t\t# Enable\n"
+"\toutb %al,$0x60\t\t# A20\n"
+"seta20.3:\n"
+"\tsti\t\t\t# Enable interrupts\n"
+"\tjmp 0x9010\t\t# Start BTX\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:749
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-seta20]]"
+msgstr "[.filename]#stand/i386/boot2/boot1.S# [[boot-boot1-seta20]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:751
+msgid "Note that right before the jump, interrupts are enabled."
+msgstr ""
+"Обратите внимание, что непосредственно перед переходом прерывания включаются."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:753
+#, no-wrap
+msgid "The BTX Server"
+msgstr "Сервер BTX"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:757
+msgid ""
+"Next in our boot sequence is the BTX Server. Let us quickly remember how we "
+"got here:"
+msgstr ""
+"Далее в нашей последовательности загрузки идёт сервер BTX. Давайте быстро "
+"вспомним, как мы сюда попали:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:759
+msgid ""
+"The BIOS loads the absolute sector one (the MBR, or [.filename]#boot0#), to "
+"address `0x7c00` and jumps there."
+msgstr ""
+"BIOS загружает абсолютный сектор один (MBR или [.filename]#boot0#) по адресу "
+"`0x7c00` и переходит туда."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:761
+msgid ""
+"[.filename]#boot0# relocates itself to `0x600`, the address it was linked to "
+"execute, and jumps over there. It then reads the first sector of the "
+"FreeBSD slice (which consists of [.filename]#boot1#) into address `0x7c00` "
+"and jumps over there."
+msgstr ""
+"[.filename]#boot0# перемещает себя по адресу `0x600`, по которому он был "
+"слинкован для выполнения, и переходит туда. Затем он читает первый сектор "
+"среза FreeBSD (который содержит [.filename]#boot1#) в адрес `0x7c00` и "
+"переходит туда."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:766
+msgid ""
+"[.filename]#boot1# loads the first 16 sectors of the FreeBSD slice into "
+"address `0x8c00`. This 16 sectors, or 8192 bytes, is the whole file "
+"[.filename]#boot#. The file is a concatenation of [.filename]#boot1# and "
+"[.filename]#boot2#. [.filename]#boot2#, in turn, contains the BTX server "
+"and the [.filename]#boot2# client. Finally, a jump is made to address "
+"`0x9010`, the entry point of the BTX server."
+msgstr ""
+"[.filename]#boot1# загружает первые 16 секторов среза FreeBSD по адресу "
+"`0x8c00`. Эти 16 секторов, или 8192 байта, представляют собой весь файл "
+"[.filename]#boot#. Файл является объединением [.filename]#boot1# и "
+"[.filename]#boot2#. [.filename]#boot2#, в свою очередь, содержит сервер BTX "
+"и клиент [.filename]#boot2#. Наконец, выполняется переход по адресу "
+"`0x9010`, точке входа сервера BTX."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:770
+msgid ""
+"Before studying the BTX Server in detail, let us further review how the "
+"single, all-in-one [.filename]#boot# file is created. The way "
+"[.filename]#boot# is built is defined in its [.filename]#Makefile# "
+"([.filename]#stand/i386/boot2/Makefile#). Let us look at the rule that "
+"creates the [.filename]#boot# file:"
+msgstr ""
+"Прежде чем изучать сервер BTX подробно, давайте рассмотрим, как создается "
+"единый, всеобъемлющий файл [.filename]#boot#. Способ сборки "
+"[.filename]#boot# определен в его [.filename]#Makefile# ([.filename]#stand/"
+"i386/boot2/Makefile#). Рассмотрим правило, которое создает файл "
+"[.filename]#boot#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:775
+#, no-wrap
+msgid ""
+" boot: boot1 boot2\n"
+"\tcat boot1 boot2 > boot\n"
+msgstr ""
+" boot: boot1 boot2\n"
+"\tcat boot1 boot2 > boot\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:777
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot]]"
+msgstr "[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:780
+msgid ""
+"This tells us that [.filename]#boot1# and [.filename]#boot2# are needed, and "
+"the rule simply concatenates them to produce a single file called "
+"[.filename]#boot#. The rules for creating [.filename]#boot1# are also quite "
+"simple:"
+msgstr ""
+"Это говорит нам, что [.filename]#boot1# и [.filename]#boot2# необходимы, и "
+"правило просто объединяет их для создания одного файла с именем "
+"[.filename]#boot#. Правила для создания [.filename]#boot1# также довольно "
+"просты:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:785
+#, no-wrap
+msgid ""
+" boot1: boot1.out\n"
+"\t${OBJCOPY} -S -O binary boot1.out ${.TARGET}\n"
+msgstr ""
+" boot1: boot1.out\n"
+"\t${OBJCOPY} -S -O binary boot1.out ${.TARGET}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:788
+#, no-wrap
+msgid ""
+" boot1.out: boot1.o\n"
+"\t${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} boot1.o\n"
+msgstr ""
+" boot1.out: boot1.o\n"
+"\t${LD} ${LD_FLAGS} -e start --defsym ORG=${ORG1} -T ${LDSCRIPT} -o ${.TARGET} boot1.o\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:790
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot1]]"
+msgstr "[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot1]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:799
+msgid ""
+"To apply the rule for creating [.filename]#boot1#, [.filename]#boot1.out# "
+"must be resolved. This, in turn, depends on the existence of "
+"[.filename]#boot1.o#. This last file is simply the result of assembling our "
+"familiar [.filename]#boot1.S#, without linking. Now, the rule for creating "
+"[.filename]#boot1.out# is applied. This tells us that [.filename]#boot1.o# "
+"should be linked with `start` as its entry point, and starting at address "
+"`0x7c00`. Finally, [.filename]#boot1# is created from "
+"[.filename]#boot1.out# applying the appropriate rule. This rule is the "
+"[.filename]#objcopy# command applied to [.filename]#boot1.out#. Note the "
+"flags passed to [.filename]#objcopy#: `-S` tells it to strip all relocation "
+"and symbolic information; `-O binary` indicates the output format, that is, "
+"a simple, unformatted binary file."
+msgstr ""
+"Для применения правила создания [.filename]#boot1# необходимо собрать "
+"[.filename]#boot1.out#. Это, в свою очередь, зависит от наличия "
+"[.filename]#boot1.o#. Последний файл является результатом ассемблирования "
+"нашего знакомого [.filename]#boot1.S# без компоновки. Теперь применяется "
+"правило создания [.filename]#boot1.out#. Оно указывает, что "
+"[.filename]#boot1.o# должен быть скомпонован с точкой входа `start` и "
+"начальным адресом `0x7c00`. Наконец, [.filename]#boot1# создается из "
+"[.filename]#boot1.out# применением соответствующего правила. Это команда "
+"[.filename]#objcopy#, применяемая к [.filename]#boot1.out#. Обратите "
+"внимание на флаги, передаваемые [.filename]#objcopy#: `-S` указывает на "
+"удаление всей информации о перемещении и символов; `-O binary` указывает "
+"формат вывода, то есть простой, неформатированный двоичный файл."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:801
+msgid ""
+"Having [.filename]#boot1#, let us take a look at how [.filename]#boot2# is "
+"constructed:"
+msgstr ""
+"Имея [.filename]#boot1#, давайте посмотрим, как устроен [.filename]#boot2#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:808
+#, no-wrap
+msgid ""
+" boot2: boot2.ld\n"
+"\t@set -- `ls -l ${.ALLSRC}`; x=$$((${BOOT2SIZE}-$$5)); \\\n"
+"\t echo \"$$x bytes available\"; test $$x -ge 0\n"
+"\t${DD} if=${.ALLSRC} of=${.TARGET} bs=${BOOT2SIZE} conv=sync\n"
+msgstr ""
+" boot2: boot2.ld\n"
+"\t@set -- `ls -l ${.ALLSRC}`; x=$$((${BOOT2SIZE}-$$5)); \\\n"
+"\t echo \"$$x bytes available\"; test $$x -ge 0\n"
+"\t${DD} if=${.ALLSRC} of=${.TARGET} bs=${BOOT2SIZE} conv=sync\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:812
+#, no-wrap
+msgid ""
+" boot2.ld: boot2.ldr boot2.bin ${BTXKERN}\n"
+"\tbtxld -v -E ${ORG2} -f bin -b ${BTXKERN} -l boot2.ldr \\\n"
+"\t -o ${.TARGET} -P 1 boot2.bin\n"
+msgstr ""
+" boot2.ld: boot2.ldr boot2.bin ${BTXKERN}\n"
+"\tbtxld -v -E ${ORG2} -f bin -b ${BTXKERN} -l boot2.ldr \\\n"
+"\t -o ${.TARGET} -P 1 boot2.bin\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:815
+#, no-wrap
+msgid ""
+" boot2.ldr:\n"
+"\t${DD} if=/dev/zero of=${.TARGET} bs=512 count=1\n"
+msgstr ""
+" boot2.ldr:\n"
+"\t${DD} if=/dev/zero of=${.TARGET} bs=512 count=1\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:818
+#, no-wrap
+msgid ""
+" boot2.bin: boot2.out\n"
+"\t${OBJCOPY} -S -O binary boot2.out ${.TARGET}\n"
+msgstr ""
+" boot2.bin: boot2.out\n"
+"\t${OBJCOPY} -S -O binary boot2.out ${.TARGET}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:821
+#, no-wrap
+msgid ""
+" boot2.out: ${BTXCRT} boot2.o sio.o ashldi3.o\n"
+"\t${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC}\n"
+msgstr ""
+" boot2.out: ${BTXCRT} boot2.o sio.o ashldi3.o\n"
+"\t${LD} ${LD_FLAGS} --defsym ORG=${ORG2} -T ${LDSCRIPT} -o ${.TARGET} ${.ALLSRC}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:828
+#, no-wrap
+msgid ""
+" boot2.h: boot1.out\n"
+"\t${NM} -t d ${.ALLSRC} | awk '/([0-9])+ T xread/ \\\n"
+"\t { x = $$1 - ORG1; \\\n"
+"\t printf(\"#define XREADORG %#x\\n\", REL1 + x) }' \\\n"
+"\t ORG1=`printf \"%d\" ${ORG1}` \\\n"
+"\t REL1=`printf \"%d\" ${REL1}` > ${.TARGET}\n"
+msgstr ""
+" boot2.h: boot1.out\n"
+"\t${NM} -t d ${.ALLSRC} | awk '/([0-9])+ T xread/ \\\n"
+"\t { x = $$1 - ORG1; \\\n"
+"\t printf(\"#define XREADORG %#x\\n\", REL1 + x) }' \\\n"
+"\t ORG1=`printf \"%d\" ${ORG1}` \\\n"
+"\t REL1=`printf \"%d\" ${REL1}` > ${.TARGET}\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:830
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot2]]"
+msgstr "[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot2]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:834
+msgid ""
+"The mechanism for building [.filename]#boot2# is far more elaborate. Let us "
+"point out the most relevant facts. The dependency list is as follows:"
+msgstr ""
+"Механизм сборки [.filename]#boot2# гораздо сложнее. Отметим наиболее важные "
+"моменты. Список зависимостей выглядит следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:842
+#, no-wrap
+msgid ""
+" boot2: boot2.ld\n"
+" boot2.ld: boot2.ldr boot2.bin ${BTXDIR}\n"
+" boot2.bin: boot2.out\n"
+" boot2.out: ${BTXDIR} boot2.o sio.o ashldi3.o\n"
+" boot2.h: boot1.out\n"
+msgstr ""
+" boot2: boot2.ld\n"
+" boot2.ld: boot2.ldr boot2.bin ${BTXDIR}\n"
+" boot2.bin: boot2.out\n"
+" boot2.out: ${BTXDIR} boot2.o sio.o ashldi3.o\n"
+" boot2.h: boot1.out\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:844
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot2-more]]"
+msgstr "[.filename]#stand/i386/boot2/Makefile# [[boot-boot1-make-boot2-more]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:847
+msgid ""
+"Note that initially there is no header file [.filename]#boot2.h#, but its "
+"creation depends on [.filename]#boot1.out#, which we already have. The rule "
+"for its creation is a bit terse, but the important thing is that the output, "
+"[.filename]#boot2.h#, is something like this:"
+msgstr ""
+"Отметим, что изначально файл заголовка [.filename]#boot2.h# отсутствует, но "
+"его создание зависит от [.filename]#boot1.out#, который у нас уже есть. "
+"Правило его создания немного лаконично, но важно то, что результат, "
+"[.filename]#boot2.h#, выглядит примерно так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:851
+#, no-wrap
+msgid "#define XREADORG 0x725\n"
+msgstr "#define XREADORG 0x725\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:853
+#, no-wrap
+msgid "[.filename]#stand/i386/boot2/boot2.h# [[boot-boot1-make-boot2h]]"
+msgstr "[.filename]#stand/i386/boot2/boot2.h# [[boot-boot1-make-boot2h]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:859
+msgid ""
+"Recall that [.filename]#boot1# was relocated (i.e., copied from `0x7c00` to "
+"`0x700`). This relocation will now make sense, because as we will see, the "
+"BTX server reclaims some memory, including the space where "
+"[.filename]#boot1# was originally loaded. However, the BTX server needs "
+"access to [.filename]#boot1#'s `xread` function; this function, according to "
+"the output of [.filename]#boot2.h#, is at location `0x725`. Indeed, the BTX "
+"server uses the `xread` function from [.filename]#boot1#'s relocated code. "
+"This function is now accessible from within the [.filename]#boot2# client."
+msgstr ""
+"Напомним, что [.filename]#boot1# был перемещён (т.е. скопирован из `0x7c00` "
+"в `0x700`). Это перемещение теперь обретает смысл, потому что, как мы "
+"увидим, сервер BTX освобождает часть памяти, включая область, куда "
+"[.filename]#boot1# был изначально загружен. Однако серверу BTX необходим "
+"доступ к функции `xread` из [.filename]#boot1#; согласно выводу "
+"[.filename]#boot2.h#, эта функция находится по адресу `0x725`. "
+"Действительно, сервер BTX использует функцию `xread` из перемещённого кода "
+"[.filename]#boot1#. Теперь эта функция доступна из клиента "
+"[.filename]#boot2#."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:868
+msgid ""
+"The next rule directs the linker to link various files "
+"([.filename]#ashldi3.o#, [.filename]#boot2.o# and [.filename]#sio.o#). Note "
+"that the output file, [.filename]#boot2.out#, is linked to execute at "
+"address `0x2000` (${ORG2}). Recall that [.filename]#boot2# will be executed "
+"in user mode, within a special user segment set up by the BTX server. This "
+"segment starts at `0xa000`. Also, remember that the [.filename]#boot2# "
+"portion of [.filename]#boot# was copied to address `0xc000`, that is, offset "
+"`0x2000` from the start of the user segment, so [.filename]#boot2# will work "
+"properly when we transfer control to it. Next, [.filename]#boot2.bin# is "
+"created from [.filename]#boot2.out# by stripping its symbols and format "
+"information; boot2.bin is a _raw_ binary. Now, note that a file "
+"[.filename]#boot2.ldr# is created as a 512-byte file full of zeros. This "
+"space is reserved for the bsdlabel."
+msgstr ""
+"Следующее правило указывает компоновщику на необходимость связать различные "
+"файлы ([.filename]#ashldi3.o#, [.filename]#boot2.o# и [.filename]#sio.o#). "
+"Обратите внимание, что выходной файл [.filename]#boot2.out# компонуется для "
+"выполнения по адресу `0x2000` (${ORG2}). Напомним, что [.filename]#boot2# "
+"будет выполняться в пользовательском режиме внутри специального "
+"пользовательского сегмента, созданного сервером BTX. Этот сегмент начинается "
+"с адреса `0xa000`. Также помните, что часть [.filename]#boot2# в "
+"[.filename]#boot# была скопирована по адресу `0xc000`, то есть со смещением "
+"`0x2000` от начала пользовательского сегмента, поэтому [.filename]#boot2# "
+"будет работать корректно при передаче управления на него. Далее, "
+"[.filename]#boot2.bin# создается из [.filename]#boot2.out# путем удаления "
+"символов и информации о формате; boot2.bin представляет собой _сырой_ "
+"бинарный файл. Теперь обратите внимание, что файл [.filename]#boot2.ldr# "
+"создается как 512-байтный файл, заполненный нулями. Это пространство "
+"зарезервировано для bsdlabel."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:873
+msgid ""
+"Now that we have files [.filename]#boot1#, [.filename]#boot2.bin# and "
+"[.filename]#boot2.ldr#, only the BTX server is missing before creating the "
+"all-in-one [.filename]#boot# file. The BTX server is located in "
+"[.filename]#stand/i386/btx/btx#; it has its own [.filename]#Makefile# with "
+"its own set of rules for building. The important thing to notice is that it "
+"is also compiled as a _raw_ binary, and that it is linked to execute at "
+"address `0x9000`. The details can be found in [.filename]#stand/i386/btx/"
+"btx/Makefile#."
+msgstr ""
+"Теперь, когда у нас есть файлы [.filename]#boot1#, [.filename]#boot2.bin# и "
+"[.filename]#boot2.ldr#, осталось только добавить сервер BTX перед созданием "
+"универсального файла [.filename]#boot#. Сервер BTX находится в "
+"[.filename]#stand/i386/btx/btx#; у него есть собственный "
+"[.filename]#Makefile# со своим набором правил для сборки. Важно отметить, "
+"что он также компилируется как _сырой_ бинарный файл и линкуется для "
+"выполнения по адресу `0x9000`. Подробности можно найти в [.filename]#stand/"
+"i386/btx/btx/Makefile#."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:880
+msgid ""
+"Having the files that comprise the [.filename]#boot# program, the final step "
+"is to _merge_ them. This is done by a special program called "
+"[.filename]#btxld# (source located in [.filename]#/usr/src/usr.sbin/"
+"btxld#). Some arguments to this program include the name of the output file "
+"([.filename]#boot#), its entry point (`0x2000`) and its file format (raw "
+"binary). The various files are finally merged by this utility into the file "
+"[.filename]#boot#, which consists of [.filename]#boot1#, [.filename]#boot2#, "
+"the `bsdlabel` and the BTX server. This file, which takes exactly 16 "
+"sectors, or 8192 bytes, is what is actually written to the beginning of the "
+"FreeBSD slice during installation. Let us now proceed to study the BTX "
+"server program."
+msgstr ""
+"Имея файлы, составляющие программу [.filename]#boot#, последним шагом "
+"является их _объединение_. Это выполняется специальной программой под "
+"названием [.filename]#btxld# (исходный код расположен в [.filename]#/usr/src/"
+"usr.sbin/btxld#). Некоторые аргументы этой программы включают имя выходного "
+"файла ([.filename]#boot#), его точку входа (`0x2000`) и формат файла "
+"(бинарный). Различные файлы окончательно объединяются этой утилитой в файл "
+"[.filename]#boot#, который состоит из [.filename]#boot1#, "
+"[.filename]#boot2#, `bsdlabel` и сервера BTX. Этот файл, занимающий ровно 16 "
+"секторов или 8192 байта, записывается в начало раздела FreeBSD во время "
+"установки. Теперь перейдем к изучению программы сервера BTX."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:883
+msgid ""
+"The BTX server prepares a simple environment and switches from 16-bit real "
+"mode to 32-bit protected mode, right before passing control to the client. "
+"This includes initializing and updating the following data structures:"
+msgstr ""
+"Сервер BTX подготавливает простое окружение и переключается из 16-битного "
+"реального режима в 32-битный защищённый режим, непосредственно перед "
+"передачей управления клиенту. Это включает инициализацию и обновление "
+"следующих структур данных:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:886
+msgid ""
+"Modifies the `Interrupt Vector Table (IVT)`. The IVT provides exception and "
+"interrupt handlers for Real-Mode code."
+msgstr ""
+"Изменяет `Таблицу Векторов Прерываний (IVT)`. IVT предоставляет обработчики "
+"исключений и прерываний для кода в Реальном Режиме."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:889
+msgid ""
+"The `Interrupt Descriptor Table (IDT)` is created. Entries are provided for "
+"processor exceptions, hardware interrupts, two system calls and V86 "
+"interface. The IDT provides exception and interrupt handlers for Protected-"
+"Mode code."
+msgstr ""
+"Создается `Таблица дескрипторов прерываний (IDT)`. В ней предусмотрены "
+"записи для исключений процессора, аппаратных прерываний, двух системных "
+"вызовов и интерфейса V86. IDT предоставляет обработчики исключений и "
+"прерываний для кода в защищенном режиме."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:891
+msgid ""
+"A `Task-State Segment (TSS)` is created. This is necessary because the "
+"processor works in the _least_ privileged level when executing the client "
+"([.filename]#boot2#), but in the _most_ privileged level when executing the "
+"BTX server."
+msgstr ""
+"Создается `Сегмент состояния задачи (TSS)`. Это необходимо, потому что "
+"процессор работает на _наименее_ привилегированном уровне при выполнении "
+"клиента ([.filename]#boot2#), но на _наиболее_ привилегированном уровне при "
+"выполнении сервера BTX."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:894
+msgid ""
+"The GDT (Global Descriptor Table) is set up. Entries (descriptors) are "
+"provided for supervisor code and data, user code and data, and real-mode "
+"code and data. footnote:[Real-mode code and data are necessary when "
+"switching back to real mode from protected mode, as suggested by the Intel "
+"manuals.]"
+msgstr ""
+"Устанавливается GDT (Глобальная Таблица Дескрипторов). Создаются записи "
+"(дескрипторы) для кода и данных супервизора, кода и данных пользователя, а "
+"также кода и данных реального режима. footnote:[Код и данные реального "
+"режима необходимы при переключении обратно в реальный режим из защищённого "
+"режима, как указано в руководствах Intel.]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:899
+msgid ""
+"Let us now start studying the actual implementation. Recall that "
+"[.filename]#boot1# made a jump to address `0x9010`, the BTX server's entry "
+"point. Before studying program execution there, note that the BTX server "
+"has a special header at address range `0x9000-0x900f`, right before its "
+"entry point. This header is defined as follows:"
+msgstr ""
+"Приступим к изучению фактической реализации. Напомним, что "
+"[.filename]#boot1# выполнил переход на адрес `0x9010` — точку входа сервера "
+"BTX. Прежде чем изучать выполнение программы там, обратите внимание, что "
+"сервер BTX имеет специальный заголовок в диапазоне адресов `0x9000-0x900f`, "
+"непосредственно перед точкой входа. Этот заголовок определён следующим "
+"образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:915
+#, no-wrap
+msgid ""
+"start:\t\t\t\t\t\t# Start of code\n"
+"/*\n"
+" * BTX header.\n"
+" */\n"
+"btx_hdr:\t.byte 0xeb\t\t\t# Machine ID\n"
+"\t\t.byte 0xe\t\t\t# Header size\n"
+"\t\t.ascii \"BTX\"\t\t\t# Magic\n"
+"\t\t.byte 0x1\t\t\t# Major version\n"
+"\t\t.byte 0x2\t\t\t# Minor version\n"
+"\t\t.byte BTX_FLAGS\t\t\t# Flags\n"
+"\t\t.word PAG_CNT-MEM_ORG>>0xc\t# Paging control\n"
+"\t\t.word break-start\t\t# Text size\n"
+"\t\t.long 0x0\t\t\t# Entry address\n"
+msgstr ""
+"start:\t\t\t\t\t\t# Start of code\n"
+"/*\n"
+" * BTX header.\n"
+" */\n"
+"btx_hdr:\t.byte 0xeb\t\t\t# Machine ID\n"
+"\t\t.byte 0xe\t\t\t# Header size\n"
+"\t\t.ascii \"BTX\"\t\t\t# Magic\n"
+"\t\t.byte 0x1\t\t\t# Major version\n"
+"\t\t.byte 0x2\t\t\t# Minor version\n"
+"\t\t.byte BTX_FLAGS\t\t\t# Flags\n"
+"\t\t.word PAG_CNT-MEM_ORG>>0xc\t# Paging control\n"
+"\t\t.word break-start\t\t# Text size\n"
+"\t\t.long 0x0\t\t\t# Entry address\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:917
+#, no-wrap
+msgid "[.filename]#stand/i386/btx/btx/btx.S# [[btx-header]]"
+msgstr "[.filename]#stand/i386/btx/btx/btx.S# [[btx-header]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:922
+msgid ""
+"Note the first two bytes are `0xeb` and `0xe`. In the IA-32 architecture, "
+"these two bytes are interpreted as a relative jump past the header into the "
+"entry point, so in theory, [.filename]#boot1# could jump here (address "
+"`0x9000`) instead of address `0x9010`. Note that the last field in the BTX "
+"header is a pointer to the client's ([.filename]#boot2#) entry pointb2. "
+"This field is patched at link time."
+msgstr ""
+"Обратите внимание, что первые два байта — это `0xeb` и `0xe`. В архитектуре "
+"IA-32 эти два байта интерпретируются как относительный переход за заголовок "
+"к точке входа, поэтому теоретически [.filename]#boot1# мог бы перейти сюда "
+"(адрес `0x9000`) вместо адреса `0x9010`. Обратите внимание, что последнее "
+"поле в заголовке BTX — это указатель на точку входа клиента "
+"([.filename]#boot2#)b2. Это поле исправляется во время компоновки."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:924
+msgid "Immediately following the header is the BTX server's entry point:"
+msgstr "Сразу после заголовка следует точка входа сервера BTX:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:938
+#, no-wrap
+msgid ""
+"/*\n"
+" * Initialization routine.\n"
+" */\n"
+"init:\t\tcli\t\t\t\t# Disable interrupts\n"
+"\t\txor %ax,%ax\t\t\t# Zero/segment\n"
+"\t\tmov %ax,%ss\t\t\t# Set up\n"
+"\t\tmov $MEM_ESP0,%sp\t\t# stack\n"
+"\t\tmov %ax,%es\t\t\t# Address\n"
+"\t\tmov %ax,%ds\t\t\t# data\n"
+"\t\tpushl $0x2\t\t\t# Clear\n"
+"\t\tpopfl\t\t\t\t# flags\n"
+msgstr ""
+"/*\n"
+" * Initialization routine.\n"
+" */\n"
+"init:\t\tcli\t\t\t\t# Disable interrupts\n"
+"\t\txor %ax,%ax\t\t\t# Zero/segment\n"
+"\t\tmov %ax,%ss\t\t\t# Set up\n"
+"\t\tmov $MEM_ESP0,%sp\t\t# stack\n"
+"\t\tmov %ax,%es\t\t\t# Address\n"
+"\t\tmov %ax,%ds\t\t\t# data\n"
+"\t\tpushl $0x2\t\t\t# Clear\n"
+"\t\tpopfl\t\t\t\t# flags\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:940
+#, no-wrap
+msgid "[.filename]#stand/i386/btx/btx/btx.S# [[btx-init]]"
+msgstr "[.filename]#stand/i386/btx/btx/btx.S# [[btx-init]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:944
+msgid ""
+"This code disables interrupts, sets up a working stack (starting at address "
+"`0x1800`) and clears the flags in the EFLAGS register. Note that the "
+"`popfl` instruction pops out a doubleword (4 bytes) from the stack and "
+"places it in the EFLAGS register. As the value actually popped is `2`, the "
+"EFLAGS register is effectively cleared (IA-32 requires that bit 2 of the "
+"EFLAGS register always be 1)."
+msgstr ""
+"Этот код отключает прерывания, устанавливает рабочий стек (начиная с адреса "
+"`0x1800`) и очищает флаги в регистре EFLAGS. Обратите внимание, что "
+"инструкция `popfl` извлекает двойное слово (4 байта) из стека и помещает его "
+"в регистр EFLAGS. Поскольку извлекаемое значение фактически равно `2`, "
+"регистр EFLAGS эффективно очищается (IA-32 требует, чтобы бит 2 регистра "
+"EFLAGS всегда был равен 1)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:947
+msgid ""
+"Our next code block clears (sets to `0`) the memory range `0x5e00-0x8fff`. "
+"This range is where the various data structures will be created:"
+msgstr ""
+"Следующий блок кода очищает (устанавливает в `0`) диапазон памяти "
+"`0x5e00-0x8fff`. В этом диапазоне будут созданы различные структуры данных:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:957
+#, no-wrap
+msgid ""
+"/*\n"
+" * Initialize memory.\n"
+" */\n"
+"\t\tmov $MEM_IDT,%di\t\t# Memory to initialize\n"
+"\t\tmov $(MEM_ORG-MEM_IDT)/2,%cx\t# Words to zero\n"
+"\t\trep\t\t\t\t# Zero-fill\n"
+"\t\tstosw\t\t\t\t# memory\n"
+msgstr ""
+"/*\n"
+" * Initialize memory.\n"
+" */\n"
+"\t\tmov $MEM_IDT,%di\t\t# Memory to initialize\n"
+"\t\tmov $(MEM_ORG-MEM_IDT)/2,%cx\t# Words to zero\n"
+"\t\trep\t\t\t\t# Zero-fill\n"
+"\t\tstosw\t\t\t\t# memory\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:959
+#, no-wrap
+msgid "[.filename]#stand/i386/btx/btx/btx.S# [[btx-clear-mem]]"
+msgstr "[.filename]#stand/i386/btx/btx/btx.S# [[btx-clear-mem]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:962
+msgid ""
+"Recall that [.filename]#boot1# was originally loaded to address `0x7c00`, "
+"so, with this memory initialization, that copy effectively disappeared. "
+"However, also recall that [.filename]#boot1# was relocated to `0x700`, so "
+"_that_ copy is still in memory, and the BTX server will make use of it."
+msgstr ""
+"Напомним, что [.filename]#boot1# изначально загружался по адресу `0x7c00`, "
+"поэтому при такой инициализации памяти эта копия фактически исчезла. Однако "
+"также напомним, что [.filename]#boot1# был перемещён на адрес `0x700`, "
+"поэтому _эта_ копия всё ещё находится в памяти, и сервер BTX будет её "
+"использовать."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:970
+msgid ""
+"Next, the real-mode IVT (Interrupt Vector Table is updated. The IVT is an "
+"array of segment/offset pairs for exception and interrupt handlers. The "
+"BIOS normally maps hardware interrupts to interrupt vectors `0x8` to `0xf` "
+"and `0x70` to `0x77` but, as will be seen, the 8259A Programmable Interrupt "
+"Controller, the chip controlling the actual mapping of hardware interrupts "
+"to interrupt vectors, is programmed to remap these interrupt vectors from "
+"`0x8-0xf` to `0x20-0x27` and from `0x70-0x77` to `0x28-0x2f`. Thus, "
+"interrupt handlers are provided for interrupt vectors `0x20-0x2f`. The "
+"reason the BIOS-provided handlers are not used directly is because they work "
+"in 16-bit real mode, but not 32-bit protected mode. Processor mode will be "
+"switched to 32-bit protected mode shortly. However, the BTX server sets up "
+"a mechanism to effectively use the handlers provided by the BIOS:"
+msgstr ""
+"Далее обновляется таблица векторов прерываний (IVT) в реальном режиме. IVT "
+"представляет собой массив пар сегмент/смещение для обработчиков исключений и "
+"прерываний. BIOS обычно сопоставляет аппаратные прерывания с векторами "
+"прерываний `0x8`–`0xf` и `0x70`–`0x77`, но, как будет показано, "
+"программируемый контроллер прерываний 8259A, микросхема, управляющая "
+"фактическим сопоставлением аппаратных прерываний с векторами прерываний, "
+"программируется для переназначения этих векторов прерываний с `0x8`–`0xf` на "
+"`0x20`–`0x27` и с `0x70`–`0x77` на `0x28`–`0x2f`. Таким образом, обработчики "
+"прерываний предоставляются для векторов прерываний `0x20`–`0x2f`. Причина, "
+"по которой обработчики, предоставляемые BIOS, не используются напрямую, "
+"заключается в том, что они работают в 16-битном реальном режиме, но не в 32-"
+"битном защищённом режиме. Вскоре будет выполнен переход в 32-битный "
+"защищённый режим. Однако сервер BTX настраивает механизм для эффективного "
+"использования обработчиков, предоставляемых BIOS:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:985
+#, no-wrap
+msgid ""
+"/*\n"
+" * Update real mode IDT for reflecting hardware interrupts.\n"
+" */\n"
+"\t\tmov $intr20,%bx\t\t\t# Address first handler\n"
+"\t\tmov $0x10,%cx\t\t\t# Number of handlers\n"
+"\t\tmov $0x20*4,%di\t\t\t# First real mode IDT entry\n"
+"init.0:\t\tmov %bx,(%di)\t\t\t# Store IP\n"
+"\t\tinc %di\t\t\t\t# Address next\n"
+"\t\tinc %di\t\t\t\t# entry\n"
+"\t\tstosw\t\t\t\t# Store CS\n"
+"\t\tadd $4,%bx\t\t\t# Next handler\n"
+"\t\tloop init.0\t\t\t# Next IRQ\n"
+msgstr ""
+"/*\n"
+" * Update real mode IDT for reflecting hardware interrupts.\n"
+" */\n"
+"\t\tmov $intr20,%bx\t\t\t# Address first handler\n"
+"\t\tmov $0x10,%cx\t\t\t# Number of handlers\n"
+"\t\tmov $0x20*4,%di\t\t\t# First real mode IDT entry\n"
+"init.0:\t\tmov %bx,(%di)\t\t\t# Store IP\n"
+"\t\tinc %di\t\t\t\t# Address next\n"
+"\t\tinc %di\t\t\t\t# entry\n"
+"\t\tstosw\t\t\t\t# Store CS\n"
+"\t\tadd $4,%bx\t\t\t# Next handler\n"
+"\t\tloop init.0\t\t\t# Next IRQ\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:987
+#, no-wrap
+msgid "[.filename]#stand/i386/btx/btx/btx.S# [[btx-ivt]]"
+msgstr "[.filename]#stand/i386/btx/btx/btx.S# [[btx-ivt]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:992
+msgid ""
+"The next block creates the IDT (Interrupt Descriptor Table). The IDT is "
+"analogous, in protected mode, to the IVT in real mode. That is, the IDT "
+"describes the various exception and interrupt handlers used when the "
+"processor is executing in protected mode. In essence, it also consists of "
+"an array of segment/offset pairs, although the structure is somewhat more "
+"complex, because segments in protected mode are different than in real mode, "
+"and various protection mechanisms apply:"
+msgstr ""
+"Следующий блок создает IDT (таблицу дескрипторов прерываний). IDT в "
+"защищенном режиме аналогична IVT в реальном режиме. То есть, IDT описывает "
+"различные обработчики исключений и прерываний, используемые, когда процессор "
+"работает в защищенном режиме. По сути, она также состоит из массива пар "
+"сегмент/смещение, хотя структура несколько сложнее, поскольку сегменты в "
+"защищенном режиме отличаются от реального режима, и применяются различные "
+"механизмы защиты:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1019
+#, no-wrap
+msgid ""
+"/*\n"
+" * Create IDT.\n"
+" */\n"
+"\t\tmov $MEM_IDT,%di\t\t# IDT's address\n"
+"\t\tmov $idtctl,%si\t\t\t# Control string\n"
+"init.1:\t\tlodsb\t\t\t\t# Get entry\n"
+"\t\tcbw\t\t\t\t# count\n"
+"\t\txchg %ax,%cx\t\t\t# as word\n"
+"\t\tjcxz init.4\t\t\t# If done\n"
+"\t\tlodsb\t\t\t\t# Get segment\n"
+"\t\txchg %ax,%dx\t\t\t# P:DPL:type\n"
+"\t\tlodsw\t\t\t\t# Get control\n"
+"\t\txchg %ax,%bx\t\t\t# set\n"
+"\t\tlodsw\t\t\t\t# Get handler offset\n"
+"\t\tmov $SEL_SCODE,%dh\t\t# Segment selector\n"
+"init.2:\t\tshr %bx\t\t\t\t# Handle this int?\n"
+"\t\tjnc init.3\t\t\t# No\n"
+"\t\tmov %ax,(%di)\t\t\t# Set handler offset\n"
+"\t\tmov %dh,0x2(%di)\t\t# and selector\n"
+"\t\tmov %dl,0x5(%di)\t\t# Set P:DPL:type\n"
+"\t\tadd $0x4,%ax\t\t\t# Next handler\n"
+"init.3:\t\tlea 0x8(%di),%di\t\t# Next entry\n"
+"\t\tloop init.2\t\t\t# Till set done\n"
+"\t\tjmp init.1\t\t\t# Continue\n"
+msgstr ""
+"/*\n"
+" * Create IDT.\n"
+" */\n"
+"\t\tmov $MEM_IDT,%di\t\t# IDT's address\n"
+"\t\tmov $idtctl,%si\t\t\t# Control string\n"
+"init.1:\t\tlodsb\t\t\t\t# Get entry\n"
+"\t\tcbw\t\t\t\t# count\n"
+"\t\txchg %ax,%cx\t\t\t# as word\n"
+"\t\tjcxz init.4\t\t\t# If done\n"
+"\t\tlodsb\t\t\t\t# Get segment\n"
+"\t\txchg %ax,%dx\t\t\t# P:DPL:type\n"
+"\t\tlodsw\t\t\t\t# Get control\n"
+"\t\txchg %ax,%bx\t\t\t# set\n"
+"\t\tlodsw\t\t\t\t# Get handler offset\n"
+"\t\tmov $SEL_SCODE,%dh\t\t# Segment selector\n"
+"init.2:\t\tshr %bx\t\t\t\t# Handle this int?\n"
+"\t\tjnc init.3\t\t\t# No\n"
+"\t\tmov %ax,(%di)\t\t\t# Set handler offset\n"
+"\t\tmov %dh,0x2(%di)\t\t# and selector\n"
+"\t\tmov %dl,0x5(%di)\t\t# Set P:DPL:type\n"
+"\t\tadd $0x4,%ax\t\t\t# Next handler\n"
+"init.3:\t\tlea 0x8(%di),%di\t\t# Next entry\n"
+"\t\tloop init.2\t\t\t# Till set done\n"
+"\t\tjmp init.1\t\t\t# Continue\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1021
+#, no-wrap
+msgid "[.filename]#stand/i386/btx/btx/btx.S# [[btx-idt]]"
+msgstr "[.filename]#stand/i386/btx/btx/btx.S# [[btx-idt]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1029
+msgid ""
+"Each entry in the `IDT` is 8 bytes long. Besides the segment/offset "
+"information, they also describe the segment type, privilege level, and "
+"whether the segment is present in memory or not. The construction is such "
+"that interrupt vectors from `0` to `0xf` (exceptions) are handled by "
+"function `intx00`; vector `0x10` (also an exception) is handled by `intx10`; "
+"hardware interrupts, which are later configured to start at interrupt vector "
+"`0x20` all the way to interrupt vector `0x2f`, are handled by function "
+"`intx20`. Lastly, interrupt vector `0x30`, which is used for system calls, "
+"is handled by `intx30`, and vectors `0x31` and `0x32` are handled by "
+"`intx31`. It must be noted that only descriptors for interrupt vectors "
+"`0x30`, `0x31` and `0x32` are given privilege level 3, the same privilege "
+"level as the [.filename]#boot2# client, which means the client can execute a "
+"software-generated interrupt to this vectors through the `int` instruction "
+"without failing (this is the way [.filename]#boot2# use the services "
+"provided by the BTX server). Also, note that _only_ software-generated "
+"interrupts are protected from code executing in lesser privilege levels. "
+"Hardware-generated interrupts and processor-generated exceptions are "
+"_always_ handled adequately, regardless of the actual privileges involved."
+msgstr ""
+"Каждая запись в `IDT` имеет длину 8 байт. Помимо информации о сегменте/"
+"смещении, они также описывают тип сегмента, уровень привилегий и "
+"присутствует ли сегмент в памяти. Структура организована так, что векторы "
+"прерываний от `0` до `0xf` (исключения) обрабатываются функцией `intx00`; "
+"вектор `0x10` (также исключение) обрабатывается `intx10`; аппаратные "
+"прерывания, которые позже настраиваются начиная с вектора `0x20` и до "
+"вектора `0x2f`, обрабатываются функцией `intx20`. Наконец, вектор прерывания "
+"`0x30`, используемый для системных вызовов, обрабатывается `intx30`, а "
+"векторы `0x31` и `0x32` обрабатываются `intx31`. Необходимо отметить, что "
+"только дескрипторы для векторов прерываний `0x30`, `0x31` и `0x32` имеют "
+"уровень привилегий 3, такой же, как у клиента [.filename]#boot2#, что "
+"означает, что клиент может выполнить программно-генерируемое прерывание к "
+"этим векторам через инструкцию `int` без ошибки (это способ, которым "
+"[.filename]#boot2# использует сервисы, предоставляемые сервером BTX). Также "
+"обратите внимание, что _только_ программно-генерируемые прерывания защищены "
+"от кода, выполняющегося на более низких уровнях привилегий. Аппаратно-"
+"генерируемые прерывания и исключения, генерируемые процессором, _всегда_ "
+"обрабатываются корректно, независимо от фактических привилегий."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1034
+msgid ""
+"The next step is to initialize the TSS (Task-State Segment). The TSS is a "
+"hardware feature that helps the operating system or executive software "
+"implement multitasking functionality through process abstraction. The IA-32 "
+"architecture demands the creation and use of _at least_ one TSS if "
+"multitasking facilities are used or different privilege levels are defined. "
+"Since the [.filename]#boot2# client is executed in privilege level 3, but "
+"the BTX server runs in privilege level 0, a TSS must be defined:"
+msgstr ""
+"Следующий шаг — инициализация TSS (сегмента состояния задачи). TSS — это "
+"аппаратная функция, которая помогает операционной системе или "
+"исполнительному ПО реализовать многозадачность через абстракцию процессов. "
+"Архитектура IA-32 требует создания и использования _как минимум_ одного TSS, "
+"если используются механизмы многозадачности или определены различные уровни "
+"привилегий. Поскольку клиент [.filename]#boot2# выполняется на уровне "
+"привилегий 3, а сервер BTX работает на уровне привилегий 0, необходимо "
+"определить TSS:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1043
+#, no-wrap
+msgid ""
+"/*\n"
+" * Initialize TSS.\n"
+" */\n"
+"init.4:\t\tmovb $_ESP0H,TSS_ESP0+1(%di)\t# Set ESP0\n"
+"\t\tmovb $SEL_SDATA,TSS_SS0(%di)\t# Set SS0\n"
+"\t\tmovb $_TSSIO,TSS_MAP(%di)\t# Set I/O bit map base\n"
+msgstr ""
+"/*\n"
+" * Initialize TSS.\n"
+" */\n"
+"init.4:\t\tmovb $_ESP0H,TSS_ESP0+1(%di)\t# Set ESP0\n"
+"\t\tmovb $SEL_SDATA,TSS_SS0(%di)\t# Set SS0\n"
+"\t\tmovb $_TSSIO,TSS_MAP(%di)\t# Set I/O bit map base\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1045
+#, no-wrap
+msgid "[.filename]#stand/i386/btx/btx/btx.S# [[btx-tss]]"
+msgstr "[.filename]#stand/i386/btx/btx/btx.S# [[btx-tss]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1049
+msgid ""
+"Note that a value is given for the Privilege Level 0 stack pointer and stack "
+"segment in the TSS. This is needed because, if an interrupt or exception is "
+"received while executing [.filename]#boot2# in Privilege Level 3, a change "
+"to Privilege Level 0 is automatically performed by the processor, so a new "
+"working stack is needed. Finally, the I/O Map Base Address field of the TSS "
+"is given a value, which is a 16-bit offset from the beginning of the TSS to "
+"the I/O Permission Bitmap and the Interrupt Redirection Bitmap."
+msgstr ""
+"Обратите внимание, что в TSS указано значение для указателя стека и сегмента "
+"стека уровня привилегий 0. Это необходимо, потому что если прерывание или "
+"исключение получено во время выполнения [.filename]#boot2# на уровне "
+"привилегий 3, процессор автоматически переключается на уровень привилегий 0, "
+"поэтому требуется новый рабочий стек. Наконец, полю базового адреса карты "
+"ввода-вывода TSS присваивается значение, которое представляет собой 16-"
+"битное смещение от начала TSS до битовой карты разрешений ввода-вывода и "
+"битовой карты перенаправления прерываний."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1052
+msgid ""
+"After the IDT and TSS are created, the processor is ready to switch to "
+"protected mode. This is done in the next block:"
+msgstr ""
+"После создания IDT и TSS процессор готов к переходу в защищённый режим. Это "
+"выполняется в следующем блоке:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1070
+#, no-wrap
+msgid ""
+"/*\n"
+" * Bring up the system.\n"
+" */\n"
+"\t\tmov $0x2820,%bx\t\t\t# Set protected mode\n"
+"\t\tcallw setpic\t\t\t# IRQ offsets\n"
+"\t\tlidt idtdesc\t\t\t# Set IDT\n"
+"\t\tlgdt gdtdesc\t\t\t# Set GDT\n"
+"\t\tmov %cr0,%eax\t\t\t# Switch to protected\n"
+"\t\tinc %ax\t\t\t\t# mode\n"
+"\t\tmov %eax,%cr0\t\t\t#\n"
+"\t\tljmp $SEL_SCODE,$init.8\t\t# To 32-bit code\n"
+"\t\t.code32\n"
+"init.8:\t\txorl %ecx,%ecx\t\t\t# Zero\n"
+"\t\tmovb $SEL_SDATA,%cl\t\t# To 32-bit\n"
+"\t\tmovw %cx,%ss\t\t\t# stack\n"
+msgstr ""
+"/*\n"
+" * Bring up the system.\n"
+" */\n"
+"\t\tmov $0x2820,%bx\t\t\t# Set protected mode\n"
+"\t\tcallw setpic\t\t\t# IRQ offsets\n"
+"\t\tlidt idtdesc\t\t\t# Set IDT\n"
+"\t\tlgdt gdtdesc\t\t\t# Set GDT\n"
+"\t\tmov %cr0,%eax\t\t\t# Switch to protected\n"
+"\t\tinc %ax\t\t\t\t# mode\n"
+"\t\tmov %eax,%cr0\t\t\t#\n"
+"\t\tljmp $SEL_SCODE,$init.8\t\t# To 32-bit code\n"
+"\t\t.code32\n"
+"init.8:\t\txorl %ecx,%ecx\t\t\t# Zero\n"
+"\t\tmovb $SEL_SDATA,%cl\t\t# To 32-bit\n"
+"\t\tmovw %cx,%ss\t\t\t# stack\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1072
+#, no-wrap
+msgid "[.filename]#stand/i386/btx/btx/btx.S# [[btx-prot]]"
+msgstr "[.filename]#stand/i386/btx/btx/btx.S# [[btx-prot]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1085
+msgid ""
+"First, a call is made to `setpic` to program the 8259A PIC (Programmable "
+"Interrupt Controller). This chip is connected to multiple hardware "
+"interrupt sources. Upon receiving an interrupt from a device, it signals "
+"the processor with the appropriate interrupt vector. This can be customized "
+"so that specific interrupts are associated with specific interrupt vectors, "
+"as explained before. Next, the IDTR (Interrupt Descriptor Table Register) "
+"and GDTR (Global Descriptor Table Register) are loaded with the instructions "
+"`lidt` and `lgdt`, respectively. These registers are loaded with the base "
+"address and limit address for the IDT and GDT. The following three "
+"instructions set the Protection Enable (PE) bit of the `%cr0` register. "
+"This effectively switches the processor to 32-bit protected mode. Next, a "
+"long jump is made to `init.8` using segment selector SEL_SCODE, which "
+"selects the Supervisor Code Segment. The processor is effectively executing "
+"in CPL 0, the most privileged level, after this jump. Finally, the "
+"Supervisor Data Segment is selected for the stack by assigning the segment "
+"selector SEL_SDATA to the `%ss` register. This data segment also has a "
+"privilege level of `0`."
+msgstr ""
+"Сначала вызывается `setpic` для программирования 8259A PIC (программируемого "
+"контроллера прерываний). Этот чип подключен к нескольким источникам "
+"аппаратных прерываний. При получении прерывания от устройства он "
+"сигнализирует процессору соответствующим вектором прерывания. Это можно "
+"настроить так, чтобы определенные прерывания были связаны с конкретными "
+"векторами прерываний, как объяснялось ранее. Затем регистры IDTR (Interrupt "
+"Descriptor Table Register) и GDTR (Global Descriptor Table Register) "
+"загружаются инструкциями `lidt` и `lgdt` соответственно. Эти регистры "
+"загружаются базовым адресом и предельным адресом для IDT и GDT. Следующие "
+"три инструкции устанавливают бит Protection Enable (PE) в регистре `%cr0`. "
+"Это фактически переключает процессор в 32-битный защищенный режим. Затем "
+"выполняется дальний переход на `init.8` с использованием селектора сегмента "
+"SEL_SCODE, который выбирает сегмент кода супервизора (Supervisor Code "
+"Segment). После этого перехода процессор фактически работает на уровне CPL 0 "
+"— наиболее привилегированном уровне. Наконец, для стека выбирается сегмент "
+"данных супервизора (Supervisor Data Segment) путем присвоения селектора "
+"сегмента SEL_SDATA регистру `%ss`. Этот сегмент данных также имеет уровень "
+"привилегий `0`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1087
+msgid ""
+"Our last code block is responsible for loading the TR (Task Register) with "
+"the segment selector for the TSS we created earlier, and setting the User "
+"Mode environment before passing execution control to the [.filename]#boot2# "
+"client."
+msgstr ""
+"Наш последний блок кода отвечает за загрузку TR (Регистра Задач) с "
+"селектором сегмента для TSS, который мы создали ранее, и настройку окружения "
+"пользовательского режима перед передачей управления исполнения клиенту "
+"[.filename]#boot2#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1123
+#, no-wrap
+msgid ""
+"/*\n"
+" * Launch user task.\n"
+" */\n"
+"\t\tmovb $SEL_TSS,%cl\t\t# Set task\n"
+"\t\tltr %cx\t\t\t\t# register\n"
+"\t\tmovl $MEM_USR,%edx\t\t# User base address\n"
+"\t\tmovzwl %ss:BDA_MEM,%eax\t\t# Get free memory\n"
+"\t\tshll $0xa,%eax\t\t\t# To bytes\n"
+"\t\tsubl $ARGSPACE,%eax\t\t# Less arg space\n"
+"\t\tsubl %edx,%eax\t\t\t# Less base\n"
+"\t\tmovb $SEL_UDATA,%cl\t\t# User data selector\n"
+"\t\tpushl %ecx\t\t\t# Set SS\n"
+"\t\tpushl %eax\t\t\t# Set ESP\n"
+"\t\tpush $0x202\t\t\t# Set flags (IF set)\n"
+"\t\tpush $SEL_UCODE\t\t\t# Set CS\n"
+"\t\tpushl btx_hdr+0xc\t\t# Set EIP\n"
+"\t\tpushl %ecx\t\t\t# Set GS\n"
+"\t\tpushl %ecx\t\t\t# Set FS\n"
+"\t\tpushl %ecx\t\t\t# Set DS\n"
+"\t\tpushl %ecx\t\t\t# Set ES\n"
+"\t\tpushl %edx\t\t\t# Set EAX\n"
+"\t\tmovb $0x7,%cl\t\t\t# Set remaining\n"
+"init.9:\t\tpush $0x0\t\t\t# general\n"
+"\t\tloop init.9\t\t\t# registers\n"
+"#ifdef BTX_SERIAL\n"
+"\t\tcall sio_init\t\t\t# setup the serial console\n"
+"#endif\n"
+"\t\tpopa\t\t\t\t# and initialize\n"
+"\t\tpopl %es\t\t\t# Initialize\n"
+"\t\tpopl %ds\t\t\t# user\n"
+"\t\tpopl %fs\t\t\t# segment\n"
+"\t\tpopl %gs\t\t\t# registers\n"
+"\t\tiret\t\t\t\t# To user mode\n"
+msgstr ""
+"/*\n"
+" * Launch user task.\n"
+" */\n"
+"\t\tmovb $SEL_TSS,%cl\t\t# Set task\n"
+"\t\tltr %cx\t\t\t\t# register\n"
+"\t\tmovl $MEM_USR,%edx\t\t# User base address\n"
+"\t\tmovzwl %ss:BDA_MEM,%eax\t\t# Get free memory\n"
+"\t\tshll $0xa,%eax\t\t\t# To bytes\n"
+"\t\tsubl $ARGSPACE,%eax\t\t# Less arg space\n"
+"\t\tsubl %edx,%eax\t\t\t# Less base\n"
+"\t\tmovb $SEL_UDATA,%cl\t\t# User data selector\n"
+"\t\tpushl %ecx\t\t\t# Set SS\n"
+"\t\tpushl %eax\t\t\t# Set ESP\n"
+"\t\tpush $0x202\t\t\t# Set flags (IF set)\n"
+"\t\tpush $SEL_UCODE\t\t\t# Set CS\n"
+"\t\tpushl btx_hdr+0xc\t\t# Set EIP\n"
+"\t\tpushl %ecx\t\t\t# Set GS\n"
+"\t\tpushl %ecx\t\t\t# Set FS\n"
+"\t\tpushl %ecx\t\t\t# Set DS\n"
+"\t\tpushl %ecx\t\t\t# Set ES\n"
+"\t\tpushl %edx\t\t\t# Set EAX\n"
+"\t\tmovb $0x7,%cl\t\t\t# Set remaining\n"
+"init.9:\t\tpush $0x0\t\t\t# general\n"
+"\t\tloop init.9\t\t\t# registers\n"
+"#ifdef BTX_SERIAL\n"
+"\t\tcall sio_init\t\t\t# setup the serial console\n"
+"#endif\n"
+"\t\tpopa\t\t\t\t# and initialize\n"
+"\t\tpopl %es\t\t\t# Initialize\n"
+"\t\tpopl %ds\t\t\t# user\n"
+"\t\tpopl %fs\t\t\t# segment\n"
+"\t\tpopl %gs\t\t\t# registers\n"
+"\t\tiret\t\t\t\t# To user mode\n"
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1125
+#, no-wrap
+msgid "[.filename]#stand/i386/btx/btx/btx.S# [[btx-end]]"
+msgstr "[.filename]#stand/i386/btx/btx/btx.S# [[btx-end]]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1149
+msgid ""
+"Note that the client's environment include a stack segment selector and "
+"stack pointer (registers `%ss` and `%esp`). Indeed, once the TR is loaded "
+"with the appropriate stack segment selector (instruction `ltr`), the stack "
+"pointer is calculated and pushed onto the stack along with the stack's "
+"segment selector. Next, the value `0x202` is pushed onto the stack; it is "
+"the value that the EFLAGS will get when control is passed to the client. "
+"Also, the User Mode code segment selector and the client's entry point are "
+"pushed. Recall that this entry point is patched in the BTX header at link "
+"time. Finally, segment selectors (stored in register `%ecx`) for the "
+"segment registers `%gs, %fs, %ds and %es` are pushed onto the stack, along "
+"with the value at `%edx` (`0xa000`). Keep in mind the various values that "
+"have been pushed onto the stack (they will be popped out shortly). Next, "
+"values for the remaining general purpose registers are also pushed onto the "
+"stack (note the `loop` that pushes the value `0` seven times). Now, values "
+"will be started to be popped out of the stack. First, the `popa` "
+"instruction pops out of the stack the latest seven values pushed. They are "
+"stored in the general purpose registers in order `%edi, %esi, %ebp, %ebx, "
+"%edx, %ecx, %eax`. Then, the various segment selectors pushed are popped "
+"into the various segment registers. Five values still remain on the stack. "
+"They are popped when the `iret` instruction is executed. This instruction "
+"first pops the value that was pushed from the BTX header. This value is a "
+"pointer to [.filename]#boot2#'s entry point. It is placed in the register "
+"`%eip`, the instruction pointer register. Next, the segment selector for "
+"the User Code Segment is popped and copied to register `%cs`. Remember that "
+"this segment's privilege level is 3, the least privileged level. This means "
+"that we must provide values for the stack of this privilege level. This is "
+"why the processor, besides further popping the value for the EFLAGS "
+"register, does two more pops out of the stack. These values go to the stack "
+"pointer (`%esp`) and the stack segment (`%ss`). Now, execution continues at "
+"``boot0``'s entry point."
+msgstr ""
+"Обратите внимание, что среда клиента включает селектор сегмента стека и "
+"указатель стека (регистры `%ss` и `%esp`). Действительно, как только TR "
+"загружается соответствующим селектором сегмента стека (инструкция `ltr`), "
+"указатель стека вычисляется и помещается в стек вместе с селектором сегмента "
+"стека. Затем значение `0x202` помещается в стек; это значение, которое "
+"EFLAGS получит при передаче управления клиенту. Также в стек помещаются "
+"селектор сегмента кода пользовательского режима и точка входа клиента. "
+"Напомним, что эта точка входа прописывается в заголовке BTX во время "
+"компоновки. Наконец, селекторы сегментов (хранящиеся в регистре `%ecx`) для "
+"регистров сегментов `%gs, %fs, %ds и %es` помещаются в стек вместе со "
+"значением из `%edx` (`0xa000`). Примите во внимание эти значения, помещенные "
+"в стек (они скоро будут извлечены). Затем значения для оставшихся регистров "
+"общего назначения также помещаются в стек (обратите внимание на цикл `loop`, "
+"который помещает значение `0` семь раз). Теперь начнётся извлечение значений "
+"из стека. Сначала инструкция `popa` извлекает из стека последние семь "
+"помещённых значений. Они сохраняются в регистрах общего назначения в порядке "
+"`%edi, %esi, %ebp, %ebx, %edx, %ecx, %eax`. Затем различные селекторы "
+"сегментов, помещённые в стек, извлекаются в соответствующие регистры "
+"сегментов. В стеке остаются ещё пять значений. Они извлекаются при "
+"выполнении инструкции `iret`. Эта инструкция сначала извлекает значение, "
+"которое было помещено из заголовка BTX. Это значение является указателем на "
+"точку входа [.filename]#boot2#. Оно помещается в регистр `%eip` — регистр "
+"указателя инструкций. Затем селектор сегмента кода пользователя извлекается "
+"и копируется в регистр `%cs`. Помните, что уровень привилегий этого сегмента "
+"— 3, наименее привилегированный уровень. Это означает, что мы должны "
+"предоставить значения для стека этого уровня привилегий. Именно поэтому "
+"процессор, помимо дальнейшего извлечения значения для регистра EFLAGS, "
+"выполняет ещё два извлечения из стека. Эти значения попадают в указатель "
+"стека (`%esp`) и сегмент стека (`%ss`). Теперь выполнение продолжается с "
+"точки входа ``boot0``."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1153
+msgid ""
+"It is important to note how the User Code Segment is defined. This "
+"segment's _base address_ is set to `0xa000`. This means that code memory "
+"addresses are _relative_ to address 0xa000; if code being executed is "
+"fetched from address `0x2000`, the _actual_ memory addressed is "
+"`0xa000+0x2000=0xc000`."
+msgstr ""
+"Важно отметить, как определяется сегмент пользовательского кода. _Базовый "
+"адрес_ этого сегмента установлен на `0xa000`. Это означает, что адреса "
+"памяти кода являются _относительными_ к адресу 0xa000; если код, который "
+"выполняется, извлекается из адреса `0x2000`, _фактический_ адрес в памяти "
+"будет `0xa000+0x2000=0xc000`."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1155
+#, no-wrap
+msgid "boot2 Stage"
+msgstr "Этап загрузки boot2"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1162
+msgid ""
+"`boot2` defines an important structure, `struct bootinfo`. This structure "
+"is initialized by `boot2` and passed to the loader, and then further to the "
+"kernel. Some nodes of this structures are set by `boot2`, the rest by the "
+"loader. This structure, among other information, contains the kernel "
+"filename, BIOS harddisk geometry, BIOS drive number for boot device, "
+"physical memory available, `envp` pointer etc. The definition for it is:"
+msgstr ""
+"`boot2` определяет важную структуру, `struct bootinfo`. Эта структура "
+"инициализируется `boot2` и передается загрузчику, а затем ядру. Некоторые "
+"узлы этой структуры устанавливаются `boot2`, остальные — загрузчиком. Эта "
+"структура, среди прочей информации, содержит имя файла ядра, геометрию "
+"жесткого диска в BIOS, номер диска в BIOS для загрузочного устройства, "
+"доступную физическую память, указатель `envp` и т.д. Ее определение выглядит "
+"так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1187
+#, no-wrap
+msgid ""
+"/usr/include/machine/bootinfo.h:\n"
+"struct bootinfo {\n"
+"\tu_int32_t\tbi_version;\n"
+"\tu_int32_t\tbi_kernelname;\t\t/* represents a char * */\n"
+"\tu_int32_t\tbi_nfs_diskless;\t/* struct nfs_diskless * */\n"
+"\t\t\t\t/* End of fields that are always present. */\n"
+"#define\tbi_endcommon\tbi_n_bios_used\n"
+"\tu_int32_t\tbi_n_bios_used;\n"
+"\tu_int32_t\tbi_bios_geom[N_BIOS_GEOM];\n"
+"\tu_int32_t\tbi_size;\n"
+"\tu_int8_t\tbi_memsizes_valid;\n"
+"\tu_int8_t\tbi_bios_dev;\t\t/* bootdev BIOS unit number */\n"
+"\tu_int8_t\tbi_pad[2];\n"
+"\tu_int32_t\tbi_basemem;\n"
+"\tu_int32_t\tbi_extmem;\n"
+"\tu_int32_t\tbi_symtab;\t\t/* struct symtab * */\n"
+"\tu_int32_t\tbi_esymtab;\t\t/* struct symtab * */\n"
+"\t\t\t\t/* Items below only from advanced bootloader */\n"
+"\tu_int32_t\tbi_kernend;\t\t/* end of kernel space */\n"
+"\tu_int32_t\tbi_envp;\t\t/* environment */\n"
+"\tu_int32_t\tbi_modulep;\t\t/* preloaded modules */\n"
+"};\n"
+msgstr ""
+"/usr/include/machine/bootinfo.h:\n"
+"struct bootinfo {\n"
+"\tu_int32_t\tbi_version;\n"
+"\tu_int32_t\tbi_kernelname;\t\t/* represents a char * */\n"
+"\tu_int32_t\tbi_nfs_diskless;\t/* struct nfs_diskless * */\n"
+"\t\t\t\t/* End of fields that are always present. */\n"
+"#define\tbi_endcommon\tbi_n_bios_used\n"
+"\tu_int32_t\tbi_n_bios_used;\n"
+"\tu_int32_t\tbi_bios_geom[N_BIOS_GEOM];\n"
+"\tu_int32_t\tbi_size;\n"
+"\tu_int8_t\tbi_memsizes_valid;\n"
+"\tu_int8_t\tbi_bios_dev;\t\t/* bootdev BIOS unit number */\n"
+"\tu_int8_t\tbi_pad[2];\n"
+"\tu_int32_t\tbi_basemem;\n"
+"\tu_int32_t\tbi_extmem;\n"
+"\tu_int32_t\tbi_symtab;\t\t/* struct symtab * */\n"
+"\tu_int32_t\tbi_esymtab;\t\t/* struct symtab * */\n"
+"\t\t\t\t/* Items below only from advanced bootloader */\n"
+"\tu_int32_t\tbi_kernend;\t\t/* end of kernel space */\n"
+"\tu_int32_t\tbi_envp;\t\t/* environment */\n"
+"\tu_int32_t\tbi_modulep;\t\t/* preloaded modules */\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1194
+msgid ""
+"`boot2` enters into an infinite loop waiting for user input, then calls "
+"`load()`. If the user does not press anything, the loop breaks by a "
+"timeout, so `load()` will load the default file ([.filename]#/boot/"
+"loader#). Functions `ino_t lookup(char *filename)` and `int xfsread(ino_t "
+"inode, void *buf, size_t nbyte)` are used to read the content of a file into "
+"memory. [.filename]#/boot/loader# is an ELF binary, but where the ELF "
+"header is prepended with [.filename]#a.out#'s `struct exec` structure. "
+"`load()` scans the loader's ELF header, loading the content of [.filename]#/"
+"boot/loader# into memory, and passing the execution to the loader's entry:"
+msgstr ""
+"`boot2` входит в бесконечный цикл, ожидая ввода пользователя, затем вызывает "
+"`load()`. Если пользователь ничего не нажимает, цикл прерывается по "
+"таймауту, и `load()` загружает файл по умолчанию ([.filename]#/boot/"
+"loader#). Функции `ino_t lookup(char *filename)` и `int xfsread(ino_t inode, "
+"void *buf, size_t nbyte)` используются для чтения содержимого файла в "
+"память. [.filename]#/boot/loader# — это ELF-бинарный файл, но с заголовком "
+"ELF, перед которым добавлена структура `struct exec` из [.filename]#a.out#. "
+"`load()` анализирует ELF-заголовок загрузчика, загружает содержимое "
+"[.filename]#/boot/loader# в память и передаёт управление на точку входа "
+"загрузчика:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1201
+#, no-wrap
+msgid ""
+"stand/i386/boot2/boot2.c:\n"
+" __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),\n"
+"\t MAKEBOOTDEV(dev_maj[dsk.type], dsk.slice, dsk.unit, dsk.part),\n"
+"\t 0, 0, 0, VTOP(&bootinfo));\n"
+msgstr ""
+"stand/i386/boot2/boot2.c:\n"
+" __exec((caddr_t)addr, RB_BOOTINFO | (opts & RBX_MASK),\n"
+"\t MAKEBOOTDEV(dev_maj[dsk.type], dsk.slice, dsk.unit, dsk.part),\n"
+"\t 0, 0, 0, VTOP(&bootinfo));\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1204
+#, no-wrap
+msgid "loader Stage"
+msgstr "Этап загрузчика (loader)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1209
+msgid ""
+"loader is a BTX client as well. I will not describe it here in detail, "
+"there is a comprehensive man page written by Mike Smith, man:loader[8]. The "
+"underlying mechanisms and BTX were discussed above."
+msgstr ""
+"Загрузчик также является клиентом BTX. Я не буду подробно описывать его "
+"здесь, существует исчерпывающая man-страница, написанная Майком Смитом: "
+"man:loader[8]. Основные механизмы и BTX были рассмотрены выше."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1212
+msgid ""
+"The main task for the loader is to boot the kernel. When the kernel is "
+"loaded into memory, it is being called by the loader:"
+msgstr ""
+"Основная задача загрузчика — загрузить ядро. Когда ядро загружено в память, "
+"загрузчик вызывает его:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1218
+#, no-wrap
+msgid ""
+"stand/common/boot.c:\n"
+" /* Call the exec handler from the loader matching the kernel */\n"
+" file_formats[fp->f_loader]->l_exec(fp);\n"
+msgstr ""
+"stand/common/boot.c:\n"
+" /* Call the exec handler from the loader matching the kernel */\n"
+" file_formats[fp->f_loader]->l_exec(fp);\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1221
+#, no-wrap
+msgid "Kernel Initialization"
+msgstr "Инициализация ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1228
+msgid ""
+"Let us take a look at the command that links the kernel. This will help "
+"identify the exact location where the loader passes execution to the "
+"kernel. This location is the kernel's actual entry point. This command is "
+"now excluded from [.filename]#sys/conf/Makefile.i386#. The content that "
+"interests us can be found in [.filename]#/usr/obj/usr/src/i386.i386/sys/"
+"GENERIC/#."
+msgstr ""
+"Давайте рассмотрим команду, которая компонует ядро. Это поможет определить "
+"точное местоположение, где загрузчик передает выполнение ядру. Это "
+"местоположение является фактической точкой входа ядра. Данная команда теперь "
+"исключена из [.filename]#sys/conf/Makefile.i386#. Интересующее нас "
+"содержимое можно найти в [.filename]#/usr/obj/usr/src/i386.i386/sys/GENERIC/"
+"#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1235
+#, no-wrap
+msgid ""
+"/usr/obj/usr/src/i386.i386/sys/GENERIC/kernel.meta:\n"
+"ld -m elf_i386_fbsd -Bdynamic -T /usr/src/sys/conf/ldscript.i386 --build-id=sha1 --no-warn-mismatch \\\n"
+"--warn-common --export-dynamic --dynamic-linker /red/herring -X -o kernel locore.o\n"
+"<lots of kernel .o files>\n"
+msgstr ""
+"/usr/obj/usr/src/i386.i386/sys/GENERIC/kernel.meta:\n"
+"ld -m elf_i386_fbsd -Bdynamic -T /usr/src/sys/conf/ldscript.i386 --build-id=sha1 --no-warn-mismatch \\\n"
+"--warn-common --export-dynamic --dynamic-linker /red/herring -X -o kernel locore.o\n"
+"<lots of kernel .o files>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1241
+msgid ""
+"A few interesting things can be seen here. First, the kernel is an ELF "
+"dynamically linked binary, but the dynamic linker for kernel is [.filename]#/"
+"red/herring#, which is definitely a bogus file. Second, taking a look at "
+"the file [.filename]#sys/conf/ldscript.i386# gives an idea about what ld "
+"options are used when compiling a kernel. Reading through the first few "
+"lines, the string"
+msgstr ""
+"Вот несколько интересных наблюдений. Во-первых, ядро представляет собой "
+"динамически связанный бинарный файл ELF, но динамический компоновщик для "
+"ядра — это [.filename]#/red/herring#, что явно является фиктивным файлом. Во-"
+"вторых, взглянув на файл [.filename]#sys/conf/ldscript.i386#, можно понять, "
+"какие параметры ld используются при компиляции ядра. Читая первые несколько "
+"строк, видим, что строка"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1246
+#, no-wrap
+msgid ""
+"sys/conf/ldscript.i386:\n"
+"ENTRY(btext)\n"
+msgstr ""
+"sys/conf/ldscript.i386:\n"
+"ENTRY(btext)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1250
+msgid ""
+"says that a kernel's entry point is the symbol `btext`. This symbol is "
+"defined in [.filename]#locore.s#:"
+msgstr ""
+"говорит, что точка входа ядра — это символ `btext`. Этот символ определён в "
+"[.filename]#locore.s#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1261
+#, no-wrap
+msgid ""
+"sys/i386/i386/locore.s:\n"
+"\t.text\n"
+"/**********************************************************************\n"
+" *\n"
+" * This is where the bootblocks start us, set the ball rolling...\n"
+" *\n"
+" */\n"
+"NON_GPROF_ENTRY(btext)\n"
+msgstr ""
+"sys/i386/i386/locore.s:\n"
+"\t.text\n"
+"/**********************************************************************\n"
+" *\n"
+" * This is where the bootblocks start us, set the ball rolling...\n"
+" *\n"
+" */\n"
+"NON_GPROF_ENTRY(btext)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1265
+msgid ""
+"First, the register EFLAGS is set to a predefined value of 0x00000002. Then "
+"all the segment registers are initialized:"
+msgstr ""
+"Сначала регистр EFLAGS устанавливается в предопределённое значение "
+"0x00000002. Затем инициализируются все сегментные регистры:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1272
+#, no-wrap
+msgid ""
+"sys/i386/i386/locore.s:\n"
+"/* Don't trust what the BIOS gives for eflags. */\n"
+"\tpushl\t$PSL_KERNEL\n"
+"\tpopfl\n"
+msgstr ""
+"sys/i386/i386/locore.s:\n"
+"/* Don't trust what the BIOS gives for eflags. */\n"
+"\tpushl\t$PSL_KERNEL\n"
+"\tpopfl\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1280
+#, no-wrap
+msgid ""
+"/*\n"
+" * Don't trust what the BIOS gives for %fs and %gs. Trust the bootstrap\n"
+" * to set %cs, %ds, %es and %ss.\n"
+" */\n"
+"\tmov\t%ds, %ax\n"
+"\tmov\t%ax, %fs\n"
+"\tmov\t%ax, %gs\n"
+msgstr ""
+"/*\n"
+" * Don't trust what the BIOS gives for %fs and %gs. Trust the bootstrap\n"
+" * to set %cs, %ds, %es and %ss.\n"
+" */\n"
+"\tmov\t%ds, %ax\n"
+"\tmov\t%ax, %fs\n"
+"\tmov\t%ax, %gs\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1284
+msgid ""
+"btext calls the routines `recover_bootinfo()`, `identify_cpu()`, which are "
+"also defined in [.filename]#locore.s#. Here is a description of what they "
+"do:"
+msgstr ""
+"btext вызывает подпрограммы `recover_bootinfo()` и `identify_cpu()`, которые "
+"также определены в [.filename]#locore.s#. Вот описание их функций:"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1290
+#, no-wrap
+msgid "`recover_bootinfo`"
+msgstr "`recover_bootinfo`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1294
+#, no-wrap
+msgid ""
+"This routine parses the parameters to the kernel passed from the bootstrap.\n"
+"The kernel may have been booted in 3 ways: by the loader, described above, by the old disk boot blocks, or by the old diskless boot procedure.\n"
+"This function determines the booting method, and stores the `struct bootinfo` structure into the kernel memory."
+msgstr ""
+"Эта процедура разбирает параметры, переданные ядру при загрузке.\n"
+"Ядро могло быть загружено тремя способами: загрузчиком (как описано выше), старыми загрузочными блоками диска или по старой процедуре загрузки без диска.\n"
+"Эта функция определяет метод загрузки и сохраняет структуру `struct bootinfo` в памяти ядра."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1295
+#, no-wrap
+msgid "`identify_cpu`"
+msgstr "`identify_cpu`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1296
+#, no-wrap
+msgid "This function tries to find out what CPU it is running on, storing the value found in a variable `_cpu`."
+msgstr "Эта функция пытается определить, на каком процессоре она выполняется, сохраняя найденное значение в переменной `_cpu`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1299
+msgid "The next steps are enabling VME, if the CPU supports it:"
+msgstr ""
+"Следующие шаги включают активацию VME, если процессор поддерживает эту "
+"функцию:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1307
+#, no-wrap
+msgid ""
+"sys/i386/i386/mpboot.s:\n"
+"\ttestl\t$CPUID_VME,%edx\n"
+"\tjz\t3f\n"
+"\torl\t$CR4_VME,%eax\n"
+"3:\tmovl\t%eax,%cr4\n"
+msgstr ""
+"sys/i386/i386/mpboot.s:\n"
+"\ttestl\t$CPUID_VME,%edx\n"
+"\tjz\t3f\n"
+"\torl\t$CR4_VME,%eax\n"
+"3:\tmovl\t%eax,%cr4\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1310
+msgid "Then, enabling paging:"
+msgstr "Затем, включение подкачки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1320
+#, no-wrap
+msgid ""
+"sys/i386/i386/mpboot.s:\n"
+"/* Now enable paging */\n"
+"\tmovl\tIdlePTD_nopae, %eax\n"
+"\tmovl\t%eax,%cr3\t\t\t/* load ptd addr into mmu */\n"
+"\tmovl\t%cr0,%eax\t\t\t/* get control word */\n"
+"\torl\t$CR0_PE|CR0_PG,%eax\t\t/* enable paging */\n"
+"\tmovl\t%eax,%cr0\t\t\t/* and let's page NOW! */\n"
+msgstr ""
+"sys/i386/i386/mpboot.s:\n"
+"/* Now enable paging */\n"
+"\tmovl\tIdlePTD_nopae, %eax\n"
+"\tmovl\t%eax,%cr3\t\t\t/* load ptd addr into mmu */\n"
+"\tmovl\t%cr0,%eax\t\t\t/* get control word */\n"
+"\torl\t$CR0_PE|CR0_PG,%eax\t\t/* enable paging */\n"
+"\tmovl\t%eax,%cr0\t\t\t/* and let's page NOW! */\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1323
+msgid ""
+"The next three lines of code are because the paging was set, so the jump is "
+"needed to continue the execution in virtualized address space:"
+msgstr ""
+"Следующие три строки кода необходимы, потому что была установлена подкачка, "
+"поэтому требуется переход для продолжения выполнения в виртуализированном "
+"адресном пространстве:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1329
+#, no-wrap
+msgid ""
+"sys/i386/i386/mpboot.s:\n"
+"\tpushl\t$mp_begin\t\t\t\t/* jump to high mem */\n"
+"\tret\n"
+msgstr ""
+"sys/i386/i386/mpboot.s:\n"
+"\tpushl\t$mp_begin\t\t\t\t/* jump to high mem */\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1332
+#, no-wrap
+msgid ""
+"/* now running relocated at KERNBASE where the system is linked to run */\n"
+"mp_begin:\t/* now running relocated at KERNBASE */\n"
+msgstr ""
+"/* now running relocated at KERNBASE where the system is linked to run */\n"
+"mp_begin:\t/* now running relocated at KERNBASE */\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1337
+msgid ""
+"The function `init386()` is called with a pointer to the first free physical "
+"page, after that `mi_startup()`. `init386` is an architecture dependent "
+"initialization function, and `mi_startup()` is an architecture independent "
+"one (the 'mi_' prefix stands for Machine Independent). The kernel never "
+"returns from `mi_startup()`, and by calling it, the kernel finishes booting:"
+msgstr ""
+"Функция `init386()` вызывается с указателем на первую свободную физическую "
+"страницу, после чего следует вызов `mi_startup()`. `init386` — это "
+"архитектурно-зависимая функция инициализации, а `mi_startup()` — "
+"архитектурно-независимая (префикс 'mi_' означает Machine Independent, то "
+"есть «независимая от машины»). Ядро никогда не возвращается из "
+"`mi_startup()`, и, вызывая её, завершает загрузку:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1347
+#, no-wrap
+msgid ""
+"sys/i386/i386/locore.s:\n"
+"\tpushl\tphysfree\t\t\t/* value of first for init386(first) */\n"
+"\tcall\tinit386\t\t\t\t/* wire 386 chip for unix operation */\n"
+"\taddl\t$4,%esp\n"
+"\tmovl\t%eax,%esp\t\t\t/* Switch to true top of stack. */\n"
+"\tcall\tmi_startup\t\t\t/* autoconfiguration, mountroot etc */\n"
+"\t/* NOTREACHED */\n"
+msgstr ""
+"sys/i386/i386/locore.s:\n"
+"\tpushl\tphysfree\t\t\t/* value of first for init386(first) */\n"
+"\tcall\tinit386\t\t\t\t/* wire 386 chip for unix operation */\n"
+"\taddl\t$4,%esp\n"
+"\tmovl\t%eax,%esp\t\t\t/* Switch to true top of stack. */\n"
+"\tcall\tmi_startup\t\t\t/* autoconfiguration, mountroot etc */\n"
+"\t/* NOTREACHED */\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1349
+#, no-wrap
+msgid "`init386()`"
+msgstr "`init386()`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1354
+msgid ""
+"`init386()` is defined in [.filename]#sys/i386/i386/machdep.c# and performs "
+"low-level initialization specific to the i386 chip. The switch to protected "
+"mode was performed by the loader. The loader has created the very first "
+"task, in which the kernel continues to operate. Before looking at the code, "
+"consider the tasks the processor must complete to initialize protected mode "
+"execution:"
+msgstr ""
+"`init386()` определена в [.filename]#sys/i386/i386/machdep.c# и выполняет "
+"низкоуровневую инициализацию, специфичную для чипа i386. Переход в "
+"защищённый режим был выполнен загрузчиком. Загрузчик создал самую первую "
+"задачу, в которой ядро продолжает работать. Прежде чем рассматривать код, "
+"рассмотрим задачи, которые процессор должен выполнить для инициализации "
+"выполнения в защищённом режиме:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1356
+msgid ""
+"Initialize the kernel tunable parameters, passed from the bootstrapping "
+"program."
+msgstr ""
+"Инициализировать настраиваемые параметры ядра, переданные из загрузочной "
+"программы."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1357
+msgid "Prepare the GDT."
+msgstr "Подготовить GDT."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1358
+msgid "Prepare the IDT."
+msgstr "Подготовить IDT."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1359
+msgid "Initialize the system console."
+msgstr "Инициализировать системную консоль."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1360
+msgid "Initialize the DDB, if it is compiled into kernel."
+msgstr "Инициализировать DDB, если он скомпилирован в ядро."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1361
+msgid "Initialize the TSS."
+msgstr "Инициализировать TSS."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1362
+msgid "Prepare the LDT."
+msgstr "Подготовить LDT."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1363
+msgid "Set up thread0's pcb."
+msgstr "Настройка pcb для thread0."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1366
+msgid ""
+"`init386()` initializes the tunable parameters passed from bootstrap by "
+"setting the environment pointer (envp) and calling `init_param1()`. The "
+"envp pointer has been passed from loader in the `bootinfo` structure:"
+msgstr ""
+"`init386()` инициализирует настраиваемые параметры, переданные из bootstrap, "
+"устанавливая указатель окружения (envp) и вызывая `init_param1()`. Указатель "
+"envp был передан из loader в структуре `bootinfo`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1372
+#, no-wrap
+msgid ""
+"sys/i386/i386/machdep.c:\n"
+"\t/* Init basic tunables, hz etc */\n"
+"\tinit_param1();\n"
+msgstr ""
+"sys/i386/i386/machdep.c:\n"
+"\t/* Init basic tunables, hz etc */\n"
+"\tinit_param1();\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1376
+msgid ""
+"`init_param1()` is defined in [.filename]#sys/kern/subr_param.c#. That file "
+"has a number of sysctls, and two functions, `init_param1()` and "
+"`init_param2()`, that are called from `init386()`:"
+msgstr ""
+"`init_param1()` определена в [.filename]#sys/kern/subr_param.c#. Этот файл "
+"содержит ряд sysctl, а также две функции, `init_param1()` и `init_param2()`, "
+"которые вызываются из `init386()`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1384
+#, no-wrap
+msgid ""
+"sys/kern/subr_param.c:\n"
+"\thz = -1;\n"
+"\tTUNABLE_INT_FETCH(\"kern.hz\", &hz);\n"
+"\tif (hz == -1)\n"
+"\t\thz = vm_guest > VM_GUEST_NO ? HZ_VM : HZ;\n"
+msgstr ""
+"sys/kern/subr_param.c:\n"
+"\thz = -1;\n"
+"\tTUNABLE_INT_FETCH(\"kern.hz\", &hz);\n"
+"\tif (hz == -1)\n"
+"\t\thz = vm_guest > VM_GUEST_NO ? HZ_VM : HZ;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1387
+msgid ""
+"TUNABLE_<typename>_FETCH is used to fetch the value from the environment:"
+msgstr ""
+"`TUNABLE_<typename>_FETCH` используется для получения значения из окружения:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1392
+#, no-wrap
+msgid ""
+"/usr/src/sys/sys/kernel.h:\n"
+"#define\tTUNABLE_INT_FETCH(path, var)\tgetenv_int((path), (var))\n"
+msgstr ""
+"/usr/src/sys/sys/kernel.h:\n"
+"#define\tTUNABLE_INT_FETCH(path, var)\tgetenv_int((path), (var))\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1396
+msgid ""
+"Sysctl `kern.hz` is the system clock tick. Additionally, these sysctls are "
+"set by `init_param1()`: `kern.maxswzone, kern.maxbcache, kern.maxtsiz, "
+"kern.dfldsiz, kern.maxdsiz, kern.dflssiz, kern.maxssiz, kern.sgrowsiz`."
+msgstr ""
+"Sysctl `kern.hz` представляет собой такт системных часов. Кроме того, эти "
+"параметры sysctl устанавливаются функцией `init_param1()`: `kern.maxswzone, "
+"kern.maxbcache, kern.maxtsiz, kern.dfldsiz, kern.maxdsiz, kern.dflssiz, "
+"kern.maxssiz, kern.sgrowsiz`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1404
+msgid ""
+"Then `init386()` prepares the Global Descriptors Table (GDT). Every task on "
+"an x86 is running in its own virtual address space, and this space is "
+"addressed by a segment:offset pair. Say, for instance, the current "
+"instruction to be executed by the processor lies at CS:EIP, then the linear "
+"virtual address for that instruction would be \"the virtual address of code "
+"segment CS\" + EIP. For convenience, segments begin at virtual address 0 "
+"and end at a 4GB boundary. Therefore, the instruction's linear virtual "
+"address for this example would just be the value of EIP. Segment registers "
+"such as CS, DS etc are the selectors, i.e., indexes, into GDT (to be more "
+"precise, an index is not a selector itself, but the INDEX field of a "
+"selector). FreeBSD's GDT holds descriptors for 15 selectors per CPU:"
+msgstr ""
+"Затем `init386()` подготавливает Глобальную Таблицу Дескрипторов (GDT). "
+"Каждая задача на x86 выполняется в своем собственном виртуальном адресном "
+"пространстве, и это пространство адресуется парой сегмент:смещение. "
+"Например, если текущая инструкция, которую должен выполнить процессор, "
+"находится по адресу CS:EIP, то линейный виртуальный адрес этой инструкции "
+"будет \"виртуальный адрес кодового сегмента CS\" + EIP. Для удобства "
+"сегменты начинаются с виртуального адреса 0 и заканчиваются на границе 4 ГБ. "
+"Таким образом, линейный виртуальный адрес инструкции в данном примере будет "
+"просто значением EIP. Сегментные регистры, такие как CS, DS и другие, "
+"являются селекторами, то есть индексами в GDT (если быть более точным, "
+"индекс — это не сам селектор, а поле INDEX в селекторе). GDT в FreeBSD "
+"содержит дескрипторы для 15 селекторов на каждый CPU:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1410
+#, no-wrap
+msgid ""
+"sys/i386/i386/machdep.c:\n"
+"union descriptor gdt0[NGDT];\t/* initial global descriptor table */\n"
+"union descriptor *gdt = gdt0;\t/* global descriptor table */\n"
+msgstr ""
+"sys/i386/i386/machdep.c:\n"
+"union descriptor gdt0[NGDT];\t/* initial global descriptor table */\n"
+"union descriptor *gdt = gdt0;\t/* global descriptor table */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1435
+#, no-wrap
+msgid ""
+"sys/x86/include/segments.h:\n"
+"/*\n"
+" * Entries in the Global Descriptor Table (GDT)\n"
+" */\n"
+"#define\tGNULL_SEL\t0\t/* Null Descriptor */\n"
+"#define\tGPRIV_SEL\t1\t/* SMP Per-Processor Private Data */\n"
+"#define\tGUFS_SEL\t2\t/* User %fs Descriptor (order critical: 1) */\n"
+"#define\tGUGS_SEL\t3\t/* User %gs Descriptor (order critical: 2) */\n"
+"#define\tGCODE_SEL\t4\t/* Kernel Code Descriptor (order critical: 1) */\n"
+"#define\tGDATA_SEL\t5\t/* Kernel Data Descriptor (order critical: 2) */\n"
+"#define\tGUCODE_SEL\t6\t/* User Code Descriptor (order critical: 3) */\n"
+"#define\tGUDATA_SEL\t7\t/* User Data Descriptor (order critical: 4) */\n"
+"#define\tGBIOSLOWMEM_SEL\t8\t/* BIOS low memory access (must be entry 8) */\n"
+"#define\tGPROC0_SEL\t9\t/* Task state process slot zero and up */\n"
+"#define\tGLDT_SEL\t10\t/* Default User LDT */\n"
+"#define\tGUSERLDT_SEL\t11\t/* User LDT */\n"
+"#define\tGPANIC_SEL\t12\t/* Task state to consider panic from */\n"
+"#define\tGBIOSCODE32_SEL\t13\t/* BIOS interface (32bit Code) */\n"
+"#define\tGBIOSCODE16_SEL\t14\t/* BIOS interface (16bit Code) */\n"
+"#define\tGBIOSDATA_SEL\t15\t/* BIOS interface (Data) */\n"
+"#define\tGBIOSUTIL_SEL\t16\t/* BIOS interface (Utility) */\n"
+"#define\tGBIOSARGS_SEL\t17\t/* BIOS interface (Arguments) */\n"
+"#define\tGNDIS_SEL\t18\t/* For the NDIS layer */\n"
+"#define\tNGDT\t\t19\n"
+msgstr ""
+"sys/x86/include/segments.h:\n"
+"/*\n"
+" * Entries in the Global Descriptor Table (GDT)\n"
+" */\n"
+"#define\tGNULL_SEL\t0\t/* Null Descriptor */\n"
+"#define\tGPRIV_SEL\t1\t/* SMP Per-Processor Private Data */\n"
+"#define\tGUFS_SEL\t2\t/* User %fs Descriptor (order critical: 1) */\n"
+"#define\tGUGS_SEL\t3\t/* User %gs Descriptor (order critical: 2) */\n"
+"#define\tGCODE_SEL\t4\t/* Kernel Code Descriptor (order critical: 1) */\n"
+"#define\tGDATA_SEL\t5\t/* Kernel Data Descriptor (order critical: 2) */\n"
+"#define\tGUCODE_SEL\t6\t/* User Code Descriptor (order critical: 3) */\n"
+"#define\tGUDATA_SEL\t7\t/* User Data Descriptor (order critical: 4) */\n"
+"#define\tGBIOSLOWMEM_SEL\t8\t/* BIOS low memory access (must be entry 8) */\n"
+"#define\tGPROC0_SEL\t9\t/* Task state process slot zero and up */\n"
+"#define\tGLDT_SEL\t10\t/* Default User LDT */\n"
+"#define\tGUSERLDT_SEL\t11\t/* User LDT */\n"
+"#define\tGPANIC_SEL\t12\t/* Task state to consider panic from */\n"
+"#define\tGBIOSCODE32_SEL\t13\t/* BIOS interface (32bit Code) */\n"
+"#define\tGBIOSCODE16_SEL\t14\t/* BIOS interface (16bit Code) */\n"
+"#define\tGBIOSDATA_SEL\t15\t/* BIOS interface (Data) */\n"
+"#define\tGBIOSUTIL_SEL\t16\t/* BIOS interface (Utility) */\n"
+"#define\tGBIOSARGS_SEL\t17\t/* BIOS interface (Arguments) */\n"
+"#define\tGNDIS_SEL\t18\t/* For the NDIS layer */\n"
+"#define\tNGDT\t\t19\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1439
+msgid ""
+"Note that those #defines are not selectors themselves, but just a field "
+"INDEX of a selector, so they are exactly the indices of the GDT. for "
+"example, an actual selector for the kernel code (GCODE_SEL) has the value "
+"0x20."
+msgstr ""
+"Обратите внимание, что эти `#defines` не являются самими селекторами, а лишь "
+"полем `INDEX` селектора, поэтому они точно соответствуют индексам GDT. "
+"Например, реальный селектор для кода ядра (`GCODE_SEL`) имеет значение "
+"`0x20`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1447
+msgid ""
+"The next step is to initialize the Interrupt Descriptor Table (IDT). This "
+"table is referenced by the processor when a software or hardware interrupt "
+"occurs. For example, to make a system call, user application issues the "
+"`INT 0x80` instruction. This is a software interrupt, so the processor's "
+"hardware looks up a record with index 0x80 in the IDT. This record points "
+"to the routine that handles this interrupt, in this particular case, this "
+"will be the kernel's syscall gate. The IDT may have a maximum of 256 "
+"(0x100) records. The kernel allocates NIDT records for the IDT, where NIDT "
+"is the maximum (256):"
+msgstr ""
+"Следующий шаг — инициализация таблицы дескрипторов прерываний (IDT). Эта "
+"таблица используется процессором при возникновении программного или "
+"аппаратного прерывания. Например, чтобы выполнить системный вызов, "
+"пользовательское приложение использует инструкцию `INT 0x80`. Это "
+"программное прерывание, поэтому аппаратное обеспечение процессора ищет "
+"запись с индексом 0x80 в IDT. Эта запись указывает на процедуру обработки "
+"данного прерывания, в данном конкретном случае это будет шлюз системных "
+"вызовов ядра. IDT может содержать максимум 256 (0x100) записей. Ядро "
+"выделяет NIDT записей для IDT, где NIDT — это максимум (256):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1453
+#, no-wrap
+msgid ""
+"sys/i386/i386/machdep.c:\n"
+"static struct gate_descriptor idt0[NIDT];\n"
+"struct gate_descriptor *idt = &idt0[0];\t/* interrupt descriptor table */\n"
+msgstr ""
+"sys/i386/i386/machdep.c:\n"
+"static struct gate_descriptor idt0[NIDT];\n"
+"struct gate_descriptor *idt = &idt0[0];\t/* interrupt descriptor table */\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1457
+msgid ""
+"For each interrupt, an appropriate handler is set. The syscall gate for "
+"`INT 0x80` is set as well:"
+msgstr ""
+"Для каждого прерывания устанавливается соответствующий обработчик. Также "
+"настраивается шлюз системного вызова для `INT 0x80`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1463
+#, no-wrap
+msgid ""
+"sys/i386/i386/machdep.c:\n"
+"\tsetidt(IDT_SYSCALL, &IDTVEC(int0x80_syscall),\n"
+"\t\t\tSDT_SYS386IGT, SEL_UPL, GSEL(GCODE_SEL, SEL_KPL));\n"
+msgstr ""
+"sys/i386/i386/machdep.c:\n"
+"\tsetidt(IDT_SYSCALL, &IDTVEC(int0x80_syscall),\n"
+"\t\t\tSDT_SYS386IGT, SEL_UPL, GSEL(GCODE_SEL, SEL_KPL));\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1466
+msgid ""
+"So when a userland application issues the `INT 0x80` instruction, control "
+"will transfer to the function `_Xint0x80_syscall`, which is in the kernel "
+"code segment and will be executed with supervisor privileges."
+msgstr ""
+"Итак, когда пользовательское приложение выполняет инструкцию `INT 0x80`, "
+"управление передаётся функции `_Xint0x80_syscall`, которая находится в "
+"сегменте кода ядра и будет выполнена с привилегиями супервизора."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1468
+msgid "Console and DDB are then initialized:"
+msgstr "Консоль и DDB инициализируются:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1479
+#, no-wrap
+msgid ""
+"sys/i386/i386/machdep.c:\n"
+"\tcninit();\n"
+"/* skipped */\n"
+" kdb_init();\n"
+"#ifdef KDB\n"
+"\tif (boothowto & RB_KDB)\n"
+"\t\tkdb_enter(KDB_WHY_BOOTFLAGS, \"Boot flags requested debugger\");\n"
+"#endif\n"
+msgstr ""
+"sys/i386/i386/machdep.c:\n"
+"\tcninit();\n"
+"/* skipped */\n"
+" kdb_init();\n"
+"#ifdef KDB\n"
+"\tif (boothowto & RB_KDB)\n"
+"\t\tkdb_enter(KDB_WHY_BOOTFLAGS, \"Boot flags requested debugger\");\n"
+"#endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1482
+msgid ""
+"The Task State Segment is another x86 protected mode structure, the TSS is "
+"used by the hardware to store task information when a task switch occurs."
+msgstr ""
+"Сегмент состояния задачи (TSS) — это еще одна структура защищенного режима "
+"x86, используемая оборудованием для хранения информации о задаче при "
+"переключении задач."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1485
+msgid ""
+"The Local Descriptors Table is used to reference userland code and data. "
+"Several selectors are defined to point to the LDT, they are the system call "
+"gates and the user code and data selectors:"
+msgstr ""
+"Локальная таблица дескрипторов (LDT) используется для ссылки на код и данные "
+"пользовательского пространства. Определено несколько селекторов, указывающих "
+"на LDT, включая шлюзы системных вызовов, а также селекторы кода и данных "
+"пользователя:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1494
+#, no-wrap
+msgid ""
+"sys/x86/include/segments.h:\n"
+"#define\tLSYS5CALLS_SEL\t0\t/* forced by intel BCS */\n"
+"#define\tLSYS5SIGR_SEL\t1\n"
+"#define\tLUCODE_SEL\t3\n"
+"#define\tLUDATA_SEL\t5\n"
+"#define\tNLDT\t\t(LUDATA_SEL + 1)\n"
+msgstr ""
+"sys/x86/include/segments.h:\n"
+"#define\tLSYS5CALLS_SEL\t0\t/* forced by intel BCS */\n"
+"#define\tLSYS5SIGR_SEL\t1\n"
+"#define\tLUCODE_SEL\t3\n"
+"#define\tLUDATA_SEL\t5\n"
+"#define\tNLDT\t\t(LUDATA_SEL + 1)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1499
+msgid ""
+"Next, proc0's Process Control Block (`struct pcb`) structure is "
+"initialized. proc0 is a `struct proc` structure that describes a kernel "
+"process. It is always present while the kernel is running, therefore it is "
+"linked with thread0:"
+msgstr ""
+"Далее инициализируется структура Блока Управления Процессом (`struct pcb`) "
+"для proc0. proc0 — это структура `struct proc`, описывающая процесс ядра. "
+"Она всегда присутствует во время работы ядра, поэтому связана с thread0:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1507
+#, no-wrap
+msgid ""
+"sys/i386/i386/machdep.c:\n"
+"register_t\n"
+"init386(int first)\n"
+"{\n"
+" /* ... skipped ... */\n"
+msgstr ""
+"sys/i386/i386/machdep.c:\n"
+"register_t\n"
+"init386(int first)\n"
+"{\n"
+" /* ... skipped ... */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1511
+#, no-wrap
+msgid ""
+" proc_linkup0(&proc0, &thread0);\n"
+" /* ... skipped ... */\n"
+"}\n"
+msgstr ""
+" proc_linkup0(&proc0, &thread0);\n"
+" /* ... skipped ... */\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1515
+msgid ""
+"The structure `struct pcb` is a part of a proc structure. It is defined in "
+"[.filename]#/usr/include/machine/pcb.h# and has a process's information "
+"specific to the i386 architecture, such as registers values."
+msgstr ""
+"Структура `struct pcb` является частью структуры proc. Она определена в "
+"[.filename]#/usr/include/machine/pcb.h# и содержит информацию процесса, "
+"специфичную для архитектуры i386, такую как значения регистров."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1516
+#, no-wrap
+msgid "`mi_startup()`"
+msgstr "`mi_startup()`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1519
+msgid ""
+"This function performs a bubble sort of all the system initialization "
+"objects and then calls the entry of each object one by one:"
+msgstr ""
+"Эта функция выполняет сортировку пузырьком всех объектов инициализации "
+"системы, а затем вызывает вход каждого объекта по очереди:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1524
+#, no-wrap
+msgid ""
+"sys/kern/init_main.c:\n"
+"\tfor (sipp = sysinit; sipp < sysinit_end; sipp++) {\n"
+msgstr ""
+"sys/kern/init_main.c:\n"
+"\tfor (sipp = sysinit; sipp < sysinit_end; sipp++) {\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1526
+#, no-wrap
+msgid "\t\t/* ... skipped ... */\n"
+msgstr "\t\t/* ... skipped ... */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1531
+#, no-wrap
+msgid ""
+"\t\t/* Call function */\n"
+"\t\t(*((*sipp)->func))((*sipp)->udata);\n"
+"\t\t/* ... skipped ... */\n"
+"\t}\n"
+msgstr ""
+"\t\t/* Call function */\n"
+"\t\t(*((*sipp)->func))((*sipp)->udata);\n"
+"\t\t/* ... skipped ... */\n"
+"\t}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1534
+msgid ""
+"Although the sysinit framework is described in the link:/books/developers-"
+"handbook[Developers' Handbook], I will discuss the internals of it."
+msgstr ""
+"Хотя фреймворк sysinit описан в link:/books/developers-handbook[Руководстве "
+"разработчика], я рассмотрю его внутреннее устройство."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1538
+msgid ""
+"Every system initialization object (sysinit object) is created by calling a "
+"SYSINIT() macro. Let us take as example an `announce` sysinit object. This "
+"object prints the copyright message:"
+msgstr ""
+"Каждый объект инициализации системы (объект sysinit) создается путем вызова "
+"макроса SYSINIT(). Возьмем, к примеру, объект sysinit `announce`. Этот "
+"объект выводит сообщение об авторских правах:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1549
+#, no-wrap
+msgid ""
+"sys/kern/init_main.c:\n"
+"static void\n"
+"print_caddr_t(void *data __unused)\n"
+"{\n"
+"\tprintf(\"%s\", (char *)data);\n"
+"}\n"
+"/* ... skipped ... */\n"
+"SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, copyright);\n"
+msgstr ""
+"sys/kern/init_main.c:\n"
+"static void\n"
+"print_caddr_t(void *data __unused)\n"
+"{\n"
+"\tprintf(\"%s\", (char *)data);\n"
+"}\n"
+"/* ... skipped ... */\n"
+"SYSINIT(announce, SI_SUB_COPYRIGHT, SI_ORDER_FIRST, print_caddr_t, copyright);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1553
+msgid ""
+"The subsystem ID for this object is SI_SUB_COPYRIGHT (0x0800001). So, the "
+"copyright message will be printed out first, just after the console "
+"initialization."
+msgstr ""
+"Идентификатор подсистемы для этого объекта — SI_SUB_COPYRIGHT (0x0800001). "
+"Таким образом, сообщение об авторских правах будет выведено первым, сразу "
+"после инициализации консоли."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1557
+msgid ""
+"Let us take a look at what exactly the macro `SYSINIT()` does. It expands "
+"to a `C_SYSINIT()` macro. The `C_SYSINIT()` macro then expands to a static "
+"`struct sysinit` structure declaration with another `DATA_SET` macro call:"
+msgstr ""
+"Давайте рассмотрим, что именно делает макрос `SYSINIT()`. Он раскрывается в "
+"макрос `C_SYSINIT()`. Макрос `C_SYSINIT()` затем раскрывается в статическое "
+"объявление структуры `struct sysinit` с вызовом другого макроса `DATA_SET`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1565
+#, no-wrap
+msgid ""
+"/usr/include/sys/kernel.h:\n"
+" #define C_SYSINIT(uniquifier, subsystem, order, func, ident) \\\n"
+" static struct sysinit uniquifier ## _sys_init = { \\ subsystem, \\\n"
+" order, \\ func, \\ (ident) \\ }; \\ DATA_WSET(sysinit_set,uniquifier ##\n"
+" _sys_init);\n"
+msgstr ""
+"/usr/include/sys/kernel.h:\n"
+" #define C_SYSINIT(uniquifier, subsystem, order, func, ident) \\\n"
+" static struct sysinit uniquifier ## _sys_init = { \\ subsystem, \\\n"
+" order, \\ func, \\ (ident) \\ }; \\ DATA_WSET(sysinit_set,uniquifier ##\n"
+" _sys_init);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1569
+#, no-wrap
+msgid ""
+"#define\tSYSINIT(uniquifier, subsystem, order, func, ident)\t\\\n"
+"\tC_SYSINIT(uniquifier, subsystem, order,\t\t\t\\\n"
+"\t(sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)(ident))\n"
+msgstr ""
+"#define\tSYSINIT(uniquifier, subsystem, order, func, ident)\t\\\n"
+"\tC_SYSINIT(uniquifier, subsystem, order,\t\t\t\\\n"
+"\t(sysinit_cfunc_t)(sysinit_nfunc_t)func, (void *)(ident))\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1572
+msgid ""
+"The `DATA_SET()` macro expands to a `_MAKE_SET()`, and that macro is the "
+"point where all the sysinit magic is hidden:"
+msgstr ""
+"Макрос `DATA_SET()` раскрывается в `_MAKE_SET()`, и именно в этом макросе "
+"скрыта вся магия инициализации системы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1578
+#, no-wrap
+msgid ""
+"/usr/include/linker_set.h:\n"
+"#define TEXT_SET(set, sym) _MAKE_SET(set, sym)\n"
+"#define DATA_SET(set, sym) _MAKE_SET(set, sym)\n"
+msgstr ""
+"/usr/include/linker_set.h:\n"
+"#define TEXT_SET(set, sym) _MAKE_SET(set, sym)\n"
+"#define DATA_SET(set, sym) _MAKE_SET(set, sym)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1582
+msgid ""
+"After executing these macros, various sections were made in the kernel, "
+"including`set.sysinit_set`. Running objdump on a kernel binary, you may "
+"notice the presence of such small sections:"
+msgstr ""
+"После выполнения этих макросов в ядре были созданы различные разделы, "
+"включая `set.sysinit_set`. Запустив objdump для бинарного файла ядра, можно "
+"заметить наличие таких небольших разделов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1594
+#, no-wrap
+msgid ""
+"% llvm-objdump -h /kernel\n"
+"Sections:\n"
+"Idx Name Size VMA Type\n"
+" 10 set_sysctl_set 000021d4 01827078 DATA\n"
+" 16 set_kbddriver_set 00000010 0182a4d0 DATA\n"
+" 20 set_scterm_set 0000000c 0182c75c DATA\n"
+" 21 set_cons_set 00000014 0182c768 DATA\n"
+" 33 set_scrndr_set 00000024 0182c828 DATA\n"
+" 41 set_sysinit_set 000014d8 018fabb0 DATA\n"
+msgstr ""
+"% llvm-objdump -h /kernel\n"
+"Sections:\n"
+"Idx Name Size VMA Type\n"
+" 10 set_sysctl_set 000021d4 01827078 DATA\n"
+" 16 set_kbddriver_set 00000010 0182a4d0 DATA\n"
+" 20 set_scterm_set 0000000c 0182c75c DATA\n"
+" 21 set_cons_set 00000014 0182c768 DATA\n"
+" 33 set_scrndr_set 00000024 0182c828 DATA\n"
+" 41 set_sysinit_set 000014d8 018fabb0 DATA\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1598
+msgid ""
+"This screen dump shows that the size of set.sysinit_set section is 0x14d8 "
+"bytes, so `0x14d8/sizeof(void *)` sysinit objects are compiled into the "
+"kernel. The other sections such as `set.sysctl_set` represent other linker "
+"sets."
+msgstr ""
+"Это содержимое экрана показывает, что размер раздела set.sysinit_set "
+"составляет 0x14d8 байт, поэтому `0x14d8/sizeof(void *)` объектов sysinit "
+"скомпилировано в ядро. Другие разделы, такие как `set.sysctl_set`, "
+"представляют другие наборы компоновщика."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1600
+msgid ""
+"By defining a variable of type `struct sysinit` the content of "
+"`set.sysinit_set` section will be \"collected\" into that variable:"
+msgstr ""
+"Определяя переменную типа `struct sysinit`, содержимое раздела "
+"`set.sysinit_set` будет \"собрано\" в эту переменную:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1605
+#, no-wrap
+msgid ""
+"sys/kern/init_main.c:\n"
+" SET_DECLARE(sysinit_set, struct sysinit);\n"
+msgstr ""
+"sys/kern/init_main.c:\n"
+" SET_DECLARE(sysinit_set, struct sysinit);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1608
+msgid "The `struct sysinit` is defined as follows:"
+msgstr "`struct sysinit` определена следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1618
+#, no-wrap
+msgid ""
+"sys/sys/kernel.h:\n"
+" struct sysinit {\n"
+"\tenum sysinit_sub_id\tsubsystem;\t/* subsystem identifier*/\n"
+"\tenum sysinit_elem_order\torder;\t\t/* init order within subsystem*/\n"
+"\tsysinit_cfunc_t func;\t\t\t/* function\t\t*/\n"
+"\tconst void\t*udata;\t\t\t/* multiplexer/argument */\n"
+"};\n"
+msgstr ""
+"sys/sys/kernel.h:\n"
+" struct sysinit {\n"
+"\tenum sysinit_sub_id\tsubsystem;\t/* subsystem identifier*/\n"
+"\tenum sysinit_elem_order\torder;\t\t/* init order within subsystem*/\n"
+"\tsysinit_cfunc_t func;\t\t\t/* function\t\t*/\n"
+"\tconst void\t*udata;\t\t\t/* multiplexer/argument */\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1623
+msgid ""
+"Returning to the `mi_startup()` discussion, it is must be clear now, how the "
+"sysinit objects are being organized. The `mi_startup()` function sorts them "
+"and calls each. The very last object is the system scheduler:"
+msgstr ""
+"Возвращаясь к обсуждению `mi_startup()`, теперь должно быть понятно, как "
+"организованы объекты sysinit. Функция `mi_startup()` сортирует их и вызывает "
+"каждый. Самый последний объект — это системный планировщик:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1635
+#, no-wrap
+msgid ""
+"/usr/include/sys/kernel.h:\n"
+"enum sysinit_sub_id {\n"
+"\tSI_SUB_DUMMY\t\t= 0x0000000,\t/* not executed; for linker*/\n"
+"\tSI_SUB_DONE\t\t= 0x0000001,\t/* processed*/\n"
+"\tSI_SUB_TUNABLES\t\t= 0x0700000,\t/* establish tunable values */\n"
+"\tSI_SUB_COPYRIGHT\t= 0x0800001,\t/* first use of console*/\n"
+"...\n"
+"\tSI_SUB_LAST\t\t= 0xfffffff\t/* final initialization */\n"
+"};\n"
+msgstr ""
+"/usr/include/sys/kernel.h:\n"
+"enum sysinit_sub_id {\n"
+"\tSI_SUB_DUMMY\t\t= 0x0000000,\t/* not executed; for linker*/\n"
+"\tSI_SUB_DONE\t\t= 0x0000001,\t/* processed*/\n"
+"\tSI_SUB_TUNABLES\t\t= 0x0700000,\t/* establish tunable values */\n"
+"\tSI_SUB_COPYRIGHT\t= 0x0800001,\t/* first use of console*/\n"
+"...\n"
+"\tSI_SUB_LAST\t\t= 0xfffffff\t/* final initialization */\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1640
+msgid ""
+"The system scheduler sysinit object is defined in the file [.filename]#sys/"
+"vm/vm_glue.c#, and the entry point for that object is `scheduler()`. That "
+"function is actually an infinite loop, and it represents a process with PID "
+"0, the swapper process. The thread0 structure, mentioned before, is used to "
+"describe it."
+msgstr ""
+"Системный планировщик sysinit определен в файле [.filename]#sys/vm/"
+"vm_glue.c#, а точка входа для этого объекта — `scheduler()`. Эта функция "
+"фактически представляет собой бесконечный цикл и описывает процесс с PID 0, "
+"известный как процесс swapper. Структура thread0, упомянутая ранее, "
+"используется для его описания."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1642
+msgid ""
+"The first user process, called _init_, is created by the sysinit object "
+"`init`:"
+msgstr ""
+"Первый пользовательский процесс, называемый _init_, создаётся объектом "
+"sysinit `init`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1653
+#, no-wrap
+msgid ""
+"sys/kern/init_main.c:\n"
+"static void\n"
+"create_init(const void *udata __unused)\n"
+"{\n"
+"\tstruct fork_req fr;\n"
+"\tstruct ucred *newcred, *oldcred;\n"
+"\tstruct thread *td;\n"
+"\tint error;\n"
+msgstr ""
+"sys/kern/init_main.c:\n"
+"static void\n"
+"create_init(const void *udata __unused)\n"
+"{\n"
+"\tstruct fork_req fr;\n"
+"\tstruct ucred *newcred, *oldcred;\n"
+"\tstruct thread *td;\n"
+"\tint error;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1686
+#, no-wrap
+msgid ""
+"\tbzero(&fr, sizeof(fr));\n"
+"\tfr.fr_flags = RFFDG | RFPROC | RFSTOPPED;\n"
+"\tfr.fr_procp = &initproc;\n"
+"\terror = fork1(&thread0, &fr);\n"
+"\tif (error)\n"
+"\t\tpanic(\"cannot fork init: %d\\n\", error);\n"
+"\tKASSERT(initproc->p_pid == 1, (\"create_init: initproc->p_pid != 1\"));\n"
+"\t/* divorce init's credentials from the kernel's */\n"
+"\tnewcred = crget();\n"
+"\tsx_xlock(&proctree_lock);\n"
+"\tPROC_LOCK(initproc);\n"
+"\tinitproc->p_flag |= P_SYSTEM | P_INMEM;\n"
+"\tinitproc->p_treeflag |= P_TREE_REAPER;\n"
+"\toldcred = initproc->p_ucred;\n"
+"\tcrcopy(newcred, oldcred);\n"
+"#ifdef MAC\n"
+"\tmac_cred_create_init(newcred);\n"
+"#endif\n"
+"#ifdef AUDIT\n"
+"\taudit_cred_proc1(newcred);\n"
+"#endif\n"
+"\tproc_set_cred(initproc, newcred);\n"
+"\ttd = FIRST_THREAD_IN_PROC(initproc);\n"
+"\tcrcowfree(td);\n"
+"\ttd->td_realucred = crcowget(initproc->p_ucred);\n"
+"\ttd->td_ucred = td->td_realucred;\n"
+"\tPROC_UNLOCK(initproc);\n"
+"\tsx_xunlock(&proctree_lock);\n"
+"\tcrfree(oldcred);\n"
+"\tcpu_fork_kthread_handler(FIRST_THREAD_IN_PROC(initproc), start_init, NULL);\n"
+"}\n"
+"SYSINIT(init, SI_SUB_CREATE_INIT, SI_ORDER_FIRST, create_init, NULL);\n"
+msgstr ""
+"\tbzero(&fr, sizeof(fr));\n"
+"\tfr.fr_flags = RFFDG | RFPROC | RFSTOPPED;\n"
+"\tfr.fr_procp = &initproc;\n"
+"\terror = fork1(&thread0, &fr);\n"
+"\tif (error)\n"
+"\t\tpanic(\"cannot fork init: %d\\n\", error);\n"
+"\tKASSERT(initproc->p_pid == 1, (\"create_init: initproc->p_pid != 1\"));\n"
+"\t/* divorce init's credentials from the kernel's */\n"
+"\tnewcred = crget();\n"
+"\tsx_xlock(&proctree_lock);\n"
+"\tPROC_LOCK(initproc);\n"
+"\tinitproc->p_flag |= P_SYSTEM | P_INMEM;\n"
+"\tinitproc->p_treeflag |= P_TREE_REAPER;\n"
+"\toldcred = initproc->p_ucred;\n"
+"\tcrcopy(newcred, oldcred);\n"
+"#ifdef MAC\n"
+"\tmac_cred_create_init(newcred);\n"
+"#endif\n"
+"#ifdef AUDIT\n"
+"\taudit_cred_proc1(newcred);\n"
+"#endif\n"
+"\tproc_set_cred(initproc, newcred);\n"
+"\ttd = FIRST_THREAD_IN_PROC(initproc);\n"
+"\tcrcowfree(td);\n"
+"\ttd->td_realucred = crcowget(initproc->p_ucred);\n"
+"\ttd->td_ucred = td->td_realucred;\n"
+"\tPROC_UNLOCK(initproc);\n"
+"\tsx_xunlock(&proctree_lock);\n"
+"\tcrfree(oldcred);\n"
+"\tcpu_fork_kthread_handler(FIRST_THREAD_IN_PROC(initproc), start_init, NULL);\n"
+"}\n"
+"SYSINIT(init, SI_SUB_CREATE_INIT, SI_ORDER_FIRST, create_init, NULL);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1692
+msgid ""
+"The function `create_init()` allocates a new process by calling `fork1()`, "
+"but does not mark it runnable. When this new process is scheduled for "
+"execution by the scheduler, the `start_init()` will be called. That "
+"function is defined in [.filename]#init_main.c#. It tries to load and exec "
+"the [.filename]#init# binary, probing [.filename]#/sbin/init# first, then "
+"[.filename]#/sbin/oinit#, [.filename]#/sbin/init.bak#, and finally "
+"[.filename]#/rescue/init#:"
+msgstr ""
+"Функция `create_init()` выделяет новый процесс, вызывая `fork1()`, но не "
+"помечает его как готовый к выполнению. Когда этот новый процесс будет "
+"запланирован для выполнения планировщиком, будет вызвана функция "
+"`start_init()`. Эта функция определена в [.filename]#init_main.c#. Она "
+"пытается загрузить и выполнить бинарный файл [.filename]#init#, сначала "
+"проверяя [.filename]#/sbin/init#, затем [.filename]#/sbin/oinit#, "
+"[.filename]#/sbin/init.bak# и, наконец, [.filename]#/rescue/init#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/boot/_index.adoc:1702
+#, no-wrap
+msgid ""
+"sys/kern/init_main.c:\n"
+"static char init_path[MAXPATHLEN] =\n"
+"#ifdef\tINIT_PATH\n"
+" __XSTRING(INIT_PATH);\n"
+"#else\n"
+" \"/sbin/init:/sbin/oinit:/sbin/init.bak:/rescue/init\";\n"
+"#endif\n"
+msgstr ""
+"sys/kern/init_main.c:\n"
+"static char init_path[MAXPATHLEN] =\n"
+"#ifdef\tINIT_PATH\n"
+" __XSTRING(INIT_PATH);\n"
+"#else\n"
+" \"/sbin/init:/sbin/oinit:/sbin/init.bak:/rescue/init\";\n"
+"#endif\n"
diff --git a/documentation/content/ru/books/arch-handbook/driverbasics/_index.adoc b/documentation/content/ru/books/arch-handbook/driverbasics/_index.adoc
new file mode 100644
index 0000000000..74129e845c
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/driverbasics/_index.adoc
@@ -0,0 +1,347 @@
+---
+description: 'Написание драйверов устройств для FreeBSD'
+next: books/arch-handbook/isa
+params:
+ path: /books/arch-handbook/driverbasics/
+prev: books/arch-handbook/partii
+showBookMenu: true
+tags: ["writing", "device drivers", "KLD", "FreeBSD"]
+title: 'Глава 9. Написание драйверов устройств для FreeBSD'
+weight: 11
+---
+
+[[driverbasics]]
+= Написание драйверов устройств для FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 9
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[driverbasics-intro]]
+== Введение
+
+В этой главе представлено краткое введение в написание драйверов устройств для FreeBSD. Устройство в данном контексте — это термин, используемый в основном для аппаратных компонентов системы, таких как диски, принтеры или графический дисплей с клавиатурой. Драйвер устройства — это программный компонент операционной системы, который управляет конкретным устройством. Также существуют так называемые псевдоустройства, где драйвер эмулирует поведение устройства программно, без использования какого-либо конкретного аппаратного обеспечения. Драйверы устройств могут быть статически скомпилированы в систему или загружены по требованию через механизм динамической загрузки модулей ядра `kld`.
+
+Большинство устройств в операционной системе, подобной UNIX(R), доступны через специальные файлы устройств, также называемые узлами устройств. Эти файлы обычно расположены в каталоге [.filename]#/dev# в иерархии файловой системы.
+
+Драйверы устройств можно условно разделить на две категории: символьные драйверы и драйверы сетевых устройств.
+
+[[driverbasics-kld]]
+== Динамический загрузчик модулей ядра - KLD
+
+Интерфейс kld позволяет системным администраторам динамически добавлять и удалять функциональность в работающей системе. Это позволяет разработчикам драйверов устройств загружать свои новые изменения в работающее ядро без постоянной перезагрузки для проверки изменений.
+
+Интерфейс kld используется с помощью следующих команд:
+
+* `kldload` - загружает новый модуль ядра
+* `kldunload` — выгружает модуль ядра
+* `kldstat` — выводит список загруженных модулей
+
+Каркасная структура модуля ядра
+
+[.programlisting]
+....
+/*
+ * KLD Skeleton
+ * Inspired by Andrew Reiter's Daemonnews article
+ */
+
+#include <sys/types.h>
+#include <sys/systm.h> /* uprintf */
+#include <sys/errno.h>
+#include <sys/param.h> /* defines used in kernel.h */
+#include <sys/module.h>
+#include <sys/kernel.h> /* types used in module initialization */
+
+/*
+ * Load handler that deals with the loading and unloading of a KLD.
+ */
+
+static int
+skel_loader(struct module *m, int what, void *arg)
+{
+ int err = 0;
+
+ switch (what) {
+ case MOD_LOAD: /* kldload */
+ uprintf("Skeleton KLD loaded.\n");
+ break;
+ case MOD_UNLOAD:
+ uprintf("Skeleton KLD unloaded.\n");
+ break;
+ default:
+ err = EOPNOTSUPP;
+ break;
+ }
+ return(err);
+}
+
+/* Declare this module to the rest of the kernel */
+
+static moduledata_t skel_mod = {
+ "skel",
+ skel_loader,
+ NULL
+};
+
+DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);
+....
+
+=== Makefile
+
+FreeBSD предоставляет системный makefile для упрощения компиляции модуля ядра.
+
+[.programlisting]
+....
+SRCS=skeleton.c
+KMOD=skeleton
+
+.include <bsd.kmod.mk>
+....
+
+Запуск `make` с этим makefile создаст файл [.filename]#skeleton.ko#, который можно загрузить в ядро, набрав:
+
+[source, bash]
+....
+# kldload -v ./skeleton.ko
+....
+
+[[driverbasics-char]]
+== Символьные устройства
+
+Драйвер символьного устройства — это драйвер, который передает данные напрямую между устройством и пользовательским процессом. Это наиболее распространенный тип драйвера устройств, и в дереве исходного кода есть множество простых примеров.
+
+Этот простой пример псевдоустройства запоминает все значения, записанные в него, и может затем воспроизводить их при чтении.
+
+.Пример образца драйвера псевдоустройства Echo для FreeBSD 10.X - 12.X
+[example]
+====
+[.programlisting]
+....
+/*
+ * Simple Echo pseudo-device KLD
+ *
+ * Murray Stokely
+ * Søren (Xride) Straarup
+ * Eitan Adler
+ */
+
+#include <sys/types.h>
+#include <sys/systm.h> /* uprintf */
+#include <sys/param.h> /* defines used in kernel.h */
+#include <sys/module.h>
+#include <sys/kernel.h> /* types used in module initialization */
+#include <sys/conf.h> /* cdevsw struct */
+#include <sys/uio.h> /* uio struct */
+#include <sys/malloc.h>
+
+#define BUFFERSIZE 255
+
+/* Function prototypes */
+static d_open_t echo_open;
+static d_close_t echo_close;
+static d_read_t echo_read;
+static d_write_t echo_write;
+
+/* Character device entry points */
+static struct cdevsw echo_cdevsw = {
+ .d_version = D_VERSION,
+ .d_open = echo_open,
+ .d_close = echo_close,
+ .d_read = echo_read,
+ .d_write = echo_write,
+ .d_name = "echo",
+};
+
+struct s_echo {
+ char msg[BUFFERSIZE + 1];
+ int len;
+};
+
+/* vars */
+static struct cdev *echo_dev;
+static struct s_echo *echomsg;
+
+MALLOC_DECLARE(M_ECHOBUF);
+MALLOC_DEFINE(M_ECHOBUF, "echobuffer", "buffer for echo module");
+
+/*
+ * This function is called by the kld[un]load(2) system calls to
+ * determine what actions to take when a module is loaded or unloaded.
+ */
+static int
+echo_loader(struct module *m __unused, int what, void *arg __unused)
+{
+ int error = 0;
+
+ switch (what) {
+ case MOD_LOAD: /* kldload */
+ error = make_dev_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK,
+ &echo_dev,
+ &echo_cdevsw,
+ 0,
+ UID_ROOT,
+ GID_WHEEL,
+ 0600,
+ "echo");
+ if (error != 0)
+ break;
+
+ echomsg = malloc(sizeof(*echomsg), M_ECHOBUF, M_WAITOK |
+ M_ZERO);
+ printf("Echo device loaded.\n");
+ break;
+ case MOD_UNLOAD:
+ destroy_dev(echo_dev);
+ free(echomsg, M_ECHOBUF);
+ printf("Echo device unloaded.\n");
+ break;
+ default:
+ error = EOPNOTSUPP;
+ break;
+ }
+ return (error);
+}
+
+static int
+echo_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused,
+ struct thread *td __unused)
+{
+ int error = 0;
+
+ uprintf("Opened device \"echo\" successfully.\n");
+ return (error);
+}
+
+static int
+echo_close(struct cdev *dev __unused, int fflag __unused, int devtype __unused,
+ struct thread *td __unused)
+{
+
+ uprintf("Closing device \"echo\".\n");
+ return (0);
+}
+
+/*
+ * The read function just takes the buf that was saved via
+ * echo_write() and returns it to userland for accessing.
+ * uio(9)
+ */
+static int
+echo_read(struct cdev *dev __unused, struct uio *uio, int ioflag __unused)
+{
+ size_t amt;
+ int error;
+
+ /*
+ * How big is this read operation? Either as big as the user wants,
+ * or as big as the remaining data. Note that the 'len' does not
+ * include the trailing null character.
+ */
+ amt = MIN(uio->uio_resid, uio->uio_offset >= echomsg->len + 1 ? 0 :
+ echomsg->len + 1 - uio->uio_offset);
+
+ if ((error = uiomove(echomsg->msg, amt, uio)) != 0)
+ uprintf("uiomove failed!\n");
+
+ return (error);
+}
+
+/*
+ * echo_write takes in a character string and saves it
+ * to buf for later accessing.
+ */
+static int
+echo_write(struct cdev *dev __unused, struct uio *uio, int ioflag __unused)
+{
+ size_t amt;
+ int error;
+
+ /*
+ * We either write from the beginning or are appending -- do
+ * not allow random access.
+ */
+ if (uio->uio_offset != 0 && (uio->uio_offset != echomsg->len))
+ return (EINVAL);
+
+ /* This is a new message, reset length */
+ if (uio->uio_offset == 0)
+ echomsg->len = 0;
+
+ /* Copy the string in from user memory to kernel memory */
+ amt = MIN(uio->uio_resid, (BUFFERSIZE - echomsg->len));
+
+ error = uiomove(echomsg->msg + uio->uio_offset, amt, uio);
+
+ /* Now we need to null terminate and record the length */
+ echomsg->len = uio->uio_offset;
+ echomsg->msg[echomsg->len] = 0;
+
+ if (error != 0)
+ uprintf("Write failed: bad address!\n");
+ return (error);
+}
+
+DEV_MODULE(echo, echo_loader, NULL);
+....
+====
+
+Загрузив этот драйвер, попробуйте:
+
+[source, bash]
+....
+# echo -n "Test Data" > /dev/echo
+# cat /dev/echo
+Opened device "echo" successfully.
+Test Data
+Closing device "echo".
+....
+
+Реальные аппаратные устройства описаны в следующей главе.
+
+[[driverbasics-block]]
+== Блочные устройства (удалены)
+
+Другие системы UNIX(R) могут поддерживать второй тип дисковых устройств, известный как блочные устройства. Блочные устройства — это дисковые устройства, для которых ядро предоставляет кэширование. Это кэширование делает блочные устройства практически непригодными или, по крайней мере, опасно ненадёжными. Кэширование изменяет порядок операций записи, лишая приложение возможности точно знать содержимое диска в любой момент времени.
+
+Это делает невозможным предсказуемое и надежное восстановление после сбоев для структур данных на диске (файловых систем, баз данных и т. д.). Поскольку операции записи могут быть отложены, ядро не может сообщить приложению, какая именно операция записи столкнулась с ошибкой, что усугубляет проблему согласованности.
+
+По этой причине ни одно серьезное приложение не полагается на блочные устройства, и фактически почти все приложения, которые обращаются к дискам напрямую, прилагают значительные усилия, чтобы указать, что следует всегда использовать символьные (или "сырые") устройства. Поскольку реализация псевдонимов для каждого диска (раздела) в виде двух устройств с разной семантикой значительно усложняла соответствующий код ядра, FreeBSD отказалась от поддержки кэшируемых дисковых устройств в рамках модернизации инфраструктуры ввода-вывода для дисков.
+
+[[driverbasics-net]]
+== Драйверы сетевых устройств
+
+Драйверы сетевых устройств не используют узлы устройств для доступа. Их выбор основан на других решениях, принимаемых внутри ядра, и вместо вызова open() использование сетевого устройства обычно осуществляется через системный вызов socket(2).
+
+Для получения дополнительной информации см. ifnet(9), исходный текст loopback-устройства.
diff --git a/documentation/content/ru/books/arch-handbook/driverbasics/_index.po b/documentation/content/ru/books/arch-handbook/driverbasics/_index.po
new file mode 100644
index 0000000000..c02c2b0fa1
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/driverbasics/_index.po
@@ -0,0 +1,867 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-09-23 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookdriverbasics_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:14
+#, no-wrap
+msgid "Writing FreeBSD Device Drivers"
+msgstr "Написание драйверов устройств для FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:1
+#, no-wrap
+msgid "Chapter 9. Writing FreeBSD Device Drivers"
+msgstr "Глава 9. Написание драйверов устройств для FreeBSD"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:52
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:55
+msgid ""
+"This chapter provides a brief introduction to writing device drivers for "
+"FreeBSD. A device in this context is a term used mostly for hardware-related "
+"stuff that belongs to the system, like disks, printers, or a graphics "
+"display with its keyboard. A device driver is the software component of the "
+"operating system that controls a specific device. There are also so-called "
+"pseudo-devices where a device driver emulates the behavior of a device in "
+"software without any particular underlying hardware. Device drivers can be "
+"compiled into the system statically or loaded on demand through the dynamic "
+"kernel linker facility `kld'."
+msgstr ""
+"В этой главе представлено краткое введение в написание драйверов устройств "
+"для FreeBSD. Устройство в данном контексте — это термин, используемый в "
+"основном для аппаратных компонентов системы, таких как диски, принтеры или "
+"графический дисплей с клавиатурой. Драйвер устройства — это программный "
+"компонент операционной системы, который управляет конкретным устройством. "
+"Также существуют так называемые псевдоустройства, где драйвер эмулирует "
+"поведение устройства программно, без использования какого-либо конкретного "
+"аппаратного обеспечения. Драйверы устройств могут быть статически "
+"скомпилированы в систему или загружены по требованию через механизм "
+"динамической загрузки модулей ядра `kld`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:57
+msgid ""
+"Most devices in a UNIX(R)-like operating system are accessed through device-"
+"nodes, sometimes also called special files. These files are usually located "
+"under the directory [.filename]#/dev# in the filesystem hierarchy."
+msgstr ""
+"Большинство устройств в операционной системе, подобной UNIX(R), доступны "
+"через специальные файлы устройств, также называемые узлами устройств. Эти "
+"файлы обычно расположены в каталоге [.filename]#/dev# в иерархии файловой "
+"системы."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:59
+msgid ""
+"Device drivers can roughly be broken down into two categories; character and "
+"network device drivers."
+msgstr ""
+"Драйверы устройств можно условно разделить на две категории: символьные "
+"драйверы и драйверы сетевых устройств."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:61
+#, no-wrap
+msgid "Dynamic Kernel Linker Facility - KLD"
+msgstr "Динамический загрузчик модулей ядра - KLD"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:64
+msgid ""
+"The kld interface allows system administrators to dynamically add and remove "
+"functionality from a running system. This allows device driver writers to "
+"load their new changes into a running kernel without constantly rebooting to "
+"test changes."
+msgstr ""
+"Интерфейс kld позволяет системным администраторам динамически добавлять и "
+"удалять функциональность в работающей системе. Это позволяет разработчикам "
+"драйверов устройств загружать свои новые изменения в работающее ядро без "
+"постоянной перезагрузки для проверки изменений."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:66
+msgid "The kld interface is used through:"
+msgstr "Интерфейс kld используется с помощью следующих команд:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:68
+msgid "`kldload` - loads a new kernel module"
+msgstr "`kldload` - загружает новый модуль ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:69
+msgid "`kldunload` - unloads a kernel module"
+msgstr "`kldunload` — выгружает модуль ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:70
+msgid "`kldstat` - lists loaded modules"
+msgstr "`kldstat` — выводит список загруженных модулей"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:72
+msgid "Skeleton Layout of a kernel module"
+msgstr "Каркасная структура модуля ядра"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:79
+#, no-wrap
+msgid ""
+"/*\n"
+" * KLD Skeleton\n"
+" * Inspired by Andrew Reiter's Daemonnews article\n"
+" */\n"
+msgstr ""
+"/*\n"
+" * KLD Skeleton\n"
+" * Inspired by Andrew Reiter's Daemonnews article\n"
+" */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:86
+#, no-wrap
+msgid ""
+"#include <sys/types.h>\n"
+"#include <sys/systm.h> /* uprintf */\n"
+"#include <sys/errno.h>\n"
+"#include <sys/param.h> /* defines used in kernel.h */\n"
+"#include <sys/module.h>\n"
+"#include <sys/kernel.h> /* types used in module initialization */\n"
+msgstr ""
+"#include <sys/types.h>\n"
+"#include <sys/systm.h> /* uprintf */\n"
+"#include <sys/errno.h>\n"
+"#include <sys/param.h> /* defines used in kernel.h */\n"
+"#include <sys/module.h>\n"
+"#include <sys/kernel.h> /* types used in module initialization */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:90
+#, no-wrap
+msgid ""
+"/*\n"
+" * Load handler that deals with the loading and unloading of a KLD.\n"
+" */\n"
+msgstr ""
+"/*\n"
+" * Load handler that deals with the loading and unloading of a KLD.\n"
+" */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:95
+#, no-wrap
+msgid ""
+"static int\n"
+"skel_loader(struct module *m, int what, void *arg)\n"
+"{\n"
+"\tint err = 0;\n"
+msgstr ""
+"static int\n"
+"skel_loader(struct module *m, int what, void *arg)\n"
+"{\n"
+"\tint err = 0;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:109
+#, no-wrap
+msgid ""
+"\tswitch (what) {\n"
+"\tcase MOD_LOAD: /* kldload */\n"
+"\t\tuprintf(\"Skeleton KLD loaded.\\n\");\n"
+"\t\tbreak;\n"
+"\tcase MOD_UNLOAD:\n"
+"\t\tuprintf(\"Skeleton KLD unloaded.\\n\");\n"
+"\t\tbreak;\n"
+"\tdefault:\n"
+"\t\terr = EOPNOTSUPP;\n"
+"\t\tbreak;\n"
+"\t}\n"
+"\treturn(err);\n"
+"}\n"
+msgstr ""
+"\tswitch (what) {\n"
+"\tcase MOD_LOAD: /* kldload */\n"
+"\t\tuprintf(\"Skeleton KLD loaded.\\n\");\n"
+"\t\tbreak;\n"
+"\tcase MOD_UNLOAD:\n"
+"\t\tuprintf(\"Skeleton KLD unloaded.\\n\");\n"
+"\t\tbreak;\n"
+"\tdefault:\n"
+"\t\terr = EOPNOTSUPP;\n"
+"\t\tbreak;\n"
+"\t}\n"
+"\treturn(err);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:111
+#, no-wrap
+msgid "/* Declare this module to the rest of the kernel */\n"
+msgstr "/* Declare this module to the rest of the kernel */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:117
+#, no-wrap
+msgid ""
+"static moduledata_t skel_mod = {\n"
+"\t\"skel\",\n"
+"\tskel_loader,\n"
+"\tNULL\n"
+"};\n"
+msgstr ""
+"static moduledata_t skel_mod = {\n"
+"\t\"skel\",\n"
+"\tskel_loader,\n"
+"\tNULL\n"
+"};\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:119
+#, no-wrap
+msgid "DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);\n"
+msgstr "DECLARE_MODULE(skeleton, skel_mod, SI_SUB_KLD, SI_ORDER_ANY);\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:121
+#, no-wrap
+msgid "Makefile"
+msgstr "Makefile"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:124
+msgid ""
+"FreeBSD provides a system makefile to simplify compiling a kernel module."
+msgstr ""
+"FreeBSD предоставляет системный makefile для упрощения компиляции модуля "
+"ядра."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:129
+#, no-wrap
+msgid ""
+"SRCS=skeleton.c\n"
+"KMOD=skeleton\n"
+msgstr ""
+"SRCS=skeleton.c\n"
+"KMOD=skeleton\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:131
+#, no-wrap
+msgid ".include <bsd.kmod.mk>\n"
+msgstr ".include <bsd.kmod.mk>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:134
+msgid ""
+"Running `make` with this makefile will create a file "
+"[.filename]#skeleton.ko# that can be loaded into the kernel by typing:"
+msgstr ""
+"Запуск `make` с этим makefile создаст файл [.filename]#skeleton.ko#, который "
+"можно загрузить в ядро, набрав:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:138
+#, no-wrap
+msgid "# kldload -v ./skeleton.ko\n"
+msgstr "# kldload -v ./skeleton.ko\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:141
+#, no-wrap
+msgid "Character Devices"
+msgstr "Символьные устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:144
+msgid ""
+"A character device driver is one that transfers data directly to and from a "
+"user process. This is the most common type of device driver and there are "
+"plenty of simple examples in the source tree."
+msgstr ""
+"Драйвер символьного устройства — это драйвер, который передает данные "
+"напрямую между устройством и пользовательским процессом. Это наиболее "
+"распространенный тип драйвера устройств, и в дереве исходного кода есть "
+"множество простых примеров."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:146
+msgid ""
+"This simple example pseudo-device remembers whatever values are written to "
+"it and can then echo them back when read."
+msgstr ""
+"Этот простой пример псевдоустройства запоминает все значения, записанные в "
+"него, и может затем воспроизводить их при чтении."
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:147
+#, no-wrap
+msgid "Example of a Sample Echo Pseudo-Device Driver for FreeBSD 10.X - 12.X"
+msgstr "Пример образца драйвера псевдоустройства Echo для FreeBSD 10.X - 12.X"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:159
+#, no-wrap
+msgid ""
+"/*\n"
+" * Simple Echo pseudo-device KLD\n"
+" *\n"
+" * Murray Stokely\n"
+" * Søren (Xride) Straarup\n"
+" * Eitan Adler\n"
+" */\n"
+msgstr ""
+"/*\n"
+" * Simple Echo pseudo-device KLD\n"
+" *\n"
+" * Murray Stokely\n"
+" * Søren (Xride) Straarup\n"
+" * Eitan Adler\n"
+" */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:168
+#, no-wrap
+msgid ""
+"#include <sys/types.h>\n"
+"#include <sys/systm.h> /* uprintf */\n"
+"#include <sys/param.h> /* defines used in kernel.h */\n"
+"#include <sys/module.h>\n"
+"#include <sys/kernel.h> /* types used in module initialization */\n"
+"#include <sys/conf.h> /* cdevsw struct */\n"
+"#include <sys/uio.h> /* uio struct */\n"
+"#include <sys/malloc.h>\n"
+msgstr ""
+"#include <sys/types.h>\n"
+"#include <sys/systm.h> /* uprintf */\n"
+"#include <sys/param.h> /* defines used in kernel.h */\n"
+"#include <sys/module.h>\n"
+"#include <sys/kernel.h> /* types used in module initialization */\n"
+"#include <sys/conf.h> /* cdevsw struct */\n"
+"#include <sys/uio.h> /* uio struct */\n"
+"#include <sys/malloc.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:170
+#, no-wrap
+msgid "#define BUFFERSIZE 255\n"
+msgstr "#define BUFFERSIZE 255\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:176
+#, no-wrap
+msgid ""
+"/* Function prototypes */\n"
+"static d_open_t echo_open;\n"
+"static d_close_t echo_close;\n"
+"static d_read_t echo_read;\n"
+"static d_write_t echo_write;\n"
+msgstr ""
+"/* Function prototypes */\n"
+"static d_open_t echo_open;\n"
+"static d_close_t echo_close;\n"
+"static d_read_t echo_read;\n"
+"static d_write_t echo_write;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:186
+#, no-wrap
+msgid ""
+"/* Character device entry points */\n"
+"static struct cdevsw echo_cdevsw = {\n"
+"\t.d_version = D_VERSION,\n"
+"\t.d_open = echo_open,\n"
+"\t.d_close = echo_close,\n"
+"\t.d_read = echo_read,\n"
+"\t.d_write = echo_write,\n"
+"\t.d_name = \"echo\",\n"
+"};\n"
+msgstr ""
+"/* Character device entry points */\n"
+"static struct cdevsw echo_cdevsw = {\n"
+"\t.d_version = D_VERSION,\n"
+"\t.d_open = echo_open,\n"
+"\t.d_close = echo_close,\n"
+"\t.d_read = echo_read,\n"
+"\t.d_write = echo_write,\n"
+"\t.d_name = \"echo\",\n"
+"};\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:191
+#, no-wrap
+msgid ""
+"struct s_echo {\n"
+"\tchar msg[BUFFERSIZE + 1];\n"
+"\tint len;\n"
+"};\n"
+msgstr ""
+"struct s_echo {\n"
+"\tchar msg[BUFFERSIZE + 1];\n"
+"\tint len;\n"
+"};\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:195
+#, no-wrap
+msgid ""
+"/* vars */\n"
+"static struct cdev *echo_dev;\n"
+"static struct s_echo *echomsg;\n"
+msgstr ""
+"/* vars */\n"
+"static struct cdev *echo_dev;\n"
+"static struct s_echo *echomsg;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:198
+#, no-wrap
+msgid ""
+"MALLOC_DECLARE(M_ECHOBUF);\n"
+"MALLOC_DEFINE(M_ECHOBUF, \"echobuffer\", \"buffer for echo module\");\n"
+msgstr ""
+"MALLOC_DECLARE(M_ECHOBUF);\n"
+"MALLOC_DEFINE(M_ECHOBUF, \"echobuffer\", \"buffer for echo module\");\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:207
+#, no-wrap
+msgid ""
+"/*\n"
+" * This function is called by the kld[un]load(2) system calls to\n"
+" * determine what actions to take when a module is loaded or unloaded.\n"
+" */\n"
+"static int\n"
+"echo_loader(struct module *m __unused, int what, void *arg __unused)\n"
+"{\n"
+"\tint error = 0;\n"
+msgstr ""
+"/*\n"
+" * This function is called by the kld[un]load(2) system calls to\n"
+" * determine what actions to take when a module is loaded or unloaded.\n"
+" */\n"
+"static int\n"
+"echo_loader(struct module *m __unused, int what, void *arg __unused)\n"
+"{\n"
+"\tint error = 0;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:220
+#, no-wrap
+msgid ""
+"\tswitch (what) {\n"
+"\tcase MOD_LOAD: /* kldload */\n"
+"\t\terror = make_dev_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK,\n"
+"\t\t &echo_dev,\n"
+"\t\t &echo_cdevsw,\n"
+"\t\t 0,\n"
+"\t\t UID_ROOT,\n"
+"\t\t GID_WHEEL,\n"
+"\t\t 0600,\n"
+"\t\t \"echo\");\n"
+"\t\tif (error != 0)\n"
+"\t\t\tbreak;\n"
+msgstr ""
+"\tswitch (what) {\n"
+"\tcase MOD_LOAD: /* kldload */\n"
+"\t\terror = make_dev_p(MAKEDEV_CHECKNAME | MAKEDEV_WAITOK,\n"
+"\t\t &echo_dev,\n"
+"\t\t &echo_cdevsw,\n"
+"\t\t 0,\n"
+"\t\t UID_ROOT,\n"
+"\t\t GID_WHEEL,\n"
+"\t\t 0600,\n"
+"\t\t \"echo\");\n"
+"\t\tif (error != 0)\n"
+"\t\t\tbreak;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:236
+#, no-wrap
+msgid ""
+"\t\techomsg = malloc(sizeof(*echomsg), M_ECHOBUF, M_WAITOK |\n"
+"\t\t M_ZERO);\n"
+"\t\tprintf(\"Echo device loaded.\\n\");\n"
+"\t\tbreak;\n"
+"\tcase MOD_UNLOAD:\n"
+"\t\tdestroy_dev(echo_dev);\n"
+"\t\tfree(echomsg, M_ECHOBUF);\n"
+"\t\tprintf(\"Echo device unloaded.\\n\");\n"
+"\t\tbreak;\n"
+"\tdefault:\n"
+"\t\terror = EOPNOTSUPP;\n"
+"\t\tbreak;\n"
+"\t}\n"
+"\treturn (error);\n"
+"}\n"
+msgstr ""
+"\t\techomsg = malloc(sizeof(*echomsg), M_ECHOBUF, M_WAITOK |\n"
+"\t\t M_ZERO);\n"
+"\t\tprintf(\"Echo device loaded.\\n\");\n"
+"\t\tbreak;\n"
+"\tcase MOD_UNLOAD:\n"
+"\t\tdestroy_dev(echo_dev);\n"
+"\t\tfree(echomsg, M_ECHOBUF);\n"
+"\t\tprintf(\"Echo device unloaded.\\n\");\n"
+"\t\tbreak;\n"
+"\tdefault:\n"
+"\t\terror = EOPNOTSUPP;\n"
+"\t\tbreak;\n"
+"\t}\n"
+"\treturn (error);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:242
+#, no-wrap
+msgid ""
+"static int\n"
+"echo_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused,\n"
+" struct thread *td __unused)\n"
+"{\n"
+"\tint error = 0;\n"
+msgstr ""
+"static int\n"
+"echo_open(struct cdev *dev __unused, int oflags __unused, int devtype __unused,\n"
+" struct thread *td __unused)\n"
+"{\n"
+"\tint error = 0;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:246
+#, no-wrap
+msgid ""
+"\tuprintf(\"Opened device \\\"echo\\\" successfully.\\n\");\n"
+"\treturn (error);\n"
+"}\n"
+msgstr ""
+"\tuprintf(\"Opened device \\\"echo\\\" successfully.\\n\");\n"
+"\treturn (error);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:251
+#, no-wrap
+msgid ""
+"static int\n"
+"echo_close(struct cdev *dev __unused, int fflag __unused, int devtype __unused,\n"
+" struct thread *td __unused)\n"
+"{\n"
+msgstr ""
+"static int\n"
+"echo_close(struct cdev *dev __unused, int fflag __unused, int devtype __unused,\n"
+" struct thread *td __unused)\n"
+"{\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:255
+#, no-wrap
+msgid ""
+"\tuprintf(\"Closing device \\\"echo\\\".\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\tuprintf(\"Closing device \\\"echo\\\".\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:266
+#, no-wrap
+msgid ""
+"/*\n"
+" * The read function just takes the buf that was saved via\n"
+" * echo_write() and returns it to userland for accessing.\n"
+" * uio(9)\n"
+" */\n"
+"static int\n"
+"echo_read(struct cdev *dev __unused, struct uio *uio, int ioflag __unused)\n"
+"{\n"
+"\tsize_t amt;\n"
+"\tint error;\n"
+msgstr ""
+"/*\n"
+" * The read function just takes the buf that was saved via\n"
+" * echo_write() and returns it to userland for accessing.\n"
+" * uio(9)\n"
+" */\n"
+"static int\n"
+"echo_read(struct cdev *dev __unused, struct uio *uio, int ioflag __unused)\n"
+"{\n"
+"\tsize_t amt;\n"
+"\tint error;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:274
+#, no-wrap
+msgid ""
+"\t/*\n"
+"\t * How big is this read operation? Either as big as the user wants,\n"
+"\t * or as big as the remaining data. Note that the 'len' does not\n"
+"\t * include the trailing null character.\n"
+"\t */\n"
+"\tamt = MIN(uio->uio_resid, uio->uio_offset >= echomsg->len + 1 ? 0 :\n"
+"\t echomsg->len + 1 - uio->uio_offset);\n"
+msgstr ""
+"\t/*\n"
+"\t * How big is this read operation? Either as big as the user wants,\n"
+"\t * or as big as the remaining data. Note that the 'len' does not\n"
+"\t * include the trailing null character.\n"
+"\t */\n"
+"\tamt = MIN(uio->uio_resid, uio->uio_offset >= echomsg->len + 1 ? 0 :\n"
+"\t echomsg->len + 1 - uio->uio_offset);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:277
+#, no-wrap
+msgid ""
+"\tif ((error = uiomove(echomsg->msg, amt, uio)) != 0)\n"
+"\t\tuprintf(\"uiomove failed!\\n\");\n"
+msgstr ""
+"\tif ((error = uiomove(echomsg->msg, amt, uio)) != 0)\n"
+"\t\tuprintf(\"uiomove failed!\\n\");\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:280
+#, no-wrap
+msgid ""
+"\treturn (error);\n"
+"}\n"
+msgstr ""
+"\treturn (error);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:290
+#, no-wrap
+msgid ""
+"/*\n"
+" * echo_write takes in a character string and saves it\n"
+" * to buf for later accessing.\n"
+" */\n"
+"static int\n"
+"echo_write(struct cdev *dev __unused, struct uio *uio, int ioflag __unused)\n"
+"{\n"
+"\tsize_t amt;\n"
+"\tint error;\n"
+msgstr ""
+"/*\n"
+" * echo_write takes in a character string and saves it\n"
+" * to buf for later accessing.\n"
+" */\n"
+"static int\n"
+"echo_write(struct cdev *dev __unused, struct uio *uio, int ioflag __unused)\n"
+"{\n"
+"\tsize_t amt;\n"
+"\tint error;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:297
+#, no-wrap
+msgid ""
+"\t/*\n"
+"\t * We either write from the beginning or are appending -- do\n"
+"\t * not allow random access.\n"
+"\t */\n"
+"\tif (uio->uio_offset != 0 && (uio->uio_offset != echomsg->len))\n"
+"\t\treturn (EINVAL);\n"
+msgstr ""
+"\t/*\n"
+"\t * We either write from the beginning or are appending -- do\n"
+"\t * not allow random access.\n"
+"\t */\n"
+"\tif (uio->uio_offset != 0 && (uio->uio_offset != echomsg->len))\n"
+"\t\treturn (EINVAL);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:301
+#, no-wrap
+msgid ""
+"\t/* This is a new message, reset length */\n"
+"\tif (uio->uio_offset == 0)\n"
+"\t\techomsg->len = 0;\n"
+msgstr ""
+"\t/* This is a new message, reset length */\n"
+"\tif (uio->uio_offset == 0)\n"
+"\t\techomsg->len = 0;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:304
+#, no-wrap
+msgid ""
+"\t/* Copy the string in from user memory to kernel memory */\n"
+"\tamt = MIN(uio->uio_resid, (BUFFERSIZE - echomsg->len));\n"
+msgstr ""
+"\t/* Copy the string in from user memory to kernel memory */\n"
+"\tamt = MIN(uio->uio_resid, (BUFFERSIZE - echomsg->len));\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:306
+#, no-wrap
+msgid "\terror = uiomove(echomsg->msg + uio->uio_offset, amt, uio);\n"
+msgstr "\terror = uiomove(echomsg->msg + uio->uio_offset, amt, uio);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:310
+#, no-wrap
+msgid ""
+"\t/* Now we need to null terminate and record the length */\n"
+"\techomsg->len = uio->uio_offset;\n"
+"\techomsg->msg[echomsg->len] = 0;\n"
+msgstr ""
+"\t/* Now we need to null terminate and record the length */\n"
+"\techomsg->len = uio->uio_offset;\n"
+"\techomsg->msg[echomsg->len] = 0;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:315
+#, no-wrap
+msgid ""
+"\tif (error != 0)\n"
+"\t\tuprintf(\"Write failed: bad address!\\n\");\n"
+"\treturn (error);\n"
+"}\n"
+msgstr ""
+"\tif (error != 0)\n"
+"\t\tuprintf(\"Write failed: bad address!\\n\");\n"
+"\treturn (error);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:317
+#, no-wrap
+msgid "DEV_MODULE(echo, echo_loader, NULL);\n"
+msgstr "DEV_MODULE(echo, echo_loader, NULL);\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:321
+msgid "With this driver loaded try:"
+msgstr "Загрузив этот драйвер, попробуйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:329
+#, no-wrap
+msgid ""
+"# echo -n \"Test Data\" > /dev/echo\n"
+"# cat /dev/echo\n"
+"Opened device \"echo\" successfully.\n"
+"Test Data\n"
+"Closing device \"echo\".\n"
+msgstr ""
+"# echo -n \"Test Data\" > /dev/echo\n"
+"# cat /dev/echo\n"
+"Opened device \"echo\" successfully.\n"
+"Test Data\n"
+"Closing device \"echo\".\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:332
+msgid "Real hardware devices are described in the next chapter."
+msgstr "Реальные аппаратные устройства описаны в следующей главе."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:334
+#, no-wrap
+msgid "Block Devices (Are Gone)"
+msgstr "Блочные устройства (удалены)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:337
+msgid ""
+"Other UNIX(R) systems may support a second type of disk device known as "
+"block devices. Block devices are disk devices for which the kernel provides "
+"caching. This caching makes block-devices almost unusable, or at least "
+"dangerously unreliable. The caching will reorder the sequence of write "
+"operations, depriving the application of the ability to know the exact disk "
+"contents at any one instant in time."
+msgstr ""
+"Другие системы UNIX(R) могут поддерживать второй тип дисковых устройств, "
+"известный как блочные устройства. Блочные устройства — это дисковые "
+"устройства, для которых ядро предоставляет кэширование. Это кэширование "
+"делает блочные устройства практически непригодными или, по крайней мере, "
+"опасно ненадёжными. Кэширование изменяет порядок операций записи, лишая "
+"приложение возможности точно знать содержимое диска в любой момент времени."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:339
+msgid ""
+"This makes predictable and reliable crash recovery of on-disk data "
+"structures (filesystems, databases, etc.) impossible. Since writes may be "
+"delayed, there is no way the kernel can report to the application which "
+"particular write operation encountered a write error, this further compounds "
+"the consistency problem."
+msgstr ""
+"Это делает невозможным предсказуемое и надежное восстановление после сбоев "
+"для структур данных на диске (файловых систем, баз данных и т. д.). "
+"Поскольку операции записи могут быть отложены, ядро не может сообщить "
+"приложению, какая именно операция записи столкнулась с ошибкой, что "
+"усугубляет проблему согласованности."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:341
+msgid ""
+"For this reason, no serious applications rely on block devices, and in fact, "
+"almost all applications which access disks directly take great pains to "
+"specify that character (or \"raw\") devices should always be used. As the "
+"implementation of the aliasing of each disk (partition) to two devices with "
+"different semantics significantly complicated the relevant kernel code, "
+"FreeBSD dropped support for cached disk devices as part of the modernization "
+"of the disk I/O infrastructure."
+msgstr ""
+"По этой причине ни одно серьезное приложение не полагается на блочные "
+"устройства, и фактически почти все приложения, которые обращаются к дискам "
+"напрямую, прилагают значительные усилия, чтобы указать, что следует всегда "
+"использовать символьные (или \"сырые\") устройства. Поскольку реализация "
+"псевдонимов для каждого диска (раздела) в виде двух устройств с разной "
+"семантикой значительно усложняла соответствующий код ядра, FreeBSD "
+"отказалась от поддержки кэшируемых дисковых устройств в рамках модернизации "
+"инфраструктуры ввода-вывода для дисков."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:343
+#, no-wrap
+msgid "Network Drivers"
+msgstr "Драйверы сетевых устройств"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:346
+msgid ""
+"Drivers for network devices do not use device nodes in order to be accessed. "
+"Their selection is based on other decisions made inside the kernel and "
+"instead of calling open(), use of a network device is generally introduced "
+"by using the system call socket(2)."
+msgstr ""
+"Драйверы сетевых устройств не используют узлы устройств для доступа. Их "
+"выбор основан на других решениях, принимаемых внутри ядра, и вместо вызова "
+"open() использование сетевого устройства обычно осуществляется через "
+"системный вызов socket(2)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/driverbasics/_index.adoc:347
+msgid "For more information see ifnet(9), the source of the loopback device."
+msgstr ""
+"Для получения дополнительной информации см. ifnet(9), исходный текст "
+"loopback-устройства."
diff --git a/documentation/content/ru/books/arch-handbook/isa/_index.adoc b/documentation/content/ru/books/arch-handbook/isa/_index.adoc
new file mode 100644
index 0000000000..c2fead3747
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/isa/_index.adoc
@@ -0,0 +1,1121 @@
+---
+description: 'Драйверы устройств ISA'
+next: books/arch-handbook/pci
+params:
+ path: /books/arch-handbook/isa/
+prev: books/arch-handbook/driverbasics
+showBookMenu: true
+tags: ["ISA", "device drivers", "FreeBSD"]
+title: 'Глава 10. Драйверы устройств ISA'
+weight: 12
+---
+
+[[isa-driver]]
+= Драйверы устройств ISA
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 10
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[isa-driver-synopsis]]
+== Обзор
+
+Эта глава знакомит с вопросами, относящимся к написанию драйвера устройства ISA. Представленный здесь псевдокод довольно детализирован и напоминает реальный код, но всё же остаётся псевдокодом. Он избегает деталей, не относящихся к теме обсуждения. Реальные примеры можно найти в исходном коде настоящих драйверов. В частности, драйверы `ep` и `aha` являются хорошими источниками информации.
+
+[[isa-driver-basics]]
+== Основная информация
+
+Типичному драйверу ISA могут потребоваться следующие включаемые файлы:
+
+[.programlisting]
+....
+#include <sys/module.h>
+#include <sys/bus.h>
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <isa/isavar.h>
+#include <isa/pnpvar.h>
+....
+
+Они описывают особенности, специфичные для подсистемы ISA и обобщенной шины.
+
+Подсистема шины реализована в объектно-ориентированном стиле, её основные структуры доступны через методы, связанные с объектами.
+
+Список методов шины, реализуемых драйвером ISA, аналогичен списку для любой другой шины. Для гипотетического драйвера с именем "xxx" они будут:
+
+* `static void xxx_isa_identify (driver_t *, device_t);` Обычно используется для драйверов шины, а не для драйверов устройств. Однако для устройств ISA этот метод может иметь особое применение: если устройство предоставляет специфический (не PnP) способ автоматического обнаружения устройств, эта процедура может его реализовывать.
+* `static int xxx_isa_probe (device_t dev);` Проверка наличия устройства в известном (или PnP) расположении. Эта процедура также может учитывать автоопределение параметров, специфичных для устройства, в случае частично настроенных устройств.
+* `static int xxx_isa_attach (device_t dev);` Подключение и инициализация устройства.
+* `static int xxx_isa_detach (device_t dev);` Отсоединение устройства перед выгрузкой модуля драйвера.
+* `static int xxx_isa_shutdown (device_t dev);` Выполняет завершение работы устройства перед выключением системы.
+* `static int xxx_isa_suspend (device_t dev);` Приостанавливает устройство перед переходом системы в энергосберегающий режим. Также может прервать переход в энергосберегающий режим.
+* `static int xxx_isa_resume (device_t dev);` Возобновляет активность устройства после возврата из энергосберегающего состояния.
+
+`xxx_isa_probe()` и `xxx_isa_attach()` являются обязательными, остальные процедуры опциональны и зависят от потребностей устройства.
+
+Драйвер связан с системой следующим набором описаний.
+
+[.programlisting]
+....
+ /* table of supported bus methods */
+ static device_method_t xxx_isa_methods[] = {
+ /* list all the bus method functions supported by the driver */
+ /* omit the unsupported methods */
+ DEVMETHOD(device_identify, xxx_isa_identify),
+ DEVMETHOD(device_probe, xxx_isa_probe),
+ DEVMETHOD(device_attach, xxx_isa_attach),
+ DEVMETHOD(device_detach, xxx_isa_detach),
+ DEVMETHOD(device_shutdown, xxx_isa_shutdown),
+ DEVMETHOD(device_suspend, xxx_isa_suspend),
+ DEVMETHOD(device_resume, xxx_isa_resume),
+
+ DEVMETHOD_END
+ };
+
+ static driver_t xxx_isa_driver = {
+ "xxx",
+ xxx_isa_methods,
+ sizeof(struct xxx_softc),
+ };
+
+ static devclass_t xxx_devclass;
+
+ DRIVER_MODULE(xxx, isa, xxx_isa_driver, xxx_devclass,
+ load_function, load_argument);
+....
+
+Здесь структура `xxx_softc` — это специфичная для устройства структура, которая содержит приватные данные драйвера и дескрипторы ресурсов драйвера. Код шины автоматически выделяет один дескриптор softc для каждого устройства по мере необходимости.
+
+Если драйвер реализован в виде загружаемого модуля, то `load_function()` вызывается для выполнения специфичной для драйвера инициализации или очистки при загрузке или выгрузке драйвера, а `load_argument` передаётся в качестве одного из её аргументов. Если драйвер не поддерживает динамическую загрузку (другими словами, он всегда должен быть связан с ядром), то эти значения должны быть установлены в 0, и последнее определение будет выглядеть следующим образом:
+
+[.programlisting]
+....
+ DRIVER_MODULE(xxx, isa, xxx_isa_driver,
+ xxx_devclass, 0, 0);
+....
+
+Если драйвер предназначен для устройства с поддержкой PnP, то должна быть определена таблица поддерживаемых PnP ID. Таблица состоит из списка PnP ID, поддерживаемых этим драйвером, и удобочитаемых описаний типов аппаратного обеспечения и моделей, имеющих эти ID. Это выглядит следующим образом:
+
+[.programlisting]
+....
+ static struct isa_pnp_id xxx_pnp_ids[] = {
+ /* a line for each supported PnP ID */
+ { 0x12345678, "Our device model 1234A" },
+ { 0x12345679, "Our device model 1234B" },
+ { 0, NULL }, /* end of table */
+ };
+....
+
+Если драйвер не поддерживает устройства PnP, ему все равно нужна пустая таблица идентификаторов PnP, например:
+
+[.programlisting]
+....
+ static struct isa_pnp_id xxx_pnp_ids[] = {
+ { 0, NULL }, /* end of table */
+ };
+....
+
+[[isa-driver-device-t]]
+== Указатель `device_t`
+
+`device_t` — это тип указателя на структуру устройства. Здесь мы рассматриваем только методы, представляющие интерес с точки зрения разработчика драйверов устройств. Методы для работы со значениями в структуре устройства следующие:
+
+* `device_t device_get_parent(dev)` Получить родительскую шину устройства.
+* `driver_t device_get_driver(dev)` Получить указатель на структуру его драйвера.
+* `char *device_get_name(dev)` Получить имя драйвера, например `"xxx"` в нашем примере.
+* `int device_get_unit(dev)` Получить номер устройства (устройства нумеруются с 0 для устройств, связанных с каждым драйвером).
+* `char *device_get_nameunit(dev)` Получить имя устройства, включая номер юнита, например, "xxx0", "xxx1" и так далее.
+* `char *device_get_desc(dev)` Получить описание устройства. Обычно оно описывает точную модель устройства в удобочитаемом виде.
+* `device_set_desc(dev, desc)` Установить описание. Это заставляет описание устройства указывать на строку desc, которая не может быть освобождена или изменена после этого.
+* `device_set_desc_copy(dev, desc)` Установить описание. Описание копируется во внутренний динамически выделяемый буфер, поэтому строка desc может быть изменена впоследствии без негативных последствий.
+* `void *device_get_softc(dev)` Получить указатель на дескриптор устройства (структура `xxx_softc`), связанный с данным устройством.
+* `u_int32_t device_get_flags(dev)` Получить флаги, указанные для устройства в файле конфигурации.
+
+Функция для удобства `device_printf(dev, fmt, ...)` может использоваться для вывода сообщений из драйвера устройства. Она автоматически добавляет имя устройства и двоеточие перед сообщением.
+
+Методы device_t реализованы в файле [.filename]#kern/bus_subr.c#.
+
+[[isa-driver-config]]
+== Файл конфигурации и порядок определения и проверки при автоматической настройке
+
+Устройства ISA описываются в файле конфигурации ядра следующим образом:
+
+[.programlisting]
+....
+device xxx0 at isa? port 0x300 irq 10 drq 5
+ iomem 0xd0000 flags 0x1 sensitive
+....
+
+Значения порта, IRQ и т. д. преобразуются в ресурсы, связанные с устройством. Они являются необязательными, в зависимости от потребностей устройства и его способностей к автонастройке. Например, некоторым устройствам вообще не нужен DRQ, а некоторые позволяют драйверу читать настройку IRQ из портов конфигурации устройства. Если в машине несколько шин ISA, точная шина может быть указана в строке конфигурации, например `isa0` или `isa1`, иначе устройство будет искаться на всех шинах ISA.
+
+`sensitive` — это ресурс, указывающий, что данное устройство должно быть проверено перед всеми нечувствительными устройствами. Он поддерживается, но, похоже, не используется ни в одном текущем драйвере.
+
+Для устаревших устройств ISA во многих случаях драйверы всё ещё могут определять параметры конфигурации. Однако каждое устройство, которое необходимо настроить в системе, должно иметь строку конфигурации. Если в системе установлено два устройства одного типа, но для соответствующего драйвера есть только одна строка конфигурации, например:
+[.programlisting]
+....
+device xxx0 at isa?
+....
+ тогда будет настроено только одно устройство.
+
+Однако для устройств, поддерживающих автоматическую идентификацию с помощью Plug-n-Play или какого-либо проприетарного протокола, достаточно одной строки конфигурации для настройки всех устройств в системе, как в примере выше или просто:
+
+[.programlisting]
+....
+device xxx at isa?
+....
+
+Если драйвер поддерживает как автоматически определяемые, так и устаревшие устройства, и оба типа установлены одновременно в одной машине, то достаточно описать в конфигурационном файле только устаревшие устройства. Автоматически определяемые устройства будут добавлены автоматически.
+
+При автоматической настройке шины ISA события происходят в следующем порядке:
+
+Все процедуры идентификации драйверов (включая процедуру идентификации PnP, которая определяет все устройства PnP) вызываются в случайном порядке. Когда они идентифицируют устройства, они добавляют их в список на шине ISA. Обычно процедуры идентификации драйверов связывают свои драйверы с новыми устройствами. Процедура идентификации PnP пока не знает о других драйверах, поэтому не связывает ни один из них с новыми устройствами, которые она добавляет.
+
+Устройства PnP переводятся в режим сна с использованием протокола PnP, чтобы предотвратить их обнаружение как устаревших устройств.
+
+Вызываются процедуры обнаружения для устройств, не поддерживающих PnP, помеченных как `sensitive`. Если процедура обнаружения для устройства завершилась успешно, вызывается процедура присоединения для него.
+
+Вызов процедур обнаружения и присоединения всех устройств, не поддерживающих PNP, выполняется аналогичным образом.
+
+Устройства PnP выводятся из состояния сна и получают запрошенные ресурсы: диапазоны адресов ввода-вывода и памяти, IRQ и DRQ, причем все они не конфликтуют с подключенными устаревшими устройствами.
+
+Затем для каждого устройства PnP вызываются процедуры обнаружения всех присутствующих драйверов ISA. Первый драйвер, который заявит о поддержке устройства, будет присоединен. Возможна ситуация, когда несколько драйверов заявят о поддержке устройства с разным приоритетом; в этом случае побеждает драйвер с наивысшим приоритетом. Процедуры обнаружения должны вызывать `ISA_PNP_PROBE()` для сравнения фактического PnP ID со списком ID, поддерживаемых драйвером, и если ID отсутствует в таблице, возвращать ошибку. Это означает, что абсолютно каждый драйвер, даже те, которые не поддерживают никакие PnP устройства, должны вызывать `ISA_PNP_PROBE()`, хотя бы с пустой таблицей PnP ID, чтобы возвращать ошибку для неизвестных PnP устройств.
+
+Процедура обнаружения возвращает положительное значение (код ошибки) в случае ошибки, ноль или отрицательное значение в случае успеха.
+
+Отрицательные возвращаемые значения используются, когда устройство PnP поддерживает несколько интерфейсов. Например, старый совместимый интерфейс и новый расширенный интерфейс, которые поддерживаются разными драйверами. В этом случае оба драйвера обнаружат устройство. Драйвер, возвращающий большее значение в процедуре обнаружения, получает приоритет (другими словами, драйвер, возвращающий 0, имеет наивысший приоритет, возвращающий -1 — следующий, возвращающий -2 — за ним и так далее). В результате устройства, поддерживающие только старый интерфейс, будут обрабатываться старым драйвером (который должен возвращать -1 из процедуры обнаружения), тогда как устройства, поддерживающие также новый интерфейс, будут обрабатываться новым драйвером (который должен возвращать 0 из процедуры обнаружения). Если несколько драйверов возвращают одинаковое значение, побеждает тот, который был вызван первым. Таким образом, если драйвер возвращает значение 0, он может быть уверен, что выиграл арбитраж приоритетов.
+
+Процедуры идентификации, специфичные для устройства, также могут назначать устройству не драйвер, а класс драйверов. Затем все драйверы в этом классе проверяются на совместимость с устройством, как в случае с PnP. Эта возможность не реализована ни в одном существующем драйвере и далее в этом документе не рассматривается.
+
+Поскольку устройства PnP отключены при проверке устаревших устройств, они не будут присоединены дважды (один раз как устаревшие и один раз как PnP). Однако в случае процедур идентификации, зависящих от устройства, ответственность за то, чтобы одно и то же устройство не было присоединено драйвером дважды (один раз как настроенное пользователем устаревшее и один раз как автоматически идентифицированное), лежит на драйвере.
+
+Еще одно практическое следствие для автоматически определяемых устройств (как PnP, так и специфичных для устройства) заключается в том, что флаги не могут быть переданы им из файла конфигурации ядра. Поэтому они либо не должны использовать флаги вообще, либо использовать флаги из устройства unit 0 для всех автоматически определяемых устройств, либо использовать интерфейс sysctl вместо флагов.
+
+Другие нестандартные конфигурации могут быть реализованы путем прямого доступа к ресурсам конфигурации с использованием функций семейств `resource_query_*()` и `resource_*_value()`. Их реализации находятся в [.filename]#kern/subr_bus.c#. Примеры такого использования есть в старом драйвере диска IDE [.filename]#i386/isa/wd.c#. Однако стандартные методы конфигурации всегда должны быть предпочтительны. Оставьте разбор ресурсов конфигурации коду настройки шины.
+
+[[isa-driver-resources]]
+== Ресурсы
+
+Информация, которую пользователь вводит в файл конфигурации ядра, обрабатывается и передаётся ядру в виде ресурсов конфигурации. Эта информация анализируется кодом конфигурации шины и преобразуется в значение структуры `device_t` и связанные с ней ресурсы шины. Драйверы могут напрямую обращаться к ресурсам конфигурации, используя функции `resource_*` для более сложных случаев конфигурации. Однако, как правило, в этом нет необходимости, и это не рекомендуется, поэтому данный вопрос далее не рассматривается.
+
+Ресурсы шины связаны с каждым устройством. Они идентифицируются по типу и номеру внутри типа. Для шины ISA определены следующие типы:
+
+* _SYS_RES_IRQ_ - номер прерывания
+* _SYS_RES_DRQ_ - номер канала ISA DMA
+* _SYS_RES_MEMORY_ - диапазон памяти устройства, отображенный в системное адресное пространство
+* _SYS_RES_IOPORT_ - диапазон регистров ввода-вывода устройства
+
+Перечисление внутри типов начинается с 0, поэтому если устройство имеет две области памяти, оно будет иметь ресурсы типа `SYS_RES_MEMORY` с номерами 0 и 1. Тип ресурса не связан с типом языка C, все значения ресурсов имеют тип `unsigned long` в языке C и должны быть приведены по мере необходимости. Номера ресурсов не обязательно должны быть последовательными, хотя для ISA они обычно таковыми являются. Допустимые номера ресурсов для устройств ISA:
+
+[.programlisting]
+....
+ IRQ: 0-1
+ DRQ: 0-1
+ MEMORY: 0-3
+ IOPORT: 0-7
+....
+
+Все ресурсы представлены в виде диапазонов с начальным значением и количеством. Для ресурсов IRQ и DRQ количество обычно равно 1. Значения для памяти относятся к физическим адресам.
+
+Три типа действий могут выполняться над ресурсами:
+
+* Установка — set/get
+* Выделение — allocate/release
+* Активация — activate/deactivate
+
+Установка задает диапазон, используемый ресурсом. Выделение резервирует запрошенный диапазон, чтобы никакой другой драйвер не смог его зарезервировать (и проверяет, что никакой другой драйвер уже не зарезервировал этот диапазон). Активация делает ресурс доступным для драйвера, выполняя все необходимые для этого действия (например, для памяти это может быть отображение в виртуальное адресное пространство ядра).
+
+Функции для управления ресурсами:
+
+* `int bus_set_resource(device_t dev, int type, int rid, u_long start, u_long count)`
++
+Устанавливает диапазон для ресурса. Возвращает 0 при успешном выполнении, в противном случае — код ошибки. Обычно эта функция возвращает ошибку только в том случае, если одно из значений `type`, `rid`, `start` или `count` выходит за пределы допустимого диапазона.
+
+** dev - устройство драйвера
+** тип - тип ресурса, SYS_RES_*
+** rid - номер ресурса (ID) в пределах типа
+** начало, количество - диапазон ресурсов
+
+* `int bus_get_resource(device_t dev, int type, int rid, u_long *startp, u_long *countp)`
++
+Получает диапазон ресурса. Возвращает 0 при успехе, код ошибки, если ресурс ещё не определён.
+* `u_long bus_get_resource_start(device_t dev, int type, int rid) и u_long bus_get_resource_count (device_t dev, int type, int rid)`
++
+Удобные функции для получения только начала или количества. Возвращают 0 в случае ошибки, поэтому если начало ресурса может законно содержать 0, невозможно определить, является ли значение 0 или произошла ошибка. К счастью, ни один ресурс ISA для дополнительных драйверов не может иметь начальное значение, равное 0.
+* `void bus_delete_resource(device_t dev, int type, int rid)`
++
+Удаляет ресурс, делает его неопределённым.
+* `struct resource * bus_alloc_resource(device_t dev, int type, int *rid, u_long start, u_long end, u_long count, u_int flags)`
++
+Выделяет ресурс как диапазон значений count, не выделенных никем другим, где-то между start и end. Увы, выравнивание не поддерживается. Если ресурс ещё не был установлен, он автоматически создаётся. Специальные значения start равное 0 и end равное ~0 (все единицы) означают, что должны использоваться фиксированные значения, ранее установленные `bus_set_resource()`: start и count как есть, а end=(start+count). В этом случае, если ресурс не был определён ранее, возвращается ошибка. Хотя rid передаётся по ссылке, он нигде не устанавливается кодом выделения ресурсов шины ISA. Другие шины могут использовать иной подход и изменять его.
+
+Флаги представляют собой битовую карту. Интересные для вызывающей стороны флаги:
+
+* _RF_ACTIVE_ - приводит к автоматической активации ресурса после его выделения.
+* _RF_SHAREABLE_ - ресурс может использоваться одновременно несколькими драйверами.
+* _RF_TIMESHARE_ - ресурс может разделяться по времени несколькими драйверами, т.е. выделяться одновременно многими, но активироваться только одним в любой момент времени.
+* Возвращает 0 при ошибке. Выделенные значения могут быть получены из возвращённого дескриптора с использованием методов `rhand_*()`.
+* `int bus_release_resource(device_t dev, int type, int rid, struct resource *r)`
+* Освобождает ресурс, r — это дескриптор, возвращённый `bus_alloc_resource()`. Возвращает 0 при успехе, код ошибки в противном случае.
+* `int bus_activate_resource(device_t dev, int type, int rid, struct resource *r) int bus_deactivate_resource(device_t dev, int type, int rid, struct resource *r)`
+* Активирует или деактивирует ресурс. Возвращает 0 при успехе, в противном случае — код ошибки. Если ресурс разделяемый и в данный момент активирован другим драйвером, возвращается `EBUSY`.
+* `int bus_setup_intr(device_t dev, struct resource *r, int flags, driver_intr_t *handler, void *arg, void **cookiep) int bus_teardown_intr(device_t dev, struct resource *r, void *cookie)`
+* Связывает или разрывает связь обработчика прерывания с устройством. Возвращает 0 при успехе, код ошибки в противном случае.
+* r - активированный обработчик ресурсов, описывающий IRQ
++
+flags - уровень приоритета прерывания, один из:
+
+** `INTR_TYPE_TTY` - терминалы и другие аналогичные символьные устройства. Для их маскировки используйте `spltty()`.
+** `(INTR_TYPE_TTY | INTR_TYPE_FAST)` - терминальные устройства с малым буфером ввода, критичные к потере данных на входе (например, устаревшие последовательные порты). Для их маскирования используйте `spltty()`.
+** `INTR_TYPE_BIO` - блочные устройства, за исключением тех, что подключены к контроллерам CAM. Для их маскирования используйте `splbio()`.
+** `INTR_TYPE_CAM` - контроллеры шины CAM (Common Access Method). Для их маскирования используйте `splcam()`.
+** `INTR_TYPE_NET` - контроллеры сетевых интерфейсов. Для их маскирования используйте `splimp()`.
+** `INTR_TYPE_MISC` — прочие устройства. Нет другого способа их маскировки, кроме `splhigh()`, который маскирует все прерывания.
+
+Когда обработчик прерывания выполняется, все другие прерывания, соответствующие его уровню приоритета, будут заблокированы. Единственное исключение — уровень MISC, для которого никакие другие прерывания не блокируются и который сам не блокируется другими прерываниями.
+
+* _handler_ - указатель на функцию-обработчик, тип driver_intr_t определён как `void driver_intr_t(void *)`
+* _arg_ - аргумент, передаваемый обработчику для идентификации конкретного устройства. Приводится обработчиком от void* к фактическому типу. Старая конвенция для обработчиков прерываний ISA предполагала использование номера устройства в качестве аргумента, новая (рекомендуемая) конвенция предполагает использование указателя на структуру softc устройства.
+* _cookie[p]_ - значение, полученное из `setup()`, используется для идентификации обработчика при передаче в `teardown()`
+
+Определены несколько методов для работы с обработчиками ресурсов (struct resource *). Вот те из них, которые представляют интерес для разработчиков драйверов устройств:
+
+* `u_long rman_get_start(r) u_long rman_get_end(r)` Получают начало и конец выделенного диапазона ресурсов.
+* `void *rman_get_virtual(r)` Получает виртуальный адрес активированного ресурса памяти.
+
+[[isa-driver-busmem]]
+== Отображение памяти шины
+
+Во многих случаях данные передаются между драйвером и устройством через память. Возможны два варианта:
+
+(а) память расположена на карте устройства
+
+(b) память — это основная память компьютера
+
+В случае (a) драйвер всегда копирует данные между памятью на карте и основной памятью по мере необходимости. Для отображения памяти на карте в виртуальное адресное пространство ядра физический адрес и длина памяти на карте должны быть определены как ресурс `SYS_RES_MEMORY`. Этот ресурс может быть затем выделен и активирован, а его виртуальный адрес получен с помощью `rman_get_virtual()`. Более старые драйверы использовали для этой цели функцию `pmap_mapdev()`, которую больше не следует использовать напрямую. Теперь это один из внутренних шагов активации ресурса.
+
+Большинство ISA-карт имеют память, настроенную на физическое расположение в диапазоне 640 КБ–1 МБ. Некоторые ISA-карты требуют большего диапазона памяти, который должен быть размещён ниже 16 МБ (из-за 24-битного ограничения адресации на шине ISA). В таком случае, если в машине больше памяти, чем начальный адрес памяти устройства (другими словами, они пересекаются), необходимо настроить "дыру" в памяти по диапазону адресов, используемому устройствами. Многие BIOS позволяют настроить "дыру" в памяти размером 1 МБ, начиная с 14 МБ или 15 МБ. FreeBSD корректно обрабатывает "дыры" в памяти, если BIOS правильно их сообщает (эта функция может не работать в старых BIOS).
+
+В случае (b) только адрес данных отправляется на устройство, и устройство использует DMA для фактического доступа к данным в основной памяти. Существуют два ограничения: во-первых, карты ISA могут обращаться только к памяти ниже 16 МБ. Во-вторых, непрерывные страницы в виртуальном адресном пространстве могут не быть непрерывными в физическом адресном пространстве, поэтому устройству может потребоваться выполнять операции scatter/gather. Подсистема шины предоставляет готовые решения для некоторых из этих проблем, остальное должно быть реализовано самими драйверами.
+
+Для выделения памяти DMA используются две структуры: `bus_dma_tag_t` и `bus_dmamap_t`. Тег (`tag`) описывает свойства, необходимые для памяти DMA. Карта (`map`) представляет собой блок памяти, выделенный в соответствии с этими свойствами. С одним тегом может быть связано несколько карт.
+
+Теги организованы в иерархию в виде дерева с наследованием свойств. Дочерний тег наследует все требования родительского тега и может делать их более строгими, но никогда более мягкими.
+
+Обычно создается один корневой тег (без родителя) для каждого устройства. Если для каждого устройства требуется несколько областей памяти с разными требованиями, то для каждой из них может быть создан тег как дочерний по отношению к родительскому тегу.
+
+Теги могут быть использованы для создания карты двумя способами.
+
+Сначала может быть выделен (а затем освобожден) блок непрерывной памяти, соответствующий требованиям тега. Обычно это используется для выделения относительно долгоживущих областей памяти для взаимодействия с устройством. Загрузка такой памяти в карту тривиальна: она всегда рассматривается как один блок в соответствующем диапазоне физической памяти.
+
+Второй момент: произвольная область виртуальной памяти может быть загружена в карту. Каждая страница этой памяти будет проверяться на соответствие требованиям карты. Если она соответствует, то остается на своем исходном месте. Если нет, то выделяется новая соответствующая промежуточная страница (bounce page), которая используется как промежуточное хранилище. При записи данных с несоответствующих исходных страниц они сначала копируются на свои промежуточные страницы, а затем передаются с промежуточных страниц на устройство. При чтении данные поступают с устройства на промежуточные страницы, а затем копируются на свои несоответствующие исходные страницы. Процесс копирования между исходными и промежуточными страницами называется синхронизацией. Обычно это используется для каждой передачи: буфер для каждой передачи загружается, передача выполняется, и буфер выгружается.
+
+Функции, работающие с памятью DMA:
+
+* `int bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, bus_size_t boundary, bus_addr_t lowaddr, bus_addr_t highaddr, bus_dma_filter_t *filter, void *filterarg, bus_size_t maxsize, int nsegments, bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat)`
++
+Создать новый тег. Возвращает 0 при успехе, код ошибки в противном случае.
+
+** _parent_ - родительский тег, или NULL для создания тега верхнего уровня.
+** _alignment_ - требуемое физическое выравнивание области памяти, которая будет выделена для этого тега. Используйте значение 1 для "без специфического выравнивания". Применяется только к будущим вызовам `bus_dmamem_alloc()`, но не `bus_dmamap_create()`.
+** _boundary_ - физическая граница адреса, которую нельзя пересекать при выделении памяти. Используйте значение 0 для обозначения "нет границы". Применяется только к будущим вызовам `bus_dmamem_alloc()`, но не `bus_dmamap_create()`. Должна быть степенью 2. Если память планируется использовать в некаскадном режиме DMA (т.е. адреса DMA будут предоставляться не самим устройством, а контроллером DMA ISA), то граница не должна превышать 64 КБ (64*1024) из-за ограничений аппаратного обеспечения DMA.
+** _lowaddr, highaddr_ - названия немного вводят в заблуждение; эти значения используются для ограничения допустимого диапазона физических адресов, используемых для выделения памяти. Точное значение зависит от предполагаемого будущего использования:
+
+*** Для `bus_dmamem_alloc()` все адреса от 0 до lowaddr-1 считаются разрешёнными, а более высокие — запрещёнными.
+*** Для `bus_dmamap_create()` все адреса вне включительного диапазона [lowaddr; highaddr] считаются доступными. Адреса страниц внутри диапазона передаются в функцию-фильтр, которая определяет, доступны ли они. Если функция-фильтр не предоставлена, то весь диапазон считается недоступным.
+*** Для устройств ISA обычные значения (без функции фильтрации) следующие:
++
+lowaddr = BUS_SPACE_MAXADDR_24BIT
++
+highaddr = BUS_SPACE_MAXADDR
+
+** _filter, filterarg_ - функция фильтра и её аргумент. Если передаётся NULL для filter, то весь диапазон [lowaddr, highaddr] считается недоступным при выполнении `bus_dmamap_create()`. В противном случае физический адрес каждой страницы в диапазоне [lowaddr; highaddr] передаётся в функцию фильтра, которая определяет, доступна ли она. Прототип функции фильтра: `int filterfunc(void *arg, bus_addr_t paddr)`. Функция должна вернуть 0, если страница доступна, и ненулевое значение в противном случае.
+** _maxsize_ - максимальный размер памяти (в байтах), который может быть выделен через этот тег. Если сложно оценить или он может быть произвольно большим, для устройств ISA следует использовать значение `BUS_SPACE_MAXSIZE_24BIT`.
+** _nsegments_ - максимальное количество сегментов scatter-gather, поддерживаемых устройством. Если ограничений нет, следует использовать значение `BUS_SPACE_UNRESTRICTED`. Это значение рекомендуется для родительских тегов, фактические ограничения затем будут указаны для дочерних тегов. Теги с nsegments равным `BUS_SPACE_UNRESTRICTED` не могут использоваться для фактической загрузки отображений, они могут применяться только как родительские теги. Практический предел для nsegments составляет около 250-300, более высокие значения вызовут переполнение стека ядра (аппаратное обеспечение обычно не поддерживает такое большое количество scatter-gather буферов в любом случае).
+** _maxsegsz_ — максимальный размер сегмента scatter-gather, поддерживаемый устройством. Максимальное значение для устройства ISA будет `BUS_SPACE_MAXSIZE_24BIT`.
+** _flags_ - битовая маска флагов. Единственный интересный флаг:
+
+*** _BUS_DMA_ALLOCNOW_ - запрашивает выделение всех потенциально необходимых промежуточных страниц при создании тега.
+
+** _dmat_ - указатель на хранилище для нового возвращаемого тега.
+
+* `int bus_dma_tag_destroy(bus_dma_tag_t dmat)`
++
+Уничтожить тег. Возвращает 0 при успехе, код ошибки в противном случае.
++
+dmat - тег, который должен быть уничтожен.
+* `int bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, bus_dmamap_t *mapp)`
++
+Выделить область непрерывной памяти, описанную тегом. Размер выделяемой памяти соответствует maxsize тега. Возвращает 0 при успехе, иначе код ошибки. Результат всё ещё должен быть загружен с помощью `bus_dmamap_load()` перед использованием для получения физического адреса памяти.
+
+** _dmat_ - тег
+** _vaddr_ - указатель на хранилище для возвращаемого виртуального адреса ядра выделенной области.
+** flags - битовая карта флагов. Единственный интересный флаг:
+
+*** _BUS_DMA_NOWAIT_ - если память недоступна немедленно, вернуть ошибку. Если этот флаг не установлен, то процедуре разрешено ожидать до тех пор, пока память не станет доступной.
+
+** _mapp_ - указатель на хранилище для возвращаемой новой карты.
+
+* `void bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)`
++
+Освободить память, выделенную `bus_dmamem_alloc()`. В настоящее время освобождение памяти, выделенной с ограничениями ISA, не реализовано. В связи с этим рекомендуется сохранять и повторно использовать выделенные области как можно дольше. Не следует без необходимости освобождать область и вскоре снова её выделять. Это не означает, что `bus_dmamem_free()` не следует использовать вовсе: есть надежда, что вскоре она будет реализована должным образом.
+
+** _dmat_ - тег
+** _vaddr_ - виртуальный адрес памяти ядра
+** _map_ - карта памяти (как возвращается из `bus_dmamem_alloc()`)
+
+* `int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp)`
++
+Создать карту для тега, которая будет использоваться в `bus_dmamap_load()` позже. Возвращает 0 при успехе, в противном случае — код ошибки.
+
+** _dmat_ - тег
+** _flags_ - теоретически, битовая карта флагов. Однако пока никакие флаги не определены, поэтому в настоящее время значение всегда будет 0.
+** _mapp_ - указатель на хранилище для новой карты, которая будет возвращена
+
+* `int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map)`
++
+Уничтожить карту. Возвращает 0 при успехе, в противном случае — код ошибки.
+
+** dmat - тег, с которым ассоциирована карта
+** map - карта, подлежащая уничтожению
+
+* `int bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg, int flags)`
++
+Загрузить буфер в карту (карта должна быть предварительно создана с помощью `bus_dmamap_create()` или `bus_dmamem_alloc()`). Все страницы буфера проверяются на соответствие требованиям тега, и для несоответствующих выделяются промежуточные страницы. Создается массив дескрипторов физических сегментов и передается в подпрограмму обратного вызова. Ожидается, что эта подпрограмма обработает его каким-либо образом. Количество промежуточных буферов в системе ограничено, поэтому, если эти буферы требуются, но недоступны немедленно, запрос будет поставлен в очередь, и обратный вызов будет выполнен, когда промежуточные буферы станут доступны. Возвращает 0, если обратный вызов был выполнен немедленно, или `EINPROGRESS`, если запрос был поставлен в очередь для выполнения в будущем. В последнем случае синхронизация с подпрограммой обратного вызова, поставленной в очередь, является обязанностью драйвера.
++
+** _dmat_ - тег
+** _map_ - карта
+** _buf_ - виртуальный адрес буфера в пространстве ядра
+** _buflen_ - длина буфера
+** _callback_, `callback_arg` - функция обратного вызова и её аргумент
++
+Прототип функции обратного вызова: `void callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)`
++
+** _arg_ - то же самое, что и callback_arg, переданный в `bus_dmamap_load()`
+** _seg_ - массив дескрипторов сегментов
+** _nseg_ - количество дескрипторов в массиве
+** _error_ - указание на переполнение номера сегмента: если установлено значение `EFBIG`, значит буфер не поместился в максимальное количество сегментов, разрешённых тегом. В этом случае в массиве будет только разрешённое количество дескрипторов. Обработка этой ситуации зависит от драйвера: в зависимости от желаемой семантики он может либо считать это ошибкой, либо разделить буфер на две части и обработать вторую часть отдельно
++
+Каждая запись в массиве segments содержит поля:
++
+** _ds_addr_ - физический адрес шины сегмента
+** _ds_len_ - длина сегмента
++
+* `void bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)`
++
+выгрузить карту.
++
+** _dmat_ - тег
+** _map_ - загруженная карта
++
+* `void bus_dmamap_sync (bus_dma_tag_t dmat, bus_dmamap_t map, bus_dmasync_op_t op)`
++
+Синхронизировать загруженный буфер с его промежуточными страницами до и после физической передачи на устройство или с устройства. Это функция, которая выполняет все необходимое копирование данных между исходным буфером и его отображенной версией. Буферы должны быть синхронизированы как до, так и после выполнения передачи.
++
+** _dmat_ - тег
+** _map_ - загруженная карта
+** _op_ - тип операции синхронизации для выполнения:
++
+** `BUS_DMASYNC_PREREAD` - перед чтением с устройства в буфер
+** `BUS_DMASYNC_POSTREAD` - после чтения из устройства в буфер
+** `BUS_DMASYNC_PREWRITE` - перед записью буфера в устройство
+** `BUS_DMASYNC_POSTWRITE` - после записи буфера в устройство
+
+На данный момент PREREAD и POSTWRITE являются пустыми операциями, но это может измениться в будущем, поэтому их нельзя игнорировать в драйвере. Синхронизация не требуется для памяти, полученной из `bus_dmamem_alloc()`.
+
+Перед вызовом функции обратного вызова из `bus_dmamap_load()` массив сегментов сохраняется в стеке. Он предварительно выделяется для максимального количества сегментов, разрешенного тегом. В результате этого практический предел количества сегментов на архитектуре i386 составляет около 250-300 (размер стека ядра — 4 КБ минус размер структуры пользователя, размер элемента массива сегментов — 8 байт, и необходимо оставить некоторое пространство). Поскольку массив выделяется исходя из максимального числа, это значение не должно быть установлено выше, чем действительно необходимо. К счастью, для большинства оборудования максимально поддерживаемое количество сегментов значительно ниже. Но если драйвер должен обрабатывать буферы с очень большим количеством сегментов scatter-gather, он должен делать это по частям: загрузить часть буфера, передать его устройству, загрузить следующую часть буфера и так далее.
+
+Еще одно практическое следствие заключается в том, что количество сегментов может ограничивать размер буфера. Если все страницы в буфере окажутся физически несмежными, то максимальный поддерживаемый размер буфера для такого фрагментированного случая будет равен (nsegments * page_size). Например, если поддерживается максимальное количество сегментов, равное 10, то на i386 максимальный гарантированно поддерживаемый размер буфера составит 40K. Если требуется больший размер, то в драйвере следует использовать специальные приемы.
+
+Если оборудование не поддерживает scatter-gather вообще или драйвер хочет поддерживать некоторый размер буфера, даже если он сильно фрагментирован, то решение состоит в выделении непрерывного буфера в драйвере и использовании его в качестве промежуточного хранилища, если исходный буфер не подходит.
+
+Ниже представлены типичные последовательности вызовов при использовании карты в зависимости от её назначения. Символы -> используются для обозначения последовательности во времени.
+
+Для буфера, который остается практически неизменным в течение всего времени между присоединением и отсоединением устройства:
+
+bus_dmamem_alloc -> bus_dmamap_load -> ...use buffer... -> -> bus_dmamap_unload -> bus_dmamem_free
+
+Для буфера, который часто изменяется и передается извне драйвера:
+[.programlisting]
+....
+ bus_dmamap_create ->
+ -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->
+ -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->
+ ...
+ -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->
+ -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->
+ -> bus_dmamap_destroy
+....
+
+При загрузке карты, созданной `bus_dmamem_alloc()`, переданные адрес и размер буфера должны быть такими же, как использованные в `bus_dmamem_alloc()`. В этом случае гарантируется, что весь буфер будет отображен как один сегмент (так что обратный вызов может основываться на этом предположении) и запрос будет выполнен немедленно (EINPROGRESS никогда не будет возвращен). Все, что нужно сделать обратному вызову в этом случае, — это сохранить физический адрес.
+
+Типичный пример:
+
+[.programlisting]
+....
+ static void
+ alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)
+ {
+ *(bus_addr_t *)arg = seg[0].ds_addr;
+ }
+
+ ...
+ int error;
+ struct somedata {
+ ....
+ };
+ struct somedata *vsomedata; /* virtual address */
+ bus_addr_t psomedata; /* physical bus-relative address */
+ bus_dma_tag_t tag_somedata;
+ bus_dmamap_t map_somedata;
+ ...
+
+ error=bus_dma_tag_create(parent_tag, alignment,
+ boundary, lowaddr, highaddr, /*filter*/ NULL, /*filterarg*/ NULL,
+ /*maxsize*/ sizeof(struct somedata), /*nsegments*/ 1,
+ /*maxsegsz*/ sizeof(struct somedata), /*flags*/ 0,
+ &tag_somedata);
+ if(error)
+ return error;
+
+ error = bus_dmamem_alloc(tag_somedata, &vsomedata, /* flags*/ 0,
+ &map_somedata);
+ if(error)
+ return error;
+
+ bus_dmamap_load(tag_somedata, map_somedata, (void *)vsomedata,
+ sizeof (struct somedata), alloc_callback,
+ (void *) &psomedata, /*flags*/0);
+....
+
+Выглядит немного длинно и сложно, но это правильный способ. Практическое следствие таково: если несколько областей памяти выделяются всегда вместе, было бы отличной идеей объединить их все в одну структуру и выделять как единое целое (если ограничения выравнивания и границ позволяют).
+
+При загрузке произвольного буфера в карту, созданную `bus_dmamap_create()`, необходимо принять специальные меры для синхронизации с обратным вызовом, если он будет задержан. Код будет выглядеть следующим образом:
+
+[.programlisting]
+....
+ {
+ int s;
+ int error;
+
+ s = splsoftvm();
+ error = bus_dmamap_load(
+ dmat,
+ dmamap,
+ buffer_ptr,
+ buffer_len,
+ callback,
+ /*callback_arg*/ buffer_descriptor,
+ /*flags*/0);
+ if (error == EINPROGRESS) {
+ /*
+ * Do whatever is needed to ensure synchronization
+ * with callback. Callback is guaranteed not to be started
+ * until we do splx() or tsleep().
+ */
+ }
+ splx(s);
+ }
+....
+
+Два возможных подхода для обработки запросов:
+
+1. Если запросы завершаются путём явной пометки их как выполненных (например, запросы CAM), то было бы проще поместить всю дальнейшую обработку в драйвер обратного вызова, который отмечал бы запрос по его завершении. В этом случае не потребуется много дополнительной синхронизации. По соображениям управления потоком может быть полезно заморозить очередь запросов до завершения этого запроса.
+
+2. Если запросы завершаются при возврате функции (например, классические запросы на чтение или запись для символьных устройств), то в дескрипторе буфера должен быть установлен флаг синхронизации и вызвана функция `tsleep()`. Позже, когда будет вызван обратный вызов, он выполнит свою обработку и проверит этот флаг синхронизации. Если флаг установлен, обратный вызов должен инициировать пробуждение. При таком подходе функция обратного вызова может либо выполнить всю необходимую обработку (как в предыдущем случае), либо просто сохранить массив сегментов в дескрипторе буфера. Затем после завершения обратного вызова вызывающая функция может использовать этот сохранённый массив сегментов и выполнить всю обработку.
+
+[[isa-driver-dma]]
+== DMA
+
+Прямой доступ к памяти (DMA) реализован в шине ISA через контроллер DMA (на самом деле их два, но это несущественная деталь). Чтобы сделать ранние устройства ISA простыми и дешёвыми, логика управления шиной и генерации адресов была сосредоточена в контроллере DMA. К счастью, FreeBSD предоставляет набор функций, которые в основном скрывают раздражающие детали работы контроллера DMA от драйверов устройств.
+
+Самый простой случай — для достаточно интеллектуальных устройств. Например, устройства с bus mastering на PCI могут сами генерировать шинные циклы и адреса памяти. Единственное, что им действительно нужно от контроллера DMA, — это арбитраж шины. Для этой цели они притворяются каскадированными подчинёнными контроллерами DMA. И единственное, что требуется от системного контроллера DMA, — это включить каскадный режим на канале DMA, вызвав следующую функцию при присоединении драйвера:
+
+`void isa_dmacascade(int channel_number)`
+
+Все последующие действия выполняются путем программирования устройства. При отсоединении драйвера нет необходимости вызывать функции, связанные с DMA.
+
+Для более простых устройств всё становится сложнее. Используются следующие функции:
+
+* `int isa_dma_acquire(int chanel_number)`
++
+Зарезервировать канал DMA. Возвращает 0 при успехе или EBUSY, если канал уже зарезервирован этим или другим драйвером. Большинство устройств ISA не способны совместно использовать каналы DMA, поэтому обычно эта функция вызывается при присоединении устройства. Это резервирование стало избыточным с появлением современного интерфейса ресурсов шины, но всё ещё должно использоваться в дополнение к последнему. Если резервирование не использовать, то в дальнейшем другие процедуры DMA вызовут панику ядра.
+* `int isa_dma_release(int chanel_number)`
++
+Освободить ранее зарезервированный канал DMA. На момент освобождения канала не должно быть активных передач (дополнительно устройство не должно пытаться инициировать передачу после освобождения канала).
+* `void isa_dmainit(int chan, u_int bouncebufsize)`
++
+Выделить промежуточный буфер для использования с указанным каналом. Запрашиваемый размер буфера не может превышать 64 КБ. Этот промежуточный буфер будет автоматически использован в дальнейшем, если передаваемый буфер окажется не физически непрерывным, находится вне памяти, доступной шине ISA, или пересекает границу 64 КБ. Если передача всегда будет выполняться из буферов, соответствующих этим условиям (например, выделенных с помощью `bus_dmamem_alloc()` с соответствующими ограничениями), то вызов `isa_dmainit()` не требуется. Однако довольно удобно передавать произвольные данные с использованием контроллера DMA. Промежуточный буфер автоматически решит проблемы в ситуациях, когда данные разбросаны в памяти, и их надо собирать.
++
+** _chan_ - номер канала
+** _bouncebufsize_ - размер промежуточного буфера в байтах
++
+* `void isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan)`
++
+Подготовка к началу передачи DMA. Эта функция должна быть вызвана для настройки контроллера DMA перед фактическим началом передачи на устройстве. Она проверяет, что буфер является непрерывным и попадает в диапазон памяти ISA, если нет, то автоматически используется промежуточный буфер. Если требуется промежуточный буфер, но он не настроен с помощью `isa_dmainit()` или слишком мал для запрошенного размера передачи, система перейдет в состояние паники. В случае запроса на запись с промежуточным буфером данные будут автоматически скопированы в этот буфер.
+* flags - битовая маска, определяющая тип выполняемой операции. Бит направления B_READ и B_WRITE являются взаимоисключающими.
++
+** B_READ - чтение с шины ISA в память
+** B_WRITE - запись из памяти на шину ISA
+** B_RAW - если установлен, то контроллер DMA запомнит буфер и после завершения передачи автоматически переинициализирует себя для повторной передачи того же буфера (конечно, драйвер может изменить данные в буфере перед инициированием следующей передачи на устройстве). Если не установлен, то параметры будут работать только для одной передачи, и перед инициированием следующей передачи снова потребуется вызвать `isa_dmastart()`. Использование B_RAW имеет смысл только если промежуточный буфер не используется.
++
+* addr - виртуальный адрес буфера
+* nbytes - длина буфера. Должна быть меньше или равна 64 КБ. Длина 0 не допускается: контроллер DMA интерпретирует это как 64 КБ, в то время как код ядра поймёт это как 0, что приведёт к непредсказуемым последствиям. Для каналов номер 4 и выше длина должна быть чётной, так как эти каналы передают по 2 байта за раз. В случае нечётной длины последний байт не будет передан.
+* chan - номер канала
+* `void isa_dmadone(int flags, caddr_t addr, int nbytes, int chan)`
++
+Синхронизировать память после того, как устройство сообщает о завершении передачи. Если это была операция чтения с промежуточным буфером, то данные будут скопированы из этого буфера в исходный буфер. Аргументы такие же, как у `isa_dmastart()`. Флаг B_RAW разрешён, но он никак не влияет на `isa_dmadone()`.
+* `int isa_dmastatus(int channel_number)`
++
+Возвращает количество оставшихся для передачи байт в текущей передаче. Если флаг B_READ был установлен в `isa_dmastart()`, возвращаемое значение никогда не будет равно нулю. В конце передачи оно автоматически сбрасывается обратно к длине буфера. Обычное использование — проверка количества оставшихся байт после того, как устройство сигнализирует о завершении передачи. Если количество байт не равно 0, то, вероятно, в передаче произошла ошибка.
+* `int isa_dmastop(int channel_number)`
++
+Прерывает текущую передачу и возвращает количество непереданных байтов.
+
+[[isa-driver-probe]]
+== xxx_isa_probe
+
+Эта функция проверяет наличие устройства. Если драйвер поддерживает автоматическое определение некоторых параметров конфигурации устройства (таких как вектор прерывания или адрес памяти), это автоматическое определение должно выполняться в данной процедуре.
+
+Как и для любой другой шины, если устройство не может быть обнаружено, или обнаружено, но не прошло самопроверку, или возникла другая проблема, то возвращается положительное значение ошибки. Значение `ENXIO` должно возвращаться, если устройство отсутствует. Другие значения ошибок могут означать иные условия. Нулевые или отрицательные значения означают успех. Большинство драйверов возвращают ноль в случае успеха.
+
+Отрицательные возвращаемые значения используются, когда устройство PnP поддерживает несколько интерфейсов. Например, старый совместимый интерфейс и новый расширенный интерфейс, которые поддерживаются разными драйверами. В этом случае оба драйвера обнаружат устройство. Драйвер, который возвращает большее значение в процедуре обнаружения, получает приоритет (другими словами, драйвер, возвращающий 0, имеет наивысший приоритет, возвращающий -1 — следующий, возвращающий -2 — за ним и так далее). В результате устройства, поддерживающие только старый интерфейс, будут обрабатываться старым драйвером (который должен возвращать -1 из процедуры probe), а устройства, поддерживающие также новый интерфейс, будут обрабатываться новым драйвером (который должен возвращать 0 из процедуры обнаружения).
+
+Структура дескриптора устройства `xxx_softc` выделяется системой до вызова процедуры обнаружения. Если процедура обнаружения возвращает ошибку, дескриптор автоматически освобождается системой. Поэтому при возникновении ошибки обнаружения драйвер должен убедиться, что все ресурсы, использованные во время обнаружения, освобождены и ничто не мешает безопасному освобождению дескриптора.Если обнаружение завершается успешно, дескриптор сохраняется системой и позже передаётся в процедуру `xxx_isa_attach()`. Если драйвер возвращает отрицательное значение, он не может быть уверен, что получит наивысший приоритет и его процедура присоединения будет вызвана. Поэтому в этом случае он также должен освободить все ресурсы перед возвратом и, если необходимо, выделить их снова в процедуре присоединения. Когда `xxx_isa_probe()` возвращает 0, освобождение ресурсов перед возвратом также является хорошей практикой, и корректно работающий драйвер должен так поступать. Однако в случаях, когда возникают проблемы с освобождением ресурсов, драйверу разрешается сохранять ресурсы между возвратом 0 из процедуры обнаружения и выполнением процедуры присоединения.
+
+Типичная процедура обнаружения начинается с получения дескриптора устройства и номера устройства:
+
+[.programlisting]
+....
+ struct xxx_softc *sc = device_get_softc(dev);
+ int unit = device_get_unit(dev);
+ int pnperror;
+ int error = 0;
+
+ sc->dev = dev; /* link it back */
+ sc->unit = unit;
+....
+
+Затем проверьте устройства PnP. Проверка осуществляется с помощью таблицы, содержащей список PnP ID, поддерживаемых этим драйвером, и удобочитаемые описания моделей устройств, соответствующих этим ID.
+
+[.programlisting]
+....
+
+ pnperror=ISA_PNP_PROBE(device_get_parent(dev), dev,
+ xxx_pnp_ids); if(pnperror == ENXIO) return ENXIO;
+....
+
+Логика работы `ISA_PNP_PROBE` следующая: если данная карта (устройство) не была обнаружена как PnP, то будет возвращено `ENOENT`. Если она была обнаружена как PnP, но её обнаруженный ID не совпадает ни с одним из ID в таблице, то возвращается `ENXIO`. Наконец, если устройство поддерживает PnP и его ID совпадает с одним из ID в таблице, возвращается `0`, а соответствующее описание из таблицы устанавливается с помощью `device_set_desc()`.
+
+Если драйвер поддерживает только устройства PnP, то условие будет выглядеть следующим образом:
+
+[.programlisting]
+....
+ if(pnperror != 0)
+ return pnperror;
+....
+
+Для драйверов, которые не поддерживают PnP, не требуется специальной обработки, так как они передают пустую таблицу идентификаторов PnP и всегда будут получать ENXIO при вызове на PnP-карте.
+
+Функция обнаружения обычно требует как минимум некоторый минимальный набор ресурсов, например, номер порта ввода-вывода, чтобы найти карту и проверить её. В зависимости от оборудования драйвер может автоматически обнаружить другие необходимые ресурсы. Устройства PnP имеют все ресурсы, предварительно установленные подсистемой PnP, поэтому драйверу не нужно обнаруживать их самостоятельно.
+
+Обычно минимальная информация, необходимая для доступа к устройству, — это номер порта ввода-вывода. Затем некоторые устройства позволяют получить остальную информацию из регистров конфигурации устройства (хотя не все устройства это поддерживают). Поэтому сначала мы пытаемся получить начальное значение порта:
+
+[.programlisting]
+....
+ sc->port0 = bus_get_resource_start(dev,
+ SYS_RES_IOPORT, 0 /*rid*/); if(sc->port0 == 0) return ENXIO;
+....
+
+Базовый адрес порта сохраняется в структуре softc для последующего использования. Если он будет использоваться очень часто, то вызов функции ресурса каждый раз будет неприемлемо медленным. Если мы не получаем порт, мы просто возвращаем ошибку. Некоторые драйверы устройств могут вместо этого быть умнее и попытаться обнаружить все возможные порты, например:
+
+[.programlisting]
+....
+
+ /* table of all possible base I/O port addresses for this device */
+ static struct xxx_allports {
+ u_short port; /* port address */
+ short used; /* flag: if this port is already used by some unit */
+ } xxx_allports = {
+ { 0x300, 0 },
+ { 0x320, 0 },
+ { 0x340, 0 },
+ { 0, 0 } /* end of table */
+ };
+
+ ...
+ int port, i;
+ ...
+
+ port = bus_get_resource_start(dev, SYS_RES_IOPORT, 0 /*rid*/);
+ if(port !=0 ) {
+ for(i=0; xxx_allports[i].port!=0; i++) {
+ if(xxx_allports[i].used || xxx_allports[i].port != port)
+ continue;
+
+ /* found it */
+ xxx_allports[i].used = 1;
+ /* do probe on a known port */
+ return xxx_really_probe(dev, port);
+ }
+ return ENXIO; /* port is unknown or already used */
+ }
+
+ /* we get here only if we need to guess the port */
+ for(i=0; xxx_allports[i].port!=0; i++) {
+ if(xxx_allports[i].used)
+ continue;
+
+ /* mark as used - even if we find nothing at this port
+ * at least we won't probe it in future
+ */
+ xxx_allports[i].used = 1;
+
+ error = xxx_really_probe(dev, xxx_allports[i].port);
+ if(error == 0) /* found a device at that port */
+ return 0;
+ }
+ /* probed all possible addresses, none worked */
+ return ENXIO;
+....
+
+Конечно, обычно для таких вещей следует использовать процедуру `identify()` драйвера. Однако может быть одна веская причина, почему лучше сделать это в `probe()`: если этот обнаружение может привести к сбою другого чувствительного устройства. Процедуры обнаружения упорядочены с учетом флага `sensitive`: чувствительные устройства проверяются первыми, а остальные устройства — позже. Но процедуры `identify()` вызываются до любого обнаружения, поэтому они не учитывают чувствительные устройства и могут вызвать их сбой.
+
+Вот, после того как мы получили начальный порт, необходимо установить количество портов (за исключением устройств PnP), так как в файле конфигурации ядра эта информация отсутствует.
+
+[.programlisting]
+....
+
+ if(pnperror /* only for non-PnP devices */
+ && bus_set_resource(dev, SYS_RES_IOPORT, 0, sc->port0,
+ XXX_PORT_COUNT)<0)
+ return ENXIO;
+....
+
+Наконец, выделите и активируйте часть адресного пространства порта (специальные значения start и end означают "используйте те, что мы установили через ``bus_set_resource()``"):
+
+[.programlisting]
+....
+
+ sc->port0_rid = 0;
+ sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT,
+ &sc->port0_rid,
+ /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
+
+ if(sc->port0_r == NULL)
+ return ENXIO;
+....
+
+Теперь, имея доступ к регистрам с отображением на порты, мы можем каким-либо образом взаимодействовать с устройством и проверить, реагирует ли оно так, как ожидается. Если этого не происходит, вероятно, по этому адресу находится другое устройство или его там нет вовсе.
+
+Обычно драйверы не настраивают обработчики прерываний до вызова процедуры присоединения. Вместо этого они выполняют проверки в режиме опроса, используя функцию `DELAY()` для таймаута. Процедура проверки никогда не должна зависать навсегда, все ожидания ответа от устройства должны выполняться с таймаутами. Если устройство не отвечает в течение заданного времени, вероятно, оно неисправно или неправильно настроено, и драйвер должен вернуть ошибку. При определении интервала таймаута следует давать устройству дополнительное время для надежности: хотя предполагается, что `DELAY()` задерживает выполнение на одинаковое время на любой машине, существует некоторая погрешность, зависящая от конкретного процессора.
+
+Если процедура проверки действительно хочет убедиться, что прерывания работают, она может также настроить и провести обнаружение прерываний. Однако это не рекомендуется.
+
+[.programlisting]
+....
+
+ /* implemented in some very device-specific way */
+ if(error = xxx_probe_ports(sc))
+ goto bad; /* will deallocate the resources before returning */
+....
+
+Функция `xxx_probe_ports()` также может устанавливать описание устройства в зависимости от конкретной модели обнаруженного устройства. Но если поддерживается только одна модель устройства, это можно сделать и жёстко заданным способом. Конечно, для PnP-устройств поддержка PnP автоматически устанавливает описание из таблицы.
+
+[.programlisting]
+....
+ if(pnperror)
+ device_set_desc(dev, "Our device model 1234");
+....
+
+Затем процедура обнаружения должна либо определить диапазоны всех ресурсов, читая регистры конфигурации устройства, либо убедиться, что они были явно заданы пользователем. Мы рассмотрим это на примере встроенной памяти. Процедура обнаружения должна быть как можно менее навязчивой, поэтому выделение и проверку функциональности остальных ресурсов (кроме портов) лучше оставить для процедуры присоединения.
+
+Адрес памяти может быть указан в конфигурационном файле ядра, а на некоторых устройствах он может быть предварительно настроен в энергонезависимых конфигурационных регистрах. Если доступны оба источника, и они различаются, какой из них следует использовать? Вероятно, если пользователь явно указал адрес в конфигурационном файле ядра, он знает, что делает, и этот адрес должен иметь приоритет. Пример реализации может выглядеть так:
+
+[.programlisting]
+....
+
+ /* try to find out the config address first */
+ sc->mem0_p = bus_get_resource_start(dev, SYS_RES_MEMORY, 0 /*rid*/);
+ if(sc->mem0_p == 0) { /* nope, not specified by user */
+ sc->mem0_p = xxx_read_mem0_from_device_config(sc);
+
+ if(sc->mem0_p == 0)
+ /* can't get it from device config registers either */
+ goto bad;
+ } else {
+ if(xxx_set_mem0_address_on_device(sc) < 0)
+ goto bad; /* device does not support that address */
+ }
+
+ /* just like the port, set the memory size,
+ * for some devices the memory size would not be constant
+ * but should be read from the device configuration registers instead
+ * to accommodate different models of devices. Another option would
+ * be to let the user set the memory size as "msize" configuration
+ * resource which will be automatically handled by the ISA bus.
+ */
+ if(pnperror) { /* only for non-PnP devices */
+ sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);
+ if(sc->mem0_size == 0) /* not specified by user */
+ sc->mem0_size = xxx_read_mem0_size_from_device_config(sc);
+
+ if(sc->mem0_size == 0) {
+ /* suppose this is a very old model of device without
+ * auto-configuration features and the user gave no preference,
+ * so assume the minimalistic case
+ * (of course, the real value will vary with the driver)
+ */
+ sc->mem0_size = 8*1024;
+ }
+
+ if(xxx_set_mem0_size_on_device(sc) < 0)
+ goto bad; /* device does not support that size */
+
+ if(bus_set_resource(dev, SYS_RES_MEMORY, /*rid*/0,
+ sc->mem0_p, sc->mem0_size)<0)
+ goto bad;
+ } else {
+ sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);
+ }
+....
+
+Ресурсы для IRQ и DRQ легко проверить по аналогии.
+
+Если всё прошло успешно, то освободите все ресурсы и верните успешный статус.
+
+[.programlisting]
+....
+ xxx_free_resources(sc);
+ return 0;
+....
+
+Наконец, обработайте проблемные ситуации. Все ресурсы должны быть освобождены перед возвратом. Мы используем тот факт, что перед передачей нам структуры `softc` она обнуляется, поэтому мы можем определить, был ли выделен какой-либо ресурс: если его дескриптор не равен нулю.
+
+[.programlisting]
+....
+ bad:
+
+ xxx_free_resources(sc);
+ if(error)
+ return error;
+ else /* exact error is unknown */
+ return ENXIO;
+....
+
+Вот и всё для процедуры обнаружения. Освобождение ресурсов выполняется из нескольких мест, поэтому оно вынесено в функцию, которая может выглядеть так:
+
+[.programlisting]
+....
+static void
+ xxx_free_resources(sc)
+ struct xxx_softc *sc;
+ {
+ /* check every resource and free if not zero */
+
+ /* interrupt handler */
+ if(sc->intr_r) {
+ bus_teardown_intr(sc->dev, sc->intr_r, sc->intr_cookie);
+ bus_release_resource(sc->dev, SYS_RES_IRQ, sc->intr_rid,
+ sc->intr_r);
+ sc->intr_r = 0;
+ }
+
+ /* all kinds of memory maps we could have allocated */
+ if(sc->data_p) {
+ bus_dmamap_unload(sc->data_tag, sc->data_map);
+ sc->data_p = 0;
+ }
+ if(sc->data) { /* sc->data_map may be legitimately equal to 0 */
+ /* the map will also be freed */
+ bus_dmamem_free(sc->data_tag, sc->data, sc->data_map);
+ sc->data = 0;
+ }
+ if(sc->data_tag) {
+ bus_dma_tag_destroy(sc->data_tag);
+ sc->data_tag = 0;
+ }
+
+ ... free other maps and tags if we have them ...
+
+ if(sc->parent_tag) {
+ bus_dma_tag_destroy(sc->parent_tag);
+ sc->parent_tag = 0;
+ }
+
+ /* release all the bus resources */
+ if(sc->mem0_r) {
+ bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->mem0_rid,
+ sc->mem0_r);
+ sc->mem0_r = 0;
+ }
+ ...
+ if(sc->port0_r) {
+ bus_release_resource(sc->dev, SYS_RES_IOPORT, sc->port0_rid,
+ sc->port0_r);
+ sc->port0_r = 0;
+ }
+ }
+....
+
+[[isa-driver-attach]]
+== xxx_isa_attach
+
+Процедура присоединения фактически подключает драйвер к системе, если процедура обнаружения вернула успех, и система решила подключить этот драйвер. Если процедура обнаружения вернула 0, то процедура присоединения может ожидать, что получит структуру устройства `softc` в неизменном виде, как она была установлена процедурой обнаружения. Также, если обнаружение возвращает 0, она можно ожидать, что процедура присоединения для этого устройства будет вызвана в какой-то момент в будущем. Если процедура обнаружения возвращает отрицательное значение, то драйвер не может делать никаких из этих предположений.
+
+Процедура присоединение возвращает 0 при успешном завершении или код ошибки в противном случае.
+
+Процедура присоединения начинается так же, как и процедура обнаружения, с помещения часто используемых данных в более доступные переменные.
+
+[.programlisting]
+....
+ struct xxx_softc *sc = device_get_softc(dev);
+ int unit = device_get_unit(dev);
+ int error = 0;
+....
+
+Затем выделите и активируйте все необходимые ресурсы. Обычно диапазон портов освобождается перед возвратом из обнаружения, поэтому его необходимо выделить снова. Мы предполагаем, что процедура обнаружения корректно установила все диапазоны ресурсов, а также сохранила их в структуре softc. Если процедура обнаружения оставила некоторые ресурсы выделенными, то их не нужно выделять снова (это будет считаться ошибкой).
+
+[.programlisting]
+....
+ sc->port0_rid = 0;
+ sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port0_rid,
+ /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
+
+ if(sc->port0_r == NULL)
+ return ENXIO;
+
+ /* on-board memory */
+ sc->mem0_rid = 0;
+ sc->mem0_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->mem0_rid,
+ /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
+
+ if(sc->mem0_r == NULL)
+ goto bad;
+
+ /* get its virtual address */
+ sc->mem0_v = rman_get_virtual(sc->mem0_r);
+....
+
+Канал запроса DMA (DRQ) выделяется аналогично. Для его инициализации используйте функции семейства `isa_dma*()`. Например:
+
+`isa_dmacascade(sc->drq0);`
+
+Строка запроса прерывания (IRQ) является особенной. Помимо выделения, обработчик прерывания драйвера должен быть связан с ней. Исторически в старых драйверах ISA аргумент, передаваемый системой обработчику прерывания, был номером устройства. Однако в современных драйверах принято передавать указатель на структуру `softc`. Важная причина этого заключается в том, что когда структуры `softc` выделяются динамически, получение номера устройства из `softc` является простым, в то время как получение `softc` из номера устройства затруднительно. Кроме того, такое соглашение делает драйверы для различных шин более однородными и позволяет им совместно использовать код: каждая шина получает свои собственные процедуры обнаружения, присоединения, отсоединения и другие специфичные для шины функции, в то время как основная часть кода драйвера может быть общей для них.
+
+[.programlisting]
+....
+
+ sc->intr_rid = 0;
+ sc->intr_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->intr_rid,
+ /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);
+
+ if(sc->intr_r == NULL)
+ goto bad;
+
+ /*
+ * XXX_INTR_TYPE is supposed to be defined depending on the type of
+ * the driver, for example as INTR_TYPE_CAM for a CAM driver
+ */
+ error = bus_setup_intr(dev, sc->intr_r, XXX_INTR_TYPE,
+ (driver_intr_t *) xxx_intr, (void *) sc, &sc->intr_cookie);
+ if(error)
+ goto bad;
+....
+
+Если устройству необходимо выполнять DMA в основную память, то эта память должна быть выделена, как описано ранее:
+
+[.programlisting]
+....
+ error=bus_dma_tag_create(NULL, /*alignment*/ 4,
+ /*boundary*/ 0, /*lowaddr*/ BUS_SPACE_MAXADDR_24BIT,
+ /*highaddr*/ BUS_SPACE_MAXADDR, /*filter*/ NULL, /*filterarg*/ NULL,
+ /*maxsize*/ BUS_SPACE_MAXSIZE_24BIT,
+ /*nsegments*/ BUS_SPACE_UNRESTRICTED,
+ /*maxsegsz*/ BUS_SPACE_MAXSIZE_24BIT, /*flags*/ 0,
+ &sc->parent_tag);
+ if(error)
+ goto bad;
+
+ /* many things get inherited from the parent tag
+ * sc->data is supposed to point to the structure with the shared data,
+ * for example for a ring buffer it could be:
+ * struct {
+ * u_short rd_pos;
+ * u_short wr_pos;
+ * char bf[XXX_RING_BUFFER_SIZE]
+ * } *data;
+ */
+ error=bus_dma_tag_create(sc->parent_tag, 1,
+ 0, BUS_SPACE_MAXADDR, 0, /*filter*/ NULL, /*filterarg*/ NULL,
+ /*maxsize*/ sizeof(* sc->data), /*nsegments*/ 1,
+ /*maxsegsz*/ sizeof(* sc->data), /*flags*/ 0,
+ &sc->data_tag);
+ if(error)
+ goto bad;
+
+ error = bus_dmamem_alloc(sc->data_tag, &sc->data, /* flags*/ 0,
+ &sc->data_map);
+ if(error)
+ goto bad;
+
+ /* xxx_alloc_callback() just saves the physical address at
+ * the pointer passed as its argument, in this case &sc->data_p.
+ * See details in the section on bus memory mapping.
+ * It can be implemented like:
+ *
+ * static void
+ * xxx_alloc_callback(void *arg, bus_dma_segment_t *seg,
+ * int nseg, int error)
+ * {
+ * *(bus_addr_t *)arg = seg[0].ds_addr;
+ * }
+ */
+ bus_dmamap_load(sc->data_tag, sc->data_map, (void *)sc->data,
+ sizeof (* sc->data), xxx_alloc_callback, (void *) &sc->data_p,
+ /*flags*/0);
+....
+
+После выделения всех необходимых ресурсов устройство должно быть инициализировано. Инициализация может включать проверку работоспособности всех ожидаемых функций.
+
+[.programlisting]
+....
+ if(xxx_initialize(sc) < 0)
+ goto bad;
+....
+
+Подсистема шины автоматически выводит на консоль описание устройства, установленное при проверке. Однако, если драйвер хочет вывести дополнительную информацию об устройстве, он может это сделать, например:
+
+[.programlisting]
+....
+
+ device_printf(dev, "has on-card FIFO buffer of %d bytes\n", sc->fifosize);
+....
+
+Если в процессе выполнения инициализации возникают какие-либо проблемы, рекомендуется выводить сообщения об этих проблемах перед возвратом ошибки.
+
+Последним шагом процедуры присоединения является подключение устройства к его функциональной подсистеме в ядре. Конкретный способ зависит от типа драйвера: символьное устройство, блочное устройство, сетевое устройство, устройство шины CAM SCSI и так далее.
+
+Если всё прошло успешно, вернуть успех.
+
+[.programlisting]
+....
+ error = xxx_attach_subsystem(sc);
+ if(error)
+ goto bad;
+
+ return 0;
+....
+
+Наконец, обработаем проблемные ситуации. Все ресурсы должны быть освобождены перед возвратом ошибки. Мы используем тот факт, что перед передачей структуры `softc` она обнуляется, поэтому мы можем определить, был ли выделен какой-либо ресурс: если его дескриптор ненулевой.
+
+[.programlisting]
+....
+ bad:
+
+ xxx_free_resources(sc);
+ if(error)
+ return error;
+ else /* exact error is unknown */
+ return ENXIO;
+....
+
+Вот и всё для процедуры присоединения.
+
+[[isa-driver-detach]]
+== xxx_isa_detach
+
+Если эта функция присутствует в драйвере и драйвер скомпилирован как загружаемый модуль, то драйвер получает возможность быть выгруженным. Это важная функция, если оборудование поддерживает горячее подключение. Однако шина ISA не поддерживает горячее подключение, поэтому эта функция не особенно важна для устройств ISA. Возможность выгрузки драйвера может быть полезна при его отладке, но во многих случаях установка новой версии драйвера потребуется только после того, как старая версия каким-то образом заблокирует систему и перезагрузка все равно будет необходима, поэтому усилия, затраченные на написание процедуры отсоединения, могут не окупиться. Другой аргумент, что выгрузка позволит обновлять драйверы на рабочей машине, кажется в основном теоретическим. Установка новой версии драйвера — это опасная операция, которую никогда не следует выполнять на рабочей машине (и которая не разрешена, когда система работает в безопасном режиме). Тем не менее, процедура отсоединения может быть предоставлена для полноты.
+
+Процедура отсоединения возвращает 0, если драйвер был успешно отсоединён, или код ошибки в противном случае.
+
+Логика отсоединения является зеркальной по отношению к присоединению. Первое, что нужно сделать, — это отсоединить драйвер от его подсистемы ядра. Если устройство в настоящее время открыто, у драйвера есть два варианта: отказаться от отсоединения или принудительно закрыть устройство и продолжить отсоединение. Выбор зависит от возможности конкретной подсистемы ядра выполнить принудительное закрытие и от предпочтений автора драйвера. Как правило, принудительное закрытие кажется предпочтительным вариантом.
+
+[.programlisting]
+....
+ struct xxx_softc *sc = device_get_softc(dev);
+ int error;
+
+ error = xxx_detach_subsystem(sc);
+ if(error)
+ return error;
+....
+
+Далее драйвер может сбросить аппаратное обеспечение в согласованное состояние. Это включает остановку любых текущих передач, отключение каналов DMA и прерываний, чтобы избежать повреждения памяти устройством. Для большинства драйверов это именно то, что делает процедура выключения, поэтому, если она присутствует в драйвере, мы можем просто вызвать её.
+
+`xxx_isa_shutdown(dev);`
+
+И наконец освободить все ресурсы и вернуть успех.
+
+[.programlisting]
+....
+ xxx_free_resources(sc);
+ return 0;
+....
+
+[[isa-driver-shutdown]]
+== xxx_isa_shutdown
+
+Эта процедура вызывается, когда система собирается быть выключена. Ожидается, что она приведет оборудование в согласованное состояние. Для большинства устройств ISA не требуется никаких специальных действий, поэтому функция не является действительно необходимой, так как устройство будет переинициализировано при перезагрузке в любом случае. Однако некоторые устройства должны быть выключены с помощью специальной процедуры, чтобы убедиться, что они будут правильно обнаружены после мягкой перезагрузки (это особенно актуально для многих устройств с проприетарными протоколами идентификации). В любом случае отключение DMA и прерываний в регистрах устройства и остановка любых текущих передач — это хорошая идея. Точные действия зависят от оборудования, поэтому мы не рассматриваем их здесь подробно.
+
+[[isa-driver-intr]]
+== xxx_intr
+
+Обработчик прерывания вызывается при получении прерывания, которое может быть от данного конкретного устройства. Шина ISA не поддерживает разделение прерываний (за исключением некоторых специальных случаев), поэтому на практике, если вызывается обработчик прерывания, то прерывание почти наверняка поступило от его устройства. Тем не менее, обработчик прерывания должен опросить регистры устройства и убедиться, что прерывание было сгенерировано его устройством. Если нет, он должен просто вернуть управление.
+
+Старая практика для драйверов ISA заключалась в получении номера устройства в качестве аргумента. Это устарело, и новые драйверы получают любой аргумент, указанный для них в процедуре присоединения при вызове `bus_setup_intr()`. Согласно новой практике, это должен быть указатель на структуру softc. Таким образом, обработчик прерываний обычно начинается так:
+
+[.programlisting]
+....
+
+ static void
+ xxx_intr(struct xxx_softc *sc)
+ {
+....
+
+Он выполняется на уровне приоритета прерывания, указанном параметром типа прерывания в `bus_setup_intr()`. Это означает, что все остальные прерывания того же типа, а также все программные прерывания, отключены.
+
+Во избежание гонок это обычно записывается в виде цикла:
+
+[.programlisting]
+....
+
+ while(xxx_interrupt_pending(sc)) {
+ xxx_process_interrupt(sc);
+ xxx_acknowledge_interrupt(sc);
+ }
+....
+
+Обработчик прерывания должен подтвердить прерывание только устройству, но не контроллеру прерываний, система позаботится о последнем.
diff --git a/documentation/content/ru/books/arch-handbook/isa/_index.po b/documentation/content/ru/books/arch-handbook/isa/_index.po
new file mode 100644
index 0000000000..d7ed58ee1c
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/isa/_index.po
@@ -0,0 +1,4237 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-09-01 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookisa_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:14
+#, no-wrap
+msgid "ISA Device Drivers"
+msgstr "Драйверы устройств ISA"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1
+#, no-wrap
+msgid "Chapter 10. ISA Device Drivers"
+msgstr "Глава 10. Драйверы устройств ISA"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:52
+#, no-wrap
+msgid "Synopsis"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:55
+msgid ""
+"This chapter introduces the issues relevant to writing a driver for an ISA "
+"device. The pseudo-code presented here is rather detailed and reminiscent of "
+"the real code but is still only pseudo-code. It avoids the details "
+"irrelevant to the subject of the discussion. The real-life examples can be "
+"found in the source code of real drivers. In particular the drivers `ep` and "
+"`aha` are good sources of information."
+msgstr ""
+"Эта глава знакомит с вопросами, относящимся к написанию драйвера устройства "
+"ISA. Представленный здесь псевдокод довольно детализирован и напоминает "
+"реальный код, но всё же остаётся псевдокодом. Он избегает деталей, не "
+"относящихся к теме обсуждения. Реальные примеры можно найти в исходном коде "
+"настоящих драйверов. В частности, драйверы `ep` и `aha` являются хорошими "
+"источниками информации."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:57
+#, no-wrap
+msgid "Basic Information"
+msgstr "Основная информация"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:60
+msgid "A typical ISA driver would need the following include files:"
+msgstr "Типичному драйверу ISA могут потребоваться следующие включаемые файлы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:68
+#, no-wrap
+msgid ""
+"#include <sys/module.h>\n"
+"#include <sys/bus.h>\n"
+"#include <machine/bus.h>\n"
+"#include <machine/resource.h>\n"
+"#include <sys/rman.h>\n"
+msgstr ""
+"#include <sys/module.h>\n"
+"#include <sys/bus.h>\n"
+"#include <machine/bus.h>\n"
+"#include <machine/resource.h>\n"
+"#include <sys/rman.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:71
+#, no-wrap
+msgid ""
+"#include <isa/isavar.h>\n"
+"#include <isa/pnpvar.h>\n"
+msgstr ""
+"#include <isa/isavar.h>\n"
+"#include <isa/pnpvar.h>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:74
+msgid "They describe the things specific to the ISA and generic bus subsystem."
+msgstr ""
+"Они описывают особенности, специфичные для подсистемы ISA и обобщенной шины."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:76
+msgid ""
+"The bus subsystem is implemented in an object-oriented fashion, its main "
+"structures are accessed by associated method functions."
+msgstr ""
+"Подсистема шины реализована в объектно-ориентированном стиле, её основные "
+"структуры доступны через методы, связанные с объектами."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:78
+msgid ""
+"The list of bus methods implemented by an ISA driver is like one for any "
+"other bus. For a hypothetical driver named \"xxx\" they would be:"
+msgstr ""
+"Список методов шины, реализуемых драйвером ISA, аналогичен списку для любой "
+"другой шины. Для гипотетического драйвера с именем \"xxx\" они будут:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:80
+msgid ""
+"`static void xxx_isa_identify (driver_t *, device_t);` Normally used for bus "
+"drivers, not device drivers. But for ISA devices this method may have "
+"special use: if the device provides some device-specific (non-PnP) way to "
+"auto-detect devices this routine may implement it."
+msgstr ""
+"`static void xxx_isa_identify (driver_t *, device_t);` Обычно используется "
+"для драйверов шины, а не для драйверов устройств. Однако для устройств ISA "
+"этот метод может иметь особое применение: если устройство предоставляет "
+"специфический (не PnP) способ автоматического обнаружения устройств, эта "
+"процедура может его реализовывать."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:81
+msgid ""
+"`static int xxx_isa_probe (device_t dev);` Probe for a device at a known (or "
+"PnP) location. This routine can also accommodate device-specific auto-"
+"detection of parameters for partially configured devices."
+msgstr ""
+"`static int xxx_isa_probe (device_t dev);` Проверка наличия устройства в "
+"известном (или PnP) расположении. Эта процедура также может учитывать "
+"автоопределение параметров, специфичных для устройства, в случае частично "
+"настроенных устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:82
+msgid ""
+"`static int xxx_isa_attach (device_t dev);` Attach and initialize device."
+msgstr ""
+"`static int xxx_isa_attach (device_t dev);` Подключение и инициализация "
+"устройства."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:83
+msgid ""
+"`static int xxx_isa_detach (device_t dev);` Detach device before unloading "
+"the driver module."
+msgstr ""
+"`static int xxx_isa_detach (device_t dev);` Отсоединение устройства перед "
+"выгрузкой модуля драйвера."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:84
+msgid ""
+"`static int xxx_isa_shutdown (device_t dev);` Execute shutdown of the device "
+"before system shutdown."
+msgstr ""
+"`static int xxx_isa_shutdown (device_t dev);` Выполняет завершение работы "
+"устройства перед выключением системы."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:85
+msgid ""
+"`static int xxx_isa_suspend (device_t dev);` Suspend the device before the "
+"system goes to the power-save state. May also abort transition to the power-"
+"save state."
+msgstr ""
+"`static int xxx_isa_suspend (device_t dev);` Приостанавливает устройство "
+"перед переходом системы в энергосберегающий режим. Также может прервать "
+"переход в энергосберегающий режим."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:86
+msgid ""
+"`static int xxx_isa_resume (device_t dev);` Resume the device activity after "
+"return from power-save state."
+msgstr ""
+"`static int xxx_isa_resume (device_t dev);` Возобновляет активность "
+"устройства после возврата из энергосберегающего состояния."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:88
+msgid ""
+"`xxx_isa_probe()` and `xxx_isa_attach()` are mandatory, the rest of the "
+"routines are optional, depending on the device's needs."
+msgstr ""
+"`xxx_isa_probe()` и `xxx_isa_attach()` являются обязательными, остальные "
+"процедуры опциональны и зависят от потребностей устройства."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:90
+msgid ""
+"The driver is linked to the system with the following set of descriptions."
+msgstr "Драйвер связан с системой следующим набором описаний."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:104
+#, no-wrap
+msgid ""
+" /* table of supported bus methods */\n"
+" static device_method_t xxx_isa_methods[] = {\n"
+" /* list all the bus method functions supported by the driver */\n"
+" /* omit the unsupported methods */\n"
+" DEVMETHOD(device_identify, xxx_isa_identify),\n"
+" DEVMETHOD(device_probe, xxx_isa_probe),\n"
+" DEVMETHOD(device_attach, xxx_isa_attach),\n"
+" DEVMETHOD(device_detach, xxx_isa_detach),\n"
+" DEVMETHOD(device_shutdown, xxx_isa_shutdown),\n"
+" DEVMETHOD(device_suspend, xxx_isa_suspend),\n"
+" DEVMETHOD(device_resume, xxx_isa_resume),\n"
+msgstr ""
+" /* table of supported bus methods */\n"
+" static device_method_t xxx_isa_methods[] = {\n"
+" /* list all the bus method functions supported by the driver */\n"
+" /* omit the unsupported methods */\n"
+" DEVMETHOD(device_identify, xxx_isa_identify),\n"
+" DEVMETHOD(device_probe, xxx_isa_probe),\n"
+" DEVMETHOD(device_attach, xxx_isa_attach),\n"
+" DEVMETHOD(device_detach, xxx_isa_detach),\n"
+" DEVMETHOD(device_shutdown, xxx_isa_shutdown),\n"
+" DEVMETHOD(device_suspend, xxx_isa_suspend),\n"
+" DEVMETHOD(device_resume, xxx_isa_resume),\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:107
+#, no-wrap
+msgid ""
+"\tDEVMETHOD_END\n"
+" };\n"
+msgstr ""
+"\tDEVMETHOD_END\n"
+" };\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:113
+#, no-wrap
+msgid ""
+" static driver_t xxx_isa_driver = {\n"
+" \"xxx\",\n"
+" xxx_isa_methods,\n"
+" sizeof(struct xxx_softc),\n"
+" };\n"
+msgstr ""
+" static driver_t xxx_isa_driver = {\n"
+" \"xxx\",\n"
+" xxx_isa_methods,\n"
+" sizeof(struct xxx_softc),\n"
+" };\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:115
+#, no-wrap
+msgid " static devclass_t xxx_devclass;\n"
+msgstr " static devclass_t xxx_devclass;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:118
+#, no-wrap
+msgid ""
+" DRIVER_MODULE(xxx, isa, xxx_isa_driver, xxx_devclass,\n"
+" load_function, load_argument);\n"
+msgstr ""
+" DRIVER_MODULE(xxx, isa, xxx_isa_driver, xxx_devclass,\n"
+" load_function, load_argument);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:121
+msgid ""
+"Here struct `xxx_softc` is a device-specific structure that contains private "
+"driver data and descriptors for the driver's resources. The bus code "
+"automatically allocates one softc descriptor per device as needed."
+msgstr ""
+"Здесь структура `xxx_softc` — это специфичная для устройства структура, "
+"которая содержит приватные данные драйвера и дескрипторы ресурсов драйвера. "
+"Код шины автоматически выделяет один дескриптор softc для каждого устройства "
+"по мере необходимости."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:123
+msgid ""
+"If the driver is implemented as a loadable module then `load_function()` is "
+"called to do driver-specific initialization or clean-up when the driver is "
+"loaded or unloaded and load_argument is passed as one of its arguments. If "
+"the driver does not support dynamic loading (in other words it must always "
+"be linked into the kernel) then these values should be set to 0 and the last "
+"definition would look like:"
+msgstr ""
+"Если драйвер реализован в виде загружаемого модуля, то `load_function()` "
+"вызывается для выполнения специфичной для драйвера инициализации или очистки "
+"при загрузке или выгрузке драйвера, а `load_argument` передаётся в качестве "
+"одного из её аргументов. Если драйвер не поддерживает динамическую загрузку "
+"(другими словами, он всегда должен быть связан с ядром), то эти значения "
+"должны быть установлены в 0, и последнее определение будет выглядеть "
+"следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:128
+#, no-wrap
+msgid ""
+" DRIVER_MODULE(xxx, isa, xxx_isa_driver,\n"
+" xxx_devclass, 0, 0);\n"
+msgstr ""
+" DRIVER_MODULE(xxx, isa, xxx_isa_driver,\n"
+" xxx_devclass, 0, 0);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:131
+msgid ""
+"If the driver is for a device which supports PnP then a table of supported "
+"PnP IDs must be defined. The table consists of a list of PnP IDs supported "
+"by this driver and human-readable descriptions of the hardware types and "
+"models having these IDs. It looks like:"
+msgstr ""
+"Если драйвер предназначен для устройства с поддержкой PnP, то должна быть "
+"определена таблица поддерживаемых PnP ID. Таблица состоит из списка PnP ID, "
+"поддерживаемых этим драйвером, и удобочитаемых описаний типов аппаратного "
+"обеспечения и моделей, имеющих эти ID. Это выглядит следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:140
+#, no-wrap
+msgid ""
+" static struct isa_pnp_id xxx_pnp_ids[] = {\n"
+" /* a line for each supported PnP ID */\n"
+" { 0x12345678, \"Our device model 1234A\" },\n"
+" { 0x12345679, \"Our device model 1234B\" },\n"
+" { 0, NULL }, /* end of table */\n"
+" };\n"
+msgstr ""
+" static struct isa_pnp_id xxx_pnp_ids[] = {\n"
+" /* a line for each supported PnP ID */\n"
+" { 0x12345678, \"Our device model 1234A\" },\n"
+" { 0x12345679, \"Our device model 1234B\" },\n"
+" { 0, NULL }, /* end of table */\n"
+" };\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:143
+msgid ""
+"If the driver does not support PnP devices it still needs an empty PnP ID "
+"table, like:"
+msgstr ""
+"Если драйвер не поддерживает устройства PnP, ему все равно нужна пустая "
+"таблица идентификаторов PnP, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:149
+#, no-wrap
+msgid ""
+" static struct isa_pnp_id xxx_pnp_ids[] = {\n"
+" { 0, NULL }, /* end of table */\n"
+" };\n"
+msgstr ""
+" static struct isa_pnp_id xxx_pnp_ids[] = {\n"
+" { 0, NULL }, /* end of table */\n"
+" };\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:152
+#, no-wrap
+msgid "`device_t` Pointer"
+msgstr "Указатель `device_t`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:155
+msgid ""
+"`device_t` is the pointer type for the device structure. Here we consider "
+"only the methods interesting from the device driver writer's standpoint. The "
+"methods to manipulate values in the device structure are:"
+msgstr ""
+"`device_t` — это тип указателя на структуру устройства. Здесь мы "
+"рассматриваем только методы, представляющие интерес с точки зрения "
+"разработчика драйверов устройств. Методы для работы со значениями в "
+"структуре устройства следующие:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:157
+msgid "`device_t device_get_parent(dev)` Get the parent bus of a device."
+msgstr ""
+"`device_t device_get_parent(dev)` Получить родительскую шину устройства."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:158
+msgid "`driver_t device_get_driver(dev)` Get pointer to its driver structure."
+msgstr ""
+"`driver_t device_get_driver(dev)` Получить указатель на структуру его "
+"драйвера."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:159
+msgid ""
+"`char *device_get_name(dev)` Get the driver name, such as `\"xxx\"` for our "
+"example."
+msgstr ""
+"`char *device_get_name(dev)` Получить имя драйвера, например `\"xxx\"` в "
+"нашем примере."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:160
+msgid ""
+"`int device_get_unit(dev)` Get the unit number (units are numbered from 0 "
+"for the devices associated with each driver)."
+msgstr ""
+"`int device_get_unit(dev)` Получить номер устройства (устройства нумеруются "
+"с 0 для устройств, связанных с каждым драйвером)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:161
+msgid ""
+"`char *device_get_nameunit(dev)` Get the device name including the unit "
+"number, such as \"xxx0\", \"xxx1\" and so on."
+msgstr ""
+"`char *device_get_nameunit(dev)` Получить имя устройства, включая номер "
+"юнита, например, \"xxx0\", \"xxx1\" и так далее."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:162
+msgid ""
+"`char *device_get_desc(dev)` Get the device description. Normally it "
+"describes the exact model of device in human-readable form."
+msgstr ""
+"`char *device_get_desc(dev)` Получить описание устройства. Обычно оно "
+"описывает точную модель устройства в удобочитаемом виде."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:163
+msgid ""
+"`device_set_desc(dev, desc)` Set the description. This makes the device "
+"description point to the string desc which may not be deallocated or changed "
+"after that."
+msgstr ""
+"`device_set_desc(dev, desc)` Установить описание. Это заставляет описание "
+"устройства указывать на строку desc, которая не может быть освобождена или "
+"изменена после этого."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:164
+msgid ""
+"`device_set_desc_copy(dev, desc)` Set the description. The description is "
+"copied into an internal dynamically allocated buffer, so the string desc may "
+"be changed afterwards without adverse effects."
+msgstr ""
+"`device_set_desc_copy(dev, desc)` Установить описание. Описание копируется "
+"во внутренний динамически выделяемый буфер, поэтому строка desc может быть "
+"изменена впоследствии без негативных последствий."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:165
+msgid ""
+"`void *device_get_softc(dev)` Get pointer to the device descriptor (struct "
+"`xxx_softc`) associated with this device."
+msgstr ""
+"`void *device_get_softc(dev)` Получить указатель на дескриптор устройства "
+"(структура `xxx_softc`), связанный с данным устройством."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:166
+msgid ""
+"`u_int32_t device_get_flags(dev)` Get the flags specified for the device in "
+"the configuration file."
+msgstr ""
+"`u_int32_t device_get_flags(dev)` Получить флаги, указанные для устройства в "
+"файле конфигурации."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:168
+msgid ""
+"A convenience function `device_printf(dev, fmt, ...)` may be used to print "
+"the messages from the device driver. It automatically prepends the unitname "
+"and colon to the message."
+msgstr ""
+"Функция для удобства `device_printf(dev, fmt, ...)` может использоваться для "
+"вывода сообщений из драйвера устройства. Она автоматически добавляет имя "
+"устройства и двоеточие перед сообщением."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:170
+msgid ""
+"The device_t methods are implemented in the file [.filename]#kern/"
+"bus_subr.c#."
+msgstr "Методы device_t реализованы в файле [.filename]#kern/bus_subr.c#."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:172
+#, no-wrap
+msgid "Configuration File and the Order of Identifying and Probing During Auto-Configuration"
+msgstr "Файл конфигурации и порядок определения и проверки при автоматической настройке"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:175
+msgid "The ISA devices are described in the kernel configuration file like:"
+msgstr ""
+"Устройства ISA описываются в файле конфигурации ядра следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:180
+#, no-wrap
+msgid ""
+"device xxx0 at isa? port 0x300 irq 10 drq 5\n"
+" iomem 0xd0000 flags 0x1 sensitive\n"
+msgstr ""
+"device xxx0 at isa? port 0x300 irq 10 drq 5\n"
+" iomem 0xd0000 flags 0x1 sensitive\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:183
+msgid ""
+"The values of port, IRQ and so on are converted to the resource values "
+"associated with the device. They are optional, depending on the device's "
+"needs and abilities for auto-configuration. For example, some devices do not "
+"need DRQ at all and some allow the driver to read the IRQ setting from the "
+"device configuration ports. If a machine has multiple ISA buses the exact "
+"bus may be specified in the configuration line, like `isa0` or `isa1`, "
+"otherwise the device would be searched for on all the ISA buses."
+msgstr ""
+"Значения порта, IRQ и т. д. преобразуются в ресурсы, связанные с "
+"устройством. Они являются необязательными, в зависимости от потребностей "
+"устройства и его способностей к автонастройке. Например, некоторым "
+"устройствам вообще не нужен DRQ, а некоторые позволяют драйверу читать "
+"настройку IRQ из портов конфигурации устройства. Если в машине несколько шин "
+"ISA, точная шина может быть указана в строке конфигурации, например `isa0` "
+"или `isa1`, иначе устройство будет искаться на всех шинах ISA."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:185
+msgid ""
+"`sensitive` is a resource requesting that this device must be probed before "
+"all non-sensitive devices. It is supported but does not seem to be used in "
+"any current driver."
+msgstr ""
+"`sensitive` — это ресурс, указывающий, что данное устройство должно быть "
+"проверено перед всеми нечувствительными устройствами. Он поддерживается, но, "
+"похоже, не используется ни в одном текущем драйвере."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:187
+msgid ""
+"For legacy ISA devices in many cases the drivers are still able to detect "
+"the configuration parameters. But each device to be configured in the system "
+"must have a config line. If two devices of some type are installed in the "
+"system but there is only one configuration line for the corresponding "
+"driver, ie:"
+msgstr ""
+"Для устаревших устройств ISA во многих случаях драйверы всё ещё могут "
+"определять параметры конфигурации. Однако каждое устройство, которое "
+"необходимо настроить в системе, должно иметь строку конфигурации. Если в "
+"системе установлено два устройства одного типа, но для соответствующего "
+"драйвера есть только одна строка конфигурации, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:190
+#, no-wrap
+msgid "device xxx0 at isa?\n"
+msgstr "device xxx0 at isa?\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:192
+#, no-wrap
+msgid " then only one device will be configured.\n"
+msgstr " тогда будет настроено только одно устройство.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:194
+msgid ""
+"But for the devices supporting automatic identification by the means of Plug-"
+"n-Play or some proprietary protocol one configuration line is enough to "
+"configure all the devices in the system, like the one above or just simply:"
+msgstr ""
+"Однако для устройств, поддерживающих автоматическую идентификацию с помощью "
+"Plug-n-Play или какого-либо проприетарного протокола, достаточно одной "
+"строки конфигурации для настройки всех устройств в системе, как в примере "
+"выше или просто:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:198
+#, no-wrap
+msgid "device xxx at isa?\n"
+msgstr "device xxx at isa?\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:201
+msgid ""
+"If a driver supports both auto-identified and legacy devices and both kinds "
+"are installed at once in one machine then it is enough to describe in the "
+"config file the legacy devices only. The auto-identified devices will be "
+"added automatically."
+msgstr ""
+"Если драйвер поддерживает как автоматически определяемые, так и устаревшие "
+"устройства, и оба типа установлены одновременно в одной машине, то "
+"достаточно описать в конфигурационном файле только устаревшие устройства. "
+"Автоматически определяемые устройства будут добавлены автоматически."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:203
+msgid "When an ISA bus is auto-configured the events happen as follows:"
+msgstr ""
+"При автоматической настройке шины ISA события происходят в следующем порядке:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:205
+msgid ""
+"All the drivers' identify routines (including the PnP identify routine which "
+"identifies all the PnP devices) are called in random order. As they identify "
+"the devices they add them to the list on the ISA bus. Normally the drivers' "
+"identify routines associate their drivers with the new devices. The PnP "
+"identify routine does not know about the other drivers yet so it does not "
+"associate any with the new devices it adds."
+msgstr ""
+"Все процедуры идентификации драйверов (включая процедуру идентификации PnP, "
+"которая определяет все устройства PnP) вызываются в случайном порядке. Когда "
+"они идентифицируют устройства, они добавляют их в список на шине ISA. Обычно "
+"процедуры идентификации драйверов связывают свои драйверы с новыми "
+"устройствами. Процедура идентификации PnP пока не знает о других драйверах, "
+"поэтому не связывает ни один из них с новыми устройствами, которые она "
+"добавляет."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:207
+msgid ""
+"The PnP devices are put to sleep using the PnP protocol to prevent them from "
+"being probed as legacy devices."
+msgstr ""
+"Устройства PnP переводятся в режим сна с использованием протокола PnP, чтобы "
+"предотвратить их обнаружение как устаревших устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:209
+msgid ""
+"The probe routines of non-PnP devices marked as `sensitive` are called. If "
+"probe for a device went successfully, the attach routine is called for it."
+msgstr ""
+"Вызываются процедуры обнаружения для устройств, не поддерживающих PnP, "
+"помеченных как `sensitive`. Если процедура обнаружения для устройства "
+"завершилась успешно, вызывается процедура присоединения для него."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:211
+msgid ""
+"The probe and attach routines of all non-PNP devices are called likewise."
+msgstr ""
+"Вызов процедур обнаружения и присоединения всех устройств, не поддерживающих "
+"PNP, выполняется аналогичным образом."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:213
+msgid ""
+"The PnP devices are brought back from the sleep state and assigned the "
+"resources they request: I/O and memory address ranges, IRQs and DRQs, all of "
+"them not conflicting with the attached legacy devices."
+msgstr ""
+"Устройства PnP выводятся из состояния сна и получают запрошенные ресурсы: "
+"диапазоны адресов ввода-вывода и памяти, IRQ и DRQ, причем все они не "
+"конфликтуют с подключенными устаревшими устройствами."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:215
+msgid ""
+"Then for each PnP device the probe routines of all the present ISA drivers "
+"are called. The first one that claims the device gets attached. It is "
+"possible that multiple drivers would claim the device with different "
+"priority; in this case, the highest-priority driver wins. The probe routines "
+"must call `ISA_PNP_PROBE()` to compare the actual PnP ID with the list of "
+"the IDs supported by the driver and if the ID is not in the table return "
+"failure. That means that absolutely every driver, even the ones not "
+"supporting any PnP devices must call `ISA_PNP_PROBE()`, at least with an "
+"empty PnP ID table to return failure on unknown PnP devices."
+msgstr ""
+"Затем для каждого устройства PnP вызываются процедуры обнаружения всех "
+"присутствующих драйверов ISA. Первый драйвер, который заявит о поддержке "
+"устройства, будет присоединен. Возможна ситуация, когда несколько драйверов "
+"заявят о поддержке устройства с разным приоритетом; в этом случае побеждает "
+"драйвер с наивысшим приоритетом. Процедуры обнаружения должны вызывать "
+"`ISA_PNP_PROBE()` для сравнения фактического PnP ID со списком ID, "
+"поддерживаемых драйвером, и если ID отсутствует в таблице, возвращать "
+"ошибку. Это означает, что абсолютно каждый драйвер, даже те, которые не "
+"поддерживают никакие PnP устройства, должны вызывать `ISA_PNP_PROBE()`, хотя "
+"бы с пустой таблицей PnP ID, чтобы возвращать ошибку для неизвестных PnP "
+"устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:217
+msgid ""
+"The probe routine returns a positive value (the error code) on error, zero "
+"or negative value on success."
+msgstr ""
+"Процедура обнаружения возвращает положительное значение (код ошибки) в "
+"случае ошибки, ноль или отрицательное значение в случае успеха."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:219
+msgid ""
+"The negative return values are used when a PnP device supports multiple "
+"interfaces. For example, an older compatibility interface and a newer "
+"advanced interface which are supported by different drivers. Then both "
+"drivers would detect the device. The driver which returns a higher value in "
+"the probe routine takes precedence (in other words, the driver returning 0 "
+"has highest precedence, returning -1 is next, returning -2 is after it and "
+"so on). In result the devices which support only the old interface will be "
+"handled by the old driver (which should return -1 from the probe routine) "
+"while the devices supporting the new interface as well will be handled by "
+"the new driver (which should return 0 from the probe routine). If multiple "
+"drivers return the same value then the one called first wins. So if a driver "
+"returns value 0 it may be sure that it won the priority arbitration."
+msgstr ""
+"Отрицательные возвращаемые значения используются, когда устройство PnP "
+"поддерживает несколько интерфейсов. Например, старый совместимый интерфейс и "
+"новый расширенный интерфейс, которые поддерживаются разными драйверами. В "
+"этом случае оба драйвера обнаружат устройство. Драйвер, возвращающий большее "
+"значение в процедуре обнаружения, получает приоритет (другими словами, "
+"драйвер, возвращающий 0, имеет наивысший приоритет, возвращающий -1 — "
+"следующий, возвращающий -2 — за ним и так далее). В результате устройства, "
+"поддерживающие только старый интерфейс, будут обрабатываться старым "
+"драйвером (который должен возвращать -1 из процедуры обнаружения), тогда как "
+"устройства, поддерживающие также новый интерфейс, будут обрабатываться новым "
+"драйвером (который должен возвращать 0 из процедуры обнаружения). Если "
+"несколько драйверов возвращают одинаковое значение, побеждает тот, который "
+"был вызван первым. Таким образом, если драйвер возвращает значение 0, он "
+"может быть уверен, что выиграл арбитраж приоритетов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:221
+msgid ""
+"The device-specific identify routines can also assign not a driver but a "
+"class of drivers to the device. Then all the drivers in the class are probed "
+"for this device, like the case with PnP. This feature is not implemented in "
+"any existing driver and is not considered further in this document."
+msgstr ""
+"Процедуры идентификации, специфичные для устройства, также могут назначать "
+"устройству не драйвер, а класс драйверов. Затем все драйверы в этом классе "
+"проверяются на совместимость с устройством, как в случае с PnP. Эта "
+"возможность не реализована ни в одном существующем драйвере и далее в этом "
+"документе не рассматривается."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:223
+msgid ""
+"As the PnP devices are disabled when probing the legacy devices they will "
+"not be attached twice (once as legacy and once as PnP). But in case of "
+"device-dependent identify routines it is the responsibility of the driver to "
+"make sure that the same device will not be attached by the driver twice: "
+"once as legacy user-configured and once as auto-identified."
+msgstr ""
+"Поскольку устройства PnP отключены при проверке устаревших устройств, они не "
+"будут присоединены дважды (один раз как устаревшие и один раз как PnP). "
+"Однако в случае процедур идентификации, зависящих от устройства, "
+"ответственность за то, чтобы одно и то же устройство не было присоединено "
+"драйвером дважды (один раз как настроенное пользователем устаревшее и один "
+"раз как автоматически идентифицированное), лежит на драйвере."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:225
+msgid ""
+"Another practical consequence for the auto-identified devices (both PnP and "
+"device-specific) is that the flags can not be passed to them from the kernel "
+"configuration file. So they must either not use the flags at all or use the "
+"flags from the device unit 0 for all the auto-identified devices or use the "
+"sysctl interface instead of flags."
+msgstr ""
+"Еще одно практическое следствие для автоматически определяемых устройств "
+"(как PnP, так и специфичных для устройства) заключается в том, что флаги не "
+"могут быть переданы им из файла конфигурации ядра. Поэтому они либо не "
+"должны использовать флаги вообще, либо использовать флаги из устройства unit "
+"0 для всех автоматически определяемых устройств, либо использовать интерфейс "
+"sysctl вместо флагов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:227
+msgid ""
+"Other unusual configurations may be accommodated by accessing the "
+"configuration resources directly with functions of families "
+"`resource_query_*()` and `resource_*_value()`. Their implementations are "
+"located in [.filename]#kern/subr_bus.c#. The old IDE disk driver "
+"[.filename]#i386/isa/wd.c# contains examples of such use. But the standard "
+"means of configuration must always be preferred. Leave parsing the "
+"configuration resources to the bus configuration code."
+msgstr ""
+"Другие нестандартные конфигурации могут быть реализованы путем прямого "
+"доступа к ресурсам конфигурации с использованием функций семейств "
+"`resource_query_*()` и `resource_*_value()`. Их реализации находятся в "
+"[.filename]#kern/subr_bus.c#. Примеры такого использования есть в старом "
+"драйвере диска IDE [.filename]#i386/isa/wd.c#. Однако стандартные методы "
+"конфигурации всегда должны быть предпочтительны. Оставьте разбор ресурсов "
+"конфигурации коду настройки шины."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:229
+#, no-wrap
+msgid "Resources"
+msgstr "Ресурсы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:232
+msgid ""
+"The information that a user enters into the kernel configuration file is "
+"processed and passed to the kernel as configuration resources. This "
+"information is parsed by the bus configuration code and transformed into a "
+"value of structure device_t and the bus resources associated with it. The "
+"drivers may access the configuration resources directly using functions "
+"`resource_*` for more complex cases of configuration. However, generally "
+"this is neither needed nor recommended, so this issue is not discussed "
+"further here."
+msgstr ""
+"Информация, которую пользователь вводит в файл конфигурации ядра, "
+"обрабатывается и передаётся ядру в виде ресурсов конфигурации. Эта "
+"информация анализируется кодом конфигурации шины и преобразуется в значение "
+"структуры `device_t` и связанные с ней ресурсы шины. Драйверы могут напрямую "
+"обращаться к ресурсам конфигурации, используя функции `resource_*` для более "
+"сложных случаев конфигурации. Однако, как правило, в этом нет необходимости, "
+"и это не рекомендуется, поэтому данный вопрос далее не рассматривается."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:234
+msgid ""
+"The bus resources are associated with each device. They are identified by "
+"type and number within the type. For the ISA bus the following types are "
+"defined:"
+msgstr ""
+"Ресурсы шины связаны с каждым устройством. Они идентифицируются по типу и "
+"номеру внутри типа. Для шины ISA определены следующие типы:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:236
+msgid "_SYS_RES_IRQ_ - interrupt number"
+msgstr "_SYS_RES_IRQ_ - номер прерывания"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:237
+msgid "_SYS_RES_DRQ_ - ISA DMA channel number"
+msgstr "_SYS_RES_DRQ_ - номер канала ISA DMA"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:238
+msgid ""
+"_SYS_RES_MEMORY_ - range of device memory mapped into the system memory space"
+msgstr ""
+"_SYS_RES_MEMORY_ - диапазон памяти устройства, отображенный в системное "
+"адресное пространство"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:239
+msgid "_SYS_RES_IOPORT_ - range of device I/O registers"
+msgstr "_SYS_RES_IOPORT_ - диапазон регистров ввода-вывода устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:241
+msgid ""
+"The enumeration within types starts from 0, so if a device has two memory "
+"regions it would have resources of type `SYS_RES_MEMORY` numbered 0 and 1. "
+"The resource type has nothing to do with the C language type, all the "
+"resource values have the C language type `unsigned long` and must be cast as "
+"necessary. The resource numbers do not have to be contiguous, although for "
+"ISA they normally would be. The permitted resource numbers for ISA devices "
+"are:"
+msgstr ""
+"Перечисление внутри типов начинается с 0, поэтому если устройство имеет две "
+"области памяти, оно будет иметь ресурсы типа `SYS_RES_MEMORY` с номерами 0 и "
+"1. Тип ресурса не связан с типом языка C, все значения ресурсов имеют тип "
+"`unsigned long` в языке C и должны быть приведены по мере необходимости. "
+"Номера ресурсов не обязательно должны быть последовательными, хотя для ISA "
+"они обычно таковыми являются. Допустимые номера ресурсов для устройств ISA:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:248
+#, no-wrap
+msgid ""
+" IRQ: 0-1\n"
+" DRQ: 0-1\n"
+" MEMORY: 0-3\n"
+" IOPORT: 0-7\n"
+msgstr ""
+" IRQ: 0-1\n"
+" DRQ: 0-1\n"
+" MEMORY: 0-3\n"
+" IOPORT: 0-7\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:251
+msgid ""
+"All the resources are represented as ranges, with a start value and count. "
+"For IRQ and DRQ resources the count would normally be equal to 1. The values "
+"for memory refer to the physical addresses."
+msgstr ""
+"Все ресурсы представлены в виде диапазонов с начальным значением и "
+"количеством. Для ресурсов IRQ и DRQ количество обычно равно 1. Значения для "
+"памяти относятся к физическим адресам."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:253
+msgid "Three types of activities can be performed on resources:"
+msgstr "Три типа действий могут выполняться над ресурсами:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:255
+msgid "set/get"
+msgstr "Установка — set/get"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:256
+msgid "allocate/release"
+msgstr "Выделение — allocate/release"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:257
+msgid "activate/deactivate"
+msgstr "Активация — activate/deactivate"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:259
+msgid ""
+"Setting sets the range used by the resource. Allocation reserves the "
+"requested range that no other driver would be able to reserve it (and "
+"checking that no other driver reserved this range already). Activation makes "
+"the resource accessible to the driver by doing whatever is necessary for "
+"that (for example, for memory it would be mapping into the kernel virtual "
+"address space)."
+msgstr ""
+"Установка задает диапазон, используемый ресурсом. Выделение резервирует "
+"запрошенный диапазон, чтобы никакой другой драйвер не смог его "
+"зарезервировать (и проверяет, что никакой другой драйвер уже не "
+"зарезервировал этот диапазон). Активация делает ресурс доступным для "
+"драйвера, выполняя все необходимые для этого действия (например, для памяти "
+"это может быть отображение в виртуальное адресное пространство ядра)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:261
+msgid "The functions to manipulate resources are:"
+msgstr "Функции для управления ресурсами:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:263
+msgid ""
+"`int bus_set_resource(device_t dev, int type, int rid, u_long start, u_long "
+"count)`"
+msgstr ""
+"`int bus_set_resource(device_t dev, int type, int rid, u_long start, u_long "
+"count)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:265
+msgid ""
+"Set a range for a resource. Returns 0 if successful, error code otherwise. "
+"Normally, this function will return an error only if one of `type`, `rid`, "
+"`start` or `count` has a value that falls out of the permitted range."
+msgstr ""
+"Устанавливает диапазон для ресурса. Возвращает 0 при успешном выполнении, в "
+"противном случае — код ошибки. Обычно эта функция возвращает ошибку только в "
+"том случае, если одно из значений `type`, `rid`, `start` или `count` выходит "
+"за пределы допустимого диапазона."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:267
+msgid "dev - driver's device"
+msgstr "dev - устройство драйвера"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:268
+msgid "type - type of resource, SYS_RES_*"
+msgstr "тип - тип ресурса, SYS_RES_*"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:269
+msgid "rid - resource number (ID) within type"
+msgstr "rid - номер ресурса (ID) в пределах типа"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:270
+msgid "start, count - resource range"
+msgstr "начало, количество - диапазон ресурсов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:272
+msgid ""
+"`int bus_get_resource(device_t dev, int type, int rid, u_long *startp, "
+"u_long *countp)`"
+msgstr ""
+"`int bus_get_resource(device_t dev, int type, int rid, u_long *startp, "
+"u_long *countp)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:274
+msgid ""
+"Get the range of resource. Returns 0 if successful, error code if the "
+"resource is not defined yet."
+msgstr ""
+"Получает диапазон ресурса. Возвращает 0 при успехе, код ошибки, если ресурс "
+"ещё не определён."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:275
+msgid ""
+"`u_long bus_get_resource_start(device_t dev, int type, int rid) u_long "
+"bus_get_resource_count (device_t dev, int type, int rid)`"
+msgstr ""
+"`u_long bus_get_resource_start(device_t dev, int type, int rid) и u_long "
+"bus_get_resource_count (device_t dev, int type, int rid)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:277
+msgid ""
+"Convenience functions to get only the start or count. Return 0 in case of "
+"error, so if the resource start has 0 among the legitimate values it would "
+"be impossible to tell if the value is 0 or an error occurred. Luckily, no "
+"ISA resources for add-on drivers may have a start value equal to 0."
+msgstr ""
+"Удобные функции для получения только начала или количества. Возвращают 0 в "
+"случае ошибки, поэтому если начало ресурса может законно содержать 0, "
+"невозможно определить, является ли значение 0 или произошла ошибка. К "
+"счастью, ни один ресурс ISA для дополнительных драйверов не может иметь "
+"начальное значение, равное 0."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:278
+msgid "`void bus_delete_resource(device_t dev, int type, int rid)`"
+msgstr "`void bus_delete_resource(device_t dev, int type, int rid)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:280
+msgid "Delete a resource, make it undefined."
+msgstr "Удаляет ресурс, делает его неопределённым."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:281
+msgid ""
+"`struct resource * bus_alloc_resource(device_t dev, int type, int *rid, "
+"u_long start, u_long end, u_long count, u_int flags)`"
+msgstr ""
+"`struct resource * bus_alloc_resource(device_t dev, int type, int *rid, "
+"u_long start, u_long end, u_long count, u_int flags)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:283
+msgid ""
+"Allocate a resource as a range of count values not allocated by anyone else, "
+"somewhere between start and end. Alas, alignment is not supported. If the "
+"resource was not set yet it is automatically created. The special values of "
+"start 0 and end ~0 (all ones) means that the fixed values previously set by "
+"`bus_set_resource()` must be used instead: start and count as themselves and "
+"end=(start+count), in this case if the resource was not defined before then "
+"an error is returned. Although rid is passed by reference it is not set "
+"anywhere by the resource allocation code of the ISA bus. (The other buses "
+"may use a different approach and modify it)."
+msgstr ""
+"Выделяет ресурс как диапазон значений count, не выделенных никем другим, где-"
+"то между start и end. Увы, выравнивание не поддерживается. Если ресурс ещё "
+"не был установлен, он автоматически создаётся. Специальные значения start "
+"равное 0 и end равное ~0 (все единицы) означают, что должны использоваться "
+"фиксированные значения, ранее установленные `bus_set_resource()`: start и "
+"count как есть, а end=(start+count). В этом случае, если ресурс не был "
+"определён ранее, возвращается ошибка. Хотя rid передаётся по ссылке, он "
+"нигде не устанавливается кодом выделения ресурсов шины ISA. Другие шины "
+"могут использовать иной подход и изменять его."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:285
+msgid "Flags are a bitmap, the flags interesting for the caller are:"
+msgstr ""
+"Флаги представляют собой битовую карту. Интересные для вызывающей стороны "
+"флаги:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:287
+msgid ""
+"_RF_ACTIVE_ - causes the resource to be automatically activated after "
+"allocation."
+msgstr ""
+"_RF_ACTIVE_ - приводит к автоматической активации ресурса после его "
+"выделения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:288
+msgid ""
+"_RF_SHAREABLE_ - resource may be shared at the same time by multiple drivers."
+msgstr ""
+"_RF_SHAREABLE_ - ресурс может использоваться одновременно несколькими "
+"драйверами."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:289
+msgid ""
+"_RF_TIMESHARE_ - resource may be time-shared by multiple drivers, i.e., "
+"allocated at the same time by many but activated only by one at any given "
+"moment of time."
+msgstr ""
+"_RF_TIMESHARE_ - ресурс может разделяться по времени несколькими драйверами, "
+"т.е. выделяться одновременно многими, но активироваться только одним в любой "
+"момент времени."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:290
+msgid ""
+"Returns 0 on error. The allocated values may be obtained from the returned "
+"handle using methods `rhand_*()`."
+msgstr ""
+"Возвращает 0 при ошибке. Выделенные значения могут быть получены из "
+"возвращённого дескриптора с использованием методов `rhand_*()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:291
+msgid ""
+"`int bus_release_resource(device_t dev, int type, int rid, struct resource "
+"*r)`"
+msgstr ""
+"`int bus_release_resource(device_t dev, int type, int rid, struct resource "
+"*r)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:292
+msgid ""
+"Release the resource, r is the handle returned by `bus_alloc_resource()`. "
+"Returns 0 on success, error code otherwise."
+msgstr ""
+"Освобождает ресурс, r — это дескриптор, возвращённый `bus_alloc_resource()`. "
+"Возвращает 0 при успехе, код ошибки в противном случае."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:293
+msgid ""
+"`int bus_activate_resource(device_t dev, int type, int rid, struct resource "
+"*r) int bus_deactivate_resource(device_t dev, int type, int rid, struct "
+"resource *r)`"
+msgstr ""
+"`int bus_activate_resource(device_t dev, int type, int rid, struct resource "
+"*r) int bus_deactivate_resource(device_t dev, int type, int rid, struct "
+"resource *r)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:294
+msgid ""
+"Activate or deactivate resource. Return 0 on success, error code otherwise. "
+"If the resource is time-shared and currently activated by another driver "
+"then `EBUSY` is returned."
+msgstr ""
+"Активирует или деактивирует ресурс. Возвращает 0 при успехе, в противном "
+"случае — код ошибки. Если ресурс разделяемый и в данный момент активирован "
+"другим драйвером, возвращается `EBUSY`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:295
+msgid ""
+"`int bus_setup_intr(device_t dev, struct resource *r, int flags, "
+"driver_intr_t *handler, void *arg, void **cookiep) int "
+"bus_teardown_intr(device_t dev, struct resource *r, void *cookie)`"
+msgstr ""
+"`int bus_setup_intr(device_t dev, struct resource *r, int flags, "
+"driver_intr_t *handler, void *arg, void **cookiep) int "
+"bus_teardown_intr(device_t dev, struct resource *r, void *cookie)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:296
+msgid ""
+"Associate or de-associate the interrupt handler with a device. Return 0 on "
+"success, error code otherwise."
+msgstr ""
+"Связывает или разрывает связь обработчика прерывания с устройством. "
+"Возвращает 0 при успехе, код ошибки в противном случае."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:297
+msgid "r - the activated resource handler describing the IRQ"
+msgstr "r - активированный обработчик ресурсов, описывающий IRQ"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:299
+msgid "flags - the interrupt priority level, one of:"
+msgstr "flags - уровень приоритета прерывания, один из:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:301
+msgid ""
+"`INTR_TYPE_TTY` - terminals and other likewise character-type devices. To "
+"mask them use `spltty()`."
+msgstr ""
+"`INTR_TYPE_TTY` - терминалы и другие аналогичные символьные устройства. Для "
+"их маскировки используйте `spltty()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:302
+msgid ""
+"`(INTR_TYPE_TTY | INTR_TYPE_FAST)` - terminal type devices with small input "
+"buffer, critical to the data loss on input (such as the old-fashioned serial "
+"ports). To mask them use `spltty()`."
+msgstr ""
+"`(INTR_TYPE_TTY | INTR_TYPE_FAST)` - терминальные устройства с малым буфером "
+"ввода, критичные к потере данных на входе (например, устаревшие "
+"последовательные порты). Для их маскирования используйте `spltty()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:303
+msgid ""
+"`INTR_TYPE_BIO` - block-type devices, except those on the CAM controllers. "
+"To mask them use `splbio()`."
+msgstr ""
+"`INTR_TYPE_BIO` - блочные устройства, за исключением тех, что подключены к "
+"контроллерам CAM. Для их маскирования используйте `splbio()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:304
+msgid ""
+"`INTR_TYPE_CAM` - CAM (Common Access Method) bus controllers. To mask them "
+"use `splcam()`."
+msgstr ""
+"`INTR_TYPE_CAM` - контроллеры шины CAM (Common Access Method). Для их "
+"маскирования используйте `splcam()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:305
+msgid ""
+"`INTR_TYPE_NET` - network interface controllers. To mask them use `splimp()`."
+msgstr ""
+"`INTR_TYPE_NET` - контроллеры сетевых интерфейсов. Для их маскирования "
+"используйте `splimp()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:306
+msgid ""
+"`INTR_TYPE_MISC` - miscellaneous devices. There is no other way to mask them "
+"than by `splhigh()` which masks all interrupts."
+msgstr ""
+"`INTR_TYPE_MISC` — прочие устройства. Нет другого способа их маскировки, "
+"кроме `splhigh()`, который маскирует все прерывания."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:308
+msgid ""
+"When an interrupt handler executes all the other interrupts matching its "
+"priority level will be masked. The only exception is the MISC level for "
+"which no other interrupts are masked and which is not masked by any other "
+"interrupt."
+msgstr ""
+"Когда обработчик прерывания выполняется, все другие прерывания, "
+"соответствующие его уровню приоритета, будут заблокированы. Единственное "
+"исключение — уровень MISC, для которого никакие другие прерывания не "
+"блокируются и который сам не блокируется другими прерываниями."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:310
+msgid ""
+"_handler_ - pointer to the handler function, the type driver_intr_t is "
+"defined as `void driver_intr_t(void *)`"
+msgstr ""
+"_handler_ - указатель на функцию-обработчик, тип driver_intr_t определён как "
+"`void driver_intr_t(void *)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:311
+msgid ""
+"_arg_ - the argument passed to the handler to identify this particular "
+"device. It is cast from void* to any real type by the handler. The old "
+"convention for the ISA interrupt handlers was to use the unit number as "
+"argument, the new (recommended) convention is using a pointer to the device "
+"softc structure."
+msgstr ""
+"_arg_ - аргумент, передаваемый обработчику для идентификации конкретного "
+"устройства. Приводится обработчиком от void* к фактическому типу. Старая "
+"конвенция для обработчиков прерываний ISA предполагала использование номера "
+"устройства в качестве аргумента, новая (рекомендуемая) конвенция "
+"предполагает использование указателя на структуру softc устройства."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:312
+msgid ""
+"_cookie[p]_ - the value received from `setup()` is used to identify the "
+"handler when passed to `teardown()`"
+msgstr ""
+"_cookie[p]_ - значение, полученное из `setup()`, используется для "
+"идентификации обработчика при передаче в `teardown()`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:314
+msgid ""
+"A number of methods are defined to operate on the resource handlers (struct "
+"resource *). Those of interest to the device driver writers are:"
+msgstr ""
+"Определены несколько методов для работы с обработчиками ресурсов (struct "
+"resource *). Вот те из них, которые представляют интерес для разработчиков "
+"драйверов устройств:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:316
+msgid ""
+"`u_long rman_get_start(r) u_long rman_get_end(r)` Get the start and end of "
+"allocated resource range."
+msgstr ""
+"`u_long rman_get_start(r) u_long rman_get_end(r)` Получают начало и конец "
+"выделенного диапазона ресурсов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:317
+msgid ""
+"`void *rman_get_virtual(r)` Get the virtual address of activated memory "
+"resource."
+msgstr ""
+"`void *rman_get_virtual(r)` Получает виртуальный адрес активированного "
+"ресурса памяти."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:319
+#, no-wrap
+msgid "Bus Memory Mapping"
+msgstr "Отображение памяти шины"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:322
+msgid ""
+"In many cases data is exchanged between the driver and the device through "
+"the memory. Two variants are possible:"
+msgstr ""
+"Во многих случаях данные передаются между драйвером и устройством через "
+"память. Возможны два варианта:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:324
+msgid "(a) memory is located on the device card"
+msgstr "(а) память расположена на карте устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:326
+msgid "(b) memory is the main memory of the computer"
+msgstr "(b) память — это основная память компьютера"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:328
+msgid ""
+"In case (a) the driver always copies the data back and forth between the on-"
+"card memory and the main memory as necessary. To map the on-card memory into "
+"the kernel virtual address space the physical address and length of the on-"
+"card memory must be defined as a `SYS_RES_MEMORY` resource. That resource "
+"can then be allocated and activated, and its virtual address obtained using "
+"`rman_get_virtual()`. The older drivers used the function `pmap_mapdev()` "
+"for this purpose, which should not be used directly any more. Now it is one "
+"of the internal steps of resource activation."
+msgstr ""
+"В случае (a) драйвер всегда копирует данные между памятью на карте и "
+"основной памятью по мере необходимости. Для отображения памяти на карте в "
+"виртуальное адресное пространство ядра физический адрес и длина памяти на "
+"карте должны быть определены как ресурс `SYS_RES_MEMORY`. Этот ресурс может "
+"быть затем выделен и активирован, а его виртуальный адрес получен с помощью "
+"`rman_get_virtual()`. Более старые драйверы использовали для этой цели "
+"функцию `pmap_mapdev()`, которую больше не следует использовать напрямую. "
+"Теперь это один из внутренних шагов активации ресурса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:330
+msgid ""
+"Most of the ISA cards will have their memory configured for physical "
+"location somewhere in range 640KB-1MB. Some of the ISA cards require larger "
+"memory ranges which should be placed somewhere under 16MB (because of the 24-"
+"bit address limitation on the ISA bus). In that case if the machine has more "
+"memory than the start address of the device memory (in other words, they "
+"overlap) a memory hole must be configured at the address range used by "
+"devices. Many BIOSes allow configuration of a memory hole of 1MB starting at "
+"14MB or 15MB. FreeBSD can handle the memory holes properly if the BIOS "
+"reports them properly (this feature may be broken on old BIOSes)."
+msgstr ""
+"Большинство ISA-карт имеют память, настроенную на физическое расположение в "
+"диапазоне 640 КБ–1 МБ. Некоторые ISA-карты требуют большего диапазона "
+"памяти, который должен быть размещён ниже 16 МБ (из-за 24-битного "
+"ограничения адресации на шине ISA). В таком случае, если в машине больше "
+"памяти, чем начальный адрес памяти устройства (другими словами, они "
+"пересекаются), необходимо настроить \"дыру\" в памяти по диапазону адресов, "
+"используемому устройствами. Многие BIOS позволяют настроить \"дыру\" в "
+"памяти размером 1 МБ, начиная с 14 МБ или 15 МБ. FreeBSD корректно "
+"обрабатывает \"дыры\" в памяти, если BIOS правильно их сообщает (эта функция "
+"может не работать в старых BIOS)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:332
+msgid ""
+"In case (b) just the address of the data is sent to the device, and the "
+"device uses DMA to actually access the data in the main memory. Two "
+"limitations are present: First, ISA cards can only access memory below 16MB. "
+"Second, the contiguous pages in virtual address space may not be contiguous "
+"in physical address space, so the device may have to do scatter/gather "
+"operations. The bus subsystem provides ready solutions for some of these "
+"problems, the rest has to be done by the drivers themselves."
+msgstr ""
+"В случае (b) только адрес данных отправляется на устройство, и устройство "
+"использует DMA для фактического доступа к данным в основной памяти. "
+"Существуют два ограничения: во-первых, карты ISA могут обращаться только к "
+"памяти ниже 16 МБ. Во-вторых, непрерывные страницы в виртуальном адресном "
+"пространстве могут не быть непрерывными в физическом адресном пространстве, "
+"поэтому устройству может потребоваться выполнять операции scatter/gather. "
+"Подсистема шины предоставляет готовые решения для некоторых из этих проблем, "
+"остальное должно быть реализовано самими драйверами."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:334
+msgid ""
+"Two structures are used for DMA memory allocation, `bus_dma_tag_t` and "
+"`bus_dmamap_t`. Tag describes the properties required for the DMA memory. "
+"Map represents a memory block allocated according to these properties. "
+"Multiple maps may be associated with the same tag."
+msgstr ""
+"Для выделения памяти DMA используются две структуры: `bus_dma_tag_t` и "
+"`bus_dmamap_t`. Тег (`tag`) описывает свойства, необходимые для памяти DMA. "
+"Карта (`map`) представляет собой блок памяти, выделенный в соответствии с "
+"этими свойствами. С одним тегом может быть связано несколько карт."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:336
+msgid ""
+"Tags are organized into a tree-like hierarchy with inheritance of the "
+"properties. A child tag inherits all the requirements of its parent tag, and "
+"may make them more strict but never more loose."
+msgstr ""
+"Теги организованы в иерархию в виде дерева с наследованием свойств. Дочерний "
+"тег наследует все требования родительского тега и может делать их более "
+"строгими, но никогда более мягкими."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:338
+msgid ""
+"Normally one top-level tag (with no parent) is created for each device unit. "
+"If multiple memory areas with different requirements are needed for each "
+"device then a tag for each of them may be created as a child of the parent "
+"tag."
+msgstr ""
+"Обычно создается один корневой тег (без родителя) для каждого устройства. "
+"Если для каждого устройства требуется несколько областей памяти с разными "
+"требованиями, то для каждой из них может быть создан тег как дочерний по "
+"отношению к родительскому тегу."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:340
+msgid "The tags can be used to create a map in two ways."
+msgstr "Теги могут быть использованы для создания карты двумя способами."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:342
+msgid ""
+"First, a chunk of contiguous memory conformant with the tag requirements may "
+"be allocated (and later may be freed). This is normally used to allocate "
+"relatively long-living areas of memory for communication with the device. "
+"Loading of such memory into a map is trivial: it is always considered as one "
+"chunk in the appropriate physical memory range."
+msgstr ""
+"Сначала может быть выделен (а затем освобожден) блок непрерывной памяти, "
+"соответствующий требованиям тега. Обычно это используется для выделения "
+"относительно долгоживущих областей памяти для взаимодействия с устройством. "
+"Загрузка такой памяти в карту тривиальна: она всегда рассматривается как "
+"один блок в соответствующем диапазоне физической памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:344
+msgid ""
+"Second, an arbitrary area of virtual memory may be loaded into a map. Each "
+"page of this memory will be checked for conformance to the map requirement. "
+"If it conforms then it is left at its original location. If it is not then a "
+"fresh conformant \"bounce page\" is allocated and used as intermediate "
+"storage. When writing the data from the non-conformant original pages they "
+"will be copied to their bounce pages first and then transferred from the "
+"bounce pages to the device. When reading the data would go from the device "
+"to the bounce pages and then copied to their non-conformant original pages. "
+"The process of copying between the original and bounce pages is called "
+"synchronization. This is normally used on a per-transfer basis: buffer for "
+"each transfer would be loaded, transfer done and buffer unloaded."
+msgstr ""
+"Второй момент: произвольная область виртуальной памяти может быть загружена "
+"в карту. Каждая страница этой памяти будет проверяться на соответствие "
+"требованиям карты. Если она соответствует, то остается на своем исходном "
+"месте. Если нет, то выделяется новая соответствующая промежуточная страница "
+"(bounce page), которая используется как промежуточное хранилище. При записи "
+"данных с несоответствующих исходных страниц они сначала копируются на свои "
+"промежуточные страницы, а затем передаются с промежуточных страниц на "
+"устройство. При чтении данные поступают с устройства на промежуточные "
+"страницы, а затем копируются на свои несоответствующие исходные страницы. "
+"Процесс копирования между исходными и промежуточными страницами называется "
+"синхронизацией. Обычно это используется для каждой передачи: буфер для "
+"каждой передачи загружается, передача выполняется, и буфер выгружается."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:346
+msgid "The functions working on the DMA memory are:"
+msgstr "Функции, работающие с памятью DMA:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:348
+msgid ""
+"`int bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, "
+"bus_size_t boundary, bus_addr_t lowaddr, bus_addr_t highaddr, "
+"bus_dma_filter_t *filter, void *filterarg, bus_size_t maxsize, int "
+"nsegments, bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat)`"
+msgstr ""
+"`int bus_dma_tag_create(bus_dma_tag_t parent, bus_size_t alignment, "
+"bus_size_t boundary, bus_addr_t lowaddr, bus_addr_t highaddr, "
+"bus_dma_filter_t *filter, void *filterarg, bus_size_t maxsize, int "
+"nsegments, bus_size_t maxsegsz, int flags, bus_dma_tag_t *dmat)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:350
+msgid "Create a new tag. Returns 0 on success, the error code otherwise."
+msgstr ""
+"Создать новый тег. Возвращает 0 при успехе, код ошибки в противном случае."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:352
+msgid "_parent_ - parent tag, or NULL to create a top-level tag."
+msgstr ""
+"_parent_ - родительский тег, или NULL для создания тега верхнего уровня."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:353
+msgid ""
+"_alignment_ - required physical alignment of the memory area to be allocated "
+"for this tag. Use value 1 for \"no specific alignment\". Applies only to the "
+"future `bus_dmamem_alloc()` but not `bus_dmamap_create()` calls."
+msgstr ""
+"_alignment_ - требуемое физическое выравнивание области памяти, которая "
+"будет выделена для этого тега. Используйте значение 1 для \"без "
+"специфического выравнивания\". Применяется только к будущим вызовам "
+"`bus_dmamem_alloc()`, но не `bus_dmamap_create()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:354
+msgid ""
+"_boundary_ - physical address boundary that must not be crossed when "
+"allocating the memory. Use value 0 for \"no boundary\". Applies only to the "
+"future `bus_dmamem_alloc()` but not `bus_dmamap_create()` calls. Must be "
+"power of 2. If the memory is planned to be used in non-cascaded DMA mode "
+"(i.e., the DMA addresses will be supplied not by the device itself but by "
+"the ISA DMA controller) then the boundary must be no larger than 64KB "
+"(64*1024) due to the limitations of the DMA hardware."
+msgstr ""
+"_boundary_ - физическая граница адреса, которую нельзя пересекать при "
+"выделении памяти. Используйте значение 0 для обозначения \"нет границы\". "
+"Применяется только к будущим вызовам `bus_dmamem_alloc()`, но не "
+"`bus_dmamap_create()`. Должна быть степенью 2. Если память планируется "
+"использовать в некаскадном режиме DMA (т.е. адреса DMA будут предоставляться "
+"не самим устройством, а контроллером DMA ISA), то граница не должна "
+"превышать 64 КБ (64*1024) из-за ограничений аппаратного обеспечения DMA."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:355
+msgid ""
+"_lowaddr, highaddr_ - the names are slightly misleading; these values are "
+"used to limit the permitted range of physical addresses used to allocate the "
+"memory. The exact meaning varies depending on the planned future use:"
+msgstr ""
+"_lowaddr, highaddr_ - названия немного вводят в заблуждение; эти значения "
+"используются для ограничения допустимого диапазона физических адресов, "
+"используемых для выделения памяти. Точное значение зависит от "
+"предполагаемого будущего использования:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:357
+msgid ""
+"For `bus_dmamem_alloc()` all the addresses from 0 to lowaddr-1 are "
+"considered permitted, the higher ones are forbidden."
+msgstr ""
+"Для `bus_dmamem_alloc()` все адреса от 0 до lowaddr-1 считаются "
+"разрешёнными, а более высокие — запрещёнными."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:358
+msgid ""
+"For `bus_dmamap_create()` all the addresses outside the inclusive range "
+"[lowaddr; highaddr] are considered accessible. The addresses of pages inside "
+"the range are passed to the filter function which decides if they are "
+"accessible. If no filter function is supplied then all the range is "
+"considered unaccessible."
+msgstr ""
+"Для `bus_dmamap_create()` все адреса вне включительного диапазона [lowaddr; "
+"highaddr] считаются доступными. Адреса страниц внутри диапазона передаются в "
+"функцию-фильтр, которая определяет, доступны ли они. Если функция-фильтр не "
+"предоставлена, то весь диапазон считается недоступным."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:359
+msgid "For the ISA devices the normal values (with no filter function) are:"
+msgstr "Для устройств ISA обычные значения (без функции фильтрации) следующие:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:361
+msgid "lowaddr = BUS_SPACE_MAXADDR_24BIT"
+msgstr "lowaddr = BUS_SPACE_MAXADDR_24BIT"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:363
+msgid "highaddr = BUS_SPACE_MAXADDR"
+msgstr "highaddr = BUS_SPACE_MAXADDR"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:365
+msgid ""
+"_filter, filterarg_ - the filter function and its argument. If NULL is "
+"passed for filter then the whole range [lowaddr, highaddr] is considered "
+"unaccessible when doing `bus_dmamap_create()`. Otherwise the physical "
+"address of each attempted page in range [lowaddr; highaddr] is passed to the "
+"filter function which decides if it is accessible. The prototype of the "
+"filter function is: `int filterfunc(void *arg, bus_addr_t paddr)`. It must "
+"return 0 if the page is accessible, non-zero otherwise."
+msgstr ""
+"_filter, filterarg_ - функция фильтра и её аргумент. Если передаётся NULL "
+"для filter, то весь диапазон [lowaddr, highaddr] считается недоступным при "
+"выполнении `bus_dmamap_create()`. В противном случае физический адрес каждой "
+"страницы в диапазоне [lowaddr; highaddr] передаётся в функцию фильтра, "
+"которая определяет, доступна ли она. Прототип функции фильтра: `int "
+"filterfunc(void *arg, bus_addr_t paddr)`. Функция должна вернуть 0, если "
+"страница доступна, и ненулевое значение в противном случае."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:366
+msgid ""
+"_maxsize_ - the maximal size of memory (in bytes) that may be allocated "
+"through this tag. In case it is difficult to estimate or could be "
+"arbitrarily big, the value for ISA devices would be "
+"`BUS_SPACE_MAXSIZE_24BIT`."
+msgstr ""
+"_maxsize_ - максимальный размер памяти (в байтах), который может быть "
+"выделен через этот тег. Если сложно оценить или он может быть произвольно "
+"большим, для устройств ISA следует использовать значение "
+"`BUS_SPACE_MAXSIZE_24BIT`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:367
+msgid ""
+"_nsegments_ - maximal number of scatter-gather segments supported by the "
+"device. If unrestricted then the value `BUS_SPACE_UNRESTRICTED` should be "
+"used. This value is recommended for the parent tags, the actual restrictions "
+"would then be specified for the descendant tags. Tags with nsegments equal "
+"to `BUS_SPACE_UNRESTRICTED` may not be used to actually load maps, they may "
+"be used only as parent tags. The practical limit for nsegments seems to be "
+"about 250-300, higher values will cause kernel stack overflow (the hardware "
+"can not normally support that many scatter-gather buffers anyway)."
+msgstr ""
+"_nsegments_ - максимальное количество сегментов scatter-gather, "
+"поддерживаемых устройством. Если ограничений нет, следует использовать "
+"значение `BUS_SPACE_UNRESTRICTED`. Это значение рекомендуется для "
+"родительских тегов, фактические ограничения затем будут указаны для дочерних "
+"тегов. Теги с nsegments равным `BUS_SPACE_UNRESTRICTED` не могут "
+"использоваться для фактической загрузки отображений, они могут применяться "
+"только как родительские теги. Практический предел для nsegments составляет "
+"около 250-300, более высокие значения вызовут переполнение стека ядра "
+"(аппаратное обеспечение обычно не поддерживает такое большое количество "
+"scatter-gather буферов в любом случае)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:368
+msgid ""
+"_maxsegsz_ - maximal size of a scatter-gather segment supported by the "
+"device. The maximal value for ISA device would be `BUS_SPACE_MAXSIZE_24BIT`."
+msgstr ""
+"_maxsegsz_ — максимальный размер сегмента scatter-gather, поддерживаемый "
+"устройством. Максимальное значение для устройства ISA будет "
+"`BUS_SPACE_MAXSIZE_24BIT`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:369
+msgid "_flags_ - a bitmap of flags. The only interesting flag is:"
+msgstr "_flags_ - битовая маска флагов. Единственный интересный флаг:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:371
+msgid ""
+"_BUS_DMA_ALLOCNOW_ - requests to allocate all the potentially needed bounce "
+"pages when creating the tag."
+msgstr ""
+"_BUS_DMA_ALLOCNOW_ - запрашивает выделение всех потенциально необходимых "
+"промежуточных страниц при создании тега."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:373
+msgid "_dmat_ - pointer to the storage for the new tag to be returned."
+msgstr "_dmat_ - указатель на хранилище для нового возвращаемого тега."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:375
+msgid "`int bus_dma_tag_destroy(bus_dma_tag_t dmat)`"
+msgstr "`int bus_dma_tag_destroy(bus_dma_tag_t dmat)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:377
+msgid "Destroy a tag. Returns 0 on success, the error code otherwise."
+msgstr ""
+"Уничтожить тег. Возвращает 0 при успехе, код ошибки в противном случае."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:379
+msgid "dmat - the tag to be destroyed."
+msgstr "dmat - тег, который должен быть уничтожен."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:380
+msgid ""
+"`int bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, "
+"bus_dmamap_t *mapp)`"
+msgstr ""
+"`int bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, "
+"bus_dmamap_t *mapp)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:382
+msgid ""
+"Allocate an area of contiguous memory described by the tag. The size of "
+"memory to be allocated is tag's maxsize. Returns 0 on success, the error "
+"code otherwise. The result still has to be loaded by `bus_dmamap_load()` "
+"before being used to get the physical address of the memory."
+msgstr ""
+"Выделить область непрерывной памяти, описанную тегом. Размер выделяемой "
+"памяти соответствует maxsize тега. Возвращает 0 при успехе, иначе код "
+"ошибки. Результат всё ещё должен быть загружен с помощью `bus_dmamap_load()` "
+"перед использованием для получения физического адреса памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:384
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:396
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:404
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:419
+msgid "_dmat_ - the tag"
+msgstr "_dmat_ - тег"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:385
+msgid ""
+"_vaddr_ - pointer to the storage for the kernel virtual address of the "
+"allocated area to be returned."
+msgstr ""
+"_vaddr_ - указатель на хранилище для возвращаемого виртуального адреса ядра "
+"выделенной области."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:386
+msgid "flags - a bitmap of flags. The only interesting flag is:"
+msgstr "flags - битовая карта флагов. Единственный интересный флаг:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:388
+msgid ""
+"_BUS_DMA_NOWAIT_ - if the memory is not immediately available return the "
+"error. If this flag is not set then the routine is allowed to sleep until "
+"the memory becomes available."
+msgstr ""
+"_BUS_DMA_NOWAIT_ - если память недоступна немедленно, вернуть ошибку. Если "
+"этот флаг не установлен, то процедуре разрешено ожидать до тех пор, пока "
+"память не станет доступной."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:390
+msgid "_mapp_ - pointer to the storage for the new map to be returned."
+msgstr "_mapp_ - указатель на хранилище для возвращаемой новой карты."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:392
+msgid ""
+"`void bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)`"
+msgstr ""
+"`void bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:394
+msgid ""
+"Free the memory allocated by `bus_dmamem_alloc()`. At present, freeing of "
+"the memory allocated with ISA restrictions is not implemented. Due to this "
+"the recommended model of use is to keep and re-use the allocated areas for "
+"as long as possible. Do not lightly free some area and then shortly allocate "
+"it again. That does not mean that `bus_dmamem_free()` should not be used at "
+"all: hopefully it will be properly implemented soon."
+msgstr ""
+"Освободить память, выделенную `bus_dmamem_alloc()`. В настоящее время "
+"освобождение памяти, выделенной с ограничениями ISA, не реализовано. В связи "
+"с этим рекомендуется сохранять и повторно использовать выделенные области "
+"как можно дольше. Не следует без необходимости освобождать область и вскоре "
+"снова её выделять. Это не означает, что `bus_dmamem_free()` не следует "
+"использовать вовсе: есть надежда, что вскоре она будет реализована должным "
+"образом."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:397
+msgid "_vaddr_ - the kernel virtual address of the memory"
+msgstr "_vaddr_ - виртуальный адрес памяти ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:398
+msgid "_map_ - the map of the memory (as returned from `bus_dmamem_alloc()`)"
+msgstr "_map_ - карта памяти (как возвращается из `bus_dmamem_alloc()`)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:400
+msgid ""
+"`int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp)`"
+msgstr ""
+"`int bus_dmamap_create(bus_dma_tag_t dmat, int flags, bus_dmamap_t *mapp)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:402
+msgid ""
+"Create a map for the tag, to be used in `bus_dmamap_load()` later. Returns 0 "
+"on success, the error code otherwise."
+msgstr ""
+"Создать карту для тега, которая будет использоваться в `bus_dmamap_load()` "
+"позже. Возвращает 0 при успехе, в противном случае — код ошибки."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:405
+msgid ""
+"_flags_ - theoretically, a bit map of flags. But no flags are defined yet, "
+"so at present it will be always 0."
+msgstr ""
+"_flags_ - теоретически, битовая карта флагов. Однако пока никакие флаги не "
+"определены, поэтому в настоящее время значение всегда будет 0."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:406
+msgid "_mapp_ - pointer to the storage for the new map to be returned"
+msgstr ""
+"_mapp_ - указатель на хранилище для новой карты, которая будет возвращена"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:408
+msgid "`int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map)`"
+msgstr "`int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:410
+msgid "Destroy a map. Returns 0 on success, the error code otherwise."
+msgstr ""
+"Уничтожить карту. Возвращает 0 при успехе, в противном случае — код ошибки."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:412
+msgid "dmat - the tag to which the map is associated"
+msgstr "dmat - тег, с которым ассоциирована карта"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:413
+msgid "map - the map to be destroyed"
+msgstr "map - карта, подлежащая уничтожению"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:415
+msgid ""
+"`int bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, "
+"bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg, int "
+"flags)`"
+msgstr ""
+"`int bus_dmamap_load(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, "
+"bus_size_t buflen, bus_dmamap_callback_t *callback, void *callback_arg, int "
+"flags)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:417
+msgid ""
+"Load a buffer into the map (the map must be previously created by "
+"`bus_dmamap_create()` or `bus_dmamem_alloc()`). All the pages of the buffer "
+"are checked for conformance to the tag requirements and for those not "
+"conformant the bounce pages are allocated. An array of physical segment "
+"descriptors is built and passed to the callback routine. This callback "
+"routine is then expected to handle it in some way. The number of bounce "
+"buffers in the system is limited, so if the bounce buffers are needed but "
+"not immediately available the request will be queued and the callback will "
+"be called when the bounce buffers will become available. Returns 0 if the "
+"callback was executed immediately or `EINPROGRESS` if the request was queued "
+"for future execution. In the latter case the synchronization with queued "
+"callback routine is the responsibility of the driver."
+msgstr ""
+"Загрузить буфер в карту (карта должна быть предварительно создана с помощью "
+"`bus_dmamap_create()` или `bus_dmamem_alloc()`). Все страницы буфера "
+"проверяются на соответствие требованиям тега, и для несоответствующих "
+"выделяются промежуточные страницы. Создается массив дескрипторов физических "
+"сегментов и передается в подпрограмму обратного вызова. Ожидается, что эта "
+"подпрограмма обработает его каким-либо образом. Количество промежуточных "
+"буферов в системе ограничено, поэтому, если эти буферы требуются, но "
+"недоступны немедленно, запрос будет поставлен в очередь, и обратный вызов "
+"будет выполнен, когда промежуточные буферы станут доступны. Возвращает 0, "
+"если обратный вызов был выполнен немедленно, или `EINPROGRESS`, если запрос "
+"был поставлен в очередь для выполнения в будущем. В последнем случае "
+"синхронизация с подпрограммой обратного вызова, поставленной в очередь, "
+"является обязанностью драйвера."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:420
+msgid "_map_ - the map"
+msgstr "_map_ - карта"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:421
+msgid "_buf_ - kernel virtual address of the buffer"
+msgstr "_buf_ - виртуальный адрес буфера в пространстве ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:422
+msgid "_buflen_ - length of the buffer"
+msgstr "_buflen_ - длина буфера"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:423
+msgid "_callback_, `callback_arg` - the callback function and its argument"
+msgstr "_callback_, `callback_arg` - функция обратного вызова и её аргумент"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:425
+msgid ""
+"The prototype of callback function is: `void callback(void *arg, "
+"bus_dma_segment_t *seg, int nseg, int error)`"
+msgstr ""
+"Прототип функции обратного вызова: `void callback(void *arg, "
+"bus_dma_segment_t *seg, int nseg, int error)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:427
+msgid "_arg_ - the same as callback_arg passed to `bus_dmamap_load()`"
+msgstr ""
+"_arg_ - то же самое, что и callback_arg, переданный в `bus_dmamap_load()`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:428
+msgid "_seg_ - array of the segment descriptors"
+msgstr "_seg_ - массив дескрипторов сегментов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:429
+msgid "_nseg_ - number of descriptors in array"
+msgstr "_nseg_ - количество дескрипторов в массиве"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:430
+msgid ""
+"_error_ - indication of the segment number overflow: if it is set to `EFBIG` "
+"then the buffer did not fit into the maximal number of segments permitted by "
+"the tag. In this case only the permitted number of descriptors will be in "
+"the array. Handling of this situation is up to the driver: depending on the "
+"desired semantics it can either consider this an error or split the buffer "
+"in two and handle the second part separately"
+msgstr ""
+"_error_ - указание на переполнение номера сегмента: если установлено "
+"значение `EFBIG`, значит буфер не поместился в максимальное количество "
+"сегментов, разрешённых тегом. В этом случае в массиве будет только "
+"разрешённое количество дескрипторов. Обработка этой ситуации зависит от "
+"драйвера: в зависимости от желаемой семантики он может либо считать это "
+"ошибкой, либо разделить буфер на две части и обработать вторую часть отдельно"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:432
+msgid "Each entry in the segments array contains the fields:"
+msgstr "Каждая запись в массиве segments содержит поля:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:434
+msgid "_ds_addr_ - physical bus address of the segment"
+msgstr "_ds_addr_ - физический адрес шины сегмента"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:435
+msgid "_ds_len_ - length of the segment"
+msgstr "_ds_len_ - длина сегмента"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:437
+msgid "`void bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)`"
+msgstr "`void bus_dmamap_unload(bus_dma_tag_t dmat, bus_dmamap_t map)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:439
+msgid "unload the map."
+msgstr "выгрузить карту."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:441
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:448
+msgid "_dmat_ - tag"
+msgstr "_dmat_ - тег"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:442
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:449
+msgid "_map_ - loaded map"
+msgstr "_map_ - загруженная карта"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:444
+msgid ""
+"`void bus_dmamap_sync (bus_dma_tag_t dmat, bus_dmamap_t map, "
+"bus_dmasync_op_t op)`"
+msgstr ""
+"`void bus_dmamap_sync (bus_dma_tag_t dmat, bus_dmamap_t map, "
+"bus_dmasync_op_t op)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:446
+msgid ""
+"Synchronise a loaded buffer with its bounce pages before and after physical "
+"transfer to or from device. This is the function that does all the necessary "
+"copying of data between the original buffer and its mapped version. The "
+"buffers must be synchronized both before and after doing the transfer."
+msgstr ""
+"Синхронизировать загруженный буфер с его промежуточными страницами до и "
+"после физической передачи на устройство или с устройства. Это функция, "
+"которая выполняет все необходимое копирование данных между исходным буфером "
+"и его отображенной версией. Буферы должны быть синхронизированы как до, так "
+"и после выполнения передачи."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:450
+msgid "_op_ - type of synchronization operation to perform:"
+msgstr "_op_ - тип операции синхронизации для выполнения:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:452
+msgid "`BUS_DMASYNC_PREREAD` - before reading from device into buffer"
+msgstr "`BUS_DMASYNC_PREREAD` - перед чтением с устройства в буфер"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:453
+msgid "`BUS_DMASYNC_POSTREAD` - after reading from device into buffer"
+msgstr "`BUS_DMASYNC_POSTREAD` - после чтения из устройства в буфер"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:454
+msgid "`BUS_DMASYNC_PREWRITE` - before writing the buffer to device"
+msgstr "`BUS_DMASYNC_PREWRITE` - перед записью буфера в устройство"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:455
+msgid "`BUS_DMASYNC_POSTWRITE` - after writing the buffer to device"
+msgstr "`BUS_DMASYNC_POSTWRITE` - после записи буфера в устройство"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:457
+msgid ""
+"As of now PREREAD and POSTWRITE are null operations but that may change in "
+"the future, so they must not be ignored in the driver. Synchronization is "
+"not needed for the memory obtained from `bus_dmamem_alloc()`."
+msgstr ""
+"На данный момент PREREAD и POSTWRITE являются пустыми операциями, но это "
+"может измениться в будущем, поэтому их нельзя игнорировать в драйвере. "
+"Синхронизация не требуется для памяти, полученной из `bus_dmamem_alloc()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:459
+msgid ""
+"Before calling the callback function from `bus_dmamap_load()` the segment "
+"array is stored in the stack. And it gets pre-allocated for the maximal "
+"number of segments allowed by the tag. As a result of this the practical "
+"limit for the number of segments on i386 architecture is about 250-300 (the "
+"kernel stack is 4KB minus the size of the user structure, size of a segment "
+"array entry is 8 bytes, and some space must be left). Since the array is "
+"allocated based on the maximal number this value must not be set higher than "
+"really needed. Fortunately, for most of hardware the maximal supported "
+"number of segments is much lower. But if the driver wants to handle buffers "
+"with a very large number of scatter-gather segments it should do that in "
+"portions: load part of the buffer, transfer it to the device, load next part "
+"of the buffer, and so on."
+msgstr ""
+"Перед вызовом функции обратного вызова из `bus_dmamap_load()` массив "
+"сегментов сохраняется в стеке. Он предварительно выделяется для "
+"максимального количества сегментов, разрешенного тегом. В результате этого "
+"практический предел количества сегментов на архитектуре i386 составляет "
+"около 250-300 (размер стека ядра — 4 КБ минус размер структуры пользователя, "
+"размер элемента массива сегментов — 8 байт, и необходимо оставить некоторое "
+"пространство). Поскольку массив выделяется исходя из максимального числа, "
+"это значение не должно быть установлено выше, чем действительно необходимо. "
+"К счастью, для большинства оборудования максимально поддерживаемое "
+"количество сегментов значительно ниже. Но если драйвер должен обрабатывать "
+"буферы с очень большим количеством сегментов scatter-gather, он должен "
+"делать это по частям: загрузить часть буфера, передать его устройству, "
+"загрузить следующую часть буфера и так далее."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:461
+msgid ""
+"Another practical consequence is that the number of segments may limit the "
+"size of the buffer. If all the pages in the buffer happen to be physically "
+"non-contiguous then the maximal supported buffer size for that fragmented "
+"case would be (nsegments * page_size). For example, if a maximal number of "
+"10 segments is supported then on i386 maximal guaranteed supported buffer "
+"size would be 40K. If a higher size is desired then special tricks should be "
+"used in the driver."
+msgstr ""
+"Еще одно практическое следствие заключается в том, что количество сегментов "
+"может ограничивать размер буфера. Если все страницы в буфере окажутся "
+"физически несмежными, то максимальный поддерживаемый размер буфера для "
+"такого фрагментированного случая будет равен (nsegments * page_size). "
+"Например, если поддерживается максимальное количество сегментов, равное 10, "
+"то на i386 максимальный гарантированно поддерживаемый размер буфера составит "
+"40K. Если требуется больший размер, то в драйвере следует использовать "
+"специальные приемы."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:463
+msgid ""
+"If the hardware does not support scatter-gather at all or the driver wants "
+"to support some buffer size even if it is heavily fragmented then the "
+"solution is to allocate a contiguous buffer in the driver and use it as "
+"intermediate storage if the original buffer does not fit."
+msgstr ""
+"Если оборудование не поддерживает scatter-gather вообще или драйвер хочет "
+"поддерживать некоторый размер буфера, даже если он сильно фрагментирован, то "
+"решение состоит в выделении непрерывного буфера в драйвере и использовании "
+"его в качестве промежуточного хранилища, если исходный буфер не подходит."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:465
+msgid ""
+"Below are the typical call sequences when using a map depend on the use of "
+"the map. The characters -> are used to show the flow of time."
+msgstr ""
+"Ниже представлены типичные последовательности вызовов при использовании "
+"карты в зависимости от её назначения. Символы -> используются для "
+"обозначения последовательности во времени."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:467
+msgid ""
+"For a buffer which stays practically fixed during all the time between "
+"attachment and detachment of a device:"
+msgstr ""
+"Для буфера, который остается практически неизменным в течение всего времени "
+"между присоединением и отсоединением устройства:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:469
+msgid ""
+"bus_dmamem_alloc -> bus_dmamap_load -> ...use buffer... -> -> "
+"bus_dmamap_unload -> bus_dmamem_free"
+msgstr ""
+"bus_dmamem_alloc -> bus_dmamap_load -> ...use buffer... -> -> "
+"bus_dmamap_unload -> bus_dmamem_free"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:471
+msgid ""
+"For a buffer that changes frequently and is passed from outside the driver:"
+msgstr "Для буфера, который часто изменяется и передается извне драйвера:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:480
+#, no-wrap
+msgid ""
+" bus_dmamap_create ->\n"
+" -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->\n"
+" -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->\n"
+" ...\n"
+" -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->\n"
+" -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->\n"
+" -> bus_dmamap_destroy\n"
+msgstr ""
+" bus_dmamap_create ->\n"
+" -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->\n"
+" -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->\n"
+" ...\n"
+" -> bus_dmamap_load -> bus_dmamap_sync(PRE...) -> do transfer ->\n"
+" -> bus_dmamap_sync(POST...) -> bus_dmamap_unload ->\n"
+" -> bus_dmamap_destroy\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:483
+msgid ""
+"When loading a map created by `bus_dmamem_alloc()` the passed address and "
+"size of the buffer must be the same as used in `bus_dmamem_alloc()`. In this "
+"case it is guaranteed that the whole buffer will be mapped as one segment "
+"(so the callback may be based on this assumption) and the request will be "
+"executed immediately (EINPROGRESS will never be returned). All the callback "
+"needs to do in this case is to save the physical address."
+msgstr ""
+"При загрузке карты, созданной `bus_dmamem_alloc()`, переданные адрес и "
+"размер буфера должны быть такими же, как использованные в "
+"`bus_dmamem_alloc()`. В этом случае гарантируется, что весь буфер будет "
+"отображен как один сегмент (так что обратный вызов может основываться на "
+"этом предположении) и запрос будет выполнен немедленно (EINPROGRESS никогда "
+"не будет возвращен). Все, что нужно сделать обратному вызову в этом случае, "
+"— это сохранить физический адрес."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:485
+msgid "A typical example would be:"
+msgstr "Типичный пример:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:493
+#, no-wrap
+msgid ""
+" static void\n"
+" alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)\n"
+" {\n"
+" *(bus_addr_t *)arg = seg[0].ds_addr;\n"
+" }\n"
+msgstr ""
+" static void\n"
+" alloc_callback(void *arg, bus_dma_segment_t *seg, int nseg, int error)\n"
+" {\n"
+" *(bus_addr_t *)arg = seg[0].ds_addr;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:504
+#, no-wrap
+msgid ""
+" ...\n"
+" int error;\n"
+" struct somedata {\n"
+" ....\n"
+" };\n"
+" struct somedata *vsomedata; /* virtual address */\n"
+" bus_addr_t psomedata; /* physical bus-relative address */\n"
+" bus_dma_tag_t tag_somedata;\n"
+" bus_dmamap_t map_somedata;\n"
+" ...\n"
+msgstr ""
+" ...\n"
+" int error;\n"
+" struct somedata {\n"
+" ....\n"
+" };\n"
+" struct somedata *vsomedata; /* virtual address */\n"
+" bus_addr_t psomedata; /* physical bus-relative address */\n"
+" bus_dma_tag_t tag_somedata;\n"
+" bus_dmamap_t map_somedata;\n"
+" ...\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:512
+#, no-wrap
+msgid ""
+" error=bus_dma_tag_create(parent_tag, alignment,\n"
+" boundary, lowaddr, highaddr, /*filter*/ NULL, /*filterarg*/ NULL,\n"
+" /*maxsize*/ sizeof(struct somedata), /*nsegments*/ 1,\n"
+" /*maxsegsz*/ sizeof(struct somedata), /*flags*/ 0,\n"
+" &tag_somedata);\n"
+" if(error)\n"
+" return error;\n"
+msgstr ""
+" error=bus_dma_tag_create(parent_tag, alignment,\n"
+" boundary, lowaddr, highaddr, /*filter*/ NULL, /*filterarg*/ NULL,\n"
+" /*maxsize*/ sizeof(struct somedata), /*nsegments*/ 1,\n"
+" /*maxsegsz*/ sizeof(struct somedata), /*flags*/ 0,\n"
+" &tag_somedata);\n"
+" if(error)\n"
+" return error;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:517
+#, no-wrap
+msgid ""
+" error = bus_dmamem_alloc(tag_somedata, &vsomedata, /* flags*/ 0,\n"
+" &map_somedata);\n"
+" if(error)\n"
+" return error;\n"
+msgstr ""
+" error = bus_dmamem_alloc(tag_somedata, &vsomedata, /* flags*/ 0,\n"
+" &map_somedata);\n"
+" if(error)\n"
+" return error;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:521
+#, no-wrap
+msgid ""
+" bus_dmamap_load(tag_somedata, map_somedata, (void *)vsomedata,\n"
+" sizeof (struct somedata), alloc_callback,\n"
+" (void *) &psomedata, /*flags*/0);\n"
+msgstr ""
+" bus_dmamap_load(tag_somedata, map_somedata, (void *)vsomedata,\n"
+" sizeof (struct somedata), alloc_callback,\n"
+" (void *) &psomedata, /*flags*/0);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:524
+msgid ""
+"Looks a bit long and complicated but that is the way to do it. The practical "
+"consequence is: if multiple memory areas are allocated always together it "
+"would be a really good idea to combine them all into one structure and "
+"allocate as one (if the alignment and boundary limitations permit)."
+msgstr ""
+"Выглядит немного длинно и сложно, но это правильный способ. Практическое "
+"следствие таково: если несколько областей памяти выделяются всегда вместе, "
+"было бы отличной идеей объединить их все в одну структуру и выделять как "
+"единое целое (если ограничения выравнивания и границ позволяют)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:526
+msgid ""
+"When loading an arbitrary buffer into the map created by "
+"`bus_dmamap_create()` special measures must be taken to synchronize with the "
+"callback in case it would be delayed. The code would look like:"
+msgstr ""
+"При загрузке произвольного буфера в карту, созданную `bus_dmamap_create()`, "
+"необходимо принять специальные меры для синхронизации с обратным вызовом, "
+"если он будет задержан. Код будет выглядеть следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:532
+#, no-wrap
+msgid ""
+" {\n"
+" int s;\n"
+" int error;\n"
+msgstr ""
+" {\n"
+" int s;\n"
+" int error;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:551
+#, no-wrap
+msgid ""
+" s = splsoftvm();\n"
+" error = bus_dmamap_load(\n"
+" dmat,\n"
+" dmamap,\n"
+" buffer_ptr,\n"
+" buffer_len,\n"
+" callback,\n"
+" /*callback_arg*/ buffer_descriptor,\n"
+" /*flags*/0);\n"
+" if (error == EINPROGRESS) {\n"
+" /*\n"
+" * Do whatever is needed to ensure synchronization\n"
+" * with callback. Callback is guaranteed not to be started\n"
+" * until we do splx() or tsleep().\n"
+" */\n"
+" }\n"
+" splx(s);\n"
+" }\n"
+msgstr ""
+" s = splsoftvm();\n"
+" error = bus_dmamap_load(\n"
+" dmat,\n"
+" dmamap,\n"
+" buffer_ptr,\n"
+" buffer_len,\n"
+" callback,\n"
+" /*callback_arg*/ buffer_descriptor,\n"
+" /*flags*/0);\n"
+" if (error == EINPROGRESS) {\n"
+" /*\n"
+" * Do whatever is needed to ensure synchronization\n"
+" * with callback. Callback is guaranteed not to be started\n"
+" * until we do splx() or tsleep().\n"
+" */\n"
+" }\n"
+" splx(s);\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:554
+msgid "Two possible approaches for the processing of requests are:"
+msgstr "Два возможных подхода для обработки запросов:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:556
+msgid ""
+"If requests are completed by marking them explicitly as done (such as the "
+"CAM requests) then it would be simpler to put all the further processing "
+"into the callback driver which would mark the request when it is done. Then "
+"not much extra synchronization is needed. For the flow control reasons it "
+"may be a good idea to freeze the request queue until this request gets "
+"completed."
+msgstr ""
+"Если запросы завершаются путём явной пометки их как выполненных (например, "
+"запросы CAM), то было бы проще поместить всю дальнейшую обработку в драйвер "
+"обратного вызова, который отмечал бы запрос по его завершении. В этом случае "
+"не потребуется много дополнительной синхронизации. По соображениям "
+"управления потоком может быть полезно заморозить очередь запросов до "
+"завершения этого запроса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:558
+msgid ""
+"If requests are completed when the function returns (such as classic read or "
+"write requests on character devices) then a synchronization flag should be "
+"set in the buffer descriptor and `tsleep()` called. Later when the callback "
+"gets called it will do its processing and check this synchronization flag. "
+"If it is set then the callback should issue a wakeup. In this approach the "
+"callback function could either do all the needed processing (just like the "
+"previous case) or simply save the segments array in the buffer descriptor. "
+"Then after callback completes the calling function could use this saved "
+"segments array and do all the processing."
+msgstr ""
+"Если запросы завершаются при возврате функции (например, классические "
+"запросы на чтение или запись для символьных устройств), то в дескрипторе "
+"буфера должен быть установлен флаг синхронизации и вызвана функция "
+"`tsleep()`. Позже, когда будет вызван обратный вызов, он выполнит свою "
+"обработку и проверит этот флаг синхронизации. Если флаг установлен, обратный "
+"вызов должен инициировать пробуждение. При таком подходе функция обратного "
+"вызова может либо выполнить всю необходимую обработку (как в предыдущем "
+"случае), либо просто сохранить массив сегментов в дескрипторе буфера. Затем "
+"после завершения обратного вызова вызывающая функция может использовать этот "
+"сохранённый массив сегментов и выполнить всю обработку."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:560
+#, no-wrap
+msgid "DMA"
+msgstr "DMA"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:563
+msgid ""
+"The Direct Memory Access (DMA) is implemented in the ISA bus through the DMA "
+"controller (actually, two of them but that is an irrelevant detail). To make "
+"the early ISA devices simple and cheap the logic of the bus control and "
+"address generation was concentrated in the DMA controller. Fortunately, "
+"FreeBSD provides a set of functions that mostly hide the annoying details of "
+"the DMA controller from the device drivers."
+msgstr ""
+"Прямой доступ к памяти (DMA) реализован в шине ISA через контроллер DMA (на "
+"самом деле их два, но это несущественная деталь). Чтобы сделать ранние "
+"устройства ISA простыми и дешёвыми, логика управления шиной и генерации "
+"адресов была сосредоточена в контроллере DMA. К счастью, FreeBSD "
+"предоставляет набор функций, которые в основном скрывают раздражающие детали "
+"работы контроллера DMA от драйверов устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:565
+msgid ""
+"The simplest case is for the fairly intelligent devices. Like the bus master "
+"devices on PCI they can generate the bus cycles and memory addresses all by "
+"themselves. The only thing they really need from the DMA controller is bus "
+"arbitration. So for this purpose they pretend to be cascaded slave DMA "
+"controllers. And the only thing needed from the system DMA controller is to "
+"enable the cascaded mode on a DMA channel by calling the following function "
+"when attaching the driver:"
+msgstr ""
+"Самый простой случай — для достаточно интеллектуальных устройств. Например, "
+"устройства с bus mastering на PCI могут сами генерировать шинные циклы и "
+"адреса памяти. Единственное, что им действительно нужно от контроллера DMA, "
+"— это арбитраж шины. Для этой цели они притворяются каскадированными "
+"подчинёнными контроллерами DMA. И единственное, что требуется от системного "
+"контроллера DMA, — это включить каскадный режим на канале DMA, вызвав "
+"следующую функцию при присоединении драйвера:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:567
+msgid "`void isa_dmacascade(int channel_number)`"
+msgstr "`void isa_dmacascade(int channel_number)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:569
+msgid ""
+"All the further activity is done by programming the device. When detaching "
+"the driver no DMA-related functions need to be called."
+msgstr ""
+"Все последующие действия выполняются путем программирования устройства. При "
+"отсоединении драйвера нет необходимости вызывать функции, связанные с DMA."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:571
+msgid ""
+"For the simpler devices things get more complicated. The functions used are:"
+msgstr ""
+"Для более простых устройств всё становится сложнее. Используются следующие "
+"функции:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:573
+msgid "`int isa_dma_acquire(int chanel_number)`"
+msgstr "`int isa_dma_acquire(int chanel_number)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:575
+msgid ""
+"Reserve a DMA channel. Returns 0 on success or EBUSY if the channel was "
+"already reserved by this or a different driver. Most of the ISA devices are "
+"not able to share DMA channels anyway, so normally this function is called "
+"when attaching a device. This reservation was made redundant by the modern "
+"interface of bus resources but still must be used in addition to the latter. "
+"If not used then later, other DMA routines will panic."
+msgstr ""
+"Зарезервировать канал DMA. Возвращает 0 при успехе или EBUSY, если канал уже "
+"зарезервирован этим или другим драйвером. Большинство устройств ISA не "
+"способны совместно использовать каналы DMA, поэтому обычно эта функция "
+"вызывается при присоединении устройства. Это резервирование стало избыточным "
+"с появлением современного интерфейса ресурсов шины, но всё ещё должно "
+"использоваться в дополнение к последнему. Если резервирование не "
+"использовать, то в дальнейшем другие процедуры DMA вызовут панику ядра."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:576
+msgid "`int isa_dma_release(int chanel_number)`"
+msgstr "`int isa_dma_release(int chanel_number)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:578
+msgid ""
+"Release a previously reserved DMA channel. No transfers must be in progress "
+"when the channel is released (in addition the device must not try to "
+"initiate transfer after the channel is released)."
+msgstr ""
+"Освободить ранее зарезервированный канал DMA. На момент освобождения канала "
+"не должно быть активных передач (дополнительно устройство не должно пытаться "
+"инициировать передачу после освобождения канала)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:579
+msgid "`void isa_dmainit(int chan, u_int bouncebufsize)`"
+msgstr "`void isa_dmainit(int chan, u_int bouncebufsize)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:581
+msgid ""
+"Allocate a bounce buffer for use with the specified channel. The requested "
+"size of the buffer can not exceed 64KB. This bounce buffer will be "
+"automatically used later if a transfer buffer happens to be not physically "
+"contiguous or outside of the memory accessible by the ISA bus or crossing "
+"the 64KB boundary. If the transfers will be always done from buffers which "
+"conform to these conditions (such as those allocated by `bus_dmamem_alloc()` "
+"with proper limitations) then `isa_dmainit()` does not have to be called. "
+"But it is quite convenient to transfer arbitrary data using the DMA "
+"controller. The bounce buffer will automatically care of the scatter-gather "
+"issues."
+msgstr ""
+"Выделить промежуточный буфер для использования с указанным каналом. "
+"Запрашиваемый размер буфера не может превышать 64 КБ. Этот промежуточный "
+"буфер будет автоматически использован в дальнейшем, если передаваемый буфер "
+"окажется не физически непрерывным, находится вне памяти, доступной шине ISA, "
+"или пересекает границу 64 КБ. Если передача всегда будет выполняться из "
+"буферов, соответствующих этим условиям (например, выделенных с помощью "
+"`bus_dmamem_alloc()` с соответствующими ограничениями), то вызов "
+"`isa_dmainit()` не требуется. Однако довольно удобно передавать произвольные "
+"данные с использованием контроллера DMA. Промежуточный буфер автоматически "
+"решит проблемы в ситуациях, когда данные разбросаны в памяти, и их надо "
+"собирать."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:583
+msgid "_chan_ - channel number"
+msgstr "_chan_ - номер канала"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:584
+msgid "_bouncebufsize_ - size of the bounce buffer in bytes"
+msgstr "_bouncebufsize_ - размер промежуточного буфера в байтах"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:586
+msgid "`void isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan)`"
+msgstr "`void isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:588
+msgid ""
+"Prepare to start a DMA transfer. This function must be called to set up the "
+"DMA controller before actually starting transfer on the device. It checks "
+"that the buffer is contiguous and falls into the ISA memory range, if not "
+"then the bounce buffer is automatically used. If bounce buffer is required "
+"but not set up by `isa_dmainit()` or too small for the requested transfer "
+"size then the system will panic. In case of a write request with bounce "
+"buffer the data will be automatically copied to the bounce buffer."
+msgstr ""
+"Подготовка к началу передачи DMA. Эта функция должна быть вызвана для "
+"настройки контроллера DMA перед фактическим началом передачи на устройстве. "
+"Она проверяет, что буфер является непрерывным и попадает в диапазон памяти "
+"ISA, если нет, то автоматически используется промежуточный буфер. Если "
+"требуется промежуточный буфер, но он не настроен с помощью `isa_dmainit()` "
+"или слишком мал для запрошенного размера передачи, система перейдет в "
+"состояние паники. В случае запроса на запись с промежуточным буфером данные "
+"будут автоматически скопированы в этот буфер."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:589
+msgid ""
+"flags - a bitmask determining the type of operation to be done. The "
+"direction bits B_READ and B_WRITE are mutually exclusive."
+msgstr ""
+"flags - битовая маска, определяющая тип выполняемой операции. Бит "
+"направления B_READ и B_WRITE являются взаимоисключающими."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:591
+msgid "B_READ - read from the ISA bus into memory"
+msgstr "B_READ - чтение с шины ISA в память"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:592
+msgid "B_WRITE - write from the memory to the ISA bus"
+msgstr "B_WRITE - запись из памяти на шину ISA"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:593
+msgid ""
+"B_RAW - if set then the DMA controller will remember the buffer and after "
+"the end of transfer will automatically re-initialize itself to repeat "
+"transfer of the same buffer again (of course, the driver may change the data "
+"in the buffer before initiating another transfer in the device). If not set "
+"then the parameters will work only for one transfer, and `isa_dmastart()` "
+"will have to be called again before initiating the next transfer. Using "
+"B_RAW makes sense only if the bounce buffer is not used."
+msgstr ""
+"B_RAW - если установлен, то контроллер DMA запомнит буфер и после завершения "
+"передачи автоматически переинициализирует себя для повторной передачи того "
+"же буфера (конечно, драйвер может изменить данные в буфере перед "
+"инициированием следующей передачи на устройстве). Если не установлен, то "
+"параметры будут работать только для одной передачи, и перед инициированием "
+"следующей передачи снова потребуется вызвать `isa_dmastart()`. Использование "
+"B_RAW имеет смысл только если промежуточный буфер не используется."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:595
+msgid "addr - virtual address of the buffer"
+msgstr "addr - виртуальный адрес буфера"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:596
+msgid ""
+"nbytes - length of the buffer. Must be less or equal to 64KB. Length of 0 is "
+"not allowed: the DMA controller will understand it as 64KB while the kernel "
+"code will understand it as 0 and that would cause unpredictable effects. For "
+"channels number 4 and higher the length must be even because these channels "
+"transfer 2 bytes at a time. In case of an odd length the last byte will not "
+"be transferred."
+msgstr ""
+"nbytes - длина буфера. Должна быть меньше или равна 64 КБ. Длина 0 не "
+"допускается: контроллер DMA интерпретирует это как 64 КБ, в то время как код "
+"ядра поймёт это как 0, что приведёт к непредсказуемым последствиям. Для "
+"каналов номер 4 и выше длина должна быть чётной, так как эти каналы передают "
+"по 2 байта за раз. В случае нечётной длины последний байт не будет передан."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:597
+msgid "chan - channel number"
+msgstr "chan - номер канала"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:598
+msgid "`void isa_dmadone(int flags, caddr_t addr, int nbytes, int chan)`"
+msgstr "`void isa_dmadone(int flags, caddr_t addr, int nbytes, int chan)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:600
+msgid ""
+"Synchronize the memory after device reports that transfer is done. If that "
+"was a read operation with a bounce buffer then the data will be copied from "
+"the bounce buffer to the original buffer. Arguments are the same as for "
+"`isa_dmastart()`. Flag B_RAW is permitted but it does not affect "
+"`isa_dmadone()` in any way."
+msgstr ""
+"Синхронизировать память после того, как устройство сообщает о завершении "
+"передачи. Если это была операция чтения с промежуточным буфером, то данные "
+"будут скопированы из этого буфера в исходный буфер. Аргументы такие же, как "
+"у `isa_dmastart()`. Флаг B_RAW разрешён, но он никак не влияет на "
+"`isa_dmadone()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:601
+msgid "`int isa_dmastatus(int channel_number)`"
+msgstr "`int isa_dmastatus(int channel_number)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:603
+msgid ""
+"Returns the number of bytes left in the current transfer to be transferred. "
+"In case the flag B_READ was set in `isa_dmastart()` the number returned will "
+"never be equal to zero. At the end of transfer it will be automatically "
+"reset back to the length of buffer. The normal use is to check the number of "
+"bytes left after the device signals that the transfer is completed. If the "
+"number of bytes is not 0 then something probably went wrong with that "
+"transfer."
+msgstr ""
+"Возвращает количество оставшихся для передачи байт в текущей передаче. Если "
+"флаг B_READ был установлен в `isa_dmastart()`, возвращаемое значение никогда "
+"не будет равно нулю. В конце передачи оно автоматически сбрасывается обратно "
+"к длине буфера. Обычное использование — проверка количества оставшихся байт "
+"после того, как устройство сигнализирует о завершении передачи. Если "
+"количество байт не равно 0, то, вероятно, в передаче произошла ошибка."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:604
+msgid "`int isa_dmastop(int channel_number)`"
+msgstr "`int isa_dmastop(int channel_number)`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:606
+msgid ""
+"Aborts the current transfer and returns the number of bytes left "
+"untransferred."
+msgstr ""
+"Прерывает текущую передачу и возвращает количество непереданных байтов."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:608
+#, no-wrap
+msgid "xxx_isa_probe"
+msgstr "xxx_isa_probe"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:611
+msgid ""
+"This function probes if a device is present. If the driver supports auto-"
+"detection of some part of device configuration (such as interrupt vector or "
+"memory address) this auto-detection must be done in this routine."
+msgstr ""
+"Эта функция проверяет наличие устройства. Если драйвер поддерживает "
+"автоматическое определение некоторых параметров конфигурации устройства "
+"(таких как вектор прерывания или адрес памяти), это автоматическое "
+"определение должно выполняться в данной процедуре."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:613
+msgid ""
+"As for any other bus, if the device cannot be detected or is detected but "
+"failed the self-test or some other problem happened then it returns a "
+"positive value of error. The value `ENXIO` must be returned if the device is "
+"not present. Other error values may mean other conditions. Zero or negative "
+"values mean success. Most of the drivers return zero as success."
+msgstr ""
+"Как и для любой другой шины, если устройство не может быть обнаружено, или "
+"обнаружено, но не прошло самопроверку, или возникла другая проблема, то "
+"возвращается положительное значение ошибки. Значение `ENXIO` должно "
+"возвращаться, если устройство отсутствует. Другие значения ошибок могут "
+"означать иные условия. Нулевые или отрицательные значения означают успех. "
+"Большинство драйверов возвращают ноль в случае успеха."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:615
+msgid ""
+"The negative return values are used when a PnP device supports multiple "
+"interfaces. For example, an older compatibility interface and a newer "
+"advanced interface which are supported by different drivers. Then both "
+"drivers would detect the device. The driver which returns a higher value in "
+"the probe routine takes precedence (in other words, the driver returning 0 "
+"has highest precedence, one returning -1 is next, one returning -2 is after "
+"it and so on). In result the devices which support only the old interface "
+"will be handled by the old driver (which should return -1 from the probe "
+"routine) while the devices supporting the new interface as well will be "
+"handled by the new driver (which should return 0 from the probe routine)."
+msgstr ""
+"Отрицательные возвращаемые значения используются, когда устройство PnP "
+"поддерживает несколько интерфейсов. Например, старый совместимый интерфейс и "
+"новый расширенный интерфейс, которые поддерживаются разными драйверами. В "
+"этом случае оба драйвера обнаружат устройство. Драйвер, который возвращает "
+"большее значение в процедуре обнаружения, получает приоритет (другими "
+"словами, драйвер, возвращающий 0, имеет наивысший приоритет, возвращающий -1 "
+"— следующий, возвращающий -2 — за ним и так далее). В результате устройства, "
+"поддерживающие только старый интерфейс, будут обрабатываться старым "
+"драйвером (который должен возвращать -1 из процедуры probe), а устройства, "
+"поддерживающие также новый интерфейс, будут обрабатываться новым драйвером "
+"(который должен возвращать 0 из процедуры обнаружения)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:617
+msgid ""
+"The device descriptor struct xxx_softc is allocated by the system before "
+"calling the probe routine. If the probe routine returns an error the "
+"descriptor will be automatically deallocated by the system. So if a probing "
+"error occurs the driver must make sure that all the resources it used during "
+"probe are deallocated and that nothing keeps the descriptor from being "
+"safely deallocated. If the probe completes successfully the descriptor will "
+"be preserved by the system and later passed to the routine "
+"`xxx_isa_attach()`. If a driver returns a negative value it can not be sure "
+"that it will have the highest priority and its attach routine will be "
+"called. So in this case it also must release all the resources before "
+"returning and if necessary allocate them again in the attach routine. When "
+"`xxx_isa_probe()` returns 0 releasing the resources before returning is also "
+"a good idea and a well-behaved driver should do so. But in cases where there "
+"is some problem with releasing the resources the driver is allowed to keep "
+"resources between returning 0 from the probe routine and execution of the "
+"attach routine."
+msgstr ""
+"Структура дескриптора устройства `xxx_softc` выделяется системой до вызова "
+"процедуры обнаружения. Если процедура обнаружения возвращает ошибку, "
+"дескриптор автоматически освобождается системой. Поэтому при возникновении "
+"ошибки обнаружения драйвер должен убедиться, что все ресурсы, использованные "
+"во время обнаружения, освобождены и ничто не мешает безопасному освобождению "
+"дескриптора.Если обнаружение завершается успешно, дескриптор сохраняется "
+"системой и позже передаётся в процедуру `xxx_isa_attach()`. Если драйвер "
+"возвращает отрицательное значение, он не может быть уверен, что получит "
+"наивысший приоритет и его процедура присоединения будет вызвана. Поэтому в "
+"этом случае он также должен освободить все ресурсы перед возвратом и, если "
+"необходимо, выделить их снова в процедуре присоединения. Когда "
+"`xxx_isa_probe()` возвращает 0, освобождение ресурсов перед возвратом также "
+"является хорошей практикой, и корректно работающий драйвер должен так "
+"поступать. Однако в случаях, когда возникают проблемы с освобождением "
+"ресурсов, драйверу разрешается сохранять ресурсы между возвратом 0 из "
+"процедуры обнаружения и выполнением процедуры присоединения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:619
+msgid ""
+"A typical probe routine starts with getting the device descriptor and unit:"
+msgstr ""
+"Типичная процедура обнаружения начинается с получения дескриптора устройства "
+"и номера устройства:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:626
+#, no-wrap
+msgid ""
+" struct xxx_softc *sc = device_get_softc(dev);\n"
+" int unit = device_get_unit(dev);\n"
+" int pnperror;\n"
+" int error = 0;\n"
+msgstr ""
+" struct xxx_softc *sc = device_get_softc(dev);\n"
+" int unit = device_get_unit(dev);\n"
+" int pnperror;\n"
+" int error = 0;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:629
+#, no-wrap
+msgid ""
+" sc->dev = dev; /* link it back */\n"
+" sc->unit = unit;\n"
+msgstr ""
+" sc->dev = dev; /* link it back */\n"
+" sc->unit = unit;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:632
+msgid ""
+"Then check for the PnP devices. The check is carried out by a table "
+"containing the list of PnP IDs supported by this driver and human-readable "
+"descriptions of the device models corresponding to these IDs."
+msgstr ""
+"Затем проверьте устройства PnP. Проверка осуществляется с помощью таблицы, "
+"содержащей список PnP ID, поддерживаемых этим драйвером, и удобочитаемые "
+"описания моделей устройств, соответствующих этим ID."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:638
+#, no-wrap
+msgid ""
+" pnperror=ISA_PNP_PROBE(device_get_parent(dev), dev,\n"
+" xxx_pnp_ids); if(pnperror == ENXIO) return ENXIO;\n"
+msgstr ""
+" pnperror=ISA_PNP_PROBE(device_get_parent(dev), dev,\n"
+" xxx_pnp_ids); if(pnperror == ENXIO) return ENXIO;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:641
+msgid ""
+"The logic of ISA_PNP_PROBE is the following: If this card (device unit) was "
+"not detected as PnP then ENOENT will be returned. If it was detected as PnP "
+"but its detected ID does not match any of the IDs in the table then ENXIO is "
+"returned. Finally, if it has PnP support and it matches on of the IDs in the "
+"table, 0 is returned and the appropriate description from the table is set "
+"by `device_set_desc()`."
+msgstr ""
+"Логика работы `ISA_PNP_PROBE` следующая: если данная карта (устройство) не "
+"была обнаружена как PnP, то будет возвращено `ENOENT`. Если она была "
+"обнаружена как PnP, но её обнаруженный ID не совпадает ни с одним из ID в "
+"таблице, то возвращается `ENXIO`. Наконец, если устройство поддерживает PnP "
+"и его ID совпадает с одним из ID в таблице, возвращается `0`, а "
+"соответствующее описание из таблицы устанавливается с помощью "
+"`device_set_desc()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:643
+msgid ""
+"If a driver supports only PnP devices then the condition would look like:"
+msgstr ""
+"Если драйвер поддерживает только устройства PnP, то условие будет выглядеть "
+"следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:648
+#, no-wrap
+msgid ""
+" if(pnperror != 0)\n"
+" return pnperror;\n"
+msgstr ""
+" if(pnperror != 0)\n"
+" return pnperror;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:651
+msgid ""
+"No special treatment is required for the drivers which do not support PnP "
+"because they pass an empty PnP ID table and will always get ENXIO if called "
+"on a PnP card."
+msgstr ""
+"Для драйверов, которые не поддерживают PnP, не требуется специальной "
+"обработки, так как они передают пустую таблицу идентификаторов PnP и всегда "
+"будут получать ENXIO при вызове на PnP-карте."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:653
+msgid ""
+"The probe routine normally needs at least some minimal set of resources, "
+"such as I/O port number to find the card and probe it. Depending on the "
+"hardware the driver may be able to discover the other necessary resources "
+"automatically. The PnP devices have all the resources pre-set by the PnP "
+"subsystem, so the driver does not need to discover them by itself."
+msgstr ""
+"Функция обнаружения обычно требует как минимум некоторый минимальный набор "
+"ресурсов, например, номер порта ввода-вывода, чтобы найти карту и проверить "
+"её. В зависимости от оборудования драйвер может автоматически обнаружить "
+"другие необходимые ресурсы. Устройства PnP имеют все ресурсы, предварительно "
+"установленные подсистемой PnP, поэтому драйверу не нужно обнаруживать их "
+"самостоятельно."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:655
+msgid ""
+"Typically the minimal information required to get access to the device is "
+"the I/O port number. Then some devices allow to get the rest of information "
+"from the device configuration registers (though not all devices do that). So "
+"first we try to get the port start value:"
+msgstr ""
+"Обычно минимальная информация, необходимая для доступа к устройству, — это "
+"номер порта ввода-вывода. Затем некоторые устройства позволяют получить "
+"остальную информацию из регистров конфигурации устройства (хотя не все "
+"устройства это поддерживают). Поэтому сначала мы пытаемся получить начальное "
+"значение порта:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:660
+#, no-wrap
+msgid ""
+" sc->port0 = bus_get_resource_start(dev,\n"
+" SYS_RES_IOPORT, 0 /*rid*/); if(sc->port0 == 0) return ENXIO;\n"
+msgstr ""
+" sc->port0 = bus_get_resource_start(dev,\n"
+" SYS_RES_IOPORT, 0 /*rid*/); if(sc->port0 == 0) return ENXIO;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:663
+msgid ""
+"The base port address is saved in the structure softc for future use. If it "
+"will be used very often then calling the resource function each time would "
+"be prohibitively slow. If we do not get a port we just return an error. Some "
+"device drivers can instead be clever and try to probe all the possible "
+"ports, like this:"
+msgstr ""
+"Базовый адрес порта сохраняется в структуре softc для последующего "
+"использования. Если он будет использоваться очень часто, то вызов функции "
+"ресурса каждый раз будет неприемлемо медленным. Если мы не получаем порт, мы "
+"просто возвращаем ошибку. Некоторые драйверы устройств могут вместо этого "
+"быть умнее и попытаться обнаружить все возможные порты, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:677
+#, no-wrap
+msgid ""
+" /* table of all possible base I/O port addresses for this device */\n"
+" static struct xxx_allports {\n"
+" u_short port; /* port address */\n"
+" short used; /* flag: if this port is already used by some unit */\n"
+" } xxx_allports = {\n"
+" { 0x300, 0 },\n"
+" { 0x320, 0 },\n"
+" { 0x340, 0 },\n"
+" { 0, 0 } /* end of table */\n"
+" };\n"
+msgstr ""
+" /* table of all possible base I/O port addresses for this device */\n"
+" static struct xxx_allports {\n"
+" u_short port; /* port address */\n"
+" short used; /* flag: if this port is already used by some unit */\n"
+" } xxx_allports = {\n"
+" { 0x300, 0 },\n"
+" { 0x320, 0 },\n"
+" { 0x340, 0 },\n"
+" { 0, 0 } /* end of table */\n"
+" };\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:681
+#, no-wrap
+msgid ""
+" ...\n"
+" int port, i;\n"
+" ...\n"
+msgstr ""
+" ...\n"
+" int port, i;\n"
+" ...\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:687
+#, no-wrap
+msgid ""
+" port = bus_get_resource_start(dev, SYS_RES_IOPORT, 0 /*rid*/);\n"
+" if(port !=0 ) {\n"
+" for(i=0; xxx_allports[i].port!=0; i++) {\n"
+" if(xxx_allports[i].used || xxx_allports[i].port != port)\n"
+" continue;\n"
+msgstr ""
+" port = bus_get_resource_start(dev, SYS_RES_IOPORT, 0 /*rid*/);\n"
+" if(port !=0 ) {\n"
+" for(i=0; xxx_allports[i].port!=0; i++) {\n"
+" if(xxx_allports[i].used || xxx_allports[i].port != port)\n"
+" continue;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:695
+#, no-wrap
+msgid ""
+" /* found it */\n"
+" xxx_allports[i].used = 1;\n"
+" /* do probe on a known port */\n"
+" return xxx_really_probe(dev, port);\n"
+" }\n"
+" return ENXIO; /* port is unknown or already used */\n"
+" }\n"
+msgstr ""
+" /* found it */\n"
+" xxx_allports[i].used = 1;\n"
+" /* do probe on a known port */\n"
+" return xxx_really_probe(dev, port);\n"
+" }\n"
+" return ENXIO; /* port is unknown or already used */\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:700
+#, no-wrap
+msgid ""
+" /* we get here only if we need to guess the port */\n"
+" for(i=0; xxx_allports[i].port!=0; i++) {\n"
+" if(xxx_allports[i].used)\n"
+" continue;\n"
+msgstr ""
+" /* we get here only if we need to guess the port */\n"
+" for(i=0; xxx_allports[i].port!=0; i++) {\n"
+" if(xxx_allports[i].used)\n"
+" continue;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:705
+#, no-wrap
+msgid ""
+" /* mark as used - even if we find nothing at this port\n"
+" * at least we won't probe it in future\n"
+" */\n"
+" xxx_allports[i].used = 1;\n"
+msgstr ""
+" /* mark as used - even if we find nothing at this port\n"
+" * at least we won't probe it in future\n"
+" */\n"
+" xxx_allports[i].used = 1;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:712
+#, no-wrap
+msgid ""
+" error = xxx_really_probe(dev, xxx_allports[i].port);\n"
+" if(error == 0) /* found a device at that port */\n"
+" return 0;\n"
+" }\n"
+" /* probed all possible addresses, none worked */\n"
+" return ENXIO;\n"
+msgstr ""
+" error = xxx_really_probe(dev, xxx_allports[i].port);\n"
+" if(error == 0) /* found a device at that port */\n"
+" return 0;\n"
+" }\n"
+" /* probed all possible addresses, none worked */\n"
+" return ENXIO;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:715
+msgid ""
+"Of course, normally the driver's `identify()` routine should be used for "
+"such things. But there may be one valid reason why it may be better to be "
+"done in `probe()`: if this probe would drive some other sensitive device "
+"crazy. The probe routines are ordered with consideration of the `sensitive` "
+"flag: the sensitive devices get probed first and the rest of the devices "
+"later. But the `identify()` routines are called before any probes, so they "
+"show no respect to the sensitive devices and may upset them."
+msgstr ""
+"Конечно, обычно для таких вещей следует использовать процедуру `identify()` "
+"драйвера. Однако может быть одна веская причина, почему лучше сделать это в "
+"`probe()`: если этот обнаружение может привести к сбою другого "
+"чувствительного устройства. Процедуры обнаружения упорядочены с учетом флага "
+"`sensitive`: чувствительные устройства проверяются первыми, а остальные "
+"устройства — позже. Но процедуры `identify()` вызываются до любого "
+"обнаружения, поэтому они не учитывают чувствительные устройства и могут "
+"вызвать их сбой."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:717
+msgid ""
+"Now, after we got the starting port we need to set the port count (except "
+"for PnP devices) because the kernel does not have this information in the "
+"configuration file."
+msgstr ""
+"Вот, после того как мы получили начальный порт, необходимо установить "
+"количество портов (за исключением устройств PnP), так как в файле "
+"конфигурации ядра эта информация отсутствует."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:725
+#, no-wrap
+msgid ""
+" if(pnperror /* only for non-PnP devices */\n"
+" && bus_set_resource(dev, SYS_RES_IOPORT, 0, sc->port0,\n"
+" XXX_PORT_COUNT)<0)\n"
+" return ENXIO;\n"
+msgstr ""
+" if(pnperror /* only for non-PnP devices */\n"
+" && bus_set_resource(dev, SYS_RES_IOPORT, 0, sc->port0,\n"
+" XXX_PORT_COUNT)<0)\n"
+" return ENXIO;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:728
+msgid ""
+"Finally allocate and activate a piece of port address space (special values "
+"of start and end mean \"use those we set by ``bus_set_resource()``\"):"
+msgstr ""
+"Наконец, выделите и активируйте часть адресного пространства порта "
+"(специальные значения start и end означают \"используйте те, что мы "
+"установили через ``bus_set_resource()``\"):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:736
+#, no-wrap
+msgid ""
+" sc->port0_rid = 0;\n"
+" sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT,\n"
+" &sc->port0_rid,\n"
+" /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n"
+msgstr ""
+" sc->port0_rid = 0;\n"
+" sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT,\n"
+" &sc->port0_rid,\n"
+" /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:739
+#, no-wrap
+msgid ""
+" if(sc->port0_r == NULL)\n"
+" return ENXIO;\n"
+msgstr ""
+" if(sc->port0_r == NULL)\n"
+" return ENXIO;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:742
+msgid ""
+"Now having access to the port-mapped registers we can poke the device in "
+"some way and check if it reacts like it is expected to. If it does not then "
+"there is probably some other device or no device at all at this address."
+msgstr ""
+"Теперь, имея доступ к регистрам с отображением на порты, мы можем каким-либо "
+"образом взаимодействовать с устройством и проверить, реагирует ли оно так, "
+"как ожидается. Если этого не происходит, вероятно, по этому адресу находится "
+"другое устройство или его там нет вовсе."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:744
+msgid ""
+"Normally drivers do not set up the interrupt handlers until the attach "
+"routine. Instead they do probes in the polling mode using the `DELAY()` "
+"function for timeout. The probe routine must never hang forever, all the "
+"waits for the device must be done with timeouts. If the device does not "
+"respond within the time it is probably broken or misconfigured and the "
+"driver must return error. When determining the timeout interval give the "
+"device some extra time to be on the safe side: although `DELAY()` is "
+"supposed to delay for the same amount of time on any machine it has some "
+"margin of error, depending on the exact CPU."
+msgstr ""
+"Обычно драйверы не настраивают обработчики прерываний до вызова процедуры "
+"присоединения. Вместо этого они выполняют проверки в режиме опроса, "
+"используя функцию `DELAY()` для таймаута. Процедура проверки никогда не "
+"должна зависать навсегда, все ожидания ответа от устройства должны "
+"выполняться с таймаутами. Если устройство не отвечает в течение заданного "
+"времени, вероятно, оно неисправно или неправильно настроено, и драйвер "
+"должен вернуть ошибку. При определении интервала таймаута следует давать "
+"устройству дополнительное время для надежности: хотя предполагается, что "
+"`DELAY()` задерживает выполнение на одинаковое время на любой машине, "
+"существует некоторая погрешность, зависящая от конкретного процессора."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:746
+msgid ""
+"If the probe routine really wants to check that the interrupts really work "
+"it may configure and probe the interrupts too. But that is not recommended."
+msgstr ""
+"Если процедура проверки действительно хочет убедиться, что прерывания "
+"работают, она может также настроить и провести обнаружение прерываний. "
+"Однако это не рекомендуется."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:753
+#, no-wrap
+msgid ""
+" /* implemented in some very device-specific way */\n"
+" if(error = xxx_probe_ports(sc))\n"
+" goto bad; /* will deallocate the resources before returning */\n"
+msgstr ""
+" /* implemented in some very device-specific way */\n"
+" if(error = xxx_probe_ports(sc))\n"
+" goto bad; /* will deallocate the resources before returning */\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:756
+msgid ""
+"The function `xxx_probe_ports()` may also set the device description "
+"depending on the exact model of device it discovers. But if there is only "
+"one supported device model this can be as well done in a hardcoded way. Of "
+"course, for the PnP devices the PnP support sets the description from the "
+"table automatically."
+msgstr ""
+"Функция `xxx_probe_ports()` также может устанавливать описание устройства в "
+"зависимости от конкретной модели обнаруженного устройства. Но если "
+"поддерживается только одна модель устройства, это можно сделать и жёстко "
+"заданным способом. Конечно, для PnP-устройств поддержка PnP автоматически "
+"устанавливает описание из таблицы."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:761
+#, no-wrap
+msgid ""
+" if(pnperror)\n"
+" device_set_desc(dev, \"Our device model 1234\");\n"
+msgstr ""
+" if(pnperror)\n"
+" device_set_desc(dev, \"Our device model 1234\");\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:764
+msgid ""
+"Then the probe routine should either discover the ranges of all the "
+"resources by reading the device configuration registers or make sure that "
+"they were set explicitly by the user. We will consider it with an example of "
+"on-board memory. The probe routine should be as non-intrusive as possible, "
+"so allocation and check of functionality of the rest of resources (besides "
+"the ports) would be better left to the attach routine."
+msgstr ""
+"Затем процедура обнаружения должна либо определить диапазоны всех ресурсов, "
+"читая регистры конфигурации устройства, либо убедиться, что они были явно "
+"заданы пользователем. Мы рассмотрим это на примере встроенной памяти. "
+"Процедура обнаружения должна быть как можно менее навязчивой, поэтому "
+"выделение и проверку функциональности остальных ресурсов (кроме портов) "
+"лучше оставить для процедуры присоединения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:766
+msgid ""
+"The memory address may be specified in the kernel configuration file or on "
+"some devices it may be pre-configured in non-volatile configuration "
+"registers. If both sources are available and different, which one should be "
+"used? Probably if the user bothered to set the address explicitly in the "
+"kernel configuration file they know what they are doing and this one should "
+"take precedence. An example of implementation could be:"
+msgstr ""
+"Адрес памяти может быть указан в конфигурационном файле ядра, а на некоторых "
+"устройствах он может быть предварительно настроен в энергонезависимых "
+"конфигурационных регистрах. Если доступны оба источника, и они различаются, "
+"какой из них следует использовать? Вероятно, если пользователь явно указал "
+"адрес в конфигурационном файле ядра, он знает, что делает, и этот адрес "
+"должен иметь приоритет. Пример реализации может выглядеть так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:774
+#, no-wrap
+msgid ""
+" /* try to find out the config address first */\n"
+" sc->mem0_p = bus_get_resource_start(dev, SYS_RES_MEMORY, 0 /*rid*/);\n"
+" if(sc->mem0_p == 0) { /* nope, not specified by user */\n"
+" sc->mem0_p = xxx_read_mem0_from_device_config(sc);\n"
+msgstr ""
+" /* try to find out the config address first */\n"
+" sc->mem0_p = bus_get_resource_start(dev, SYS_RES_MEMORY, 0 /*rid*/);\n"
+" if(sc->mem0_p == 0) { /* nope, not specified by user */\n"
+" sc->mem0_p = xxx_read_mem0_from_device_config(sc);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:782
+#, no-wrap
+msgid ""
+" if(sc->mem0_p == 0)\n"
+" /* can't get it from device config registers either */\n"
+" goto bad;\n"
+" } else {\n"
+" if(xxx_set_mem0_address_on_device(sc) < 0)\n"
+" goto bad; /* device does not support that address */\n"
+" }\n"
+msgstr ""
+" if(sc->mem0_p == 0)\n"
+" /* can't get it from device config registers either */\n"
+" goto bad;\n"
+" } else {\n"
+" if(xxx_set_mem0_address_on_device(sc) < 0)\n"
+" goto bad; /* device does not support that address */\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:794
+#, no-wrap
+msgid ""
+" /* just like the port, set the memory size,\n"
+" * for some devices the memory size would not be constant\n"
+" * but should be read from the device configuration registers instead\n"
+" * to accommodate different models of devices. Another option would\n"
+" * be to let the user set the memory size as \"msize\" configuration\n"
+" * resource which will be automatically handled by the ISA bus.\n"
+" */\n"
+" if(pnperror) { /* only for non-PnP devices */\n"
+" sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);\n"
+" if(sc->mem0_size == 0) /* not specified by user */\n"
+" sc->mem0_size = xxx_read_mem0_size_from_device_config(sc);\n"
+msgstr ""
+" /* just like the port, set the memory size,\n"
+" * for some devices the memory size would not be constant\n"
+" * but should be read from the device configuration registers instead\n"
+" * to accommodate different models of devices. Another option would\n"
+" * be to let the user set the memory size as \"msize\" configuration\n"
+" * resource which will be automatically handled by the ISA bus.\n"
+" */\n"
+" if(pnperror) { /* only for non-PnP devices */\n"
+" sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);\n"
+" if(sc->mem0_size == 0) /* not specified by user */\n"
+" sc->mem0_size = xxx_read_mem0_size_from_device_config(sc);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:803
+#, no-wrap
+msgid ""
+" if(sc->mem0_size == 0) {\n"
+" /* suppose this is a very old model of device without\n"
+" * auto-configuration features and the user gave no preference,\n"
+" * so assume the minimalistic case\n"
+" * (of course, the real value will vary with the driver)\n"
+" */\n"
+" sc->mem0_size = 8*1024;\n"
+" }\n"
+msgstr ""
+" if(sc->mem0_size == 0) {\n"
+" /* suppose this is a very old model of device without\n"
+" * auto-configuration features and the user gave no preference,\n"
+" * so assume the minimalistic case\n"
+" * (of course, the real value will vary with the driver)\n"
+" */\n"
+" sc->mem0_size = 8*1024;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:806
+#, no-wrap
+msgid ""
+" if(xxx_set_mem0_size_on_device(sc) < 0)\n"
+" goto bad; /* device does not support that size */\n"
+msgstr ""
+" if(xxx_set_mem0_size_on_device(sc) < 0)\n"
+" goto bad; /* device does not support that size */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:813
+#, no-wrap
+msgid ""
+" if(bus_set_resource(dev, SYS_RES_MEMORY, /*rid*/0,\n"
+" sc->mem0_p, sc->mem0_size)<0)\n"
+" goto bad;\n"
+" } else {\n"
+" sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);\n"
+" }\n"
+msgstr ""
+" if(bus_set_resource(dev, SYS_RES_MEMORY, /*rid*/0,\n"
+" sc->mem0_p, sc->mem0_size)<0)\n"
+" goto bad;\n"
+" } else {\n"
+" sc->mem0_size = bus_get_resource_count(dev, SYS_RES_MEMORY, 0 /*rid*/);\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:816
+msgid "Resources for IRQ and DRQ are easy to check by analogy."
+msgstr "Ресурсы для IRQ и DRQ легко проверить по аналогии."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:818
+msgid "If all went well then release all the resources and return success."
+msgstr ""
+"Если всё прошло успешно, то освободите все ресурсы и верните успешный статус."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:823
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1086
+#, no-wrap
+msgid ""
+" xxx_free_resources(sc);\n"
+" return 0;\n"
+msgstr ""
+" xxx_free_resources(sc);\n"
+" return 0;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:826
+msgid ""
+"Finally, handle the troublesome situations. All the resources should be "
+"deallocated before returning. We make use of the fact that before the "
+"structure softc is passed to us it gets zeroed out, so we can find out if "
+"some resource was allocated: then its descriptor is non-zero."
+msgstr ""
+"Наконец, обработайте проблемные ситуации. Все ресурсы должны быть "
+"освобождены перед возвратом. Мы используем тот факт, что перед передачей нам "
+"структуры `softc` она обнуляется, поэтому мы можем определить, был ли "
+"выделен какой-либо ресурс: если его дескриптор не равен нулю."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:830
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1047
+#, no-wrap
+msgid " bad:\n"
+msgstr " bad:\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:836
+#, no-wrap
+msgid ""
+" xxx_free_resources(sc);\n"
+" if(error)\n"
+" return error;\n"
+" else /* exact error is unknown */\n"
+" return ENXIO;\n"
+msgstr ""
+" xxx_free_resources(sc);\n"
+" if(error)\n"
+" return error;\n"
+" else /* exact error is unknown */\n"
+" return ENXIO;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:839
+msgid ""
+"That would be all for the probe routine. Freeing of resources is done from "
+"multiple places, so it is moved to a function which may look like:"
+msgstr ""
+"Вот и всё для процедуры обнаружения. Освобождение ресурсов выполняется из "
+"нескольких мест, поэтому оно вынесено в функцию, которая может выглядеть так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:847
+#, no-wrap
+msgid ""
+"static void\n"
+" xxx_free_resources(sc)\n"
+" struct xxx_softc *sc;\n"
+" {\n"
+" /* check every resource and free if not zero */\n"
+msgstr ""
+"static void\n"
+" xxx_free_resources(sc)\n"
+" struct xxx_softc *sc;\n"
+" {\n"
+" /* check every resource and free if not zero */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:855
+#, no-wrap
+msgid ""
+" /* interrupt handler */\n"
+" if(sc->intr_r) {\n"
+" bus_teardown_intr(sc->dev, sc->intr_r, sc->intr_cookie);\n"
+" bus_release_resource(sc->dev, SYS_RES_IRQ, sc->intr_rid,\n"
+" sc->intr_r);\n"
+" sc->intr_r = 0;\n"
+" }\n"
+msgstr ""
+" /* interrupt handler */\n"
+" if(sc->intr_r) {\n"
+" bus_teardown_intr(sc->dev, sc->intr_r, sc->intr_cookie);\n"
+" bus_release_resource(sc->dev, SYS_RES_IRQ, sc->intr_rid,\n"
+" sc->intr_r);\n"
+" sc->intr_r = 0;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:870
+#, no-wrap
+msgid ""
+" /* all kinds of memory maps we could have allocated */\n"
+" if(sc->data_p) {\n"
+" bus_dmamap_unload(sc->data_tag, sc->data_map);\n"
+" sc->data_p = 0;\n"
+" }\n"
+" if(sc->data) { /* sc->data_map may be legitimately equal to 0 */\n"
+" /* the map will also be freed */\n"
+" bus_dmamem_free(sc->data_tag, sc->data, sc->data_map);\n"
+" sc->data = 0;\n"
+" }\n"
+" if(sc->data_tag) {\n"
+" bus_dma_tag_destroy(sc->data_tag);\n"
+" sc->data_tag = 0;\n"
+" }\n"
+msgstr ""
+" /* all kinds of memory maps we could have allocated */\n"
+" if(sc->data_p) {\n"
+" bus_dmamap_unload(sc->data_tag, sc->data_map);\n"
+" sc->data_p = 0;\n"
+" }\n"
+" if(sc->data) { /* sc->data_map may be legitimately equal to 0 */\n"
+" /* the map will also be freed */\n"
+" bus_dmamem_free(sc->data_tag, sc->data, sc->data_map);\n"
+" sc->data = 0;\n"
+" }\n"
+" if(sc->data_tag) {\n"
+" bus_dma_tag_destroy(sc->data_tag);\n"
+" sc->data_tag = 0;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:872
+#, no-wrap
+msgid " ... free other maps and tags if we have them ...\n"
+msgstr " ... free other maps and tags if we have them ...\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:877
+#, no-wrap
+msgid ""
+" if(sc->parent_tag) {\n"
+" bus_dma_tag_destroy(sc->parent_tag);\n"
+" sc->parent_tag = 0;\n"
+" }\n"
+msgstr ""
+" if(sc->parent_tag) {\n"
+" bus_dma_tag_destroy(sc->parent_tag);\n"
+" sc->parent_tag = 0;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:891
+#, no-wrap
+msgid ""
+" /* release all the bus resources */\n"
+" if(sc->mem0_r) {\n"
+" bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->mem0_rid,\n"
+" sc->mem0_r);\n"
+" sc->mem0_r = 0;\n"
+" }\n"
+" ...\n"
+" if(sc->port0_r) {\n"
+" bus_release_resource(sc->dev, SYS_RES_IOPORT, sc->port0_rid,\n"
+" sc->port0_r);\n"
+" sc->port0_r = 0;\n"
+" }\n"
+" }\n"
+msgstr ""
+" /* release all the bus resources */\n"
+" if(sc->mem0_r) {\n"
+" bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->mem0_rid,\n"
+" sc->mem0_r);\n"
+" sc->mem0_r = 0;\n"
+" }\n"
+" ...\n"
+" if(sc->port0_r) {\n"
+" bus_release_resource(sc->dev, SYS_RES_IOPORT, sc->port0_rid,\n"
+" sc->port0_r);\n"
+" sc->port0_r = 0;\n"
+" }\n"
+" }\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:894
+#, no-wrap
+msgid "xxx_isa_attach"
+msgstr "xxx_isa_attach"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:897
+msgid ""
+"The attach routine actually connects the driver to the system if the probe "
+"routine returned success and the system had chosen to attach that driver. If "
+"the probe routine returned 0 then the attach routine may expect to receive "
+"the device structure softc intact, as it was set by the probe routine. Also "
+"if the probe routine returns 0 it may expect that the attach routine for "
+"this device shall be called at some point in the future. If the probe "
+"routine returns a negative value then the driver may make none of these "
+"assumptions."
+msgstr ""
+"Процедура присоединения фактически подключает драйвер к системе, если "
+"процедура обнаружения вернула успех, и система решила подключить этот "
+"драйвер. Если процедура обнаружения вернула 0, то процедура присоединения "
+"может ожидать, что получит структуру устройства `softc` в неизменном виде, "
+"как она была установлена процедурой обнаружения. Также, если обнаружение "
+"возвращает 0, она можно ожидать, что процедура присоединения для этого "
+"устройства будет вызвана в какой-то момент в будущем. Если процедура "
+"обнаружения возвращает отрицательное значение, то драйвер не может делать "
+"никаких из этих предположений."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:899
+msgid ""
+"The attach routine returns 0 if it completed successfully or error code "
+"otherwise."
+msgstr ""
+"Процедура присоединение возвращает 0 при успешном завершении или код ошибки "
+"в противном случае."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:901
+msgid ""
+"The attach routine starts just like the probe routine, with getting some "
+"frequently used data into more accessible variables."
+msgstr ""
+"Процедура присоединения начинается так же, как и процедура обнаружения, с "
+"помещения часто используемых данных в более доступные переменные."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:907
+#, no-wrap
+msgid ""
+" struct xxx_softc *sc = device_get_softc(dev);\n"
+" int unit = device_get_unit(dev);\n"
+" int error = 0;\n"
+msgstr ""
+" struct xxx_softc *sc = device_get_softc(dev);\n"
+" int unit = device_get_unit(dev);\n"
+" int error = 0;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:910
+msgid ""
+"Then allocate and activate all the necessary resources. As normally the port "
+"range will be released before returning from probe, it has to be allocated "
+"again. We expect that the probe routine had properly set all the resource "
+"ranges, as well as saved them in the structure softc. If the probe routine "
+"had left some resource allocated then it does not need to be allocated again "
+"(which would be considered an error)."
+msgstr ""
+"Затем выделите и активируйте все необходимые ресурсы. Обычно диапазон портов "
+"освобождается перед возвратом из обнаружения, поэтому его необходимо "
+"выделить снова. Мы предполагаем, что процедура обнаружения корректно "
+"установила все диапазоны ресурсов, а также сохранила их в структуре softc. "
+"Если процедура обнаружения оставила некоторые ресурсы выделенными, то их не "
+"нужно выделять снова (это будет считаться ошибкой)."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:916
+#, no-wrap
+msgid ""
+" sc->port0_rid = 0;\n"
+" sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port0_rid,\n"
+" /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n"
+msgstr ""
+" sc->port0_rid = 0;\n"
+" sc->port0_r = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port0_rid,\n"
+" /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:919
+#, no-wrap
+msgid ""
+" if(sc->port0_r == NULL)\n"
+" return ENXIO;\n"
+msgstr ""
+" if(sc->port0_r == NULL)\n"
+" return ENXIO;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:924
+#, no-wrap
+msgid ""
+" /* on-board memory */\n"
+" sc->mem0_rid = 0;\n"
+" sc->mem0_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->mem0_rid,\n"
+" /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n"
+msgstr ""
+" /* on-board memory */\n"
+" sc->mem0_rid = 0;\n"
+" sc->mem0_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->mem0_rid,\n"
+" /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:927
+#, no-wrap
+msgid ""
+" if(sc->mem0_r == NULL)\n"
+" goto bad;\n"
+msgstr ""
+" if(sc->mem0_r == NULL)\n"
+" goto bad;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:930
+#, no-wrap
+msgid ""
+" /* get its virtual address */\n"
+" sc->mem0_v = rman_get_virtual(sc->mem0_r);\n"
+msgstr ""
+" /* get its virtual address */\n"
+" sc->mem0_v = rman_get_virtual(sc->mem0_r);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:933
+msgid ""
+"The DMA request channel (DRQ) is allocated likewise. To initialize it use "
+"functions of the `isa_dma*()` family. For example:"
+msgstr ""
+"Канал запроса DMA (DRQ) выделяется аналогично. Для его инициализации "
+"используйте функции семейства `isa_dma*()`. Например:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:935
+msgid "`isa_dmacascade(sc->drq0);`"
+msgstr "`isa_dmacascade(sc->drq0);`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:937
+msgid ""
+"The interrupt request line (IRQ) is a bit special. Besides allocation the "
+"driver's interrupt handler should be associated with it. Historically in the "
+"old ISA drivers the argument passed by the system to the interrupt handler "
+"was the device unit number. But in modern drivers the convention suggests "
+"passing the pointer to structure softc. The important reason is that when "
+"the structures softc are allocated dynamically then getting the unit number "
+"from softc is easy while getting softc from the unit number is difficult. "
+"Also this convention makes the drivers for different buses look more uniform "
+"and allows them to share the code: each bus gets its own probe, attach, "
+"detach and other bus-specific routines while the bulk of the driver code may "
+"be shared among them."
+msgstr ""
+"Строка запроса прерывания (IRQ) является особенной. Помимо выделения, "
+"обработчик прерывания драйвера должен быть связан с ней. Исторически в "
+"старых драйверах ISA аргумент, передаваемый системой обработчику прерывания, "
+"был номером устройства. Однако в современных драйверах принято передавать "
+"указатель на структуру `softc`. Важная причина этого заключается в том, что "
+"когда структуры `softc` выделяются динамически, получение номера устройства "
+"из `softc` является простым, в то время как получение `softc` из номера "
+"устройства затруднительно. Кроме того, такое соглашение делает драйверы для "
+"различных шин более однородными и позволяет им совместно использовать код: "
+"каждая шина получает свои собственные процедуры обнаружения, присоединения, "
+"отсоединения и другие специфичные для шины функции, в то время как основная "
+"часть кода драйвера может быть общей для них."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:944
+#, no-wrap
+msgid ""
+" sc->intr_rid = 0;\n"
+" sc->intr_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->intr_rid,\n"
+" /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n"
+msgstr ""
+" sc->intr_rid = 0;\n"
+" sc->intr_r = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->intr_rid,\n"
+" /*start*/ 0, /*end*/ ~0, /*count*/ 0, RF_ACTIVE);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:947
+#, no-wrap
+msgid ""
+" if(sc->intr_r == NULL)\n"
+" goto bad;\n"
+msgstr ""
+" if(sc->intr_r == NULL)\n"
+" goto bad;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:956
+#, no-wrap
+msgid ""
+" /*\n"
+" * XXX_INTR_TYPE is supposed to be defined depending on the type of\n"
+" * the driver, for example as INTR_TYPE_CAM for a CAM driver\n"
+" */\n"
+" error = bus_setup_intr(dev, sc->intr_r, XXX_INTR_TYPE,\n"
+" (driver_intr_t *) xxx_intr, (void *) sc, &sc->intr_cookie);\n"
+" if(error)\n"
+" goto bad;\n"
+msgstr ""
+" /*\n"
+" * XXX_INTR_TYPE is supposed to be defined depending on the type of\n"
+" * the driver, for example as INTR_TYPE_CAM for a CAM driver\n"
+" */\n"
+" error = bus_setup_intr(dev, sc->intr_r, XXX_INTR_TYPE,\n"
+" (driver_intr_t *) xxx_intr, (void *) sc, &sc->intr_cookie);\n"
+" if(error)\n"
+" goto bad;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:959
+msgid ""
+"If the device needs to make DMA to the main memory then this memory should "
+"be allocated like described before:"
+msgstr ""
+"Если устройству необходимо выполнять DMA в основную память, то эта память "
+"должна быть выделена, как описано ранее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:971
+#, no-wrap
+msgid ""
+" error=bus_dma_tag_create(NULL, /*alignment*/ 4,\n"
+" /*boundary*/ 0, /*lowaddr*/ BUS_SPACE_MAXADDR_24BIT,\n"
+" /*highaddr*/ BUS_SPACE_MAXADDR, /*filter*/ NULL, /*filterarg*/ NULL,\n"
+" /*maxsize*/ BUS_SPACE_MAXSIZE_24BIT,\n"
+" /*nsegments*/ BUS_SPACE_UNRESTRICTED,\n"
+" /*maxsegsz*/ BUS_SPACE_MAXSIZE_24BIT, /*flags*/ 0,\n"
+" &sc->parent_tag);\n"
+" if(error)\n"
+" goto bad;\n"
+msgstr ""
+" error=bus_dma_tag_create(NULL, /*alignment*/ 4,\n"
+" /*boundary*/ 0, /*lowaddr*/ BUS_SPACE_MAXADDR_24BIT,\n"
+" /*highaddr*/ BUS_SPACE_MAXADDR, /*filter*/ NULL, /*filterarg*/ NULL,\n"
+" /*maxsize*/ BUS_SPACE_MAXSIZE_24BIT,\n"
+" /*nsegments*/ BUS_SPACE_UNRESTRICTED,\n"
+" /*maxsegsz*/ BUS_SPACE_MAXSIZE_24BIT, /*flags*/ 0,\n"
+" &sc->parent_tag);\n"
+" if(error)\n"
+" goto bad;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:988
+#, no-wrap
+msgid ""
+" /* many things get inherited from the parent tag\n"
+" * sc->data is supposed to point to the structure with the shared data,\n"
+" * for example for a ring buffer it could be:\n"
+" * struct {\n"
+" * u_short rd_pos;\n"
+" * u_short wr_pos;\n"
+" * char bf[XXX_RING_BUFFER_SIZE]\n"
+" * } *data;\n"
+" */\n"
+" error=bus_dma_tag_create(sc->parent_tag, 1,\n"
+" 0, BUS_SPACE_MAXADDR, 0, /*filter*/ NULL, /*filterarg*/ NULL,\n"
+" /*maxsize*/ sizeof(* sc->data), /*nsegments*/ 1,\n"
+" /*maxsegsz*/ sizeof(* sc->data), /*flags*/ 0,\n"
+" &sc->data_tag);\n"
+" if(error)\n"
+" goto bad;\n"
+msgstr ""
+" /* many things get inherited from the parent tag\n"
+" * sc->data is supposed to point to the structure with the shared data,\n"
+" * for example for a ring buffer it could be:\n"
+" * struct {\n"
+" * u_short rd_pos;\n"
+" * u_short wr_pos;\n"
+" * char bf[XXX_RING_BUFFER_SIZE]\n"
+" * } *data;\n"
+" */\n"
+" error=bus_dma_tag_create(sc->parent_tag, 1,\n"
+" 0, BUS_SPACE_MAXADDR, 0, /*filter*/ NULL, /*filterarg*/ NULL,\n"
+" /*maxsize*/ sizeof(* sc->data), /*nsegments*/ 1,\n"
+" /*maxsegsz*/ sizeof(* sc->data), /*flags*/ 0,\n"
+" &sc->data_tag);\n"
+" if(error)\n"
+" goto bad;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:993
+#, no-wrap
+msgid ""
+" error = bus_dmamem_alloc(sc->data_tag, &sc->data, /* flags*/ 0,\n"
+" &sc->data_map);\n"
+" if(error)\n"
+" goto bad;\n"
+msgstr ""
+" error = bus_dmamem_alloc(sc->data_tag, &sc->data, /* flags*/ 0,\n"
+" &sc->data_map);\n"
+" if(error)\n"
+" goto bad;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1009
+#, no-wrap
+msgid ""
+" /* xxx_alloc_callback() just saves the physical address at\n"
+" * the pointer passed as its argument, in this case &sc->data_p.\n"
+" * See details in the section on bus memory mapping.\n"
+" * It can be implemented like:\n"
+" *\n"
+" * static void\n"
+" * xxx_alloc_callback(void *arg, bus_dma_segment_t *seg,\n"
+" * int nseg, int error)\n"
+" * {\n"
+" * *(bus_addr_t *)arg = seg[0].ds_addr;\n"
+" * }\n"
+" */\n"
+" bus_dmamap_load(sc->data_tag, sc->data_map, (void *)sc->data,\n"
+" sizeof (* sc->data), xxx_alloc_callback, (void *) &sc->data_p,\n"
+" /*flags*/0);\n"
+msgstr ""
+" /* xxx_alloc_callback() just saves the physical address at\n"
+" * the pointer passed as its argument, in this case &sc->data_p.\n"
+" * See details in the section on bus memory mapping.\n"
+" * It can be implemented like:\n"
+" *\n"
+" * static void\n"
+" * xxx_alloc_callback(void *arg, bus_dma_segment_t *seg,\n"
+" * int nseg, int error)\n"
+" * {\n"
+" * *(bus_addr_t *)arg = seg[0].ds_addr;\n"
+" * }\n"
+" */\n"
+" bus_dmamap_load(sc->data_tag, sc->data_map, (void *)sc->data,\n"
+" sizeof (* sc->data), xxx_alloc_callback, (void *) &sc->data_p,\n"
+" /*flags*/0);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1012
+msgid ""
+"After all the necessary resources are allocated the device should be "
+"initialized. The initialization may include testing that all the expected "
+"features are functional."
+msgstr ""
+"После выделения всех необходимых ресурсов устройство должно быть "
+"инициализировано. Инициализация может включать проверку работоспособности "
+"всех ожидаемых функций."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1017
+#, no-wrap
+msgid ""
+" if(xxx_initialize(sc) < 0)\n"
+" goto bad;\n"
+msgstr ""
+" if(xxx_initialize(sc) < 0)\n"
+" goto bad;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1020
+msgid ""
+"The bus subsystem will automatically print on the console the device "
+"description set by probe. But if the driver wants to print some extra "
+"information about the device it may do so, for example:"
+msgstr ""
+"Подсистема шины автоматически выводит на консоль описание устройства, "
+"установленное при проверке. Однако, если драйвер хочет вывести "
+"дополнительную информацию об устройстве, он может это сделать, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1025
+#, no-wrap
+msgid " device_printf(dev, \"has on-card FIFO buffer of %d bytes\\n\", sc->fifosize);\n"
+msgstr " device_printf(dev, \"has on-card FIFO buffer of %d bytes\\n\", sc->fifosize);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1028
+msgid ""
+"If the initialization routine experiences any problems then printing "
+"messages about them before returning error is also recommended."
+msgstr ""
+"Если в процессе выполнения инициализации возникают какие-либо проблемы, "
+"рекомендуется выводить сообщения об этих проблемах перед возвратом ошибки."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1030
+msgid ""
+"The final step of the attach routine is attaching the device to its "
+"functional subsystem in the kernel. The exact way to do it depends on the "
+"type of the driver: a character device, a block device, a network device, a "
+"CAM SCSI bus device and so on."
+msgstr ""
+"Последним шагом процедуры присоединения является подключение устройства к "
+"его функциональной подсистеме в ядре. Конкретный способ зависит от типа "
+"драйвера: символьное устройство, блочное устройство, сетевое устройство, "
+"устройство шины CAM SCSI и так далее."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1032
+msgid "If all went well then return success."
+msgstr "Если всё прошло успешно, вернуть успех."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1038
+#, no-wrap
+msgid ""
+" error = xxx_attach_subsystem(sc);\n"
+" if(error)\n"
+" goto bad;\n"
+msgstr ""
+" error = xxx_attach_subsystem(sc);\n"
+" if(error)\n"
+" goto bad;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1040
+#, no-wrap
+msgid " return 0;\n"
+msgstr " return 0;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1043
+msgid ""
+"Finally, handle the troublesome situations. All the resources should be "
+"deallocated before returning an error. We make use of the fact that before "
+"the structure softc is passed to us it gets zeroed out, so we can find out "
+"if some resource was allocated: then its descriptor is non-zero."
+msgstr ""
+"Наконец, обработаем проблемные ситуации. Все ресурсы должны быть освобождены "
+"перед возвратом ошибки. Мы используем тот факт, что перед передачей "
+"структуры `softc` она обнуляется, поэтому мы можем определить, был ли "
+"выделен какой-либо ресурс: если его дескриптор ненулевой."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1053
+#, no-wrap
+msgid ""
+" xxx_free_resources(sc);\n"
+" if(error)\n"
+" return error;\n"
+" else /* exact error is unknown */\n"
+" return ENXIO;\n"
+msgstr ""
+" xxx_free_resources(sc);\n"
+" if(error)\n"
+" return error;\n"
+" else /* exact error is unknown */\n"
+" return ENXIO;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1056
+msgid "That would be all for the attach routine."
+msgstr "Вот и всё для процедуры присоединения."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1058
+#, no-wrap
+msgid "xxx_isa_detach"
+msgstr "xxx_isa_detach"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1061
+msgid ""
+"If this function is present in the driver and the driver is compiled as a "
+"loadable module then the driver gets the ability to be unloaded. This is an "
+"important feature if the hardware supports hot plug. But the ISA bus does "
+"not support hot plug, so this feature is not particularly important for the "
+"ISA devices. The ability to unload a driver may be useful when debugging it, "
+"but in many cases installation of the new version of the driver would be "
+"required only after the old version somehow wedges the system and a reboot "
+"will be needed anyway, so the efforts spent on writing the detach routine "
+"may not be worth it. Another argument that unloading would allow upgrading "
+"the drivers on a production machine seems to be mostly theoretical. "
+"Installing a new version of a driver is a dangerous operation which should "
+"never be performed on a production machine (and which is not permitted when "
+"the system is running in secure mode). Still, the detach routine may be "
+"provided for the sake of completeness."
+msgstr ""
+"Если эта функция присутствует в драйвере и драйвер скомпилирован как "
+"загружаемый модуль, то драйвер получает возможность быть выгруженным. Это "
+"важная функция, если оборудование поддерживает горячее подключение. Однако "
+"шина ISA не поддерживает горячее подключение, поэтому эта функция не "
+"особенно важна для устройств ISA. Возможность выгрузки драйвера может быть "
+"полезна при его отладке, но во многих случаях установка новой версии "
+"драйвера потребуется только после того, как старая версия каким-то образом "
+"заблокирует систему и перезагрузка все равно будет необходима, поэтому "
+"усилия, затраченные на написание процедуры отсоединения, могут не окупиться. "
+"Другой аргумент, что выгрузка позволит обновлять драйверы на рабочей машине, "
+"кажется в основном теоретическим. Установка новой версии драйвера — это "
+"опасная операция, которую никогда не следует выполнять на рабочей машине (и "
+"которая не разрешена, когда система работает в безопасном режиме). Тем не "
+"менее, процедура отсоединения может быть предоставлена для полноты."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1063
+msgid ""
+"The detach routine returns 0 if the driver was successfully detached or the "
+"error code otherwise."
+msgstr ""
+"Процедура отсоединения возвращает 0, если драйвер был успешно отсоединён, "
+"или код ошибки в противном случае."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1065
+msgid ""
+"The logic of detach is a mirror of the attach. The first thing to do is to "
+"detach the driver from its kernel subsystem. If the device is currently open "
+"then the driver has two choices: refuse to be detached or forcibly close and "
+"proceed with detach. The choice used depends on the ability of the "
+"particular kernel subsystem to do a forced close and on the preferences of "
+"the driver's author. Generally the forced close seems to be the preferred "
+"alternative."
+msgstr ""
+"Логика отсоединения является зеркальной по отношению к присоединению. "
+"Первое, что нужно сделать, — это отсоединить драйвер от его подсистемы ядра. "
+"Если устройство в настоящее время открыто, у драйвера есть два варианта: "
+"отказаться от отсоединения или принудительно закрыть устройство и продолжить "
+"отсоединение. Выбор зависит от возможности конкретной подсистемы ядра "
+"выполнить принудительное закрытие и от предпочтений автора драйвера. Как "
+"правило, принудительное закрытие кажется предпочтительным вариантом."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1070
+#, no-wrap
+msgid ""
+" struct xxx_softc *sc = device_get_softc(dev);\n"
+" int error;\n"
+msgstr ""
+" struct xxx_softc *sc = device_get_softc(dev);\n"
+" int error;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1074
+#, no-wrap
+msgid ""
+" error = xxx_detach_subsystem(sc);\n"
+" if(error)\n"
+" return error;\n"
+msgstr ""
+" error = xxx_detach_subsystem(sc);\n"
+" if(error)\n"
+" return error;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1077
+msgid ""
+"Next the driver may want to reset the hardware to some consistent state. "
+"That includes stopping any ongoing transfers, disabling the DMA channels and "
+"interrupts to avoid memory corruption by the device. For most of the drivers "
+"this is exactly what the shutdown routine does, so if it is included in the "
+"driver we can just call it."
+msgstr ""
+"Далее драйвер может сбросить аппаратное обеспечение в согласованное "
+"состояние. Это включает остановку любых текущих передач, отключение каналов "
+"DMA и прерываний, чтобы избежать повреждения памяти устройством. Для "
+"большинства драйверов это именно то, что делает процедура выключения, "
+"поэтому, если она присутствует в драйвере, мы можем просто вызвать её."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1079
+msgid "`xxx_isa_shutdown(dev);`"
+msgstr "`xxx_isa_shutdown(dev);`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1081
+msgid "And finally release all the resources and return success."
+msgstr "И наконец освободить все ресурсы и вернуть успех."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1089
+#, no-wrap
+msgid "xxx_isa_shutdown"
+msgstr "xxx_isa_shutdown"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1092
+msgid ""
+"This routine is called when the system is about to be shut down. It is "
+"expected to bring the hardware to some consistent state. For most of the ISA "
+"devices no special action is required, so the function is not really "
+"necessary because the device will be re-initialized on reboot anyway. But "
+"some devices have to be shut down with a special procedure, to make sure "
+"that they will be properly detected after soft reboot (this is especially "
+"true for many devices with proprietary identification protocols). In any "
+"case disabling DMA and interrupts in the device registers and stopping any "
+"ongoing transfers is a good idea. The exact action depends on the hardware, "
+"so we do not consider it here in any detail."
+msgstr ""
+"Эта процедура вызывается, когда система собирается быть выключена. "
+"Ожидается, что она приведет оборудование в согласованное состояние. Для "
+"большинства устройств ISA не требуется никаких специальных действий, поэтому "
+"функция не является действительно необходимой, так как устройство будет "
+"переинициализировано при перезагрузке в любом случае. Однако некоторые "
+"устройства должны быть выключены с помощью специальной процедуры, чтобы "
+"убедиться, что они будут правильно обнаружены после мягкой перезагрузки (это "
+"особенно актуально для многих устройств с проприетарными протоколами "
+"идентификации). В любом случае отключение DMA и прерываний в регистрах "
+"устройства и остановка любых текущих передач — это хорошая идея. Точные "
+"действия зависят от оборудования, поэтому мы не рассматриваем их здесь "
+"подробно."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1094
+#, no-wrap
+msgid "xxx_intr"
+msgstr "xxx_intr"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1097
+msgid ""
+"The interrupt handler is called when an interrupt is received which may be "
+"from this particular device. The ISA bus does not support interrupt sharing "
+"(except in some special cases) so in practice if the interrupt handler is "
+"called then the interrupt almost for sure came from its device. Still, the "
+"interrupt handler must poll the device registers and make sure that the "
+"interrupt was generated by its device. If not it should just return."
+msgstr ""
+"Обработчик прерывания вызывается при получении прерывания, которое может "
+"быть от данного конкретного устройства. Шина ISA не поддерживает разделение "
+"прерываний (за исключением некоторых специальных случаев), поэтому на "
+"практике, если вызывается обработчик прерывания, то прерывание почти "
+"наверняка поступило от его устройства. Тем не менее, обработчик прерывания "
+"должен опросить регистры устройства и убедиться, что прерывание было "
+"сгенерировано его устройством. Если нет, он должен просто вернуть управление."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1099
+msgid ""
+"The old convention for the ISA drivers was getting the device unit number as "
+"an argument. This is obsolete, and the new drivers receive whatever argument "
+"was specified for them in the attach routine when calling "
+"`bus_setup_intr()`. By the new convention it should be the pointer to the "
+"structure softc. So the interrupt handler commonly starts as:"
+msgstr ""
+"Старая практика для драйверов ISA заключалась в получении номера устройства "
+"в качестве аргумента. Это устарело, и новые драйверы получают любой "
+"аргумент, указанный для них в процедуре присоединения при вызове "
+"`bus_setup_intr()`. Согласно новой практике, это должен быть указатель на "
+"структуру softc. Таким образом, обработчик прерываний обычно начинается так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1106
+#, no-wrap
+msgid ""
+" static void\n"
+" xxx_intr(struct xxx_softc *sc)\n"
+" {\n"
+msgstr ""
+" static void\n"
+" xxx_intr(struct xxx_softc *sc)\n"
+" {\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1109
+msgid ""
+"It runs at the interrupt priority level specified by the interrupt type "
+"parameter of `bus_setup_intr()`. That means that all the other interrupts of "
+"the same type as well as all the software interrupts are disabled."
+msgstr ""
+"Он выполняется на уровне приоритета прерывания, указанном параметром типа "
+"прерывания в `bus_setup_intr()`. Это означает, что все остальные прерывания "
+"того же типа, а также все программные прерывания, отключены."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1111
+msgid "To avoid races it is commonly written as a loop:"
+msgstr "Во избежание гонок это обычно записывается в виде цикла:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1119
+#, no-wrap
+msgid ""
+" while(xxx_interrupt_pending(sc)) {\n"
+" xxx_process_interrupt(sc);\n"
+" xxx_acknowledge_interrupt(sc);\n"
+" }\n"
+msgstr ""
+" while(xxx_interrupt_pending(sc)) {\n"
+" xxx_process_interrupt(sc);\n"
+" xxx_acknowledge_interrupt(sc);\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/isa/_index.adoc:1121
+msgid ""
+"The interrupt handler has to acknowledge interrupt to the device only but "
+"not to the interrupt controller, the system takes care of the latter."
+msgstr ""
+"Обработчик прерывания должен подтвердить прерывание только устройству, но не "
+"контроллеру прерываний, система позаботится о последнем."
diff --git a/documentation/content/ru/books/arch-handbook/jail/_index.adoc b/documentation/content/ru/books/arch-handbook/jail/_index.adoc
new file mode 100644
index 0000000000..84c46e9fbd
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/jail/_index.adoc
@@ -0,0 +1,529 @@
+---
+description: 'Подсистема клеток'
+next: books/arch-handbook/sysinit
+params:
+ path: /books/arch-handbook/jail/
+prev: books/arch-handbook/kobj
+showBookMenu: true
+tags: ["jail", "architecture", "networking", "kernel"]
+title: 'Глава 4. Подсистема клеток'
+weight: 5
+---
+
+[[jail]]
+= Подсистема клеток
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 4
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+На большинстве систем UNIX(R) пользователь `root` обладает неограниченной властью. Это не способствует безопасности. Если злоумышленник получит права `root` в системе, у него окажутся все функции под рукой. В FreeBSD существуют sysctl-параметры, которые ограничивают власть `root`, чтобы минимизировать ущерб от действий злоумышленника. В частности, одна из таких функций называется `уровни безопасности`. Аналогично, другая функция, доступная начиная с FreeBSD 4.0, — это утилита man:jail[8] — клетка. Клетка создает chroot-окружение и накладывает определенные ограничения на процессы, запущенные внутри `клетки`. Например, процесс в `клетке` не может влиять на процессы вне её, использовать определенные системные вызовы или наносить какой-либо ущерб основной системе.
+
+Клетка становится новой моделью безопасности. Пользователи запускают потенциально уязвимые серверы, такие как Apache, BIND и sendmail, внутри клеток, так что если злоумышленник получит права `root` внутри клетки, это будет лишь неудобством, а не катастрофой. Данная статья в основном сосредоточена на внутреннем устройстве (исходном коде) клетки. Для получения информации о настройке клетки см. extref:{handbook} jails/[раздел о клетках Руководства FreeBSD, jails-synopsis].
+
+[[jail-arch]]
+== Архитектура
+
+`Клетка` состоит из двух областей: пользовательской программы man:jail[8] и кода, реализованного в ядре: системного вызова man:jail[2] и связанных с ним ограничений. Я расскажу о пользовательской программе, а затем о том, как `клетка` реализована в ядре.
+
+=== Код в пользовательском пространстве
+
+Исходный код пользовательской части `клетки` находится в [.filename]#/usr/src/usr.sbin/jail# и состоит из одного файла [.filename]#jail.c#. Программа принимает следующие аргументы: путь к `клетке`, имя хоста, IP-адрес и команду для выполнения.
+
+==== Структуры данных
+
+В файле [.filename]#jail.c# первое, на что я бы обратил внимание, это объявление важной структуры `struct jail j;`, которая была включена из [.filename]#/usr/include/sys/jail.h#.
+
+Определение структуры `jail` выглядит следующим образом:
+
+[.programlisting]
+....
+/usr/include/sys/jail.h:
+
+struct jail {
+ u_int32_t version;
+ char *path;
+ char *hostname;
+ u_int32_t ip_number;
+};
+....
+
+Как видно, существует запись для каждого из аргументов, переданных программе man:jail[8], и действительно, они устанавливаются во время её выполнения.
+
+[.programlisting]
+....
+/usr/src/usr.sbin/jail/jail.c
+char path[PATH_MAX];
+...
+if (realpath(argv[0], path) == NULL)
+ err(1, "realpath: %s", argv[0]);
+if (chdir(path) != 0)
+ err(1, "chdir: %s", path);
+memset(&j, 0, sizeof(j));
+j.version = 0;
+j.path = path;
+j.hostname = argv[1];
+....
+
+==== Сетевое взаимодействие
+
+Один из аргументов, передаваемых программе man:jail[8], — это IP-адрес, по которому можно получить доступ к клетке через сеть. man:jail[8] преобразует указанный IP-адрес в порядок байтов хоста и сохраняет его в `j` (структура `jail`).
+
+[.programlisting]
+....
+/usr/src/usr.sbin/jail/jail.c:
+struct in_addr in;
+...
+if (inet_aton(argv[2], &in) == 0)
+ errx(1, "Could not make sense of ip-number: %s", argv[2]);
+j.ip_number = ntohl(in.s_addr);
+....
+
+Функция man:inet_aton[3] "интерпретирует указанную строку символов как интернет-адрес, помещая адрес в предоставленную структуру." Член структуры `ip_number` в структуре `jail` устанавливается только тогда, когда IP-адрес, помещённый в структуру `in` функцией man:inet_aton[3], преобразуется в порядок байтов хоста с помощью man:ntohl[3].
+
+==== Процесс в клетке
+
+Наконец, пользовательская программа помещает процесс в `клетку`. Теперь `клетка` становится самим заключенным процессом и выполняет команду, используя man:execv[3].
+
+[.programlisting]
+....
+/usr/src/usr.sbin/jail/jail.c
+i = jail(&j);
+...
+if (execv(argv[3], argv + 3) != 0)
+ err(1, "execv: %s", argv[3]);
+....
+
+Как видно, вызывается функция `jail()`, и её аргументом является структура `jail`, заполненная аргументами, переданными программе. В конце выполняется указанная вами программа. Теперь я расскажу о том, как `клетка` реализована в ядре.
+
+=== Пространство ядра системы
+
+Мы сейчас рассмотрим файл [.filename]#/usr/src/sys/kern/kern_jail.c#. В этом файле определены системный вызов man:jail[2], соответствующие sysctls и сетевые функции.
+
+==== Управляемые переменные ядра sysctl
+
+В файле [.filename]#kern_jail.c# определены следующие параметры sysctl:
+
+[.programlisting]
+....
+/usr/src/sys/kern/kern_jail.c:
+int jail_set_hostname_allowed = 1;
+SYSCTL_INT(_security_jail, OID_AUTO, set_hostname_allowed, CTLFLAG_RW,
+ &jail_set_hostname_allowed, 0,
+ "Processes in jail can set their hostnames");
+
+int jail_socket_unixiproute_only = 1;
+SYSCTL_INT(_security_jail, OID_AUTO, socket_unixiproute_only, CTLFLAG_RW,
+ &jail_socket_unixiproute_only, 0,
+ "Processes in jail are limited to creating UNIX/IPv4/route sockets only");
+
+int jail_sysvipc_allowed = 0;
+SYSCTL_INT(_security_jail, OID_AUTO, sysvipc_allowed, CTLFLAG_RW,
+ &jail_sysvipc_allowed, 0,
+ "Processes in jail can use System V IPC primitives");
+
+static int jail_enforce_statfs = 2;
+SYSCTL_INT(_security_jail, OID_AUTO, enforce_statfs, CTLFLAG_RW,
+ &jail_enforce_statfs, 0,
+ "Processes in jail cannot see all mounted file systems");
+
+int jail_allow_raw_sockets = 0;
+SYSCTL_INT(_security_jail, OID_AUTO, allow_raw_sockets, CTLFLAG_RW,
+ &jail_allow_raw_sockets, 0,
+ "Prison root can create raw sockets");
+
+int jail_chflags_allowed = 0;
+SYSCTL_INT(_security_jail, OID_AUTO, chflags_allowed, CTLFLAG_RW,
+ &jail_chflags_allowed, 0,
+ "Processes in jail can alter system file flags");
+
+int jail_mount_allowed = 0;
+SYSCTL_INT(_security_jail, OID_AUTO, mount_allowed, CTLFLAG_RW,
+ &jail_mount_allowed, 0,
+ "Processes in jail can mount/unmount jail-friendly file systems");
+....
+
+Каждый из этих параметров sysctl может быть доступен пользователю через программу man:sysctl[8]. В ядре эти конкретные параметры sysctl распознаются по их именам. Например, имя первого параметра sysctl — `security.jail.set_hostname_allowed`.
+
+==== Системный вызов man:jail[2]
+
+Как и все системные вызовы, системный вызов man:jail[2] принимает два аргумента: `struct thread *td` и `struct jail_args *uap`. `td` — это указатель на структуру `thread`, которая описывает вызывающий поток. В данном контексте `uap` — это указатель на структуру, в которой содержится указатель на структуру `jail`, переданную из пользовательского пространства [.filename]#jail.c#. Ранее, когда я описывал пользовательскую программу, вы видели, что системному вызову man:jail[2] была передана структура `jail` в качестве собственного аргумента.
+
+[.programlisting]
+....
+/usr/src/sys/kern/kern_jail.c:
+/*
+ * struct jail_args {
+ * struct jail *jail;
+ * };
+ */
+int
+jail(struct thread *td, struct jail_args *uap)
+....
+
+Следовательно, `uap->jail` можно использовать для доступа к структуре `jail`, которая была передана системному вызову. Далее системный вызов копирует структуру `клетка` в пространство ядра с помощью функции man:copyin[9]. man:copyin[9] принимает три аргумента: адрес данных, которые нужно скопировать в пространство ядра (`uap->jail`), место для записи данных (`j`) и размер хранилища. Структура `jail`, на которую указывает `uap->jail`, копируется в пространство ядра и сохраняется в другой структуре `клетка` — `j`.
+
+[.programlisting]
+....
+/usr/src/sys/kern/kern_jail.c:
+error = copyin(uap->jail, &j, sizeof(j));
+....
+
+В [.filename]#jail.h# определена ещё одна важная структура — `prison`. Структура `prison` используется исключительно в пространстве ядра. Вот определение структуры `prison`.
+
+[.programlisting]
+....
+/usr/include/sys/jail.h:
+struct prison {
+ LIST_ENTRY(prison) pr_list; /* (a) all prisons */
+ int pr_id; /* (c) prison id */
+ int pr_ref; /* (p) refcount */
+ char pr_path[MAXPATHLEN]; /* (c) chroot path */
+ struct vnode *pr_root; /* (c) vnode to rdir */
+ char pr_host[MAXHOSTNAMELEN]; /* (p) jail hostname */
+ u_int32_t pr_ip; /* (c) ip addr host */
+ void *pr_linux; /* (p) linux abi */
+ int pr_securelevel; /* (p) securelevel */
+ struct task pr_task; /* (d) destroy task */
+ struct mtx pr_mtx;
+ void **pr_slots; /* (p) additional data */
+};
+....
+
+Системный вызов man:jail[2] затем выделяет память для структуры `prison` и копирует данные между структурой `клетка` и структурой `prison`.
+
+[.programlisting]
+....
+/usr/src/sys/kern/kern_jail.c:
+MALLOC(pr, struct prison *, sizeof(*pr), M_PRISON, M_WAITOK | M_ZERO);
+...
+error = copyinstr(j.path, &pr->pr_path, sizeof(pr->pr_path), 0);
+if (error)
+ goto e_killmtx;
+...
+error = copyinstr(j.hostname, &pr->pr_host, sizeof(pr->pr_host), 0);
+if (error)
+ goto e_dropvnref;
+pr->pr_ip = j.ip_number;
+....
+
+Далее мы рассмотрим ещё один важный системный вызов man:jail_attach[2], который реализует функцию помещения процесса в клетку.
+
+[.programlisting]
+....
+/usr/src/sys/kern/kern_jail.c:
+/*
+ * struct jail_attach_args {
+ * int jid;
+ * };
+ */
+int
+jail_attach(struct thread *td, struct jail_attach_args *uap)
+....
+
+Этот системный вызов вносит изменения, которые позволяют отличить процесс в клетке от процессов вне клетки. Чтобы понять, что делает man:jail_attach[2], необходима некоторая справочная информация.
+
+В FreeBSD каждый видимый ядром поток идентифицируется своей структурой `thread`, а процессы описываются их структурами `proc`. Определения структур `thread` и `proc` можно найти в [.filename]#/usr/include/sys/proc.h#. Например, аргумент `td` в любом системном вызове на самом деле является указателем на структуру `thread` вызывающего потока, как было указано ранее. Член `td_proc` в структуре `thread`, на которую указывает `td`, является указателем на структуру `proc`, представляющую процесс, содержащий поток, представленный структурой `td`. Структура `proc` содержит члены, которые могут описывать идентификацию владельца (`p_ucred`), ограничения ресурсов процесса (`p_limit`) и так далее. В структуре `ucred`, на которую указывает член `p_ucred` в структуре `proc`, есть указатель на структуру `prison` (`cr_prison`).
+
+[.programlisting]
+....
+/usr/include/sys/proc.h:
+struct thread {
+ ...
+ struct proc *td_proc;
+ ...
+};
+struct proc {
+ ...
+ struct ucred *p_ucred;
+ ...
+};
+/usr/include/sys/ucred.h
+struct ucred {
+ ...
+ struct prison *cr_prison;
+ ...
+};
+....
+
+В файле [.filename]#kern_jail.c# функция `jail()` вызывает функцию `jail_attach()` с заданным `jid`. Затем `jail_attach()` вызывает функцию `change_root()` для изменения корневого каталога вызывающего процесса. Функция `jail_attach()` создает новую структуру `ucred` и присоединяет её к вызывающему процессу после успешного присоединения структуры `prison` к структуре `ucred`. С этого момента вызывающий процесс считается находящимся в клетке. Когда в ядре вызывается функция `jailed()` с вновь созданной структурой `ucred` в качестве аргумента, она возвращает 1, указывая, что учётные данные связаны с клеткой. Общим родительским процессом для всех процессов, созданных внутри клетки, является процесс, запускающий man:jail[8], так как он вызывает системный вызов man:jail[2]. При выполнении программы через man:execve[2] она наследует свойство клетки из структуры `ucred` родительского процесса, следовательно, у нее структура `ucred` тоже со свойством клетки.
+
+[.programlisting]
+....
+/usr/src/sys/kern/kern_jail.c
+int
+jail(struct thread *td, struct jail_args *uap)
+{
+...
+ struct jail_attach_args jaa;
+...
+ error = jail_attach(td, &jaa);
+ if (error)
+ goto e_dropprref;
+...
+}
+
+int
+jail_attach(struct thread *td, struct jail_attach_args *uap)
+{
+ struct proc *p;
+ struct ucred *newcred, *oldcred;
+ struct prison *pr;
+...
+ p = td->td_proc;
+...
+ pr = prison_find(uap->jid);
+...
+ change_root(pr->pr_root, td);
+...
+ newcred->cr_prison = pr;
+ p->p_ucred = newcred;
+...
+}
+....
+
+Когда процесс создается из родительского процесса, системный вызов man:fork[2] использует `crhold()` для поддержания учетных данных нового процесса. Это автоматически сохраняет учетные данные нового дочернего процесса согласованными с родительским, поэтому дочерний процесс также остается в клетке.
+
+[.programlisting]
+....
+/usr/src/sys/kern/kern_fork.c:
+p2->p_ucred = crhold(td->td_ucred);
+...
+td2->td_ucred = crhold(p2->p_ucred);
+....
+
+[[jail-restrictions]]
+== Ограничения
+
+В ядре существуют ограничения доступа, связанные с процессами в клетках. Обычно эти ограничения просто проверяют, находится ли процесс в клетке, и если да, возвращают ошибку. Например:
+
+[.programlisting]
+....
+if (jailed(td->td_ucred))
+ return (EPERM);
+....
+
+=== SysV IPC
+
+System V IPC основан на сообщениях. Процессы могут отправлять друг другу эти сообщения, которые указывают им, как действовать. Функции, работающие с сообщениями: man:msgctl[3], man:msgget[3], man:msgsnd[3] и man:msgrcv[3]. Ранее я упоминал, что существуют определённые sysctl, которые можно включать или выключать для изменения поведения клетки. Один из таких sysctl — `security.jail.sysvipc_allowed`. По умолчанию этот sysctl установлен в 0. Если бы он был установлен в 1, это бы свело на нет весь смысл клетки: привилегированные пользователи внутри клетки смогли бы влиять на процессы за её пределами. Разница между сообщением и сигналом заключается в том, что сообщение состоит только из номера сигнала.
+
+[.filename]#/usr/src/sys/kern/sysv_msg.c#:
+
+* `msgget(key, msgflg)`: `msgget` возвращает (и, возможно, создаёт) дескриптор сообщения, который обозначает очередь сообщений для использования в других функциях.
+* `msgctl(msgid, cmd, buf)`: С помощью этой функции процесс может запросить статус дескриптора сообщения.
+* `msgsnd(msgid, msgp, msgsz, msgflg)`: `msgsnd` отправляет сообщение процессу.
+* `msgrcv(msgid, msgp, msgsz, msgtyp, msgflg)`: процесс получает сообщения с помощью этой функции
+
+В каждом из системных вызовов, соответствующих этим функциям, присутствует следующее условие:
+
+[.programlisting]
+....
+/usr/src/sys/kern/sysv_msg.c:
+if (!jail_sysvipc_allowed && jailed(td->td_ucred))
+ return (ENOSYS);
+....
+
+Системные вызовы семафоров позволяют процессам синхронизировать выполнение, атомарно выполняя набор операций над набором семафоров. По сути, семафоры предоставляют ещё один способ для процессов блокировать ресурсы. Однако процесс, ожидающий семафор, который уже используется, будет находиться в состоянии сна до тех пор, пока ресурсы не будут освобождены. Следующие системные вызовы семафоров блокируются внутри клетки: man:semget[2], man:semctl[2] и man:semop[2].
+
+[.filename]#/usr/src/sys/kern/sysv_sem.c#:
+
+* `semctl(semid, semnum, cmd, ...)`: `semctl` выполняет указанную команду `cmd` для очереди семафоров, указанной в `semid`.
+* `semget(key, nsems, flag)`: `semget` создает массив семафоров, соответствующих `key`.
++
+`key и flag имеют то же значение, как и в msgget.`
+* `semop(semid, array, nops)`: `semop` выполняет набор операций, указанных в `array`, для набора семафоров, идентифицируемых `semid`.
+
+Система IPC System V позволяет процессам использовать общую память. Процессы могут взаимодействовать напрямую друг с другом, разделяя части своего виртуального адресного пространства и затем читая и записывая данные в общей памяти. Эти системные вызовы заблокированы в среде _клетки_: man:shmdt[2], man:shmat[2], man:shmctl[2] и man:shmget[2].
+
+[.filename]#/usr/src/sys/kern/sysv_shm.c#:
+
+* `shmctl(shmid, cmd, buf)`: `shmctl` выполняет различные управляющие операции над областью разделяемой памяти, идентифицируемой `shmid`.
+* `shmget(key, size, flag)`: `shmget` обращается к существующей или создает новую область разделяемой памяти размером `size` байт.
+* `shmat(shmid, addr, flag)`: `shmat` присоединяет область разделяемой памяти, идентифицируемую `shmid`, к адресному пространству процесса.
+* `shmdt(addr)`: `shmdt` отсоединяет ранее присоединенную область разделяемой памяти по адресу `addr`.
+
+=== Сокеты
+
+Клетка обрабатывает системный вызов man:socket[2] и связанные низкоуровневые функции сокетов особым образом. Для определения, разрешено ли создание определённого сокета, сначала проверяется значение sysctl `security.jail.socket_unixiproute_only`. Если оно установлено, сокеты разрешено создавать только в случае, если указанное семейство равно `PF_LOCAL`, `PF_INET` или `PF_ROUTE`. В противном случае возвращается ошибка.
+
+[.programlisting]
+....
+/usr/src/sys/kern/uipc_socket.c:
+int
+socreate(int dom, struct socket **aso, int type, int proto,
+ struct ucred *cred, struct thread *td)
+{
+ struct protosw *prp;
+...
+ if (jailed(cred) && jail_socket_unixiproute_only &&
+ prp->pr_domain->dom_family != PF_LOCAL &&
+ prp->pr_domain->dom_family != PF_INET &&
+ prp->pr_domain->dom_family != PF_ROUTE) {
+ return (EPROTONOSUPPORT);
+ }
+...
+}
+....
+
+=== Berkeley Packet Filter
+
+Берклиевский фильтр пакетов (BPF) предоставляет низкоуровневый интерфейс к канальному уровню, независимый от протокола. В настоящее время BPF управляется через man:devfs[8], который определяет возможность его использования в клетке.
+
+=== Протоколы
+
+Существуют определенные протоколы, которые очень распространены, такие как TCP, UDP, IP и ICMP. IP и ICMP находятся на одном уровне: сетевом уровне 2. Принимаются определенные меры предосторожности, чтобы предотвратить привязку протокола к определенному адресу процессом в клетке, только если установлен параметр `nam`. `nam` является указателем на структуру `sockaddr`, которая описывает адрес, к которому привязывается служба. Более точное определение заключается в том, что `sockaddr` "может использоваться как шаблон для ссылки на идентификационный тег и длину каждого адреса". В функции `in_pcbbind_setup()`, `sin` — это указатель на структуру `sockaddr_in`, которая содержит порт, адрес, длину и семейство доменов сокета, который должен быть привязан. В основном, это запрещает любым процессам из клетки указывать адрес, который не принадлежит клетке, в которой существует вызывающий процесс.
+
+[.programlisting]
+....
+/usr/src/sys/netinet/in_pcb.c:
+int
+in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,
+ u_short *lportp, struct ucred *cred)
+{
+ ...
+ struct sockaddr_in *sin;
+ ...
+ if (nam) {
+ sin = (struct sockaddr_in *)nam;
+ ...
+ if (sin->sin_addr.s_addr != INADDR_ANY)
+ if (prison_ip(cred, 0, &sin->sin_addr.s_addr))
+ return(EINVAL);
+ ...
+ if (lport) {
+ ...
+ if (prison && prison_ip(cred, 0, &sin->sin_addr.s_addr))
+ return (EADDRNOTAVAIL);
+ ...
+ }
+ }
+ if (lport == 0) {
+ ...
+ if (laddr.s_addr != INADDR_ANY)
+ if (prison_ip(cred, 0, &laddr.s_addr))
+ return (EINVAL);
+ ...
+ }
+...
+ if (prison_ip(cred, 0, &laddr.s_addr))
+ return (EINVAL);
+...
+}
+....
+
+Вы можете задаться вопросом, какую функцию выполняет `prison_ip()`. `prison_ip()` принимает три аргумента: указатель на учетные данные (представленные как `cred`), любые флаги и IP-адрес. Она возвращает 1, если IP-адрес НЕ принадлежит клетке, и 0 в противном случае. Как видно из кода, если это действительно IP-адрес, не принадлежащий клетке, протоколу не разрешается привязываться к этому адресу.
+
+[.programlisting]
+....
+/usr/src/sys/kern/kern_jail.c:
+int
+prison_ip(struct ucred *cred, int flag, u_int32_t *ip)
+{
+ u_int32_t tmp;
+
+ if (!jailed(cred))
+ return (0);
+ if (flag)
+ tmp = *ip;
+ else
+ tmp = ntohl(*ip);
+ if (tmp == INADDR_ANY) {
+ if (flag)
+ *ip = cred->cr_prison->pr_ip;
+ else
+ *ip = htonl(cred->cr_prison->pr_ip);
+ return (0);
+ }
+ if (tmp == INADDR_LOOPBACK) {
+ if (flag)
+ *ip = cred->cr_prison->pr_ip;
+ else
+ *ip = htonl(cred->cr_prison->pr_ip);
+ return (0);
+ }
+ if (cred->cr_prison->pr_ip != tmp)
+ return (1);
+ return (0);
+}
+....
+
+=== Файловая система
+
+Даже пользователи с правами `root` внутри `клетки` не могут снять или изменить любые флаги файлов, такие как неизменяемый, только для добавления и неудаляемый, если уровень безопасности (`securelevel`) больше 0.
+
+[.programlisting]
+....
+/usr/src/sys/ufs/ufs/ufs_vnops.c:
+static int
+ufs_setattr(ap)
+ ...
+{
+ ...
+ if (!priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0)) {
+ if (ip->i_flags
+ & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND)) {
+ error = securelevel_gt(cred, 0);
+ if (error)
+ return (error);
+ }
+ ...
+ }
+}
+/usr/src/sys/kern/kern_priv.c
+int
+priv_check_cred(struct ucred *cred, int priv, int flags)
+{
+ ...
+ error = prison_priv_check(cred, priv);
+ if (error)
+ return (error);
+ ...
+}
+/usr/src/sys/kern/kern_jail.c
+int
+prison_priv_check(struct ucred *cred, int priv)
+{
+ ...
+ switch (priv) {
+ ...
+ case PRIV_VFS_SYSFLAGS:
+ if (jail_chflags_allowed)
+ return (0);
+ else
+ return (EPERM);
+ ...
+ }
+ ...
+}
+....
diff --git a/documentation/content/ru/books/arch-handbook/jail/_index.po b/documentation/content/ru/books/arch-handbook/jail/_index.po
new file mode 100644
index 0000000000..b5efb43699
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/jail/_index.po
@@ -0,0 +1,1452 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-08-16 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookjail_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:14
+#, no-wrap
+msgid "The Jail Subsystem"
+msgstr "Подсистема клеток"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:1
+#, no-wrap
+msgid "Chapter 4. The Jail Subsystem"
+msgstr "Глава 4. Подсистема клеток"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:52
+msgid ""
+"On most UNIX(R) systems, `root` has omnipotent power. This promotes "
+"insecurity. If an attacker gained `root` on a system, he would have every "
+"function at his fingertips. In FreeBSD there are sysctls which dilute the "
+"power of `root`, in order to minimize the damage caused by an attacker. "
+"Specifically, one of these functions is called `secure levels`. Similarly, "
+"another function which is present from FreeBSD 4.0 and onward, is a utility "
+"called man:jail[8]. Jail chroots an environment and sets certain "
+"restrictions on processes which are forked within the jail. For example, a "
+"jailed process cannot affect processes outside the jail, utilize certain "
+"system calls, or inflict any damage on the host environment."
+msgstr ""
+"На большинстве систем UNIX(R) пользователь `root` обладает неограниченной "
+"властью. Это не способствует безопасности. Если злоумышленник получит права "
+"`root` в системе, у него окажутся все функции под рукой. В FreeBSD "
+"существуют sysctl-параметры, которые ограничивают власть `root`, чтобы "
+"минимизировать ущерб от действий злоумышленника. В частности, одна из таких "
+"функций называется `уровни безопасности`. Аналогично, другая функция, "
+"доступная начиная с FreeBSD 4.0, — это утилита man:jail[8] — клетка. Клетка "
+"создает chroot-окружение и накладывает определенные ограничения на процессы, "
+"запущенные внутри `клетки`. Например, процесс в `клетке` не может влиять на "
+"процессы вне её, использовать определенные системные вызовы или наносить "
+"какой-либо ущерб основной системе."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:54
+msgid ""
+"Jail is becoming the new security model. People are running potentially "
+"vulnerable servers such as Apache, BIND, and sendmail within jails, so that "
+"if an attacker gains `root` within the jail, it is only an annoyance, and "
+"not a devastation. This article mainly focuses on the internals (source "
+"code) of jail. For information on how to set up a jail see the extref:"
+"{handbook}[handbook entry on jails, jails]."
+msgstr ""
+"Клетка становится новой моделью безопасности. Пользователи запускают "
+"потенциально уязвимые серверы, такие как Apache, BIND и sendmail, внутри "
+"клеток, так что если злоумышленник получит права `root` внутри клетки, это "
+"будет лишь неудобством, а не катастрофой. Данная статья в основном "
+"сосредоточена на внутреннем устройстве (исходном коде) клетки. Для получения "
+"информации о настройке клетки см. extref:{handbook} jails/[раздел о клетках "
+"Руководства FreeBSD, jails-synopsis]."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:56
+#, no-wrap
+msgid "Architecture"
+msgstr "Архитектура"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:59
+msgid ""
+"Jail consists of two realms: the userland program, man:jail[8], and the code "
+"implemented within the kernel: the man:jail[2] system call and associated "
+"restrictions. I will be discussing the userland program and then how jail is "
+"implemented within the kernel."
+msgstr ""
+"`Клетка` состоит из двух областей: пользовательской программы man:jail[8] и "
+"кода, реализованного в ядре: системного вызова man:jail[2] и связанных с ним "
+"ограничений. Я расскажу о пользовательской программе, а затем о том, как "
+"`клетка` реализована в ядре."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:60
+#, no-wrap
+msgid "Userland Code"
+msgstr "Код в пользовательском пространстве"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:63
+msgid ""
+"The source for the userland jail is located in [.filename]#/usr/src/usr.sbin/"
+"jail#, consisting of one file, [.filename]#jail.c#. The program takes these "
+"arguments: the path of the jail, hostname, IP address, and the command to be "
+"executed."
+msgstr ""
+"Исходный код пользовательской части `клетки` находится в [.filename]#/usr/"
+"src/usr.sbin/jail# и состоит из одного файла [.filename]#jail.c#. Программа "
+"принимает следующие аргументы: путь к `клетке`, имя хоста, IP-адрес и "
+"команду для выполнения."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:64
+#, no-wrap
+msgid "Data Structures"
+msgstr "Структуры данных"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:67
+msgid ""
+"In [.filename]#jail.c#, the first thing I would note is the declaration of "
+"an important structure `struct jail j;` which was included from [.filename]#/"
+"usr/include/sys/jail.h#."
+msgstr ""
+"В файле [.filename]#jail.c# первое, на что я бы обратил внимание, это "
+"объявление важной структуры `struct jail j;`, которая была включена из "
+"[.filename]#/usr/include/sys/jail.h#."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:69
+msgid "The definition of the `jail` structure is:"
+msgstr "Определение структуры `jail` выглядит следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:73
+#, no-wrap
+msgid "/usr/include/sys/jail.h:\n"
+msgstr "/usr/include/sys/jail.h:\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:80
+#, no-wrap
+msgid ""
+"struct jail {\n"
+" u_int32_t version;\n"
+" char *path;\n"
+" char *hostname;\n"
+" u_int32_t ip_number;\n"
+"};\n"
+msgstr ""
+"struct jail {\n"
+" u_int32_t version;\n"
+" char *path;\n"
+" char *hostname;\n"
+" u_int32_t ip_number;\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:83
+msgid ""
+"As you can see, there is an entry for each of the arguments passed to the "
+"man:jail[8] program, and indeed, they are set during its execution."
+msgstr ""
+"Как видно, существует запись для каждого из аргументов, переданных программе "
+"man:jail[8], и действительно, они устанавливаются во время её выполнения."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:97
+#, no-wrap
+msgid ""
+"/usr/src/usr.sbin/jail/jail.c\n"
+"char path[PATH_MAX];\n"
+"...\n"
+"if (realpath(argv[0], path) == NULL)\n"
+" err(1, \"realpath: %s\", argv[0]);\n"
+"if (chdir(path) != 0)\n"
+" err(1, \"chdir: %s\", path);\n"
+"memset(&j, 0, sizeof(j));\n"
+"j.version = 0;\n"
+"j.path = path;\n"
+"j.hostname = argv[1];\n"
+msgstr ""
+"/usr/src/usr.sbin/jail/jail.c\n"
+"char path[PATH_MAX];\n"
+"...\n"
+"if (realpath(argv[0], path) == NULL)\n"
+" err(1, \"realpath: %s\", argv[0]);\n"
+"if (chdir(path) != 0)\n"
+" err(1, \"chdir: %s\", path);\n"
+"memset(&j, 0, sizeof(j));\n"
+"j.version = 0;\n"
+"j.path = path;\n"
+"j.hostname = argv[1];\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:99
+#, no-wrap
+msgid "Networking"
+msgstr "Сетевое взаимодействие"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:102
+msgid ""
+"One of the arguments passed to the man:jail[8] program is an IP address with "
+"which the jail can be accessed over the network. man:jail[8] translates the "
+"IP address given into host byte order and then stores it in `j` (the `jail` "
+"structure)."
+msgstr ""
+"Один из аргументов, передаваемых программе man:jail[8], — это IP-адрес, по "
+"которому можно получить доступ к клетке через сеть. man:jail[8] преобразует "
+"указанный IP-адрес в порядок байтов хоста и сохраняет его в `j` (структура "
+"`jail`)."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:111
+#, no-wrap
+msgid ""
+"/usr/src/usr.sbin/jail/jail.c:\n"
+"struct in_addr in;\n"
+"...\n"
+"if (inet_aton(argv[2], &in) == 0)\n"
+" errx(1, \"Could not make sense of ip-number: %s\", argv[2]);\n"
+"j.ip_number = ntohl(in.s_addr);\n"
+msgstr ""
+"/usr/src/usr.sbin/jail/jail.c:\n"
+"struct in_addr in;\n"
+"...\n"
+"if (inet_aton(argv[2], &in) == 0)\n"
+" errx(1, \"Could not make sense of ip-number: %s\", argv[2]);\n"
+"j.ip_number = ntohl(in.s_addr);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:114
+msgid ""
+"The man:inet_aton[3] function \"interprets the specified character string as "
+"an Internet address, placing the address into the structure provided.\" The "
+"`ip_number` member in the `jail` structure is set only when the IP address "
+"placed onto the `in` structure by man:inet_aton[3] is translated into host "
+"byte order by man:ntohl[3]."
+msgstr ""
+"Функция man:inet_aton[3] \"интерпретирует указанную строку символов как "
+"интернет-адрес, помещая адрес в предоставленную структуру.\" Член структуры "
+"`ip_number` в структуре `jail` устанавливается только тогда, когда IP-адрес, "
+"помещённый в структуру `in` функцией man:inet_aton[3], преобразуется в "
+"порядок байтов хоста с помощью man:ntohl[3]."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:115
+#, no-wrap
+msgid "Jailing the Process"
+msgstr "Процесс в клетке"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:118
+msgid ""
+"Finally, the userland program jails the process. Jail now becomes an "
+"imprisoned process itself and then executes the command given using "
+"man:execv[3]."
+msgstr ""
+"Наконец, пользовательская программа помещает процесс в `клетку`. Теперь "
+"`клетка` становится самим заключенным процессом и выполняет команду, "
+"используя man:execv[3]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:126
+#, no-wrap
+msgid ""
+"/usr/src/usr.sbin/jail/jail.c\n"
+"i = jail(&j);\n"
+"...\n"
+"if (execv(argv[3], argv + 3) != 0)\n"
+" err(1, \"execv: %s\", argv[3]);\n"
+msgstr ""
+"/usr/src/usr.sbin/jail/jail.c\n"
+"i = jail(&j);\n"
+"...\n"
+"if (execv(argv[3], argv + 3) != 0)\n"
+" err(1, \"execv: %s\", argv[3]);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:129
+msgid ""
+"As you can see, the `jail()` function is called, and its argument is the "
+"`jail` structure which has been filled with the arguments given to the "
+"program. Finally, the program you specify is executed. I will now discuss "
+"how jail is implemented within the kernel."
+msgstr ""
+"Как видно, вызывается функция `jail()`, и её аргументом является структура "
+"`jail`, заполненная аргументами, переданными программе. В конце выполняется "
+"указанная вами программа. Теперь я расскажу о том, как `клетка` реализована "
+"в ядре."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:130
+#, no-wrap
+msgid "Kernel Space"
+msgstr "Пространство ядра системы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:133
+msgid ""
+"We will now be looking at the file [.filename]#/usr/src/sys/kern/"
+"kern_jail.c#. This is the file where the man:jail[2] system call, "
+"appropriate sysctls, and networking functions are defined."
+msgstr ""
+"Мы сейчас рассмотрим файл [.filename]#/usr/src/sys/kern/kern_jail.c#. В этом "
+"файле определены системный вызов man:jail[2], соответствующие sysctls и "
+"сетевые функции."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:134
+#, no-wrap
+msgid "Sysctls"
+msgstr "Управляемые переменные ядра sysctl"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:137
+msgid "In [.filename]#kern_jail.c#, the following sysctls are defined:"
+msgstr ""
+"В файле [.filename]#kern_jail.c# определены следующие параметры sysctl:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:145
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"int jail_set_hostname_allowed = 1;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, set_hostname_allowed, CTLFLAG_RW,\n"
+" &jail_set_hostname_allowed, 0,\n"
+" \"Processes in jail can set their hostnames\");\n"
+msgstr ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"int jail_set_hostname_allowed = 1;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, set_hostname_allowed, CTLFLAG_RW,\n"
+" &jail_set_hostname_allowed, 0,\n"
+" \"Processes in jail can set their hostnames\");\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:150
+#, no-wrap
+msgid ""
+"int jail_socket_unixiproute_only = 1;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, socket_unixiproute_only, CTLFLAG_RW,\n"
+" &jail_socket_unixiproute_only, 0,\n"
+" \"Processes in jail are limited to creating UNIX/IPv4/route sockets only\");\n"
+msgstr ""
+"int jail_socket_unixiproute_only = 1;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, socket_unixiproute_only, CTLFLAG_RW,\n"
+" &jail_socket_unixiproute_only, 0,\n"
+" \"Processes in jail are limited to creating UNIX/IPv4/route sockets only\");\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:155
+#, no-wrap
+msgid ""
+"int jail_sysvipc_allowed = 0;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, sysvipc_allowed, CTLFLAG_RW,\n"
+" &jail_sysvipc_allowed, 0,\n"
+" \"Processes in jail can use System V IPC primitives\");\n"
+msgstr ""
+"int jail_sysvipc_allowed = 0;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, sysvipc_allowed, CTLFLAG_RW,\n"
+" &jail_sysvipc_allowed, 0,\n"
+" \"Processes in jail can use System V IPC primitives\");\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:160
+#, no-wrap
+msgid ""
+"static int jail_enforce_statfs = 2;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, enforce_statfs, CTLFLAG_RW,\n"
+" &jail_enforce_statfs, 0,\n"
+" \"Processes in jail cannot see all mounted file systems\");\n"
+msgstr ""
+"static int jail_enforce_statfs = 2;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, enforce_statfs, CTLFLAG_RW,\n"
+" &jail_enforce_statfs, 0,\n"
+" \"Processes in jail cannot see all mounted file systems\");\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:165
+#, no-wrap
+msgid ""
+"int jail_allow_raw_sockets = 0;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, allow_raw_sockets, CTLFLAG_RW,\n"
+" &jail_allow_raw_sockets, 0,\n"
+" \"Prison root can create raw sockets\");\n"
+msgstr ""
+"int jail_allow_raw_sockets = 0;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, allow_raw_sockets, CTLFLAG_RW,\n"
+" &jail_allow_raw_sockets, 0,\n"
+" \"Prison root can create raw sockets\");\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:170
+#, no-wrap
+msgid ""
+"int jail_chflags_allowed = 0;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, chflags_allowed, CTLFLAG_RW,\n"
+" &jail_chflags_allowed, 0,\n"
+" \"Processes in jail can alter system file flags\");\n"
+msgstr ""
+"int jail_chflags_allowed = 0;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, chflags_allowed, CTLFLAG_RW,\n"
+" &jail_chflags_allowed, 0,\n"
+" \"Processes in jail can alter system file flags\");\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:175
+#, no-wrap
+msgid ""
+"int jail_mount_allowed = 0;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, mount_allowed, CTLFLAG_RW,\n"
+" &jail_mount_allowed, 0,\n"
+" \"Processes in jail can mount/unmount jail-friendly file systems\");\n"
+msgstr ""
+"int jail_mount_allowed = 0;\n"
+"SYSCTL_INT(_security_jail, OID_AUTO, mount_allowed, CTLFLAG_RW,\n"
+" &jail_mount_allowed, 0,\n"
+" \"Processes in jail can mount/unmount jail-friendly file systems\");\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:178
+msgid ""
+"Each of these sysctls can be accessed by the user through the man:sysctl[8] "
+"program. Throughout the kernel, these specific sysctls are recognized by "
+"their name. For example, the name of the first sysctl is "
+"`security.jail.set_hostname_allowed`."
+msgstr ""
+"Каждый из этих параметров sysctl может быть доступен пользователю через "
+"программу man:sysctl[8]. В ядре эти конкретные параметры sysctl распознаются "
+"по их именам. Например, имя первого параметра sysctl — "
+"`security.jail.set_hostname_allowed`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:179
+#, no-wrap
+msgid "man:jail[2] System Call"
+msgstr "Системный вызов man:jail[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:182
+msgid ""
+"Like all system calls, the man:jail[2] system call takes two arguments, "
+"`struct thread *td` and `struct jail_args *uap`. `td` is a pointer to the "
+"`thread` structure which describes the calling thread. In this context, "
+"`uap` is a pointer to the structure in which a pointer to the `jail` "
+"structure passed by the userland [.filename]#jail.c# is contained. When I "
+"described the userland program before, you saw that the man:jail[2] system "
+"call was given a `jail` structure as its own argument."
+msgstr ""
+"Как и все системные вызовы, системный вызов man:jail[2] принимает два "
+"аргумента: `struct thread *td` и `struct jail_args *uap`. `td` — это "
+"указатель на структуру `thread`, которая описывает вызывающий поток. В "
+"данном контексте `uap` — это указатель на структуру, в которой содержится "
+"указатель на структуру `jail`, переданную из пользовательского пространства "
+"[.filename]#jail.c#. Ранее, когда я описывал пользовательскую программу, вы "
+"видели, что системному вызову man:jail[2] была передана структура `jail` в "
+"качестве собственного аргумента."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:193
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"/*\n"
+" * struct jail_args {\n"
+" * struct jail *jail;\n"
+" * };\n"
+" */\n"
+"int\n"
+"jail(struct thread *td, struct jail_args *uap)\n"
+msgstr ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"/*\n"
+" * struct jail_args {\n"
+" * struct jail *jail;\n"
+" * };\n"
+" */\n"
+"int\n"
+"jail(struct thread *td, struct jail_args *uap)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:196
+msgid ""
+"Therefore, `uap->jail` can be used to access the `jail` structure which was "
+"passed to the system call. Next, the system call copies the `jail` structure "
+"into kernel space using the man:copyin[9] function. man:copyin[9] takes "
+"three arguments: the address of the data which is to be copied into kernel "
+"space, `uap->jail`, where to store it, `j` and the size of the storage. The "
+"`jail` structure pointed by `uap->jail` is copied into kernel space and is "
+"stored in another `jail` structure, `j`."
+msgstr ""
+"Следовательно, `uap->jail` можно использовать для доступа к структуре "
+"`jail`, которая была передана системному вызову. Далее системный вызов "
+"копирует структуру `клетка` в пространство ядра с помощью функции "
+"man:copyin[9]. man:copyin[9] принимает три аргумента: адрес данных, которые "
+"нужно скопировать в пространство ядра (`uap->jail`), место для записи данных "
+"(`j`) и размер хранилища. Структура `jail`, на которую указывает `uap-"
+">jail`, копируется в пространство ядра и сохраняется в другой структуре "
+"`клетка` — `j`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:201
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"error = copyin(uap->jail, &j, sizeof(j));\n"
+msgstr ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"error = copyin(uap->jail, &j, sizeof(j));\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:204
+msgid ""
+"There is another important structure defined in [.filename]#jail.h#. It is "
+"the `prison` structure. The `prison` structure is used exclusively within "
+"kernel space. Here is the definition of the `prison` structure."
+msgstr ""
+"В [.filename]#jail.h# определена ещё одна важная структура — `prison`. "
+"Структура `prison` используется исключительно в пространстве ядра. Вот "
+"определение структуры `prison`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:222
+#, no-wrap
+msgid ""
+"/usr/include/sys/jail.h:\n"
+"struct prison {\n"
+" LIST_ENTRY(prison) pr_list; /* (a) all prisons */\n"
+" int pr_id; /* (c) prison id */\n"
+" int pr_ref; /* (p) refcount */\n"
+" char pr_path[MAXPATHLEN]; /* (c) chroot path */\n"
+" struct vnode *pr_root; /* (c) vnode to rdir */\n"
+" char pr_host[MAXHOSTNAMELEN]; /* (p) jail hostname */\n"
+" u_int32_t pr_ip; /* (c) ip addr host */\n"
+" void *pr_linux; /* (p) linux abi */\n"
+" int pr_securelevel; /* (p) securelevel */\n"
+" struct task pr_task; /* (d) destroy task */\n"
+" struct mtx pr_mtx;\n"
+" void **pr_slots; /* (p) additional data */\n"
+"};\n"
+msgstr ""
+"/usr/include/sys/jail.h:\n"
+"struct prison {\n"
+" LIST_ENTRY(prison) pr_list; /* (a) all prisons */\n"
+" int pr_id; /* (c) prison id */\n"
+" int pr_ref; /* (p) refcount */\n"
+" char pr_path[MAXPATHLEN]; /* (c) chroot path */\n"
+" struct vnode *pr_root; /* (c) vnode to rdir */\n"
+" char pr_host[MAXHOSTNAMELEN]; /* (p) jail hostname */\n"
+" u_int32_t pr_ip; /* (c) ip addr host */\n"
+" void *pr_linux; /* (p) linux abi */\n"
+" int pr_securelevel; /* (p) securelevel */\n"
+" struct task pr_task; /* (d) destroy task */\n"
+" struct mtx pr_mtx;\n"
+" void **pr_slots; /* (p) additional data */\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:225
+msgid ""
+"The man:jail[2] system call then allocates memory for a `prison` structure "
+"and copies data between the `jail` and `prison` structure."
+msgstr ""
+"Системный вызов man:jail[2] затем выделяет память для структуры `prison` и "
+"копирует данные между структурой `клетка` и структурой `prison`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:239
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"MALLOC(pr, struct prison *, sizeof(*pr), M_PRISON, M_WAITOK | M_ZERO);\n"
+"...\n"
+"error = copyinstr(j.path, &pr->pr_path, sizeof(pr->pr_path), 0);\n"
+"if (error)\n"
+" goto e_killmtx;\n"
+"...\n"
+"error = copyinstr(j.hostname, &pr->pr_host, sizeof(pr->pr_host), 0);\n"
+"if (error)\n"
+" goto e_dropvnref;\n"
+"pr->pr_ip = j.ip_number;\n"
+msgstr ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"MALLOC(pr, struct prison *, sizeof(*pr), M_PRISON, M_WAITOK | M_ZERO);\n"
+"...\n"
+"error = copyinstr(j.path, &pr->pr_path, sizeof(pr->pr_path), 0);\n"
+"if (error)\n"
+" goto e_killmtx;\n"
+"...\n"
+"error = copyinstr(j.hostname, &pr->pr_host, sizeof(pr->pr_host), 0);\n"
+"if (error)\n"
+" goto e_dropvnref;\n"
+"pr->pr_ip = j.ip_number;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:242
+msgid ""
+"Next, we will discuss another important system call man:jail_attach[2], "
+"which implements the function to put a process into the jail."
+msgstr ""
+"Далее мы рассмотрим ещё один важный системный вызов man:jail_attach[2], "
+"который реализует функцию помещения процесса в клетку."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:253
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"/*\n"
+" * struct jail_attach_args {\n"
+" * int jid;\n"
+" * };\n"
+" */\n"
+"int\n"
+"jail_attach(struct thread *td, struct jail_attach_args *uap)\n"
+msgstr ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"/*\n"
+" * struct jail_attach_args {\n"
+" * int jid;\n"
+" * };\n"
+" */\n"
+"int\n"
+"jail_attach(struct thread *td, struct jail_attach_args *uap)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:256
+msgid ""
+"This system call makes the changes that can distinguish a jailed process "
+"from those unjailed ones. To understand what man:jail_attach[2] does for us, "
+"certain background information is needed."
+msgstr ""
+"Этот системный вызов вносит изменения, которые позволяют отличить процесс в "
+"клетке от процессов вне клетки. Чтобы понять, что делает man:jail_attach[2], "
+"необходима некоторая справочная информация."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:258
+msgid ""
+"On FreeBSD, each kernel visible thread is identified by its `thread` "
+"structure, while the processes are described by their `proc` structures. You "
+"can find the definitions of the `thread` and `proc` structure in "
+"[.filename]#/usr/include/sys/proc.h#. For example, the `td` argument in any "
+"system call is actually a pointer to the calling thread's `thread` "
+"structure, as stated before. The `td_proc` member in the `thread` structure "
+"pointed by `td` is a pointer to the `proc` structure which represents the "
+"process that contains the thread represented by `td`. The `proc` structure "
+"contains members which can describe the owner's identity(`p_ucred`), the "
+"process resource limits(`p_limit`), and so on. In the `ucred` structure "
+"pointed by `p_ucred` member in the `proc` structure, there is a pointer to "
+"the `prison` structure(`cr_prison`)."
+msgstr ""
+"В FreeBSD каждый видимый ядром поток идентифицируется своей структурой "
+"`thread`, а процессы описываются их структурами `proc`. Определения структур "
+"`thread` и `proc` можно найти в [.filename]#/usr/include/sys/proc.h#. "
+"Например, аргумент `td` в любом системном вызове на самом деле является "
+"указателем на структуру `thread` вызывающего потока, как было указано ранее. "
+"Член `td_proc` в структуре `thread`, на которую указывает `td`, является "
+"указателем на структуру `proc`, представляющую процесс, содержащий поток, "
+"представленный структурой `td`. Структура `proc` содержит члены, которые "
+"могут описывать идентификацию владельца (`p_ucred`), ограничения ресурсов "
+"процесса (`p_limit`) и так далее. В структуре `ucred`, на которую указывает "
+"член `p_ucred` в структуре `proc`, есть указатель на структуру `prison` "
+"(`cr_prison`)."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:278
+#, no-wrap
+msgid ""
+"/usr/include/sys/proc.h:\n"
+"struct thread {\n"
+" ...\n"
+" struct proc *td_proc;\n"
+" ...\n"
+"};\n"
+"struct proc {\n"
+" ...\n"
+" struct ucred *p_ucred;\n"
+" ...\n"
+"};\n"
+"/usr/include/sys/ucred.h\n"
+"struct ucred {\n"
+" ...\n"
+" struct prison *cr_prison;\n"
+" ...\n"
+"};\n"
+msgstr ""
+"/usr/include/sys/proc.h:\n"
+"struct thread {\n"
+" ...\n"
+" struct proc *td_proc;\n"
+" ...\n"
+"};\n"
+"struct proc {\n"
+" ...\n"
+" struct ucred *p_ucred;\n"
+" ...\n"
+"};\n"
+"/usr/include/sys/ucred.h\n"
+"struct ucred {\n"
+" ...\n"
+" struct prison *cr_prison;\n"
+" ...\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:281
+msgid ""
+"In [.filename]#kern_jail.c#, the function `jail()` then calls function "
+"`jail_attach()` with a given `jid`. And `jail_attach()` calls function "
+"`change_root()` to change the root directory of the calling process. The "
+"`jail_attach()` then creates a new `ucred` structure, and attaches the newly "
+"created `ucred` structure to the calling process after it has successfully "
+"attached the `prison` structure to the `ucred` structure. From then on, the "
+"calling process is recognized as jailed. When the kernel routine `jailed()` "
+"is called in the kernel with the newly created `ucred` structure as its "
+"argument, it returns 1 to tell that the credential is connected with a jail. "
+"The public ancestor process of all the process forked within the jail, is "
+"the process which runs man:jail[8], as it calls the man:jail[2] system call. "
+"When a program is executed through man:execve[2], it inherits the jailed "
+"property of its parent's `ucred` structure, therefore it has a jailed "
+"`ucred` structure."
+msgstr ""
+"В файле [.filename]#kern_jail.c# функция `jail()` вызывает функцию "
+"`jail_attach()` с заданным `jid`. Затем `jail_attach()` вызывает функцию "
+"`change_root()` для изменения корневого каталога вызывающего процесса. "
+"Функция `jail_attach()` создает новую структуру `ucred` и присоединяет её к "
+"вызывающему процессу после успешного присоединения структуры `prison` к "
+"структуре `ucred`. С этого момента вызывающий процесс считается находящимся "
+"в клетке. Когда в ядре вызывается функция `jailed()` с вновь созданной "
+"структурой `ucred` в качестве аргумента, она возвращает 1, указывая, что "
+"учётные данные связаны с клеткой. Общим родительским процессом для всех "
+"процессов, созданных внутри клетки, является процесс, запускающий "
+"man:jail[8], так как он вызывает системный вызов man:jail[2]. При выполнении "
+"программы через man:execve[2] она наследует свойство клетки из структуры "
+"`ucred` родительского процесса, следовательно, у нее структура `ucred` тоже "
+"со свойством клетки."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:296
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/kern_jail.c\n"
+"int\n"
+"jail(struct thread *td, struct jail_args *uap)\n"
+"{\n"
+"...\n"
+" struct jail_attach_args jaa;\n"
+"...\n"
+" error = jail_attach(td, &jaa);\n"
+" if (error)\n"
+" goto e_dropprref;\n"
+"...\n"
+"}\n"
+msgstr ""
+"/usr/src/sys/kern/kern_jail.c\n"
+"int\n"
+"jail(struct thread *td, struct jail_args *uap)\n"
+"{\n"
+"...\n"
+" struct jail_attach_args jaa;\n"
+"...\n"
+" error = jail_attach(td, &jaa);\n"
+" if (error)\n"
+" goto e_dropprref;\n"
+"...\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:314
+#, no-wrap
+msgid ""
+"int\n"
+"jail_attach(struct thread *td, struct jail_attach_args *uap)\n"
+"{\n"
+" struct proc *p;\n"
+" struct ucred *newcred, *oldcred;\n"
+" struct prison *pr;\n"
+"...\n"
+" p = td->td_proc;\n"
+"...\n"
+" pr = prison_find(uap->jid);\n"
+"...\n"
+" change_root(pr->pr_root, td);\n"
+"...\n"
+" newcred->cr_prison = pr;\n"
+" p->p_ucred = newcred;\n"
+"...\n"
+"}\n"
+msgstr ""
+"int\n"
+"jail_attach(struct thread *td, struct jail_attach_args *uap)\n"
+"{\n"
+" struct proc *p;\n"
+" struct ucred *newcred, *oldcred;\n"
+" struct prison *pr;\n"
+"...\n"
+" p = td->td_proc;\n"
+"...\n"
+" pr = prison_find(uap->jid);\n"
+"...\n"
+" change_root(pr->pr_root, td);\n"
+"...\n"
+" newcred->cr_prison = pr;\n"
+" p->p_ucred = newcred;\n"
+"...\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:317
+msgid ""
+"When a process is forked from its parent process, the man:fork[2] system "
+"call uses `crhold()` to maintain the credential for the newly forked "
+"process. It inherently keep the newly forked child's credential consistent "
+"with its parent, so the child process is also jailed."
+msgstr ""
+"Когда процесс создается из родительского процесса, системный вызов "
+"man:fork[2] использует `crhold()` для поддержания учетных данных нового "
+"процесса. Это автоматически сохраняет учетные данные нового дочернего "
+"процесса согласованными с родительским, поэтому дочерний процесс также "
+"остается в клетке."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:324
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/kern_fork.c:\n"
+"p2->p_ucred = crhold(td->td_ucred);\n"
+"...\n"
+"td2->td_ucred = crhold(p2->p_ucred);\n"
+msgstr ""
+"/usr/src/sys/kern/kern_fork.c:\n"
+"p2->p_ucred = crhold(td->td_ucred);\n"
+"...\n"
+"td2->td_ucred = crhold(p2->p_ucred);\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:327
+#, no-wrap
+msgid "Restrictions"
+msgstr "Ограничения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:330
+msgid ""
+"Throughout the kernel there are access restrictions relating to jailed "
+"processes. Usually, these restrictions only check whether the process is "
+"jailed, and if so, returns an error. For example:"
+msgstr ""
+"В ядре существуют ограничения доступа, связанные с процессами в клетках. "
+"Обычно эти ограничения просто проверяют, находится ли процесс в клетке, и "
+"если да, возвращают ошибку. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:335
+#, no-wrap
+msgid ""
+"if (jailed(td->td_ucred))\n"
+" return (EPERM);\n"
+msgstr ""
+"if (jailed(td->td_ucred))\n"
+" return (EPERM);\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:337
+#, no-wrap
+msgid "SysV IPC"
+msgstr "SysV IPC"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:340
+msgid ""
+"System V IPC is based on messages. Processes can send each other these "
+"messages which tell them how to act. The functions which deal with messages "
+"are: man:msgctl[3], man:msgget[3], man:msgsnd[3] and man:msgrcv[3]. Earlier, "
+"I mentioned that there were certain sysctls you could turn on or off in "
+"order to affect the behavior of jail. One of these sysctls was "
+"`security.jail.sysvipc_allowed`. By default, this sysctl is set to 0. If it "
+"were set to 1, it would defeat the whole purpose of having a jail; "
+"privileged users from the jail would be able to affect processes outside the "
+"jailed environment. The difference between a message and a signal is that "
+"the message only consists of the signal number."
+msgstr ""
+"System V IPC основан на сообщениях. Процессы могут отправлять друг другу эти "
+"сообщения, которые указывают им, как действовать. Функции, работающие с "
+"сообщениями: man:msgctl[3], man:msgget[3], man:msgsnd[3] и man:msgrcv[3]. "
+"Ранее я упоминал, что существуют определённые sysctl, которые можно включать "
+"или выключать для изменения поведения клетки. Один из таких sysctl — "
+"`security.jail.sysvipc_allowed`. По умолчанию этот sysctl установлен в 0. "
+"Если бы он был установлен в 1, это бы свело на нет весь смысл клетки: "
+"привилегированные пользователи внутри клетки смогли бы влиять на процессы за "
+"её пределами. Разница между сообщением и сигналом заключается в том, что "
+"сообщение состоит только из номера сигнала."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:342
+msgid "[.filename]#/usr/src/sys/kern/sysv_msg.c#:"
+msgstr "[.filename]#/usr/src/sys/kern/sysv_msg.c#:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:344
+msgid ""
+"`msgget(key, msgflg)`: `msgget` returns (and possibly creates) a message "
+"descriptor that designates a message queue for use in other functions."
+msgstr ""
+"`msgget(key, msgflg)`: `msgget` возвращает (и, возможно, создаёт) дескриптор "
+"сообщения, который обозначает очередь сообщений для использования в других "
+"функциях."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:345
+msgid ""
+"`msgctl(msgid, cmd, buf)`: Using this function, a process can query the "
+"status of a message descriptor."
+msgstr ""
+"`msgctl(msgid, cmd, buf)`: С помощью этой функции процесс может запросить "
+"статус дескриптора сообщения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:346
+msgid ""
+"`msgsnd(msgid, msgp, msgsz, msgflg)`: `msgsnd` sends a message to a process."
+msgstr ""
+"`msgsnd(msgid, msgp, msgsz, msgflg)`: `msgsnd` отправляет сообщение процессу."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:347
+msgid ""
+"`msgrcv(msgid, msgp, msgsz, msgtyp, msgflg)`: a process receives messages "
+"using this function"
+msgstr ""
+"`msgrcv(msgid, msgp, msgsz, msgtyp, msgflg)`: процесс получает сообщения с "
+"помощью этой функции"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:349
+msgid ""
+"In each of the system calls corresponding to these functions, there is this "
+"conditional:"
+msgstr ""
+"В каждом из системных вызовов, соответствующих этим функциям, присутствует "
+"следующее условие:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:355
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/sysv_msg.c:\n"
+"if (!jail_sysvipc_allowed && jailed(td->td_ucred))\n"
+" return (ENOSYS);\n"
+msgstr ""
+"/usr/src/sys/kern/sysv_msg.c:\n"
+"if (!jail_sysvipc_allowed && jailed(td->td_ucred))\n"
+" return (ENOSYS);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:358
+msgid ""
+"Semaphore system calls allow processes to synchronize execution by doing a "
+"set of operations atomically on a set of semaphores. Basically semaphores "
+"provide another way for processes lock resources. However, process waiting "
+"on a semaphore, that is being used, will sleep until the resources are "
+"relinquished. The following semaphore system calls are blocked inside a "
+"jail: man:semget[2], man:semctl[2] and man:semop[2]."
+msgstr ""
+"Системные вызовы семафоров позволяют процессам синхронизировать выполнение, "
+"атомарно выполняя набор операций над набором семафоров. По сути, семафоры "
+"предоставляют ещё один способ для процессов блокировать ресурсы. Однако "
+"процесс, ожидающий семафор, который уже используется, будет находиться в "
+"состоянии сна до тех пор, пока ресурсы не будут освобождены. Следующие "
+"системные вызовы семафоров блокируются внутри клетки: man:semget[2], "
+"man:semctl[2] и man:semop[2]."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:360
+msgid "[.filename]#/usr/src/sys/kern/sysv_sem.c#:"
+msgstr "[.filename]#/usr/src/sys/kern/sysv_sem.c#:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:362
+msgid ""
+"`semctl(semid, semnum, cmd, ...)`: `semctl` does the specified `cmd` on the "
+"semaphore queue indicated by `semid`."
+msgstr ""
+"`semctl(semid, semnum, cmd, ...)`: `semctl` выполняет указанную команду "
+"`cmd` для очереди семафоров, указанной в `semid`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:363
+msgid ""
+"`semget(key, nsems, flag)`: `semget` creates an array of semaphores, "
+"corresponding to `key`."
+msgstr ""
+"`semget(key, nsems, flag)`: `semget` создает массив семафоров, "
+"соответствующих `key`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:365
+msgid "`key and flag take on the same meaning as they do in msgget.`"
+msgstr "`key и flag имеют то же значение, как и в msgget.`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:366
+msgid ""
+"`semop(semid, array, nops)`: `semop` performs a group of operations "
+"indicated by `array`, to the set of semaphores identified by `semid`."
+msgstr ""
+"`semop(semid, array, nops)`: `semop` выполняет набор операций, указанных в "
+"`array`, для набора семафоров, идентифицируемых `semid`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:368
+msgid ""
+"System V IPC allows for processes to share memory. Processes can communicate "
+"directly with each other by sharing parts of their virtual address space and "
+"then reading and writing data stored in the shared memory. These system "
+"calls are blocked within a jailed environment: man:shmdt[2], man:shmat[2], "
+"man:shmctl[2] and man:shmget[2]."
+msgstr ""
+"Система IPC System V позволяет процессам использовать общую память. Процессы "
+"могут взаимодействовать напрямую друг с другом, разделяя части своего "
+"виртуального адресного пространства и затем читая и записывая данные в общей "
+"памяти. Эти системные вызовы заблокированы в среде _клетки_: man:shmdt[2], "
+"man:shmat[2], man:shmctl[2] и man:shmget[2]."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:370
+msgid "[.filename]#/usr/src/sys/kern/sysv_shm.c#:"
+msgstr "[.filename]#/usr/src/sys/kern/sysv_shm.c#:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:372
+msgid ""
+"`shmctl(shmid, cmd, buf)`: `shmctl` does various control operations on the "
+"shared memory region identified by `shmid`."
+msgstr ""
+"`shmctl(shmid, cmd, buf)`: `shmctl` выполняет различные управляющие операции "
+"над областью разделяемой памяти, идентифицируемой `shmid`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:373
+msgid ""
+"`shmget(key, size, flag)`: `shmget` accesses or creates a shared memory "
+"region of `size` bytes."
+msgstr ""
+"`shmget(key, size, flag)`: `shmget` обращается к существующей или создает "
+"новую область разделяемой памяти размером `size` байт."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:374
+msgid ""
+"`shmat(shmid, addr, flag)`: `shmat` attaches a shared memory region "
+"identified by `shmid` to the address space of a process."
+msgstr ""
+"`shmat(shmid, addr, flag)`: `shmat` присоединяет область разделяемой памяти, "
+"идентифицируемую `shmid`, к адресному пространству процесса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:375
+msgid ""
+"`shmdt(addr)`: `shmdt` detaches the shared memory region previously attached "
+"at `addr`."
+msgstr ""
+"`shmdt(addr)`: `shmdt` отсоединяет ранее присоединенную область разделяемой "
+"памяти по адресу `addr`."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:376
+#, no-wrap
+msgid "Sockets"
+msgstr "Сокеты"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:379
+msgid ""
+"Jail treats the man:socket[2] system call and related lower-level socket "
+"functions in a special manner. In order to determine whether a certain "
+"socket is allowed to be created, it first checks to see if the sysctl "
+"`security.jail.socket_unixiproute_only` is set. If set, sockets are only "
+"allowed to be created if the family specified is either `PF_LOCAL`, "
+"`PF_INET` or `PF_ROUTE`. Otherwise, it returns an error."
+msgstr ""
+"Клетка обрабатывает системный вызов man:socket[2] и связанные низкоуровневые "
+"функции сокетов особым образом. Для определения, разрешено ли создание "
+"определённого сокета, сначала проверяется значение sysctl "
+"`security.jail.socket_unixiproute_only`. Если оно установлено, сокеты "
+"разрешено создавать только в случае, если указанное семейство равно "
+"`PF_LOCAL`, `PF_INET` или `PF_ROUTE`. В противном случае возвращается ошибка."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:397
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/uipc_socket.c:\n"
+"int\n"
+"socreate(int dom, struct socket **aso, int type, int proto,\n"
+" struct ucred *cred, struct thread *td)\n"
+"{\n"
+" struct protosw *prp;\n"
+"...\n"
+" if (jailed(cred) && jail_socket_unixiproute_only &&\n"
+" prp->pr_domain->dom_family != PF_LOCAL &&\n"
+" prp->pr_domain->dom_family != PF_INET &&\n"
+" prp->pr_domain->dom_family != PF_ROUTE) {\n"
+" return (EPROTONOSUPPORT);\n"
+" }\n"
+"...\n"
+"}\n"
+msgstr ""
+"/usr/src/sys/kern/uipc_socket.c:\n"
+"int\n"
+"socreate(int dom, struct socket **aso, int type, int proto,\n"
+" struct ucred *cred, struct thread *td)\n"
+"{\n"
+" struct protosw *prp;\n"
+"...\n"
+" if (jailed(cred) && jail_socket_unixiproute_only &&\n"
+" prp->pr_domain->dom_family != PF_LOCAL &&\n"
+" prp->pr_domain->dom_family != PF_INET &&\n"
+" prp->pr_domain->dom_family != PF_ROUTE) {\n"
+" return (EPROTONOSUPPORT);\n"
+" }\n"
+"...\n"
+"}\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:399
+#, no-wrap
+msgid "Berkeley Packet Filter"
+msgstr "Berkeley Packet Filter"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:402
+msgid ""
+"The Berkeley Packet Filter provides a raw interface to data link layers in a "
+"protocol independent fashion. BPF is now controlled by the man:devfs[8] "
+"whether it can be used in a jailed environment."
+msgstr ""
+"Берклиевский фильтр пакетов (BPF) предоставляет низкоуровневый интерфейс к "
+"канальному уровню, независимый от протокола. В настоящее время BPF "
+"управляется через man:devfs[8], который определяет возможность его "
+"использования в клетке."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:403
+#, no-wrap
+msgid "Protocols"
+msgstr "Протоколы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:406
+msgid ""
+"There are certain protocols which are very common, such as TCP, UDP, IP and "
+"ICMP. IP and ICMP are on the same level: the network layer 2. There are "
+"certain precautions which are taken in order to prevent a jailed process "
+"from binding a protocol to a certain address only if the `nam` parameter is "
+"set. `nam` is a pointer to a `sockaddr` structure, which describes the "
+"address on which to bind the service. A more exact definition is that "
+"`sockaddr` \"may be used as a template for referring to the identifying tag "
+"and length of each address\". In the function `in_pcbbind_setup()`, `sin` is "
+"a pointer to a `sockaddr_in` structure, which contains the port, address, "
+"length and domain family of the socket which is to be bound. Basically, this "
+"disallows any processes from jail to be able to specify the address that "
+"does not belong to the jail in which the calling process exists."
+msgstr ""
+"Существуют определенные протоколы, которые очень распространены, такие как "
+"TCP, UDP, IP и ICMP. IP и ICMP находятся на одном уровне: сетевом уровне 2. "
+"Принимаются определенные меры предосторожности, чтобы предотвратить привязку "
+"протокола к определенному адресу процессом в клетке, только если установлен "
+"параметр `nam`. `nam` является указателем на структуру `sockaddr`, которая "
+"описывает адрес, к которому привязывается служба. Более точное определение "
+"заключается в том, что `sockaddr` \"может использоваться как шаблон для "
+"ссылки на идентификационный тег и длину каждого адреса\". В функции "
+"`in_pcbbind_setup()`, `sin` — это указатель на структуру `sockaddr_in`, "
+"которая содержит порт, адрес, длину и семейство доменов сокета, который "
+"должен быть привязан. В основном, это запрещает любым процессам из клетки "
+"указывать адрес, который не принадлежит клетке, в которой существует "
+"вызывающий процесс."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:443
+#, no-wrap
+msgid ""
+"/usr/src/sys/netinet/in_pcb.c:\n"
+"int\n"
+"in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,\n"
+" u_short *lportp, struct ucred *cred)\n"
+"{\n"
+" ...\n"
+" struct sockaddr_in *sin;\n"
+" ...\n"
+" if (nam) {\n"
+" sin = (struct sockaddr_in *)nam;\n"
+" ...\n"
+" if (sin->sin_addr.s_addr != INADDR_ANY)\n"
+" if (prison_ip(cred, 0, &sin->sin_addr.s_addr))\n"
+" return(EINVAL);\n"
+" ...\n"
+" if (lport) {\n"
+" ...\n"
+" if (prison && prison_ip(cred, 0, &sin->sin_addr.s_addr))\n"
+" return (EADDRNOTAVAIL);\n"
+" ...\n"
+" }\n"
+" }\n"
+" if (lport == 0) {\n"
+" ...\n"
+" if (laddr.s_addr != INADDR_ANY)\n"
+" if (prison_ip(cred, 0, &laddr.s_addr))\n"
+" return (EINVAL);\n"
+" ...\n"
+" }\n"
+"...\n"
+" if (prison_ip(cred, 0, &laddr.s_addr))\n"
+" return (EINVAL);\n"
+"...\n"
+"}\n"
+msgstr ""
+"/usr/src/sys/netinet/in_pcb.c:\n"
+"int\n"
+"in_pcbbind_setup(struct inpcb *inp, struct sockaddr *nam, in_addr_t *laddrp,\n"
+" u_short *lportp, struct ucred *cred)\n"
+"{\n"
+" ...\n"
+" struct sockaddr_in *sin;\n"
+" ...\n"
+" if (nam) {\n"
+" sin = (struct sockaddr_in *)nam;\n"
+" ...\n"
+" if (sin->sin_addr.s_addr != INADDR_ANY)\n"
+" if (prison_ip(cred, 0, &sin->sin_addr.s_addr))\n"
+" return(EINVAL);\n"
+" ...\n"
+" if (lport) {\n"
+" ...\n"
+" if (prison && prison_ip(cred, 0, &sin->sin_addr.s_addr))\n"
+" return (EADDRNOTAVAIL);\n"
+" ...\n"
+" }\n"
+" }\n"
+" if (lport == 0) {\n"
+" ...\n"
+" if (laddr.s_addr != INADDR_ANY)\n"
+" if (prison_ip(cred, 0, &laddr.s_addr))\n"
+" return (EINVAL);\n"
+" ...\n"
+" }\n"
+"...\n"
+" if (prison_ip(cred, 0, &laddr.s_addr))\n"
+" return (EINVAL);\n"
+"...\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:446
+msgid ""
+"You might be wondering what function `prison_ip()` does. `prison_ip()` is "
+"given three arguments, a pointer to the credential(represented by `cred`), "
+"any flags, and an IP address. It returns 1 if the IP address does NOT belong "
+"to the jail or 0 otherwise. As you can see from the code, if it is indeed an "
+"IP address not belonging to the jail, the protocol is not allowed to bind to "
+"that address."
+msgstr ""
+"Вы можете задаться вопросом, какую функцию выполняет `prison_ip()`. "
+"`prison_ip()` принимает три аргумента: указатель на учетные данные "
+"(представленные как `cred`), любые флаги и IP-адрес. Она возвращает 1, если "
+"IP-адрес НЕ принадлежит клетке, и 0 в противном случае. Как видно из кода, "
+"если это действительно IP-адрес, не принадлежащий клетке, протоколу не "
+"разрешается привязываться к этому адресу."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:454
+#, no-wrap
+msgid ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"int\n"
+"prison_ip(struct ucred *cred, int flag, u_int32_t *ip)\n"
+"{\n"
+" u_int32_t tmp;\n"
+msgstr ""
+"/usr/src/sys/kern/kern_jail.c:\n"
+"int\n"
+"prison_ip(struct ucred *cred, int flag, u_int32_t *ip)\n"
+"{\n"
+" u_int32_t tmp;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:479
+#, no-wrap
+msgid ""
+" if (!jailed(cred))\n"
+" return (0);\n"
+" if (flag)\n"
+" tmp = *ip;\n"
+" else\n"
+" tmp = ntohl(*ip);\n"
+" if (tmp == INADDR_ANY) {\n"
+" if (flag)\n"
+" *ip = cred->cr_prison->pr_ip;\n"
+" else\n"
+" *ip = htonl(cred->cr_prison->pr_ip);\n"
+" return (0);\n"
+" }\n"
+" if (tmp == INADDR_LOOPBACK) {\n"
+" if (flag)\n"
+" *ip = cred->cr_prison->pr_ip;\n"
+" else\n"
+" *ip = htonl(cred->cr_prison->pr_ip);\n"
+" return (0);\n"
+" }\n"
+" if (cred->cr_prison->pr_ip != tmp)\n"
+" return (1);\n"
+" return (0);\n"
+"}\n"
+msgstr ""
+" if (!jailed(cred))\n"
+" return (0);\n"
+" if (flag)\n"
+" tmp = *ip;\n"
+" else\n"
+" tmp = ntohl(*ip);\n"
+" if (tmp == INADDR_ANY) {\n"
+" if (flag)\n"
+" *ip = cred->cr_prison->pr_ip;\n"
+" else\n"
+" *ip = htonl(cred->cr_prison->pr_ip);\n"
+" return (0);\n"
+" }\n"
+" if (tmp == INADDR_LOOPBACK) {\n"
+" if (flag)\n"
+" *ip = cred->cr_prison->pr_ip;\n"
+" else\n"
+" *ip = htonl(cred->cr_prison->pr_ip);\n"
+" return (0);\n"
+" }\n"
+" if (cred->cr_prison->pr_ip != tmp)\n"
+" return (1);\n"
+" return (0);\n"
+"}\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:481
+#, no-wrap
+msgid "Filesystem"
+msgstr "Файловая система"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:484
+msgid ""
+"Even `root` users within the jail are not allowed to unset or modify any "
+"file flags, such as immutable, append-only, and undeleteable flags, if the "
+"securelevel is greater than 0."
+msgstr ""
+"Даже пользователи с правами `root` внутри `клетки` не могут снять или "
+"изменить любые флаги файлов, такие как неизменяемый, только для добавления и "
+"неудаляемый, если уровень безопасности (`securelevel`) больше 0."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/jail/_index.adoc:529
+#, no-wrap
+msgid ""
+"/usr/src/sys/ufs/ufs/ufs_vnops.c:\n"
+"static int\n"
+"ufs_setattr(ap)\n"
+" ...\n"
+"{\n"
+" ...\n"
+" if (!priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0)) {\n"
+" if (ip->i_flags\n"
+" & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND)) {\n"
+" error = securelevel_gt(cred, 0);\n"
+" if (error)\n"
+" return (error);\n"
+" }\n"
+" ...\n"
+" }\n"
+"}\n"
+"/usr/src/sys/kern/kern_priv.c\n"
+"int\n"
+"priv_check_cred(struct ucred *cred, int priv, int flags)\n"
+"{\n"
+" ...\n"
+" error = prison_priv_check(cred, priv);\n"
+" if (error)\n"
+" return (error);\n"
+" ...\n"
+"}\n"
+"/usr/src/sys/kern/kern_jail.c\n"
+"int\n"
+"prison_priv_check(struct ucred *cred, int priv)\n"
+"{\n"
+" ...\n"
+" switch (priv) {\n"
+" ...\n"
+" case PRIV_VFS_SYSFLAGS:\n"
+" if (jail_chflags_allowed)\n"
+" return (0);\n"
+" else\n"
+" return (EPERM);\n"
+" ...\n"
+" }\n"
+" ...\n"
+"}\n"
+msgstr ""
+"/usr/src/sys/ufs/ufs/ufs_vnops.c:\n"
+"static int\n"
+"ufs_setattr(ap)\n"
+" ...\n"
+"{\n"
+" ...\n"
+" if (!priv_check_cred(cred, PRIV_VFS_SYSFLAGS, 0)) {\n"
+" if (ip->i_flags\n"
+" & (SF_NOUNLINK | SF_IMMUTABLE | SF_APPEND)) {\n"
+" error = securelevel_gt(cred, 0);\n"
+" if (error)\n"
+" return (error);\n"
+" }\n"
+" ...\n"
+" }\n"
+"}\n"
+"/usr/src/sys/kern/kern_priv.c\n"
+"int\n"
+"priv_check_cred(struct ucred *cred, int priv, int flags)\n"
+"{\n"
+" ...\n"
+" error = prison_priv_check(cred, priv);\n"
+" if (error)\n"
+" return (error);\n"
+" ...\n"
+"}\n"
+"/usr/src/sys/kern/kern_jail.c\n"
+"int\n"
+"prison_priv_check(struct ucred *cred, int priv)\n"
+"{\n"
+" ...\n"
+" switch (priv) {\n"
+" ...\n"
+" case PRIV_VFS_SYSFLAGS:\n"
+" if (jail_chflags_allowed)\n"
+" return (0);\n"
+" else\n"
+" return (EPERM);\n"
+" ...\n"
+" }\n"
+" ...\n"
+"}\n"
diff --git a/documentation/content/ru/books/arch-handbook/kobj/_index.adoc b/documentation/content/ru/books/arch-handbook/kobj/_index.adoc
new file mode 100644
index 0000000000..bcc42632da
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/kobj/_index.adoc
@@ -0,0 +1,259 @@
+---
+description: 'Объекты ядра'
+next: books/arch-handbook/jail
+params:
+ path: /books/arch-handbook/kobj/
+prev: books/arch-handbook/locking
+showBookMenu: true
+tags: ["kernel objects", "kobj", "guide", "FreeBSD"]
+title: 'Глава 3. Объекты ядра'
+weight: 4
+---
+
+[[kernel-objects]]
+= Объекты ядра
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 3
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Объекты ядра, или _Kobj_, предоставляют объектно-ориентированную систему программирования на языке C для ядра. Таким образом, данные, с которыми производится работа, содержат описание того, как над ними следует выполнять операции. Это позволяет добавлять и удалять операции из интерфейса во время выполнения без нарушения бинарной совместимости.
+
+[[kernel-objects-term]]
+== Терминология
+
+Объект::
+Набор данных - структура данных - аллокация данных.
+
+Метод::
+Операция — функция.
+
+Класс::
+Один или несколько методов.
+
+Интерфейс::
+Стандартный набор из одного или нескольких методов.
+
+[[kernel-objects-operation]]
+== Как работает Kobj
+
+Kobj работает путем генерации описаний методов. Каждое описание содержит уникальный идентификатор, а также функцию по умолчанию. Адрес описания используется для однозначной идентификации метода в таблице методов класса.
+
+Класс создается путем построения таблицы методов, связывающей одну или несколько функций с описаниями методов. Перед использованием класс компилируется. В процессе компиляции выделяется кэш и связывается с классом. Уникальный идентификатор назначается каждому описанию метода в таблице методов класса, если это еще не было сделано другой ссылающейся компиляцией класса. Для каждого используемого метода скриптом генерируется функция для проверки аргументов и автоматического обращения к описанию метода для поиска. Сгенерированная функция ищет метод, используя уникальный идентификатор, связанный с описанием метода, в качестве хэша для доступа к кэшу, связанному с классом объекта. Если метод не найден в кэше, сгенерированная функция использует таблицу класса для поиска метода. Если метод найден, используется связанная с ним функция внутри класса; в противном случае используется функция по умолчанию, связанная с описанием метода.
+
+Эти перенаправления можно визуализировать следующим образом:
+
+[.programlisting]
+....
+object->cache<->class
+....
+
+[[kernel-objects-using]]
+== Использование Kobj
+
+=== Структуры
+
+[.programlisting]
+....
+struct kobj_method
+....
+
+=== Функции
+
+[.programlisting]
+....
+void kobj_class_compile(kobj_class_t cls);
+void kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);
+void kobj_class_free(kobj_class_t cls);
+kobj_t kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags);
+void kobj_init(kobj_t obj, kobj_class_t cls);
+void kobj_delete(kobj_t obj, struct malloc_type *mtype);
+....
+
+=== Макросы
+
+[.programlisting]
+....
+KOBJ_CLASS_FIELDS
+KOBJ_FIELDS
+DEFINE_CLASS(name, methods, size)
+KOBJMETHOD(NAME, FUNC)
+....
+
+=== Заголовки
+
+[.programlisting]
+....
+<sys/param.h>
+<sys/kobj.h>
+....
+
+=== Создание шаблона интерфейса
+
+Первым шагом в использовании Kobj является создание интерфейса. Создание интерфейса включает в себя создание шаблона, который скрипт [.filename]#src/sys/kern/makeobjops.pl# может использовать для генерации заголовочного файла и кода объявлений методов и функций поиска методов.
+
+В этом шаблоне используются следующие ключевые слова: `#include`, `INTERFACE`, `CODE`, `EPILOG`, `HEADER`, `METHOD`, `PROLOG`, `STATICMETHOD` и `DEFAULT`.
+
+Включение директивы `#include` и всего, что следует за ней, копируется дословно в начало сгенерированного файла с кодом.
+
+Например:
+
+[.programlisting]
+....
+#include <sys/foo.h>
+....
+
+Ключевое слово `INTERFACE` используется для определения имени интерфейса. Это имя объединяется с каждым именем метода в формате [имя интерфейса]_[имя метода]. Его синтаксис: `INTERFACE [имя интерфейса];`.
+
+Например:
+
+[.programlisting]
+....
+INTERFACE foo;
+....
+
+Ключевое слово `CODE` копирует свои аргументы дословно в файл кода. Его синтаксис: `CODE { [что угодно] };`
+
+Например:
+
+[.programlisting]
+....
+CODE {
+ struct foo * foo_alloc_null(struct bar *)
+ {
+ return NULL;
+ }
+};
+....
+
+Ключевое слово `HEADER` копирует свои аргументы в заголовочный файл без изменений. Его синтаксис: `HEADER { [что угодно] };`
+
+Например:
+
+[.programlisting]
+....
+HEADER {
+ struct mumble;
+ struct grumble;
+};
+....
+
+Ключевое слово `METHOD` описывает метод. Его синтаксис: `METHOD [возвращаемый тип] [имя метода] { [объект [, аргументы]] };`
+
+Например:
+
+[.programlisting]
+....
+METHOD int bar {
+ struct object *;
+ struct foo *;
+ struct bar;
+};
+....
+
+Ключевое слово `DEFAULT` может следовать за ключевым словом `METHOD`. Оно расширяет ключевое слово `METHOD`, включая функцию по умолчанию для метода. Расширенный синтаксис выглядит так: `METHOD [тип возвращаемого значения] [имя метода] { [объект; [другие аргументы]] } DEFAULT [функция по умолчанию];`
+
+Например:
+
+[.programlisting]
+....
+METHOD int bar {
+ struct object *;
+ struct foo *;
+ int bar;
+} DEFAULT foo_hack;
+....
+
+Ключевое слово `STATICMETHOD` используется аналогично ключевому слову `METHOD`, за исключением того, что данные kobj не находятся в начале структуры объекта, поэтому приведение к типу kobj_t было бы некорректным. Вместо этого `STATICMETHOD` полагается на то, что данные Kobj указаны как 'ops'. Это также полезно для вызова методов напрямую из таблицы методов класса.
+
+Ключевые слова `PROLOG` и `EPILOG` вставляют код непосредственно перед или сразу после `METHOD`, к которому они прикреплены. Эта функция в основном используется для профилирования в ситуациях, когда сложно получить информацию другим способом.
+
+Другие полные примеры:
+
+[.programlisting]
+....
+src/sys/kern/bus_if.m
+src/sys/kern/device_if.m
+....
+
+=== Создание класса
+
+Второй шаг в использовании Kobj — это создание класса. Класс состоит из имени, таблицы методов и размера объектов, если используются средства обработки объектов Kobj. Для создания класса используйте макрос `DEFINE_CLASS()`. Чтобы создать таблицу методов, создайте массив элементов kobj_method_t, завершающийся записью NULL. Каждую не-NULL запись можно создать с помощью макроса `KOBJMETHOD()`.
+
+Например:
+
+[.programlisting]
+....
+DEFINE_CLASS(fooclass, foomethods, sizeof(struct foodata));
+
+kobj_method_t foomethods[] = {
+ KOBJMETHOD(bar_doo, foo_doo),
+ KOBJMETHOD(bar_foo, foo_foo),
+ { NULL, NULL}
+};
+....
+
+Класс должен быть "скомпилирован". В зависимости от состояния системы на момент инициализации класса, необходимо использовать статически выделенный кэш, "таблицу операций". Это может быть достигнуто путем объявления `struct kobj_ops` и использования `kobj_class_compile_static();` в противном случае следует использовать `kobj_class_compile()`.
+
+=== Создание объекта
+
+Третий шаг в использовании Kobj связан с определением объекта. Процедуры создания объекта Kobj предполагают, что данные Kobj находятся в начале объекта. Если это не подходит, вам придется самостоятельно выделить память для объекта, а затем использовать `kobj_init()` для части объекта, относящейся к Kobj; в противном случае вы можете использовать `kobj_create()` для автоматического выделения и инициализации части объекта, относящейся к Kobj. `kobj_init()` также может использоваться для изменения класса, который использует объект.
+
+Для интеграции Kobj в объект следует использовать макрос `KOBJ_FIELDS`.
+
+Например
+
+[.programlisting]
+....
+struct foo_data {
+ KOBJ_FIELDS;
+ foo_foo;
+ foo_bar;
+};
+....
+
+=== Вызов методов
+
+Последним шагом в использовании Kobj является простое использование сгенерированных функций для вызова нужного метода в классе объекта. Это так же просто, как использование имени интерфейса и имени метода с небольшими изменениями. Имя интерфейса должно быть соединено с именем метода с использованием символа '_' между ними, все в верхнем регистре.
+
+Например, если имя интерфейса было foo, а метод — bar, то вызов будет выглядеть следующим образом:
+
+[.programlisting]
+....
+[return value = ] FOO_BAR(object [, other parameters]);
+....
+
+=== Очистка
+
+Когда объект, выделенный через `kobj_create()`, больше не нужен, можно вызвать для него `kobj_delete()`, а когда класс больше не используется, можно вызвать для него `kobj_class_free()`.
diff --git a/documentation/content/ru/books/arch-handbook/kobj/_index.po b/documentation/content/ru/books/arch-handbook/kobj/_index.po
new file mode 100644
index 0000000000..36d7ddff70
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/kobj/_index.po
@@ -0,0 +1,622 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-07-02 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookkobj_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:14
+#, no-wrap
+msgid "Kernel Objects"
+msgstr "Объекты ядра"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:1
+#, no-wrap
+msgid "Chapter 3. Kernel Objects"
+msgstr "Глава 3. Объекты ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:54
+msgid ""
+"Kernel Objects, or _Kobj_ provides an object-oriented C programming system "
+"for the kernel. As such the data being operated on carries the description "
+"of how to operate on it. This allows operations to be added and removed "
+"from an interface at run time and without breaking binary compatibility."
+msgstr ""
+"Объекты ядра, или _Kobj_, предоставляют объектно-ориентированную систему "
+"программирования на языке C для ядра. Таким образом, данные, с которыми "
+"производится работа, содержат описание того, как над ними следует выполнять "
+"операции. Это позволяет добавлять и удалять операции из интерфейса во время "
+"выполнения без нарушения бинарной совместимости."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:56
+#, no-wrap
+msgid "Terminology"
+msgstr "Терминология"
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:58
+#, no-wrap
+msgid "Object"
+msgstr "Объект"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:60
+msgid "A set of data - data structure - data allocation."
+msgstr "Набор данных - структура данных - аллокация данных."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:61
+#, no-wrap
+msgid "Method"
+msgstr "Метод"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:63
+msgid "An operation - function."
+msgstr "Операция — функция."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:64
+#, no-wrap
+msgid "Class"
+msgstr "Класс"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:66
+msgid "One or more methods."
+msgstr "Один или несколько методов."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:67
+#, no-wrap
+msgid "Interface"
+msgstr "Интерфейс"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:69
+msgid "A standard set of one or more methods."
+msgstr "Стандартный набор из одного или нескольких методов."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:71
+#, no-wrap
+msgid "Kobj Operation"
+msgstr "Как работает Kobj"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:76
+msgid ""
+"Kobj works by generating descriptions of methods. Each description holds a "
+"unique id as well as a default function. The description's address is used "
+"to uniquely identify the method within a class' method table."
+msgstr ""
+"Kobj работает путем генерации описаний методов. Каждое описание содержит "
+"уникальный идентификатор, а также функцию по умолчанию. Адрес описания "
+"используется для однозначной идентификации метода в таблице методов класса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:85
+msgid ""
+"A class is built by creating a method table associating one or more "
+"functions with method descriptions. Before use the class is compiled. The "
+"compilation allocates a cache and associates it with the class. A unique id "
+"is assigned to each method description within the method table of the class "
+"if not already done so by another referencing class compilation. For every "
+"method to be used a function is generated by script to qualify arguments and "
+"automatically reference the method description for a lookup. The generated "
+"function looks up the method by using the unique id associated with the "
+"method description as a hash into the cache associated with the object's "
+"class. If the method is not cached the generated function proceeds to use "
+"the class' table to find the method. If the method is found then the "
+"associated function within the class is used; otherwise, the default "
+"function associated with the method description is used."
+msgstr ""
+"Класс создается путем построения таблицы методов, связывающей одну или "
+"несколько функций с описаниями методов. Перед использованием класс "
+"компилируется. В процессе компиляции выделяется кэш и связывается с классом. "
+"Уникальный идентификатор назначается каждому описанию метода в таблице "
+"методов класса, если это еще не было сделано другой ссылающейся компиляцией "
+"класса. Для каждого используемого метода скриптом генерируется функция для "
+"проверки аргументов и автоматического обращения к описанию метода для "
+"поиска. Сгенерированная функция ищет метод, используя уникальный "
+"идентификатор, связанный с описанием метода, в качестве хэша для доступа к "
+"кэшу, связанному с классом объекта. Если метод не найден в кэше, "
+"сгенерированная функция использует таблицу класса для поиска метода. Если "
+"метод найден, используется связанная с ним функция внутри класса; в "
+"противном случае используется функция по умолчанию, связанная с описанием "
+"метода."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:87
+msgid "These indirections can be visualized as the following:"
+msgstr "Эти перенаправления можно визуализировать следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:91
+#, no-wrap
+msgid "object->cache<->class\n"
+msgstr "object->cache<->class\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:94
+#, no-wrap
+msgid "Using Kobj"
+msgstr "Использование Kobj"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:96
+#, no-wrap
+msgid "Structures"
+msgstr "Структуры"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:101
+#, no-wrap
+msgid "struct kobj_method\n"
+msgstr "struct kobj_method\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:103
+#, no-wrap
+msgid "Functions"
+msgstr "Функции"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:113
+#, no-wrap
+msgid ""
+"void kobj_class_compile(kobj_class_t cls);\n"
+"void kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);\n"
+"void kobj_class_free(kobj_class_t cls);\n"
+"kobj_t kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags);\n"
+"void kobj_init(kobj_t obj, kobj_class_t cls);\n"
+"void kobj_delete(kobj_t obj, struct malloc_type *mtype);\n"
+msgstr ""
+"void kobj_class_compile(kobj_class_t cls);\n"
+"void kobj_class_compile_static(kobj_class_t cls, kobj_ops_t ops);\n"
+"void kobj_class_free(kobj_class_t cls);\n"
+"kobj_t kobj_create(kobj_class_t cls, struct malloc_type *mtype, int mflags);\n"
+"void kobj_init(kobj_t obj, kobj_class_t cls);\n"
+"void kobj_delete(kobj_t obj, struct malloc_type *mtype);\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:115
+#, no-wrap
+msgid "Macros"
+msgstr "Макросы"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:123
+#, no-wrap
+msgid ""
+"KOBJ_CLASS_FIELDS\n"
+"KOBJ_FIELDS\n"
+"DEFINE_CLASS(name, methods, size)\n"
+"KOBJMETHOD(NAME, FUNC)\n"
+msgstr ""
+"KOBJ_CLASS_FIELDS\n"
+"KOBJ_FIELDS\n"
+"DEFINE_CLASS(name, methods, size)\n"
+"KOBJMETHOD(NAME, FUNC)\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:125
+#, no-wrap
+msgid "Headers"
+msgstr "Заголовки"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:131
+#, no-wrap
+msgid ""
+"<sys/param.h>\n"
+"<sys/kobj.h>\n"
+msgstr ""
+"<sys/param.h>\n"
+"<sys/kobj.h>\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:133
+#, no-wrap
+msgid "Creating an Interface Template"
+msgstr "Создание шаблона интерфейса"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:137
+msgid ""
+"The first step in using Kobj is to create an Interface. Creating the "
+"interface involves creating a template that the script [.filename]#src/sys/"
+"kern/makeobjops.pl# can use to generate the header and code for the method "
+"declarations and method lookup functions."
+msgstr ""
+"Первым шагом в использовании Kobj является создание интерфейса. Создание "
+"интерфейса включает в себя создание шаблона, который скрипт [.filename]#src/"
+"sys/kern/makeobjops.pl# может использовать для генерации заголовочного файла "
+"и кода объявлений методов и функций поиска методов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:139
+msgid ""
+"Within this template the following keywords are used: `#include`, "
+"`INTERFACE`, `CODE`, `EPILOG`, `HEADER`, `METHOD`, `PROLOG`, `STATICMETHOD`, "
+"and `DEFAULT`."
+msgstr ""
+"В этом шаблоне используются следующие ключевые слова: `#include`, "
+"`INTERFACE`, `CODE`, `EPILOG`, `HEADER`, `METHOD`, `PROLOG`, `STATICMETHOD` "
+"и `DEFAULT`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:141
+msgid ""
+"The `#include` statement and what follows it is copied verbatim to the head "
+"of the generated code file."
+msgstr ""
+"Включение директивы `#include` и всего, что следует за ней, копируется "
+"дословно в начало сгенерированного файла с кодом."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:143
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:154
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:164
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:179
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:192
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:207
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:241
+msgid "For example:"
+msgstr "Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:147
+#, no-wrap
+msgid "#include <sys/foo.h>\n"
+msgstr "#include <sys/foo.h>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:152
+msgid ""
+"The `INTERFACE` keyword is used to define the interface name. This name is "
+"concatenated with each method name as [interface name]_[method name]. Its "
+"syntax is INTERFACE [interface name];."
+msgstr ""
+"Ключевое слово `INTERFACE` используется для определения имени интерфейса. "
+"Это имя объединяется с каждым именем метода в формате [имя интерфейса]_[имя "
+"метода]. Его синтаксис: `INTERFACE [имя интерфейса];`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:158
+#, no-wrap
+msgid "INTERFACE foo;\n"
+msgstr "INTERFACE foo;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:162
+msgid ""
+"The `CODE` keyword copies its arguments verbatim into the code file. Its "
+"syntax is `CODE { [whatever] };`"
+msgstr ""
+"Ключевое слово `CODE` копирует свои аргументы дословно в файл кода. Его "
+"синтаксис: `CODE { [что угодно] };`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:173
+#, no-wrap
+msgid ""
+"CODE {\n"
+"\tstruct foo * foo_alloc_null(struct bar *)\n"
+"\t{\n"
+"\t\treturn NULL;\n"
+"\t}\n"
+"};\n"
+msgstr ""
+"CODE {\n"
+"\tstruct foo * foo_alloc_null(struct bar *)\n"
+"\t{\n"
+"\t\treturn NULL;\n"
+"\t}\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:177
+msgid ""
+"The `HEADER` keyword copies its arguments verbatim into the header file. "
+"Its syntax is `HEADER { [whatever] };`"
+msgstr ""
+"Ключевое слово `HEADER` копирует свои аргументы в заголовочный файл без "
+"изменений. Его синтаксис: `HEADER { [что угодно] };`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:186
+#, no-wrap
+msgid ""
+"HEADER {\n"
+" struct mumble;\n"
+" struct grumble;\n"
+"};\n"
+msgstr ""
+"HEADER {\n"
+" struct mumble;\n"
+" struct grumble;\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:190
+msgid ""
+"The `METHOD` keyword describes a method. Its syntax is `METHOD [return "
+"type] [method name] { [object [, arguments]] };`"
+msgstr ""
+"Ключевое слово `METHOD` описывает метод. Его синтаксис: `METHOD "
+"[возвращаемый тип] [имя метода] { [объект [, аргументы]] };`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:200
+#, no-wrap
+msgid ""
+"METHOD int bar {\n"
+"\tstruct object *;\n"
+"\tstruct foo *;\n"
+"\tstruct bar;\n"
+"};\n"
+msgstr ""
+"METHOD int bar {\n"
+"\tstruct object *;\n"
+"\tstruct foo *;\n"
+"\tstruct bar;\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:205
+msgid ""
+"The `DEFAULT` keyword may follow the `METHOD` keyword. It extends the "
+"`METHOD` key word to include the default function for method. The extended "
+"syntax is `METHOD [return type] [method name] { [object; [other arguments]] }"
+"DEFAULT [default function];`"
+msgstr ""
+"Ключевое слово `DEFAULT` может следовать за ключевым словом `METHOD`. Оно "
+"расширяет ключевое слово `METHOD`, включая функцию по умолчанию для метода. "
+"Расширенный синтаксис выглядит так: `METHOD [тип возвращаемого значения] "
+"[имя метода] { [объект; [другие аргументы]] } DEFAULT [функция по "
+"умолчанию];`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:215
+#, no-wrap
+msgid ""
+"METHOD int bar {\n"
+"\tstruct object *;\n"
+"\tstruct foo *;\n"
+"\tint bar;\n"
+"} DEFAULT foo_hack;\n"
+msgstr ""
+"METHOD int bar {\n"
+"\tstruct object *;\n"
+"\tstruct foo *;\n"
+"\tint bar;\n"
+"} DEFAULT foo_hack;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:220
+msgid ""
+"The `STATICMETHOD` keyword is used like the `METHOD` keyword except the kobj "
+"data is not at the head of the object structure so casting to kobj_t would "
+"be incorrect. Instead `STATICMETHOD` relies on the Kobj data being "
+"referenced as 'ops'. This is also useful for calling methods directly out "
+"of a class's method table."
+msgstr ""
+"Ключевое слово `STATICMETHOD` используется аналогично ключевому слову "
+"`METHOD`, за исключением того, что данные kobj не находятся в начале "
+"структуры объекта, поэтому приведение к типу kobj_t было бы некорректным. "
+"Вместо этого `STATICMETHOD` полагается на то, что данные Kobj указаны как "
+"'ops'. Это также полезно для вызова методов напрямую из таблицы методов "
+"класса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:223
+msgid ""
+"The `PROLOG` and `EPILOG` keywords sets inserts code immediately before or "
+"directly after the `METHOD` they are attached to. This feature is used "
+"primarily for profiling situations where it's difficult to obtain the "
+"information in another way."
+msgstr ""
+"Ключевые слова `PROLOG` и `EPILOG` вставляют код непосредственно перед или "
+"сразу после `METHOD`, к которому они прикреплены. Эта функция в основном "
+"используется для профилирования в ситуациях, когда сложно получить "
+"информацию другим способом."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:225
+msgid "Other complete examples:"
+msgstr "Другие полные примеры:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:230
+#, no-wrap
+msgid ""
+"src/sys/kern/bus_if.m\n"
+"src/sys/kern/device_if.m\n"
+msgstr ""
+"src/sys/kern/bus_if.m\n"
+"src/sys/kern/device_if.m\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:232
+#, no-wrap
+msgid "Creating a Class"
+msgstr "Создание класса"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:239
+msgid ""
+"The second step in using Kobj is to create a class. A class consists of a "
+"name, a table of methods, and the size of objects if Kobj's object handling "
+"facilities are used. To create the class use the macro `DEFINE_CLASS()`. "
+"To create the method table create an array of kobj_method_t terminated by a "
+"NULL entry. Each non-NULL entry may be created using the macro "
+"`KOBJMETHOD()`."
+msgstr ""
+"Второй шаг в использовании Kobj — это создание класса. Класс состоит из "
+"имени, таблицы методов и размера объектов, если используются средства "
+"обработки объектов Kobj. Для создания класса используйте макрос "
+"`DEFINE_CLASS()`. Чтобы создать таблицу методов, создайте массив элементов "
+"kobj_method_t, завершающийся записью NULL. Каждую не-NULL запись можно "
+"создать с помощью макроса `KOBJMETHOD()`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:245
+#, no-wrap
+msgid "DEFINE_CLASS(fooclass, foomethods, sizeof(struct foodata));\n"
+msgstr "DEFINE_CLASS(fooclass, foomethods, sizeof(struct foodata));\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:251
+#, no-wrap
+msgid ""
+"kobj_method_t foomethods[] = {\n"
+"\tKOBJMETHOD(bar_doo, foo_doo),\n"
+"\tKOBJMETHOD(bar_foo, foo_foo),\n"
+"\t{ NULL, NULL}\n"
+"};\n"
+msgstr ""
+"kobj_method_t foomethods[] = {\n"
+"\tKOBJMETHOD(bar_doo, foo_doo),\n"
+"\tKOBJMETHOD(bar_foo, foo_foo),\n"
+"\t{ NULL, NULL}\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:256
+msgid ""
+"The class must be \"compiled\". Depending on the state of the system at the "
+"time that the class is to be initialized a statically allocated cache, \"ops "
+"table\" have to be used. This can be accomplished by declaring a `struct "
+"kobj_ops` and using `kobj_class_compile_static();` otherwise, "
+"`kobj_class_compile()` should be used."
+msgstr ""
+"Класс должен быть \"скомпилирован\". В зависимости от состояния системы на "
+"момент инициализации класса, необходимо использовать статически выделенный "
+"кэш, \"таблицу операций\". Это может быть достигнуто путем объявления "
+"`struct kobj_ops` и использования `kobj_class_compile_static();` в противном "
+"случае следует использовать `kobj_class_compile()`."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:257
+#, no-wrap
+msgid "Creating an Object"
+msgstr "Создание объекта"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:263
+msgid ""
+"The third step in using Kobj involves how to define the object. Kobj object "
+"creation routines assume that Kobj data is at the head of an object. If "
+"this in not appropriate you will have to allocate the object yourself and "
+"then use `kobj_init()` on the Kobj portion of it; otherwise, you may use "
+"`kobj_create()` to allocate and initialize the Kobj portion of the object "
+"automatically. `kobj_init()` may also be used to change the class that an "
+"object uses."
+msgstr ""
+"Третий шаг в использовании Kobj связан с определением объекта. Процедуры "
+"создания объекта Kobj предполагают, что данные Kobj находятся в начале "
+"объекта. Если это не подходит, вам придется самостоятельно выделить память "
+"для объекта, а затем использовать `kobj_init()` для части объекта, "
+"относящейся к Kobj; в противном случае вы можете использовать "
+"`kobj_create()` для автоматического выделения и инициализации части объекта, "
+"относящейся к Kobj. `kobj_init()` также может использоваться для изменения "
+"класса, который использует объект."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:265
+msgid "To integrate Kobj into the object you should use the macro KOBJ_FIELDS."
+msgstr ""
+"Для интеграции Kobj в объект следует использовать макрос `KOBJ_FIELDS`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:267
+msgid "For example"
+msgstr "Например"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:275
+#, no-wrap
+msgid ""
+"struct foo_data {\n"
+"\tKOBJ_FIELDS;\n"
+"\tfoo_foo;\n"
+"\tfoo_bar;\n"
+"};\n"
+msgstr ""
+"struct foo_data {\n"
+"\tKOBJ_FIELDS;\n"
+"\tfoo_foo;\n"
+"\tfoo_bar;\n"
+"};\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:277
+#, no-wrap
+msgid "Calling Methods"
+msgstr "Вызов методов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:282
+msgid ""
+"The last step in using Kobj is to simply use the generated functions to use "
+"the desired method within the object's class. This is as simple as using "
+"the interface name and the method name with a few modifications. The "
+"interface name should be concatenated with the method name using a '_' "
+"between them, all in upper case."
+msgstr ""
+"Последним шагом в использовании Kobj является простое использование "
+"сгенерированных функций для вызова нужного метода в классе объекта. Это так "
+"же просто, как использование имени интерфейса и имени метода с небольшими "
+"изменениями. Имя интерфейса должно быть соединено с именем метода с "
+"использованием символа '_' между ними, все в верхнем регистре."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:284
+msgid ""
+"For example, if the interface name was foo and the method was bar then the "
+"call would be:"
+msgstr ""
+"Например, если имя интерфейса было foo, а метод — bar, то вызов будет "
+"выглядеть следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:288
+#, no-wrap
+msgid "[return value = ] FOO_BAR(object [, other parameters]);\n"
+msgstr "[return value = ] FOO_BAR(object [, other parameters]);\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:290
+#, no-wrap
+msgid "Cleaning Up"
+msgstr "Очистка"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/kobj/_index.adoc:292
+msgid ""
+"When an object allocated through `kobj_create()` is no longer needed "
+"`kobj_delete()` may be called on it, and when a class is no longer being "
+"used `kobj_class_free()` may be called on it."
+msgstr ""
+"Когда объект, выделенный через `kobj_create()`, больше не нужен, можно "
+"вызвать для него `kobj_delete()`, а когда класс больше не используется, "
+"можно вызвать для него `kobj_class_free()`."
diff --git a/documentation/content/ru/books/arch-handbook/locking/_index.adoc b/documentation/content/ru/books/arch-handbook/locking/_index.adoc
new file mode 100644
index 0000000000..b55e13d0a0
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/locking/_index.adoc
@@ -0,0 +1,145 @@
+---
+description: 'Заметки о блокировках'
+next: books/arch-handbook/kobj
+params:
+ path: /books/arch-handbook/locking/
+prev: books/arch-handbook/boot
+showBookMenu: true
+tags: ["locking", "notes", "SMP", "Mutexes"]
+title: 'Глава 2. Заметки о блокировках'
+weight: 3
+---
+
+[[locking]]
+= Заметки о блокировках
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 2
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+_Эта глава сопровождается и поддерживается проектом FreeBSD SMP Next Generation._
+
+Этот документ описывает механизмы блокировки, используемые в ядре FreeBSD для эффективной многопроцессорной обработки. Блокировка может быть достигнута несколькими способами. Структуры данных могут защищаться мьютексами или блокировками (lock) из man:lockmgr[9]. Некоторые переменные защищаются просто за счёт использования атомарных операций для доступа к ним.
+
+[[locking-mutexes]]
+== Mutexes
+
+Мьютекс — это просто блокировка, используемая для обеспечения взаимного исключения. Конкретно, мьютекс может принадлежать только одному объекту в один момент времени. Если другой объект хочет получить мьютекс, который уже принадлежит кому-то, он должен ждать, пока мьютекс не будет освобожден. В ядре FreeBSD мьютексы принадлежат процессам.
+
+Мьютексы могут быть получены рекурсивно, но предполагается, что они удерживаются в течение короткого периода времени. В частности, нельзя переходить в режим сна, удерживая мьютекс. Если необходимо удерживать блокировку во время сна, используйте блокировку man:lockmgr[9].
+
+Каждый мьютекс обладает несколькими важными свойствами:
+
+Имя переменной::
+Имя переменной struct mtx в исходном коде ядра.
+
+Логическое имя::
+Имя мьютекса, назначенное ему с помощью `mtx_init`. Это имя отображается в сообщениях трассировки KTR, ошибках и предупреждениях witness, а также используется для различения мьютексов в коде witness.
+
+Тип::
+Тип мьютекса в терминах флагов `MTX_*`. Значение каждого флага связано с его значением, как описано в man:mutex[9].
+
+`MTX_DEF`:::
+Мьютекс блокировки с ожиданием
+
+`MTX_SPIN`:::
+Мьютекс с вращающейся блокировкой (spin mutex)
+
+`MTX_RECURSE`:::
+Этот мьютекс допускает рекурсию.
+
+Защищаемые системы::
+Список структур данных или членов структур данных, которые защищает эта запись. Для членов структур данных имя будет указано в формате `имя структуры`.`имя члена`.
+
+Зависимые функции::
+Функции, которые могут быть вызваны только при удержании этого мьютекса.
+
+.Список мьютексов
+[cols="15%,10%,10%,55%,20%", frame="all", options="header"]
+|===
+| Имя переменной
+| Логическое имя
+| Тип
+| Защищаемые системы
+| Зависимые функции
+
+|sched_lock
+|"sched lock"
+|`MTX_SPIN` \| `MTX_RECURSE`
+|`_gmonparam`, `cnt.v_swtch`, `cp_time`, `curpriority`, `mtx`.`mtx_blocked`, `mtx`.`mtx_contested`, `proc`.`p_procq`, `proc`.`p_slpq`, `proc`.`p_sflag`, `proc`.`p_stat`, `proc`.`p_estcpu`, `proc`.`p_cpticks` `proc`.`p_pctcpu`, `proc`.`p_wchan`, `proc`.`p_wmesg`, `proc`.`p_swtime`, `proc`.`p_slptime`, `proc`.`p_runtime`, `proc`.`p_uu`, `proc`.`p_su`, `proc`.`p_iu`, `proc`.`p_uticks`, `proc`.`p_sticks`, `proc`.`p_iticks`, `proc`.`p_oncpu`, `proc`.`p_lastcpu`, `proc`.`p_rqindex`, `proc`.`p_heldmtx`, `proc`.`p_blocked`, `proc`.`p_mtxname`, `proc`.`p_contested`, `proc`.`p_priority`, `proc`.`p_usrpri`, `proc`.`p_nativepri`, `proc`.`p_nice`, `proc`.`p_rtprio`, `pscnt`, `slpque`, `itqueuebits`, `itqueues`, `rtqueuebits`, `rtqueues`, `queuebits`, `queues`, `idqueuebits`, `idqueues`, `switchtime`, `switchticks`
+|`setrunqueue`, `remrunqueue`, `mi_switch`, `chooseproc`, `schedclock`, `resetpriority`, `updatepri`, `maybe_resched`, `cpu_switch`, `cpu_throw`, `need_resched`, `resched_wanted`, `clear_resched`, `aston`, `astoff`, `astpending`, `calcru`, `proc_compare`
+
+|vm86pcb_lock
+|"vm86pcb lock"
+|`MTX_DEF`
+|`vm86pcb`
+|`vm86_bioscall`
+
+|Giant
+|"Giant"
+|`MTX_DEF` \| `MTX_RECURSE`
+|почти всё
+|много
+
+|callout_lock
+|"callout lock"
+|`MTX_SPIN` \| `MTX_RECURSE`
+|`callfree`, `callwheel`, `nextsoftcheck`, `proc`.`p_itcallout`, `proc`.`p_slpcallout`, `softticks`, `ticks`
+|
+|===
+
+[[locking-sx]]
+== Разделяемые эксклюзивные блокировки
+
+Эти блокировки обеспечивают базовую функциональность типа читатель-писатель и могут удерживаться спящим процессом. В настоящее время они реализованы через man:lockmgr[9].
+
+.Список разделяемых эксклюзивных блокировок
+[cols="20%,80%", options="header"]
+|===
+| Имя переменной
+| Защищаемые системы
+
+|`allproc_lock`
+|`allproc` `zombproc` `pidhashtbl` `proc`.`p_list` `proc`.`p_hash` `nextpid`
+
+|`proctree_lock`
+|`proc`.`p_children` `proc`.`p_sibling`
+|===
+
+[[locking-atomic]]
+== Атомарно защищённые переменные
+
+Переменная с атомарной защитой — это специальная переменная, которая не защищена явной блокировкой. Вместо этого все операции доступа к данным этой переменной используют специальные атомарные операции, как описано в man:atomic[9]. Очень немногие переменные обрабатываются таким образом, хотя другие примитивы синхронизации, такие как мьютексы, реализованы с использованием переменных с атомарной защитой.
+
+* `mtx`.`mtx_lock`
diff --git a/documentation/content/ru/books/arch-handbook/locking/_index.po b/documentation/content/ru/books/arch-handbook/locking/_index.po
new file mode 100644
index 0000000000..6985f68d2f
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/locking/_index.po
@@ -0,0 +1,390 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-06-30 23:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbooklocking_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:14
+#, no-wrap
+msgid "Locking Notes"
+msgstr "Заметки о блокировках"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:1
+#, no-wrap
+msgid "Chapter 2. Locking Notes"
+msgstr "Глава 2. Заметки о блокировках"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:52
+msgid ""
+"_This chapter is maintained by the FreeBSD SMP Next Generation Project._"
+msgstr ""
+"_Эта глава сопровождается и поддерживается проектом FreeBSD SMP Next "
+"Generation._"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:54
+msgid ""
+"This document outlines the locking used in the FreeBSD kernel to permit "
+"effective multi-processing within the kernel. Locking can be achieved via "
+"several means. Data structures can be protected by mutexes or man:lockmgr[9] "
+"locks. A few variables are protected simply by always using atomic "
+"operations to access them."
+msgstr ""
+"Этот документ описывает механизмы блокировки, используемые в ядре FreeBSD "
+"для эффективной многопроцессорной обработки. Блокировка может быть "
+"достигнута несколькими способами. Структуры данных могут защищаться "
+"мьютексами или блокировками (lock) из man:lockmgr[9]. Некоторые переменные "
+"защищаются просто за счёт использования атомарных операций для доступа к ним."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:56
+#, no-wrap
+msgid "Mutexes"
+msgstr "Mutexes"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:59
+msgid ""
+"A mutex is simply a lock used to guarantee mutual exclusion. Specifically, a "
+"mutex may only be owned by one entity at a time. If another entity wishes to "
+"obtain a mutex that is already owned, it must wait until the mutex is "
+"released. In the FreeBSD kernel, mutexes are owned by processes."
+msgstr ""
+"Мьютекс — это просто блокировка, используемая для обеспечения взаимного "
+"исключения. Конкретно, мьютекс может принадлежать только одному объекту в "
+"один момент времени. Если другой объект хочет получить мьютекс, который уже "
+"принадлежит кому-то, он должен ждать, пока мьютекс не будет освобожден. В "
+"ядре FreeBSD мьютексы принадлежат процессам."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:61
+msgid ""
+"Mutexes may be recursively acquired, but they are intended to be held for a "
+"short period of time. Specifically, one may not sleep while holding a mutex. "
+"If you need to hold a lock across a sleep, use a man:lockmgr[9] lock."
+msgstr ""
+"Мьютексы могут быть получены рекурсивно, но предполагается, что они "
+"удерживаются в течение короткого периода времени. В частности, нельзя "
+"переходить в режим сна, удерживая мьютекс. Если необходимо удерживать "
+"блокировку во время сна, используйте блокировку man:lockmgr[9]."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:63
+msgid "Each mutex has several properties of interest:"
+msgstr "Каждый мьютекс обладает несколькими важными свойствами:"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:64
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:92
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:131
+#, no-wrap
+msgid "Variable Name"
+msgstr "Имя переменной"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:66
+msgid "The name of the struct mtx variable in the kernel source."
+msgstr "Имя переменной struct mtx в исходном коде ядра."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:67
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:93
+#, no-wrap
+msgid "Logical Name"
+msgstr "Логическое имя"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:69
+msgid ""
+"The name of the mutex assigned to it by `mtx_init`. This name is displayed "
+"in KTR trace messages and witness errors and warnings and is used to "
+"distinguish mutexes in the witness code."
+msgstr ""
+"Имя мьютекса, назначенное ему с помощью `mtx_init`. Это имя отображается в "
+"сообщениях трассировки KTR, ошибках и предупреждениях witness, а также "
+"используется для различения мьютексов в коде witness."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:70
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:94
+#, no-wrap
+msgid "Type"
+msgstr "Тип"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:72
+msgid ""
+"The type of the mutex in terms of the `MTX_*` flags. The meaning for each "
+"flag is related to its meaning as documented in man:mutex[9]."
+msgstr ""
+"Тип мьютекса в терминах флагов `MTX_*`. Значение каждого флага связано с его "
+"значением, как описано в man:mutex[9]."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:73
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:106
+#, no-wrap
+msgid "`MTX_DEF`"
+msgstr "`MTX_DEF`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:75
+msgid "A sleep mutex"
+msgstr "Мьютекс блокировки с ожиданием"
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:76
+#, no-wrap
+msgid "`MTX_SPIN`"
+msgstr "`MTX_SPIN`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:78
+msgid "A spin mutex"
+msgstr "Мьютекс с вращающейся блокировкой (spin mutex)"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:79
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:100
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:112
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:118
+#, no-wrap
+msgid "`MTX_RECURSE`"
+msgstr "`MTX_RECURSE`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:81
+msgid "This mutex is allowed to recurse."
+msgstr "Этот мьютекс допускает рекурсию."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:82
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:95
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:133
+#, no-wrap
+msgid "Protectees"
+msgstr "Защищаемые системы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:84
+msgid ""
+"A list of data structures or data structure members that this entry "
+"protects. For data structure members, the name will be in the form of "
+"`structure name`.`member name`."
+msgstr ""
+"Список структур данных или членов структур данных, которые защищает эта "
+"запись. Для членов структур данных имя будет указано в формате `имя "
+"структуры`.`имя члена`."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:85
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:97
+#, no-wrap
+msgid "Dependent Functions"
+msgstr "Зависимые функции"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:87
+msgid "Functions that can only be called if this mutex is held."
+msgstr ""
+"Функции, которые могут быть вызваны только при удержании этого мьютекса."
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:88
+#, no-wrap
+msgid "Mutex List"
+msgstr "Список мьютексов"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:98
+#, no-wrap
+msgid "sched_lock"
+msgstr "sched_lock"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:99
+#, no-wrap
+msgid "\"sched lock\""
+msgstr "\"sched lock\""
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:99
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:117
+#, no-wrap
+msgid "`MTX_SPIN` \\"
+msgstr "`MTX_SPIN` \\"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:101
+#, no-wrap
+msgid "`_gmonparam`, `cnt.v_swtch`, `cp_time`, `curpriority`, `mtx`.`mtx_blocked`, `mtx`.`mtx_contested`, `proc`.`p_procq`, `proc`.`p_slpq`, `proc`.`p_sflag`, `proc`.`p_stat`, `proc`.`p_estcpu`, `proc`.`p_cpticks` `proc`.`p_pctcpu`, `proc`.`p_wchan`, `proc`.`p_wmesg`, `proc`.`p_swtime`, `proc`.`p_slptime`, `proc`.`p_runtime`, `proc`.`p_uu`, `proc`.`p_su`, `proc`.`p_iu`, `proc`.`p_uticks`, `proc`.`p_sticks`, `proc`.`p_iticks`, `proc`.`p_oncpu`, `proc`.`p_lastcpu`, `proc`.`p_rqindex`, `proc`.`p_heldmtx`, `proc`.`p_blocked`, `proc`.`p_mtxname`, `proc`.`p_contested`, `proc`.`p_priority`, `proc`.`p_usrpri`, `proc`.`p_nativepri`, `proc`.`p_nice`, `proc`.`p_rtprio`, `pscnt`, `slpque`, `itqueuebits`, `itqueues`, `rtqueuebits`, `rtqueues`, `queuebits`, `queues`, `idqueuebits`, `idqueues`, `switchtime`, `switchticks`"
+msgstr "`_gmonparam`, `cnt.v_swtch`, `cp_time`, `curpriority`, `mtx`.`mtx_blocked`, `mtx`.`mtx_contested`, `proc`.`p_procq`, `proc`.`p_slpq`, `proc`.`p_sflag`, `proc`.`p_stat`, `proc`.`p_estcpu`, `proc`.`p_cpticks` `proc`.`p_pctcpu`, `proc`.`p_wchan`, `proc`.`p_wmesg`, `proc`.`p_swtime`, `proc`.`p_slptime`, `proc`.`p_runtime`, `proc`.`p_uu`, `proc`.`p_su`, `proc`.`p_iu`, `proc`.`p_uticks`, `proc`.`p_sticks`, `proc`.`p_iticks`, `proc`.`p_oncpu`, `proc`.`p_lastcpu`, `proc`.`p_rqindex`, `proc`.`p_heldmtx`, `proc`.`p_blocked`, `proc`.`p_mtxname`, `proc`.`p_contested`, `proc`.`p_priority`, `proc`.`p_usrpri`, `proc`.`p_nativepri`, `proc`.`p_nice`, `proc`.`p_rtprio`, `pscnt`, `slpque`, `itqueuebits`, `itqueues`, `rtqueuebits`, `rtqueues`, `queuebits`, `queues`, `idqueuebits`, `idqueues`, `switchtime`, `switchticks`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:103
+#, no-wrap
+msgid "`setrunqueue`, `remrunqueue`, `mi_switch`, `chooseproc`, `schedclock`, `resetpriority`, `updatepri`, `maybe_resched`, `cpu_switch`, `cpu_throw`, `need_resched`, `resched_wanted`, `clear_resched`, `aston`, `astoff`, `astpending`, `calcru`, `proc_compare`"
+msgstr "`setrunqueue`, `remrunqueue`, `mi_switch`, `chooseproc`, `schedclock`, `resetpriority`, `updatepri`, `maybe_resched`, `cpu_switch`, `cpu_throw`, `need_resched`, `resched_wanted`, `clear_resched`, `aston`, `astoff`, `astpending`, `calcru`, `proc_compare`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:104
+#, no-wrap
+msgid "vm86pcb_lock"
+msgstr "vm86pcb_lock"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:105
+#, no-wrap
+msgid "\"vm86pcb lock\""
+msgstr "\"vm86pcb lock\""
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:107
+#, no-wrap
+msgid "`vm86pcb`"
+msgstr "`vm86pcb`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:109
+#, no-wrap
+msgid "`vm86_bioscall`"
+msgstr "`vm86_bioscall`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:110
+#, no-wrap
+msgid "Giant"
+msgstr "Giant"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:111
+#, no-wrap
+msgid "\"Giant\""
+msgstr "\"Giant\""
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:111
+#, no-wrap
+msgid "`MTX_DEF` \\"
+msgstr "`MTX_DEF` \\"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:113
+#, no-wrap
+msgid "nearly everything"
+msgstr "почти всё"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:115
+#, no-wrap
+msgid "lots"
+msgstr "много"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:116
+#, no-wrap
+msgid "callout_lock"
+msgstr "callout_lock"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:117
+#, no-wrap
+msgid "\"callout lock\""
+msgstr "\"callout lock\""
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:119
+#, no-wrap
+msgid "`callfree`, `callwheel`, `nextsoftcheck`, `proc`.`p_itcallout`, `proc`.`p_slpcallout`, `softticks`, `ticks`"
+msgstr "`callfree`, `callwheel`, `nextsoftcheck`, `proc`.`p_itcallout`, `proc`.`p_slpcallout`, `softticks`, `ticks`"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:123
+#, no-wrap
+msgid "Shared Exclusive Locks"
+msgstr "Разделяемые эксклюзивные блокировки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:126
+msgid ""
+"These locks provide basic reader-writer type functionality and may be held "
+"by a sleeping process. Currently they are backed by man:lockmgr[9]."
+msgstr ""
+"Эти блокировки обеспечивают базовую функциональность типа читатель-писатель "
+"и могут удерживаться спящим процессом. В настоящее время они реализованы "
+"через man:lockmgr[9]."
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:127
+#, no-wrap
+msgid "Shared Exclusive Lock List"
+msgstr "Список разделяемых эксклюзивных блокировок"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:134
+#, no-wrap
+msgid "`allproc_lock`"
+msgstr "`allproc_lock`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:136
+#, no-wrap
+msgid "`allproc` `zombproc` `pidhashtbl` `proc`.`p_list` `proc`.`p_hash` `nextpid`"
+msgstr "`allproc` `zombproc` `pidhashtbl` `proc`.`p_list` `proc`.`p_hash` `nextpid`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:137
+#, no-wrap
+msgid "`proctree_lock`"
+msgstr "`proctree_lock`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:138
+#, no-wrap
+msgid "`proc`.`p_children` `proc`.`p_sibling`"
+msgstr "`proc`.`p_children` `proc`.`p_sibling`"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:141
+#, no-wrap
+msgid "Atomically Protected Variables"
+msgstr "Атомарно защищённые переменные"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:144
+msgid ""
+"An atomically protected variable is a special variable that is not protected "
+"by an explicit lock. Instead, all data accesses to the variables use special "
+"atomic operations as described in man:atomic[9]. Very few variables are "
+"treated this way, although other synchronization primitives such as mutexes "
+"are implemented with atomically protected variables."
+msgstr ""
+"Переменная с атомарной защитой — это специальная переменная, которая не "
+"защищена явной блокировкой. Вместо этого все операции доступа к данным этой "
+"переменной используют специальные атомарные операции, как описано в "
+"man:atomic[9]. Очень немногие переменные обрабатываются таким образом, хотя "
+"другие примитивы синхронизации, такие как мьютексы, реализованы с "
+"использованием переменных с атомарной защитой."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/locking/_index.adoc:145
+msgid "`mtx`.`mtx_lock`"
+msgstr "`mtx`.`mtx_lock`"
diff --git a/documentation/content/ru/books/arch-handbook/mac/_index.adoc b/documentation/content/ru/books/arch-handbook/mac/_index.adoc
new file mode 100644
index 0000000000..66f6957a00
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/mac/_index.adoc
@@ -0,0 +1,5080 @@
+---
+authors:
+ -
+ author: 'Chris Costello'
+ email: chris@FreeBSD.org
+ -
+ author: 'Robert Watson'
+ email: rwatson@FreeBSD.org
+description: 'Фреймворк TrustedBSD MAC'
+next: books/arch-handbook/vm
+params:
+ path: /books/arch-handbook/mac/
+prev: books/arch-handbook/sysinit
+showBookMenu: true
+tags: ["TrustedBSD", "MAC"]
+title: 'Глава 6. Фреймворк TrustedBSD MAC'
+weight: 7
+---
+
+[[mac]]
+= Фреймворк TrustedBSD MAC
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[mac-copyright]]
+== Авторские права документации MAC
+
+Этот документ был разработан для проекта FreeBSD Крисом Костелло из Safeport Network Services и Network Associates Laboratories, подразделения исследований безопасности Network Associates, Inc., по контракту DARPA/SPAWAR N66001-01-C-8035 ("CBOSS") в рамках исследовательской программы DARPA CHATS.
+
+Redistribution and use in source (SGML DocBook) and 'compiled' forms (SGML, HTML, PDF, PostScript, RTF and so forth) with or without modification, are permitted provided that the following conditions are met:
+
+. Redistributions of source code (SGML DocBook) must retain the above copyright notice, this list of conditions and the following disclaimer as the first lines of this file unmodified.
+. Распространение в скомпилированной форме (преобразованное в другие DTD, конвертированное в PDF, PostScript, RTF и другие форматы) должно включать указанное выше уведомление об авторских правах, данный список условий и следующий отказ от ответственности в документации и/или других материалах, предоставляемых вместе с распространением.
+
+[IMPORTANT]
+====
+ЭТА ДОКУМЕНТАЦИЯ ПРЕДОСТАВЛЯЕТСЯ NETWORKS ASSOCIATES TECHNOLOGY, INC «КАК ЕСТЬ», И ЛЮБЫЕ ЯВНЫЕ ИЛИ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ ТОВАРНОЙ ПРИГОДНОСТИ И ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ ОТРИЦАЮТСЯ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ NETWORKS ASSOCIATES TECHNOLOGY, INC НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ШТРАФНЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ (ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ЗАТРАТЫ НА ЗАМЕНУ ТОВАРОВ ИЛИ УСЛУГ; ПОТЕРЮ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ПРИБЫЛИ; ЛИБО ПРЕРЫВАНИЕ БИЗНЕСА), ВЫЗВАННЫЕ ЛЮБЫМ ОБРАЗОМ И НА ОСНОВАНИИ ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, БУДЬ ТО В РАМКАХ ДОГОВОРА, СТРОГОЙ ОТВЕТСТВЕННОСТИ ИЛИ ДЕЛИКТА (ВКЛЮЧАЯ НЕБРЕЖНОСТЬ ИЛИ ИНОЕ), ВОЗНИКШИЕ ВСЛЕДСТВИЕ ИСПОЛЬЗОВАНИЯ ЭТОЙ ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ БЫЛО ПРЕДУПРЕЖДЕНИЕ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ.
+====
+
+[[mac-synopsis]]
+== Обзор
+
+FreeBSD включает экспериментальную поддержку нескольких политик обязательного контроля доступа, а также инфраструктуру для расширяемости безопасности ядра — TrustedBSD MAC Framework. MAC Framework представляет собой модульную инфраструктуру контроля доступа, позволяющую легко встраивать новые политики безопасности в ядро, загружать их при старте системы или динамически во время работы. Инфраструктура предоставляет множество возможностей для упрощения реализации новых политик безопасности, включая возможность легко присваивать метки безопасности (например, информацию о конфиденциальности) объектам системы.
+
+Эта глава представляет фреймворк политик MAC и содержит документацию для образца модуля политики MAC.
+
+[[mac-introduction]]
+== Введение
+
+Фреймворк TrustedBSD MAC предоставляет механизм для расширения модели контроля доступа ядра во время компиляции или выполнения. Новые политики системы могут быть реализованы в виде модулей ядра и связаны с ним; если присутствуют несколько модулей политик, их результаты будут объединены. Фреймворк MAC предоставляет различные инфраструктурные сервисы контроля доступа для помощи разработчикам политик, включая поддержку временных и постоянных меток безопасности объектов, не зависящих от политик. В настоящее время эта поддержка считается экспериментальной.
+
+Эта глава предоставляет информацию, предназначенную для разработчиков модулей политик, а также потенциальных пользователей сред с поддержкой MAC, чтобы узнать о том, как MAC Framework поддерживает расширение контроля доступа в ядре.
+
+[[mac-background]]
+== Общие сведения о политиках
+
+Мандатное управление доступом (MAC — Mandatory Access Control) относится к набору политик контроля доступа, которые в обязательном порядке применяются операционной системой к пользователям. Политики MAC можно противопоставить защите на основе дискреционного управления доступом (DAC — Discretionary Access Control), при которой непривилегированные пользователи могут (по своему усмотрению) защищать объекты. В традиционных UNIX-системах защита DAC включает права доступа к файлам и списки контроля доступа; защита MAC включает управление процессами, предотвращающее отладку между пользователями, и межсетевые экраны. Различные политики MAC были разработаны создателями операционных систем и исследователями безопасности, включая политику конфиденциальности многоуровневой безопасности (MLS — Multi-Level Security), политику целостности Biba, управление доступом на основе ролей (RBAC — Role-Based Access Control), принудительное применение доменов и типов (DTE — Domain and Type Enforcement) и принудительное применение типов (TE — Type Enforcement). Каждая модель основывает решения на различных факторах, включая идентификатор пользователя, роль и уровень доступа, а также метки безопасности на объектах, представляющих такие концепции, как конфиденциальность и целостность данных.
+
+Фреймворк TrustedBSD MAC способен поддерживать модули политик, реализующие все эти политики, а также широкий класс политик усиления защиты системы, которые могут использовать существующие атрибуты безопасности, такие как идентификаторы пользователей и групп, а также расширенные атрибуты файлов и другие свойства системы. Кроме того, несмотря на название, фреймворк MAC также может использоваться для реализации чисто дискреционных политик, поскольку модулям политик предоставляется значительная гибкость в том, как они авторизуют защиту.
+
+[[mac-framework-kernel-arch]]
+== Архитектура MAC Framework в ядре
+
+Фреймворк TrustedBSD MAC позволяет модулям ядра расширять политику безопасности операционной системы, а также предоставляет функциональность инфраструктуры, необходимую многим модулям контроля доступа. Если одновременно загружено несколько политик, фреймворк MAC полезным образом (в некотором смысле полезным) объединит результаты этих политик.
+
+[[mac-framework-kernel-arch-elements]]
+=== Элементы ядра
+
+В рамках MAC Framework реализован ряд элементов ядра:
+
+* Интерфейсы управления фреймворком
+* Параллелизм и примитивы синхронизации.
+* Регистрация политики
+* Расширяемая метка безопасности для объектов ядра
+* Операторы композиции точки входа политики
+* Примитивы управления метками
+* Точка входа API, вызываемая службами ядра
+* Точка входа API для модулей политик
+* Реализации точек входа (жизненный цикл политики, жизненный цикл объекта/управление метками, проверки контроля доступа).
+* Системные вызовы, независимые от политик, для управления метками
+* `mac_syscall()` мультиплексный системный вызов
+* Различные политики безопасности, реализованные в виде модулей политики MAC
+
+[[mac-framework-kernel-arch-management]]
+=== Интерфейсы управления фреймворком
+
+Фреймворком TrustedBSD MAC можно напрямую управлять с помощью sysctl, параметров загрузчика и системных вызовов.
+
+В большинстве случаев одноимённые параметры sysctl и настройки загрузчика изменяют одни и те же параметры и управляют поведением, таким как применение защитных механизмов, связанных с различными подсистемами ядра. Кроме того, если в ядро включена поддержка отладки MAC, будет вестись несколько счётчиков для отслеживания выделения меток. Обычно рекомендуется не использовать общие настройки подсистем для управления поведением политик в рабочих средах, так как они широко влияют на работу всех активных политик. Вместо этого следует предпочитать настройки отдельных политик, поскольку они обеспечивают более высокую детализацию и большую операционную согласованность для модулей политик.
+
+Загрузка и выгрузка модулей политики выполняется с использованием системных вызовов управления модулями и других системных интерфейсов, включая переменные загрузчика; модули политики получат возможность влиять на события загрузки и выгрузки, включая предотвращение нежелательной выгрузки политики.
+
+[[mac-framework-kernel-arch-synchronization]]
+=== Список политик параллелизма и синхронизации
+
+Поскольку набор активных политик может изменяться во время выполнения, а вызов точек входа не является атомарным, требуется синхронизация для предотвращения загрузки или выгрузки политик во время выполнения вызова точки входа, фиксируя набор активных политик на время выполнения. Это достигается с помощью счетчика занятости фреймворка: при входе в точку входа счетчик увеличивается; при выходе из нее — уменьшается. Пока счетчик занятости повышен, изменения списка политик запрещены, и потоки, пытающиеся изменить список политик, будут ждать, пока список не освободится. Счетчик занятости защищается мьютексом, а условная переменная используется для пробуждения потоков, ожидающих изменений списка политик. Побочным эффектом этой модели синхронизации является то, что рекурсивный вход в MAC Framework из модуля политики разрешен, хотя обычно не используется.
+
+Для снижения накладных расходов счётчика занятости используются различные оптимизации, включая избегание полной стоимости увеличения и уменьшения, если список пуст или содержит только статические записи (политики, загруженные до старта системы, которые нельзя выгрузить). Также предоставляется опция на этапе компиляции, которая предотвращает любые изменения в наборе загруженных политик во время выполнения, что устраняет затраты на блокировку мьютексов, связанные с поддержкой динамически загружаемых и выгружаемых политик, поскольку синхронизация больше не требуется.
+
+Поскольку MAC Framework не может блокировать некоторые точки входа, обычная блокировка сна не может быть использована; в результате попытка загрузки или выгрузки может блокироваться на значительное время, ожидая, пока фреймворк станет свободным.
+
+[[mac-framework-kernel-arch-label-synchronization]]
+=== Синхронизация меток
+
+Поскольку к объектам ядра обычно может обращаться более одного потока одновременно, и допускается одновременный вход нескольких потоков в MAC Framework, хранение атрибутов безопасности, поддерживаемое MAC Framework, тщательно синхронизировано. Как правило, существующая синхронизация ядра для данных объектов ядра используется для защиты меток безопасности MAC Framework на объекте: например, метки MAC на сокетах защищаются с помощью существующего мьютекса сокета. Аналогично, семантика параллельного доступа обычно идентична семантике контейнерных объектов: для учетных данных поддерживается семантика копирования при записи для содержимого меток, как и для остальной структуры учетных данных. MAC Framework устанавливает необходимые блокировки на объекты при вызове с ссылкой на объект. Авторам политик необходимо учитывать эти семантики синхронизации, так как они иногда ограничивают типы доступа к меткам: например, когда ссылка только для чтения на учетные данные передается политике через точку входа, разрешены только операции чтения для состояния метки, прикрепленного к учетным данным.
+
+[[mac-framework-kernel-arch-policy-synchronization]]
+=== Синхронизация политики и параллелизм
+
+Модули политик должны быть написаны с учетом того, что множество потоков ядра могут одновременно войти в одну или несколько точек входа политики из-за параллельной и вытесняющей природы ядра FreeBSD. Если модуль политики использует изменяемое состояние, это может потребовать применения примитивов синхронизации внутри политики, чтобы предотвратить несогласованные представления этого состояния, ведущие к некорректной работе политики. Политики, как правило, могут использовать существующие примитивы синхронизации FreeBSD для этой цели, включая мьютексы, блокировки с ожиданием, условные переменные и счётные семафоры. Однако политики должны быть написаны так, чтобы применять эти примитивы осторожно, соблюдая существующие порядки блокировок в ядре и учитывая, что некоторые точки входа не допускают ожидания, ограничивая использование примитивов в этих точках входа мьютексами и операциями пробуждения.
+
+Когда модули политики обращаются к другим подсистемам ядра, они обычно должны освобождать любые блокировки внутри политики, чтобы избежать нарушения порядка блокировок ядра или риска рекурсивных блокировок. Это позволит сохранить блокировки политики как конечные блокировки в глобальном порядке блокировок, помогая избежать взаимоблокировки.
+
+[[mac-framework-kernel-arch-registration]]
+=== Регистрация политики
+
+Фреймворк MAC поддерживает два списка активных политик: статический список и динамический список. Списки отличаются только в отношении их семантики блокировки: для использования статического списка не требуется повышенный счетчик ссылок. Когда загружаются модули ядра, содержащие политики фреймворка MAC, модуль политики использует `SYSINIT` для вызова функции регистрации; когда модуль политики выгружается, `SYSINIT` аналогично вызывает функцию отмены регистрации. Регистрация может завершиться неудачей, если модуль политики загружается более одного раза, если для регистрации недостаточно ресурсов (например, политика может требовать маркировки, а доступного состояния маркировки может быть недостаточно), или другие предварительные условия политики могут не выполняться (некоторые политики могут быть загружены только до загрузки системы). Аналогично, отмена регистрации может завершиться неудачей, если политика помечена как невыгружаемая.
+
+[[mac-framework-kernel-arch-entrypoints]]
+=== Точки входа
+
+Ядро взаимодействует с MAC Framework двумя способами: вызывает набор API для уведомления фреймворка о соответствующих событиях и предоставляет указатель на структуру меток, не зависящую от политики, в объектах, связанных с безопасностью. Указатель метки управляется MAC Framework через точки входа управления метками, что позволяет фреймворку предоставлять службу маркировки модулям политик с относительно минимальными изменениями в подсистеме ядра, управляющей объектом. Например, указатели меток были добавлены к процессам, учетным данным процессов, сокетам, каналам, vnode, Mbuf, сетевым интерфейсам, очередям сборки IP-пакетов и множеству других структур, связанных с безопасностью. Ядро также вызывает MAC Framework при принятии важных решений по безопасности, позволяя модулям политик дополнять эти решения на основе собственных критериев (включая, возможно, данные, хранящиеся в метках безопасности). Большинство этих критически важных решений по безопасности будут явными проверками контроля доступа; однако некоторые влияют на более общие функции принятия решений, такие как сопоставление пакетов для сокетов и переход меток при выполнении программы.
+
+[[mac-framework-kernel-arch-composition]]
+=== Композиция политик
+
+Когда в ядро загружено более одного модуля политики одновременно, результаты работы модулей политики будут объединены фреймворком с использованием оператора композиции. Этот оператор в настоящее время жёстко закодирован и требует, чтобы все активные политики одобрили запрос для возврата успешного результата. Поскольку политики могут возвращать различные условия ошибки (успех, доступ запрещён, объект не существует, ...), оператор старшинства выбирает результирующую ошибку из набора ошибок, возвращаемых политиками. В общем случае, ошибки, указывающие на то, что объект не существует, будут предпочтительнее ошибок, указывающих на запрет доступа к объекту. Хотя не гарантируется, что результирующая композиция будет полезной или безопасной, мы обнаружили, что это так для многих полезных наборов политик. Например, традиционные доверенные системы часто поставляются с двумя или более политиками, использующими аналогичную композицию.
+
+[[mac-framework-kernel-arch-labels]]
+=== Поддержка меток
+
+Поскольку многие интересные расширения контроля доступа зависят от меток безопасности объектов, MAC Framework предоставляет набор системных вызовов для управления метками, не зависящих от политик, охватывающих различные объекты, доступные пользователю. Общие типы меток включают идентификаторы разделов, метки конфиденциальности, метки целостности, отделы (compartment), домены, роли и типы. Под "не зависящими от политик" подразумевается, что модули политик могут полностью определять семантику метаданных, связанных с объектом. Модули политик участвуют в интернализации и экстернализации строковых меток, предоставляемых пользовательскими приложениями, и могут при необходимости предоставлять приложениям несколько элементов меток.
+
+Метки в памяти хранятся в `struct label`, выделяемой через slab-аллокатор. Эта структура состоит из массива фиксированной длины, содержащего объединения, каждое из которых хранит указатель `void *` и значение типа `long`. Политикам, регистрирующим хранилище меток, назначается идентификатор "слота", который может использоваться для разыменования хранилища меток. Семантика хранилища полностью определяется модулем политики: модулям предоставляется набор точек входа, связанных с жизненным циклом объектов ядра, включая инициализацию, связывание/создание и уничтожение. Используя эти интерфейсы, можно реализовать подсчёт ссылок и другие модели хранения. Прямой доступ к структуре объекта, как правило, не требуется модулям политики для получения метки, поскольку MAC Framework обычно передаёт в точки входа как указатель на объект, так и прямой указатель на метку объекта. Основным исключением из этого правила являются учётные данные процесса, для доступа к метке которых требуется ручное разыменование. Это может измениться в будущих версиях MAC Framework.
+
+Входные точки инициализации часто включают флаг режима сна, указывающий, разрешено ли инициализации переходить в режим сна; если сон не разрешен, может быть возвращена ошибка для отмены выделения метки (и, следовательно, объекта). Это может произойти, например, в сетевом стеке во время обработки прерывания, где сон не разрешен, или пока вызывающий удерживает мьютекс. Из-за затрат производительности на поддержание меток на передаваемых сетевых пакетах (Mbuf), политики должны явно объявлять требование о выделении меток для Mbuf. Динамически загружаемые политики, использующие метки, должны быть способны обрабатывать случай, когда их функция инициализации не была вызвана для объекта, так как объекты могут уже существовать при загрузке политики. MAC Framework гарантирует, что неинициализированные слоты меток будут содержать значение 0 или NULL, что политики могут использовать для обнаружения неинициализированных значений. Однако, поскольку выделение меток для Mbuf условно, политики также должны быть способны обрабатывать указатель на метку NULL для Mbuf, если они были загружены динамически.
+
+В случае меток файловых систем предусмотрена специальная поддержка для постоянного хранения меток безопасности в расширенных атрибутах. Там, где это возможно, используются транзакции расширенных атрибутов, чтобы обеспечить согласованные составные обновления меток безопасности на vnode — в настоящее время такая поддержка присутствует только в файловой системе UFS2. Авторы политик могут выбрать реализацию многометочных меток объектов файловой системы с использованием одного (или нескольких) расширенных атрибутов. По соображениям эффективности метка vnode (`v_label`) является кэшем любой метки на диске; политики могут загружать значения в кэш при создании vnode и обновлять кэш по мере необходимости. В результате нет необходимости напрямую обращаться к расширенному атрибуту при каждой проверке контроля доступа.
+
+[NOTE]
+====
+В настоящее время, если помеченная политика разрешает динамическую выгрузку, её слот состояния не может быть освобождён, что накладывает строгое (и относительно низкое) ограничение на количество операций выгрузки-перезагрузки для помеченных политик.
+====
+
+[[mac-framework-kernel-arch-syscalls]]
+=== Системные вызовы
+
+В рамках MAC Framework реализован ряд системных вызовов: большинство из них поддерживают API для получения и управления метками, не зависящий от политики и доступный пользовательским приложениям.
+
+Вызовы управления метками принимают структуру описания метки `struct mac`, которая содержит серию элементов метки MAC. Каждый элемент содержит строку с именем и строку со значением. Каждой политике будет предоставлена возможность запросить определённое имя элемента, позволяя политикам предоставлять несколько независимых элементов, если это необходимо. Модули политик выполняют интернализацию и экстернализацию между метками ядра и метками, предоставленными пользователем, через точки входа, что позволяет использовать различные семантики. Системные вызовы управления метками обычно обёрнуты в функции пользовательской библиотеки для выполнения выделения памяти и обработки ошибок, упрощая пользовательские приложения, которые должны управлять метками.
+
+В ядре FreeBSD есть следующие системные вызовы, связанные с MAC:
+
+* `mac_get_proc()` может использоваться для получения метки текущего процесса.
+* `mac_set_proc()` может использоваться, чтобы запросить изменение метки текущего процесса.
+* `mac_get_fd()` может использоваться для получения метки объекта (файл, сокет, канал, ...), на который ссылается файловый дескриптор.
+* `mac_get_file()` может использоваться для получения метки объекта, на который ссылается путь в файловой системе.
+* `mac_set_fd()` может использоваться для запроса изменения метки объекта (файл, сокет, канал, ...), на который ссылается файловый дескриптор.
+* `mac_set_file()` может использоваться для запроса изменения метки объекта, указанного по пути в файловой системе.
+* `mac_syscall()` позволяет модулям политик создавать новые системные вызовы без изменения таблицы системных вызовов; она принимает имя целевой политики, номер операции и непрозрачный аргумент для использования политикой.
+* `mac_get_pid()` может использоваться для запроса метки другого процесса по его идентификатору.
+* `mac_get_link()` идентична `mac_get_file()`, но не переходит по символической ссылке, если она является конечным элементом пути, поэтому может использоваться для получения метки на символьной ссылке.
+* `mac_set_link()` идентична `mac_set_file()`, за исключением того, что она не следует по символической ссылке, если это конечный элемент пути, поэтому может использоваться для изменения метки на символьной ссылке.
+* `mac_execve()` идентична системному вызову `execve()`, но также принимает запрошенную метку, которая будет установлена для процесса при начале выполнения новой программы. Это изменение метки при выполнении называется "переходом".
+* `mac_get_peer()`, фактически реализованный через параметр сокета, извлекает метку удалённого узла на сокете, если она доступна.
+
+В дополнение к этим системным вызовам, сетевые ioctl-команды `SIOCSIGMAC` и `SIOCSIFMAC` позволяют получать и устанавливать метки на сетевых интерфейсах.
+
+[[mac-policy-architecture]]
+== Архитектура политик MAC
+
+Политики безопасности либо непосредственно встроены в ядро, либо скомпилированы в загружаемые модули ядра, которые могут быть загружены при загрузке системы или динамически с использованием системных вызовов загрузки модулей во время выполнения. Модули политик взаимодействуют с системой через набор объявленных точек входа, предоставляя доступ к потоку системных событий и позволяя политике влиять на решения контроля доступа. Каждая политика содержит ряд элементов:
+
+* Необязательные параметры конфигурации для политики.
+* Централизованная реализация логики политики и параметров.
+* Необязательная реализация событий жизненного цикла политики, таких как инициализация и уничтожение.
+* Необязательная поддержка инициализации, обслуживания и удаления меток на выбранных объектах ядра.
+* Дополнительная поддержка проверки процессов пользователя и изменения меток на выбранных объектах.
+* Реализация выбранных точек входа контроля доступа, представляющих интерес для политики.
+* Объявление идентификатора политики, точек входа модуля и свойств политики.
+
+[[mac-policy-declaration]]
+=== Объявление политики
+
+Модули могут быть объявлены с использованием макроса `MAC_POLICY_SET()`, который задаёт имя политики, предоставляет ссылку на вектор точек входа MAC, указывает флаги загрузки, определяющие, как фреймворк политик должен обрабатывать политику, и при необходимости запрашивает выделение состояния метки фреймворком.
+
+[.programlisting]
+....
+static struct mac_policy_ops mac_policy_ops =
+{
+ .mpo_destroy = mac_policy_destroy,
+ .mpo_init = mac_policy_init,
+ .mpo_init_bpfdesc_label = mac_policy_init_bpfdesc_label,
+ .mpo_init_cred_label = mac_policy_init_label,
+/* ... */
+ .mpo_check_vnode_setutimes = mac_policy_check_vnode_setutimes,
+ .mpo_check_vnode_stat = mac_policy_check_vnode_stat,
+ .mpo_check_vnode_write = mac_policy_check_vnode_write,
+};
+....
+
+The MAC policy entry point vector, `mac__policy__ops` in this example, associates functions defined in the module with specific entry points. A complete listing of available entry points and their prototypes may be found in the MAC entry point reference section. Of specific interest during module registration are the .mpo_destroy and .mpo_init entry points. .mpo_init will be invoked once a policy is successfully registered with the module framework but prior to any other entry points becoming active. This permits the policy to perform any policy-specific allocation and initialization, such as initialization of any data or locks. .mpo_destroy will be invoked when a policy module is unloaded to permit releasing of any allocated memory and destruction of locks. Currently, these two entry points are invoked with the MAC policy list mutex held to prevent any other entry points from being invoked: this will be changed, but in the mean time, policies should be careful about what kernel primitives they invoke so as to avoid lock ordering or sleeping problems.
+
+Поле имени модуля в объявлении политики существует для того, чтобы модуль мог быть однозначно идентифицирован с целью управления зависимостями модулей. Следует выбрать подходящую строку. Полное имя политики отображается пользователю в журнале ядра при загрузке и выгрузке, а также экспортируется при предоставлении информации о статусе процессам в пользовательском пространстве.
+
+[[mac-policy-flags]]
+=== Флаги политик
+
+Поле флагов объявления политики позволяет модулю предоставлять фреймворку информацию о своих возможностях во время загрузки модуля. В настоящее время определены три флага:
+
+MPC_LOADTIME_FLAG_UNLOADOK::
+Этот флаг указывает, что модуль политики может быть выгружен. Если этот флаг не указан, то фреймворк политики отклонит запросы на выгрузку модуля. Этот флаг может использоваться модулями, которые выделяют состояние метки и не могут освободить это состояние во время выполнения.
+
+MPC_LOADTIME_FLAG_NOTLATE::
+Этот флаг указывает, что модуль политики должен быть загружен и инициализирован на раннем этапе процесса загрузки. Если флаг указан, попытки зарегистрировать модуль после загрузки будут отклонены. Флаг может использоваться политиками, которые требуют повсеместной маркировки всех системных объектов и не могут обрабатывать объекты, не прошедшие надлежащую инициализацию политикой.
+
+MPC_LOADTIME_FLAG_LABELMBUFS::
+Этот флаг указывает, что модуль политики требует маркировки Mbuf, и память всегда должна выделяться для хранения меток Mbuf. По умолчанию MAC Framework не выделяет память для хранения меток Mbuf, если хотя бы одна загруженная политика не установила этот флаг. Это заметно улучшает производительность сети, когда политики не требуют маркировки Mbuf. Существует опция ядра `MAC_ALWAYS_LABEL_MBUF`, которая заставляет MAC Framework выделять память для хранения меток Mbuf независимо от установки этого флага, и может быть полезной в некоторых средах.
+
+[NOTE]
+====
+Политики, использующие `MPC_LOADTIME_FLAG_LABELMBUFS` без установленного флага `MPC_LOADTIME_FLAG_NOTLATE`, должны корректно обрабатывать переданные `NULL` указатели меток Mbuf в точках входа. Это необходимо, так как Mbuf в процессе передачи без хранилища меток могут сохраняться после загрузки политики, включающей маркировку Mbuf. Если политика загружена до активации сетевой подсистемы (т.е. политика не загружается поздно), то все Mbuf гарантированно имеют хранилище меток.
+====
+
+[[mac-policy-entry-points]]
+=== Точки входа политики
+
+Четыре класса точек входа предоставляются политикам, зарегистрированным в рамках системы: точки входа, связанные с регистрацией и управлением политиками, точки входа, обозначающие инициализацию, создание, уничтожение и другие события жизненного цикла объектов ядра, события, связанные с решениями контроля доступа, на которые политика может влиять, и вызовы, связанные с управлением метками на объектах. Кроме того, предоставляется точка входа `mac_syscall()`, позволяющая политикам расширять интерфейс ядра без регистрации новых системных вызовов.
+
+Авторы модулей политик должны быть осведомлены о стратегии блокировок в ядре, а также о том, какие блокировки объектов доступны на различных точках входа. Им следует избегать сценариев взаимоблокировок, не захватывая нелистовые блокировки внутри точек входа, а также соблюдать протокол блокировок для доступа и изменения объектов. В частности, авторы должны учитывать, что хотя необходимые блокировки для доступа к объектам и их меткам обычно удерживаются, достаточные блокировки для изменения объекта или его метки могут отсутствовать для всех точек входа. Информация о блокировках аргументов документирована в описании точек входа фреймворка MAC.
+
+Точки входа политики будут передавать ссылку на метку объекта вместе с самим объектом. Это позволяет помеченным политикам не знать внутренней структуры объекта, но при этом принимать решения на основе метки. Исключением из этого являются учетные данные процесса, для которые предполагается, что политики понимают их, как объект безопасности первого класса в ядре.
+
+[[mac-entry-point-reference]]
+== Справочник по точкам входа политики MAC
+
+[[mac-mpo-general]]
+=== Общие точки входа модуля
+
+[[mac-mpo-init]]
+==== `mpo_init`
+
+[source, c]
+----
+void mpo_init(struct mac_policy_conf *conf);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`conf`
+|Определение политики MAC
+|
+|===
+
+Событие загрузки политики. Мьютекс списка политик удерживается, поэтому операции ожидания выполнить нельзя, а вызовы других подсистем ядра должны осуществляться с осторожностью. Если во время инициализации политики требуются потенциально блокирующие выделения памяти, их следует выполнять с использованием отдельного модуля SYSINIT().
+
+[[mpo-destroy]]
+==== `mpo_destroy`
+
+[source, c]
+----
+void mpo_destroy(struct mac_policy_conf *conf);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`conf`
+|Определение политики MAC
+|
+|===
+
+Событие загрузки политики. Мьютекс списка политик удерживается, поэтому следует соблюдать осторожность.
+
+[[mac-mpo-syscall]]
+==== `mpo_syscall`
+
+[source, c]
+----
+int mpo_syscall(struct thread *td, int call, void *arg);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`td`
+|Вызывающий поток
+|
+
+|`call`
+|Номер системного вызова, зависящий от политики
+|
+
+|`arg`
+|Указатель на аргументы системного вызова
+|
+|===
+
+Этот точку входа предоставляет мультиплексированный системный вызов на основе политик, что позволяет политикам предоставлять дополнительные сервисы пользовательским процессам без регистрации конкретных системных вызовов. Имя политики, указанное при регистрации, используется для демультиплексирования вызовов из пользовательского пространства, а аргументы будут переданы в эту точку входа. При реализации новых сервисов модули безопасности должны убедиться, что вызывают соответствующие проверки контроля доступа из MAC-фреймворка по мере необходимости. Например, если политика реализует расширенную функциональность сигналов, она должна вызывать необходимые проверки контроля доступа сигналов для задействования MAC-фреймворка и других зарегистрированных политик.
+
+[NOTE]
+====
+Модули в настоящее время должны самостоятельно выполнять `copyin()` для данных системного вызова.
+====
+
+[[mac-mpo-thread-userret]]
+==== `mpo_thread_userret`
+
+[source, c]
+----
+void mpo_thread_userret(struct thread *td);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`td`
+|Возвращающий поток
+|
+|===
+
+Этот точка входа позволяет модулям политики выполнять события, связанные с MAC, когда поток возвращается в пользовательское пространство, через возврат системного вызова, возврат из ловушки или иным образом. Это необходимо для политик, имеющих плавающие метки процессов, так как не всегда возможно получить блокировку процесса в произвольных точках стека во время обработки системного вызова; метки процессов могут представлять традиционные данные аутентификации, информацию об истории процесса или другие данные. Для использования этого механизма предполагаемые изменения метки учётных данных процесса могут быть сохранены в `p_label`, защищённом спин-блокировкой для каждой политики, а затем установить флаг `TDF_ASTPENDING` для потока и флаг `PS_MACPENDM` для процесса, чтобы запланировать вызов точки входа `userret`. С этой точки входа политика может создать замену учётных данных с меньшими опасениями относительно контекста блокировки. Авторам политик следует учитывать, что порядок событий, связанных с планированием AST и выполнением AST, может быть сложным и переплетённым в многопоточных приложениях.
+
+[[mac-label-ops]]
+=== Операции с метками
+
+[[mac-mpo-init-bpfdesc]]
+==== `mpo_init_bpfdesc_label`
+
+[source, c]
+----
+void mpo_init_bpfdesc_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Новая метка для инициализации
+|
+|===
+
+Инициализировать метку на только что созданном bpfdesc (дескрипторе BPF). Разрешено использование режима сна.
+
+[[mac-mpo-init-cred-label]]
+==== `mpo_init_cred_label`
+
+[source, c]
+----
+void mpo_init_cred_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Новая метка для инициализации
+|
+|===
+
+Инициализировать метку для вновь созданных учетных данных пользователя. Разрешено приостанавливать выполнение.
+
+[[mac-mpo-init-devfsdirent]]
+==== `mpo_init_devfsdirent_label`
+
+[source, c]
+----
+void mpo_init_devfsdirent_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Новая метка для инициализации
+|
+|===
+
+Инициализировать метку на только что созданной записи devfs. Разрешено использование режима сна.
+
+[[mac-mpo-init-ifnet]]
+==== `mpo_init_ifnet_label`
+
+[source, c]
+----
+void mpo_init_ifnet_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Новая метка для инициализации
+|
+|===
+
+Инициализировать метку на только что созданном сетевом интерфейсе. Разрешено приостанавливать выполнение.
+
+[[mac-mpo-init-ipq]]
+==== `mpo_init_ipq_label`
+
+[source, c]
+----
+void mpo_init_ipq_label(struct label *label, int flag);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Новая метка для инициализации
+|
+
+|`flag`
+|Спящий/неспящий man:malloc[9]; см. ниже
+|
+|===
+
+Инициализировать метку в только что созданной очереди сборки IP-фрагментов. Поле `flag` может принимать одно из значений M_WAITOK или M_NOWAIT и должно использоваться, чтобы избежать выполнения "спящего" man:malloc[9] во время этого вызова инициализации. Выделение очереди сборки IP-фрагментов часто происходит в средах, чувствительных к производительности, и реализация должна избегать "спящих" или длительных операций. Этой точке входа разрешено завершаться неудачей, что приведёт к невозможности выделения очереди сборки IP-фрагментов.
+
+[[mac-mpo-init-mbuf]]
+==== `mpo_init_mbuf_label`
+
+[source, c]
+----
+void mpo_init_mbuf_label(int flag, struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`flag`
+|Спящий/неспящий man:malloc[9]; см. ниже
+|
+
+|`label`
+|Метка политики для инициализации
+|
+|===
+
+Инициализировать на только что созданном заголовке пакета mbuf метку (`mbuf`). Поле `flag` может принимать одно из значений M_WAITOK или M_NOWAIT и должно использоваться, чтобы избежать выполнения "спящего" man:malloc[9] во время этого вызова инициализации. Выделение mbuf часто происходит в чувствительных к производительности средах, и реализация должна избегать "спящего" режима или длительных операций. Этой точке входа разрешено завершаться неудачей, что приведёт к невозможности выделения заголовка mbuf.
+
+[[mac-mpo-init-mount]]
+==== `mpo_init_mount_label`
+
+[source, c]
+----
+void mpo_init_mount_label(struct label *mntlabel, struct label *fslabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`mntlabel`
+|Метка политики для инициализации самой точки монтирования
+|
+
+|`fslabel`
+|Метка политики для инициализации файловой системы
+|
+|===
+
+Инициализировать метки на новой точке монтирования. Разрешено приостанавливать выполнение.
+
+[[mac-mpo-init-mount-fs-label]]
+==== `mpo_init_mount_fs_label`
+
+[source, c]
+----
+void mpo_init_mount_fs_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для инициализации
+|
+|===
+
+Инициализировать метку на только что смонтированной файловой системе. Разрешено приостановление работы
+
+[[mac-mpo-init-pipe-label]]
+==== `mpo_init_pipe_label`
+
+[source, c]
+----
+void mpo_init_pipe_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для заполнения
+|
+|===
+
+Инициализировать метку для только что созданного канала. Разрешено приостановление выполнения.
+
+[[mac-mpo-init-socket]]
+==== `mpo_init_socket_label`
+
+[source, c]
+----
+void mpo_init_socket_label(struct label *label, int flag);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Новая метка для инициализации
+|
+
+|`flag`
+|флаги man:malloc[9]
+|
+|===
+
+Инициализировать метку для нового сокета. Поле `flag` может принимать одно из значений M_WAITOK или M_NOWAIT и должно использоваться, чтобы избежать выполнения спящего man:malloc[9] во время этого вызова инициализации.
+
+[[mac-mpo-init-socket-peer-label]]
+==== `mpo_init_socket_peer_label`
+
+[source, c]
+----
+void mpo_init_socket_peer_label(struct label *label, int flag);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Новая метка для инициализации
+|
+
+|`flag`
+|флаги man:malloc[9]
+|
+|===
+
+Инициализировать метку однорангового узла (peer) для вновь созданного сокета. Поле `flag` может принимать одно из значений M_WAITOK или M_NOWAIT и должно использоваться для избежания выполнения спящего man:malloc[9] во время этого вызова инициализации.
+
+[[mac-mpo-init-proc-label]]
+==== `mpo_init_proc_label`
+
+[source, c]
+----
+void mpo_init_proc_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Новая метка для инициализации
+|
+|===
+
+Инициализировать метку для вновь созданного процесса. Разрешено приостановление выполнения.
+
+[[mac-mpo-init-vnode]]
+==== `mpo_init_vnode_label`
+
+[source, c]
+----
+void mpo_init_vnode_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Новая метка для инициализации
+|
+|===
+
+Инициализировать метку на только что созданном vnode. Разрешено приостанавливать выполнение.
+
+[[mac-mpo-destroy-bpfdesc]]
+==== `mpo_destroy_bpfdesc_label`
+
+[source, c]
+----
+void mpo_destroy_bpfdesc_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|bpfdesc label
+|
+|===
+
+Уничтожить метку на дескрипторе BPF. В этой точке входа политика должна освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-cred]]
+==== `mpo_destroy_cred_label`
+
+[source, c]
+----
+void mpo_destroy_cred_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка уничтожается
+|
+|===
+
+Уничтожить метку на учетных данных. В этой точке входа модуль политики должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-devfsdirent]]
+==== `mpo_destroy_devfsdirent_label`
+
+[source, c]
+----
+void mpo_destroy_devfsdirent_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка уничтожается
+|
+|===
+
+Уничтожить метку на записи devfs. В этой точке входа модуль политики должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-ifnet-label]]
+==== `mpo_destroy_ifnet_label`
+
+[source, c]
+----
+void mpo_destroy_ifnet_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка уничтожается
+|
+|===
+
+Уничтожить метку на удаленном интерфейсе. В этой точке входа модуль политики должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-ipq-label]]
+==== `mpo_destroy_ipq_label`
+
+[source, c]
+----
+void mpo_destroy_ipq_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка уничтожается
+|
+|===
+
+Уничтожить метку в очереди IP-фрагментов. В этой точке входа модуль политики должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-mbuf-label]]
+==== `mpo_destroy_mbuf_label`
+
+[source, c]
+----
+void mpo_destroy_mbuf_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка уничтожается
+|
+|===
+
+Уничтожить метку в заголовке mbuf. В этой точке входа модуль политики должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-mount-label]]
+==== `mpo_destroy_mount_label`
+
+[source, c]
+----
+void mpo_destroy_mount_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Точка монтирования метки уничтожается
+|
+|===
+
+Уничтожить метки на точке монтирования. В этой точке входа модуль политики должен освободить внутреннее хранилище, связанное с `mntlabel`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-mount]]
+==== `mpo_destroy_mount_label`
+
+[source, c]
+----
+void mpo_destroy_mount_label(struct label *mntlabel, struct label *fslabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`mntlabel`
+|Точка монтирования метки уничтожается
+|
+
+|`fslabel`
+|Метка файловой системы уничтожается
+|
+|===
+
+Уничтожить метки на точке монтирования. В этой точке входа модуль политики должен освободить внутреннее хранилище, связанное с `mntlabel` и `fslabel`, чтобы их можно было уничтожить.
+
+[[mac-mpo-destroy-socket]]
+==== `mpo_destroy_socket_label`
+
+[source, c]
+----
+void mpo_destroy_socket_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Уничтожение метки сокета
+|
+|===
+
+Уничтожить метку на сокете. В этой точке входа модуль политики должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-socket-peer-label]]
+==== `mpo_destroy_socket_peer_label`
+
+[source, c]
+----
+void mpo_destroy_socket_peer_label(struct label *peerlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`peerlabel`
+|Сокет: метка однорангового узла уничтожается
+|
+|===
+
+Уничтожить метку однорангового узла на сокете. В этой точке входа модуль политики должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-pipe-label]]
+==== `mpo_destroy_pipe_label`
+
+[source, c]
+----
+void mpo_destroy_pipe_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка канала (pipe)
+|
+|===
+
+Уничтожить метку на канале. В этой точке входа модуль политики должен освободить всю внутреннюю память, связанную с `label`, чтобы её можно было уничтожить.
+
+[[mac-mpo-destroy-proc-label]]
+==== `mpo_destroy_proc_label`
+
+[source, c]
+----
+void mpo_destroy_proc_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка процесса
+|
+|===
+
+Уничтожить метку на процессе. В этой точке входа модуль политики должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-destroy-vnode-label]]
+==== `mpo_destroy_vnode_label`
+
+[source, c]
+----
+void mpo_destroy_vnode_label(struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка процесса
+|
+|===
+
+Уничтожить метку на vnode. В этой точке входа модуль политики должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно было уничтожить.
+
+[[mac-mpo-copy-mbuf-label]]
+==== `mpo_copy_mbuf_label`
+
+[source, c]
+----
+void mpo_copy_mbuf_label(struct label *src, struct label *dest);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`src`
+|Метка источника
+|
+
+|`dest`
+|Метка назначения
+|
+|===
+
+Скопировать информацию метки из `src` в `dest`.
+
+[[mac-mpo-copy-pipe-label]]
+==== `mpo_copy_pipe_label`
+
+[source, c]
+----
+void mpo_copy_pipe_label(struct label *src, struct label *dest);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`src`
+|Метка источника
+|
+
+|`dest`
+|Метка назначения
+|
+|===
+
+Скопировать информацию метки из `src` в `dest`.
+
+[[mac-mpo-copy-vnode-label]]
+==== `mpo_copy_vnode_label`
+
+[source, c]
+----
+void mpo_copy_vnode_label(struct label *src, struct label *dest);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`src`
+|Метка источника
+|
+
+|`dest`
+|Метка назначения
+|
+|===
+
+Скопировать информацию метки из `src` в `dest`.
+
+[[mac-mpo-externalize-cred-label]]
+==== `mpo_externalize_cred_label`
+
+[source, c]
+----
+int mpo_externalize_cred_label(struct label *label, char *element_name,
+ struct sbuf *sb, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для вынесения во внешний ресурс
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть вынесена во внешний ресурс
+|
+
+|`sb`
+|Буфер строки для заполнения текстовым представлением метки
+|
+
+|`claimed`
+|Должно быть увеличено, когда `element_data` может быть заполнено.
+|
+|===
+
+Создать внешнее представление метки на основе переданной структуры метки. Внешнее представление метки состоит из текстового представления содержимого метки, которое может использоваться пользовательскими приложениями и прочитано пользователем. В настоящее время будут вызываться точки входа `externalize` всех политик, поэтому реализация должна проверить содержимое `element_name` перед попыткой заполнить `sb`. Если `element_name` не соответствует имени вашей политики, просто верните 0. Возвращайте ненулевое значение только в случае ошибки при внешнем представлении данных метки. После того как политика заполнит `element_data`, `*claimed` должен быть увеличен.
+
+[[mac-mpo-externalize-ifnet-label]]
+==== `mpo_externalize_ifnet_label`
+
+[source, c]
+----
+int mpo_externalize_ifnet_label(struct label *label, char *element_name,
+ struct sbuf *sb, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для вынесения во внешний ресурс
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть вынесена во внешний ресурс
+|
+
+|`sb`
+|Буфер строки для заполнения текстовым представлением метки
+|
+
+|`claimed`
+|Должно быть увеличено, когда `element_data` может быть заполнено.
+|
+|===
+
+Создать внешнее представление метки на основе переданной структуры метки. Внешнее представление метки состоит из текстового представления содержимого метки, которое может использоваться пользовательскими приложениями и прочитано пользователем. В настоящее время будут вызываться точки входа `externalize` всех политик, поэтому реализация должна проверить содержимое `element_name` перед попыткой заполнить `sb`. Если `element_name` не соответствует имени вашей политики, просто верните 0. Возвращайте ненулевое значение только в случае ошибки при внешнем представлении данных метки. После того как политика заполнит `element_data`, `*claimed` должен быть увеличен.
+
+[[mac-mpo-externalize-pipe-label]]
+==== `mpo_externalize_pipe_label`
+
+[source, c]
+----
+int mpo_externalize_pipe_label(struct label *label, char *element_name,
+ struct sbuf *sb, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для вынесения во внешний ресурс
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть вынесена во внешний ресурс
+|
+
+|`sb`
+|Буфер строки для заполнения текстовым представлением метки
+|
+
+|`claimed`
+|Должно быть увеличено, когда `element_data` может быть заполнено.
+|
+|===
+
+Создать внешнее представление метки на основе переданной структуры метки. Внешнее представление метки состоит из текстового представления содержимого метки, которое может использоваться пользовательскими приложениями и прочитано пользователем. В настоящее время будут вызываться точки входа `externalize` всех политик, поэтому реализация должна проверить содержимое `element_name` перед попыткой заполнить `sb`. Если `element_name` не соответствует имени вашей политики, просто верните 0. Возвращайте ненулевое значение только в случае ошибки при внешнем представлении данных метки. После того как политика заполнит `element_data`, `*claimed` должен быть увеличен.
+
+[[mac-mpo-externalize-socket-label]]
+==== `mpo_externalize_socket_label`
+
+[source, c]
+----
+int mpo_externalize_socket_label(struct label *label, char *element_name,
+ struct sbuf *sb, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для вынесения во внешний ресурс
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть вынесена во внешний ресурс
+|
+
+|`sb`
+|Буфер строки для заполнения текстовым представлением метки
+|
+
+|`claimed`
+|Должно быть увеличено, когда `element_data` может быть заполнено.
+|
+|===
+
+Создать внешнее представление метки на основе переданной структуры метки. Внешнее представление метки состоит из текстового представления содержимого метки, которое может использоваться пользовательскими приложениями и прочитано пользователем. В настоящее время будут вызываться точки входа `externalize` всех политик, поэтому реализация должна проверить содержимое `element_name` перед попыткой заполнить `sb`. Если `element_name` не соответствует имени вашей политики, просто верните 0. Возвращайте ненулевое значение только в случае ошибки при внешнем представлении данных метки. После того как политика заполнит `element_data`, `*claimed` должен быть увеличен.
+
+[[mac-mpo-externalize-socket-peer-label]]
+==== `mpo_externalize_socket_peer_label`
+
+[source, c]
+----
+int mpo_externalize_socket_peer_label(struct label *label, char *element_name,
+ struct sbuf *sb, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для вынесения во внешний ресурс
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть вынесена во внешний ресурс
+|
+
+|`sb`
+|Буфер строки для заполнения текстовым представлением метки
+|
+
+|`claimed`
+|Должно быть увеличено, когда `element_data` может быть заполнено.
+|
+|===
+
+Создать внешнее представление метки на основе переданной структуры метки. Внешнее представление метки состоит из текстового представления содержимого метки, которое может использоваться пользовательскими приложениями и прочитано пользователем. В настоящее время будут вызываться точки входа `externalize` всех политик, поэтому реализация должна проверить содержимое `element_name` перед попыткой заполнить `sb`. Если `element_name` не соответствует имени вашей политики, просто верните 0. Возвращайте ненулевое значение только в случае ошибки при внешнем представлении данных метки. После того как политика заполнит `element_data`, `*claimed` должен быть увеличен.
+
+[[mac-mpo-externalize-vnode-label]]
+==== `mpo_externalize_vnode_label`
+
+[source, c]
+----
+int mpo_externalize_vnode_label(struct label *label, char *element_name,
+ struct sbuf *sb, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для вынесения во внешний ресурс
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть вынесена во внешний ресурс
+|
+
+|`sb`
+|Буфер строки для заполнения текстовым представлением метки
+|
+
+|`claimed`
+|Должно быть увеличено, когда `element_data` может быть заполнено.
+|
+|===
+
+Создать внешнее представление метки на основе переданной структуры метки. Внешнее представление метки состоит из текстового представления содержимого метки, которое может использоваться пользовательскими приложениями и прочитано пользователем. В настоящее время будут вызываться точки входа `externalize` всех политик, поэтому реализация должна проверить содержимое `element_name` перед попыткой заполнить `sb`. Если `element_name` не соответствует имени вашей политики, просто верните 0. Возвращайте ненулевое значение только в случае ошибки при внешнем представлении данных метки. После того как политика заполнит `element_data`, `*claimed` должен быть увеличен.
+
+[[mac-mpo-internalize-cred-label]]
+==== `mpo_internalize_cred_label`
+
+[source, c]
+----
+int mpo_internalize_cred_label(struct label *label, char *element_name,
+ char *element_data, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для заполнения
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть приведена к внутреннему представлению
+|
+
+|`element_data`
+|Текстовые данные для преобразования к внутреннему представлению
+|
+
+|`claimed`
+|Должно увеличиваться, когда данные могут быть успешно преобразовываться вовнутреннее представление.
+|
+|===
+
+Создать внутреннюю структуру меток на основе данных метки вов нешнем представлении в текстовом формате. В настоящее время, при запросе преобразования во внутреннее представление вызываются точки входа `internalize` всех политик, поэтому реализация должна сравнивать содержимое `element_name` со своим именем, чтобы убедиться, что она должна преобразовывать данные в `element_data`. Как и в точках входа `externalize`, точка входа должна возвращать 0, если `element_name` не совпадает с её собственным именем, или когда данные могут быть успешно преобразованы, в этом случае `*claimed` должен быть увеличен.
+
+[[mac-mpo-internalize-ifnet-label]]
+==== `mpo_internalize_ifnet_label`
+
+[source, c]
+----
+int mpo_internalize_ifnet_label(struct label *label, char *element_name,
+ char *element_data, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для заполнения
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть приведена к внутреннему представлению
+|
+
+|`element_data`
+|Текстовые данные для преобразования к внутреннему представлению
+|
+
+|`claimed`
+|Должно увеличиваться, когда данные могут быть успешно преобразовываться вовнутреннее представление.
+|
+|===
+
+Создать внутреннюю структуру меток на основе данных метки вов нешнем представлении в текстовом формате. В настоящее время, при запросе преобразования во внутреннее представление вызываются точки входа `internalize` всех политик, поэтому реализация должна сравнивать содержимое `element_name` со своим именем, чтобы убедиться, что она должна преобразовывать данные в `element_data`. Как и в точках входа `externalize`, точка входа должна возвращать 0, если `element_name` не совпадает с её собственным именем, или когда данные могут быть успешно преобразованы, в этом случае `*claimed` должен быть увеличен.
+
+[[mac-mpo-internalize-pipe-label]]
+==== `mpo_internalize_pipe_label`
+
+[source, c]
+----
+int mpo_internalize_pipe_label(struct label *label, char *element_name,
+ char *element_data, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для заполнения
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть приведена к внутреннему представлению
+|
+
+|`element_data`
+|Текстовые данные для преобразования к внутреннему представлению
+|
+
+|`claimed`
+|Должно увеличиваться, когда данные могут быть успешно преобразовываться вовнутреннее представление.
+|
+|===
+
+Создать внутреннюю структуру меток на основе данных метки вов нешнем представлении в текстовом формате. В настоящее время, при запросе преобразования во внутреннее представление вызываются точки входа `internalize` всех политик, поэтому реализация должна сравнивать содержимое `element_name` со своим именем, чтобы убедиться, что она должна преобразовывать данные в `element_data`. Как и в точках входа `externalize`, точка входа должна возвращать 0, если `element_name` не совпадает с её собственным именем, или когда данные могут быть успешно преобразованы, в этом случае `*claimed` должен быть увеличен.
+
+[[mac-mpo-internalize-socket-label]]
+==== `mpo_internalize_socket_label`
+
+[source, c]
+----
+int mpo_internalize_socket_label(struct label *label, char *element_name,
+ char *element_data, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для заполнения
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть приведена к внутреннему представлению
+|
+
+|`element_data`
+|Текстовые данные для преобразования к внутреннему представлению
+|
+
+|`claimed`
+|Должно увеличиваться, когда данные могут быть успешно преобразовываться вовнутреннее представление.
+|
+|===
+
+Создать внутреннюю структуру меток на основе данных метки вов нешнем представлении в текстовом формате. В настоящее время, при запросе преобразования во внутреннее представление вызываются точки входа `internalize` всех политик, поэтому реализация должна сравнивать содержимое `element_name` со своим именем, чтобы убедиться, что она должна преобразовывать данные в `element_data`. Как и в точках входа `externalize`, точка входа должна возвращать 0, если `element_name` не совпадает с её собственным именем, или когда данные могут быть успешно преобразованы, в этом случае `*claimed` должен быть увеличен.
+
+[[mac-mpo-internalize-vnode-label]]
+==== `mpo_internalize_vnode_label`
+
+[source, c]
+----
+int mpo_internalize_vnode_label(struct label *label, char *element_name,
+ char *element_data, int *claimed);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`label`
+|Метка для заполнения
+|
+
+|`element_name`
+|Имя политики, метка которой должна быть приведена к внутреннему представлению
+|
+
+|`element_data`
+|Текстовые данные для преобразования к внутреннему представлению
+|
+
+|`claimed`
+|Должно увеличиваться, когда данные могут быть успешно преобразовываться вовнутреннее представление.
+|
+|===
+
+Создать внутреннюю структуру меток на основе данных метки вов нешнем представлении в текстовом формате. В настоящее время, при запросе преобразования во внутреннее представление вызываются точки входа `internalize` всех политик, поэтому реализация должна сравнивать содержимое `element_name` со своим именем, чтобы убедиться, что она должна преобразовывать данные в `element_data`. Как и в точках входа `externalize`, точка входа должна возвращать 0, если `element_name` не совпадает с её собственным именем, или когда данные могут быть успешно преобразованы, в этом случае `*claimed` должен быть увеличен.
+
+[[mac-label-events]]
+=== События метки
+
+Этот класс точек входа используется фреймворком MAC для разрешения политикам поддерживать информацию о метках на объектах ядра. Для каждого помеченного объекта ядра, представляющего интерес для политики MAC, могут быть зарегистрированы точки входа для соответствующих событий жизненного цикла. Все объекты реализуют хуки инициализации, создания и уничтожения. Некоторые объекты также реализуют перемаркировку, позволяя пользовательским процессам изменять метки на объектах. Некоторые объекты также реализуют специфичные для объекта события, такие как события меток, связанные с повторной сборкой IP. Типичный помеченный объект будет иметь следующий жизненный цикл точек входа:
+
+[.programlisting]
+....
+Label initialization o
+(object-specific wait) \
+Label creation o
+ \
+Relabel events, o--<--.
+Various object-specific, | |
+Access control events ~-->--o
+ \
+Label destruction o
+....
+
+Инициализация меток позволяет политикам выделять память и устанавливать начальные значения для меток без контекста использования объекта. Слот метки, выделенный для политики, по умолчанию будет обнулен, поэтому некоторым политикам может не потребоваться выполнять инициализацию.
+
+Создание метки происходит, когда структура ядра связывается с реальным объектом ядра. Например, Mbuf могут быть выделены и оставаться неиспользованными в пуле до тех пор, пока они не понадобятся. Выделение mbuf приводит к инициализации метки на mbuf, но создание mbuf происходит, когда mbuf связывается с датаграммой. Обычно для события создания предоставляется контекст, включая обстоятельства создания и метки других значимых объектов в процессе создания. Например, когда mbuf создаётся из сокета, сокет и его метка будут переданы зарегистрированным политикам в дополнение к новому mbuf и его метке. Выделение памяти в событиях создания не рекомендуется, так как это может происходить в чувствительных к производительности участках ядра; кроме того, вызовы создания не могут завершиться неудачей, поэтому невозможность выделить память не может быть сообщена.
+
+События, привящанные к объектам, обычно не попадают в другие классы событий меток, но, как правило, предоставляют возможность изменить или обновить метку объекта на основе дополнительного контекста. Например, метка в очереди сборки IP-фрагментов может быть обновлена во время точки входа `MAC_UPDATE_IPQ` в результате принятия дополнительного mbuf в эту очередь.
+
+События контроля доступа подробно рассматриваются в следующем разделе.
+
+Уничтожение метки позволяет политикам освобождать хранилище или состояние, связанное с меткой во время её ассоциации с объектом, чтобы структуры данных ядра, поддерживающие объект, могли быть повторно использованы или освобождены.
+
+В дополнение к меткам, связанным с определёнными объектами ядра, существует дополнительный класс меток: временные метки. Эти метки используются для хранения информации об обновлениях, отправляемых пользовательскими процессами. Они инициализируются и уничтожаются так же, как и другие типы меток, но событие создания — это `MAC_INTERNALIZE`, которое принимает пользовательскую метку для преобразования во внутреннее представление в ядре.
+
+[[mac-fs-label-event-ops]]
+==== Действия с событиями меток объектов файловой системы
+
+[[mac-mpo-associate-vnode-devfs]]
+===== `mpo_associate_vnode_devfs`
+
+[source, c]
+----
+void mpo_associate_vnode_devfs(struct mount *mp, struct label *fslabel,
+ struct devfs_dirent *de, struct label *delabel, struct vnode *vp,
+ struct label *vlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`mp`
+|Точка монтирования devfs
+|
+
+|`fslabel`
+|Метка файловой системы devfs (`mp->mnt_fslabel`)
+|
+
+|`de`
+|Запись каталога devfs
+|
+
+|`delabel`
+|Метка политики, связанная с `de`
+|
+
+|`vp`
+|узел vnode, связанный с `de`
+|
+
+|`vlabel`
+|Метка политики, связанная с `vp`
+|
+|===
+
+Заполнить метку (`vlabel`) для только что созданного devfs vnode на основе записи каталога devfs, переданной в `de`, и её метки.
+
+[[mac-mpo-associate-vnode-extattr]]
+===== `mpo_associate_vnode_extattr`
+
+[source, c]
+----
+int mpo_associate_vnode_extattr(struct mount *mp, struct label *fslabel,
+ struct vnode *vp, struct label *vlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`mp`
+|Точка монтирования файловой системы
+|
+
+|`fslabel`
+|Метка файловой системы
+|
+
+|`vp`
+|Узел vnode для метки
+|
+
+|`vlabel`
+|Метка политики, связанная с `vp`
+|
+|===
+
+Попытка получить метку для `vp` из расширенных атрибутов файловой системы. В случае успеха возвращается значение `0`. Если получение расширенных атрибутов не поддерживается, допустимым резервным вариантом является копирование `fslabel` в `vlabel`. В случае ошибки должно быть возвращено соответствующее значение `errno`.
+
+[[mac-mpo-associate-vnode-singlelabel]]
+===== `mpo_associate_vnode_singlelabel`
+
+[source, c]
+----
+void mpo_associate_vnode_singlelabel(struct mount *mp, struct label *fslabel,
+ struct vnode *vp, struct label *vlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`mp`
+|Точка монтирования файловой системы
+|
+
+|`fslabel`
+|Метка файловой системы
+|
+
+|`vp`
+|Узел vnode для метки
+|
+
+|`vlabel`
+|Метка политики, связанная с `vp`
+|
+|===
+
+На файловых системах без поддержки multilabel эта точка входа вызывается для установки метки политики для `vp` на основе метки файловой системы `fslabel`.
+
+[[mac-mpo-create-devfs-device]]
+===== `mpo_create_devfs_device`
+
+[source, c]
+----
+void mpo_create_devfs_device(dev_t dev, struct devfs_dirent *devfs_dirent,
+ struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`dev`
+|Устройство, соответствующее `devfs_dirent`
+|
+
+|`devfs_dirent`
+|Запись в каталоге devfs, для которой создается метка.
+|
+
+|`label`
+|Метка для `devfs_dirent`, которую нужно заполнить.
+|
+|===
+
+Заполнить метку на devfs_dirent, создаваемом для переданного устройства. Этот вызов будет выполнен при монтировании файловой системы устройств, её восстановлении или при появлении нового устройства.
+
+[[mac-mpo-create-devfs-directory]]
+===== `mpo_create_devfs_directory`
+
+[source, c]
+----
+void mpo_create_devfs_directory(char *dirname, int dirnamelen,
+ struct devfs_dirent *devfs_dirent, struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`dirname`
+|Имя создаваемого каталога
+|
+
+|`namelen`
+|Длина строки `dirname`
+|
+
+|`devfs_dirent`
+|Запись в devfs для создаваемого каталога.
+|
+|===
+
+Заполнить метку на devfs_dirent, создаваемом для переданного каталога. Этот вызов будет выполнен при монтировании файловой системы устройств, её восстановлении или при появлении нового устройства, требующего определённой иерархии каталогов.
+
+[[mac-mpo-create-devfs-symlink]]
+===== `mpo_create_devfs_symlink`
+
+[source, c]
+----
+void mpo_create_devfs_symlink(struct ucred *cred, struct mount *mp,
+ struct devfs_dirent *dd, struct label *ddlabel, struct devfs_dirent *de,
+ struct label *delabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`mp`
+|Точка монтирования devfs
+|
+
+|`dd`
+|Назначения cсылки
+|
+
+|`ddlabel`
+|Метка, связанная с `dd`
+|
+
+|`de`
+|Символьная ссылка записи
+|
+
+|`delabel`
+|Метка, связанная с `de`
+|
+|===
+
+Заполнить метку (`delabel`) для новой структуры man:devfs[5] символьной ссылки.
+
+[[mac-mpo-create-vnode-extattr]]
+===== `mpo_create_vnode_extattr`
+
+[source, c]
+----
+int mpo_create_vnode_extattr(struct ucred *cred, struct mount *mp,
+ struct label *fslabel, struct vnode *dvp, struct label *dlabel,
+ struct vnode *vp, struct label *vlabel, struct componentname *cnp);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`mount`
+|Точка монтирования файловой системы
+|
+
+|`label`
+|Метка файловой системы
+|
+
+|`dvp`
+|Родительский каталог vnode
+|
+
+|`dlabel`
+|Метка, связанная с `dvp`
+|
+
+|`vp`
+|Вновь созданная vnode
+|
+
+|`vlabel`
+|Метка политики, связанная с `vp`
+|
+
+|`cnp`
+|Название компонента для `vp`
+|
+|===
+
+Записать метку для `vp` в соответствующий расширенный атрибут. Если запись прошла успешно, заполняет `vlabel` меткой и возвращает 0. В противном случае вернет соответствующую ошибку.
+
+[[mac-mpo-create-mount]]
+===== `mpo_create_mount`
+
+[source, c]
+----
+void mpo_create_mount(struct ucred *cred, struct mount *mp, struct label *mnt,
+ struct label *fslabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`mp`
+|Объект; файловая система, которая монтируется
+|
+
+|`mntlabel`
+|Метка политики для заполнения в `mp`
+|
+
+|`fslabel`
+|Метка политики для файловой системы, монтируемой в `mp`.
+|
+|===
+
+Заполнить метки на точке монтирования, создаваемой переданными учетными данными субъекта. Этот вызов будет выполнен при монтировании новой файловой системы.
+
+[[mac-mpo-create-root-mount]]
+===== `mpo_create_root_mount`
+
+[source, c]
+----
+void mpo_create_root_mount(struct ucred *cred, struct mount *mp,
+ struct label *mntlabel, struct label *fslabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+3+|См. crossref:mac[mac-mpo-create-mount, `mpo_create_mount`].
+|===
+
+Заполнить метки на точке монтирования, создаваемой переданными учетными данными субъекта. Этот вызов будет выполнен при монтировании корневой файловой системы после `mpo_create_mount;`.
+
+[[mac-mpo-relabel-vnode]]
+===== `mpo_relabel_vnode`
+
+[source, c]
+----
+void mpo_relabel_vnode(struct ucred *cred, struct vnode *vp,
+ struct label *vnodelabel, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|vnode для перемаркировки
+|
+
+|`vnodelabel`
+|Существующая метка политики для `vp`
+|
+
+|`newlabel`
+|Новая, возможно частичная метка для замены `vnodelabel`
+|
+|===
+
+Обновить метку на переданном vnode с учетом переданной обновленной метки vnode и переданных учетных данных субъекта.
+
+[[mac-mpo-setlabel-vnode-extattr]]
+===== `mpo_setlabel_vnode_extattr`
+
+[source, c]
+----
+int mpo_setlabel_vnode_extattr(struct ucred *cred, struct vnode *vp,
+ struct label *vlabel, struct label *intlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|vnode, для которой записывается метка
+|
+
+|`vlabel`
+|Метка политики, связанная с `vp`
+|
+
+|`intlabel`
+|Метка для записи
+|
+|===
+
+Записать политику из `intlabel` в расширенный атрибут. Этот метод вызывается из `vop_stdcreatevnode_ea`.
+
+[[mac-mpo-update-devfsdirent]]
+===== `mpo_update_devfsdirent`
+
+[source, c]
+----
+void mpo_update_devfsdirent(struct devfs_dirent *devfs_dirent,
+ struct label *direntlabel, struct vnode *vp, struct label *vnodelabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`devfs_dirent`
+|Объект; каталожная запись devfs
+|
+
+|`direntlabel`
+|Метка политики для `devfs_dirent`, которая будет обновлена.
+|
+
+|`vp`
+|Родительский vnode
+|Заблокирован
+
+|`vnodelabel`
+|Метка политики для `vp`
+|
+|===
+
+Обновить метку `devfs_dirent` из переданной метки devfs vnode. Этот вызов будет выполнен, когда devfs vnode успешно перемаркирован, чтобы зафиксировать изменение метки, чтобы оно сохранилось, даже если vnode будет переиспользован. Он также будет выполнен при создании символьной ссылки в devfs после вызова `mac_vnode_create_from_vnode` для инициализации метки vnode.
+
+[[mac-ipc-label-ops]]
+==== Действия с событиями меток объектов IPC
+
+[[mac-mpo-create-mbuf-from-socket]]
+===== `mpo_create_mbuf_from_socket`
+
+[source, c]
+----
+void mpo_create_mbuf_from_socket(struct socket *so, struct label *socketlabel,
+ struct mbuf *m, struct label *mbuflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`socket`
+|Сокет
+|Блокировка сокетов — работа в процессе
+
+|`socketlabel`
+|Метка политики для `socket`
+|
+
+|`m`
+|Объект; mbuf
+|
+
+|`mbuflabel`
+|Метка политики для заполнения для `m`
+|
+|===
+
+Установить метку на только что созданном заголовке mbuf из переданной метки сокета. Этот вызов выполняется, когда новый датаграмма или сообщение генерируется сокетом и сохраняется в переданном mbuf.
+
+[[mac-mpo-create-pipe]]
+===== `mpo_create_pipe`
+
+[source, c]
+----
+void mpo_create_pipe(struct ucred *cred, struct pipe *pipe,
+ struct label *pipelabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`pipe`
+|Канал
+|
+
+|`pipelabel`
+|Метка политики, связанная с `pipe`
+|
+|===
+
+Установить метку на только что созданном канале из переданных учетных данных субъекта. Этот вызов выполняется при создании нового канала.
+
+[[mac-mpo-create-socket]]
+===== `mpo_create_socket`
+
+[source, c]
+----
+void mpo_create_socket(struct ucred *cred, struct socket *so,
+ struct label *socketlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|Неизменяемый
+
+|`so`
+|Объект; сокет для добавления метки
+|
+
+|`socketlabel`
+|Метка для заполнения для `so`
+|
+|===
+
+Установить метку на новом сокете из переданных учетных данных субъекта. Этот вызов выполняется при создании сокета.
+
+[[mac-mpo-create-socket-from-socket]]
+===== `mpo_create_socket_from_socket`
+
+[source, c]
+----
+void mpo_create_socket_from_socket(struct socket *oldsocket,
+ struct label *oldsocketlabel, struct socket *newsocket,
+ struct label *newsocketlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`oldsocket`
+|Сокет, вызвавший listen
+|
+
+|`oldsocketlabel`
+|Метка политики, связанная с `oldsocket`
+|
+
+|`newsocket`
+|Новый сокет
+|
+
+|`newsocketlabel`
+|Метка политики, связанная с `newsocketlabel`
+|
+|===
+
+Создать метку сокета `newsocket`, только что принявшему соединение через man:accept[2], на основе сокета `oldsocket`, вызвавшего man:listen[2] .
+
+[[mac-mpo-relabel-pipe]]
+===== `mpo_relabel_pipe`
+
+[source, c]
+----
+void mpo_relabel_pipe(struct ucred *cred, struct pipe *pipe,
+ struct label *oldlabel, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`pipe`
+|Канал
+|
+
+|`oldlabel`
+|Текущая метка политики, связанная с `pipe`
+|
+
+|`newlabel`
+|Обновление метки политики для применения к `pipe`
+|
+|===
+
+Применить новую метку `newlabel` к `pipe`.
+
+[[mac-mpo-relabel-socket]]
+===== `mpo_relabel_socket`
+
+[source, c]
+----
+void mpo_relabel_socket(struct ucred *cred, struct socket *so,
+ struct label *oldlabel, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|Неизменяемый
+
+|`so`
+|Объект; сокет
+|
+
+|`oldlabel`
+|Текущая метка для `so`
+|
+
+|`newlabel`
+|Метка обновления для `so`
+|
+|===
+
+Обновить метку на сокете из переданного обновления метки сокета.
+
+[[mpo-set-socket-peer-from-mbuf]]
+===== `mpo_set_socket_peer_from_mbuf`
+
+[source, c]
+----
+void mpo_set_socket_peer_from_mbuf(struct mbuf *mbuf, struct label *mbuflabel,
+ struct label *oldlabel, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`mbuf`
+|Первый датаграмм, полученный через сокет
+|
+
+|`mbuflabel`
+|Метка для `mbuf`
+|
+
+|`oldlabel`
+|Текущая метка для сокета
+|
+
+|`newlabel`
+|Метка политики для заполнения сокета
+|
+|===
+
+Установить метку однорангового узла на потоковом сокете из переданной метки mbuf. Этот вызов будет выполнен при получении первого датаграммы потоковым сокетом, за исключением сокетов домена Unix.
+
+[[mac-mpo-set-socket-peer-from-socket]]
+===== `mpo_set_socket_peer_from_socket`
+
+[source, c]
+----
+void mpo_set_socket_peer_from_socket(struct socket *oldsocket,
+ struct label *oldsocketlabel, struct socket *newsocket,
+ struct label *newsocketpeerlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`oldsocket`
+|Локальный сокет
+|
+
+|`oldsocketlabel`
+|Метка политики для `oldsocket`
+|
+
+|`newsocket`
+|Сокет однорангового узла (peer socket)
+|
+
+|`newsocketpeerlabel`
+|Метка политики для заполнения для `newsocket`
+|
+|===
+
+Установите метку однорангового узла на потоковом UNIX-сокете из переданной конечной точки удаленного сокета. Этот вызов будет выполнен при соединении пары сокетов и будет произведен для обеих конечных точек.
+
+[[mac-net-labeling-event-ops]]
+==== Действия с событиями меток сетевых объектов
+
+[[mac-mpo-create-bpfdesc]]
+===== `mpo_create_bpfdesc`
+
+[source, c]
+----
+void mpo_create_bpfdesc(struct ucred *cred, struct bpf_d *bpf_d,
+ struct label *bpflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|Неизменяемый
+
+|`bpf_d`
+|Объект; дескриптор bpf
+|
+
+|`bpf`
+|Метка политики для заполнения для `bpf_d`
+|
+|===
+
+Установить метку на новом дескрипторе BPF из переданных учётных данных субъекта. Этот вызов будет выполнен при открытии узла устройства BPF процессом с переданными учётными данными субъекта.
+
+[[mac-mpo-create-ifnet]]
+===== `mpo_create_ifnet`
+
+[source, c]
+----
+void mpo_create_ifnet(struct ifnet *ifnet, struct label *ifnetlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`ifnet`
+|Сетевой интерфейс
+|
+
+|`ifnetlabel`
+|Метка политики для заполнения для `ifnet`
+|
+|===
+
+Установить метку на вновь созданном интерфейсе. Этот вызов может быть выполнен, когда новое физическое устройство становится доступным системе, или когда псевдо-интерфейс создаётся во время загрузки или в результате действия пользователя.
+
+[[mac-mpo-create-ipq]]
+===== `mpo_create_ipq`
+
+[source, c]
+----
+void mpo_create_ipq(struct mbuf *fragment, struct label *fragmentlabel,
+ struct ipq *ipq, struct label *ipqlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`fragment`
+|Первый полученный IP-фрагмент
+|
+
+|`fragmentlabel`
+|Метка политики для `fragment`
+|
+
+|`ipq`
+|Очередь повторной сборки IP, которой добавляетя метка
+|
+
+|`ipqlabel`
+|Метка политики для заполнения в `ipq`
+|
+|===
+
+Установить метку на вновь созданной очереди сборки IP-фрагментов из заголовка mbuf первого полученного фрагмента.
+
+[[mac-mpo-create-datagram-from-ipq]]
+===== `mpo_create_datagram_from_ipq`
+
+[source, c]
+----
+void mpo_create_create_datagram_from_ipq(struct ipq *ipq,
+ struct label *ipqlabel, struct mbuf *datagram, struct label *datagramlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`ipq`
+|Очередь повторной сборки IP
+|
+
+|`ipqlabel`
+|Метка политики для `ipq`
+|
+
+|`datagram`
+|Датаграмма для добавления метки
+|
+
+|`datagramlabel`
+|Метка политики для заполнения в `datagramlabel`
+|
+|===
+
+Установите метку на вновь собранный IP-датаграмму из очереди сборки IP-фрагментов, из которой он был сгенерирован.
+
+[[mac-mpo-create-fragment]]
+===== `mpo_create_fragment`
+
+[source, c]
+----
+void mpo_create_fragment(struct mbuf *datagram, struct label *datagramlabel,
+ struct mbuf *fragment, struct label *fragmentlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`datagram`
+|Датаграмма
+|
+
+|`datagramlabel`
+|Метка политики для `datagram`
+|
+
+|`fragment`
+|Фрагмент, которому будет установлена метка
+|
+
+|`fragmentlabel`
+|Метка политики для заполнения для `datagram`
+|
+|===
+
+Установить метку на заголовке mbuf вновь созданного IP-фрагмента из метки на заголовке mbuf датаграммы, из которой он был сгенерирован.
+
+[[mac-mpo-create-mbuf-from-mbuf]]
+===== `mpo_create_mbuf_from_mbuf`
+
+[source, c]
+----
+void mpo_create_mbuf_from_mbuf(struct mbuf *oldmbuf, struct label *oldmbuflabel,
+ struct mbuf *newmbuf, struct label *newmbuflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`oldmbuf`
+|Существующий (исходный) mbuf
+|
+
+|`oldmbuflabel`
+|Метка политики для `oldmbuf`
+|
+
+|`newmbuf`
+|Новый mbuf для добавления метки
+|
+
+|`newmbuflabel`
+|Метка политики для заполнения в `newmbuf`
+|
+|===
+
+Установить метку в заголовке mbuf для вновь созданной датаграммы на основе заголовка mbuf существующей датаграммы. Этот вызов может быть выполнен в ряде ситуаций, включая случаи, когда для mbuf заново выделяется память для целей выравнивания.
+
+[[mac-mpo-create-mbuf-linklayer]]
+===== `mpo_create_mbuf_linklayer`
+
+[source, c]
+----
+void mpo_create_mbuf_linklayer(struct ifnet *ifnet, struct label *ifnetlabel,
+ struct mbuf *mbuf, struct label *mbuflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`ifnet`
+|Сетевой интерфейс
+|
+
+|`ifnetlabel`
+|Метка политики для `ifnet`
+|
+
+|`mbuf`
+|заголовок mbuf для новой датаграммы
+|
+
+|`mbuflabel`
+|Метка политики для заполнения для `mbuf`
+|
+|===
+
+Установить метку в заголовке mbuf для вновь созданной датаграммы, сгенерированного для целей ответа на канальном уровне для переданного интерфейса. Этот вызов может быть выполнен в ряде ситуаций, включая ответы ARP или ND6 в стеках IPv4 и IPv6.
+
+[[mac-mpo-create-mbuf-from-bpfdesc]]
+===== `mpo_create_mbuf_from_bpfdesc`
+
+[source, c]
+----
+void mpo_create_mbuf_from_bpfdesc(struct bpf_d *bpf_d, struct label *bpflabel,
+ struct mbuf *mbuf, struct label *mbuflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`bpf_d`
+|Дескриптор BPF
+|
+
+|`bpflabel`
+|Метка политики для `bpflabel`
+|
+
+|`mbuf`
+|Новый mbuf для добавления метки
+|
+
+|`mbuflabel`
+|Метка политики для заполнения `mbuf`
+|
+|===
+
+Установить метку на заголовок mbuf вновь созданной датаграммы, сгенерированной с использованием переданного дескриптора BPF. Этот вызов выполняется при записи в устройство BPF, связанное с переданным дескриптором BPF.
+
+[[mac-mpo-create-mbuf-from-ifnet]]
+===== `mpo_create_mbuf_from_ifnet`
+
+[source, c]
+----
+void mpo_create_mbuf_from_ifnet(struct ifnet *ifnet, struct label *ifnetlabel,
+ struct mbuf *mbuf, struct label *mbuflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`ifnet`
+|Сетевой интерфейс
+|
+
+|`ifnetlabel`
+|Метка политики для `ifnetlabel`
+|
+
+|`mbuf`
+|заголовок mbuf для новой датаграммы
+|
+
+|`mbuflabel`
+|Метка политики для заполнения для `mbuf`
+|
+|===
+
+Установить метку на заголовке mbuf вновь созданной датаграммы, сгенерированной из переданного сетевого интерфейса.
+
+[[mac-mpo-create-mbuf-multicast-encap]]
+===== `mpo_create_mbuf_multicast_encap`
+
+[source, c]
+----
+void mpo_create_mbuf_multicast_encap(struct mbuf *oldmbuf,
+ struct label *oldmbuflabel, struct ifnet *ifnet, struct label *ifnetlabel,
+ struct mbuf *newmbuf, struct label *newmbuflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`oldmbuf`
+|Заголовок mbuf для существующего датаграммы
+|
+
+|`oldmbuflabel`
+|Метка политики для `oldmbuf`
+|
+
+|`ifnet`
+|Сетевой интерфейс
+|
+
+|`ifnetlabel`
+|Метка политики для `ifnet`
+|
+
+|`newmbuf`
+|Заголовок mbuf для пометки новой датаграммы
+|
+
+|`newmbuflabel`
+|Метка политики для заполнения в `newmbuf`
+|
+|===
+
+Установить метку в заголовке mbuf для вновь созданной датаграммы, сгенерированной из существующей переданной датаграммы, при её обработке переданным интерфейсом мультикастовой инкапсуляции. Этот вызов происходит при доставке mbuf с использованием виртуального интерфейса.
+
+[[mac-mpo-create-mbuf-netlayer]]
+===== `mpo_create_mbuf_netlayer`
+
+[source, c]
+----
+void mpo_create_mbuf_netlayer(struct mbuf *oldmbuf, struct label *oldmbuflabel,
+ struct mbuf *newmbuf, struct label *newmbuflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`oldmbuf`
+|Полученная датаграмма
+|
+
+|`oldmbuflabel`
+|Метка политики для `oldmbuf`
+|
+
+|`newmbuf`
+|Вновь созданная датаграмма
+|
+
+|`newmbuflabel`
+|Метка политики для `newmbuf`
+|
+|===
+
+Установить метку на заголовок mbuf вновь созданной датаграммы, сгенерированной стеком IP в ответ на полученную датаграмму (`oldmbuf`). Этот вызов может быть выполнен в различных ситуациях, включая ответ на датаграммы ICMP-запросов.
+
+[[mac-mpo-fragment-match]]
+===== `mpo_fragment_match`
+
+[source, c]
+----
+int mpo_fragment_match(struct mbuf *fragment, struct label *fragmentlabel,
+ struct ipq *ipq, struct label *ipqlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`fragment`
+|Фрагмент IP-датаграммы
+|
+
+|`fragmentlabel`
+|Метка политики для `fragment`
+|
+
+|`ipq`
+|Очередь сборки IP-фрагментов
+|
+
+|`ipqlabel`
+|Метка политики для `ipq`
+|
+|===
+
+Определить, соответствует ли заголовок mbuf, содержащий фрагмент IP-датаграммы (`fragment`), метке переданной очереди сборки IP-фрагментов (`ipq`). Возвращает (1) при успешном совпадении или (0) при отсутствии совпадения. Этот вызов выполняется, когда IP-стек пытается найти существующую очередь сборки фрагментов для вновь полученного фрагмента; если поиск не удаётся, для фрагмента может быть создана новая очередь сборки. Политики могут использовать эту точку входа, чтобы предотвратить сборку в остальном подходящих IP-фрагментов, если политика не разрешает их сборку на основе метки или другой информации.
+
+[[mac-mpo-ifnet-relabel]]
+===== `mpo_relabel_ifnet`
+
+[source, c]
+----
+void mpo_relabel_ifnet(struct ucred *cred, struct ifnet *ifnet,
+ struct label *ifnetlabel, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`ifnet`
+|Объект; Сетевой интерфейс
+|
+
+|`ifnetlabel`
+|Метка политики для `ifnet`
+|
+
+|`newlabel`
+|Метка обновления для применения к `ifnet`
+|
+|===
+
+Обновить метку сетевого интерфейса, `ifnet`, на основе переданной новой метки, `newlabel`, и переданных учетных данных субъекта, `cred`.
+
+[[mac-mpo-update-ipq]]
+===== `mpo_update_ipq`
+
+[source, c]
+----
+void mpo_update_ipq(struct mbuf *fragment, struct label *fragmentlabel,
+ struct ipq *ipq, struct label *ipqlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`mbuf`
+|IP фрагмент
+|
+
+|`mbuflabel`
+|Метка политики для `mbuf`
+|
+
+|`ipq`
+|Очередь сборки IP-фрагментов
+|
+
+|`ipqlabel`
+|Метка политики для обновления для `ipq`
+|
+|===
+
+Обновить метку в очереди сборки IP-фрагментов (`ipq`) на основе принятия переданного заголовка IP-фрагмента mbuf (`mbuf`).
+
+[[mac-proc-labeling-event-ops]]
+==== Действия с событиями меток процессов
+
+[[mac-mpo-create-cred]]
+===== `mpo_create_cred`
+
+[source, c]
+----
+void mpo_create_cred(struct ucred *parent_cred, struct ucred *child_cred);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`parent_cred`
+|Учетные данные субъекта‐родителя
+|
+
+|`child_cred`
+|Учётные данные дочернего субъекта
+|
+|===
+
+Установить метку вновь созданного субъекта из переданного субъекта. Этот вызов будет выполнен при вызове man:crcopy[9] для только что созданной структуры `struct ucred`. Этот вызов не следует путать с событием создания или ветвления процесса.
+
+[[mac-mpo-execve-transition]]
+===== `mpo_execve_transition`
+
+[source, c]
+----
+void mpo_execve_transition(struct ucred *old, struct ucred *new,
+ struct vnode *vp, struct label *vnodelabel);
+
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`old`
+|Учетные данные существующего субъекта
+|Неизменяемый
+
+|`new`
+|Учетные данные нового субъекта для добавления метки
+|
+
+|`vp`
+|Файл для выполнения
+|Заблокирован
+
+|`vnodelabel`
+|Метка политики для `vp`
+|
+|===
+
+Обновить метку учетных данных вновь созданного субъекта (`new`) на основе переданных учетных данных существующего субъекта (`old`) в соответствии с переходом метки, вызванным выполнением переданного vnode (`vp`). Этот вызов происходит, когда процесс выполняет переданный vnode, и одна из политик возвращает успех из точки входа `mpo_execve_will_transition`. Политики могут выбрать реализацию этого вызова просто путем вызова `mpo_create_cred` и передачи двух субъектов учетных данных, чтобы не реализовывать событие перехода. Политики не должны оставлять эту точку входа нереализованной, если они реализуют `mpo_create_cred`, даже если они не реализуют `mpo_execve_will_transition`.
+
+[[mac-mpo-execve-will-transition]]
+===== `mpo_execve_will_transition`
+
+[source, c]
+----
+int mpo_execve_will_transition(struct ucred *old, struct vnode *vp,
+ struct label *vnodelabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`old`
+|Учетные данные субъекта перед man:execve[2]
+|Неизменяемый
+
+|`vp`
+|Файл для выполнения
+|
+
+|`vnodelabel`
+|Метка политики для `vp`
+|
+|===
+
+Определить, будет ли политика выполнять событие перехода в результате выполнения переданного vnode с использованием переданных учетных данных субъекта. Вернуть 1, если переход требуется, и 0, если нет. Даже если политика возвращает 0, она должна корректно обрабатывать неожиданный вызов `mpo_execve_transition`, так как этот вызов может произойти из-за запроса перехода другой политикой.
+
+[[mac-mpo-create-proc0]]
+===== `mpo_create_proc0`
+
+[source, c]
+----
+void mpo_create_proc0(struct ucred *cred);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта для заполнения
+|
+|===
+
+Создать учетные данные субъекта процесса 0, родителя всех процессов ядра.
+
+[[mac-mpo-create-proc1]]
+===== `mpo_create_proc1`
+
+[source, c]
+----
+void mpo_create_proc1(struct ucred *cred);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта для заполнения
+|
+|===
+
+Создать учетные данные субъекта процесса 1, родителя всех пользовательских процессов.
+
+[[mac-mpo-relabel-cred]]
+===== `mpo_relabel_cred`
+
+[source, c]
+----
+void mpo_relabel_cred(struct ucred *cred, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`newlabel`
+|Обновление метки для применения к `cred`
+|
+|===
+
+Обновить метку на учетных данных субъекта из переданной обновляемой метки.
+
+[[mac-access-control-checks]]
+=== Проверки контроля доступа
+
+Точки входа контроля доступа позволяют модулям политики влиять на решения по контролю доступа, принимаемые ядром. Обычно, хотя и не всегда, аргументы точки входа контроля доступа включают одно или несколько удостоверяющих полномочий, информацию (возможно, включая метку) для любых других объектов, участвующих в операции. Точка входа контроля доступа может вернуть 0 для разрешения операции или значение ошибки man:errno[2]. Результаты вызова точки входа через различные зарегистрированные модули политики будут объединены следующим образом: если все модули разрешают успешное выполнение операции, будет возвращен успех. Если один или несколько модулей возвращают ошибку, будет возвращена ошибка. Если более одного модуля возвращают ошибку, значение errno, которое будет возвращено пользователю, выбирается с использованием следующего приоритета, реализованного функцией `error_select()` в [.filename]#kern_mac.c#:
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|Наивысший приоритет
+|EDEADLK
+
+|
+|EINVAL
+
+|
+|ESRCH
+
+|
+|EACCES
+
+|Наименьший приоритет
+|EPERM
+|===
+
+Если ни одно из значений ошибок, возвращаемых всеми модулями, не указано в таблице приоритетов, будет возвращено произвольно выбранное значение из набора. В общем случае правила устанавливают следующий порядок приоритетов ошибок: сбои ядра, неверные аргументы, отсутствие объекта, отсутствие доступа, прочие.
+
+[[mac-mpo-bpfdesc-check-receive-from-ifnet]]
+==== `mpo_check_bpfdesc_receive`
+
+[source, c]
+----
+int mpo_check_bpfdesc_receive(struct bpf_d *bpf_d, struct label *bpflabel,
+ struct ifnet *ifnet, struct label *ifnetlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`bpf_d`
+|Субъект; Дескриптор BPF
+|
+
+|`bpflabel`
+|Метка политики для `bpf_d`
+|
+
+|`ifnet`
+|Объект; сетевой интерфейс
+|
+
+|`ifnetlabel`
+|Метка политики для `ifnet`
+|
+|===
+
+Определить, должен ли framework MAC разрешать доставку датаграмм с переданного интерфейса в буферы переданного BPF-дескриптора. Возвращает (0) при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии меток, EPERM при отсутствии привилегий.
+
+[[mac-mpo-check-kenv-dump]]
+==== `mpo_check_kenv_dump`
+
+[source, c]
+----
+int mpo_check_kenv_dump(struct ucred *cred);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+|===
+
+Определить, следует ли разрешить субъекту получать доступ к окружению ядра (см. man:kenv[2]).
+
+[[mac-mpo-check-kenv-get]]
+==== `mpo_check_kenv_get`
+
+[source, c]
+----
+int mpo_check_kenv_get(struct ucred *cred, char *name);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`name`
+|Имя переменной окружения ядра
+|
+|===
+
+Определить, следует ли разрешить субъекту получать значение указанной переменной окружения ядра.
+
+[[mac-mpo-check-kenv-set]]
+==== `mpo_check_kenv_set`
+
+[source, c]
+----
+int mpo_check_kenv_set(struct ucred *cred, char *name);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`name`
+|Имя переменной окружения ядра
+|
+|===
+
+Определить, следует ли разрешить субъекту устанавливать указанную переменную окружения ядра.
+
+[[mac-mpo-check-kenv-unset]]
+==== `mpo_check_kenv_unset`
+
+[source, c]
+----
+int mpo_check_kenv_unset(struct ucred *cred, char *name);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`name`
+|Имя переменной окружения ядра
+|
+|===
+
+Определить, следует ли разрешить субъекту сбросить указанную переменную окружения ядра.
+
+[[mac-mpo-check-kld-load]]
+==== `mpo_check_kld_load`
+
+[source, c]
+----
+int mpo_check_kld_load(struct ucred *cred, struct vnode *vp,
+ struct label *vlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|vnode модуля ядра
+|
+
+|`vlabel`
+|Метка, связанная с `vp`
+|
+|===
+
+Определить, следует ли разрешить субъекту загружать указанный файл модуля.
+
+[[mac-mpo-check-kld-stat]]
+==== `mpo_check_kld_stat`
+
+[source, c]
+----
+int mpo_check_kld_stat(struct ucred *cred);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+|===
+
+Определить, следует ли разрешить субъекту получать список загруженных файлов модулей ядра и связанную с ними статистику.
+
+[[mac-mpo-check-kld-unload]]
+==== `mpo_check_kld_unload`
+
+[source, c]
+----
+int mpo_check_kld_unload(struct ucred *cred);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+|===
+
+Определить, следует ли разрешить субъекту выгружать модуль ядра.
+
+[[mac-mpo-check-pipe-ioctl]]
+==== `mpo_check_pipe_ioctl`
+
+[source, c]
+----
+int mpo_check_pipe_ioctl(struct ucred *cred, struct pipe *pipe,
+ struct label *pipelabel, unsigned long cmd, void *data);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`pipe`
+|Канал
+|
+
+|`pipelabel`
+|Метка политики, связанная с `pipe`
+|
+
+|`cmd`
+|команда nman:ioctl[2]
+|
+
+|`data`
+|данные man:ioctl[2]
+|
+|===
+
+Определить, следует ли разрешить субъекту выполнять указанный вызов man:ioctl[2].
+
+[[mac-mpo-check-pipe-poll]]
+==== `mpo_check_pipe_poll`
+
+[source, c]
+----
+int mpo_check_pipe_poll(struct ucred *cred, struct pipe *pipe,
+ struct label *pipelabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`pipe`
+|Канал
+|
+
+|`pipelabel`
+|Метка политики, связанная с `pipe`
+|
+|===
+
+Определить, следует ли разрешить субъекту опрашивать `pipe`.
+
+[[mac-mpo-check-pipe-read]]
+==== `mpo_check_pipe_read`
+
+[source, c]
+----
+int mpo_check_pipe_read(struct ucred *cred, struct pipe *pipe,
+ struct label *pipelabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`pipe`
+|Канал
+|
+
+|`pipelabel`
+|Метка политики, связанная с `pipe`
+|
+|===
+
+Определить, следует ли разрешить субъекту доступ на чтение к `pipe`.
+
+[[mac-mpo-check-pipe-relabel]]
+==== `mpo_check_pipe_relabel`
+
+[source, c]
+----
+int mpo_check_pipe_relabel(struct ucred *cred, struct pipe *pipe,
+ struct label *pipelabel, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`pipe`
+|Канал
+|
+
+|`pipelabel`
+|Текущая метка политики, связанная с `pipe`
+|
+
+|`newlabel`
+|Обновление метки до `pipelabel`
+|
+|===
+
+Определить, следует ли разрешить субъекту изменять метку `pipe`.
+
+[[mac-mpo-check-pipe-stat]]
+==== `mpo_check_pipe_stat`
+
+[source, c]
+----
+int mpo_check_pipe_stat(struct ucred *cred, struct pipe *pipe,
+ struct label *pipelabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`pipe`
+|Канал
+|
+
+|`pipelabel`
+|Метка политики, связанная с `pipe`
+|
+|===
+
+Определить, следует ли разрешить субъекту получать статистику, связанную с `pipe`.
+
+[[mac-mpo-check-pipe-write]]
+==== `mpo_check_pipe_write`
+
+[source, c]
+----
+int mpo_check_pipe_write(struct ucred *cred, struct pipe *pipe,
+ struct label *pipelabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`pipe`
+|Канал
+|
+
+|`pipelabel`
+|Метка политики, связанная с `pipe`
+|
+|===
+
+Определить, следует ли разрешить субъекту запись в `pipe`.
+
+[[mac-mpo-cred-check-socket-bind]]
+==== `mpo_check_socket_bind`
+
+[source, c]
+----
+int mpo_check_socket_bind(struct ucred *cred, struct socket *socket,
+ struct label *socketlabel, struct sockaddr *sockaddr);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`socket`
+|Сокет для привязки
+|
+
+|`socketlabel`
+|Метка политики для `socket`
+|
+
+|`sockaddr`
+|Адрес `socket`
+|
+|===
+
+[[mac-mpo-cred-check-socket-connect]]
+==== `mpo_check_socket_connect`
+
+[source, c]
+----
+int mpo_check_socket_connect(struct ucred *cred, struct socket *socket,
+ struct label *socketlabel, struct sockaddr *sockaddr);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`socket`
+|Сокет для подключения
+|
+
+|`socketlabel`
+|Метка политики для `socket`
+|
+
+|`sockaddr`
+|Адрес `socket`
+|
+|===
+
+Определить, может ли субъект с учётными данными (`cred`) подключить переданный сокет (`socket`) к переданному адресу сокета (`sockaddr`). Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии меток, EPERM при отсутствии прав.
+
+[[mac-mpo-check-socket-receive]]
+==== `mpo_check_socket_receive`
+
+[source, c]
+----
+int mpo_check_socket_receive(struct ucred *cred, struct socket *so,
+ struct label *socketlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`so`
+|Сокет
+|
+
+|`socketlabel`
+|Метка политики, связанная с `so`
+|
+|===
+
+Определить, следует ли разрешить субъекту получать информацию из сокета `so`.
+
+[[mac-mpo-check-socket-send]]
+==== `mpo_check_socket_send`
+
+[source, c]
+----
+int mpo_check_socket_send(struct ucred *cred, struct socket *so,
+ struct label *socketlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`so`
+|Сокет
+|
+
+|`socketlabel`
+|Метка политики, связанная с `so`
+|
+|===
+
+Определить, следует ли разрешить субъекту передавать информацию через сокет `so`.
+
+[[mac-mpo-check-cred-visible]]
+==== `mpo_check_cred_visible`
+
+[source, c]
+----
+int mpo_check_cred_visible(struct ucred *u1, struct ucred *u2);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`u1`
+|Учетные данные субъекта
+|
+
+|`u2`
+|Учетные данные объекта
+|
+|===
+
+Определить, может ли субъект с учётными данными `u1` "видеть" другие субъекты с переданными учётными данными `u2`. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии меток, EPERM при отсутствии привилегий или ESRCH для скрытия видимости. Этот вызов может выполняться в различных ситуациях, включая системные вызовы состояния межпроцессного взаимодействия, используемые `ps`, и при поиске в procfs.
+
+[[mac-mpo-cred-check-socket-visible]]
+==== `mpo_check_socket_visible`
+
+[source, c]
+----
+int mpo_check_socket_visible(struct ucred *cred, struct socket *socket,
+ struct label *socketlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`socket`
+|Объект; сокет
+|
+
+|`socketlabel`
+|Метка политики для `socket`
+|
+|===
+
+[[mac-mpo-cred-check-ifnet-relabel]]
+==== `mpo_check_ifnet_relabel`
+
+[source, c]
+----
+int mpo_check_ifnet_relabel(struct ucred *cred, struct ifnet *ifnet,
+ struct label *ifnetlabel, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`ifnet`
+|Объект; сетевой интерфейс
+|
+
+|`ifnetlabel`
+|Существующая метка политики для `ifnet`
+|
+
+|`newlabel`
+|Обновление метки политики для последующего применения к `ifnet`
+|
+|===
+
+Определить, может ли учетные данные субъекта перемаркировать переданный сетевой интерфейс в соответствии с переданным обновлением метки.
+
+[[mac-mpo-cred-check-socket-relabel]]
+==== `mpo_check_socket_relabel`
+
+[source, c]
+----
+int mpo_check_socket_relabel(struct ucred *cred, struct socket *socket,
+ struct label *socketlabel, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`socket`
+|Объект; сокет
+|
+
+|`socketlabel`
+|Метка существующей политики для `socket`
+|
+
+|`newlabel`
+|Обновление метки для последующего применения к `socketlabel`
+|
+|===
+
+Определить, могут ли учётные данные субъекта перемаркировать переданный сокет в соответствии с переданным обновлением метки.
+
+[[mac-mpo-cred-check-cred-relabel]]
+==== `mpo_check_cred_relabel`
+
+[source, c]
+----
+int mpo_check_cred_relabel(struct ucred *cred, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`newlabel`
+|Обновление метки для последующего применения к `cred`
+|
+|===
+
+Определить, могут ли учетные данные субъекта перемаркировать себя в соответствии с переданным обновлением метки.
+
+[[mac-mpo-cred-check-vnode-relabel]]
+==== `mpo_check_vnode_relabel`
+
+[source, c]
+----
+int mpo_check_vnode_relabel(struct ucred *cred, struct vnode *vp,
+ struct label *vnodelabel, struct label *newlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|Неизменяемый
+
+|`vp`
+|Объект; vnode
+|Заблокирован
+
+|`vnodelabel`
+|Существующая метка политики для `vp`
+|
+
+|`newlabel`
+|Обновление метки политики для последующего применения к `vp`
+|
+|===
+
+Определить, могут ли учётные данные субъекта изменить метку переданного vnode на переданную обновлённую метку.
+
+[[mpo-cred-check-mount-stat]]
+==== `mpo_check_mount_stat`
+
+[source, c]
+----
+int mpo_check_mount_stat(struct ucred *cred, struct mount *mp,
+ struct label *mountlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`mp`
+|Объект; точка монтирования файловой системы
+|
+
+|`mountlabel`
+|Метка политики для `mp`
+|
+|===
+
+Определить, могут ли учетные данные субъекта видеть результаты выполнения statfs для файловой системы. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии меток или EPERM при отсутствии привилегий. Этот вызов может выполняться в различных ситуациях, включая вызовы man:statfs[2] и связанных функций, а также для определения, какие файловые системы исключать из списка, например, при вызове man:getfsstat[2].
+
+[[mac-mpo-cred-check-proc-debug]]
+==== `mpo_check_proc_debug`
+
+[source, c]
+----
+int mpo_check_proc_debug(struct ucred *cred, struct proc *proc);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|Неизменяемый
+
+|`proc`
+|Объект; процесс
+|
+|===
+
+Определить, могут ли учётные данные субъекта отлаживать переданный процесс. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки, EPERM при недостатке прав или ESRCH для скрытия видимости цели. Этот вызов может использоваться в различных ситуациях, включая использование API man:ptrace[2] и man:ktrace[2], а также для некоторых операций с procfs.
+
+[[mac-mpo-cred-check-vnode-access]]
+==== `mpo_check_vnode_access`
+
+[source, c]
+----
+int mpo_check_vnode_access(struct ucred *cred, struct vnode *vp,
+ struct label *label, int flags);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`flags`
+|флаги man:access[2]
+|
+|===
+
+Определить, как должны возвращаться вызовы man:access[2] и связанные вызовы для субъекта с указанными учетными данными при выполнении на переданном vnode с использованием переданных флагов доступа. Обычно это должно быть реализовано с использованием той же семантики, что и в `mpo_check_vnode_open`. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии меток или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-chdir]]
+==== `mpo_check_vnode_chdir`
+
+[source, c]
+----
+int mpo_check_vnode_chdir(struct ucred *cred, struct vnode *dvp,
+ struct label *dlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`dvp`
+|Объект; vnode, в который делается man:chdir[2]
+|
+
+|`dlabel`
+|Метка политики для `dvp`
+|
+|===
+
+Определить, могут ли учётные данные субъекта изменить рабочий каталог процесса на переданный vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-check-vnode-chroot]]
+==== `mpo_check_vnode_chroot`
+
+[source, c]
+----
+int mpo_check_vnode_chroot(struct ucred *cred, struct vnode *dvp,
+ struct label *dlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`dvp`
+|vnode каталога
+|
+
+|`dlabel`
+|Метка политики, связанная с `dvp`
+|
+|===
+
+Определить, следует ли разрешить субъекту выполнять man:chroot[2] в указанный каталог (`dvp`).
+
+[[mac-mpo-cred-check-vnode-create]]
+==== `mpo_check_vnode_create`
+
+[source, c]
+----
+int mpo_check_vnode_create(struct ucred *cred, struct vnode *dvp,
+ struct label *dlabel, struct componentname *cnp, struct vattr *vap);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`dvp`
+|Объект; vnode
+|
+
+|`dlabel`
+|Метка политики для `dvp`
+|
+
+|`cnp`
+|Название компонента для `dvp`
+|
+
+|`vap`
+|атрибуты vnode для `vap`
+|
+|===
+
+Определить, могут ли учетные данные субъекта создать vnode с указанной родительской директорией, информацией о имени и атрибутами. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий. Этот вызов может выполняться в различных ситуациях, включая вызовы man:open[2] с O_CREAT, man:mkfifo[2] и другие.
+
+[[mac-mpo-cred-check-vnode-delete]]
+==== `mpo_check_vnode_delete`
+
+[source, c]
+----
+int mpo_check_vnode_delete(struct ucred *cred, struct vnode *dvp,
+ struct label *dlabel, struct vnode *vp, void *label,
+ struct componentname *cnp);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`dvp`
+|Родительский каталог vnode
+|
+
+|`dlabel`
+|Метка политики для `dvp`
+|
+
+|`vp`
+|Объект; vnode для удаления
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`cnp`
+|Название компонента для `vp`
+|
+|===
+
+Определить, может ли субъект с данными учетными данными удалить vnode из переданного родительского каталога и переданной информации о имени. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий. Этот вызов может быть выполнен в различных ситуациях, включая вызовы man:unlink[2] и man:rmdir[2]. Политики, реализующие эту точку входа, также должны реализовывать `mpo_check_rename_to` для авторизации удаления объектов в результате их переименования.
+
+[[mac-mpo-cred-check-vnode-deleteacl]]
+==== `mpo_check_vnode_deleteacl`
+
+[source, c]
+----
+int mpo_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,
+ struct label *label, acl_type_t type);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|Неизменяемый
+
+|`vp`
+|Объект; vnode
+|Заблокирован
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`type`
+|Тип ACL
+|
+|===
+
+Определить, могут ли учетные данные субъекта удалить ACL указанного типа из переданного vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-exec]]
+==== `mpo_check_vnode_exec`
+
+[source, c]
+----
+int mpo_check_vnode_exec(struct ucred *cred, struct vnode *vp,
+ struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode для выполнения
+|
+
+|`label`
+|Метка политики для `vp`
+|
+|===
+
+Определить, могут ли учётные данные субъекта выполнить переданный vnode. Проверка права на выполнение осуществляется отдельно от решений о любом переходном событии. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии прав.
+
+[[mpo-cred-check-vnode-getacl]]
+==== `mpo_check_vnode_getacl`
+
+[source, c]
+----
+int mpo_check_vnode_getacl(struct ucred *cred, struct vnode *vp,
+ struct label *label, acl_type_t type);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`type`
+|Тип ACL
+|
+|===
+
+Определить, может ли учётное данное субъекта получить ACL указанного типа из переданного vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-getextattr]]
+==== `mpo_check_vnode_getextattr`
+
+[source, c]
+----
+int mpo_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,
+ struct label *label, int attrnamespace, const char *name, struct uio *uio);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`attrnamespace`
+|Пространство имен расширенных атрибутов
+|
+
+|`name`
+|Имя расширенного атрибута
+|
+
+|`uio`
+|Указатель структуры ввода-вывода; см. man:uio[9]
+|
+|===
+
+Определить, может ли субъект с указанными учетными данными получить расширенный атрибут с заданным пространством имен и именем из указанного vnode. Политики, реализующие маркировку с использованием расширенных атрибутов, могут требовать особой обработки операций с этими атрибутами. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-check-vnode-link]]
+==== `mpo_check_vnode_link`
+
+[source, c]
+----
+int mpo_check_vnode_link(struct ucred *cred, struct vnode *dvp,
+ struct label *dlabel, struct vnode *vp, struct label *label,
+ struct componentname *cnp);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`dvp`
+|vnode каталога
+|
+
+|`dlabel`
+|Метка политики, связанная с `dvp`
+|
+
+|`vp`
+|vnode целевого линка
+|
+
+|`label`
+|Метка политики, связанная с `vp`
+|
+
+|`cnp`
+|Имя компонента для создаваемой ссылки
+|
+|===
+
+Определить, следует ли разрешить субъекту создавать ссылку на vnode `vp` с именем, указанным в `cnp`.
+
+[[mac-mpo-check-vnode-mmap]]
+==== `mpo_check_vnode_mmap`
+
+[source, c]
+----
+int mpo_check_vnode_mmap(struct ucred *cred, struct vnode *vp,
+ struct label *label, int prot);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|vnode для mmap
+|
+
+|`label`
+|Метка политики, связанная с `vp`
+|
+
+|`prot`
+|Защита mmap (см. man:mmap[2])
+|
+|===
+
+Определить, следует ли разрешить субъекту отображать vnode `vp` с указанными в `prot` правами доступа.
+
+[[mac-mpo-check-vnode-mmap-downgrade]]
+==== `mpo_check_vnode_mmap_downgrade`
+
+[source, c]
+----
+void mpo_check_vnode_mmap_downgrade(struct ucred *cred, struct vnode *vp,
+ struct label *label, int *prot);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|См. crossref:mac[mac-mpo-check-vnode-mmap, `mpo_check_vnode_mmap`].
+|
+
+|`vp`
+|
+|
+
+|`label`
+|
+|
+
+|`prot`
+|Защита mmap для понижения уровня
+|
+|===
+
+Понизить уровень защиты mmap на основе меток субъекта и объекта.
+
+[[mac-mpo-check-vnode-mprotect]]
+==== `mpo_check_vnode_mprotect`
+
+[source, c]
+----
+int mpo_check_vnode_mprotect(struct ucred *cred, struct vnode *vp,
+ struct label *label, int prot);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Отображенный vnode
+|
+
+|`prot`
+|Защита памяти
+|
+|===
+
+Определить, следует ли разрешить субъекту устанавливать указанные защиты памяти для памяти, отображенной из vnode `vp`.
+
+[[mac-mpo-check-vnode-poll]]
+==== `mpo_check_vnode_poll`
+
+[source, c]
+----
+int mpo_check_vnode_poll(struct ucred *active_cred, struct ucred *file_cred,
+ struct vnode *vp, struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`active_cred`
+|Учетные данные субъекта
+|
+
+|`file_cred`
+|Учетные данные, связанные со структурой file
+|
+
+|`vp`
+|vnode, на котором вызывается poll
+|
+
+|`label`
+|Метка политики, связанная с `vp`
+|
+|===
+
+Определить, следует ли разрешить субъекту вызывать poll на vnode `vp`.
+
+[[mac-mpo-check-vnode-rename-from]]
+==== `mpo_check_vnode_rename_from`
+
+[source, c]
+----
+int mpo_vnode_rename_from(struct ucred *cred, struct vnode *dvp,
+ struct label *dlabel, struct vnode *vp, struct label *label,
+ struct componentname *cnp);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`dvp`
+|vnode каталога
+|
+
+|`dlabel`
+|Метка политики, связанная с `dvp`
+|
+
+|`vp`
+|vnode для переименования
+|
+
+|`label`
+|Метка политики, связанная с `vp`
+|
+
+|`cnp`
+|Название компонента для `vp`
+|
+|===
+
+Определить, следует ли разрешить субъекту переименовать vnode `vp` во что-то другое.
+
+[[mac-mpo-check-vnode-rename-to]]
+==== `mpo_check_vnode_rename_to`
+
+[source, c]
+----
+int mpo_check_vnode_rename_to(struct ucred *cred, struct vnode *dvp,
+ struct label *dlabel, struct vnode *vp, struct label *label, int samedir,
+ struct componentname *cnp);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`dvp`
+|vnode каталога
+|
+
+|`dlabel`
+|Метка политики, связанная с `dvp`
+|
+
+|`vp`
+|vnode, который будет перезаписан
+|
+
+|`label`
+|Метка политики, связанная с `vp`
+|
+
+|`samedir`
+|Логическое значение; `1`, если исходный и целевой каталоги совпадают
+|
+
+|`cnp`
+|Имя компонента назначения
+|
+|===
+
+Определить, следует ли разрешить субъекту переименование vnode `vp` в директорию `dvp` или в имя, представленное `cnp`. Если не существует файла для перезаписи, `vp` и `label` будут NULL.
+
+[[mac-mpo-cred-check-socket-listen]]
+==== `mpo_check_socket_listen`
+
+[source, c]
+----
+int mpo_check_socket_listen(struct ucred *cred, struct socket *socket,
+ struct label *socketlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`socket`
+|Объект; сокет
+|
+
+|`socketlabel`
+|Метка политики для `socket`
+|
+|===
+
+Определить, могут ли учётные данные субъекта прослушивать переданный сокет (вызывать listen). Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-lookup]]
+==== `mpo_check_vnode_lookup`
+
+[source, c]
+----
+int mpo_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,
+ struct label *dlabel, struct componentname *cnp);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`dvp`
+|Объект; vnode
+|
+
+|`dlabel`
+|Метка политики для `dvp`
+|
+
+|`cnp`
+|Имя компонента, который ищется
+|
+|===
+
+Определить, могут ли учётные данные субъекта выполнить поиск указанного имени в каталог с переданном vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-open]]
+==== `mpo_check_vnode_open`
+
+[source, c]
+----
+int mpo_check_vnode_open(struct ucred *cred, struct vnode *vp,
+ struct label *label, int acc_mode);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`acc_mode`
+|режим доступа от man:open[2]
+|
+|===
+
+Определить, могут ли учетные данные субъекта выполнить операцию открытия переданного vnode с указанным режимом доступа. Возвращает 0 в случае успеха или значение errno при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-readdir]]
+==== `mpo_check_vnode_readdir`
+
+[source, c]
+----
+int mpo_check_vnode_readdir(struct ucred *cred, struct vnode *dvp,
+ struct label *dlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`dvp`
+|Объект; vnode каталога
+|
+
+|`dlabel`
+|Метка политики для `dvp`
+|
+|===
+
+Определить, могут ли учетные данные субъекта выполнить операцию `readdir` для переданного vnode каталога. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-readlink]]
+==== `mpo_check_vnode_readlink`
+
+[source, c]
+----
+int mpo_check_vnode_readlink(struct ucred *cred, struct vnode *vp,
+ struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+|===
+
+Определить, могут ли учетные данные субъекта выполнить операцию `readlink` для переданного символьного vnode. Возвращает 0 в случае успеха или значение `errno` в случае ошибки. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий. Этот вызов может быть выполнен в различных ситуациях, включая явный вызов `readlink` пользовательским процессом или неявный `readlink` во время поиска имени процессом.
+
+[[mac-mpo-cred-check-vnode-revoke]]
+==== `mpo_check_vnode_revoke`
+
+[source, c]
+----
+int mpo_check_vnode_revoke(struct ucred *cred, struct vnode *vp,
+ struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+|===
+
+Определить, могут ли учётные данные субъекта отозвать доступ к переданному vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-setacl]]
+==== `mpo_check_vnode_setacl`
+
+[source, c]
+----
+int mpo_check_vnode_setacl(struct ucred *cred, struct vnode *vp,
+ struct label *label, acl_type_t type, struct acl *acl);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`type`
+|Тип ACL
+|
+
+|`acl`
+|ACL
+|
+|===
+
+Определить, могут ли учётные данные субъекта установить переданный ACL указанного типа для переданного vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-setextattr]]
+==== `mpo_check_vnode_setextattr`
+
+[source, c]
+----
+int mpo_check_vnode_setextattr(struct ucred *cred, struct vnode *vp,
+ struct label *label, int attrnamespace, const char *name, struct uio *uio);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`attrnamespace`
+|Пространство имен расширенных атрибутов
+|
+
+|`name`
+|Имя расширенного атрибута
+|
+
+|`uio`
+|Указатель структуры ввода-вывода; см. man:uio[9]
+|
+|===
+
+Определить, могут ли учетные данные субъекта установить расширенный атрибут с переданным именем и пространством имен на переданном vnode. Политики, реализующие метки безопасности, основанные на расширенных атрибутах, могут предусматривать дополнительные защиты для этих атрибутов. Кроме того, политикам следует избегать принятия решений на основе данных, на которые ссылается `uio`, так как существует потенциальное состояние гонки между этой проверкой и фактической операцией. `uio` также может быть `NULL`, если выполняется операция удаления. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-setflags]]
+==== `mpo_check_vnode_setflags`
+
+[source, c]
+----
+int mpo_check_vnode_setflags(struct ucred *cred, struct vnode *vp,
+ struct label *label, u_long flags);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`flags`
+|Флаги файла; см. man:chflags[2]
+|
+|===
+
+Определить, могут ли учётные данные субъекта установить переданные флаги на переданном vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-setmode]]
+==== `mpo_check_vnode_setmode`
+
+[source, c]
+----
+int mpo_check_vnode_setmode(struct ucred *cred, struct vnode *vp,
+ struct label *label, mode_t mode);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`mode`
+|Режим файла; см. man:chmod[2]
+|
+|===
+
+Определить, могут ли учётные данные субъекта установить переданный режим для переданного vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при недостатке привилегий.
+
+[[mac-mpo-cred-check-vnode-setowner]]
+==== `mpo_check_vnode_setowner`
+
+[source, c]
+----
+int mpo_check_vnode_setowner(struct ucred *cred, struct vnode *vp,
+ struct label *label, uid_t uid, gid_t gid);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`uid`
+|User ID
+|
+
+|`gid`
+|Идентификатор группы
+|
+|===
+
+Определить, могут ли учетные данные субъекта установить переданный uid и переданный gid в качестве uid файла и gid файла для переданного vnode. Идентификаторы могут быть установлены в (`-1`) для запроса отсутствия обновления. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-vnode-setutimes]]
+==== `mpo_check_vnode_setutimes`
+
+[source, c]
+----
+int mpo_check_vnode_setutimes(struct ucred *cred, struct vnode *vp,
+ struct label *label, struct timespec atime, struct timespec mtime);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vp
+|
+
+|`label`
+|Метка политики для `vp`
+|
+
+|`atime`
+|Время доступа; см. man:utimes[2]
+|
+
+|`mtime`
+|Время изменения; см. man:utimes[2]
+|
+|===
+
+Определить, могут ли учётные данные субъекта установить переданные времена доступа на переданном vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-proc-sched]]
+==== `mpo_check_proc_sched`
+
+[source, c]
+----
+int mpo_check_proc_sched(struct ucred *ucred, struct proc *proc);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`proc`
+|Объект; процесс
+|
+|===
+
+Определить, могут ли учетные данные субъекта изменить параметры планирования переданного процесса. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки, EPERM при отсутствии привилегий или ESRCH для ограничения видимости.
+
+См. man:setpriority[2] для получения дополнительной информации.
+
+[[mac-mpo-cred-check-proc-signal]]
+==== `mpo_check_proc_signal`
+
+[source, c]
+----
+int mpo_check_proc_signal(struct ucred *cred, struct proc *proc, int signal);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`proc`
+|Объект; процесс
+|
+
+|`signal`
+|Сигнал; см. man:kill[2]
+|
+|===
+
+Определить, могут ли учётные данные субъекта доставить указанный сигнал указанному процессу. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые коды ошибок: EACCES при несоответствии метки, EPERM при недостатке прав или ESRCH для ограничения видимости.
+
+[[mac-mpo-cred-check-vnode-stat]]
+==== `mpo_check_vnode_stat`
+
+[source, c]
+----
+int mpo_check_vnode_stat(struct ucred *cred, struct vnode *vp,
+ struct label *label);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Объект; vnode
+|
+
+|`label`
+|Метка политики для `vp`
+|
+|===
+
+Определить, могут ли учетные данные субъекта выполнять `stat` для переданного vnode. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+См. man:stat[2] для получения дополнительной информации.
+
+[[mac-mpo-cred-check-ifnet-transmit]]
+==== `mpo_check_ifnet_transmit`
+
+[source, c]
+----
+int mpo_check_ifnet_transmit(struct ucred *cred, struct ifnet *ifnet,
+ struct label *ifnetlabel, struct mbuf *mbuf, struct label *mbuflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`ifnet`
+|Сетевой интерфейс
+|
+
+|`ifnetlabel`
+|Метка политики для `ifnet`
+|
+
+|`mbuf`
+|Объект; mbuf для отправки
+|
+
+|`mbuflabel`
+|Метка политики для `mbuf`
+|
+|===
+
+Определить, может ли сетевой интерфейс передать mbuf, переданный в качестве параметра. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-cred-check-socket-deliver]]
+==== `mpo_check_socket_deliver`
+
+[source, c]
+----
+int mpo_check_socket_deliver(struct ucred *cred, struct ifnet *ifnet,
+ struct label *ifnetlabel, struct mbuf *mbuf, struct label *mbuflabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`ifnet`
+|Сетевой интерфейс
+|
+
+|`ifnetlabel`
+|Метка политики для `ifnet`
+|
+
+|`mbuf`
+|Объект; mbuf для доставки
+|
+
+|`mbuflabel`
+|Метка политики для `mbuf`
+|
+|===
+
+Определить, может ли сокет принять датаграмму, хранящуюся в переданном заголовке mbuf. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий.
+
+[[mac-mpo-check-socket-visible]]
+==== `mpo_check_socket_visible`
+
+[source, c]
+----
+int mpo_check_socket_visible(struct ucred *cred, struct socket *so,
+ struct label *socketlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|Неизменяемый
+
+|`so`
+|Объект; сокет
+|
+
+|`socketlabel`
+|Метка политики для `so`
+|
+|===
+
+Определить, могут ли учетные данные субъекта cred "видеть" переданный сокет (`socket`), используя функции системного мониторинга, такие как те, что применяются в man:netstat[8] и man:sockstat[1]. Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии меток, EPERM при отсутствии привилегий или ESRCH для скрытия видимости.
+
+[[mac-mpo-check-system-acct]]
+==== `mpo_check_system_acct`
+
+[source, c]
+----
+int mpo_check_system_acct(struct ucred *ucred, struct vnode *vp,
+ struct label *vlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`ucred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Файл учёта; man:acct[5]
+|
+
+|`vlabel`
+|Метка, связанная с `vp`
+|
+|===
+
+Определить, следует ли разрешить субъекту включение учёта, основываясь на его метке и метке файла журнала учёта.
+
+[[mac-mpo-check-system-nfsd]]
+==== `mpo_check_system_nfsd`
+
+[source, c]
+----
+int mpo_check_system_nfsd(struct ucred *cred);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+|===
+
+Определить, следует ли разрешить субъекту вызывать man:nfssvc[2].
+
+[[mac-mpo-check-system-reboot]]
+==== `mpo_check_system_reboot`
+
+[source, c]
+----
+int mpo_check_system_reboot(struct ucred *cred, int howto);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`howto`
+|Параметр `howto` из man:reboot[2]
+|
+|===
+
+Определить, следует ли разрешить субъекту перезагружать систему указанным способом.
+
+[[mac-mpo-check-system-settime]]
+==== `mpo_check_system_settime`
+
+[source, c]
+----
+int mpo_check_system_settime(struct ucred *cred);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+|===
+
+Определить, разрешено ли пользователю устанавливать системные часы.
+
+[[mac-mpo-check-system-swapon]]
+==== `mpo_check_system_swapon`
+
+[source, c]
+----
+int mpo_check_system_swapon(struct ucred *cred, struct vnode *vp,
+ struct label *vlabel);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`vp`
+|Устройство подкачки
+|
+
+|`vlabel`
+|Метка, связанная с `vp`
+|
+|===
+
+Определить, следует ли разрешить субъекту добавлять `vp` как устройство подкачки.
+
+[[mac-mpo-check-system-sysctl]]
+==== `mpo_check_system_sysctl`
+
+[source, c]
+----
+int mpo_check_system_sysctl(struct ucred *cred, int *name, u_int *namelen,
+ void *old, size_t *oldlenp, int inkernel, void *new, size_t newlen);
+----
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Параметр
+| Описание
+| Блокировка
+
+|`cred`
+|Учетные данные субъекта
+|
+
+|`name`
+|См. man:sysctl[3]
+|
+
+|`namelen`
+|
+|
+
+|`old`
+|
+|
+
+|`oldlenp`
+|
+|
+
+|`inkernel`
+|Логический; `1`, если вызвано из ядра
+|
+
+|`new`
+|См. man:sysctl[3]
+|
+
+|`newlen`
+|
+|
+|===
+
+Определить, следует ли разрешить субъекту выполнять указанную транзакцию man:sysctl[3].
+
+[[mac-label-management]]
+=== Вызовы при управления метками
+
+События изменения метки происходят, когда пользовательский процесс запрашивает изменение метки на объекте. Происходит двухэтапное обновление: сначала выполняется проверка контроля доступа, чтобы определить, является ли обновление допустимым и разрешённым, а затем само обновление выполняется через отдельную точку входа. Точки входа для изменения метки обычно принимают объект, ссылку на метку объекта и новую метку, предоставленную процессом. Выделение памяти во время изменения метки не рекомендуется, так как вызовы изменения метки не могут завершиться неудачей (ошибка должна быть обнаружена ранее на этапе проверки изменения метки).
+
+[[mac-userland-arch]]
+== Пользовательская архитектура
+
+В фреймворк TrustedBSD MAC входит ряд элементов, не зависящих от политик, включая интерфейсы MAC-библиотеки для абстрактного управления метками, изменения в управлении системными учетными данными и библиотеках входа в систему для поддержки назначения MAC-меток пользователям, а также набор инструментов для мониторинга и изменения меток процессов, файлов и сетевых интерфейсов. Более подробная информация о пользовательской архитектуре будет добавлена в этот раздел в ближайшее время.
+
+[[mac-userland-labels]]
+=== API для управления метками, не зависящими от политики
+
+Фреймворк TrustedBSD MAC предоставляет ряд библиотечных и системных вызовов, позволяющих приложениям управлять метками MAC на объектах с использованием политико-независимого интерфейса. Это позволяет приложениям манипулировать метками для различных политик без необходимости поддержки конкретных политик. Эти интерфейсы используются универсальными инструментами, такими как man:ifconfig[8], man:ls[1] и man:ps[1], для просмотра меток на сетевых интерфейсах, файлах и процессах. API также поддерживают инструменты управления MAC, включая man:getfmac[8], man:getpmac[8], man:setfmac[8], man:setfsmac[8] и man:setpmac[8]. API MAC документированы в man:mac[3].
+
+Приложения обрабатывают метки MAC в двух формах: внутренней форме, используемой для возврата и установки меток для процессов и объектов (`mac_t`), и внешней форме, основанной на строках C, подходящих для хранения в конфигурационных файлах, отображения пользователю или ввода от пользователя. Каждая метка MAC содержит ряд элементов, каждый из которых состоит из пары имя-значение. Модули политик в ядре привязываются к определённым именам и интерпретируют значения специфичным для политики образом. Во внешней строковой форме метки представляются списком пар имя-значение, разделённых запятыми и символом `/`. Метки могут быть напрямую преобразованы в текст и обратно с использованием предоставленных API; при извлечении меток из ядра внутреннее хранилище меток должно быть сначала подготовлено для желаемого набора элементов метки. Обычно это делается одним из двух способов: с использованием man:mac_prepare[3] и произвольного списка желаемых элементов метки, или одной из вариаций вызова, который загружает набор элементов по умолчанию из конфигурационного файла man:mac.conf[5]. Значения по умолчанию для каждого объекта позволяют разработчикам приложений удобно отображать метки, связанные с объектами, без необходимости знать о присутствующих в системе политиках.
+
+[NOTE]
+====
+В настоящее время прямое манипулирование элементами меток, кроме как путем преобразования в текстовую строку, редактирования строки и обратного преобразования во внутреннюю метку, не поддерживается библиотекой MAC. Такие интерфейсы могут быть добавлены в будущем, если окажется, что они необходимы разработчикам приложений.
+====
+
+[[mac-userland-credentials]]
+=== Привязка меток к пользователям
+
+Стандартный интерфейс управления контекстом пользователя, man:setusercontext[3], был изменён для получения меток MAC, связанных с классом пользователя, из man:login.conf[5]. Эти метки устанавливаются вместе с остальным контекстом пользователя, когда указан `LOGIN_SETALL` или явно указан `LOGIN_SETMAC`.
+
+[NOTE]
+====
+Ожидается, что в будущей версии FreeBSD база данных меток MAC будет отделена от абстракции классов пользователей [.filename]#login.conf# и будет поддерживаться в отдельной базе данных. Однако API man:setusercontext[3] должно остаться неизменным после такого изменения.
+====
+
+[[mac-conclusion]]
+== Заключение
+
+Фреймворк TrustedBSD MAC позволяет модулям ядра расширять политику безопасности системы высокоинтегрированным способом. Они могут делать это на основе существующих свойств объектов или данных меток, которые поддерживаются с помощью фреймворка MAC. Фреймворк достаточно гибкий для реализации различных типов политик, включая политики безопасности информационных потоков, такие как MLS и Biba, а также политики, основанные на существующих учетных данных BSD или защите файлов. Авторам политик может быть полезно ознакомиться с этой документацией, а также с существующими модулями безопасности при реализации новой службы безопасности.
diff --git a/documentation/content/ru/books/arch-handbook/mac/_index.po b/documentation/content/ru/books/arch-handbook/mac/_index.po
new file mode 100644
index 0000000000..f93f0bf538
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/mac/_index.po
@@ -0,0 +1,8639 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-08-26 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookmac_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:19
+#, no-wrap
+msgid "The TrustedBSD MAC Framework"
+msgstr "Фреймворк TrustedBSD MAC"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1
+#, no-wrap
+msgid "Chapter 6. The TrustedBSD MAC Framework"
+msgstr "Глава 6. Фреймворк TrustedBSD MAC"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:57
+#, no-wrap
+msgid "MAC Documentation Copyright"
+msgstr "Авторские права документации MAC"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:60
+msgid ""
+"This documentation was developed for the FreeBSD Project by Chris Costello "
+"at Safeport Network Services and Network Associates Laboratories, the "
+"Security Research Division of Network Associates, Inc. under DARPA/SPAWAR "
+"contract N66001-01-C-8035 (\"CBOSS\"), as part of the DARPA CHATS research "
+"program."
+msgstr ""
+"Этот документ был разработан для проекта FreeBSD Крисом Костелло из Safeport "
+"Network Services и Network Associates Laboratories, подразделения "
+"исследований безопасности Network Associates, Inc., по контракту DARPA/"
+"SPAWAR N66001-01-C-8035 (\"CBOSS\") в рамках исследовательской программы "
+"DARPA CHATS."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:62
+msgid ""
+"Redistribution and use in source (SGML DocBook) and 'compiled' forms (SGML, "
+"HTML, PDF, PostScript, RTF and so forth) with or without modification, are "
+"permitted provided that the following conditions are met:"
+msgstr ""
+"Redistribution and use in source (SGML DocBook) and 'compiled' forms (SGML, "
+"HTML, PDF, PostScript, RTF and so forth) with or without modification, are "
+"permitted provided that the following conditions are met:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:64
+msgid ""
+"Redistributions of source code (SGML DocBook) must retain the above "
+"copyright notice, this list of conditions and the following disclaimer as "
+"the first lines of this file unmodified."
+msgstr ""
+"Redistributions of source code (SGML DocBook) must retain the above "
+"copyright notice, this list of conditions and the following disclaimer as "
+"the first lines of this file unmodified."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:65
+msgid ""
+"Redistributions in compiled form (transformed to other DTDs, converted to "
+"PDF, PostScript, RTF and other formats) must reproduce the above copyright "
+"notice, this list of conditions and the following disclaimer in the "
+"documentation and/or other materials provided with the distribution."
+msgstr ""
+"Распространение в скомпилированной форме (преобразованное в другие DTD, "
+"конвертированное в PDF, PostScript, RTF и другие форматы) должно включать "
+"указанное выше уведомление об авторских правах, данный список условий и "
+"следующий отказ от ответственности в документации и/или других материалах, "
+"предоставляемых вместе с распространением."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:70
+msgid ""
+"THIS DOCUMENTATION IS PROVIDED BY THE NETWORKS ASSOCIATES TECHNOLOGY, INC "
+"\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED "
+"TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR "
+"PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL NETWORKS ASSOCIATES TECHNOLOGY, "
+"INC BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR "
+"CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF "
+"SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS "
+"INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN "
+"CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) "
+"ARISING IN ANY WAY OUT OF THE USE OF THIS DOCUMENTATION, EVEN IF ADVISED OF "
+"THE POSSIBILITY OF SUCH DAMAGE."
+msgstr ""
+"ЭТА ДОКУМЕНТАЦИЯ ПРЕДОСТАВЛЯЕТСЯ NETWORKS ASSOCIATES TECHNOLOGY, INC «КАК "
+"ЕСТЬ», И ЛЮБЫЕ ЯВНЫЕ ИЛИ ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ, ВКЛЮЧАЯ, НО НЕ "
+"ОГРАНИЧИВАЯСЬ ИМИ, ПОДРАЗУМЕВАЕМЫЕ ГАРАНТИИ ТОВАРНОЙ ПРИГОДНОСТИ И "
+"ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ ОТРИЦАЮТСЯ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ "
+"NETWORKS ASSOCIATES TECHNOLOGY, INC НЕ НЕСЕТ ОТВЕТСТВЕННОСТИ ЗА ЛЮБЫЕ "
+"ПРЯМЫЕ, КОСВЕННЫЕ, СЛУЧАЙНЫЕ, СПЕЦИАЛЬНЫЕ, ШТРАФНЫЕ ИЛИ КОСВЕННЫЕ УБЫТКИ "
+"(ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ, ЗАТРАТЫ НА ЗАМЕНУ ТОВАРОВ ИЛИ УСЛУГ; "
+"ПОТЕРЮ ИСПОЛЬЗОВАНИЯ, ДАННЫХ ИЛИ ПРИБЫЛИ; ЛИБО ПРЕРЫВАНИЕ БИЗНЕСА), "
+"ВЫЗВАННЫЕ ЛЮБЫМ ОБРАЗОМ И НА ОСНОВАНИИ ЛЮБОЙ ТЕОРИИ ОТВЕТСТВЕННОСТИ, БУДЬ ТО "
+"В РАМКАХ ДОГОВОРА, СТРОГОЙ ОТВЕТСТВЕННОСТИ ИЛИ ДЕЛИКТА (ВКЛЮЧАЯ НЕБРЕЖНОСТЬ "
+"ИЛИ ИНОЕ), ВОЗНИКШИЕ ВСЛЕДСТВИЕ ИСПОЛЬЗОВАНИЯ ЭТОЙ ДОКУМЕНТАЦИИ, ДАЖЕ ЕСЛИ "
+"БЫЛО ПРЕДУПРЕЖДЕНИЕ О ВОЗМОЖНОСТИ ТАКИХ УБЫТКОВ."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:73
+#, no-wrap
+msgid "Synopsis"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:78
+msgid ""
+"FreeBSD includes experimental support for several mandatory access control "
+"policies, as well as a framework for kernel security extensibility, the "
+"TrustedBSD MAC Framework. The MAC Framework is a pluggable access control "
+"framework, permitting new security policies to be easily linked into the "
+"kernel, loaded at boot, or loaded dynamically at run-time. The framework "
+"provides a variety of features to make it easier to implement new security "
+"policies, including the ability to easily tag security labels (such as "
+"confidentiality information) onto system objects."
+msgstr ""
+"FreeBSD включает экспериментальную поддержку нескольких политик "
+"обязательного контроля доступа, а также инфраструктуру для расширяемости "
+"безопасности ядра — TrustedBSD MAC Framework. MAC Framework представляет "
+"собой модульную инфраструктуру контроля доступа, позволяющую легко "
+"встраивать новые политики безопасности в ядро, загружать их при старте "
+"системы или динамически во время работы. Инфраструктура предоставляет "
+"множество возможностей для упрощения реализации новых политик безопасности, "
+"включая возможность легко присваивать метки безопасности (например, "
+"информацию о конфиденциальности) объектам системы."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:80
+msgid ""
+"This chapter introduces the MAC policy framework and provides documentation "
+"for a sample MAC policy module."
+msgstr ""
+"Эта глава представляет фреймворк политик MAC и содержит документацию для "
+"образца модуля политики MAC."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:82
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:88
+msgid ""
+"The TrustedBSD MAC framework provides a mechanism to allow the compile-time "
+"or run-time extension of the kernel access control model. New system "
+"policies may be implemented as kernel modules and linked to the kernel; if "
+"multiple policy modules are present, their results will be composed. The "
+"MAC Framework provides a variety of access control infrastructure services "
+"to assist policy writers, including support for transient and persistent "
+"policy-agnostic object security labels. This support is currently "
+"considered experimental."
+msgstr ""
+"Фреймворк TrustedBSD MAC предоставляет механизм для расширения модели "
+"контроля доступа ядра во время компиляции или выполнения. Новые политики "
+"системы могут быть реализованы в виде модулей ядра и связаны с ним; если "
+"присутствуют несколько модулей политик, их результаты будут объединены. "
+"Фреймворк MAC предоставляет различные инфраструктурные сервисы контроля "
+"доступа для помощи разработчикам политик, включая поддержку временных и "
+"постоянных меток безопасности объектов, не зависящих от политик. В настоящее "
+"время эта поддержка считается экспериментальной."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:90
+msgid ""
+"This chapter provides information appropriate for developers of policy "
+"modules, as well as potential consumers of MAC-enabled environments, to "
+"learn about how the MAC Framework supports access control extension of the "
+"kernel."
+msgstr ""
+"Эта глава предоставляет информацию, предназначенную для разработчиков "
+"модулей политик, а также потенциальных пользователей сред с поддержкой MAC, "
+"чтобы узнать о том, как MAC Framework поддерживает расширение контроля "
+"доступа в ядре."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:92
+#, no-wrap
+msgid "Policy Background"
+msgstr "Общие сведения о политиках"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:99
+msgid ""
+"Mandatory Access Control (MAC), refers to a set of access control policies "
+"that are mandatorily enforced on users by the operating system. MAC "
+"policies may be contrasted with Discretionary Access Control (DAC) "
+"protections, by which non-administrative users may (at their discretion) "
+"protect objects. In traditional UNIX systems, DAC protections include file "
+"permissions and access control lists; MAC protections include process "
+"controls preventing inter-user debugging and firewalls. A variety of MAC "
+"policies have been formulated by operating system designers and security "
+"researches, including the Multi-Level Security (MLS) confidentiality policy, "
+"the Biba integrity policy, Role-Based Access Control (RBAC), Domain and Type "
+"Enforcement (DTE), and Type Enforcement (TE). Each model bases decisions on "
+"a variety of factors, including user identity, role, and security clearance, "
+"as well as security labels on objects representing concepts such as data "
+"sensitivity and integrity."
+msgstr ""
+"Мандатное управление доступом (MAC — Mandatory Access Control) относится к "
+"набору политик контроля доступа, которые в обязательном порядке применяются "
+"операционной системой к пользователям. Политики MAC можно противопоставить "
+"защите на основе дискреционного управления доступом (DAC — Discretionary "
+"Access Control), при которой непривилегированные пользователи могут (по "
+"своему усмотрению) защищать объекты. В традиционных UNIX-системах защита DAC "
+"включает права доступа к файлам и списки контроля доступа; защита MAC "
+"включает управление процессами, предотвращающее отладку между "
+"пользователями, и межсетевые экраны. Различные политики MAC были разработаны "
+"создателями операционных систем и исследователями безопасности, включая "
+"политику конфиденциальности многоуровневой безопасности (MLS — Multi-Level "
+"Security), политику целостности Biba, управление доступом на основе ролей "
+"(RBAC — Role-Based Access Control), принудительное применение доменов и "
+"типов (DTE — Domain and Type Enforcement) и принудительное применение типов "
+"(TE — Type Enforcement). Каждая модель основывает решения на различных "
+"факторах, включая идентификатор пользователя, роль и уровень доступа, а "
+"также метки безопасности на объектах, представляющих такие концепции, как "
+"конфиденциальность и целостность данных."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:102
+msgid ""
+"The TrustedBSD MAC Framework is capable of supporting policy modules that "
+"implement all of these policies, as well as a broad class of system "
+"hardening policies, which may use existing security attributes, such as user "
+"and group IDs, as well as extended attributes on files, and other system "
+"properties. In addition, despite the name, the MAC Framework can also be "
+"used to implement purely discretionary policies, as policy modules are given "
+"substantial flexibility in how they authorize protections."
+msgstr ""
+"Фреймворк TrustedBSD MAC способен поддерживать модули политик, реализующие "
+"все эти политики, а также широкий класс политик усиления защиты системы, "
+"которые могут использовать существующие атрибуты безопасности, такие как "
+"идентификаторы пользователей и групп, а также расширенные атрибуты файлов и "
+"другие свойства системы. Кроме того, несмотря на название, фреймворк MAC "
+"также может использоваться для реализации чисто дискреционных политик, "
+"поскольку модулям политик предоставляется значительная гибкость в том, как "
+"они авторизуют защиту."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:104
+#, no-wrap
+msgid "MAC Framework Kernel Architecture"
+msgstr "Архитектура MAC Framework в ядре"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:108
+msgid ""
+"The TrustedBSD MAC Framework permits kernel modules to extend the operating "
+"system security policy, as well as providing infrastructure functionality "
+"required by many access control modules. If multiple policies are "
+"simultaneously loaded, the MAC Framework will usefully (for some definition "
+"of useful) compose the results of the policies."
+msgstr ""
+"Фреймворк TrustedBSD MAC позволяет модулям ядра расширять политику "
+"безопасности операционной системы, а также предоставляет функциональность "
+"инфраструктуры, необходимую многим модулям контроля доступа. Если "
+"одновременно загружено несколько политик, фреймворк MAC полезным образом (в "
+"некотором смысле полезным) объединит результаты этих политик."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:110
+#, no-wrap
+msgid "Kernel Elements"
+msgstr "Элементы ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:113
+msgid "The MAC Framework contains a number of kernel elements:"
+msgstr "В рамках MAC Framework реализован ряд элементов ядра:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:115
+msgid "Framework management interfaces"
+msgstr "Интерфейсы управления фреймворком"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:116
+msgid "Concurrency and synchronization primitives."
+msgstr "Параллелизм и примитивы синхронизации."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:117
+msgid "Policy registration"
+msgstr "Регистрация политики"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:118
+msgid "Extensible security label for kernel objects"
+msgstr "Расширяемая метка безопасности для объектов ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:119
+msgid "Policy entry point composition operators"
+msgstr "Операторы композиции точки входа политики"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:120
+msgid "Label management primitives"
+msgstr "Примитивы управления метками"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:121
+msgid "Entry point API invoked by kernel services"
+msgstr "Точка входа API, вызываемая службами ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:122
+msgid "Entry point API to policy modules"
+msgstr "Точка входа API для модулей политик"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:123
+msgid ""
+"Entry points implementations (policy life cycle, object life cycle/label "
+"management, access control checks)."
+msgstr ""
+"Реализации точек входа (жизненный цикл политики, жизненный цикл объекта/"
+"управление метками, проверки контроля доступа)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:124
+msgid "Policy-agnostic label-management system calls"
+msgstr "Системные вызовы, независимые от политик, для управления метками"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:125
+msgid "`mac_syscall()` multiplex system call"
+msgstr "`mac_syscall()` мультиплексный системный вызов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:126
+msgid "Various security policies implemented as MAC policy modules"
+msgstr ""
+"Различные политики безопасности, реализованные в виде модулей политики MAC"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:128
+#, no-wrap
+msgid "Framework Management Interfaces"
+msgstr "Интерфейсы управления фреймворком"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:131
+msgid ""
+"The TrustedBSD MAC Framework may be directly managed using sysctl's, loader "
+"tunables, and system calls."
+msgstr ""
+"Фреймворком TrustedBSD MAC можно напрямую управлять с помощью sysctl, "
+"параметров загрузчика и системных вызовов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:136
+msgid ""
+"In most cases, sysctl's and loader tunables of the same name modify the same "
+"parameters, and control behavior such as enforcement of protections relating "
+"to various kernel subsystems. In addition, if MAC debugging support is "
+"compiled into the kernel, several counters will be maintained tracking label "
+"allocation. It is generally advisable that per-subsystem enforcement "
+"controls not be used to control policy behavior in production environments, "
+"as they broadly impact the operation of all active policies. Instead, per-"
+"policy controls should be preferred, as they provide greater granularity and "
+"greater operational consistency for policy modules."
+msgstr ""
+"В большинстве случаев одноимённые параметры sysctl и настройки загрузчика "
+"изменяют одни и те же параметры и управляют поведением, таким как применение "
+"защитных механизмов, связанных с различными подсистемами ядра. Кроме того, "
+"если в ядро включена поддержка отладки MAC, будет вестись несколько "
+"счётчиков для отслеживания выделения меток. Обычно рекомендуется не "
+"использовать общие настройки подсистем для управления поведением политик в "
+"рабочих средах, так как они широко влияют на работу всех активных политик. "
+"Вместо этого следует предпочитать настройки отдельных политик, поскольку они "
+"обеспечивают более высокую детализацию и большую операционную "
+"согласованность для модулей политик."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:138
+msgid ""
+"Loading and unloading of policy modules is performed using the system module "
+"management system calls and other system interfaces, including boot loader "
+"variables; policy modules will have the opportunity to influence load and "
+"unload events, including preventing undesired unloading of the policy."
+msgstr ""
+"Загрузка и выгрузка модулей политики выполняется с использованием системных "
+"вызовов управления модулями и других системных интерфейсов, включая "
+"переменные загрузчика; модули политики получат возможность влиять на события "
+"загрузки и выгрузки, включая предотвращение нежелательной выгрузки политики."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:140
+#, no-wrap
+msgid "Policy List Concurrency and Synchronization"
+msgstr "Список политик параллелизма и синхронизации"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:147
+msgid ""
+"As the set of active policies may change at run-time, and the invocation of "
+"entry points is non-atomic, synchronization is required to prevent loading "
+"or unloading of policies while an entry point invocation is in progress, "
+"freezing the set of active policies for the duration. This is accomplished "
+"by means of a framework busy count: whenever an entry point is entered, the "
+"busy count is incremented; whenever it is exited, the busy count is "
+"decremented. While the busy count is elevated, policy list changes are not "
+"permitted, and threads attempting to modify the policy list will sleep until "
+"the list is not busy. The busy count is protected by a mutex, and a "
+"condition variable is used to wake up sleepers waiting on policy list "
+"modifications. One side effect of this synchronization model is that "
+"recursion into the MAC Framework from within a policy module is permitted, "
+"although not generally used."
+msgstr ""
+"Поскольку набор активных политик может изменяться во время выполнения, а "
+"вызов точек входа не является атомарным, требуется синхронизация для "
+"предотвращения загрузки или выгрузки политик во время выполнения вызова "
+"точки входа, фиксируя набор активных политик на время выполнения. Это "
+"достигается с помощью счетчика занятости фреймворка: при входе в точку входа "
+"счетчик увеличивается; при выходе из нее — уменьшается. Пока счетчик "
+"занятости повышен, изменения списка политик запрещены, и потоки, пытающиеся "
+"изменить список политик, будут ждать, пока список не освободится. Счетчик "
+"занятости защищается мьютексом, а условная переменная используется для "
+"пробуждения потоков, ожидающих изменений списка политик. Побочным эффектом "
+"этой модели синхронизации является то, что рекурсивный вход в MAC Framework "
+"из модуля политики разрешен, хотя обычно не используется."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:150
+msgid ""
+"Various optimizations are used to reduce the overhead of the busy count, "
+"including avoiding the full cost of incrementing and decrementing if the "
+"list is empty or contains only static entries (policies that are loaded "
+"before the system starts, and cannot be unloaded). A compile-time option is "
+"also provided which prevents any change in the set of loaded policies at run-"
+"time, which eliminates the mutex locking costs associated with supporting "
+"dynamically loaded and unloaded policies as synchronization is no longer "
+"required."
+msgstr ""
+"Для снижения накладных расходов счётчика занятости используются различные "
+"оптимизации, включая избегание полной стоимости увеличения и уменьшения, "
+"если список пуст или содержит только статические записи (политики, "
+"загруженные до старта системы, которые нельзя выгрузить). Также "
+"предоставляется опция на этапе компиляции, которая предотвращает любые "
+"изменения в наборе загруженных политик во время выполнения, что устраняет "
+"затраты на блокировку мьютексов, связанные с поддержкой динамически "
+"загружаемых и выгружаемых политик, поскольку синхронизация больше не "
+"требуется."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:152
+msgid ""
+"As the MAC Framework is not permitted to block in some entry points, a "
+"normal sleep lock cannot be used; as a result, it is possible for the load "
+"or unload attempt to block for a substantial period of time waiting for the "
+"framework to become idle."
+msgstr ""
+"Поскольку MAC Framework не может блокировать некоторые точки входа, обычная "
+"блокировка сна не может быть использована; в результате попытка загрузки или "
+"выгрузки может блокироваться на значительное время, ожидая, пока фреймворк "
+"станет свободным."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:154
+#, no-wrap
+msgid "Label Synchronization"
+msgstr "Синхронизация меток"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:161
+msgid ""
+"As kernel objects of interest may generally be accessed from more than one "
+"thread at a time, and simultaneous entry of more than one thread into the "
+"MAC Framework is permitted, security attribute storage maintained by the MAC "
+"Framework is carefully synchronized. In general, existing kernel "
+"synchronization on kernel object data is used to protect MAC Framework "
+"security labels on the object: for example, MAC labels on sockets are "
+"protected using the existing socket mutex. Likewise, semantics for "
+"concurrent access are generally identical to those of the container objects: "
+"for credentials, copy-on-write semantics are maintained for label contents "
+"as with the remainder of the credential structure. The MAC Framework "
+"asserts necessary locks on objects when invoked with an object reference. "
+"Policy authors must be aware of these synchronization semantics, as they "
+"will sometimes limit the types of accesses permitted on labels: for example, "
+"when a read-only reference to a credential is passed to a policy via an "
+"entry point, only read operations are permitted on the label state attached "
+"to the credential."
+msgstr ""
+"Поскольку к объектам ядра обычно может обращаться более одного потока "
+"одновременно, и допускается одновременный вход нескольких потоков в MAC "
+"Framework, хранение атрибутов безопасности, поддерживаемое MAC Framework, "
+"тщательно синхронизировано. Как правило, существующая синхронизация ядра для "
+"данных объектов ядра используется для защиты меток безопасности MAC "
+"Framework на объекте: например, метки MAC на сокетах защищаются с помощью "
+"существующего мьютекса сокета. Аналогично, семантика параллельного доступа "
+"обычно идентична семантике контейнерных объектов: для учетных данных "
+"поддерживается семантика копирования при записи для содержимого меток, как и "
+"для остальной структуры учетных данных. MAC Framework устанавливает "
+"необходимые блокировки на объекты при вызове с ссылкой на объект. Авторам "
+"политик необходимо учитывать эти семантики синхронизации, так как они иногда "
+"ограничивают типы доступа к меткам: например, когда ссылка только для чтения "
+"на учетные данные передается политике через точку входа, разрешены только "
+"операции чтения для состояния метки, прикрепленного к учетным данным."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:163
+#, no-wrap
+msgid "Policy Synchronization and Concurrency"
+msgstr "Синхронизация политики и параллелизм"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:169
+msgid ""
+"Policy modules must be written to assume that many kernel threads may "
+"simultaneously enter one more policy entry points due to the parallel and "
+"preemptive nature of the FreeBSD kernel. If the policy module makes use of "
+"mutable state, this may require the use of synchronization primitives within "
+"the policy to prevent inconsistent views on that state resulting in "
+"incorrect operation of the policy. Policies will generally be able to make "
+"use of existing FreeBSD synchronization primitives for this purpose, "
+"including mutexes, sleep locks, condition variables, and counting "
+"semaphores. However, policies should be written to employ these primitives "
+"carefully, respecting existing kernel lock orders, and recognizing that some "
+"entry points are not permitted to sleep, limiting the use of primitives in "
+"those entry points to mutexes and wakeup operations."
+msgstr ""
+"Модули политик должны быть написаны с учетом того, что множество потоков "
+"ядра могут одновременно войти в одну или несколько точек входа политики из-"
+"за параллельной и вытесняющей природы ядра FreeBSD. Если модуль политики "
+"использует изменяемое состояние, это может потребовать применения примитивов "
+"синхронизации внутри политики, чтобы предотвратить несогласованные "
+"представления этого состояния, ведущие к некорректной работе политики. "
+"Политики, как правило, могут использовать существующие примитивы "
+"синхронизации FreeBSD для этой цели, включая мьютексы, блокировки с "
+"ожиданием, условные переменные и счётные семафоры. Однако политики должны "
+"быть написаны так, чтобы применять эти примитивы осторожно, соблюдая "
+"существующие порядки блокировок в ядре и учитывая, что некоторые точки входа "
+"не допускают ожидания, ограничивая использование примитивов в этих точках "
+"входа мьютексами и операциями пробуждения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:172
+msgid ""
+"When policy modules call out to other kernel subsystems, they will generally "
+"need to release any in-policy locks in order to avoid violating the kernel "
+"lock order or risking lock recursion. This will maintain policy locks as "
+"leaf locks in the global lock order, helping to avoid deadlock."
+msgstr ""
+"Когда модули политики обращаются к другим подсистемам ядра, они обычно "
+"должны освобождать любые блокировки внутри политики, чтобы избежать "
+"нарушения порядка блокировок ядра или риска рекурсивных блокировок. Это "
+"позволит сохранить блокировки политики как конечные блокировки в глобальном "
+"порядке блокировок, помогая избежать взаимоблокировки."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:174
+#, no-wrap
+msgid "Policy Registration"
+msgstr "Регистрация политики"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:181
+msgid ""
+"The MAC Framework maintains two lists of active policies: a static list, and "
+"a dynamic list. The lists differ only with regards to their locking "
+"semantics: an elevated reference count is not required to make use of the "
+"static list. When kernel modules containing MAC Framework policies are "
+"loaded, the policy module will use `SYSINIT` to invoke a registration "
+"function; when a policy module is unloaded, `SYSINIT` will likewise invoke a "
+"de-registration function. Registration may fail if a policy module is "
+"loaded more than once, if insufficient resources are available for the "
+"registration (for example, the policy might require labeling and "
+"insufficient labeling state might be available), or other policy "
+"prerequisites might not be met (some policies may only be loaded prior to "
+"boot). Likewise, de-registration may fail if a policy is flagged as not "
+"unloadable."
+msgstr ""
+"Фреймворк MAC поддерживает два списка активных политик: статический список и "
+"динамический список. Списки отличаются только в отношении их семантики "
+"блокировки: для использования статического списка не требуется повышенный "
+"счетчик ссылок. Когда загружаются модули ядра, содержащие политики "
+"фреймворка MAC, модуль политики использует `SYSINIT` для вызова функции "
+"регистрации; когда модуль политики выгружается, `SYSINIT` аналогично "
+"вызывает функцию отмены регистрации. Регистрация может завершиться неудачей, "
+"если модуль политики загружается более одного раза, если для регистрации "
+"недостаточно ресурсов (например, политика может требовать маркировки, а "
+"доступного состояния маркировки может быть недостаточно), или другие "
+"предварительные условия политики могут не выполняться (некоторые политики "
+"могут быть загружены только до загрузки системы). Аналогично, отмена "
+"регистрации может завершиться неудачей, если политика помечена как "
+"невыгружаемая."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:183
+#, no-wrap
+msgid "Entry Points"
+msgstr "Точки входа"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:190
+msgid ""
+"Kernel services interact with the MAC Framework in two ways: they invoke a "
+"series of APIs to notify the framework of relevant events, and they provide "
+"a policy-agnostic label structure pointer in security-relevant objects. The "
+"label pointer is maintained by the MAC Framework via label management entry "
+"points, and permits the Framework to offer a labeling service to policy "
+"modules through relatively non-invasive changes to the kernel subsystem "
+"maintaining the object. For example, label pointers have been added to "
+"processes, process credentials, sockets, pipes, vnodes, Mbufs, network "
+"interfaces, IP reassembly queues, and a variety of other security-relevant "
+"structures. Kernel services also invoke the MAC Framework when they perform "
+"important security decisions, permitting policy modules to augment those "
+"decisions based on their own criteria (possibly including data stored in "
+"security labels). Most of these security critical decisions will be "
+"explicit access control checks; however, some affect more general decision "
+"functions such as packet matching for sockets and label transition at "
+"program execution."
+msgstr ""
+"Ядро взаимодействует с MAC Framework двумя способами: вызывает набор API для "
+"уведомления фреймворка о соответствующих событиях и предоставляет указатель "
+"на структуру меток, не зависящую от политики, в объектах, связанных с "
+"безопасностью. Указатель метки управляется MAC Framework через точки входа "
+"управления метками, что позволяет фреймворку предоставлять службу маркировки "
+"модулям политик с относительно минимальными изменениями в подсистеме ядра, "
+"управляющей объектом. Например, указатели меток были добавлены к процессам, "
+"учетным данным процессов, сокетам, каналам, vnode, Mbuf, сетевым "
+"интерфейсам, очередям сборки IP-пакетов и множеству других структур, "
+"связанных с безопасностью. Ядро также вызывает MAC Framework при принятии "
+"важных решений по безопасности, позволяя модулям политик дополнять эти "
+"решения на основе собственных критериев (включая, возможно, данные, "
+"хранящиеся в метках безопасности). Большинство этих критически важных "
+"решений по безопасности будут явными проверками контроля доступа; однако "
+"некоторые влияют на более общие функции принятия решений, такие как "
+"сопоставление пакетов для сокетов и переход меток при выполнении программы."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:192
+#, no-wrap
+msgid "Policy Composition"
+msgstr "Композиция политик"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:200
+msgid ""
+"When more than one policy module is loaded into the kernel at a time, the "
+"results of the policy modules will be composed by the framework using a "
+"composition operator. This operator is currently hard-coded, and requires "
+"that all active policies must approve a request for it to return success. "
+"As policies may return a variety of error conditions (success, access "
+"denied, object does not exist, ...), a precedence operator selects the "
+"resulting error from the set of errors returned by policies. In general, "
+"errors indicating that an object does not exist will be preferred to errors "
+"indicating that access to an object is denied. While it is not guaranteed "
+"that the resulting composition will be useful or secure, we have found that "
+"it is for many useful selections of policies. For example, traditional "
+"trusted systems often ship with two or more policies using a similar "
+"composition."
+msgstr ""
+"Когда в ядро загружено более одного модуля политики одновременно, результаты "
+"работы модулей политики будут объединены фреймворком с использованием "
+"оператора композиции. Этот оператор в настоящее время жёстко закодирован и "
+"требует, чтобы все активные политики одобрили запрос для возврата успешного "
+"результата. Поскольку политики могут возвращать различные условия ошибки "
+"(успех, доступ запрещён, объект не существует, ...), оператор старшинства "
+"выбирает результирующую ошибку из набора ошибок, возвращаемых политиками. В "
+"общем случае, ошибки, указывающие на то, что объект не существует, будут "
+"предпочтительнее ошибок, указывающих на запрет доступа к объекту. Хотя не "
+"гарантируется, что результирующая композиция будет полезной или безопасной, "
+"мы обнаружили, что это так для многих полезных наборов политик. Например, "
+"традиционные доверенные системы часто поставляются с двумя или более "
+"политиками, использующими аналогичную композицию."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:202
+#, no-wrap
+msgid "Labeling Support"
+msgstr "Поддержка меток"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:208
+msgid ""
+"As many interesting access control extensions rely on security labels on "
+"objects, the MAC Framework provides a set of policy-agnostic label "
+"management system calls covering a variety of user-exposed objects. Common "
+"label types include partition identifiers, sensitivity labels, integrity "
+"labels, compartments, domains, roles, and types. By policy agnostic, we "
+"mean that policy modules are able to completely define the semantics of meta-"
+"data associated with an object. Policy modules participate in the "
+"internalization and externalization of string-based labels provides by user "
+"applications, and can expose multiple label elements to applications if "
+"desired."
+msgstr ""
+"Поскольку многие интересные расширения контроля доступа зависят от меток "
+"безопасности объектов, MAC Framework предоставляет набор системных вызовов "
+"для управления метками, не зависящих от политик, охватывающих различные "
+"объекты, доступные пользователю. Общие типы меток включают идентификаторы "
+"разделов, метки конфиденциальности, метки целостности, отделы (compartment), "
+"домены, роли и типы. Под \"не зависящими от политик\" подразумевается, что "
+"модули политик могут полностью определять семантику метаданных, связанных с "
+"объектом. Модули политик участвуют в интернализации и экстернализации "
+"строковых меток, предоставляемых пользовательскими приложениями, и могут при "
+"необходимости предоставлять приложениям несколько элементов меток."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:216
+msgid ""
+"In-memory labels are stored in slab-allocated `struct label`, which consists "
+"of a fixed-length array of unions, each holding a `void *` pointer and a "
+"`long`. Policies registering for label storage will be assigned a \"slot\" "
+"identifier, which may be used to dereference the label storage. The "
+"semantics of the storage are left entirely up to the policy module: modules "
+"are provided with a variety of entry points associated with the kernel "
+"object life cycle, including initialization, association/creation, and "
+"destruction. Using these interfaces, it is possible to implement reference "
+"counting and other storage models. Direct access to the object structure is "
+"generally not required by policy modules to retrieve a label, as the MAC "
+"Framework generally passes both a pointer to the object and a direct pointer "
+"to the object's label into entry points. The primary exception to this rule "
+"is the process credential, which must be manually dereferenced to access the "
+"credential label. This may change in future revisions of the MAC Framework."
+msgstr ""
+"Метки в памяти хранятся в `struct label`, выделяемой через slab-аллокатор. "
+"Эта структура состоит из массива фиксированной длины, содержащего "
+"объединения, каждое из которых хранит указатель `void *` и значение типа "
+"`long`. Политикам, регистрирующим хранилище меток, назначается идентификатор "
+"\"слота\", который может использоваться для разыменования хранилища меток. "
+"Семантика хранилища полностью определяется модулем политики: модулям "
+"предоставляется набор точек входа, связанных с жизненным циклом объектов "
+"ядра, включая инициализацию, связывание/создание и уничтожение. Используя "
+"эти интерфейсы, можно реализовать подсчёт ссылок и другие модели хранения. "
+"Прямой доступ к структуре объекта, как правило, не требуется модулям "
+"политики для получения метки, поскольку MAC Framework обычно передаёт в "
+"точки входа как указатель на объект, так и прямой указатель на метку "
+"объекта. Основным исключением из этого правила являются учётные данные "
+"процесса, для доступа к метке которых требуется ручное разыменование. Это "
+"может измениться в будущих версиях MAC Framework."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:223
+msgid ""
+"Initialization entry points frequently include a sleeping disposition flag "
+"indicating whether or not an initialization is permitted to sleep; if "
+"sleeping is not permitted, a failure may be returned to cancel allocation of "
+"the label (and hence object). This may occur, for example, in the network "
+"stack during interrupt handling, where sleeping is not permitted, or while "
+"the caller holds a mutex. Due to the performance cost of maintaining labels "
+"on in-flight network packets (Mbufs), policies must specifically declare a "
+"requirement that Mbuf labels be allocated. Dynamically loaded policies "
+"making use of labels must be able to handle the case where their init "
+"function has not been called on an object, as objects may already exist when "
+"the policy is loaded. The MAC Framework guarantees that uninitialized label "
+"slots will hold a 0 or NULL value, which policies may use to detect "
+"uninitialized values. However, as allocation of Mbuf labels is conditional, "
+"policies must also be able to handle a NULL label pointer for Mbufs if they "
+"have been loaded dynamically."
+msgstr ""
+"Входные точки инициализации часто включают флаг режима сна, указывающий, "
+"разрешено ли инициализации переходить в режим сна; если сон не разрешен, "
+"может быть возвращена ошибка для отмены выделения метки (и, следовательно, "
+"объекта). Это может произойти, например, в сетевом стеке во время обработки "
+"прерывания, где сон не разрешен, или пока вызывающий удерживает мьютекс. Из-"
+"за затрат производительности на поддержание меток на передаваемых сетевых "
+"пакетах (Mbuf), политики должны явно объявлять требование о выделении меток "
+"для Mbuf. Динамически загружаемые политики, использующие метки, должны быть "
+"способны обрабатывать случай, когда их функция инициализации не была вызвана "
+"для объекта, так как объекты могут уже существовать при загрузке политики. "
+"MAC Framework гарантирует, что неинициализированные слоты меток будут "
+"содержать значение 0 или NULL, что политики могут использовать для "
+"обнаружения неинициализированных значений. Однако, поскольку выделение меток "
+"для Mbuf условно, политики также должны быть способны обрабатывать указатель "
+"на метку NULL для Mbuf, если они были загружены динамически."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:229
+msgid ""
+"In the case of file system labels, special support is provided for the "
+"persistent storage of security labels in extended attributes. Where "
+"available, extended attribute transactions are used to permit consistent "
+"compound updates of security labels on vnodes--currently this support is "
+"present only in the UFS2 file system. Policy authors may choose to "
+"implement multilabel file system object labels using one (or more) extended "
+"attributes. For efficiency reasons, the vnode label (`v_label`) is a cache "
+"of any on-disk label; policies are able to load values into the cache when "
+"the vnode is instantiated, and update the cache as needed. As a result, the "
+"extended attribute need not be directly accessed with every access control "
+"check."
+msgstr ""
+"В случае меток файловых систем предусмотрена специальная поддержка для "
+"постоянного хранения меток безопасности в расширенных атрибутах. Там, где "
+"это возможно, используются транзакции расширенных атрибутов, чтобы "
+"обеспечить согласованные составные обновления меток безопасности на vnode — "
+"в настоящее время такая поддержка присутствует только в файловой системе "
+"UFS2. Авторы политик могут выбрать реализацию многометочных меток объектов "
+"файловой системы с использованием одного (или нескольких) расширенных "
+"атрибутов. По соображениям эффективности метка vnode (`v_label`) является "
+"кэшем любой метки на диске; политики могут загружать значения в кэш при "
+"создании vnode и обновлять кэш по мере необходимости. В результате нет "
+"необходимости напрямую обращаться к расширенному атрибуту при каждой "
+"проверке контроля доступа."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:233
+msgid ""
+"Currently, if a labeled policy permits dynamic unloading, its state slot "
+"cannot be reclaimed, which places a strict (and relatively low) bound on the "
+"number of unload-reload operations for labeled policies."
+msgstr ""
+"В настоящее время, если помеченная политика разрешает динамическую выгрузку, "
+"её слот состояния не может быть освобождён, что накладывает строгое (и "
+"относительно низкое) ограничение на количество операций выгрузки-"
+"перезагрузки для помеченных политик."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:236
+#, no-wrap
+msgid "System Calls"
+msgstr "Системные вызовы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:239
+msgid ""
+"The MAC Framework implements a number of system calls: most of these calls "
+"support the policy-agnostic label retrieval and manipulation APIs exposed to "
+"user applications."
+msgstr ""
+"В рамках MAC Framework реализован ряд системных вызовов: большинство из них "
+"поддерживают API для получения и управления метками, не зависящий от "
+"политики и доступный пользовательским приложениям."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:245
+msgid ""
+"The label management calls accept a label description structure, `struct "
+"mac`, which contains a series of MAC label elements. Each element contains "
+"a character string name, and character string value. Each policy will be "
+"given the chance to claim a particular element name, permitting policies to "
+"expose multiple independent elements if desired. Policy modules perform the "
+"internalization and externalization between kernel labels and user-provided "
+"labels via entry points, permitting a variety of semantics. Label "
+"management system calls are generally wrapped by user library functions to "
+"perform memory allocation and error handling, simplifying user applications "
+"that must manage labels."
+msgstr ""
+"Вызовы управления метками принимают структуру описания метки `struct mac`, "
+"которая содержит серию элементов метки MAC. Каждый элемент содержит строку с "
+"именем и строку со значением. Каждой политике будет предоставлена "
+"возможность запросить определённое имя элемента, позволяя политикам "
+"предоставлять несколько независимых элементов, если это необходимо. Модули "
+"политик выполняют интернализацию и экстернализацию между метками ядра и "
+"метками, предоставленными пользователем, через точки входа, что позволяет "
+"использовать различные семантики. Системные вызовы управления метками обычно "
+"обёрнуты в функции пользовательской библиотеки для выполнения выделения "
+"памяти и обработки ошибок, упрощая пользовательские приложения, которые "
+"должны управлять метками."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:247
+msgid ""
+"The following MAC-related system calls are present in the FreeBSD kernel:"
+msgstr "В ядре FreeBSD есть следующие системные вызовы, связанные с MAC:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:249
+msgid ""
+"`mac_get_proc()` may be used to retrieve the label of the current process."
+msgstr ""
+"`mac_get_proc()` может использоваться для получения метки текущего процесса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:250
+msgid ""
+"`mac_set_proc()` may be used to request a change in the label of the current "
+"process."
+msgstr ""
+"`mac_set_proc()` может использоваться, чтобы запросить изменение метки "
+"текущего процесса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:251
+msgid ""
+"`mac_get_fd()` may be used to retrieve the label of an object (file, socket, "
+"pipe, ...) referenced by a file descriptor."
+msgstr ""
+"`mac_get_fd()` может использоваться для получения метки объекта (файл, "
+"сокет, канал, ...), на который ссылается файловый дескриптор."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:252
+msgid ""
+"`mac_get_file()` may be used to retrieve the label of an object referenced "
+"by a file system path."
+msgstr ""
+"`mac_get_file()` может использоваться для получения метки объекта, на "
+"который ссылается путь в файловой системе."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:253
+msgid ""
+"`mac_set_fd()` may be used to request a change in the label of an object "
+"(file, socket, pipe, ...) referenced by a file descriptor."
+msgstr ""
+"`mac_set_fd()` может использоваться для запроса изменения метки объекта "
+"(файл, сокет, канал, ...), на который ссылается файловый дескриптор."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:254
+msgid ""
+"`mac_set_file()` may be used to request a change in the label of an object "
+"referenced by a file system path."
+msgstr ""
+"`mac_set_file()` может использоваться для запроса изменения метки объекта, "
+"указанного по пути в файловой системе."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:255
+msgid ""
+"`mac_syscall()` permits policy modules to create new system calls without "
+"modifying the system call table; it accepts a target policy name, operation "
+"number, and opaque argument for use by the policy."
+msgstr ""
+"`mac_syscall()` позволяет модулям политик создавать новые системные вызовы "
+"без изменения таблицы системных вызовов; она принимает имя целевой политики, "
+"номер операции и непрозрачный аргумент для использования политикой."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:256
+msgid ""
+"`mac_get_pid()` may be used to request the label of another process by "
+"process id."
+msgstr ""
+"`mac_get_pid()` может использоваться для запроса метки другого процесса по "
+"его идентификатору."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:257
+msgid ""
+"`mac_get_link()` is identical to `mac_get_file()`, only it will not follow a "
+"symbolic link if it is the final entry in the path, so may be used to "
+"retrieve the label on a symlink."
+msgstr ""
+"`mac_get_link()` идентична `mac_get_file()`, но не переходит по "
+"символической ссылке, если она является конечным элементом пути, поэтому "
+"может использоваться для получения метки на символьной ссылке."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:258
+msgid ""
+"`mac_set_link()` is identical to `mac_set_file()`, only it will not follow a "
+"symbolic link if it is the final entry in a path, so may be used to "
+"manipulate the label on a symlink."
+msgstr ""
+"`mac_set_link()` идентична `mac_set_file()`, за исключением того, что она не "
+"следует по символической ссылке, если это конечный элемент пути, поэтому "
+"может использоваться для изменения метки на символьной ссылке."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:260
+msgid ""
+"`mac_execve()` is identical to the `execve()` system call, only it also "
+"accepts a requested label to set the process label to when beginning "
+"execution of a new program. This change in label on execution is referred "
+"to as a \"transition\"."
+msgstr ""
+"`mac_execve()` идентична системному вызову `execve()`, но также принимает "
+"запрошенную метку, которая будет установлена для процесса при начале "
+"выполнения новой программы. Это изменение метки при выполнении называется "
+"\"переходом\"."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:261
+msgid ""
+"`mac_get_peer()`, actually implemented via a socket option, retrieves the "
+"label of a remote peer on a socket, if available."
+msgstr ""
+"`mac_get_peer()`, фактически реализованный через параметр сокета, извлекает "
+"метку удалённого узла на сокете, если она доступна."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:263
+msgid ""
+"In addition to these system calls, the `SIOCSIGMAC` and `SIOCSIFMAC` network "
+"interface ioctls permit the labels on network interfaces to be retrieved and "
+"set."
+msgstr ""
+"В дополнение к этим системным вызовам, сетевые ioctl-команды `SIOCSIGMAC` и "
+"`SIOCSIFMAC` позволяют получать и устанавливать метки на сетевых интерфейсах."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:265
+#, no-wrap
+msgid "MAC Policy Architecture"
+msgstr "Архитектура политик MAC"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:270
+msgid ""
+"Security policies are either linked directly into the kernel, or compiled "
+"into loadable kernel modules that may be loaded at boot, or dynamically "
+"using the module loading system calls at runtime. Policy modules interact "
+"with the system through a set of declared entry points, providing access to "
+"a stream of system events and permitting the policy to influence access "
+"control decisions. Each policy contains a number of elements:"
+msgstr ""
+"Политики безопасности либо непосредственно встроены в ядро, либо "
+"скомпилированы в загружаемые модули ядра, которые могут быть загружены при "
+"загрузке системы или динамически с использованием системных вызовов загрузки "
+"модулей во время выполнения. Модули политик взаимодействуют с системой через "
+"набор объявленных точек входа, предоставляя доступ к потоку системных "
+"событий и позволяя политике влиять на решения контроля доступа. Каждая "
+"политика содержит ряд элементов:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:272
+msgid "Optional configuration parameters for policy."
+msgstr "Необязательные параметры конфигурации для политики."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:273
+msgid "Centralized implementation of the policy logic and parameters."
+msgstr "Централизованная реализация логики политики и параметров."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:274
+msgid ""
+"Optional implementation of policy life cycle events, such as initialization "
+"and destruction."
+msgstr ""
+"Необязательная реализация событий жизненного цикла политики, таких как "
+"инициализация и уничтожение."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:275
+msgid ""
+"Optional support for initializing, maintaining, and destroying labels on "
+"selected kernel objects."
+msgstr ""
+"Необязательная поддержка инициализации, обслуживания и удаления меток на "
+"выбранных объектах ядра."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:276
+msgid ""
+"Optional support for user process inspection and modification of labels on "
+"selected objects."
+msgstr ""
+"Дополнительная поддержка проверки процессов пользователя и изменения меток "
+"на выбранных объектах."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:277
+msgid ""
+"Implementation of selected access control entry points that are of interest "
+"to the policy."
+msgstr ""
+"Реализация выбранных точек входа контроля доступа, представляющих интерес "
+"для политики."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:278
+msgid ""
+"Declaration of policy identity, module entry points, and policy properties."
+msgstr ""
+"Объявление идентификатора политики, точек входа модуля и свойств политики."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:280
+#, no-wrap
+msgid "Policy Declaration"
+msgstr "Объявление политики"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:283
+msgid ""
+"Modules may be declared using the `MAC_POLICY_SET()` macro, which names the "
+"policy, provides a reference to the MAC entry point vector, provides load-"
+"time flags determining how the policy framework should handle the policy, "
+"and optionally requests the allocation of label state by the framework."
+msgstr ""
+"Модули могут быть объявлены с использованием макроса `MAC_POLICY_SET()`, "
+"который задаёт имя политики, предоставляет ссылку на вектор точек входа MAC, "
+"указывает флаги загрузки, определяющие, как фреймворк политик должен "
+"обрабатывать политику, и при необходимости запрашивает выделение состояния "
+"метки фреймворком."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:297
+#, no-wrap
+msgid ""
+"static struct mac_policy_ops mac_policy_ops =\n"
+"{\n"
+" .mpo_destroy = mac_policy_destroy,\n"
+" .mpo_init = mac_policy_init,\n"
+" .mpo_init_bpfdesc_label = mac_policy_init_bpfdesc_label,\n"
+" .mpo_init_cred_label = mac_policy_init_label,\n"
+"/* ... */\n"
+" .mpo_check_vnode_setutimes = mac_policy_check_vnode_setutimes,\n"
+" .mpo_check_vnode_stat = mac_policy_check_vnode_stat,\n"
+" .mpo_check_vnode_write = mac_policy_check_vnode_write,\n"
+"};\n"
+msgstr ""
+"static struct mac_policy_ops mac_policy_ops =\n"
+"{\n"
+" .mpo_destroy = mac_policy_destroy,\n"
+" .mpo_init = mac_policy_init,\n"
+" .mpo_init_bpfdesc_label = mac_policy_init_bpfdesc_label,\n"
+" .mpo_init_cred_label = mac_policy_init_label,\n"
+"/* ... */\n"
+" .mpo_check_vnode_setutimes = mac_policy_check_vnode_setutimes,\n"
+" .mpo_check_vnode_stat = mac_policy_check_vnode_stat,\n"
+" .mpo_check_vnode_write = mac_policy_check_vnode_write,\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:306
+msgid ""
+"The MAC policy entry point vector, `mac__policy__ops` in this example, "
+"associates functions defined in the module with specific entry points. A "
+"complete listing of available entry points and their prototypes may be found "
+"in the MAC entry point reference section. Of specific interest during "
+"module registration are the .mpo_destroy and .mpo_init entry "
+"points. .mpo_init will be invoked once a policy is successfully registered "
+"with the module framework but prior to any other entry points becoming "
+"active. This permits the policy to perform any policy-specific allocation "
+"and initialization, such as initialization of any data or "
+"locks. .mpo_destroy will be invoked when a policy module is unloaded to "
+"permit releasing of any allocated memory and destruction of locks. "
+"Currently, these two entry points are invoked with the MAC policy list mutex "
+"held to prevent any other entry points from being invoked: this will be "
+"changed, but in the mean time, policies should be careful about what kernel "
+"primitives they invoke so as to avoid lock ordering or sleeping problems."
+msgstr ""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:310
+msgid ""
+"The policy declaration's module name field exists so that the module may be "
+"uniquely identified for the purposes of module dependencies. An appropriate "
+"string should be selected. The full string name of the policy is displayed "
+"to the user via the kernel log during load and unload events, and also "
+"exported when providing status information to userland processes."
+msgstr ""
+"Поле имени модуля в объявлении политики существует для того, чтобы модуль "
+"мог быть однозначно идентифицирован с целью управления зависимостями "
+"модулей. Следует выбрать подходящую строку. Полное имя политики отображается "
+"пользователю в журнале ядра при загрузке и выгрузке, а также экспортируется "
+"при предоставлении информации о статусе процессам в пользовательском "
+"пространстве."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:312
+#, no-wrap
+msgid "Policy Flags"
+msgstr "Флаги политик"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:316
+msgid ""
+"The policy declaration flags field permits the module to provide the "
+"framework with information about its capabilities at the time the module is "
+"loaded. Currently, three flags are defined:"
+msgstr ""
+"Поле флагов объявления политики позволяет модулю предоставлять фреймворку "
+"информацию о своих возможностях во время загрузки модуля. В настоящее время "
+"определены три флага:"
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:317
+#, no-wrap
+msgid "MPC_LOADTIME_FLAG_UNLOADOK"
+msgstr "MPC_LOADTIME_FLAG_UNLOADOK"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:321
+msgid ""
+"This flag indicates that the policy module may be unloaded. If this flag is "
+"not provided, then the policy framework will reject requests to unload the "
+"module. This flag might be used by modules that allocate label state and "
+"are unable to free that state at runtime."
+msgstr ""
+"Этот флаг указывает, что модуль политики может быть выгружен. Если этот флаг "
+"не указан, то фреймворк политики отклонит запросы на выгрузку модуля. Этот "
+"флаг может использоваться модулями, которые выделяют состояние метки и не "
+"могут освободить это состояние во время выполнения."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:322
+#, no-wrap
+msgid "MPC_LOADTIME_FLAG_NOTLATE"
+msgstr "MPC_LOADTIME_FLAG_NOTLATE"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:326
+msgid ""
+"This flag indicates that the policy module must be loaded and initialized "
+"early in the boot process. If the flag is specified, attempts to register "
+"the module following boot will be rejected. The flag may be used by "
+"policies that require pervasive labeling of all system objects, and cannot "
+"handle objects that have not been properly initialized by the policy."
+msgstr ""
+"Этот флаг указывает, что модуль политики должен быть загружен и "
+"инициализирован на раннем этапе процесса загрузки. Если флаг указан, попытки "
+"зарегистрировать модуль после загрузки будут отклонены. Флаг может "
+"использоваться политиками, которые требуют повсеместной маркировки всех "
+"системных объектов и не могут обрабатывать объекты, не прошедшие надлежащую "
+"инициализацию политикой."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:327
+#, no-wrap
+msgid "MPC_LOADTIME_FLAG_LABELMBUFS"
+msgstr "MPC_LOADTIME_FLAG_LABELMBUFS"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:332
+msgid ""
+"This flag indicates that the policy module requires labeling of Mbufs, and "
+"that memory should always be allocated for the storage of Mbuf labels. By "
+"default, the MAC Framework will not allocate label storage for Mbufs unless "
+"at least one loaded policy has this flag set. This measurably improves "
+"network performance when policies do not require Mbuf labeling. A kernel "
+"option, `MAC_ALWAYS_LABEL_MBUF`, exists to force the MAC Framework to "
+"allocate Mbuf label storage regardless of the setting of this flag, and may "
+"be useful in some environments."
+msgstr ""
+"Этот флаг указывает, что модуль политики требует маркировки Mbuf, и память "
+"всегда должна выделяться для хранения меток Mbuf. По умолчанию MAC Framework "
+"не выделяет память для хранения меток Mbuf, если хотя бы одна загруженная "
+"политика не установила этот флаг. Это заметно улучшает производительность "
+"сети, когда политики не требуют маркировки Mbuf. Существует опция ядра "
+"`MAC_ALWAYS_LABEL_MBUF`, которая заставляет MAC Framework выделять память "
+"для хранения меток Mbuf независимо от установки этого флага, и может быть "
+"полезной в некоторых средах."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:338
+msgid ""
+"Policies using the `MPC_LOADTIME_FLAG_LABELMBUFS` without the "
+"`MPC_LOADTIME_FLAG_NOTLATE` flag set must be able to correctly handle `NULL` "
+"Mbuf label pointers passed into entry points. This is necessary as in-"
+"flight Mbufs without label storage may persist after a policy enabling Mbuf "
+"labeling has been loaded. If a policy is loaded before the network "
+"subsystem is active (i.e., the policy is not being loaded late), then all "
+"Mbufs are guaranteed to have label storage."
+msgstr ""
+"Политики, использующие `MPC_LOADTIME_FLAG_LABELMBUFS` без установленного "
+"флага `MPC_LOADTIME_FLAG_NOTLATE`, должны корректно обрабатывать переданные "
+"`NULL` указатели меток Mbuf в точках входа. Это необходимо, так как Mbuf в "
+"процессе передачи без хранилища меток могут сохраняться после загрузки "
+"политики, включающей маркировку Mbuf. Если политика загружена до активации "
+"сетевой подсистемы (т.е. политика не загружается поздно), то все Mbuf "
+"гарантированно имеют хранилище меток."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:341
+#, no-wrap
+msgid "Policy Entry Points"
+msgstr "Точки входа политики"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:345
+msgid ""
+"Four classes of entry points are offered to policies registered with the "
+"framework: entry points associated with the registration and management of "
+"policies, entry points denoting initialization, creation, destruction, and "
+"other life cycle events for kernel objects, events associated with access "
+"control decisions that the policy module may influence, and calls associated "
+"with the management of labels on objects. In addition, a `mac_syscall()` "
+"entry point is provided so that policies may extend the kernel interface "
+"without registering new system calls."
+msgstr ""
+"Четыре класса точек входа предоставляются политикам, зарегистрированным в "
+"рамках системы: точки входа, связанные с регистрацией и управлением "
+"политиками, точки входа, обозначающие инициализацию, создание, уничтожение и "
+"другие события жизненного цикла объектов ядра, события, связанные с "
+"решениями контроля доступа, на которые политика может влиять, и вызовы, "
+"связанные с управлением метками на объектах. Кроме того, предоставляется "
+"точка входа `mac_syscall()`, позволяющая политикам расширять интерфейс ядра "
+"без регистрации новых системных вызовов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:350
+msgid ""
+"Policy module writers should be aware of the kernel locking strategy, as "
+"well as what object locks are available during which entry points. Writers "
+"should attempt to avoid deadlock scenarios by avoiding grabbing non-leaf "
+"locks inside of entry points, and also follow the locking protocol for "
+"object access and modification. In particular, writers should be aware that "
+"while necessary locks to access objects and their labels are generally held, "
+"sufficient locks to modify an object or its label may not be present for all "
+"entry points. Locking information for arguments is documented in the MAC "
+"framework entry point document."
+msgstr ""
+"Авторы модулей политик должны быть осведомлены о стратегии блокировок в "
+"ядре, а также о том, какие блокировки объектов доступны на различных точках "
+"входа. Им следует избегать сценариев взаимоблокировок, не захватывая "
+"нелистовые блокировки внутри точек входа, а также соблюдать протокол "
+"блокировок для доступа и изменения объектов. В частности, авторы должны "
+"учитывать, что хотя необходимые блокировки для доступа к объектам и их "
+"меткам обычно удерживаются, достаточные блокировки для изменения объекта или "
+"его метки могут отсутствовать для всех точек входа. Информация о блокировках "
+"аргументов документирована в описании точек входа фреймворка MAC."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:354
+msgid ""
+"Policy entry points will pass a reference to the object label along with the "
+"object itself. This permits labeled policies to be unaware of the internals "
+"of the object yet still make decisions based on the label. The exception to "
+"this is the process credential, which is assumed to be understood by "
+"policies as a first class security object in the kernel."
+msgstr ""
+"Точки входа политики будут передавать ссылку на метку объекта вместе с самим "
+"объектом. Это позволяет помеченным политикам не знать внутренней структуры "
+"объекта, но при этом принимать решения на основе метки. Исключением из этого "
+"являются учетные данные процесса, для которые предполагается, что политики "
+"понимают их, как объект безопасности первого класса в ядре."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:356
+#, no-wrap
+msgid "MAC Policy Entry Point Reference"
+msgstr "Справочник по точкам входа политики MAC"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:359
+#, no-wrap
+msgid "General-Purpose Module Entry Points"
+msgstr "Общие точки входа модуля"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:362
+#, no-wrap
+msgid "`mpo_init`"
+msgstr "`mpo_init`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:367
+#, no-wrap
+msgid "void mpo_init(struct mac_policy_conf *conf);\n"
+msgstr "void mpo_init(struct mac_policy_conf *conf);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:373
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:397
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:420
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:458
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:487
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:510
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:533
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:556
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:579
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:608
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:637
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:664
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:687
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:710
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:737
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:764
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:787
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:810
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:833
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:856
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:879
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:902
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:925
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:948
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:971
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:998
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1021
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1044
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1067
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1090
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1113
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1139
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1165
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1192
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1232
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1272
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1312
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1352
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1392
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1432
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1469
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1506
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1543
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1580
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1665
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1708
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1746
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1781
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1813
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1846
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1890
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1943
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1979
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2001
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2036
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2072
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2112
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2148
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2180
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2213
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2248
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2283
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2318
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2355
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2394
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2425
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2453
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2488
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2523
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2558
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2594
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2630
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2666
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2702
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2746
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2782
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2820
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2855
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2892
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2922
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2960
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2992
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3014
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3036
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3096
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3131
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3153
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3179
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3205
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3232
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3262
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3284
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3307
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3346
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3377
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3408
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3443
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3474
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3505
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3538
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3575
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3606
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3636
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3666
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3695
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3730
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3764
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3791
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3826
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3859
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3889
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3927
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3960
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3991
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4034
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4081
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4118
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4152
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4189
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4236
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4279
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4314
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4349
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4380
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4416
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4460
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4508
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4541
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4578
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4615
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4648
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4682
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4715
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4756
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4804
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4841
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4878
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4920
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4960
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4990
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5023
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5058
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5099
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5140
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5173
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5203
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5225
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5251
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5274
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5305
+#, no-wrap
+msgid "Parameter"
+msgstr "Параметр"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:374
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:398
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:421
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:459
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:488
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:511
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:534
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:557
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:580
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:609
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:638
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:665
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:688
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:711
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:738
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:765
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:788
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:811
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:834
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:857
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:880
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:903
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:926
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:949
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:972
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:999
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1022
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1045
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1068
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1091
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1114
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1140
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1166
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1193
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1233
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1273
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1313
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1353
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1393
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1433
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1470
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1507
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1544
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1581
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1666
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1709
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1747
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1782
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1814
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1847
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1891
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1944
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1980
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2002
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2037
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2073
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2113
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2149
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2181
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2214
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2249
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2284
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2319
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2356
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2395
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2426
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2454
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2489
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2524
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2559
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2595
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2631
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2667
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2703
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2747
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2783
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2821
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2856
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2893
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2923
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2961
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2993
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3015
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3037
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3097
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3132
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3154
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3180
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3206
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3233
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3263
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3285
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3308
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3347
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3378
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3409
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3444
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3475
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3506
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3539
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3576
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3607
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3637
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3667
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3696
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3731
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3765
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3792
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3827
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3860
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3890
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3928
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3961
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3992
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4035
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4082
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4119
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4153
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4190
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4237
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4280
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4315
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4350
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4381
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4417
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4461
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4509
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4542
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4579
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4616
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4649
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4683
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4716
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4757
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4805
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4842
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4879
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4921
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4961
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4991
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5024
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5059
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5100
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5141
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5174
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5204
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5226
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5252
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5275
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5306
+#, no-wrap
+msgid "Description"
+msgstr "Описание"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:376
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:400
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:423
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:461
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:490
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:513
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:536
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:559
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:582
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:611
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:640
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:667
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:690
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:713
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:740
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:767
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:790
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:813
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:836
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:859
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:882
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:905
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:928
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:951
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:974
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1001
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1024
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1047
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1070
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1093
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1116
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1142
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1168
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1195
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1235
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1275
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1315
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1355
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1395
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1435
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1472
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1509
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1546
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1583
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1668
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1711
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1749
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1784
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1816
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1849
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1893
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1946
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1982
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2004
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2039
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2075
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2115
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2151
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2183
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2216
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2251
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2286
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2321
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2358
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2397
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2428
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2456
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2491
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2526
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2561
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2597
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2633
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2669
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2705
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2749
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2785
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2823
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2858
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2895
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2925
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2963
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2995
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3017
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3039
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3099
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3134
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3156
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3182
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3208
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3235
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3265
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3287
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3310
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3349
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3380
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3411
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3446
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3477
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3508
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3541
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3578
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3609
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3639
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3669
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3698
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3733
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3767
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3794
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3829
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3862
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3892
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3930
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3963
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3994
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4037
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4084
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4121
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4155
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4192
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4239
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4282
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4317
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4352
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4383
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4419
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4463
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4511
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4544
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4581
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4618
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4651
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4685
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4718
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4759
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4807
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4844
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4881
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4923
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4963
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4993
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5026
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5061
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5102
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5143
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5176
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5206
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5228
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5254
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5277
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5308
+#, no-wrap
+msgid "Locking"
+msgstr "Блокировка"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:377
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:401
+#, no-wrap
+msgid "`conf`"
+msgstr "`conf`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:378
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:402
+#, no-wrap
+msgid "MAC policy definition"
+msgstr "Определение политики MAC"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:384
+msgid ""
+"Policy load event. The policy list mutex is held, so sleep operations "
+"cannot be performed, and calls out to other kernel subsystems must be made "
+"with caution. If potentially sleeping memory allocations are required "
+"during policy initialization, they should be made using a separate module "
+"SYSINIT()."
+msgstr ""
+"Событие загрузки политики. Мьютекс списка политик удерживается, поэтому "
+"операции ожидания выполнить нельзя, а вызовы других подсистем ядра должны "
+"осуществляться с осторожностью. Если во время инициализации политики "
+"требуются потенциально блокирующие выделения памяти, их следует выполнять с "
+"использованием отдельного модуля SYSINIT()."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:386
+#, no-wrap
+msgid "`mpo_destroy`"
+msgstr "`mpo_destroy`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:391
+#, no-wrap
+msgid "void mpo_destroy(struct mac_policy_conf *conf);\n"
+msgstr "void mpo_destroy(struct mac_policy_conf *conf);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:407
+msgid ""
+"Policy load event. The policy list mutex is held, so caution should be "
+"applied."
+msgstr ""
+"Событие загрузки политики. Мьютекс списка политик удерживается, поэтому "
+"следует соблюдать осторожность."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:409
+#, no-wrap
+msgid "`mpo_syscall`"
+msgstr "`mpo_syscall`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:414
+#, no-wrap
+msgid "int mpo_syscall(struct thread *td, int call, void *arg);\n"
+msgstr "int mpo_syscall(struct thread *td, int call, void *arg);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:424
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:462
+#, no-wrap
+msgid "`td`"
+msgstr "`td`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:425
+#, no-wrap
+msgid "Calling thread"
+msgstr "Вызывающий поток"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:428
+#, no-wrap
+msgid "`call`"
+msgstr "`call`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:429
+#, no-wrap
+msgid "Policy-specific syscall number"
+msgstr "Номер системного вызова, зависящий от политики"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:432
+#, no-wrap
+msgid "`arg`"
+msgstr "`arg`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:433
+#, no-wrap
+msgid "Pointer to syscall arguments"
+msgstr "Указатель на аргументы системного вызова"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:440
+msgid ""
+"This entry point provides a policy-multiplexed system call so that policies "
+"may provide additional services to user processes without registering "
+"specific system calls. The policy name provided during registration is used "
+"to demultiplexer calls from userland, and the arguments will be forwarded to "
+"this entry point. When implementing new services, security modules should "
+"be sure to invoke appropriate access control checks from the MAC framework "
+"as needed. For example, if a policy implements an augmented signal "
+"functionality, it should call the necessary signal access control checks to "
+"invoke the MAC framework and other registered policies."
+msgstr ""
+"Этот точку входа предоставляет мультиплексированный системный вызов на "
+"основе политик, что позволяет политикам предоставлять дополнительные сервисы "
+"пользовательским процессам без регистрации конкретных системных вызовов. Имя "
+"политики, указанное при регистрации, используется для демультиплексирования "
+"вызовов из пользовательского пространства, а аргументы будут переданы в эту "
+"точку входа. При реализации новых сервисов модули безопасности должны "
+"убедиться, что вызывают соответствующие проверки контроля доступа из MAC-"
+"фреймворка по мере необходимости. Например, если политика реализует "
+"расширенную функциональность сигналов, она должна вызывать необходимые "
+"проверки контроля доступа сигналов для задействования MAC-фреймворка и "
+"других зарегистрированных политик."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:444
+msgid ""
+"Modules must currently perform the `copyin()` of the syscall data on their "
+"own."
+msgstr ""
+"Модули в настоящее время должны самостоятельно выполнять `copyin()` для "
+"данных системного вызова."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:447
+#, no-wrap
+msgid "`mpo_thread_userret`"
+msgstr "`mpo_thread_userret`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:452
+#, no-wrap
+msgid "void mpo_thread_userret(struct thread *td);\n"
+msgstr "void mpo_thread_userret(struct thread *td);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:463
+#, no-wrap
+msgid "Returning thread"
+msgstr "Возвращающий поток"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:471
+msgid ""
+"This entry point permits policy modules to perform MAC-related events when a "
+"thread returns to user space, via a system call return, trap return, or "
+"otherwise. This is required for policies that have floating process labels, "
+"as it is not always possible to acquire the process lock at arbitrary points "
+"in the stack during system call processing; process labels might represent "
+"traditional authentication data, process history information, or other "
+"data. To employ this mechanism, intended changes to the process credential "
+"label may be stored in the `p_label` protected by a per-policy spin lock, "
+"and then set the per-thread `TDF_ASTPENDING` flag and per-process "
+"`PS_MACPENDM` flag to schedule a call to the `userret` entry point. From "
+"this entry point, the policy may create a replacement credential with less "
+"concern about the locking context. Policy writers are cautioned that event "
+"ordering relating to scheduling an AST and the AST being performed may be "
+"complex and interlaced in multithreaded applications."
+msgstr ""
+"Этот точка входа позволяет модулям политики выполнять события, связанные с "
+"MAC, когда поток возвращается в пользовательское пространство, через возврат "
+"системного вызова, возврат из ловушки или иным образом. Это необходимо для "
+"политик, имеющих плавающие метки процессов, так как не всегда возможно "
+"получить блокировку процесса в произвольных точках стека во время обработки "
+"системного вызова; метки процессов могут представлять традиционные данные "
+"аутентификации, информацию об истории процесса или другие данные. Для "
+"использования этого механизма предполагаемые изменения метки учётных данных "
+"процесса могут быть сохранены в `p_label`, защищённом спин-блокировкой для "
+"каждой политики, а затем установить флаг `TDF_ASTPENDING` для потока и флаг "
+"`PS_MACPENDM` для процесса, чтобы запланировать вызов точки входа `userret`. "
+"С этой точки входа политика может создать замену учётных данных с меньшими "
+"опасениями относительно контекста блокировки. Авторам политик следует "
+"учитывать, что порядок событий, связанных с планированием AST и выполнением "
+"AST, может быть сложным и переплетённым в многопоточных приложениях."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:473
+#, no-wrap
+msgid "Label Operations"
+msgstr "Операции с метками"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:476
+#, no-wrap
+msgid "`mpo_init_bpfdesc_label`"
+msgstr "`mpo_init_bpfdesc_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:481
+#, no-wrap
+msgid "void mpo_init_bpfdesc_label(struct label *label);\n"
+msgstr "void mpo_init_bpfdesc_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:491
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:514
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:537
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:560
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:583
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:616
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:668
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:691
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:714
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:741
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:768
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:791
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:814
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:837
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:860
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:883
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:906
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:929
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:952
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1002
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1048
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1071
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1094
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1196
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1236
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1276
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1316
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1356
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1396
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1436
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1473
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1510
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1547
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1584
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1793
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1902
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3901
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4054
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4093
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4130
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4164
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4201
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4256
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4291
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4326
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4396
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4436
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4480
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4590
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4660
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4694
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4727
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4768
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4816
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4853
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4890
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4932
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5035
+#, no-wrap
+msgid "`label`"
+msgstr "`label`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:492
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:538
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:561
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:584
+#, no-wrap
+msgid "New label to apply"
+msgstr "Новая метка для инициализации"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:497
+msgid ""
+"Initialize the label on a newly instantiated bpfdesc (BPF descriptor). "
+"Sleeping is permitted."
+msgstr ""
+"Инициализировать метку на только что созданном bpfdesc (дескрипторе BPF). "
+"Разрешено использование режима сна."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:499
+#, no-wrap
+msgid "`mpo_init_cred_label`"
+msgstr "`mpo_init_cred_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:504
+#, no-wrap
+msgid "void mpo_init_cred_label(struct label *label);\n"
+msgstr "void mpo_init_cred_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:515
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:715
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:742
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:769
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:792
+#, no-wrap
+msgid "New label to initialize"
+msgstr "Новая метка для инициализации"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:520
+msgid ""
+"Initialize the label for a newly instantiated user credential. Sleeping is "
+"permitted."
+msgstr ""
+"Инициализировать метку для вновь созданных учетных данных пользователя. "
+"Разрешено приостанавливать выполнение."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:522
+#, no-wrap
+msgid "`mpo_init_devfsdirent_label`"
+msgstr "`mpo_init_devfsdirent_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:527
+#, no-wrap
+msgid "void mpo_init_devfsdirent_label(struct label *label);\n"
+msgstr "void mpo_init_devfsdirent_label(struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:543
+msgid ""
+"Initialize the label on a newly instantiated devfs entry. Sleeping is "
+"permitted."
+msgstr ""
+"Инициализировать метку на только что созданной записи devfs. Разрешено "
+"использование режима сна."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:545
+#, no-wrap
+msgid "`mpo_init_ifnet_label`"
+msgstr "`mpo_init_ifnet_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:550
+#, no-wrap
+msgid "void mpo_init_ifnet_label(struct label *label);\n"
+msgstr "void mpo_init_ifnet_label(struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:566
+msgid ""
+"Initialize the label on a newly instantiated network interface. Sleeping is "
+"permitted."
+msgstr ""
+"Инициализировать метку на только что созданном сетевом интерфейсе. Разрешено "
+"приостанавливать выполнение."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:568
+#, no-wrap
+msgid "`mpo_init_ipq_label`"
+msgstr "`mpo_init_ipq_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:573
+#, no-wrap
+msgid "void mpo_init_ipq_label(struct label *label, int flag);\n"
+msgstr "void mpo_init_ipq_label(struct label *label, int flag);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:587
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:612
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:718
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:745
+#, no-wrap
+msgid "`flag`"
+msgstr "`flag`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:588
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:613
+#, no-wrap
+msgid "Sleeping/non-sleeping man:malloc[9]; see below"
+msgstr "Спящий/неспящий man:malloc[9]; см. ниже"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:595
+msgid ""
+"Initialize the label on a newly instantiated IP fragment reassembly queue. "
+"The `flag` field may be one of M_WAITOK and M_NOWAIT, and should be employed "
+"to avoid performing a sleeping man:malloc[9] during this initialization "
+"call. IP fragment reassembly queue allocation frequently occurs in "
+"performance sensitive environments, and the implementation should be careful "
+"to avoid sleeping or long-lived operations. This entry point is permitted "
+"to fail resulting in the failure to allocate the IP fragment reassembly "
+"queue."
+msgstr ""
+"Инициализировать метку в только что созданной очереди сборки IP-фрагментов. "
+"Поле `flag` может принимать одно из значений M_WAITOK или M_NOWAIT и должно "
+"использоваться, чтобы избежать выполнения \"спящего\" man:malloc[9] во время "
+"этого вызова инициализации. Выделение очереди сборки IP-фрагментов часто "
+"происходит в средах, чувствительных к производительности, и реализация "
+"должна избегать \"спящих\" или длительных операций. Этой точке входа "
+"разрешено завершаться неудачей, что приведёт к невозможности выделения "
+"очереди сборки IP-фрагментов."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:597
+#, no-wrap
+msgid "`mpo_init_mbuf_label`"
+msgstr "`mpo_init_mbuf_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:602
+#, no-wrap
+msgid "void mpo_init_mbuf_label(int flag, struct label *label);\n"
+msgstr "void mpo_init_mbuf_label(int flag, struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:617
+#, no-wrap
+msgid "Policy label to initialize"
+msgstr "Метка политики для инициализации"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:624
+msgid ""
+"Initialize the label on a newly instantiated mbuf packet header (`mbuf`). "
+"The `flag` field may be one of M_WAITOK and M_NOWAIT, and should be employed "
+"to avoid performing a sleeping man:malloc[9] during this initialization "
+"call. Mbuf allocation frequently occurs in performance sensitive "
+"environments, and the implementation should be careful to avoid sleeping or "
+"long-lived operations. This entry point is permitted to fail resulting in "
+"the failure to allocate the mbuf header."
+msgstr ""
+"Инициализировать на только что созданном заголовке пакета mbuf метку "
+"(`mbuf`). Поле `flag` может принимать одно из значений M_WAITOK или M_NOWAIT "
+"и должно использоваться, чтобы избежать выполнения \"спящего\" man:malloc[9] "
+"во время этого вызова инициализации. Выделение mbuf часто происходит в "
+"чувствительных к производительности средах, и реализация должна избегать "
+"\"спящего\" режима или длительных операций. Этой точке входа разрешено "
+"завершаться неудачей, что приведёт к невозможности выделения заголовка mbuf."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:626
+#, no-wrap
+msgid "`mpo_init_mount_label`"
+msgstr "`mpo_init_mount_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:631
+#, no-wrap
+msgid "void mpo_init_mount_label(struct label *mntlabel, struct label *fslabel);\n"
+msgstr "void mpo_init_mount_label(struct label *mntlabel, struct label *fslabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:641
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:975
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1955
+#, no-wrap
+msgid "`mntlabel`"
+msgstr "`mntlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:642
+#, no-wrap
+msgid "Policy label to be initialized for the mount itself"
+msgstr "Метка политики для инициализации самой точки монтирования"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:645
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:979
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1673
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1716
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1754
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1959
+#, no-wrap
+msgid "`fslabel`"
+msgstr "`fslabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:646
+#, no-wrap
+msgid "Policy label to be initialized for the file system"
+msgstr "Метка политики для инициализации файловой системы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:651
+msgid ""
+"Initialize the labels on a newly instantiated mount point. Sleeping is "
+"permitted."
+msgstr ""
+"Инициализировать метки на новой точке монтирования. Разрешено "
+"приостанавливать выполнение."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:653
+#, no-wrap
+msgid "`mpo_init_mount_fs_label`"
+msgstr "`mpo_init_mount_fs_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:658
+#, no-wrap
+msgid "void mpo_init_mount_fs_label(struct label *label);\n"
+msgstr "void mpo_init_mount_fs_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:669
+#, no-wrap
+msgid "Label to be initialized"
+msgstr "Метка для инициализации"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:674
+msgid ""
+"Initialize the label on a newly mounted file system. Sleeping is permitted"
+msgstr ""
+"Инициализировать метку на только что смонтированной файловой системе. "
+"Разрешено приостановление работы"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:676
+#, no-wrap
+msgid "`mpo_init_pipe_label`"
+msgstr "`mpo_init_pipe_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:681
+#, no-wrap
+msgid "void mpo_init_pipe_label(struct label *label);\n"
+msgstr "void mpo_init_pipe_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:692
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1437
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1474
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1511
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1548
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1585
+#, no-wrap
+msgid "Label to be filled in"
+msgstr "Метка для заполнения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:697
+msgid ""
+"Initialize a label for a newly instantiated pipe. Sleeping is permitted."
+msgstr ""
+"Инициализировать метку для только что созданного канала. Разрешено "
+"приостановление выполнения."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:699
+#, no-wrap
+msgid "`mpo_init_socket_label`"
+msgstr "`mpo_init_socket_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:704
+#, no-wrap
+msgid "void mpo_init_socket_label(struct label *label, int flag);\n"
+msgstr "void mpo_init_socket_label(struct label *label, int flag);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:719
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:746
+#, no-wrap
+msgid "man:malloc[9] flags"
+msgstr "флаги man:malloc[9]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:724
+msgid ""
+"Initialize a label for a newly instantiated socket. The `flag` field may be "
+"one of M_WAITOK and M_NOWAIT, and should be employed to avoid performing a "
+"sleeping man:malloc[9] during this initialization call."
+msgstr ""
+"Инициализировать метку для нового сокета. Поле `flag` может принимать одно "
+"из значений M_WAITOK или M_NOWAIT и должно использоваться, чтобы избежать "
+"выполнения спящего man:malloc[9] во время этого вызова инициализации."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:726
+#, no-wrap
+msgid "`mpo_init_socket_peer_label`"
+msgstr "`mpo_init_socket_peer_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:731
+#, no-wrap
+msgid "void mpo_init_socket_peer_label(struct label *label, int flag);\n"
+msgstr "void mpo_init_socket_peer_label(struct label *label, int flag);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:751
+msgid ""
+"Initialize the peer label for a newly instantiated socket. The `flag` field "
+"may be one of M_WAITOK and M_NOWAIT, and should be employed to avoid "
+"performing a sleeping man:malloc[9] during this initialization call."
+msgstr ""
+"Инициализировать метку однорангового узла (peer) для вновь созданного "
+"сокета. Поле `flag` может принимать одно из значений M_WAITOK или M_NOWAIT и "
+"должно использоваться для избежания выполнения спящего man:malloc[9] во "
+"время этого вызова инициализации."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:753
+#, no-wrap
+msgid "`mpo_init_proc_label`"
+msgstr "`mpo_init_proc_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:758
+#, no-wrap
+msgid "void mpo_init_proc_label(struct label *label);\n"
+msgstr "void mpo_init_proc_label(struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:774
+msgid ""
+"Initialize the label for a newly instantiated process. Sleeping is "
+"permitted."
+msgstr ""
+"Инициализировать метку для вновь созданного процесса. Разрешено "
+"приостановление выполнения."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:776
+#, no-wrap
+msgid "`mpo_init_vnode_label`"
+msgstr "`mpo_init_vnode_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:781
+#, no-wrap
+msgid "void mpo_init_vnode_label(struct label *label);\n"
+msgstr "void mpo_init_vnode_label(struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:797
+msgid ""
+"Initialize the label on a newly instantiated vnode. Sleeping is permitted."
+msgstr ""
+"Инициализировать метку на только что созданном vnode. Разрешено "
+"приостанавливать выполнение."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:799
+#, no-wrap
+msgid "`mpo_destroy_bpfdesc_label`"
+msgstr "`mpo_destroy_bpfdesc_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:804
+#, no-wrap
+msgid "void mpo_destroy_bpfdesc_label(struct label *label);\n"
+msgstr "void mpo_destroy_bpfdesc_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:815
+#, no-wrap
+msgid "bpfdesc label"
+msgstr "bpfdesc label"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:820
+msgid ""
+"Destroy the label on a BPF descriptor. In this entry point a policy should "
+"free any internal storage associated with `label` so that it may be "
+"destroyed."
+msgstr ""
+"Уничтожить метку на дескрипторе BPF. В этой точке входа политика должна "
+"освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно "
+"было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:822
+#, no-wrap
+msgid "`mpo_destroy_cred_label`"
+msgstr "`mpo_destroy_cred_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:827
+#, no-wrap
+msgid "void mpo_destroy_cred_label(struct label *label);\n"
+msgstr "void mpo_destroy_cred_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:838
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:861
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:884
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:907
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:930
+#, no-wrap
+msgid "Label being destroyed"
+msgstr "Метка уничтожается"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:843
+msgid ""
+"Destroy the label on a credential. In this entry point, a policy module "
+"should free any internal storage associated with `label` so that it may be "
+"destroyed."
+msgstr ""
+"Уничтожить метку на учетных данных. В этой точке входа модуль политики "
+"должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее "
+"можно было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:845
+#, no-wrap
+msgid "`mpo_destroy_devfsdirent_label`"
+msgstr "`mpo_destroy_devfsdirent_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:850
+#, no-wrap
+msgid "void mpo_destroy_devfsdirent_label(struct label *label);\n"
+msgstr "void mpo_destroy_devfsdirent_label(struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:866
+msgid ""
+"Destroy the label on a devfs entry. In this entry point, a policy module "
+"should free any internal storage associated with `label` so that it may be "
+"destroyed."
+msgstr ""
+"Уничтожить метку на записи devfs. В этой точке входа модуль политики должен "
+"освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно "
+"было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:868
+#, no-wrap
+msgid "`mpo_destroy_ifnet_label`"
+msgstr "`mpo_destroy_ifnet_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:873
+#, no-wrap
+msgid "void mpo_destroy_ifnet_label(struct label *label);\n"
+msgstr "void mpo_destroy_ifnet_label(struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:889
+msgid ""
+"Destroy the label on a removed interface. In this entry point, a policy "
+"module should free any internal storage associated with `label` so that it "
+"may be destroyed."
+msgstr ""
+"Уничтожить метку на удаленном интерфейсе. В этой точке входа модуль политики "
+"должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее "
+"можно было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:891
+#, no-wrap
+msgid "`mpo_destroy_ipq_label`"
+msgstr "`mpo_destroy_ipq_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:896
+#, no-wrap
+msgid "void mpo_destroy_ipq_label(struct label *label);\n"
+msgstr "void mpo_destroy_ipq_label(struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:912
+msgid ""
+"Destroy the label on an IP fragment queue. In this entry point, a policy "
+"module should free any internal storage associated with `label` so that it "
+"may be destroyed."
+msgstr ""
+"Уничтожить метку в очереди IP-фрагментов. В этой точке входа модуль политики "
+"должен освободить любое внутреннее хранилище, связанное с `label`, чтобы ее "
+"можно было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:914
+#, no-wrap
+msgid "`mpo_destroy_mbuf_label`"
+msgstr "`mpo_destroy_mbuf_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:919
+#, no-wrap
+msgid "void mpo_destroy_mbuf_label(struct label *label);\n"
+msgstr "void mpo_destroy_mbuf_label(struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:935
+msgid ""
+"Destroy the label on an mbuf header. In this entry point, a policy module "
+"should free any internal storage associated with `label` so that it may be "
+"destroyed."
+msgstr ""
+"Уничтожить метку в заголовке mbuf. В этой точке входа модуль политики должен "
+"освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно "
+"было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:937
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:960
+#, no-wrap
+msgid "`mpo_destroy_mount_label`"
+msgstr "`mpo_destroy_mount_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:942
+#, no-wrap
+msgid "void mpo_destroy_mount_label(struct label *label);\n"
+msgstr "void mpo_destroy_mount_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:953
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:976
+#, no-wrap
+msgid "Mount point label being destroyed"
+msgstr "Точка монтирования метки уничтожается"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:958
+msgid ""
+"Destroy the labels on a mount point. In this entry point, a policy module "
+"should free the internal storage associated with `mntlabel` so that they may "
+"be destroyed."
+msgstr ""
+"Уничтожить метки на точке монтирования. В этой точке входа модуль политики "
+"должен освободить внутреннее хранилище, связанное с `mntlabel`, чтобы ее "
+"можно было уничтожить."
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:965
+#, no-wrap
+msgid "void mpo_destroy_mount_label(struct label *mntlabel, struct label *fslabel);\n"
+msgstr "void mpo_destroy_mount_label(struct label *mntlabel, struct label *fslabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:980
+#, no-wrap
+msgid "File system label being destroyed>"
+msgstr "Метка файловой системы уничтожается"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:985
+msgid ""
+"Destroy the labels on a mount point. In this entry point, a policy module "
+"should free the internal storage associated with `mntlabel` and `fslabel` so "
+"that they may be destroyed."
+msgstr ""
+"Уничтожить метки на точке монтирования. В этой точке входа модуль политики "
+"должен освободить внутреннее хранилище, связанное с `mntlabel` и `fslabel`, "
+"чтобы их можно было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:987
+#, no-wrap
+msgid "`mpo_destroy_socket_label`"
+msgstr "`mpo_destroy_socket_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:992
+#, no-wrap
+msgid "void mpo_destroy_socket_label(struct label *label);\n"
+msgstr "void mpo_destroy_socket_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1003
+#, no-wrap
+msgid "Socket label being destroyed"
+msgstr "Уничтожение метки сокета"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1008
+msgid ""
+"Destroy the label on a socket. In this entry point, a policy module should "
+"free any internal storage associated with `label` so that it may be "
+"destroyed."
+msgstr ""
+"Уничтожить метку на сокете. В этой точке входа модуль политики должен "
+"освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно "
+"было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1010
+#, no-wrap
+msgid "`mpo_destroy_socket_peer_label`"
+msgstr "`mpo_destroy_socket_peer_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1015
+#, no-wrap
+msgid "void mpo_destroy_socket_peer_label(struct label *peerlabel);\n"
+msgstr "void mpo_destroy_socket_peer_label(struct label *peerlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1025
+#, no-wrap
+msgid "`peerlabel`"
+msgstr "`peerlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1026
+#, no-wrap
+msgid "Socket peer label being destroyed"
+msgstr "Сокет: метка однорангового узла уничтожается"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1031
+msgid ""
+"Destroy the peer label on a socket. In this entry point, a policy module "
+"should free any internal storage associated with `label` so that it may be "
+"destroyed."
+msgstr ""
+"Уничтожить метку однорангового узла на сокете. В этой точке входа модуль "
+"политики должен освободить любое внутреннее хранилище, связанное с `label`, "
+"чтобы ее можно было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1033
+#, no-wrap
+msgid "`mpo_destroy_pipe_label`"
+msgstr "`mpo_destroy_pipe_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1038
+#, no-wrap
+msgid "void mpo_destroy_pipe_label(struct label *label);\n"
+msgstr "void mpo_destroy_pipe_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1049
+#, no-wrap
+msgid "Pipe label"
+msgstr "Метка канала (pipe)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1054
+msgid ""
+"Destroy the label on a pipe. In this entry point, a policy module should "
+"free any internal storage associated with `label` so that it may be "
+"destroyed."
+msgstr ""
+"Уничтожить метку на канале. В этой точке входа модуль политики должен "
+"освободить всю внутреннюю память, связанную с `label`, чтобы её можно было "
+"уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1056
+#, no-wrap
+msgid "`mpo_destroy_proc_label`"
+msgstr "`mpo_destroy_proc_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1061
+#, no-wrap
+msgid "void mpo_destroy_proc_label(struct label *label);\n"
+msgstr "void mpo_destroy_proc_label(struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1072
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1095
+#, no-wrap
+msgid "Process label"
+msgstr "Метка процесса"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1077
+msgid ""
+"Destroy the label on a process. In this entry point, a policy module should "
+"free any internal storage associated with `label` so that it may be "
+"destroyed."
+msgstr ""
+"Уничтожить метку на процессе. В этой точке входа модуль политики должен "
+"освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно "
+"было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1079
+#, no-wrap
+msgid "`mpo_destroy_vnode_label`"
+msgstr "`mpo_destroy_vnode_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1084
+#, no-wrap
+msgid "void mpo_destroy_vnode_label(struct label *label);\n"
+msgstr "void mpo_destroy_vnode_label(struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1100
+msgid ""
+"Destroy the label on a vnode. In this entry point, a policy module should "
+"free any internal storage associated with `label` so that it may be "
+"destroyed."
+msgstr ""
+"Уничтожить метку на vnode. В этой точке входа модуль политики должен "
+"освободить любое внутреннее хранилище, связанное с `label`, чтобы ее можно "
+"было уничтожить."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1102
+#, no-wrap
+msgid "`mpo_copy_mbuf_label`"
+msgstr "`mpo_copy_mbuf_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1107
+#, no-wrap
+msgid "void mpo_copy_mbuf_label(struct label *src, struct label *dest);\n"
+msgstr "void mpo_copy_mbuf_label(struct label *src, struct label *dest);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1117
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1143
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1169
+#, no-wrap
+msgid "`src`"
+msgstr "`src`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1118
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1144
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1170
+#, no-wrap
+msgid "Source label"
+msgstr "Метка источника"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1121
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1147
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1173
+#, no-wrap
+msgid "`dest`"
+msgstr "`dest`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1122
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1148
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1174
+#, no-wrap
+msgid "Destination label"
+msgstr "Метка назначения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1126
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1152
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1178
+msgid "Copy the label information in `src` into `dest`."
+msgstr "Скопировать информацию метки из `src` в `dest`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1128
+#, no-wrap
+msgid "`mpo_copy_pipe_label`"
+msgstr "`mpo_copy_pipe_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1133
+#, no-wrap
+msgid "void mpo_copy_pipe_label(struct label *src, struct label *dest);\n"
+msgstr "void mpo_copy_pipe_label(struct label *src, struct label *dest);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1154
+#, no-wrap
+msgid "`mpo_copy_vnode_label`"
+msgstr "`mpo_copy_vnode_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1159
+#, no-wrap
+msgid "void mpo_copy_vnode_label(struct label *src, struct label *dest);\n"
+msgstr "void mpo_copy_vnode_label(struct label *src, struct label *dest);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1180
+#, no-wrap
+msgid "`mpo_externalize_cred_label`"
+msgstr "`mpo_externalize_cred_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1186
+#, no-wrap
+msgid ""
+"int mpo_externalize_cred_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+msgstr ""
+"int mpo_externalize_cred_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1197
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1237
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1277
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1317
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1357
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1397
+#, no-wrap
+msgid "Label to be externalized"
+msgstr "Метка для вынесения во внешний ресурс"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1200
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1240
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1280
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1320
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1360
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1400
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1440
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1477
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1514
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1551
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1588
+#, no-wrap
+msgid "`element_name`"
+msgstr "`element_name`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1201
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1241
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1281
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1321
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1361
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1401
+#, no-wrap
+msgid "Name of the policy whose label should be externalized"
+msgstr "Имя политики, метка которой должна быть вынесена во внешний ресурс"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1204
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1244
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1284
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1324
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1364
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1404
+#, no-wrap
+msgid "`sb`"
+msgstr "`sb`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1205
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1245
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1285
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1325
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1365
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1405
+#, no-wrap
+msgid "String buffer to be filled with a text representation of label"
+msgstr "Буфер строки для заполнения текстовым представлением метки"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1208
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1248
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1288
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1328
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1368
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1408
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1448
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1485
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1522
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1559
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1596
+#, no-wrap
+msgid "`claimed`"
+msgstr "`claimed`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1209
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1249
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1289
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1329
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1369
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1409
+#, no-wrap
+msgid "Should be incremented when `element_data` can be filled in."
+msgstr "Должно быть увеличено, когда `element_data` может быть заполнено."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1218
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1258
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1298
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1338
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1378
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1418
+msgid ""
+"Produce an externalized label based on the label structure passed. An "
+"externalized label consists of a text representation of the label contents "
+"that can be used with userland applications and read by the user. "
+"Currently, all policies' `externalize` entry points will be called, so the "
+"implementation should check the contents of `element_name` before attempting "
+"to fill in `sb`. If `element_name` does not match the name of your policy, "
+"simply return 0. Only return nonzero if an error occurs while externalizing "
+"the label data. Once the policy fills in `element_data`, `*claimed` should "
+"be incremented."
+msgstr ""
+"Создать внешнее представление метки на основе переданной структуры метки. "
+"Внешнее представление метки состоит из текстового представления содержимого "
+"метки, которое может использоваться пользовательскими приложениями и "
+"прочитано пользователем. В настоящее время будут вызываться точки входа "
+"`externalize` всех политик, поэтому реализация должна проверить содержимое "
+"`element_name` перед попыткой заполнить `sb`. Если `element_name` не "
+"соответствует имени вашей политики, просто верните 0. Возвращайте ненулевое "
+"значение только в случае ошибки при внешнем представлении данных метки. "
+"После того как политика заполнит `element_data`, `*claimed` должен быть "
+"увеличен."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1220
+#, no-wrap
+msgid "`mpo_externalize_ifnet_label`"
+msgstr "`mpo_externalize_ifnet_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1226
+#, no-wrap
+msgid ""
+"int mpo_externalize_ifnet_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+msgstr ""
+"int mpo_externalize_ifnet_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1260
+#, no-wrap
+msgid "`mpo_externalize_pipe_label`"
+msgstr "`mpo_externalize_pipe_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1266
+#, no-wrap
+msgid ""
+"int mpo_externalize_pipe_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+msgstr ""
+"int mpo_externalize_pipe_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1300
+#, no-wrap
+msgid "`mpo_externalize_socket_label`"
+msgstr "`mpo_externalize_socket_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1306
+#, no-wrap
+msgid ""
+"int mpo_externalize_socket_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+msgstr ""
+"int mpo_externalize_socket_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1340
+#, no-wrap
+msgid "`mpo_externalize_socket_peer_label`"
+msgstr "`mpo_externalize_socket_peer_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1346
+#, no-wrap
+msgid ""
+"int mpo_externalize_socket_peer_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+msgstr ""
+"int mpo_externalize_socket_peer_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1380
+#, no-wrap
+msgid "`mpo_externalize_vnode_label`"
+msgstr "`mpo_externalize_vnode_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1386
+#, no-wrap
+msgid ""
+"int mpo_externalize_vnode_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+msgstr ""
+"int mpo_externalize_vnode_label(struct label *label, char *element_name,\n"
+" struct sbuf *sb, int *claimed);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1420
+#, no-wrap
+msgid "`mpo_internalize_cred_label`"
+msgstr "`mpo_internalize_cred_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1426
+#, no-wrap
+msgid ""
+"int mpo_internalize_cred_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+msgstr ""
+"int mpo_internalize_cred_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1441
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1478
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1515
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1552
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1589
+#, no-wrap
+msgid "Name of the policy whose label should be internalized"
+msgstr "Имя политики, метка которой должна быть приведена к внутреннему представлению"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1444
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1481
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1518
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1555
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1592
+#, no-wrap
+msgid "`element_data`"
+msgstr "`element_data`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1445
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1482
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1519
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1556
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1593
+#, no-wrap
+msgid "Text data to be internalized"
+msgstr "Текстовые данные для преобразования к внутреннему представлению"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1449
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1486
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1523
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1560
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1597
+#, no-wrap
+msgid "Should be incremented when data can be successfully internalized."
+msgstr "Должно увеличиваться, когда данные могут быть успешно преобразовываться вовнутреннее представление."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1455
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1492
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1529
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1566
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1603
+msgid ""
+"Produce an internal label structure based on externalized label data in text "
+"format. Currently, all policies' `internalize` entry points are called when "
+"internalization is requested, so the implementation should compare the "
+"contents of `element_name` to its own name in order to be sure it should be "
+"internalizing the data in `element_data`. Just as in the `externalize` "
+"entry points, the entry point should return 0 if `element_name` does not "
+"match its own name, or when data can successfully be internalized, in which "
+"case `*claimed` should be incremented."
+msgstr ""
+"Создать внутреннюю структуру меток на основе данных метки вов нешнем "
+"представлении в текстовом формате. В настоящее время, при запросе "
+"преобразования во внутреннее представление вызываются точки входа "
+"`internalize` всех политик, поэтому реализация должна сравнивать содержимое "
+"`element_name` со своим именем, чтобы убедиться, что она должна "
+"преобразовывать данные в `element_data`. Как и в точках входа `externalize`, "
+"точка входа должна возвращать 0, если `element_name` не совпадает с её "
+"собственным именем, или когда данные могут быть успешно преобразованы, в "
+"этом случае `*claimed` должен быть увеличен."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1457
+#, no-wrap
+msgid "`mpo_internalize_ifnet_label`"
+msgstr "`mpo_internalize_ifnet_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1463
+#, no-wrap
+msgid ""
+"int mpo_internalize_ifnet_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+msgstr ""
+"int mpo_internalize_ifnet_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1494
+#, no-wrap
+msgid "`mpo_internalize_pipe_label`"
+msgstr "`mpo_internalize_pipe_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1500
+#, no-wrap
+msgid ""
+"int mpo_internalize_pipe_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+msgstr ""
+"int mpo_internalize_pipe_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1531
+#, no-wrap
+msgid "`mpo_internalize_socket_label`"
+msgstr "`mpo_internalize_socket_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1537
+#, no-wrap
+msgid ""
+"int mpo_internalize_socket_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+msgstr ""
+"int mpo_internalize_socket_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1568
+#, no-wrap
+msgid "`mpo_internalize_vnode_label`"
+msgstr "`mpo_internalize_vnode_label`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1574
+#, no-wrap
+msgid ""
+"int mpo_internalize_vnode_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+msgstr ""
+"int mpo_internalize_vnode_label(struct label *label, char *element_name,\n"
+" char *element_data, int *claimed);\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1605
+#, no-wrap
+msgid "Label Events"
+msgstr "События метки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1613
+msgid ""
+"This class of entry points is used by the MAC framework to permit policies "
+"to maintain label information on kernel objects. For each labeled kernel "
+"object of interest to a MAC policy, entry points may be registered for "
+"relevant life cycle events. All objects implement initialization, creation, "
+"and destruction hooks. Some objects will also implement relabeling, "
+"allowing user processes to change the labels on objects. Some objects will "
+"also implement object-specific events, such as label events associated with "
+"IP reassembly. A typical labeled object will have the following life cycle "
+"of entry points:"
+msgstr ""
+"Этот класс точек входа используется фреймворком MAC для разрешения политикам "
+"поддерживать информацию о метках на объектах ядра. Для каждого помеченного "
+"объекта ядра, представляющего интерес для политики MAC, могут быть "
+"зарегистрированы точки входа для соответствующих событий жизненного цикла. "
+"Все объекты реализуют хуки инициализации, создания и уничтожения. Некоторые "
+"объекты также реализуют перемаркировку, позволяя пользовательским процессам "
+"изменять метки на объектах. Некоторые объекты также реализуют специфичные "
+"для объекта события, такие как события меток, связанные с повторной сборкой "
+"IP. Типичный помеченный объект будет иметь следующий жизненный цикл точек "
+"входа:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1625
+#, no-wrap
+msgid ""
+"Label initialization o\n"
+"(object-specific wait) \\\n"
+"Label creation o\n"
+" \\\n"
+"Relabel events, o--<--.\n"
+"Various object-specific, | |\n"
+"Access control events ~-->--o\n"
+" \\\n"
+"Label destruction o\n"
+msgstr ""
+"Label initialization o\n"
+"(object-specific wait) \\\n"
+"Label creation o\n"
+" \\\n"
+"Relabel events, o--<--.\n"
+"Various object-specific, | |\n"
+"Access control events ~-->--o\n"
+" \\\n"
+"Label destruction o\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1629
+msgid ""
+"Label initialization permits policies to allocate memory and set initial "
+"values for labels without context for the use of the object. The label slot "
+"allocated to a policy will be zeroed by default, so some policies may not "
+"need to perform initialization."
+msgstr ""
+"Инициализация меток позволяет политикам выделять память и устанавливать "
+"начальные значения для меток без контекста использования объекта. Слот "
+"метки, выделенный для политики, по умолчанию будет обнулен, поэтому "
+"некоторым политикам может не потребоваться выполнять инициализацию."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1636
+msgid ""
+"Label creation occurs when the kernel structure is associated with an actual "
+"kernel object. For example, Mbufs may be allocated and remain unused in a "
+"pool until they are required. mbuf allocation causes label initialization "
+"on the mbuf to take place, but mbuf creation occurs when the mbuf is "
+"associated with a datagram. Typically, context will be provided for a "
+"creation event, including the circumstances of the creation, and labels of "
+"other relevant objects in the creation process. For example, when an mbuf "
+"is created from a socket, the socket and its label will be presented to "
+"registered policies in addition to the new mbuf and its label. Memory "
+"allocation in creation events is discouraged, as it may occur in performance "
+"sensitive ports of the kernel; in addition, creation calls are not permitted "
+"to fail so a failure to allocate memory cannot be reported."
+msgstr ""
+"Создание метки происходит, когда структура ядра связывается с реальным "
+"объектом ядра. Например, Mbuf могут быть выделены и оставаться "
+"неиспользованными в пуле до тех пор, пока они не понадобятся. Выделение mbuf "
+"приводит к инициализации метки на mbuf, но создание mbuf происходит, когда "
+"mbuf связывается с датаграммой. Обычно для события создания предоставляется "
+"контекст, включая обстоятельства создания и метки других значимых объектов в "
+"процессе создания. Например, когда mbuf создаётся из сокета, сокет и его "
+"метка будут переданы зарегистрированным политикам в дополнение к новому mbuf "
+"и его метке. Выделение памяти в событиях создания не рекомендуется, так как "
+"это может происходить в чувствительных к производительности участках ядра; "
+"кроме того, вызовы создания не могут завершиться неудачей, поэтому "
+"невозможность выделить память не может быть сообщена."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1639
+msgid ""
+"Object specific events do not generally fall into the other broad classes of "
+"label events, but will generally provide an opportunity to modify or update "
+"the label on an object based on additional context. For example, the label "
+"on an IP fragment reassembly queue may be updated during the MAC_UPDATE_IPQ "
+"entry point as a result of the acceptance of an additional mbuf to that "
+"queue."
+msgstr ""
+"События, привящанные к объектам, обычно не попадают в другие классы событий "
+"меток, но, как правило, предоставляют возможность изменить или обновить "
+"метку объекта на основе дополнительного контекста. Например, метка в очереди "
+"сборки IP-фрагментов может быть обновлена во время точки входа "
+"`MAC_UPDATE_IPQ` в результате принятия дополнительного mbuf в эту очередь."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1641
+msgid "Access control events are discussed in detail in the following section."
+msgstr "События контроля доступа подробно рассматриваются в следующем разделе."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1643
+msgid ""
+"Label destruction permits policies to release storage or state associated "
+"with a label during its association with an object so that the kernel data "
+"structures supporting the object may be reused or released."
+msgstr ""
+"Уничтожение метки позволяет политикам освобождать хранилище или состояние, "
+"связанное с меткой во время её ассоциации с объектом, чтобы структуры данных "
+"ядра, поддерживающие объект, могли быть повторно использованы или "
+"освобождены."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1647
+msgid ""
+"In addition to labels associated with specific kernel objects, an additional "
+"class of labels exists: temporary labels. These labels are used to store "
+"update information submitted by user processes. These labels are "
+"initialized and destroyed as with other label types, but the creation event "
+"is MAC_INTERNALIZE, which accepts a user label to be converted to an in-"
+"kernel representation."
+msgstr ""
+"В дополнение к меткам, связанным с определёнными объектами ядра, существует "
+"дополнительный класс меток: временные метки. Эти метки используются для "
+"хранения информации об обновлениях, отправляемых пользовательскими "
+"процессами. Они инициализируются и уничтожаются так же, как и другие типы "
+"меток, но событие создания — это `MAC_INTERNALIZE`, которое принимает "
+"пользовательскую метку для преобразования во внутреннее представление в ядре."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1649
+#, no-wrap
+msgid "File System Object Labeling Event Operations"
+msgstr "Действия с событиями меток объектов файловой системы"
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1652
+#, no-wrap
+msgid "`mpo_associate_vnode_devfs`"
+msgstr "`mpo_associate_vnode_devfs`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1659
+#, no-wrap
+msgid ""
+"void mpo_associate_vnode_devfs(struct mount *mp, struct label *fslabel,\n"
+" struct devfs_dirent *de, struct label *delabel, struct vnode *vp,\n"
+" struct label *vlabel);\n"
+msgstr ""
+"void mpo_associate_vnode_devfs(struct mount *mp, struct label *fslabel,\n"
+" struct devfs_dirent *de, struct label *delabel, struct vnode *vp,\n"
+" struct label *vlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1669
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1712
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1750
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1854
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1951
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3834
+#, no-wrap
+msgid "`mp`"
+msgstr "`mp`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1670
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1855
+#, no-wrap
+msgid "Devfs mount point"
+msgstr "Точка монтирования devfs"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1674
+#, no-wrap
+msgid "Devfs file system label (`mp->mnt_fslabel`)"
+msgstr "Метка файловой системы devfs (`mp->mnt_fslabel`)"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1677
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1866
+#, no-wrap
+msgid "`de`"
+msgstr "`de`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1678
+#, no-wrap
+msgid "Devfs directory entry"
+msgstr "Запись каталога devfs"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1681
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1870
+#, no-wrap
+msgid "`delabel`"
+msgstr "`delabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1682
+#, no-wrap
+msgid "Policy label associated with `de`"
+msgstr "Метка политики, связанная с `de`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1685
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1720
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1758
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1914
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2009
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2044
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2084
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2934
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2968
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3240
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3799
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3897
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4050
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4089
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4126
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4160
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4197
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4252
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4287
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4322
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4357
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4392
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4432
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4476
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4586
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4656
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4690
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4723
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4764
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4812
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4849
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4886
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4928
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5031
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5181
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5282
+#, no-wrap
+msgid "`vp`"
+msgstr "`vp`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1686
+#, no-wrap
+msgid "vnode associated with `de`"
+msgstr "узел vnode, связанный с `de`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1689
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1724
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1762
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1918
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2048
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3244
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5185
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5286
+#, no-wrap
+msgid "`vlabel`"
+msgstr "`vlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1690
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1725
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1763
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1919
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2049
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4257
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4292
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4397
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4437
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4481
+#, no-wrap
+msgid "Policy label associated with `vp`"
+msgstr "Метка политики, связанная с `vp`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1694
+msgid ""
+"Fill in the label (`vlabel`) for a newly created devfs vnode based on the "
+"devfs directory entry passed in `de` and its label."
+msgstr ""
+"Заполнить метку (`vlabel`) для только что созданного devfs vnode на основе "
+"записи каталога devfs, переданной в `de`, и её метки."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1696
+#, no-wrap
+msgid "`mpo_associate_vnode_extattr`"
+msgstr "`mpo_associate_vnode_extattr`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1702
+#, no-wrap
+msgid ""
+"int mpo_associate_vnode_extattr(struct mount *mp, struct label *fslabel,\n"
+" struct vnode *vp, struct label *vlabel);\n"
+msgstr ""
+"int mpo_associate_vnode_extattr(struct mount *mp, struct label *fslabel,\n"
+" struct vnode *vp, struct label *vlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1713
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1751
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1899
+#, no-wrap
+msgid "File system mount point"
+msgstr "Точка монтирования файловой системы"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1717
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1755
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1903
+#, no-wrap
+msgid "File system label"
+msgstr "Метка файловой системы"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1721
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1759
+#, no-wrap
+msgid "Vnode to label"
+msgstr "Узел vnode для метки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1732
+msgid ""
+"Attempt to retrieve the label for `vp` from the file system extended "
+"attributes. Upon success, the value `0` is returned. Should extended "
+"attribute retrieval not be supported, an accepted fallback is to copy "
+"`fslabel` into `vlabel`. In the event of an error, an appropriate value for "
+"`errno` should be returned."
+msgstr ""
+"Попытка получить метку для `vp` из расширенных атрибутов файловой системы. В "
+"случае успеха возвращается значение `0`. Если получение расширенных "
+"атрибутов не поддерживается, допустимым резервным вариантом является "
+"копирование `fslabel` в `vlabel`. В случае ошибки должно быть возвращено "
+"соответствующее значение `errno`."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1734
+#, no-wrap
+msgid "`mpo_associate_vnode_singlelabel`"
+msgstr "`mpo_associate_vnode_singlelabel`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1740
+#, no-wrap
+msgid ""
+"void mpo_associate_vnode_singlelabel(struct mount *mp, struct label *fslabel,\n"
+" struct vnode *vp, struct label *vlabel);\n"
+msgstr ""
+"void mpo_associate_vnode_singlelabel(struct mount *mp, struct label *fslabel,\n"
+" struct vnode *vp, struct label *vlabel);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1767
+msgid ""
+"On non-multilabel file systems, this entry point is called to set the policy "
+"label for `vp` based on the file system label, `fslabel`."
+msgstr ""
+"На файловых системах без поддержки multilabel эта точка входа вызывается для "
+"установки метки политики для `vp` на основе метки файловой системы `fslabel`."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1769
+#, no-wrap
+msgid "`mpo_create_devfs_device`"
+msgstr "`mpo_create_devfs_device`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1775
+#, no-wrap
+msgid ""
+"void mpo_create_devfs_device(dev_t dev, struct devfs_dirent *devfs_dirent,\n"
+" struct label *label);\n"
+msgstr ""
+"void mpo_create_devfs_device(dev_t dev, struct devfs_dirent *devfs_dirent,\n"
+" struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1785
+#, no-wrap
+msgid "`dev`"
+msgstr "`dev`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1786
+#, no-wrap
+msgid "Device corresponding with `devfs_dirent`"
+msgstr "Устройство, соответствующее `devfs_dirent`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1789
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1825
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2076
+#, no-wrap
+msgid "`devfs_dirent`"
+msgstr "`devfs_dirent`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1790
+#, no-wrap
+msgid "Devfs directory entry to be labeled."
+msgstr "Запись в каталоге devfs, для которой создается метка."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1794
+#, no-wrap
+msgid "Label for `devfs_dirent` to be filled in."
+msgstr "Метка для `devfs_dirent`, которую нужно заполнить."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1799
+msgid ""
+"Fill out the label on a devfs_dirent being created for the passed device. "
+"This call will be made when the device file system is mounted, regenerated, "
+"or a new device is made available."
+msgstr ""
+"Заполнить метку на devfs_dirent, создаваемом для переданного устройства. "
+"Этот вызов будет выполнен при монтировании файловой системы устройств, её "
+"восстановлении или при появлении нового устройства."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1801
+#, no-wrap
+msgid "`mpo_create_devfs_directory`"
+msgstr "`mpo_create_devfs_directory`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1807
+#, no-wrap
+msgid ""
+"void mpo_create_devfs_directory(char *dirname, int dirnamelen,\n"
+" struct devfs_dirent *devfs_dirent, struct label *label);\n"
+msgstr ""
+"void mpo_create_devfs_directory(char *dirname, int dirnamelen,\n"
+" struct devfs_dirent *devfs_dirent, struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1817
+#, no-wrap
+msgid "`dirname`"
+msgstr "`dirname`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1818
+#, no-wrap
+msgid "Name of directory being created"
+msgstr "Имя создаваемого каталога"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1821
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5317
+#, no-wrap
+msgid "`namelen`"
+msgstr "`namelen`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1822
+#, no-wrap
+msgid "Length of string `dirname`"
+msgstr "Длина строки `dirname`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1826
+#, no-wrap
+msgid "Devfs directory entry for directory being created."
+msgstr "Запись в devfs для создаваемого каталога."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1831
+msgid ""
+"Fill out the label on a devfs_dirent being created for the passed "
+"directory. This call will be made when the device file system is mounted, "
+"regenerated, or a new device requiring a specific directory hierarchy is "
+"made available."
+msgstr ""
+"Заполнить метку на devfs_dirent, создаваемом для переданного каталога. Этот "
+"вызов будет выполнен при монтировании файловой системы устройств, её "
+"восстановлении или при появлении нового устройства, требующего определённой "
+"иерархии каталогов."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1833
+#, no-wrap
+msgid "`mpo_create_devfs_symlink`"
+msgstr "`mpo_create_devfs_symlink`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1840
+#, no-wrap
+msgid ""
+"void mpo_create_devfs_symlink(struct ucred *cred, struct mount *mp,\n"
+" struct devfs_dirent *dd, struct label *ddlabel, struct devfs_dirent *de,\n"
+" struct label *delabel);\n"
+msgstr ""
+"void mpo_create_devfs_symlink(struct ucred *cred, struct mount *mp,\n"
+" struct devfs_dirent *dd, struct label *ddlabel, struct devfs_dirent *de,\n"
+" struct label *delabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1850
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1894
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1947
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2005
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2040
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2152
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2184
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2252
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2287
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2398
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2824
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2996
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3018
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3040
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3135
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3157
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3183
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3209
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3236
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3266
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3288
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3311
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3350
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3381
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3412
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3447
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3478
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3509
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3542
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3579
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3610
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3670
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3699
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3734
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3768
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3795
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3830
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3863
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3893
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3931
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3964
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3995
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4038
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4085
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4122
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4156
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4193
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4240
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4283
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4318
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4353
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4420
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4464
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4512
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4545
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4582
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4619
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4652
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4686
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4719
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4760
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4808
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4845
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4882
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4924
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4964
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4994
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5027
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5062
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5103
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5144
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5207
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5229
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5255
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5278
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5309
+#, no-wrap
+msgid "`cred`"
+msgstr "`cred`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1851
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1895
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1948
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2006
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2041
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2153
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2185
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2253
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2288
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2399
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2825
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3041
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3136
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3158
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3184
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3210
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3237
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3267
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3289
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3312
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3351
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3382
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3413
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3448
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3479
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3510
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3543
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3580
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3611
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3641
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3671
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3700
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3735
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3769
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3796
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3831
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3864
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3894
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3932
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3965
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3996
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4039
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4086
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4123
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4157
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4194
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4241
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4284
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4354
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4385
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4421
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4465
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4513
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4546
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4583
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4620
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4653
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4687
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4720
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4761
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4809
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4846
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4883
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4925
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4965
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4995
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5028
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5063
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5104
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5145
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5178
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5208
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5230
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5256
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5279
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5310
+#, no-wrap
+msgid "Subject credential"
+msgstr "Учетные данные субъекта"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1858
+#, no-wrap
+msgid "`dd`"
+msgstr "`dd`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1859
+#, no-wrap
+msgid "Link destination"
+msgstr "Назначения cсылки"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1862
+#, no-wrap
+msgid "`ddlabel`"
+msgstr "`ddlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1863
+#, no-wrap
+msgid "Label associated with `dd`"
+msgstr "Метка, связанная с `dd`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1867
+#, no-wrap
+msgid "Symlink entry"
+msgstr "Символьная ссылка записи"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1871
+#, no-wrap
+msgid "Label associated with `de`"
+msgstr "Метка, связанная с `de`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1875
+msgid ""
+"Fill in the label (`delabel`) for a newly created man:devfs[5] symbolic link "
+"entry."
+msgstr ""
+"Заполнить метку (`delabel`) для новой структуры man:devfs[5] символьной "
+"ссылки."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1877
+#, no-wrap
+msgid "`mpo_create_vnode_extattr`"
+msgstr "`mpo_create_vnode_extattr`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1884
+#, no-wrap
+msgid ""
+"int mpo_create_vnode_extattr(struct ucred *cred, struct mount *mp,\n"
+" struct label *fslabel, struct vnode *dvp, struct label *dlabel,\n"
+" struct vnode *vp, struct label *vlabel, struct componentname *cnp);\n"
+msgstr ""
+"int mpo_create_vnode_extattr(struct ucred *cred, struct mount *mp,\n"
+" struct label *fslabel, struct vnode *dvp, struct label *dlabel,\n"
+" struct vnode *vp, struct label *vlabel, struct componentname *cnp);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1898
+#, no-wrap
+msgid "`mount`"
+msgstr "`mount`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1906
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3935
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3968
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3999
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4042
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4244
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4424
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4468
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4549
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4623
+#, no-wrap
+msgid "`dvp`"
+msgstr "`dvp`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1907
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4043
+#, no-wrap
+msgid "Parent directory vnode"
+msgstr "Родительский каталог vnode"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1910
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3939
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3972
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4003
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4046
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4248
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4428
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4472
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4553
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4627
+#, no-wrap
+msgid "`dlabel`"
+msgstr "`dlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1911
+#, no-wrap
+msgid "Label associated with `dvp`"
+msgstr "Метка, связанная с `dvp`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1915
+#, no-wrap
+msgid "Newly created vnode"
+msgstr "Вновь созданная vnode"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1922
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4007
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4058
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4260
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4440
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4488
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4557
+#, no-wrap
+msgid "`cnp`"
+msgstr "`cnp`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1923
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4059
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4441
+#, no-wrap
+msgid "Component name for `vp`"
+msgstr "Название компонента для `vp`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1929
+msgid ""
+"Write out the label for `vp` to the appropriate extended attribute. If the "
+"write succeeds, fill in `vlabel` with the label, and return 0. Otherwise, "
+"return an appropriate error."
+msgstr ""
+"Записать метку для `vp` в соответствующий расширенный атрибут. Если запись "
+"прошла успешно, заполняет `vlabel` меткой и возвращает 0. В противном случае "
+"вернет соответствующую ошибку."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1931
+#, no-wrap
+msgid "`mpo_create_mount`"
+msgstr "`mpo_create_mount`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1937
+#, no-wrap
+msgid ""
+"void mpo_create_mount(struct ucred *cred, struct mount *mp, struct label *mnt,\n"
+" struct label *fslabel);\n"
+msgstr ""
+"void mpo_create_mount(struct ucred *cred, struct mount *mp, struct label *mnt,\n"
+" struct label *fslabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1952
+#, no-wrap
+msgid "Object; file system being mounted"
+msgstr "Объект; файловая система, которая монтируется"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1956
+#, no-wrap
+msgid "Policy label to be filled in for `mp`"
+msgstr "Метка политики для заполнения в `mp`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1960
+#, no-wrap
+msgid "Policy label for the file system `mp` mounts."
+msgstr "Метка политики для файловой системы, монтируемой в `mp`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1965
+msgid ""
+"Fill out the labels on the mount point being created by the passed subject "
+"credential. This call will be made when a new file system is mounted."
+msgstr ""
+"Заполнить метки на точке монтирования, создаваемой переданными учетными "
+"данными субъекта. Этот вызов будет выполнен при монтировании новой файловой "
+"системы."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1967
+#, no-wrap
+msgid "`mpo_create_root_mount`"
+msgstr "`mpo_create_root_mount`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1973
+#, no-wrap
+msgid ""
+"void mpo_create_root_mount(struct ucred *cred, struct mount *mp,\n"
+" struct label *mntlabel, struct label *fslabel);\n"
+msgstr ""
+"void mpo_create_root_mount(struct ucred *cred, struct mount *mp,\n"
+" struct label *mntlabel, struct label *fslabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1983
+#, no-wrap
+msgid "See crossref:mac[mac-mpo-create-mount, `mpo_create_mount`]."
+msgstr "См. crossref:mac[mac-mpo-create-mount, `mpo_create_mount`]."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1987
+msgid ""
+"Fill out the labels on the mount point being created by the passed subject "
+"credential. This call will be made when the root file system is mounted, "
+"after `mpo_create_mount;`."
+msgstr ""
+"Заполнить метки на точке монтирования, создаваемой переданными учетными "
+"данными субъекта. Этот вызов будет выполнен при монтировании корневой "
+"файловой системы после `mpo_create_mount;`."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1989
+#, no-wrap
+msgid "`mpo_relabel_vnode`"
+msgstr "`mpo_relabel_vnode`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:1995
+#, no-wrap
+msgid ""
+"void mpo_relabel_vnode(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vnodelabel, struct label *newlabel);\n"
+msgstr ""
+"void mpo_relabel_vnode(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vnodelabel, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2010
+#, no-wrap
+msgid "vnode to relabel"
+msgstr "vnode для перемаркировки"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2013
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2088
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2938
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2972
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3803
+#, no-wrap
+msgid "`vnodelabel`"
+msgstr "`vnodelabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2014
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3804
+#, no-wrap
+msgid "Existing policy label for `vp`"
+msgstr "Существующая метка политики для `vp`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2017
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2264
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2299
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2334
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2836
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3044
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3424
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3711
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3746
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3772
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3807
+#, no-wrap
+msgid "`newlabel`"
+msgstr "`newlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2018
+#, no-wrap
+msgid "New, possibly partial label to replace `vnodelabel`"
+msgstr "Новая, возможно частичная метка для замены `vnodelabel`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2022
+msgid ""
+"Update the label on the passed vnode given the passed update vnode label and "
+"the passed subject credential."
+msgstr ""
+"Обновить метку на переданном vnode с учетом переданной обновленной метки "
+"vnode и переданных учетных данных субъекта."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2024
+#, no-wrap
+msgid "`mpo_setlabel_vnode_extattr`"
+msgstr "`mpo_setlabel_vnode_extattr`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2030
+#, no-wrap
+msgid ""
+"int mpo_setlabel_vnode_extattr(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vlabel, struct label *intlabel);\n"
+msgstr ""
+"int mpo_setlabel_vnode_extattr(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vlabel, struct label *intlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2045
+#, no-wrap
+msgid "Vnode for which the label is being written"
+msgstr "vnode, для которой записывается метка"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2052
+#, no-wrap
+msgid "`intlabel`"
+msgstr "`intlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2053
+#, no-wrap
+msgid "Label to write out"
+msgstr "Метка для записи"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2058
+msgid ""
+"Write out the policy from `intlabel` to an extended attribute. This is "
+"called from `vop_stdcreatevnode_ea`."
+msgstr ""
+"Записать политику из `intlabel` в расширенный атрибут. Этот метод вызывается "
+"из `vop_stdcreatevnode_ea`."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2060
+#, no-wrap
+msgid "`mpo_update_devfsdirent`"
+msgstr "`mpo_update_devfsdirent`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2066
+#, no-wrap
+msgid ""
+"void mpo_update_devfsdirent(struct devfs_dirent *devfs_dirent,\n"
+" struct label *direntlabel, struct vnode *vp, struct label *vnodelabel);\n"
+msgstr ""
+"void mpo_update_devfsdirent(struct devfs_dirent *devfs_dirent,\n"
+" struct label *direntlabel, struct vnode *vp, struct label *vnodelabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2077
+#, no-wrap
+msgid "Object; devfs directory entry"
+msgstr "Объект; каталожная запись devfs"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2080
+#, no-wrap
+msgid "`direntlabel`"
+msgstr "`direntlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2081
+#, no-wrap
+msgid "Policy label for `devfs_dirent` to be updated."
+msgstr "Метка политики для `devfs_dirent`, которая будет обновлена."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2085
+#, no-wrap
+msgid "Parent vnode"
+msgstr "Родительский vnode"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2087
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2937
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3802
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4092
+#, no-wrap
+msgid "Locked"
+msgstr "Заблокирован"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2089
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2939
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2973
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3902
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4055
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4094
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4131
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4165
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4202
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4591
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4661
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4695
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4728
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4769
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4817
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4854
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4891
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4933
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5036
+#, no-wrap
+msgid "Policy label for `vp`"
+msgstr "Метка политики для `vp`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2095
+msgid ""
+"Update the `devfs_dirent` label from the passed devfs vnode label. This "
+"call will be made when a devfs vnode has been successfully relabeled to "
+"commit the label change such that it lasts even if the vnode is recycled. "
+"It will also be made when a symlink is created in devfs, following a call to "
+"`mac_vnode_create_from_vnode` to initialize the vnode label."
+msgstr ""
+"Обновить метку `devfs_dirent` из переданной метки devfs vnode. Этот вызов "
+"будет выполнен, когда devfs vnode успешно перемаркирован, чтобы "
+"зафиксировать изменение метки, чтобы оно сохранилось, даже если vnode будет "
+"переиспользован. Он также будет выполнен при создании символьной ссылки в "
+"devfs после вызова `mac_vnode_create_from_vnode` для инициализации метки "
+"vnode."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2097
+#, no-wrap
+msgid "IPC Object Labeling Event Operations"
+msgstr "Действия с событиями меток объектов IPC"
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2100
+#, no-wrap
+msgid "`mpo_create_mbuf_from_socket`"
+msgstr "`mpo_create_mbuf_from_socket`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2106
+#, no-wrap
+msgid ""
+"void mpo_create_mbuf_from_socket(struct socket *so, struct label *socketlabel,\n"
+" struct mbuf *m, struct label *mbuflabel);\n"
+msgstr ""
+"void mpo_create_mbuf_from_socket(struct socket *so, struct label *socketlabel,\n"
+" struct mbuf *m, struct label *mbuflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2116
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3513
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3546
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3674
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3738
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4516
+#, no-wrap
+msgid "`socket`"
+msgstr "`socket`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2117
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3584
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3615
+#, no-wrap
+msgid "Socket"
+msgstr "Сокет"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2119
+#, no-wrap
+msgid "Socket locking WIP"
+msgstr "Блокировка сокетов — работа в процессе"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2120
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2192
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3517
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3550
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3587
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3618
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3678
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3742
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4520
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5152
+#, no-wrap
+msgid "`socketlabel`"
+msgstr "`socketlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2121
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3518
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3551
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3679
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4521
+#, no-wrap
+msgid "Policy label for `socket`"
+msgstr "Метка политики для `socket`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2124
+#, no-wrap
+msgid "`m`"
+msgstr "`m`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2125
+#, no-wrap
+msgid "Object; mbuf"
+msgstr "Объект; mbuf"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2128
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2326
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2610
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2646
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2682
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2863
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5078
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5119
+#, no-wrap
+msgid "`mbuflabel`"
+msgstr "`mbuflabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2129
+#, no-wrap
+msgid "Policy label to fill in for `m`"
+msgstr "Метка политики для заполнения для `m`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2134
+msgid ""
+"Set the label on a newly created mbuf header from the passed socket label. "
+"This call is made when a new datagram or message is generated by the socket "
+"and stored in the passed mbuf."
+msgstr ""
+"Установить метку на только что созданном заголовке mbuf из переданной метки "
+"сокета. Этот вызов выполняется, когда новый датаграмма или сообщение "
+"генерируется сокетом и сохраняется в переданном mbuf."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2136
+#, no-wrap
+msgid "`mpo_create_pipe`"
+msgstr "`mpo_create_pipe`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2142
+#, no-wrap
+msgid ""
+"void mpo_create_pipe(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+msgstr ""
+"void mpo_create_pipe(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2156
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2256
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3315
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3354
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3385
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3416
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3451
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3482
+#, no-wrap
+msgid "`pipe`"
+msgstr "`pipe`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2157
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2257
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3316
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3355
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3386
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3417
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3452
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3483
+#, no-wrap
+msgid "Pipe"
+msgstr "Канал"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2160
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3319
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3358
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3389
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3420
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3455
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3486
+#, no-wrap
+msgid "`pipelabel`"
+msgstr "`pipelabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2161
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3320
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3359
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3390
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3456
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3487
+#, no-wrap
+msgid "Policy label associated with `pipe`"
+msgstr "Метка политики, связанная с `pipe`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2166
+msgid ""
+"Set the label on a newly created pipe from the passed subject credential. "
+"This call is made when a new pipe is created."
+msgstr ""
+"Установить метку на только что созданном канале из переданных учетных данных "
+"субъекта. Этот вызов выполняется при создании нового канала."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2168
+#, no-wrap
+msgid "`mpo_create_socket`"
+msgstr "`mpo_create_socket`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2174
+#, no-wrap
+msgid ""
+"void mpo_create_socket(struct ucred *cred, struct socket *so,\n"
+" struct label *socketlabel);\n"
+msgstr ""
+"void mpo_create_socket(struct ucred *cred, struct socket *so,\n"
+" struct label *socketlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2187
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2290
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2401
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2929
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2967
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3798
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3866
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4088
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5147
+#, no-wrap
+msgid "Immutable"
+msgstr "Неизменяемый"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2188
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2291
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3583
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3614
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5148
+#, no-wrap
+msgid "`so`"
+msgstr "`so`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2189
+#, no-wrap
+msgid "Object; socket to label"
+msgstr "Объект; сокет для добавления метки"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2193
+#, no-wrap
+msgid "Label to fill in for `so`"
+msgstr "Метка для заполнения для `so`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2198
+msgid ""
+"Set the label on a newly created socket from the passed subject credential. "
+"This call is made when a socket is created."
+msgstr ""
+"Установить метку на новом сокете из переданных учетных данных субъекта. Этот "
+"вызов выполняется при создании сокета."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2200
+#, no-wrap
+msgid "`mpo_create_socket_from_socket`"
+msgstr "`mpo_create_socket_from_socket`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2207
+#, no-wrap
+msgid ""
+"void mpo_create_socket_from_socket(struct socket *oldsocket,\n"
+" struct label *oldsocketlabel, struct socket *newsocket,\n"
+" struct label *newsocketlabel);\n"
+msgstr ""
+"void mpo_create_socket_from_socket(struct socket *oldsocket,\n"
+" struct label *oldsocketlabel, struct socket *newsocket,\n"
+" struct label *newsocketlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2217
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2359
+#, no-wrap
+msgid "`oldsocket`"
+msgstr "`oldsocket`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2218
+#, no-wrap
+msgid "Listening socket"
+msgstr "Сокет, вызвавший listen"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2221
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2363
+#, no-wrap
+msgid "`oldsocketlabel`"
+msgstr "`oldsocketlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2222
+#, no-wrap
+msgid "Policy label associated with `oldsocket`"
+msgstr "Метка политики, связанная с `oldsocket`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2225
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2367
+#, no-wrap
+msgid "`newsocket`"
+msgstr "`newsocket`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2226
+#, no-wrap
+msgid "New socket"
+msgstr "Новый сокет"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2229
+#, no-wrap
+msgid "`newsocketlabel`"
+msgstr "`newsocketlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2230
+#, no-wrap
+msgid "Policy label associated with `newsocketlabel`"
+msgstr "Метка политики, связанная с `newsocketlabel`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2234
+msgid ""
+"Label a socket, `newsocket`, newly man:accept[2]ed, based on the "
+"man:listen[2] socket, `oldsocket`."
+msgstr ""
+"Создать метку сокета `newsocket`, только что принявшему соединение через "
+"man:accept[2], на основе сокета `oldsocket`, вызвавшего man:listen[2] ."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2236
+#, no-wrap
+msgid "`mpo_relabel_pipe`"
+msgstr "`mpo_relabel_pipe`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2242
+#, no-wrap
+msgid ""
+"void mpo_relabel_pipe(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *oldlabel, struct label *newlabel);\n"
+msgstr ""
+"void mpo_relabel_pipe(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *oldlabel, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2260
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2295
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2330
+#, no-wrap
+msgid "`oldlabel`"
+msgstr "`oldlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2261
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3421
+#, no-wrap
+msgid "Current policy label associated with `pipe`"
+msgstr "Текущая метка политики, связанная с `pipe`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2265
+#, no-wrap
+msgid "Policy label update to apply to `pipe`"
+msgstr "Обновление метки политики для применения к `pipe`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2269
+msgid "Apply a new label, `newlabel`, to `pipe`."
+msgstr "Применить новую метку `newlabel` к `pipe`."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2271
+#, no-wrap
+msgid "`mpo_relabel_socket`"
+msgstr "`mpo_relabel_socket`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2277
+#, no-wrap
+msgid ""
+"void mpo_relabel_socket(struct ucred *cred, struct socket *so,\n"
+" struct label *oldlabel, struct label *newlabel);\n"
+msgstr ""
+"void mpo_relabel_socket(struct ucred *cred, struct socket *so,\n"
+" struct label *oldlabel, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2292
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3675
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3739
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4517
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5149
+#, no-wrap
+msgid "Object; socket"
+msgstr "Объект; сокет"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2296
+#, no-wrap
+msgid "Current label for `so`"
+msgstr "Текущая метка для `so`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2300
+#, no-wrap
+msgid "Label update for `so`"
+msgstr "Метка обновления для `so`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2304
+msgid "Update the label on a socket from the passed socket label update."
+msgstr "Обновить метку на сокете из переданного обновления метки сокета."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2306
+#, no-wrap
+msgid "`mpo_set_socket_peer_from_mbuf`"
+msgstr "`mpo_set_socket_peer_from_mbuf`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2312
+#, no-wrap
+msgid ""
+"void mpo_set_socket_peer_from_mbuf(struct mbuf *mbuf, struct label *mbuflabel,\n"
+" struct label *oldlabel, struct label *newlabel);\n"
+msgstr ""
+"void mpo_set_socket_peer_from_mbuf(struct mbuf *mbuf, struct label *mbuflabel,\n"
+" struct label *oldlabel, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2322
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2606
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2642
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2678
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2859
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5074
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5115
+#, no-wrap
+msgid "`mbuf`"
+msgstr "`mbuf`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2323
+#, no-wrap
+msgid "First datagram received over socket"
+msgstr "Первый датаграмм, полученный через сокет"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2327
+#, no-wrap
+msgid "Label for `mbuf`"
+msgstr "Метка для `mbuf`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2331
+#, no-wrap
+msgid "Current label for the socket"
+msgstr "Текущая метка для сокета"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2335
+#, no-wrap
+msgid "Policy label to be filled out for the socket"
+msgstr "Метка политики для заполнения сокета"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2340
+msgid ""
+"Set the peer label on a stream socket from the passed mbuf label. This call "
+"will be made when the first datagram is received by the stream socket, with "
+"the exception of Unix domain sockets."
+msgstr ""
+"Установить метку однорангового узла на потоковом сокете из переданной метки "
+"mbuf. Этот вызов будет выполнен при получении первого датаграммы потоковым "
+"сокетом, за исключением сокетов домена Unix."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2342
+#, no-wrap
+msgid "`mpo_set_socket_peer_from_socket`"
+msgstr "`mpo_set_socket_peer_from_socket`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2349
+#, no-wrap
+msgid ""
+"void mpo_set_socket_peer_from_socket(struct socket *oldsocket,\n"
+" struct label *oldsocketlabel, struct socket *newsocket,\n"
+" struct label *newsocketpeerlabel);\n"
+msgstr ""
+"void mpo_set_socket_peer_from_socket(struct socket *oldsocket,\n"
+" struct label *oldsocketlabel, struct socket *newsocket,\n"
+" struct label *newsocketpeerlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2360
+#, no-wrap
+msgid "Local socket"
+msgstr "Локальный сокет"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2364
+#, no-wrap
+msgid "Policy label for `oldsocket`"
+msgstr "Метка политики для `oldsocket`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2368
+#, no-wrap
+msgid "Peer socket"
+msgstr "Сокет однорангового узла (peer socket)"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2371
+#, no-wrap
+msgid "`newsocketpeerlabel`"
+msgstr "`newsocketpeerlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2372
+#, no-wrap
+msgid "Policy label to fill in for `newsocket`"
+msgstr "Метка политики для заполнения для `newsocket`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2377
+msgid ""
+"Set the peer label on a stream UNIX domain socket from the passed remote "
+"socket endpoint. This call will be made when the socket pair is connected, "
+"and will be made for both endpoints."
+msgstr ""
+"Установите метку однорангового узла на потоковом UNIX-сокете из переданной "
+"конечной точки удаленного сокета. Этот вызов будет выполнен при соединении "
+"пары сокетов и будет произведен для обеих конечных точек."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2379
+#, no-wrap
+msgid "Network Object Labeling Event Operations"
+msgstr "Действия с событиями меток сетевых объектов"
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2382
+#, no-wrap
+msgid "`mpo_create_bpfdesc`"
+msgstr "`mpo_create_bpfdesc`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2388
+#, no-wrap
+msgid ""
+"void mpo_create_bpfdesc(struct ucred *cred, struct bpf_d *bpf_d,\n"
+" struct label *bpflabel);\n"
+msgstr ""
+"void mpo_create_bpfdesc(struct ucred *cred, struct bpf_d *bpf_d,\n"
+" struct label *bpflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2402
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2634
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3100
+#, no-wrap
+msgid "`bpf_d`"
+msgstr "`bpf_d`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2403
+#, no-wrap
+msgid "Object; bpf descriptor"
+msgstr "Объект; дескриптор bpf"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2406
+#, no-wrap
+msgid "`bpf`"
+msgstr "`bpf`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2407
+#, no-wrap
+msgid "Policy label to be filled in for `bpf_d`"
+msgstr "Метка политики для заполнения для `bpf_d`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2412
+msgid ""
+"Set the label on a newly created BPF descriptor from the passed subject "
+"credential. This call will be made when a BPF device node is opened by a "
+"process with the passed subject credential."
+msgstr ""
+"Установить метку на новом дескрипторе BPF из переданных учётных данных "
+"субъекта. Этот вызов будет выполнен при открытии узла устройства BPF "
+"процессом с переданными учётными данными субъекта."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2414
+#, no-wrap
+msgid "`mpo_create_ifnet`"
+msgstr "`mpo_create_ifnet`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2419
+#, no-wrap
+msgid "void mpo_create_ifnet(struct ifnet *ifnet, struct label *ifnetlabel);\n"
+msgstr "void mpo_create_ifnet(struct ifnet *ifnet, struct label *ifnetlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2429
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2598
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2670
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2714
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2828
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3108
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3703
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5066
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5107
+#, no-wrap
+msgid "`ifnet`"
+msgstr "`ifnet`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2430
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2599
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2671
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2715
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5067
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5108
+#, no-wrap
+msgid "Network interface"
+msgstr "Сетевой интерфейс"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2433
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2602
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2674
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2718
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2832
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3112
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3707
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5070
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5111
+#, no-wrap
+msgid "`ifnetlabel`"
+msgstr "`ifnetlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2434
+#, no-wrap
+msgid "Policy label to fill in for `ifnet`"
+msgstr "Метка политики для заполнения для `ifnet`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2439
+msgid ""
+"Set the label on a newly created interface. This call may be made when a "
+"new physical interface becomes available to the system, or when a pseudo-"
+"interface is instantiated during the boot or as a result of a user action."
+msgstr ""
+"Установить метку на вновь созданном интерфейсе. Этот вызов может быть "
+"выполнен, когда новое физическое устройство становится доступным системе, "
+"или когда псевдо-интерфейс создаётся во время загрузки или в результате "
+"действия пользователя."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2441
+#, no-wrap
+msgid "`mpo_create_ipq`"
+msgstr "`mpo_create_ipq`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2447
+#, no-wrap
+msgid ""
+"void mpo_create_ipq(struct mbuf *fragment, struct label *fragmentlabel,\n"
+" struct ipq *ipq, struct label *ipqlabel);\n"
+msgstr ""
+"void mpo_create_ipq(struct mbuf *fragment, struct label *fragmentlabel,\n"
+" struct ipq *ipq, struct label *ipqlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2457
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2535
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2786
+#, no-wrap
+msgid "`fragment`"
+msgstr "`fragment`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2458
+#, no-wrap
+msgid "First received IP fragment"
+msgstr "Первый полученный IP-фрагмент"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2461
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2539
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2790
+#, no-wrap
+msgid "`fragmentlabel`"
+msgstr "`fragmentlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2462
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2791
+#, no-wrap
+msgid "Policy label for `fragment`"
+msgstr "Метка политики для `fragment`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2465
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2492
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2794
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2867
+#, no-wrap
+msgid "`ipq`"
+msgstr "`ipq`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2466
+#, no-wrap
+msgid "IP reassembly queue to be labeled"
+msgstr "Очередь повторной сборки IP, которой добавляетя метка"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2469
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2496
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2798
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2871
+#, no-wrap
+msgid "`ipqlabel`"
+msgstr "`ipqlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2470
+#, no-wrap
+msgid "Policy label to be filled in for `ipq`"
+msgstr "Метка политики для заполнения в `ipq`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2474
+msgid ""
+"Set the label on a newly created IP fragment reassembly queue from the mbuf "
+"header of the first received fragment."
+msgstr ""
+"Установить метку на вновь созданной очереди сборки IP-фрагментов из "
+"заголовка mbuf первого полученного фрагмента."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2476
+#, no-wrap
+msgid "`mpo_create_datagram_from_ipq`"
+msgstr "`mpo_create_datagram_from_ipq`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2482
+#, no-wrap
+msgid ""
+"void mpo_create_create_datagram_from_ipq(struct ipq *ipq,\n"
+" struct label *ipqlabel, struct mbuf *datagram, struct label *datagramlabel);\n"
+msgstr ""
+"void mpo_create_create_datagram_from_ipq(struct ipq *ipq,\n"
+" struct label *ipqlabel, struct mbuf *datagram, struct label *datagramlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2493
+#, no-wrap
+msgid "IP reassembly queue"
+msgstr "Очередь повторной сборки IP"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2497
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2799
+#, no-wrap
+msgid "Policy label for `ipq`"
+msgstr "Метка политики для `ipq`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2500
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2527
+#, no-wrap
+msgid "`datagram`"
+msgstr "`datagram`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2501
+#, no-wrap
+msgid "Datagram to be labeled"
+msgstr "Датаграмма для добавления метки"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2504
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2531
+#, no-wrap
+msgid "`datagramlabel`"
+msgstr "`datagramlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2505
+#, no-wrap
+msgid "Policy label to be filled in for `datagramlabel`"
+msgstr "Метка политики для заполнения в `datagramlabel`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2509
+msgid ""
+"Set the label on a newly reassembled IP datagram from the IP fragment "
+"reassembly queue from which it was generated."
+msgstr ""
+"Установите метку на вновь собранный IP-датаграмму из очереди сборки IP-"
+"фрагментов, из которой он был сгенерирован."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2511
+#, no-wrap
+msgid "`mpo_create_fragment`"
+msgstr "`mpo_create_fragment`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2517
+#, no-wrap
+msgid ""
+"void mpo_create_fragment(struct mbuf *datagram, struct label *datagramlabel,\n"
+" struct mbuf *fragment, struct label *fragmentlabel);\n"
+msgstr ""
+"void mpo_create_fragment(struct mbuf *datagram, struct label *datagramlabel,\n"
+" struct mbuf *fragment, struct label *fragmentlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2528
+#, no-wrap
+msgid "Datagram"
+msgstr "Датаграмма"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2532
+#, no-wrap
+msgid "Policy label for `datagram`"
+msgstr "Метка политики для `datagram`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2536
+#, no-wrap
+msgid "Fragment to be labeled"
+msgstr "Фрагмент, которому будет установлена метка"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2540
+#, no-wrap
+msgid "Policy label to be filled in for `datagram`"
+msgstr "Метка политики для заполнения для `datagram`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2544
+msgid ""
+"Set the label on the mbuf header of a newly created IP fragment from the "
+"label on the mbuf header of the datagram it was generate from."
+msgstr ""
+"Установить метку на заголовке mbuf вновь созданного IP-фрагмента из метки на "
+"заголовке mbuf датаграммы, из которой он был сгенерирован."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2546
+#, no-wrap
+msgid "`mpo_create_mbuf_from_mbuf`"
+msgstr "`mpo_create_mbuf_from_mbuf`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2552
+#, no-wrap
+msgid ""
+"void mpo_create_mbuf_from_mbuf(struct mbuf *oldmbuf, struct label *oldmbuflabel,\n"
+" struct mbuf *newmbuf, struct label *newmbuflabel);\n"
+msgstr ""
+"void mpo_create_mbuf_from_mbuf(struct mbuf *oldmbuf, struct label *oldmbuflabel,\n"
+" struct mbuf *newmbuf, struct label *newmbuflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2562
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2706
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2750
+#, no-wrap
+msgid "`oldmbuf`"
+msgstr "`oldmbuf`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2563
+#, no-wrap
+msgid "Existing (source) mbuf"
+msgstr "Существующий (исходный) mbuf"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2566
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2710
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2754
+#, no-wrap
+msgid "`oldmbuflabel`"
+msgstr "`oldmbuflabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2567
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2711
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2755
+#, no-wrap
+msgid "Policy label for `oldmbuf`"
+msgstr "Метка политики для `oldmbuf`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2570
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2722
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2758
+#, no-wrap
+msgid "`newmbuf`"
+msgstr "`newmbuf`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2571
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2643
+#, no-wrap
+msgid "New mbuf to be labeled"
+msgstr "Новый mbuf для добавления метки"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2574
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2726
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2762
+#, no-wrap
+msgid "`newmbuflabel`"
+msgstr "`newmbuflabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2575
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2727
+#, no-wrap
+msgid "Policy label to be filled in for `newmbuf`"
+msgstr "Метка политики для заполнения в `newmbuf`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2580
+msgid ""
+"Set the label on the mbuf header of a newly created datagram from the mbuf "
+"header of an existing datagram. This call may be made in a number of "
+"situations, including when an mbuf is re-allocated for alignment purposes."
+msgstr ""
+"Установить метку в заголовке mbuf для вновь созданной датаграммы на основе "
+"заголовка mbuf существующей датаграммы. Этот вызов может быть выполнен в "
+"ряде ситуаций, включая случаи, когда для mbuf заново выделяется память для "
+"целей выравнивания."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2582
+#, no-wrap
+msgid "`mpo_create_mbuf_linklayer`"
+msgstr "`mpo_create_mbuf_linklayer`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2588
+#, no-wrap
+msgid ""
+"void mpo_create_mbuf_linklayer(struct ifnet *ifnet, struct label *ifnetlabel,\n"
+" struct mbuf *mbuf, struct label *mbuflabel);\n"
+msgstr ""
+"void mpo_create_mbuf_linklayer(struct ifnet *ifnet, struct label *ifnetlabel,\n"
+" struct mbuf *mbuf, struct label *mbuflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2603
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2719
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2833
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3113
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5071
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5112
+#, no-wrap
+msgid "Policy label for `ifnet`"
+msgstr "Метка политики для `ifnet`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2607
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2679
+#, no-wrap
+msgid "mbuf header for new datagram"
+msgstr "заголовок mbuf для новой датаграммы"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2611
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2683
+#, no-wrap
+msgid "Policy label to be filled in for `mbuf`"
+msgstr "Метка политики для заполнения для `mbuf`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2616
+msgid ""
+"Set the label on the mbuf header of a newly created datagram generated for "
+"the purposes of a link layer response for the passed interface. This call "
+"may be made in a number of situations, including for ARP or ND6 responses in "
+"the IPv4 and IPv6 stacks."
+msgstr ""
+"Установить метку в заголовке mbuf для вновь созданной датаграммы, "
+"сгенерированного для целей ответа на канальном уровне для переданного "
+"интерфейса. Этот вызов может быть выполнен в ряде ситуаций, включая ответы "
+"ARP или ND6 в стеках IPv4 и IPv6."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2618
+#, no-wrap
+msgid "`mpo_create_mbuf_from_bpfdesc`"
+msgstr "`mpo_create_mbuf_from_bpfdesc`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2624
+#, no-wrap
+msgid ""
+"void mpo_create_mbuf_from_bpfdesc(struct bpf_d *bpf_d, struct label *bpflabel,\n"
+" struct mbuf *mbuf, struct label *mbuflabel);\n"
+msgstr ""
+"void mpo_create_mbuf_from_bpfdesc(struct bpf_d *bpf_d, struct label *bpflabel,\n"
+" struct mbuf *mbuf, struct label *mbuflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2635
+#, no-wrap
+msgid "BPF descriptor"
+msgstr "Дескриптор BPF"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2638
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3104
+#, no-wrap
+msgid "`bpflabel`"
+msgstr "`bpflabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2639
+#, no-wrap
+msgid "Policy label for `bpflabel`"
+msgstr "Метка политики для `bpflabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2647
+#, no-wrap
+msgid "Policy label to fill in for `mbuf`"
+msgstr "Метка политики для заполнения `mbuf`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2652
+msgid ""
+"Set the label on the mbuf header of a newly created datagram generated using "
+"the passed BPF descriptor. This call is made when a write is performed to "
+"the BPF device associated with the passed BPF descriptor."
+msgstr ""
+"Установить метку на заголовок mbuf вновь созданной датаграммы, "
+"сгенерированной с использованием переданного дескриптора BPF. Этот вызов "
+"выполняется при записи в устройство BPF, связанное с переданным дескриптором "
+"BPF."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2654
+#, no-wrap
+msgid "`mpo_create_mbuf_from_ifnet`"
+msgstr "`mpo_create_mbuf_from_ifnet`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2660
+#, no-wrap
+msgid ""
+"void mpo_create_mbuf_from_ifnet(struct ifnet *ifnet, struct label *ifnetlabel,\n"
+" struct mbuf *mbuf, struct label *mbuflabel);\n"
+msgstr ""
+"void mpo_create_mbuf_from_ifnet(struct ifnet *ifnet, struct label *ifnetlabel,\n"
+" struct mbuf *mbuf, struct label *mbuflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2675
+#, no-wrap
+msgid "Policy label for `ifnetlabel`"
+msgstr "Метка политики для `ifnetlabel`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2687
+msgid ""
+"Set the label on the mbuf header of a newly created datagram generated from "
+"the passed network interface."
+msgstr ""
+"Установить метку на заголовке mbuf вновь созданной датаграммы, "
+"сгенерированной из переданного сетевого интерфейса."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2689
+#, no-wrap
+msgid "`mpo_create_mbuf_multicast_encap`"
+msgstr "`mpo_create_mbuf_multicast_encap`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2696
+#, no-wrap
+msgid ""
+"void mpo_create_mbuf_multicast_encap(struct mbuf *oldmbuf,\n"
+" struct label *oldmbuflabel, struct ifnet *ifnet, struct label *ifnetlabel,\n"
+" struct mbuf *newmbuf, struct label *newmbuflabel);\n"
+msgstr ""
+"void mpo_create_mbuf_multicast_encap(struct mbuf *oldmbuf,\n"
+" struct label *oldmbuflabel, struct ifnet *ifnet, struct label *ifnetlabel,\n"
+" struct mbuf *newmbuf, struct label *newmbuflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2707
+#, no-wrap
+msgid "mbuf header for existing datagram"
+msgstr "Заголовок mbuf для существующего датаграммы"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2723
+#, no-wrap
+msgid "mbuf header to be labeled for new datagram"
+msgstr "Заголовок mbuf для пометки новой датаграммы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2732
+msgid ""
+"Set the label on the mbuf header of a newly created datagram generated from "
+"the existing passed datagram when it is processed by the passed multicast "
+"encapsulation interface. This call is made when an mbuf is to be delivered "
+"using the virtual interface."
+msgstr ""
+"Установить метку в заголовке mbuf для вновь созданной датаграммы, "
+"сгенерированной из существующей переданной датаграммы, при её обработке "
+"переданным интерфейсом мультикастовой инкапсуляции. Этот вызов происходит "
+"при доставке mbuf с использованием виртуального интерфейса."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2734
+#, no-wrap
+msgid "`mpo_create_mbuf_netlayer`"
+msgstr "`mpo_create_mbuf_netlayer`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2740
+#, no-wrap
+msgid ""
+"void mpo_create_mbuf_netlayer(struct mbuf *oldmbuf, struct label *oldmbuflabel,\n"
+" struct mbuf *newmbuf, struct label *newmbuflabel);\n"
+msgstr ""
+"void mpo_create_mbuf_netlayer(struct mbuf *oldmbuf, struct label *oldmbuflabel,\n"
+" struct mbuf *newmbuf, struct label *newmbuflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2751
+#, no-wrap
+msgid "Received datagram"
+msgstr "Полученная датаграмма"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2759
+#, no-wrap
+msgid "Newly created datagram"
+msgstr "Вновь созданная датаграмма"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2763
+#, no-wrap
+msgid "Policy label for `newmbuf`"
+msgstr "Метка политики для `newmbuf`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2768
+msgid ""
+"Set the label on the mbuf header of a newly created datagram generated by "
+"the IP stack in response to an existing received datagram (`oldmbuf`). This "
+"call may be made in a number of situations, including when responding to "
+"ICMP request datagrams."
+msgstr ""
+"Установить метку на заголовок mbuf вновь созданной датаграммы, "
+"сгенерированной стеком IP в ответ на полученную датаграмму (`oldmbuf`). Этот "
+"вызов может быть выполнен в различных ситуациях, включая ответ на датаграммы "
+"ICMP-запросов."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2770
+#, no-wrap
+msgid "`mpo_fragment_match`"
+msgstr "`mpo_fragment_match`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2776
+#, no-wrap
+msgid ""
+"int mpo_fragment_match(struct mbuf *fragment, struct label *fragmentlabel,\n"
+" struct ipq *ipq, struct label *ipqlabel);\n"
+msgstr ""
+"int mpo_fragment_match(struct mbuf *fragment, struct label *fragmentlabel,\n"
+" struct ipq *ipq, struct label *ipqlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2787
+#, no-wrap
+msgid "IP datagram fragment"
+msgstr "Фрагмент IP-датаграммы"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2795
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2868
+#, no-wrap
+msgid "IP fragment reassembly queue"
+msgstr "Очередь сборки IP-фрагментов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2806
+msgid ""
+"Determine whether an mbuf header containing an IP datagram (`fragment`) "
+"fragment matches the label of the passed IP fragment reassembly queue "
+"(`ipq`). Return (1) for a successful match, or (0) for no match. This call "
+"is made when the IP stack attempts to find an existing fragment reassembly "
+"queue for a newly received fragment; if this fails, a new fragment "
+"reassembly queue may be instantiated for the fragment. Policies may use "
+"this entry point to prevent the reassembly of otherwise matching IP "
+"fragments if policy does not permit them to be reassembled based on the "
+"label or other information."
+msgstr ""
+"Определить, соответствует ли заголовок mbuf, содержащий фрагмент IP-"
+"датаграммы (`fragment`), метке переданной очереди сборки IP-фрагментов "
+"(`ipq`). Возвращает (1) при успешном совпадении или (0) при отсутствии "
+"совпадения. Этот вызов выполняется, когда IP-стек пытается найти "
+"существующую очередь сборки фрагментов для вновь полученного фрагмента; если "
+"поиск не удаётся, для фрагмента может быть создана новая очередь сборки. "
+"Политики могут использовать эту точку входа, чтобы предотвратить сборку в "
+"остальном подходящих IP-фрагментов, если политика не разрешает их сборку на "
+"основе метки или другой информации."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2808
+#, no-wrap
+msgid "`mpo_relabel_ifnet`"
+msgstr "`mpo_relabel_ifnet`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2814
+#, no-wrap
+msgid ""
+"void mpo_relabel_ifnet(struct ucred *cred, struct ifnet *ifnet,\n"
+" struct label *ifnetlabel, struct label *newlabel);\n"
+msgstr ""
+"void mpo_relabel_ifnet(struct ucred *cred, struct ifnet *ifnet,\n"
+" struct label *ifnetlabel, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2829
+#, no-wrap
+msgid "Object; Network interface"
+msgstr "Объект; Сетевой интерфейс"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2837
+#, no-wrap
+msgid "Label update to apply to `ifnet`"
+msgstr "Метка обновления для применения к `ifnet`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2841
+msgid ""
+"Update the label of network interface, `ifnet`, based on the passed update "
+"label, `newlabel`, and the passed subject credential, `cred`."
+msgstr ""
+"Обновить метку сетевого интерфейса, `ifnet`, на основе переданной новой "
+"метки, `newlabel`, и переданных учетных данных субъекта, `cred`."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2843
+#, no-wrap
+msgid "`mpo_update_ipq`"
+msgstr "`mpo_update_ipq`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2849
+#, no-wrap
+msgid ""
+"void mpo_update_ipq(struct mbuf *fragment, struct label *fragmentlabel,\n"
+" struct ipq *ipq, struct label *ipqlabel);\n"
+msgstr ""
+"void mpo_update_ipq(struct mbuf *fragment, struct label *fragmentlabel,\n"
+" struct ipq *ipq, struct label *ipqlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2860
+#, no-wrap
+msgid "IP fragment"
+msgstr "IP фрагмент"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2864
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5079
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5120
+#, no-wrap
+msgid "Policy label for `mbuf`"
+msgstr "Метка политики для `mbuf`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2872
+#, no-wrap
+msgid "Policy label to be updated for `ipq`"
+msgstr "Метка политики для обновления для `ipq`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2876
+msgid ""
+"Update the label on an IP fragment reassembly queue (`ipq`) based on the "
+"acceptance of the passed IP fragment mbuf header (`mbuf`)."
+msgstr ""
+"Обновить метку в очереди сборки IP-фрагментов (`ipq`) на основе принятия "
+"переданного заголовка IP-фрагмента mbuf (`mbuf`)."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2878
+#, no-wrap
+msgid "Process Labeling Event Operations"
+msgstr "Действия с событиями меток процессов"
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2881
+#, no-wrap
+msgid "`mpo_create_cred`"
+msgstr "`mpo_create_cred`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2886
+#, no-wrap
+msgid "void mpo_create_cred(struct ucred *parent_cred, struct ucred *child_cred);\n"
+msgstr "void mpo_create_cred(struct ucred *parent_cred, struct ucred *child_cred);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2896
+#, no-wrap
+msgid "`parent_cred`"
+msgstr "`parent_cred`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2897
+#, no-wrap
+msgid "Parent subject credential"
+msgstr "Учетные данные субъекта‐родителя"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2900
+#, no-wrap
+msgid "`child_cred`"
+msgstr "`child_cred`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2901
+#, no-wrap
+msgid "Child subject credential"
+msgstr "Учётные данные дочернего субъекта"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2907
+msgid ""
+"Set the label of a newly created subject credential from the passed subject "
+"credential. This call will be made when man:crcopy[9] is invoked on a newly "
+"created `struct ucred`. This call should not be confused with a process "
+"forking or creation event."
+msgstr ""
+"Установить метку вновь созданного субъекта из переданного субъекта. Этот "
+"вызов будет выполнен при вызове man:crcopy[9] для только что созданной "
+"структуры `struct ucred`. Этот вызов не следует путать с событием создания "
+"или ветвления процесса."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2909
+#, no-wrap
+msgid "`mpo_execve_transition`"
+msgstr "`mpo_execve_transition`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2915
+#, no-wrap
+msgid ""
+"void mpo_execve_transition(struct ucred *old, struct ucred *new,\n"
+" struct vnode *vp, struct label *vnodelabel);\n"
+msgstr ""
+"void mpo_execve_transition(struct ucred *old, struct ucred *new,\n"
+" struct vnode *vp, struct label *vnodelabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2926
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2964
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5321
+#, no-wrap
+msgid "`old`"
+msgstr "`old`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2927
+#, no-wrap
+msgid "Existing subject credential"
+msgstr "Учетные данные существующего субъекта"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2930
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5333
+#, no-wrap
+msgid "`new`"
+msgstr "`new`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2931
+#, no-wrap
+msgid "New subject credential to be labeled"
+msgstr "Учетные данные нового субъекта для добавления метки"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2935
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2969
+#, no-wrap
+msgid "File to execute"
+msgstr "Файл для выполнения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2946
+msgid ""
+"Update the label of a newly created subject credential (`new`) from the "
+"passed existing subject credential (`old`) based on a label transition "
+"caused by executing the passed vnode (`vp`). This call occurs when a "
+"process executes the passed vnode and one of the policies returns a success "
+"from the `mpo_execve_will_transition` entry point. Policies may choose to "
+"implement this call simply by invoking `mpo_create_cred` and passing the two "
+"subject credentials so as not to implement a transitioning event. Policies "
+"should not leave this entry point unimplemented if they implement "
+"`mpo_create_cred`, even if they do not implement "
+"`mpo_execve_will_transition`."
+msgstr ""
+"Обновить метку учетных данных вновь созданного субъекта (`new`) на основе "
+"переданных учетных данных существующего субъекта (`old`) в соответствии с "
+"переходом метки, вызванным выполнением переданного vnode (`vp`). Этот вызов "
+"происходит, когда процесс выполняет переданный vnode, и одна из политик "
+"возвращает успех из точки входа `mpo_execve_will_transition`. Политики могут "
+"выбрать реализацию этого вызова просто путем вызова `mpo_create_cred` и "
+"передачи двух субъектов учетных данных, чтобы не реализовывать событие "
+"перехода. Политики не должны оставлять эту точку входа нереализованной, если "
+"они реализуют `mpo_create_cred`, даже если они не реализуют "
+"`mpo_execve_will_transition`."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2948
+#, no-wrap
+msgid "`mpo_execve_will_transition`"
+msgstr "`mpo_execve_will_transition`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2954
+#, no-wrap
+msgid ""
+"int mpo_execve_will_transition(struct ucred *old, struct vnode *vp,\n"
+" struct label *vnodelabel);\n"
+msgstr ""
+"int mpo_execve_will_transition(struct ucred *old, struct vnode *vp,\n"
+" struct label *vnodelabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2965
+#, no-wrap
+msgid "Subject credential prior to man:execve[2]"
+msgstr "Учетные данные субъекта перед man:execve[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2979
+msgid ""
+"Determine whether the policy will want to perform a transition event as a "
+"result of the execution of the passed vnode by the passed subject "
+"credential. Return 1 if a transition is required, 0 if not. Even if a "
+"policy returns 0, it should behave correctly in the presence of an "
+"unexpected invocation of `mpo_execve_transition`, as that call may happen as "
+"a result of another policy requesting a transition."
+msgstr ""
+"Определить, будет ли политика выполнять событие перехода в результате "
+"выполнения переданного vnode с использованием переданных учетных данных "
+"субъекта. Вернуть 1, если переход требуется, и 0, если нет. Даже если "
+"политика возвращает 0, она должна корректно обрабатывать неожиданный вызов "
+"`mpo_execve_transition`, так как этот вызов может произойти из-за запроса "
+"перехода другой политикой."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2981
+#, no-wrap
+msgid "`mpo_create_proc0`"
+msgstr "`mpo_create_proc0`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2986
+#, no-wrap
+msgid "void mpo_create_proc0(struct ucred *cred);\n"
+msgstr "void mpo_create_proc0(struct ucred *cred);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:2997
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3019
+#, no-wrap
+msgid "Subject credential to be filled in"
+msgstr "Учетные данные субъекта для заполнения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3001
+msgid ""
+"Create the subject credential of process 0, the parent of all kernel "
+"processes."
+msgstr ""
+"Создать учетные данные субъекта процесса 0, родителя всех процессов ядра."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3003
+#, no-wrap
+msgid "`mpo_create_proc1`"
+msgstr "`mpo_create_proc1`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3008
+#, no-wrap
+msgid "void mpo_create_proc1(struct ucred *cred);\n"
+msgstr "void mpo_create_proc1(struct ucred *cred);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3023
+msgid ""
+"Create the subject credential of process 1, the parent of all user processes."
+msgstr ""
+"Создать учетные данные субъекта процесса 1, родителя всех пользовательских "
+"процессов."
+
+#. type: Title =====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3025
+#, no-wrap
+msgid "`mpo_relabel_cred`"
+msgstr "`mpo_relabel_cred`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3030
+#, no-wrap
+msgid "void mpo_relabel_cred(struct ucred *cred, struct label *newlabel);\n"
+msgstr "void mpo_relabel_cred(struct ucred *cred, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3045
+#, no-wrap
+msgid "Label update to apply to `cred`"
+msgstr "Обновление метки для применения к `cred`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3049
+msgid "Update the label on a subject credential from the passed update label."
+msgstr ""
+"Обновить метку на учетных данных субъекта из переданной обновляемой метки."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3051
+#, no-wrap
+msgid "Access Control Checks"
+msgstr "Проверки контроля доступа"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3059
+msgid ""
+"Access control entry points permit policy modules to influence access "
+"control decisions made by the kernel. Generally, although not always, "
+"arguments to an access control entry point will include one or more "
+"authorizing credentials, information (possibly including a label) for any "
+"other objects involved in the operation. An access control entry point may "
+"return 0 to permit the operation, or an man:errno[2] error value. The "
+"results of invoking the entry point across various registered policy modules "
+"will be composed as follows: if all modules permit the operation to succeed, "
+"success will be returned. If one or modules returns a failure, a failure "
+"will be returned. If more than one module returns a failure, the errno "
+"value to return to the user will be selected using the following precedence, "
+"implemented by the `error_select()` function in [.filename]#kern_mac.c#:"
+msgstr ""
+"Точки входа контроля доступа позволяют модулям политики влиять на решения по "
+"контролю доступа, принимаемые ядром. Обычно, хотя и не всегда, аргументы "
+"точки входа контроля доступа включают одно или несколько удостоверяющих "
+"полномочий, информацию (возможно, включая метку) для любых других объектов, "
+"участвующих в операции. Точка входа контроля доступа может вернуть 0 для "
+"разрешения операции или значение ошибки man:errno[2]. Результаты вызова "
+"точки входа через различные зарегистрированные модули политики будут "
+"объединены следующим образом: если все модули разрешают успешное выполнение "
+"операции, будет возвращен успех. Если один или несколько модулей возвращают "
+"ошибку, будет возвращена ошибка. Если более одного модуля возвращают ошибку, "
+"значение errno, которое будет возвращено пользователю, выбирается с "
+"использованием следующего приоритета, реализованного функцией "
+"`error_select()` в [.filename]#kern_mac.c#:"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3065
+#, no-wrap
+msgid "Most precedence"
+msgstr "Наивысший приоритет"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3067
+#, no-wrap
+msgid "EDEADLK"
+msgstr "EDEADLK"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3070
+#, no-wrap
+msgid "EINVAL"
+msgstr "EINVAL"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3073
+#, no-wrap
+msgid "ESRCH"
+msgstr "ESRCH"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3076
+#, no-wrap
+msgid "EACCES"
+msgstr "EACCES"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3077
+#, no-wrap
+msgid "Least precedence"
+msgstr "Наименьший приоритет"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3078
+#, no-wrap
+msgid "EPERM"
+msgstr "EPERM"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3082
+msgid ""
+"If none of the error values returned by all modules are listed in the "
+"precedence chart then an arbitrarily selected value from the set will be "
+"returned. In general, the rules provide precedence to errors in the "
+"following order: kernel failures, invalid arguments, object not present, "
+"access not permitted, other."
+msgstr ""
+"Если ни одно из значений ошибок, возвращаемых всеми модулями, не указано в "
+"таблице приоритетов, будет возвращено произвольно выбранное значение из "
+"набора. В общем случае правила устанавливают следующий порядок приоритетов "
+"ошибок: сбои ядра, неверные аргументы, отсутствие объекта, отсутствие "
+"доступа, прочие."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3084
+#, no-wrap
+msgid "`mpo_check_bpfdesc_receive`"
+msgstr "`mpo_check_bpfdesc_receive`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3090
+#, no-wrap
+msgid ""
+"int mpo_check_bpfdesc_receive(struct bpf_d *bpf_d, struct label *bpflabel,\n"
+" struct ifnet *ifnet, struct label *ifnetlabel);\n"
+msgstr ""
+"int mpo_check_bpfdesc_receive(struct bpf_d *bpf_d, struct label *bpflabel,\n"
+" struct ifnet *ifnet, struct label *ifnetlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3101
+#, no-wrap
+msgid "Subject; BPF descriptor"
+msgstr "Субъект; Дескриптор BPF"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3105
+#, no-wrap
+msgid "Policy label for `bpf_d`"
+msgstr "Метка политики для `bpf_d`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3109
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3704
+#, no-wrap
+msgid "Object; network interface"
+msgstr "Объект; сетевой интерфейс"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3118
+msgid ""
+"Determine whether the MAC framework should permit datagrams from the passed "
+"interface to be delivered to the buffers of the passed BPF descriptor. "
+"Return (0) for success, or an `errno` value for failure Suggested failure: "
+"EACCES for label mismatches, EPERM for lack of privilege."
+msgstr ""
+"Определить, должен ли framework MAC разрешать доставку датаграмм с "
+"переданного интерфейса в буферы переданного BPF-дескриптора. Возвращает (0) "
+"при успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при "
+"несоответствии меток, EPERM при отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3120
+#, no-wrap
+msgid "`mpo_check_kenv_dump`"
+msgstr "`mpo_check_kenv_dump`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3125
+#, no-wrap
+msgid "int mpo_check_kenv_dump(struct ucred *cred);\n"
+msgstr "int mpo_check_kenv_dump(struct ucred *cred);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3140
+msgid ""
+"Determine whether the subject should be allowed to retrieve the kernel "
+"environment (see man:kenv[2])."
+msgstr ""
+"Определить, следует ли разрешить субъекту получать доступ к окружению ядра "
+"(см. man:kenv[2])."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3142
+#, no-wrap
+msgid "`mpo_check_kenv_get`"
+msgstr "`mpo_check_kenv_get`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3147
+#, no-wrap
+msgid "int mpo_check_kenv_get(struct ucred *cred, char *name);\n"
+msgstr "int mpo_check_kenv_get(struct ucred *cred, char *name);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3161
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3187
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3213
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4209
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4776
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5313
+#, no-wrap
+msgid "`name`"
+msgstr "`name`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3162
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3188
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3214
+#, no-wrap
+msgid "Kernel environment variable name"
+msgstr "Имя переменной окружения ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3166
+msgid ""
+"Determine whether the subject should be allowed to retrieve the value of the "
+"specified kernel environment variable."
+msgstr ""
+"Определить, следует ли разрешить субъекту получать значение указанной "
+"переменной окружения ядра."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3168
+#, no-wrap
+msgid "`mpo_check_kenv_set`"
+msgstr "`mpo_check_kenv_set`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3173
+#, no-wrap
+msgid "int mpo_check_kenv_set(struct ucred *cred, char *name);\n"
+msgstr "int mpo_check_kenv_set(struct ucred *cred, char *name);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3192
+msgid ""
+"Determine whether the subject should be allowed to set the specified kernel "
+"environment variable."
+msgstr ""
+"Определить, следует ли разрешить субъекту устанавливать указанную переменную "
+"окружения ядра."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3194
+#, no-wrap
+msgid "`mpo_check_kenv_unset`"
+msgstr "`mpo_check_kenv_unset`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3199
+#, no-wrap
+msgid "int mpo_check_kenv_unset(struct ucred *cred, char *name);\n"
+msgstr "int mpo_check_kenv_unset(struct ucred *cred, char *name);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3218
+msgid ""
+"Determine whether the subject should be allowed to unset the specified "
+"kernel environment variable."
+msgstr ""
+"Определить, следует ли разрешить субъекту сбросить указанную переменную "
+"окружения ядра."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3220
+#, no-wrap
+msgid "`mpo_check_kld_load`"
+msgstr "`mpo_check_kld_load`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3226
+#, no-wrap
+msgid ""
+"int mpo_check_kld_load(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vlabel);\n"
+msgstr ""
+"int mpo_check_kld_load(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3241
+#, no-wrap
+msgid "Kernel module vnode"
+msgstr "vnode модуля ядра"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3245
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5186
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5287
+#, no-wrap
+msgid "Label associated with `vp`"
+msgstr "Метка, связанная с `vp`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3249
+msgid ""
+"Determine whether the subject should be allowed to load the specified module "
+"file."
+msgstr ""
+"Определить, следует ли разрешить субъекту загружать указанный файл модуля."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3251
+#, no-wrap
+msgid "`mpo_check_kld_stat`"
+msgstr "`mpo_check_kld_stat`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3256
+#, no-wrap
+msgid "int mpo_check_kld_stat(struct ucred *cred);\n"
+msgstr "int mpo_check_kld_stat(struct ucred *cred);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3271
+msgid ""
+"Determine whether the subject should be allowed to retrieve a list of loaded "
+"kernel module files and associated statistics."
+msgstr ""
+"Определить, следует ли разрешить субъекту получать список загруженных файлов "
+"модулей ядра и связанную с ними статистику."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3273
+#, no-wrap
+msgid "`mpo_check_kld_unload`"
+msgstr "`mpo_check_kld_unload`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3278
+#, no-wrap
+msgid "int mpo_check_kld_unload(struct ucred *cred);\n"
+msgstr "int mpo_check_kld_unload(struct ucred *cred);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3293
+msgid ""
+"Determine whether the subject should be allowed to unload a kernel module."
+msgstr "Определить, следует ли разрешить субъекту выгружать модуль ядра."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3295
+#, no-wrap
+msgid "`mpo_check_pipe_ioctl`"
+msgstr "`mpo_check_pipe_ioctl`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3301
+#, no-wrap
+msgid ""
+"int mpo_check_pipe_ioctl(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel, unsigned long cmd, void *data);\n"
+msgstr ""
+"int mpo_check_pipe_ioctl(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel, unsigned long cmd, void *data);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3323
+#, no-wrap
+msgid "`cmd`"
+msgstr "`cmd`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3324
+#, no-wrap
+msgid "man:ioctl[2] command"
+msgstr "команда nman:ioctl[2]"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3327
+#, no-wrap
+msgid "`data`"
+msgstr "`data`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3328
+#, no-wrap
+msgid "man:ioctl[2] data"
+msgstr "данные man:ioctl[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3332
+msgid ""
+"Determine whether the subject should be allowed to make the specified "
+"man:ioctl[2] call."
+msgstr ""
+"Определить, следует ли разрешить субъекту выполнять указанный вызов "
+"man:ioctl[2]."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3334
+#, no-wrap
+msgid "`mpo_check_pipe_poll`"
+msgstr "`mpo_check_pipe_poll`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3340
+#, no-wrap
+msgid ""
+"int mpo_check_pipe_poll(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+msgstr ""
+"int mpo_check_pipe_poll(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3363
+msgid "Determine whether the subject should be allowed to poll `pipe`."
+msgstr "Определить, следует ли разрешить субъекту опрашивать `pipe`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3365
+#, no-wrap
+msgid "`mpo_check_pipe_read`"
+msgstr "`mpo_check_pipe_read`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3371
+#, no-wrap
+msgid ""
+"int mpo_check_pipe_read(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+msgstr ""
+"int mpo_check_pipe_read(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3394
+msgid "Determine whether the subject should be allowed read access to `pipe`."
+msgstr "Определить, следует ли разрешить субъекту доступ на чтение к `pipe`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3396
+#, no-wrap
+msgid "`mpo_check_pipe_relabel`"
+msgstr "`mpo_check_pipe_relabel`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3402
+#, no-wrap
+msgid ""
+"int mpo_check_pipe_relabel(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel, struct label *newlabel);\n"
+msgstr ""
+"int mpo_check_pipe_relabel(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3425
+#, no-wrap
+msgid "Label update to `pipelabel`"
+msgstr "Обновление метки до `pipelabel`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3429
+msgid "Determine whether the subject should be allowed to relabel `pipe`."
+msgstr "Определить, следует ли разрешить субъекту изменять метку `pipe`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3431
+#, no-wrap
+msgid "`mpo_check_pipe_stat`"
+msgstr "`mpo_check_pipe_stat`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3437
+#, no-wrap
+msgid ""
+"int mpo_check_pipe_stat(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+msgstr ""
+"int mpo_check_pipe_stat(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3460
+msgid ""
+"Determine whether the subject should be allowed to retrieve statistics "
+"related to `pipe`."
+msgstr ""
+"Определить, следует ли разрешить субъекту получать статистику, связанную с "
+"`pipe`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3462
+#, no-wrap
+msgid "`mpo_check_pipe_write`"
+msgstr "`mpo_check_pipe_write`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3468
+#, no-wrap
+msgid ""
+"int mpo_check_pipe_write(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+msgstr ""
+"int mpo_check_pipe_write(struct ucred *cred, struct pipe *pipe,\n"
+" struct label *pipelabel);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3491
+msgid "Determine whether the subject should be allowed to write to `pipe`."
+msgstr "Определить, следует ли разрешить субъекту запись в `pipe`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3493
+#, no-wrap
+msgid "`mpo_check_socket_bind`"
+msgstr "`mpo_check_socket_bind`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3499
+#, no-wrap
+msgid ""
+"int mpo_check_socket_bind(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel, struct sockaddr *sockaddr);\n"
+msgstr ""
+"int mpo_check_socket_bind(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel, struct sockaddr *sockaddr);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3514
+#, no-wrap
+msgid "Socket to be bound"
+msgstr "Сокет для привязки"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3521
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3554
+#, no-wrap
+msgid "`sockaddr`"
+msgstr "`sockaddr`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3522
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3555
+#, no-wrap
+msgid "Address of `socket`"
+msgstr "Адрес `socket`"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3526
+#, no-wrap
+msgid "`mpo_check_socket_connect`"
+msgstr "`mpo_check_socket_connect`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3532
+#, no-wrap
+msgid ""
+"int mpo_check_socket_connect(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel, struct sockaddr *sockaddr);\n"
+msgstr ""
+"int mpo_check_socket_connect(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel, struct sockaddr *sockaddr);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3547
+#, no-wrap
+msgid "Socket to be connected"
+msgstr "Сокет для подключения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3561
+msgid ""
+"Determine whether the subject credential (`cred`) can connect the passed "
+"socket (`socket`) to the passed socket address (`sockaddr`). Return 0 for "
+"success, or an `errno` value for failure. Suggested failure: EACCES for "
+"label mismatches, EPERM for lack of privilege."
+msgstr ""
+"Определить, может ли субъект с учётными данными (`cred`) подключить "
+"переданный сокет (`socket`) к переданному адресу сокета (`sockaddr`). "
+"Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые "
+"ошибки: EACCES при несоответствии меток, EPERM при отсутствии прав."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3563
+#, no-wrap
+msgid "`mpo_check_socket_receive`"
+msgstr "`mpo_check_socket_receive`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3569
+#, no-wrap
+msgid ""
+"int mpo_check_socket_receive(struct ucred *cred, struct socket *so,\n"
+" struct label *socketlabel);\n"
+msgstr ""
+"int mpo_check_socket_receive(struct ucred *cred, struct socket *so,\n"
+" struct label *socketlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3588
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3619
+#, no-wrap
+msgid "Policy label associated with `so`"
+msgstr "Метка политики, связанная с `so`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3592
+msgid ""
+"Determine whether the subject should be allowed to receive information from "
+"the socket `so`."
+msgstr ""
+"Определить, следует ли разрешить субъекту получать информацию из сокета `so`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3594
+#, no-wrap
+msgid "`mpo_check_socket_send`"
+msgstr "`mpo_check_socket_send`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3600
+#, no-wrap
+msgid ""
+"int mpo_check_socket_send(struct ucred *cred, struct socket *so,\n"
+" struct label *socketlabel);\n"
+msgstr ""
+"int mpo_check_socket_send(struct ucred *cred, struct socket *so,\n"
+" struct label *socketlabel);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3623
+msgid ""
+"Determine whether the subject should be allowed to send information across "
+"the socket `so`."
+msgstr ""
+"Определить, следует ли разрешить субъекту передавать информацию через сокет "
+"`so`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3625
+#, no-wrap
+msgid "`mpo_check_cred_visible`"
+msgstr "`mpo_check_cred_visible`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3630
+#, no-wrap
+msgid "int mpo_check_cred_visible(struct ucred *u1, struct ucred *u2);\n"
+msgstr "int mpo_check_cred_visible(struct ucred *u1, struct ucred *u2);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3640
+#, no-wrap
+msgid "`u1`"
+msgstr "`u1`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3644
+#, no-wrap
+msgid "`u2`"
+msgstr "`u2`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3645
+#, no-wrap
+msgid "Object credential"
+msgstr "Учетные данные объекта"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3652
+msgid ""
+"Determine whether the subject credential `u1` can \"see\" other subjects "
+"with the passed subject credential `u2`. Return 0 for success, or an "
+"`errno` value for failure. Suggested failure: EACCES for label mismatches, "
+"EPERM for lack of privilege, or ESRCH to hide visibility. This call may be "
+"made in a number of situations, including inter-process status sysctl's used "
+"by `ps`, and in procfs lookups."
+msgstr ""
+"Определить, может ли субъект с учётными данными `u1` \"видеть\" другие "
+"субъекты с переданными учётными данными `u2`. Возвращает 0 при успехе или "
+"значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии "
+"меток, EPERM при отсутствии привилегий или ESRCH для скрытия видимости. Этот "
+"вызов может выполняться в различных ситуациях, включая системные вызовы "
+"состояния межпроцессного взаимодействия, используемые `ps`, и при поиске в "
+"procfs."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3654
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5128
+#, no-wrap
+msgid "`mpo_check_socket_visible`"
+msgstr "`mpo_check_socket_visible`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3660
+#, no-wrap
+msgid ""
+"int mpo_check_socket_visible(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel);\n"
+msgstr ""
+"int mpo_check_socket_visible(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel);\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3683
+#, no-wrap
+msgid "`mpo_check_ifnet_relabel`"
+msgstr "`mpo_check_ifnet_relabel`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3689
+#, no-wrap
+msgid ""
+"int mpo_check_ifnet_relabel(struct ucred *cred, struct ifnet *ifnet,\n"
+" struct label *ifnetlabel, struct label *newlabel);\n"
+msgstr ""
+"int mpo_check_ifnet_relabel(struct ucred *cred, struct ifnet *ifnet,\n"
+" struct label *ifnetlabel, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3708
+#, no-wrap
+msgid "Existing policy label for `ifnet`"
+msgstr "Существующая метка политики для `ifnet`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3712
+#, no-wrap
+msgid "Policy label update to later be applied to `ifnet`"
+msgstr "Обновление метки политики для последующего применения к `ifnet`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3716
+msgid ""
+"Determine whether the subject credential can relabel the passed network "
+"interface to the passed label update."
+msgstr ""
+"Определить, может ли учетные данные субъекта перемаркировать переданный "
+"сетевой интерфейс в соответствии с переданным обновлением метки."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3718
+#, no-wrap
+msgid "`mpo_check_socket_relabel`"
+msgstr "`mpo_check_socket_relabel`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3724
+#, no-wrap
+msgid ""
+"int mpo_check_socket_relabel(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel, struct label *newlabel);\n"
+msgstr ""
+"int mpo_check_socket_relabel(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3743
+#, no-wrap
+msgid "Existing policy label for `socket`"
+msgstr "Метка существующей политики для `socket`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3747
+#, no-wrap
+msgid "Label update to later be applied to `socketlabel`"
+msgstr "Обновление метки для последующего применения к `socketlabel`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3751
+msgid ""
+"Determine whether the subject credential can relabel the passed socket to "
+"the passed label update."
+msgstr ""
+"Определить, могут ли учётные данные субъекта перемаркировать переданный "
+"сокет в соответствии с переданным обновлением метки."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3753
+#, no-wrap
+msgid "`mpo_check_cred_relabel`"
+msgstr "`mpo_check_cred_relabel`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3758
+#, no-wrap
+msgid "int mpo_check_cred_relabel(struct ucred *cred, struct label *newlabel);\n"
+msgstr "int mpo_check_cred_relabel(struct ucred *cred, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3773
+#, no-wrap
+msgid "Label update to later be applied to `cred`"
+msgstr "Обновление метки для последующего применения к `cred`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3777
+msgid ""
+"Determine whether the subject credential can relabel itself to the passed "
+"label update."
+msgstr ""
+"Определить, могут ли учетные данные субъекта перемаркировать себя в "
+"соответствии с переданным обновлением метки."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3779
+#, no-wrap
+msgid "`mpo_check_vnode_relabel`"
+msgstr "`mpo_check_vnode_relabel`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3785
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_relabel(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vnodelabel, struct label *newlabel);\n"
+msgstr ""
+"int mpo_check_vnode_relabel(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vnodelabel, struct label *newlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3800
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3898
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4000
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4090
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4161
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4198
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4550
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4587
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4657
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4691
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4724
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4765
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4813
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4850
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4887
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5032
+#, no-wrap
+msgid "Object; vnode"
+msgstr "Объект; vnode"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3808
+#, no-wrap
+msgid "Policy label update to later be applied to `vp`"
+msgstr "Обновление метки политики для последующего применения к `vp`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3812
+msgid ""
+"Determine whether the subject credential can relabel the passed vnode to the "
+"passed label update."
+msgstr ""
+"Определить, могут ли учётные данные субъекта изменить метку переданного "
+"vnode на переданную обновлённую метку."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3814
+#, no-wrap
+msgid "`mpo_check_mount_stat`"
+msgstr "`mpo_check_mount_stat`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3820
+#, no-wrap
+msgid ""
+"int mpo_check_mount_stat(struct ucred *cred, struct mount *mp,\n"
+" struct label *mountlabel);\n"
+msgstr ""
+"int mpo_check_mount_stat(struct ucred *cred, struct mount *mp,\n"
+" struct label *mountlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3835
+#, no-wrap
+msgid "Object; file system mount"
+msgstr "Объект; точка монтирования файловой системы"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3838
+#, no-wrap
+msgid "`mountlabel`"
+msgstr "`mountlabel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3839
+#, no-wrap
+msgid "Policy label for `mp`"
+msgstr "Метка политики для `mp`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3846
+msgid ""
+"Determine whether the subject credential can see the results of a statfs "
+"performed on the file system. Return 0 for success, or an `errno` value for "
+"failure. Suggested failure: EACCES for label mismatches or EPERM for lack "
+"of privilege. This call may be made in a number of situations, including "
+"during invocations of man:statfs[2] and related calls, as well as to "
+"determine what file systems to exclude from listings of file systems, such "
+"as when man:getfsstat[2] is invoked."
+msgstr ""
+"Определить, могут ли учетные данные субъекта видеть результаты выполнения "
+"statfs для файловой системы. Возвращает 0 при успехе или значение `errno` "
+"при ошибке. Рекомендуемые ошибки: EACCES при несоответствии меток или EPERM "
+"при отсутствии привилегий. Этот вызов может выполняться в различных "
+"ситуациях, включая вызовы man:statfs[2] и связанных функций, а также для "
+"определения, какие файловые системы исключать из списка, например, при "
+"вызове man:getfsstat[2]."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3848
+#, no-wrap
+msgid "`mpo_check_proc_debug`"
+msgstr "`mpo_check_proc_debug`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3853
+#, no-wrap
+msgid "int mpo_check_proc_debug(struct ucred *cred, struct proc *proc);\n"
+msgstr "int mpo_check_proc_debug(struct ucred *cred, struct proc *proc);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3867
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4968
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4998
+#, no-wrap
+msgid "`proc`"
+msgstr "`proc`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3868
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4969
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4999
+#, no-wrap
+msgid "Object; process"
+msgstr "Объект; процесс"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3875
+msgid ""
+"Determine whether the subject credential can debug the passed process. "
+"Return 0 for success, or an `errno` value for failure. Suggested failure: "
+"EACCES for label mismatch, EPERM for lack of privilege, or ESRCH to hide "
+"visibility of the target. This call may be made in a number of situations, "
+"including use of the man:ptrace[2] and man:ktrace[2] APIs, as well as for "
+"some types of procfs operations."
+msgstr ""
+"Определить, могут ли учётные данные субъекта отлаживать переданный процесс. "
+"Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые "
+"ошибки: EACCES при несоответствии метки, EPERM при недостатке прав или ESRCH "
+"для скрытия видимости цели. Этот вызов может использоваться в различных "
+"ситуациях, включая использование API man:ptrace[2] и man:ktrace[2], а также "
+"для некоторых операций с procfs."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3877
+#, no-wrap
+msgid "`mpo_check_vnode_access`"
+msgstr "`mpo_check_vnode_access`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3883
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_access(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int flags);\n"
+msgstr ""
+"int mpo_check_vnode_access(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int flags);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3905
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4820
+#, no-wrap
+msgid "`flags`"
+msgstr "`flags`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3906
+#, no-wrap
+msgid "man:access[2] flags"
+msgstr "флаги man:access[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3913
+msgid ""
+"Determine how invocations of man:access[2] and related calls by the subject "
+"credential should return when performed on the passed vnode using the passed "
+"access flags. This should generally be implemented using the same semantics "
+"used in `mpo_check_vnode_open`. Return 0 for success, or an `errno` value "
+"for failure. Suggested failure: EACCES for label mismatches or EPERM for "
+"lack of privilege."
+msgstr ""
+"Определить, как должны возвращаться вызовы man:access[2] и связанные вызовы "
+"для субъекта с указанными учетными данными при выполнении на переданном "
+"vnode с использованием переданных флагов доступа. Обычно это должно быть "
+"реализовано с использованием той же семантики, что и в "
+"`mpo_check_vnode_open`. Возвращает 0 при успехе или значение `errno` при "
+"ошибке. Рекомендуемые ошибки: EACCES при несоответствии меток или EPERM при "
+"отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3915
+#, no-wrap
+msgid "`mpo_check_vnode_chdir`"
+msgstr "`mpo_check_vnode_chdir`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3921
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_chdir(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel);\n"
+msgstr ""
+"int mpo_check_vnode_chdir(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3936
+#, no-wrap
+msgid "Object; vnode to man:chdir[2] into"
+msgstr "Объект; vnode, в который делается man:chdir[2]"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3940
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4004
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4047
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4554
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4628
+#, no-wrap
+msgid "Policy label for `dvp`"
+msgstr "Метка политики для `dvp`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3946
+msgid ""
+"Determine whether the subject credential can change the process working "
+"directory to the passed vnode. Return 0 for success, or an `errno` value "
+"for failure. Suggested failure: EACCES for label mismatch, or EPERM for "
+"lack of privilege."
+msgstr ""
+"Определить, могут ли учётные данные субъекта изменить рабочий каталог "
+"процесса на переданный vnode. Возвращает 0 при успехе или значение `errno` "
+"при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM "
+"при отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3948
+#, no-wrap
+msgid "`mpo_check_vnode_chroot`"
+msgstr "`mpo_check_vnode_chroot`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3954
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_chroot(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel);\n"
+msgstr ""
+"int mpo_check_vnode_chroot(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3969
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4245
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4425
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4469
+#, no-wrap
+msgid "Directory vnode"
+msgstr "vnode каталога"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3973
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4249
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4429
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4473
+#, no-wrap
+msgid "Policy label associated with `dvp`"
+msgstr "Метка политики, связанная с `dvp`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3977
+msgid ""
+"Determine whether the subject should be allowed to man:chroot[2] into the "
+"specified directory (`dvp`)."
+msgstr ""
+"Определить, следует ли разрешить субъекту выполнять man:chroot[2] в "
+"указанный каталог (`dvp`)."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3979
+#, no-wrap
+msgid "`mpo_check_vnode_create`"
+msgstr "`mpo_check_vnode_create`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:3985
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_create(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct componentname *cnp, struct vattr *vap);\n"
+msgstr ""
+"int mpo_check_vnode_create(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct componentname *cnp, struct vattr *vap);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4008
+#, no-wrap
+msgid "Component name for `dvp`"
+msgstr "Название компонента для `dvp`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4011
+#, no-wrap
+msgid "`vap`"
+msgstr "`vap`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4012
+#, no-wrap
+msgid "vnode attributes for `vap`"
+msgstr "атрибуты vnode для `vap`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4019
+msgid ""
+"Determine whether the subject credential can create a vnode with the passed "
+"parent directory, passed name information, and passed attribute "
+"information. Return 0 for success, or an `errno` value for failure. "
+"Suggested failure: EACCES for label mismatch, or EPERM for lack of "
+"privilege. This call may be made in a number of situations, including as a "
+"result of calls to man:open[2] with O_CREAT, man:mkfifo[2], and others."
+msgstr ""
+"Определить, могут ли учетные данные субъекта создать vnode с указанной "
+"родительской директорией, информацией о имени и атрибутами. Возвращает 0 при "
+"успехе или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при "
+"несоответствии метки или EPERM при отсутствии привилегий. Этот вызов может "
+"выполняться в различных ситуациях, включая вызовы man:open[2] с O_CREAT, "
+"man:mkfifo[2] и другие."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4021
+#, no-wrap
+msgid "`mpo_check_vnode_delete`"
+msgstr "`mpo_check_vnode_delete`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4028
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_delete(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct vnode *vp, void *label,\n"
+" struct componentname *cnp);\n"
+msgstr ""
+"int mpo_check_vnode_delete(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct vnode *vp, void *label,\n"
+" struct componentname *cnp);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4051
+#, no-wrap
+msgid "Object; vnode to delete"
+msgstr "Объект; vnode для удаления"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4067
+msgid ""
+"Determine whether the subject credential can delete a vnode from the passed "
+"parent directory and passed name information. Return 0 for success, or an "
+"`errno` value for failure. Suggested failure: EACCES for label mismatch, or "
+"EPERM for lack of privilege. This call may be made in a number of "
+"situations, including as a result of calls to man:unlink[2] and "
+"man:rmdir[2]. Policies implementing this entry point should also implement "
+"`mpo_check_rename_to` to authorize deletion of objects as a result of being "
+"the target of a rename."
+msgstr ""
+"Определить, может ли субъект с данными учетными данными удалить vnode из "
+"переданного родительского каталога и переданной информации о имени. "
+"Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые "
+"ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий. "
+"Этот вызов может быть выполнен в различных ситуациях, включая вызовы "
+"man:unlink[2] и man:rmdir[2]. Политики, реализующие эту точку входа, также "
+"должны реализовывать `mpo_check_rename_to` для авторизации удаления объектов "
+"в результате их переименования."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4069
+#, no-wrap
+msgid "`mpo_check_vnode_deleteacl`"
+msgstr "`mpo_check_vnode_deleteacl`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4075
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, acl_type_t type);\n"
+msgstr ""
+"int mpo_check_vnode_deleteacl(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, acl_type_t type);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4097
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4168
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4731
+#, no-wrap
+msgid "`type`"
+msgstr "`type`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4098
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4169
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4732
+#, no-wrap
+msgid "ACL type"
+msgstr "Тип ACL"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4104
+msgid ""
+"Determine whether the subject credential can delete the ACL of passed type "
+"from the passed vnode. Return 0 for success, or an `errno` value for "
+"failure. Suggested failure: EACCES for label mismatch, or EPERM for lack of "
+"privilege."
+msgstr ""
+"Определить, могут ли учетные данные субъекта удалить ACL указанного типа из "
+"переданного vnode. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4106
+#, no-wrap
+msgid "`mpo_check_vnode_exec`"
+msgstr "`mpo_check_vnode_exec`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4112
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_exec(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label);\n"
+msgstr ""
+"int mpo_check_vnode_exec(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4127
+#, no-wrap
+msgid "Object; vnode to execute"
+msgstr "Объект; vnode для выполнения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4138
+msgid ""
+"Determine whether the subject credential can execute the passed vnode. "
+"Determination of execute privilege is made separately from decisions about "
+"any transitioning event. Return 0 for success, or an `errno` value for "
+"failure. Suggested failure: EACCES for label mismatch, or EPERM for lack of "
+"privilege."
+msgstr ""
+"Определить, могут ли учётные данные субъекта выполнить переданный vnode. "
+"Проверка права на выполнение осуществляется отдельно от решений о любом "
+"переходном событии. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии прав."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4140
+#, no-wrap
+msgid "`mpo_check_vnode_getacl`"
+msgstr "`mpo_check_vnode_getacl`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4146
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_getacl(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, acl_type_t type);\n"
+msgstr ""
+"int mpo_check_vnode_getacl(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, acl_type_t type);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4175
+msgid ""
+"Determine whether the subject credential can retrieve the ACL of passed type "
+"from the passed vnode. Return 0 for success, or an `errno` value for "
+"failure. Suggested failure: EACCES for label mismatch, or EPERM for lack of "
+"privilege."
+msgstr ""
+"Определить, может ли учётное данное субъекта получить ACL указанного типа из "
+"переданного vnode. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4177
+#, no-wrap
+msgid "`mpo_check_vnode_getextattr`"
+msgstr "`mpo_check_vnode_getextattr`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4183
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int attrnamespace, const char *name, struct uio *uio);\n"
+msgstr ""
+"int mpo_check_vnode_getextattr(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int attrnamespace, const char *name, struct uio *uio);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4205
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4772
+#, no-wrap
+msgid "`attrnamespace`"
+msgstr "`attrnamespace`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4206
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4773
+#, no-wrap
+msgid "Extended attribute namespace"
+msgstr "Пространство имен расширенных атрибутов"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4210
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4777
+#, no-wrap
+msgid "Extended attribute name"
+msgstr "Имя расширенного атрибута"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4213
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4780
+#, no-wrap
+msgid "`uio`"
+msgstr "`uio`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4214
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4781
+#, no-wrap
+msgid "I/O structure pointer; see man:uio[9]"
+msgstr "Указатель структуры ввода-вывода; см. man:uio[9]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4221
+msgid ""
+"Determine whether the subject credential can retrieve the extended attribute "
+"with the passed namespace and name from the passed vnode. Policies "
+"implementing labeling using extended attributes may be interested in special "
+"handling of operations on those extended attributes. Return 0 for success, "
+"or an `errno` value for failure. Suggested failure: EACCES for label "
+"mismatch, or EPERM for lack of privilege."
+msgstr ""
+"Определить, может ли субъект с указанными учетными данными получить "
+"расширенный атрибут с заданным пространством имен и именем из указанного "
+"vnode. Политики, реализующие маркировку с использованием расширенных "
+"атрибутов, могут требовать особой обработки операций с этими атрибутами. "
+"Возвращает 0 при успехе или значение `errno` при ошибке. Рекомендуемые "
+"ошибки: EACCES при несоответствии метки или EPERM при отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4223
+#, no-wrap
+msgid "`mpo_check_vnode_link`"
+msgstr "`mpo_check_vnode_link`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4230
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_link(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct vnode *vp, struct label *label,\n"
+" struct componentname *cnp);\n"
+msgstr ""
+"int mpo_check_vnode_link(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct vnode *vp, struct label *label,\n"
+" struct componentname *cnp);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4253
+#, no-wrap
+msgid "Link destination vnode"
+msgstr "vnode целевого линка"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4261
+#, no-wrap
+msgid "Component name for the link being created"
+msgstr "Имя компонента для создаваемой ссылки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4265
+msgid ""
+"Determine whether the subject should be allowed to create a link to the "
+"vnode `vp` with the name specified by `cnp`."
+msgstr ""
+"Определить, следует ли разрешить субъекту создавать ссылку на vnode `vp` с "
+"именем, указанным в `cnp`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4267
+#, no-wrap
+msgid "`mpo_check_vnode_mmap`"
+msgstr "`mpo_check_vnode_mmap`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4273
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_mmap(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int prot);\n"
+msgstr ""
+"int mpo_check_vnode_mmap(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int prot);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4288
+#, no-wrap
+msgid "Vnode to map"
+msgstr "vnode для mmap"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4295
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4330
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4361
+#, no-wrap
+msgid "`prot`"
+msgstr "`prot`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4296
+#, no-wrap
+msgid "Mmap protections (see man:mmap[2])"
+msgstr "Защита mmap (см. man:mmap[2])"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4300
+msgid ""
+"Determine whether the subject should be allowed to map the vnode `vp` with "
+"the protections specified in `prot`."
+msgstr ""
+"Определить, следует ли разрешить субъекту отображать vnode `vp` с указанными "
+"в `prot` правами доступа."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4302
+#, no-wrap
+msgid "`mpo_check_vnode_mmap_downgrade`"
+msgstr "`mpo_check_vnode_mmap_downgrade`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4308
+#, no-wrap
+msgid ""
+"void mpo_check_vnode_mmap_downgrade(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int *prot);\n"
+msgstr ""
+"void mpo_check_vnode_mmap_downgrade(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int *prot);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4319
+#, no-wrap
+msgid "See crossref:mac[mac-mpo-check-vnode-mmap, `mpo_check_vnode_mmap`]."
+msgstr "См. crossref:mac[mac-mpo-check-vnode-mmap, `mpo_check_vnode_mmap`]."
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4331
+#, no-wrap
+msgid "Mmap protections to be downgraded"
+msgstr "Защита mmap для понижения уровня"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4335
+msgid "Downgrade the mmap protections based on the subject and object labels."
+msgstr "Понизить уровень защиты mmap на основе меток субъекта и объекта."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4337
+#, no-wrap
+msgid "`mpo_check_vnode_mprotect`"
+msgstr "`mpo_check_vnode_mprotect`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4343
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_mprotect(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int prot);\n"
+msgstr ""
+"int mpo_check_vnode_mprotect(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int prot);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4358
+#, no-wrap
+msgid "Mapped vnode"
+msgstr "Отображенный vnode"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4362
+#, no-wrap
+msgid "Memory protections"
+msgstr "Защита памяти"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4366
+msgid ""
+"Determine whether the subject should be allowed to set the specified memory "
+"protections on memory mapped from the vnode `vp`."
+msgstr ""
+"Определить, следует ли разрешить субъекту устанавливать указанные защиты "
+"памяти для памяти, отображенной из vnode `vp`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4368
+#, no-wrap
+msgid "`mpo_check_vnode_poll`"
+msgstr "`mpo_check_vnode_poll`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4374
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_poll(struct ucred *active_cred, struct ucred *file_cred,\n"
+" struct vnode *vp, struct label *label);\n"
+msgstr ""
+"int mpo_check_vnode_poll(struct ucred *active_cred, struct ucred *file_cred,\n"
+" struct vnode *vp, struct label *label);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4384
+#, no-wrap
+msgid "`active_cred`"
+msgstr "`active_cred`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4388
+#, no-wrap
+msgid "`file_cred`"
+msgstr "`file_cred`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4389
+#, no-wrap
+msgid "Credential associated with the struct file"
+msgstr "Учетные данные, связанные со структурой file"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4393
+#, no-wrap
+msgid "Polled vnode"
+msgstr "vnode, на котором вызывается poll"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4401
+msgid "Determine whether the subject should be allowed to poll the vnode `vp`."
+msgstr "Определить, следует ли разрешить субъекту вызывать poll на vnode `vp`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4403
+#, no-wrap
+msgid "`mpo_check_vnode_rename_from`"
+msgstr "`mpo_check_vnode_rename_from`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4410
+#, no-wrap
+msgid ""
+"int mpo_vnode_rename_from(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct vnode *vp, struct label *label,\n"
+" struct componentname *cnp);\n"
+msgstr ""
+"int mpo_vnode_rename_from(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct vnode *vp, struct label *label,\n"
+" struct componentname *cnp);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4433
+#, no-wrap
+msgid "Vnode to be renamed"
+msgstr "vnode для переименования"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4445
+msgid ""
+"Determine whether the subject should be allowed to rename the vnode `vp` to "
+"something else."
+msgstr ""
+"Определить, следует ли разрешить субъекту переименовать vnode `vp` во что-то "
+"другое."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4447
+#, no-wrap
+msgid "`mpo_check_vnode_rename_to`"
+msgstr "`mpo_check_vnode_rename_to`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4454
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_rename_to(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct vnode *vp, struct label *label, int samedir,\n"
+" struct componentname *cnp);\n"
+msgstr ""
+"int mpo_check_vnode_rename_to(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct vnode *vp, struct label *label, int samedir,\n"
+" struct componentname *cnp);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4477
+#, no-wrap
+msgid "Overwritten vnode"
+msgstr "vnode, который будет перезаписан"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4484
+#, no-wrap
+msgid "`samedir`"
+msgstr "`samedir`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4485
+#, no-wrap
+msgid "Boolean; `1` if the source and destination directories are the same"
+msgstr "Логическое значение; `1`, если исходный и целевой каталоги совпадают"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4489
+#, no-wrap
+msgid "Destination component name"
+msgstr "Имя компонента назначения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4494
+msgid ""
+"Determine whether the subject should be allowed to rename to the vnode `vp`, "
+"into the directory `dvp`, or to the name represented by `cnp`. If there is "
+"no existing file to overwrite, `vp` and `label` will be NULL."
+msgstr ""
+"Определить, следует ли разрешить субъекту переименование vnode `vp` в "
+"директорию `dvp` или в имя, представленное `cnp`. Если не существует файла "
+"для перезаписи, `vp` и `label` будут NULL."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4496
+#, no-wrap
+msgid "`mpo_check_socket_listen`"
+msgstr "`mpo_check_socket_listen`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4502
+#, no-wrap
+msgid ""
+"int mpo_check_socket_listen(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel);\n"
+msgstr ""
+"int mpo_check_socket_listen(struct ucred *cred, struct socket *socket,\n"
+" struct label *socketlabel);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4527
+msgid ""
+"Determine whether the subject credential can listen on the passed socket. "
+"Return 0 for success, or an `errno` value for failure. Suggested failure: "
+"EACCES for label mismatch, or EPERM for lack of privilege."
+msgstr ""
+"Определить, могут ли учётные данные субъекта прослушивать переданный сокет "
+"(вызывать listen). Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4529
+#, no-wrap
+msgid "`mpo_check_vnode_lookup`"
+msgstr "`mpo_check_vnode_lookup`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4535
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct componentname *cnp);\n"
+msgstr ""
+"int mpo_check_vnode_lookup(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel, struct componentname *cnp);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4558
+#, no-wrap
+msgid "Component name being looked up"
+msgstr "Имя компонента, который ищется"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4564
+msgid ""
+"Determine whether the subject credential can perform a lookup in the passed "
+"directory vnode for the passed name. Return 0 for success, or an `errno` "
+"value for failure. Suggested failure: EACCES for label mismatch, or EPERM "
+"for lack of privilege."
+msgstr ""
+"Определить, могут ли учётные данные субъекта выполнить поиск указанного "
+"имени в каталог с переданном vnode. Возвращает 0 при успехе или значение "
+"`errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки "
+"или EPERM при отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4566
+#, no-wrap
+msgid "`mpo_check_vnode_open`"
+msgstr "`mpo_check_vnode_open`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4572
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_open(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int acc_mode);\n"
+msgstr ""
+"int mpo_check_vnode_open(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int acc_mode);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4594
+#, no-wrap
+msgid "`acc_mode`"
+msgstr "`acc_mode`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4595
+#, no-wrap
+msgid "man:open[2] access mode"
+msgstr "режим доступа от man:open[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4601
+msgid ""
+"Determine whether the subject credential can perform an open operation on "
+"the passed vnode with the passed access mode. Return 0 for success, or an "
+"errno value for failure. Suggested failure: EACCES for label mismatch, or "
+"EPERM for lack of privilege."
+msgstr ""
+"Определить, могут ли учетные данные субъекта выполнить операцию открытия "
+"переданного vnode с указанным режимом доступа. Возвращает 0 в случае успеха "
+"или значение errno при ошибке. Рекомендуемые ошибки: EACCES при "
+"несоответствии метки или EPERM при отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4603
+#, no-wrap
+msgid "`mpo_check_vnode_readdir`"
+msgstr "`mpo_check_vnode_readdir`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4609
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_readdir(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel);\n"
+msgstr ""
+"int mpo_check_vnode_readdir(struct ucred *cred, struct vnode *dvp,\n"
+" struct label *dlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4624
+#, no-wrap
+msgid "Object; directory vnode"
+msgstr "Объект; vnode каталога"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4634
+msgid ""
+"Determine whether the subject credential can perform a `readdir` operation "
+"on the passed directory vnode. Return 0 for success, or an `errno` value "
+"for failure. Suggested failure: EACCES for label mismatch, or EPERM for "
+"lack of privilege."
+msgstr ""
+"Определить, могут ли учетные данные субъекта выполнить операцию `readdir` "
+"для переданного vnode каталога. Возвращает 0 при успехе или значение `errno` "
+"при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM "
+"при отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4636
+#, no-wrap
+msgid "`mpo_check_vnode_readlink`"
+msgstr "`mpo_check_vnode_readlink`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4642
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_readlink(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label);\n"
+msgstr ""
+"int mpo_check_vnode_readlink(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4668
+msgid ""
+"Determine whether the subject credential can perform a `readlink` operation "
+"on the passed symlink vnode. Return 0 for success, or an `errno` value for "
+"failure. Suggested failure: EACCES for label mismatch, or EPERM for lack of "
+"privilege. This call may be made in a number of situations, including an "
+"explicit `readlink` call by the user process, or as a result of an implicit "
+"`readlink` during a name lookup by the process."
+msgstr ""
+"Определить, могут ли учетные данные субъекта выполнить операцию `readlink` "
+"для переданного символьного vnode. Возвращает 0 в случае успеха или значение "
+"`errno` в случае ошибки. Рекомендуемые ошибки: EACCES при несоответствии "
+"метки или EPERM при отсутствии привилегий. Этот вызов может быть выполнен в "
+"различных ситуациях, включая явный вызов `readlink` пользовательским "
+"процессом или неявный `readlink` во время поиска имени процессом."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4670
+#, no-wrap
+msgid "`mpo_check_vnode_revoke`"
+msgstr "`mpo_check_vnode_revoke`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4676
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_revoke(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label);\n"
+msgstr ""
+"int mpo_check_vnode_revoke(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4701
+msgid ""
+"Determine whether the subject credential can revoke access to the passed "
+"vnode. Return 0 for success, or an `errno` value for failure. Suggested "
+"failure: EACCES for label mismatch, or EPERM for lack of privilege."
+msgstr ""
+"Определить, могут ли учётные данные субъекта отозвать доступ к переданному "
+"vnode. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4703
+#, no-wrap
+msgid "`mpo_check_vnode_setacl`"
+msgstr "`mpo_check_vnode_setacl`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4709
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_setacl(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, acl_type_t type, struct acl *acl);\n"
+msgstr ""
+"int mpo_check_vnode_setacl(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, acl_type_t type, struct acl *acl);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4735
+#, no-wrap
+msgid "`acl`"
+msgstr "`acl`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4736
+#, no-wrap
+msgid "ACL"
+msgstr "ACL"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4742
+msgid ""
+"Determine whether the subject credential can set the passed ACL of passed "
+"type on the passed vnode. Return 0 for success, or an `errno` value for "
+"failure. Suggested failure: EACCES for label mismatch, or EPERM for lack of "
+"privilege."
+msgstr ""
+"Определить, могут ли учётные данные субъекта установить переданный ACL "
+"указанного типа для переданного vnode. Возвращает 0 при успехе или значение "
+"`errno` при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки "
+"или EPERM при отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4744
+#, no-wrap
+msgid "`mpo_check_vnode_setextattr`"
+msgstr "`mpo_check_vnode_setextattr`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4750
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_setextattr(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int attrnamespace, const char *name, struct uio *uio);\n"
+msgstr ""
+"int mpo_check_vnode_setextattr(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, int attrnamespace, const char *name, struct uio *uio);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4790
+msgid ""
+"Determine whether the subject credential can set the extended attribute of "
+"passed name and passed namespace on the passed vnode. Policies implementing "
+"security labels backed into extended attributes may want to provide "
+"additional protections for those attributes. Additionally, policies should "
+"avoid making decisions based on the data referenced from `uio`, as there is "
+"a potential race condition between this check and the actual operation. The "
+"`uio` may also be `NULL` if a delete operation is being performed. Return 0 "
+"for success, or an `errno` value for failure. Suggested failure: EACCES for "
+"label mismatch, or EPERM for lack of privilege."
+msgstr ""
+"Определить, могут ли учетные данные субъекта установить расширенный атрибут "
+"с переданным именем и пространством имен на переданном vnode. Политики, "
+"реализующие метки безопасности, основанные на расширенных атрибутах, могут "
+"предусматривать дополнительные защиты для этих атрибутов. Кроме того, "
+"политикам следует избегать принятия решений на основе данных, на которые "
+"ссылается `uio`, так как существует потенциальное состояние гонки между этой "
+"проверкой и фактической операцией. `uio` также может быть `NULL`, если "
+"выполняется операция удаления. Возвращает 0 при успехе или значение `errno` "
+"при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM "
+"при отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4792
+#, no-wrap
+msgid "`mpo_check_vnode_setflags`"
+msgstr "`mpo_check_vnode_setflags`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4798
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_setflags(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, u_long flags);\n"
+msgstr ""
+"int mpo_check_vnode_setflags(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, u_long flags);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4821
+#, no-wrap
+msgid "File flags; see man:chflags[2]"
+msgstr "Флаги файла; см. man:chflags[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4827
+msgid ""
+"Determine whether the subject credential can set the passed flags on the "
+"passed vnode. Return 0 for success, or an `errno` value for failure. "
+"Suggested failure: EACCES for label mismatch, or EPERM for lack of privilege."
+msgstr ""
+"Определить, могут ли учётные данные субъекта установить переданные флаги на "
+"переданном vnode. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4829
+#, no-wrap
+msgid "`mpo_check_vnode_setmode`"
+msgstr "`mpo_check_vnode_setmode`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4835
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_setmode(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, mode_t mode);\n"
+msgstr ""
+"int mpo_check_vnode_setmode(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, mode_t mode);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4857
+#, no-wrap
+msgid "`mode`"
+msgstr "`mode`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4858
+#, no-wrap
+msgid "File mode; see man:chmod[2]"
+msgstr "Режим файла; см. man:chmod[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4864
+msgid ""
+"Determine whether the subject credential can set the passed mode on the "
+"passed vnode. Return 0 for success, or an `errno` value for failure. "
+"Suggested failure: EACCES for label mismatch, or EPERM for lack of privilege."
+msgstr ""
+"Определить, могут ли учётные данные субъекта установить переданный режим для "
+"переданного vnode. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"недостатке привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4866
+#, no-wrap
+msgid "`mpo_check_vnode_setowner`"
+msgstr "`mpo_check_vnode_setowner`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4872
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_setowner(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, uid_t uid, gid_t gid);\n"
+msgstr ""
+"int mpo_check_vnode_setowner(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, uid_t uid, gid_t gid);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4894
+#, no-wrap
+msgid "`uid`"
+msgstr "`uid`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4895
+#, no-wrap
+msgid "User ID"
+msgstr "User ID"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4898
+#, no-wrap
+msgid "`gid`"
+msgstr "`gid`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4899
+#, no-wrap
+msgid "Group ID"
+msgstr "Идентификатор группы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4906
+msgid ""
+"Determine whether the subject credential can set the passed uid and passed "
+"gid as file uid and file gid on the passed vnode. The IDs may be set to "
+"(`-1`) to request no update. Return 0 for success, or an `errno` value for "
+"failure. Suggested failure: EACCES for label mismatch, or EPERM for lack of "
+"privilege."
+msgstr ""
+"Определить, могут ли учетные данные субъекта установить переданный uid и "
+"переданный gid в качестве uid файла и gid файла для переданного vnode. "
+"Идентификаторы могут быть установлены в (`-1`) для запроса отсутствия "
+"обновления. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4908
+#, no-wrap
+msgid "`mpo_check_vnode_setutimes`"
+msgstr "`mpo_check_vnode_setutimes`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4914
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_setutimes(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, struct timespec atime, struct timespec mtime);\n"
+msgstr ""
+"int mpo_check_vnode_setutimes(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label, struct timespec atime, struct timespec mtime);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4929
+#, no-wrap
+msgid "Object; vp"
+msgstr "Объект; vp"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4936
+#, no-wrap
+msgid "`atime`"
+msgstr "`atime`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4937
+#, no-wrap
+msgid "Access time; see man:utimes[2]"
+msgstr "Время доступа; см. man:utimes[2]"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4940
+#, no-wrap
+msgid "`mtime`"
+msgstr "`mtime`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4941
+#, no-wrap
+msgid "Modification time; see man:utimes[2]"
+msgstr "Время изменения; см. man:utimes[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4947
+msgid ""
+"Determine whether the subject credential can set the passed access "
+"timestamps on the passed vnode. Return 0 for success, or an `errno` value "
+"for failure. Suggested failure: EACCES for label mismatch, or EPERM for "
+"lack of privilege."
+msgstr ""
+"Определить, могут ли учётные данные субъекта установить переданные времена "
+"доступа на переданном vnode. Возвращает 0 при успехе или значение `errno` "
+"при ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM "
+"при отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4949
+#, no-wrap
+msgid "`mpo_check_proc_sched`"
+msgstr "`mpo_check_proc_sched`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4954
+#, no-wrap
+msgid "int mpo_check_proc_sched(struct ucred *ucred, struct proc *proc);\n"
+msgstr "int mpo_check_proc_sched(struct ucred *ucred, struct proc *proc);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4975
+msgid ""
+"Determine whether the subject credential can change the scheduling "
+"parameters of the passed process. Return 0 for success, or an `errno` value "
+"for failure. Suggested failure: EACCES for label mismatch, EPERM for lack "
+"of privilege, or ESRCH to limit visibility."
+msgstr ""
+"Определить, могут ли учетные данные субъекта изменить параметры планирования "
+"переданного процесса. Возвращает 0 при успехе или значение `errno` при "
+"ошибке. Рекомендуемые ошибки: EACCES при несоответствии метки, EPERM при "
+"отсутствии привилегий или ESRCH для ограничения видимости."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4977
+msgid "See man:setpriority[2] for more information."
+msgstr "См. man:setpriority[2] для получения дополнительной информации."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4979
+#, no-wrap
+msgid "`mpo_check_proc_signal`"
+msgstr "`mpo_check_proc_signal`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:4984
+#, no-wrap
+msgid "int mpo_check_proc_signal(struct ucred *cred, struct proc *proc, int signal);\n"
+msgstr "int mpo_check_proc_signal(struct ucred *cred, struct proc *proc, int signal);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5002
+#, no-wrap
+msgid "`signal`"
+msgstr "`signal`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5003
+#, no-wrap
+msgid "Signal; see man:kill[2]"
+msgstr "Сигнал; см. man:kill[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5009
+msgid ""
+"Determine whether the subject credential can deliver the passed signal to "
+"the passed process. Return 0 for success, or an `errno` value for failure. "
+"Suggested failure: EACCES for label mismatch, EPERM for lack of privilege, "
+"or ESRCH to limit visibility."
+msgstr ""
+"Определить, могут ли учётные данные субъекта доставить указанный сигнал "
+"указанному процессу. Возвращает 0 при успехе или значение `errno` при "
+"ошибке. Рекомендуемые коды ошибок: EACCES при несоответствии метки, EPERM "
+"при недостатке прав или ESRCH для ограничения видимости."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5011
+#, no-wrap
+msgid "`mpo_check_vnode_stat`"
+msgstr "`mpo_check_vnode_stat`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5017
+#, no-wrap
+msgid ""
+"int mpo_check_vnode_stat(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label);\n"
+msgstr ""
+"int mpo_check_vnode_stat(struct ucred *cred, struct vnode *vp,\n"
+" struct label *label);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5042
+msgid ""
+"Determine whether the subject credential can `stat` the passed vnode. "
+"Return 0 for success, or an `errno` value for failure. Suggested failure: "
+"EACCES for label mismatch, or EPERM for lack of privilege."
+msgstr ""
+"Определить, могут ли учетные данные субъекта выполнять `stat` для "
+"переданного vnode. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии привилегий."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5044
+msgid "See man:stat[2] for more information."
+msgstr "См. man:stat[2] для получения дополнительной информации."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5046
+#, no-wrap
+msgid "`mpo_check_ifnet_transmit`"
+msgstr "`mpo_check_ifnet_transmit`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5052
+#, no-wrap
+msgid ""
+"int mpo_check_ifnet_transmit(struct ucred *cred, struct ifnet *ifnet,\n"
+" struct label *ifnetlabel, struct mbuf *mbuf, struct label *mbuflabel);\n"
+msgstr ""
+"int mpo_check_ifnet_transmit(struct ucred *cred, struct ifnet *ifnet,\n"
+" struct label *ifnetlabel, struct mbuf *mbuf, struct label *mbuflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5075
+#, no-wrap
+msgid "Object; mbuf to be sent"
+msgstr "Объект; mbuf для отправки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5085
+msgid ""
+"Determine whether the network interface can transmit the passed mbuf. "
+"Return 0 for success, or an `errno` value for failure. Suggested failure: "
+"EACCES for label mismatch, or EPERM for lack of privilege."
+msgstr ""
+"Определить, может ли сетевой интерфейс передать mbuf, переданный в качестве "
+"параметра. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии привилегий."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5087
+#, no-wrap
+msgid "`mpo_check_socket_deliver`"
+msgstr "`mpo_check_socket_deliver`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5093
+#, no-wrap
+msgid ""
+"int mpo_check_socket_deliver(struct ucred *cred, struct ifnet *ifnet,\n"
+" struct label *ifnetlabel, struct mbuf *mbuf, struct label *mbuflabel);\n"
+msgstr ""
+"int mpo_check_socket_deliver(struct ucred *cred, struct ifnet *ifnet,\n"
+" struct label *ifnetlabel, struct mbuf *mbuf, struct label *mbuflabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5116
+#, no-wrap
+msgid "Object; mbuf to be delivered"
+msgstr "Объект; mbuf для доставки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5126
+msgid ""
+"Determine whether the socket may receive the datagram stored in the passed "
+"mbuf header. Return 0 for success, or an `errno` value for failure. "
+"Suggested failures: EACCES for label mismatch, or EPERM for lack of "
+"privilege."
+msgstr ""
+"Определить, может ли сокет принять датаграмму, хранящуюся в переданном "
+"заголовке mbuf. Возвращает 0 при успехе или значение `errno` при ошибке. "
+"Рекомендуемые ошибки: EACCES при несоответствии метки или EPERM при "
+"отсутствии привилегий."
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5134
+#, no-wrap
+msgid ""
+"int mpo_check_socket_visible(struct ucred *cred, struct socket *so,\n"
+" struct label *socketlabel);\n"
+msgstr ""
+"int mpo_check_socket_visible(struct ucred *cred, struct socket *so,\n"
+" struct label *socketlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5153
+#, no-wrap
+msgid "Policy label for `so`"
+msgstr "Метка политики для `so`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5159
+msgid ""
+"Determine whether the subject credential cred can \"see\" the passed socket "
+"(`socket`) using system monitoring functions, such as those employed by "
+"man:netstat[8] and man:sockstat[1]. Return 0 for success, or an `errno` "
+"value for failure. Suggested failure: EACCES for label mismatches, EPERM "
+"for lack of privilege, or ESRCH to hide visibility."
+msgstr ""
+"Определить, могут ли учетные данные субъекта cred \"видеть\" переданный "
+"сокет (`socket`), используя функции системного мониторинга, такие как те, "
+"что применяются в man:netstat[8] и man:sockstat[1]. Возвращает 0 при успехе "
+"или значение `errno` при ошибке. Рекомендуемые ошибки: EACCES при "
+"несоответствии меток, EPERM при отсутствии привилегий или ESRCH для скрытия "
+"видимости."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5161
+#, no-wrap
+msgid "`mpo_check_system_acct`"
+msgstr "`mpo_check_system_acct`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5167
+#, no-wrap
+msgid ""
+"int mpo_check_system_acct(struct ucred *ucred, struct vnode *vp,\n"
+" struct label *vlabel);\n"
+msgstr ""
+"int mpo_check_system_acct(struct ucred *ucred, struct vnode *vp,\n"
+" struct label *vlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5177
+#, no-wrap
+msgid "`ucred`"
+msgstr "`ucred`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5182
+#, no-wrap
+msgid "Accounting file; man:acct[5]"
+msgstr "Файл учёта; man:acct[5]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5190
+msgid ""
+"Determine whether the subject should be allowed to enable accounting, based "
+"on its label and the label of the accounting log file."
+msgstr ""
+"Определить, следует ли разрешить субъекту включение учёта, основываясь на "
+"его метке и метке файла журнала учёта."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5192
+#, no-wrap
+msgid "`mpo_check_system_nfsd`"
+msgstr "`mpo_check_system_nfsd`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5197
+#, no-wrap
+msgid "int mpo_check_system_nfsd(struct ucred *cred);\n"
+msgstr "int mpo_check_system_nfsd(struct ucred *cred);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5212
+msgid "Determine whether the subject should be allowed to call man:nfssvc[2]."
+msgstr "Определить, следует ли разрешить субъекту вызывать man:nfssvc[2]."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5214
+#, no-wrap
+msgid "`mpo_check_system_reboot`"
+msgstr "`mpo_check_system_reboot`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5219
+#, no-wrap
+msgid "int mpo_check_system_reboot(struct ucred *cred, int howto);\n"
+msgstr "int mpo_check_system_reboot(struct ucred *cred, int howto);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5233
+#, no-wrap
+msgid "`howto`"
+msgstr "`howto`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5234
+#, no-wrap
+msgid "`howto` parameter from man:reboot[2]"
+msgstr "Параметр `howto` из man:reboot[2]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5238
+msgid ""
+"Determine whether the subject should be allowed to reboot the system in the "
+"specified manner."
+msgstr ""
+"Определить, следует ли разрешить субъекту перезагружать систему указанным "
+"способом."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5240
+#, no-wrap
+msgid "`mpo_check_system_settime`"
+msgstr "`mpo_check_system_settime`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5245
+#, no-wrap
+msgid "int mpo_check_system_settime(struct ucred *cred);\n"
+msgstr "int mpo_check_system_settime(struct ucred *cred);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5260
+msgid "Determine whether the user should be allowed to set the system clock."
+msgstr "Определить, разрешено ли пользователю устанавливать системные часы."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5262
+#, no-wrap
+msgid "`mpo_check_system_swapon`"
+msgstr "`mpo_check_system_swapon`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5268
+#, no-wrap
+msgid ""
+"int mpo_check_system_swapon(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vlabel);\n"
+msgstr ""
+"int mpo_check_system_swapon(struct ucred *cred, struct vnode *vp,\n"
+" struct label *vlabel);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5283
+#, no-wrap
+msgid "Swap device"
+msgstr "Устройство подкачки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5291
+msgid ""
+"Determine whether the subject should be allowed to add `vp` as a swap device."
+msgstr ""
+"Определить, следует ли разрешить субъекту добавлять `vp` как устройство "
+"подкачки."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5293
+#, no-wrap
+msgid "`mpo_check_system_sysctl`"
+msgstr "`mpo_check_system_sysctl`"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5299
+#, no-wrap
+msgid ""
+"int mpo_check_system_sysctl(struct ucred *cred, int *name, u_int *namelen,\n"
+" void *old, size_t *oldlenp, int inkernel, void *new, size_t newlen);\n"
+msgstr ""
+"int mpo_check_system_sysctl(struct ucred *cred, int *name, u_int *namelen,\n"
+" void *old, size_t *oldlenp, int inkernel, void *new, size_t newlen);\n"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5314
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5334
+#, no-wrap
+msgid "See man:sysctl[3]"
+msgstr "См. man:sysctl[3]"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5325
+#, no-wrap
+msgid "`oldlenp`"
+msgstr "`oldlenp`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5329
+#, no-wrap
+msgid "`inkernel`"
+msgstr "`inkernel`"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5330
+#, no-wrap
+msgid "Boolean; `1` if called from kernel"
+msgstr "Логический; `1`, если вызвано из ядра"
+
+#. type: Table
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5337
+#, no-wrap
+msgid "`newlen`"
+msgstr "`newlen`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5342
+msgid ""
+"Determine whether the subject should be allowed to make the specified "
+"man:sysctl[3] transaction."
+msgstr ""
+"Определить, следует ли разрешить субъекту выполнять указанную транзакцию "
+"man:sysctl[3]."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5344
+#, no-wrap
+msgid "Label Management Calls"
+msgstr "Вызовы при управления метками"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5350
+msgid ""
+"Relabel events occur when a user process has requested that the label on an "
+"object be modified. A two-phase update occurs: first, an access control "
+"check will be performed to determine if the update is both valid and "
+"permitted, and then the update itself is performed via a separate entry "
+"point. Relabel entry points typically accept the object, object label "
+"reference, and an update label submitted by the process. Memory allocation "
+"during relabel is discouraged, as relabel calls are not permitted to fail "
+"(failure should be reported earlier in the relabel check)."
+msgstr ""
+"События изменения метки происходят, когда пользовательский процесс "
+"запрашивает изменение метки на объекте. Происходит двухэтапное обновление: "
+"сначала выполняется проверка контроля доступа, чтобы определить, является ли "
+"обновление допустимым и разрешённым, а затем само обновление выполняется "
+"через отдельную точку входа. Точки входа для изменения метки обычно "
+"принимают объект, ссылку на метку объекта и новую метку, предоставленную "
+"процессом. Выделение памяти во время изменения метки не рекомендуется, так "
+"как вызовы изменения метки не могут завершиться неудачей (ошибка должна быть "
+"обнаружена ранее на этапе проверки изменения метки)."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5352
+#, no-wrap
+msgid "Userland Architecture"
+msgstr "Пользовательская архитектура"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5356
+msgid ""
+"The TrustedBSD MAC Framework includes a number of policy-agnostic elements, "
+"including MAC library interfaces for abstractly managing labels, "
+"modifications to the system credential management and login libraries to "
+"support the assignment of MAC labels to users, and a set of tools to monitor "
+"and modify labels on processes, files, and network interfaces. More details "
+"on the user architecture will be added to this section in the near future."
+msgstr ""
+"В фреймворк TrustedBSD MAC входит ряд элементов, не зависящих от политик, "
+"включая интерфейсы MAC-библиотеки для абстрактного управления метками, "
+"изменения в управлении системными учетными данными и библиотеках входа в "
+"систему для поддержки назначения MAC-меток пользователям, а также набор "
+"инструментов для мониторинга и изменения меток процессов, файлов и сетевых "
+"интерфейсов. Более подробная информация о пользовательской архитектуре будет "
+"добавлена в этот раздел в ближайшее время."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5358
+#, no-wrap
+msgid "APIs for Policy-Agnostic Label Management"
+msgstr "API для управления метками, не зависящими от политики"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5365
+msgid ""
+"The TrustedBSD MAC Framework provides a number of library and system calls "
+"permitting applications to manage MAC labels on objects using a policy-"
+"agnostic interface. This permits applications to manipulate labels for a "
+"variety of policies without being written to support specific policies. "
+"These interfaces are used by general-purpose tools such as man:ifconfig[8], "
+"man:ls[1] and man:ps[1] to view labels on network interfaces, files, and "
+"processes. The APIs also support MAC management tools including "
+"man:getfmac[8], man:getpmac[8], man:setfmac[8], man:setfsmac[8], and "
+"man:setpmac[8]. The MAC APIs are documented in man:mac[3]."
+msgstr ""
+"Фреймворк TrustedBSD MAC предоставляет ряд библиотечных и системных вызовов, "
+"позволяющих приложениям управлять метками MAC на объектах с использованием "
+"политико-независимого интерфейса. Это позволяет приложениям манипулировать "
+"метками для различных политик без необходимости поддержки конкретных "
+"политик. Эти интерфейсы используются универсальными инструментами, такими "
+"как man:ifconfig[8], man:ls[1] и man:ps[1], для просмотра меток на сетевых "
+"интерфейсах, файлах и процессах. API также поддерживают инструменты "
+"управления MAC, включая man:getfmac[8], man:getpmac[8], man:setfmac[8], "
+"man:setfsmac[8] и man:setpmac[8]. API MAC документированы в man:mac[3]."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5373
+msgid ""
+"Applications handle MAC labels in two forms: an internalized form used to "
+"return and set labels on processes and objects (`mac_t`), and externalized "
+"form based on C strings appropriate for storage in configuration files, "
+"display to the user, or input from the user. Each MAC label contains a "
+"number of elements, each consisting of a name and value pair. Policy "
+"modules in the kernel bind to specific names and interpret the values in "
+"policy-specific ways. In the externalized string form, labels are "
+"represented by a comma-delimited list of name and value pairs separated by "
+"the `/` character. Labels may be directly converted to and from text using "
+"provided APIs; when retrieving labels from the kernel, internalized label "
+"storage must first be prepared for the desired label element set. "
+"Typically, this is done in one of two ways: using man:mac_prepare[3] and an "
+"arbitrary list of desired label elements, or one of the variants of the call "
+"that loads a default element set from the man:mac.conf[5] configuration "
+"file. Per-object defaults permit application writers to usefully display "
+"labels associated with objects without being aware of the policies present "
+"in the system."
+msgstr ""
+"Приложения обрабатывают метки MAC в двух формах: внутренней форме, "
+"используемой для возврата и установки меток для процессов и объектов "
+"(`mac_t`), и внешней форме, основанной на строках C, подходящих для хранения "
+"в конфигурационных файлах, отображения пользователю или ввода от "
+"пользователя. Каждая метка MAC содержит ряд элементов, каждый из которых "
+"состоит из пары имя-значение. Модули политик в ядре привязываются к "
+"определённым именам и интерпретируют значения специфичным для политики "
+"образом. Во внешней строковой форме метки представляются списком пар имя-"
+"значение, разделённых запятыми и символом `/`. Метки могут быть напрямую "
+"преобразованы в текст и обратно с использованием предоставленных API; при "
+"извлечении меток из ядра внутреннее хранилище меток должно быть сначала "
+"подготовлено для желаемого набора элементов метки. Обычно это делается одним "
+"из двух способов: с использованием man:mac_prepare[3] и произвольного списка "
+"желаемых элементов метки, или одной из вариаций вызова, который загружает "
+"набор элементов по умолчанию из конфигурационного файла man:mac.conf[5]. "
+"Значения по умолчанию для каждого объекта позволяют разработчикам приложений "
+"удобно отображать метки, связанные с объектами, без необходимости знать о "
+"присутствующих в системе политиках."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5378
+msgid ""
+"Currently, direct manipulation of label elements other than by conversion to "
+"a text string, string editing, and conversion back to an internalized label "
+"is not supported by the MAC library. Such interfaces may be added in the "
+"future if they prove necessary for application writers."
+msgstr ""
+"В настоящее время прямое манипулирование элементами меток, кроме как путем "
+"преобразования в текстовую строку, редактирования строки и обратного "
+"преобразования во внутреннюю метку, не поддерживается библиотекой MAC. Такие "
+"интерфейсы могут быть добавлены в будущем, если окажется, что они необходимы "
+"разработчикам приложений."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5381
+#, no-wrap
+msgid "Binding of Labels to Users"
+msgstr "Привязка меток к пользователям"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5385
+msgid ""
+"The standard user context management interface, man:setusercontext[3], has "
+"been modified to retrieve MAC labels associated with a user's class from "
+"man:login.conf[5]. These labels are then set along with other user context "
+"when either `LOGIN_SETALL` is specified, or when `LOGIN_SETMAC` is "
+"explicitly specified."
+msgstr ""
+"Стандартный интерфейс управления контекстом пользователя, "
+"man:setusercontext[3], был изменён для получения меток MAC, связанных с "
+"классом пользователя, из man:login.conf[5]. Эти метки устанавливаются вместе "
+"с остальным контекстом пользователя, когда указан `LOGIN_SETALL` или явно "
+"указан `LOGIN_SETMAC`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5390
+msgid ""
+"It is expected that, in a future version of FreeBSD, the MAC label database "
+"will be separated from the [.filename]#login.conf# user class abstraction, "
+"and be maintained in a separate database. However, the "
+"man:setusercontext[3] API should remain the same following such a change."
+msgstr ""
+"Ожидается, что в будущей версии FreeBSD база данных меток MAC будет отделена "
+"от абстракции классов пользователей [.filename]#login.conf# и будет "
+"поддерживаться в отдельной базе данных. Однако API man:setusercontext[3] "
+"должно остаться неизменным после такого изменения."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5393
+#, no-wrap
+msgid "Conclusion"
+msgstr "Заключение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/mac/_index.adoc:5398
+msgid ""
+"The TrustedBSD MAC framework permits kernel modules to augment the system "
+"security policy in a highly integrated manner. They may do this based on "
+"existing object properties, or based on label data that is maintained with "
+"the assistance of the MAC framework. The framework is sufficiently flexible "
+"to implement a variety of policy types, including information flow security "
+"policies such as MLS and Biba, as well as policies based on existing BSD "
+"credentials or file protections. Policy authors may wish to consult this "
+"documentation as well as existing security modules when implementing a new "
+"security service."
+msgstr ""
+"Фреймворк TrustedBSD MAC позволяет модулям ядра расширять политику "
+"безопасности системы высокоинтегрированным способом. Они могут делать это на "
+"основе существующих свойств объектов или данных меток, которые "
+"поддерживаются с помощью фреймворка MAC. Фреймворк достаточно гибкий для "
+"реализации различных типов политик, включая политики безопасности "
+"информационных потоков, такие как MLS и Biba, а также политики, основанные "
+"на существующих учетных данных BSD или защите файлов. Авторам политик может "
+"быть полезно ознакомиться с этой документацией, а также с существующими "
+"модулями безопасности при реализации новой службы безопасности."
+
+#~ msgid ""
+#~ "The MAC policy entry point vector, `mac__policy__ops` in this example, "
+#~ "associates functions defined in the module with specific entry points. A "
+#~ "complete listing of available entry points and their prototypes may be "
+#~ "found in the MAC entry point reference section. Of specific interest "
+#~ "during module registration are the .mpo_destroy and .mpo_init entry "
+#~ "points."
+#~ msgstr ""
+#~ "Вектор точек входа политики MAC, `mac__policy__ops` в данном примере, "
+#~ "связывает функции, определённые в модуле, с конкретными точками входа. "
+#~ "Полный список доступных точек входа и их прототипов можно найти в разделе "
+#~ "справочника по точкам входа MAC. Особый интерес при регистрации модуля "
+#~ "представляют точки входа .mpo_destroy и .mpo_init."
+
+#, no-wrap
+#~ msgid "mpo_init will be invoked once a policy is successfully registered with the module framework but prior to any other entry points becoming active."
+#~ msgstr "mpo_init будет вызван после успешной регистрации политики в модульной системе, но до активации других точек входа."
+
+#~ msgid ""
+#~ "This permits the policy to perform any policy-specific allocation and "
+#~ "initialization, such as initialization of any data or locks."
+#~ msgstr ""
+#~ "Это позволяет политике выполнять любые выделения и инициализации, "
+#~ "специфичные для данной политики, такие как инициализация данных или "
+#~ "блокировок."
+
+#, no-wrap
+#~ msgid "mpo_destroy will be invoked when a policy module is unloaded to permit releasing of any allocated memory and destruction of locks."
+#~ msgstr "mpo_destroy будет вызван при выгрузке модуля политики для освобождения выделенной памяти и уничтожения блокировок."
+
+#~ msgid ""
+#~ "Currently, these two entry points are invoked with the MAC policy list "
+#~ "mutex held to prevent any other entry points from being invoked: this "
+#~ "will be changed, but in the mean time, policies should be careful about "
+#~ "what kernel primitives they invoke so as to avoid lock ordering or "
+#~ "sleeping problems."
+#~ msgstr ""
+#~ "В настоящее время эти две точки входа вызываются с удержанием мьютекса "
+#~ "списка политик MAC, чтобы предотвратить вызов других точек входа: это "
+#~ "будет изменено, но до тех пор политики должны быть осторожны с "
+#~ "используемыми примитивами ядра, чтобы избежать проблем с порядком "
+#~ "блокировок или сном."
diff --git a/documentation/content/ru/books/arch-handbook/newbus/_index.adoc b/documentation/content/ru/books/arch-handbook/newbus/_index.adoc
new file mode 100644
index 0000000000..7f892c1b1e
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/newbus/_index.adoc
@@ -0,0 +1,213 @@
+---
+authors:
+ -
+ author: 'Jeroen Ruigrok van der Werven (asmodai)'
+ email: asmodai@FreeBSD.org
+ -
+ author: 'Hiten Pandya'
+ email: hiten@uk.FreeBSD.org
+description: Newbus
+next: books/arch-handbook/sound
+params:
+ path: /books/arch-handbook/newbus/
+prev: books/arch-handbook/usb
+showBookMenu: true
+tags: ["Newbus", "overview", "API"]
+title: 'Глава 14. Newbus'
+weight: 16
+---
+
+[[newbus]]
+= Newbus
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 14
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+_Особая благодарность Мэтью Н. Додду, Уорнеру Лошу, Биллу Полу, Дагу Рэбсону, Майку Смиту, Питеру Вемму и Скотту Лонгу_.
+
+Эта глава подробно объясняет фреймворк устройств Newbus.
+
+[[newbus-devdrivers]]
+== Драйверы устройств
+
+=== Назначение драйвера устройства
+
+Драйвер устройства — это программный компонент, который предоставляет интерфейс между обобщённым представлением периферийного устройства (например, диска, сетевого адаптера) в ядре и его фактической реализацией. _Интерфейс драйвера устройства (DDI)_ — это определённый интерфейс между ядром и компонентом драйвера устройства.
+
+=== Типы драйверов устройств
+
+В UNIX(R), а следовательно, и в FreeBSD, были времена, когда определялось четыре типа устройств:
+
+* драйверы блочных устройств
+* драйверы символьных устройств
+* драйверы сетевых устройств
+* драйверы псевдоустройств
+
+_Блочные устройства_ работали таким образом, что использовали блоки [данных] фиксированного размера. Этот тип драйвера зависел от так называемого _буферного кэша_, который кэшировал доступные блоки данных в выделенной части памяти. Часто этот буферный кэш был основан на отложенной записи (write-behind), что означало, что при изменении данных в памяти они синхронизировались с диском во время периодической очистки диска системой, тем самым оптимизируя запись.
+
+=== Символьные устройства
+
+Однако в версиях FreeBSD 4.0 и выше различие между блочными и символьными устройствами перестало существовать.
+
+[[newbus-overview]]
+== Обзор Newbus
+
+_Newbus_ — это реализация новой архитектуры шины, основанной на уровнях абстракции, которая была впервые представлена в FreeBSD 3.0, когда порт для Alpha был добавлен в дерево исходного кода. Однако только в версии 4.0 она стала системой по умолчанию для использования с драйверами устройств. Её цель — предоставить более объектно-ориентированный способ взаимодействия между различными шинами и устройствами, которые хост-система предоставляет _операционной системе_.
+
+Основные функции включают, среди прочего:
+
+* динамическое присоединение
+* простая модуляризация драйверов
+* псевдо-шины
+
+Одним из наиболее заметных изменений является переход от плоской и нерегламентированной системы к структуре дерева устройств.
+
+На верхнем уровне находится устройство _"root"_, которое является родительским для всех остальных устройств. Для каждой архитектуры обычно существует единственный дочерний элемент "root", к которому подключены такие компоненты, как _мосты host-to-PCI_ и т.д. Для x86 этим устройством "root" является устройство _"nexus"_. Для Alpha различные модели Alpha имеют разные устройства верхнего уровня, соответствующие различным аппаратным наборам микросхем, включая _lca_, _apecs_, _cia_ и _tsunami_.
+
+Устройство в контексте Newbus представляет собой отдельную аппаратную сущность в системе. Например, каждое PCI-устройство представлено устройством Newbus. Любое устройство в системе может иметь дочерние устройства; устройство, у которого есть дочерние устройства, часто называют _"шиной"_. Примерами распространённых шин в системе являются ISA и PCI, которые управляют списками устройств, подключённых к шинам ISA и PCI соответственно.
+
+Часто соединение между различными типами шин представлено устройством _"мост"_, которое обычно имеет один дочерний элемент для подключенной шины. Примером этого является _PCI-to-PCI мост_, который представлен устройством _[.filename]#pcibN#_ на родительской PCI-шине и имеет дочерний элемент _[.filename]#pciN#_ для подключенной шины. Такая структура упрощает реализацию дерева PCI-шин, позволяя использовать общий код как для верхнеуровневых, так и для соединенных через мост шин.
+
+Каждое устройство в архитектуре Newbus запрашивает у своего родителя отображение своих ресурсов. Затем родитель запрашивает у своего собственного родителя, пока запрос не достигнет nexus. Таким образом, по сути, nexus - это единственная часть системы Newbus, которая знает обо всех ресурсах.
+
+[TIP]
+====
+Устройство ISA может захотеть отобразить свой порт ввода-вывода по адресу `0x230`, поэтому оно запрашивает у своего родителя, в данном случае — шины ISA. Шина ISA передаёт запрос мосту PCI-to-ISA, который, в свою очередь, запрашивает шину PCI. Запрос доходит до моста host-to-PCI и, наконец, до nexus. Прелесть этого восходящего перехода в том, что есть возможность преобразовывать запросы. Например, запрос порта ввода-вывода `0x230` может быть преобразован в отображение памяти по адресу `0xb0000230` на системе MIPS с помощью моста PCI.
+====
+
+Распределение ресурсов может контролироваться в любом месте дерева устройств. Например, на многих платформах Alpha прерывания ISA управляются отдельно от прерываний PCI, а распределение ресурсов для прерываний ISA осуществляется устройством шины ISA Alpha. На IA-32 прерывания ISA и PCI управляются устройством верхнего уровня nexus. Для обеих архитектур управление пространством памяти и портов осуществляется единым объектом — nexus для IA-32 и соответствующим драйвером чипсета на Alpha (например, CIA или tsunami).
+
+Для стандартизации доступа к памяти и ресурсам, отображённым на порты, Newbus интегрирует API `bus_space` из NetBSD. Они предоставляют единый API для замены inb/outb и прямых операций чтения/записи в память. Преимущество этого подхода в том, что один драйвер может легко использовать либо регистры, отображённые в память, либо регистры, отображённые на порты (некоторое оборудование поддерживает оба варианта).
+
+Эта поддержка интегрирована в механизм распределения ресурсов. При выделении ресурса драйвер может получить связанные `bus_space_tag_t` и `bus_space_handle_t` из этого ресурса.
+
+Newbus также позволяет определять методы интерфейса в файлах, предназначенных для этой цели. Это файлы с расширением [.filename]#.m#, которые находятся в иерархии [.filename]#src/sys#.
+
+Ядро системы Newbus представляет собой расширяемую модель «объектно-ориентированного программирования». Каждое устройство в системе имеет таблицу поддерживаемых методов. Система и другие устройства используют эти методы для управления устройством и запроса услуг. Различные методы, поддерживаемые устройством, определяются рядом «интерфейсов». «Интерфейс» — это просто группа связанных методов, которые могут быть реализованы устройством.
+
+В системе Newbus методы для устройства предоставляются различными драйверами устройств в системе. Когда устройство подключается к драйверу во время _автоконфигурации_, оно использует таблицу методов, объявленную драйвером. Устройство может позже _отключиться_ от своего драйвера и _подключиться_ к новому драйверу с новой таблицей методов. Это позволяет динамически заменять драйверы, что может быть полезно для разработки драйверов.
+
+Интерфейсы описываются языком определения интерфейсов, похожим на язык, используемый для определения операций vnode для файловых систем. Интерфейс хранится в файле методов (который обычно называется [.filename]#foo_if.m#).
+
+.Методы Newbus
+[example]
+====
+[.programlisting]
+....
+ # Foo subsystem/driver (a comment...)
+
+ INTERFACE foo
+
+ METHOD int doit {
+ device_t dev;
+ };
+
+ # DEFAULT is the method that will be used, if a method was not
+ # provided via: DEVMETHOD()
+
+ METHOD void doit_to_child {
+ device_t dev;
+ driver_t child;
+ } DEFAULT doit_generic_to_child;
+....
+====
+
+Когда этот интерфейс компилируется, он генерирует заголовочный файл "[.filename]#foo_if.h#", который содержит объявления функций:
+
+[.programlisting]
+....
+ int FOO_DOIT(device_t dev);
+ int FOO_DOIT_TO_CHILD(device_t dev, device_t child);
+....
+
+Исходный файл `[.filename]#foo_if.c#` также создается для сопровождения автоматически сгенерированного заголовочного файла; он содержит реализации функций, которые ищут расположение соответствующих функций в таблице методов объекта и вызывают эту функцию.
+
+Система определяет два основных интерфейса. Первый фундаментальный интерфейс называется _"device"_ (устройство) и включает методы, которые относятся ко всем устройствам. Методы в интерфейсе _"device"_ включают _"probe"_ (обнаружение), _"attach"_ (присоединение) и _"detach"_ (отсоединение) для управления обнаружением оборудования, а также _"shutdown"_ (выключение), _"suspend"_ (приостановка) и _"resume"_ (возобновление) для уведомления о критических событиях.
+
+Второй, более сложный интерфейс — _"bus"_. Этот интерфейс содержит методы, подходящие для устройств, имеющих дочерние элементы, включая методы доступа к специфичной для шины информации об устройстве footnote:[man:bus_generic_read_ivar[9] и man:bus_generic_write_ivar[9]], уведомления о событиях (`_child_detached_`, `_driver_added_`) и управление ресурсами (`_alloc_resource_`, `_activate_resource_`, `_deactivate_resource_`, `_release_resource_`).
+
+Многие методы в интерфейсе "bus" выполняют сервисы для некоторого дочернего устройства шины. Эти методы обычно используют первые два аргумента для указания шины, предоставляющей сервис, и дочернего устройства, запрашивающего сервис. Для упрощения кода драйвера многие из этих методов имеют вспомогательные функции, которые находят родительское устройство и вызывают метод у родителя. Например, метод `BUS_TEARDOWN_INTR(device_t dev, device_t child, ...)` может быть вызван с помощью функции `bus_teardown_intr(device_t child, ...)`.
+
+Некоторые типы шин в системе определяют дополнительные интерфейсы для предоставления доступа к специфичной для шины функциональности. Например, драйвер шины PCI определяет интерфейс "pci", который имеет два метода `_read_config_` и `_write_config_` для доступа к конфигурационным регистрам устройства PCI.
+
+[[newbus-api]]
+== Newbus API
+
+Поскольку API Newbus очень обширен, в этом разделе предпринята попытка его документирования. Дополнительная информация будет добавлена в следующей версии этого документа.
+
+=== Важные места в иерархии исходного кода
+
+[.filename]#src/sys/[arch]/[arch]# - Код ядра для конкретной аппаратной архитектуры находится в этом каталоге. Например, архитектура `i386` или архитектура `SPARC64`.
+
+[.filename]#src/sys/dev/[bus]# - поддержка устройств для конкретной `[bus]` находится в этом каталоге.
+
+[.filename]#src/sys/dev/pci# - Код поддержки шины PCI находится в этом каталоге.
+
+[.filename]#src/sys/[isa|pci]# - В этом каталоге находятся драйверы устройств PCI/ISA. Код поддержки шины PCI/ISA располагался в этом каталоге в FreeBSD версии `4.0`.
+
+=== Важные структуры и определения типов
+
+`devclass_t` - Это определение типа указателя на `struct devclass`.
+
+`device_method_t` - Это то же самое, что и `kobj_method_t` (см. [.filename]#src/sys/kobj.h#).
+
+`device_t` - Это определение типа указателя на структуру `struct device`. `device_t` представляет устройство в системе. Это объект ядра. Подробности реализации см. в [.filename]#src/sys/sys/bus_private.h#.
+
+`driver_t` - Это определение типа, которое ссылается на `struct driver`. Структура `driver` является классом объекта ядра `device`; она также содержит данные, приватные для драйвера.
+
+*_driver_t_ Implementation*
+[.programlisting]
+....
+ struct driver {
+ KOBJ_CLASS_FIELDS;
+ void *priv; /* driver private data */
+ };
+....
+
+Тип `device_state_t`, который является перечислением, `device_state`. Он содержит возможные состояния устройства Newbus до и после процесса автонастройки.
+
+*Device States _device_state_t*
+[.programlisting]
+....
+ /*
+ * src/sys/sys/bus.h
+ */
+ typedef enum device_state {
+ DS_NOTPRESENT, /* not probed or probe failed */
+ DS_ALIVE, /* probe succeeded */
+ DS_ATTACHED, /* attach method called */
+ DS_BUSY /* device is open */
+ } device_state_t;
+....
diff --git a/documentation/content/ru/books/arch-handbook/newbus/_index.po b/documentation/content/ru/books/arch-handbook/newbus/_index.po
new file mode 100644
index 0000000000..92ae3249ba
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/newbus/_index.po
@@ -0,0 +1,711 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-07-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbooknewbus_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:19
+#, no-wrap
+msgid "Newbus"
+msgstr "Newbus"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:1
+#, no-wrap
+msgid "Chapter 14. Newbus"
+msgstr "Глава 14. Newbus"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:57
+msgid ""
+"_Special thanks to Matthew N. Dodd, Warner Losh, Bill Paul, Doug Rabson, "
+"Mike Smith, Peter Wemm and Scott Long_."
+msgstr ""
+"_Особая благодарность Мэтью Н. Додду, Уорнеру Лошу, Биллу Полу, Дагу "
+"Рэбсону, Майку Смиту, Питеру Вемму и Скотту Лонгу_."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:59
+msgid "This chapter explains the Newbus device framework in detail."
+msgstr "Эта глава подробно объясняет фреймворк устройств Newbus."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:61
+#, no-wrap
+msgid "Device Drivers"
+msgstr "Драйверы устройств"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:63
+#, no-wrap
+msgid "Purpose of a Device Driver"
+msgstr "Назначение драйвера устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:66
+msgid ""
+"A device driver is a software component which provides the interface between "
+"the kernel's generic view of a peripheral (e.g., disk, network adapter) and "
+"the actual implementation of the peripheral. The _device driver interface "
+"(DDI)_ is the defined interface between the kernel and the device driver "
+"component."
+msgstr ""
+"Драйвер устройства — это программный компонент, который предоставляет "
+"интерфейс между обобщённым представлением периферийного устройства "
+"(например, диска, сетевого адаптера) в ядре и его фактической реализацией. "
+"_Интерфейс драйвера устройства (DDI)_ — это определённый интерфейс между "
+"ядром и компонентом драйвера устройства."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:67
+#, no-wrap
+msgid "Types of Device Drivers"
+msgstr "Типы драйверов устройств"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:70
+msgid ""
+"There used to be days in UNIX(R), and thus FreeBSD, in which there were four "
+"types of devices defined:"
+msgstr ""
+"В UNIX(R), а следовательно, и в FreeBSD, были времена, когда определялось "
+"четыре типа устройств:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:72
+msgid "block device drivers"
+msgstr "драйверы блочных устройств"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:73
+msgid "character device drivers"
+msgstr "драйверы символьных устройств"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:74
+msgid "network device drivers"
+msgstr "драйверы сетевых устройств"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:75
+msgid "pseudo-device drivers"
+msgstr "драйверы псевдоустройств"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:77
+msgid ""
+"_Block devices_ performed in a way that used fixed size blocks [of data]. "
+"This type of driver depended on the so-called _buffer cache_, which had "
+"cached accessed blocks of data in a dedicated part of memory. Often this "
+"buffer cache was based on write-behind, which meant that when data was "
+"modified in memory it got synced to disk whenever the system did its "
+"periodical disk flushing, thus optimizing writes."
+msgstr ""
+"_Блочные устройства_ работали таким образом, что использовали блоки [данных] "
+"фиксированного размера. Этот тип драйвера зависел от так называемого "
+"_буферного кэша_, который кэшировал доступные блоки данных в выделенной "
+"части памяти. Часто этот буферный кэш был основан на отложенной записи "
+"(write-behind), что означало, что при изменении данных в памяти они "
+"синхронизировались с диском во время периодической очистки диска системой, "
+"тем самым оптимизируя запись."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:78
+#, no-wrap
+msgid "Character Devices"
+msgstr "Символьные устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:81
+msgid ""
+"However, in the versions of FreeBSD 4.0 and onward the distinction between "
+"block and character devices became non-existent."
+msgstr ""
+"Однако в версиях FreeBSD 4.0 и выше различие между блочными и символьными "
+"устройствами перестало существовать."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:83
+#, no-wrap
+msgid "Overview of Newbus"
+msgstr "Обзор Newbus"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:86
+msgid ""
+"_Newbus_ is the implementation of a new bus architecture based on "
+"abstraction layers which saw its introduction in FreeBSD 3.0 when the Alpha "
+"port was imported into the source tree. It was not until 4.0 before it "
+"became the default system to use for device drivers. Its goals are to "
+"provide a more object-oriented means of interconnecting the various busses "
+"and devices which a host system provides to the _Operating System_."
+msgstr ""
+"_Newbus_ — это реализация новой архитектуры шины, основанной на уровнях "
+"абстракции, которая была впервые представлена в FreeBSD 3.0, когда порт для "
+"Alpha был добавлен в дерево исходного кода. Однако только в версии 4.0 она "
+"стала системой по умолчанию для использования с драйверами устройств. Её "
+"цель — предоставить более объектно-ориентированный способ взаимодействия "
+"между различными шинами и устройствами, которые хост-система предоставляет "
+"_операционной системе_."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:88
+msgid "Its main features include amongst others:"
+msgstr "Основные функции включают, среди прочего:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:90
+msgid "dynamic attaching"
+msgstr "динамическое присоединение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:91
+msgid "easy modularization of drivers"
+msgstr "простая модуляризация драйверов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:92
+msgid "pseudo-busses"
+msgstr "псевдо-шины"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:94
+msgid ""
+"One of the most prominent changes is the migration from the flat and ad-hoc "
+"system to a device tree layout."
+msgstr ""
+"Одним из наиболее заметных изменений является переход от плоской и "
+"нерегламентированной системы к структуре дерева устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:96
+msgid ""
+"At the top level resides the _\"root\"_ device which is the parent to hang "
+"all other devices on. For each architecture, there is typically a single "
+"child of \"root\" which has such things as _host-to-PCI bridges_, etc. "
+"attached to it. For x86, this \"root\" device is the _\"nexus\"_ device. For "
+"Alpha, various different models of Alpha have different top-level devices "
+"corresponding to the different hardware chipsets, including _lca_, _apecs_, "
+"_cia_ and _tsunami_."
+msgstr ""
+"На верхнем уровне находится устройство _\"root\"_, которое является "
+"родительским для всех остальных устройств. Для каждой архитектуры обычно "
+"существует единственный дочерний элемент \"root\", к которому подключены "
+"такие компоненты, как _мосты host-to-PCI_ и т.д. Для x86 этим устройством "
+"\"root\" является устройство _\"nexus\"_. Для Alpha различные модели Alpha "
+"имеют разные устройства верхнего уровня, соответствующие различным "
+"аппаратным наборам микросхем, включая _lca_, _apecs_, _cia_ и _tsunami_."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:98
+msgid ""
+"A device in the Newbus context represents a single hardware entity in the "
+"system. For instance each PCI device is represented by a Newbus device. Any "
+"device in the system can have children; a device which has children is often "
+"called a _\"bus\"_. Examples of common busses in the system are ISA and PCI, "
+"which manage lists of devices attached to ISA and PCI busses respectively."
+msgstr ""
+"Устройство в контексте Newbus представляет собой отдельную аппаратную "
+"сущность в системе. Например, каждое PCI-устройство представлено устройством "
+"Newbus. Любое устройство в системе может иметь дочерние устройства; "
+"устройство, у которого есть дочерние устройства, часто называют _\"шиной\"_. "
+"Примерами распространённых шин в системе являются ISA и PCI, которые "
+"управляют списками устройств, подключённых к шинам ISA и PCI соответственно."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:100
+msgid ""
+"Often, a connection between different kinds of bus is represented by a "
+"_\"bridge\"_ device, which normally has one child for the attached bus. An "
+"example of this is a _PCI-to-PCI bridge_ which is represented by a device "
+"_[.filename]#pcibN#_ on the parent PCI bus and has a child "
+"_[.filename]#pciN#_ for the attached bus. This layout simplifies the "
+"implementation of the PCI bus tree, allowing common code to be used for both "
+"top-level and bridged busses."
+msgstr ""
+"Часто соединение между различными типами шин представлено устройством "
+"_\"мост\"_, которое обычно имеет один дочерний элемент для подключенной "
+"шины. Примером этого является _PCI-to-PCI мост_, который представлен "
+"устройством _[.filename]#pcibN#_ на родительской PCI-шине и имеет дочерний "
+"элемент _[.filename]#pciN#_ для подключенной шины. Такая структура упрощает "
+"реализацию дерева PCI-шин, позволяя использовать общий код как для "
+"верхнеуровневых, так и для соединенных через мост шин."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:102
+msgid ""
+"Each device in the Newbus architecture asks its parent to map its resources. "
+"The parent then asks its own parent until the nexus is reached. So, "
+"basically the nexus is the only part of the Newbus system which knows about "
+"all resources."
+msgstr ""
+"Каждое устройство в архитектуре Newbus запрашивает у своего родителя "
+"отображение своих ресурсов. Затем родитель запрашивает у своего собственного "
+"родителя, пока запрос не достигнет nexus. Таким образом, по сути, nexus - "
+"это единственная часть системы Newbus, которая знает обо всех ресурсах."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:106
+msgid ""
+"An ISA device might want to map its IO port at `0x230`, so it asks its "
+"parent, in this case the ISA bus. The ISA bus hands it over to the PCI-to-"
+"ISA bridge which in its turn asks the PCI bus, which reaches the host-to-PCI "
+"bridge and finally the nexus. The beauty of this transition upwards is that "
+"there is room to translate the requests. For example, the `0x230` IO port "
+"request might become memory-mapped at `0xb0000230` on a MIPS box by the PCI "
+"bridge."
+msgstr ""
+"Устройство ISA может захотеть отобразить свой порт ввода-вывода по адресу "
+"`0x230`, поэтому оно запрашивает у своего родителя, в данном случае — шины "
+"ISA. Шина ISA передаёт запрос мосту PCI-to-ISA, который, в свою очередь, "
+"запрашивает шину PCI. Запрос доходит до моста host-to-PCI и, наконец, до "
+"nexus. Прелесть этого восходящего перехода в том, что есть возможность "
+"преобразовывать запросы. Например, запрос порта ввода-вывода `0x230` может "
+"быть преобразован в отображение памяти по адресу `0xb0000230` на системе "
+"MIPS с помощью моста PCI."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:109
+msgid ""
+"Resource allocation can be controlled at any place in the device tree. For "
+"instance on many Alpha platforms, ISA interrupts are managed separately from "
+"PCI interrupts and resource allocations for ISA interrupts are managed by "
+"the Alpha's ISA bus device. On IA-32, ISA and PCI interrupts are both "
+"managed by the top-level nexus device. For both ports, memory and port "
+"address space is managed by a single entity - nexus for IA-32 and the "
+"relevant chipset driver on Alpha (e.g., CIA or tsunami)."
+msgstr ""
+"Распределение ресурсов может контролироваться в любом месте дерева "
+"устройств. Например, на многих платформах Alpha прерывания ISA управляются "
+"отдельно от прерываний PCI, а распределение ресурсов для прерываний ISA "
+"осуществляется устройством шины ISA Alpha. На IA-32 прерывания ISA и PCI "
+"управляются устройством верхнего уровня nexus. Для обеих архитектур "
+"управление пространством памяти и портов осуществляется единым объектом — "
+"nexus для IA-32 и соответствующим драйвером чипсета на Alpha (например, CIA "
+"или tsunami)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:111
+msgid ""
+"In order to normalize access to memory and port mapped resources, Newbus "
+"integrates the `bus_space` APIs from NetBSD. These provide a single API to "
+"replace inb/outb and direct memory reads/writes. The advantage of this is "
+"that a single driver can easily use either memory-mapped registers or port-"
+"mapped registers (some hardware supports both)."
+msgstr ""
+"Для стандартизации доступа к памяти и ресурсам, отображённым на порты, "
+"Newbus интегрирует API `bus_space` из NetBSD. Они предоставляют единый API "
+"для замены inb/outb и прямых операций чтения/записи в память. Преимущество "
+"этого подхода в том, что один драйвер может легко использовать либо "
+"регистры, отображённые в память, либо регистры, отображённые на порты "
+"(некоторое оборудование поддерживает оба варианта)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:113
+msgid ""
+"This support is integrated into the resource allocation mechanism. When a "
+"resource is allocated, a driver can retrieve the associated "
+"`bus_space_tag_t` and `bus_space_handle_t` from the resource."
+msgstr ""
+"Эта поддержка интегрирована в механизм распределения ресурсов. При выделении "
+"ресурса драйвер может получить связанные `bus_space_tag_t` и "
+"`bus_space_handle_t` из этого ресурса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:115
+msgid ""
+"Newbus also allows for definitions of interface methods in files dedicated "
+"to this purpose. These are the [.filename]#.m# files that are found under "
+"the [.filename]#src/sys# hierarchy."
+msgstr ""
+"Newbus также позволяет определять методы интерфейса в файлах, "
+"предназначенных для этой цели. Это файлы с расширением [.filename]#.m#, "
+"которые находятся в иерархии [.filename]#src/sys#."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:117
+msgid ""
+"The core of the Newbus system is an extensible \"object-based programming\" "
+"model. Each device in the system has a table of methods which it supports. "
+"The system and other devices uses those methods to control the device and "
+"request services. The different methods supported by a device are defined by "
+"a number of \"interfaces\". An \"interface\" is simply a group of related "
+"methods which can be implemented by a device."
+msgstr ""
+"Ядро системы Newbus представляет собой расширяемую модель «объектно-"
+"ориентированного программирования». Каждое устройство в системе имеет "
+"таблицу поддерживаемых методов. Система и другие устройства используют эти "
+"методы для управления устройством и запроса услуг. Различные методы, "
+"поддерживаемые устройством, определяются рядом «интерфейсов». «Интерфейс» — "
+"это просто группа связанных методов, которые могут быть реализованы "
+"устройством."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:119
+msgid ""
+"In the Newbus system, the methods for a device are provided by the various "
+"device drivers in the system. When a device is attached to a driver during "
+"_auto-configuration_, it uses the method table declared by the driver. A "
+"device can later _detach_ from its driver and _re-attach_ to a new driver "
+"with a new method table. This allows dynamic replacement of drivers which "
+"can be useful for driver development."
+msgstr ""
+"В системе Newbus методы для устройства предоставляются различными драйверами "
+"устройств в системе. Когда устройство подключается к драйверу во время "
+"_автоконфигурации_, оно использует таблицу методов, объявленную драйвером. "
+"Устройство может позже _отключиться_ от своего драйвера и _подключиться_ к "
+"новому драйверу с новой таблицей методов. Это позволяет динамически заменять "
+"драйверы, что может быть полезно для разработки драйверов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:121
+msgid ""
+"The interfaces are described by an interface definition language similar to "
+"the language used to define vnode operations for file systems. The interface "
+"would be stored in a methods file (which would normally be named "
+"[.filename]#foo_if.m#)."
+msgstr ""
+"Интерфейсы описываются языком определения интерфейсов, похожим на язык, "
+"используемый для определения операций vnode для файловых систем. Интерфейс "
+"хранится в файле методов (который обычно называется [.filename]#foo_if.m#)."
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:122
+#, no-wrap
+msgid "Newbus Methods"
+msgstr "Методы Newbus"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:128
+#, no-wrap
+msgid " # Foo subsystem/driver (a comment...)\n"
+msgstr " # Foo subsystem/driver (a comment...)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:130
+#, no-wrap
+msgid "\t INTERFACE foo\n"
+msgstr "\t INTERFACE foo\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:134
+#, no-wrap
+msgid ""
+"\tMETHOD int doit {\n"
+"\t\tdevice_t dev;\n"
+"\t};\n"
+msgstr ""
+"\tMETHOD int doit {\n"
+"\t\tdevice_t dev;\n"
+"\t};\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:137
+#, no-wrap
+msgid ""
+"\t# DEFAULT is the method that will be used, if a method was not\n"
+"\t# provided via: DEVMETHOD()\n"
+msgstr ""
+"\t# DEFAULT is the method that will be used, if a method was not\n"
+"\t# provided via: DEVMETHOD()\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:142
+#, no-wrap
+msgid ""
+"\tMETHOD void doit_to_child {\n"
+"\t\tdevice_t dev;\n"
+"\t\tdriver_t child;\n"
+"\t} DEFAULT doit_generic_to_child;\n"
+msgstr ""
+"\tMETHOD void doit_to_child {\n"
+"\t\tdevice_t dev;\n"
+"\t\tdriver_t child;\n"
+"\t} DEFAULT doit_generic_to_child;\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:146
+msgid ""
+"When this interface is compiled, it generates a header file "
+"\"[.filename]#foo_if.h#\" which contains function declarations:"
+msgstr ""
+"Когда этот интерфейс компилируется, он генерирует заголовочный файл "
+"\"[.filename]#foo_if.h#\", который содержит объявления функций:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:151
+#, no-wrap
+msgid ""
+" int FOO_DOIT(device_t dev);\n"
+" int FOO_DOIT_TO_CHILD(device_t dev, device_t child);\n"
+msgstr ""
+" int FOO_DOIT(device_t dev);\n"
+" int FOO_DOIT_TO_CHILD(device_t dev, device_t child);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:154
+msgid ""
+"A source file, \"[.filename]#foo_if.c#\" is also created to accompany the "
+"automatically generated header file; it contains implementations of those "
+"functions which look up the location of the relevant functions in the "
+"object's method table and call that function."
+msgstr ""
+"Исходный файл `[.filename]#foo_if.c#` также создается для сопровождения "
+"автоматически сгенерированного заголовочного файла; он содержит реализации "
+"функций, которые ищут расположение соответствующих функций в таблице методов "
+"объекта и вызывают эту функцию."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:156
+msgid ""
+"The system defines two main interfaces. The first fundamental interface is "
+"called _\"device\"_ and includes methods which are relevant to all devices. "
+"Methods in the _\"device\"_ interface include _\"probe\"_, _\"attach\"_ and "
+"_\"detach\"_ to control detection of hardware and _\"shutdown\"_, "
+"_\"suspend\"_ and _\"resume\"_ for critical event notification."
+msgstr ""
+"Система определяет два основных интерфейса. Первый фундаментальный интерфейс "
+"называется _\"device\"_ (устройство) и включает методы, которые относятся ко "
+"всем устройствам. Методы в интерфейсе _\"device\"_ включают _\"probe\"_ "
+"(обнаружение), _\"attach\"_ (присоединение) и _\"detach\"_ (отсоединение) "
+"для управления обнаружением оборудования, а также _\"shutdown\"_ "
+"(выключение), _\"suspend\"_ (приостановка) и _\"resume\"_ (возобновление) "
+"для уведомления о критических событиях."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:158
+msgid ""
+"The second, more complex interface is _\"bus\"_. This interface contains "
+"methods suitable for devices which have children, including methods to "
+"access bus specific per-device information footnote:"
+"[man:bus_generic_read_ivar[9] and man:bus_generic_write_ivar[9]], event "
+"notification (`_child_detached_`, `_driver_added_`) and resource management "
+"(`_alloc_resource_`, `_activate_resource_`, `_deactivate_resource_`, "
+"`_release_resource_`)."
+msgstr ""
+"Второй, более сложный интерфейс — _\"bus\"_. Этот интерфейс содержит методы, "
+"подходящие для устройств, имеющих дочерние элементы, включая методы доступа "
+"к специфичной для шины информации об устройстве footnote:"
+"[man:bus_generic_read_ivar[9] и man:bus_generic_write_ivar[9]], уведомления "
+"о событиях (`_child_detached_`, `_driver_added_`) и управление ресурсами "
+"(`_alloc_resource_`, `_activate_resource_`, `_deactivate_resource_`, "
+"`_release_resource_`)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:160
+msgid ""
+"Many methods in the \"bus\" interface are performing services for some child "
+"of the bus device. These methods would normally use the first two arguments "
+"to specify the bus providing the service and the child device which is "
+"requesting the service. To simplify driver code, many of these methods have "
+"accessor functions which lookup the parent and call a method on the parent. "
+"For instance the method `BUS_TEARDOWN_INTR(device_t dev, device_t "
+"child, ...)` can be called using the function `bus_teardown_intr(device_t "
+"child, ...)`."
+msgstr ""
+"Многие методы в интерфейсе \"bus\" выполняют сервисы для некоторого "
+"дочернего устройства шины. Эти методы обычно используют первые два аргумента "
+"для указания шины, предоставляющей сервис, и дочернего устройства, "
+"запрашивающего сервис. Для упрощения кода драйвера многие из этих методов "
+"имеют вспомогательные функции, которые находят родительское устройство и "
+"вызывают метод у родителя. Например, метод `BUS_TEARDOWN_INTR(device_t dev, "
+"device_t child, ...)` может быть вызван с помощью функции "
+"`bus_teardown_intr(device_t child, ...)`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:162
+msgid ""
+"Some bus types in the system define additional interfaces to provide access "
+"to bus-specific functionality. For instance, the PCI bus driver defines the "
+"\"pci\" interface which has two methods `_read_config_` and `_write_config_` "
+"for accessing the configuration registers of a PCI device."
+msgstr ""
+"Некоторые типы шин в системе определяют дополнительные интерфейсы для "
+"предоставления доступа к специфичной для шины функциональности. Например, "
+"драйвер шины PCI определяет интерфейс \"pci\", который имеет два метода "
+"`_read_config_` и `_write_config_` для доступа к конфигурационным регистрам "
+"устройства PCI."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:164
+#, no-wrap
+msgid "Newbus API"
+msgstr "Newbus API"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:167
+msgid ""
+"As the Newbus API is huge, this section makes some effort at documenting it. "
+"More information to come in the next revision of this document."
+msgstr ""
+"Поскольку API Newbus очень обширен, в этом разделе предпринята попытка его "
+"документирования. Дополнительная информация будет добавлена в следующей "
+"версии этого документа."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:168
+#, no-wrap
+msgid "Important Locations in the Source Hierarchy"
+msgstr "Важные места в иерархии исходного кода"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:171
+msgid ""
+"[.filename]#src/sys/[arch]/[arch]# - Kernel code for a specific machine "
+"architecture resides in this directory. For example, the `i386` "
+"architecture, or the `SPARC64` architecture."
+msgstr ""
+"[.filename]#src/sys/[arch]/[arch]# - Код ядра для конкретной аппаратной "
+"архитектуры находится в этом каталоге. Например, архитектура `i386` или "
+"архитектура `SPARC64`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:173
+msgid ""
+"[.filename]#src/sys/dev/[bus]# - device support for a specific `[bus]` "
+"resides in this directory."
+msgstr ""
+"[.filename]#src/sys/dev/[bus]# - поддержка устройств для конкретной `[bus]` "
+"находится в этом каталоге."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:175
+msgid ""
+"[.filename]#src/sys/dev/pci# - PCI bus support code resides in this "
+"directory."
+msgstr ""
+"[.filename]#src/sys/dev/pci# - Код поддержки шины PCI находится в этом "
+"каталоге."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:177
+msgid ""
+"[.filename]#src/sys/[isa|pci]# - PCI/ISA device drivers reside in this "
+"directory. The PCI/ISA bus support code used to exist in this directory in "
+"FreeBSD version `4.0`."
+msgstr ""
+"[.filename]#src/sys/[isa|pci]# - В этом каталоге находятся драйверы "
+"устройств PCI/ISA. Код поддержки шины PCI/ISA располагался в этом каталоге в "
+"FreeBSD версии `4.0`."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:178
+#, no-wrap
+msgid "Important Structures and Type Definitions"
+msgstr "Важные структуры и определения типов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:181
+msgid ""
+"`devclass_t` - This is a type definition of a pointer to a `struct devclass`."
+msgstr "`devclass_t` - Это определение типа указателя на `struct devclass`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:183
+msgid ""
+"`device_method_t` - This is the same as `kobj_method_t` (see [.filename]#src/"
+"sys/kobj.h#)."
+msgstr ""
+"`device_method_t` - Это то же самое, что и `kobj_method_t` (см. "
+"[.filename]#src/sys/kobj.h#)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:185
+msgid ""
+"`device_t` - This is a type definition of a pointer to a `struct device`. "
+"`device_t` represents a device in the system. It is a kernel object. See "
+"[.filename]#src/sys/sys/bus_private.h# for implementation details."
+msgstr ""
+"`device_t` - Это определение типа указателя на структуру `struct device`. "
+"`device_t` представляет устройство в системе. Это объект ядра. Подробности "
+"реализации см. в [.filename]#src/sys/sys/bus_private.h#."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:187
+msgid ""
+"`driver_t` - This is a type definition which references `struct driver`. The "
+"`driver` struct is a class of the `device` kernel object; it also holds data "
+"private to the driver."
+msgstr ""
+"`driver_t` - Это определение типа, которое ссылается на `struct driver`. "
+"Структура `driver` является классом объекта ядра `device`; она также "
+"содержит данные, приватные для драйвера."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:189
+#, fuzzy
+#| msgid "*_driver_t_ Implementation*\n"
+msgid "*_driver_t_ Implementation*"
+msgstr "* Реализация _driver_t_*\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:195
+#, no-wrap
+msgid ""
+"\t struct driver {\n"
+"\t\tKOBJ_CLASS_FIELDS;\n"
+"\t\tvoid\t*priv;\t\t\t/* driver private data */\n"
+"\t };\n"
+msgstr ""
+"\t struct driver {\n"
+"\t\tKOBJ_CLASS_FIELDS;\n"
+"\t\tvoid\t*priv;\t\t\t/* driver private data */\n"
+"\t };\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:198
+msgid ""
+"A `device_state_t` type, which is an enumeration, `device_state`. It "
+"contains the possible states of a Newbus device before and after the "
+"autoconfiguration process."
+msgstr ""
+"Тип `device_state_t`, который является перечислением, `device_state`. Он "
+"содержит возможные состояния устройства Newbus до и после процесса "
+"автонастройки."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:200
+#, fuzzy
+#| msgid "*Device States _device_state_t*\n"
+msgid "*Device States _device_state_t*"
+msgstr "*Состояния устройств _device_state_t*\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/newbus/_index.adoc:211
+#, no-wrap
+msgid ""
+"\t /*\n"
+"\t * src/sys/sys/bus.h\n"
+"\t */\n"
+"\t typedef enum device_state {\n"
+"\t\tDS_NOTPRESENT,\t/* not probed or probe failed */\n"
+"\t\tDS_ALIVE,\t\t/* probe succeeded */\n"
+"\t\tDS_ATTACHED,\t/* attach method called */\n"
+"\t\tDS_BUSY\t\t\t/* device is open */\n"
+"\t } device_state_t;\n"
+msgstr ""
+"\t /*\n"
+"\t * src/sys/sys/bus.h\n"
+"\t */\n"
+"\t typedef enum device_state {\n"
+"\t\tDS_NOTPRESENT,\t/* not probed or probe failed */\n"
+"\t\tDS_ALIVE,\t\t/* probe succeeded */\n"
+"\t\tDS_ATTACHED,\t/* attach method called */\n"
+"\t\tDS_BUSY\t\t\t/* device is open */\n"
+"\t } device_state_t;\n"
diff --git a/documentation/content/ru/books/arch-handbook/parti.adoc b/documentation/content/ru/books/arch-handbook/parti.adoc
new file mode 100644
index 0000000000..8f04536f14
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/parti.adoc
@@ -0,0 +1,13 @@
+---
+BundleType: branch
+next: books/arch-handbook/boot
+params:
+ path: /books/arch-handbook/parti/
+prev: books/arch-handbook
+showBookMenu: true
+title: 'Глава I. Ядро'
+weight: 1
+---
+
+[[kernel]]
+= Ядро системы
diff --git a/documentation/content/ru/books/arch-handbook/parti.po b/documentation/content/ru/books/arch-handbook/parti.po
new file mode 100644
index 0000000000..ac36191cc2
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/parti.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-06-12 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookparti/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/parti.adoc:1
+#, no-wrap
+msgid "Part I. Kernel"
+msgstr "Глава I. Ядро"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/parti.adoc:13
+#, no-wrap
+msgid "Kernel"
+msgstr "Ядро системы"
diff --git a/documentation/content/ru/books/arch-handbook/partii.adoc b/documentation/content/ru/books/arch-handbook/partii.adoc
new file mode 100644
index 0000000000..b8870299b4
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/partii.adoc
@@ -0,0 +1,12 @@
+---
+next: books/arch-handbook/driverbasics
+params:
+ path: /books/arch-handbook/partii/
+prev: books/arch-handbook/smp
+showBookMenu: true
+title: 'Глава II. Драйверы устройств'
+weight: 10
+---
+
+[[devicedrivers]]
+= Драйверы устройств
diff --git a/documentation/content/ru/books/arch-handbook/partii.po b/documentation/content/ru/books/arch-handbook/partii.po
new file mode 100644
index 0000000000..a0698863d7
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/partii.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-05-29 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookpartii/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/partii.adoc:1
+#, no-wrap
+msgid "Part II. Device Drivers"
+msgstr "Глава II. Драйверы устройств"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/partii.adoc:12
+#, no-wrap
+msgid "Device Drivers"
+msgstr "Драйверы устройств"
diff --git a/documentation/content/ru/books/arch-handbook/partiii.adoc b/documentation/content/ru/books/arch-handbook/partiii.adoc
new file mode 100644
index 0000000000..a219eb1f14
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/partiii.adoc
@@ -0,0 +1,12 @@
+---
+next: books/arch-handbook/bibliography
+params:
+ path: /books/arch-handbook/partiii/
+prev: books/arch-handbook/pccard
+showBookMenu: true
+title: 'Глава III. Приложения'
+weight: 19
+---
+
+[[appendices]]
+= Приложения
diff --git a/documentation/content/ru/books/arch-handbook/partiii.po b/documentation/content/ru/books/arch-handbook/partiii.po
new file mode 100644
index 0000000000..951813b7ca
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/partiii.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-05-29 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookpartiii/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/partiii.adoc:1
+#, no-wrap
+msgid "Part III. Appendices"
+msgstr "Глава III. Приложения"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/partiii.adoc:12
+#, no-wrap
+msgid "Appendices"
+msgstr "Приложения"
diff --git a/documentation/content/ru/books/arch-handbook/pccard/_index.adoc b/documentation/content/ru/books/arch-handbook/pccard/_index.adoc
new file mode 100644
index 0000000000..9f6116121e
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/pccard/_index.adoc
@@ -0,0 +1,209 @@
+---
+description: 'PC Card'
+next: books/arch-handbook/partiii
+params:
+ path: /books/arch-handbook/pccard/
+prev: books/arch-handbook/sound
+showBookMenu: true
+tags: ["pc card", "overview"]
+title: 'Глава 16. PC Card'
+weight: 18
+---
+
+[[pccard]]
+= PC Card
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 16
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Эта глава расскажет о механизмах FreeBSD для написания драйвера устройства для PC Card или CardBus устройства. Однако в настоящее время она лишь документирует, как добавить новое устройство к существующему драйверу pccard.
+
+[[pccard-adddev]]
+== Добавление устройства
+
+Драйверы устройств знают, какие устройства они поддерживают. В ядре существует таблица поддерживаемых устройств, которую драйверы используют для подключения к устройству.
+
+[[pccard-overview]]
+=== Обзор
+
+PC Cards идентифицируются одним из двух способов, оба основаны на _Card Information Structure_ (CIS), хранящейся на карте. Первый метод — использование числовых идентификаторов производителя и продукта. Второй метод — использование удобочитаемых строк, также содержащихся в CIS. Шина PC Card использует централизованную базу данных и некоторые макросы для упрощения шаблона проектирования, помогающего автору драйвера сопоставлять устройства с его драйвером.
+
+Производители оригинального оборудования (OEM) часто разрабатывают эталонный дизайн для продуктов PC Card, а затем продают этот дизайн другим компаниям для продвижения на рынке. Эти компании дорабатывают дизайн, продвигают продукт для своей целевой аудитории или географического региона и размещают на карте свою собственную торговую марку. Доработки физической карты обычно очень незначительны, если они вообще вносятся. Чтобы усилить свой бренд, такие поставщики указывают название своей компании в читаемых человеком строках в пространстве CIS, но оставляют идентификаторы производителя и продукта без изменений.
+
+Из-за такой практики драйверы FreeBSD обычно полагаются на числовые идентификаторы для распознавания устройств. Использование числовых идентификаторов и централизованной базы данных усложняет добавление ID и поддержку карт в систему. Необходимо тщательно проверять, кто на самом деле произвел карту, особенно когда кажется, что у производителя карты уже может быть другой идентификатор производителя в центральной базе данных. Linksys, D-Link и NetGear — это несколько американских производителей сетевого оборудования, которые часто продают один и тот же дизайн. Эти же дизайны могут продаваться в Японии под такими названиями, как Buffalo и Corega. Часто все эти устройства будут иметь одинаковые идентификаторы производителя и продукта.
+
+Код шины PC Card хранит централизованную базу данных информации о картах, но не о том, какой драйвер с ними связан, в [.filename]#/sys/dev/pccard/pccarddevs#. Он также предоставляет набор макросов, которые позволяют легко создавать простые записи в таблице, используемой драйвером для заявки устройств.
+
+Наконец, некоторые устройства очень низкого уровня вообще не содержат идентификации производителя. Эти устройства должны быть обнаружены путем сопоставления читаемых человеком строк CIS. Хотя было бы хорошо, если бы нам не нужен был этот метод в качестве запасного варианта, он необходим для некоторых очень дешевых CD-плееров и Ethernet-карт. Этот метод, как правило, следует избегать, но ряд устройств перечислен в этом разделе, потому что они были добавлены до осознания OEM-характера бизнеса PC Card. При добавлении новых устройств предпочтительнее использовать числовой метод.
+
+[[pccard-pccarddevs]]
+=== Формат файла [.filename]#pccarddevs#
+
+В файле [.filename]#pccarddevs# есть четыре раздела. Первый раздел содержит номера производителей для вендоров, которые их используют. Этот раздел отсортирован в числовом порядке. Следующий раздел включает все продукты, используемые этими вендорами, вместе с их идентификаторами продуктов и строкой описания. Строка описания обычно не используется (вместо этого мы устанавливаем описание устройства на основе читаемого CIS, даже если совпадение найдено по числовому идентификатору). Затем эти два раздела повторяются для устройств, использующих метод строкового сопоставления. Наконец, C-подобные комментарии, заключенные между символами `/*` и `*/`, допускаются в любом месте файла.
+
+Первая часть файла содержит идентификаторы производителей. Пожалуйста, сохраняйте этот список в числовом порядке. Также, пожалуйста, согласовывайте изменения в этом файле, так как мы делимся им с NetBSD для создания общего центра обработки этой информации. Например, вот первые несколько идентификаторов производителей:
+
+[.programlisting]
+....
+vendor FUJITSU 0x0004 Fujitsu Corporation
+vendor NETGEAR_2 0x000b Netgear
+vendor PANASONIC 0x0032 Matsushita Electric Industrial Co.
+vendor SANDISK 0x0045 Sandisk Corporation
+....
+
+Вероятно, запись `NETGEAR_2` на самом деле относится к OEM-производителю, у которого NETGEAR приобретал карты, и автор поддержки этих карт не знал на тот момент, что Netgear использовал чужой идентификатор. Эти записи довольно просты. Ключевое слово `vendor` обозначает тип строки, за которым следует название производителя. Это название будет повторяться позже в [.filename]#pccarddevs#, а также использоваться в таблицах соответствия драйверов, поэтому оно должно быть коротким и допустимым идентификатором в C. Числовой идентификатор в шестнадцатеричном формате указывает производителя. Не добавляйте идентификаторы вида `0xffffffff` или `0xffff`, так как они зарезервированы (первый означает "идентификатор не установлен", а второй иногда встречается в крайне некачественных картах для указания "отсутствует"). Наконец, следует строковое описание компании, производящей карту. Эта строка в FreeBSD ни для чего не используется, кроме как в комментариях.
+
+Вторая секция файла содержит продукты. Как показано в этом примере, формат аналогичен строкам поставщиков:
+
+[.programlisting]
+....
+/* Allied Telesis K.K. */
+product ALLIEDTELESIS LA_PCM 0x0002 Allied Telesis LA-PCM
+
+/* Archos */
+product ARCHOS ARC_ATAPI 0x0043 MiniCD
+....
+
+Ключевое слово `product` следует за именем производителя, повторяющимся сверху. После него идет название продукта, которое используется драйвером и должно быть допустимым идентификатором в C, но также может начинаться с цифры. Как и в случае с производителями, шестнадцатеричный идентификатор продукта для этой карты следует тем же соглашениям для `0xffffffff` и `0xffff`. Наконец, идет строковое описание самого устройства. Эта строка обычно не используется в FreeBSD, поскольку драйвер шины pccard в FreeBSD формирует строку из читаемых человеком записей CIS, но она может быть использована в редких случаях, когда этого недостаточно. Продукты перечислены в алфавитном порядке по производителю, затем в числовом порядке по идентификатору продукта. Перед записями каждого производителя есть комментарий в C, а между записями — пустая строка.
+
+Третий раздел аналогичен предыдущему разделу производителей, но все числовые идентификаторы производителей установлены в `-1`, что означает "совпадение с любым найденным" в коде шины pccard FreeBSD. Поскольку это идентификаторы C, их имена должны быть уникальными. В остальном формат идентичен первому разделу файла.
+
+Последний раздел содержит записи для тех карт, которые должны быть идентифицированы по строковым значениям. Формат этого раздела немного отличается от общего раздела:
+
+[.programlisting]
+....
+product ADDTRON AWP100 { "Addtron", "AWP-100&spWireless&spPCMCIA", "Version&sp01.02", NULL }
+product ALLIEDTELESIS WR211PCM { "Allied&spTelesis&spK.K.", "WR211PCM", NULL, NULL } Allied Telesis WR211PCM
+....
+
+Знакомое ключевое слово `product` сопровождается названием производителя и именем карты, как и во втором разделе файла. Здесь формат отличается от использованного ранее. Идёт группировка {}, за которой следует несколько строк. Эти строки соответствуют производителю, продукту и дополнительной информации, определённой в кортеже CIS_INFO. Эти строки фильтруются программой, которая генерирует [.filename]#pccarddevs.h#, чтобы заменить &sp на реальный пробел. Строки NULL означают, что соответствующую часть записи следует игнорировать. В приведённом здесь примере есть некорректная запись. Она не должна содержать номер версии, если только он не критичен для работы карты. Иногда у производителей может быть множество различных версий карты в обращении, которые все работают, и в таком случае эта информация только затрудняет использование аналогичной карты с FreeBSD. Иногда это необходимо, когда производитель хочет продавать множество различных компонентов под одним брендом из-за рыночных соображений (доступность, цена и т. д.). Тогда это может быть критично для различения карты в тех редких случаях, когда производитель сохранил ту же пару производитель/продукт. На данный момент использование регулярных выражений для сопоставления недоступно.
+
+[[pccard-probe]]
+=== Пример процедуры обнаружения
+
+Чтобы понять, как добавить устройство в список поддерживаемых, необходимо разобраться в процедурах `probe` (обнаружение) и/или `match` (сопоставление), которые есть во многих драйверах. В FreeBSD 5.x это немного сложнее из-за наличия слоя совместимости с OLDCARD. Поскольку различия лишь косметические, здесь будет представлена идеализированная версия.
+
+[.programlisting]
+....
+static const struct pccard_product wi_pccard_products[] = {
+ PCMCIA_CARD(3COM, 3CRWE737A, 0),
+ PCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),
+ PCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),
+ PCMCIA_CARD(TDK, LAK_CD011WL, 0),
+ { NULL }
+};
+
+static int
+wi_pccard_probe(dev)
+ device_t dev;
+{
+ const struct pccard_product *pp;
+
+ if ((pp = pccard_product_lookup(dev, wi_pccard_products,
+ sizeof(wi_pccard_products[0]), NULL)) != NULL) {
+ if (pp->pp_name != NULL)
+ device_set_desc(dev, pp->pp_name);
+ return (0);
+ }
+ return (ENXIO);
+}
+....
+
+Вот простая процедура проверки pccard, которая соответствует нескольким устройствам. Как упоминалось выше, название может отличаться (если это не `foo_pccard_probe()`, то это будет `foo_pccard_match()`). Функция `pccard_product_lookup()` является обобщенной функцией, которая проходит по таблице и возвращает указатель на первую запись, которой соответствует. Некоторые драйверы могут использовать этот механизм для передачи дополнительной информации о некоторых картах остальной части драйвера, поэтому в таблице могут быть вариации. Единственное требование — каждая строка таблицы должна содержать `struct pccard_product` в качестве первого элемента.
+
+Рассматривая таблицу `wi_pccard_products`, можно заметить, что все записи имеют вид `PCMCIA_CARD(_foo_, _bar_, _baz_)`. Часть _foo_ — это идентификатор производителя из [.filename]#pccarddevs#. Часть _bar_ — это идентификатор продукта. _baz_ — ожидаемый номер функции для этой карты. Многие pccard-устройства могут иметь несколько функций, поэтому требуется способ различать функцию 1 и функцию 0. Вы можете встретить `PCMCIA_CARD_D`, который включает описание устройства из [.filename]#pccarddevs#. Также могут встречаться `PCMCIA_CARD2` и `PCMCIA_CARD2_D`, которые используются, когда необходимо сопоставить как строки CIS, так и номера производителей, в вариантах «использовать описание по умолчанию» и «взять описание из pccarddevs».
+
+[[pccard-add]]
+=== Собираем все вместе
+
+Для добавления нового устройства необходимо сначала получить идентификационную информацию от устройства. Проще всего это сделать, вставив устройство в слот PC Card или CF и выполнив команду `devinfo -v`. Пример вывода:
+
+[.programlisting]
+....
+ cbb1 pnpinfo vendor=0x104c device=0xac51 subvendor=0x1265 subdevice=0x0300 class=0x060700 at slot=10 function=1
+ cardbus1
+ pccard1
+ unknown pnpinfo manufacturer=0x026f product=0x030c cisvendor="BUFFALO" cisproduct="WLI2-CF-S11" function_type=6 at function=0
+....
+
+`manufacturer` и `product` являются числовыми идентификаторами данного продукта, в то время как `cisvendor` и `cisproduct` представляют собой строки описания продукта из CIS.
+
+Поскольку мы сначала хотим предпочесть числовой вариант, попробуем сначала создать запись на его основе. Приведённая выше карта была слегка изменена для целей данного примера. Производитель — BUFFALO, у которого, как мы видим, уже есть запись:
+
+[.programlisting]
+....
+vendor BUFFALO 0x026f BUFFALO (Melco Corporation)
+....
+
+Но нет записи для этой конкретной карты. Вместо этого мы видим:
+
+[.programlisting]
+....
+/* BUFFALO */
+product BUFFALO WLI_PCM_S11 0x0305 BUFFALO AirStation 11Mbps WLAN
+product BUFFALO LPC_CF_CLT 0x0307 BUFFALO LPC-CF-CLT
+product BUFFALO LPC3_CLT 0x030a BUFFALO LPC3-CLT Ethernet Adapter
+product BUFFALO WLI_CF_S11G 0x030b BUFFALO AirStation 11Mbps CF WLAN
+....
+
+Чтобы добавить устройство, мы можем просто добавить эту запись в [.filename]#pccarddevs#:
+
+[.programlisting]
+....
+product BUFFALO WLI2_CF_S11G 0x030c BUFFALO AirStation ultra 802.11b CF
+....
+
+После выполнения этих шагов карту можно добавить в драйвер. Это простая операция добавления одной строки:
+
+[.programlisting]
+....
+static const struct pccard_product wi_pccard_products[] = {
+ PCMCIA_CARD(3COM, 3CRWE737A, 0),
+ PCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),
+ PCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),
++ PCMCIA_CARD(BUFFALO, WLI_CF2_S11G, 0),
+ PCMCIA_CARD(TDK, LAK_CD011WL, 0),
+ { NULL }
+};
+....
+
+Обратите внимание, что я добавил символ '`+`' перед строкой, которую добавил, но это только для выделения строки. Не добавляйте его в реальный драйвер. После добавления строки вы можете пересобрать ядро или модуль и протестировать его. Если устройство распознано и работает, отправьте патч. Если оно не работает, определите, что необходимо для его работы, и отправьте патч. Если устройство не распознаётся вообще, вы где-то ошиблись и следует перепроверить каждый шаг.
+
+Если вы коммиттер исходного кода FreeBSD, и всё работает корректно, то можете закоммитить изменения в дерево. Однако есть несколько небольших нюансов, которые следует учесть. [.filename]#pccarddevs# должен быть закоммичен в дерево первым. Затем [.filename]#pccarddevs.h# необходимо перегенерировать и закоммитить вторым шагом, убедившись, что правильный тег $FreeBSD$ присутствует в последнем файле. В конце закоммитьте добавления в драйвер.
+
+[[pccard-pr]]
+=== Отправка кода для нового устройства
+
+Пожалуйста, не отправляйте записи о новых устройствах автору напрямую. Вместо этого оформите их как PR и сообщите автору номер PR для учета. Это гарантирует, что записи не будут потеряны. При отправке PR нет необходимости включать в патч diff-файлы [.filename]#pccardevs.h#, так как они будут перегенерированы. Однако необходимо включить описание устройства, а также патчи для клиентского драйвера. Если название устройства неизвестно, используйте имя OEM99, и автор скорректирует OEM99 после изучения. Коммиттеры не должны коммитить OEM99, а вместо этого найти наибольший OEM-номер и закоммитить на единицу больше.
diff --git a/documentation/content/ru/books/arch-handbook/pccard/_index.po b/documentation/content/ru/books/arch-handbook/pccard/_index.po
new file mode 100644
index 0000000000..5248481b16
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/pccard/_index.po
@@ -0,0 +1,710 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookpccard_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:14
+#, no-wrap
+msgid "PC Card"
+msgstr "PC Card"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:1
+#, no-wrap
+msgid "Chapter 16. PC Card"
+msgstr "Глава 16. PC Card"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:52
+msgid ""
+"This chapter will talk about the FreeBSD mechanisms for writing a device "
+"driver for a PC Card or CardBus device. However, at present it just "
+"documents how to add a new device to an existing pccard driver."
+msgstr ""
+"Эта глава расскажет о механизмах FreeBSD для написания драйвера устройства "
+"для PC Card или CardBus устройства. Однако в настоящее время она лишь "
+"документирует, как добавить новое устройство к существующему драйверу pccard."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:54
+#, no-wrap
+msgid "Adding a Device"
+msgstr "Добавление устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:57
+msgid ""
+"Device drivers know what devices they support. There is a table of supported "
+"devices in the kernel that drivers use to attach to a device."
+msgstr ""
+"Драйверы устройств знают, какие устройства они поддерживают. В ядре "
+"существует таблица поддерживаемых устройств, которую драйверы используют для "
+"подключения к устройству."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:59
+#, no-wrap
+msgid "Overview"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:62
+msgid ""
+"PC Cards are identified in one of two ways, both based on the _Card "
+"Information Structure_ (CIS) stored on the card. The first method is to use "
+"numeric manufacturer and product numbers. The second method is to use the "
+"human readable strings that are also contained in the CIS. The PC Card bus "
+"uses a centralized database and some macros to facilitate a design pattern "
+"to help the driver writer match devices to his driver."
+msgstr ""
+"PC Cards идентифицируются одним из двух способов, оба основаны на _Card "
+"Information Structure_ (CIS), хранящейся на карте. Первый метод — "
+"использование числовых идентификаторов производителя и продукта. Второй "
+"метод — использование удобочитаемых строк, также содержащихся в CIS. Шина PC "
+"Card использует централизованную базу данных и некоторые макросы для "
+"упрощения шаблона проектирования, помогающего автору драйвера сопоставлять "
+"устройства с его драйвером."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:64
+msgid ""
+"Original equipment manufacturers (OEMs) often develop a reference design for "
+"a PC Card product, then sell this design to other companies to market. Those "
+"companies refine the design, market the product to their target audience or "
+"geographic area, and put their own name plate onto the card. The refinements "
+"to the physical card are typically very minor, if any changes are made at "
+"all. To strengthen their brand, these vendors place their company name in "
+"the human readable strings in the CIS space, but leave the manufacturer and "
+"product IDs unchanged."
+msgstr ""
+"Производители оригинального оборудования (OEM) часто разрабатывают эталонный "
+"дизайн для продуктов PC Card, а затем продают этот дизайн другим компаниям "
+"для продвижения на рынке. Эти компании дорабатывают дизайн, продвигают "
+"продукт для своей целевой аудитории или географического региона и размещают "
+"на карте свою собственную торговую марку. Доработки физической карты обычно "
+"очень незначительны, если они вообще вносятся. Чтобы усилить свой бренд, "
+"такие поставщики указывают название своей компании в читаемых человеком "
+"строках в пространстве CIS, но оставляют идентификаторы производителя и "
+"продукта без изменений."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:66
+msgid ""
+"Due to this practice, FreeBSD drivers usually rely on numeric IDs for device "
+"identification. Using numeric IDs and a centralized database complicates "
+"adding IDs and support for cards to the system. One must carefully check to "
+"see who really made the card, especially when it appears that the vendor who "
+"made the card might already have a different manufacturer ID listed in the "
+"central database. Linksys, D-Link, and NetGear are a number of US "
+"manufacturers of LAN hardware that often sell the same design. These same "
+"designs can be sold in Japan under names such as Buffalo and Corega. Often, "
+"these devices will all have the same manufacturer and product IDs."
+msgstr ""
+"Из-за такой практики драйверы FreeBSD обычно полагаются на числовые "
+"идентификаторы для распознавания устройств. Использование числовых "
+"идентификаторов и централизованной базы данных усложняет добавление ID и "
+"поддержку карт в систему. Необходимо тщательно проверять, кто на самом деле "
+"произвел карту, особенно когда кажется, что у производителя карты уже может "
+"быть другой идентификатор производителя в центральной базе данных. Linksys, "
+"D-Link и NetGear — это несколько американских производителей сетевого "
+"оборудования, которые часто продают один и тот же дизайн. Эти же дизайны "
+"могут продаваться в Японии под такими названиями, как Buffalo и Corega. "
+"Часто все эти устройства будут иметь одинаковые идентификаторы производителя "
+"и продукта."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:68
+msgid ""
+"The PC Card bus code keeps a central database of card information, but not "
+"which driver is associated with them, in [.filename]#/sys/dev/pccard/"
+"pccarddevs#. It also provides a set of macros that allow one to easily "
+"construct simple entries in the table the driver uses to claim devices."
+msgstr ""
+"Код шины PC Card хранит централизованную базу данных информации о картах, но "
+"не о том, какой драйвер с ними связан, в [.filename]#/sys/dev/pccard/"
+"pccarddevs#. Он также предоставляет набор макросов, которые позволяют легко "
+"создавать простые записи в таблице, используемой драйвером для заявки "
+"устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:70
+msgid ""
+"Finally, some really low end devices do not contain manufacturer "
+"identification at all. These devices must be detected by matching the human "
+"readable CIS strings. While it would be nice if we did not need this method "
+"as a fallback, it is necessary for some very low end CD-ROM players and "
+"Ethernet cards. This method should generally be avoided, but a number of "
+"devices are listed in this section because they were added prior to the "
+"recognition of the OEM nature of the PC Card business. When adding new "
+"devices, prefer using the numeric method."
+msgstr ""
+"Наконец, некоторые устройства очень низкого уровня вообще не содержат "
+"идентификации производителя. Эти устройства должны быть обнаружены путем "
+"сопоставления читаемых человеком строк CIS. Хотя было бы хорошо, если бы нам "
+"не нужен был этот метод в качестве запасного варианта, он необходим для "
+"некоторых очень дешевых CD-плееров и Ethernet-карт. Этот метод, как правило, "
+"следует избегать, но ряд устройств перечислен в этом разделе, потому что они "
+"были добавлены до осознания OEM-характера бизнеса PC Card. При добавлении "
+"новых устройств предпочтительнее использовать числовой метод."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:72
+#, no-wrap
+msgid "Format of [.filename]#pccarddevs#"
+msgstr "Формат файла [.filename]#pccarddevs#"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:75
+msgid ""
+"There are four sections in the [.filename]#pccarddevs# files. The first "
+"section lists the manufacturer numbers for vendors that use them. This "
+"section is sorted in numerical order. The next section has all of the "
+"products that are used by these vendors, along with their product ID numbers "
+"and a description string. The description string typically is not used "
+"(instead we set the device's description based on the human readable CIS, "
+"even if we match on the numeric version). These two sections are then "
+"repeated for devices that use the string matching method. Finally, C-style "
+"comments enclosed in `/*` and `*/` characters are allowed anywhere in the "
+"file."
+msgstr ""
+"В файле [.filename]#pccarddevs# есть четыре раздела. Первый раздел содержит "
+"номера производителей для вендоров, которые их используют. Этот раздел "
+"отсортирован в числовом порядке. Следующий раздел включает все продукты, "
+"используемые этими вендорами, вместе с их идентификаторами продуктов и "
+"строкой описания. Строка описания обычно не используется (вместо этого мы "
+"устанавливаем описание устройства на основе читаемого CIS, даже если "
+"совпадение найдено по числовому идентификатору). Затем эти два раздела "
+"повторяются для устройств, использующих метод строкового сопоставления. "
+"Наконец, C-подобные комментарии, заключенные между символами `/*` и `*/`, "
+"допускаются в любом месте файла."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:77
+msgid ""
+"The first section of the file contains the vendor IDs. Please keep this list "
+"sorted in numeric order. Also, please coordinate changes to this file "
+"because we share it with NetBSD to help facilitate a common clearing house "
+"for this information. For example, here are the first few vendor IDs:"
+msgstr ""
+"Первая часть файла содержит идентификаторы производителей. Пожалуйста, "
+"сохраняйте этот список в числовом порядке. Также, пожалуйста, согласовывайте "
+"изменения в этом файле, так как мы делимся им с NetBSD для создания общего "
+"центра обработки этой информации. Например, вот первые несколько "
+"идентификаторов производителей:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:84
+#, no-wrap
+msgid ""
+"vendor FUJITSU\t\t\t0x0004 Fujitsu Corporation\n"
+"vendor NETGEAR_2\t\t0x000b Netgear\n"
+"vendor PANASONIC\t\t0x0032\tMatsushita Electric Industrial Co.\n"
+"vendor SANDISK\t\t\t0x0045\tSandisk Corporation\n"
+msgstr ""
+"vendor FUJITSU\t\t\t0x0004 Fujitsu Corporation\n"
+"vendor NETGEAR_2\t\t0x000b Netgear\n"
+"vendor PANASONIC\t\t0x0032\tMatsushita Electric Industrial Co.\n"
+"vendor SANDISK\t\t\t0x0045\tSandisk Corporation\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:87
+msgid ""
+"Chances are very good that the `NETGEAR_2` entry is really an OEM that "
+"NETGEAR purchased cards from and the author of support for those cards was "
+"unaware at the time that Netgear was using someone else's ID. These entries "
+"are fairly straightforward. The vendor keyword denotes the kind of line that "
+"this is, followed by the name of the vendor. This name will be repeated "
+"later in [.filename]#pccarddevs#, as well as used in the driver's match "
+"tables, so keep it short and a valid C identifier. A numeric ID in hex "
+"identifies the manufacturer. Do not add IDs of the form `0xffffffff` or "
+"`0xffff` because these are reserved IDs (the former is \"no ID set\" while "
+"the latter is sometimes seen in extremely poor quality cards to try to "
+"indicate \"none\"). Finally there is a string description of the company "
+"that makes the card. This string is not used in FreeBSD for anything but "
+"commentary purposes."
+msgstr ""
+"Вероятно, запись `NETGEAR_2` на самом деле относится к OEM-производителю, у "
+"которого NETGEAR приобретал карты, и автор поддержки этих карт не знал на "
+"тот момент, что Netgear использовал чужой идентификатор. Эти записи довольно "
+"просты. Ключевое слово `vendor` обозначает тип строки, за которым следует "
+"название производителя. Это название будет повторяться позже в "
+"[.filename]#pccarddevs#, а также использоваться в таблицах соответствия "
+"драйверов, поэтому оно должно быть коротким и допустимым идентификатором в "
+"C. Числовой идентификатор в шестнадцатеричном формате указывает "
+"производителя. Не добавляйте идентификаторы вида `0xffffffff` или `0xffff`, "
+"так как они зарезервированы (первый означает \"идентификатор не "
+"установлен\", а второй иногда встречается в крайне некачественных картах для "
+"указания \"отсутствует\"). Наконец, следует строковое описание компании, "
+"производящей карту. Эта строка в FreeBSD ни для чего не используется, кроме "
+"как в комментариях."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:89
+msgid ""
+"The second section of the file contains the products. As shown in this "
+"example, the format is similar to the vendor lines:"
+msgstr ""
+"Вторая секция файла содержит продукты. Как показано в этом примере, формат "
+"аналогичен строкам поставщиков:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:94
+#, no-wrap
+msgid ""
+"/* Allied Telesis K.K. */\n"
+"product ALLIEDTELESIS LA_PCM\t0x0002 Allied Telesis LA-PCM\n"
+msgstr ""
+"/* Allied Telesis K.K. */\n"
+"product ALLIEDTELESIS LA_PCM\t0x0002 Allied Telesis LA-PCM\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:97
+#, no-wrap
+msgid ""
+"/* Archos */\n"
+"product\tARCHOS ARC_ATAPI\t0x0043 MiniCD\n"
+msgstr ""
+"/* Archos */\n"
+"product\tARCHOS ARC_ATAPI\t0x0043 MiniCD\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:100
+msgid ""
+"The `product` keyword is followed by the vendor name, repeated from above. "
+"This is followed by the product name, which is used by the driver and should "
+"be a valid C identifier, but may also start with a number. As with the "
+"vendors, the hex product ID for this card follows the same convention for "
+"`0xffffffff` and `0xffff`. Finally, there is a string description of the "
+"device itself. This string typically is not used in FreeBSD, since FreeBSD's "
+"pccard bus driver will construct a string from the human readable CIS "
+"entries, but it can be used in the rare cases where this is somehow "
+"insufficient. The products are in alphabetical order by manufacturer, then "
+"numerical order by product ID. They have a C comment before each "
+"manufacturer's entries and there is a blank line between entries."
+msgstr ""
+"Ключевое слово `product` следует за именем производителя, повторяющимся "
+"сверху. После него идет название продукта, которое используется драйвером и "
+"должно быть допустимым идентификатором в C, но также может начинаться с "
+"цифры. Как и в случае с производителями, шестнадцатеричный идентификатор "
+"продукта для этой карты следует тем же соглашениям для `0xffffffff` и "
+"`0xffff`. Наконец, идет строковое описание самого устройства. Эта строка "
+"обычно не используется в FreeBSD, поскольку драйвер шины pccard в FreeBSD "
+"формирует строку из читаемых человеком записей CIS, но она может быть "
+"использована в редких случаях, когда этого недостаточно. Продукты "
+"перечислены в алфавитном порядке по производителю, затем в числовом порядке "
+"по идентификатору продукта. Перед записями каждого производителя есть "
+"комментарий в C, а между записями — пустая строка."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:102
+msgid ""
+"The third section is like the previous vendor section, but with all of the "
+"manufacturer numeric IDs set to `-1`, meaning \"match anything found\" in "
+"the FreeBSD pccard bus code. Since these are C identifiers, their names must "
+"be unique. Otherwise the format is identical to the first section of the "
+"file."
+msgstr ""
+"Третий раздел аналогичен предыдущему разделу производителей, но все числовые "
+"идентификаторы производителей установлены в `-1`, что означает \"совпадение "
+"с любым найденным\" в коде шины pccard FreeBSD. Поскольку это идентификаторы "
+"C, их имена должны быть уникальными. В остальном формат идентичен первому "
+"разделу файла."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:104
+msgid ""
+"The final section contains the entries for those cards that must be "
+"identified by string entries. This section's format is a little different "
+"from the generic section:"
+msgstr ""
+"Последний раздел содержит записи для тех карт, которые должны быть "
+"идентифицированы по строковым значениям. Формат этого раздела немного "
+"отличается от общего раздела:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:109
+#, no-wrap
+msgid ""
+"product ADDTRON AWP100\t\t{ \"Addtron\", \"AWP-100&spWireless&spPCMCIA\", \"Version&sp01.02\", NULL }\n"
+"product ALLIEDTELESIS WR211PCM\t{ \"Allied&spTelesis&spK.K.\", \"WR211PCM\", NULL, NULL } Allied Telesis WR211PCM\n"
+msgstr ""
+"product ADDTRON AWP100\t\t{ \"Addtron\", \"AWP-100&spWireless&spPCMCIA\", \"Version&sp01.02\", NULL }\n"
+"product ALLIEDTELESIS WR211PCM\t{ \"Allied&spTelesis&spK.K.\", \"WR211PCM\", NULL, NULL } Allied Telesis WR211PCM\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:112
+msgid ""
+"The familiar `product` keyword is followed by the vendor name and the card "
+"name, just as in the second section of the file. Here the format deviates "
+"from that used earlier. There is a {} grouping, followed by a number of "
+"strings. These strings correspond to the vendor, product, and extra "
+"information that is defined in a CIS_INFO tuple. These strings are filtered "
+"by the program that generates [.filename]#pccarddevs.h# to replace &sp with "
+"a real space. NULL strings mean that the corresponding part of the entry "
+"should be ignored. The example shown here contains a bad entry. It should "
+"not contain the version number unless that is critical for the operation of "
+"the card. Sometimes vendors will have many different versions of the card in "
+"the field that all work, in which case that information only makes it harder "
+"for someone with a similar card to use it with FreeBSD. Sometimes it is "
+"necessary when a vendor wishes to sell many different parts under the same "
+"brand due to market considerations (availability, price, and so forth). Then "
+"it can be critical to disambiguating the card in those rare cases where the "
+"vendor kept the same manufacturer/product pair. Regular expression matching "
+"is not available at this time."
+msgstr ""
+"Знакомое ключевое слово `product` сопровождается названием производителя и "
+"именем карты, как и во втором разделе файла. Здесь формат отличается от "
+"использованного ранее. Идёт группировка {}, за которой следует несколько "
+"строк. Эти строки соответствуют производителю, продукту и дополнительной "
+"информации, определённой в кортеже CIS_INFO. Эти строки фильтруются "
+"программой, которая генерирует [.filename]#pccarddevs.h#, чтобы заменить &sp "
+"на реальный пробел. Строки NULL означают, что соответствующую часть записи "
+"следует игнорировать. В приведённом здесь примере есть некорректная запись. "
+"Она не должна содержать номер версии, если только он не критичен для работы "
+"карты. Иногда у производителей может быть множество различных версий карты в "
+"обращении, которые все работают, и в таком случае эта информация только "
+"затрудняет использование аналогичной карты с FreeBSD. Иногда это необходимо, "
+"когда производитель хочет продавать множество различных компонентов под "
+"одним брендом из-за рыночных соображений (доступность, цена и т. д.). Тогда "
+"это может быть критично для различения карты в тех редких случаях, когда "
+"производитель сохранил ту же пару производитель/продукт. На данный момент "
+"использование регулярных выражений для сопоставления недоступно."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:114
+#, no-wrap
+msgid "Sample Probe Routine"
+msgstr "Пример процедуры обнаружения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:117
+msgid ""
+"To understand how to add a device to the list of supported devices, one must "
+"understand the probe and/or match routines that many drivers have. It is "
+"complicated a little in FreeBSD 5.x because there is a compatibility layer "
+"for OLDCARD present as well. Since only the window-dressing is different, an "
+"idealized version will be presented here."
+msgstr ""
+"Чтобы понять, как добавить устройство в список поддерживаемых, необходимо "
+"разобраться в процедурах `probe` (обнаружение) и/или `match` "
+"(сопоставление), которые есть во многих драйверах. В FreeBSD 5.x это немного "
+"сложнее из-за наличия слоя совместимости с OLDCARD. Поскольку различия лишь "
+"косметические, здесь будет представлена идеализированная версия."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:127
+#, no-wrap
+msgid ""
+"static const struct pccard_product wi_pccard_products[] = {\n"
+"\tPCMCIA_CARD(3COM, 3CRWE737A, 0),\n"
+"\tPCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),\n"
+"\tPCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),\n"
+"\tPCMCIA_CARD(TDK, LAK_CD011WL, 0),\n"
+"\t{ NULL }\n"
+"};\n"
+msgstr ""
+"static const struct pccard_product wi_pccard_products[] = {\n"
+"\tPCMCIA_CARD(3COM, 3CRWE737A, 0),\n"
+"\tPCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),\n"
+"\tPCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),\n"
+"\tPCMCIA_CARD(TDK, LAK_CD011WL, 0),\n"
+"\t{ NULL }\n"
+"};\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:133
+#, no-wrap
+msgid ""
+"static int\n"
+"wi_pccard_probe(dev)\n"
+"\tdevice_t\tdev;\n"
+"{\n"
+"\tconst struct pccard_product *pp;\n"
+msgstr ""
+"static int\n"
+"wi_pccard_probe(dev)\n"
+"\tdevice_t\tdev;\n"
+"{\n"
+"\tconst struct pccard_product *pp;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:142
+#, no-wrap
+msgid ""
+"\tif ((pp = pccard_product_lookup(dev, wi_pccard_products,\n"
+"\t sizeof(wi_pccard_products[0]), NULL)) != NULL) {\n"
+"\t\tif (pp->pp_name != NULL)\n"
+"\t\t\tdevice_set_desc(dev, pp->pp_name);\n"
+"\t\treturn (0);\n"
+"\t}\n"
+"\treturn (ENXIO);\n"
+"}\n"
+msgstr ""
+"\tif ((pp = pccard_product_lookup(dev, wi_pccard_products,\n"
+"\t sizeof(wi_pccard_products[0]), NULL)) != NULL) {\n"
+"\t\tif (pp->pp_name != NULL)\n"
+"\t\t\tdevice_set_desc(dev, pp->pp_name);\n"
+"\t\treturn (0);\n"
+"\t}\n"
+"\treturn (ENXIO);\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:145
+msgid ""
+"Here we have a simple pccard probe routine that matches a few devices. As "
+"stated above, the name may vary (if it is not `foo_pccard_probe()` it will "
+"be `foo_pccard_match()`). The function `pccard_product_lookup()` is a "
+"generalized function that walks the table and returns a pointer to the first "
+"entry that it matches. Some drivers may use this mechanism to convey "
+"additional information about some cards to the rest of the driver, so there "
+"may be some variance in the table. The only requirement is that each row of "
+"the table must have a `struct pccard_product` as the first element."
+msgstr ""
+"Вот простая процедура проверки pccard, которая соответствует нескольким "
+"устройствам. Как упоминалось выше, название может отличаться (если это не "
+"`foo_pccard_probe()`, то это будет `foo_pccard_match()`). Функция "
+"`pccard_product_lookup()` является обобщенной функцией, которая проходит по "
+"таблице и возвращает указатель на первую запись, которой соответствует. "
+"Некоторые драйверы могут использовать этот механизм для передачи "
+"дополнительной информации о некоторых картах остальной части драйвера, "
+"поэтому в таблице могут быть вариации. Единственное требование — каждая "
+"строка таблицы должна содержать `struct pccard_product` в качестве первого "
+"элемента."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:147
+msgid ""
+"Looking at the table `wi_pccard_products`, one notices that all the entries "
+"are of the form `PCMCIA_CARD(_foo_, _bar_, _baz_)`. The _foo_ part is the "
+"manufacturer ID from [.filename]#pccarddevs#. The _bar_ part is the product "
+"ID. _baz_ is the expected function number for this card. Many pccards can "
+"have multiple functions, and some way to disambiguate function 1 from "
+"function 0 is needed. You may see `PCMCIA_CARD_D`, which includes the device "
+"description from [.filename]#pccarddevs#. You may also see `PCMCIA_CARD2` "
+"and `PCMCIA_CARD2_D` which are used when you need to match both CIS strings "
+"and manufacturer numbers, in the \"use the default description\" and \"take "
+"the description from pccarddevs\" flavors."
+msgstr ""
+"Рассматривая таблицу `wi_pccard_products`, можно заметить, что все записи "
+"имеют вид `PCMCIA_CARD(_foo_, _bar_, _baz_)`. Часть _foo_ — это "
+"идентификатор производителя из [.filename]#pccarddevs#. Часть _bar_ — это "
+"идентификатор продукта. _baz_ — ожидаемый номер функции для этой карты. "
+"Многие pccard-устройства могут иметь несколько функций, поэтому требуется "
+"способ различать функцию 1 и функцию 0. Вы можете встретить `PCMCIA_CARD_D`, "
+"который включает описание устройства из [.filename]#pccarddevs#. Также могут "
+"встречаться `PCMCIA_CARD2` и `PCMCIA_CARD2_D`, которые используются, когда "
+"необходимо сопоставить как строки CIS, так и номера производителей, в "
+"вариантах «использовать описание по умолчанию» и «взять описание из "
+"pccarddevs»."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:149
+#, no-wrap
+msgid "Putting it All Together"
+msgstr "Собираем все вместе"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:152
+msgid ""
+"To add a new device, one must first obtain the identification information "
+"from the device. The easiest way to do this is to insert the device into a "
+"PC Card or CF slot and issue `devinfo -v`. Sample output:"
+msgstr ""
+"Для добавления нового устройства необходимо сначала получить "
+"идентификационную информацию от устройства. Проще всего это сделать, вставив "
+"устройство в слот PC Card или CF и выполнив команду `devinfo -v`. Пример "
+"вывода:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:159
+#, no-wrap
+msgid ""
+" cbb1 pnpinfo vendor=0x104c device=0xac51 subvendor=0x1265 subdevice=0x0300 class=0x060700 at slot=10 function=1\n"
+" cardbus1\n"
+" pccard1\n"
+" unknown pnpinfo manufacturer=0x026f product=0x030c cisvendor=\"BUFFALO\" cisproduct=\"WLI2-CF-S11\" function_type=6 at function=0\n"
+msgstr ""
+" cbb1 pnpinfo vendor=0x104c device=0xac51 subvendor=0x1265 subdevice=0x0300 class=0x060700 at slot=10 function=1\n"
+" cardbus1\n"
+" pccard1\n"
+" unknown pnpinfo manufacturer=0x026f product=0x030c cisvendor=\"BUFFALO\" cisproduct=\"WLI2-CF-S11\" function_type=6 at function=0\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:162
+msgid ""
+"`manufacturer` and `product` are the numeric IDs for this product, while "
+"`cisvendor` and `cisproduct` are the product description strings from the "
+"CIS."
+msgstr ""
+"`manufacturer` и `product` являются числовыми идентификаторами данного "
+"продукта, в то время как `cisvendor` и `cisproduct` представляют собой "
+"строки описания продукта из CIS."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:164
+msgid ""
+"Since we first want to prefer the numeric option, first try to construct an "
+"entry based on that. The above card has been slightly fictionalized for the "
+"purpose of this example. The vendor is BUFFALO, which we see already has an "
+"entry:"
+msgstr ""
+"Поскольку мы сначала хотим предпочесть числовой вариант, попробуем сначала "
+"создать запись на его основе. Приведённая выше карта была слегка изменена "
+"для целей данного примера. Производитель — BUFFALO, у которого, как мы "
+"видим, уже есть запись:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:168
+#, no-wrap
+msgid "vendor BUFFALO\t\t\t0x026f\tBUFFALO (Melco Corporation)\n"
+msgstr "vendor BUFFALO\t\t\t0x026f\tBUFFALO (Melco Corporation)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:171
+msgid "But there is no entry for this particular card. Instead we find:"
+msgstr "Но нет записи для этой конкретной карты. Вместо этого мы видим:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:179
+#, no-wrap
+msgid ""
+"/* BUFFALO */\n"
+"product BUFFALO WLI_PCM_S11\t0x0305\tBUFFALO AirStation 11Mbps WLAN\n"
+"product BUFFALO LPC_CF_CLT\t0x0307\tBUFFALO LPC-CF-CLT\n"
+"product\tBUFFALO\tLPC3_CLT\t0x030a\tBUFFALO LPC3-CLT Ethernet Adapter\n"
+"product BUFFALO WLI_CF_S11G\t0x030b\tBUFFALO AirStation 11Mbps CF WLAN\n"
+msgstr ""
+"/* BUFFALO */\n"
+"product BUFFALO WLI_PCM_S11\t0x0305\tBUFFALO AirStation 11Mbps WLAN\n"
+"product BUFFALO LPC_CF_CLT\t0x0307\tBUFFALO LPC-CF-CLT\n"
+"product\tBUFFALO\tLPC3_CLT\t0x030a\tBUFFALO LPC3-CLT Ethernet Adapter\n"
+"product BUFFALO WLI_CF_S11G\t0x030b\tBUFFALO AirStation 11Mbps CF WLAN\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:182
+msgid ""
+"To add the device, we can just add this entry to [.filename]#pccarddevs#:"
+msgstr ""
+"Чтобы добавить устройство, мы можем просто добавить эту запись в "
+"[.filename]#pccarddevs#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:186
+#, no-wrap
+msgid "product BUFFALO WLI2_CF_S11G\t0x030c\tBUFFALO AirStation ultra 802.11b CF\n"
+msgstr "product BUFFALO WLI2_CF_S11G\t0x030c\tBUFFALO AirStation ultra 802.11b CF\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:189
+msgid ""
+"Once these steps are complete, the card can be added to the driver. That is "
+"a simple operation of adding one line:"
+msgstr ""
+"После выполнения этих шагов карту можно добавить в драйвер. Это простая "
+"операция добавления одной строки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:200
+#, no-wrap
+msgid ""
+"static const struct pccard_product wi_pccard_products[] = {\n"
+"\tPCMCIA_CARD(3COM, 3CRWE737A, 0),\n"
+"\tPCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),\n"
+"\tPCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),\n"
+"+\tPCMCIA_CARD(BUFFALO, WLI_CF2_S11G, 0),\n"
+"\tPCMCIA_CARD(TDK, LAK_CD011WL, 0),\n"
+"\t{ NULL }\n"
+"};\n"
+msgstr ""
+"static const struct pccard_product wi_pccard_products[] = {\n"
+"\tPCMCIA_CARD(3COM, 3CRWE737A, 0),\n"
+"\tPCMCIA_CARD(BUFFALO, WLI_PCM_S11, 0),\n"
+"\tPCMCIA_CARD(BUFFALO, WLI_CF_S11G, 0),\n"
+"+\tPCMCIA_CARD(BUFFALO, WLI_CF2_S11G, 0),\n"
+"\tPCMCIA_CARD(TDK, LAK_CD011WL, 0),\n"
+"\t{ NULL }\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:203
+msgid ""
+"Note that I have included a '`+`' in the line before the line that I added, "
+"but that is simply to highlight the line. Do not add it to the actual "
+"driver. Once you have added the line, you can recompile your kernel or "
+"module and test it. If the device is recognized and works, please submit a "
+"patch. If it does not work, please figure out what is needed to make it work "
+"and submit a patch. If the device is not recognized at all, you have done "
+"something wrong and should recheck each step."
+msgstr ""
+"Обратите внимание, что я добавил символ '`+`' перед строкой, которую "
+"добавил, но это только для выделения строки. Не добавляйте его в реальный "
+"драйвер. После добавления строки вы можете пересобрать ядро или модуль и "
+"протестировать его. Если устройство распознано и работает, отправьте патч. "
+"Если оно не работает, определите, что необходимо для его работы, и отправьте "
+"патч. Если устройство не распознаётся вообще, вы где-то ошиблись и следует "
+"перепроверить каждый шаг."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:205
+msgid ""
+"If you are a FreeBSD src committer, and everything appears to be working, "
+"then you can commit the changes to the tree. However, there are some minor "
+"tricky things to be considered. [.filename]#pccarddevs# must be committed to "
+"the tree first. Then [.filename]#pccarddevs.h# must be regenerated and "
+"committed as a second step, ensuring that the right $FreeBSD$ tag is in the "
+"latter file. Finally, commit the additions to the driver."
+msgstr ""
+"Если вы коммиттер исходного кода FreeBSD, и всё работает корректно, то "
+"можете закоммитить изменения в дерево. Однако есть несколько небольших "
+"нюансов, которые следует учесть. [.filename]#pccarddevs# должен быть "
+"закоммичен в дерево первым. Затем [.filename]#pccarddevs.h# необходимо "
+"перегенерировать и закоммитить вторым шагом, убедившись, что правильный тег "
+"$FreeBSD$ присутствует в последнем файле. В конце закоммитьте добавления в "
+"драйвер."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:207
+#, no-wrap
+msgid "Submitting a New Device"
+msgstr "Отправка кода для нового устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pccard/_index.adoc:209
+msgid ""
+"Please do not send entries for new devices to the author directly. Instead, "
+"submit them as a PR and send the author the PR number for his records. This "
+"ensures that entries are not lost. When submitting a PR, it is unnecessary "
+"to include the [.filename]#pccardevs.h# diffs in the patch, since those will "
+"be regenerated. It is necessary to include a description of the device, as "
+"well as the patches to the client driver. If you do not know the name, use "
+"OEM99 as the name, and the author will adjust OEM99 accordingly after "
+"investigation. Committers should not commit OEM99, but instead find the "
+"highest OEM entry and commit one more than that."
+msgstr ""
+"Пожалуйста, не отправляйте записи о новых устройствах автору напрямую. "
+"Вместо этого оформите их как PR и сообщите автору номер PR для учета. Это "
+"гарантирует, что записи не будут потеряны. При отправке PR нет необходимости "
+"включать в патч diff-файлы [.filename]#pccardevs.h#, так как они будут "
+"перегенерированы. Однако необходимо включить описание устройства, а также "
+"патчи для клиентского драйвера. Если название устройства неизвестно, "
+"используйте имя OEM99, и автор скорректирует OEM99 после изучения. "
+"Коммиттеры не должны коммитить OEM99, а вместо этого найти наибольший OEM-"
+"номер и закоммитить на единицу больше."
diff --git a/documentation/content/ru/books/arch-handbook/pci/_index.adoc b/documentation/content/ru/books/arch-handbook/pci/_index.adoc
new file mode 100644
index 0000000000..cf9dffb85e
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/pci/_index.adoc
@@ -0,0 +1,424 @@
+---
+description: 'Устройства PCI'
+next: books/arch-handbook/scsi
+params:
+ path: /books/arch-handbook/pci/
+prev: books/arch-handbook/isa
+showBookMenu: true
+tags: ["PCI", "Devices", "example", "guide"]
+title: 'Глава 11. Устройства PCI'
+weight: 13
+---
+
+[[pci]]
+= Устройства PCI
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 11
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Эта глава расскажет о механизмах FreeBSD для написания драйвера устройства на шине PCI.
+
+[[pci-probe]]
+== Обнаружение и подключение
+
+Информация о том, как код шины PCI перебирает неприсоединённые устройства и проверяет, сможет ли только что загруженный kld присоединиться к любому из них.
+
+=== Пример исходного кода драйвера ([.filename]#mypci.c#)
+
+[.programlisting]
+....
+/*
+ * Simple KLD to play with the PCI functions.
+ *
+ * Murray Stokely
+ */
+
+#include <sys/param.h> /* defines used in kernel.h */
+#include <sys/module.h>
+#include <sys/systm.h>
+#include <sys/errno.h>
+#include <sys/kernel.h> /* types used in module initialization */
+#include <sys/conf.h> /* cdevsw struct */
+#include <sys/uio.h> /* uio struct */
+#include <sys/malloc.h>
+#include <sys/bus.h> /* structs, prototypes for pci bus stuff and DEVMETHOD macros! */
+
+#include <machine/bus.h>
+#include <sys/rman.h>
+#include <machine/resource.h>
+
+#include <dev/pci/pcivar.h> /* For pci_get macros! */
+#include <dev/pci/pcireg.h>
+
+/* The softc holds our per-instance data. */
+struct mypci_softc {
+ device_t my_dev;
+ struct cdev *my_cdev;
+};
+
+/* Function prototypes */
+static d_open_t mypci_open;
+static d_close_t mypci_close;
+static d_read_t mypci_read;
+static d_write_t mypci_write;
+
+/* Character device entry points */
+
+static struct cdevsw mypci_cdevsw = {
+ .d_version = D_VERSION,
+ .d_open = mypci_open,
+ .d_close = mypci_close,
+ .d_read = mypci_read,
+ .d_write = mypci_write,
+ .d_name = "mypci",
+};
+
+/*
+ * In the cdevsw routines, we find our softc by using the si_drv1 member
+ * of struct cdev. We set this variable to point to our softc in our
+ * attach routine when we create the /dev entry.
+ */
+
+int
+mypci_open(struct cdev *dev, int oflags, int devtype, struct thread *td)
+{
+ struct mypci_softc *sc;
+
+ /* Look up our softc. */
+ sc = dev->si_drv1;
+ device_printf(sc->my_dev, "Opened successfully.\n");
+ return (0);
+}
+
+int
+mypci_close(struct cdev *dev, int fflag, int devtype, struct thread *td)
+{
+ struct mypci_softc *sc;
+
+ /* Look up our softc. */
+ sc = dev->si_drv1;
+ device_printf(sc->my_dev, "Closed.\n");
+ return (0);
+}
+
+int
+mypci_read(struct cdev *dev, struct uio *uio, int ioflag)
+{
+ struct mypci_softc *sc;
+
+ /* Look up our softc. */
+ sc = dev->si_drv1;
+ device_printf(sc->my_dev, "Asked to read %zd bytes.\n", uio->uio_resid);
+ return (0);
+}
+
+int
+mypci_write(struct cdev *dev, struct uio *uio, int ioflag)
+{
+ struct mypci_softc *sc;
+
+ /* Look up our softc. */
+ sc = dev->si_drv1;
+ device_printf(sc->my_dev, "Asked to write %zd bytes.\n", uio->uio_resid);
+ return (0);
+}
+
+/* PCI Support Functions */
+
+/*
+ * Compare the device ID of this device against the IDs that this driver
+ * supports. If there is a match, set the description and return success.
+ */
+static int
+mypci_probe(device_t dev)
+{
+
+ device_printf(dev, "MyPCI Probe\nVendor ID : 0x%x\nDevice ID : 0x%x\n",
+ pci_get_vendor(dev), pci_get_device(dev));
+
+ if (pci_get_vendor(dev) == 0x11c1) {
+ printf("We've got the Winmodem, probe successful!\n");
+ device_set_desc(dev, "WinModem");
+ return (BUS_PROBE_DEFAULT);
+ }
+ return (ENXIO);
+}
+
+/* Attach function is only called if the probe is successful. */
+
+static int
+mypci_attach(device_t dev)
+{
+ struct mypci_softc *sc;
+
+ printf("MyPCI Attach for : deviceID : 0x%x\n", pci_get_devid(dev));
+
+ /* Look up our softc and initialize its fields. */
+ sc = device_get_softc(dev);
+ sc->my_dev = dev;
+
+ /*
+ * Create a /dev entry for this device. The kernel will assign us
+ * a major number automatically. We use the unit number of this
+ * device as the minor number and name the character device
+ * "mypci<unit>".
+ */
+ sc->my_cdev = make_dev(&mypci_cdevsw, device_get_unit(dev),
+ UID_ROOT, GID_WHEEL, 0600, "mypci%u", device_get_unit(dev));
+ sc->my_cdev->si_drv1 = sc;
+ printf("Mypci device loaded.\n");
+ return (0);
+}
+
+/* Detach device. */
+
+static int
+mypci_detach(device_t dev)
+{
+ struct mypci_softc *sc;
+
+ /* Teardown the state in our softc created in our attach routine. */
+ sc = device_get_softc(dev);
+ destroy_dev(sc->my_cdev);
+ printf("Mypci detach!\n");
+ return (0);
+}
+
+/* Called during system shutdown after sync. */
+
+static int
+mypci_shutdown(device_t dev)
+{
+
+ printf("Mypci shutdown!\n");
+ return (0);
+}
+
+/*
+ * Device suspend routine.
+ */
+static int
+mypci_suspend(device_t dev)
+{
+
+ printf("Mypci suspend!\n");
+ return (0);
+}
+
+/*
+ * Device resume routine.
+ */
+static int
+mypci_resume(device_t dev)
+{
+
+ printf("Mypci resume!\n");
+ return (0);
+}
+
+static device_method_t mypci_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, mypci_probe),
+ DEVMETHOD(device_attach, mypci_attach),
+ DEVMETHOD(device_detach, mypci_detach),
+ DEVMETHOD(device_shutdown, mypci_shutdown),
+ DEVMETHOD(device_suspend, mypci_suspend),
+ DEVMETHOD(device_resume, mypci_resume),
+
+ DEVMETHOD_END
+};
+
+static devclass_t mypci_devclass;
+
+DEFINE_CLASS_0(mypci, mypci_driver, mypci_methods, sizeof(struct mypci_softc));
+DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);
+....
+
+=== [.filename]#Makefile# для примера драйвера
+
+[.programlisting]
+....
+# Makefile for mypci driver
+
+KMOD= mypci
+SRCS= mypci.c
+SRCS+= device_if.h bus_if.h pci_if.h
+
+.include <bsd.kmod.mk>
+....
+
+Если вы поместите исходный файл выше и [.filename]#Makefile# в каталог, вы можете запустить `make` для компиляции примера драйвера. Дополнительно можно выполнить `make load` для загрузки драйвера в текущее ядро и `make unload` для выгрузки драйвера после его загрузки.
+
+=== Дополнительные ресурсы
+
+* http://www.pcisig.org/[Группа по стандартам PCI]
+* PCI System Architecture, Fourth Edition by Tom Shanley, et al.
+
+[[pci-bus]]
+== Ресурсы шины
+
+FreeBSD предоставляет объектно-ориентированный механизм для запроса ресурсов от родительской шины. Почти все устройства будут дочерними элементами какого-либо типа шины (PCI, ISA, USB, SCSI и т.д.), и этим устройствам необходимо получать ресурсы от своей родительской шины (такие как сегменты памяти, линии прерываний или каналы DMA).
+
+=== Регистры базовых адресов
+
+Для выполнения каких-либо полезных действий с устройством PCI необходимо получить _регистры базовых адресов_ (BAR) из конфигурационного пространства PCI. Специфичные для PCI детали получения BAR абстрагированы в функции `bus_alloc_resource()`.
+
+Например, типичный драйвер может содержать что-то подобное в функции `attach()`:
+
+[.programlisting]
+....
+ sc->bar0id = PCIR_BAR(0);
+ sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar0id,
+ 0, ~0, 1, RF_ACTIVE);
+ if (sc->bar0res == NULL) {
+ printf("Memory allocation of PCI base register 0 failed!\n");
+ error = ENXIO;
+ goto fail1;
+ }
+
+ sc->bar1id = PCIR_BAR(1);
+ sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar1id,
+ 0, ~0, 1, RF_ACTIVE);
+ if (sc->bar1res == NULL) {
+ printf("Memory allocation of PCI base register 1 failed!\n");
+ error = ENXIO;
+ goto fail2;
+ }
+ sc->bar0_bt = rman_get_bustag(sc->bar0res);
+ sc->bar0_bh = rman_get_bushandle(sc->bar0res);
+ sc->bar1_bt = rman_get_bustag(sc->bar1res);
+ sc->bar1_bh = rman_get_bushandle(sc->bar1res);
+....
+
+Дескрипторы для каждого регистра базовых адресов хранятся в структуре `softc`, чтобы их можно было использовать для записи на устройство в дальнейшем.
+
+Эти дескрипторы затем могут быть использованы для чтения или записи из регистров устройства с помощью функций `bus_space_*`. Например, драйвер может содержать сокращённую функцию для чтения из специфичного для платы регистра, как показано ниже:
+
+[.programlisting]
+....
+uint16_t
+board_read(struct ni_softc *sc, uint16_t address)
+{
+ return bus_space_read_2(sc->bar1_bt, sc->bar1_bh, address);
+}
+....
+
+Аналогично, можно записать в регистры с помощью:
+
+[.programlisting]
+....
+void
+board_write(struct ni_softc *sc, uint16_t address, uint16_t value)
+{
+ bus_space_write_2(sc->bar1_bt, sc->bar1_bh, address, value);
+}
+....
+
+Эти функции существуют в 8-битных, 16-битных и 32-битных версиях, и вам следует использовать `bus_space_{read|write}_{1|2|4}` соответственно.
+
+[NOTE]
+====
+В FreeBSD 7.0 и более поздних версиях вы можете использовать функции `bus_*` вместо `bus_space_*`. Функции `bus_*` принимают указатель на структуру resource * вместо тега шины и дескриптора. Таким образом, вы можете удалить тег шины и дескриптор шины из `softc` и переписать функцию `board_read()` как:
+
+[.programlisting]
+....
+uint16_t
+board_read(struct ni_softc *sc, uint16_t address)
+{
+ return (bus_read(sc->bar1res, address));
+}
+....
+
+====
+
+=== Прерывания
+
+Прерывания выделяются объектно-ориентированным кодом шины аналогично ресурсам памяти. Сначала ресурс IRQ должен быть выделен из родительской шины, а затем должен быть настроен обработчик прерывания для работы с этим IRQ.
+
+Вот пример из функции `attach()` устройства, который скажет больше, чем слова.
+
+[.programlisting]
+....
+/* Get the IRQ resource */
+
+ sc->irqid = 0x0;
+ sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &(sc->irqid),
+ 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE);
+ if (sc->irqres == NULL) {
+ printf("IRQ allocation failed!\n");
+ error = ENXIO;
+ goto fail3;
+ }
+
+ /* Now we should set up the interrupt handler */
+
+ error = bus_setup_intr(dev, sc->irqres, INTR_TYPE_MISC,
+ my_handler, sc, &(sc->handler));
+ if (error) {
+ printf("Couldn't set up irq\n");
+ goto fail4;
+ }
+....
+
+Некоторые меры предосторожности должны быть приняты в процедуре отключения драйвера. Необходимо остановить поток прерываний устройства и удалить обработчик прерываний. Как только `bus_teardown_intr()` завершится, можно быть уверенным, что обработчик прерываний больше не будет вызываться и все потоки, которые могли выполнять этот обработчик, завершили работу. Поскольку эта функция может засыпать, нельзя удерживать какие-либо мьютексы при её вызове.
+
+=== DMA
+
+Этот раздел устарел и приведён только в исторических целях. Правильный способ решения этих проблем — использование функций `bus_space_dma*()`. Этот абзац можно удалить, когда раздел будет обновлён с учётом данного подхода. Однако на данный момент API находится в состоянии изменения, поэтому, когда он стабилизируется, будет полезно обновить этот раздел соответствующим образом.
+
+На ПК периферийные устройства, которые хотят использовать DMA с управлением шиной, должны работать с физическими адресами. Это проблема, поскольку FreeBSD использует виртуальную память и работает почти исключительно с виртуальными адресами. К счастью, существует функция `vtophys()`, которая поможет.
+
+[.programlisting]
+....
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#define vtophys(virtual_address) (...)
+....
+
+Однако решение немного отличается на alpha, и на самом деле нам нужна функция под названием `vtobus()`.
+
+[.programlisting]
+....
+#if defined(__alpha__)
+#define vtobus(va) alpha_XXX_dmamap((vm_offset_t)va)
+#else
+#define vtobus(va) vtophys(va)
+#endif
+....
+
+=== Освобождение ресурсов
+
+Очень важно освободить все ресурсы, которые были выделены во время `attach()`. Необходимо внимательно следить за освобождением правильных ресурсов даже в случае ошибки, чтобы система оставалась работоспособной при завершении работы вашего драйвера.
diff --git a/documentation/content/ru/books/arch-handbook/pci/_index.po b/documentation/content/ru/books/arch-handbook/pci/_index.po
new file mode 100644
index 0000000000..9c03c178dd
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/pci/_index.po
@@ -0,0 +1,1071 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-07-03 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookpci_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:14
+#, no-wrap
+msgid "PCI Devices"
+msgstr "Устройства PCI"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:1
+#, no-wrap
+msgid "Chapter 11. PCI Devices"
+msgstr "Глава 11. Устройства PCI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:52
+msgid ""
+"This chapter will talk about the FreeBSD mechanisms for writing a device "
+"driver for a device on a PCI bus."
+msgstr ""
+"Эта глава расскажет о механизмах FreeBSD для написания драйвера устройства "
+"на шине PCI."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:54
+#, no-wrap
+msgid "Probe and Attach"
+msgstr "Обнаружение и подключение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:57
+msgid ""
+"Information here about how the PCI bus code iterates through the unattached "
+"devices and see if a newly loaded kld will attach to any of them."
+msgstr ""
+"Информация о том, как код шины PCI перебирает неприсоединённые устройства и "
+"проверяет, сможет ли только что загруженный kld присоединиться к любому из "
+"них."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:58
+#, no-wrap
+msgid "Sample Driver Source ([.filename]#mypci.c#)"
+msgstr "Пример исходного кода драйвера ([.filename]#mypci.c#)"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:67
+#, no-wrap
+msgid ""
+"/*\n"
+" * Simple KLD to play with the PCI functions.\n"
+" *\n"
+" * Murray Stokely\n"
+" */\n"
+msgstr ""
+"/*\n"
+" * Simple KLD to play with the PCI functions.\n"
+" *\n"
+" * Murray Stokely\n"
+" */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:77
+#, no-wrap
+msgid ""
+"#include <sys/param.h>\t\t/* defines used in kernel.h */\n"
+"#include <sys/module.h>\n"
+"#include <sys/systm.h>\n"
+"#include <sys/errno.h>\n"
+"#include <sys/kernel.h>\t\t/* types used in module initialization */\n"
+"#include <sys/conf.h>\t\t/* cdevsw struct */\n"
+"#include <sys/uio.h>\t\t/* uio struct */\n"
+"#include <sys/malloc.h>\n"
+"#include <sys/bus.h>\t\t/* structs, prototypes for pci bus stuff and DEVMETHOD macros! */\n"
+msgstr ""
+"#include <sys/param.h>\t\t/* defines used in kernel.h */\n"
+"#include <sys/module.h>\n"
+"#include <sys/systm.h>\n"
+"#include <sys/errno.h>\n"
+"#include <sys/kernel.h>\t\t/* types used in module initialization */\n"
+"#include <sys/conf.h>\t\t/* cdevsw struct */\n"
+"#include <sys/uio.h>\t\t/* uio struct */\n"
+"#include <sys/malloc.h>\n"
+"#include <sys/bus.h>\t\t/* structs, prototypes for pci bus stuff and DEVMETHOD macros! */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:81
+#, no-wrap
+msgid ""
+"#include <machine/bus.h>\n"
+"#include <sys/rman.h>\n"
+"#include <machine/resource.h>\n"
+msgstr ""
+"#include <machine/bus.h>\n"
+"#include <sys/rman.h>\n"
+"#include <machine/resource.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:84
+#, no-wrap
+msgid ""
+"#include <dev/pci/pcivar.h>\t/* For pci_get macros! */\n"
+"#include <dev/pci/pcireg.h>\n"
+msgstr ""
+"#include <dev/pci/pcivar.h>\t/* For pci_get macros! */\n"
+"#include <dev/pci/pcireg.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:90
+#, no-wrap
+msgid ""
+"/* The softc holds our per-instance data. */\n"
+"struct mypci_softc {\n"
+"\tdevice_t\tmy_dev;\n"
+"\tstruct cdev\t*my_cdev;\n"
+"};\n"
+msgstr ""
+"/* The softc holds our per-instance data. */\n"
+"struct mypci_softc {\n"
+"\tdevice_t\tmy_dev;\n"
+"\tstruct cdev\t*my_cdev;\n"
+"};\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:96
+#, no-wrap
+msgid ""
+"/* Function prototypes */\n"
+"static d_open_t\t\tmypci_open;\n"
+"static d_close_t\tmypci_close;\n"
+"static d_read_t\t\tmypci_read;\n"
+"static d_write_t\tmypci_write;\n"
+msgstr ""
+"/* Function prototypes */\n"
+"static d_open_t\t\tmypci_open;\n"
+"static d_close_t\tmypci_close;\n"
+"static d_read_t\t\tmypci_read;\n"
+"static d_write_t\tmypci_write;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:98
+#, no-wrap
+msgid "/* Character device entry points */\n"
+msgstr "/* Character device entry points */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:107
+#, no-wrap
+msgid ""
+"static struct cdevsw mypci_cdevsw = {\n"
+"\t.d_version =\tD_VERSION,\n"
+"\t.d_open =\tmypci_open,\n"
+"\t.d_close =\tmypci_close,\n"
+"\t.d_read =\tmypci_read,\n"
+"\t.d_write =\tmypci_write,\n"
+"\t.d_name =\t\"mypci\",\n"
+"};\n"
+msgstr ""
+"static struct cdevsw mypci_cdevsw = {\n"
+"\t.d_version =\tD_VERSION,\n"
+"\t.d_open =\tmypci_open,\n"
+"\t.d_close =\tmypci_close,\n"
+"\t.d_read =\tmypci_read,\n"
+"\t.d_write =\tmypci_write,\n"
+"\t.d_name =\t\"mypci\",\n"
+"};\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:113
+#, no-wrap
+msgid ""
+"/*\n"
+" * In the cdevsw routines, we find our softc by using the si_drv1 member\n"
+" * of struct cdev. We set this variable to point to our softc in our\n"
+" * attach routine when we create the /dev entry.\n"
+" */\n"
+msgstr ""
+"/*\n"
+" * In the cdevsw routines, we find our softc by using the si_drv1 member\n"
+" * of struct cdev. We set this variable to point to our softc in our\n"
+" * attach routine when we create the /dev entry.\n"
+" */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:118
+#, no-wrap
+msgid ""
+"int\n"
+"mypci_open(struct cdev *dev, int oflags, int devtype, struct thread *td)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+msgstr ""
+"int\n"
+"mypci_open(struct cdev *dev, int oflags, int devtype, struct thread *td)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:124
+#, no-wrap
+msgid ""
+"\t/* Look up our softc. */\n"
+"\tsc = dev->si_drv1;\n"
+"\tdevice_printf(sc->my_dev, \"Opened successfully.\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\t/* Look up our softc. */\n"
+"\tsc = dev->si_drv1;\n"
+"\tdevice_printf(sc->my_dev, \"Opened successfully.\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:129
+#, no-wrap
+msgid ""
+"int\n"
+"mypci_close(struct cdev *dev, int fflag, int devtype, struct thread *td)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+msgstr ""
+"int\n"
+"mypci_close(struct cdev *dev, int fflag, int devtype, struct thread *td)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:135
+#, no-wrap
+msgid ""
+"\t/* Look up our softc. */\n"
+"\tsc = dev->si_drv1;\n"
+"\tdevice_printf(sc->my_dev, \"Closed.\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\t/* Look up our softc. */\n"
+"\tsc = dev->si_drv1;\n"
+"\tdevice_printf(sc->my_dev, \"Closed.\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:140
+#, no-wrap
+msgid ""
+"int\n"
+"mypci_read(struct cdev *dev, struct uio *uio, int ioflag)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+msgstr ""
+"int\n"
+"mypci_read(struct cdev *dev, struct uio *uio, int ioflag)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:146
+#, no-wrap
+msgid ""
+"\t/* Look up our softc. */\n"
+"\tsc = dev->si_drv1;\n"
+"\tdevice_printf(sc->my_dev, \"Asked to read %zd bytes.\\n\", uio->uio_resid);\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\t/* Look up our softc. */\n"
+"\tsc = dev->si_drv1;\n"
+"\tdevice_printf(sc->my_dev, \"Asked to read %zd bytes.\\n\", uio->uio_resid);\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:151
+#, no-wrap
+msgid ""
+"int\n"
+"mypci_write(struct cdev *dev, struct uio *uio, int ioflag)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+msgstr ""
+"int\n"
+"mypci_write(struct cdev *dev, struct uio *uio, int ioflag)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:157
+#, no-wrap
+msgid ""
+"\t/* Look up our softc. */\n"
+"\tsc = dev->si_drv1;\n"
+"\tdevice_printf(sc->my_dev, \"Asked to write %zd bytes.\\n\", uio->uio_resid);\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\t/* Look up our softc. */\n"
+"\tsc = dev->si_drv1;\n"
+"\tdevice_printf(sc->my_dev, \"Asked to write %zd bytes.\\n\", uio->uio_resid);\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:159
+#, no-wrap
+msgid "/* PCI Support Functions */\n"
+msgstr "/* PCI Support Functions */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:167
+#, no-wrap
+msgid ""
+"/*\n"
+" * Compare the device ID of this device against the IDs that this driver\n"
+" * supports. If there is a match, set the description and return success.\n"
+" */\n"
+"static int\n"
+"mypci_probe(device_t dev)\n"
+"{\n"
+msgstr ""
+"/*\n"
+" * Compare the device ID of this device against the IDs that this driver\n"
+" * supports. If there is a match, set the description and return success.\n"
+" */\n"
+"static int\n"
+"mypci_probe(device_t dev)\n"
+"{\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:170
+#, no-wrap
+msgid ""
+"\tdevice_printf(dev, \"MyPCI Probe\\nVendor ID : 0x%x\\nDevice ID : 0x%x\\n\",\n"
+"\t pci_get_vendor(dev), pci_get_device(dev));\n"
+msgstr ""
+"\tdevice_printf(dev, \"MyPCI Probe\\nVendor ID : 0x%x\\nDevice ID : 0x%x\\n\",\n"
+"\t pci_get_vendor(dev), pci_get_device(dev));\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:178
+#, no-wrap
+msgid ""
+"\tif (pci_get_vendor(dev) == 0x11c1) {\n"
+"\t\tprintf(\"We've got the Winmodem, probe successful!\\n\");\n"
+"\t\tdevice_set_desc(dev, \"WinModem\");\n"
+"\t\treturn (BUS_PROBE_DEFAULT);\n"
+"\t}\n"
+"\treturn (ENXIO);\n"
+"}\n"
+msgstr ""
+"\tif (pci_get_vendor(dev) == 0x11c1) {\n"
+"\t\tprintf(\"We've got the Winmodem, probe successful!\\n\");\n"
+"\t\tdevice_set_desc(dev, \"WinModem\");\n"
+"\t\treturn (BUS_PROBE_DEFAULT);\n"
+"\t}\n"
+"\treturn (ENXIO);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:180
+#, no-wrap
+msgid "/* Attach function is only called if the probe is successful. */\n"
+msgstr "/* Attach function is only called if the probe is successful. */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:185
+#, no-wrap
+msgid ""
+"static int\n"
+"mypci_attach(device_t dev)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+msgstr ""
+"static int\n"
+"mypci_attach(device_t dev)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:187
+#, no-wrap
+msgid "\tprintf(\"MyPCI Attach for : deviceID : 0x%x\\n\", pci_get_devid(dev));\n"
+msgstr "\tprintf(\"MyPCI Attach for : deviceID : 0x%x\\n\", pci_get_devid(dev));\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:191
+#, no-wrap
+msgid ""
+"\t/* Look up our softc and initialize its fields. */\n"
+"\tsc = device_get_softc(dev);\n"
+"\tsc->my_dev = dev;\n"
+msgstr ""
+"\t/* Look up our softc and initialize its fields. */\n"
+"\tsc = device_get_softc(dev);\n"
+"\tsc->my_dev = dev;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:204
+#, no-wrap
+msgid ""
+"\t/*\n"
+"\t * Create a /dev entry for this device. The kernel will assign us\n"
+"\t * a major number automatically. We use the unit number of this\n"
+"\t * device as the minor number and name the character device\n"
+"\t * \"mypci<unit>\".\n"
+"\t */\n"
+"\tsc->my_cdev = make_dev(&mypci_cdevsw, device_get_unit(dev),\n"
+"\t UID_ROOT, GID_WHEEL, 0600, \"mypci%u\", device_get_unit(dev));\n"
+"\tsc->my_cdev->si_drv1 = sc;\n"
+"\tprintf(\"Mypci device loaded.\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\t/*\n"
+"\t * Create a /dev entry for this device. The kernel will assign us\n"
+"\t * a major number automatically. We use the unit number of this\n"
+"\t * device as the minor number and name the character device\n"
+"\t * \"mypci<unit>\".\n"
+"\t */\n"
+"\tsc->my_cdev = make_dev(&mypci_cdevsw, device_get_unit(dev),\n"
+"\t UID_ROOT, GID_WHEEL, 0600, \"mypci%u\", device_get_unit(dev));\n"
+"\tsc->my_cdev->si_drv1 = sc;\n"
+"\tprintf(\"Mypci device loaded.\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:206
+#, no-wrap
+msgid "/* Detach device. */\n"
+msgstr "/* Detach device. */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:211
+#, no-wrap
+msgid ""
+"static int\n"
+"mypci_detach(device_t dev)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+msgstr ""
+"static int\n"
+"mypci_detach(device_t dev)\n"
+"{\n"
+"\tstruct mypci_softc *sc;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:218
+#, no-wrap
+msgid ""
+"\t/* Teardown the state in our softc created in our attach routine. */\n"
+"\tsc = device_get_softc(dev);\n"
+"\tdestroy_dev(sc->my_cdev);\n"
+"\tprintf(\"Mypci detach!\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\t/* Teardown the state in our softc created in our attach routine. */\n"
+"\tsc = device_get_softc(dev);\n"
+"\tdestroy_dev(sc->my_cdev);\n"
+"\tprintf(\"Mypci detach!\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:220
+#, no-wrap
+msgid "/* Called during system shutdown after sync. */\n"
+msgstr "/* Called during system shutdown after sync. */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:224
+#, no-wrap
+msgid ""
+"static int\n"
+"mypci_shutdown(device_t dev)\n"
+"{\n"
+msgstr ""
+"static int\n"
+"mypci_shutdown(device_t dev)\n"
+"{\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:228
+#, no-wrap
+msgid ""
+"\tprintf(\"Mypci shutdown!\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\tprintf(\"Mypci shutdown!\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:235
+#, no-wrap
+msgid ""
+"/*\n"
+" * Device suspend routine.\n"
+" */\n"
+"static int\n"
+"mypci_suspend(device_t dev)\n"
+"{\n"
+msgstr ""
+"/*\n"
+" * Device suspend routine.\n"
+" */\n"
+"static int\n"
+"mypci_suspend(device_t dev)\n"
+"{\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:239
+#, no-wrap
+msgid ""
+"\tprintf(\"Mypci suspend!\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\tprintf(\"Mypci suspend!\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:246
+#, no-wrap
+msgid ""
+"/*\n"
+" * Device resume routine.\n"
+" */\n"
+"static int\n"
+"mypci_resume(device_t dev)\n"
+"{\n"
+msgstr ""
+"/*\n"
+" * Device resume routine.\n"
+" */\n"
+"static int\n"
+"mypci_resume(device_t dev)\n"
+"{\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:250
+#, no-wrap
+msgid ""
+"\tprintf(\"Mypci resume!\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+msgstr ""
+"\tprintf(\"Mypci resume!\\n\");\n"
+"\treturn (0);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:259
+#, no-wrap
+msgid ""
+"static device_method_t mypci_methods[] = {\n"
+"\t/* Device interface */\n"
+"\tDEVMETHOD(device_probe,\t\tmypci_probe),\n"
+"\tDEVMETHOD(device_attach,\tmypci_attach),\n"
+"\tDEVMETHOD(device_detach,\tmypci_detach),\n"
+"\tDEVMETHOD(device_shutdown,\tmypci_shutdown),\n"
+"\tDEVMETHOD(device_suspend,\tmypci_suspend),\n"
+"\tDEVMETHOD(device_resume,\tmypci_resume),\n"
+msgstr ""
+"static device_method_t mypci_methods[] = {\n"
+"\t/* Device interface */\n"
+"\tDEVMETHOD(device_probe,\t\tmypci_probe),\n"
+"\tDEVMETHOD(device_attach,\tmypci_attach),\n"
+"\tDEVMETHOD(device_detach,\tmypci_detach),\n"
+"\tDEVMETHOD(device_shutdown,\tmypci_shutdown),\n"
+"\tDEVMETHOD(device_suspend,\tmypci_suspend),\n"
+"\tDEVMETHOD(device_resume,\tmypci_resume),\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:262
+#, no-wrap
+msgid ""
+"\tDEVMETHOD_END\n"
+"};\n"
+msgstr ""
+"\tDEVMETHOD_END\n"
+"};\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:264
+#, no-wrap
+msgid "static devclass_t mypci_devclass;\n"
+msgstr "static devclass_t mypci_devclass;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:267
+#, no-wrap
+msgid ""
+"DEFINE_CLASS_0(mypci, mypci_driver, mypci_methods, sizeof(struct mypci_softc));\n"
+"DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);\n"
+msgstr ""
+"DEFINE_CLASS_0(mypci, mypci_driver, mypci_methods, sizeof(struct mypci_softc));\n"
+"DRIVER_MODULE(mypci, pci, mypci_driver, mypci_devclass, 0, 0);\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:269
+#, no-wrap
+msgid "[.filename]#Makefile# for Sample Driver"
+msgstr "[.filename]#Makefile# для примера драйвера"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:274
+#, no-wrap
+msgid "# Makefile for mypci driver\n"
+msgstr "# Makefile for mypci driver\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:278
+#, no-wrap
+msgid ""
+"KMOD=\tmypci\n"
+"SRCS=\tmypci.c\n"
+"SRCS+=\tdevice_if.h bus_if.h pci_if.h\n"
+msgstr ""
+"KMOD=\tmypci\n"
+"SRCS=\tmypci.c\n"
+"SRCS+=\tdevice_if.h bus_if.h pci_if.h\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:280
+#, no-wrap
+msgid ".include <bsd.kmod.mk>\n"
+msgstr ".include <bsd.kmod.mk>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:283
+msgid ""
+"If you place the above source file and [.filename]#Makefile# into a "
+"directory, you may run `make` to compile the sample driver. Additionally, "
+"you may run `make load` to load the driver into the currently running kernel "
+"and `make unload` to unload the driver after it is loaded."
+msgstr ""
+"Если вы поместите исходный файл выше и [.filename]#Makefile# в каталог, вы "
+"можете запустить `make` для компиляции примера драйвера. Дополнительно можно "
+"выполнить `make load` для загрузки драйвера в текущее ядро и `make unload` "
+"для выгрузки драйвера после его загрузки."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:284
+#, no-wrap
+msgid "Additional Resources"
+msgstr "Дополнительные ресурсы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:287
+msgid "http://www.pcisig.org/[PCI Special Interest Group]"
+msgstr "http://www.pcisig.org/[Группа по стандартам PCI]"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:288
+msgid "PCI System Architecture, Fourth Edition by Tom Shanley, et al."
+msgstr "PCI System Architecture, Fourth Edition by Tom Shanley, et al."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:290
+#, no-wrap
+msgid "Bus Resources"
+msgstr "Ресурсы шины"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:293
+msgid ""
+"FreeBSD provides an object-oriented mechanism for requesting resources from "
+"a parent bus. Almost all devices will be a child member of some sort of bus "
+"(PCI, ISA, USB, SCSI, etc) and these devices need to acquire resources from "
+"their parent bus (such as memory segments, interrupt lines, or DMA channels)."
+msgstr ""
+"FreeBSD предоставляет объектно-ориентированный механизм для запроса ресурсов "
+"от родительской шины. Почти все устройства будут дочерними элементами какого-"
+"либо типа шины (PCI, ISA, USB, SCSI и т.д.), и этим устройствам необходимо "
+"получать ресурсы от своей родительской шины (такие как сегменты памяти, "
+"линии прерываний или каналы DMA)."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:294
+#, no-wrap
+msgid "Base Address Registers"
+msgstr "Регистры базовых адресов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:297
+msgid ""
+"To do anything particularly useful with a PCI device you will need to obtain "
+"the _Base Address Registers_ (BARs) from the PCI Configuration space. The "
+"PCI-specific details of obtaining the BAR are abstracted in the "
+"`bus_alloc_resource()` function."
+msgstr ""
+"Для выполнения каких-либо полезных действий с устройством PCI необходимо "
+"получить _регистры базовых адресов_ (BAR) из конфигурационного пространства "
+"PCI. Специфичные для PCI детали получения BAR абстрагированы в функции "
+"`bus_alloc_resource()`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:299
+msgid ""
+"For example, a typical driver might have something similar to this in the "
+"`attach()` function:"
+msgstr ""
+"Например, типичный драйвер может содержать что-то подобное в функции "
+"`attach()`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:310
+#, no-wrap
+msgid ""
+" sc->bar0id = PCIR_BAR(0);\n"
+" sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar0id,\n"
+"\t\t\t\t 0, ~0, 1, RF_ACTIVE);\n"
+" if (sc->bar0res == NULL) {\n"
+" printf(\"Memory allocation of PCI base register 0 failed!\\n\");\n"
+" error = ENXIO;\n"
+" goto fail1;\n"
+" }\n"
+msgstr ""
+" sc->bar0id = PCIR_BAR(0);\n"
+" sc->bar0res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar0id,\n"
+"\t\t\t\t 0, ~0, 1, RF_ACTIVE);\n"
+" if (sc->bar0res == NULL) {\n"
+" printf(\"Memory allocation of PCI base register 0 failed!\\n\");\n"
+" error = ENXIO;\n"
+" goto fail1;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:323
+#, no-wrap
+msgid ""
+" sc->bar1id = PCIR_BAR(1);\n"
+" sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar1id,\n"
+"\t\t\t\t 0, ~0, 1, RF_ACTIVE);\n"
+" if (sc->bar1res == NULL) {\n"
+" printf(\"Memory allocation of PCI base register 1 failed!\\n\");\n"
+" error = ENXIO;\n"
+" goto fail2;\n"
+" }\n"
+" sc->bar0_bt = rman_get_bustag(sc->bar0res);\n"
+" sc->bar0_bh = rman_get_bushandle(sc->bar0res);\n"
+" sc->bar1_bt = rman_get_bustag(sc->bar1res);\n"
+" sc->bar1_bh = rman_get_bushandle(sc->bar1res);\n"
+msgstr ""
+" sc->bar1id = PCIR_BAR(1);\n"
+" sc->bar1res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->bar1id,\n"
+"\t\t\t\t 0, ~0, 1, RF_ACTIVE);\n"
+" if (sc->bar1res == NULL) {\n"
+" printf(\"Memory allocation of PCI base register 1 failed!\\n\");\n"
+" error = ENXIO;\n"
+" goto fail2;\n"
+" }\n"
+" sc->bar0_bt = rman_get_bustag(sc->bar0res);\n"
+" sc->bar0_bh = rman_get_bushandle(sc->bar0res);\n"
+" sc->bar1_bt = rman_get_bustag(sc->bar1res);\n"
+" sc->bar1_bh = rman_get_bushandle(sc->bar1res);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:326
+msgid ""
+"Handles for each base address register are kept in the `softc` structure so "
+"that they can be used to write to the device later."
+msgstr ""
+"Дескрипторы для каждого регистра базовых адресов хранятся в структуре "
+"`softc`, чтобы их можно было использовать для записи на устройство в "
+"дальнейшем."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:328
+msgid ""
+"These handles can then be used to read or write from the device registers "
+"with the `bus_space_*` functions. For example, a driver might contain a "
+"shorthand function to read from a board specific register like this:"
+msgstr ""
+"Эти дескрипторы затем могут быть использованы для чтения или записи из "
+"регистров устройства с помощью функций `bus_space_*`. Например, драйвер "
+"может содержать сокращённую функцию для чтения из специфичного для платы "
+"регистра, как показано ниже:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:336
+#, no-wrap
+msgid ""
+"uint16_t\n"
+"board_read(struct ni_softc *sc, uint16_t address)\n"
+"{\n"
+" return bus_space_read_2(sc->bar1_bt, sc->bar1_bh, address);\n"
+"}\n"
+msgstr ""
+"uint16_t\n"
+"board_read(struct ni_softc *sc, uint16_t address)\n"
+"{\n"
+" return bus_space_read_2(sc->bar1_bt, sc->bar1_bh, address);\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:339
+msgid "Similarly, one could write to the registers with:"
+msgstr "Аналогично, можно записать в регистры с помощью:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:347
+#, no-wrap
+msgid ""
+"void\n"
+"board_write(struct ni_softc *sc, uint16_t address, uint16_t value)\n"
+"{\n"
+" bus_space_write_2(sc->bar1_bt, sc->bar1_bh, address, value);\n"
+"}\n"
+msgstr ""
+"void\n"
+"board_write(struct ni_softc *sc, uint16_t address, uint16_t value)\n"
+"{\n"
+" bus_space_write_2(sc->bar1_bt, sc->bar1_bh, address, value);\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:350
+msgid ""
+"These functions exist in 8bit, 16bit, and 32bit versions and you should use "
+"`bus_space_{read|write}_{1|2|4}` accordingly."
+msgstr ""
+"Эти функции существуют в 8-битных, 16-битных и 32-битных версиях, и вам "
+"следует использовать `bus_space_{read|write}_{1|2|4}` соответственно."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:354
+msgid ""
+"In FreeBSD 7.0 and later, you can use the `bus_*` functions instead of "
+"`bus_space_*`. The `bus_*` functions take a struct resource * pointer "
+"instead of a bus tag and handle. Thus, you could drop the bus tag and bus "
+"handle members from the `softc` and rewrite the `board_read()` function as:"
+msgstr ""
+"В FreeBSD 7.0 и более поздних версиях вы можете использовать функции `bus_*` "
+"вместо `bus_space_*`. Функции `bus_*` принимают указатель на структуру "
+"resource * вместо тега шины и дескриптора. Таким образом, вы можете удалить "
+"тег шины и дескриптор шины из `softc` и переписать функцию `board_read()` "
+"как:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:362
+#, no-wrap
+msgid ""
+"uint16_t\n"
+"board_read(struct ni_softc *sc, uint16_t address)\n"
+"{\n"
+"\treturn (bus_read(sc->bar1res, address));\n"
+"}\n"
+msgstr ""
+"uint16_t\n"
+"board_read(struct ni_softc *sc, uint16_t address)\n"
+"{\n"
+"\treturn (bus_read(sc->bar1res, address));\n"
+"}\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:366
+#, no-wrap
+msgid "Interrupts"
+msgstr "Прерывания"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:369
+msgid ""
+"Interrupts are allocated from the object-oriented bus code in a way similar "
+"to the memory resources. First an IRQ resource must be allocated from the "
+"parent bus, and then the interrupt handler must be set up to deal with this "
+"IRQ."
+msgstr ""
+"Прерывания выделяются объектно-ориентированным кодом шины аналогично "
+"ресурсам памяти. Сначала ресурс IRQ должен быть выделен из родительской "
+"шины, а затем должен быть настроен обработчик прерывания для работы с этим "
+"IRQ."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:371
+msgid "Again, a sample from a device `attach()` function says more than words."
+msgstr ""
+"Вот пример из функции `attach()` устройства, который скажет больше, чем "
+"слова."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:375
+#, no-wrap
+msgid "/* Get the IRQ resource */\n"
+msgstr "/* Get the IRQ resource */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:384
+#, no-wrap
+msgid ""
+" sc->irqid = 0x0;\n"
+" sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &(sc->irqid),\n"
+"\t\t\t\t 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE);\n"
+" if (sc->irqres == NULL) {\n"
+"\tprintf(\"IRQ allocation failed!\\n\");\n"
+"\terror = ENXIO;\n"
+"\tgoto fail3;\n"
+" }\n"
+msgstr ""
+" sc->irqid = 0x0;\n"
+" sc->irqres = bus_alloc_resource(dev, SYS_RES_IRQ, &(sc->irqid),\n"
+"\t\t\t\t 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE);\n"
+" if (sc->irqres == NULL) {\n"
+"\tprintf(\"IRQ allocation failed!\\n\");\n"
+"\terror = ENXIO;\n"
+"\tgoto fail3;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:386
+#, no-wrap
+msgid " /* Now we should set up the interrupt handler */\n"
+msgstr " /* Now we should set up the interrupt handler */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:393
+#, no-wrap
+msgid ""
+" error = bus_setup_intr(dev, sc->irqres, INTR_TYPE_MISC,\n"
+"\t\t\t my_handler, sc, &(sc->handler));\n"
+" if (error) {\n"
+"\tprintf(\"Couldn't set up irq\\n\");\n"
+"\tgoto fail4;\n"
+" }\n"
+msgstr ""
+" error = bus_setup_intr(dev, sc->irqres, INTR_TYPE_MISC,\n"
+"\t\t\t my_handler, sc, &(sc->handler));\n"
+" if (error) {\n"
+"\tprintf(\"Couldn't set up irq\\n\");\n"
+"\tgoto fail4;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:396
+msgid ""
+"Some care must be taken in the detach routine of the driver. You must "
+"quiesce the device's interrupt stream, and remove the interrupt handler. "
+"Once `bus_teardown_intr()` has returned, you know that your interrupt "
+"handler will no longer be called and that all threads that might have been "
+"executing this interrupt handler have returned. Since this function can "
+"sleep, you must not hold any mutexes when calling this function."
+msgstr ""
+"Некоторые меры предосторожности должны быть приняты в процедуре отключения "
+"драйвера. Необходимо остановить поток прерываний устройства и удалить "
+"обработчик прерываний. Как только `bus_teardown_intr()` завершится, можно "
+"быть уверенным, что обработчик прерываний больше не будет вызываться и все "
+"потоки, которые могли выполнять этот обработчик, завершили работу. Поскольку "
+"эта функция может засыпать, нельзя удерживать какие-либо мьютексы при её "
+"вызове."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:397
+#, no-wrap
+msgid "DMA"
+msgstr "DMA"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:400
+msgid ""
+"This section is obsolete, and present only for historical reasons. The "
+"proper methods for dealing with these issues is to use the "
+"`bus_space_dma*()` functions instead. This paragraph can be removed when "
+"this section is updated to reflect that usage. However, at the moment, the "
+"API is in a bit of flux, so once that settles down, it would be good to "
+"update this section to reflect that."
+msgstr ""
+"Этот раздел устарел и приведён только в исторических целях. Правильный "
+"способ решения этих проблем — использование функций `bus_space_dma*()`. Этот "
+"абзац можно удалить, когда раздел будет обновлён с учётом данного подхода. "
+"Однако на данный момент API находится в состоянии изменения, поэтому, когда "
+"он стабилизируется, будет полезно обновить этот раздел соответствующим "
+"образом."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:402
+msgid ""
+"On the PC, peripherals that want to do bus-mastering DMA must deal with "
+"physical addresses. This is a problem since FreeBSD uses virtual memory and "
+"deals almost exclusively with virtual addresses. Fortunately, there is a "
+"function, `vtophys()` to help."
+msgstr ""
+"На ПК периферийные устройства, которые хотят использовать DMA с управлением "
+"шиной, должны работать с физическими адресами. Это проблема, поскольку "
+"FreeBSD использует виртуальную память и работает почти исключительно с "
+"виртуальными адресами. К счастью, существует функция `vtophys()`, которая "
+"поможет."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:407
+#, no-wrap
+msgid ""
+"#include <vm/vm.h>\n"
+"#include <vm/pmap.h>\n"
+msgstr ""
+"#include <vm/vm.h>\n"
+"#include <vm/pmap.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:409
+#, no-wrap
+msgid "#define vtophys(virtual_address) (...)\n"
+msgstr "#define vtophys(virtual_address) (...)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:412
+msgid ""
+"The solution is a bit different on the alpha however, and what we really "
+"want is a function called `vtobus()`."
+msgstr ""
+"Однако решение немного отличается на alpha, и на самом деле нам нужна "
+"функция под названием `vtobus()`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:420
+#, no-wrap
+msgid ""
+"#if defined(__alpha__)\n"
+"#define vtobus(va) alpha_XXX_dmamap((vm_offset_t)va)\n"
+"#else\n"
+"#define vtobus(va) vtophys(va)\n"
+"#endif\n"
+msgstr ""
+"#if defined(__alpha__)\n"
+"#define vtobus(va) alpha_XXX_dmamap((vm_offset_t)va)\n"
+"#else\n"
+"#define vtobus(va) vtophys(va)\n"
+"#endif\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:422
+#, no-wrap
+msgid "Deallocating Resources"
+msgstr "Освобождение ресурсов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/pci/_index.adoc:424
+msgid ""
+"It is very important to deallocate all of the resources that were allocated "
+"during `attach()`. Care must be taken to deallocate the correct stuff even "
+"on a failure condition so that the system will remain usable while your "
+"driver dies."
+msgstr ""
+"Очень важно освободить все ресурсы, которые были выделены во время "
+"`attach()`. Необходимо внимательно следить за освобождением правильных "
+"ресурсов даже в случае ошибки, чтобы система оставалась работоспособной при "
+"завершении работы вашего драйвера."
diff --git a/documentation/content/ru/books/arch-handbook/scsi/_index.adoc b/documentation/content/ru/books/arch-handbook/scsi/_index.adoc
new file mode 100644
index 0000000000..036e2d4888
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/scsi/_index.adoc
@@ -0,0 +1,1367 @@
+---
+description: 'Контроллеры SCSI с общим методом доступа (CAM)'
+next: books/arch-handbook/usb
+params:
+ path: /books/arch-handbook/scsi/
+prev: books/arch-handbook/pci
+showBookMenu: true
+tags: ["SCSI", "Controller", "Architecture"]
+title: 'Глава 12. Контроллеры SCSI с общим методом доступа (CAM)'
+weight: 14
+---
+
+[[scsi]]
+= Контроллеры SCSI с общим методом доступа (CAM)
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 12
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[scsi-synopsis]]
+== Обзор
+
+Этот документ предполагает, что читатель имеет общее представление о драйверах устройств в FreeBSD и о протоколе SCSI. Большая часть информации в этом документе была извлечена из драйверов:
+
+* ncr ([.filename]#/sys/pci/ncr.c#) от Wolfgang Stanglmeier и Stefan Esser
+* sym ([.filename]#/sys/dev/sym/sym_hipd.c#) от Gerard Roudier
+* aic7xxx ([.filename]#/sys/dev/aic7xxx/aic7xxx.c#) от Justin T. Gibbs
+
+и из самого кода CAM (автор Justin T. Gibbs, см. [.filename]#/sys/cam/*#). Когда какое-то решение выглядело наиболее логичным и было практически дословно взято из кода Justin T. Gibbs, я отмечал его как "рекомендуемое".
+
+Документ иллюстрирован примерами на псевдокоде. Хотя иногда примеры содержат много деталей и выглядят как настоящий код, это всё ещё псевдокод. Он был написан, чтобы продемонстрировать концепции в понятной форме. Для реального драйвера могут быть более модульные и эффективные подходы. Также он абстрагируется от деталей оборудования, а также от вопросов, которые могли бы затмить демонстрируемые концепции или которые предполагается описать в других главах руководства разработчика. Такие детали обычно показаны в виде вызовов функций с описательными именами, комментариев или псевдооператоров. К счастью, полные примеры из реальной жизни со всеми деталями можно найти в реальных драйверах.
+
+[[scsi-general]]
+== Общая Архитектура
+
+CAM означает Common Access Method (Общий Метод Доступа). Это универсальный способ адресации шин ввода-вывода в стиле SCSI. Это позволяет отделить общие драйверы устройств от драйверов, управляющих шиной ввода-вывода: например, драйвер диска получает возможность управлять дисками как на SCSI, IDE, так и на любой другой шине, так что часть драйвера диска не нужно переписывать (или копировать и изменять) для каждой новой шины ввода-вывода. Таким образом, двумя наиболее важными активными сущностями являются:
+
+* _Модули периферийных устройств_ - драйвер для периферийных устройств (диски, ленты, CD-ROM и т.д.)
+* _Модули интерфейса SCSI_ (SIM) - драйверы адаптеров шины для подключения к шине ввода-вывода, такой как SCSI или IDE.
+
+Периферийный драйвер получает запросы от ОС, преобразует их в последовательность команд SCSI и передает эти команды SCSI модулю интерфейса SCSI. Модуль интерфейса SCSI отвечает за передачу этих команд реальному оборудованию (или, если оборудование не поддерживает SCSI, а использует, например, IDE, также преобразует команды SCSI в собственные команды оборудования).
+
+Так как мы заинтересованы в написании драйвера адаптера SCSI, с этого момента мы будем рассматривать всё с точки зрения модуля SCSI-интерфейса (SIM).
+
+== Глобальные переменные и Шаблонный код
+
+Типичный драйвер SIM должен включать следующие заголовочные файлы, связанные с CAM:
+
+[.programlisting]
+....
+#include <cam/cam.h>
+#include <cam/cam_ccb.h>
+#include <cam/cam_sim.h>
+#include <cam/cam_xpt_sim.h>
+#include <cam/cam_debug.h>
+#include <cam/scsi/scsi_all.h>
+....
+
+== Конфигурация устройства: xxx_attach
+
+Первое, что должен сделать каждый драйвер SIM, — это зарегистрироваться в подсистеме CAM. Это выполняется в функции `xxx_attach()` драйвера (здесь и далее xxx_ используется для обозначения уникального префикса имени драйвера). Сама функция `xxx_attach()` вызывается кодом автонастройки системной шины, который мы здесь не описываем.
+
+Это достигается в несколько этапов: сначала необходимо выделить очередь запросов, связанных с этой SIM:
+
+[.programlisting]
+....
+ struct cam_devq *devq;
+
+ if ((devq = cam_simq_alloc(SIZE)) == NULL) {
+ error; /* some code to handle the error */
+ }
+....
+
+Вот `SIZE` — это размер выделяемой очереди, максимальное количество запросов, которые она может содержать. Это количество запросов, которые драйвер SIM может обрабатывать параллельно на одной SCSI-карте. Обычно его можно вычислить как:
+
+[.programlisting]
+....
+SIZE = NUMBER_OF_SUPPORTED_TARGETS * MAX_SIMULTANEOUS_COMMANDS_PER_TARGET
+....
+
+Далее мы создаем описание нашего SIM:
+
+[.programlisting]
+....
+ struct cam_sim *sim;
+
+ if ((sim = cam_sim_alloc(action_func, poll_func, driver_name,
+ softc, unit, mtx, max_dev_transactions,
+ max_tagged_dev_transactions, devq)) == NULL) {
+ cam_simq_free(devq);
+ error; /* some code to handle the error */
+ }
+....
+
+Обратите внимание, что если мы не сможем создать дескриптор SIM, мы также освобождаем `devq`, потому что больше ничего не можем с ним сделать и хотим сэкономить память.
+
+Если SCSI-карта имеет несколько шин SCSI, то каждой шине требуется собственная структура `cam_sim`.
+
+Интересный вопрос: что делать, если SCSI-карта имеет более одной SCSI-шины, нужна ли одна структура `devq` на карту или на SCSI-шину? Ответ, приведённый в комментариях к коду CAM, таков: как угодно, на усмотрение автора драйвера.
+
+Аргументы:
+
+* `action_func` - указатель на функцию `xxx_action` драйвера.
+
+[.programlisting]
+....
+static void xxx_action(struct cam_sim *, union ccb *);
+....
+* `poll_func` - указатель на функцию `xxx_poll()` драйвера
++
+[.programlisting]
+....
+static void xxx_poll(struct cam_sim *);
+....
+* `driver_name` — имя фактического драйвера, например `ncr` или `wds`.
+* `softc` — указатель на внутренний дескриптор драйвера для данной SCSI-карты. Этот указатель будет использоваться драйвером в дальнейшем для получения приватных данных.
+* unit - номер управляющего устройства, например, для контроллера "mps0" это число будет 0
+* mtx - Блокировка, связанная с данной SIM. Для SIM, которые не поддерживают блокировку, передается Giant. Для SIM, которые поддерживают, передается блокировка, используемая для защиты структур данных этой SIM. Эта блокировка будет удерживаться при вызовах xxx_action и xxx_poll.
+* max_dev_transactions - максимальное количество одновременных транзакций на целевом SCSI-устройстве в режиме без тегов. Это значение почти всегда равно 1, за исключением возможных исключений только для не-SCSI карт. Также драйверы, которые надеются получить преимущество, подготавливая одну транзакцию во время выполнения другой, могут установить его в 2, но это не кажется оправданным из-за сложности.
+* max_tagged_dev_transactions - то же самое, но в режиме с тегами. Теги — это способ в SCSI инициировать несколько транзакций на устройстве: каждая транзакция получает уникальный тег и отправляется на устройство. Когда устройство завершает транзакцию, оно возвращает результат вместе с тегом, чтобы SCSI-адаптер (и драйвер) могли определить, какая транзакция была завершена. Этот аргумент также известен как максимальная глубина тега. Он зависит от возможностей SCSI-адаптера.
+
+Наконец, мы регистрируем шины SCSI, связанные с нашим SCSI-адаптером:
+
+[.programlisting]
+....
+ if (xpt_bus_register(sim, softc, bus_number) != CAM_SUCCESS) {
+ cam_sim_free(sim, /*free_devq*/ TRUE);
+ error; /* some code to handle the error */
+ }
+....
+
+Если существует одна структура `devq` на каждую шину SCSI (т.е. мы рассматриваем карту с несколькими шинами как несколько карт с одной шиной каждая), то номер шины всегда будет 0, в противном случае каждая шина на SCSI-карте должна получить уникальный номер. Каждой шине требуется своя отдельная структура `cam_sim`.
+
+После этого наш контроллер полностью подключён к системе CAM. Значение `devq` теперь можно отбросить: sim будет передаваться в качестве аргумента во всех последующих вызовах из CAM, а devq можно получить из него.
+
+CAM предоставляет инфраструктуру для подобных асинхронных событий. Некоторые события возникают на нижних уровнях (драйверы SIM), некоторые — в драйверах периферийных устройств, а некоторые — в самой подсистеме CAM. Любой драйвер может зарегистрировать обработчики для определённых типов асинхронных событий, чтобы получать уведомления при их возникновении.
+
+Типичным примером такого события является сброс устройства. Каждая транзакция и событие идентифицируют устройства, к которым они применяются, с помощью "пути". Специфичные для целевого устройства события обычно происходят во время транзакции с этим устройством. Таким образом, путь из этой транзакции может быть повторно использован для сообщения о данном событии (это безопасно, потому что путь события копируется в процедуре сообщения о событии, но не освобождается и не передаётся дальше). Также безопасно динамически выделять пути в любое время, включая процедуры обработки прерываний, хотя это влечёт определённые накладные расходы, и возможная проблема такого подхода заключается в том, что в этот момент может не быть свободной памяти. Для события сброса шины нам необходимо определить путь-шаблон, включающий все устройства на шине. Поэтому мы можем заранее создать путь для будущих событий сброса шины и избежать проблем с возможной нехваткой памяти в будущем:
+
+[.programlisting]
+....
+ struct cam_path *path;
+
+ if (xpt_create_path(&path, /*periph*/NULL,
+ cam_sim_path(sim), CAM_TARGET_WILDCARD,
+ CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
+ xpt_bus_deregister(cam_sim_path(sim));
+ cam_sim_free(sim, /*free_devq*/TRUE);
+ error; /* some code to handle the error */
+ }
+
+ softc->wpath = path;
+ softc->sim = sim;
+....
+
+Как вы можете видеть, путь включает:
+
+* Идентификатор драйвера периферийного устройства (NULL здесь, так как у нас его нет)
+* Идентификатор драйвера SIM (`cam_sim_path(sim)`)
+* Номер целевого устройства SCSI (CAM_TARGET_WILDCARD означает "все устройства")
+* Номер SCSI LUN подустройства (CAM_LUN_WILDCARD означает "все LUN")
+
+Если драйвер не может выделить этот путь, он не сможет нормально работать, поэтому в таком случае мы демонтируем эту шину SCSI.
+
+И мы сохраняем указатель пути в структуре `softc` для дальнейшего использования. После этого сохраняем значение sim (или можем также отбросить его при выходе из `xxx_probe()`, если захотим).
+
+Вот и всё для минималистичной инициализации. Чтобы сделать всё правильно, остался ещё один вопрос.
+
+Для драйвера SIM есть одно особенно важное событие: когда целевое устройство считается потерянным. В этом случае может быть хорошей идеей сбросить SCSI-переговоры с этим устройством. Поэтому мы регистрируем обратный вызов для этого события в CAM. Запрос передаётся в CAM путём запроса действия CAM в блоке управления CAM для этого типа запроса:
+
+[.programlisting]
+....
+ struct ccb_setasync csa;
+
+ xpt_setup_ccb(&csa.ccb_h, path, /*priority*/5);
+ csa.ccb_h.func_code = XPT_SASYNC_CB;
+ csa.event_enable = AC_LOST_DEVICE;
+ csa.callback = xxx_async;
+ csa.callback_arg = sim;
+ xpt_action((union ccb *)&csa);
+....
+
+== Обработка сообщений CAM: xxx_action
+
+[.programlisting]
+....
+static void xxx_action(struct cam_sim *sim, union ccb *ccb);
+....
+
+Выполнить некоторое действие по запросу подсистемы CAM. Sim описывает SIM для запроса, CCB — это сам запрос. CCB расшифровывается как "CAM Control Block" (блок управления CAM). Это объединение множества конкретных экземпляров, каждый из которых описывает аргументы для определённого типа транзакций. Все эти экземпляры имеют общий заголовок CCB, в котором хранится общая часть аргументов.
+
+CAM поддерживает SCSI-контроллеры, работающие как в режиме инициатора («обычном»), так и в режиме цели (эмулирующем SCSI-устройство). Здесь мы рассматриваем только часть, относящуюся к режиму инициатора.
+
+Существует несколько функций и макросов (другими словами, методов), определённых для доступа к публичным данным в структуре sim:
+
+* `cam_sim_path(sim)` - идентификатор пути (см. выше)
+* `cam_sim_name(sim)` — имя sim
+* `cam_sim_softc(sim)` - указатель на структуру softc (приватные данные драйвера)
+* `cam_sim_unit(sim)` - номер устройства
+* `cam_sim_bus(sim)` - идентификатор шины
+
+Для идентификации устройства `xxx_action()` может получить номер устройства и указатель на его структуру softc, используя следующие функции.
+
+Тип запроса хранится в `ccb->ccb_h.func_code`. Поэтому, как правило, `xxx_action()` состоит из большого оператора switch:
+
+[.programlisting]
+....
+ struct xxx_softc *softc = (struct xxx_softc *) cam_sim_softc(sim);
+ struct ccb_hdr *ccb_h = &ccb->ccb_h;
+ int unit = cam_sim_unit(sim);
+ int bus = cam_sim_bus(sim);
+
+ switch (ccb_h->func_code) {
+ case ...:
+ ...
+ default:
+ ccb_h->status = CAM_REQ_INVALID;
+ xpt_done(ccb);
+ break;
+ }
+....
+
+Как видно из случая по умолчанию (если получена неизвестная команда) код возврата команды устанавливается в `ccb->ccb_h.status`, а завершённый CCB возвращается обратно в CAM вызовом `xpt_done(ccb)`.
+
+`xpt_done()` не обязательно вызывать из `xxx_action()`: Например, запрос ввода-вывода может быть поставлен в очередь внутри драйвера SIM и/или его SCSI-контроллера. Затем, когда устройство пошлет прерывание, сигнализирующее о завершении обработки этого запроса, `xpt_done()` может быть вызван из процедуры обработки прерывания.
+
+На самом деле, статус CCB не только присваивается в качестве кода возврата, но и CCB всегда имеет какой-то статус. Перед тем как CCB передается в процедуру `xxx_action()`, он получает статус CCB_REQ_INPROG, означающий, что запрос находится в процессе выполнения. В [.filename]#/sys/cam/cam.h# определено удивительно большое количество значений статуса, которые должны детально отражать состояние запроса. Что еще интереснее, статус фактически представляет собой "побитовое ИЛИ" перечисленного значения статуса (младшие 6 бит) и возможных дополнительных флагов (старшие биты). Перечисленные значения будут подробно рассмотрены далее. Их краткое описание можно найти в разделе "Сводка ошибок". Возможные флаги статуса:
+
+* _CAM_DEV_QFRZN_ - если драйвер SIM получает серьёзную ошибку (например, устройство не отвечает на выборку или нарушает протокол SCSI) при обработке CCB, он должен заморозить очередь запросов, вызвав `xpt_freeze_simq()`, вернуть другие поставленные в очередь, но ещё не обработанные CCB для этого устройства обратно в очередь CAM, затем установить этот флаг для проблемного CCB и вызвать `xpt_done()`. Этот флаг заставляет подсистему CAM разморозить очередь после обработки ошибки.
+* _CAM_AUTOSNS_VALID_ - если устройство вернуло состояние ошибки и флаг CAM_DIS_AUTOSENSE не установлен в CCB, драйвер SIM должен автоматически выполнить команду REQUEST SENSE, чтобы извлечь данные sense (расширенную информацию об ошибке) из устройства. Если попытка была успешной, данные sense должны быть сохранены в CCB, а этот флаг установлен.
+* _CAM_RELEASE_SIMQ_ - аналогично CAM_DEV_QFRZN, но используется в случае возникновения проблем (или нехватки ресурсов) с самим SCSI-контроллером. В этом случае все последующие запросы к контроллеру должны быть остановлены с помощью `xpt_freeze_simq()`. Очередь контроллера будет возобновлена после того, как драйвер SIM устранит нехватку и уведомит CAM, вернув некоторый CCB с установленным этим флагом.
+* _CAM_SIM_QUEUED_ - этот флаг должен быть установлен, когда SIM помещает CCB в свою очередь запросов (и снят, когда этот CCB извлекается из очереди перед возвратом в CAM). В настоящее время этот флаг нигде не используется в коде CAM, поэтому его назначение чисто диагностическое.
+* _CAM_QOS_VALID_ - Данные QOS теперь действительны.
+
+Функция `xxx_action()` не может находиться в состоянии ожидания, поэтому вся синхронизация доступа к ресурсам должна выполняться с использованием SIM или заморозки очереди устройств. Помимо упомянутых флагов, подсистема CAM предоставляет функции `xpt_release_simq()` и `xpt_release_devq()` для разморозки очередей напрямую, без передачи CCB в CAM.
+
+Заголовок CCB содержит следующие поля:
+
+* _path_ - идентификатор пути для запроса
+* _target_id_ - идентификатор целевого устройства для запроса
+* _target_lun_ - идентификатор LUN целевого устройства
+* _timeout_ - интервал таймаута для этой команды, в миллисекундах
+* _timeout_ch_ - удобное место для драйвера SIM, чтобы хранить обработчик таймаута (сама подсистема CAM не делает никаких предположений о нём)
+* _flags_ - различные биты информации о запросе spriv_ptr0, spriv_ptr1 — поля, зарезервированные для приватного использования драйвером SIM (например, для связи с очередями SIM или приватными блоками управления SIM); фактически они существуют как объединения: spriv_ptr0 и spriv_ptr1 имеют тип (void *), spriv_field0 и spriv_field1 имеют тип unsigned long, sim_priv.entries[0].bytes и sim_priv.entries[1].bytes - это байтовые массивы размера, согласованного с другими вариантами объединения, а sim_priv.bytes - это один массив, вдвое большего размера.
+
+Рекомендуемый способ использования приватных полей SIM в CCB — это определить для них осмысленные имена и использовать эти осмысленные имена в драйвере, например:
+
+[.programlisting]
+....
+#define ccb_some_meaningful_name sim_priv.entries[0].bytes
+#define ccb_hcb spriv_ptr1 /* for hardware control block */
+....
+
+Наиболее распространенные запросы в режиме инициатора:
+
+=== _XPT_SCSI_IO_ - выполнить транзакцию ввода-вывода
+
+Экземпляр "struct ccb_scsiio csio" объединения ccb используется для передачи аргументов. Они включают:
+
+* _cdb_io_ - указатель на буфер команды SCSI или сам буфер
+* _cdb_len_ - длина команды SCSI
+* _data_ptr_ - указатель на буфер данных (усложняется, если используется scatter/gather)
+* _dxfer_len_ - длина передаваемых данных
+* _sglist_cnt_ - счетчик сегментов scatter/gather
+* _scsi_status_ - место для возврата статуса SCSI
+* _sense_data_ - буфер для информации SCSI sense, если команда возвращает ошибку (драйвер SIM должен автоматически выполнить команду REQUEST SENSE в этом случае, если флаг CCB CAM_DIS_AUTOSENSE не установлен)
+* _sense_len_ - длина этого буфера (если она окажется больше размера sense_data, драйвер SIM должен без уведомления принять меньшее значение)
+* _resid_, _sense_resid_ — если передача данных или SCSI sense вернула ошибку, это счётчики остаточных (не переданных) данных. Они не кажутся особенно значимыми, поэтому в случаях, когда их сложно вычислить (например, подсчёт байтов в FIFO-буфере SCSI-контроллера), подойдёт и приблизительное значение. Для успешно завершённой передачи они должны быть установлены в ноль.
+* _tag_action_ - тип используемого тега:
+** `CAM_TAG_ACTION_NONE` - не использовать теги для данной транзакции
+** MSG_SIMPLE_Q_TAG, MSG_HEAD_OF_Q_TAG, MSG_ORDERED_Q_TAG — значение, соответствующее указанному теговому сообщению (см. /sys/cam/scsi/scsi_message.h); указывает только тип тега, значение тега должно быть назначено самим драйвером SIM
+
+Общая логика обработки этого запроса следующая:
+
+Первое, что нужно сделать, это проверить возможные состояния гонки, чтобы убедиться, что команда не была прервана, пока находилась в очереди:
+
+[.programlisting]
+....
+ struct ccb_scsiio *csio = &ccb->csio;
+
+ if ((ccb_h->status & CAM_STATUS_MASK) != CAM_REQ_INPROG) {
+ xpt_done(ccb);
+ return;
+ }
+....
+
+Также мы проверяем, что устройство вообще поддерживается нашим контроллером:
+
+[.programlisting]
+....
+ if (ccb_h->target_id > OUR_MAX_SUPPORTED_TARGET_ID
+ || cch_h->target_id == OUR_SCSI_CONTROLLERS_OWN_ID) {
+ ccb_h->status = CAM_TID_INVALID;
+ xpt_done(ccb);
+ return;
+ }
+ if (ccb_h->target_lun > OUR_MAX_SUPPORTED_LUN) {
+ ccb_h->status = CAM_LUN_INVALID;
+ xpt_done(ccb);
+ return;
+ }
+....
+
+Затем выделяем все необходимые структуры данных (такие как зависящий от карты блок управления оборудованием), которые нам нужны для обработки этого запроса. Если мы не можем этого сделать, то замораживаем очередь SIM и запоминаем, что у нас есть отложенная операция, возвращаем CCB обратно и просим CAM поставить его в очередь снова. Позже, когда ресурсы станут доступны, очередь SIM должна быть разморожена путём возврата CCB с установленным битом `CAM_SIMQ_RELEASE` в его статусе. В противном случае, если всё прошло успешно, связываем CCB с блоком управления оборудованием (HCB) и помечаем его как поставленный в очередь.
+
+[.programlisting]
+....
+ struct xxx_hcb *hcb = allocate_hcb(softc, unit, bus);
+
+ if (hcb == NULL) {
+ softc->flags |= RESOURCE_SHORTAGE;
+ xpt_freeze_simq(sim, /*count*/1);
+ ccb_h->status = CAM_REQUEUE_REQ;
+ xpt_done(ccb);
+ return;
+ }
+
+ hcb->ccb = ccb; ccb_h->ccb_hcb = (void *)hcb;
+ ccb_h->status |= CAM_SIM_QUEUED;
+....
+
+Извлечь целевые данные из CCB в аппаратный блок управления. Проверить, запрошено ли назначение тега, и если да, то сгенерировать уникальный тег и построить сообщения тега SCSI. Драйвер SIM также отвечает за согласование с устройствами для установки максимальной взаимно поддерживаемой ширины шины, синхронной скорости и смещения.
+
+[.programlisting]
+....
+ hcb->target = ccb_h->target_id; hcb->lun = ccb_h->target_lun;
+ generate_identify_message(hcb);
+ if (ccb_h->tag_action != CAM_TAG_ACTION_NONE)
+ generate_unique_tag_message(hcb, ccb_h->tag_action);
+ if (!target_negotiated(hcb))
+ generate_negotiation_messages(hcb);
+....
+
+Затем настройте команду SCSI. Хранилище команды может быть указано в CCB различными способами, определяемыми флагами CCB. Буфер команды может содержаться в CCB или указываться на него; в последнем случае указатель может быть физическим или виртуальным. Поскольку оборудованию обычно требуется физический адрес, мы всегда преобразуем адрес в физический, как правило, используя API busdma.
+
+В случае, если запрашивается физический адрес, допустимо вернуть CCB со статусом `CAM_REQ_INVALID`, текущие драйверы так и делают. При необходимости физический адрес также может быть преобразован или отображен обратно в виртуальный, но с большими трудностями, поэтому мы этого не делаем.
+
+[.programlisting]
+....
+ if (ccb_h->flags & CAM_CDB_POINTER) {
+ /* CDB is a pointer */
+ if (!(ccb_h->flags & CAM_CDB_PHYS)) {
+ /* CDB pointer is virtual */
+ hcb->cmd = vtobus(csio->cdb_io.cdb_ptr);
+ } else {
+ /* CDB pointer is physical */
+ hcb->cmd = csio->cdb_io.cdb_ptr ;
+ }
+ } else {
+ /* CDB is in the ccb (buffer) */
+ hcb->cmd = vtobus(csio->cdb_io.cdb_bytes);
+ }
+ hcb->cmdlen = csio->cdb_len;
+....
+
+Теперь настало время настроить данные. Опять же, хранилище данных может быть указано в CCB различными интересными способами, определяемыми флагами CCB. Сначала мы получаем направление передачи данных. Самый простой случай — если нет данных для передачи:
+
+[.programlisting]
+....
+ int dir = (ccb_h->flags & CAM_DIR_MASK);
+
+ if (dir == CAM_DIR_NONE)
+ goto end_data;
+....
+
+Затем мы проверяем, находятся ли данные в одном фрагменте или в списке scatter-gather, а также являются ли адреса физическими или виртуальными. SCSI-контроллер может обрабатывать только ограниченное количество фрагментов ограниченной длины. Если запрос превышает это ограничение, мы возвращаем ошибку. Мы используем специальную функцию для возврата CCB, чтобы в одном месте обрабатывать нехватку ресурсов HCB. Функции для добавления фрагментов зависят от драйвера, и здесь мы оставляем их без детальной реализации. Подробности о проблемах трансляции адресов см. в описании обработки SCSI-команд (CDB). Если какая-то вариация слишком сложна или невозможна для реализации с конкретной картой, допустимо вернуть статус `CAM_REQ_INVALID`. На самом деле, похоже, что возможность scatter-gather нигде в коде CAM сейчас не используется. Но как минимум случай с единичным неразделённым виртуальным буфером должен быть реализован, так как он активно используется CAM.
+
+[.programlisting]
+....
+ int rv;
+
+ initialize_hcb_for_data(hcb);
+
+ if ((!(ccb_h->flags & CAM_SCATTER_VALID)) {
+ /* single buffer */
+ if (!(ccb_h->flags & CAM_DATA_PHYS)) {
+ rv = add_virtual_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);
+ }
+ } else {
+ rv = add_physical_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);
+ }
+ } else {
+ int i;
+ struct bus_dma_segment *segs;
+ segs = (struct bus_dma_segment *)csio->data_ptr;
+
+ if ((ccb_h->flags & CAM_SG_LIST_PHYS) != 0) {
+ /* The SG list pointer is physical */
+ rv = setup_hcb_for_physical_sg_list(hcb, segs, csio->sglist_cnt);
+ } else if (!(ccb_h->flags & CAM_DATA_PHYS)) {
+ /* SG buffer pointers are virtual */
+ for (i = 0; i < csio->sglist_cnt; i++) {
+ rv = add_virtual_chunk(hcb, segs[i].ds_addr,
+ segs[i].ds_len, dir);
+ if (rv != CAM_REQ_CMP)
+ break;
+ }
+ } else {
+ /* SG buffer pointers are physical */
+ for (i = 0; i < csio->sglist_cnt; i++) {
+ rv = add_physical_chunk(hcb, segs[i].ds_addr,
+ segs[i].ds_len, dir);
+ if (rv != CAM_REQ_CMP)
+ break;
+ }
+ }
+ }
+ if (rv != CAM_REQ_CMP) {
+ /* we expect that add_*_chunk() functions return CAM_REQ_CMP
+ * if they added a chunk successfully, CAM_REQ_TOO_BIG if
+ * the request is too big (too many bytes or too many chunks),
+ * CAM_REQ_INVALID in case of other troubles
+ */
+ free_hcb_and_ccb_done(hcb, ccb, rv);
+ return;
+ }
+ end_data:
+....
+
+Если отключение запрещено для этого CCB, мы передаем эту информацию в hcb:
+
+[.programlisting]
+....
+ if (ccb_h->flags & CAM_DIS_DISCONNECT)
+ hcb_disable_disconnect(hcb);
+....
+
+Если контроллер способен самостоятельно выполнять команду REQUEST SENSE, то ему также следует передать значение флага CAM_DIS_AUTOSENSE, чтобы предотвратить автоматическое выполнение REQUEST SENSE, если подсистема CAM этого не требует.
+
+Осталось только установить таймаут, передать наш hcb оборудованию и вернуться, остальное будет сделано обработчиком прерывания (или обработчиком таймаута).
+
+[.programlisting]
+....
+ ccb_h->timeout_ch = timeout(xxx_timeout, (caddr_t) hcb,
+ (ccb_h->timeout * hz) / 1000); /* convert milliseconds to ticks */
+ put_hcb_into_hardware_queue(hcb);
+ return;
+....
+
+И вот возможная реализация функции, возвращающей CCB:
+
+[.programlisting]
+....
+ static void
+ free_hcb_and_ccb_done(struct xxx_hcb *hcb, union ccb *ccb, u_int32_t status)
+ {
+ struct xxx_softc *softc = hcb->softc;
+
+ ccb->ccb_h.ccb_hcb = 0;
+ if (hcb != NULL) {
+ untimeout(xxx_timeout, (caddr_t) hcb, ccb->ccb_h.timeout_ch);
+ /* we're about to free a hcb, so the shortage has ended */
+ if (softc->flags & RESOURCE_SHORTAGE) {
+ softc->flags &= ~RESOURCE_SHORTAGE;
+ status |= CAM_RELEASE_SIMQ;
+ }
+ free_hcb(hcb); /* also removes hcb from any internal lists */
+ }
+ ccb->ccb_h.status = status |
+ (ccb->ccb_h.status & ~(CAM_STATUS_MASK|CAM_SIM_QUEUED));
+ xpt_done(ccb);
+ }
+....
+
+=== _XPT_RESET_DEV_ - отправить устройству сообщение SCSI "BUS DEVICE RESET"
+
+В CCB не передаются данные, кроме заголовка, и наиболее интересным аргументом в нём является target_id. В зависимости от аппаратного обеспечения контроллера может быть создан аппаратный блок управления (как для запроса XPT_SCSI_IO, см. описание запроса XPT_SCSI_IO) и отправлен контроллеру, или SCSI-контроллер может быть немедленно запрограммирован на отправку этого сообщения RESET устройству, или этот запрос может просто не поддерживаться (и возвращать статус `CAM_REQ_INVALID`). Также при завершении запроса все отключенные транзакции для этого целевого устройства должны быть прерваны (вероятно, в процедуре прерывания).
+
+Кроме того, все текущие переговоры для цели теряются при сбросе, поэтому они также могут быть очищены. Или их очистка может быть отложена, так как в любом случае цель запросит повторные переговоры при следующей транзакции.
+
+=== _XPT_RESET_BUS_ - отправить сигнал RESET на шину SCSI
+
+В CCB не передаются аргументы, единственный интересный аргумент — это шина SCSI, указанная структурой sim.
+
+Минималистичная реализация могла бы пропустить SCSI-переговоры для всех устройств на шине и вернуть статус CAM_REQ_CMP.
+
+Правильная реализация дополнительно должна фактически сбросить шину SCSI (возможно, также сбросить контроллер SCSI) и пометить все обрабатываемые CCB, как находящиеся в аппаратной очереди, так и отключенные, как завершенные со статусом CAM_SCSI_BUS_RESET. Например:
+[.programlisting]
+....
+ int targ, lun;
+ struct xxx_hcb *h, *hh;
+ struct ccb_trans_settings neg;
+ struct cam_path *path;
+
+ /* The SCSI bus reset may take a long time, in this case its completion
+ * should be checked by interrupt or timeout. But for simplicity
+ * we assume here that it is really fast.
+ */
+ reset_scsi_bus(softc);
+
+ /* drop all enqueued CCBs */
+ for (h = softc->first_queued_hcb; h != NULL; h = hh) {
+ hh = h->next;
+ free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
+ }
+
+ /* the clean values of negotiations to report */
+ neg.bus_width = 8;
+ neg.sync_period = neg.sync_offset = 0;
+ neg.valid = (CCB_TRANS_BUS_WIDTH_VALID
+ | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);
+
+ /* drop all disconnected CCBs and clean negotiations */
+ for (targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {
+ clean_negotiations(softc, targ);
+
+ /* report the event if possible */
+ if (xpt_create_path(&path, /*periph*/NULL,
+ cam_sim_path(sim), targ,
+ CAM_LUN_WILDCARD) == CAM_REQ_CMP) {
+ xpt_async(AC_TRANSFER_NEG, path, &neg);
+ xpt_free_path(path);
+ }
+
+ for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)
+ for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {
+ hh=h->next;
+ free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
+ }
+ }
+
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+
+ /* report the event */
+ xpt_async(AC_BUS_RESET, softc->wpath, NULL);
+ return;
+....
+
+Реализация сброса шины SCSI в виде функции может быть хорошей идеей, так как она может быть повторно использована функцией таймаута в качестве последнего средства, если что-то пойдёт не так.
+
+=== _XPT_ABORT_ - прервать указанный CCB
+
+Аргументы передаются в экземпляре "struct ccb_abort cab" объединения ccb. Единственное поле аргумента в нём:
+
+* _abort_ccb_ — указатель на CCB, который необходимо прервать
+
+Если прерывание не поддерживается, просто верните статус CAM_UA_ABORT. Это также простой способ минимальной реализации этого вызова — в любом случае возвращать CAM_UA_ABORT.
+
+Трудный путь — честно реализовать этот запрос. Сначала проверьте, что прерывание применяется к SCSI-транзакции:
+
+[.programlisting]
+....
+ struct ccb *abort_ccb;
+ abort_ccb = ccb->cab.abort_ccb;
+
+ if (abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {
+ ccb->ccb_h.status = CAM_UA_ABORT;
+ xpt_done(ccb);
+ return;
+ }
+....
+
+Затем необходимо найти этот CCB в нашей очереди. Это можно сделать, пройдясь по списку всех наших блоков управления оборудованием в поисках связанного с этим CCB:
+
+[.programlisting]
+....
+ struct xxx_hcb *hcb, *h;
+
+ hcb = NULL;
+
+ /* We assume that softc->first_hcb is the head of the list of all
+ * HCBs associated with this bus, including those enqueued for
+ * processing, being processed by hardware and disconnected ones.
+ */
+ for (h = softc->first_hcb; h != NULL; h = h->next) {
+ if (h->ccb == abort_ccb) {
+ hcb = h;
+ break;
+ }
+ }
+
+ if (hcb == NULL) {
+ /* no such CCB in our queue */
+ ccb->ccb_h.status = CAM_PATH_INVALID;
+ xpt_done(ccb);
+ return;
+ }
+
+ hcb=found_hcb;
+....
+
+Теперь мы рассмотрим текущее состояние обработки HCB. Он может находиться в очереди, ожидая отправки на шину SCSI, передаваться в данный момент, быть отключенным и ожидать результата команды, или фактически завершённым с точки зрения аппаратуры, но ещё не отмеченным программным обеспечением, как выполненный. Чтобы избежать состояний гонки с аппаратурой, мы помечаем HCB как прерванный, так что если этот HCB вот-вот будет отправлен на шину SCSI, контроллер SCSI увидит этот флаг и пропустит его.
+
+[.programlisting]
+....
+ int hstatus;
+
+ /* shown as a function, in case special action is needed to make
+ * this flag visible to hardware
+ */
+ set_hcb_flags(hcb, HCB_BEING_ABORTED);
+
+ abort_again:
+
+ hstatus = get_hcb_status(hcb);
+ switch (hstatus) {
+ case HCB_SITTING_IN_QUEUE:
+ remove_hcb_from_hardware_queue(hcb);
+ /* FALLTHROUGH */
+ case HCB_COMPLETED:
+ /* this is an easy case */
+ free_hcb_and_ccb_done(hcb, abort_ccb, CAM_REQ_ABORTED);
+ break;
+....
+
+Если CCB передаётся в данный момент, мы хотели бы сигнализировать контроллеру SCSI аппаратно-зависимым способом, что хотим прервать текущую передачу. Контроллер SCSI установит сигнал SCSI ATTENTION, и когда целевое устройство ответит на него, отправит сообщение ABORT. Мы также сбрасываем таймаут, чтобы убедиться, что целевое устройство не засыпает навсегда. Если команда не будет прервана в разумное время, например, за 10 секунд, процедура таймаута продолжит работу и сбросит всю шину SCSI. Поскольку команда будет прервана в разумные сроки, мы можем просто вернуть запрос на прерывание как успешно выполненный и пометить прерванный CCB как прерванный (но пока не помечать его как завершённый).
+
+[.programlisting]
+....
+ case HCB_BEING_TRANSFERRED:
+ untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);
+ abort_ccb->ccb_h.timeout_ch =
+ timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);
+ abort_ccb->ccb_h.status = CAM_REQ_ABORTED;
+ /* ask the controller to abort that HCB, then generate
+ * an interrupt and stop
+ */
+ if (signal_hardware_to_abort_hcb_and_stop(hcb) < 0) {
+ /* oops, we missed the race with hardware, this transaction
+ * got off the bus before we aborted it, try again */
+ goto abort_again;
+ }
+
+ break;
+....
+
+Если CCB находится в списке отключенных, то настроить его как запрос прерывания и повторно поставить в начало аппаратной очереди. Сбросить таймаут и сообщить о завершении запроса прерывания.
+
+[.programlisting]
+....
+ case HCB_DISCONNECTED:
+ untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);
+ abort_ccb->ccb_h.timeout_ch =
+ timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);
+ put_abort_message_into_hcb(hcb);
+ put_hcb_at_the_front_of_hardware_queue(hcb);
+ break;
+ }
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ return;
+....
+
+Вот и все, что касается запроса ABORT, хотя есть еще один момент. Поскольку сообщение ABORT очищает все текущие транзакции на LUN, нам необходимо пометить все остальные активные транзакции на этом LUN как прерванные. Это должно быть выполнено в процедуре аппаратного прерывания после того, как транзакция будет прервана.
+
+Реализация прерывания CCB в виде функции может быть довольно хорошей идеей, эта функция может быть повторно использована, если транзакция ввода-вывода превысит время ожидания. Единственное различие будет в том, что для транзакции с истекшим временем ожидания будет возвращён статус CAM_CMD_TIMEOUT. Тогда код в case XPT_ABORT будет небольшим, например:
+
+[.programlisting]
+....
+ case XPT_ABORT:
+ struct ccb *abort_ccb;
+ abort_ccb = ccb->cab.abort_ccb;
+
+ if (abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {
+ ccb->ccb_h.status = CAM_UA_ABORT;
+ xpt_done(ccb);
+ return;
+ }
+ if (xxx_abort_ccb(abort_ccb, CAM_REQ_ABORTED) < 0)
+ /* no such CCB in our queue */
+ ccb->ccb_h.status = CAM_PATH_INVALID;
+ else
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ return;
+....
+
+=== _XPT_SET_TRAN_SETTINGS_ - явно установить значения настроек передачи SCSI
+
+Аргументы передаются в экземпляре "struct ccb_trans_setting cts" объединения ccb:
+
+* _valid_ - битовая маска, показывающая, какие настройки должны быть обновлены:
+** _CCB_TRANS_SYNC_RATE_VALID_ - скорость синхронной передачи
+** _CCB_TRANS_SYNC_OFFSET_VALID_ - синхронное смещение
+** _CCB_TRANS_BUS_WIDTH_VALID_ - ширина шины
+** _CCB_TRANS_DISC_VALID_ - установить разрешение/запрет отключения
+** _CCB_TRANS_TQ_VALID_ - установить разрешение/запрет очередей с тегами
+* _flags_ - состоит из двух частей: бинарных аргументов и идентификации подопераций. Бинарные аргументы:
+** _CCB_TRANS_DISC_ENB_ - разрешить отключение
+** _CCB_TRANS_TAG_ENB_ - разрешить тегированную очередь
+* подоперации:
+** _CCB_TRANS_CURRENT_SETTINGS_ - изменить текущие параметры согласования
+** _CCB_TRANS_USER_SETTINGS_ - сохранять желаемые пользовательские значения sync_period, sync_offset - самоочевидные параметры; если sync_offset==0, то запрашивается асинхронный режим bus_width - ширина шины в битах (не в байтах)
+
+Поддерживаются два набора согласованных параметров: пользовательские настройки и текущие настройки. Пользовательские настройки не так часто используются в драйверах SIM, это в основном просто область памяти, где верхние уровни могут сохранять (и позже извлекать) свои представления о параметрах. Установка пользовательских параметров не вызывает повторного согласования скоростей передачи. Однако, когда SCSI-контроллер выполняет согласование, он никогда не должен устанавливать значения выше пользовательских параметров, так что они по сути являются верхней границей.
+
+Текущие настройки, как следует из названия, являются текущими. Их изменение означает, что параметры должны быть повторно согласованы при следующей передаче. Опять же, эти «новые текущие настройки» не предназначены для принудительного применения к устройству, они лишь используются в качестве начального шага переговоров. Кроме того, они должны быть ограничены реальными возможностями SCSI-контроллера: например, если SCSI-контроллер имеет 8-битную шину, а запрос требует установки 16-битных передач, этот параметр должен быть тихо усечён до 8-битных передач перед отправкой на устройство.
+
+Один нюанс заключается в том, что ширина шины и синхронные параметры относятся к цели, тогда как параметры отключения и включения тегов относятся к логическому устройству LUN.
+
+Рекомендуемая реализация заключается в хранении 3 наборов согласованных параметров (ширина шины и синхронная передача):
+
+* _user_ - пользовательский набор, как указано выше
+* _current_ - тот, который фактически действуют
+* _goal_ - тот набор, который запрошен для установки параметров в качестве "текущих"
+
+Код выглядит следующим образом:
+
+[.programlisting]
+....
+ struct ccb_trans_settings *cts;
+ int targ, lun;
+ int flags;
+
+ cts = &ccb->cts;
+ targ = ccb_h->target_id;
+ lun = ccb_h->target_lun;
+ flags = cts->flags;
+ if (flags & CCB_TRANS_USER_SETTINGS) {
+ if (flags & CCB_TRANS_SYNC_RATE_VALID)
+ softc->user_sync_period[targ] = cts->sync_period;
+ if (flags & CCB_TRANS_SYNC_OFFSET_VALID)
+ softc->user_sync_offset[targ] = cts->sync_offset;
+ if (flags & CCB_TRANS_BUS_WIDTH_VALID)
+ softc->user_bus_width[targ] = cts->bus_width;
+
+ if (flags & CCB_TRANS_DISC_VALID) {
+ softc->user_tflags[targ][lun] &= ~CCB_TRANS_DISC_ENB;
+ softc->user_tflags[targ][lun] |= flags & CCB_TRANS_DISC_ENB;
+ }
+ if (flags & CCB_TRANS_TQ_VALID) {
+ softc->user_tflags[targ][lun] &= ~CCB_TRANS_TQ_ENB;
+ softc->user_tflags[targ][lun] |= flags & CCB_TRANS_TQ_ENB;
+ }
+ }
+ if (flags & CCB_TRANS_CURRENT_SETTINGS) {
+ if (flags & CCB_TRANS_SYNC_RATE_VALID)
+ softc->goal_sync_period[targ] =
+ max(cts->sync_period, OUR_MIN_SUPPORTED_PERIOD);
+ if (flags & CCB_TRANS_SYNC_OFFSET_VALID)
+ softc->goal_sync_offset[targ] =
+ min(cts->sync_offset, OUR_MAX_SUPPORTED_OFFSET);
+ if (flags & CCB_TRANS_BUS_WIDTH_VALID)
+ softc->goal_bus_width[targ] = min(cts->bus_width, OUR_BUS_WIDTH);
+
+ if (flags & CCB_TRANS_DISC_VALID) {
+ softc->current_tflags[targ][lun] &= ~CCB_TRANS_DISC_ENB;
+ softc->current_tflags[targ][lun] |= flags & CCB_TRANS_DISC_ENB;
+ }
+ if (flags & CCB_TRANS_TQ_VALID) {
+ softc->current_tflags[targ][lun] &= ~CCB_TRANS_TQ_ENB;
+ softc->current_tflags[targ][lun] |= flags & CCB_TRANS_TQ_ENB;
+ }
+ }
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ return;
+....
+
+Затем, когда следующий запрос ввода-вывода будет обработан, он проверит, нужно ли повторное согласование, например, вызовом функции target_negotiated(hcb). Это может быть реализовано следующим образом:
+
+[.programlisting]
+....
+ int
+ target_negotiated(struct xxx_hcb *hcb)
+ {
+ struct softc *softc = hcb->softc;
+ int targ = hcb->targ;
+
+ if (softc->current_sync_period[targ] != softc->goal_sync_period[targ]
+ || softc->current_sync_offset[targ] != softc->goal_sync_offset[targ]
+ || softc->current_bus_width[targ] != softc->goal_bus_width[targ])
+ return 0; /* FALSE */
+ else
+ return 1; /* TRUE */
+ }
+....
+
+После пересогласования значений полученные значения должны быть присвоены как текущим, так и целевым параметрам, чтобы для будущих операций ввода-вывода текущие и целевые параметры совпадали, и функция `target_negotiated()` возвращала TRUE. При инициализации карты (в `xxx_attach()`) текущие параметры согласования должны быть инициализированы узким асинхронным режимом, а целевые и текущие значения должны быть инициализированы максимальными значениями, поддерживаемыми контроллером.
+
+=== _XPT_GET_TRAN_SETTINGS_ - получить значения настроек передачи SCSI
+
+Эта операция является обратной XPT_SET_TRAN_SETTINGS. Заполните экземпляр CCB "struct ccb_trans_setting cts" данными, запрошенными флагами CCB_TRANS_CURRENT_SETTINGS или CCB_TRANS_USER_SETTINGS (если установлены оба, существующие драйверы возвращают текущие настройки). Установите все биты в поле valid.
+
+=== _XPT_CALC_GEOMETRY_ - вычислить логическую (BIOS) геометрию диска
+
+Аргументы передаются в экземпляре "struct ccb_calc_geometry ccg" объединения ccb:
+
+* _block_size_ - вход, размер блока (также известный как сектор) в байтах
+* _volume_size_ - вход, размер тома в байтах
+* _cylinders_ - выход, логические цилиндры
+* _heads_ - выход, логические головки
+* _secs_per_track_ - выход, логических секторов на дорожку
+
+Если возвращённая геометрия значительно отличается от той, которую предполагает BIOS SCSI-контроллера, и диск на этом SCSI-контроллере используется как загрузочный, система может не загрузиться. Типичный пример расчёта, взятый из драйвера `aic7xxx`, выглядит следующим образом:
+
+[.programlisting]
+....
+ struct ccb_calc_geometry *ccg;
+ u_int32_t size_mb;
+ u_int32_t secs_per_cylinder;
+ int extended;
+
+ ccg = &ccb->ccg;
+ size_mb = ccg->volume_size
+ / ((1024L * 1024L) / ccg->block_size);
+ extended = check_cards_EEPROM_for_extended_geometry(softc);
+
+ if (size_mb > 1024 && extended) {
+ ccg->heads = 255;
+ ccg->secs_per_track = 63;
+ } else {
+ ccg->heads = 64;
+ ccg->secs_per_track = 32;
+ }
+ secs_per_cylinder = ccg->heads * ccg->secs_per_track;
+ ccg->cylinders = ccg->volume_size / secs_per_cylinder;
+ ccb->ccb_h.status = CAM_REQ_CMP;
+ xpt_done(ccb);
+ return;
+....
+
+Это дает общее представление, точный расчет зависит от особенностей конкретной BIOS. Если BIOS не предоставляет возможности установить флаг "расширенной трансляции" в EEPROM, этот флаг обычно следует считать равным 1. Другие популярные геометрии:
+
+[.programlisting]
+....
+ 128 heads, 63 sectors - Symbios controllers
+ 16 heads, 63 sectors - old controllers
+....
+
+Некоторые системные BIOS и SCSI BIOS конфликтуют друг с другом с переменным успехом. Например, комбинация Symbios 875/895 SCSI и Phoenix BIOS может выдавать геометрию 128/63 после включения питания и 255/63 после жесткого сброса или мягкой перезагрузки.
+
+=== _XPT_PATH_INQ_ - запрос пути, другими словами, получение свойств драйвера SIM и контроллера SCSI (также известного как HBA - Host Bus Adapter)
+
+Свойства возвращаются в экземпляре "struct ccb_pathinq cpi" объединения ccb:
+
+* `version_num` - номер версии драйвера SIM, в настоящее время все драйверы используют 1
+* hba_inquiry - битовая маска функций, поддерживаемых контроллером:
+** PI_MDP_ABLE - поддерживает сообщение MDP (что-то из SCSI3?)
+** PI_WIDE_32 — поддерживает 32-битную широкую SCSI
+** PI_WIDE_16 — поддерживает 16-битную широкую SCSI
+** PI_SDTR_ABLE - может согласовать синхронную скорость передачи
+** PI_LINKED_CDB - поддерживает связанные команды
+** PI_TAG_ABLE - поддерживает помеченные команды
+** PI_SOFT_RST — поддерживает альтернативу мягкого сброса (жесткий сброс и мягкий сброс являются взаимоисключающими в пределах шины SCSI)
+* target_sprt - флаги поддержки целевого режима, 0 если не поддерживается
+* hba_misc - различные функции контроллера:
+** PIM_SCANHILO - сканирование шины от высокого ID к низкому ID
+** PIM_NOREMOVE - съемные устройства не включены в сканирование
+** PIM_NOINITIATOR - роль инициатора не поддерживается
+** PIM_NOBUSRESET - пользователь отключил начальный BUS RESET
+* hba_eng_cnt - загадочное количество движков HBA, что-то связанное со сжатием, в настоящее время всегда устанавливается в 0
+* vuhba_flags - уникальные флаги производителя, в настоящее время не используются
+* max_target - максимальный поддерживаемый идентификатор целевого устройства (7 для 8-битной шины, 15 для 16-битной шины, 127 для Fibre Channel)
+* max_lun - максимально поддерживаемый идентификатор LUN (7 для старых SCSI-контроллеров, 63 для новых)
+* async_flags - битовая маска установленных обработчиков Async, в настоящее время не используется
+* hpath_id - наивысший Path ID в подсистеме, в настоящее время не используется
+* unit_number - номер контроллера, cam_sim_unit(sim)
+* bus_id - номер шины, cam_sim_bus(sim)
+* initiator_id - SCSI ID самого контроллера
+* base_transfer_speed - номинальная скорость передачи в КБ/с для асинхронных узкополосных передач, равна 3300 для SCSI
+* sim_vid - идентификатор производителя драйвера SIM, строка с нулевым окончанием максимальной длины SIM_IDLEN, включая завершающий ноль
+* hba_vid - идентификатор производителя SCSI-контроллера, строка с нулевым окончанием максимальной длины HBA_IDLEN, включая завершающий ноль
+* dev_name - имя драйвера устройства, строка с нулевым окончанием максимальной длины DEV_IDLEN, включая завершающий ноль, эквивалентно cam_sim_name(sim)
+
+Рекомендуемый способ установки строковых полей — использование strncpy, например:
+
+[.programlisting]
+....
+ strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);
+....
+
+После установки значений установите статус в CAM_REQ_CMP и пометьте CCB как завершённый.
+
+[[scsi-polling]]
+== Опрос xxx_poll
+
+[.programlisting]
+....
+static void xxx_poll(struct cam_sim *);
+....
+
+Функция poll используется для имитации прерываний, когда подсистема прерываний не функционирует (например, когда система аварийно завершила работу и создает дамп памяти). Подсистема CAM устанавливает соответствующий уровень прерывания перед вызовом процедуры poll. Таким образом, все, что ей нужно сделать, — это вызвать процедуру прерывания (или наоборот, процедура poll может выполнять реальные действия, а процедура прерывания просто вызывает процедуру poll). Зачем тогда нужна отдельная функция? Это связано с различными соглашениями о вызовах. Процедура `xxx_poll` получает указатель на структуру cam_sim в качестве аргумента, в то время как процедура прерывания PCI по общему соглашению получает указатель на структуру `xxx_softc`, а процедура прерывания ISA получает только номер устройства. Таким образом, процедура poll обычно выглядит следующим образом:
+
+[.programlisting]
+....
+static void
+xxx_poll(struct cam_sim *sim)
+{
+ xxx_intr((struct xxx_softc *)cam_sim_softc(sim)); /* for PCI device */
+}
+....
+
+или
+
+[.programlisting]
+....
+static void
+xxx_poll(struct cam_sim *sim)
+{
+ xxx_intr(cam_sim_unit(sim)); /* for ISA device */
+}
+....
+
+[[scsi-async]]
+== Асинхронные события
+
+Если была настроена асинхронная callback-функция для события, то callback-функция должна быть определена.
+
+[.programlisting]
+....
+static void
+ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)
+....
+
+* callback_arg - значение, переданное при регистрации callback
+* code - определяет тип события
+* path - определяет устройства, к которым применяется событие
+* arg - аргумент, специфичный для события
+
+Реализация для одного типа события, AC_LOST_DEVICE, выглядит следующим образом:
+
+[.programlisting]
+....
+ struct xxx_softc *softc;
+ struct cam_sim *sim;
+ int targ;
+ struct ccb_trans_settings neg;
+
+ sim = (struct cam_sim *)callback_arg;
+ softc = (struct xxx_softc *)cam_sim_softc(sim);
+ switch (code) {
+ case AC_LOST_DEVICE:
+ targ = xpt_path_target_id(path);
+ if (targ <= OUR_MAX_SUPPORTED_TARGET) {
+ clean_negotiations(softc, targ);
+ /* send indication to CAM */
+ neg.bus_width = 8;
+ neg.sync_period = neg.sync_offset = 0;
+ neg.valid = (CCB_TRANS_BUS_WIDTH_VALID
+ | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);
+ xpt_async(AC_TRANSFER_NEG, path, &neg);
+ }
+ break;
+ default:
+ break;
+ }
+....
+
+[[scsi-interrupts]]
+== Прерывания
+
+Точный тип процедуры прерывания зависит от типа периферийной шины (PCI, ISA и так далее), к которой подключен SCSI-контроллер.
+
+Прерывания в драйверах SIM выполняются на уровне прерывания splcam. Поэтому в драйвере следует использовать `splcam()` для синхронизации между обработчиком прерывания и остальной частью драйвера (для драйверов, учитывающих многопроцессорность, ситуация становится ещё сложнее, но здесь мы этот случай не рассматриваем). Псевдокод в этом документе беззаботно игнорирует проблемы синхронизации. Реальный код так делать не должен. Простейший подход — установить `splcam()` при входе в другие функции и сбросить при выходе, защищая их одной большой критической секцией. Чтобы гарантировать восстановление уровня прерывания, можно определить обёрточную функцию, например:
+
+[.programlisting]
+....
+ static void
+ xxx_action(struct cam_sim *sim, union ccb *ccb)
+ {
+ int s;
+ s = splcam();
+ xxx_action1(sim, ccb);
+ splx(s);
+ }
+
+ static void
+ xxx_action1(struct cam_sim *sim, union ccb *ccb)
+ {
+ ... process the request ...
+ }
+....
+
+Этот подход прост и надежен, но проблема в том, что прерывания могут блокироваться на относительно долгое время, что негативно скажется на производительности системы. С другой стороны, функции семейства `spl()` имеют довольно высокие накладные расходы, поэтому большое количество мелких критических секций также может быть нежелательным.
+
+Условия, обрабатываемые процедурой прерывания, и детали сильно зависят от оборудования. Мы рассматриваем набор "типичных" условий.
+
+Сначала проверяем, было ли на шине событие SCSI сброса (вероятно, вызванное другим SCSI-контроллером на той же SCSI-шине). Если это так, мы отменяем все поставленные в очередь и отключенные запросы, сообщаем о событиях и повторно инициализируем наш SCSI-контроллер. Важно, чтобы во время этой инициализации контроллер не инициировал ещё один сброс, иначе два контроллера на одной SCSI-шине могут бесконечно обмениваться сбросами. Случай фатальной ошибки/зависания контроллера может быть обработан в том же месте, но, вероятно, также потребуется отправка сигнала RESET на SCSI-шину для сброса состояния соединений с SCSI-устройствами.
+
+[.programlisting]
+....
+ int fatal=0;
+ struct ccb_trans_settings neg;
+ struct cam_path *path;
+
+ if (detected_scsi_reset(softc)
+ || (fatal = detected_fatal_controller_error(softc))) {
+ int targ, lun;
+ struct xxx_hcb *h, *hh;
+
+ /* drop all enqueued CCBs */
+ for(h = softc->first_queued_hcb; h != NULL; h = hh) {
+ hh = h->next;
+ free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
+ }
+
+ /* the clean values of negotiations to report */
+ neg.bus_width = 8;
+ neg.sync_period = neg.sync_offset = 0;
+ neg.valid = (CCB_TRANS_BUS_WIDTH_VALID
+ | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);
+
+ /* drop all disconnected CCBs and clean negotiations */
+ for (targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {
+ clean_negotiations(softc, targ);
+
+ /* report the event if possible */
+ if (xpt_create_path(&path, /*periph*/NULL,
+ cam_sim_path(sim), targ,
+ CAM_LUN_WILDCARD) == CAM_REQ_CMP) {
+ xpt_async(AC_TRANSFER_NEG, path, &neg);
+ xpt_free_path(path);
+ }
+
+ for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)
+ for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {
+ hh=h->next;
+ if (fatal)
+ free_hcb_and_ccb_done(h, h->ccb, CAM_UNREC_HBA_ERROR);
+ else
+ free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
+ }
+ }
+
+ /* report the event */
+ xpt_async(AC_BUS_RESET, softc->wpath, NULL);
+
+ /* re-initialization may take a lot of time, in such case
+ * its completion should be signaled by another interrupt or
+ * checked on timeout - but for simplicity we assume here that
+ * it is really fast
+ */
+ if (!fatal) {
+ reinitialize_controller_without_scsi_reset(softc);
+ } else {
+ reinitialize_controller_with_scsi_reset(softc);
+ }
+ schedule_next_hcb(softc);
+ return;
+ }
+....
+
+Если прерывание не вызвано условием, общим для всего контроллера, то, вероятно, что-то произошло с текущим блоком управления аппаратным обеспечением. В зависимости от оборудования могут быть и другие события, не связанные с HCB, но мы их здесь не рассматриваем. Затем мы анализируем, что произошло с этим HCB:
+
+[.programlisting]
+....
+ struct xxx_hcb *hcb, *h, *hh;
+ int hcb_status, scsi_status;
+ int ccb_status;
+ int targ;
+ int lun_to_freeze;
+
+ hcb = get_current_hcb(softc);
+ if (hcb == NULL) {
+ /* either stray interrupt or something went very wrong
+ * or this is something hardware-dependent
+ */
+ handle as necessary;
+ return;
+ }
+
+ targ = hcb->target;
+ hcb_status = get_status_of_current_hcb(softc);
+....
+
+Сначала мы проверяем, завершился ли HCB, и если да, то проверяем возвращённый статус SCSI.
+
+[.programlisting]
+....
+ if (hcb_status == COMPLETED) {
+ scsi_status = get_completion_status(hcb);
+....
+
+Затем проверьте, связан ли этот статус с командой REQUEST SENSE, и если да, обработайте его простым способом.
+
+[.programlisting]
+....
+ if (hcb->flags & DOING_AUTOSENSE) {
+ if (scsi_status == GOOD) { /* autosense was successful */
+ hcb->ccb->ccb_h.status |= CAM_AUTOSNS_VALID;
+ free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);
+ } else {
+ autosense_failed:
+ free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_AUTOSENSE_FAIL);
+ }
+ schedule_next_hcb(softc);
+ return;
+ }
+....
+
+Иначе сама команда завершена, уделяйте больше внимания деталям. Если автоопределение не отключено для этого CCB и команда завершилась неудачно с данными состояния, выполните команду REQUEST SENSE для получения этих данных.
+
+[.programlisting]
+....
+ hcb->ccb->csio.scsi_status = scsi_status;
+ calculate_residue(hcb);
+
+ if ((hcb->ccb->ccb_h.flags & CAM_DIS_AUTOSENSE)==0
+ && (scsi_status == CHECK_CONDITION
+ || scsi_status == COMMAND_TERMINATED)) {
+ /* start auto-SENSE */
+ hcb->flags |= DOING_AUTOSENSE;
+ setup_autosense_command_in_hcb(hcb);
+ restart_current_hcb(softc);
+ return;
+ }
+ if (scsi_status == GOOD)
+ free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_REQ_CMP);
+ else
+ free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);
+ schedule_next_hcb(softc);
+ return;
+ }
+....
+
+Типичным примером могут быть события согласования: сообщения согласования, полученные от цели SCSI (в ответ на нашу попытку согласования или по инициативе цели), или если цель не может согласовать (отклоняет наши сообщения согласования или не отвечает на них).
+
+[.programlisting]
+....
+ switch (hcb_status) {
+ case TARGET_REJECTED_WIDE_NEG:
+ /* revert to 8-bit bus */
+ softc->current_bus_width[targ] = softc->goal_bus_width[targ] = 8;
+ /* report the event */
+ neg.bus_width = 8;
+ neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
+ xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);
+ continue_current_hcb(softc);
+ return;
+ case TARGET_ANSWERED_WIDE_NEG:
+ {
+ int wd;
+
+ wd = get_target_bus_width_request(softc);
+ if (wd <= softc->goal_bus_width[targ]) {
+ /* answer is acceptable */
+ softc->current_bus_width[targ] =
+ softc->goal_bus_width[targ] = neg.bus_width = wd;
+
+ /* report the event */
+ neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
+ xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);
+ } else {
+ prepare_reject_message(hcb);
+ }
+ }
+ continue_current_hcb(softc);
+ return;
+ case TARGET_REQUESTED_WIDE_NEG:
+ {
+ int wd;
+
+ wd = get_target_bus_width_request(softc);
+ wd = min (wd, OUR_BUS_WIDTH);
+ wd = min (wd, softc->user_bus_width[targ]);
+
+ if (wd != softc->current_bus_width[targ]) {
+ /* the bus width has changed */
+ softc->current_bus_width[targ] =
+ softc->goal_bus_width[targ] = neg.bus_width = wd;
+
+ /* report the event */
+ neg.valid = CCB_TRANS_BUS_WIDTH_VALID;
+ xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);
+ }
+ prepare_width_nego_rsponse(hcb, wd);
+ }
+ continue_current_hcb(softc);
+ return;
+ }
+....
+
+Затем мы обрабатываем любые ошибки, которые могли произойти во время автоопределения, тем же простым способом, что и раньше. В противном случае мы снова внимательно изучаем детали.
+
+[.programlisting]
+....
+ if (hcb->flags & DOING_AUTOSENSE)
+ goto autosense_failed;
+
+ switch (hcb_status) {
+....
+
+Следующее событие, которое мы рассматриваем, — это неожиданное отключение. Оно считается нормальным после сообщения ABORT или BUS DEVICE RESET и аномальным в остальных случаях.
+
+[.programlisting]
+....
+ case UNEXPECTED_DISCONNECT:
+ if (requested_abort(hcb)) {
+ /* abort affects all commands on that target+LUN, so
+ * mark all disconnected HCBs on that target+LUN as aborted too
+ */
+ for (h = softc->first_discon_hcb[hcb->target][hcb->lun];
+ h != NULL; h = hh) {
+ hh=h->next;
+ free_hcb_and_ccb_done(h, h->ccb, CAM_REQ_ABORTED);
+ }
+ ccb_status = CAM_REQ_ABORTED;
+ } else if (requested_bus_device_reset(hcb)) {
+ int lun;
+
+ /* reset affects all commands on that target, so
+ * mark all disconnected HCBs on that target+LUN as reset
+ */
+
+ for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)
+ for (h = softc->first_discon_hcb[hcb->target][lun];
+ h != NULL; h = hh) {
+ hh=h->next;
+ free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);
+ }
+
+ /* send event */
+ xpt_async(AC_SENT_BDR, hcb->ccb->ccb_h.path_id, NULL);
+
+ /* this was the CAM_RESET_DEV request itself, it is completed */
+ ccb_status = CAM_REQ_CMP;
+ } else {
+ calculate_residue(hcb);
+ ccb_status = CAM_UNEXP_BUSFREE;
+ /* request the further code to freeze the queue */
+ hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
+ lun_to_freeze = hcb->lun;
+ }
+ break;
+....
+
+Если цель отказывается принимать теги, мы уведомляем CAM об этом и возвращаем все команды для этого LUN:
+
+[.programlisting]
+....
+ case TAGS_REJECTED:
+ /* report the event */
+ neg.flags = 0 & ~CCB_TRANS_TAG_ENB;
+ neg.valid = CCB_TRANS_TQ_VALID;
+ xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);
+
+ ccb_status = CAM_MSG_REJECT_REC;
+ /* request the further code to freeze the queue */
+ hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
+ lun_to_freeze = hcb->lun;
+ break;
+....
+
+Затем мы проверяем ряд других условий, при этом обработка в основном ограничивается установкой статуса CCB:
+
+[.programlisting]
+....
+ case SELECTION_TIMEOUT:
+ ccb_status = CAM_SEL_TIMEOUT;
+ /* request the further code to freeze the queue */
+ hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
+ lun_to_freeze = CAM_LUN_WILDCARD;
+ break;
+ case PARITY_ERROR:
+ ccb_status = CAM_UNCOR_PARITY;
+ break;
+ case DATA_OVERRUN:
+ case ODD_WIDE_TRANSFER:
+ ccb_status = CAM_DATA_RUN_ERR;
+ break;
+ default:
+ /* all other errors are handled in a generic way */
+ ccb_status = CAM_REQ_CMP_ERR;
+ /* request the further code to freeze the queue */
+ hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;
+ lun_to_freeze = CAM_LUN_WILDCARD;
+ break;
+ }
+....
+
+Затем мы проверяем, была ли ошибка достаточно серьёзной, чтобы заморозить очередь ввода до её обработки, и если да, то делаем это:
+
+[.programlisting]
+....
+ if (hcb->ccb->ccb_h.status & CAM_DEV_QFRZN) {
+ /* freeze the queue */
+ xpt_freeze_devq(ccb->ccb_h.path, /*count*/1);
+
+ /* re-queue all commands for this target/LUN back to CAM */
+
+ for (h = softc->first_queued_hcb; h != NULL; h = hh) {
+ hh = h->next;
+
+ if (targ == h->targ
+ && (lun_to_freeze == CAM_LUN_WILDCARD || lun_to_freeze == h->lun))
+ free_hcb_and_ccb_done(h, h->ccb, CAM_REQUEUE_REQ);
+ }
+ }
+ free_hcb_and_ccb_done(hcb, hcb->ccb, ccb_status);
+ schedule_next_hcb(softc);
+ return;
+....
+
+На этом общее описание обработки прерываний завершается, хотя для некоторых контроллеров могут потребоваться дополнительные действия.
+
+[[scsi-errors]]
+== Ошибки (Сводка)
+
+При выполнении запроса ввода-вывода может произойти множество ошибок. Причина ошибки может быть указана в статусе CCB с большим количеством деталей. Примеры использования разбросаны по всему документу. Для полноты изложения приведём сводку рекомендуемых действий при типичных ошибках:
+
+* _CAM_RESRC_UNAVAIL_ — некоторый ресурс временно недоступен, и драйвер SIM не может сгенерировать событие, когда он станет доступен. Примером такого ресурса может быть некоторый внутренний аппаратный ресурс контроллера, для которого контроллер не генерирует прерывание при его доступности.
+* _CAM_UNCOR_PARITY_ - произошла неисправимая ошибка четности
+* _CAM_DATA_RUN_ERR_ - переполнение данных или неожиданная фаза данных (направление передачи не соответствует указанному в CAM_DIR_MASK) или нечётная длина передачи для широкой передачи
+* _CAM_SEL_TIMEOUT_ - произошел таймаут выбора (цель не отвечает)
+* _CAM_CMD_TIMEOUT_ - произошло превышение времени ожидания команды (сработала функция таймаута)
+* _CAM_SCSI_STATUS_ERROR_ - устройство вернуло ошибку
+* _CAM_AUTOSENSE_FAIL_ - устройство вернуло ошибку и команда REQUEST SENSE завершилась неудачно
+* _CAM_MSG_REJECT_REC_ - получено сообщение MESSAGE REJECT
+* _CAM_SCSI_BUS_RESET_ - получен сброс шины SCSI
+* _CAM_REQ_CMP_ERR_ - произошла «невозможная» фаза SCSI или что-то столь же странное, либо это просто общая ошибка, если дополнительная информация недоступна
+* _CAM_UNEXP_BUSFREE_ - произошло неожиданное отключение
+* _CAM_BDR_SENT_ - Сообщение BUS DEVICE RESET было отправлено целевому устройству
+* _CAM_UNREC_HBA_ERROR_ - невосстановимая ошибка адаптера шины хоста
+* _CAM_REQ_TOO_BIG_ - запрос слишком велик для данного контроллера
+* _CAM_REQUEUE_REQ_ - этот запрос должен быть повторно поставлен в очередь для сохранения порядка транзакций. Обычно это происходит, когда SIM обнаруживает ошибку, которая должна заморозить очередь, и необходимо поместить другие запросы в очереди для цели на уровне SIM обратно в очередь XPT. Типичными случаями таких ошибок являются тайм-ауты выбора, тайм-ауты команд и другие подобные условия. В таких случаях проблемная команда возвращает статус, указывающий на ошибку, а другие команды, которые ещё не были отправлены на шину, повторно ставятся в очередь.
+* _CAM_LUN_INVALID_ - идентификатор LUN в запросе не поддерживается контроллером SCSI
+* _CAM_TID_INVALID_ - идентификатор целевого устройства в запросе не поддерживается контроллером SCSI
+
+[[scsi-timeout]]
+== Обработка таймаутов
+
+Когда время ожидания для HCB истекает, этот запрос должен быть прерван, как и в случае с запросом XPT_ABORT. Единственное отличие заключается в том, что возвращаемый статус прерванного запроса должен быть CAM_CMD_TIMEOUT вместо CAM_REQ_ABORTED (вот почему реализацию прерывания лучше сделать в виде функции). Но есть ещё одна возможная проблема: что если сам запрос на прерывание зависнет? В этом случае шина SCSI должна быть сброшена, как и при запросе XPT_RESET_BUS (и идея о реализации этого в виде функции, вызываемой из обоих мест, применима и здесь). Также мы должны сбросить всю шину SCSI, если запрос на сброс устройства завис. В итоге функция обработки таймаута будет выглядеть следующим образом:
+
+[.programlisting]
+....
+static void
+xxx_timeout(void *arg)
+{
+ struct xxx_hcb *hcb = (struct xxx_hcb *)arg;
+ struct xxx_softc *softc;
+ struct ccb_hdr *ccb_h;
+
+ softc = hcb->softc;
+ ccb_h = &hcb->ccb->ccb_h;
+
+ if (hcb->flags & HCB_BEING_ABORTED || ccb_h->func_code == XPT_RESET_DEV) {
+ xxx_reset_bus(softc);
+ } else {
+ xxx_abort_ccb(hcb->ccb, CAM_CMD_TIMEOUT);
+ }
+}
+....
+
+Когда мы прерываем запрос, все остальные отключенные запросы к тому же целевому устройству/LUN также прерываются. Возникает вопрос: следует ли возвращать их со статусом CAM_REQ_ABORTED или CAM_CMD_TIMEOUT? Текущие драйверы используют CAM_CMD_TIMEOUT. Это кажется логичным, потому что если один запрос превысил время ожидания, то, вероятно, с устройством происходит что-то действительно плохое, и если их не трогать, они бы сами превысили время ожидания.
diff --git a/documentation/content/ru/books/arch-handbook/scsi/_index.po b/documentation/content/ru/books/arch-handbook/scsi/_index.po
new file mode 100644
index 0000000000..c992ac0b4e
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/scsi/_index.po
@@ -0,0 +1,4280 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-07-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookscsi_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:14
+#, no-wrap
+msgid "Common Access Method SCSI Controllers"
+msgstr "Контроллеры SCSI с общим методом доступа (CAM)"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1
+#, no-wrap
+msgid "Chapter 12. Common Access Method SCSI Controllers"
+msgstr "Глава 12. Контроллеры SCSI с общим методом доступа (CAM)"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:52
+#, no-wrap
+msgid "Synopsis"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:56
+msgid ""
+"This document assumes that the reader has a general understanding of device "
+"drivers in FreeBSD and of the SCSI protocol. Much of the information in "
+"this document was extracted from the drivers:"
+msgstr ""
+"Этот документ предполагает, что читатель имеет общее представление о "
+"драйверах устройств в FreeBSD и о протоколе SCSI. Большая часть информации в "
+"этом документе была извлечена из драйверов:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:58
+msgid ""
+"ncr ([.filename]#/sys/pci/ncr.c#) by Wolfgang Stanglmeier and Stefan Esser"
+msgstr ""
+"ncr ([.filename]#/sys/pci/ncr.c#) от Wolfgang Stanglmeier и Stefan Esser"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:59
+msgid "sym ([.filename]#/sys/dev/sym/sym_hipd.c#) by Gerard Roudier"
+msgstr "sym ([.filename]#/sys/dev/sym/sym_hipd.c#) от Gerard Roudier"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:60
+msgid "aic7xxx ([.filename]#/sys/dev/aic7xxx/aic7xxx.c#) by Justin T. Gibbs"
+msgstr "aic7xxx ([.filename]#/sys/dev/aic7xxx/aic7xxx.c#) от Justin T. Gibbs"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:63
+msgid ""
+"and from the CAM code itself (by Justin T. Gibbs, see [.filename]#/sys/cam/"
+"*#). When some solution looked the most logical and was essentially "
+"verbatim extracted from the code by Justin T. Gibbs, I marked it as "
+"\"recommended\"."
+msgstr ""
+"и из самого кода CAM (автор Justin T. Gibbs, см. [.filename]#/sys/cam/*#). "
+"Когда какое-то решение выглядело наиболее логичным и было практически "
+"дословно взято из кода Justin T. Gibbs, я отмечал его как \"рекомендуемое\"."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:71
+msgid ""
+"The document is illustrated with examples in pseudo-code. Although "
+"sometimes the examples have many details and look like real code, it is "
+"still pseudo-code. It was written to demonstrate the concepts in an "
+"understandable way. For a real driver other approaches may be more modular "
+"and efficient. It also abstracts from the hardware details, as well as "
+"issues that would cloud the demonstrated concepts or that are supposed to be "
+"described in the other chapters of the developers handbook. Such details "
+"are commonly shown as calls to functions with descriptive names, comments or "
+"pseudo-statements. Fortunately real life full-size examples with all the "
+"details can be found in the real drivers."
+msgstr ""
+"Документ иллюстрирован примерами на псевдокоде. Хотя иногда примеры содержат "
+"много деталей и выглядят как настоящий код, это всё ещё псевдокод. Он был "
+"написан, чтобы продемонстрировать концепции в понятной форме. Для реального "
+"драйвера могут быть более модульные и эффективные подходы. Также он "
+"абстрагируется от деталей оборудования, а также от вопросов, которые могли "
+"бы затмить демонстрируемые концепции или которые предполагается описать в "
+"других главах руководства разработчика. Такие детали обычно показаны в виде "
+"вызовов функций с описательными именами, комментариев или псевдооператоров. "
+"К счастью, полные примеры из реальной жизни со всеми деталями можно найти в "
+"реальных драйверах."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:73
+#, no-wrap
+msgid "General Architecture"
+msgstr "Общая Архитектура"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:79
+msgid ""
+"CAM stands for Common Access Method. It is a generic way to address the I/O "
+"buses in a SCSI-like way. This allows a separation of the generic device "
+"drivers from the drivers controlling the I/O bus: for example the disk "
+"driver becomes able to control disks on both SCSI, IDE, and/or any other bus "
+"so the disk driver portion does not have to be rewritten (or copied and "
+"modified) for every new I/O bus. Thus the two most important active "
+"entities are:"
+msgstr ""
+"CAM означает Common Access Method (Общий Метод Доступа). Это универсальный "
+"способ адресации шин ввода-вывода в стиле SCSI. Это позволяет отделить общие "
+"драйверы устройств от драйверов, управляющих шиной ввода-вывода: например, "
+"драйвер диска получает возможность управлять дисками как на SCSI, IDE, так и "
+"на любой другой шине, так что часть драйвера диска не нужно переписывать "
+"(или копировать и изменять) для каждой новой шины ввода-вывода. Таким "
+"образом, двумя наиболее важными активными сущностями являются:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:81
+msgid ""
+"_Peripheral Modules_ - a driver for peripheral devices (disk, tape, CD-ROM, "
+"etc.)"
+msgstr ""
+"_Модули периферийных устройств_ - драйвер для периферийных устройств (диски, "
+"ленты, CD-ROM и т.д.)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:82
+msgid ""
+"_SCSI Interface Modules_ (SIM) - a Host Bus Adapter drivers for connecting "
+"to an I/O bus such as SCSI or IDE."
+msgstr ""
+"_Модули интерфейса SCSI_ (SIM) - драйверы адаптеров шины для подключения к "
+"шине ввода-вывода, такой как SCSI или IDE."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:85
+msgid ""
+"A peripheral driver receives requests from the OS, converts them to a "
+"sequence of SCSI commands and passes these SCSI commands to a SCSI Interface "
+"Module. The SCSI Interface Module is responsible for passing these commands "
+"to the actual hardware (or if the actual hardware is not SCSI but, for "
+"example, IDE then also converting the SCSI commands to the native commands "
+"of the hardware)."
+msgstr ""
+"Периферийный драйвер получает запросы от ОС, преобразует их в "
+"последовательность команд SCSI и передает эти команды SCSI модулю интерфейса "
+"SCSI. Модуль интерфейса SCSI отвечает за передачу этих команд реальному "
+"оборудованию (или, если оборудование не поддерживает SCSI, а использует, "
+"например, IDE, также преобразует команды SCSI в собственные команды "
+"оборудования)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:87
+msgid ""
+"As we are interested in writing a SCSI adapter driver here, from this point "
+"on we will consider everything from the SIM standpoint."
+msgstr ""
+"Так как мы заинтересованы в написании драйвера адаптера SCSI, с этого "
+"момента мы будем рассматривать всё с точки зрения модуля SCSI-интерфейса "
+"(SIM)."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:88
+#, no-wrap
+msgid "Globals and Boilerplate"
+msgstr "Глобальные переменные и Шаблонный код"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:91
+msgid ""
+"A typical SIM driver needs to include the following CAM-related header files:"
+msgstr ""
+"Типичный драйвер SIM должен включать следующие заголовочные файлы, связанные "
+"с CAM:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:100
+#, no-wrap
+msgid ""
+"#include <cam/cam.h>\n"
+"#include <cam/cam_ccb.h>\n"
+"#include <cam/cam_sim.h>\n"
+"#include <cam/cam_xpt_sim.h>\n"
+"#include <cam/cam_debug.h>\n"
+"#include <cam/scsi/scsi_all.h>\n"
+msgstr ""
+"#include <cam/cam.h>\n"
+"#include <cam/cam_ccb.h>\n"
+"#include <cam/cam_sim.h>\n"
+"#include <cam/cam_xpt_sim.h>\n"
+"#include <cam/cam_debug.h>\n"
+"#include <cam/scsi/scsi_all.h>\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:102
+#, no-wrap
+msgid "Device configuration: xxx_attach"
+msgstr "Конфигурация устройства: xxx_attach"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:107
+msgid ""
+"The first thing each SIM driver must do is register itself with the CAM "
+"subsystem. This is done during the driver's `xxx_attach()` function (here "
+"and further xxx_ is used to denote the unique driver name prefix). The "
+"`xxx_attach()` function itself is called by the system bus auto-"
+"configuration code which we do not describe here."
+msgstr ""
+"Первое, что должен сделать каждый драйвер SIM, — это зарегистрироваться в "
+"подсистеме CAM. Это выполняется в функции `xxx_attach()` драйвера (здесь и "
+"далее xxx_ используется для обозначения уникального префикса имени "
+"драйвера). Сама функция `xxx_attach()` вызывается кодом автонастройки "
+"системной шины, который мы здесь не описываем."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:109
+msgid ""
+"This is achieved in multiple steps: first it is necessary to allocate the "
+"queue of requests associated with this SIM:"
+msgstr ""
+"Это достигается в несколько этапов: сначала необходимо выделить очередь "
+"запросов, связанных с этой SIM:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:113
+#, no-wrap
+msgid " struct cam_devq *devq;\n"
+msgstr " struct cam_devq *devq;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:117
+#, no-wrap
+msgid ""
+" if ((devq = cam_simq_alloc(SIZE)) == NULL) {\n"
+" error; /* some code to handle the error */\n"
+" }\n"
+msgstr ""
+" if ((devq = cam_simq_alloc(SIZE)) == NULL) {\n"
+" error; /* some code to handle the error */\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:122
+msgid ""
+"Here `SIZE` is the size of the queue to be allocated, maximal number of "
+"requests it could contain. It is the number of requests that the SIM driver "
+"can handle in parallel on one SCSI card. Commonly it can be calculated as:"
+msgstr ""
+"Вот `SIZE` — это размер выделяемой очереди, максимальное количество "
+"запросов, которые она может содержать. Это количество запросов, которые "
+"драйвер SIM может обрабатывать параллельно на одной SCSI-карте. Обычно его "
+"можно вычислить как:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:126
+#, no-wrap
+msgid "SIZE = NUMBER_OF_SUPPORTED_TARGETS * MAX_SIMULTANEOUS_COMMANDS_PER_TARGET\n"
+msgstr "SIZE = NUMBER_OF_SUPPORTED_TARGETS * MAX_SIMULTANEOUS_COMMANDS_PER_TARGET\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:129
+msgid "Next we create a descriptor of our SIM:"
+msgstr "Далее мы создаем описание нашего SIM:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:133
+#, no-wrap
+msgid " struct cam_sim *sim;\n"
+msgstr " struct cam_sim *sim;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:140
+#, no-wrap
+msgid ""
+" if ((sim = cam_sim_alloc(action_func, poll_func, driver_name,\n"
+" softc, unit, mtx, max_dev_transactions,\n"
+" max_tagged_dev_transactions, devq)) == NULL) {\n"
+" cam_simq_free(devq);\n"
+" error; /* some code to handle the error */\n"
+" }\n"
+msgstr ""
+" if ((sim = cam_sim_alloc(action_func, poll_func, driver_name,\n"
+" softc, unit, mtx, max_dev_transactions,\n"
+" max_tagged_dev_transactions, devq)) == NULL) {\n"
+" cam_simq_free(devq);\n"
+" error; /* some code to handle the error */\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:143
+msgid ""
+"Note that if we are not able to create a SIM descriptor we free the `devq` "
+"also because we can do nothing else with it and we want to conserve memory."
+msgstr ""
+"Обратите внимание, что если мы не сможем создать дескриптор SIM, мы также "
+"освобождаем `devq`, потому что больше ничего не можем с ним сделать и хотим "
+"сэкономить память."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:145
+msgid ""
+"If a SCSI card has multiple SCSI buses on it then each bus requires its own "
+"`cam_sim` structure."
+msgstr ""
+"Если SCSI-карта имеет несколько шин SCSI, то каждой шине требуется "
+"собственная структура `cam_sim`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:148
+msgid ""
+"An interesting question is what to do if a SCSI card has more than one SCSI "
+"bus, do we need one `devq` structure per card or per SCSI bus? The answer "
+"given in the comments to the CAM code is: either way, as the driver's author "
+"prefers."
+msgstr ""
+"Интересный вопрос: что делать, если SCSI-карта имеет более одной SCSI-шины, "
+"нужна ли одна структура `devq` на карту или на SCSI-шину? Ответ, приведённый "
+"в комментариях к коду CAM, таков: как угодно, на усмотрение автора драйвера."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:150
+msgid "The arguments are:"
+msgstr "Аргументы:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:152
+msgid "`action_func` - pointer to the driver's `xxx_action` function."
+msgstr "`action_func` - указатель на функцию `xxx_action` драйвера."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:156
+#, no-wrap
+msgid "static void xxx_action(struct cam_sim *, union ccb *);\n"
+msgstr "static void xxx_action(struct cam_sim *, union ccb *);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:158
+msgid "`poll_func` - pointer to the driver's `xxx_poll()`"
+msgstr "`poll_func` - указатель на функцию `xxx_poll()` драйвера"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:162
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1020
+#, no-wrap
+msgid "static void xxx_poll(struct cam_sim *);\n"
+msgstr "static void xxx_poll(struct cam_sim *);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:164
+msgid ""
+"driver_name - the name of the actual driver, such as \"ncr\" or \"wds\"."
+msgstr "`driver_name` — имя фактического драйвера, например `ncr` или `wds`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:166
+msgid ""
+"`softc` - pointer to the driver's internal descriptor for this SCSI card. "
+"This pointer will be used by the driver in future to get private data."
+msgstr ""
+"`softc` — указатель на внутренний дескриптор драйвера для данной SCSI-карты. "
+"Этот указатель будет использоваться драйвером в дальнейшем для получения "
+"приватных данных."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:167
+msgid ""
+"unit - the controller unit number, for example for controller \"mps0\" this "
+"number will be 0"
+msgstr ""
+"unit - номер управляющего устройства, например, для контроллера \"mps0\" это "
+"число будет 0"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:171
+msgid ""
+"mtx - Lock associated with this SIM. For SIMs that don't know about "
+"locking, pass in Giant. For SIMs that do, pass in the lock used to guard "
+"this SIM's data structures. This lock will be held when xxx_action and "
+"xxx_poll are called."
+msgstr ""
+"mtx - Блокировка, связанная с данной SIM. Для SIM, которые не поддерживают "
+"блокировку, передается Giant. Для SIM, которые поддерживают, передается "
+"блокировка, используемая для защиты структур данных этой SIM. Эта блокировка "
+"будет удерживаться при вызовах xxx_action и xxx_poll."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:174
+msgid ""
+"max_dev_transactions - maximal number of simultaneous transactions per SCSI "
+"target in the non-tagged mode. This value will be almost universally equal "
+"to 1, with possible exceptions only for the non-SCSI cards. Also the "
+"drivers that hope to take advantage by preparing one transaction while "
+"another one is executed may set it to 2 but this does not seem to be worth "
+"the complexity."
+msgstr ""
+"max_dev_transactions - максимальное количество одновременных транзакций на "
+"целевом SCSI-устройстве в режиме без тегов. Это значение почти всегда равно "
+"1, за исключением возможных исключений только для не-SCSI карт. Также "
+"драйверы, которые надеются получить преимущество, подготавливая одну "
+"транзакцию во время выполнения другой, могут установить его в 2, но это не "
+"кажется оправданным из-за сложности."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:179
+msgid ""
+"max_tagged_dev_transactions - the same thing, but in the tagged mode. Tags "
+"are the SCSI way to initiate multiple transactions on a device: each "
+"transaction is assigned a unique tag and the transaction is sent to the "
+"device. When the device completes some transaction it sends back the result "
+"together with the tag so that the SCSI adapter (and the driver) can tell "
+"which transaction was completed. This argument is also known as the maximal "
+"tag depth. It depends on the abilities of the SCSI adapter."
+msgstr ""
+"max_tagged_dev_transactions - то же самое, но в режиме с тегами. Теги — это "
+"способ в SCSI инициировать несколько транзакций на устройстве: каждая "
+"транзакция получает уникальный тег и отправляется на устройство. Когда "
+"устройство завершает транзакцию, оно возвращает результат вместе с тегом, "
+"чтобы SCSI-адаптер (и драйвер) могли определить, какая транзакция была "
+"завершена. Этот аргумент также известен как максимальная глубина тега. Он "
+"зависит от возможностей SCSI-адаптера."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:181
+msgid "Finally we register the SCSI buses associated with our SCSI adapter:"
+msgstr "Наконец, мы регистрируем шины SCSI, связанные с нашим SCSI-адаптером:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:188
+#, no-wrap
+msgid ""
+" if (xpt_bus_register(sim, softc, bus_number) != CAM_SUCCESS) {\n"
+" cam_sim_free(sim, /*free_devq*/ TRUE);\n"
+" error; /* some code to handle the error */\n"
+" }\n"
+msgstr ""
+" if (xpt_bus_register(sim, softc, bus_number) != CAM_SUCCESS) {\n"
+" cam_sim_free(sim, /*free_devq*/ TRUE);\n"
+" error; /* some code to handle the error */\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:192
+msgid ""
+"If there is one `devq` structure per SCSI bus (i.e., we consider a card with "
+"multiple buses as multiple cards with one bus each) then the bus number will "
+"always be 0, otherwise each bus on the SCSI card should be get a distinct "
+"number. Each bus needs its own separate structure cam_sim."
+msgstr ""
+"Если существует одна структура `devq` на каждую шину SCSI (т.е. мы "
+"рассматриваем карту с несколькими шинами как несколько карт с одной шиной "
+"каждая), то номер шины всегда будет 0, в противном случае каждая шина на "
+"SCSI-карте должна получить уникальный номер. Каждой шине требуется своя "
+"отдельная структура `cam_sim`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:195
+msgid ""
+"After that our controller is completely hooked to the CAM system. The value "
+"of `devq` can be discarded now: sim will be passed as an argument in all "
+"further calls from CAM and devq can be derived from it."
+msgstr ""
+"После этого наш контроллер полностью подключён к системе CAM. Значение "
+"`devq` теперь можно отбросить: sim будет передаваться в качестве аргумента "
+"во всех последующих вызовах из CAM, а devq можно получить из него."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:199
+msgid ""
+"CAM provides the framework for such asynchronous events. Some events "
+"originate from the lower levels (the SIM drivers), some events originate "
+"from the peripheral drivers, some events originate from the CAM subsystem "
+"itself. Any driver can register callbacks for some types of the "
+"asynchronous events, so that it would be notified if these events occur."
+msgstr ""
+"CAM предоставляет инфраструктуру для подобных асинхронных событий. Некоторые "
+"события возникают на нижних уровнях (драйверы SIM), некоторые — в драйверах "
+"периферийных устройств, а некоторые — в самой подсистеме CAM. Любой драйвер "
+"может зарегистрировать обработчики для определённых типов асинхронных "
+"событий, чтобы получать уведомления при их возникновении."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:207
+msgid ""
+"A typical example of such an event is a device reset. Each transaction and "
+"event identifies the devices to which it applies by the means of \"path\". "
+"The target-specific events normally occur during a transaction with this "
+"device. So the path from that transaction may be re-used to report this "
+"event (this is safe because the event path is copied in the event reporting "
+"routine but not deallocated nor passed anywhere further). Also it is safe "
+"to allocate paths dynamically at any time including the interrupt routines, "
+"although that incurs certain overhead, and a possible problem with this "
+"approach is that there may be no free memory at that time. For a bus reset "
+"event we need to define a wildcard path including all devices on the bus. "
+"So we can create the path for the future bus reset events in advance and "
+"avoid problems with the future memory shortage:"
+msgstr ""
+"Типичным примером такого события является сброс устройства. Каждая "
+"транзакция и событие идентифицируют устройства, к которым они применяются, с "
+"помощью \"пути\". Специфичные для целевого устройства события обычно "
+"происходят во время транзакции с этим устройством. Таким образом, путь из "
+"этой транзакции может быть повторно использован для сообщения о данном "
+"событии (это безопасно, потому что путь события копируется в процедуре "
+"сообщения о событии, но не освобождается и не передаётся дальше). Также "
+"безопасно динамически выделять пути в любое время, включая процедуры "
+"обработки прерываний, хотя это влечёт определённые накладные расходы, и "
+"возможная проблема такого подхода заключается в том, что в этот момент может "
+"не быть свободной памяти. Для события сброса шины нам необходимо определить "
+"путь-шаблон, включающий все устройства на шине. Поэтому мы можем заранее "
+"создать путь для будущих событий сброса шины и избежать проблем с возможной "
+"нехваткой памяти в будущем:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:211
+#, no-wrap
+msgid " struct cam_path *path;\n"
+msgstr " struct cam_path *path;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:219
+#, no-wrap
+msgid ""
+" if (xpt_create_path(&path, /*periph*/NULL,\n"
+" cam_sim_path(sim), CAM_TARGET_WILDCARD,\n"
+" CAM_LUN_WILDCARD) != CAM_REQ_CMP) {\n"
+" xpt_bus_deregister(cam_sim_path(sim));\n"
+" cam_sim_free(sim, /*free_devq*/TRUE);\n"
+" error; /* some code to handle the error */\n"
+" }\n"
+msgstr ""
+" if (xpt_create_path(&path, /*periph*/NULL,\n"
+" cam_sim_path(sim), CAM_TARGET_WILDCARD,\n"
+" CAM_LUN_WILDCARD) != CAM_REQ_CMP) {\n"
+" xpt_bus_deregister(cam_sim_path(sim));\n"
+" cam_sim_free(sim, /*free_devq*/TRUE);\n"
+" error; /* some code to handle the error */\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:222
+#, no-wrap
+msgid ""
+" softc->wpath = path;\n"
+" softc->sim = sim;\n"
+msgstr ""
+" softc->wpath = path;\n"
+" softc->sim = sim;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:225
+msgid "As you can see the path includes:"
+msgstr "Как вы можете видеть, путь включает:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:227
+msgid "ID of the peripheral driver (NULL here because we have none)"
+msgstr ""
+"Идентификатор драйвера периферийного устройства (NULL здесь, так как у нас "
+"его нет)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:228
+msgid "ID of the SIM driver (`cam_sim_path(sim)`)"
+msgstr "Идентификатор драйвера SIM (`cam_sim_path(sim)`)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:229
+msgid ""
+"SCSI target number of the device (CAM_TARGET_WILDCARD means \"all devices\")"
+msgstr ""
+"Номер целевого устройства SCSI (CAM_TARGET_WILDCARD означает \"все "
+"устройства\")"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:230
+msgid "SCSI LUN number of the subdevice (CAM_LUN_WILDCARD means \"all LUNs\")"
+msgstr "Номер SCSI LUN подустройства (CAM_LUN_WILDCARD означает \"все LUN\")"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:232
+msgid ""
+"If the driver can not allocate this path it will not be able to work "
+"normally, so in that case we dismantle that SCSI bus."
+msgstr ""
+"Если драйвер не может выделить этот путь, он не сможет нормально работать, "
+"поэтому в таком случае мы демонтируем эту шину SCSI."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:235
+msgid ""
+"And we save the path pointer in the `softc` structure for future use. After "
+"that we save the value of sim (or we can also discard it on the exit from "
+"`xxx_probe()` if we wish)."
+msgstr ""
+"И мы сохраняем указатель пути в структуре `softc` для дальнейшего "
+"использования. После этого сохраняем значение sim (или можем также отбросить "
+"его при выходе из `xxx_probe()`, если захотим)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:238
+msgid ""
+"That is all for a minimalistic initialization. To do things right there is "
+"one more issue left."
+msgstr ""
+"Вот и всё для минималистичной инициализации. Чтобы сделать всё правильно, "
+"остался ещё один вопрос."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:243
+msgid ""
+"For a SIM driver there is one particularly interesting event: when a target "
+"device is considered lost. In this case resetting the SCSI negotiations "
+"with this device may be a good idea. So we register a callback for this "
+"event with CAM. The request is passed to CAM by requesting CAM action on a "
+"CAM control block for this type of request:"
+msgstr ""
+"Для драйвера SIM есть одно особенно важное событие: когда целевое устройство "
+"считается потерянным. В этом случае может быть хорошей идеей сбросить SCSI-"
+"переговоры с этим устройством. Поэтому мы регистрируем обратный вызов для "
+"этого события в CAM. Запрос передаётся в CAM путём запроса действия CAM в "
+"блоке управления CAM для этого типа запроса:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:247
+#, no-wrap
+msgid " struct ccb_setasync csa;\n"
+msgstr " struct ccb_setasync csa;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:254
+#, no-wrap
+msgid ""
+" xpt_setup_ccb(&csa.ccb_h, path, /*priority*/5);\n"
+" csa.ccb_h.func_code = XPT_SASYNC_CB;\n"
+" csa.event_enable = AC_LOST_DEVICE;\n"
+" csa.callback = xxx_async;\n"
+" csa.callback_arg = sim;\n"
+" xpt_action((union ccb *)&csa);\n"
+msgstr ""
+" xpt_setup_ccb(&csa.ccb_h, path, /*priority*/5);\n"
+" csa.ccb_h.func_code = XPT_SASYNC_CB;\n"
+" csa.event_enable = AC_LOST_DEVICE;\n"
+" csa.callback = xxx_async;\n"
+" csa.callback_arg = sim;\n"
+" xpt_action((union ccb *)&csa);\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:256
+#, no-wrap
+msgid "Processing CAM messages: xxx_action"
+msgstr "Обработка сообщений CAM: xxx_action"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:261
+#, no-wrap
+msgid "static void xxx_action(struct cam_sim *sim, union ccb *ccb);\n"
+msgstr "static void xxx_action(struct cam_sim *sim, union ccb *ccb);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:268
+msgid ""
+"Do some action on request of the CAM subsystem. Sim describes the SIM for "
+"the request, CCB is the request itself. CCB stands for \"CAM Control "
+"Block\". It is a union of many specific instances, each describing "
+"arguments for some type of transactions. All of these instances share the "
+"CCB header where the common part of arguments is stored."
+msgstr ""
+"Выполнить некоторое действие по запросу подсистемы CAM. Sim описывает SIM "
+"для запроса, CCB — это сам запрос. CCB расшифровывается как \"CAM Control "
+"Block\" (блок управления CAM). Это объединение множества конкретных "
+"экземпляров, каждый из которых описывает аргументы для определённого типа "
+"транзакций. Все эти экземпляры имеют общий заголовок CCB, в котором "
+"хранится общая часть аргументов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:271
+msgid ""
+"CAM supports the SCSI controllers working in both initiator (\"normal\") "
+"mode and target (simulating a SCSI device) mode. Here we only consider the "
+"part relevant to the initiator mode."
+msgstr ""
+"CAM поддерживает SCSI-контроллеры, работающие как в режиме инициатора "
+"(«обычном»), так и в режиме цели (эмулирующем SCSI-устройство). Здесь мы "
+"рассматриваем только часть, относящуюся к режиму инициатора."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:273
+msgid ""
+"There are a few function and macros (in other words, methods) defined to "
+"access the public data in the struct sim:"
+msgstr ""
+"Существует несколько функций и макросов (другими словами, методов), "
+"определённых для доступа к публичным данным в структуре sim:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:275
+msgid "`cam_sim_path(sim)` - the path ID (see above)"
+msgstr "`cam_sim_path(sim)` - идентификатор пути (см. выше)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:276
+msgid "`cam_sim_name(sim)` - the name of the sim"
+msgstr "`cam_sim_name(sim)` — имя sim"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:277
+msgid ""
+"`cam_sim_softc(sim)` - the pointer to the softc (driver private data) "
+"structure"
+msgstr ""
+"`cam_sim_softc(sim)` - указатель на структуру softc (приватные данные "
+"драйвера)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:278
+msgid "`cam_sim_unit(sim)` - the unit number"
+msgstr "`cam_sim_unit(sim)` - номер устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:279
+msgid "`cam_sim_bus(sim)` - the bus ID"
+msgstr "`cam_sim_bus(sim)` - идентификатор шины"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:281
+msgid ""
+"To identify the device, `xxx_action()` can get the unit number and pointer "
+"to its structure softc using these functions."
+msgstr ""
+"Для идентификации устройства `xxx_action()` может получить номер устройства "
+"и указатель на его структуру softc, используя следующие функции."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:284
+msgid ""
+"The type of request is stored in `ccb->ccb_h.func_code`. So generally "
+"`xxx_action()` consists of a big switch:"
+msgstr ""
+"Тип запроса хранится в `ccb->ccb_h.func_code`. Поэтому, как правило, "
+"`xxx_action()` состоит из большого оператора switch:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:291
+#, no-wrap
+msgid ""
+" struct xxx_softc *softc = (struct xxx_softc *) cam_sim_softc(sim);\n"
+" struct ccb_hdr *ccb_h = &ccb->ccb_h;\n"
+" int unit = cam_sim_unit(sim);\n"
+" int bus = cam_sim_bus(sim);\n"
+msgstr ""
+" struct xxx_softc *softc = (struct xxx_softc *) cam_sim_softc(sim);\n"
+" struct ccb_hdr *ccb_h = &ccb->ccb_h;\n"
+" int unit = cam_sim_unit(sim);\n"
+" int bus = cam_sim_bus(sim);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:300
+#, no-wrap
+msgid ""
+" switch (ccb_h->func_code) {\n"
+" case ...:\n"
+" ...\n"
+" default:\n"
+" ccb_h->status = CAM_REQ_INVALID;\n"
+" xpt_done(ccb);\n"
+" break;\n"
+" }\n"
+msgstr ""
+" switch (ccb_h->func_code) {\n"
+" case ...:\n"
+" ...\n"
+" default:\n"
+" ccb_h->status = CAM_REQ_INVALID;\n"
+" xpt_done(ccb);\n"
+" break;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:303
+msgid ""
+"As can be seen from the default case (if an unknown command was received) "
+"the return code of the command is set into `ccb->ccb_h.status` and the "
+"completed CCB is returned back to CAM by calling `xpt_done(ccb)`."
+msgstr ""
+"Как видно из случая по умолчанию (если получена неизвестная команда) код "
+"возврата команды устанавливается в `ccb->ccb_h.status`, а завершённый CCB "
+"возвращается обратно в CAM вызовом `xpt_done(ccb)`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:306
+msgid ""
+"`xpt_done()` does not have to be called from `xxx_action()`: For example an "
+"I/O request may be enqueued inside the SIM driver and/or its SCSI "
+"controller. Then when the device would post an interrupt signaling that the "
+"processing of this request is complete `xpt_done()` may be called from the "
+"interrupt handling routine."
+msgstr ""
+"`xpt_done()` не обязательно вызывать из `xxx_action()`: Например, запрос "
+"ввода-вывода может быть поставлен в очередь внутри драйвера SIM и/или его "
+"SCSI-контроллера. Затем, когда устройство пошлет прерывание, сигнализирующее "
+"о завершении обработки этого запроса, `xpt_done()` может быть вызван из "
+"процедуры обработки прерывания."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:314
+msgid ""
+"Actually, the CCB status is not only assigned as a return code but a CCB has "
+"some status all the time. Before CCB is passed to the `xxx_action()` "
+"routine it gets the status CCB_REQ_INPROG meaning that it is in progress. "
+"There are a surprising number of status values defined in [.filename]#/sys/"
+"cam/cam.h# which should be able to represent the status of a request in "
+"great detail. More interesting yet, the status is in fact a \"bitwise or\" "
+"of an enumerated status value (the lower 6 bits) and possible additional "
+"flag-like bits (the upper bits). The enumerated values will be discussed "
+"later in more detail. The summary of them can be found in the Errors "
+"Summary section. The possible status flags are:"
+msgstr ""
+"На самом деле, статус CCB не только присваивается в качестве кода возврата, "
+"но и CCB всегда имеет какой-то статус. Перед тем как CCB передается в "
+"процедуру `xxx_action()`, он получает статус CCB_REQ_INPROG, означающий, что "
+"запрос находится в процессе выполнения. В [.filename]#/sys/cam/cam.h# "
+"определено удивительно большое количество значений статуса, которые должны "
+"детально отражать состояние запроса. Что еще интереснее, статус фактически "
+"представляет собой \"побитовое ИЛИ\" перечисленного значения статуса "
+"(младшие 6 бит) и возможных дополнительных флагов (старшие биты). "
+"Перечисленные значения будут подробно рассмотрены далее. Их краткое описание "
+"можно найти в разделе \"Сводка ошибок\". Возможные флаги статуса:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:317
+msgid ""
+"_CAM_DEV_QFRZN_ - if the SIM driver gets a serious error (for example, the "
+"device does not respond to the selection or breaks the SCSI protocol) when "
+"processing a CCB it should freeze the request queue by calling "
+"`xpt_freeze_simq()`, return the other enqueued but not processed yet CCBs "
+"for this device back to the CAM queue, then set this flag for the "
+"troublesome CCB and call `xpt_done()`. This flag causes the CAM subsystem "
+"to unfreeze the queue after it handles the error."
+msgstr ""
+"_CAM_DEV_QFRZN_ - если драйвер SIM получает серьёзную ошибку (например, "
+"устройство не отвечает на выборку или нарушает протокол SCSI) при обработке "
+"CCB, он должен заморозить очередь запросов, вызвав `xpt_freeze_simq()`, "
+"вернуть другие поставленные в очередь, но ещё не обработанные CCB для этого "
+"устройства обратно в очередь CAM, затем установить этот флаг для проблемного "
+"CCB и вызвать `xpt_done()`. Этот флаг заставляет подсистему CAM разморозить "
+"очередь после обработки ошибки."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:319
+msgid ""
+"_CAM_AUTOSNS_VALID_ - if the device returned an error condition and the flag "
+"CAM_DIS_AUTOSENSE is not set in CCB the SIM driver must execute the REQUEST "
+"SENSE command automatically to extract the sense (extended error "
+"information) data from the device. If this attempt was successful the sense "
+"data should be saved in the CCB and this flag set."
+msgstr ""
+"_CAM_AUTOSNS_VALID_ - если устройство вернуло состояние ошибки и флаг "
+"CAM_DIS_AUTOSENSE не установлен в CCB, драйвер SIM должен автоматически "
+"выполнить команду REQUEST SENSE, чтобы извлечь данные sense (расширенную "
+"информацию об ошибке) из устройства. Если попытка была успешной, данные "
+"sense должны быть сохранены в CCB, а этот флаг установлен."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:322
+msgid ""
+"_CAM_RELEASE_SIMQ_ - like CAM_DEV_QFRZN but used in case there is some "
+"problem (or resource shortage) with the SCSI controller itself. Then all "
+"the future requests to the controller should be stopped by "
+"`xpt_freeze_simq()`. The controller queue will be restarted after the SIM "
+"driver overcomes the shortage and informs CAM by returning some CCB with "
+"this flag set."
+msgstr ""
+"_CAM_RELEASE_SIMQ_ - аналогично CAM_DEV_QFRZN, но используется в случае "
+"возникновения проблем (или нехватки ресурсов) с самим SCSI-контроллером. В "
+"этом случае все последующие запросы к контроллеру должны быть остановлены с "
+"помощью `xpt_freeze_simq()`. Очередь контроллера будет возобновлена после "
+"того, как драйвер SIM устранит нехватку и уведомит CAM, вернув некоторый CCB "
+"с установленным этим флагом."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:324
+msgid ""
+"_CAM_SIM_QUEUED_ - when SIM puts a CCB into its request queue this flag "
+"should be set (and removed when this CCB gets dequeued before being returned "
+"back to CAM). This flag is not used anywhere in the CAM code now, so its "
+"purpose is purely diagnostic."
+msgstr ""
+"_CAM_SIM_QUEUED_ - этот флаг должен быть установлен, когда SIM помещает CCB "
+"в свою очередь запросов (и снят, когда этот CCB извлекается из очереди перед "
+"возвратом в CAM). В настоящее время этот флаг нигде не используется в коде "
+"CAM, поэтому его назначение чисто диагностическое."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:325
+msgid "_CAM_QOS_VALID_ - The QOS data is now valid."
+msgstr "_CAM_QOS_VALID_ - Данные QOS теперь действительны."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:328
+msgid ""
+"The function `xxx_action()` is not allowed to sleep, so all the "
+"synchronization for resource access must be done using SIM or device queue "
+"freezing. Besides the aforementioned flags the CAM subsystem provides "
+"functions `xpt_release_simq()` and `xpt_release_devq()` to unfreeze the "
+"queues directly, without passing a CCB to CAM."
+msgstr ""
+"Функция `xxx_action()` не может находиться в состоянии ожидания, поэтому вся "
+"синхронизация доступа к ресурсам должна выполняться с использованием SIM или "
+"заморозки очереди устройств. Помимо упомянутых флагов, подсистема CAM "
+"предоставляет функции `xpt_release_simq()` и `xpt_release_devq()` для "
+"разморозки очередей напрямую, без передачи CCB в CAM."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:330
+msgid "The CCB header contains the following fields:"
+msgstr "Заголовок CCB содержит следующие поля:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:332
+msgid "_path_ - path ID for the request"
+msgstr "_path_ - идентификатор пути для запроса"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:333
+msgid "_target_id_ - target device ID for the request"
+msgstr "_target_id_ - идентификатор целевого устройства для запроса"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:334
+msgid "_target_lun_ - LUN ID of the target device"
+msgstr "_target_lun_ - идентификатор LUN целевого устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:335
+msgid "_timeout_ - timeout interval for this command, in milliseconds"
+msgstr "_timeout_ - интервал таймаута для этой команды, в миллисекундах"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:336
+msgid ""
+"_timeout_ch_ - a convenience place for the SIM driver to store the timeout "
+"handle (the CAM subsystem itself does not make any assumptions about it)"
+msgstr ""
+"_timeout_ch_ - удобное место для драйвера SIM, чтобы хранить обработчик "
+"таймаута (сама подсистема CAM не делает никаких предположений о нём)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:337
+msgid ""
+"_flags_ - various bits of information about the request spriv_ptr0, "
+"spriv_ptr1 - fields reserved for private use by the SIM driver (such as "
+"linking to the SIM queues or SIM private control blocks); actually, they "
+"exist as unions: spriv_ptr0 and spriv_ptr1 have the type (void *), "
+"spriv_field0 and spriv_field1 have the type unsigned long, "
+"sim_priv.entries[0].bytes and sim_priv.entries[1].bytes are byte arrays of "
+"the size consistent with the other incarnations of the union and "
+"sim_priv.bytes is one array, twice bigger."
+msgstr ""
+"_flags_ - различные биты информации о запросе spriv_ptr0, spriv_ptr1 — поля, "
+"зарезервированные для приватного использования драйвером SIM (например, для "
+"связи с очередями SIM или приватными блоками управления SIM); фактически они "
+"существуют как объединения: spriv_ptr0 и spriv_ptr1 имеют тип (void *), "
+"spriv_field0 и spriv_field1 имеют тип unsigned long, "
+"sim_priv.entries[0].bytes и sim_priv.entries[1].bytes - это байтовые массивы "
+"размера, согласованного с другими вариантами объединения, а sim_priv.bytes - "
+"это один массив, вдвое большего размера."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:339
+msgid ""
+"The recommended way of using the SIM private fields of CCB is to define some "
+"meaningful names for them and use these meaningful names in the driver, like:"
+msgstr ""
+"Рекомендуемый способ использования приватных полей SIM в CCB — это "
+"определить для них осмысленные имена и использовать эти осмысленные имена в "
+"драйвере, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:344
+#, no-wrap
+msgid ""
+"#define ccb_some_meaningful_name sim_priv.entries[0].bytes\n"
+"#define ccb_hcb spriv_ptr1 /* for hardware control block */\n"
+msgstr ""
+"#define ccb_some_meaningful_name sim_priv.entries[0].bytes\n"
+"#define ccb_hcb spriv_ptr1 /* for hardware control block */\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:347
+msgid "The most common initiator mode requests are:"
+msgstr "Наиболее распространенные запросы в режиме инициатора:"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:348
+#, no-wrap
+msgid "_XPT_SCSI_IO_ - execute an I/O transaction"
+msgstr "_XPT_SCSI_IO_ - выполнить транзакцию ввода-вывода"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:352
+msgid ""
+"The instance \"struct ccb_scsiio csio\" of the union ccb is used to transfer "
+"the arguments. They are:"
+msgstr ""
+"Экземпляр \"struct ccb_scsiio csio\" объединения ccb используется для "
+"передачи аргументов. Они включают:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:354
+msgid "_cdb_io_ - pointer to the SCSI command buffer or the buffer itself"
+msgstr "_cdb_io_ - указатель на буфер команды SCSI или сам буфер"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:355
+msgid "_cdb_len_ - SCSI command length"
+msgstr "_cdb_len_ - длина команды SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:356
+msgid ""
+"_data_ptr_ - pointer to the data buffer (gets a bit complicated if scatter/"
+"gather is used)"
+msgstr ""
+"_data_ptr_ - указатель на буфер данных (усложняется, если используется "
+"scatter/gather)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:357
+msgid "_dxfer_len_ - length of the data to transfer"
+msgstr "_dxfer_len_ - длина передаваемых данных"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:358
+msgid "_sglist_cnt_ - counter of the scatter/gather segments"
+msgstr "_sglist_cnt_ - счетчик сегментов scatter/gather"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:359
+msgid "_scsi_status_ - place to return the SCSI status"
+msgstr "_scsi_status_ - место для возврата статуса SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:360
+msgid ""
+"_sense_data_ - buffer for the SCSI sense information if the command returns "
+"an error (the SIM driver is supposed to run the REQUEST SENSE command "
+"automatically in this case if the CCB flag CAM_DIS_AUTOSENSE is not set)"
+msgstr ""
+"_sense_data_ - буфер для информации SCSI sense, если команда возвращает "
+"ошибку (драйвер SIM должен автоматически выполнить команду REQUEST SENSE в "
+"этом случае, если флаг CCB CAM_DIS_AUTOSENSE не установлен)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:361
+msgid ""
+"_sense_len_ - the length of that buffer (if it happens to be higher than "
+"size of sense_data the SIM driver must silently assume the smaller value)"
+msgstr ""
+"_sense_len_ - длина этого буфера (если она окажется больше размера "
+"sense_data, драйвер SIM должен без уведомления принять меньшее значение)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:364
+msgid ""
+"_resid_, _sense_resid_ - if the transfer of data or SCSI sense returned an "
+"error these are the returned counters of the residual (not transferred) "
+"data. They do not seem to be especially meaningful, so in a case when they "
+"are difficult to compute (say, counting bytes in the SCSI controller's FIFO "
+"buffer) an approximate value will do as well. For a successfully completed "
+"transfer they must be set to zero."
+msgstr ""
+"_resid_, _sense_resid_ — если передача данных или SCSI sense вернула ошибку, "
+"это счётчики остаточных (не переданных) данных. Они не кажутся особенно "
+"значимыми, поэтому в случаях, когда их сложно вычислить (например, подсчёт "
+"байтов в FIFO-буфере SCSI-контроллера), подойдёт и приблизительное значение. "
+"Для успешно завершённой передачи они должны быть установлены в ноль."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:365
+msgid "_tag_action_ - the kind of tag to use:"
+msgstr "_tag_action_ - тип используемого тега:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:366
+msgid "CAM_TAG_ACTION_NONE - do not use tags for this transaction"
+msgstr "`CAM_TAG_ACTION_NONE` - не использовать теги для данной транзакции"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:367
+msgid ""
+"MSG_SIMPLE_Q_TAG, MSG_HEAD_OF_Q_TAG, MSG_ORDERED_Q_TAG - value equal to the "
+"appropriate tag message (see /sys/cam/scsi/scsi_message.h); this gives only "
+"the tag type, the SIM driver must assign the tag value itself"
+msgstr ""
+"MSG_SIMPLE_Q_TAG, MSG_HEAD_OF_Q_TAG, MSG_ORDERED_Q_TAG — значение, "
+"соответствующее указанному теговому сообщению (см. /sys/cam/scsi/"
+"scsi_message.h); указывает только тип тега, значение тега должно быть "
+"назначено самим драйвером SIM"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:369
+msgid "The general logic of handling this request is the following:"
+msgstr "Общая логика обработки этого запроса следующая:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:371
+msgid ""
+"The first thing to do is to check for possible races, to make sure that the "
+"command did not get aborted when it was sitting in the queue:"
+msgstr ""
+"Первое, что нужно сделать, это проверить возможные состояния гонки, чтобы "
+"убедиться, что команда не была прервана, пока находилась в очереди:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:375
+#, no-wrap
+msgid " struct ccb_scsiio *csio = &ccb->csio;\n"
+msgstr " struct ccb_scsiio *csio = &ccb->csio;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:380
+#, no-wrap
+msgid ""
+" if ((ccb_h->status & CAM_STATUS_MASK) != CAM_REQ_INPROG) {\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+msgstr ""
+" if ((ccb_h->status & CAM_STATUS_MASK) != CAM_REQ_INPROG) {\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:383
+msgid "Also we check that the device is supported at all by our controller:"
+msgstr ""
+"Также мы проверяем, что устройство вообще поддерживается нашим контроллером:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:397
+#, no-wrap
+msgid ""
+" if (ccb_h->target_id > OUR_MAX_SUPPORTED_TARGET_ID\n"
+" || cch_h->target_id == OUR_SCSI_CONTROLLERS_OWN_ID) {\n"
+" ccb_h->status = CAM_TID_INVALID;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+" if (ccb_h->target_lun > OUR_MAX_SUPPORTED_LUN) {\n"
+" ccb_h->status = CAM_LUN_INVALID;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+msgstr ""
+" if (ccb_h->target_id > OUR_MAX_SUPPORTED_TARGET_ID\n"
+" || cch_h->target_id == OUR_SCSI_CONTROLLERS_OWN_ID) {\n"
+" ccb_h->status = CAM_TID_INVALID;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+" if (ccb_h->target_lun > OUR_MAX_SUPPORTED_LUN) {\n"
+" ccb_h->status = CAM_LUN_INVALID;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:403
+msgid ""
+"Then allocate whatever data structures (such as card-dependent hardware "
+"control block) we need to process this request. If we can not then freeze "
+"the SIM queue and remember that we have a pending operation, return the CCB "
+"back and ask CAM to re-queue it. Later when the resources become available "
+"the SIM queue must be unfrozen by returning a ccb with the "
+"`CAM_SIMQ_RELEASE` bit set in its status. Otherwise, if all went well, link "
+"the CCB with the hardware control block (HCB) and mark it as queued."
+msgstr ""
+"Затем выделяем все необходимые структуры данных (такие как зависящий от "
+"карты блок управления оборудованием), которые нам нужны для обработки этого "
+"запроса. Если мы не можем этого сделать, то замораживаем очередь SIM и "
+"запоминаем, что у нас есть отложенная операция, возвращаем CCB обратно и "
+"просим CAM поставить его в очередь снова. Позже, когда ресурсы станут "
+"доступны, очередь SIM должна быть разморожена путём возврата CCB с "
+"установленным битом `CAM_SIMQ_RELEASE` в его статусе. В противном случае, "
+"если всё прошло успешно, связываем CCB с блоком управления оборудованием "
+"(HCB) и помечаем его как поставленный в очередь."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:407
+#, no-wrap
+msgid " struct xxx_hcb *hcb = allocate_hcb(softc, unit, bus);\n"
+msgstr " struct xxx_hcb *hcb = allocate_hcb(softc, unit, bus);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:415
+#, no-wrap
+msgid ""
+" if (hcb == NULL) {\n"
+" softc->flags |= RESOURCE_SHORTAGE;\n"
+" xpt_freeze_simq(sim, /*count*/1);\n"
+" ccb_h->status = CAM_REQUEUE_REQ;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+msgstr ""
+" if (hcb == NULL) {\n"
+" softc->flags |= RESOURCE_SHORTAGE;\n"
+" xpt_freeze_simq(sim, /*count*/1);\n"
+" ccb_h->status = CAM_REQUEUE_REQ;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:418
+#, no-wrap
+msgid ""
+" hcb->ccb = ccb; ccb_h->ccb_hcb = (void *)hcb;\n"
+" ccb_h->status |= CAM_SIM_QUEUED;\n"
+msgstr ""
+" hcb->ccb = ccb; ccb_h->ccb_hcb = (void *)hcb;\n"
+" ccb_h->status |= CAM_SIM_QUEUED;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:423
+msgid ""
+"Extract the target data from CCB into the hardware control block. Check if "
+"we are asked to assign a tag and if yes then generate an unique tag and "
+"build the SCSI tag messages. The SIM driver is also responsible for "
+"negotiations with the devices to set the maximal mutually supported bus "
+"width, synchronous rate and offset."
+msgstr ""
+"Извлечь целевые данные из CCB в аппаратный блок управления. Проверить, "
+"запрошено ли назначение тега, и если да, то сгенерировать уникальный тег и "
+"построить сообщения тега SCSI. Драйвер SIM также отвечает за согласование с "
+"устройствами для установки максимальной взаимно поддерживаемой ширины шины, "
+"синхронной скорости и смещения."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:432
+#, no-wrap
+msgid ""
+" hcb->target = ccb_h->target_id; hcb->lun = ccb_h->target_lun;\n"
+" generate_identify_message(hcb);\n"
+" if (ccb_h->tag_action != CAM_TAG_ACTION_NONE)\n"
+" generate_unique_tag_message(hcb, ccb_h->tag_action);\n"
+" if (!target_negotiated(hcb))\n"
+" generate_negotiation_messages(hcb);\n"
+msgstr ""
+" hcb->target = ccb_h->target_id; hcb->lun = ccb_h->target_lun;\n"
+" generate_identify_message(hcb);\n"
+" if (ccb_h->tag_action != CAM_TAG_ACTION_NONE)\n"
+" generate_unique_tag_message(hcb, ccb_h->tag_action);\n"
+" if (!target_negotiated(hcb))\n"
+" generate_negotiation_messages(hcb);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:438
+msgid ""
+"Then set up the SCSI command. The command storage may be specified in the "
+"CCB in many interesting ways, specified by the CCB flags. The command "
+"buffer can be contained in CCB or pointed to, in the latter case the pointer "
+"may be physical or virtual. Since the hardware commonly needs physical "
+"address we always convert the address to the physical one, typically using "
+"the busdma API."
+msgstr ""
+"Затем настройте команду SCSI. Хранилище команды может быть указано в CCB "
+"различными способами, определяемыми флагами CCB. Буфер команды может "
+"содержаться в CCB или указываться на него; в последнем случае указатель "
+"может быть физическим или виртуальным. Поскольку оборудованию обычно "
+"требуется физический адрес, мы всегда преобразуем адрес в физический, как "
+"правило, используя API busdma."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:441
+msgid ""
+"In case if a physical address is requested it is OK to return the CCB with "
+"the status `CAM_REQ_INVALID`, the current drivers do that. If necessary a "
+"physical address can be also converted or mapped back to a virtual address "
+"but with big pain, so we do not do that."
+msgstr ""
+"В случае, если запрашивается физический адрес, допустимо вернуть CCB со "
+"статусом `CAM_REQ_INVALID`, текущие драйверы так и делают. При необходимости "
+"физический адрес также может быть преобразован или отображен обратно в "
+"виртуальный, но с большими трудностями, поэтому мы этого не делаем."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:458
+#, no-wrap
+msgid ""
+" if (ccb_h->flags & CAM_CDB_POINTER) {\n"
+" /* CDB is a pointer */\n"
+" if (!(ccb_h->flags & CAM_CDB_PHYS)) {\n"
+" /* CDB pointer is virtual */\n"
+" hcb->cmd = vtobus(csio->cdb_io.cdb_ptr);\n"
+" } else {\n"
+" /* CDB pointer is physical */\n"
+" hcb->cmd = csio->cdb_io.cdb_ptr ;\n"
+" }\n"
+" } else {\n"
+" /* CDB is in the ccb (buffer) */\n"
+" hcb->cmd = vtobus(csio->cdb_io.cdb_bytes);\n"
+" }\n"
+" hcb->cmdlen = csio->cdb_len;\n"
+msgstr ""
+" if (ccb_h->flags & CAM_CDB_POINTER) {\n"
+" /* CDB is a pointer */\n"
+" if (!(ccb_h->flags & CAM_CDB_PHYS)) {\n"
+" /* CDB pointer is virtual */\n"
+" hcb->cmd = vtobus(csio->cdb_io.cdb_ptr);\n"
+" } else {\n"
+" /* CDB pointer is physical */\n"
+" hcb->cmd = csio->cdb_io.cdb_ptr ;\n"
+" }\n"
+" } else {\n"
+" /* CDB is in the ccb (buffer) */\n"
+" hcb->cmd = vtobus(csio->cdb_io.cdb_bytes);\n"
+" }\n"
+" hcb->cmdlen = csio->cdb_len;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:464
+msgid ""
+"Now it is time to set up the data. Again, the data storage may be specified "
+"in the CCB in many interesting ways, specified by the CCB flags. First we "
+"get the direction of the data transfer. The simplest case is if there is no "
+"data to transfer:"
+msgstr ""
+"Теперь настало время настроить данные. Опять же, хранилище данных может быть "
+"указано в CCB различными интересными способами, определяемыми флагами CCB. "
+"Сначала мы получаем направление передачи данных. Самый простой случай — если "
+"нет данных для передачи:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:468
+#, no-wrap
+msgid " int dir = (ccb_h->flags & CAM_DIR_MASK);\n"
+msgstr " int dir = (ccb_h->flags & CAM_DIR_MASK);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:471
+#, no-wrap
+msgid ""
+" if (dir == CAM_DIR_NONE)\n"
+" goto end_data;\n"
+msgstr ""
+" if (dir == CAM_DIR_NONE)\n"
+" goto end_data;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:482
+msgid ""
+"Then we check if the data is in one chunk or in a scatter-gather list, and "
+"the addresses are physical or virtual. The SCSI controller may be able to "
+"handle only a limited number of chunks of limited length. If the request "
+"hits this limitation we return an error. We use a special function to "
+"return the CCB to handle in one place the HCB resource shortages. The "
+"functions to add chunks are driver-dependent, and here we leave them without "
+"detailed implementation. See description of the SCSI command (CDB) handling "
+"for the details on the address-translation issues. If some variation is too "
+"difficult or impossible to implement with a particular card it is OK to "
+"return the status `CAM_REQ_INVALID`. Actually, it seems like the scatter-"
+"gather ability is not used anywhere in the CAM code now. But at least the "
+"case for a single non-scattered virtual buffer must be implemented, it is "
+"actively used by CAM."
+msgstr ""
+"Затем мы проверяем, находятся ли данные в одном фрагменте или в списке "
+"scatter-gather, а также являются ли адреса физическими или виртуальными. "
+"SCSI-контроллер может обрабатывать только ограниченное количество фрагментов "
+"ограниченной длины. Если запрос превышает это ограничение, мы возвращаем "
+"ошибку. Мы используем специальную функцию для возврата CCB, чтобы в одном "
+"месте обрабатывать нехватку ресурсов HCB. Функции для добавления фрагментов "
+"зависят от драйвера, и здесь мы оставляем их без детальной реализации. "
+"Подробности о проблемах трансляции адресов см. в описании обработки SCSI-"
+"команд (CDB). Если какая-то вариация слишком сложна или невозможна для "
+"реализации с конкретной картой, допустимо вернуть статус `CAM_REQ_INVALID`. "
+"На самом деле, похоже, что возможность scatter-gather нигде в коде CAM "
+"сейчас не используется. Но как минимум случай с единичным неразделённым "
+"виртуальным буфером должен быть реализован, так как он активно используется "
+"CAM."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:486
+#, no-wrap
+msgid " int rv;\n"
+msgstr " int rv;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:488
+#, no-wrap
+msgid " initialize_hcb_for_data(hcb);\n"
+msgstr " initialize_hcb_for_data(hcb);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:501
+#, no-wrap
+msgid ""
+" if ((!(ccb_h->flags & CAM_SCATTER_VALID)) {\n"
+" /* single buffer */\n"
+" if (!(ccb_h->flags & CAM_DATA_PHYS)) {\n"
+" rv = add_virtual_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);\n"
+" }\n"
+" } else {\n"
+" rv = add_physical_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);\n"
+" }\n"
+" } else {\n"
+" int i;\n"
+" struct bus_dma_segment *segs;\n"
+" segs = (struct bus_dma_segment *)csio->data_ptr;\n"
+msgstr ""
+" if ((!(ccb_h->flags & CAM_SCATTER_VALID)) {\n"
+" /* single buffer */\n"
+" if (!(ccb_h->flags & CAM_DATA_PHYS)) {\n"
+" rv = add_virtual_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);\n"
+" }\n"
+" } else {\n"
+" rv = add_physical_chunk(hcb, csio->data_ptr, csio->dxfer_len, dir);\n"
+" }\n"
+" } else {\n"
+" int i;\n"
+" struct bus_dma_segment *segs;\n"
+" segs = (struct bus_dma_segment *)csio->data_ptr;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:533
+#, no-wrap
+msgid ""
+" if ((ccb_h->flags & CAM_SG_LIST_PHYS) != 0) {\n"
+" /* The SG list pointer is physical */\n"
+" rv = setup_hcb_for_physical_sg_list(hcb, segs, csio->sglist_cnt);\n"
+" } else if (!(ccb_h->flags & CAM_DATA_PHYS)) {\n"
+" /* SG buffer pointers are virtual */\n"
+" for (i = 0; i < csio->sglist_cnt; i++) {\n"
+" rv = add_virtual_chunk(hcb, segs[i].ds_addr,\n"
+" segs[i].ds_len, dir);\n"
+" if (rv != CAM_REQ_CMP)\n"
+" break;\n"
+" }\n"
+" } else {\n"
+" /* SG buffer pointers are physical */\n"
+" for (i = 0; i < csio->sglist_cnt; i++) {\n"
+" rv = add_physical_chunk(hcb, segs[i].ds_addr,\n"
+" segs[i].ds_len, dir);\n"
+" if (rv != CAM_REQ_CMP)\n"
+" break;\n"
+" }\n"
+" }\n"
+" }\n"
+" if (rv != CAM_REQ_CMP) {\n"
+" /* we expect that add_*_chunk() functions return CAM_REQ_CMP\n"
+" * if they added a chunk successfully, CAM_REQ_TOO_BIG if\n"
+" * the request is too big (too many bytes or too many chunks),\n"
+" * CAM_REQ_INVALID in case of other troubles\n"
+" */\n"
+" free_hcb_and_ccb_done(hcb, ccb, rv);\n"
+" return;\n"
+" }\n"
+" end_data:\n"
+msgstr ""
+" if ((ccb_h->flags & CAM_SG_LIST_PHYS) != 0) {\n"
+" /* The SG list pointer is physical */\n"
+" rv = setup_hcb_for_physical_sg_list(hcb, segs, csio->sglist_cnt);\n"
+" } else if (!(ccb_h->flags & CAM_DATA_PHYS)) {\n"
+" /* SG buffer pointers are virtual */\n"
+" for (i = 0; i < csio->sglist_cnt; i++) {\n"
+" rv = add_virtual_chunk(hcb, segs[i].ds_addr,\n"
+" segs[i].ds_len, dir);\n"
+" if (rv != CAM_REQ_CMP)\n"
+" break;\n"
+" }\n"
+" } else {\n"
+" /* SG buffer pointers are physical */\n"
+" for (i = 0; i < csio->sglist_cnt; i++) {\n"
+" rv = add_physical_chunk(hcb, segs[i].ds_addr,\n"
+" segs[i].ds_len, dir);\n"
+" if (rv != CAM_REQ_CMP)\n"
+" break;\n"
+" }\n"
+" }\n"
+" }\n"
+" if (rv != CAM_REQ_CMP) {\n"
+" /* we expect that add_*_chunk() functions return CAM_REQ_CMP\n"
+" * if they added a chunk successfully, CAM_REQ_TOO_BIG if\n"
+" * the request is too big (too many bytes or too many chunks),\n"
+" * CAM_REQ_INVALID in case of other troubles\n"
+" */\n"
+" free_hcb_and_ccb_done(hcb, ccb, rv);\n"
+" return;\n"
+" }\n"
+" end_data:\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:536
+msgid ""
+"If disconnection is disabled for this CCB we pass this information to the "
+"hcb:"
+msgstr ""
+"Если отключение запрещено для этого CCB, мы передаем эту информацию в hcb:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:541
+#, no-wrap
+msgid ""
+" if (ccb_h->flags & CAM_DIS_DISCONNECT)\n"
+" hcb_disable_disconnect(hcb);\n"
+msgstr ""
+" if (ccb_h->flags & CAM_DIS_DISCONNECT)\n"
+" hcb_disable_disconnect(hcb);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:544
+msgid ""
+"If the controller is able to run REQUEST SENSE command all by itself then "
+"the value of the flag CAM_DIS_AUTOSENSE should also be passed to it, to "
+"prevent automatic REQUEST SENSE if the CAM subsystem does not want it."
+msgstr ""
+"Если контроллер способен самостоятельно выполнять команду REQUEST SENSE, то "
+"ему также следует передать значение флага CAM_DIS_AUTOSENSE, чтобы "
+"предотвратить автоматическое выполнение REQUEST SENSE, если подсистема CAM "
+"этого не требует."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:546
+msgid ""
+"The only thing left is to set up the timeout, pass our hcb to the hardware "
+"and return, the rest will be done by the interrupt handler (or timeout "
+"handler)."
+msgstr ""
+"Осталось только установить таймаут, передать наш hcb оборудованию и "
+"вернуться, остальное будет сделано обработчиком прерывания (или обработчиком "
+"таймаута)."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:553
+#, no-wrap
+msgid ""
+" ccb_h->timeout_ch = timeout(xxx_timeout, (caddr_t) hcb,\n"
+" (ccb_h->timeout * hz) / 1000); /* convert milliseconds to ticks */\n"
+" put_hcb_into_hardware_queue(hcb);\n"
+" return;\n"
+msgstr ""
+" ccb_h->timeout_ch = timeout(xxx_timeout, (caddr_t) hcb,\n"
+" (ccb_h->timeout * hz) / 1000); /* convert milliseconds to ticks */\n"
+" put_hcb_into_hardware_queue(hcb);\n"
+" return;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:556
+msgid "And here is a possible implementation of the function returning CCB:"
+msgstr "И вот возможная реализация функции, возвращающей CCB:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:563
+#, no-wrap
+msgid ""
+" static void\n"
+" free_hcb_and_ccb_done(struct xxx_hcb *hcb, union ccb *ccb, u_int32_t status)\n"
+" {\n"
+" struct xxx_softc *softc = hcb->softc;\n"
+msgstr ""
+" static void\n"
+" free_hcb_and_ccb_done(struct xxx_hcb *hcb, union ccb *ccb, u_int32_t status)\n"
+" {\n"
+" struct xxx_softc *softc = hcb->softc;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:578
+#, no-wrap
+msgid ""
+" ccb->ccb_h.ccb_hcb = 0;\n"
+" if (hcb != NULL) {\n"
+" untimeout(xxx_timeout, (caddr_t) hcb, ccb->ccb_h.timeout_ch);\n"
+" /* we're about to free a hcb, so the shortage has ended */\n"
+" if (softc->flags & RESOURCE_SHORTAGE) {\n"
+" softc->flags &= ~RESOURCE_SHORTAGE;\n"
+" status |= CAM_RELEASE_SIMQ;\n"
+" }\n"
+" free_hcb(hcb); /* also removes hcb from any internal lists */\n"
+" }\n"
+" ccb->ccb_h.status = status |\n"
+" (ccb->ccb_h.status & ~(CAM_STATUS_MASK|CAM_SIM_QUEUED));\n"
+" xpt_done(ccb);\n"
+" }\n"
+msgstr ""
+" ccb->ccb_h.ccb_hcb = 0;\n"
+" if (hcb != NULL) {\n"
+" untimeout(xxx_timeout, (caddr_t) hcb, ccb->ccb_h.timeout_ch);\n"
+" /* we're about to free a hcb, so the shortage has ended */\n"
+" if (softc->flags & RESOURCE_SHORTAGE) {\n"
+" softc->flags &= ~RESOURCE_SHORTAGE;\n"
+" status |= CAM_RELEASE_SIMQ;\n"
+" }\n"
+" free_hcb(hcb); /* also removes hcb from any internal lists */\n"
+" }\n"
+" ccb->ccb_h.status = status |\n"
+" (ccb->ccb_h.status & ~(CAM_STATUS_MASK|CAM_SIM_QUEUED));\n"
+" xpt_done(ccb);\n"
+" }\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:580
+#, no-wrap
+msgid "_XPT_RESET_DEV_ - send the SCSI \"BUS DEVICE RESET\" message to a device"
+msgstr "_XPT_RESET_DEV_ - отправить устройству сообщение SCSI \"BUS DEVICE RESET\""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:585
+msgid ""
+"There is no data transferred in CCB except the header and the most "
+"interesting argument of it is target_id. Depending on the controller "
+"hardware a hardware control block just like for the XPT_SCSI_IO request may "
+"be constructed (see XPT_SCSI_IO request description) and sent to the "
+"controller or the SCSI controller may be immediately programmed to send this "
+"RESET message to the device or this request may be just not supported (and "
+"return the status `CAM_REQ_INVALID`). Also on completion of the request all "
+"the disconnected transactions for this target must be aborted (probably in "
+"the interrupt routine)."
+msgstr ""
+"В CCB не передаются данные, кроме заголовка, и наиболее интересным "
+"аргументом в нём является target_id. В зависимости от аппаратного "
+"обеспечения контроллера может быть создан аппаратный блок управления (как "
+"для запроса XPT_SCSI_IO, см. описание запроса XPT_SCSI_IO) и отправлен "
+"контроллеру, или SCSI-контроллер может быть немедленно запрограммирован на "
+"отправку этого сообщения RESET устройству, или этот запрос может просто не "
+"поддерживаться (и возвращать статус `CAM_REQ_INVALID`). Также при завершении "
+"запроса все отключенные транзакции для этого целевого устройства должны быть "
+"прерваны (вероятно, в процедуре прерывания)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:588
+msgid ""
+"Also all the current negotiations for the target are lost on reset, so they "
+"might be cleaned too. Or they clearing may be deferred, because anyway the "
+"target would request re-negotiation on the next transaction."
+msgstr ""
+"Кроме того, все текущие переговоры для цели теряются при сбросе, поэтому они "
+"также могут быть очищены. Или их очистка может быть отложена, так как в "
+"любом случае цель запросит повторные переговоры при следующей транзакции."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:589
+#, no-wrap
+msgid "_XPT_RESET_BUS_ - send the RESET signal to the SCSI bus"
+msgstr "_XPT_RESET_BUS_ - отправить сигнал RESET на шину SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:592
+msgid ""
+"No arguments are passed in the CCB, the only interesting argument is the "
+"SCSI bus indicated by the struct sim pointer."
+msgstr ""
+"В CCB не передаются аргументы, единственный интересный аргумент — это шина "
+"SCSI, указанная структурой sim."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:594
+msgid ""
+"A minimalistic implementation would forget the SCSI negotiations for all the "
+"devices on the bus and return the status CAM_REQ_CMP."
+msgstr ""
+"Минималистичная реализация могла бы пропустить SCSI-переговоры для всех "
+"устройств на шине и вернуть статус CAM_REQ_CMP."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:597
+msgid ""
+"The proper implementation would in addition actually reset the SCSI bus "
+"(possible also reset the SCSI controller) and mark all the CCBs being "
+"processed, both those in the hardware queue and those being disconnected, as "
+"done with the status CAM_SCSI_BUS_RESET. Like:"
+msgstr ""
+"Правильная реализация дополнительно должна фактически сбросить шину SCSI "
+"(возможно, также сбросить контроллер SCSI) и пометить все обрабатываемые "
+"CCB, как находящиеся в аппаратной очереди, так и отключенные, как "
+"завершенные со статусом CAM_SCSI_BUS_RESET. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:603
+#, no-wrap
+msgid ""
+" int targ, lun;\n"
+" struct xxx_hcb *h, *hh;\n"
+" struct ccb_trans_settings neg;\n"
+" struct cam_path *path;\n"
+msgstr ""
+" int targ, lun;\n"
+" struct xxx_hcb *h, *hh;\n"
+" struct ccb_trans_settings neg;\n"
+" struct cam_path *path;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:609
+#, no-wrap
+msgid ""
+" /* The SCSI bus reset may take a long time, in this case its completion\n"
+" * should be checked by interrupt or timeout. But for simplicity\n"
+" * we assume here that it is really fast.\n"
+" */\n"
+" reset_scsi_bus(softc);\n"
+msgstr ""
+" /* The SCSI bus reset may take a long time, in this case its completion\n"
+" * should be checked by interrupt or timeout. But for simplicity\n"
+" * we assume here that it is really fast.\n"
+" */\n"
+" reset_scsi_bus(softc);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:615
+#, no-wrap
+msgid ""
+" /* drop all enqueued CCBs */\n"
+" for (h = softc->first_queued_hcb; h != NULL; h = hh) {\n"
+" hh = h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+msgstr ""
+" /* drop all enqueued CCBs */\n"
+" for (h = softc->first_queued_hcb; h != NULL; h = hh) {\n"
+" hh = h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:621
+#, no-wrap
+msgid ""
+" /* the clean values of negotiations to report */\n"
+" neg.bus_width = 8;\n"
+" neg.sync_period = neg.sync_offset = 0;\n"
+" neg.valid = (CCB_TRANS_BUS_WIDTH_VALID\n"
+" | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);\n"
+msgstr ""
+" /* the clean values of negotiations to report */\n"
+" neg.bus_width = 8;\n"
+" neg.sync_period = neg.sync_offset = 0;\n"
+" neg.valid = (CCB_TRANS_BUS_WIDTH_VALID\n"
+" | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:625
+#, no-wrap
+msgid ""
+" /* drop all disconnected CCBs and clean negotiations */\n"
+" for (targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {\n"
+" clean_negotiations(softc, targ);\n"
+msgstr ""
+" /* drop all disconnected CCBs and clean negotiations */\n"
+" for (targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {\n"
+" clean_negotiations(softc, targ);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:633
+#, no-wrap
+msgid ""
+" /* report the event if possible */\n"
+" if (xpt_create_path(&path, /*periph*/NULL,\n"
+" cam_sim_path(sim), targ,\n"
+" CAM_LUN_WILDCARD) == CAM_REQ_CMP) {\n"
+" xpt_async(AC_TRANSFER_NEG, path, &neg);\n"
+" xpt_free_path(path);\n"
+" }\n"
+msgstr ""
+" /* report the event if possible */\n"
+" if (xpt_create_path(&path, /*periph*/NULL,\n"
+" cam_sim_path(sim), targ,\n"
+" CAM_LUN_WILDCARD) == CAM_REQ_CMP) {\n"
+" xpt_async(AC_TRANSFER_NEG, path, &neg);\n"
+" xpt_free_path(path);\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:640
+#, no-wrap
+msgid ""
+" for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)\n"
+" for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {\n"
+" hh=h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+" }\n"
+msgstr ""
+" for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)\n"
+" for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {\n"
+" hh=h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:643
+#, no-wrap
+msgid ""
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+msgstr ""
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:647
+#, no-wrap
+msgid ""
+" /* report the event */\n"
+" xpt_async(AC_BUS_RESET, softc->wpath, NULL);\n"
+" return;\n"
+msgstr ""
+" /* report the event */\n"
+" xpt_async(AC_BUS_RESET, softc->wpath, NULL);\n"
+" return;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:650
+msgid ""
+"Implementing the SCSI bus reset as a function may be a good idea because it "
+"would be re-used by the timeout function as a last resort if the things go "
+"wrong."
+msgstr ""
+"Реализация сброса шины SCSI в виде функции может быть хорошей идеей, так как "
+"она может быть повторно использована функцией таймаута в качестве последнего "
+"средства, если что-то пойдёт не так."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:651
+#, no-wrap
+msgid "_XPT_ABORT_ - abort the specified CCB"
+msgstr "_XPT_ABORT_ - прервать указанный CCB"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:655
+msgid ""
+"The arguments are transferred in the instance \"struct ccb_abort cab\" of "
+"the union ccb. The only argument field in it is:"
+msgstr ""
+"Аргументы передаются в экземпляре \"struct ccb_abort cab\" объединения ccb. "
+"Единственное поле аргумента в нём:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:657
+msgid "_abort_ccb_ - pointer to the CCB to be aborted"
+msgstr "_abort_ccb_ — указатель на CCB, который необходимо прервать"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:660
+msgid ""
+"If the abort is not supported just return the status CAM_UA_ABORT. This is "
+"also the easy way to minimally implement this call, return CAM_UA_ABORT in "
+"any case."
+msgstr ""
+"Если прерывание не поддерживается, просто верните статус CAM_UA_ABORT. Это "
+"также простой способ минимальной реализации этого вызова — в любом случае "
+"возвращать CAM_UA_ABORT."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:663
+msgid ""
+"The hard way is to implement this request honestly. First check that abort "
+"applies to a SCSI transaction:"
+msgstr ""
+"Трудный путь — честно реализовать этот запрос. Сначала проверьте, что "
+"прерывание применяется к SCSI-транзакции:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:668
+#, no-wrap
+msgid ""
+" struct ccb *abort_ccb;\n"
+" abort_ccb = ccb->cab.abort_ccb;\n"
+msgstr ""
+" struct ccb *abort_ccb;\n"
+" abort_ccb = ccb->cab.abort_ccb;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:674
+#, no-wrap
+msgid ""
+" if (abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {\n"
+" ccb->ccb_h.status = CAM_UA_ABORT;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+msgstr ""
+" if (abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {\n"
+" ccb->ccb_h.status = CAM_UA_ABORT;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:678
+msgid ""
+"Then it is necessary to find this CCB in our queue. This can be done by "
+"walking the list of all our hardware control blocks in search for one "
+"associated with this CCB:"
+msgstr ""
+"Затем необходимо найти этот CCB в нашей очереди. Это можно сделать, пройдясь "
+"по списку всех наших блоков управления оборудованием в поисках связанного с "
+"этим CCB:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:682
+#, no-wrap
+msgid " struct xxx_hcb *hcb, *h;\n"
+msgstr " struct xxx_hcb *hcb, *h;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:684
+#, no-wrap
+msgid " hcb = NULL;\n"
+msgstr " hcb = NULL;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:695
+#, no-wrap
+msgid ""
+" /* We assume that softc->first_hcb is the head of the list of all\n"
+" * HCBs associated with this bus, including those enqueued for\n"
+" * processing, being processed by hardware and disconnected ones.\n"
+" */\n"
+" for (h = softc->first_hcb; h != NULL; h = h->next) {\n"
+" if (h->ccb == abort_ccb) {\n"
+" hcb = h;\n"
+" break;\n"
+" }\n"
+" }\n"
+msgstr ""
+" /* We assume that softc->first_hcb is the head of the list of all\n"
+" * HCBs associated with this bus, including those enqueued for\n"
+" * processing, being processed by hardware and disconnected ones.\n"
+" */\n"
+" for (h = softc->first_hcb; h != NULL; h = h->next) {\n"
+" if (h->ccb == abort_ccb) {\n"
+" hcb = h;\n"
+" break;\n"
+" }\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:702
+#, no-wrap
+msgid ""
+" if (hcb == NULL) {\n"
+" /* no such CCB in our queue */\n"
+" ccb->ccb_h.status = CAM_PATH_INVALID;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+msgstr ""
+" if (hcb == NULL) {\n"
+" /* no such CCB in our queue */\n"
+" ccb->ccb_h.status = CAM_PATH_INVALID;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:704
+#, no-wrap
+msgid " hcb=found_hcb;\n"
+msgstr " hcb=found_hcb;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:709
+msgid ""
+"Now we look at the current processing status of the HCB. It may be either "
+"sitting in the queue waiting to be sent to the SCSI bus, being transferred "
+"right now, or disconnected and waiting for the result of the command, or "
+"actually completed by hardware but not yet marked as done by software. To "
+"make sure that we do not get in any races with hardware we mark the HCB as "
+"being aborted, so that if this HCB is about to be sent to the SCSI bus the "
+"SCSI controller will see this flag and skip it."
+msgstr ""
+"Теперь мы рассмотрим текущее состояние обработки HCB. Он может находиться в "
+"очереди, ожидая отправки на шину SCSI, передаваться в данный момент, быть "
+"отключенным и ожидать результата команды, или фактически завершённым с точки "
+"зрения аппаратуры, но ещё не отмеченным программным обеспечением, как "
+"выполненный. Чтобы избежать состояний гонки с аппаратурой, мы помечаем HCB "
+"как прерванный, так что если этот HCB вот-вот будет отправлен на шину SCSI, "
+"контроллер SCSI увидит этот флаг и пропустит его."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:713
+#, no-wrap
+msgid " int hstatus;\n"
+msgstr " int hstatus;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:718
+#, no-wrap
+msgid ""
+" /* shown as a function, in case special action is needed to make\n"
+" * this flag visible to hardware\n"
+" */\n"
+" set_hcb_flags(hcb, HCB_BEING_ABORTED);\n"
+msgstr ""
+" /* shown as a function, in case special action is needed to make\n"
+" * this flag visible to hardware\n"
+" */\n"
+" set_hcb_flags(hcb, HCB_BEING_ABORTED);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:720
+#, no-wrap
+msgid " abort_again:\n"
+msgstr " abort_again:\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:730
+#, no-wrap
+msgid ""
+" hstatus = get_hcb_status(hcb);\n"
+" switch (hstatus) {\n"
+" case HCB_SITTING_IN_QUEUE:\n"
+" remove_hcb_from_hardware_queue(hcb);\n"
+" /* FALLTHROUGH */\n"
+" case HCB_COMPLETED:\n"
+" /* this is an easy case */\n"
+" free_hcb_and_ccb_done(hcb, abort_ccb, CAM_REQ_ABORTED);\n"
+" break;\n"
+msgstr ""
+" hstatus = get_hcb_status(hcb);\n"
+" switch (hstatus) {\n"
+" case HCB_SITTING_IN_QUEUE:\n"
+" remove_hcb_from_hardware_queue(hcb);\n"
+" /* FALLTHROUGH */\n"
+" case HCB_COMPLETED:\n"
+" /* this is an easy case */\n"
+" free_hcb_and_ccb_done(hcb, abort_ccb, CAM_REQ_ABORTED);\n"
+" break;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:737
+msgid ""
+"If the CCB is being transferred right now we would like to signal to the "
+"SCSI controller in some hardware-dependent way that we want to abort the "
+"current transfer. The SCSI controller would set the SCSI ATTENTION signal "
+"and when the target responds to it send an ABORT message. We also reset the "
+"timeout to make sure that the target is not sleeping forever. If the "
+"command would not get aborted in some reasonable time like 10 seconds the "
+"timeout routine would go ahead and reset the whole SCSI bus. Since the "
+"command will be aborted in some reasonable time we can just return the abort "
+"request now as successfully completed, and mark the aborted CCB as aborted "
+"(but not mark it as done yet)."
+msgstr ""
+"Если CCB передаётся в данный момент, мы хотели бы сигнализировать "
+"контроллеру SCSI аппаратно-зависимым способом, что хотим прервать текущую "
+"передачу. Контроллер SCSI установит сигнал SCSI ATTENTION, и когда целевое "
+"устройство ответит на него, отправит сообщение ABORT. Мы также сбрасываем "
+"таймаут, чтобы убедиться, что целевое устройство не засыпает навсегда. Если "
+"команда не будет прервана в разумное время, например, за 10 секунд, "
+"процедура таймаута продолжит работу и сбросит всю шину SCSI. Поскольку "
+"команда будет прервана в разумные сроки, мы можем просто вернуть запрос на "
+"прерывание как успешно выполненный и пометить прерванный CCB как прерванный "
+"(но пока не помечать его как завершённый)."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:753
+#, no-wrap
+msgid ""
+" case HCB_BEING_TRANSFERRED:\n"
+" untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);\n"
+" abort_ccb->ccb_h.timeout_ch =\n"
+" timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);\n"
+" abort_ccb->ccb_h.status = CAM_REQ_ABORTED;\n"
+" /* ask the controller to abort that HCB, then generate\n"
+" * an interrupt and stop\n"
+" */\n"
+" if (signal_hardware_to_abort_hcb_and_stop(hcb) < 0) {\n"
+" /* oops, we missed the race with hardware, this transaction\n"
+" * got off the bus before we aborted it, try again */\n"
+" goto abort_again;\n"
+" }\n"
+msgstr ""
+" case HCB_BEING_TRANSFERRED:\n"
+" untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);\n"
+" abort_ccb->ccb_h.timeout_ch =\n"
+" timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);\n"
+" abort_ccb->ccb_h.status = CAM_REQ_ABORTED;\n"
+" /* ask the controller to abort that HCB, then generate\n"
+" * an interrupt and stop\n"
+" */\n"
+" if (signal_hardware_to_abort_hcb_and_stop(hcb) < 0) {\n"
+" /* oops, we missed the race with hardware, this transaction\n"
+" * got off the bus before we aborted it, try again */\n"
+" goto abort_again;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:755
+#, no-wrap
+msgid " break;\n"
+msgstr " break;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:759
+msgid ""
+"If the CCB is in the list of disconnected then set it up as an abort request "
+"and re-queue it at the front of hardware queue. Reset the timeout and "
+"report the abort request to be completed."
+msgstr ""
+"Если CCB находится в списке отключенных, то настроить его как запрос "
+"прерывания и повторно поставить в начало аппаратной очереди. Сбросить "
+"таймаут и сообщить о завершении запроса прерывания."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:773
+#, no-wrap
+msgid ""
+" case HCB_DISCONNECTED:\n"
+" untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);\n"
+" abort_ccb->ccb_h.timeout_ch =\n"
+" timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);\n"
+" put_abort_message_into_hcb(hcb);\n"
+" put_hcb_at_the_front_of_hardware_queue(hcb);\n"
+" break;\n"
+" }\n"
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+msgstr ""
+" case HCB_DISCONNECTED:\n"
+" untimeout(xxx_timeout, (caddr_t) hcb, abort_ccb->ccb_h.timeout_ch);\n"
+" abort_ccb->ccb_h.timeout_ch =\n"
+" timeout(xxx_timeout, (caddr_t) hcb, 10 * hz);\n"
+" put_abort_message_into_hcb(hcb);\n"
+" put_hcb_at_the_front_of_hardware_queue(hcb);\n"
+" break;\n"
+" }\n"
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:778
+msgid ""
+"That is all for the ABORT request, although there is one more issue. As the "
+"ABORT message cleans all the ongoing transactions on a LUN we have to mark "
+"all the other active transactions on this LUN as aborted. That should be "
+"done in the interrupt routine, after the transaction gets aborted."
+msgstr ""
+"Вот и все, что касается запроса ABORT, хотя есть еще один момент. Поскольку "
+"сообщение ABORT очищает все текущие транзакции на LUN, нам необходимо "
+"пометить все остальные активные транзакции на этом LUN как прерванные. Это "
+"должно быть выполнено в процедуре аппаратного прерывания после того, как "
+"транзакция будет прервана."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:782
+msgid ""
+"Implementing the CCB abort as a function may be quite a good idea, this "
+"function can be re-used if an I/O transaction times out. The only "
+"difference would be that the timed out transaction would return the status "
+"CAM_CMD_TIMEOUT for the timed out request. Then the case XPT_ABORT would be "
+"small, like that:"
+msgstr ""
+"Реализация прерывания CCB в виде функции может быть довольно хорошей идеей, "
+"эта функция может быть повторно использована, если транзакция ввода-вывода "
+"превысит время ожидания. Единственное различие будет в том, что для "
+"транзакции с истекшим временем ожидания будет возвращён статус "
+"CAM_CMD_TIMEOUT. Тогда код в case XPT_ABORT будет небольшим, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:788
+#, no-wrap
+msgid ""
+" case XPT_ABORT:\n"
+" struct ccb *abort_ccb;\n"
+" abort_ccb = ccb->cab.abort_ccb;\n"
+msgstr ""
+" case XPT_ABORT:\n"
+" struct ccb *abort_ccb;\n"
+" abort_ccb = ccb->cab.abort_ccb;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:801
+#, no-wrap
+msgid ""
+" if (abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {\n"
+" ccb->ccb_h.status = CAM_UA_ABORT;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+" if (xxx_abort_ccb(abort_ccb, CAM_REQ_ABORTED) < 0)\n"
+" /* no such CCB in our queue */\n"
+" ccb->ccb_h.status = CAM_PATH_INVALID;\n"
+" else\n"
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+msgstr ""
+" if (abort_ccb->ccb_h.func_code != XPT_SCSI_IO) {\n"
+" ccb->ccb_h.status = CAM_UA_ABORT;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+" }\n"
+" if (xxx_abort_ccb(abort_ccb, CAM_REQ_ABORTED) < 0)\n"
+" /* no such CCB in our queue */\n"
+" ccb->ccb_h.status = CAM_PATH_INVALID;\n"
+" else\n"
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:803
+#, no-wrap
+msgid "_XPT_SET_TRAN_SETTINGS_ - explicitly set values of SCSI transfer settings"
+msgstr "_XPT_SET_TRAN_SETTINGS_ - явно установить значения настроек передачи SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:806
+msgid ""
+"The arguments are transferred in the instance \"struct ccb_trans_setting "
+"cts\" of the union ccb:"
+msgstr ""
+"Аргументы передаются в экземпляре \"struct ccb_trans_setting cts\" "
+"объединения ccb:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:808
+msgid "_valid_ - a bitmask showing which settings should be updated:"
+msgstr ""
+"_valid_ - битовая маска, показывающая, какие настройки должны быть обновлены:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:809
+msgid "_CCB_TRANS_SYNC_RATE_VALID_ - synchronous transfer rate"
+msgstr "_CCB_TRANS_SYNC_RATE_VALID_ - скорость синхронной передачи"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:810
+msgid "_CCB_TRANS_SYNC_OFFSET_VALID_ - synchronous offset"
+msgstr "_CCB_TRANS_SYNC_OFFSET_VALID_ - синхронное смещение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:811
+msgid "_CCB_TRANS_BUS_WIDTH_VALID_ - bus width"
+msgstr "_CCB_TRANS_BUS_WIDTH_VALID_ - ширина шины"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:812
+msgid "_CCB_TRANS_DISC_VALID_ - set enable/disable disconnection"
+msgstr "_CCB_TRANS_DISC_VALID_ - установить разрешение/запрет отключения"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:813
+msgid "_CCB_TRANS_TQ_VALID_ - set enable/disable tagged queuing"
+msgstr "_CCB_TRANS_TQ_VALID_ - установить разрешение/запрет очередей с тегами"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:815
+msgid ""
+"_flags_ - consists of two parts, binary arguments and identification of sub-"
+"operations. The binary arguments are:"
+msgstr ""
+"_flags_ - состоит из двух частей: бинарных аргументов и идентификации "
+"подопераций. Бинарные аргументы:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:816
+msgid "_CCB_TRANS_DISC_ENB_ - enable disconnection"
+msgstr "_CCB_TRANS_DISC_ENB_ - разрешить отключение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:817
+msgid "_CCB_TRANS_TAG_ENB_ - enable tagged queuing"
+msgstr "_CCB_TRANS_TAG_ENB_ - разрешить тегированную очередь"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:818
+msgid "the sub-operations are:"
+msgstr "подоперации:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:819
+msgid "_CCB_TRANS_CURRENT_SETTINGS_ - change the current negotiations"
+msgstr "_CCB_TRANS_CURRENT_SETTINGS_ - изменить текущие параметры согласования"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:820
+msgid ""
+"_CCB_TRANS_USER_SETTINGS_ - remember the desired user values sync_period, "
+"sync_offset - self-explanatory, if sync_offset==0 then the asynchronous mode "
+"is requested bus_width - bus width, in bits (not bytes)"
+msgstr ""
+"_CCB_TRANS_USER_SETTINGS_ - сохранять желаемые пользовательские значения "
+"sync_period, sync_offset - самоочевидные параметры; если sync_offset==0, то "
+"запрашивается асинхронный режим bus_width - ширина шины в битах (не в байтах)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:825
+msgid ""
+"Two sets of negotiated parameters are supported, the user settings and the "
+"current settings. The user settings are not really used much in the SIM "
+"drivers, this is mostly just a piece of memory where the upper levels can "
+"store (and later recall) its ideas about the parameters. Setting the user "
+"parameters does not cause re-negotiation of the transfer rates. But when "
+"the SCSI controller does a negotiation it must never set the values higher "
+"than the user parameters, so it is essentially the top boundary."
+msgstr ""
+"Поддерживаются два набора согласованных параметров: пользовательские "
+"настройки и текущие настройки. Пользовательские настройки не так часто "
+"используются в драйверах SIM, это в основном просто область памяти, где "
+"верхние уровни могут сохранять (и позже извлекать) свои представления о "
+"параметрах. Установка пользовательских параметров не вызывает повторного "
+"согласования скоростей передачи. Однако, когда SCSI-контроллер выполняет "
+"согласование, он никогда не должен устанавливать значения выше "
+"пользовательских параметров, так что они по сути являются верхней границей."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:830
+msgid ""
+"The current settings are, as the name says, current. Changing them means "
+"that the parameters must be re-negotiated on the next transfer. Again, "
+"these \"new current settings\" are not supposed to be forced on the device, "
+"just they are used as the initial step of negotiations. Also they must be "
+"limited by actual capabilities of the SCSI controller: for example, if the "
+"SCSI controller has 8-bit bus and the request asks to set 16-bit wide "
+"transfers this parameter must be silently truncated to 8-bit transfers "
+"before sending it to the device."
+msgstr ""
+"Текущие настройки, как следует из названия, являются текущими. Их изменение "
+"означает, что параметры должны быть повторно согласованы при следующей "
+"передаче. Опять же, эти «новые текущие настройки» не предназначены для "
+"принудительного применения к устройству, они лишь используются в качестве "
+"начального шага переговоров. Кроме того, они должны быть ограничены "
+"реальными возможностями SCSI-контроллера: например, если SCSI-контроллер "
+"имеет 8-битную шину, а запрос требует установки 16-битных передач, этот "
+"параметр должен быть тихо усечён до 8-битных передач перед отправкой на "
+"устройство."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:832
+msgid ""
+"One caveat is that the bus width and synchronous parameters are per target "
+"while the disconnection and tag enabling parameters are per lun."
+msgstr ""
+"Один нюанс заключается в том, что ширина шины и синхронные параметры "
+"относятся к цели, тогда как параметры отключения и включения тегов относятся "
+"к логическому устройству LUN."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:834
+msgid ""
+"The recommended implementation is to keep 3 sets of negotiated (bus width "
+"and synchronous transfer) parameters:"
+msgstr ""
+"Рекомендуемая реализация заключается в хранении 3 наборов согласованных "
+"параметров (ширина шины и синхронная передача):"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:836
+msgid "_user_ - the user set, as above"
+msgstr "_user_ - пользовательский набор, как указано выше"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:837
+msgid "_current_ - those actually in effect"
+msgstr "_current_ - тот, который фактически действуют"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:838
+msgid "_goal_ - those requested by setting of the \"current\" parameters"
+msgstr ""
+"_goal_ - тот набор, который запрошен для установки параметров в качестве "
+"\"текущих\""
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:840
+msgid "The code looks like:"
+msgstr "Код выглядит следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:846
+#, no-wrap
+msgid ""
+" struct ccb_trans_settings *cts;\n"
+" int targ, lun;\n"
+" int flags;\n"
+msgstr ""
+" struct ccb_trans_settings *cts;\n"
+" int targ, lun;\n"
+" int flags;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:858
+#, no-wrap
+msgid ""
+" cts = &ccb->cts;\n"
+" targ = ccb_h->target_id;\n"
+" lun = ccb_h->target_lun;\n"
+" flags = cts->flags;\n"
+" if (flags & CCB_TRANS_USER_SETTINGS) {\n"
+" if (flags & CCB_TRANS_SYNC_RATE_VALID)\n"
+" softc->user_sync_period[targ] = cts->sync_period;\n"
+" if (flags & CCB_TRANS_SYNC_OFFSET_VALID)\n"
+" softc->user_sync_offset[targ] = cts->sync_offset;\n"
+" if (flags & CCB_TRANS_BUS_WIDTH_VALID)\n"
+" softc->user_bus_width[targ] = cts->bus_width;\n"
+msgstr ""
+" cts = &ccb->cts;\n"
+" targ = ccb_h->target_id;\n"
+" lun = ccb_h->target_lun;\n"
+" flags = cts->flags;\n"
+" if (flags & CCB_TRANS_USER_SETTINGS) {\n"
+" if (flags & CCB_TRANS_SYNC_RATE_VALID)\n"
+" softc->user_sync_period[targ] = cts->sync_period;\n"
+" if (flags & CCB_TRANS_SYNC_OFFSET_VALID)\n"
+" softc->user_sync_offset[targ] = cts->sync_offset;\n"
+" if (flags & CCB_TRANS_BUS_WIDTH_VALID)\n"
+" softc->user_bus_width[targ] = cts->bus_width;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:877
+#, no-wrap
+msgid ""
+" if (flags & CCB_TRANS_DISC_VALID) {\n"
+" softc->user_tflags[targ][lun] &= ~CCB_TRANS_DISC_ENB;\n"
+" softc->user_tflags[targ][lun] |= flags & CCB_TRANS_DISC_ENB;\n"
+" }\n"
+" if (flags & CCB_TRANS_TQ_VALID) {\n"
+" softc->user_tflags[targ][lun] &= ~CCB_TRANS_TQ_ENB;\n"
+" softc->user_tflags[targ][lun] |= flags & CCB_TRANS_TQ_ENB;\n"
+" }\n"
+" }\n"
+" if (flags & CCB_TRANS_CURRENT_SETTINGS) {\n"
+" if (flags & CCB_TRANS_SYNC_RATE_VALID)\n"
+" softc->goal_sync_period[targ] =\n"
+" max(cts->sync_period, OUR_MIN_SUPPORTED_PERIOD);\n"
+" if (flags & CCB_TRANS_SYNC_OFFSET_VALID)\n"
+" softc->goal_sync_offset[targ] =\n"
+" min(cts->sync_offset, OUR_MAX_SUPPORTED_OFFSET);\n"
+" if (flags & CCB_TRANS_BUS_WIDTH_VALID)\n"
+" softc->goal_bus_width[targ] = min(cts->bus_width, OUR_BUS_WIDTH);\n"
+msgstr ""
+" if (flags & CCB_TRANS_DISC_VALID) {\n"
+" softc->user_tflags[targ][lun] &= ~CCB_TRANS_DISC_ENB;\n"
+" softc->user_tflags[targ][lun] |= flags & CCB_TRANS_DISC_ENB;\n"
+" }\n"
+" if (flags & CCB_TRANS_TQ_VALID) {\n"
+" softc->user_tflags[targ][lun] &= ~CCB_TRANS_TQ_ENB;\n"
+" softc->user_tflags[targ][lun] |= flags & CCB_TRANS_TQ_ENB;\n"
+" }\n"
+" }\n"
+" if (flags & CCB_TRANS_CURRENT_SETTINGS) {\n"
+" if (flags & CCB_TRANS_SYNC_RATE_VALID)\n"
+" softc->goal_sync_period[targ] =\n"
+" max(cts->sync_period, OUR_MIN_SUPPORTED_PERIOD);\n"
+" if (flags & CCB_TRANS_SYNC_OFFSET_VALID)\n"
+" softc->goal_sync_offset[targ] =\n"
+" min(cts->sync_offset, OUR_MAX_SUPPORTED_OFFSET);\n"
+" if (flags & CCB_TRANS_BUS_WIDTH_VALID)\n"
+" softc->goal_bus_width[targ] = min(cts->bus_width, OUR_BUS_WIDTH);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:890
+#, no-wrap
+msgid ""
+" if (flags & CCB_TRANS_DISC_VALID) {\n"
+" softc->current_tflags[targ][lun] &= ~CCB_TRANS_DISC_ENB;\n"
+" softc->current_tflags[targ][lun] |= flags & CCB_TRANS_DISC_ENB;\n"
+" }\n"
+" if (flags & CCB_TRANS_TQ_VALID) {\n"
+" softc->current_tflags[targ][lun] &= ~CCB_TRANS_TQ_ENB;\n"
+" softc->current_tflags[targ][lun] |= flags & CCB_TRANS_TQ_ENB;\n"
+" }\n"
+" }\n"
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+msgstr ""
+" if (flags & CCB_TRANS_DISC_VALID) {\n"
+" softc->current_tflags[targ][lun] &= ~CCB_TRANS_DISC_ENB;\n"
+" softc->current_tflags[targ][lun] |= flags & CCB_TRANS_DISC_ENB;\n"
+" }\n"
+" if (flags & CCB_TRANS_TQ_VALID) {\n"
+" softc->current_tflags[targ][lun] &= ~CCB_TRANS_TQ_ENB;\n"
+" softc->current_tflags[targ][lun] |= flags & CCB_TRANS_TQ_ENB;\n"
+" }\n"
+" }\n"
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:894
+msgid ""
+"Then when the next I/O request will be processed it will check if it has to "
+"re-negotiate, for example by calling the function target_negotiated(hcb). "
+"It can be implemented like this:"
+msgstr ""
+"Затем, когда следующий запрос ввода-вывода будет обработан, он проверит, "
+"нужно ли повторное согласование, например, вызовом функции "
+"target_negotiated(hcb). Это может быть реализовано следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:902
+#, no-wrap
+msgid ""
+" int\n"
+" target_negotiated(struct xxx_hcb *hcb)\n"
+" {\n"
+" struct softc *softc = hcb->softc;\n"
+" int targ = hcb->targ;\n"
+msgstr ""
+" int\n"
+" target_negotiated(struct xxx_hcb *hcb)\n"
+" {\n"
+" struct softc *softc = hcb->softc;\n"
+" int targ = hcb->targ;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:910
+#, no-wrap
+msgid ""
+" if (softc->current_sync_period[targ] != softc->goal_sync_period[targ]\n"
+" || softc->current_sync_offset[targ] != softc->goal_sync_offset[targ]\n"
+" || softc->current_bus_width[targ] != softc->goal_bus_width[targ])\n"
+" return 0; /* FALSE */\n"
+" else\n"
+" return 1; /* TRUE */\n"
+" }\n"
+msgstr ""
+" if (softc->current_sync_period[targ] != softc->goal_sync_period[targ]\n"
+" || softc->current_sync_offset[targ] != softc->goal_sync_offset[targ]\n"
+" || softc->current_bus_width[targ] != softc->goal_bus_width[targ])\n"
+" return 0; /* FALSE */\n"
+" else\n"
+" return 1; /* TRUE */\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:914
+msgid ""
+"After the values are re-negotiated the resulting values must be assigned to "
+"both current and goal parameters, so for future I/O transactions the current "
+"and goal parameters would be the same and `target_negotiated()` would return "
+"TRUE. When the card is initialized (in `xxx_attach()`) the current "
+"negotiation values must be initialized to narrow asynchronous mode, the goal "
+"and current values must be initialized to the maximal values supported by "
+"controller."
+msgstr ""
+"После пересогласования значений полученные значения должны быть присвоены "
+"как текущим, так и целевым параметрам, чтобы для будущих операций ввода-"
+"вывода текущие и целевые параметры совпадали, и функция "
+"`target_negotiated()` возвращала TRUE. При инициализации карты (в "
+"`xxx_attach()`) текущие параметры согласования должны быть инициализированы "
+"узким асинхронным режимом, а целевые и текущие значения должны быть "
+"инициализированы максимальными значениями, поддерживаемыми контроллером."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:915
+#, no-wrap
+msgid "_XPT_GET_TRAN_SETTINGS_ - get values of SCSI transfer settings"
+msgstr "_XPT_GET_TRAN_SETTINGS_ - получить значения настроек передачи SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:920
+msgid ""
+"This operations is the reverse of XPT_SET_TRAN_SETTINGS. Fill up the CCB "
+"instance \"struct ccb_trans_setting cts\" with data as requested by the "
+"flags CCB_TRANS_CURRENT_SETTINGS or CCB_TRANS_USER_SETTINGS (if both are set "
+"then the existing drivers return the current settings). Set all the bits in "
+"the valid field."
+msgstr ""
+"Эта операция является обратной XPT_SET_TRAN_SETTINGS. Заполните экземпляр "
+"CCB \"struct ccb_trans_setting cts\" данными, запрошенными флагами "
+"CCB_TRANS_CURRENT_SETTINGS или CCB_TRANS_USER_SETTINGS (если установлены "
+"оба, существующие драйверы возвращают текущие настройки). Установите все "
+"биты в поле valid."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:921
+#, no-wrap
+msgid "_XPT_CALC_GEOMETRY_ - calculate logical (BIOS) geometry of the disk"
+msgstr "_XPT_CALC_GEOMETRY_ - вычислить логическую (BIOS) геометрию диска"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:924
+msgid ""
+"The arguments are transferred in the instance \"struct ccb_calc_geometry "
+"ccg\" of the union ccb:"
+msgstr ""
+"Аргументы передаются в экземпляре \"struct ccb_calc_geometry ccg\" "
+"объединения ccb:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:926
+msgid "_block_size_ - input, block (A.K.A sector) size in bytes"
+msgstr ""
+"_block_size_ - вход, размер блока (также известный как сектор) в байтах"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:927
+msgid "_volume_size_ - input, volume size in bytes"
+msgstr "_volume_size_ - вход, размер тома в байтах"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:928
+msgid "_cylinders_ - output, logical cylinders"
+msgstr "_cylinders_ - выход, логические цилиндры"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:929
+msgid "_heads_ - output, logical heads"
+msgstr "_heads_ - выход, логические головки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:930
+msgid "_secs_per_track_ - output, logical sectors per track"
+msgstr "_secs_per_track_ - выход, логических секторов на дорожку"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:933
+msgid ""
+"If the returned geometry differs much enough from what the SCSI controller "
+"BIOS thinks and a disk on this SCSI controller is used as bootable the "
+"system may not be able to boot. The typical calculation example taken from "
+"the aic7xxx driver is:"
+msgstr ""
+"Если возвращённая геометрия значительно отличается от той, которую "
+"предполагает BIOS SCSI-контроллера, и диск на этом SCSI-контроллере "
+"используется как загрузочный, система может не загрузиться. Типичный пример "
+"расчёта, взятый из драйвера `aic7xxx`, выглядит следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:940
+#, no-wrap
+msgid ""
+" struct ccb_calc_geometry *ccg;\n"
+" u_int32_t size_mb;\n"
+" u_int32_t secs_per_cylinder;\n"
+" int extended;\n"
+msgstr ""
+" struct ccb_calc_geometry *ccg;\n"
+" u_int32_t size_mb;\n"
+" u_int32_t secs_per_cylinder;\n"
+" int extended;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:945
+#, no-wrap
+msgid ""
+" ccg = &ccb->ccg;\n"
+" size_mb = ccg->volume_size\n"
+" / ((1024L * 1024L) / ccg->block_size);\n"
+" extended = check_cards_EEPROM_for_extended_geometry(softc);\n"
+msgstr ""
+" ccg = &ccb->ccg;\n"
+" size_mb = ccg->volume_size\n"
+" / ((1024L * 1024L) / ccg->block_size);\n"
+" extended = check_cards_EEPROM_for_extended_geometry(softc);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:958
+#, no-wrap
+msgid ""
+" if (size_mb > 1024 && extended) {\n"
+" ccg->heads = 255;\n"
+" ccg->secs_per_track = 63;\n"
+" } else {\n"
+" ccg->heads = 64;\n"
+" ccg->secs_per_track = 32;\n"
+" }\n"
+" secs_per_cylinder = ccg->heads * ccg->secs_per_track;\n"
+" ccg->cylinders = ccg->volume_size / secs_per_cylinder;\n"
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+msgstr ""
+" if (size_mb > 1024 && extended) {\n"
+" ccg->heads = 255;\n"
+" ccg->secs_per_track = 63;\n"
+" } else {\n"
+" ccg->heads = 64;\n"
+" ccg->secs_per_track = 32;\n"
+" }\n"
+" secs_per_cylinder = ccg->heads * ccg->secs_per_track;\n"
+" ccg->cylinders = ccg->volume_size / secs_per_cylinder;\n"
+" ccb->ccb_h.status = CAM_REQ_CMP;\n"
+" xpt_done(ccb);\n"
+" return;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:963
+msgid ""
+"This gives the general idea, the exact calculation depends on the quirks of "
+"the particular BIOS. If BIOS provides no way set the \"extended "
+"translation\" flag in EEPROM this flag should normally be assumed equal to "
+"1. Other popular geometries are:"
+msgstr ""
+"Это дает общее представление, точный расчет зависит от особенностей "
+"конкретной BIOS. Если BIOS не предоставляет возможности установить флаг "
+"\"расширенной трансляции\" в EEPROM, этот флаг обычно следует считать равным "
+"1. Другие популярные геометрии:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:968
+#, no-wrap
+msgid ""
+" 128 heads, 63 sectors - Symbios controllers\n"
+" 16 heads, 63 sectors - old controllers\n"
+msgstr ""
+" 128 heads, 63 sectors - Symbios controllers\n"
+" 16 heads, 63 sectors - old controllers\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:971
+msgid ""
+"Some system BIOSes and SCSI BIOSes fight with each other with variable "
+"success, for example a combination of Symbios 875/895 SCSI and Phoenix BIOS "
+"can give geometry 128/63 after power up and 255/63 after a hard reset or "
+"soft reboot."
+msgstr ""
+"Некоторые системные BIOS и SCSI BIOS конфликтуют друг с другом с переменным "
+"успехом. Например, комбинация Symbios 875/895 SCSI и Phoenix BIOS может "
+"выдавать геометрию 128/63 после включения питания и 255/63 после жесткого "
+"сброса или мягкой перезагрузки."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:972
+#, no-wrap
+msgid "_XPT_PATH_INQ_ - path inquiry, in other words get the SIM driver and SCSI controller (also known as HBA - Host Bus Adapter) properties"
+msgstr "_XPT_PATH_INQ_ - запрос пути, другими словами, получение свойств драйвера SIM и контроллера SCSI (также известного как HBA - Host Bus Adapter)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:975
+msgid ""
+"The properties are returned in the instance \"struct ccb_pathinq cpi\" of "
+"the union ccb:"
+msgstr ""
+"Свойства возвращаются в экземпляре \"struct ccb_pathinq cpi\" объединения "
+"ccb:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:977
+msgid "version_num - the SIM driver version number, now all drivers use 1"
+msgstr ""
+"`version_num` - номер версии драйвера SIM, в настоящее время все драйверы "
+"используют 1"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:978
+msgid "hba_inquiry - bitmask of features supported by the controller:"
+msgstr "hba_inquiry - битовая маска функций, поддерживаемых контроллером:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:979
+msgid "PI_MDP_ABLE - supports MDP message (something from SCSI3?)"
+msgstr "PI_MDP_ABLE - поддерживает сообщение MDP (что-то из SCSI3?)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:980
+msgid "PI_WIDE_32 - supports 32 bit wide SCSI"
+msgstr "PI_WIDE_32 — поддерживает 32-битную широкую SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:981
+msgid "PI_WIDE_16 - supports 16 bit wide SCSI"
+msgstr "PI_WIDE_16 — поддерживает 16-битную широкую SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:982
+msgid "PI_SDTR_ABLE - can negotiate synchronous transfer rate"
+msgstr "PI_SDTR_ABLE - может согласовать синхронную скорость передачи"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:983
+msgid "PI_LINKED_CDB - supports linked commands"
+msgstr "PI_LINKED_CDB - поддерживает связанные команды"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:984
+msgid "PI_TAG_ABLE - supports tagged commands"
+msgstr "PI_TAG_ABLE - поддерживает помеченные команды"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:985
+msgid ""
+"PI_SOFT_RST - supports soft reset alternative (hard reset and soft reset are "
+"mutually exclusive within a SCSI bus)"
+msgstr ""
+"PI_SOFT_RST — поддерживает альтернативу мягкого сброса (жесткий сброс и "
+"мягкий сброс являются взаимоисключающими в пределах шины SCSI)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:986
+msgid "target_sprt - flags for target mode support, 0 if unsupported"
+msgstr ""
+"target_sprt - флаги поддержки целевого режима, 0 если не поддерживается"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:987
+msgid "hba_misc - miscellaneous controller features:"
+msgstr "hba_misc - различные функции контроллера:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:988
+msgid "PIM_SCANHILO - bus scans from high ID to low ID"
+msgstr "PIM_SCANHILO - сканирование шины от высокого ID к низкому ID"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:989
+msgid "PIM_NOREMOVE - removable devices not included in scan"
+msgstr "PIM_NOREMOVE - съемные устройства не включены в сканирование"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:990
+msgid "PIM_NOINITIATOR - initiator role not supported"
+msgstr "PIM_NOINITIATOR - роль инициатора не поддерживается"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:991
+msgid "PIM_NOBUSRESET - user has disabled initial BUS RESET"
+msgstr "PIM_NOBUSRESET - пользователь отключил начальный BUS RESET"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:992
+msgid ""
+"hba_eng_cnt - mysterious HBA engine count, something related to compression, "
+"now is always set to 0"
+msgstr ""
+"hba_eng_cnt - загадочное количество движков HBA, что-то связанное со "
+"сжатием, в настоящее время всегда устанавливается в 0"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:993
+msgid "vuhba_flags - vendor-unique flags, unused now"
+msgstr ""
+"vuhba_flags - уникальные флаги производителя, в настоящее время не "
+"используются"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:994
+msgid ""
+"max_target - maximal supported target ID (7 for 8-bit bus, 15 for 16-bit "
+"bus, 127 for Fibre Channel)"
+msgstr ""
+"max_target - максимальный поддерживаемый идентификатор целевого устройства "
+"(7 для 8-битной шины, 15 для 16-битной шины, 127 для Fibre Channel)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:995
+msgid ""
+"max_lun - maximal supported LUN ID (7 for older SCSI controllers, 63 for "
+"newer ones)"
+msgstr ""
+"max_lun - максимально поддерживаемый идентификатор LUN (7 для старых SCSI-"
+"контроллеров, 63 для новых)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:996
+msgid "async_flags - bitmask of installed Async handler, unused now"
+msgstr ""
+"async_flags - битовая маска установленных обработчиков Async, в настоящее "
+"время не используется"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:997
+msgid "hpath_id - highest Path ID in the subsystem, unused now"
+msgstr ""
+"hpath_id - наивысший Path ID в подсистеме, в настоящее время не используется"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:998
+msgid "unit_number - the controller unit number, cam_sim_unit(sim)"
+msgstr "unit_number - номер контроллера, cam_sim_unit(sim)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:999
+msgid "bus_id - the bus number, cam_sim_bus(sim)"
+msgstr "bus_id - номер шины, cam_sim_bus(sim)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1000
+msgid "initiator_id - the SCSI ID of the controller itself"
+msgstr "initiator_id - SCSI ID самого контроллера"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1001
+msgid ""
+"base_transfer_speed - nominal transfer speed in KB/s for asynchronous narrow "
+"transfers, equals to 3300 for SCSI"
+msgstr ""
+"base_transfer_speed - номинальная скорость передачи в КБ/с для асинхронных "
+"узкополосных передач, равна 3300 для SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1002
+msgid ""
+"sim_vid - SIM driver's vendor id, a zero-terminated string of maximal length "
+"SIM_IDLEN including the terminating zero"
+msgstr ""
+"sim_vid - идентификатор производителя драйвера SIM, строка с нулевым "
+"окончанием максимальной длины SIM_IDLEN, включая завершающий ноль"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1003
+msgid ""
+"hba_vid - SCSI controller's vendor id, a zero-terminated string of maximal "
+"length HBA_IDLEN including the terminating zero"
+msgstr ""
+"hba_vid - идентификатор производителя SCSI-контроллера, строка с нулевым "
+"окончанием максимальной длины HBA_IDLEN, включая завершающий ноль"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1004
+msgid ""
+"dev_name - device driver name, a zero-terminated string of maximal length "
+"DEV_IDLEN including the terminating zero, equal to cam_sim_name(sim)"
+msgstr ""
+"dev_name - имя драйвера устройства, строка с нулевым окончанием максимальной "
+"длины DEV_IDLEN, включая завершающий ноль, эквивалентно cam_sim_name(sim)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1006
+msgid ""
+"The recommended way of setting the string fields is using strncpy, like:"
+msgstr ""
+"Рекомендуемый способ установки строковых полей — использование strncpy, "
+"например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1010
+#, no-wrap
+msgid " strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);\n"
+msgstr " strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1013
+msgid ""
+"After setting the values set the status to CAM_REQ_CMP and mark the CCB as "
+"done."
+msgstr ""
+"После установки значений установите статус в CAM_REQ_CMP и пометьте CCB как "
+"завершённый."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1015
+#, no-wrap
+msgid "Polling xxx_poll"
+msgstr "Опрос xxx_poll"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1029
+msgid ""
+"The poll function is used to simulate the interrupts when the interrupt "
+"subsystem is not functioning (for example, when the system has crashed and "
+"is creating the system dump). The CAM subsystem sets the proper interrupt "
+"level before calling the poll routine. So all it needs to do is to call the "
+"interrupt routine (or the other way around, the poll routine may be doing "
+"the real action and the interrupt routine would just call the poll "
+"routine). Why bother about a separate function then? This has to do with "
+"different calling conventions. The `xxx_poll` routine gets the struct "
+"cam_sim pointer as its argument while the PCI interrupt routine by common "
+"convention gets pointer to the struct `xxx_softc` and the ISA interrupt "
+"routine gets just the device unit number. So the poll routine would "
+"normally look as:"
+msgstr ""
+"Функция poll используется для имитации прерываний, когда подсистема "
+"прерываний не функционирует (например, когда система аварийно завершила "
+"работу и создает дамп памяти). Подсистема CAM устанавливает соответствующий "
+"уровень прерывания перед вызовом процедуры poll. Таким образом, все, что ей "
+"нужно сделать, — это вызвать процедуру прерывания (или наоборот, процедура "
+"poll может выполнять реальные действия, а процедура прерывания просто "
+"вызывает процедуру poll). Зачем тогда нужна отдельная функция? Это связано с "
+"различными соглашениями о вызовах. Процедура `xxx_poll` получает указатель "
+"на структуру cam_sim в качестве аргумента, в то время как процедура "
+"прерывания PCI по общему соглашению получает указатель на структуру "
+"`xxx_softc`, а процедура прерывания ISA получает только номер устройства. "
+"Таким образом, процедура poll обычно выглядит следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1037
+#, no-wrap
+msgid ""
+"static void\n"
+"xxx_poll(struct cam_sim *sim)\n"
+"{\n"
+" xxx_intr((struct xxx_softc *)cam_sim_softc(sim)); /* for PCI device */\n"
+"}\n"
+msgstr ""
+"static void\n"
+"xxx_poll(struct cam_sim *sim)\n"
+"{\n"
+" xxx_intr((struct xxx_softc *)cam_sim_softc(sim)); /* for PCI device */\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1040
+msgid "or"
+msgstr "или"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1048
+#, no-wrap
+msgid ""
+"static void\n"
+"xxx_poll(struct cam_sim *sim)\n"
+"{\n"
+" xxx_intr(cam_sim_unit(sim)); /* for ISA device */\n"
+"}\n"
+msgstr ""
+"static void\n"
+"xxx_poll(struct cam_sim *sim)\n"
+"{\n"
+" xxx_intr(cam_sim_unit(sim)); /* for ISA device */\n"
+"}\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1051
+#, no-wrap
+msgid "Asynchronous Events"
+msgstr "Асинхронные события"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1054
+msgid ""
+"If an asynchronous event callback has been set up then the callback function "
+"should be defined."
+msgstr ""
+"Если была настроена асинхронная callback-функция для события, то callback-"
+"функция должна быть определена."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1059
+#, no-wrap
+msgid ""
+"static void\n"
+"ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)\n"
+msgstr ""
+"static void\n"
+"ahc_async(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1062
+msgid "callback_arg - the value supplied when registering the callback"
+msgstr "callback_arg - значение, переданное при регистрации callback"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1063
+msgid "code - identifies the type of event"
+msgstr "code - определяет тип события"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1064
+msgid "path - identifies the devices to which the event applies"
+msgstr "path - определяет устройства, к которым применяется событие"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1065
+msgid "arg - event-specific argument"
+msgstr "arg - аргумент, специфичный для события"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1067
+msgid "Implementation for a single type of event, AC_LOST_DEVICE, looks like:"
+msgstr ""
+"Реализация для одного типа события, AC_LOST_DEVICE, выглядит следующим "
+"образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1074
+#, no-wrap
+msgid ""
+" struct xxx_softc *softc;\n"
+" struct cam_sim *sim;\n"
+" int targ;\n"
+" struct ccb_trans_settings neg;\n"
+msgstr ""
+" struct xxx_softc *softc;\n"
+" struct cam_sim *sim;\n"
+" int targ;\n"
+" struct ccb_trans_settings neg;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1093
+#, no-wrap
+msgid ""
+" sim = (struct cam_sim *)callback_arg;\n"
+" softc = (struct xxx_softc *)cam_sim_softc(sim);\n"
+" switch (code) {\n"
+" case AC_LOST_DEVICE:\n"
+" targ = xpt_path_target_id(path);\n"
+" if (targ <= OUR_MAX_SUPPORTED_TARGET) {\n"
+" clean_negotiations(softc, targ);\n"
+" /* send indication to CAM */\n"
+" neg.bus_width = 8;\n"
+" neg.sync_period = neg.sync_offset = 0;\n"
+" neg.valid = (CCB_TRANS_BUS_WIDTH_VALID\n"
+" | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);\n"
+" xpt_async(AC_TRANSFER_NEG, path, &neg);\n"
+" }\n"
+" break;\n"
+" default:\n"
+" break;\n"
+" }\n"
+msgstr ""
+" sim = (struct cam_sim *)callback_arg;\n"
+" softc = (struct xxx_softc *)cam_sim_softc(sim);\n"
+" switch (code) {\n"
+" case AC_LOST_DEVICE:\n"
+" targ = xpt_path_target_id(path);\n"
+" if (targ <= OUR_MAX_SUPPORTED_TARGET) {\n"
+" clean_negotiations(softc, targ);\n"
+" /* send indication to CAM */\n"
+" neg.bus_width = 8;\n"
+" neg.sync_period = neg.sync_offset = 0;\n"
+" neg.valid = (CCB_TRANS_BUS_WIDTH_VALID\n"
+" | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);\n"
+" xpt_async(AC_TRANSFER_NEG, path, &neg);\n"
+" }\n"
+" break;\n"
+" default:\n"
+" break;\n"
+" }\n"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1096
+#, no-wrap
+msgid "Interrupts"
+msgstr "Прерывания"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1099
+msgid ""
+"The exact type of the interrupt routine depends on the type of the "
+"peripheral bus (PCI, ISA and so on) to which the SCSI controller is "
+"connected."
+msgstr ""
+"Точный тип процедуры прерывания зависит от типа периферийной шины (PCI, ISA "
+"и так далее), к которой подключен SCSI-контроллер."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1106
+msgid ""
+"The interrupt routines of the SIM drivers run at the interrupt level "
+"splcam. So `splcam()` should be used in the driver to synchronize activity "
+"between the interrupt routine and the rest of the driver (for a "
+"multiprocessor-aware driver things get yet more interesting but we ignore "
+"this case here). The pseudo-code in this document happily ignores the "
+"problems of synchronization. The real code must not ignore them. A simple-"
+"minded approach is to set `splcam()` on the entry to the other routines and "
+"reset it on return thus protecting them by one big critical section. To "
+"make sure that the interrupt level will be always restored a wrapper "
+"function can be defined, like:"
+msgstr ""
+"Прерывания в драйверах SIM выполняются на уровне прерывания splcam. Поэтому "
+"в драйвере следует использовать `splcam()` для синхронизации между "
+"обработчиком прерывания и остальной частью драйвера (для драйверов, "
+"учитывающих многопроцессорность, ситуация становится ещё сложнее, но здесь "
+"мы этот случай не рассматриваем). Псевдокод в этом документе беззаботно "
+"игнорирует проблемы синхронизации. Реальный код так делать не должен. "
+"Простейший подход — установить `splcam()` при входе в другие функции и "
+"сбросить при выходе, защищая их одной большой критической секцией. Чтобы "
+"гарантировать восстановление уровня прерывания, можно определить обёрточную "
+"функцию, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1117
+#, no-wrap
+msgid ""
+" static void\n"
+" xxx_action(struct cam_sim *sim, union ccb *ccb)\n"
+" {\n"
+" int s;\n"
+" s = splcam();\n"
+" xxx_action1(sim, ccb);\n"
+" splx(s);\n"
+" }\n"
+msgstr ""
+" static void\n"
+" xxx_action(struct cam_sim *sim, union ccb *ccb)\n"
+" {\n"
+" int s;\n"
+" s = splcam();\n"
+" xxx_action1(sim, ccb);\n"
+" splx(s);\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1123
+#, no-wrap
+msgid ""
+" static void\n"
+" xxx_action1(struct cam_sim *sim, union ccb *ccb)\n"
+" {\n"
+" ... process the request ...\n"
+" }\n"
+msgstr ""
+" static void\n"
+" xxx_action1(struct cam_sim *sim, union ccb *ccb)\n"
+" {\n"
+" ... process the request ...\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1127
+msgid ""
+"This approach is simple and robust but the problem with it is that "
+"interrupts may get blocked for a relatively long time and this would "
+"negatively affect the system's performance. On the other hand the functions "
+"of the `spl()` family have rather high overhead, so vast amount of tiny "
+"critical sections may not be good either."
+msgstr ""
+"Этот подход прост и надежен, но проблема в том, что прерывания могут "
+"блокироваться на относительно долгое время, что негативно скажется на "
+"производительности системы. С другой стороны, функции семейства `spl()` "
+"имеют довольно высокие накладные расходы, поэтому большое количество мелких "
+"критических секций также может быть нежелательным."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1130
+msgid ""
+"The conditions handled by the interrupt routine and the details depend very "
+"much on the hardware. We consider the set of \"typical\" conditions."
+msgstr ""
+"Условия, обрабатываемые процедурой прерывания, и детали сильно зависят от "
+"оборудования. Мы рассматриваем набор \"типичных\" условий."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1135
+msgid ""
+"First, we check if a SCSI reset was encountered on the bus (probably caused "
+"by another SCSI controller on the same SCSI bus). If so we drop all the "
+"enqueued and disconnected requests, report the events and re-initialize our "
+"SCSI controller. It is important that during this initialization the "
+"controller will not issue another reset or else two controllers on the same "
+"SCSI bus could ping-pong resets forever. The case of fatal controller error/"
+"hang could be handled in the same place, but it will probably need also "
+"sending RESET signal to the SCSI bus to reset the status of the connections "
+"with the SCSI devices."
+msgstr ""
+"Сначала проверяем, было ли на шине событие SCSI сброса (вероятно, вызванное "
+"другим SCSI-контроллером на той же SCSI-шине). Если это так, мы отменяем все "
+"поставленные в очередь и отключенные запросы, сообщаем о событиях и повторно "
+"инициализируем наш SCSI-контроллер. Важно, чтобы во время этой инициализации "
+"контроллер не инициировал ещё один сброс, иначе два контроллера на одной "
+"SCSI-шине могут бесконечно обмениваться сбросами. Случай фатальной ошибки/"
+"зависания контроллера может быть обработан в том же месте, но, вероятно, "
+"также потребуется отправка сигнала RESET на SCSI-шину для сброса состояния "
+"соединений с SCSI-устройствами."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1141
+#, no-wrap
+msgid ""
+" int fatal=0;\n"
+" struct ccb_trans_settings neg;\n"
+" struct cam_path *path;\n"
+msgstr ""
+" int fatal=0;\n"
+" struct ccb_trans_settings neg;\n"
+" struct cam_path *path;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1146
+#, no-wrap
+msgid ""
+" if (detected_scsi_reset(softc)\n"
+" || (fatal = detected_fatal_controller_error(softc))) {\n"
+" int targ, lun;\n"
+" struct xxx_hcb *h, *hh;\n"
+msgstr ""
+" if (detected_scsi_reset(softc)\n"
+" || (fatal = detected_fatal_controller_error(softc))) {\n"
+" int targ, lun;\n"
+" struct xxx_hcb *h, *hh;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1152
+#, no-wrap
+msgid ""
+" /* drop all enqueued CCBs */\n"
+" for(h = softc->first_queued_hcb; h != NULL; h = hh) {\n"
+" hh = h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+msgstr ""
+" /* drop all enqueued CCBs */\n"
+" for(h = softc->first_queued_hcb; h != NULL; h = hh) {\n"
+" hh = h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1158
+#, no-wrap
+msgid ""
+" /* the clean values of negotiations to report */\n"
+" neg.bus_width = 8;\n"
+" neg.sync_period = neg.sync_offset = 0;\n"
+" neg.valid = (CCB_TRANS_BUS_WIDTH_VALID\n"
+" | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);\n"
+msgstr ""
+" /* the clean values of negotiations to report */\n"
+" neg.bus_width = 8;\n"
+" neg.sync_period = neg.sync_offset = 0;\n"
+" neg.valid = (CCB_TRANS_BUS_WIDTH_VALID\n"
+" | CCB_TRANS_SYNC_RATE_VALID | CCB_TRANS_SYNC_OFFSET_VALID);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1162
+#, no-wrap
+msgid ""
+" /* drop all disconnected CCBs and clean negotiations */\n"
+" for (targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {\n"
+" clean_negotiations(softc, targ);\n"
+msgstr ""
+" /* drop all disconnected CCBs and clean negotiations */\n"
+" for (targ=0; targ <= OUR_MAX_SUPPORTED_TARGET; targ++) {\n"
+" clean_negotiations(softc, targ);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1170
+#, no-wrap
+msgid ""
+" /* report the event if possible */\n"
+" if (xpt_create_path(&path, /*periph*/NULL,\n"
+" cam_sim_path(sim), targ,\n"
+" CAM_LUN_WILDCARD) == CAM_REQ_CMP) {\n"
+" xpt_async(AC_TRANSFER_NEG, path, &neg);\n"
+" xpt_free_path(path);\n"
+" }\n"
+msgstr ""
+" /* report the event if possible */\n"
+" if (xpt_create_path(&path, /*periph*/NULL,\n"
+" cam_sim_path(sim), targ,\n"
+" CAM_LUN_WILDCARD) == CAM_REQ_CMP) {\n"
+" xpt_async(AC_TRANSFER_NEG, path, &neg);\n"
+" xpt_free_path(path);\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1180
+#, no-wrap
+msgid ""
+" for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)\n"
+" for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {\n"
+" hh=h->next;\n"
+" if (fatal)\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_UNREC_HBA_ERROR);\n"
+" else\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+" }\n"
+msgstr ""
+" for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)\n"
+" for (h = softc->first_discon_hcb[targ][lun]; h != NULL; h = hh) {\n"
+" hh=h->next;\n"
+" if (fatal)\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_UNREC_HBA_ERROR);\n"
+" else\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1183
+#, no-wrap
+msgid ""
+" /* report the event */\n"
+" xpt_async(AC_BUS_RESET, softc->wpath, NULL);\n"
+msgstr ""
+" /* report the event */\n"
+" xpt_async(AC_BUS_RESET, softc->wpath, NULL);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1197
+#, no-wrap
+msgid ""
+" /* re-initialization may take a lot of time, in such case\n"
+" * its completion should be signaled by another interrupt or\n"
+" * checked on timeout - but for simplicity we assume here that\n"
+" * it is really fast\n"
+" */\n"
+" if (!fatal) {\n"
+" reinitialize_controller_without_scsi_reset(softc);\n"
+" } else {\n"
+" reinitialize_controller_with_scsi_reset(softc);\n"
+" }\n"
+" schedule_next_hcb(softc);\n"
+" return;\n"
+" }\n"
+msgstr ""
+" /* re-initialization may take a lot of time, in such case\n"
+" * its completion should be signaled by another interrupt or\n"
+" * checked on timeout - but for simplicity we assume here that\n"
+" * it is really fast\n"
+" */\n"
+" if (!fatal) {\n"
+" reinitialize_controller_without_scsi_reset(softc);\n"
+" } else {\n"
+" reinitialize_controller_with_scsi_reset(softc);\n"
+" }\n"
+" schedule_next_hcb(softc);\n"
+" return;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1202
+msgid ""
+"If interrupt is not caused by a controller-wide condition then probably "
+"something has happened to the current hardware control block. Depending on "
+"the hardware there may be other non-HCB-related events, we just do not "
+"consider them here. Then we analyze what happened to this HCB:"
+msgstr ""
+"Если прерывание не вызвано условием, общим для всего контроллера, то, "
+"вероятно, что-то произошло с текущим блоком управления аппаратным "
+"обеспечением. В зависимости от оборудования могут быть и другие события, не "
+"связанные с HCB, но мы их здесь не рассматриваем. Затем мы анализируем, что "
+"произошло с этим HCB:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1210
+#, no-wrap
+msgid ""
+" struct xxx_hcb *hcb, *h, *hh;\n"
+" int hcb_status, scsi_status;\n"
+" int ccb_status;\n"
+" int targ;\n"
+" int lun_to_freeze;\n"
+msgstr ""
+" struct xxx_hcb *hcb, *h, *hh;\n"
+" int hcb_status, scsi_status;\n"
+" int ccb_status;\n"
+" int targ;\n"
+" int lun_to_freeze;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1219
+#, no-wrap
+msgid ""
+" hcb = get_current_hcb(softc);\n"
+" if (hcb == NULL) {\n"
+" /* either stray interrupt or something went very wrong\n"
+" * or this is something hardware-dependent\n"
+" */\n"
+" handle as necessary;\n"
+" return;\n"
+" }\n"
+msgstr ""
+" hcb = get_current_hcb(softc);\n"
+" if (hcb == NULL) {\n"
+" /* either stray interrupt or something went very wrong\n"
+" * or this is something hardware-dependent\n"
+" */\n"
+" handle as necessary;\n"
+" return;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1222
+#, no-wrap
+msgid ""
+" targ = hcb->target;\n"
+" hcb_status = get_status_of_current_hcb(softc);\n"
+msgstr ""
+" targ = hcb->target;\n"
+" hcb_status = get_status_of_current_hcb(softc);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1225
+msgid ""
+"First we check if the HCB has completed and if so we check the returned SCSI "
+"status."
+msgstr ""
+"Сначала мы проверяем, завершился ли HCB, и если да, то проверяем "
+"возвращённый статус SCSI."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1230
+#, no-wrap
+msgid ""
+" if (hcb_status == COMPLETED) {\n"
+" scsi_status = get_completion_status(hcb);\n"
+msgstr ""
+" if (hcb_status == COMPLETED) {\n"
+" scsi_status = get_completion_status(hcb);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1233
+msgid ""
+"Then look if this status is related to the REQUEST SENSE command and if so "
+"handle it in a simple way."
+msgstr ""
+"Затем проверьте, связан ли этот статус с командой REQUEST SENSE, и если да, "
+"обработайте его простым способом."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1247
+#, no-wrap
+msgid ""
+" if (hcb->flags & DOING_AUTOSENSE) {\n"
+" if (scsi_status == GOOD) { /* autosense was successful */\n"
+" hcb->ccb->ccb_h.status |= CAM_AUTOSNS_VALID;\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);\n"
+" } else {\n"
+" autosense_failed:\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_AUTOSENSE_FAIL);\n"
+" }\n"
+" schedule_next_hcb(softc);\n"
+" return;\n"
+" }\n"
+msgstr ""
+" if (hcb->flags & DOING_AUTOSENSE) {\n"
+" if (scsi_status == GOOD) { /* autosense was successful */\n"
+" hcb->ccb->ccb_h.status |= CAM_AUTOSNS_VALID;\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);\n"
+" } else {\n"
+" autosense_failed:\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_AUTOSENSE_FAIL);\n"
+" }\n"
+" schedule_next_hcb(softc);\n"
+" return;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1251
+msgid ""
+"Else the command itself has completed, pay more attention to details. If "
+"auto-sense is not disabled for this CCB and the command has failed with "
+"sense data then run REQUEST SENSE command to receive that data."
+msgstr ""
+"Иначе сама команда завершена, уделяйте больше внимания деталям. Если "
+"автоопределение не отключено для этого CCB и команда завершилась неудачно с "
+"данными состояния, выполните команду REQUEST SENSE для получения этих данных."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1256
+#, no-wrap
+msgid ""
+" hcb->ccb->csio.scsi_status = scsi_status;\n"
+" calculate_residue(hcb);\n"
+msgstr ""
+" hcb->ccb->csio.scsi_status = scsi_status;\n"
+" calculate_residue(hcb);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1273
+#, no-wrap
+msgid ""
+" if ((hcb->ccb->ccb_h.flags & CAM_DIS_AUTOSENSE)==0\n"
+" && (scsi_status == CHECK_CONDITION\n"
+" || scsi_status == COMMAND_TERMINATED)) {\n"
+" /* start auto-SENSE */\n"
+" hcb->flags |= DOING_AUTOSENSE;\n"
+" setup_autosense_command_in_hcb(hcb);\n"
+" restart_current_hcb(softc);\n"
+" return;\n"
+" }\n"
+" if (scsi_status == GOOD)\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_REQ_CMP);\n"
+" else\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);\n"
+" schedule_next_hcb(softc);\n"
+" return;\n"
+" }\n"
+msgstr ""
+" if ((hcb->ccb->ccb_h.flags & CAM_DIS_AUTOSENSE)==0\n"
+" && (scsi_status == CHECK_CONDITION\n"
+" || scsi_status == COMMAND_TERMINATED)) {\n"
+" /* start auto-SENSE */\n"
+" hcb->flags |= DOING_AUTOSENSE;\n"
+" setup_autosense_command_in_hcb(hcb);\n"
+" restart_current_hcb(softc);\n"
+" return;\n"
+" }\n"
+" if (scsi_status == GOOD)\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_REQ_CMP);\n"
+" else\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, CAM_SCSI_STATUS_ERROR);\n"
+" schedule_next_hcb(softc);\n"
+" return;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1276
+msgid ""
+"One typical thing would be negotiation events: negotiation messages received "
+"from a SCSI target (in answer to our negotiation attempt or by target's "
+"initiative) or the target is unable to negotiate (rejects our negotiation "
+"messages or does not answer them)."
+msgstr ""
+"Типичным примером могут быть события согласования: сообщения согласования, "
+"полученные от цели SCSI (в ответ на нашу попытку согласования или по "
+"инициативе цели), или если цель не может согласовать (отклоняет наши "
+"сообщения согласования или не отвечает на них)."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1292
+#, no-wrap
+msgid ""
+" switch (hcb_status) {\n"
+" case TARGET_REJECTED_WIDE_NEG:\n"
+" /* revert to 8-bit bus */\n"
+" softc->current_bus_width[targ] = softc->goal_bus_width[targ] = 8;\n"
+" /* report the event */\n"
+" neg.bus_width = 8;\n"
+" neg.valid = CCB_TRANS_BUS_WIDTH_VALID;\n"
+" xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);\n"
+" continue_current_hcb(softc);\n"
+" return;\n"
+" case TARGET_ANSWERED_WIDE_NEG:\n"
+" {\n"
+" int wd;\n"
+msgstr ""
+" switch (hcb_status) {\n"
+" case TARGET_REJECTED_WIDE_NEG:\n"
+" /* revert to 8-bit bus */\n"
+" softc->current_bus_width[targ] = softc->goal_bus_width[targ] = 8;\n"
+" /* report the event */\n"
+" neg.bus_width = 8;\n"
+" neg.valid = CCB_TRANS_BUS_WIDTH_VALID;\n"
+" xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);\n"
+" continue_current_hcb(softc);\n"
+" return;\n"
+" case TARGET_ANSWERED_WIDE_NEG:\n"
+" {\n"
+" int wd;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1298
+#, no-wrap
+msgid ""
+" wd = get_target_bus_width_request(softc);\n"
+" if (wd <= softc->goal_bus_width[targ]) {\n"
+" /* answer is acceptable */\n"
+" softc->current_bus_width[targ] =\n"
+" softc->goal_bus_width[targ] = neg.bus_width = wd;\n"
+msgstr ""
+" wd = get_target_bus_width_request(softc);\n"
+" if (wd <= softc->goal_bus_width[targ]) {\n"
+" /* answer is acceptable */\n"
+" softc->current_bus_width[targ] =\n"
+" softc->goal_bus_width[targ] = neg.bus_width = wd;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1311
+#, no-wrap
+msgid ""
+" /* report the event */\n"
+" neg.valid = CCB_TRANS_BUS_WIDTH_VALID;\n"
+" xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);\n"
+" } else {\n"
+" prepare_reject_message(hcb);\n"
+" }\n"
+" }\n"
+" continue_current_hcb(softc);\n"
+" return;\n"
+" case TARGET_REQUESTED_WIDE_NEG:\n"
+" {\n"
+" int wd;\n"
+msgstr ""
+" /* report the event */\n"
+" neg.valid = CCB_TRANS_BUS_WIDTH_VALID;\n"
+" xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);\n"
+" } else {\n"
+" prepare_reject_message(hcb);\n"
+" }\n"
+" }\n"
+" continue_current_hcb(softc);\n"
+" return;\n"
+" case TARGET_REQUESTED_WIDE_NEG:\n"
+" {\n"
+" int wd;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1315
+#, no-wrap
+msgid ""
+" wd = get_target_bus_width_request(softc);\n"
+" wd = min (wd, OUR_BUS_WIDTH);\n"
+" wd = min (wd, softc->user_bus_width[targ]);\n"
+msgstr ""
+" wd = get_target_bus_width_request(softc);\n"
+" wd = min (wd, OUR_BUS_WIDTH);\n"
+" wd = min (wd, softc->user_bus_width[targ]);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1320
+#, no-wrap
+msgid ""
+" if (wd != softc->current_bus_width[targ]) {\n"
+" /* the bus width has changed */\n"
+" softc->current_bus_width[targ] =\n"
+" softc->goal_bus_width[targ] = neg.bus_width = wd;\n"
+msgstr ""
+" if (wd != softc->current_bus_width[targ]) {\n"
+" /* the bus width has changed */\n"
+" softc->current_bus_width[targ] =\n"
+" softc->goal_bus_width[targ] = neg.bus_width = wd;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1330
+#, no-wrap
+msgid ""
+" /* report the event */\n"
+" neg.valid = CCB_TRANS_BUS_WIDTH_VALID;\n"
+" xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);\n"
+" }\n"
+" prepare_width_nego_rsponse(hcb, wd);\n"
+" }\n"
+" continue_current_hcb(softc);\n"
+" return;\n"
+" }\n"
+msgstr ""
+" /* report the event */\n"
+" neg.valid = CCB_TRANS_BUS_WIDTH_VALID;\n"
+" xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);\n"
+" }\n"
+" prepare_width_nego_rsponse(hcb, wd);\n"
+" }\n"
+" continue_current_hcb(softc);\n"
+" return;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1334
+msgid ""
+"Then we handle any errors that could have happened during auto-sense in the "
+"same simple-minded way as before. Otherwise we look closer at the details "
+"again."
+msgstr ""
+"Затем мы обрабатываем любые ошибки, которые могли произойти во время "
+"автоопределения, тем же простым способом, что и раньше. В противном случае "
+"мы снова внимательно изучаем детали."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1339
+#, no-wrap
+msgid ""
+" if (hcb->flags & DOING_AUTOSENSE)\n"
+" goto autosense_failed;\n"
+msgstr ""
+" if (hcb->flags & DOING_AUTOSENSE)\n"
+" goto autosense_failed;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1341
+#, no-wrap
+msgid " switch (hcb_status) {\n"
+msgstr " switch (hcb_status) {\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1345
+msgid ""
+"The next event we consider is unexpected disconnect. Which is considered "
+"normal after an ABORT or BUS DEVICE RESET message and abnormal in other "
+"cases."
+msgstr ""
+"Следующее событие, которое мы рассматриваем, — это неожиданное отключение. "
+"Оно считается нормальным после сообщения ABORT или BUS DEVICE RESET и "
+"аномальным в остальных случаях."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1361
+#, no-wrap
+msgid ""
+" case UNEXPECTED_DISCONNECT:\n"
+" if (requested_abort(hcb)) {\n"
+" /* abort affects all commands on that target+LUN, so\n"
+" * mark all disconnected HCBs on that target+LUN as aborted too\n"
+" */\n"
+" for (h = softc->first_discon_hcb[hcb->target][hcb->lun];\n"
+" h != NULL; h = hh) {\n"
+" hh=h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_REQ_ABORTED);\n"
+" }\n"
+" ccb_status = CAM_REQ_ABORTED;\n"
+" } else if (requested_bus_device_reset(hcb)) {\n"
+" int lun;\n"
+msgstr ""
+" case UNEXPECTED_DISCONNECT:\n"
+" if (requested_abort(hcb)) {\n"
+" /* abort affects all commands on that target+LUN, so\n"
+" * mark all disconnected HCBs on that target+LUN as aborted too\n"
+" */\n"
+" for (h = softc->first_discon_hcb[hcb->target][hcb->lun];\n"
+" h != NULL; h = hh) {\n"
+" hh=h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_REQ_ABORTED);\n"
+" }\n"
+" ccb_status = CAM_REQ_ABORTED;\n"
+" } else if (requested_bus_device_reset(hcb)) {\n"
+" int lun;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1365
+#, no-wrap
+msgid ""
+" /* reset affects all commands on that target, so\n"
+" * mark all disconnected HCBs on that target+LUN as reset\n"
+" */\n"
+msgstr ""
+" /* reset affects all commands on that target, so\n"
+" * mark all disconnected HCBs on that target+LUN as reset\n"
+" */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1372
+#, no-wrap
+msgid ""
+" for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)\n"
+" for (h = softc->first_discon_hcb[hcb->target][lun];\n"
+" h != NULL; h = hh) {\n"
+" hh=h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+msgstr ""
+" for (lun=0; lun <= OUR_MAX_SUPPORTED_LUN; lun++)\n"
+" for (h = softc->first_discon_hcb[hcb->target][lun];\n"
+" h != NULL; h = hh) {\n"
+" hh=h->next;\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_SCSI_BUS_RESET);\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1375
+#, no-wrap
+msgid ""
+" /* send event */\n"
+" xpt_async(AC_SENT_BDR, hcb->ccb->ccb_h.path_id, NULL);\n"
+msgstr ""
+" /* send event */\n"
+" xpt_async(AC_SENT_BDR, hcb->ccb->ccb_h.path_id, NULL);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1386
+#, no-wrap
+msgid ""
+" /* this was the CAM_RESET_DEV request itself, it is completed */\n"
+" ccb_status = CAM_REQ_CMP;\n"
+" } else {\n"
+" calculate_residue(hcb);\n"
+" ccb_status = CAM_UNEXP_BUSFREE;\n"
+" /* request the further code to freeze the queue */\n"
+" hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;\n"
+" lun_to_freeze = hcb->lun;\n"
+" }\n"
+" break;\n"
+msgstr ""
+" /* this was the CAM_RESET_DEV request itself, it is completed */\n"
+" ccb_status = CAM_REQ_CMP;\n"
+" } else {\n"
+" calculate_residue(hcb);\n"
+" ccb_status = CAM_UNEXP_BUSFREE;\n"
+" /* request the further code to freeze the queue */\n"
+" hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;\n"
+" lun_to_freeze = hcb->lun;\n"
+" }\n"
+" break;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1389
+msgid ""
+"If the target refuses to accept tags we notify CAM about that and return "
+"back all commands for this LUN:"
+msgstr ""
+"Если цель отказывается принимать теги, мы уведомляем CAM об этом и "
+"возвращаем все команды для этого LUN:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1397
+#, no-wrap
+msgid ""
+" case TAGS_REJECTED:\n"
+" /* report the event */\n"
+" neg.flags = 0 & ~CCB_TRANS_TAG_ENB;\n"
+" neg.valid = CCB_TRANS_TQ_VALID;\n"
+" xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);\n"
+msgstr ""
+" case TAGS_REJECTED:\n"
+" /* report the event */\n"
+" neg.flags = 0 & ~CCB_TRANS_TAG_ENB;\n"
+" neg.valid = CCB_TRANS_TQ_VALID;\n"
+" xpt_async(AC_TRANSFER_NEG, hcb->ccb.ccb_h.path_id, &neg);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1403
+#, no-wrap
+msgid ""
+" ccb_status = CAM_MSG_REJECT_REC;\n"
+" /* request the further code to freeze the queue */\n"
+" hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;\n"
+" lun_to_freeze = hcb->lun;\n"
+" break;\n"
+msgstr ""
+" ccb_status = CAM_MSG_REJECT_REC;\n"
+" /* request the further code to freeze the queue */\n"
+" hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;\n"
+" lun_to_freeze = hcb->lun;\n"
+" break;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1406
+msgid ""
+"Then we check a number of other conditions, with processing basically "
+"limited to setting the CCB status:"
+msgstr ""
+"Затем мы проверяем ряд других условий, при этом обработка в основном "
+"ограничивается установкой статуса CCB:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1430
+#, no-wrap
+msgid ""
+" case SELECTION_TIMEOUT:\n"
+" ccb_status = CAM_SEL_TIMEOUT;\n"
+" /* request the further code to freeze the queue */\n"
+" hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;\n"
+" lun_to_freeze = CAM_LUN_WILDCARD;\n"
+" break;\n"
+" case PARITY_ERROR:\n"
+" ccb_status = CAM_UNCOR_PARITY;\n"
+" break;\n"
+" case DATA_OVERRUN:\n"
+" case ODD_WIDE_TRANSFER:\n"
+" ccb_status = CAM_DATA_RUN_ERR;\n"
+" break;\n"
+" default:\n"
+" /* all other errors are handled in a generic way */\n"
+" ccb_status = CAM_REQ_CMP_ERR;\n"
+" /* request the further code to freeze the queue */\n"
+" hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;\n"
+" lun_to_freeze = CAM_LUN_WILDCARD;\n"
+" break;\n"
+" }\n"
+msgstr ""
+" case SELECTION_TIMEOUT:\n"
+" ccb_status = CAM_SEL_TIMEOUT;\n"
+" /* request the further code to freeze the queue */\n"
+" hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;\n"
+" lun_to_freeze = CAM_LUN_WILDCARD;\n"
+" break;\n"
+" case PARITY_ERROR:\n"
+" ccb_status = CAM_UNCOR_PARITY;\n"
+" break;\n"
+" case DATA_OVERRUN:\n"
+" case ODD_WIDE_TRANSFER:\n"
+" ccb_status = CAM_DATA_RUN_ERR;\n"
+" break;\n"
+" default:\n"
+" /* all other errors are handled in a generic way */\n"
+" ccb_status = CAM_REQ_CMP_ERR;\n"
+" /* request the further code to freeze the queue */\n"
+" hcb->ccb->ccb_h.status |= CAM_DEV_QFRZN;\n"
+" lun_to_freeze = CAM_LUN_WILDCARD;\n"
+" break;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1433
+msgid ""
+"Then we check if the error was serious enough to freeze the input queue "
+"until it gets proceeded and do so if it is:"
+msgstr ""
+"Затем мы проверяем, была ли ошибка достаточно серьёзной, чтобы заморозить "
+"очередь ввода до её обработки, и если да, то делаем это:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1439
+#, no-wrap
+msgid ""
+" if (hcb->ccb->ccb_h.status & CAM_DEV_QFRZN) {\n"
+" /* freeze the queue */\n"
+" xpt_freeze_devq(ccb->ccb_h.path, /*count*/1);\n"
+msgstr ""
+" if (hcb->ccb->ccb_h.status & CAM_DEV_QFRZN) {\n"
+" /* freeze the queue */\n"
+" xpt_freeze_devq(ccb->ccb_h.path, /*count*/1);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1441
+#, no-wrap
+msgid " /* re-queue all commands for this target/LUN back to CAM */\n"
+msgstr " /* re-queue all commands for this target/LUN back to CAM */\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1444
+#, no-wrap
+msgid ""
+" for (h = softc->first_queued_hcb; h != NULL; h = hh) {\n"
+" hh = h->next;\n"
+msgstr ""
+" for (h = softc->first_queued_hcb; h != NULL; h = hh) {\n"
+" hh = h->next;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1453
+#, no-wrap
+msgid ""
+" if (targ == h->targ\n"
+" && (lun_to_freeze == CAM_LUN_WILDCARD || lun_to_freeze == h->lun))\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_REQUEUE_REQ);\n"
+" }\n"
+" }\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, ccb_status);\n"
+" schedule_next_hcb(softc);\n"
+" return;\n"
+msgstr ""
+" if (targ == h->targ\n"
+" && (lun_to_freeze == CAM_LUN_WILDCARD || lun_to_freeze == h->lun))\n"
+" free_hcb_and_ccb_done(h, h->ccb, CAM_REQUEUE_REQ);\n"
+" }\n"
+" }\n"
+" free_hcb_and_ccb_done(hcb, hcb->ccb, ccb_status);\n"
+" schedule_next_hcb(softc);\n"
+" return;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1456
+msgid ""
+"This concludes the generic interrupt handling although specific controllers "
+"may require some additions."
+msgstr ""
+"На этом общее описание обработки прерываний завершается, хотя для некоторых "
+"контроллеров могут потребоваться дополнительные действия."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1458
+#, no-wrap
+msgid "Errors Summary"
+msgstr "Ошибки (Сводка)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1464
+msgid ""
+"When executing an I/O request many things may go wrong. The reason of error "
+"can be reported in the CCB status with great detail. Examples of use are "
+"spread throughout this document. For completeness here is the summary of "
+"recommended responses for the typical error conditions:"
+msgstr ""
+"При выполнении запроса ввода-вывода может произойти множество ошибок. "
+"Причина ошибки может быть указана в статусе CCB с большим количеством "
+"деталей. Примеры использования разбросаны по всему документу. Для полноты "
+"изложения приведём сводку рекомендуемых действий при типичных ошибках:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1467
+msgid ""
+"_CAM_RESRC_UNAVAIL_ - some resource is temporarily unavailable and the SIM "
+"driver cannot generate an event when it will become available. An example "
+"of this resource would be some intra-controller hardware resource for which "
+"the controller does not generate an interrupt when it becomes available."
+msgstr ""
+"_CAM_RESRC_UNAVAIL_ — некоторый ресурс временно недоступен, и драйвер SIM не "
+"может сгенерировать событие, когда он станет доступен. Примером такого "
+"ресурса может быть некоторый внутренний аппаратный ресурс контроллера, для "
+"которого контроллер не генерирует прерывание при его доступности."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1468
+msgid "_CAM_UNCOR_PARITY_ - unrecovered parity error occurred"
+msgstr "_CAM_UNCOR_PARITY_ - произошла неисправимая ошибка четности"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1469
+msgid ""
+"_CAM_DATA_RUN_ERR_ - data overrun or unexpected data phase (going in other "
+"direction than specified in CAM_DIR_MASK) or odd transfer length for wide "
+"transfer"
+msgstr ""
+"_CAM_DATA_RUN_ERR_ - переполнение данных или неожиданная фаза данных "
+"(направление передачи не соответствует указанному в CAM_DIR_MASK) или "
+"нечётная длина передачи для широкой передачи"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1470
+msgid ""
+"_CAM_SEL_TIMEOUT_ - selection timeout occurred (target does not respond)"
+msgstr "_CAM_SEL_TIMEOUT_ - произошел таймаут выбора (цель не отвечает)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1471
+msgid "_CAM_CMD_TIMEOUT_ - command timeout occurred (the timeout function ran)"
+msgstr ""
+"_CAM_CMD_TIMEOUT_ - произошло превышение времени ожидания команды (сработала "
+"функция таймаута)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1472
+msgid "_CAM_SCSI_STATUS_ERROR_ - the device returned error"
+msgstr "_CAM_SCSI_STATUS_ERROR_ - устройство вернуло ошибку"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1473
+msgid ""
+"_CAM_AUTOSENSE_FAIL_ - the device returned error and the REQUEST SENSE "
+"COMMAND failed"
+msgstr ""
+"_CAM_AUTOSENSE_FAIL_ - устройство вернуло ошибку и команда REQUEST SENSE "
+"завершилась неудачно"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1474
+msgid "_CAM_MSG_REJECT_REC_ - MESSAGE REJECT message was received"
+msgstr "_CAM_MSG_REJECT_REC_ - получено сообщение MESSAGE REJECT"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1475
+msgid "_CAM_SCSI_BUS_RESET_ - received SCSI bus reset"
+msgstr "_CAM_SCSI_BUS_RESET_ - получен сброс шины SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1476
+msgid ""
+"_CAM_REQ_CMP_ERR_ - \"impossible\" SCSI phase occurred or something else as "
+"weird or just a generic error if further detail is not available"
+msgstr ""
+"_CAM_REQ_CMP_ERR_ - произошла «невозможная» фаза SCSI или что-то столь же "
+"странное, либо это просто общая ошибка, если дополнительная информация "
+"недоступна"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1477
+msgid "_CAM_UNEXP_BUSFREE_ - unexpected disconnect occurred"
+msgstr "_CAM_UNEXP_BUSFREE_ - произошло неожиданное отключение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1478
+msgid "_CAM_BDR_SENT_ - BUS DEVICE RESET message was sent to the target"
+msgstr ""
+"_CAM_BDR_SENT_ - Сообщение BUS DEVICE RESET было отправлено целевому "
+"устройству"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1479
+msgid "_CAM_UNREC_HBA_ERROR_ - unrecoverable Host Bus Adapter Error"
+msgstr "_CAM_UNREC_HBA_ERROR_ - невосстановимая ошибка адаптера шины хоста"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1480
+msgid "_CAM_REQ_TOO_BIG_ - the request was too large for this controller"
+msgstr "_CAM_REQ_TOO_BIG_ - запрос слишком велик для данного контроллера"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1484
+msgid ""
+"_CAM_REQUEUE_REQ_ - this request should be re-queued to preserve transaction "
+"ordering. This typically occurs when the SIM recognizes an error that "
+"should freeze the queue and must place other queued requests for the target "
+"at the sim level back into the XPT queue. Typical cases of such errors are "
+"selection timeouts, command timeouts and other like conditions. In such "
+"cases the troublesome command returns the status indicating the error, the "
+"and the other commands which have not be sent to the bus yet get re-queued."
+msgstr ""
+"_CAM_REQUEUE_REQ_ - этот запрос должен быть повторно поставлен в очередь для "
+"сохранения порядка транзакций. Обычно это происходит, когда SIM обнаруживает "
+"ошибку, которая должна заморозить очередь, и необходимо поместить другие "
+"запросы в очереди для цели на уровне SIM обратно в очередь XPT. Типичными "
+"случаями таких ошибок являются тайм-ауты выбора, тайм-ауты команд и другие "
+"подобные условия. В таких случаях проблемная команда возвращает статус, "
+"указывающий на ошибку, а другие команды, которые ещё не были отправлены на "
+"шину, повторно ставятся в очередь."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1485
+msgid ""
+"_CAM_LUN_INVALID_ - the LUN ID in the request is not supported by the SCSI "
+"controller"
+msgstr ""
+"_CAM_LUN_INVALID_ - идентификатор LUN в запросе не поддерживается "
+"контроллером SCSI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1486
+msgid ""
+"_CAM_TID_INVALID_ - the target ID in the request is not supported by the "
+"SCSI controller"
+msgstr ""
+"_CAM_TID_INVALID_ - идентификатор целевого устройства в запросе не "
+"поддерживается контроллером SCSI"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1488
+#, no-wrap
+msgid "Timeout Handling"
+msgstr "Обработка таймаутов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1496
+msgid ""
+"When the timeout for an HCB expires that request should be aborted, just "
+"like with an XPT_ABORT request. The only difference is that the returned "
+"status of aborted request should be CAM_CMD_TIMEOUT instead of "
+"CAM_REQ_ABORTED (that is why implementation of the abort better be done as a "
+"function). But there is one more possible problem: what if the abort "
+"request itself will get stuck? In this case the SCSI bus should be reset, "
+"just like with an XPT_RESET_BUS request (and the idea about implementing it "
+"as a function called from both places applies here too). Also we should "
+"reset the whole SCSI bus if a device reset request got stuck. So after all "
+"the timeout function would look like:"
+msgstr ""
+"Когда время ожидания для HCB истекает, этот запрос должен быть прерван, как "
+"и в случае с запросом XPT_ABORT. Единственное отличие заключается в том, что "
+"возвращаемый статус прерванного запроса должен быть CAM_CMD_TIMEOUT вместо "
+"CAM_REQ_ABORTED (вот почему реализацию прерывания лучше сделать в виде "
+"функции). Но есть ещё одна возможная проблема: что если сам запрос на "
+"прерывание зависнет? В этом случае шина SCSI должна быть сброшена, как и при "
+"запросе XPT_RESET_BUS (и идея о реализации этого в виде функции, вызываемой "
+"из обоих мест, применима и здесь). Также мы должны сбросить всю шину SCSI, "
+"если запрос на сброс устройства завис. В итоге функция обработки таймаута "
+"будет выглядеть следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1505
+#, no-wrap
+msgid ""
+"static void\n"
+"xxx_timeout(void *arg)\n"
+"{\n"
+" struct xxx_hcb *hcb = (struct xxx_hcb *)arg;\n"
+" struct xxx_softc *softc;\n"
+" struct ccb_hdr *ccb_h;\n"
+msgstr ""
+"static void\n"
+"xxx_timeout(void *arg)\n"
+"{\n"
+" struct xxx_hcb *hcb = (struct xxx_hcb *)arg;\n"
+" struct xxx_softc *softc;\n"
+" struct ccb_hdr *ccb_h;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1508
+#, no-wrap
+msgid ""
+" softc = hcb->softc;\n"
+" ccb_h = &hcb->ccb->ccb_h;\n"
+msgstr ""
+" softc = hcb->softc;\n"
+" ccb_h = &hcb->ccb->ccb_h;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1515
+#, no-wrap
+msgid ""
+" if (hcb->flags & HCB_BEING_ABORTED || ccb_h->func_code == XPT_RESET_DEV) {\n"
+" xxx_reset_bus(softc);\n"
+" } else {\n"
+" xxx_abort_ccb(hcb->ccb, CAM_CMD_TIMEOUT);\n"
+" }\n"
+"}\n"
+msgstr ""
+" if (hcb->flags & HCB_BEING_ABORTED || ccb_h->func_code == XPT_RESET_DEV) {\n"
+" xxx_reset_bus(softc);\n"
+" } else {\n"
+" xxx_abort_ccb(hcb->ccb, CAM_CMD_TIMEOUT);\n"
+" }\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/scsi/_index.adoc:1520
+msgid ""
+"When we abort a request all the other disconnected requests to the same "
+"target/LUN get aborted too. So there appears a question, should we return "
+"them with status CAM_REQ_ABORTED or CAM_CMD_TIMEOUT? The current drivers use "
+"CAM_CMD_TIMEOUT. This seems logical because if one request got timed out "
+"then probably something really bad is happening to the device, so if they "
+"would not be disturbed they would time out by themselves."
+msgstr ""
+"Когда мы прерываем запрос, все остальные отключенные запросы к тому же "
+"целевому устройству/LUN также прерываются. Возникает вопрос: следует ли "
+"возвращать их со статусом CAM_REQ_ABORTED или CAM_CMD_TIMEOUT? Текущие "
+"драйверы используют CAM_CMD_TIMEOUT. Это кажется логичным, потому что если "
+"один запрос превысил время ожидания, то, вероятно, с устройством происходит "
+"что-то действительно плохое, и если их не трогать, они бы сами превысили "
+"время ожидания."
diff --git a/documentation/content/ru/books/arch-handbook/smp/_index.adoc b/documentation/content/ru/books/arch-handbook/smp/_index.adoc
new file mode 100644
index 0000000000..8c4b741566
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/smp/_index.adoc
@@ -0,0 +1,360 @@
+---
+description: 'Документ по архитектуре SMPng'
+next: books/arch-handbook/partii
+params:
+ path: /books/arch-handbook/smp/
+prev: books/arch-handbook/vm
+showBookMenu: true
+tags: ["SMPng", "introduction", "locks"]
+title: 'Глава 8. Документ по архитектуре SMPng'
+weight: 9
+---
+
+[[smp]]
+= Документ по архитектуре SMPng
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 8
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[smp-intro]]
+== Введение
+
+В этом документе представлены текущая архитектура и реализация SMPng. Сначала вводятся основные примитивы и инструменты. Затем излагается общая архитектура модели синхронизации и выполнения ядра FreeBSD. Далее обсуждаются стратегии блокировок для конкретных подсистем, описывающие подходы к внедрению детализированной синхронизации и параллелизма для каждой подсистемы. В заключение приводятся подробные заметки по реализации, объясняющие выбор проектных решений и информирующие читателя о важных последствиях использования конкретных примитивов.
+
+Этот документ находится в стадии разработки и будет обновляться в соответствии с текущими проектированием и реализацией, связанными с проектом SMPng. Многие разделы в настоящее время существуют только в виде набросков, но будут дополняться по мере продвижения работы. Обновления или предложения по документу могут быть направлены редакторам документа.
+
+Цель SMPng — обеспечить параллелизм в ядре. Ядро представляет собой одну довольно большую и сложную программу. Чтобы сделать ядро многопоточным, мы используем те же инструменты, что и для многопоточности других программ. К ним относятся мьютексы, разделяемые/монопольные блокировки, семафоры и условные переменные. Для определений этих и других терминов, связанных с SMP, см. раздел crossref:smp[smp-glossary, Глоссарий] в этой статье.
+
+[[smp-lock-fundamentals]]
+== Основные инструменты и основы блокировки
+
+=== Атомарные инструкции и барьеры памяти
+
+Можно найти много описаний барьеров памяти и атомарных инструкций, поэтому в этом разделе не будет много деталей. Проще говоря, нельзя читать переменные без блокировки, если блокировка используется для защиты записи в эту переменную. Это становится очевидным, если учесть, что барьеры памяти лишь определяют относительный порядок операций с памятью; они не дают никаких гарантий относительно времени выполнения этих операций. То есть, барьер памяти не принуждает к сбросу содержимого локального кэша или буфера записи процессора. Вместо этого, барьер памяти при освобождении блокировки просто гарантирует, что все записи в защищённые данные будут видны другим процессорам или устройствам, если видна запись, освобождающая блокировку. Процессор может хранить эти данные в своём кэше или буфере записи сколько угодно долго. Однако, если другой процессор выполняет атомарную инструкцию над тем же данным, первый процессор должен гарантировать, что обновлённое значение будет видно второму процессору, наряду с любыми другими операциями, которые могут потребоваться согласно барьерам памяти.
+
+Например, предполагая простую модель, в которой данные считаются видимыми, когда они находятся в основной памяти (или в глобальном кэше), когда начинается выполнение атомарной инструкции на одном процессоре, буферы записи и кэши других процессоров должны выполнить все записи в ту же строку кэша вместе с любыми ожидающими операциями за барьером памяти.
+
+Это требует особой осторожности при использовании элемента, защищённого атомарными инструкциями. Например, в реализации мьютекса сна мы должны использовать `atomic_cmpset` вместо `atomic_set` для установки бита `MTX_CONTESTED`. Причина в том, что мы считываем значение `mtx_lock` в переменную и затем принимаем решение на основе этого чтения. Однако значение, которое мы ранее прочитали, может быть устаревшим или измениться, пока мы принимаем решение. Таким образом, когда выполняется `atomic_set`, это может привести к установке бита на другом значении, отличном от того, на котором мы основывали своё решение. Поэтому мы должны использовать `atomic_cmpset`, чтобы установить значение только в том случае, если значение, на котором мы приняли решение, актуально и действительно.
+
+Наконец, атомарные инструкции позволяют обновить или прочитать только один элемент. Если необходимо атомарно обновить несколько элементов, вместо этого следует использовать блокировку. Например, если требуется прочитать два счётчика и получить их значения, согласованные друг с другом, то эти счётчики должны быть защищены блокировкой, а не отдельными атомарными инструкциями.
+
+=== Блокировки на чтение и блокировки на запись
+
+Блокировки на чтение не требуют такой же строгости, как блокировки на запись. Оба типа блокировок должны гарантировать, что данные, к которым они обращаются, не устарели. Однако запись требует монопольного доступа. Несколько потоков могут безопасно читать значение. Использование разных типов блокировок для чтения и записи может быть реализовано несколькими способами.
+
+Во-первых, блокировки sx могут использоваться таким образом: монопольная блокировка при записи и разделяемая блокировка при чтении. Этот метод достаточно прост.
+
+Второй метод несколько менее очевиден. Вы можете защитить данные несколькими блокировками. Для чтения данных достаточно получить блокировку на чтение одной из блокировок. Однако для записи данных необходимо получить блокировку на запись всех блокировок. Это может сделать запись довольно затратной, но может быть полезно, когда данные доступны различными способами. Например, указатель на родительский процесс защищён как `proctree_lock` sx-блокировкой, так и мьютексом процесса. Иногда блокировка процесса удобнее, так как мы просто проверяем, кто является родителем уже заблокированного процесса. Однако в других случаях, таких как `inferior`, необходимо обходить дерево процессов через указатели на родителя, и блокировка каждого процесса была бы слишком затратной, а также сложной для гарантии того, что проверяемое условие остаётся верным как во время проверки, так и при выполнении действий, основанных на этой проверке.
+
+=== Условия и результаты блокировки
+
+Если вам нужна блокировка для проверки состояния переменной, чтобы можно было выполнить действие на основе прочитанного состояния, вы не можете просто удерживать блокировку во время чтения переменной, а затем снять блокировку перед выполнением действия на основе прочитанного значения. Как только вы снимаете блокировку, переменная может измениться, что сделает ваше решение недействительным. Таким образом, вы должны удерживать блокировку как во время чтения переменной, так и во время выполнения действия в результате проверки.
+
+[[smp-design]]
+== Общая Архитектура и Дизайн
+
+=== Обработка прерываний
+
+Следуя примеру нескольких других многопоточных ядер UNIX(R), FreeBSD реализрвала обработчики прерываний, предоставив им собственный контекст потока. Предоставление контекста для обработчиков прерываний позволяет им блокироваться на блокировках. Однако, чтобы избежать задержек, потоки обработки прерываний выполняются с приоритетом реального времени в ядре. Таким образом, обработчики прерываний не должны выполняться слишком долго, чтобы не лишать ресурсов другие потоки ядра. Кроме того, поскольку несколько обработчиков могут использовать один поток прерываний, обработчики прерываний не должны переходить в режим сна или использовать блокировки, допускающие сон, чтобы не лишать ресурсов другие обработчики прерываний.
+
+Текущие потоки обработки прерываний в FreeBSD называются тяжеловесными потоками обработки прерываний. Они получили такое название, потому что переключение на поток обработки прерывания включает в себя полное переключение контекста. В первоначальной реализации ядро не было вытесняющим, поэтому прерывания, которые прерывали поток ядра, должны были ждать, пока поток ядра не заблокируется или не вернётся в пользовательское пространство, прежде чем у них появится возможность выполниться.
+
+Для решения проблем с задержками ядро FreeBSD стало вытесняющим. В настоящее время вытеснение потока ядра происходит только при освобождении мьютекса сна или при поступлении прерывания. Однако планируется сделать ядро FreeBSD полностью вытесняющим, как описано ниже.
+
+Не все обработчики прерываний выполняются в контексте потока. Вместо этого, некоторые обработчики выполняются непосредственно в основном контексте прерывания. Эти обработчики прерываний в настоящее время ошибочно называются "быстрыми" обработчиками прерываний, поскольку для их обозначения применяется флаг `INTR_FAST`, использовавшийся в более ранних версиях ядра. Единственные прерывания, которые в настоящее время используют такие обработчики прерываний, — это прерывания от часов и последовательных устройств ввода-вывода. Поскольку эти обработчики не имеют собственного контекста, они не могут захватывать блокирующие блокировки и, следовательно, могут использовать только спин-мьютексы.
+
+Наконец, существует одна дополнительная оптимизация, которую можно добавить в код MD, называемая легковесными переключениями контекста. Поскольку поток обработки прерывания выполняется в контексте ядра, он может заимствовать vmspace любого процесса. Таким образом, при легковесном переключении контекста переход к потоку обработки прерывания не меняет vmspace, а заимствует vmspace прерванного потока. Чтобы гарантировать, что vmspace прерванного потока не исчезнет во время работы, прерванному потоку запрещается выполнение до тех пор, пока поток обработки прерывания больше не использует его vmspace. Это может произойти, когда поток обработки прерывания либо блокируется, либо завершается. Если поток обработки прерывания блокируется, то при повторном запуске он будет использовать свой собственный контекст. Таким образом, он может освободить прерванный поток.
+
+Недостатки этой оптимизации заключаются в том, что они очень специфичны для конкретной машины и сложны, поэтому стоят усилий только в случае значительного улучшения производительности. На данный момент, вероятно, ещё рано делать выводы, и, фактически, это может даже ухудшить производительность, так как почти все обработчики прерываний будут немедленно блокироваться на Giant и потребуют исправления потока при блокировке. Кроме того, Майк Смит предложил альтернативный метод обработки прерываний, который работает следующим образом:
+
+. Каждый обработчик прерывания состоит из двух частей: предиката, который выполняется в основном контексте прерывания, и обработчика, который выполняется в контексте собственного потока.
+. Если у обработчика прерывания есть предикат, то при срабатывании прерывания этот предикат выполняется. Если предикат возвращает значение `true`, прерывание считается полностью обработанным, и ядро возвращается из прерывания. Если предикат возвращает `false` или предиката нет, то запланированный обработчик запускается.
+
+Встраивание легковесных переключений контекста в эту схему может оказаться довольно сложным. Поскольку мы, возможно, захотим перейти на эту схему в будущем, вероятно, лучше отложить работу над легковесными переключениями контекста до тех пор, пока мы не определимся с окончательной архитектурой обработки прерываний и не выясним, как легковесные переключения контекста могут (или не могут) в неё вписаться.
+
+=== Ядро с вытеснением и критические секции
+
+==== Ядро и вытеснение вкратце
+
+Вытеснение ядра довольно просто. Основная идея заключается в том, что процессор всегда должен выполнять наиболее приоритетную доступную работу. Ну, это в идеале, по крайней мере. Есть несколько случаев, когда затраты на достижение идеала не стоят совершенства.
+
+Реализация полной вытесняющей многозадачности в ядре очень проста: когда вы планируете выполнение потока, помещая его в очередь выполнения, вы проверяете, является ли его приоритет выше, чем у текущего выполняемого потока. Если да, вы инициируете переключение контекста на этот поток.
+
+Хотя блокировки могут защитить большинство данных в случае вытеснения, не все части ядра безопасны для вытеснения. Например, если поток, удерживающий спин-блокировку, будет вытеснен, а новый поток попытается захватить ту же спин-блокировку, новый поток может вращаться вечно, так как прерванный поток может никогда не получить шанс на выполнение. Кроме того, некоторый код, такой как код для назначения номера адресного пространства процессу во время `exec` на Alpha, не должен быть вытеснен, так как он поддерживает фактический код переключения контекста. Для таких участков кода вытеснение отключается с использованием критической секции.
+
+==== Критические Секции
+
+Ответственность API критической секции заключается в предотвращении переключения контекста внутри критической секции. В полностью вытесняющем ядре каждый вызов `setrunqueue` для потока, отличного от текущего, является точкой вытеснения. Одна из реализаций заключается в том, что `critical_enter` устанавливает флаг для каждого потока, который сбрасывается его парной функцией. Если `setrunqueue` вызывается, когда этот флаг установлен, вытеснение не происходит, независимо от приоритета нового потока относительно текущего. Однако, поскольку критические секции используются в спин-блокировках для предотвращения переключения контекста и может быть захвачено несколько спин-блокировок, API критической секции должен поддерживать вложенность. По этой причине текущая реализация использует счетчик вложенности вместо одиночного флага для каждого потока.
+
+Для минимизации задержек прерывания внутри критической секции откладываются, а не отбрасываются. Если поток, который в обычных условиях должен быть вытеснен, становится готовым к выполнению, пока текущий поток находится в критической секции, то устанавливается флаг для данного потока, указывающий на ожидающее прерывание. При выходе из самой внешней критической секции флаг проверяется. Если флаг установлен, текущий поток вытесняется, чтобы позволить выполниться потоку с более высоким приоритетом.
+
+Прерывания создают проблему для спин-мьютексов. Если обработчик низкоуровневого прерывания требует блокировки, он не должен прерывать любой код, которому нужна эта блокировка, чтобы избежать возможного повреждения структур данных. В настоящее время этот механизм реализован через API критических секций с помощью функций `cpu_critical_enter` и `cpu_critical_exit`. Сейчас этот API отключает и снова включает прерывания на всех текущих платформах FreeBSD. Такой подход может быть не идеально оптимальным, но он прост для понимания и надежен в реализации. Теоретически, этот второй API нужен только для спин-мьютексов, используемых в основном контексте прерываний. Однако, для упрощения кода, он используется для всех спин-мьютексов и даже для всех критических секций. Возможно, стоит отделить MD API от MI API и использовать его только совместно с MI API в реализации спин-мьютексов. Если будет принят такой подход, то MD API, вероятно, потребуется переименовать, чтобы показать, что это отдельный API.
+
+==== Компромиссы проектирования
+
+Как упоминалось ранее, были сделаны некоторые компромиссы, чтобы пожертвовать случаями, когда идеальная вытесняющая многозадачность не всегда обеспечивает наилучшую производительность.
+
+Первый компромисс заключается в том, что код вытеснения не учитывает другие процессоры. Предположим, у нас есть два процессора A и B, где приоритет потока A равен 4, а приоритет потока B равен 2. Если процессор B делает поток с приоритетом 1 готовым к выполнению, то теоретически мы хотим, чтобы процессор A переключился на новый поток, чтобы выполнялись два потока с наивысшим приоритетом. Однако стоимость определения, на какой процессор нужно применить вытеснение, а также фактическая сигнализация этому процессору через IPI вместе с необходимой синхронизацией были бы огромными. Таким образом, текущий код вместо этого заставит процессор B переключиться на поток с более высоким приоритетом. Заметим, что это всё равно улучшает состояние системы, так как процессор B выполняет поток с приоритетом 1, а не поток с приоритетом 2.
+
+Второй компромисс ограничивает немедленное вытеснение ядра только потоками ядра с реальным временем. В простом случае вытеснения, описанном выше, поток всегда вытесняется немедленно (или как только будет покинута критическая секция), если становится доступным поток с более высоким приоритетом. Однако многие потоки, выполняющиеся в ядре, работают в контексте ядра лишь короткое время перед тем, как либо заблокироваться, либо вернуться в пользовательское пространство. Таким образом, если ядро вытеснит эти потоки для выполнения другого потока ядра без реального времени, оно может переключиться с выполняемого потока как раз перед тем, как тот собирается завершиться или перейти в режим ожидания. Кэш процессора должен затем адаптироваться к новому потоку. Когда ядро возвращается к вытесненному потоку, оно должно восстановить все потерянные кэшированные данные. Кроме того, выполняются два дополнительных переключения контекста, которых можно было бы избежать, если бы ядро отложило вытеснение до момента, пока первый поток не заблокируется или не вернётся в пользовательское пространство. Таким образом, по умолчанию код вытеснения будет немедленно вытеснять поток только в том случае, если поток с более высоким приоритетом имеет приоритет реального времени.
+
+Включение полной вытесняющей многозадачности для всех потоков ядра полезно в качестве средства отладки, так как позволяет выявить больше состояний гонки. Это особенно полезно на однопроцессорных системах (UP), где многие гонки сложно воспроизвести другими способами. Таким образом, существует опция ядра `FULL_PREEMPTION` для включения вытеснения для всех потоков ядра, которая может использоваться для целей отладки.
+
+=== Миграция потоков
+
+Простыми словами, поток мигрирует, когда переходит с одного CPU на другой. В неперемещаемом ядре это может происходить только в определённых точках, например, при вызове `msleep` или возврате в пользовательское пространство. Однако в перемещаемом ядре прерывание может вызвать вытеснение и возможную миграцию в любой момент. Это может негативно сказаться на данных, специфичных для CPU, поскольку, за исключением `curthread` и `curpcb`, данные могут изменяться при любой миграции. Поскольку потенциально миграция может произойти в любой момент, это делает незащищённый доступ к данным, специфичным для CPU, практически бесполезным. Поэтому желательно иметь возможность отключать миграцию для участков кода, где требуется стабильность данных, специфичных для CPU.
+
+Критические секции в настоящее время предотвращают миграцию, поскольку они не допускают переключения контекстов. Однако это может быть слишком строгим требованием в некоторых случаях, так как критическая секция также эффективно блокирует потоки прерываний на текущем процессоре. В результате был предоставлен другой API, позволяющий текущему потоку указать, что если он будет вытеснен, он не должен мигрировать на другой CPU.
+
+Этот API известен как закрепление потока и предоставляется планировщиком. API состоит из двух функций: `sched_pin` и `sched_unpin`. Эти функции управляют счетчиком вложенности `td_pinned` для каждого потока. Поток считается закрепленным, когда его счетчик вложенности больше нуля, и прекрашает быть закрепленным с нулевым счетчиком вложенности. Каждая реализация планировщика должна гарантировать, что закрепленные потоки выполняются только на том CPU, на котором они выполнялись при первом вызове `sched_pin`. Поскольку счетчик вложенности изменяется только самим потоком и читается другими потоками только тогда, когда закрепленный поток не выполняется, но удерживается `sched_lock`, то `td_pinned` не требует блокировки. Функция `sched_pin` увеличивает счетчик вложенности, а `sched_unpin` уменьшает его. Обратите внимание, что эти функции работают только с текущим потоком и привязывают текущий поток к CPU, на котором он выполняется в данный момент. Для привязки произвольного потока к определенному CPU следует использовать функции `sched_bind` и `sched_unbind`.
+
+=== Обратные вызовы
+
+Функция ядра `timeout` позволяет службам ядра регистрировать функции для выполнения в рамках программного прерывания `softclock`. События планируются на основе заданного количества тактов часов, и вызовы предоставленной потребителем функции будут происходить приблизительно в нужное время.
+
+Глобальный список ожидающих событий с таймаутом защищен глобальной спин-блокировкой `callout_lock`; любой доступ к списку таймаутов должен выполняться с удержанием этой блокировки. Когда `softclock` пробуждается, он сканирует список ожидающих таймаутов на предмет тех, которые должны сработать. Чтобы избежать инверсии блокировок, поток `softclock` освобождает блокировку `callout_lock` при вызове предоставленной функции обратного вызова `timeout`. Если флаг `CALLOUT_MPSAFE` не был установлен во время регистрации, то `Giant` будет захвачен перед вызовом обратного вызова, а затем освобожден после него. Блокировка `callout_lock` будет повторно захвачена перед продолжением работы. Код `softclock` аккуратно поддерживает список в согласованном состоянии во время освобождения блокировки. Если включен `DIAGNOSTIC`, то измеряется время выполнения каждой функции, и если оно превышает пороговое значение, генерируется предупреждение.
+
+[[smp-lock-strategies]]
+== Конкретные стратегии блокировки
+
+=== Учетные данные
+
+`struct ucred` — это внутренняя структура учетных данных ядра, которая обычно используется в качестве основы для управления доступом на уровне процессов внутри ядра. Системы, производные от BSD, используют модель «копирования при записи» для учетных данных: могут существовать множественные ссылки на структуру учетных данных, и когда требуется внести изменение, структура дублируется, изменяется, а затем ссылка заменяется. Благодаря широко распространенному кэшированию учетных данных для реализации контроля доступа при открытии, это приводит к значительной экономии памяти. С переходом на детализированную SMP (симметричную многопроцессорность), эта модель также существенно экономит на операциях блокировки, требуя, чтобы модификации выполнялись только для неразделяемых учетных данных, избегая необходимости явной синхронизации при использовании известных разделяемых учетных данных.
+
+Структуры учетных данных с единственной ссылкой считаются изменяемыми; разделяемые структуры учетных данных не должны изменяться, иначе возникает риск состояния гонки. Мьютекс `cr_mtxp` защищает счетчик ссылок структуры `struct ucred` для поддержания согласованности. Любое использование структуры требует действительной ссылки на протяжении всего времени использования, иначе структура может быть освобождена из-под нелегитимного потребителя.
+
+Мьютекс `struct ucred` является листовым мьютексом и реализован через пул мьютексов по соображениям производительности.
+
+Обычно учетные данные используются в режиме только для чтения для принятия решений по контролю доступа, и в этом случае `td_ucred`, как правило, предпочтительнее, поскольку не требует блокировки. Когда учетные данные процесса обновляются, блокировка `proc` должна удерживаться на протяжении операций проверки и обновления, чтобы избежать состояний гонки. Учетные данные процесса `p_ucred` должны использоваться для операций проверки и обновления, чтобы предотвратить гонки между временем проверки и временем использования.
+
+Если при системных вызовах будет выполняться контроль доступа после обновления учетных данных процесса, значение `td_ucred` также должно быть обновлено до текущего значения процесса. Это предотвратит использование устаревших учетных данных после изменения. Ядро автоматически обновляет указатель `td_ucred` в структуре потока из `p_ucred` процесса всякий раз, когда процесс входит в ядро, что позволяет использовать свежие учетные данные для контроля доступа в ядре.
+
+=== Дескрипторы файлов и таблицы дескрипторов файлов
+
+Подробности будут позже.
+
+=== Структуры клеток
+
+`struct prison` хранит административные данные, связанные с обслуживанием клеток, созданных с использованием API man:jail[2]. Это включает имя хоста для каждой клетки, IP-адрес и связанные настройки. Эта структура имеет счетчик ссылок, так как указатели на её экземпляры разделяются многими структурами учётных данных. Один мьютекс, `pr_mtx`, защищает чтение и запись счётчика ссылок и всех изменяемых переменных внутри `struct jail`. Некоторые переменные устанавливаются только при создании клетки, и действительной ссылки на `struct prison` достаточно для чтения этих значений. Точная блокировка каждой записи документирована в комментариях файла [.filename]#sys/jail.h#.
+
+=== MAC Framework
+
+Фреймворк TrustedBSD MAC поддерживает данные в различных объектах ядра в виде `struct label`. Как правило, метки в объектах ядра защищаются тем же механизмом блокировки, что и остальная часть объекта ядра. Например, метка `v_label` в `struct vnode` защищается блокировкой vnode.
+
+В дополнение к меткам, поддерживаемым в стандартных объектах ядра, MAC Framework также поддерживает список зарегистрированных и активных политик. Список политик защищен глобальной мьютекс-блокировкой (`mac_policy_list_lock`) и счетчиком использования (также защищенным мьютексом). Поскольку множество проверок контроля доступа может выполняться параллельно, вход в framework для доступа только на чтение к списку политик требует удержания мьютекса во время увеличения (и последующего уменьшения) счетчика использования. Мьютекс не обязательно удерживать на протяжении всей операции входа в MAC — некоторые операции, такие как операции с метками на объектах файловой системы, выполняются длительное время. Для изменения списка политик, например во время регистрации и отмены регистрации политик, мьютекс должен быть удержан, а счетчик ссылок должен быть равен нулю, чтобы предотвратить изменение списка во время его использования.
+
+Условная переменная `mac_policy_list_not_busy` доступна для потоков, которым необходимо дождаться освобождения списка, но ожидание на этой условной переменной допустимо только если вызывающий поток не удерживает других блокировок, иначе может возникнуть нарушение порядка блокировок. Фактически, счетчик занятости действует как форма разделяемой/исключающей блокировки доступа к фреймворку: отличие в том, что, в отличие от sx-блокировки, потребители, ожидающие освобождения списка, могут подвергаться голоданию, вместо того чтобы допускать проблемы порядка блокировок в отношении счетчика занятости и других блокировок, которые могут удерживаться при входе в (или внутри) MAC Framework.
+
+=== Модули
+
+Для подсистемы модулей существует единая блокировка, которая используется для защиты общих данных. Эта блокировка является shared/exclusive (SX) и с высокой вероятностью потребует захвата (разделяемого или исключительного), поэтому были добавлены несколько макросов для упрощения работы с ней. Эти макросы можно найти в [.filename]#sys/module.h#, и их использование довольно простое. Основные структуры, защищаемые этой блокировкой, — это структуры `module_t` (при разделяемом доступе) и глобальная структура `modulelist_t` modules. Для более глубокого понимания стратегии блокировок рекомендуется изучить соответствующий исходный код в [.filename]#kern/kern_module.c#.
+
+=== Дерево устройств Newbus
+
+Система newbus будет использовать одну блокировку sx. Читатели будут удерживать разделяемую (read) блокировку (man:sx_slock[9]), а писатели — эксклюзивную (write) блокировку (man:sx_xlock[9]). Внутренние функции не будут выполнять блокировку вообще. Внешне видимые функции будут блокироваться по мере необходимости. Элементы, для которых не важно, выиграна гонка или проиграна, не будут блокироваться, так как они обычно читаются во многих местах (например, man:device_get_softc[9]). Изменения в структурах данных newbus будут относительно редкими, поэтому одной блокировки должно быть достаточно, и это не приведёт к снижению производительности.
+
+=== Каналы (pipe)
+
+...
+
+=== Процессы и потоки
+
+- иерархия процессов
+
+- блокировки и ссылки proc
+
+- потокоспецифичные копии записей proc для заморозки во время системных вызовов, включая td_ucred
+
+- межпроцессные операции
+
+- группы процессов и сеансы
+
+=== Планировщик
+
+Множество ссылок на `sched_lock` и примечания, указывающие на конкретные примитивы и связанные с ними особенности в других частях документа.
+
+=== Select и Poll
+
+Функции `select` и `poll` позволяют потокам блокироваться в ожидании событий на файловых дескрипторах — чаще всего, доступности файловых дескрипторов для чтения или записи.
+
+...
+
+=== SIGIO
+
+Служба SIGIO позволяет процессам запрашивать доставку сигнала SIGIO своей группе процессов при изменении статуса чтения/записи указанных файловых дескрипторов. Не более одного процесса или группы процессов может зарегистрироваться для получения SIGIO от любого заданного объекта ядра, и такой процесс или группа называется владельцем. Каждый объект, поддерживающий регистрацию SIGIO, содержит поле-указатель, которое имеет значение `NULL`, если объект не зарегистрирован, или указывает на структуру `struct sigio`, описывающую регистрацию. Это поле защищено глобальным мьютексом `sigio_lock`. Вызывающие функции обслуживания SIGIO должны передавать это поле «по ссылке», чтобы локальные копии регистра не создавались без защиты блокировкой.
+
+Один `struct sigio` выделяется для каждого зарегистрированного объекта, связанного с любым процессом или группой процессов, и содержит обратные ссылки на объект, владельца, информацию о сигнале, учетные данные и общее состояние регистрации. Каждый процесс или группа процессов содержит список зарегистрированных структур `struct sigio`: `p_sigiolst` для процессов и `pg_sigiolst` для групп процессов. Эти списки защищены блокировками процесса или группы процессов соответственно. Большинство полей в каждой `struct sigio` остаются постоянными на протяжении регистрации, за исключением поля `sio_pgsigio`, которое связывает `struct sigio` со списком процесса или группы процессов. Разработчикам, реализующим новые объекты ядра с поддержкой SIGIO, как правило, следует избегать удержания блокировок структур при вызове функций поддержки SIGIO, таких как `fsetown` или `funsetown`, чтобы не определять порядок блокировок между блокировками структур и глобальной блокировкой SIGIO. Обычно это возможно за счет использования повышенного счетчика ссылок на структуру, например, путем опоры на ссылку файлового дескриптора на канал во время операции с каналом.
+
+=== Sysctl
+
+Сервис `sysctl` MIB вызывается как из ядра, так и из пользовательских приложений с использованием системного вызова. По крайней мере, два вопроса возникают в отношении блокировок: во-первых, защита структур, поддерживающих пространство имен, и во-вторых, взаимодействие с переменными и функциями ядра, к которым обращается интерфейс `sysctl`. Поскольку `sysctl` позволяет прямое экспортирование (и изменение) статистики ядра и параметров конфигурации, механизм `sysctl` должен учитывать соответствующие семантики блокировок для этих переменных. В настоящее время `sysctl` использует единую глобальную sx-блокировку для сериализации использования `sysctl`; однако предполагается, что он работает под защитой Giant, и другие защиты не предоставляются. Оставшаяся часть этого раздела рассматривает возможные изменения в блокировках и семантике `sysctl`.
+
+- Необходимо изменить порядок операций для sysctl, которые обновляют значения из чтения старого, copyin и copyout, записи нового на copyin, блокировку, чтение старого и запись нового, разблокировку, copyout. Обычные sysctl, которые просто копируют старое значение и устанавливают новое, которое они копируют, могут по-прежнему следовать старой модели. Однако, возможно, будет чище использовать вторую модель для всех обработчиков sysctl, чтобы избежать операций блокировки.
+
+- Для упрощения распространённого случая, sysctl может включать указатель на мьютекс в макросах SYSCTL_FOO и в структуре. Это будет работать для большинства sysctl. Для значений, защищённых sx-блокировками, спин-мьютексами или другими стратегиями синхронизации, отличными от одиночного мьютекса сна, можно использовать узлы SYSCTL_PROC для обеспечения корректной блокировки.
+
+=== Очередь задач
+
+Интерфейс `taskqueue` имеет две основные блокировки, связанные с ним, для защиты соответствующих общих данных. Мьютекс `taskqueue_queues_mutex` предназначен для защиты TAILQ `taskqueue_queues`. Другая блокировка мьютекса, связанная с этой системой, находится в структуре данных `struct taskqueue`. Использование примитива синхронизации здесь необходимо для защиты целостности данных в `struct taskqueue`. Следует отметить, что нет отдельных макросов, помогающих пользователю заблокировать свою собственную работу, поскольку эти блокировки, скорее всего, не будут использоваться за пределами [.filename]#kern/subr_taskqueue.c#.
+
+[[smp-implementation-notes]]
+== Заметки о реализации
+
+=== Очереди сна
+
+Очередь сна — это структура, которая содержит список потоков, ожидающих на канале ожидания. Каждый поток, который не находится в состоянии ожидания на канале ожидания, хранит структуру очереди сна при себе. Когда поток блокируется на канале ожидания, он передаёт свою структуру очереди сна этому каналу. Очереди сна, связанные с каналом ожидания, хранятся в хеш-таблице.
+
+Хеш-таблица очередей сна содержит очереди сна для каналов ожидания, у которых есть хотя бы один заблокированный поток. Каждая запись в хеш-таблице называется цепочкой очереди сна. Цепочка содержит связанный список очередей сна и спин-мьютекс. Спин-мьютекс защищает список очередей сна, а также содержимое структур очередей сна в списке. С каждым каналом ожидания связана только одна очередь сна. Если несколько потоков блокируются на одном канале ожидания, то очереди сна, связанные со всеми потоками, кроме первого, хранятся в списке свободных очередей сна в главной очереди сна. Когда поток удаляется из очереди сна, он получает одну из структур очереди сна из свободного списка главной очереди, если он не является единственным потоком в очереди. Последний поток получает главную очередь сна при возобновлении. Поскольку потоки могут удаляться из очереди сна в порядке, отличном от порядка добавления, поток может покинуть очередь сна с другой структурой очереди сна, чем та, с которой он в неё попал.
+
+Функция `sleepq_lock` блокирует спин-мьютес цепи очереди сна, соответствующей определённому каналу ожидания. Функция `sleepq_lookup` выполняет поиск в хеш-таблице главной очереди сна, связанной с заданным каналом ожидания. Если главная очередь сна не найдена, функция возвращает `NULL`. Функция `sleepq_release` разблокирует спин-мьютес, связанный с заданным каналом ожидания.
+
+Поток добавляется в очередь ожидания с помощью `sleepq_add`. Эта функция принимает канал ожидания, указатель на мьютекс, защищающий канал ожидания, строку описания сообщения ожидания и маску флагов. Цепь очереди ожидания должна быть заблокирована с помощью `sleepq_lock` перед вызовом этой функции. Если канал ожидания не защищен мьютексом (или защищен мьютексом Giant), то аргумент указателя на мьютекс должен быть `NULL`. Аргумент флагов содержит поле типа, указывающее на вид очереди ожидания, в которую добавляется поток, и флаг, указывающий, является ли ожидание прерываемым (`SLEEPQ_INTERRUPTIBLE`). В настоящее время существует только два типа очередей ожидания: традиционные очереди, управляемые через функции `msleep` и `wakeup` (`SLEEPQ_MSLEEP`), и очереди ожидания условных переменных (`SLEEPQ_CONDVAR`). Тип очереди ожидания и аргумент указателя на блокировку используются исключительно для внутренних проверок утверждений. Код, вызывающий `sleepq_add`, должен явно разблокировать любой блокировочный механизм, защищающий канал ожидания, после того как связанная цепь очереди ожидания будет заблокирована через `sleepq_lock` и перед блокировкой в очереди ожидания с помощью одной из функций ожидания.
+
+Таймаут для сна устанавливается вызовом `sleepq_set_timeout`. Функция принимает канал ожидания и время таймаута в виде относительного количества тиков в качестве аргументов. Если сон должен быть прерван поступающими сигналами, следует также вызвать функцию `sleepq_catch_signals`. Эта функция принимает канал ожидания в качестве единственного параметра. Если для данного потока уже есть ожидающий сигнал, то `sleepq_catch_signals` вернёт номер сигнала; в противном случае она вернёт 0.
+
+После добавления потока в очередь ожидания он блокируется с использованием одной из функций `sleepq_wait`. Существует четыре функции ожидания в зависимости от того, хочет ли вызывающий код использовать таймаут, прерывание сна перехваченными сигналами или прерывание от планировщика потоков пользовательского пространства. Функция `sleepq_wait` просто ожидает, пока текущий поток не будет явно возобновлён одной из функций пробуждения. Функция `sleepq_timedwait` ожидает, пока поток не будет явно возобновлён или пока не истечёт таймаут, установленный предыдущим вызовом `sleepq_set_timeout`. Функция `sleepq_wait_sig` ожидает, пока поток не будет явно возобновлён или его сон не будет прерван. Функция `sleepq_timedwait_sig` ожидает, пока поток не будет явно возобновлён, не истечёт таймаут, установленный предыдущим вызовом `sleepq_set_timeout`, или сон потока не будет прерван. Все функции ожидания принимают канал ожидания в качестве первого параметра. Кроме того, функция `sleepq_timedwait_sig` принимает второй логический параметр, указывающий, обнаружил ли предыдущий вызов `sleepq_catch_signals` ожидающий сигнал.
+
+Если поток явно возобновлен или прерван сигналом, функция ожидания возвращает ноль, указывая на успешное завершение сна. Если поток возобновлен по таймауту или прерыванию от планировщика потоков в пользовательском пространстве, вместо этого возвращается соответствующее значение errno. Обратите внимание, что поскольку `sleepq_wait` может возвращать только 0, она ничего не возвращает, и вызывающая сторона должна считать сон успешным. Также, если сон потока прерывается одновременно по таймауту и другим причинам, `sleepq_timedwait_sig` вернет ошибку, указывающую на срабатывание таймаута. Если возвращено значение ошибки 0 и для блокировки использовались `sleepq_wait_sig` или `sleepq_timedwait_sig`, следует вызвать функцию `sleepq_calc_signal_retval` для проверки ожидающих сигналов и вычисления соответствующего возвращаемого значения, если таковые обнаружены. Номер сигнала, полученный при предыдущем вызове `sleepq_catch_signals`, должен быть передан в качестве единственного аргумента в `sleepq_calc_signal_retval`.
+
+Потоки, находящиеся в состоянии ожидания на канале ожидания, явно возобновляются функциями `sleepq_broadcast` и `sleepq_signal`. Обе функции принимают канал ожидания, с которого нужно возобновить потоки, приоритет, на который нужно поднять возобновлённые потоки, и аргумент флагов, указывающий тип очереди ожидания, которую нужно возобновить. Аргумент приоритета трактуется как минимальный приоритет. Если у возобновляемого потока уже есть более высокий приоритет (численно меньший), чем указанный в аргументе, его приоритет не изменяется. Аргумент флагов используется для внутренних проверок, чтобы гарантировать, что очереди ожидания не обрабатываются как неправильный тип. Например, функции условных переменных не должны возобновлять потоки на традиционной очереди ожидания. Функция `sleepq_broadcast` возобновляет все потоки, заблокированные на указанном канале ожидания, тогда как `sleepq_signal` возобновляет только поток с наивысшим приоритетом, заблокированный на канале ожидания. Перед вызовом этих функций цепочка очереди ожидания должна быть заблокирована с помощью функции `sleepq_lock`.
+
+Спящий поток может быть прерван с помощью вызова функции `sleepq_abort`. Эта функция должна вызываться с удержанием `sched_lock`, а поток должен находиться в очереди сна. Поток также может быть удалён из определённой очереди сна с помощью функции `sleepq_remove`. Эта функция принимает как поток, так и канал ожидания в качестве аргументов и пробуждает поток только в том случае, если он находится в очереди сна для указанного канала ожидания. Если поток не находится в очереди сна или находится в очереди сна для другого канала ожидания, эта функция ничего не делает.
+
+=== Турникеты
+
+- Сравнение/сопоставление с очередями сна.
+
+- Поиск/ожидание/освобождение. - Описать состояние гонки TDF_TSNOBLOCK.
+
+- Приоритетное распространение.
+
+=== Подробности реализации мьютекса
+
+- Должны ли мы требовать владения мьютексами для `mtx_destroy()`, так как иначе мы не можем безопасно утверждать, что они не принадлежат кому-либо ещё?
+
+==== Вращающиеся мьютексы
+
+- Использование критической секции...
+
+==== Мьютексы сна (Sleep Mutexes)
+
+- Опишите гонки с оспариваемыми мьютексами
+
+- Почему безопасно читать mtx_lock оспариваемой мьютекса при удержании блокировки цепочки турникета.
+
+=== Witness
+
+- Что это делает
+
+- Как это работает
+
+[[smp-misc]]
+== Разные темы
+
+=== Источники прерываний и абстракции ICU
+
+- struct isrc
+
+- pic драйверы
+
+=== Другие случайные вопросы/темы
+
+- Передавать ли блокировку в `sema_wait`?
+
+- Должны ли мы иметь sx блокировки без возможности сна?
+
+- Добавить некоторую информацию о правильном использовании счетчиков ссылок.
+
+:sectnums!:
+
+[glossary]
+[[smp-glossary]]
+== Глоссарий
+
+[.glosslist]
+atomic (атомарный)::
+Операция является атомарной, если все её эффекты видны другим процессорам одновременно при соблюдении соответствующего протокола доступа. В простейшем случае атомарные инструкции предоставляются непосредственно архитектурой процессора. На более высоком уровне, если несколько элементов структуры защищены блокировкой, то набор операций является атомарным, если все они выполняются при удержании блокировки без её освобождения между любыми из операций.
++
+См. также operation (операция).
+
+block (блокировать)::
+Поток блокируется, когда он ожидает блокировку, ресурс или условие. К сожалению, этот термин в результате немного перегружен.
++
+См. также sleep (спать).
+
+critical section (критическая секция)::
+Фрагмент кода, который не может быть вытеснен. Критическая секция начинается и завершается с использованием API man:critical_enter[9].
+
+MD::
+Машинозависимый (machine dependent).
++
+Смотри также MI.
+
+memory operation (операция с памятью)::
+Операция с памятью выполняет чтение и/или запись в ячейку памяти.
+
+MI::
+Машинно-независимый (machine independent).
++
+См. также MD.
+
+operation (операция)::
+См. memory operation (операция с памятью).
+
+primary interrupt context (основной контекст прерывания)::
+Основной контекст прерывания относится к коду, который выполняется при возникновении прерывания. Этот код может либо напрямую запускать обработчик прерывания, либо планировать выполнение асинхронного потока прерывания для обработчиков прерываний данного источника.
+
+realtime kernel thread (поток ядра реального времени)::
+Высокоприоритетный поток ядра. В настоящее время единственными потоками ядра с реальным приоритетом являются потоки обработки прерываний.
++
+См. также thread (поток).
+
+sleep (спать)::
+Поток находится в состоянии сна, когда он заблокирован на условной переменной или в очереди сна через `msleep` или `tsleep`.
++
+См. также block (блокировать).
+
+sleepable lock (блокировка с возможностью сна)::
+блокировка с возможностью сна — это блокировка, которая может удерживаться потоком, находящимся в состоянии сна. В настоящее время в FreeBSD единственными блокировками с возможностью сна являются lockmgr и sx. В будущем некоторые sx-блокировки, такие как allproc и proctree, могут стать блокировками с возможностью сна.
++
+См. также sleep (спать).
+
+thread (поток)::
+Поток ядра, представленный структурой `struct thread`. Потоки владеют блокировками и содержат единственный на поток контекст выполнения.
+
+wait channel (канал ожидания)::
+Виртуальный адрес ядра, на котором потоки могут переходить в режим ожидания.
+
+:sectnums:
diff --git a/documentation/content/ru/books/arch-handbook/smp/_index.po b/documentation/content/ru/books/arch-handbook/smp/_index.po
new file mode 100644
index 0000000000..8175525d49
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/smp/_index.po
@@ -0,0 +1,1983 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-08-26 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbooksmp_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:14
+#, no-wrap
+msgid "SMPng Design Document"
+msgstr "Документ по архитектуре SMPng"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:1
+#, no-wrap
+msgid "Chapter 8. SMPng Design Document"
+msgstr "Глава 8. Документ по архитектуре SMPng"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:52
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:55
+msgid ""
+"This document presents the current design and implementation of the SMPng "
+"Architecture. First, the basic primitives and tools are introduced. Next, a "
+"general architecture for the FreeBSD kernel's synchronization and execution "
+"model is laid out. Then, locking strategies for specific subsystems are "
+"discussed, documenting the approaches taken to introduce fine-grained "
+"synchronization and parallelism for each subsystem. Finally, detailed "
+"implementation notes are provided to motivate design choices, and make the "
+"reader aware of important implications involving the use of specific "
+"primitives."
+msgstr ""
+"В этом документе представлены текущая архитектура и реализация SMPng. "
+"Сначала вводятся основные примитивы и инструменты. Затем излагается общая "
+"архитектура модели синхронизации и выполнения ядра FreeBSD. Далее "
+"обсуждаются стратегии блокировок для конкретных подсистем, описывающие "
+"подходы к внедрению детализированной синхронизации и параллелизма для каждой "
+"подсистемы. В заключение приводятся подробные заметки по реализации, "
+"объясняющие выбор проектных решений и информирующие читателя о важных "
+"последствиях использования конкретных примитивов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:57
+msgid ""
+"This document is a work-in-progress, and will be updated to reflect on-going "
+"design and implementation activities associated with the SMPng Project. Many "
+"sections currently exist only in outline form, but will be fleshed out as "
+"work proceeds. Updates or suggestions regarding the document may be directed "
+"to the document editors."
+msgstr ""
+"Этот документ находится в стадии разработки и будет обновляться в "
+"соответствии с текущими проектированием и реализацией, связанными с проектом "
+"SMPng. Многие разделы в настоящее время существуют только в виде набросков, "
+"но будут дополняться по мере продвижения работы. Обновления или предложения "
+"по документу могут быть направлены редакторам документа."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:63
+msgid ""
+"The goal of SMPng is to allow concurrency in the kernel. The kernel is "
+"basically one rather large and complex program. To make the kernel multi-"
+"threaded we use some of the same tools used to make other programs multi-"
+"threaded. These include mutexes, shared/exclusive locks, semaphores, and "
+"condition variables. For the definitions of these and other SMP-related "
+"terms, please see the crossref:smp[smp-glossary, Glossary] section of this "
+"article."
+msgstr ""
+"Цель SMPng — обеспечить параллелизм в ядре. Ядро представляет собой одну "
+"довольно большую и сложную программу. Чтобы сделать ядро многопоточным, мы "
+"используем те же инструменты, что и для многопоточности других программ. К "
+"ним относятся мьютексы, разделяемые/монопольные блокировки, семафоры и "
+"условные переменные. Для определений этих и других терминов, связанных с "
+"SMP, см. раздел crossref:smp[smp-glossary, Глоссарий] в этой статье."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:65
+#, no-wrap
+msgid "Basic Tools and Locking Fundamentals"
+msgstr "Основные инструменты и основы блокировки"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:67
+#, no-wrap
+msgid "Atomic Instructions and Memory Barriers"
+msgstr "Атомарные инструкции и барьеры памяти"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:70
+msgid ""
+"There are several existing treatments of memory barriers and atomic "
+"instructions, so this section will not include a lot of detail. To put it "
+"simply, one can not go around reading variables without a lock if a lock is "
+"used to protect writes to that variable. This becomes obvious when you "
+"consider that memory barriers simply determine relative order of memory "
+"operations; they do not make any guarantee about timing of memory "
+"operations. That is, a memory barrier does not force the contents of a CPU's "
+"local cache or store buffer to flush. Instead, the memory barrier at lock "
+"release simply ensures that all writes to the protected data will be visible "
+"to other CPU's or devices if the write to release the lock is visible. The "
+"CPU is free to keep that data in its cache or store buffer as long as it "
+"wants. However, if another CPU performs an atomic instruction on the same "
+"datum, the first CPU must guarantee that the updated value is made visible "
+"to the second CPU along with any other operations that memory barriers may "
+"require."
+msgstr ""
+"Можно найти много описаний барьеров памяти и атомарных инструкций, поэтому в "
+"этом разделе не будет много деталей. Проще говоря, нельзя читать переменные "
+"без блокировки, если блокировка используется для защиты записи в эту "
+"переменную. Это становится очевидным, если учесть, что барьеры памяти лишь "
+"определяют относительный порядок операций с памятью; они не дают никаких "
+"гарантий относительно времени выполнения этих операций. То есть, барьер "
+"памяти не принуждает к сбросу содержимого локального кэша или буфера записи "
+"процессора. Вместо этого, барьер памяти при освобождении блокировки просто "
+"гарантирует, что все записи в защищённые данные будут видны другим "
+"процессорам или устройствам, если видна запись, освобождающая блокировку. "
+"Процессор может хранить эти данные в своём кэше или буфере записи сколько "
+"угодно долго. Однако, если другой процессор выполняет атомарную инструкцию "
+"над тем же данным, первый процессор должен гарантировать, что обновлённое "
+"значение будет видно второму процессору, наряду с любыми другими операциями, "
+"которые могут потребоваться согласно барьерам памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:72
+msgid ""
+"For example, assuming a simple model where data is considered visible when "
+"it is in main memory (or a global cache), when an atomic instruction is "
+"triggered on one CPU, other CPU's store buffers and caches must flush any "
+"writes to that same cache line along with any pending operations behind a "
+"memory barrier."
+msgstr ""
+"Например, предполагая простую модель, в которой данные считаются видимыми, "
+"когда они находятся в основной памяти (или в глобальном кэше), когда "
+"начинается выполнение атомарной инструкции на одном процессоре, буферы "
+"записи и кэши других процессоров должны выполнить все записи в ту же строку "
+"кэша вместе с любыми ожидающими операциями за барьером памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:74
+msgid ""
+"This requires one to take special care when using an item protected by "
+"atomic instructions. For example, in the sleep mutex implementation, we have "
+"to use an `atomic_cmpset` rather than an `atomic_set` to turn on the "
+"`MTX_CONTESTED` bit. The reason is that we read the value of `mtx_lock` into "
+"a variable and then make a decision based on that read. However, the value "
+"we read may be stale, or it may change while we are making our decision. "
+"Thus, when the `atomic_set` executed, it may end up setting the bit on "
+"another value than the one we made the decision on. Thus, we have to use an "
+"`atomic_cmpset` to set the value only if the value we made the decision on "
+"is up-to-date and valid."
+msgstr ""
+"Это требует особой осторожности при использовании элемента, защищённого "
+"атомарными инструкциями. Например, в реализации мьютекса сна мы должны "
+"использовать `atomic_cmpset` вместо `atomic_set` для установки бита "
+"`MTX_CONTESTED`. Причина в том, что мы считываем значение `mtx_lock` в "
+"переменную и затем принимаем решение на основе этого чтения. Однако "
+"значение, которое мы ранее прочитали, может быть устаревшим или измениться, "
+"пока мы принимаем решение. Таким образом, когда выполняется `atomic_set`, "
+"это может привести к установке бита на другом значении, отличном от того, на "
+"котором мы основывали своё решение. Поэтому мы должны использовать "
+"`atomic_cmpset`, чтобы установить значение только в том случае, если "
+"значение, на котором мы приняли решение, актуально и действительно."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:76
+msgid ""
+"Finally, atomic instructions only allow one item to be updated or read. If "
+"one needs to atomically update several items, then a lock must be used "
+"instead. For example, if two counters must be read and have values that are "
+"consistent relative to each other, then those counters must be protected by "
+"a lock rather than by separate atomic instructions."
+msgstr ""
+"Наконец, атомарные инструкции позволяют обновить или прочитать только один "
+"элемент. Если необходимо атомарно обновить несколько элементов, вместо этого "
+"следует использовать блокировку. Например, если требуется прочитать два "
+"счётчика и получить их значения, согласованные друг с другом, то эти "
+"счётчики должны быть защищены блокировкой, а не отдельными атомарными "
+"инструкциями."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:77
+#, no-wrap
+msgid "Read Locks Versus Write Locks"
+msgstr "Блокировки на чтение и блокировки на запись"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:80
+msgid ""
+"Read locks do not need to be as strong as write locks. Both types of locks "
+"need to ensure that the data they are accessing is not stale. However, only "
+"write access requires exclusive access. Multiple threads can safely read a "
+"value. Using different types of locks for reads and writes can be "
+"implemented in a number of ways."
+msgstr ""
+"Блокировки на чтение не требуют такой же строгости, как блокировки на "
+"запись. Оба типа блокировок должны гарантировать, что данные, к которым они "
+"обращаются, не устарели. Однако запись требует монопольного доступа. "
+"Несколько потоков могут безопасно читать значение. Использование разных "
+"типов блокировок для чтения и записи может быть реализовано несколькими "
+"способами."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:82
+msgid ""
+"First, sx locks can be used in this manner by using an exclusive lock when "
+"writing and a shared lock when reading. This method is quite straightforward."
+msgstr ""
+"Во-первых, блокировки sx могут использоваться таким образом: монопольная "
+"блокировка при записи и разделяемая блокировка при чтении. Этот метод "
+"достаточно прост."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:84
+msgid ""
+"A second method is a bit more obscure. You can protect a datum with multiple "
+"locks. Then for reading that data you simply need to have a read lock of one "
+"of the locks. However, to write to the data, you need to have a write lock "
+"of all of the locks. This can make writing rather expensive but can be "
+"useful when data is accessed in various ways. For example, the parent "
+"process pointer is protected by both the `proctree_lock` sx lock and the per-"
+"process mutex. Sometimes the proc lock is easier as we are just checking to "
+"see who a parent of a process is that we already have locked. However, other "
+"places such as `inferior` need to walk the tree of processes via parent "
+"pointers and locking each process would be prohibitive as well as a pain to "
+"guarantee that the condition you are checking remains valid for both the "
+"check and the actions taken as a result of the check."
+msgstr ""
+"Второй метод несколько менее очевиден. Вы можете защитить данные несколькими "
+"блокировками. Для чтения данных достаточно получить блокировку на чтение "
+"одной из блокировок. Однако для записи данных необходимо получить блокировку "
+"на запись всех блокировок. Это может сделать запись довольно затратной, но "
+"может быть полезно, когда данные доступны различными способами. Например, "
+"указатель на родительский процесс защищён как `proctree_lock` sx-"
+"блокировкой, так и мьютексом процесса. Иногда блокировка процесса удобнее, "
+"так как мы просто проверяем, кто является родителем уже заблокированного "
+"процесса. Однако в других случаях, таких как `inferior`, необходимо обходить "
+"дерево процессов через указатели на родителя, и блокировка каждого процесса "
+"была бы слишком затратной, а также сложной для гарантии того, что "
+"проверяемое условие остаётся верным как во время проверки, так и при "
+"выполнении действий, основанных на этой проверке."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:85
+#, no-wrap
+msgid "Locking Conditions and Results"
+msgstr "Условия и результаты блокировки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:88
+msgid ""
+"If you need a lock to check the state of a variable so that you can take an "
+"action based on the state you read, you can not just hold the lock while "
+"reading the variable and then drop the lock before you act on the value you "
+"read. Once you drop the lock, the variable can change rendering your "
+"decision invalid. Thus, you must hold the lock both while reading the "
+"variable and while performing the action as a result of the test."
+msgstr ""
+"Если вам нужна блокировка для проверки состояния переменной, чтобы можно "
+"было выполнить действие на основе прочитанного состояния, вы не можете "
+"просто удерживать блокировку во время чтения переменной, а затем снять "
+"блокировку перед выполнением действия на основе прочитанного значения. Как "
+"только вы снимаете блокировку, переменная может измениться, что сделает ваше "
+"решение недействительным. Таким образом, вы должны удерживать блокировку как "
+"во время чтения переменной, так и во время выполнения действия в результате "
+"проверки."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:90
+#, no-wrap
+msgid "General Architecture and Design"
+msgstr "Общая Архитектура и Дизайн"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:92
+#, no-wrap
+msgid "Interrupt Handling"
+msgstr "Обработка прерываний"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:95
+msgid ""
+"Following the pattern of several other multi-threaded UNIX(R) kernels, "
+"FreeBSD deals with interrupt handlers by giving them their own thread "
+"context. Providing a context for interrupt handlers allows them to block on "
+"locks. To help avoid latency, however, interrupt threads run at real-time "
+"kernel priority. Thus, interrupt handlers should not execute for very long "
+"to avoid starving other kernel threads. In addition, since multiple handlers "
+"may share an interrupt thread, interrupt handlers should not sleep or use a "
+"sleepable lock to avoid starving another interrupt handler."
+msgstr ""
+"Следуя примеру нескольких других многопоточных ядер UNIX(R), FreeBSD "
+"реализрвала обработчики прерываний, предоставив им собственный контекст "
+"потока. Предоставление контекста для обработчиков прерываний позволяет им "
+"блокироваться на блокировках. Однако, чтобы избежать задержек, потоки "
+"обработки прерываний выполняются с приоритетом реального времени в ядре. "
+"Таким образом, обработчики прерываний не должны выполняться слишком долго, "
+"чтобы не лишать ресурсов другие потоки ядра. Кроме того, поскольку несколько "
+"обработчиков могут использовать один поток прерываний, обработчики "
+"прерываний не должны переходить в режим сна или использовать блокировки, "
+"допускающие сон, чтобы не лишать ресурсов другие обработчики прерываний."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:97
+msgid ""
+"The interrupt threads currently in FreeBSD are referred to as heavyweight "
+"interrupt threads. They are called this because switching to an interrupt "
+"thread involves a full context switch. In the initial implementation, the "
+"kernel was not preemptive and thus interrupts that interrupted a kernel "
+"thread would have to wait until the kernel thread blocked or returned to "
+"userland before they would have an opportunity to run."
+msgstr ""
+"Текущие потоки обработки прерываний в FreeBSD называются тяжеловесными "
+"потоками обработки прерываний. Они получили такое название, потому что "
+"переключение на поток обработки прерывания включает в себя полное "
+"переключение контекста. В первоначальной реализации ядро не было "
+"вытесняющим, поэтому прерывания, которые прерывали поток ядра, должны были "
+"ждать, пока поток ядра не заблокируется или не вернётся в пользовательское "
+"пространство, прежде чем у них появится возможность выполниться."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:99
+msgid ""
+"To deal with the latency problems, the kernel in FreeBSD has been made "
+"preemptive. Currently, we only preempt a kernel thread when we release a "
+"sleep mutex or when an interrupt comes in. However, the plan is to make the "
+"FreeBSD kernel fully preemptive as described below."
+msgstr ""
+"Для решения проблем с задержками ядро FreeBSD стало вытесняющим. В настоящее "
+"время вытеснение потока ядра происходит только при освобождении мьютекса сна "
+"или при поступлении прерывания. Однако планируется сделать ядро FreeBSD "
+"полностью вытесняющим, как описано ниже."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:101
+msgid ""
+"Not all interrupt handlers execute in a thread context. Instead, some "
+"handlers execute directly in primary interrupt context. These interrupt "
+"handlers are currently misnamed \"fast\" interrupt handlers since the "
+"`INTR_FAST` flag used in earlier versions of the kernel is used to mark "
+"these handlers. The only interrupts which currently use these types of "
+"interrupt handlers are clock interrupts and serial I/O device interrupts. "
+"Since these handlers do not have their own context, they may not acquire "
+"blocking locks and thus may only use spin mutexes."
+msgstr ""
+"Не все обработчики прерываний выполняются в контексте потока. Вместо этого, "
+"некоторые обработчики выполняются непосредственно в основном контексте "
+"прерывания. Эти обработчики прерываний в настоящее время ошибочно называются "
+"\"быстрыми\" обработчиками прерываний, поскольку для их обозначения "
+"применяется флаг `INTR_FAST`, использовавшийся в более ранних версиях ядра. "
+"Единственные прерывания, которые в настоящее время используют такие "
+"обработчики прерываний, — это прерывания от часов и последовательных "
+"устройств ввода-вывода. Поскольку эти обработчики не имеют собственного "
+"контекста, они не могут захватывать блокирующие блокировки и, следовательно, "
+"могут использовать только спин-мьютексы."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:103
+msgid ""
+"Finally, there is one optional optimization that can be added in MD code "
+"called lightweight context switches. Since an interrupt thread executes in a "
+"kernel context, it can borrow the vmspace of any process. Thus, in a "
+"lightweight context switch, the switch to the interrupt thread does not "
+"switch vmspaces but borrows the vmspace of the interrupted thread. In order "
+"to ensure that the vmspace of the interrupted thread does not disappear out "
+"from under us, the interrupted thread is not allowed to execute until the "
+"interrupt thread is no longer borrowing its vmspace. This can happen when "
+"the interrupt thread either blocks or finishes. If an interrupt thread "
+"blocks, then it will use its own context when it is made runnable again. "
+"Thus, it can release the interrupted thread."
+msgstr ""
+"Наконец, существует одна дополнительная оптимизация, которую можно добавить "
+"в код MD, называемая легковесными переключениями контекста. Поскольку поток "
+"обработки прерывания выполняется в контексте ядра, он может заимствовать "
+"vmspace любого процесса. Таким образом, при легковесном переключении "
+"контекста переход к потоку обработки прерывания не меняет vmspace, а "
+"заимствует vmspace прерванного потока. Чтобы гарантировать, что vmspace "
+"прерванного потока не исчезнет во время работы, прерванному потоку "
+"запрещается выполнение до тех пор, пока поток обработки прерывания больше не "
+"использует его vmspace. Это может произойти, когда поток обработки "
+"прерывания либо блокируется, либо завершается. Если поток обработки "
+"прерывания блокируется, то при повторном запуске он будет использовать свой "
+"собственный контекст. Таким образом, он может освободить прерванный поток."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:105
+msgid ""
+"The cons of this optimization are that they are very machine specific and "
+"complex and thus only worth the effort if their is a large performance "
+"improvement. At this point it is probably too early to tell, and in fact, "
+"will probably hurt performance as almost all interrupt handlers will "
+"immediately block on Giant and require a thread fix-up when they block. "
+"Also, an alternative method of interrupt handling has been proposed by Mike "
+"Smith that works like so:"
+msgstr ""
+"Недостатки этой оптимизации заключаются в том, что они очень специфичны для "
+"конкретной машины и сложны, поэтому стоят усилий только в случае "
+"значительного улучшения производительности. На данный момент, вероятно, ещё "
+"рано делать выводы, и, фактически, это может даже ухудшить "
+"производительность, так как почти все обработчики прерываний будут "
+"немедленно блокироваться на Giant и потребуют исправления потока при "
+"блокировке. Кроме того, Майк Смит предложил альтернативный метод обработки "
+"прерываний, который работает следующим образом:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:107
+msgid ""
+"Each interrupt handler has two parts: a predicate which runs in primary "
+"interrupt context and a handler which runs in its own thread context."
+msgstr ""
+"Каждый обработчик прерывания состоит из двух частей: предиката, который "
+"выполняется в основном контексте прерывания, и обработчика, который "
+"выполняется в контексте собственного потока."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:108
+msgid ""
+"If an interrupt handler has a predicate, then when an interrupt is "
+"triggered, the predicate is run. If the predicate returns true then the "
+"interrupt is assumed to be fully handled and the kernel returns from the "
+"interrupt. If the predicate returns false or there is no predicate, then the "
+"threaded handler is scheduled to run."
+msgstr ""
+"Если у обработчика прерывания есть предикат, то при срабатывании прерывания "
+"этот предикат выполняется. Если предикат возвращает значение `true`, "
+"прерывание считается полностью обработанным, и ядро возвращается из "
+"прерывания. Если предикат возвращает `false` или предиката нет, то "
+"запланированный обработчик запускается."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:110
+msgid ""
+"Fitting light weight context switches into this scheme might prove rather "
+"complicated. Since we may want to change to this scheme at some point in the "
+"future, it is probably best to defer work on light weight context switches "
+"until we have settled on the final interrupt handling architecture and "
+"determined how light weight context switches might or might not fit into it."
+msgstr ""
+"Встраивание легковесных переключений контекста в эту схему может оказаться "
+"довольно сложным. Поскольку мы, возможно, захотим перейти на эту схему в "
+"будущем, вероятно, лучше отложить работу над легковесными переключениями "
+"контекста до тех пор, пока мы не определимся с окончательной архитектурой "
+"обработки прерываний и не выясним, как легковесные переключения контекста "
+"могут (или не могут) в неё вписаться."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:111
+#, no-wrap
+msgid "Kernel Preemption and Critical Sections"
+msgstr "Ядро с вытеснением и критические секции"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:113
+#, no-wrap
+msgid "Kernel Preemption in a Nutshell"
+msgstr "Ядро и вытеснение вкратце"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:116
+msgid ""
+"Kernel preemption is fairly simple. The basic idea is that a CPU should "
+"always be doing the highest priority work available. Well, that is the ideal "
+"at least. There are a couple of cases where the expense of achieving the "
+"ideal is not worth being perfect."
+msgstr ""
+"Вытеснение ядра довольно просто. Основная идея заключается в том, что "
+"процессор всегда должен выполнять наиболее приоритетную доступную работу. "
+"Ну, это в идеале, по крайней мере. Есть несколько случаев, когда затраты на "
+"достижение идеала не стоят совершенства."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:118
+msgid ""
+"Implementing full kernel preemption is very straightforward: when you "
+"schedule a thread to be executed by putting it on a run queue, you check to "
+"see if its priority is higher than the currently executing thread. If so, "
+"you initiate a context switch to that thread."
+msgstr ""
+"Реализация полной вытесняющей многозадачности в ядре очень проста: когда вы "
+"планируете выполнение потока, помещая его в очередь выполнения, вы "
+"проверяете, является ли его приоритет выше, чем у текущего выполняемого "
+"потока. Если да, вы инициируете переключение контекста на этот поток."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:120
+msgid ""
+"While locks can protect most data in the case of a preemption, not all of "
+"the kernel is preemption safe. For example, if a thread holding a spin mutex "
+"preempted and the new thread attempts to grab the same spin mutex, the new "
+"thread may spin forever as the interrupted thread may never get a chance to "
+"execute. Also, some code such as the code to assign an address space number "
+"for a process during `exec` on the Alpha needs to not be preempted as it "
+"supports the actual context switch code. Preemption is disabled for these "
+"code sections by using a critical section."
+msgstr ""
+"Хотя блокировки могут защитить большинство данных в случае вытеснения, не "
+"все части ядра безопасны для вытеснения. Например, если поток, удерживающий "
+"спин-блокировку, будет вытеснен, а новый поток попытается захватить ту же "
+"спин-блокировку, новый поток может вращаться вечно, так как прерванный поток "
+"может никогда не получить шанс на выполнение. Кроме того, некоторый код, "
+"такой как код для назначения номера адресного пространства процессу во время "
+"`exec` на Alpha, не должен быть вытеснен, так как он поддерживает "
+"фактический код переключения контекста. Для таких участков кода вытеснение "
+"отключается с использованием критической секции."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:121
+#, no-wrap
+msgid "Critical Sections"
+msgstr "Критические Секции"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:124
+msgid ""
+"The responsibility of the critical section API is to prevent context "
+"switches inside of a critical section. With a fully preemptive kernel, every "
+"`setrunqueue` of a thread other than the current thread is a preemption "
+"point. One implementation is for `critical_enter` to set a per-thread flag "
+"that is cleared by its counterpart. If `setrunqueue` is called with this "
+"flag set, it does not preempt regardless of the priority of the new thread "
+"relative to the current thread. However, since critical sections are used in "
+"spin mutexes to prevent context switches and multiple spin mutexes can be "
+"acquired, the critical section API must support nesting. For this reason the "
+"current implementation uses a nesting count instead of a single per-thread "
+"flag."
+msgstr ""
+"Ответственность API критической секции заключается в предотвращении "
+"переключения контекста внутри критической секции. В полностью вытесняющем "
+"ядре каждый вызов `setrunqueue` для потока, отличного от текущего, является "
+"точкой вытеснения. Одна из реализаций заключается в том, что "
+"`critical_enter` устанавливает флаг для каждого потока, который сбрасывается "
+"его парной функцией. Если `setrunqueue` вызывается, когда этот флаг "
+"установлен, вытеснение не происходит, независимо от приоритета нового потока "
+"относительно текущего. Однако, поскольку критические секции используются в "
+"спин-блокировках для предотвращения переключения контекста и может быть "
+"захвачено несколько спин-блокировок, API критической секции должен "
+"поддерживать вложенность. По этой причине текущая реализация использует "
+"счетчик вложенности вместо одиночного флага для каждого потока."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:126
+msgid ""
+"In order to minimize latency, preemptions inside of a critical section are "
+"deferred rather than dropped. If a thread that would normally be preempted "
+"to is made runnable while the current thread is in a critical section, then "
+"a per-thread flag is set to indicate that there is a pending preemption. "
+"When the outermost critical section is exited, the flag is checked. If the "
+"flag is set, then the current thread is preempted to allow the higher "
+"priority thread to run."
+msgstr ""
+"Для минимизации задержек прерывания внутри критической секции откладываются, "
+"а не отбрасываются. Если поток, который в обычных условиях должен быть "
+"вытеснен, становится готовым к выполнению, пока текущий поток находится в "
+"критической секции, то устанавливается флаг для данного потока, указывающий "
+"на ожидающее прерывание. При выходе из самой внешней критической секции флаг "
+"проверяется. Если флаг установлен, текущий поток вытесняется, чтобы "
+"позволить выполниться потоку с более высоким приоритетом."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:128
+msgid ""
+"Interrupts pose a problem with regards to spin mutexes. If a low-level "
+"interrupt handler needs a lock, it needs to not interrupt any code needing "
+"that lock to avoid possible data structure corruption. Currently, providing "
+"this mechanism is piggybacked onto critical section API by means of the "
+"`cpu_critical_enter` and `cpu_critical_exit` functions. Currently this API "
+"disables and re-enables interrupts on all of FreeBSD's current platforms. "
+"This approach may not be purely optimal, but it is simple to understand and "
+"simple to get right. Theoretically, this second API need only be used for "
+"spin mutexes that are used in primary interrupt context. However, to make "
+"the code simpler, it is used for all spin mutexes and even all critical "
+"sections. It may be desirable to split out the MD API from the MI API and "
+"only use it in conjunction with the MI API in the spin mutex implementation. "
+"If this approach is taken, then the MD API likely would need a rename to "
+"show that it is a separate API."
+msgstr ""
+"Прерывания создают проблему для спин-мьютексов. Если обработчик "
+"низкоуровневого прерывания требует блокировки, он не должен прерывать любой "
+"код, которому нужна эта блокировка, чтобы избежать возможного повреждения "
+"структур данных. В настоящее время этот механизм реализован через API "
+"критических секций с помощью функций `cpu_critical_enter` и "
+"`cpu_critical_exit`. Сейчас этот API отключает и снова включает прерывания "
+"на всех текущих платформах FreeBSD. Такой подход может быть не идеально "
+"оптимальным, но он прост для понимания и надежен в реализации. Теоретически, "
+"этот второй API нужен только для спин-мьютексов, используемых в основном "
+"контексте прерываний. Однако, для упрощения кода, он используется для всех "
+"спин-мьютексов и даже для всех критических секций. Возможно, стоит отделить "
+"MD API от MI API и использовать его только совместно с MI API в реализации "
+"спин-мьютексов. Если будет принят такой подход, то MD API, вероятно, "
+"потребуется переименовать, чтобы показать, что это отдельный API."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:129
+#, no-wrap
+msgid "Design Tradeoffs"
+msgstr "Компромиссы проектирования"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:132
+msgid ""
+"As mentioned earlier, a couple of trade-offs have been made to sacrifice "
+"cases where perfect preemption may not always provide the best performance."
+msgstr ""
+"Как упоминалось ранее, были сделаны некоторые компромиссы, чтобы "
+"пожертвовать случаями, когда идеальная вытесняющая многозадачность не всегда "
+"обеспечивает наилучшую производительность."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:134
+msgid ""
+"The first trade-off is that the preemption code does not take other CPUs "
+"into account. Suppose we have a two CPU's A and B with the priority of A's "
+"thread as 4 and the priority of B's thread as 2. If CPU B makes a thread "
+"with priority 1 runnable, then in theory, we want CPU A to switch to the new "
+"thread so that we will be running the two highest priority runnable threads. "
+"However, the cost of determining which CPU to enforce a preemption on as "
+"well as actually signaling that CPU via an IPI along with the "
+"synchronization that would be required would be enormous. Thus, the current "
+"code would instead force CPU B to switch to the higher priority thread. Note "
+"that this still puts the system in a better position as CPU B is executing a "
+"thread of priority 1 rather than a thread of priority 2."
+msgstr ""
+"Первый компромисс заключается в том, что код вытеснения не учитывает другие "
+"процессоры. Предположим, у нас есть два процессора A и B, где приоритет "
+"потока A равен 4, а приоритет потока B равен 2. Если процессор B делает "
+"поток с приоритетом 1 готовым к выполнению, то теоретически мы хотим, чтобы "
+"процессор A переключился на новый поток, чтобы выполнялись два потока с "
+"наивысшим приоритетом. Однако стоимость определения, на какой процессор "
+"нужно применить вытеснение, а также фактическая сигнализация этому "
+"процессору через IPI вместе с необходимой синхронизацией были бы огромными. "
+"Таким образом, текущий код вместо этого заставит процессор B переключиться "
+"на поток с более высоким приоритетом. Заметим, что это всё равно улучшает "
+"состояние системы, так как процессор B выполняет поток с приоритетом 1, а не "
+"поток с приоритетом 2."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:136
+msgid ""
+"The second trade-off limits immediate kernel preemption to real-time "
+"priority kernel threads. In the simple case of preemption defined above, a "
+"thread is always preempted immediately (or as soon as a critical section is "
+"exited) if a higher priority thread is made runnable. However, many threads "
+"executing in the kernel only execute in a kernel context for a short time "
+"before either blocking or returning to userland. Thus, if the kernel "
+"preempts these threads to run another non-realtime kernel thread, the kernel "
+"may switch out the executing thread just before it is about to sleep or "
+"execute. The cache on the CPU must then adjust to the new thread. When the "
+"kernel returns to the preempted thread, it must refill all the cache "
+"information that was lost. In addition, two extra context switches are "
+"performed that could be avoided if the kernel deferred the preemption until "
+"the first thread blocked or returned to userland. Thus, by default, the "
+"preemption code will only preempt immediately if the higher priority thread "
+"is a real-time priority thread."
+msgstr ""
+"Второй компромисс ограничивает немедленное вытеснение ядра только потоками "
+"ядра с реальным временем. В простом случае вытеснения, описанном выше, поток "
+"всегда вытесняется немедленно (или как только будет покинута критическая "
+"секция), если становится доступным поток с более высоким приоритетом. Однако "
+"многие потоки, выполняющиеся в ядре, работают в контексте ядра лишь короткое "
+"время перед тем, как либо заблокироваться, либо вернуться в пользовательское "
+"пространство. Таким образом, если ядро вытеснит эти потоки для выполнения "
+"другого потока ядра без реального времени, оно может переключиться с "
+"выполняемого потока как раз перед тем, как тот собирается завершиться или "
+"перейти в режим ожидания. Кэш процессора должен затем адаптироваться к "
+"новому потоку. Когда ядро возвращается к вытесненному потоку, оно должно "
+"восстановить все потерянные кэшированные данные. Кроме того, выполняются два "
+"дополнительных переключения контекста, которых можно было бы избежать, если "
+"бы ядро отложило вытеснение до момента, пока первый поток не заблокируется "
+"или не вернётся в пользовательское пространство. Таким образом, по умолчанию "
+"код вытеснения будет немедленно вытеснять поток только в том случае, если "
+"поток с более высоким приоритетом имеет приоритет реального времени."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:138
+msgid ""
+"Turning on full kernel preemption for all kernel threads has value as a "
+"debugging aid since it exposes more race conditions. It is especially useful "
+"on UP systems were many races are hard to simulate otherwise. Thus, there is "
+"a kernel option `FULL_PREEMPTION` to enable preemption for all kernel "
+"threads that can be used for debugging purposes."
+msgstr ""
+"Включение полной вытесняющей многозадачности для всех потоков ядра полезно в "
+"качестве средства отладки, так как позволяет выявить больше состояний гонки. "
+"Это особенно полезно на однопроцессорных системах (UP), где многие гонки "
+"сложно воспроизвести другими способами. Таким образом, существует опция ядра "
+"`FULL_PREEMPTION` для включения вытеснения для всех потоков ядра, которая "
+"может использоваться для целей отладки."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:139
+#, no-wrap
+msgid "Thread Migration"
+msgstr "Миграция потоков"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:142
+msgid ""
+"Simply put, a thread migrates when it moves from one CPU to another. In a "
+"non-preemptive kernel this can only happen at well-defined points such as "
+"when calling `msleep` or returning to userland. However, in the preemptive "
+"kernel, an interrupt can force a preemption and possible migration at any "
+"time. This can have negative affects on per-CPU data since with the "
+"exception of `curthread` and `curpcb` the data can change whenever you "
+"migrate. Since you can potentially migrate at any time this renders "
+"unprotected per-CPU data access rather useless. Thus it is desirable to be "
+"able to disable migration for sections of code that need per-CPU data to be "
+"stable."
+msgstr ""
+"Простыми словами, поток мигрирует, когда переходит с одного CPU на другой. В "
+"неперемещаемом ядре это может происходить только в определённых точках, "
+"например, при вызове `msleep` или возврате в пользовательское пространство. "
+"Однако в перемещаемом ядре прерывание может вызвать вытеснение и возможную "
+"миграцию в любой момент. Это может негативно сказаться на данных, "
+"специфичных для CPU, поскольку, за исключением `curthread` и `curpcb`, "
+"данные могут изменяться при любой миграции. Поскольку потенциально миграция "
+"может произойти в любой момент, это делает незащищённый доступ к данным, "
+"специфичным для CPU, практически бесполезным. Поэтому желательно иметь "
+"возможность отключать миграцию для участков кода, где требуется стабильность "
+"данных, специфичных для CPU."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:144
+msgid ""
+"Critical sections currently prevent migration since they do not allow "
+"context switches. However, this may be too strong of a requirement to "
+"enforce in some cases since a critical section also effectively blocks "
+"interrupt threads on the current processor. As a result, another API has "
+"been provided to allow the current thread to indicate that if it preempted "
+"it should not migrate to another CPU."
+msgstr ""
+"Критические секции в настоящее время предотвращают миграцию, поскольку они "
+"не допускают переключения контекстов. Однако это может быть слишком строгим "
+"требованием в некоторых случаях, так как критическая секция также эффективно "
+"блокирует потоки прерываний на текущем процессоре. В результате был "
+"предоставлен другой API, позволяющий текущему потоку указать, что если он "
+"будет вытеснен, он не должен мигрировать на другой CPU."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:146
+msgid ""
+"This API is known as thread pinning and is provided by the scheduler. The "
+"API consists of two functions: `sched_pin` and `sched_unpin`. These "
+"functions manage a per-thread nesting count `td_pinned`. A thread is pinned "
+"when its nesting count is greater than zero and a thread starts off unpinned "
+"with a nesting count of zero. Each scheduler implementation is required to "
+"ensure that pinned threads are only executed on the CPU that they were "
+"executing on when the `sched_pin` was first called. Since the nesting count "
+"is only written to by the thread itself and is only read by other threads "
+"when the pinned thread is not executing but while `sched_lock` is held, then "
+"`td_pinned` does not need any locking. The `sched_pin` function increments "
+"the nesting count and `sched_unpin` decrements the nesting count. Note that "
+"these functions only operate on the current thread and bind the current "
+"thread to the CPU it is executing on at the time. To bind an arbitrary "
+"thread to a specific CPU, the `sched_bind` and `sched_unbind` functions "
+"should be used instead."
+msgstr ""
+"Этот API известен как закрепление потока и предоставляется планировщиком. "
+"API состоит из двух функций: `sched_pin` и `sched_unpin`. Эти функции "
+"управляют счетчиком вложенности `td_pinned` для каждого потока. Поток "
+"считается закрепленным, когда его счетчик вложенности больше нуля, и "
+"прекрашает быть закрепленным с нулевым счетчиком вложенности. Каждая "
+"реализация планировщика должна гарантировать, что закрепленные потоки "
+"выполняются только на том CPU, на котором они выполнялись при первом вызове "
+"`sched_pin`. Поскольку счетчик вложенности изменяется только самим потоком и "
+"читается другими потоками только тогда, когда закрепленный поток не "
+"выполняется, но удерживается `sched_lock`, то `td_pinned` не требует "
+"блокировки. Функция `sched_pin` увеличивает счетчик вложенности, а "
+"`sched_unpin` уменьшает его. Обратите внимание, что эти функции работают "
+"только с текущим потоком и привязывают текущий поток к CPU, на котором он "
+"выполняется в данный момент. Для привязки произвольного потока к "
+"определенному CPU следует использовать функции `sched_bind` и `sched_unbind`."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:147
+#, no-wrap
+msgid "Callouts"
+msgstr "Обратные вызовы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:150
+msgid ""
+"The `timeout` kernel facility permits kernel services to register functions "
+"for execution as part of the `softclock` software interrupt. Events are "
+"scheduled based on a desired number of clock ticks, and callbacks to the "
+"consumer-provided function will occur at approximately the right time."
+msgstr ""
+"Функция ядра `timeout` позволяет службам ядра регистрировать функции для "
+"выполнения в рамках программного прерывания `softclock`. События планируются "
+"на основе заданного количества тактов часов, и вызовы предоставленной "
+"потребителем функции будут происходить приблизительно в нужное время."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:152
+msgid ""
+"The global list of pending timeout events is protected by a global spin "
+"mutex, `callout_lock`; all access to the timeout list must be performed with "
+"this mutex held. When `softclock` is woken up, it scans the list of pending "
+"timeouts for those that should fire. In order to avoid lock order reversal, "
+"the `softclock` thread will release the `callout_lock` mutex when invoking "
+"the provided `timeout` callback function. If the `CALLOUT_MPSAFE` flag was "
+"not set during registration, then Giant will be grabbed before invoking the "
+"callout, and then released afterwards. The `callout_lock` mutex will be re-"
+"grabbed before proceeding. The `softclock` code is careful to leave the list "
+"in a consistent state while releasing the mutex. If `DIAGNOSTIC` is enabled, "
+"then the time taken to execute each function is measured, and a warning is "
+"generated if it exceeds a threshold."
+msgstr ""
+"Глобальный список ожидающих событий с таймаутом защищен глобальной спин-"
+"блокировкой `callout_lock`; любой доступ к списку таймаутов должен "
+"выполняться с удержанием этой блокировки. Когда `softclock` пробуждается, он "
+"сканирует список ожидающих таймаутов на предмет тех, которые должны "
+"сработать. Чтобы избежать инверсии блокировок, поток `softclock` освобождает "
+"блокировку `callout_lock` при вызове предоставленной функции обратного "
+"вызова `timeout`. Если флаг `CALLOUT_MPSAFE` не был установлен во время "
+"регистрации, то `Giant` будет захвачен перед вызовом обратного вызова, а "
+"затем освобожден после него. Блокировка `callout_lock` будет повторно "
+"захвачена перед продолжением работы. Код `softclock` аккуратно поддерживает "
+"список в согласованном состоянии во время освобождения блокировки. Если "
+"включен `DIAGNOSTIC`, то измеряется время выполнения каждой функции, и если "
+"оно превышает пороговое значение, генерируется предупреждение."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:154
+#, no-wrap
+msgid "Specific Locking Strategies"
+msgstr "Конкретные стратегии блокировки"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:156
+#, no-wrap
+msgid "Credentials"
+msgstr "Учетные данные"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:159
+msgid ""
+"`struct ucred` is the kernel's internal credential structure, and is "
+"generally used as the basis for process-driven access control within the "
+"kernel. BSD-derived systems use a \"copy-on-write\" model for credential "
+"data: multiple references may exist for a credential structure, and when a "
+"change needs to be made, the structure is duplicated, modified, and then the "
+"reference replaced. Due to wide-spread caching of the credential to "
+"implement access control on open, this results in substantial memory "
+"savings. With a move to fine-grained SMP, this model also saves "
+"substantially on locking operations by requiring that modification only "
+"occur on an unshared credential, avoiding the need for explicit "
+"synchronization when consuming a known-shared credential."
+msgstr ""
+"`struct ucred` — это внутренняя структура учетных данных ядра, которая "
+"обычно используется в качестве основы для управления доступом на уровне "
+"процессов внутри ядра. Системы, производные от BSD, используют модель "
+"«копирования при записи» для учетных данных: могут существовать "
+"множественные ссылки на структуру учетных данных, и когда требуется внести "
+"изменение, структура дублируется, изменяется, а затем ссылка заменяется. "
+"Благодаря широко распространенному кэшированию учетных данных для реализации "
+"контроля доступа при открытии, это приводит к значительной экономии памяти. "
+"С переходом на детализированную SMP (симметричную многопроцессорность), эта "
+"модель также существенно экономит на операциях блокировки, требуя, чтобы "
+"модификации выполнялись только для неразделяемых учетных данных, избегая "
+"необходимости явной синхронизации при использовании известных разделяемых "
+"учетных данных."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:161
+msgid ""
+"Credential structures with a single reference are considered mutable; shared "
+"credential structures must not be modified or a race condition is risked. A "
+"mutex, `cr_mtxp` protects the reference count of `struct ucred` so as to "
+"maintain consistency. Any use of the structure requires a valid reference "
+"for the duration of the use, or the structure may be released out from under "
+"the illegitimate consumer."
+msgstr ""
+"Структуры учетных данных с единственной ссылкой считаются изменяемыми; "
+"разделяемые структуры учетных данных не должны изменяться, иначе возникает "
+"риск состояния гонки. Мьютекс `cr_mtxp` защищает счетчик ссылок структуры "
+"`struct ucred` для поддержания согласованности. Любое использование "
+"структуры требует действительной ссылки на протяжении всего времени "
+"использования, иначе структура может быть освобождена из-под нелегитимного "
+"потребителя."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:163
+msgid ""
+"The `struct ucred` mutex is a leaf mutex and is implemented via a mutex pool "
+"for performance reasons."
+msgstr ""
+"Мьютекс `struct ucred` является листовым мьютексом и реализован через пул "
+"мьютексов по соображениям производительности."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:165
+msgid ""
+"Usually, credentials are used in a read-only manner for access control "
+"decisions, and in this case `td_ucred` is generally preferred because it "
+"requires no locking. When a process' credential is updated the `proc` lock "
+"must be held across the check and update operations thus avoid races. The "
+"process credential `p_ucred` must be used for check and update operations to "
+"prevent time-of-check, time-of-use races."
+msgstr ""
+"Обычно учетные данные используются в режиме только для чтения для принятия "
+"решений по контролю доступа, и в этом случае `td_ucred`, как правило, "
+"предпочтительнее, поскольку не требует блокировки. Когда учетные данные "
+"процесса обновляются, блокировка `proc` должна удерживаться на протяжении "
+"операций проверки и обновления, чтобы избежать состояний гонки. Учетные "
+"данные процесса `p_ucred` должны использоваться для операций проверки и "
+"обновления, чтобы предотвратить гонки между временем проверки и временем "
+"использования."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:167
+msgid ""
+"If system call invocations will perform access control after an update to "
+"the process credential, the value of `td_ucred` must also be refreshed to "
+"the current process value. This will prevent use of a stale credential "
+"following a change. The kernel automatically refreshes the `td_ucred` "
+"pointer in the thread structure from the process `p_ucred` whenever a "
+"process enters the kernel, permitting use of a fresh credential for kernel "
+"access control."
+msgstr ""
+"Если при системных вызовах будет выполняться контроль доступа после "
+"обновления учетных данных процесса, значение `td_ucred` также должно быть "
+"обновлено до текущего значения процесса. Это предотвратит использование "
+"устаревших учетных данных после изменения. Ядро автоматически обновляет "
+"указатель `td_ucred` в структуре потока из `p_ucred` процесса всякий раз, "
+"когда процесс входит в ядро, что позволяет использовать свежие учетные "
+"данные для контроля доступа в ядре."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:168
+#, no-wrap
+msgid "File Descriptors and File Descriptor Tables"
+msgstr "Дескрипторы файлов и таблицы дескрипторов файлов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:171
+msgid "Details to follow."
+msgstr "Подробности будут позже."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:172
+#, no-wrap
+msgid "Jail Structures"
+msgstr "Структуры клеток"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:175
+msgid ""
+"`struct prison` stores administrative details pertinent to the maintenance "
+"of jails created using the man:jail[2] API. This includes the per-jail "
+"hostname, IP address, and related settings. This structure is reference-"
+"counted since pointers to instances of the structure are shared by many "
+"credential structures. A single mutex, `pr_mtx` protects read and write "
+"access to the reference count and all mutable variables inside the struct "
+"jail. Some variables are set only when the jail is created, and a valid "
+"reference to the `struct prison` is sufficient to read these values. The "
+"precise locking of each entry is documented via comments in [.filename]#sys/"
+"jail.h#."
+msgstr ""
+"`struct prison` хранит административные данные, связанные с обслуживанием "
+"клеток, созданных с использованием API man:jail[2]. Это включает имя хоста "
+"для каждой клетки, IP-адрес и связанные настройки. Эта структура имеет "
+"счетчик ссылок, так как указатели на её экземпляры разделяются многими "
+"структурами учётных данных. Один мьютекс, `pr_mtx`, защищает чтение и запись "
+"счётчика ссылок и всех изменяемых переменных внутри `struct jail`. Некоторые "
+"переменные устанавливаются только при создании клетки, и действительной "
+"ссылки на `struct prison` достаточно для чтения этих значений. Точная "
+"блокировка каждой записи документирована в комментариях файла "
+"[.filename]#sys/jail.h#."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:176
+#, no-wrap
+msgid "MAC Framework"
+msgstr "MAC Framework"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:179
+msgid ""
+"The TrustedBSD MAC Framework maintains data in a variety of kernel objects, "
+"in the form of `struct label`. In general, labels in kernel objects are "
+"protected by the same lock as the remainder of the kernel object. For "
+"example, the `v_label` label in `struct vnode` is protected by the vnode "
+"lock on the vnode."
+msgstr ""
+"Фреймворк TrustedBSD MAC поддерживает данные в различных объектах ядра в "
+"виде `struct label`. Как правило, метки в объектах ядра защищаются тем же "
+"механизмом блокировки, что и остальная часть объекта ядра. Например, метка "
+"`v_label` в `struct vnode` защищается блокировкой vnode."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:181
+msgid ""
+"In addition to labels maintained in standard kernel objects, the MAC "
+"Framework also maintains a list of registered and active policies. The "
+"policy list is protected by a global mutex (`mac_policy_list_lock`) and a "
+"busy count (also protected by the mutex). Since many access control checks "
+"may occur in parallel, entry to the framework for a read-only access to the "
+"policy list requires holding the mutex while incrementing (and later "
+"decrementing) the busy count. The mutex need not be held for the duration of "
+"the MAC entry operation--some operations, such as label operations on file "
+"system objects--are long-lived. To modify the policy list, such as during "
+"policy registration and de-registration, the mutex must be held and the "
+"reference count must be zero, to prevent modification of the list while it "
+"is in use."
+msgstr ""
+"В дополнение к меткам, поддерживаемым в стандартных объектах ядра, MAC "
+"Framework также поддерживает список зарегистрированных и активных политик. "
+"Список политик защищен глобальной мьютекс-блокировкой "
+"(`mac_policy_list_lock`) и счетчиком использования (также защищенным "
+"мьютексом). Поскольку множество проверок контроля доступа может выполняться "
+"параллельно, вход в framework для доступа только на чтение к списку политик "
+"требует удержания мьютекса во время увеличения (и последующего уменьшения) "
+"счетчика использования. Мьютекс не обязательно удерживать на протяжении всей "
+"операции входа в MAC — некоторые операции, такие как операции с метками на "
+"объектах файловой системы, выполняются длительное время. Для изменения "
+"списка политик, например во время регистрации и отмены регистрации политик, "
+"мьютекс должен быть удержан, а счетчик ссылок должен быть равен нулю, чтобы "
+"предотвратить изменение списка во время его использования."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:183
+msgid ""
+"A condition variable, `mac_policy_list_not_busy`, is available to threads "
+"that need to wait for the list to become unbusy, but this condition variable "
+"must only be waited on if the caller is holding no other locks, or a lock "
+"order violation may be possible. The busy count, in effect, acts as a form "
+"of shared/exclusive lock over access to the framework: the difference is "
+"that, unlike with an sx lock, consumers waiting for the list to become "
+"unbusy may be starved, rather than permitting lock order problems with "
+"regards to the busy count and other locks that may be held on entry to (or "
+"inside) the MAC Framework."
+msgstr ""
+"Условная переменная `mac_policy_list_not_busy` доступна для потоков, которым "
+"необходимо дождаться освобождения списка, но ожидание на этой условной "
+"переменной допустимо только если вызывающий поток не удерживает других "
+"блокировок, иначе может возникнуть нарушение порядка блокировок. Фактически, "
+"счетчик занятости действует как форма разделяемой/исключающей блокировки "
+"доступа к фреймворку: отличие в том, что, в отличие от sx-блокировки, "
+"потребители, ожидающие освобождения списка, могут подвергаться голоданию, "
+"вместо того чтобы допускать проблемы порядка блокировок в отношении счетчика "
+"занятости и других блокировок, которые могут удерживаться при входе в (или "
+"внутри) MAC Framework."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:184
+#, no-wrap
+msgid "Modules"
+msgstr "Модули"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:187
+msgid ""
+"For the module subsystem there exists a single lock that is used to protect "
+"the shared data. This lock is a shared/exclusive (SX) lock and has a good "
+"chance of needing to be acquired (shared or exclusively), therefore there "
+"are a few macros that have been added to make access to the lock more easy. "
+"These macros can be located in [.filename]#sys/module.h# and are quite basic "
+"in terms of usage. The main structures protected under this lock are the "
+"`module_t` structures (when shared) and the global `modulelist_t` structure, "
+"modules. One should review the related source code in [.filename]#kern/"
+"kern_module.c# to further understand the locking strategy."
+msgstr ""
+"Для подсистемы модулей существует единая блокировка, которая используется "
+"для защиты общих данных. Эта блокировка является shared/exclusive (SX) и с "
+"высокой вероятностью потребует захвата (разделяемого или исключительного), "
+"поэтому были добавлены несколько макросов для упрощения работы с ней. Эти "
+"макросы можно найти в [.filename]#sys/module.h#, и их использование довольно "
+"простое. Основные структуры, защищаемые этой блокировкой, — это структуры "
+"`module_t` (при разделяемом доступе) и глобальная структура `modulelist_t` "
+"modules. Для более глубокого понимания стратегии блокировок рекомендуется "
+"изучить соответствующий исходный код в [.filename]#kern/kern_module.c#."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:188
+#, no-wrap
+msgid "Newbus Device Tree"
+msgstr "Дерево устройств Newbus"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:191
+msgid ""
+"The newbus system will have one sx lock. Readers will hold a shared (read) "
+"lock (man:sx_slock[9]) and writers will hold an exclusive (write) lock "
+"(man:sx_xlock[9]). Internal functions will not do locking at all. Externally "
+"visible ones will lock as needed. Those items that do not matter if the race "
+"is won or lost will not be locked, since they tend to be read all over the "
+"place (e.g., man:device_get_softc[9]). There will be relatively few changes "
+"to the newbus data structures, so a single lock should be sufficient and not "
+"impose a performance penalty."
+msgstr ""
+"Система newbus будет использовать одну блокировку sx. Читатели будут "
+"удерживать разделяемую (read) блокировку (man:sx_slock[9]), а писатели — "
+"эксклюзивную (write) блокировку (man:sx_xlock[9]). Внутренние функции не "
+"будут выполнять блокировку вообще. Внешне видимые функции будут "
+"блокироваться по мере необходимости. Элементы, для которых не важно, "
+"выиграна гонка или проиграна, не будут блокироваться, так как они обычно "
+"читаются во многих местах (например, man:device_get_softc[9]). Изменения в "
+"структурах данных newbus будут относительно редкими, поэтому одной "
+"блокировки должно быть достаточно, и это не приведёт к снижению "
+"производительности."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:192
+#, no-wrap
+msgid "Pipes"
+msgstr "Каналы (pipe)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:195
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:217
+msgid "..."
+msgstr "..."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:196
+#, no-wrap
+msgid "Processes and Threads"
+msgstr "Процессы и потоки"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:199
+msgid "process hierarchy"
+msgstr "иерархия процессов"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:201
+msgid "proc locks, references"
+msgstr "блокировки и ссылки proc"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:203
+msgid ""
+"thread-specific copies of proc entries to freeze during system calls, "
+"including td_ucred"
+msgstr ""
+"потокоспецифичные копии записей proc для заморозки во время системных "
+"вызовов, включая td_ucred"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:205
+msgid "inter-process operations"
+msgstr "межпроцессные операции"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:207
+msgid "process groups and sessions"
+msgstr "группы процессов и сеансы"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:208
+#, no-wrap
+msgid "Scheduler"
+msgstr "Планировщик"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:211
+msgid ""
+"Lots of references to `sched_lock` and notes pointing at specific primitives "
+"and related magic elsewhere in the document."
+msgstr ""
+"Множество ссылок на `sched_lock` и примечания, указывающие на конкретные "
+"примитивы и связанные с ними особенности в других частях документа."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:212
+#, no-wrap
+msgid "Select and Poll"
+msgstr "Select и Poll"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:215
+msgid ""
+"The `select` and `poll` functions permit threads to block waiting on events "
+"on file descriptors--most frequently, whether or not the file descriptors "
+"are readable or writable."
+msgstr ""
+"Функции `select` и `poll` позволяют потокам блокироваться в ожидании событий "
+"на файловых дескрипторах — чаще всего, доступности файловых дескрипторов для "
+"чтения или записи."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:218
+#, no-wrap
+msgid "SIGIO"
+msgstr "SIGIO"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:221
+msgid ""
+"The SIGIO service permits processes to request the delivery of a SIGIO "
+"signal to its process group when the read/write status of specified file "
+"descriptors changes. At most one process or process group is permitted to "
+"register for SIGIO from any given kernel object, and that process or group "
+"is referred to as the owner. Each object supporting SIGIO registration "
+"contains pointer field that is `NULL` if the object is not registered, or "
+"points to a `struct sigio` describing the registration. This field is "
+"protected by a global mutex, `sigio_lock`. Callers to SIGIO maintenance "
+"functions must pass in this field \"by reference\" so that local register "
+"copies of the field are not made when unprotected by the lock."
+msgstr ""
+"Служба SIGIO позволяет процессам запрашивать доставку сигнала SIGIO своей "
+"группе процессов при изменении статуса чтения/записи указанных файловых "
+"дескрипторов. Не более одного процесса или группы процессов может "
+"зарегистрироваться для получения SIGIO от любого заданного объекта ядра, и "
+"такой процесс или группа называется владельцем. Каждый объект, "
+"поддерживающий регистрацию SIGIO, содержит поле-указатель, которое имеет "
+"значение `NULL`, если объект не зарегистрирован, или указывает на структуру "
+"`struct sigio`, описывающую регистрацию. Это поле защищено глобальным "
+"мьютексом `sigio_lock`. Вызывающие функции обслуживания SIGIO должны "
+"передавать это поле «по ссылке», чтобы локальные копии регистра не "
+"создавались без защиты блокировкой."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:223
+msgid ""
+"One `struct sigio` is allocated for each registered object associated with "
+"any process or process group, and contains back-pointers to the object, "
+"owner, signal information, a credential, and the general disposition of the "
+"registration. Each process or progress group contains a list of registered "
+"`struct sigio` structures, `p_sigiolst` for processes, and `pg_sigiolst` for "
+"process groups. These lists are protected by the process or process group "
+"locks respectively. Most fields in each `struct sigio` are constant for the "
+"duration of the registration, with the exception of the `sio_pgsigio` field "
+"which links the `struct sigio` into the process or process group list. "
+"Developers implementing new kernel objects supporting SIGIO will, in "
+"general, want to avoid holding structure locks while invoking SIGIO "
+"supporting functions, such as `fsetown` or `funsetown` to avoid defining a "
+"lock order between structure locks and the global SIGIO lock. This is "
+"generally possible through use of an elevated reference count on the "
+"structure, such as reliance on a file descriptor reference to a pipe during "
+"a pipe operation."
+msgstr ""
+"Один `struct sigio` выделяется для каждого зарегистрированного объекта, "
+"связанного с любым процессом или группой процессов, и содержит обратные "
+"ссылки на объект, владельца, информацию о сигнале, учетные данные и общее "
+"состояние регистрации. Каждый процесс или группа процессов содержит список "
+"зарегистрированных структур `struct sigio`: `p_sigiolst` для процессов и "
+"`pg_sigiolst` для групп процессов. Эти списки защищены блокировками процесса "
+"или группы процессов соответственно. Большинство полей в каждой `struct "
+"sigio` остаются постоянными на протяжении регистрации, за исключением поля "
+"`sio_pgsigio`, которое связывает `struct sigio` со списком процесса или "
+"группы процессов. Разработчикам, реализующим новые объекты ядра с поддержкой "
+"SIGIO, как правило, следует избегать удержания блокировок структур при "
+"вызове функций поддержки SIGIO, таких как `fsetown` или `funsetown`, чтобы "
+"не определять порядок блокировок между блокировками структур и глобальной "
+"блокировкой SIGIO. Обычно это возможно за счет использования повышенного "
+"счетчика ссылок на структуру, например, путем опоры на ссылку файлового "
+"дескриптора на канал во время операции с каналом."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:224
+#, no-wrap
+msgid "Sysctl"
+msgstr "Sysctl"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:227
+msgid ""
+"The `sysctl` MIB service is invoked from both within the kernel and from "
+"userland applications using a system call. At least two issues are raised in "
+"locking: first, the protection of the structures maintaining the namespace, "
+"and second, interactions with kernel variables and functions that are "
+"accessed by the sysctl interface. Since sysctl permits the direct export "
+"(and modification) of kernel statistics and configuration parameters, the "
+"sysctl mechanism must become aware of appropriate locking semantics for "
+"those variables. Currently, sysctl makes use of a single global sx lock to "
+"serialize use of `sysctl`; however, it is assumed to operate under Giant and "
+"other protections are not provided. The remainder of this section speculates "
+"on locking and semantic changes to sysctl."
+msgstr ""
+"Сервис `sysctl` MIB вызывается как из ядра, так и из пользовательских "
+"приложений с использованием системного вызова. По крайней мере, два вопроса "
+"возникают в отношении блокировок: во-первых, защита структур, поддерживающих "
+"пространство имен, и во-вторых, взаимодействие с переменными и функциями "
+"ядра, к которым обращается интерфейс `sysctl`. Поскольку `sysctl` позволяет "
+"прямое экспортирование (и изменение) статистики ядра и параметров "
+"конфигурации, механизм `sysctl` должен учитывать соответствующие семантики "
+"блокировок для этих переменных. В настоящее время `sysctl` использует единую "
+"глобальную sx-блокировку для сериализации использования `sysctl`; однако "
+"предполагается, что он работает под защитой Giant, и другие защиты не "
+"предоставляются. Оставшаяся часть этого раздела рассматривает возможные "
+"изменения в блокировках и семантике `sysctl`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:229
+msgid ""
+"Need to change the order of operations for sysctl's that update values from "
+"read old, copyin and copyout, write new to copyin, lock, read old and write "
+"new, unlock, copyout. Normal sysctl's that just copyout the old value and "
+"set a new value that they copyin may still be able to follow the old model. "
+"However, it may be cleaner to use the second model for all of the sysctl "
+"handlers to avoid lock operations."
+msgstr ""
+"Необходимо изменить порядок операций для sysctl, которые обновляют значения "
+"из чтения старого, copyin и copyout, записи нового на copyin, блокировку, "
+"чтение старого и запись нового, разблокировку, copyout. Обычные sysctl, "
+"которые просто копируют старое значение и устанавливают новое, которое они "
+"копируют, могут по-прежнему следовать старой модели. Однако, возможно, будет "
+"чище использовать вторую модель для всех обработчиков sysctl, чтобы избежать "
+"операций блокировки."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:231
+msgid ""
+"To allow for the common case, a sysctl could embed a pointer to a mutex in "
+"the SYSCTL_FOO macros and in the struct. This would work for most sysctl's. "
+"For values protected by sx locks, spin mutexes, or other locking strategies "
+"besides a single sleep mutex, SYSCTL_PROC nodes could be used to get the "
+"locking right."
+msgstr ""
+"Для упрощения распространённого случая, sysctl может включать указатель на "
+"мьютекс в макросах SYSCTL_FOO и в структуре. Это будет работать для "
+"большинства sysctl. Для значений, защищённых sx-блокировками, спин-"
+"мьютексами или другими стратегиями синхронизации, отличными от одиночного "
+"мьютекса сна, можно использовать узлы SYSCTL_PROC для обеспечения корректной "
+"блокировки."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:232
+#, no-wrap
+msgid "Taskqueue"
+msgstr "Очередь задач"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:235
+msgid ""
+"The taskqueue's interface has two basic locks associated with it in order to "
+"protect the related shared data. The `taskqueue_queues_mutex` is meant to "
+"serve as a lock to protect the `taskqueue_queues` TAILQ. The other mutex "
+"lock associated with this system is the one in the `struct taskqueue` data "
+"structure. The use of the synchronization primitive here is to protect the "
+"integrity of the data in the `struct taskqueue`. It should be noted that "
+"there are no separate macros to assist the user in locking down his/her own "
+"work since these locks are most likely not going to be used outside of "
+"[.filename]#kern/subr_taskqueue.c#."
+msgstr ""
+"Интерфейс `taskqueue` имеет две основные блокировки, связанные с ним, для "
+"защиты соответствующих общих данных. Мьютекс `taskqueue_queues_mutex` "
+"предназначен для защиты TAILQ `taskqueue_queues`. Другая блокировка "
+"мьютекса, связанная с этой системой, находится в структуре данных `struct "
+"taskqueue`. Использование примитива синхронизации здесь необходимо для "
+"защиты целостности данных в `struct taskqueue`. Следует отметить, что нет "
+"отдельных макросов, помогающих пользователю заблокировать свою собственную "
+"работу, поскольку эти блокировки, скорее всего, не будут использоваться за "
+"пределами [.filename]#kern/subr_taskqueue.c#."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:237
+#, no-wrap
+msgid "Implementation Notes"
+msgstr "Заметки о реализации"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:239
+#, no-wrap
+msgid "Sleep Queues"
+msgstr "Очереди сна"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:242
+msgid ""
+"A sleep queue is a structure that holds the list of threads asleep on a wait "
+"channel. Each thread that is not asleep on a wait channel carries a sleep "
+"queue structure around with it. When a thread blocks on a wait channel, it "
+"donates its sleep queue structure to that wait channel. Sleep queues "
+"associated with a wait channel are stored in a hash table."
+msgstr ""
+"Очередь сна — это структура, которая содержит список потоков, ожидающих на "
+"канале ожидания. Каждый поток, который не находится в состоянии ожидания на "
+"канале ожидания, хранит структуру очереди сна при себе. Когда поток "
+"блокируется на канале ожидания, он передаёт свою структуру очереди сна этому "
+"каналу. Очереди сна, связанные с каналом ожидания, хранятся в хеш-таблице."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:244
+msgid ""
+"The sleep queue hash table holds sleep queues for wait channels that have at "
+"least one blocked thread. Each entry in the hash table is called a "
+"sleepqueue chain. The chain contains a linked list of sleep queues and a "
+"spin mutex. The spin mutex protects the list of sleep queues as well as the "
+"contents of the sleep queue structures on the list. Only one sleep queue is "
+"associated with a given wait channel. If multiple threads block on a wait "
+"channel than the sleep queues associated with all but the first thread are "
+"stored on a list of free sleep queues in the master sleep queue. When a "
+"thread is removed from the sleep queue it is given one of the sleep queue "
+"structures from the master queue's free list if it is not the only thread "
+"asleep on the queue. The last thread is given the master sleep queue when it "
+"is resumed. Since threads may be removed from the sleep queue in a different "
+"order than they are added, a thread may depart from a sleep queue with a "
+"different sleep queue structure than the one it arrived with."
+msgstr ""
+"Хеш-таблица очередей сна содержит очереди сна для каналов ожидания, у "
+"которых есть хотя бы один заблокированный поток. Каждая запись в хеш-таблице "
+"называется цепочкой очереди сна. Цепочка содержит связанный список очередей "
+"сна и спин-мьютекс. Спин-мьютекс защищает список очередей сна, а также "
+"содержимое структур очередей сна в списке. С каждым каналом ожидания связана "
+"только одна очередь сна. Если несколько потоков блокируются на одном канале "
+"ожидания, то очереди сна, связанные со всеми потоками, кроме первого, "
+"хранятся в списке свободных очередей сна в главной очереди сна. Когда поток "
+"удаляется из очереди сна, он получает одну из структур очереди сна из "
+"свободного списка главной очереди, если он не является единственным потоком "
+"в очереди. Последний поток получает главную очередь сна при возобновлении. "
+"Поскольку потоки могут удаляться из очереди сна в порядке, отличном от "
+"порядка добавления, поток может покинуть очередь сна с другой структурой "
+"очереди сна, чем та, с которой он в неё попал."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:246
+msgid ""
+"The `sleepq_lock` function locks the spin mutex of the sleep queue chain "
+"that maps to a specific wait channel. The `sleepq_lookup` function looks in "
+"the hash table for the master sleep queue associated with a given wait "
+"channel. If no master sleep queue is found, it returns `NULL`. The "
+"`sleepq_release` function unlocks the spin mutex associated with a given "
+"wait channel."
+msgstr ""
+"Функция `sleepq_lock` блокирует спин-мьютес цепи очереди сна, "
+"соответствующей определённому каналу ожидания. Функция `sleepq_lookup` "
+"выполняет поиск в хеш-таблице главной очереди сна, связанной с заданным "
+"каналом ожидания. Если главная очередь сна не найдена, функция возвращает "
+"`NULL`. Функция `sleepq_release` разблокирует спин-мьютес, связанный с "
+"заданным каналом ожидания."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:248
+msgid ""
+"A thread is added to a sleep queue via the `sleepq_add`. This function "
+"accepts the wait channel, a pointer to the mutex that protects the wait "
+"channel, a wait message description string, and a mask of flags. The sleep "
+"queue chain should be locked via `sleepq_lock` before this function is "
+"called. If no mutex protects the wait channel (or it is protected by Giant), "
+"then the mutex pointer argument should be `NULL`. The flags argument "
+"contains a type field that indicates the kind of sleep queue that the thread "
+"is being added to and a flag to indicate if the sleep is interruptible "
+"(`SLEEPQ_INTERRUPTIBLE`). Currently there are only two types of sleep "
+"queues: traditional sleep queues managed via the `msleep` and `wakeup` "
+"functions (`SLEEPQ_MSLEEP`) and condition variable sleep queues "
+"(`SLEEPQ_CONDVAR`). The sleep queue type and lock pointer argument are used "
+"solely for internal assertion checking. Code that calls `sleepq_add` should "
+"explicitly unlock any interlock protecting the wait channel after the "
+"associated sleepqueue chain has been locked via `sleepq_lock` and before "
+"blocking on the sleep queue via one of the waiting functions."
+msgstr ""
+"Поток добавляется в очередь ожидания с помощью `sleepq_add`. Эта функция "
+"принимает канал ожидания, указатель на мьютекс, защищающий канал ожидания, "
+"строку описания сообщения ожидания и маску флагов. Цепь очереди ожидания "
+"должна быть заблокирована с помощью `sleepq_lock` перед вызовом этой "
+"функции. Если канал ожидания не защищен мьютексом (или защищен мьютексом "
+"Giant), то аргумент указателя на мьютекс должен быть `NULL`. Аргумент флагов "
+"содержит поле типа, указывающее на вид очереди ожидания, в которую "
+"добавляется поток, и флаг, указывающий, является ли ожидание прерываемым "
+"(`SLEEPQ_INTERRUPTIBLE`). В настоящее время существует только два типа "
+"очередей ожидания: традиционные очереди, управляемые через функции `msleep` "
+"и `wakeup` (`SLEEPQ_MSLEEP`), и очереди ожидания условных переменных "
+"(`SLEEPQ_CONDVAR`). Тип очереди ожидания и аргумент указателя на блокировку "
+"используются исключительно для внутренних проверок утверждений. Код, "
+"вызывающий `sleepq_add`, должен явно разблокировать любой блокировочный "
+"механизм, защищающий канал ожидания, после того как связанная цепь очереди "
+"ожидания будет заблокирована через `sleepq_lock` и перед блокировкой в "
+"очереди ожидания с помощью одной из функций ожидания."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:250
+msgid ""
+"A timeout for a sleep is set by invoking `sleepq_set_timeout`. The function "
+"accepts the wait channel and the timeout time as a relative tick count as "
+"its arguments. If a sleep should be interrupted by arriving signals, the "
+"`sleepq_catch_signals` function should be called as well. This function "
+"accepts the wait channel as its only parameter. If there is already a signal "
+"pending for this thread, then `sleepq_catch_signals` will return a signal "
+"number; otherwise, it will return 0."
+msgstr ""
+"Таймаут для сна устанавливается вызовом `sleepq_set_timeout`. Функция "
+"принимает канал ожидания и время таймаута в виде относительного количества "
+"тиков в качестве аргументов. Если сон должен быть прерван поступающими "
+"сигналами, следует также вызвать функцию `sleepq_catch_signals`. Эта функция "
+"принимает канал ожидания в качестве единственного параметра. Если для "
+"данного потока уже есть ожидающий сигнал, то `sleepq_catch_signals` вернёт "
+"номер сигнала; в противном случае она вернёт 0."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:252
+msgid ""
+"Once a thread has been added to a sleep queue, it blocks using one of the "
+"`sleepq_wait` functions. There are four wait functions depending on whether "
+"or not the caller wishes to use a timeout or have the sleep aborted by "
+"caught signals or an interrupt from the userland thread scheduler. The "
+"`sleepq_wait` function simply waits until the current thread is explicitly "
+"resumed by one of the wakeup functions. The `sleepq_timedwait` function "
+"waits until either the thread is explicitly resumed or the timeout set by an "
+"earlier call to `sleepq_set_timeout` expires. The `sleepq_wait_sig` function "
+"waits until either the thread is explicitly resumed or its sleep is aborted. "
+"The `sleepq_timedwait_sig` function waits until either the thread is "
+"explicitly resumed, the timeout set by an earlier call to "
+"`sleepq_set_timeout` expires, or the thread's sleep is aborted. All of the "
+"wait functions accept the wait channel as their first parameter. In "
+"addition, the `sleepq_timedwait_sig` function accepts a second boolean "
+"parameter to indicate if the earlier call to `sleepq_catch_signals` found a "
+"pending signal."
+msgstr ""
+"После добавления потока в очередь ожидания он блокируется с использованием "
+"одной из функций `sleepq_wait`. Существует четыре функции ожидания в "
+"зависимости от того, хочет ли вызывающий код использовать таймаут, "
+"прерывание сна перехваченными сигналами или прерывание от планировщика "
+"потоков пользовательского пространства. Функция `sleepq_wait` просто "
+"ожидает, пока текущий поток не будет явно возобновлён одной из функций "
+"пробуждения. Функция `sleepq_timedwait` ожидает, пока поток не будет явно "
+"возобновлён или пока не истечёт таймаут, установленный предыдущим вызовом "
+"`sleepq_set_timeout`. Функция `sleepq_wait_sig` ожидает, пока поток не будет "
+"явно возобновлён или его сон не будет прерван. Функция "
+"`sleepq_timedwait_sig` ожидает, пока поток не будет явно возобновлён, не "
+"истечёт таймаут, установленный предыдущим вызовом `sleepq_set_timeout`, или "
+"сон потока не будет прерван. Все функции ожидания принимают канал ожидания в "
+"качестве первого параметра. Кроме того, функция `sleepq_timedwait_sig` "
+"принимает второй логический параметр, указывающий, обнаружил ли предыдущий "
+"вызов `sleepq_catch_signals` ожидающий сигнал."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:254
+msgid ""
+"If the thread is explicitly resumed or is aborted by a signal, then a value "
+"of zero is returned by the wait function to indicate a successful sleep. If "
+"the thread is resumed by either a timeout or an interrupt from the userland "
+"thread scheduler then an appropriate errno value is returned instead. Note "
+"that since `sleepq_wait` can only return 0 it does not return anything and "
+"the caller should assume a successful sleep. Also, if a thread's sleep times "
+"out and is aborted simultaneously then `sleepq_timedwait_sig` will return an "
+"error indicating that a timeout occurred. If an error value of 0 is returned "
+"and either `sleepq_wait_sig` or `sleepq_timedwait_sig` was used to block, "
+"then the function `sleepq_calc_signal_retval` should be called to check for "
+"any pending signals and calculate an appropriate return value if any are "
+"found. The signal number returned by the earlier call to "
+"`sleepq_catch_signals` should be passed as the sole argument to "
+"`sleepq_calc_signal_retval`."
+msgstr ""
+"Если поток явно возобновлен или прерван сигналом, функция ожидания "
+"возвращает ноль, указывая на успешное завершение сна. Если поток возобновлен "
+"по таймауту или прерыванию от планировщика потоков в пользовательском "
+"пространстве, вместо этого возвращается соответствующее значение errno. "
+"Обратите внимание, что поскольку `sleepq_wait` может возвращать только 0, "
+"она ничего не возвращает, и вызывающая сторона должна считать сон успешным. "
+"Также, если сон потока прерывается одновременно по таймауту и другим "
+"причинам, `sleepq_timedwait_sig` вернет ошибку, указывающую на срабатывание "
+"таймаута. Если возвращено значение ошибки 0 и для блокировки использовались "
+"`sleepq_wait_sig` или `sleepq_timedwait_sig`, следует вызвать функцию "
+"`sleepq_calc_signal_retval` для проверки ожидающих сигналов и вычисления "
+"соответствующего возвращаемого значения, если таковые обнаружены. Номер "
+"сигнала, полученный при предыдущем вызове `sleepq_catch_signals`, должен "
+"быть передан в качестве единственного аргумента в "
+"`sleepq_calc_signal_retval`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:256
+msgid ""
+"Threads asleep on a wait channel are explicitly resumed by the "
+"`sleepq_broadcast` and `sleepq_signal` functions. Both functions accept the "
+"wait channel from which to resume threads, a priority to raise resumed "
+"threads to, and a flags argument to indicate which type of sleep queue is "
+"being resumed. The priority argument is treated as a minimum priority. If a "
+"thread being resumed already has a higher priority (numerically lower) than "
+"the priority argument then its priority is not adjusted. The flags argument "
+"is used for internal assertions to ensure that sleep queues are not being "
+"treated as the wrong type. For example, the condition variable functions "
+"should not resume threads on a traditional sleep queue. The "
+"`sleepq_broadcast` function resumes all threads that are blocked on the "
+"specified wait channel while `sleepq_signal` only resumes the highest "
+"priority thread blocked on the wait channel. The sleep queue chain should "
+"first be locked via the `sleepq_lock` function before calling these "
+"functions."
+msgstr ""
+"Потоки, находящиеся в состоянии ожидания на канале ожидания, явно "
+"возобновляются функциями `sleepq_broadcast` и `sleepq_signal`. Обе функции "
+"принимают канал ожидания, с которого нужно возобновить потоки, приоритет, на "
+"который нужно поднять возобновлённые потоки, и аргумент флагов, указывающий "
+"тип очереди ожидания, которую нужно возобновить. Аргумент приоритета "
+"трактуется как минимальный приоритет. Если у возобновляемого потока уже есть "
+"более высокий приоритет (численно меньший), чем указанный в аргументе, его "
+"приоритет не изменяется. Аргумент флагов используется для внутренних "
+"проверок, чтобы гарантировать, что очереди ожидания не обрабатываются как "
+"неправильный тип. Например, функции условных переменных не должны "
+"возобновлять потоки на традиционной очереди ожидания. Функция "
+"`sleepq_broadcast` возобновляет все потоки, заблокированные на указанном "
+"канале ожидания, тогда как `sleepq_signal` возобновляет только поток с "
+"наивысшим приоритетом, заблокированный на канале ожидания. Перед вызовом "
+"этих функций цепочка очереди ожидания должна быть заблокирована с помощью "
+"функции `sleepq_lock`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:258
+msgid ""
+"A sleeping thread may have its sleep interrupted by calling the "
+"`sleepq_abort` function. This function must be called with `sched_lock` held "
+"and the thread must be queued on a sleep queue. A thread may also be removed "
+"from a specific sleep queue via the `sleepq_remove` function. This function "
+"accepts both a thread and a wait channel as an argument and only awakens the "
+"thread if it is on the sleep queue for the specified wait channel. If the "
+"thread is not on a sleep queue or it is on a sleep queue for a different "
+"wait channel, then this function does nothing."
+msgstr ""
+"Спящий поток может быть прерван с помощью вызова функции `sleepq_abort`. Эта "
+"функция должна вызываться с удержанием `sched_lock`, а поток должен "
+"находиться в очереди сна. Поток также может быть удалён из определённой "
+"очереди сна с помощью функции `sleepq_remove`. Эта функция принимает как "
+"поток, так и канал ожидания в качестве аргументов и пробуждает поток только "
+"в том случае, если он находится в очереди сна для указанного канала "
+"ожидания. Если поток не находится в очереди сна или находится в очереди сна "
+"для другого канала ожидания, эта функция ничего не делает."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:259
+#, no-wrap
+msgid "Turnstiles"
+msgstr "Турникеты"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:262
+msgid "Compare/contrast with sleep queues."
+msgstr "Сравнение/сопоставление с очередями сна."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:264
+msgid "Lookup/wait/release. - Describe TDF_TSNOBLOCK race."
+msgstr "Поиск/ожидание/освобождение. - Описать состояние гонки TDF_TSNOBLOCK."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:266
+msgid "Priority propagation."
+msgstr "Приоритетное распространение."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:267
+#, no-wrap
+msgid "Details of the Mutex Implementation"
+msgstr "Подробности реализации мьютекса"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:270
+msgid ""
+"Should we require mutexes to be owned for mtx_destroy() since we can not "
+"safely assert that they are unowned by anyone else otherwise?"
+msgstr ""
+"Должны ли мы требовать владения мьютексами для `mtx_destroy()`, так как "
+"иначе мы не можем безопасно утверждать, что они не принадлежат кому-либо ещё?"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:271
+#, no-wrap
+msgid "Spin Mutexes"
+msgstr "Вращающиеся мьютексы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:274
+msgid "Use a critical section..."
+msgstr "Использование критической секции..."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:275
+#, no-wrap
+msgid "Sleep Mutexes"
+msgstr "Мьютексы сна (Sleep Mutexes)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:278
+msgid "Describe the races with contested mutexes"
+msgstr "Опишите гонки с оспариваемыми мьютексами"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:280
+msgid ""
+"Why it is safe to read mtx_lock of a contested mutex when holding the "
+"turnstile chain lock."
+msgstr ""
+"Почему безопасно читать mtx_lock оспариваемой мьютекса при удержании "
+"блокировки цепочки турникета."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:281
+#, no-wrap
+msgid "Witness"
+msgstr "Witness"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:284
+msgid "What does it do"
+msgstr "Что это делает"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:286
+msgid "How does it work"
+msgstr "Как это работает"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:288
+#, no-wrap
+msgid "Miscellaneous Topics"
+msgstr "Разные темы"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:290
+#, no-wrap
+msgid "Interrupt Source and ICU Abstractions"
+msgstr "Источники прерываний и абстракции ICU"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:293
+msgid "struct isrc"
+msgstr "struct isrc"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:295
+msgid "pic drivers"
+msgstr "pic драйверы"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:296
+#, no-wrap
+msgid "Other Random Questions/Topics"
+msgstr "Другие случайные вопросы/темы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:299
+msgid "Should we pass an interlock into `sema_wait`?"
+msgstr "Передавать ли блокировку в `sema_wait`?"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:301
+msgid "Should we have non-sleepable sx locks?"
+msgstr "Должны ли мы иметь sx блокировки без возможности сна?"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:303
+msgid "Add some info about proper use of reference counts."
+msgstr ""
+"Добавить некоторую информацию о правильном использовании счетчиков ссылок."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:308
+#, no-wrap
+msgid "Glossary"
+msgstr "Глоссарий"
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:311
+#, no-wrap
+msgid "atomic"
+msgstr "atomic (атомарный)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:313
+msgid ""
+"An operation is atomic if all of its effects are visible to other CPUs "
+"together when the proper access protocol is followed. In the degenerate case "
+"are atomic instructions provided directly by machine architectures. At a "
+"higher level, if several members of a structure are protected by a lock, "
+"then a set of operations are atomic if they are all performed while holding "
+"the lock without releasing the lock in between any of the operations."
+msgstr ""
+"Операция является атомарной, если все её эффекты видны другим процессорам "
+"одновременно при соблюдении соответствующего протокола доступа. В простейшем "
+"случае атомарные инструкции предоставляются непосредственно архитектурой "
+"процессора. На более высоком уровне, если несколько элементов структуры "
+"защищены блокировкой, то набор операций является атомарным, если все они "
+"выполняются при удержании блокировки без её освобождения между любыми из "
+"операций."
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:315
+msgid "See Also operation."
+msgstr "См. также operation (операция)."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:316
+#, no-wrap
+msgid "block"
+msgstr "block (блокировать)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:318
+msgid ""
+"A thread is blocked when it is waiting on a lock, resource, or condition. "
+"Unfortunately this term is a bit overloaded as a result."
+msgstr ""
+"Поток блокируется, когда он ожидает блокировку, ресурс или условие. К "
+"сожалению, этот термин в результате немного перегружен."
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:320
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:357
+msgid "See Also sleep."
+msgstr "См. также sleep (спать)."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:321
+#, no-wrap
+msgid "critical section"
+msgstr "critical section (критическая секция)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:323
+msgid ""
+"A section of code that is not allowed to be preempted. A critical section is "
+"entered and exited using the man:critical_enter[9] API."
+msgstr ""
+"Фрагмент кода, который не может быть вытеснен. Критическая секция начинается "
+"и завершается с использованием API man:critical_enter[9]."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:324
+#, no-wrap
+msgid "MD"
+msgstr "MD"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:326
+msgid "Machine dependent."
+msgstr "Машинозависимый (machine dependent)."
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:328
+msgid "See Also MI."
+msgstr "Смотри также MI."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:329
+#, no-wrap
+msgid "memory operation"
+msgstr "memory operation (операция с памятью)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:331
+msgid "A memory operation reads and/or writes to a memory location."
+msgstr "Операция с памятью выполняет чтение и/или запись в ячейку памяти."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:332
+#, no-wrap
+msgid "MI"
+msgstr "MI"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:334
+msgid "Machine independent."
+msgstr "Машинно-независимый (machine independent)."
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:336
+msgid "See Also MD."
+msgstr "См. также MD."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:337
+#, no-wrap
+msgid "operation"
+msgstr "operation (операция)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:339
+msgid "See memory operation."
+msgstr "См. memory operation (операция с памятью)."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:340
+#, no-wrap
+msgid "primary interrupt context"
+msgstr "primary interrupt context (основной контекст прерывания)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:342
+msgid ""
+"Primary interrupt context refers to the code that runs when an interrupt "
+"occurs. This code can either run an interrupt handler directly or schedule "
+"an asynchronous interrupt thread to execute the interrupt handlers for a "
+"given interrupt source."
+msgstr ""
+"Основной контекст прерывания относится к коду, который выполняется при "
+"возникновении прерывания. Этот код может либо напрямую запускать обработчик "
+"прерывания, либо планировать выполнение асинхронного потока прерывания для "
+"обработчиков прерываний данного источника."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:343
+#, no-wrap
+msgid "realtime kernel thread"
+msgstr "realtime kernel thread (поток ядра реального времени)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:345
+msgid ""
+"A high priority kernel thread. Currently, the only realtime priority kernel "
+"threads are interrupt threads."
+msgstr ""
+"Высокоприоритетный поток ядра. В настоящее время единственными потоками ядра "
+"с реальным приоритетом являются потоки обработки прерываний."
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:347
+msgid "See Also thread."
+msgstr "См. также thread (поток)."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:348
+#, no-wrap
+msgid "sleep"
+msgstr "sleep (спать)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:350
+msgid ""
+"A thread is asleep when it is blocked on a condition variable or a sleep "
+"queue via msleep or tsleep."
+msgstr ""
+"Поток находится в состоянии сна, когда он заблокирован на условной "
+"переменной или в очереди сна через `msleep` или `tsleep`."
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:352
+msgid "See Also block."
+msgstr "См. также block (блокировать)."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:353
+#, no-wrap
+msgid "sleepable lock"
+msgstr "sleepable lock (блокировка с возможностью сна)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:355
+msgid ""
+"A sleepable lock is a lock that can be held by a thread which is asleep. "
+"Lockmgr locks and sx locks are currently the only sleepable locks in "
+"FreeBSD. Eventually, some sx locks such as the allproc and proctree locks "
+"may become non-sleepable locks."
+msgstr ""
+"блокировка с возможностью сна — это блокировка, которая может удерживаться "
+"потоком, находящимся в состоянии сна. В настоящее время в FreeBSD "
+"единственными блокировками с возможностью сна являются lockmgr и sx. В "
+"будущем некоторые sx-блокировки, такие как allproc и proctree, могут стать "
+"блокировками с возможностью сна."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:358
+#, no-wrap
+msgid "thread"
+msgstr "thread (поток)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:360
+msgid ""
+"A kernel thread represented by a struct thread. Threads own locks and hold a "
+"single execution context."
+msgstr ""
+"Поток ядра, представленный структурой `struct thread`. Потоки владеют "
+"блокировками и содержат единственный на поток контекст выполнения."
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:361
+#, no-wrap
+msgid "wait channel"
+msgstr "wait channel (канал ожидания)"
+
+#. type: .glosslist
+#: documentation/content/en/books/arch-handbook/smp/_index.adoc:363
+msgid "A kernel virtual address that threads may sleep on."
+msgstr ""
+"Виртуальный адрес ядра, на котором потоки могут переходить в режим ожидания."
diff --git a/documentation/content/ru/books/arch-handbook/sound/_index.adoc b/documentation/content/ru/books/arch-handbook/sound/_index.adoc
new file mode 100644
index 0000000000..7079a9cd52
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/sound/_index.adoc
@@ -0,0 +1,351 @@
+---
+description: 'Звуковая подсистема FreeBSD'
+next: books/arch-handbook/pccard
+params:
+ path: /books/arch-handbook/sound/
+prev: books/arch-handbook/newbus
+showBookMenu: true
+tags: ["Sound", "OSS", "pcm", "mixer"]
+title: 'Глава 15. Звуковая подсистема'
+weight: 17
+---
+
+[[oss]]
+= Звуковая подсистема
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 15
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[oss-intro]]
+== Введение
+
+Подсистема звука FreeBSD чётко разделяет общие вопросы обработки звука и детали, специфичные для устройств. Это упрощает добавление поддержки нового оборудования.
+
+man:pcm[4] — это центральный компонент подсистемы звука. В основном он реализует следующие элементы:
+
+* Интерфейс системных вызовов (read, write, ioctls) для работы с оцифрованным звуком и функциями микшера. Набор команд ioctl совместим с устаревшим интерфейсом _OSS_ или _Voxware_, что позволяет портировать распространённые мультимедийные приложения без изменений.
+* Общий код для обработки звуковых данных (преобразование форматов, виртуальные каналы).
+* Единый программный интерфейс к аппаратно-зависимым модулям аудиоинтерфейсов.
+* Дополнительная поддержка некоторых распространённых аппаратных интерфейсов (ac97) или общий код для специфичного оборудования (например: подпрограммы ISA DMA).
+
+Поддержка конкретных звуковых карт реализована аппаратно-специфичными драйверами, которые предоставляют интерфейсы каналов и микшера для подключения к общему коду [.filename]#pcm#.
+
+В этой главе термин [.filename]#pcm# будет относиться к центральной, общей части звукового драйвера, в отличие от аппаратно-зависимых модулей.
+
+Разработчик драйверов, только начинающий свою разработку, конечно, захочет начать с существующего модуля и использовать его код в качестве основного источника информации. Однако, хотя код подсистемы звука чист и аккуратен, он в основном лишён комментариев. Этот документ пытается дать обзор интерфейса фреймворка и ответить на некоторые вопросы, которые могут возникнуть при адаптации существующего кода.
+
+В качестве альтернативы или в дополнение к началу разработки с примера драйвера из кода системы, вы можете найти шаблон драйвера с комментариями по адресу https://people.FreeBSD.org/~cg/template.c[ https://people.FreeBSD.org/~cg/template.c]
+
+[[oss-files]]
+== Файлы
+
+Весь соответствующий код находится в [.filename]#/usr/src/sys/dev/sound/#, за исключением определений публичного интерфейса ioctl, которые можно найти в [.filename]#/usr/src/sys/sys/soundcard.h#
+
+В каталоге [.filename]#/usr/src/sys/dev/sound/#, папка [.filename]#pcm/# содержит основной код, тогда как каталоги [.filename]#pci/#, [.filename]#isa/# и [.filename]#usb/# содержат драйверы для плат PCI и ISA, а также для USB-аудиоустройств.
+
+[[pcm-probe-and-attach]]
+== Обнаружение, присоединение и т.д.
+
+Драйверы звуковых устройств выполняют обнаружение и подключение почти так же, как и любой модуль драйвера оборудования. Возможно, вам будет полезно ознакомиться с разделами руководства, посвящёнными crossref:isa-driver[isa-driver,ISA] или crossref:pci[pci,PCI], для получения дополнительной информации.
+
+Однако драйверы звука отличаются в некоторых аспектах:
+
+* Они объявляют себя как устройства класса [.filename]#pcm#, с приватной структурой устройства `struct snddev_info`:
++
+[.programlisting]
+....
+ static driver_t xxx_driver = {
+ "pcm",
+ xxx_methods,
+ sizeof(struct snddev_info)
+ };
+
+ DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0);
+ MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);
+....
++
+Большинству звуковых драйверов необходимо хранить дополнительную приватную информацию о своём устройстве. Приватная структура данных обычно выделяется в процедуре attach. Её адрес передаётся в [.filename]#pcm# через вызовы `pcm_register()` и `mixer_init()`. [.filename]#pcm# позже передаёт обратно этот адрес в качестве параметра при вызовах интерфейсов звукового драйвера.
+* Подпрограмма подключения звукового драйвера должна объявить свой интерфейс MIXER или AC97 для [.filename]#pcm#, вызвав `mixer_init()`. Для интерфейса MIXER это, в свою очередь, приводит к вызову crossref:sound[xxxmixer-init,`xxxmixer_init()`].
+* Функция подключения драйвера звука объявляет свою общую конфигурацию CHANNEL для [.filename]#pcm#, вызывая `pcm_register(dev, sc, nplay, nrec)`, где `sc` — это адрес структуры данных устройства, используемый при последующих вызовах из [.filename]#pcm#, а `nplay` и `nrec` — количество каналов воспроизведения и записи.
+* Подпрограмма подключения звукового драйвера объявляет каждый из своих каналов вызовами `pcm_addchan()`. Это настраивает связующий слой канала в [.filename]#pcm# и, в свою очередь, вызывает вызов crossref:sound[xxxchannel-init,`xxxchannel_init()`].
+* Драйвер звука должен вызвать `pcm_unregister()` в процедуре отключения перед освобождением своих ресурсов.
+
+Существует два возможных способа работы с устройствами, не поддерживающими PnP:
+
+* Используйте метод `device_identify()` (пример: [.filename]#sound/isa/es1888.c#). Метод `device_identify()` проверяет наличие оборудования по известным адресам и, если находит поддерживаемое устройство, создает новое pcm-устройство, которое затем передается для probe/attach.
+* Используйте пользовательскую конфигурацию ядра с соответствующими подсказками для устройств pcm (пример: [.filename]#sound/isa/mss.c#).
+
+[.filename]#pcm# драйверы должны реализовывать подпрограммы `device_suspend`, `device_resume` и `device_shutdown`, чтобы управление питанием и выгрузка модулей работали корректно.
+
+[[oss-interfaces]]
+== Интерфейсы
+
+Интерфейс между ядром [.filename]#pcm# и звуковыми драйверами определяется в терминах crossref:kobj[kernel-objects,объектов ядра Kobj].
+
+Существует два основных интерфейса, которые обычно предоставляет драйвер звука: _CHANNEL_ и либо _MIXER_, либо _AC97_.
+
+Интерфейс _AC97_ — это очень небольшой интерфейс доступа к оборудованию (чтение/запись регистров), реализованный драйверами для устройств с кодеком AC97. В этом случае фактический интерфейс MIXER предоставляется общим кодом AC97 в [.filename]#pcm#.
+
+=== Интерфейс CHANNEL
+
+==== Общие примечания для параметров функций
+
+Драйверы звука обычно имеют приватную структуру данных для описания своего устройства и по одной структуре для каждого канала воспроизведения и записи, который они поддерживают.
+
+Для всех функций интерфейса CHANNEL первый параметр — это непрозрачный указатель.
+
+Второй параметр представляет собой указатель на приватную структуру данных канала, за исключением `channel_init()`, где передается указатель на приватную структуру устройства (и возвращается указатель на канал для дальнейшего использования [.filename]#pcm#).
+
+==== Обзор операций передачи данных
+
+Для надежной передачи звуковых данных ядро [.filename]#pcm# и драйверы звука взаимодействуют через общую область памяти, описываемую структурой `struct snd_dbuf`.
+
+`struct snd_dbuf` является приватной для [.filename]#pcm#, и драйверы звука получают нужные значения через вызовы функций доступа (`sndbuf_getxxx()`).
+
+Область разделяемой памяти имеет размер `sndbuf_getsize()` и разделена на блоки фиксированного размера по `sndbuf_getblksz()` байт.
+
+При воспроизведении общий механизм передачи выглядит следующим образом (для записи идея обратная):
+
+* [.filename]#pcm# сначала заполняет буфер, затем вызывает функцию crossref:sound[channel-trigger,`xxxchannel_trigger()`] драйвера звука с параметром PCMTRIG_START.
+* Звуковой драйвер затем организует повторяющуюся передачу всей области памяти (`sndbuf_getbuf()`, `sndbuf_getsize()`) на устройство блоками по `sndbuf_getblksz()` байт. Для каждого переданного блока он вызывает функцию `chn_intr()`[.filename]#pcm# (обычно это происходит во время прерывания).
+* `chn_intr()` организует копирование новых данных в область, которая была передана устройству (теперь свободна), и вносит соответствующие обновления в структуру `snd_dbuf`.
+
+[[xxxchannel-init]]
+==== channel_init
+
+`xxxchannel_init()` вызывается для инициализации каждого из каналов воспроизведения или записи. Вызовы инициируются из процедуры присоединения драйвера звука. (См. раздел crossref:sound[pcm-probe-and-attach,зондирование и присоединение]).
+
+[.programlisting]
+....
+ static void *
+ xxxchannel_init(kobj_t obj, void *data,
+ struct snd_dbuf *b, struct pcm_channel *c, int dir) <.>
+ {
+ struct xxx_info *sc = data;
+ struct xxx_chinfo *ch;
+ ...
+ return ch; <.>
+ }
+....
+
+<.> `b` — это адрес для канала `struct snd_dbuf`. Он должен быть инициализирован в функции вызовом `sndbuf_alloc()`. Размер буфера, который следует использовать, обычно представляет собой небольшое кратное от 'типичного' размера единицы передачи данных для вашего устройства. `c` — это указатель на структуру управления каналом [.filename]#pcm#. Это непрозрачный объект. Функция должна сохранить его в локальной структуре канала для использования в последующих вызовах [.filename]#pcm# (например: `chn_intr(c)`). `dir` указывает направление канала (`PCMDIR_PLAY` или `PCMDIR_REC`).
+
+<.> Функция должна возвращать указатель на приватную область, используемую для управления этим каналом. Этот указатель будет передаваться в качестве параметра при других вызовах интерфейса канала.
+
+==== channel_setformat
+
+`xxxchannel_setformat()` должен настроить оборудование для указанного канала под указанный звуковой формат.
+
+[.programlisting]
+....
+ static int
+ xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format) <.>
+ {
+ struct xxx_chinfo *ch = data;
+ ...
+ return 0;
+ }
+....
+
+<.> `format` указывается как значение `AFMT_XXX` ([.filename]#soundcard.h#).
+
+==== channel_setspeed
+
+`xxxchannel_setspeed()` настраивает оборудование канала для указанной скорости дискретизации и возвращает возможно скорректированную скорость.
+
+[.programlisting]
+....
+ static int
+ xxxchannel_setspeed(kobj_t obj, void *data, u_int32_t speed)
+ {
+ struct xxx_chinfo *ch = data;
+ ...
+ return speed;
+ }
+....
+
+==== channel_setblocksize
+
+`xxxchannel_setblocksize()` устанавливает размер блока, который является размером единичных транзакций между [.filename]#pcm# и звуковым драйвером, а также между звуковым драйвером и устройством. Обычно это количество байт, передаваемых до возникновения прерывания. Во время передачи звуковой драйвер должен вызывать `chn_intr()` из [.filename]#pcm# каждый раз, когда передается данный размер.
+
+Большинство драйверов звука здесь учитывают только размер блока, который будет использоваться при начале фактической передачи.
+
+[.programlisting]
+....
+ static int
+ xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
+ {
+ struct xxx_chinfo *ch = data;
+ ...
+ return blocksize; <.>
+ }
+....
+
+<.> Функция возвращает, возможно, скорректированный размер блока. Если размер блока действительно изменён, следует вызвать `sndbuf_resize()` для корректировки буфера.
+
+[[channel-trigger]]
+==== channel_trigger
+
+`xxxchannel_trigger()` вызывается [.filename]#pcm# для управления операциями передачи данных в драйвере.
+
+[.programlisting]
+....
+ static int
+ xxxchannel_trigger(kobj_t obj, void *data, int go) <.>
+ {
+ struct xxx_chinfo *ch = data;
+ ...
+ return 0;
+ }
+....
+
+<.> `go` определяет действие для текущего вызова. Возможные значения:
+
+[NOTE]
+====
+Если драйвер использует ISA DMA, перед выполнением действий с устройством следует вызвать `sndbuf_isadma()`, которая позаботится о том, что делает DMA-чип.
+====
+
+==== channel_getptr
+
+`xxxchannel_getptr()` возвращает текущее смещение в буфере передачи. Обычно этот вызов выполняется функцией `chn_intr()`, и именно так [.filename]#pcm# узнаёт, куда можно передавать новые данные.
+
+==== channel_free
+
+`xxxchannel_free()` вызывается для освобождения ресурсов канала, например, при выгрузке драйвера, и должна быть реализована, если структуры данных канала динамически выделены или если `sndbuf_alloc()` не использовалась для выделения буфера.
+
+==== channel_getcaps
+
+[.programlisting]
+....
+ struct pcmchan_caps *
+ xxxchannel_getcaps(kobj_t obj, void *data)
+ {
+ return &xxx_caps; <.>
+ }
+....
+
+<.> Подпрограмма возвращает указатель на (обычно статически определённую) структуру `pcmchan_caps` (определена в [.filename]#sound/pcm/channel.h#). Эта структура содержит минимальную и максимальную частоты дискретизации, а также поддерживаемые звуковые форматы. Пример можно найти в любом драйвере звукового устройства.
+
+==== Дополнительные функции
+
+`channel_reset()`, `channel_resetdone()` и `channel_notify()` предназначены для специальных целей и не должны реализовываться в драйвере без обсуждения на {freebsd-multimedia}.
+
+`channel_setdir()` устарела.
+
+=== Интерфейс MIXER
+
+[[xxxmixer-init]]
+==== mixer_init
+
+`xxxmixer_init()` инициализирует оборудование и сообщает [.filename]#pcm#, какие устройства микшера доступны для воспроизведения и записи
+
+[.programlisting]
+....
+ static int
+ xxxmixer_init(struct snd_mixer *m)
+ {
+ struct xxx_info *sc = mix_getdevinfo(m);
+ u_int32_t v;
+
+ [Initialize hardware]
+
+ [Set appropriate bits in v for play mixers] <.>
+ mix_setdevs(m, v);
+ [Set appropriate bits in v for record mixers]
+ mix_setrecdevs(m, v)
+
+ return 0;
+ }
+....
+
+<.> Установите биты в целочисленном значении и вызовите `mix_setdevs()` и `mix_setrecdevs()`, чтобы сообщить [.filename]#pcm#, какие устройства существуют.
+
+Определения битов микшера можно найти в [.filename]#soundcard.h# (значения `SOUND_MASK_XXX` и сдвиги битов `SOUND_MIXER_XXX`).
+
+==== mixer_set
+
+`xxxmixer_set()` устанавливает уровень громкости для одного устройства микшера.
+
+[.programlisting]
+....
+ static int
+ xxxmixer_set(struct snd_mixer *m, unsigned dev,
+ unsigned left, unsigned right) <.>
+ {
+ struct sc_info *sc = mix_getdevinfo(m);
+ [set volume level]
+ return left | (right << 8); <.>
+ }
+....
+
+<.> Устройство указывается как значение `SOUND_MIXER_XXX`. Значения громкости задаются в диапазоне [0-100]. Значение ноль должно отключать звук устройства.
+<.> Поскольку уровни оборудования, вероятно, не совпадут с входной шкалой и будет происходить округление, процедура возвращает фактические значения уровней (в диапазоне 0-100), как показано.
+
+==== mixer_setrecsrc
+
+`xxxmixer_setrecsrc()` устанавливает устройство источника записи.
+
+[.programlisting]
+....
+ static int
+ xxxmixer_setrecsrc(struct snd_mixer *m, u_int32_t src) <.>
+ {
+ struct xxx_info *sc = mix_getdevinfo(m);
+
+ [look for non zero bit(s) in src, set up hardware]
+
+ [update src to reflect actual action]
+ return src; <.>
+ }
+....
+
+<.> Желаемые устройства записи указываются в виде битового поля
+<.> Возвращаются фактические устройства, настроенные для записи. Некоторые драйверы могут настраивать только одно устройство для записи. Функция должна возвращать -1 в случае ошибки.
+
+==== mixer_uninit, mixer_reinit
+
+`xxxmixer_uninit()` должен гарантировать, что весь звук отключен, и, если возможно, аппаратный микшер должен быть переведен в режим пониженного энергопотребления.
+
+`xxxmixer_reinit()` должна гарантировать, что аппаратура микшера включена и все настройки, не управляемые `mixer_set()` или `mixer_setrecsrc()`, восстановлены.
+
+=== Интерфейс AC97
+
+Интерфейс _AC97_ реализован драйверами с кодеком AC97. У него есть только три метода:
+
+* `xxxac97_init()` возвращает количество найденных кодеков ac97.
+* `ac97_read()` и `ac97_write()` читают или записывают указанный регистр.
+
+Интерфейс _AC97_ используется кодом AC97 в [.filename]#pcm# для выполнения операций более высокого уровня. В качестве примера можно посмотреть [.filename]#sound/pci/maestro3.c# или другие файлы в [.filename]#sound/pci/#.
diff --git a/documentation/content/ru/books/arch-handbook/sound/_index.po b/documentation/content/ru/books/arch-handbook/sound/_index.po
new file mode 100644
index 0000000000..7a627217f4
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/sound/_index.po
@@ -0,0 +1,1125 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-08-26 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbooksound_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:1
+#, no-wrap
+msgid "FreeBSD Sound Subsystem"
+msgstr "Звуковая подсистема FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:1
+#, no-wrap
+msgid "Chapter 15. Sound Subsystem"
+msgstr "Глава 15. Звуковая подсистема"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:14
+#, no-wrap
+msgid "Sound Subsystem"
+msgstr "Звуковая подсистема"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:52
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:55
+msgid ""
+"The FreeBSD sound subsystem cleanly separates generic sound handling issues "
+"from device-specific ones. This makes it easier to add support for new "
+"hardware."
+msgstr ""
+"Подсистема звука FreeBSD чётко разделяет общие вопросы обработки звука и "
+"детали, специфичные для устройств. Это упрощает добавление поддержки нового "
+"оборудования."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:57
+msgid ""
+"The man:pcm[4] framework is the central piece of the sound subsystem. It "
+"mainly implements the following elements:"
+msgstr ""
+"man:pcm[4] — это центральный компонент подсистемы звука. В основном он "
+"реализует следующие элементы:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:59
+msgid ""
+"A system call interface (read, write, ioctls) to digitized sound and mixer "
+"functions. The ioctl command set is compatible with the legacy _OSS_ or "
+"_Voxware_ interface, allowing common multimedia applications to be ported "
+"without modification."
+msgstr ""
+"Интерфейс системных вызовов (read, write, ioctls) для работы с оцифрованным "
+"звуком и функциями микшера. Набор команд ioctl совместим с устаревшим "
+"интерфейсом _OSS_ или _Voxware_, что позволяет портировать распространённые "
+"мультимедийные приложения без изменений."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:60
+msgid ""
+"Common code for processing sound data (format conversions, virtual channels)."
+msgstr ""
+"Общий код для обработки звуковых данных (преобразование форматов, "
+"виртуальные каналы)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:61
+msgid ""
+"A uniform software interface to hardware-specific audio interface modules."
+msgstr ""
+"Единый программный интерфейс к аппаратно-зависимым модулям аудиоинтерфейсов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:62
+msgid ""
+"Additional support for some common hardware interfaces (ac97), or shared "
+"hardware-specific code (ex: ISA DMA routines)."
+msgstr ""
+"Дополнительная поддержка некоторых распространённых аппаратных интерфейсов "
+"(ac97) или общий код для специфичного оборудования (например: подпрограммы "
+"ISA DMA)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:64
+msgid ""
+"The support for specific sound cards is implemented by hardware-specific "
+"drivers, which provide channel and mixer interfaces to plug into the generic "
+"[.filename]#pcm# code."
+msgstr ""
+"Поддержка конкретных звуковых карт реализована аппаратно-специфичными "
+"драйверами, которые предоставляют интерфейсы каналов и микшера для "
+"подключения к общему коду [.filename]#pcm#."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:66
+msgid ""
+"In this chapter, the term [.filename]#pcm# will refer to the central, common "
+"part of the sound driver, as opposed to the hardware-specific modules."
+msgstr ""
+"В этой главе термин [.filename]#pcm# будет относиться к центральной, общей "
+"части звукового драйвера, в отличие от аппаратно-зависимых модулей."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:68
+msgid ""
+"The prospective driver writer will of course want to start from an existing "
+"module and use the code as the ultimate reference. But, while the sound code "
+"is nice and clean, it is also mostly devoid of comments. This document tries "
+"to give an overview of the framework interface and answer some questions "
+"that may arise while adapting the existing code."
+msgstr ""
+"Разработчик драйверов, только начинающий свою разработку, конечно, захочет "
+"начать с существующего модуля и использовать его код в качестве основного "
+"источника информации. Однако, хотя код подсистемы звука чист и аккуратен, он "
+"в основном лишён комментариев. Этот документ пытается дать обзор интерфейса "
+"фреймворка и ответить на некоторые вопросы, которые могут возникнуть при "
+"адаптации существующего кода."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:70
+msgid ""
+"As an alternative, or in addition to starting from a working example, you "
+"can find a commented driver template at https://people.FreeBSD.org/~cg/"
+"template.c[ https://people.FreeBSD.org/~cg/template.c]"
+msgstr ""
+"В качестве альтернативы или в дополнение к началу разработки с примера "
+"драйвера из кода системы, вы можете найти шаблон драйвера с комментариями по "
+"адресу https://people.FreeBSD.org/~cg/template.c[ https://people.FreeBSD.org/"
+"~cg/template.c]"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:72
+#, no-wrap
+msgid "Files"
+msgstr "Файлы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:75
+msgid ""
+"All the relevant code lives in [.filename]#/usr/src/sys/dev/sound/#, except "
+"for the public ioctl interface definitions, found in [.filename]#/usr/src/"
+"sys/sys/soundcard.h#"
+msgstr ""
+"Весь соответствующий код находится в [.filename]#/usr/src/sys/dev/sound/#, "
+"за исключением определений публичного интерфейса ioctl, которые можно найти "
+"в [.filename]#/usr/src/sys/sys/soundcard.h#"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:77
+msgid ""
+"Under [.filename]#/usr/src/sys/dev/sound/#, the [.filename]#pcm/# directory "
+"holds the central code, while the [.filename]#pci/#, [.filename]#isa/# and "
+"[.filename]#usb/# directories have the drivers for PCI and ISA boards, and "
+"for USB audio devices."
+msgstr ""
+"В каталоге [.filename]#/usr/src/sys/dev/sound/#, папка [.filename]#pcm/# "
+"содержит основной код, тогда как каталоги [.filename]#pci/#, [.filename]#isa/"
+"# и [.filename]#usb/# содержат драйверы для плат PCI и ISA, а также для USB-"
+"аудиоустройств."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:79
+#, no-wrap
+msgid "Probing, Attaching, etc."
+msgstr "Обнаружение, присоединение и т.д."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:82
+msgid ""
+"Sound drivers probe and attach in almost the same way as any hardware driver "
+"module. You might want to look at the crossref:isa-driver[isa-driver,ISA] or "
+"crossref:pci[pci,PCI] specific sections of the handbook for more information."
+msgstr ""
+"Драйверы звуковых устройств выполняют обнаружение и подключение почти так "
+"же, как и любой модуль драйвера оборудования. Возможно, вам будет полезно "
+"ознакомиться с разделами руководства, посвящёнными crossref:isa-driver[isa-"
+"driver,ISA] или crossref:pci[pci,PCI], для получения дополнительной "
+"информации."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:84
+msgid "However, sound drivers differ in some ways:"
+msgstr "Однако драйверы звука отличаются в некоторых аспектах:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:86
+msgid ""
+"They declare themselves as [.filename]#pcm# class devices, with a `struct "
+"snddev_info` device private structure:"
+msgstr ""
+"Они объявляют себя как устройства класса [.filename]#pcm#, с приватной "
+"структурой устройства `struct snddev_info`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:94
+#, no-wrap
+msgid ""
+" static driver_t xxx_driver = {\n"
+" \"pcm\",\n"
+" xxx_methods,\n"
+" sizeof(struct snddev_info)\n"
+" };\n"
+msgstr ""
+" static driver_t xxx_driver = {\n"
+" \"pcm\",\n"
+" xxx_methods,\n"
+" sizeof(struct snddev_info)\n"
+" };\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:97
+#, no-wrap
+msgid ""
+" DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0);\n"
+" MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);\n"
+msgstr ""
+" DRIVER_MODULE(snd_xxxpci, pci, xxx_driver, pcm_devclass, 0, 0);\n"
+" MODULE_DEPEND(snd_xxxpci, snd_pcm, PCM_MINVER, PCM_PREFVER,PCM_MAXVER);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:100
+msgid ""
+"Most sound drivers need to store additional private information about their "
+"device. A private data structure is usually allocated in the attach routine. "
+"Its address is passed to [.filename]#pcm# by the calls to `pcm_register()` "
+"and `mixer_init()`. [.filename]#pcm# later passes back this address as a "
+"parameter in calls to the sound driver interfaces."
+msgstr ""
+"Большинству звуковых драйверов необходимо хранить дополнительную приватную "
+"информацию о своём устройстве. Приватная структура данных обычно выделяется "
+"в процедуре attach. Её адрес передаётся в [.filename]#pcm# через вызовы "
+"`pcm_register()` и `mixer_init()`. [.filename]#pcm# позже передаёт обратно "
+"этот адрес в качестве параметра при вызовах интерфейсов звукового драйвера."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:103
+msgid ""
+"The sound driver attach routine should declare its MIXER or AC97 interface "
+"to [.filename]#pcm# by calling `mixer_init()`. For a MIXER interface, this "
+"causes in turn a call to crossref:sound[xxxmixer-init,`xxxmixer_init()`]."
+msgstr ""
+"Подпрограмма подключения звукового драйвера должна объявить свой интерфейс "
+"MIXER или AC97 для [.filename]#pcm#, вызвав `mixer_init()`. Для интерфейса "
+"MIXER это, в свою очередь, приводит к вызову crossref:sound[xxxmixer-"
+"init,`xxxmixer_init()`]."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:104
+msgid ""
+"The sound driver attach routine declares its general CHANNEL configuration "
+"to [.filename]#pcm# by calling `pcm_register(dev, sc, nplay, nrec)`, where "
+"`sc` is the address for the device data structure, used in further calls "
+"from [.filename]#pcm#, and `nplay` and `nrec` are the number of play and "
+"record channels."
+msgstr ""
+"Функция подключения драйвера звука объявляет свою общую конфигурацию CHANNEL "
+"для [.filename]#pcm#, вызывая `pcm_register(dev, sc, nplay, nrec)`, где `sc` "
+"— это адрес структуры данных устройства, используемый при последующих "
+"вызовах из [.filename]#pcm#, а `nplay` и `nrec` — количество каналов "
+"воспроизведения и записи."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:107
+msgid ""
+"The sound driver attach routine declares each of its channel objects by "
+"calls to `pcm_addchan()`. This sets up the channel glue in [.filename]#pcm# "
+"and causes in turn a call to crossref:sound[xxxchannel-"
+"init,`xxxchannel_init()`]."
+msgstr ""
+"Подпрограмма подключения звукового драйвера объявляет каждый из своих "
+"каналов вызовами `pcm_addchan()`. Это настраивает связующий слой канала в "
+"[.filename]#pcm# и, в свою очередь, вызывает вызов crossref:sound[xxxchannel-"
+"init,`xxxchannel_init()`]."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:108
+msgid ""
+"The sound driver detach routine should call `pcm_unregister()` before "
+"releasing its resources."
+msgstr ""
+"Драйвер звука должен вызвать `pcm_unregister()` в процедуре отключения перед "
+"освобождением своих ресурсов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:110
+msgid "There are two possible methods to handle non-PnP devices:"
+msgstr ""
+"Существует два возможных способа работы с устройствами, не поддерживающими "
+"PnP:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:112
+msgid ""
+"Use a `device_identify()` method (example: [.filename]#sound/isa/es1888.c#). "
+"The `device_identify()` method probes for the hardware at known addresses "
+"and, if it finds a supported device, creates a new pcm device which is then "
+"passed to probe/attach."
+msgstr ""
+"Используйте метод `device_identify()` (пример: [.filename]#sound/isa/"
+"es1888.c#). Метод `device_identify()` проверяет наличие оборудования по "
+"известным адресам и, если находит поддерживаемое устройство, создает новое "
+"pcm-устройство, которое затем передается для probe/attach."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:113
+msgid ""
+"Use a custom kernel configuration with appropriate hints for pcm devices "
+"(example: [.filename]#sound/isa/mss.c#)."
+msgstr ""
+"Используйте пользовательскую конфигурацию ядра с соответствующими "
+"подсказками для устройств pcm (пример: [.filename]#sound/isa/mss.c#)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:115
+msgid ""
+"[.filename]#pcm# drivers should implement `device_suspend`, `device_resume` "
+"and `device_shutdown` routines, so that power management and module "
+"unloading function correctly."
+msgstr ""
+"[.filename]#pcm# драйверы должны реализовывать подпрограммы "
+"`device_suspend`, `device_resume` и `device_shutdown`, чтобы управление "
+"питанием и выгрузка модулей работали корректно."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:117
+#, no-wrap
+msgid "Interfaces"
+msgstr "Интерфейсы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:121
+msgid ""
+"The interface between the [.filename]#pcm# core and the sound drivers is "
+"defined in terms of crossref:kobj[kernel-objects,kernel objects]."
+msgstr ""
+"Интерфейс между ядром [.filename]#pcm# и звуковыми драйверами определяется в "
+"терминах crossref:kobj[kernel-objects,объектов ядра Kobj]."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:123
+msgid ""
+"There are two main interfaces that a sound driver will usually provide: "
+"_CHANNEL_ and either _MIXER_ or _AC97_."
+msgstr ""
+"Существует два основных интерфейса, которые обычно предоставляет драйвер "
+"звука: _CHANNEL_ и либо _MIXER_, либо _AC97_."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:125
+msgid ""
+"The _AC97_ interface is a very small hardware access (register read/write) "
+"interface, implemented by drivers for hardware with an AC97 codec. In this "
+"case, the actual MIXER interface is provided by the shared AC97 code in "
+"[.filename]#pcm#."
+msgstr ""
+"Интерфейс _AC97_ — это очень небольшой интерфейс доступа к оборудованию "
+"(чтение/запись регистров), реализованный драйверами для устройств с кодеком "
+"AC97. В этом случае фактический интерфейс MIXER предоставляется общим кодом "
+"AC97 в [.filename]#pcm#."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:126
+#, no-wrap
+msgid "The CHANNEL Interface"
+msgstr "Интерфейс CHANNEL"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:128
+#, no-wrap
+msgid "Common Notes for Function Parameters"
+msgstr "Общие примечания для параметров функций"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:131
+msgid ""
+"Sound drivers usually have a private data structure to describe their "
+"device, and one structure for each play and record data channel that it "
+"supports."
+msgstr ""
+"Драйверы звука обычно имеют приватную структуру данных для описания своего "
+"устройства и по одной структуре для каждого канала воспроизведения и записи, "
+"который они поддерживают."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:133
+msgid ""
+"For all CHANNEL interface functions, the first parameter is an opaque "
+"pointer."
+msgstr ""
+"Для всех функций интерфейса CHANNEL первый параметр — это непрозрачный "
+"указатель."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:135
+msgid ""
+"The second parameter is a pointer to the private channel data structure, "
+"except for `channel_init()` which has a pointer to the private device "
+"structure (and returns the channel pointer for further use by "
+"[.filename]#pcm#)."
+msgstr ""
+"Второй параметр представляет собой указатель на приватную структуру данных "
+"канала, за исключением `channel_init()`, где передается указатель на "
+"приватную структуру устройства (и возвращается указатель на канал для "
+"дальнейшего использования [.filename]#pcm#)."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:136
+#, no-wrap
+msgid "Overview of Data Transfer Operations"
+msgstr "Обзор операций передачи данных"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:139
+msgid ""
+"For sound data transfers, the [.filename]#pcm# core and the sound drivers "
+"communicate through a shared memory area, described by a `struct snd_dbuf`."
+msgstr ""
+"Для надежной передачи звуковых данных ядро [.filename]#pcm# и драйверы звука "
+"взаимодействуют через общую область памяти, описываемую структурой `struct "
+"snd_dbuf`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:141
+msgid ""
+"`struct snd_dbuf` is private to [.filename]#pcm#, and sound drivers obtain "
+"values of interest by calls to accessor functions (`sndbuf_getxxx()`)."
+msgstr ""
+"`struct snd_dbuf` является приватной для [.filename]#pcm#, и драйверы звука "
+"получают нужные значения через вызовы функций доступа (`sndbuf_getxxx()`)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:143
+msgid ""
+"The shared memory area has a size of `sndbuf_getsize()` and is divided into "
+"fixed size blocks of `sndbuf_getblksz()` bytes."
+msgstr ""
+"Область разделяемой памяти имеет размер `sndbuf_getsize()` и разделена на "
+"блоки фиксированного размера по `sndbuf_getblksz()` байт."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:145
+msgid ""
+"When playing, the general transfer mechanism is as follows (reverse the idea "
+"for recording):"
+msgstr ""
+"При воспроизведении общий механизм передачи выглядит следующим образом (для "
+"записи идея обратная):"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:148
+msgid ""
+"[.filename]#pcm# initially fills up the buffer, then calls the sound "
+"driver's crossref:sound[channel-trigger,`xxxchannel_trigger()`] function "
+"with a parameter of PCMTRIG_START."
+msgstr ""
+"[.filename]#pcm# сначала заполняет буфер, затем вызывает функцию "
+"crossref:sound[channel-trigger,`xxxchannel_trigger()`] драйвера звука с "
+"параметром PCMTRIG_START."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:149
+msgid ""
+"The sound driver then arranges to repeatedly transfer the whole memory area "
+"(`sndbuf_getbuf()`, `sndbuf_getsize()`) to the device, in blocks of "
+"`sndbuf_getblksz()` bytes. It calls back the `chn_intr()`[.filename]#pcm# "
+"function for each transferred block (this will typically happen at interrupt "
+"time)."
+msgstr ""
+"Звуковой драйвер затем организует повторяющуюся передачу всей области памяти "
+"(`sndbuf_getbuf()`, `sndbuf_getsize()`) на устройство блоками по "
+"`sndbuf_getblksz()` байт. Для каждого переданного блока он вызывает функцию "
+"`chn_intr()`[.filename]#pcm# (обычно это происходит во время прерывания)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:150
+msgid ""
+"`chn_intr()` arranges to copy new data to the area that was transferred to "
+"the device (now free), and make appropriate updates to the `snd_dbuf` "
+"structure."
+msgstr ""
+"`chn_intr()` организует копирование новых данных в область, которая была "
+"передана устройству (теперь свободна), и вносит соответствующие обновления в "
+"структуру `snd_dbuf`."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:152
+#, no-wrap
+msgid "channel_init"
+msgstr "channel_init"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:156
+msgid ""
+"`xxxchannel_init()` is called to initialize each of the play or record "
+"channels. The calls are initiated from the sound driver attach routine. "
+"(See the crossref:sound[pcm-probe-and-attach,probe and attach section)."
+msgstr ""
+"`xxxchannel_init()` вызывается для инициализации каждого из каналов "
+"воспроизведения или записи. Вызовы инициируются из процедуры присоединения "
+"драйвера звука. (См. раздел crossref:sound[pcm-probe-and-attach,зондирование "
+"и присоединение])."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:168
+#, no-wrap
+msgid ""
+" static void *\n"
+" xxxchannel_init(kobj_t obj, void *data,\n"
+" struct snd_dbuf *b, struct pcm_channel *c, int dir) <.>\n"
+" {\n"
+" struct xxx_info *sc = data;\n"
+" struct xxx_chinfo *ch;\n"
+" ...\n"
+" return ch; <.>\n"
+" }\n"
+msgstr ""
+" static void *\n"
+" xxxchannel_init(kobj_t obj, void *data,\n"
+" struct snd_dbuf *b, struct pcm_channel *c, int dir) <.>\n"
+" {\n"
+" struct xxx_info *sc = data;\n"
+" struct xxx_chinfo *ch;\n"
+" ...\n"
+" return ch; <.>\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:171
+msgid ""
+"`b` is the address for the channel `struct snd_dbuf`. It should be "
+"initialized in the function by calling `sndbuf_alloc()`. The buffer size to "
+"use is normally a small multiple of the 'typical' unit transfer size for "
+"your device.`c` is the [.filename]#pcm# channel control structure pointer. "
+"This is an opaque object. The function should store it in the local channel "
+"structure, to be used in later calls to [.filename]#pcm# (ie: "
+"`chn_intr(c)`).`dir` indicates the channel direction (`PCMDIR_PLAY` or "
+"`PCMDIR_REC`)."
+msgstr ""
+"`b` — это адрес для канала `struct snd_dbuf`. Он должен быть инициализирован "
+"в функции вызовом `sndbuf_alloc()`. Размер буфера, который следует "
+"использовать, обычно представляет собой небольшое кратное от 'типичного' "
+"размера единицы передачи данных для вашего устройства. `c` — это указатель "
+"на структуру управления каналом [.filename]#pcm#. Это непрозрачный объект. "
+"Функция должна сохранить его в локальной структуре канала для использования "
+"в последующих вызовах [.filename]#pcm# (например: `chn_intr(c)`). `dir` "
+"указывает направление канала (`PCMDIR_PLAY` или `PCMDIR_REC`)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:173
+msgid ""
+"The function should return a pointer to the private area used to control "
+"this channel. This will be passed as a parameter to other channel interface "
+"calls."
+msgstr ""
+"Функция должна возвращать указатель на приватную область, используемую для "
+"управления этим каналом. Этот указатель будет передаваться в качестве "
+"параметра при других вызовах интерфейса канала."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:174
+#, no-wrap
+msgid "channel_setformat"
+msgstr "channel_setformat"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:177
+msgid ""
+"`xxxchannel_setformat()` should set up the hardware for the specified "
+"channel for the specified sound format."
+msgstr ""
+"`xxxchannel_setformat()` должен настроить оборудование для указанного канала "
+"под указанный звуковой формат."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:187
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format) <.>\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return 0;\n"
+" }\n"
+msgstr ""
+" static int\n"
+" xxxchannel_setformat(kobj_t obj, void *data, u_int32_t format) <.>\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return 0;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:190
+msgid ""
+"`format` is specified as an `AFMT_XXX value` ([.filename]#soundcard.h#)."
+msgstr ""
+"`format` указывается как значение `AFMT_XXX` ([.filename]#soundcard.h#)."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:191
+#, no-wrap
+msgid "channel_setspeed"
+msgstr "channel_setspeed"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:194
+msgid ""
+"`xxxchannel_setspeed()` sets up the channel hardware for the specified "
+"sampling speed, and returns the possibly adjusted speed."
+msgstr ""
+"`xxxchannel_setspeed()` настраивает оборудование канала для указанной "
+"скорости дискретизации и возвращает возможно скорректированную скорость."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:204
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxchannel_setspeed(kobj_t obj, void *data, u_int32_t speed)\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return speed;\n"
+" }\n"
+msgstr ""
+" static int\n"
+" xxxchannel_setspeed(kobj_t obj, void *data, u_int32_t speed)\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return speed;\n"
+" }\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:206
+#, no-wrap
+msgid "channel_setblocksize"
+msgstr "channel_setblocksize"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:209
+msgid ""
+"`xxxchannel_setblocksize()` sets the block size, which is the size of unit "
+"transactions between [.filename]#pcm# and the sound driver, and between the "
+"sound driver and the device. Typically, this would be the number of bytes "
+"transferred before an interrupt occurs. During a transfer, the sound driver "
+"should call [.filename]#pcm#'s `chn_intr()` every time this size has been "
+"transferred."
+msgstr ""
+"`xxxchannel_setblocksize()` устанавливает размер блока, который является "
+"размером единичных транзакций между [.filename]#pcm# и звуковым драйвером, а "
+"также между звуковым драйвером и устройством. Обычно это количество байт, "
+"передаваемых до возникновения прерывания. Во время передачи звуковой драйвер "
+"должен вызывать `chn_intr()` из [.filename]#pcm# каждый раз, когда "
+"передается данный размер."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:211
+msgid ""
+"Most sound drivers only take note of the block size here, to be used when an "
+"actual transfer will be started."
+msgstr ""
+"Большинство драйверов звука здесь учитывают только размер блока, который "
+"будет использоваться при начале фактической передачи."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:221
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return blocksize; <.>\n"
+" }\n"
+msgstr ""
+" static int\n"
+" xxxchannel_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return blocksize; <.>\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:224
+msgid ""
+"The function returns the possibly adjusted block size. In case the block "
+"size is indeed changed, `sndbuf_resize()` should be called to adjust the "
+"buffer."
+msgstr ""
+"Функция возвращает, возможно, скорректированный размер блока. Если размер "
+"блока действительно изменён, следует вызвать `sndbuf_resize()` для "
+"корректировки буфера."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:226
+#, no-wrap
+msgid "channel_trigger"
+msgstr "channel_trigger"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:229
+msgid ""
+"`xxxchannel_trigger()` is called by [.filename]#pcm# to control data "
+"transfer operations in the driver."
+msgstr ""
+"`xxxchannel_trigger()` вызывается [.filename]#pcm# для управления операциями "
+"передачи данных в драйвере."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:239
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxchannel_trigger(kobj_t obj, void *data, int go) <.>\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return 0;\n"
+" }\n"
+msgstr ""
+" static int\n"
+" xxxchannel_trigger(kobj_t obj, void *data, int go) <.>\n"
+" {\n"
+" struct xxx_chinfo *ch = data;\n"
+" ...\n"
+" return 0;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:242
+msgid "`go` defines the action for the current call. The possible values are:"
+msgstr "`go` определяет действие для текущего вызова. Возможные значения:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:246
+msgid ""
+"If the driver uses ISA DMA, `sndbuf_isadma()` should be called before "
+"performing actions on the device, and will take care of the DMA chip side of "
+"things."
+msgstr ""
+"Если драйвер использует ISA DMA, перед выполнением действий с устройством "
+"следует вызвать `sndbuf_isadma()`, которая позаботится о том, что делает DMA-"
+"чип."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:248
+#, no-wrap
+msgid "channel_getptr"
+msgstr "channel_getptr"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:251
+msgid ""
+"`xxxchannel_getptr()` returns the current offset in the transfer buffer. "
+"This will typically be called by `chn_intr()`, and this is how "
+"[.filename]#pcm# knows where it can transfer new data."
+msgstr ""
+"`xxxchannel_getptr()` возвращает текущее смещение в буфере передачи. Обычно "
+"этот вызов выполняется функцией `chn_intr()`, и именно так [.filename]#pcm# "
+"узнаёт, куда можно передавать новые данные."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:252
+#, no-wrap
+msgid "channel_free"
+msgstr "channel_free"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:255
+msgid ""
+"`xxxchannel_free()` is called to free up channel resources, for example when "
+"the driver is unloaded, and should be implemented if the channel data "
+"structures are dynamically allocated or if `sndbuf_alloc()` was not used for "
+"buffer allocation."
+msgstr ""
+"`xxxchannel_free()` вызывается для освобождения ресурсов канала, например, "
+"при выгрузке драйвера, и должна быть реализована, если структуры данных "
+"канала динамически выделены или если `sndbuf_alloc()` не использовалась для "
+"выделения буфера."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:256
+#, no-wrap
+msgid "channel_getcaps"
+msgstr "channel_getcaps"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:265
+#, no-wrap
+msgid ""
+" struct pcmchan_caps *\n"
+" xxxchannel_getcaps(kobj_t obj, void *data)\n"
+" {\n"
+" return &xxx_caps; <.>\n"
+" }\n"
+msgstr ""
+" struct pcmchan_caps *\n"
+" xxxchannel_getcaps(kobj_t obj, void *data)\n"
+" {\n"
+" return &xxx_caps; <.>\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:268
+msgid ""
+"The routine returns a pointer to a (usually statically-defined) "
+"`pcmchan_caps` structure (defined in [.filename]#sound/pcm/channel.h#. The "
+"structure holds the minimum and maximum sampling frequencies, and the "
+"accepted sound formats. Look at any sound driver for an example."
+msgstr ""
+"Подпрограмма возвращает указатель на (обычно статически определённую) "
+"структуру `pcmchan_caps` (определена в [.filename]#sound/pcm/channel.h#). "
+"Эта структура содержит минимальную и максимальную частоты дискретизации, а "
+"также поддерживаемые звуковые форматы. Пример можно найти в любом драйвере "
+"звукового устройства."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:269
+#, no-wrap
+msgid "More Functions"
+msgstr "Дополнительные функции"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:272
+msgid ""
+"`channel_reset()`, `channel_resetdone()`, and `channel_notify()` are for "
+"special purposes and should not be implemented in a driver without "
+"discussing it on the {freebsd-multimedia}."
+msgstr ""
+"`channel_reset()`, `channel_resetdone()` и `channel_notify()` предназначены "
+"для специальных целей и не должны реализовываться в драйвере без обсуждения "
+"на {freebsd-multimedia}."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:274
+msgid "`channel_setdir()` is deprecated."
+msgstr "`channel_setdir()` устарела."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:275
+#, no-wrap
+msgid "The MIXER Interface"
+msgstr "Интерфейс MIXER"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:278
+#, no-wrap
+msgid "mixer_init"
+msgstr "mixer_init"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:281
+msgid ""
+"`xxxmixer_init()` initializes the hardware and tells [.filename]#pcm# what "
+"mixer devices are available for playing and recording"
+msgstr ""
+"`xxxmixer_init()` инициализирует оборудование и сообщает [.filename]#pcm#, "
+"какие устройства микшера доступны для воспроизведения и записи"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:289
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxmixer_init(struct snd_mixer *m)\n"
+" {\n"
+" struct xxx_info *sc = mix_getdevinfo(m);\n"
+" u_int32_t v;\n"
+msgstr ""
+" static int\n"
+" xxxmixer_init(struct snd_mixer *m)\n"
+" {\n"
+" struct xxx_info *sc = mix_getdevinfo(m);\n"
+" u_int32_t v;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:291
+#, no-wrap
+msgid " [Initialize hardware]\n"
+msgstr " [Initialize hardware]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:296
+#, no-wrap
+msgid ""
+" [Set appropriate bits in v for play mixers] <.>\n"
+" mix_setdevs(m, v);\n"
+" [Set appropriate bits in v for record mixers]\n"
+" mix_setrecdevs(m, v)\n"
+msgstr ""
+" [Set appropriate bits in v for play mixers] <.>\n"
+" mix_setdevs(m, v);\n"
+" [Set appropriate bits in v for record mixers]\n"
+" mix_setrecdevs(m, v)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:299
+#, no-wrap
+msgid ""
+" return 0;\n"
+" }\n"
+msgstr ""
+" return 0;\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:302
+msgid ""
+"Set bits in an integer value and call `mix_setdevs()` and `mix_setrecdevs()` "
+"to tell [.filename]#pcm# what devices exist."
+msgstr ""
+"Установите биты в целочисленном значении и вызовите `mix_setdevs()` и "
+"`mix_setrecdevs()`, чтобы сообщить [.filename]#pcm#, какие устройства "
+"существуют."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:304
+msgid ""
+"Mixer bits definitions can be found in [.filename]#soundcard.h# "
+"(`SOUND_MASK_XXX` values and `SOUND_MIXER_XXX` bit shifts)."
+msgstr ""
+"Определения битов микшера можно найти в [.filename]#soundcard.h# (значения "
+"`SOUND_MASK_XXX` и сдвиги битов `SOUND_MIXER_XXX`)."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:305
+#, no-wrap
+msgid "mixer_set"
+msgstr "mixer_set"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:308
+msgid "`xxxmixer_set()` sets the volume level for one mixer device."
+msgstr ""
+"`xxxmixer_set()` устанавливает уровень громкости для одного устройства "
+"микшера."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:319
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxmixer_set(struct snd_mixer *m, unsigned dev,\n"
+" unsigned left, unsigned right) <.>\n"
+" {\n"
+" struct sc_info *sc = mix_getdevinfo(m);\n"
+" [set volume level]\n"
+" return left | (right << 8); <.>\n"
+" }\n"
+msgstr ""
+" static int\n"
+" xxxmixer_set(struct snd_mixer *m, unsigned dev,\n"
+" unsigned left, unsigned right) <.>\n"
+" {\n"
+" struct sc_info *sc = mix_getdevinfo(m);\n"
+" [set volume level]\n"
+" return left | (right << 8); <.>\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:322
+msgid ""
+"The device is specified as a `SOUND_MIXER_XXX` value. The volume values are "
+"specified in range [0-100]. A value of zero should mute the device."
+msgstr ""
+"Устройство указывается как значение `SOUND_MIXER_XXX`. Значения громкости "
+"задаются в диапазоне [0-100]. Значение ноль должно отключать звук устройства."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:323
+msgid ""
+"As the hardware levels probably will not match the input scale, and some "
+"rounding will occur, the routine returns the actual level values (in range "
+"0-100) as shown."
+msgstr ""
+"Поскольку уровни оборудования, вероятно, не совпадут с входной шкалой и "
+"будет происходить округление, процедура возвращает фактические значения "
+"уровней (в диапазоне 0-100), как показано."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:324
+#, no-wrap
+msgid "mixer_setrecsrc"
+msgstr "mixer_setrecsrc"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:327
+msgid "`xxxmixer_setrecsrc()` sets the recording source device."
+msgstr "`xxxmixer_setrecsrc()` устанавливает устройство источника записи."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:334
+#, no-wrap
+msgid ""
+" static int\n"
+" xxxmixer_setrecsrc(struct snd_mixer *m, u_int32_t src) <.>\n"
+" {\n"
+" struct xxx_info *sc = mix_getdevinfo(m);\n"
+msgstr ""
+" static int\n"
+" xxxmixer_setrecsrc(struct snd_mixer *m, u_int32_t src) <.>\n"
+" {\n"
+" struct xxx_info *sc = mix_getdevinfo(m);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:336
+#, no-wrap
+msgid " [look for non zero bit(s) in src, set up hardware]\n"
+msgstr " [look for non zero bit(s) in src, set up hardware]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:340
+#, no-wrap
+msgid ""
+" [update src to reflect actual action]\n"
+" return src; <.>\n"
+" }\n"
+msgstr ""
+" [update src to reflect actual action]\n"
+" return src; <.>\n"
+" }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:343
+msgid "The desired recording devices are specified as a bit field"
+msgstr "Желаемые устройства записи указываются в виде битового поля"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:344
+msgid ""
+"The actual devices set for recording are returned. Some drivers can only set "
+"one device for recording. The function should return -1 if an error occurs."
+msgstr ""
+"Возвращаются фактические устройства, настроенные для записи. Некоторые "
+"драйверы могут настраивать только одно устройство для записи. Функция должна "
+"возвращать -1 в случае ошибки."
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:345
+#, no-wrap
+msgid "mixer_uninit, mixer_reinit"
+msgstr "mixer_uninit, mixer_reinit"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:348
+msgid ""
+"`xxxmixer_uninit()` should ensure that all sound is muted and if possible "
+"mixer hardware should be powered down."
+msgstr ""
+"`xxxmixer_uninit()` должен гарантировать, что весь звук отключен, и, если "
+"возможно, аппаратный микшер должен быть переведен в режим пониженного "
+"энергопотребления."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:350
+msgid ""
+"`xxxmixer_reinit()` should ensure that the mixer hardware is powered up and "
+"any settings not controlled by `mixer_set()` or `mixer_setrecsrc()` are "
+"restored."
+msgstr ""
+"`xxxmixer_reinit()` должна гарантировать, что аппаратура микшера включена и "
+"все настройки, не управляемые `mixer_set()` или `mixer_setrecsrc()`, "
+"восстановлены."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:351
+#, no-wrap
+msgid "The AC97 Interface"
+msgstr "Интерфейс AC97"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:354
+msgid ""
+"The _AC97_ interface is implemented by drivers with an AC97 codec. It only "
+"has three methods:"
+msgstr ""
+"Интерфейс _AC97_ реализован драйверами с кодеком AC97. У него есть только "
+"три метода:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:356
+msgid "`xxxac97_init()` returns the number of ac97 codecs found."
+msgstr "`xxxac97_init()` возвращает количество найденных кодеков ac97."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:357
+msgid "`ac97_read()` and `ac97_write()` read or write a specified register."
+msgstr ""
+"`ac97_read()` и `ac97_write()` читают или записывают указанный регистр."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sound/_index.adoc:358
+msgid ""
+"The _AC97_ interface is used by the AC97 code in [.filename]#pcm# to perform "
+"higher level operations. Look at [.filename]#sound/pci/maestro3.c# or many "
+"others under [.filename]#sound/pci/# for an example."
+msgstr ""
+"Интерфейс _AC97_ используется кодом AC97 в [.filename]#pcm# для выполнения "
+"операций более высокого уровня. В качестве примера можно посмотреть "
+"[.filename]#sound/pci/maestro3.c# или другие файлы в [.filename]#sound/pci/#."
diff --git a/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc b/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc
new file mode 100644
index 0000000000..2ed3e6c763
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/sysinit/_index.adoc
@@ -0,0 +1,165 @@
+---
+description: 'Фреймворк SYSINIT'
+next: books/arch-handbook/mac
+params:
+ path: /books/arch-handbook/sysinit/
+prev: books/arch-handbook/jail
+showBookMenu: true
+tags: ["SYSINIT", "framework", "Terminology"]
+title: 'Глава 5. Фреймворк SYSINIT'
+weight: 6
+---
+
+[[sysinit]]
+= Фреймворк SYSINIT
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 5
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+SYSINIT — это фреймворк для общего механизма сортировки и диспетчеризации вызовов. В настоящее время FreeBSD использует его для динамической инициализации ядра. SYSINIT позволяет изменять порядок, добавлять, удалять и заменять подсистемы ядра FreeBSD во время линковки ядра при загрузке ядра или его модулей, без необходимости редактировать статически упорядоченные маршруты инициализации и перекомпилировать ядро. Эта система также позволяет модулям ядра (в настоящее время называемым _KLD_) компилироваться, линковаться и инициализироваться отдельно во время загрузки, а также загружаться позже, когда система уже работает. Это достигается с помощью «компоновщика ядра» (kernel linker) и «наборов компоновщика» (linker sets).
+
+[[sysinit-term]]
+== Терминология
+
+Набор компоновщика (Linker Set)::
+Техника компоновщика, при которой компоновщик собирает статически объявленные данные из всех исходных файлов программы в единый непрерывно адресуемый блок данных.
+
+[[sysinit-operation]]
+== Работа механизма SYSINIT
+
+SYSINIT полагается на способность компоновщика объединять статические данные, объявленные в нескольких местах исходного кода программы, в единый непрерывный блок данных. Этот метод компоновщика называется "набором компоновщика" (linker set). SYSINIT использует два набора компоновщика для поддержки двух наборов данных, содержащих порядок вызова, функцию и указатель на данные, передаваемые этой функции для каждого члена этих наборов данных.
+
+SYSINIT использует два приоритета для упорядочивания функций при выполнении. Первый приоритет — это идентификатор подсистемы, задающий общий порядок вызова функций SYSINIT. Предварительно объявленные идентификаторы находятся в [.filename]#<sys/kernel.h># в перечислении `sysinit_sub_id`. Второй используемый приоритет — это порядок элементов внутри подсистемы. Предварительно объявленные порядки элементов подсистемы находятся в [.filename]#<sys/kernel.h># в перечислении `sysinit_elem_order`.
+
+В настоящее время существует два варианта использования `SYSINIT`: вызов функций при загрузке системы и загрузке модулей ядра, а также вызов функций при завершении работы системы и выгрузке модулей ядра. Подсистемы ядра часто используют `SYSINIT` при старте системы для инициализации структур данных. Например, подсистема планирования процессов использует `SYSINIT` для инициализации структуры данных очереди выполнения. Драйверы устройств должны избегать прямого использования `SYSINIT()`. Вместо этого драйверы реальных устройств, входящих в структуру шины, должны использовать `DRIVER_MODULE()`, который предоставляет функцию для обнаружения устройства и, если оно присутствует, его инициализации. Этот макрос выполняет несколько действий, специфичных для устройств, а затем вызывает `SYSINIT()` самостоятельно. Для псевдоустройств, которые не входят в структуру шины, следует использовать `DEV_MODULE()`.
+
+[[sysinit-using]]
+== Использование SYSINIT
+
+=== Интерфейс
+
+==== Заголовки
+
+[.programlisting]
+....
+<sys/kernel.h>
+....
+
+==== Макросы
+
+[.programlisting]
+....
+SYSINIT(uniquifier, subsystem, order, func, ident)
+SYSUNINIT(uniquifier, subsystem, order, func, ident)
+....
+
+=== Запуск
+
+Макрос `SYSINIT()` создает необходимые данные SYSINIT в наборе данных инициализации системы, чтобы SYSINIT мог отсортировать и выполнить функцию при запуске системы и загрузке модуля. `SYSINIT()` принимает уникальный идентификатор, который SYSINIT использует для идентификации конкретных данных вызова функции, порядок подсистемы, порядок элемента подсистемы, функцию для вызова и данные для передачи в функцию. Все функции должны принимать аргумент в виде константного указателя.
+
+.Пример `SYSINIT()`
+[example]
+====
+[.programlisting]
+....
+#include <sys/kernel.h>
+
+void foo_null(void *unused)
+{
+ foo_doo();
+}
+SYSINIT(foo, SI_SUB_FOO, SI_ORDER_FOO, foo_null, NULL);
+
+struct foo foo_voodoo = {
+ FOO_VOODOO;
+}
+
+void foo_arg(void *vdata)
+{
+ struct foo *foo = (struct foo *)vdata;
+ foo_data(foo);
+}
+SYSINIT(bar, SI_SUB_FOO, SI_ORDER_FOO, foo_arg, &foo_voodoo);
+....
+====
+
+Обратите внимание, что `SI_SUB_FOO` и `SI_ORDER_FOO` должны быть в перечислениях `sysinit_sub_id` и `sysinit_elem_order`, как упоминалось выше. Можно использовать существующие значения или добавить свои в эти перечисления. Также можно использовать математические операции для точной настройки порядка выполнения SYSINIT. В этом примере показан SYSINIT, который должен выполняться непосредственно перед SYSINIT, обрабатывающими настройку параметров ядра.
+
+.Пример настройки порядка `SYSINIT()`
+[example]
+====
+[.programlisting]
+....
+static void
+mptable_register(void *dummy __unused)
+{
+
+ apic_register_enumerator(&mptable_enumerator);
+}
+
+SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST,
+ mptable_register, NULL);
+....
+
+====
+
+=== Выключение системы
+
+Макрос `SYSUNINIT()` ведет себя аналогично макросу `SYSINIT()`, за исключением того, что добавляет данные SYSINIT в набор данных завершения работы SYSINIT.
+
+.Пример `SYSUNINIT()`
+[example]
+====
+[.programlisting]
+....
+#include <sys/kernel.h>
+
+void foo_cleanup(void *unused)
+{
+ foo_kill();
+}
+SYSUNINIT(foobar, SI_SUB_FOO, SI_ORDER_FOO, foo_cleanup, NULL);
+
+struct foo_stack foo_stack = {
+ FOO_STACK_VOODOO;
+}
+
+void foo_flush(void *vdata)
+{
+}
+SYSUNINIT(barfoo, SI_SUB_FOO, SI_ORDER_FOO, foo_flush, &foo_stack);
+....
+
+====
diff --git a/documentation/content/ru/books/arch-handbook/sysinit/_index.po b/documentation/content/ru/books/arch-handbook/sysinit/_index.po
new file mode 100644
index 0000000000..6dac0074cb
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/sysinit/_index.po
@@ -0,0 +1,393 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-07-02 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbooksysinit_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:1
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:14
+#, no-wrap
+msgid "The SYSINIT Framework"
+msgstr "Фреймворк SYSINIT"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:1
+#, no-wrap
+msgid "Chapter 5. The SYSINIT Framework"
+msgstr "Глава 5. Фреймворк SYSINIT"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:52
+msgid ""
+"SYSINIT is the framework for a generic call sort and dispatch mechanism. "
+"FreeBSD currently uses it for the dynamic initialization of the kernel. "
+"SYSINIT allows FreeBSD's kernel subsystems to be reordered, and added, "
+"removed, and replaced at kernel link time when the kernel or one of its "
+"modules is loaded without having to edit a statically ordered initialization "
+"routing and recompile the kernel. This system also allows kernel modules, "
+"currently called _KLD's_, to be separately compiled, linked, and initialized "
+"at boot time and loaded even later while the system is already running. This "
+"is accomplished using the \"kernel linker\" and \"linker sets\"."
+msgstr ""
+"SYSINIT — это фреймворк для общего механизма сортировки и диспетчеризации "
+"вызовов. В настоящее время FreeBSD использует его для динамической "
+"инициализации ядра. SYSINIT позволяет изменять порядок, добавлять, удалять и "
+"заменять подсистемы ядра FreeBSD во время линковки ядра при загрузке ядра "
+"или его модулей, без необходимости редактировать статически упорядоченные "
+"маршруты инициализации и перекомпилировать ядро. Эта система также позволяет "
+"модулям ядра (в настоящее время называемым _KLD_) компилироваться, "
+"линковаться и инициализироваться отдельно во время загрузки, а также "
+"загружаться позже, когда система уже работает. Это достигается с помощью "
+"«компоновщика ядра» (kernel linker) и «наборов компоновщика» (linker sets)."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:54
+#, no-wrap
+msgid "Terminology"
+msgstr "Терминология"
+
+#. type: Labeled list
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:56
+#, no-wrap
+msgid "Linker Set"
+msgstr "Набор компоновщика (Linker Set)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:58
+msgid ""
+"A linker technique in which the linker gathers statically declared data "
+"throughout a program's source files into a single contiguously addressable "
+"unit of data."
+msgstr ""
+"Техника компоновщика, при которой компоновщик собирает статически "
+"объявленные данные из всех исходных файлов программы в единый непрерывно "
+"адресуемый блок данных."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:60
+#, no-wrap
+msgid "SYSINIT Operation"
+msgstr "Работа механизма SYSINIT"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:63
+msgid ""
+"SYSINIT relies on the ability of the linker to take static data declared at "
+"multiple locations throughout a program's source and group it together as a "
+"single contiguous chunk of data. This linker technique is called a \"linker "
+"set\". SYSINIT uses two linker sets to maintain two data sets containing "
+"each consumer's call order, function, and a pointer to the data to pass to "
+"that function."
+msgstr ""
+"SYSINIT полагается на способность компоновщика объединять статические "
+"данные, объявленные в нескольких местах исходного кода программы, в единый "
+"непрерывный блок данных. Этот метод компоновщика называется \"набором "
+"компоновщика\" (linker set). SYSINIT использует два набора компоновщика для "
+"поддержки двух наборов данных, содержащих порядок вызова, функцию и "
+"указатель на данные, передаваемые этой функции для каждого члена этих "
+"наборов данных."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:65
+msgid ""
+"SYSINIT uses two priorities when ordering the functions for execution. The "
+"first priority is a subsystem ID giving an overall order for SYSINIT's "
+"dispatch of functions. Current predeclared ID's are in [.filename]#<sys/"
+"kernel.h># in the enum list `sysinit_sub_id`. The second priority used is an "
+"element order within the subsystem. Current predeclared subsystem element "
+"orders are in [.filename]#<sys/kernel.h># in the enum list "
+"`sysinit_elem_order`."
+msgstr ""
+"SYSINIT использует два приоритета для упорядочивания функций при выполнении. "
+"Первый приоритет — это идентификатор подсистемы, задающий общий порядок "
+"вызова функций SYSINIT. Предварительно объявленные идентификаторы находятся "
+"в [.filename]#<sys/kernel.h># в перечислении `sysinit_sub_id`. Второй "
+"используемый приоритет — это порядок элементов внутри подсистемы. "
+"Предварительно объявленные порядки элементов подсистемы находятся в "
+"[.filename]#<sys/kernel.h># в перечислении `sysinit_elem_order`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:67
+msgid ""
+"There are currently two uses for SYSINIT. Function dispatch at system "
+"startup and kernel module loads, and function dispatch at system shutdown "
+"and kernel module unload. Kernel subsystems often use system startup "
+"SYSINIT's to initialize data structures, for example the process scheduling "
+"subsystem uses a SYSINIT to initialize the run queue data structure. Device "
+"drivers should avoid using `SYSINIT()` directly. Instead drivers for real "
+"devices that are part of a bus structure should use `DRIVER_MODULE()` to "
+"provide a function that detects the device and, if it is present, "
+"initializes the device. It will do a few things specific to devices and then "
+"call `SYSINIT()` itself. For pseudo-devices, which are not part of a bus "
+"structure, use `DEV_MODULE()`."
+msgstr ""
+"В настоящее время существует два варианта использования `SYSINIT`: вызов "
+"функций при загрузке системы и загрузке модулей ядра, а также вызов функций "
+"при завершении работы системы и выгрузке модулей ядра. Подсистемы ядра часто "
+"используют `SYSINIT` при старте системы для инициализации структур данных. "
+"Например, подсистема планирования процессов использует `SYSINIT` для "
+"инициализации структуры данных очереди выполнения. Драйверы устройств должны "
+"избегать прямого использования `SYSINIT()`. Вместо этого драйверы реальных "
+"устройств, входящих в структуру шины, должны использовать `DRIVER_MODULE()`, "
+"который предоставляет функцию для обнаружения устройства и, если оно "
+"присутствует, его инициализации. Этот макрос выполняет несколько действий, "
+"специфичных для устройств, а затем вызывает `SYSINIT()` самостоятельно. Для "
+"псевдоустройств, которые не входят в структуру шины, следует использовать "
+"`DEV_MODULE()`."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:69
+#, no-wrap
+msgid "Using SYSINIT"
+msgstr "Использование SYSINIT"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:71
+#, no-wrap
+msgid "Interface"
+msgstr "Интерфейс"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:73
+#, no-wrap
+msgid "Headers"
+msgstr "Заголовки"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:78
+#, no-wrap
+msgid "<sys/kernel.h>\n"
+msgstr "<sys/kernel.h>\n"
+
+#. type: Title ====
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:80
+#, no-wrap
+msgid "Macros"
+msgstr "Макросы"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:86
+#, no-wrap
+msgid ""
+"SYSINIT(uniquifier, subsystem, order, func, ident)\n"
+"SYSUNINIT(uniquifier, subsystem, order, func, ident)\n"
+msgstr ""
+"SYSINIT(uniquifier, subsystem, order, func, ident)\n"
+"SYSUNINIT(uniquifier, subsystem, order, func, ident)\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:88
+#, no-wrap
+msgid "Startup"
+msgstr "Запуск"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:91
+msgid ""
+"The `SYSINIT()` macro creates the necessary SYSINIT data in SYSINIT's "
+"startup data set for SYSINIT to sort and dispatch a function at system "
+"startup and module load. `SYSINIT()` takes a uniquifier that SYSINIT uses to "
+"identify the particular function dispatch data, the subsystem order, the "
+"subsystem element order, the function to call, and the data to pass the "
+"function. All functions must take a constant pointer argument."
+msgstr ""
+"Макрос `SYSINIT()` создает необходимые данные SYSINIT в наборе данных "
+"инициализации системы, чтобы SYSINIT мог отсортировать и выполнить функцию "
+"при запуске системы и загрузке модуля. `SYSINIT()` принимает уникальный "
+"идентификатор, который SYSINIT использует для идентификации конкретных "
+"данных вызова функции, порядок подсистемы, порядок элемента подсистемы, "
+"функцию для вызова и данные для передачи в функцию. Все функции должны "
+"принимать аргумент в виде константного указателя."
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:92
+#, no-wrap
+msgid "Example of a `SYSINIT()`"
+msgstr "Пример `SYSINIT()`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:98
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:148
+#, no-wrap
+msgid "#include <sys/kernel.h>\n"
+msgstr "#include <sys/kernel.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:104
+#, no-wrap
+msgid ""
+"void foo_null(void *unused)\n"
+"{\n"
+" foo_doo();\n"
+"}\n"
+"SYSINIT(foo, SI_SUB_FOO, SI_ORDER_FOO, foo_null, NULL);\n"
+msgstr ""
+"void foo_null(void *unused)\n"
+"{\n"
+" foo_doo();\n"
+"}\n"
+"SYSINIT(foo, SI_SUB_FOO, SI_ORDER_FOO, foo_null, NULL);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:108
+#, no-wrap
+msgid ""
+"struct foo foo_voodoo = {\n"
+" FOO_VOODOO;\n"
+"}\n"
+msgstr ""
+"struct foo foo_voodoo = {\n"
+" FOO_VOODOO;\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:115
+#, no-wrap
+msgid ""
+"void foo_arg(void *vdata)\n"
+"{\n"
+" struct foo *foo = (struct foo *)vdata;\n"
+" foo_data(foo);\n"
+"}\n"
+"SYSINIT(bar, SI_SUB_FOO, SI_ORDER_FOO, foo_arg, &foo_voodoo);\n"
+msgstr ""
+"void foo_arg(void *vdata)\n"
+"{\n"
+" struct foo *foo = (struct foo *)vdata;\n"
+" foo_data(foo);\n"
+"}\n"
+"SYSINIT(bar, SI_SUB_FOO, SI_ORDER_FOO, foo_arg, &foo_voodoo);\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:119
+msgid ""
+"Note that `SI_SUB_FOO` and `SI_ORDER_FOO` need to be in the `sysinit_sub_id` "
+"and `sysinit_elem_order` enum's as mentioned above. Either use existing ones "
+"or add your own to the enum's. You can also use math for fine-tuning the "
+"order a SYSINIT will run in. This example shows a SYSINIT that needs to be "
+"run just barely before the SYSINIT's that handle tuning kernel parameters."
+msgstr ""
+"Обратите внимание, что `SI_SUB_FOO` и `SI_ORDER_FOO` должны быть в "
+"перечислениях `sysinit_sub_id` и `sysinit_elem_order`, как упоминалось выше. "
+"Можно использовать существующие значения или добавить свои в эти "
+"перечисления. Также можно использовать математические операции для точной "
+"настройки порядка выполнения SYSINIT. В этом примере показан SYSINIT, "
+"который должен выполняться непосредственно перед SYSINIT, обрабатывающими "
+"настройку параметров ядра."
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:120
+#, no-wrap
+msgid "Example of Adjusting `SYSINIT()` Order"
+msgstr "Пример настройки порядка `SYSINIT()`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:128
+#, no-wrap
+msgid ""
+"static void\n"
+"mptable_register(void *dummy __unused)\n"
+"{\n"
+msgstr ""
+"static void\n"
+"mptable_register(void *dummy __unused)\n"
+"{\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:131
+#, no-wrap
+msgid ""
+"\tapic_register_enumerator(&mptable_enumerator);\n"
+"}\n"
+msgstr ""
+"\tapic_register_enumerator(&mptable_enumerator);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:134
+#, no-wrap
+msgid ""
+"SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST,\n"
+" mptable_register, NULL);\n"
+msgstr ""
+"SYSINIT(mptable_register, SI_SUB_TUNABLES - 1, SI_ORDER_FIRST,\n"
+" mptable_register, NULL);\n"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:138
+#, no-wrap
+msgid "Shutdown"
+msgstr "Выключение системы"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:141
+msgid ""
+"The `SYSUNINIT()` macro behaves similarly to the `SYSINIT()` macro except "
+"that it adds the SYSINIT data to SYSINIT's shutdown data set."
+msgstr ""
+"Макрос `SYSUNINIT()` ведет себя аналогично макросу `SYSINIT()`, за "
+"исключением того, что добавляет данные SYSINIT в набор данных завершения "
+"работы SYSINIT."
+
+#. type: Block title
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:142
+#, no-wrap
+msgid "Example of a `SYSUNINIT()`"
+msgstr "Пример `SYSUNINIT()`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:154
+#, no-wrap
+msgid ""
+"void foo_cleanup(void *unused)\n"
+"{\n"
+" foo_kill();\n"
+"}\n"
+"SYSUNINIT(foobar, SI_SUB_FOO, SI_ORDER_FOO, foo_cleanup, NULL);\n"
+msgstr ""
+"void foo_cleanup(void *unused)\n"
+"{\n"
+" foo_kill();\n"
+"}\n"
+"SYSUNINIT(foobar, SI_SUB_FOO, SI_ORDER_FOO, foo_cleanup, NULL);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:158
+#, no-wrap
+msgid ""
+"struct foo_stack foo_stack = {\n"
+" FOO_STACK_VOODOO;\n"
+"}\n"
+msgstr ""
+"struct foo_stack foo_stack = {\n"
+" FOO_STACK_VOODOO;\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/sysinit/_index.adoc:163
+#, no-wrap
+msgid ""
+"void foo_flush(void *vdata)\n"
+"{\n"
+"}\n"
+"SYSUNINIT(barfoo, SI_SUB_FOO, SI_ORDER_FOO, foo_flush, &foo_stack);\n"
+msgstr ""
+"void foo_flush(void *vdata)\n"
+"{\n"
+"}\n"
+"SYSUNINIT(barfoo, SI_SUB_FOO, SI_ORDER_FOO, foo_flush, &foo_stack);\n"
diff --git a/documentation/content/ru/books/arch-handbook/usb/_index.adoc b/documentation/content/ru/books/arch-handbook/usb/_index.adoc
new file mode 100644
index 0000000000..1694fb305a
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/usb/_index.adoc
@@ -0,0 +1,186 @@
+---
+description: 'Устройства USB в FreeBSD'
+next: books/arch-handbook/newbus
+params:
+ path: /books/arch-handbook/usb/
+prev: books/arch-handbook/scsi
+showBookMenu: true
+tags: ["USB", "Structure", "UHCI", "OHCI"]
+title: 'Глава 13. USB-устройства'
+weight: 15
+---
+
+[[usb]]
+= Устройства USB
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 13
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[usb-intro]]
+== Введение
+
+Универсальная последовательная шина (USB) — это новый способ подключения устройств к персональным компьютерам. Архитектура шины поддерживает двустороннюю связь и была разработана в ответ на усложнение устройств, требующих большего взаимодействия с хостом. Поддержка USB включена во все современные чипсеты ПК и, следовательно, доступна во всех недавно собранных компьютерах. Выпуск Apple iMac только с USB стал серьёзным стимулом для производителей оборудования выпускать USB-версии своих устройств. Согласно будущим спецификациям ПК, все устаревшие разъёмы должны быть заменены одним или несколькими USB-разъёмами, обеспечивающими универсальные возможности plug and play. Поддержка USB-оборудования появилась в NetBSD на очень раннем этапе и была разработана Леннартом Аугустссоном для проекта NetBSD. Код был портирован в FreeBSD, и в настоящее время мы поддерживаем общую кодовая базу. Для реализации подсистемы USB важны некоторые особенности USB.
+
+_Леннарт Аугустссон выполнил большую часть работы по реализации поддержки USB для проекта NetBSD. Огромная благодарность за этот невероятный объем работы. Также большое спасибо Арди и Дирку за их комментарии и вычитку этой статьи._
+
+* Устройства подключаются к портам компьютера напрямую или через устройства, называемые концентраторами, образуя древовидную структуру устройств.
+* Устройства можно подключать и отключать во время работы.
+* Устройства могут приостанавливать свою работу и инициировать возобновление работы основной системы
+* Поскольку устройства могут получать питание от шины, программное обеспечение хоста должно отслеживать энергопотребление для каждого концентратора.
+* Различные требования к качеству обслуживания для разных типов устройств, а также максимум в 126 устройств, которые могут быть подключены к одной шине, требуют правильного планирования передач по общей шине, чтобы полностью использовать доступную пропускную способность в 12 Мбит/с (более 400 Мбит/с для USB 2.0)
+* Устройства являются интеллектуальными и содержат легко доступную информацию о себе
+
+Разработка драйверов для подсистемы USB и подключенных к ней устройств поддерживается спецификациями, которые были разработаны и будут разрабатываться. Эти спецификации общедоступны на домашних страницах USB. Apple активно продвигает стандартизированные драйверы, предоставляя драйверы для универсальных классов в своей операционной системе MacOS и не поощряя использование отдельных драйверов для каждого нового устройства. Эта глава пытается собрать основную информацию для базового понимания реализации стека USB 2.0 в FreeBSD/NetBSD. Однако рекомендуется читать её вместе с соответствующими спецификациями 2.0 и другими ресурсами для разработчиков:
+
+* Спецификация USB 2.0 (http://www.usb.org/developers/docs/usb20_docs/[http://www.usb.org/developers/docs/usb20_docs/])
+* Универсальный интерфейс хост-контроллера (UHCI) Спецификация (link:ftp://ftp.netbsd.org/pub/NetBSD/misc/blymn/uhci11d.pdf[ftp://ftp.netbsd.org/pub/NetBSD/misc/blymn/uhci11d.pdf])
+* Спецификация интерфейса Open Host Controller (OHCI)(link:ftp://ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf[ftp://ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf])
+* Раздел для разработчиков на домашней странице USB (http://www.usb.org/developers/[http://www.usb.org/developers/])
+
+=== Структура стека USB
+
+Поддержка USB в FreeBSD может быть разделена на три уровня. Самый нижний уровень содержит драйвер контроллера хоста, предоставляющий универсальный интерфейс к оборудованию и его механизмам планирования. Он поддерживает инициализацию оборудования, планирование передач и обработку завершённых и/или неудачных передач. Каждый драйвер контроллера хоста реализует виртуальный концентратор, обеспечивающий независимый от оборудования доступ к регистрам, управляющим корневыми портами на задней панели машины.
+
+Средний уровень обрабатывает подключение и отключение устройства, базовую инициализацию устройства, выбор драйвера, каналы связи (pipe) и управляет ресурсами. Этот сервисный уровень также контролирует стандартные каналы и запросы устройств, передаваемые через них.
+
+Верхний уровень содержит отдельные драйверы, поддерживающие конкретные (классы) устройств. Эти драйверы реализуют протокол, используемый в каналах, отличных от стандартного. Они также реализуют дополнительную функциональность для обеспечения доступа к устройству другим частям ядра или пользовательского пространства. Они используют интерфейс драйвера USB (USBDI), предоставляемый уровнем сервисов.
+
+[[usb-hc]]
+== Контроллеры хоста
+
+Хост-контроллер (HC) управляет передачей пакетов на шине. Используются кадры длительностью 1 миллисекунда. В начале каждого кадра хост-контроллер генерирует пакет Start of Frame (SOF).
+
+Пакет SOF используется для синхронизации начала кадра и отслеживания номера кадра. Внутри каждого кадра передаются пакеты, либо от хоста к устройству (исходящие), либо от устройства к хосту (входящие). Передачи всегда инициируются хостом (опросные передачи). Поэтому на каждой шине USB может быть только один хост. Каждая передача пакета имеет стадию статуса, в которой получатель данных может вернуть либо ACK (подтверждение приема), NAK (повторить), STALL (ошибка) либо ничего (искаженная стадия данных, устройство недоступно или отключено). В разделе 8.5 спецификации USB 2.0 подробно объясняются детали пакетов. На шине USB могут происходить четыре различных типа передач: управляющие, массовые, прерывания и изохронные. Типы передач и их характеристики описаны ниже.
+
+Крупные передачи между устройством на шине USB и драйвером устройства разделяются на несколько пакетов хост-контроллером или драйвером HC.
+
+Запросы устройств (управляющие передачи) к конечным точкам по умолчанию являются особыми. Они состоят из двух или трёх фаз: SETUP, DATA (опционально) и STATUS. Пакет настройки отправляется на устройство. Если присутствует фаза данных, направление пакета(ов) данных указывается в пакете настройки. Направление в фазе статуса противоположно направлению во время фазы данных или IN, если фазы данных не было. Аппаратное обеспечение хост-контроллера также предоставляет регистры с текущим состоянием корневых портов и изменениями, произошедшими с момента последнего сброса регистра изменений статуса. Доступ к этим регистрам предоставляется через виртуализированный концентратор, как предложено в спецификации USB. Виртуальный концентратор должен соответствовать классу устройств концентратора, указанному в главе 11 этой спецификации. Он должен предоставлять канал по умолчанию, через который можно отправлять запросы устройств. Он возвращает стандартные и специфичные для класса концентратора наборы дескрипторов. Также он должен предоставлять прерывающий канал, сообщающий об изменениях, происходящих на его портах. В настоящее время доступны две спецификации для хост-контроллеров: - Universal Host Controller Interface (UHCI) от Intel и Open Host Controller Interface (OHCI) от Compaq, Microsoft и National Semiconductor. Спецификация UHCI разработана для уменьшения аппаратной сложности, требуя от драйвера хост-контроллера предоставления полного расписания передач для каждого кадра. Контроллеры типа OHCI гораздо более независимы, предоставляя более абстрактный интерфейс и выполняя большую часть работы самостоятельно.
+
+=== UHCI
+
+Контроллер UHCI поддерживает список кадров (framelist) с 1024 указателями на структуры данных для каждого кадра. Он распознаёт два типа данных: дескрипторы передачи (TD) и головы очередей (QH). Каждый TD представляет пакет для передачи в конечную точку устройства или из неё. QH служат для группировки TD (и других QH) вместе.
+
+Каждая передача состоит из одного или нескольких пакетов. Драйвер UHCI разделяет большие передачи на несколько пакетов. Для каждой передачи, за исключением изохронных, выделяется QH. Для каждого типа передачи эти QH собираются в QH для соответствующего типа. Изохронные передачи должны выполняться первыми из-за требования фиксированной задержки и непосредственно указываются указателем в списке кадров. Последний изохронный TD ссылается на QH для прерывающих передач для этого кадра. Все QH для прерывающих передач указывают на QH для управляющих передач, который, в свою очередь, указывает на QH для массовых передач. Следующая диаграмма дает графическое представление этого:
+
+В результате выполняется следующее расписание в каждом кадре. После получения указателя на текущий кадр из списка кадров контроллер сначала выполняет TDs для всех изохронных пакетов в этом кадре. Последний из этих TDs ссылается на QH для прерывающих передач этого кадра. Хост-контроллер затем переходит от этого QH к QHs для отдельных прерывающих передач. После завершения этой очереди, QH для прерывающих передач ссылается на QH для всех управляющих передач. Он выполняет все подочереди, запланированные там, а затем все передачи, поставленные в очередь в QH для массовых передач. Для упрощения обработки завершенных или неудачных передач аппаратное обеспечение генерирует различные типы прерываний в конце каждого кадра. В последнем TD для передачи бит *Interrupt-On Completion* устанавливается драйвером HC, чтобы вызвать прерывание по завершении передачи. Прерывание ошибки возникает, если TD достигает максимального количества ошибок. Если в TD установлен бит *short packet detect* и передано меньше установленной длины пакета, это прерывание уведомляет драйвер контроллера о завершении передачи. Задача драйвера хост-контроллера — определить, какая передача завершилась или вызвала ошибку. При вызове процедура обслуживания прерывания находит все завершенные передачи и вызывает их callback-функции.
+
+Обратитесь к спецификации UHCI для более подробного описания.
+
+=== OHCI
+
+Программирование OHCI-контроллера значительно проще. Контроллер предполагает, что доступен набор конечных точек, и учитывает приоритеты планирования и порядок типов передач в кадре. Основная структура данных, используемая хост-контроллером, — это дескриптор конечной точки (ED), к которому присоединена очередь дескрипторов передачи (TD). ED содержит максимальный размер пакета, разрешенный для конечной точки, а аппаратное обеспечение контроллера выполняет разделение на пакеты. Указатели на буферы данных обновляются после каждой передачи, и когда начальный и конечный указатели становятся равны, TD перемещается в очередь завершенных (done-queue). Четыре типа конечных точек (прерывание, изохронная, управление и массовая) имеют свои собственные очереди. Управляющие и массовые конечные точки помещаются каждая в свою очередь. ED прерываний организуются в дерево, где уровень в дереве определяет частоту их выполнения.
+
+Порядок действий, выполняемых хост-контроллером в каждом кадре, выглядит следующим образом. Контроллер сначала запускает непериодические очереди управления и массовых передач, вплоть до ограничения времени, установленного драйвером HC. Затем выполняются прерывающие передачи для данного номера кадра, используя младшие пять битов номера кадра в качестве индекса уровня 0 дерева ED прерываний. В конце этого дерева подключены изохронные ED, которые затем обходятся. Изохронные TD содержат номер кадра, в котором должна быть запущена первая передача. После выполнения всех периодических передач очереди управления и массовых передач обходятся снова. Периодически вызывается процедура обслуживания прерывания для обработки очереди завершенных операций и вызова обратных вызовов для каждой передачи, а также для перепланирования прерывающих и изохронных конечных точек.
+
+См. UHCI Specification для более подробного описания. Средний уровень обеспечивает контролируемый доступ к устройству и управляет ресурсами, используемыми различными драйверами и уровнем сервисов. Этот уровень отвечает за следующие аспекты:
+
+* Информация о конфигурации устройства
+* Каналы для взаимодействия с устройством
+* Обнаружение, подключение и отключение от устройства.
+
+[[usb-dev]]
+== Информация об устройстве USB
+
+=== Информация о конфигурации устройства
+
+Каждое устройство предоставляет различные уровни информации о конфигурации. У каждого устройства есть одна или несколько конфигураций, из которых одна выбирается во время обнаружения/подключения. Конфигурация определяет требования к питанию и пропускной способности. В каждой конфигурации может быть несколько интерфейсов. Интерфейс устройства — это набор конечных точек. Например, USB-колонки могут иметь интерфейс для аудиоданных (Audio Class) и интерфейс для регуляторов, ручек и кнопок (HID Class). Все интерфейсы в конфигурации активны одновременно и могут быть подключены разными драйверами. Каждый интерфейс может иметь альтернативные варианты, предоставляющие различные параметры качества обслуживания. Например, в камерах это используется для поддержки разных размеров кадра и количества кадров в секунду.
+
+В каждом интерфейсе может быть указано 0 или более конечных точек. Конечные точки — это однонаправленные точки доступа для связи с устройством. Они предоставляют буферы для временного хранения входящих или исходящих данных устройства. Каждая конечная точка имеет уникальный адрес в конфигурации — номер конечной точки плюс её направление. Конечная точка по умолчанию, конечная точка 0, не является частью какого-либо интерфейса и доступна во всех конфигурациях. Она управляется уровнем сервисов и не доступна напрямую драйверам устройств.
+
+Эта иерархическая конфигурационная информация описывается в устройстве стандартным набором дескрипторов (см. раздел 9.6 спецификации USB). Они могут быть запрошены через Get Descriptor Request. Сервисный уровень кэширует эти дескрипторы, чтобы избежать ненужных передач по шине USB. Доступ к дескрипторам предоставляется через вызовы функций.
+
+* Дескрипторы устройств: Общая информация об устройстве, такая как Vendor (производитель), Product (продукт) и Revision Id (идентификатор ревизии), поддерживаемый класс устройства, подкласс и протокол, если применимо, максимальный размер пакета для конечной точки по умолчанию и т. д.
+* Дескрипторы конфигурации: количество интерфейсов в данной конфигурации, поддержка функций приостановки и возобновления работы, а также требования к питанию.
+* Дескрипторы интерфейса: класс интерфейса, подкласс и протокол (если применимо), количество альтернативных настроек интерфейса и количество конечных точек.
+* Дескрипторы конечных точек: Адрес конечной точки, направление и тип, максимальный поддерживаемый размер пакета и частота опроса, если тип является конечной точкой прерывания. Для конечной точки по умолчанию (конечная точка 0) дескриптора не существует, и она никогда не учитывается в дескрипторе интерфейса.
+* Дескрипторы строк: В остальных дескрипторах для некоторых полей указываются индексы строк. Эти индексы могут использоваться для получения описательных строк, возможно, на нескольких языках.
+
+Спецификации классов могут добавлять свои собственные типы дескрипторов, которые доступны через запрос GetDescriptor.
+
+Канальный обмен данными с конечными точками устройства осуществляется через так называемые *каналы*. Драйверы передают данные конечным точкам через канал и предоставляют функцию обратного вызова, которая вызывается при завершении или сбое передачи (асинхронные передачи) или ожидают завершения (синхронная передача). Передачи данных в конечную точку сериализуются в канале. Передача может завершиться успешно, завершиться с ошибкой или превысить время ожидания (если оно было задано). Существует два типа таймаутов для передач. Таймауты могут происходить из-за истечения времени на шине USB (миллисекунды). Эти таймауты рассматриваются как сбои и могут быть вызваны отключением устройства. Вторая форма таймаута реализована на уровне программного обеспечения и срабатывает, если передача не завершается в течение заданного времени (секунды). Это происходит, когда устройство отрицательно подтверждает (NAK) переданные пакеты. Причинами могут быть неготовность устройства к приему данных, переполнение буфера или пустой буфер, либо ошибки протокола.
+
+Если передача через канал превышает максимальный размер пакета, указанный в соответствующем дескрипторе конечной точки, хост-контроллер (OHCI) или драйвер HC (UHCI) разделит передачу на пакеты максимального размера, при этом последний пакет может быть меньше максимального размера.
+
+Иногда для устройства не является проблемой вернуть меньше данных, чем запрошено. Например, при передаче данных в режиме bulk-in на модем может быть запрошено 200 байт данных, но у модема в данный момент доступно только 5 байт. Драйвер может установить флаг короткого пакета (SPD). Это позволяет хост-контроллеру принять пакет, даже если объем переданных данных меньше запрошенного. Этот флаг действителен только для in-передач, так как объем данных, отправляемых на устройство, всегда известен заранее. Если во время передачи в устройстве происходит неустранимая ошибка, канал останавливается (stalled). Прежде чем принимать или отправлять дополнительные данные, драйвер должен устранить причину остановки и сбросить условие остановки конечной точки, отправив запрос `clear endpoint halt` через канал по умолчанию. Конечная точка по умолчанию никогда не должна останавливаться.
+
+Существует четыре различных типа конечных точек и соответствующих каналов: - Управляющий канал / канал по умолчанию: На каждое устройство приходится один управляющий канал, подключенный к конечной точке по умолчанию (конечная точка 0). Этот канал передает запросы устройства и связанные с ними данные. Разница между передачами через канал по умолчанию и другими каналами заключается в том, что протокол для этих передач описан в спецификации USB. Эти запросы используются для сброса и настройки устройства. Базовый набор команд, который должен поддерживаться каждым устройством, приведен в главе 9 спецификации USB. Команды, поддерживаемые на этом канале, могут быть расширены спецификацией класса устройства для обеспечения дополнительной функциональности.
+
+* Массовый канал: Это USB-эквивалент среды передачи данных в сыром виде.
+* Прерывающий канал: Хост отправляет запрос данных на устройство, и если устройству нечего отправлять, оно отвечает NAK на пакет данных. Прерывающие передачи планируются с частотой, указанной при создании канала.
+* Изохронный канал: Эти каналы предназначены для изохронных данных, например, видео- или аудиопотоков, с фиксированной задержкой, но без гарантированной доставки. В текущей реализации доступна некоторая поддержка каналов этого типа. Пакеты в управляющих, массовых и прерывающих передачах повторяются, если во время передачи возникает ошибка или устройство отрицательно подтверждает пакет (NAK) из-за, например, нехватки буферного пространства для хранения входящих данных. Однако изохронные пакеты не повторяются в случае неудачной доставки или NAK пакета, так как это может нарушить временные ограничения.
+
+Доступность необходимой полосы пропускания рассчитывается во время создания канала. Передачи планируются в рамках интервалов в 1 миллисекунду. Распределение полосы пропускания внутри интервала регламентируется спецификацией USB, раздел 5.6 [2]. Изохронные и прерывающие передачи могут использовать до 90% полосы пропускания в рамках интервала. Пакеты для управляющих и массовых передач планируются после всех изохронных и прерывающих пакетов и используют всю оставшуюся полосу пропускания.
+
+Дополнительная информация о планировании передач и освобождении пропускной способности доступна в главе 5 спецификации USB, разделе 1.3 спецификации UHCI и разделе 3.4.2 спецификации OHCI.
+
+[[usb-devprobe]]
+== Обнаружение устройства и подключение
+
+После уведомления от концентратора о подключении нового устройства сервисный уровень включает порт, предоставляя устройству ток 100 мА. На этом этапе устройство находится в своём исходном состоянии и прослушивает адрес устройства 0. Сервисный уровень продолжит получение различных дескрипторов через стандартный канал. После этого он отправит запрос Set Address, чтобы переместить устройство с исходного адреса (адрес 0). Несколько драйверов устройств могут поддерживать данное устройство. Например, драйвер модема может поддерживать ISDN TA через интерфейс совместимости AT. Однако драйвер, предназначенный для конкретной модели ISDN-адаптера, может обеспечить гораздо лучшую поддержку этого устройства. Для обеспечения такой гибкости пробы возвращают приоритеты, указывающие уровень их поддержки. Поддержка конкретной версии продукта имеет наивысший приоритет, а универсальный драйвер — самый низкий. Также возможно, что несколько драйверов могут быть подключены к одному устройству, если в одной конфигурации присутствует несколько интерфейсов. Каждому драйверу требуется поддерживать только подмножество интерфейсов.
+
+Поиск драйвера для нового подключенного устройства сначала проверяет наличие специфичных для устройства драйверов. Если они не найдены, код проверки перебирает все поддерживаемые конфигурации, пока драйвер не будет подключен в одной из них. Для поддержки устройств с несколькими драйверами на разных интерфейсах проверка перебирает все интерфейсы в конфигурации, которые ещё не были заняты драйвером. Конфигурации, превышающие выделенный бюджет мощности для концентратора, игнорируются. Во время подключения драйвер должен инициализировать устройство в его рабочее состояние, но не сбрасывать его, так как это приведёт к отключению устройства от шины и перезапуску процесса проверки. Чтобы избежать излишнего потребления пропускной способности, не следует запрашивать канал прерывания во время подключения, а отложить его выделение до момента открытия файла и фактического использования данных. При закрытии файла канал следует снова закрыть, даже если устройство остаётся подключенным.
+
+=== Отключение и извлечение устройства
+
+Драйвер устройства должен ожидать получения ошибок во время любой транзакции с устройством. Дизайн USB поддерживает и поощряет отключение устройств в любой момент времени. Драйверы должны гарантировать корректную обработку ситуаций, когда устройство исчезает.
+
+Кроме того, устройство, которое было отключено и снова подключено, не будет повторно присоединено к тому же экземпляру устройства. Это может измениться в будущем, когда больше устройств будут поддерживать серийные номера (см. дескриптор устройства) или будут разработаны другие способы определения идентификатора устройства.
+
+Отключение устройства сигнализируется концентратором в пакете прерывания, передаваемом драйверу концентратора. Информация об изменении состояния указывает, на каком порту произошло изменение подключения. Метод отключения устройства для всех драйверов устройств, подключенных к этому порту, вызывается, и структуры очищаются. Если состояние порта указывает, что за это время к порту было подключено устройство, начнется процедура обнаружения и подключения устройства. Сброс устройства вызовет последовательность отключения-подключения на концентраторе и будет обработан, как описано выше.
+
+[[usb-protocol]]
+== Информация о протоколе драйверов USB
+
+Используемый протокол для каналов, отличных от стандартного, не определен спецификацией USB. Информацию об этом можно найти из различных источников. Наиболее точный источник — раздел для разработчиков на домашних страницах USB. На этих страницах доступно растущее количество спецификаций классов устройств. Эти спецификации определяют, каким должно быть совместимое устройство с точки зрения драйвера, базовую функциональность, которую оно должно предоставлять, и протокол, используемый на каналах связи. Спецификация USB включает описание класса концентраторов (Hub Class). Спецификация класса устройств человеко-машинного интерфейса (HID) была создана для поддержки клавиатур, планшетов, сканеров штрих-кодов, кнопок, регуляторов, переключателей и т. д. Третий пример — спецификация класса устройств хранения данных (Mass Storage). Полный список классов устройств можно найти в разделе для разработчиков на домашних страницах USB.
+
+Для многих устройств информация о протоколе ещё не опубликована. Сведения об используемом протоколе могут быть доступны у компании-производителя устройства. Некоторые компании потребуют подписания соглашения о неразглашении (NDA), прежде чем предоставить спецификации. В большинстве случаев это исключает возможность сделать драйвер открытым.
+
+Еще один хороший источник информации — исходные коды драйверов Linux, так как ряд компаний начал предоставлять драйверы для Linux для своих устройств. Всегда полезно связаться с авторами этих драйверов для получения информации.
+
+Пример: Устройства интерфейса пользователя (HID) — Спецификация для устройств интерфейса пользователя, таких как клавиатуры, мыши, планшеты, кнопки, регуляторы и т.д., упоминается в других спецификациях классов устройств и используется во многих устройствах.
+
+Например, аудиоколонки предоставляют конечные точки для цифро-аналоговых преобразователей и, возможно, дополнительный канал для микрофона. Они также предоставляют конечную точку HID в отдельном интерфейсе для кнопок и регуляторов на передней панели устройства. То же самое справедливо для класса управления монитором. Реализовать поддержку этих интерфейсов достаточно просто с помощью доступных библиотек ядра и пользовательского пространства, а также драйвера класса HID или универсального драйвера. Другим примером устройства с несколькими интерфейсами в одной конфигурации, управляемыми разными драйверами, является недорогая клавиатура со встроенным устаревшим портом для мыши. Чтобы избежать затрат на включение аппаратного обеспечения USB-концентратора в устройство, производители объединили данные мыши, полученные с порта PS/2 на задней панели клавиатуры, и нажатия клавиш в два отдельных интерфейса в одной конфигурации. Драйверы мыши и клавиатуры подключаются к соответствующему интерфейсу и выделяют каналы для двух независимых конечных точек.
+
+Пример: Загрузка микропрограммы — многие разработанные устройства основаны на процессоре общего назначения с добавленным USB-ядром. Поскольку разработка драйверов и микропрограмм для USB-устройств всё ещё очень нова, многие устройства требуют загрузки микропрограммы после подключения.
+
+Процедура выполняется следующим образом. Устройство идентифицирует себя через идентификаторы производителя и продукта. Первый драйвер проверяет его и подключается к нему, затем загружает в него микропрограмму. После этого устройство выполняет мягкую перезагрузку, и драйвер отключается. После небольшой паузы устройство снова появляется на шине. При этом идентификаторы производителя, продукта и версии устройства изменятся, что отражает факт загрузки микропрограммы, и в результате второй драйвер проверит его и подключится к нему.
+
+Примером таких устройств является плата ввода-вывода ActiveWire, основанная на чипе EZ-USB. Для этого чипа доступен универсальный загрузчик микропрограмм. Микропрограмма, загруженная в плату ActiveWire, изменяет идентификатор ревизии. Затем выполняется мягкий сброс USB-части чипа EZ-USB для отключения от USB-шины и повторного подключения.
+
+Пример: Поддержка устройств хранения данных в основном построена на существующих протоколах. Устройство Iomega USB Zipdrive основано на SCSI-версии их накопителя. SCSI-команды и статусные сообщения упаковываются в блоки и передаются через массовые каналы к устройству и от него, эмулируя SCSI-контроллер через USB-соединение. ATAPI и UFI команды поддерживаются аналогичным образом.
+
+Спецификация Mass Storage поддерживает 2 различных типа обёртки командного блока. Первоначальная попытка была основана на отправке команды и состояния через канал по умолчанию с использованием массовых передач для данных, перемещаемых между хостом и устройством. На основе опыта был разработан второй подход, основанный на обёртке командных и статусных блоков и их отправке через конечные точки массовой передачи (bulk out и bulk in). Спецификация точно определяет, что должно происходить и когда, а также что необходимо делать в случае возникновения ошибки. Наибольшую сложность при написании драйверов для таких устройств представляет встраивание USB-ориентированного протокола в существующую поддержку устройств хранения данных. CAM предоставляет механизмы для этого достаточно прямолинейным способом. С ATAPI всё менее просто, так как исторически интерфейс IDE никогда не имел множества различных вариантов реализации.
+
+Поддержка USB-дисковода от Y-E Data также не прямолинейна, так как был разработан новый набор команд.
diff --git a/documentation/content/ru/books/arch-handbook/usb/_index.po b/documentation/content/ru/books/arch-handbook/usb/_index.po
new file mode 100644
index 0000000000..9cb9288b11
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/usb/_index.po
@@ -0,0 +1,1200 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-07-12 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookusb_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:1
+#, no-wrap
+msgid "USB Devices in FreeBSD"
+msgstr "Устройства USB в FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:1
+#, no-wrap
+msgid "Chapter 13. USB Devices"
+msgstr "Глава 13. USB-устройства"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:14
+#, no-wrap
+msgid "USB Devices"
+msgstr "Устройства USB"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:52
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:55
+msgid ""
+"The Universal Serial Bus (USB) is a new way of attaching devices to personal "
+"computers. The bus architecture features two-way communication and has been "
+"developed as a response to devices becoming smarter and requiring more "
+"interaction with the host. USB support is included in all current PC "
+"chipsets and is therefore available in all recently built PCs. Apple's "
+"introduction of the USB-only iMac has been a major incentive for hardware "
+"manufacturers to produce USB versions of their devices. The future PC "
+"specifications specify that all legacy connectors on PCs should be replaced "
+"by one or more USB connectors, providing generic plug and play capabilities. "
+"Support for USB hardware was available at a very early stage in NetBSD and "
+"was developed by Lennart Augustsson for the NetBSD project. The code has "
+"been ported to FreeBSD and we are currently maintaining a shared code base. "
+"For the implementation of the USB subsystem a number of features of USB are "
+"important."
+msgstr ""
+"Универсальная последовательная шина (USB) — это новый способ подключения "
+"устройств к персональным компьютерам. Архитектура шины поддерживает "
+"двустороннюю связь и была разработана в ответ на усложнение устройств, "
+"требующих большего взаимодействия с хостом. Поддержка USB включена во все "
+"современные чипсеты ПК и, следовательно, доступна во всех недавно собранных "
+"компьютерах. Выпуск Apple iMac только с USB стал серьёзным стимулом для "
+"производителей оборудования выпускать USB-версии своих устройств. Согласно "
+"будущим спецификациям ПК, все устаревшие разъёмы должны быть заменены одним "
+"или несколькими USB-разъёмами, обеспечивающими универсальные возможности "
+"plug and play. Поддержка USB-оборудования появилась в NetBSD на очень раннем "
+"этапе и была разработана Леннартом Аугустссоном для проекта NetBSD. Код был "
+"портирован в FreeBSD, и в настоящее время мы поддерживаем общую кодовая "
+"базу. Для реализации подсистемы USB важны некоторые особенности USB."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:57
+msgid ""
+"_Lennart Augustsson has done most of the implementation of the USB support "
+"for the NetBSD project. Many thanks for this incredible amount of work. Many "
+"thanks also to Ardy and Dirk for their comments and proofreading of this "
+"paper._"
+msgstr ""
+"_Леннарт Аугустссон выполнил большую часть работы по реализации поддержки "
+"USB для проекта NetBSD. Огромная благодарность за этот невероятный объем "
+"работы. Также большое спасибо Арди и Дирку за их комментарии и вычитку этой "
+"статьи._"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:59
+msgid ""
+"Devices connect to ports on the computer directly or on devices called hubs, "
+"forming a treelike device structure."
+msgstr ""
+"Устройства подключаются к портам компьютера напрямую или через устройства, "
+"называемые концентраторами, образуя древовидную структуру устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:60
+msgid "The devices can be connected and disconnected at run time."
+msgstr "Устройства можно подключать и отключать во время работы."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:61
+msgid "Devices can suspend themselves and trigger resumes of the host system"
+msgstr ""
+"Устройства могут приостанавливать свою работу и инициировать возобновление "
+"работы основной системы"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:62
+msgid ""
+"As the devices can be powered from the bus, the host software has to keep "
+"track of power budgets for each hub."
+msgstr ""
+"Поскольку устройства могут получать питание от шины, программное обеспечение "
+"хоста должно отслеживать энергопотребление для каждого концентратора."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:63
+msgid ""
+"Different quality of service requirements by the different device types "
+"together with the maximum of 126 devices that can be connected to the same "
+"bus, require proper scheduling of transfers on the shared bus to take full "
+"advantage of the 12Mbps bandwidth available. (over 400Mbps with USB 2.0)"
+msgstr ""
+"Различные требования к качеству обслуживания для разных типов устройств, а "
+"также максимум в 126 устройств, которые могут быть подключены к одной шине, "
+"требуют правильного планирования передач по общей шине, чтобы полностью "
+"использовать доступную пропускную способность в 12 Мбит/с (более 400 Мбит/с "
+"для USB 2.0)"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:64
+msgid ""
+"Devices are intelligent and contain easily accessible information about "
+"themselves"
+msgstr ""
+"Устройства являются интеллектуальными и содержат легко доступную информацию "
+"о себе"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:66
+msgid ""
+"The development of drivers for the USB subsystem and devices connected to it "
+"is supported by the specifications that have been developed and will be "
+"developed. These specifications are publicly available from the USB home "
+"pages. Apple has been very strong in pushing for standards based drivers, by "
+"making drivers for the generic classes available in their operating system "
+"MacOS and discouraging the use of separate drivers for each new device. This "
+"chapter tries to collate essential information for a basic understanding of "
+"the USB 2.0 implementation stack in FreeBSD/NetBSD. It is recommended "
+"however to read it together with the relevant 2.0 specifications and other "
+"developer resources:"
+msgstr ""
+"Разработка драйверов для подсистемы USB и подключенных к ней устройств "
+"поддерживается спецификациями, которые были разработаны и будут "
+"разрабатываться. Эти спецификации общедоступны на домашних страницах USB. "
+"Apple активно продвигает стандартизированные драйверы, предоставляя драйверы "
+"для универсальных классов в своей операционной системе MacOS и не поощряя "
+"использование отдельных драйверов для каждого нового устройства. Эта глава "
+"пытается собрать основную информацию для базового понимания реализации стека "
+"USB 2.0 в FreeBSD/NetBSD. Однако рекомендуется читать её вместе с "
+"соответствующими спецификациями 2.0 и другими ресурсами для разработчиков:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:68
+msgid ""
+"USB 2.0 Specification (http://www.usb.org/developers/docs/usb20_docs/[http://"
+"www.usb.org/developers/docs/usb20_docs/])"
+msgstr ""
+"Спецификация USB 2.0 (http://www.usb.org/developers/docs/usb20_docs/[http://"
+"www.usb.org/developers/docs/usb20_docs/])"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:69
+msgid ""
+"Universal Host Controller Interface (UHCI) Specification (link:ftp://"
+"ftp.netbsd.org/pub/NetBSD/misc/blymn/uhci11d.pdf[ftp://ftp.netbsd.org/pub/"
+"NetBSD/misc/blymn/uhci11d.pdf)]"
+msgstr ""
+"Универсальный интерфейс хост-контроллера (UHCI) Спецификация (link:ftp://"
+"ftp.netbsd.org/pub/NetBSD/misc/blymn/uhci11d.pdf[ftp://ftp.netbsd.org/pub/"
+"NetBSD/misc/blymn/uhci11d.pdf])"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:70
+msgid ""
+"Open Host Controller Interface (OHCI) Specification(link:ftp://"
+"ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf[ftp://"
+"ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf])"
+msgstr ""
+"Спецификация интерфейса Open Host Controller (OHCI)(link:ftp://"
+"ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf[ftp://"
+"ftp.compaq.com/pub/supportinformation/papers/hcir1_0a.pdf])"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:71
+msgid ""
+"Developer section of USB home page (http://www.usb.org/developers/[http://"
+"www.usb.org/developers/])"
+msgstr ""
+"Раздел для разработчиков на домашней странице USB (http://www.usb.org/"
+"developers/[http://www.usb.org/developers/])"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:72
+#, no-wrap
+msgid "Structure of the USB Stack"
+msgstr "Структура стека USB"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:75
+msgid ""
+"The USB support in FreeBSD can be split into three layers. The lowest layer "
+"contains the host controller driver, providing a generic interface to the "
+"hardware and its scheduling facilities. It supports initialisation of the "
+"hardware, scheduling of transfers and handling of completed and/or failed "
+"transfers. Each host controller driver implements a virtual hub providing "
+"hardware independent access to the registers controlling the root ports on "
+"the back of the machine."
+msgstr ""
+"Поддержка USB в FreeBSD может быть разделена на три уровня. Самый нижний "
+"уровень содержит драйвер контроллера хоста, предоставляющий универсальный "
+"интерфейс к оборудованию и его механизмам планирования. Он поддерживает "
+"инициализацию оборудования, планирование передач и обработку завершённых и/"
+"или неудачных передач. Каждый драйвер контроллера хоста реализует "
+"виртуальный концентратор, обеспечивающий независимый от оборудования доступ "
+"к регистрам, управляющим корневыми портами на задней панели машины."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:77
+msgid ""
+"The middle layer handles the device connection and disconnection, basic "
+"initialisation of the device, driver selection, the communication channels "
+"(pipes) and does resource management. This services layer also controls the "
+"default pipes and the device requests transferred over them."
+msgstr ""
+"Средний уровень обрабатывает подключение и отключение устройства, базовую "
+"инициализацию устройства, выбор драйвера, каналы связи (pipe) и управляет "
+"ресурсами. Этот сервисный уровень также контролирует стандартные каналы и "
+"запросы устройств, передаваемые через них."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:79
+msgid ""
+"The top layer contains the individual drivers supporting specific (classes "
+"of) devices. These drivers implement the protocol that is used over the "
+"pipes other than the default pipe. They also implement additional "
+"functionality to make the device available to other parts of the kernel or "
+"userland. They use the USB driver interface (USBDI) exposed by the services "
+"layer."
+msgstr ""
+"Верхний уровень содержит отдельные драйверы, поддерживающие конкретные "
+"(классы) устройств. Эти драйверы реализуют протокол, используемый в каналах, "
+"отличных от стандартного. Они также реализуют дополнительную "
+"функциональность для обеспечения доступа к устройству другим частям ядра или "
+"пользовательского пространства. Они используют интерфейс драйвера USB "
+"(USBDI), предоставляемый уровнем сервисов."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:81
+#, no-wrap
+msgid "Host Controllers"
+msgstr "Контроллеры хоста"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:84
+msgid ""
+"The host controller (HC) controls the transmission of packets on the bus. "
+"Frames of 1 millisecond are used. At the start of each frame the host "
+"controller generates a Start of Frame (SOF) packet."
+msgstr ""
+"Хост-контроллер (HC) управляет передачей пакетов на шине. Используются кадры "
+"длительностью 1 миллисекунда. В начале каждого кадра хост-контроллер "
+"генерирует пакет Start of Frame (SOF)."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:86
+msgid ""
+"The SOF packet is used to synchronise to the start of the frame and to keep "
+"track of the frame number. Within each frame packets are transferred, either "
+"from host to device (out) or from device to host (in). Transfers are always "
+"initiated by the host (polled transfers). Therefore there can only be one "
+"host per USB bus. Each transfer of a packet has a status stage in which the "
+"recipient of the data can return either ACK (acknowledge reception), NAK "
+"(retry), STALL (error condition) or nothing (garbled data stage, device not "
+"available or disconnected). Section 8.5 of the USB 2.0 Specification "
+"explains the details of packets in more detail. Four different types of "
+"transfers can occur on a USB bus: control, bulk, interrupt and isochronous. "
+"The types of transfers and their characteristics are described below."
+msgstr ""
+"Пакет SOF используется для синхронизации начала кадра и отслеживания номера "
+"кадра. Внутри каждого кадра передаются пакеты, либо от хоста к устройству "
+"(исходящие), либо от устройства к хосту (входящие). Передачи всегда "
+"инициируются хостом (опросные передачи). Поэтому на каждой шине USB может "
+"быть только один хост. Каждая передача пакета имеет стадию статуса, в "
+"которой получатель данных может вернуть либо ACK (подтверждение приема), NAK "
+"(повторить), STALL (ошибка) либо ничего (искаженная стадия данных, "
+"устройство недоступно или отключено). В разделе 8.5 спецификации USB 2.0 "
+"подробно объясняются детали пакетов. На шине USB могут происходить четыре "
+"различных типа передач: управляющие, массовые, прерывания и изохронные. Типы "
+"передач и их характеристики описаны ниже."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:88
+msgid ""
+"Large transfers between the device on the USB bus and the device driver are "
+"split up into multiple packets by the host controller or the HC driver."
+msgstr ""
+"Крупные передачи между устройством на шине USB и драйвером устройства "
+"разделяются на несколько пакетов хост-контроллером или драйвером HC."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:90
+msgid ""
+"Device requests (control transfers) to the default endpoints are special. "
+"They consist of two or three phases: SETUP, DATA (optional) and STATUS. The "
+"set-up packet is sent to the device. If there is a data phase, the direction "
+"of the data packet(s) is given in the set-up packet. The direction in the "
+"status phase is the opposite of the direction during the data phase, or IN "
+"if there was no data phase. The host controller hardware also provides "
+"registers with the current status of the root ports and the changes that "
+"have occurred since the last reset of the status change register. Access to "
+"these registers is provided through a virtualised hub as suggested in the "
+"USB specification. The virtual hub must comply with the hub device class "
+"given in chapter 11 of that specification. It must provide a default pipe "
+"through which device requests can be sent to it. It returns the standard "
+"andhub class specific set of descriptors. It should also provide an "
+"interrupt pipe that reports changes happening at its ports. There are "
+"currently two specifications for host controllers available: Universal Host "
+"Controller Interface (UHCI) from Intel and Open Host Controller Interface "
+"(OHCI) from Compaq, Microsoft, and National Semiconductor. The UHCI "
+"specification has been designed to reduce hardware complexity by requiring "
+"the host controller driver to supply a complete schedule of the transfers "
+"for each frame. OHCI type controllers are much more independent by providing "
+"a more abstract interface doing a lot of work themselves."
+msgstr ""
+"Запросы устройств (управляющие передачи) к конечным точкам по умолчанию "
+"являются особыми. Они состоят из двух или трёх фаз: SETUP, DATA "
+"(опционально) и STATUS. Пакет настройки отправляется на устройство. Если "
+"присутствует фаза данных, направление пакета(ов) данных указывается в пакете "
+"настройки. Направление в фазе статуса противоположно направлению во время "
+"фазы данных или IN, если фазы данных не было. Аппаратное обеспечение хост-"
+"контроллера также предоставляет регистры с текущим состоянием корневых "
+"портов и изменениями, произошедшими с момента последнего сброса регистра "
+"изменений статуса. Доступ к этим регистрам предоставляется через "
+"виртуализированный концентратор, как предложено в спецификации USB. "
+"Виртуальный концентратор должен соответствовать классу устройств "
+"концентратора, указанному в главе 11 этой спецификации. Он должен "
+"предоставлять канал по умолчанию, через который можно отправлять запросы "
+"устройств. Он возвращает стандартные и специфичные для класса концентратора "
+"наборы дескрипторов. Также он должен предоставлять прерывающий канал, "
+"сообщающий об изменениях, происходящих на его портах. В настоящее время "
+"доступны две спецификации для хост-контроллеров: - Universal Host Controller "
+"Interface (UHCI) от Intel и Open Host Controller Interface (OHCI) от Compaq, "
+"Microsoft и National Semiconductor. Спецификация UHCI разработана для "
+"уменьшения аппаратной сложности, требуя от драйвера хост-контроллера "
+"предоставления полного расписания передач для каждого кадра. Контроллеры "
+"типа OHCI гораздо более независимы, предоставляя более абстрактный интерфейс "
+"и выполняя большую часть работы самостоятельно."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:91
+#, no-wrap
+msgid "UHCI"
+msgstr "UHCI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:94
+msgid ""
+"The UHCI host controller maintains a framelist with 1024 pointers to per "
+"frame data structures. It understands two different data types: transfer "
+"descriptors (TD) and queue heads (QH). Each TD represents a packet to be "
+"communicated to or from a device endpoint. QHs are a means to groupTDs (and "
+"QHs) together."
+msgstr ""
+"Контроллер UHCI поддерживает список кадров (framelist) с 1024 указателями на "
+"структуры данных для каждого кадра. Он распознаёт два типа данных: "
+"дескрипторы передачи (TD) и головы очередей (QH). Каждый TD представляет "
+"пакет для передачи в конечную точку устройства или из неё. QH служат для "
+"группировки TD (и других QH) вместе."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:96
+msgid ""
+"Each transfer consists of one or more packets. The UHCI driver splits large "
+"transfers into multiple packets. For every transfer, apart from isochronous "
+"transfers, a QH is allocated. For every type of transfer these QHs are "
+"collected at a QH for that type. Isochronous transfers have to be executed "
+"first because of the fixed latency requirement and are directly referred to "
+"by the pointer in the framelist. The last isochronous TD refers to the QH "
+"for interrupt transfers for that frame. All QHs for interrupt transfers "
+"point at the QH for control transfers, which in turn points at the QH for "
+"bulk transfers. The following diagram gives a graphical overview of this:"
+msgstr ""
+"Каждая передача состоит из одного или нескольких пакетов. Драйвер UHCI "
+"разделяет большие передачи на несколько пакетов. Для каждой передачи, за "
+"исключением изохронных, выделяется QH. Для каждого типа передачи эти QH "
+"собираются в QH для соответствующего типа. Изохронные передачи должны "
+"выполняться первыми из-за требования фиксированной задержки и "
+"непосредственно указываются указателем в списке кадров. Последний изохронный "
+"TD ссылается на QH для прерывающих передач для этого кадра. Все QH для "
+"прерывающих передач указывают на QH для управляющих передач, который, в свою "
+"очередь, указывает на QH для массовых передач. Следующая диаграмма дает "
+"графическое представление этого:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:98
+msgid ""
+"This results in the following schedule being run in each frame. After "
+"fetching the pointer for the current frame from the framelist the controller "
+"first executes the TDs for all the isochronous packets in that frame. The "
+"last of these TDs refers to the QH for the interrupt transfers for that "
+"frame. The host controller will then descend from that QH to the QHs for the "
+"individual interrupt transfers. After finishing that queue, the QH for the "
+"interrupt transfers will refer the controller to the QH for all control "
+"transfers. It will execute all the subqueues scheduled there, followed by "
+"all the transfers queued at the bulk QH. To facilitate the handling of "
+"finished or failed transfers different types of interrupts are generated by "
+"the hardware at the end of each frame. In the last TD for a transfer the "
+"Interrupt-On Completion bit is set by the HC driver to flag an interrupt "
+"when the transfer has completed. An error interrupt is flagged if a TD "
+"reaches its maximum error count. If the short packet detect bit is set in a "
+"TD and less than the set packet length is transferred this interrupt is "
+"flagged to notify the controller driver of the completed transfer. It is the "
+"host controller driver's task to find out which transfer has completed or "
+"produced an error. When called the interrupt service routine will locate all "
+"the finished transfers and call their callbacks."
+msgstr ""
+"В результате выполняется следующее расписание в каждом кадре. После "
+"получения указателя на текущий кадр из списка кадров контроллер сначала "
+"выполняет TDs для всех изохронных пакетов в этом кадре. Последний из этих "
+"TDs ссылается на QH для прерывающих передач этого кадра. Хост-контроллер "
+"затем переходит от этого QH к QHs для отдельных прерывающих передач. После "
+"завершения этой очереди, QH для прерывающих передач ссылается на QH для всех "
+"управляющих передач. Он выполняет все подочереди, запланированные там, а "
+"затем все передачи, поставленные в очередь в QH для массовых передач. Для "
+"упрощения обработки завершенных или неудачных передач аппаратное обеспечение "
+"генерирует различные типы прерываний в конце каждого кадра. В последнем TD "
+"для передачи бит *Interrupt-On Completion* устанавливается драйвером HC, "
+"чтобы вызвать прерывание по завершении передачи. Прерывание ошибки "
+"возникает, если TD достигает максимального количества ошибок. Если в TD "
+"установлен бит *short packet detect* и передано меньше установленной длины "
+"пакета, это прерывание уведомляет драйвер контроллера о завершении передачи. "
+"Задача драйвера хост-контроллера — определить, какая передача завершилась "
+"или вызвала ошибку. При вызове процедура обслуживания прерывания находит все "
+"завершенные передачи и вызывает их callback-функции."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:100
+msgid "Refer to the UHCI Specification for a more elaborate description."
+msgstr "Обратитесь к спецификации UHCI для более подробного описания."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:101
+#, no-wrap
+msgid "OHCI"
+msgstr "OHCI"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:104
+msgid ""
+"Programming an OHCI host controller is much simpler. The controller assumes "
+"that a set of endpoints is available, and is aware of scheduling priorities "
+"and the ordering of the types of transfers in a frame. The main data "
+"structure used by the host controller is the endpoint descriptor (ED) to "
+"which a queue of transfer descriptors (TDs) is attached. The ED contains the "
+"maximum packet size allowed for an endpoint and the controller hardware does "
+"the splitting into packets. The pointers to the data buffers are updated "
+"after each transfer and when the start and end pointer are equal, the TD is "
+"retired to the done-queue. The four types of endpoints (interrupt, "
+"isochronous, control, and bulk) have their own queues. Control and bulk "
+"endpoints are queued each at their own queue. Interrupt EDs are queued in a "
+"tree, with the level in the tree defining the frequency at which they run."
+msgstr ""
+"Программирование OHCI-контроллера значительно проще. Контроллер "
+"предполагает, что доступен набор конечных точек, и учитывает приоритеты "
+"планирования и порядок типов передач в кадре. Основная структура данных, "
+"используемая хост-контроллером, — это дескриптор конечной точки (ED), к "
+"которому присоединена очередь дескрипторов передачи (TD). ED содержит "
+"максимальный размер пакета, разрешенный для конечной точки, а аппаратное "
+"обеспечение контроллера выполняет разделение на пакеты. Указатели на буферы "
+"данных обновляются после каждой передачи, и когда начальный и конечный "
+"указатели становятся равны, TD перемещается в очередь завершенных (done-"
+"queue). Четыре типа конечных точек (прерывание, изохронная, управление и "
+"массовая) имеют свои собственные очереди. Управляющие и массовые конечные "
+"точки помещаются каждая в свою очередь. ED прерываний организуются в дерево, "
+"где уровень в дереве определяет частоту их выполнения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:106
+msgid ""
+"The schedule being run by the host controller in each frame looks as "
+"follows. The controller will first run the non-periodic control and bulk "
+"queues, up to a time limit set by the HC driver. Then the interrupt "
+"transfers for that frame number are run, by using the lower five bits of the "
+"frame number as an index into level 0 of the tree of interrupts EDs. At the "
+"end of this tree the isochronous EDs are connected and these are traversed "
+"subsequently. The isochronous TDs contain the frame number of the first "
+"frame the transfer should be run in. After all the periodic transfers have "
+"been run, the control and bulk queues are traversed again. Periodically the "
+"interrupt service routine is called to process the done queue and call the "
+"callbacks for each transfer and reschedule interrupt and isochronous "
+"endpoints."
+msgstr ""
+"Порядок действий, выполняемых хост-контроллером в каждом кадре, выглядит "
+"следующим образом. Контроллер сначала запускает непериодические очереди "
+"управления и массовых передач, вплоть до ограничения времени, установленного "
+"драйвером HC. Затем выполняются прерывающие передачи для данного номера "
+"кадра, используя младшие пять битов номера кадра в качестве индекса уровня 0 "
+"дерева ED прерываний. В конце этого дерева подключены изохронные ED, которые "
+"затем обходятся. Изохронные TD содержат номер кадра, в котором должна быть "
+"запущена первая передача. После выполнения всех периодических передач "
+"очереди управления и массовых передач обходятся снова. Периодически "
+"вызывается процедура обслуживания прерывания для обработки очереди "
+"завершенных операций и вызова обратных вызовов для каждой передачи, а также "
+"для перепланирования прерывающих и изохронных конечных точек."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:108
+msgid ""
+"See the UHCI Specification for a more elaborate description. The middle "
+"layer provides access to the device in a controlled way and maintains "
+"resources in use by the different drivers and the services layer. The layer "
+"takes care of the following aspects:"
+msgstr ""
+"См. UHCI Specification для более подробного описания. Средний уровень "
+"обеспечивает контролируемый доступ к устройству и управляет ресурсами, "
+"используемыми различными драйверами и уровнем сервисов. Этот уровень "
+"отвечает за следующие аспекты:"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:110
+msgid "The device configuration information"
+msgstr "Информация о конфигурации устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:111
+msgid "The pipes to communicate with a device"
+msgstr "Каналы для взаимодействия с устройством"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:112
+msgid "Probing and attaching and detaching form a device."
+msgstr "Обнаружение, подключение и отключение от устройства."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:114
+#, no-wrap
+msgid "USB Device Information"
+msgstr "Информация об устройстве USB"
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:116
+#, no-wrap
+msgid "Device Configuration Information"
+msgstr "Информация о конфигурации устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:119
+msgid ""
+"Each device provides different levels of configuration information. Each "
+"device has one or more configurations, of which one is selected during probe/"
+"attach. A configuration provides power and bandwidth requirements. Within "
+"each configuration there can be multiple interfaces. A device interface is a "
+"collection of endpoints. For example USB speakers can have an interface for "
+"the audio data (Audio Class) and an interface for the knobs, dials and "
+"buttons (HID Class). All interfaces in a configuration are active at the "
+"same time and can be attached to by different drivers. Each interface can "
+"have alternates, providing different quality of service parameters. In for "
+"example cameras this is used to provide different frame sizes and numbers of "
+"frames per second."
+msgstr ""
+"Каждое устройство предоставляет различные уровни информации о конфигурации. "
+"У каждого устройства есть одна или несколько конфигураций, из которых одна "
+"выбирается во время обнаружения/подключения. Конфигурация определяет "
+"требования к питанию и пропускной способности. В каждой конфигурации может "
+"быть несколько интерфейсов. Интерфейс устройства — это набор конечных точек. "
+"Например, USB-колонки могут иметь интерфейс для аудиоданных (Audio Class) и "
+"интерфейс для регуляторов, ручек и кнопок (HID Class). Все интерфейсы в "
+"конфигурации активны одновременно и могут быть подключены разными "
+"драйверами. Каждый интерфейс может иметь альтернативные варианты, "
+"предоставляющие различные параметры качества обслуживания. Например, в "
+"камерах это используется для поддержки разных размеров кадра и количества "
+"кадров в секунду."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:121
+msgid ""
+"Within each interface, 0 or more endpoints can be specified. Endpoints are "
+"the unidirectional access points for communicating with a device. They "
+"provide buffers to temporarily store incoming or outgoing data from the "
+"device. Each endpoint has a unique address within a configuration, the "
+"endpoint's number plus its direction. The default endpoint, endpoint 0, is "
+"not part of any interface and available in all configurations. It is managed "
+"by the services layer and not directly available to device drivers."
+msgstr ""
+"В каждом интерфейсе может быть указано 0 или более конечных точек. Конечные "
+"точки — это однонаправленные точки доступа для связи с устройством. Они "
+"предоставляют буферы для временного хранения входящих или исходящих данных "
+"устройства. Каждая конечная точка имеет уникальный адрес в конфигурации — "
+"номер конечной точки плюс её направление. Конечная точка по умолчанию, "
+"конечная точка 0, не является частью какого-либо интерфейса и доступна во "
+"всех конфигурациях. Она управляется уровнем сервисов и не доступна напрямую "
+"драйверам устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:123
+msgid ""
+"This hierarchical configuration information is described in the device by a "
+"standard set of descriptors (see section 9.6 of the USB specification). They "
+"can be requested through the Get Descriptor Request. The services layer "
+"caches these descriptors to avoid unnecessary transfers on the USB bus. "
+"Access to the descriptors is provided through function calls."
+msgstr ""
+"Эта иерархическая конфигурационная информация описывается в устройстве "
+"стандартным набором дескрипторов (см. раздел 9.6 спецификации USB). Они "
+"могут быть запрошены через Get Descriptor Request. Сервисный уровень "
+"кэширует эти дескрипторы, чтобы избежать ненужных передач по шине USB. "
+"Доступ к дескрипторам предоставляется через вызовы функций."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:125
+msgid ""
+"Device descriptors: General information about the device, like Vendor, "
+"Product and Revision Id, supported device class, subclass and protocol if "
+"applicable, maximum packet size for the default endpoint, etc."
+msgstr ""
+"Дескрипторы устройств: Общая информация об устройстве, такая как Vendor "
+"(производитель), Product (продукт) и Revision Id (идентификатор ревизии), "
+"поддерживаемый класс устройства, подкласс и протокол, если применимо, "
+"максимальный размер пакета для конечной точки по умолчанию и т. д."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:126
+msgid ""
+"Configuration descriptors: The number of interfaces in this configuration, "
+"suspend and resume functionality supported and power requirements."
+msgstr ""
+"Дескрипторы конфигурации: количество интерфейсов в данной конфигурации, "
+"поддержка функций приостановки и возобновления работы, а также требования к "
+"питанию."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:127
+msgid ""
+"Interface descriptors: interface class, subclass and protocol if applicable, "
+"number of alternate settings for the interface and the number of endpoints."
+msgstr ""
+"Дескрипторы интерфейса: класс интерфейса, подкласс и протокол (если "
+"применимо), количество альтернативных настроек интерфейса и количество "
+"конечных точек."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:128
+msgid ""
+"Endpoint descriptors: Endpoint address, direction and type, maximum packet "
+"size supported and polling frequency if type is interrupt endpoint. There is "
+"no descriptor for the default endpoint (endpoint 0) and it is never counted "
+"in an interface descriptor."
+msgstr ""
+"Дескрипторы конечных точек: Адрес конечной точки, направление и тип, "
+"максимальный поддерживаемый размер пакета и частота опроса, если тип "
+"является конечной точкой прерывания. Для конечной точки по умолчанию "
+"(конечная точка 0) дескриптора не существует, и она никогда не учитывается в "
+"дескрипторе интерфейса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:129
+msgid ""
+"String descriptors: In the other descriptors string indices are supplied for "
+"some fields.These can be used to retrieve descriptive strings, possibly in "
+"multiple languages."
+msgstr ""
+"Дескрипторы строк: В остальных дескрипторах для некоторых полей указываются "
+"индексы строк. Эти индексы могут использоваться для получения описательных "
+"строк, возможно, на нескольких языках."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:131
+msgid ""
+"Class specifications can add their own descriptor types that are available "
+"through the GetDescriptor Request."
+msgstr ""
+"Спецификации классов могут добавлять свои собственные типы дескрипторов, "
+"которые доступны через запрос GetDescriptor."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:133
+msgid ""
+"Pipes Communication to end points on a device flows through so-called pipes. "
+"Drivers submit transfers to endpoints to a pipe and provide a callback to be "
+"called on completion or failure of the transfer (asynchronous transfers) or "
+"wait for completion (synchronous transfer). Transfers to an endpoint are "
+"serialised in the pipe. A transfer can either complete, fail or time-out (if "
+"a time-out has been set). There are two types of time-outs for transfers. "
+"Time-outs can happen due to time-out on the USBbus (milliseconds). These "
+"time-outs are seen as failures and can be due to disconnection of the "
+"device. A second form of time-out is implemented in software and is "
+"triggered when a transfer does not complete within a specified amount of "
+"time (seconds). These are caused by a device acknowledging negatively (NAK) "
+"the transferred packets. The cause for this is the device not being ready to "
+"receive data, buffer under- or overrun or protocol errors."
+msgstr ""
+"Канальный обмен данными с конечными точками устройства осуществляется через "
+"так называемые *каналы*. Драйверы передают данные конечным точкам через "
+"канал и предоставляют функцию обратного вызова, которая вызывается при "
+"завершении или сбое передачи (асинхронные передачи) или ожидают завершения "
+"(синхронная передача). Передачи данных в конечную точку сериализуются в "
+"канале. Передача может завершиться успешно, завершиться с ошибкой или "
+"превысить время ожидания (если оно было задано). Существует два типа "
+"таймаутов для передач. Таймауты могут происходить из-за истечения времени на "
+"шине USB (миллисекунды). Эти таймауты рассматриваются как сбои и могут быть "
+"вызваны отключением устройства. Вторая форма таймаута реализована на уровне "
+"программного обеспечения и срабатывает, если передача не завершается в "
+"течение заданного времени (секунды). Это происходит, когда устройство "
+"отрицательно подтверждает (NAK) переданные пакеты. Причинами могут быть "
+"неготовность устройства к приему данных, переполнение буфера или пустой "
+"буфер, либо ошибки протокола."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:135
+msgid ""
+"If a transfer over a pipe is larger than the maximum packet size specified "
+"in the associated endpoint descriptor, the host controller (OHCI) or the HC "
+"driver (UHCI) will split the transfer into packets of maximum packet size, "
+"with the last packet possibly smaller than the maximum packet size."
+msgstr ""
+"Если передача через канал превышает максимальный размер пакета, указанный в "
+"соответствующем дескрипторе конечной точки, хост-контроллер (OHCI) или "
+"драйвер HC (UHCI) разделит передачу на пакеты максимального размера, при "
+"этом последний пакет может быть меньше максимального размера."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:137
+msgid ""
+"Sometimes it is not a problem for a device to return less data than "
+"requested. For example abulk-in-transfer to a modem might request 200 bytes "
+"of data, but the modem has only 5 bytes available at that time. The driver "
+"can set the short packet (SPD) flag. It allows the host controller to accept "
+"a packet even if the amount of data transferred is less than requested. This "
+"flag is only valid for in-transfers, as the amount of data to be sent to a "
+"device is always known beforehand. If an unrecoverable error occurs in a "
+"device during a transfer the pipe is stalled. Before any more data is "
+"accepted or sent the driver needs to resolve the cause of the stall and "
+"clear the endpoint stall condition through send the clear endpoint halt "
+"device request over the default pipe. The default endpoint should never "
+"stall."
+msgstr ""
+"Иногда для устройства не является проблемой вернуть меньше данных, чем "
+"запрошено. Например, при передаче данных в режиме bulk-in на модем может "
+"быть запрошено 200 байт данных, но у модема в данный момент доступно только "
+"5 байт. Драйвер может установить флаг короткого пакета (SPD). Это позволяет "
+"хост-контроллеру принять пакет, даже если объем переданных данных меньше "
+"запрошенного. Этот флаг действителен только для in-передач, так как объем "
+"данных, отправляемых на устройство, всегда известен заранее. Если во время "
+"передачи в устройстве происходит неустранимая ошибка, канал останавливается "
+"(stalled). Прежде чем принимать или отправлять дополнительные данные, "
+"драйвер должен устранить причину остановки и сбросить условие остановки "
+"конечной точки, отправив запрос `clear endpoint halt` через канал по "
+"умолчанию. Конечная точка по умолчанию никогда не должна останавливаться."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:139
+msgid ""
+"There are four different types of endpoints and corresponding pipes: - "
+"Control pipe / default pipe: There is one control pipe per device, connected "
+"to the default endpoint (endpoint 0). The pipe carries the device requests "
+"and associated data. The difference between transfers over the default pipe "
+"and other pipes is that the protocol for the transfers is described in the "
+"USB specification. These requests are used to reset and configure the "
+"device. A basic set of commands that must be supported by each device is "
+"provided in chapter 9 of the USB specification. The commands supported on "
+"this pipe can be extended by a device class specification to support "
+"additional functionality."
+msgstr ""
+"Существует четыре различных типа конечных точек и соответствующих каналов: - "
+"Управляющий канал / канал по умолчанию: На каждое устройство приходится один "
+"управляющий канал, подключенный к конечной точке по умолчанию (конечная "
+"точка 0). Этот канал передает запросы устройства и связанные с ними данные. "
+"Разница между передачами через канал по умолчанию и другими каналами "
+"заключается в том, что протокол для этих передач описан в спецификации USB. "
+"Эти запросы используются для сброса и настройки устройства. Базовый набор "
+"команд, который должен поддерживаться каждым устройством, приведен в главе 9 "
+"спецификации USB. Команды, поддерживаемые на этом канале, могут быть "
+"расширены спецификацией класса устройства для обеспечения дополнительной "
+"функциональности."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:141
+msgid "Bulk pipe: This is the USB equivalent to a raw transmission medium."
+msgstr "Массовый канал: Это USB-эквивалент среды передачи данных в сыром виде."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:142
+msgid ""
+"Interrupt pipe: The host sends a request for data to the device and if the "
+"device has nothing to send, it will NAK the data packet. Interrupt transfers "
+"are scheduled at a frequency specified when creating the pipe."
+msgstr ""
+"Прерывающий канал: Хост отправляет запрос данных на устройство, и если "
+"устройству нечего отправлять, оно отвечает NAK на пакет данных. Прерывающие "
+"передачи планируются с частотой, указанной при создании канала."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:143
+msgid ""
+"Isochronous pipe: These pipes are intended for isochronous data, for example "
+"video or audio streams, with fixed latency, but no guaranteed delivery. Some "
+"support for pipes of this type is available in the current implementation. "
+"Packets in control, bulk and interrupt transfers are retried if an error "
+"occurs during transmission or the device acknowledges the packet negatively "
+"(NAK) due to for example lack of buffer space to store the incoming data. "
+"Isochronous packets are however not retried in case of failed delivery or "
+"NAK of a packet as this might violate the timing constraints."
+msgstr ""
+"Изохронный канал: Эти каналы предназначены для изохронных данных, например, "
+"видео- или аудиопотоков, с фиксированной задержкой, но без гарантированной "
+"доставки. В текущей реализации доступна некоторая поддержка каналов этого "
+"типа. Пакеты в управляющих, массовых и прерывающих передачах повторяются, "
+"если во время передачи возникает ошибка или устройство отрицательно "
+"подтверждает пакет (NAK) из-за, например, нехватки буферного пространства "
+"для хранения входящих данных. Однако изохронные пакеты не повторяются в "
+"случае неудачной доставки или NAK пакета, так как это может нарушить "
+"временные ограничения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:145
+msgid ""
+"The availability of the necessary bandwidth is calculated during the "
+"creation of the pipe. Transfers are scheduled within frames of 1 "
+"millisecond. The bandwidth allocation within a frame is prescribed by the "
+"USB specification, section 5.6 [ 2]. Isochronous and interrupt transfers are "
+"allowed to consume up to 90% of the bandwidth within a frame. Packets for "
+"control and bulk transfers are scheduled after all isochronous and interrupt "
+"packets and will consume all the remaining bandwidth."
+msgstr ""
+"Доступность необходимой полосы пропускания рассчитывается во время создания "
+"канала. Передачи планируются в рамках интервалов в 1 миллисекунду. "
+"Распределение полосы пропускания внутри интервала регламентируется "
+"спецификацией USB, раздел 5.6 [2]. Изохронные и прерывающие передачи могут "
+"использовать до 90% полосы пропускания в рамках интервала. Пакеты для "
+"управляющих и массовых передач планируются после всех изохронных и "
+"прерывающих пакетов и используют всю оставшуюся полосу пропускания."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:147
+msgid ""
+"More information on scheduling of transfers and bandwidth reclamation can be "
+"found in chapter 5 of the USB specification, section 1.3 of the UHCI "
+"specification, and section 3.4.2 of the OHCI specification."
+msgstr ""
+"Дополнительная информация о планировании передач и освобождении пропускной "
+"способности доступна в главе 5 спецификации USB, разделе 1.3 спецификации "
+"UHCI и разделе 3.4.2 спецификации OHCI."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:149
+#, no-wrap
+msgid "Device Probe and Attach"
+msgstr "Обнаружение устройства и подключение"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:152
+msgid ""
+"After the notification by the hub that a new device has been connected, the "
+"service layer switches on the port, providing the device with 100 mA of "
+"current. At this point the device is in its default state and listening to "
+"device address 0. The services layer will proceed to retrieve the various "
+"descriptors through the default pipe. After that it will send a Set Address "
+"request to move the device away from the default device address (address 0). "
+"Multiple device drivers might be able to support the device. For example a "
+"modem driver might be able to support an ISDN TA through the AT "
+"compatibility interface. A driver for that specific model of the ISDN "
+"adapter might however be able to provide much better support for this "
+"device. To support this flexibility, the probes return priorities indicating "
+"their level of support. Support for a specific revision of a product ranks "
+"the highest and the generic driver the lowest priority. It might also be "
+"that multiple drivers could attach to one device if there are multiple "
+"interfaces within one configuration. Each driver only needs to support a "
+"subset of the interfaces."
+msgstr ""
+"После уведомления от концентратора о подключении нового устройства сервисный "
+"уровень включает порт, предоставляя устройству ток 100 мА. На этом этапе "
+"устройство находится в своём исходном состоянии и прослушивает адрес "
+"устройства 0. Сервисный уровень продолжит получение различных дескрипторов "
+"через стандартный канал. После этого он отправит запрос Set Address, чтобы "
+"переместить устройство с исходного адреса (адрес 0). Несколько драйверов "
+"устройств могут поддерживать данное устройство. Например, драйвер модема "
+"может поддерживать ISDN TA через интерфейс совместимости AT. Однако драйвер, "
+"предназначенный для конкретной модели ISDN-адаптера, может обеспечить "
+"гораздо лучшую поддержку этого устройства. Для обеспечения такой гибкости "
+"пробы возвращают приоритеты, указывающие уровень их поддержки. Поддержка "
+"конкретной версии продукта имеет наивысший приоритет, а универсальный "
+"драйвер — самый низкий. Также возможно, что несколько драйверов могут быть "
+"подключены к одному устройству, если в одной конфигурации присутствует "
+"несколько интерфейсов. Каждому драйверу требуется поддерживать только "
+"подмножество интерфейсов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:154
+msgid ""
+"The probing for a driver for a newly attached device checks first for device "
+"specific drivers. If not found, the probe code iterates over all supported "
+"configurations until a driver attaches in a configuration. To support "
+"devices with multiple drivers on different interfaces, the probe iterates "
+"over all interfaces in a configuration that have not yet been claimed by a "
+"driver. Configurations that exceed the power budget for the hub are ignored. "
+"During attach the driver should initialise the device to its proper state, "
+"but not reset it, as this will make the device disconnect itself from the "
+"bus and restart the probing process for it. To avoid consuming unnecessary "
+"bandwidth should not claim the interrupt pipe at attach time, but should "
+"postpone allocating the pipe until the file is opened and the data is "
+"actually used. When the file is closed the pipe should be closed again, even "
+"though the device might still be attached."
+msgstr ""
+"Поиск драйвера для нового подключенного устройства сначала проверяет наличие "
+"специфичных для устройства драйверов. Если они не найдены, код проверки "
+"перебирает все поддерживаемые конфигурации, пока драйвер не будет подключен "
+"в одной из них. Для поддержки устройств с несколькими драйверами на разных "
+"интерфейсах проверка перебирает все интерфейсы в конфигурации, которые ещё "
+"не были заняты драйвером. Конфигурации, превышающие выделенный бюджет "
+"мощности для концентратора, игнорируются. Во время подключения драйвер "
+"должен инициализировать устройство в его рабочее состояние, но не сбрасывать "
+"его, так как это приведёт к отключению устройства от шины и перезапуску "
+"процесса проверки. Чтобы избежать излишнего потребления пропускной "
+"способности, не следует запрашивать канал прерывания во время подключения, а "
+"отложить его выделение до момента открытия файла и фактического "
+"использования данных. При закрытии файла канал следует снова закрыть, даже "
+"если устройство остаётся подключенным."
+
+#. type: Title ===
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:155
+#, no-wrap
+msgid "Device Disconnect and Detach"
+msgstr "Отключение и извлечение устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:158
+msgid ""
+"A device driver should expect to receive errors during any transaction with "
+"the device. The design of USB supports and encourages the disconnection of "
+"devices at any point in time. Drivers should make sure that they do the "
+"right thing when the device disappears."
+msgstr ""
+"Драйвер устройства должен ожидать получения ошибок во время любой транзакции "
+"с устройством. Дизайн USB поддерживает и поощряет отключение устройств в "
+"любой момент времени. Драйверы должны гарантировать корректную обработку "
+"ситуаций, когда устройство исчезает."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:160
+msgid ""
+"Furthermore a device that has been disconnected and reconnected will not be "
+"reattached at the same device instance. This might change in the future when "
+"more devices support serial numbers (see the device descriptor) or other "
+"means of defining an identity for a device have been developed."
+msgstr ""
+"Кроме того, устройство, которое было отключено и снова подключено, не будет "
+"повторно присоединено к тому же экземпляру устройства. Это может измениться "
+"в будущем, когда больше устройств будут поддерживать серийные номера (см. "
+"дескриптор устройства) или будут разработаны другие способы определения "
+"идентификатора устройства."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:162
+msgid ""
+"The disconnection of a device is signaled by a hub in the interrupt packet "
+"delivered to the hub driver. The status change information indicates which "
+"port has seen a connection change. The device detach method for all device "
+"drivers for the device connected on that port are called and the structures "
+"cleaned up. If the port status indicates that in the mean time a device has "
+"been connected to that port, the procedure for probing and attaching the "
+"device will be started. A device reset will produce a disconnect-connect "
+"sequence on the hub and will be handled as described above."
+msgstr ""
+"Отключение устройства сигнализируется концентратором в пакете прерывания, "
+"передаваемом драйверу концентратора. Информация об изменении состояния "
+"указывает, на каком порту произошло изменение подключения. Метод отключения "
+"устройства для всех драйверов устройств, подключенных к этому порту, "
+"вызывается, и структуры очищаются. Если состояние порта указывает, что за "
+"это время к порту было подключено устройство, начнется процедура обнаружения "
+"и подключения устройства. Сброс устройства вызовет последовательность "
+"отключения-подключения на концентраторе и будет обработан, как описано выше."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:164
+#, no-wrap
+msgid "USB Drivers Protocol Information"
+msgstr "Информация о протоколе драйверов USB"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:167
+msgid ""
+"The protocol used over pipes other than the default pipe is undefined by the "
+"USB specification. Information on this can be found from various sources. "
+"The most accurate source is the developer's section on the USB home pages. "
+"From these pages, a growing number of deviceclass specifications are "
+"available. These specifications specify what a compliant device should look "
+"like from a driver perspective, basic functionality it needs to provide and "
+"the protocol that is to be used over the communication channels. The USB "
+"specification includes the description of the Hub Class. A class "
+"specification for Human Interface Devices (HID) has been created to cater "
+"for keyboards, tablets, bar-code readers, buttons, knobs, switches, etc. A "
+"third example is the class specification for mass storage devices. For a "
+"full list of device classes see the developers section on the USB home pages."
+msgstr ""
+"Используемый протокол для каналов, отличных от стандартного, не определен "
+"спецификацией USB. Информацию об этом можно найти из различных источников. "
+"Наиболее точный источник — раздел для разработчиков на домашних страницах "
+"USB. На этих страницах доступно растущее количество спецификаций классов "
+"устройств. Эти спецификации определяют, каким должно быть совместимое "
+"устройство с точки зрения драйвера, базовую функциональность, которую оно "
+"должно предоставлять, и протокол, используемый на каналах связи. "
+"Спецификация USB включает описание класса концентраторов (Hub Class). "
+"Спецификация класса устройств человеко-машинного интерфейса (HID) была "
+"создана для поддержки клавиатур, планшетов, сканеров штрих-кодов, кнопок, "
+"регуляторов, переключателей и т. д. Третий пример — спецификация класса "
+"устройств хранения данных (Mass Storage). Полный список классов устройств "
+"можно найти в разделе для разработчиков на домашних страницах USB."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:169
+msgid ""
+"For many devices the protocol information has not yet been published "
+"however. Information on the protocol being used might be available from the "
+"company making the device. Some companies will require you to sign a Non "
+"-Disclosure Agreement (NDA) before giving you the specifications. This in "
+"most cases precludes making the driver open source."
+msgstr ""
+"Для многих устройств информация о протоколе ещё не опубликована. Сведения об "
+"используемом протоколе могут быть доступны у компании-производителя "
+"устройства. Некоторые компании потребуют подписания соглашения о "
+"неразглашении (NDA), прежде чем предоставить спецификации. В большинстве "
+"случаев это исключает возможность сделать драйвер открытым."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:171
+msgid ""
+"Another good source of information is the Linux driver sources, as a number "
+"of companies have started to provide drivers for Linux for their devices. It "
+"is always a good idea to contact the authors of those drivers for their "
+"source of information."
+msgstr ""
+"Еще один хороший источник информации — исходные коды драйверов Linux, так "
+"как ряд компаний начал предоставлять драйверы для Linux для своих устройств. "
+"Всегда полезно связаться с авторами этих драйверов для получения информации."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:173
+msgid ""
+"Example: Human Interface Devices The specification for the Human Interface "
+"Devices like keyboards, mice, tablets, buttons, dials,etc. is referred to in "
+"other device class specifications and is used in many devices."
+msgstr ""
+"Пример: Устройства интерфейса пользователя (HID) — Спецификация для "
+"устройств интерфейса пользователя, таких как клавиатуры, мыши, планшеты, "
+"кнопки, регуляторы и т.д., упоминается в других спецификациях классов "
+"устройств и используется во многих устройствах."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:175
+msgid ""
+"For example audio speakers provide endpoints to the digital to analogue "
+"converters and possibly an extra pipe for a microphone. They also provide a "
+"HID endpoint in a separate interface for the buttons and dials on the front "
+"of the device. The same is true for the monitor control class. It is "
+"straightforward to build support for these interfaces through the available "
+"kernel and userland libraries together with the HID class driver or the "
+"generic driver. Another device that serves as an example for interfaces "
+"within one configuration driven by different device drivers is a cheap "
+"keyboard with built-in legacy mouse port. To avoid having the cost of "
+"including the hardware for a USB hub in the device, manufacturers combined "
+"the mouse data received from the PS/2 port on the back of the keyboard and "
+"the key presses from the keyboard into two separate interfaces in the same "
+"configuration. The mouse and keyboard drivers each attach to the appropriate "
+"interface and allocate the pipes to the two independent endpoints."
+msgstr ""
+"Например, аудиоколонки предоставляют конечные точки для цифро-аналоговых "
+"преобразователей и, возможно, дополнительный канал для микрофона. Они также "
+"предоставляют конечную точку HID в отдельном интерфейсе для кнопок и "
+"регуляторов на передней панели устройства. То же самое справедливо для "
+"класса управления монитором. Реализовать поддержку этих интерфейсов "
+"достаточно просто с помощью доступных библиотек ядра и пользовательского "
+"пространства, а также драйвера класса HID или универсального драйвера. "
+"Другим примером устройства с несколькими интерфейсами в одной конфигурации, "
+"управляемыми разными драйверами, является недорогая клавиатура со встроенным "
+"устаревшим портом для мыши. Чтобы избежать затрат на включение аппаратного "
+"обеспечения USB-концентратора в устройство, производители объединили данные "
+"мыши, полученные с порта PS/2 на задней панели клавиатуры, и нажатия клавиш "
+"в два отдельных интерфейса в одной конфигурации. Драйверы мыши и клавиатуры "
+"подключаются к соответствующему интерфейсу и выделяют каналы для двух "
+"независимых конечных точек."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:177
+msgid ""
+"Example: Firmware download Many devices that have been developed are based "
+"on a general purpose processor with an additional USB core added to it. "
+"Since the development of drivers and firmware for USB devices is still very "
+"new, many devices require the downloading of the firmware after they have "
+"been connected."
+msgstr ""
+"Пример: Загрузка микропрограммы — многие разработанные устройства основаны "
+"на процессоре общего назначения с добавленным USB-ядром. Поскольку "
+"разработка драйверов и микропрограмм для USB-устройств всё ещё очень нова, "
+"многие устройства требуют загрузки микропрограммы после подключения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:179
+msgid ""
+"The procedure followed is straightforward. The device identifies itself "
+"through a vendor and product Id. The first driver probes and attaches to it "
+"and downloads the firmware into it. After that the device soft resets itself "
+"and the driver is detached. After a short pause the device announces its "
+"presence on the bus. The device will have changed its vendor/product/"
+"revision Id to reflect the fact that it has been supplied with firmware and "
+"as a consequence a second driver will probe it and attach to it."
+msgstr ""
+"Процедура выполняется следующим образом. Устройство идентифицирует себя "
+"через идентификаторы производителя и продукта. Первый драйвер проверяет его "
+"и подключается к нему, затем загружает в него микропрограмму. После этого "
+"устройство выполняет мягкую перезагрузку, и драйвер отключается. После "
+"небольшой паузы устройство снова появляется на шине. При этом идентификаторы "
+"производителя, продукта и версии устройства изменятся, что отражает факт "
+"загрузки микропрограммы, и в результате второй драйвер проверит его и "
+"подключится к нему."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:181
+msgid ""
+"An example of these types of devices is the ActiveWire I/O board, based on "
+"the EZ-USB chip. For this chip a generic firmware downloader is available. "
+"The firmware downloaded into the ActiveWire board changes the revision Id. "
+"It will then perform a soft reset of the USB part of the EZ-USB chip to "
+"disconnect from the USB bus and again reconnect."
+msgstr ""
+"Примером таких устройств является плата ввода-вывода ActiveWire, основанная "
+"на чипе EZ-USB. Для этого чипа доступен универсальный загрузчик "
+"микропрограмм. Микропрограмма, загруженная в плату ActiveWire, изменяет "
+"идентификатор ревизии. Затем выполняется мягкий сброс USB-части чипа EZ-USB "
+"для отключения от USB-шины и повторного подключения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:183
+msgid ""
+"Example: Mass Storage Devices Support for mass storage devices is mainly "
+"built around existing protocols. The Iomega USB Zipdrive is based on the "
+"SCSI version of their drive. The SCSI commands and status messages are "
+"wrapped in blocks and transferred over the bulk pipes to and from the "
+"device, emulating a SCSI controller over the USB wire. ATAPI and UFI "
+"commands are supported in a similar fashion."
+msgstr ""
+"Пример: Поддержка устройств хранения данных в основном построена на "
+"существующих протоколах. Устройство Iomega USB Zipdrive основано на SCSI-"
+"версии их накопителя. SCSI-команды и статусные сообщения упаковываются в "
+"блоки и передаются через массовые каналы к устройству и от него, эмулируя "
+"SCSI-контроллер через USB-соединение. ATAPI и UFI команды поддерживаются "
+"аналогичным образом."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:185
+msgid ""
+"The Mass Storage Specification supports 2 different types of wrapping of the "
+"command block.The initial attempt was based on sending the command and "
+"status through the default pipe and using bulk transfers for the data to be "
+"moved between the host and the device. Based on experience a second approach "
+"was designed that was based on wrapping the command and status blocks and "
+"sending them over the bulk out and in endpoint. The specification specifies "
+"exactly what has to happen when and what has to be done in case an error "
+"condition is encountered. The biggest challenge when writing drivers for "
+"these devices is to fit USB based protocol into the existing support for "
+"mass storage devices. CAM provides hooks to do this in a fairly straight "
+"forward way. ATAPI is less simple as historically the IDE interface has "
+"never had many different appearances."
+msgstr ""
+"Спецификация Mass Storage поддерживает 2 различных типа обёртки командного "
+"блока. Первоначальная попытка была основана на отправке команды и состояния "
+"через канал по умолчанию с использованием массовых передач для данных, "
+"перемещаемых между хостом и устройством. На основе опыта был разработан "
+"второй подход, основанный на обёртке командных и статусных блоков и их "
+"отправке через конечные точки массовой передачи (bulk out и bulk in). "
+"Спецификация точно определяет, что должно происходить и когда, а также что "
+"необходимо делать в случае возникновения ошибки. Наибольшую сложность при "
+"написании драйверов для таких устройств представляет встраивание USB-"
+"ориентированного протокола в существующую поддержку устройств хранения "
+"данных. CAM предоставляет механизмы для этого достаточно прямолинейным "
+"способом. С ATAPI всё менее просто, так как исторически интерфейс IDE "
+"никогда не имел множества различных вариантов реализации."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/usb/_index.adoc:186
+msgid ""
+"The support for the USB floppy from Y-E Data is again less straightforward "
+"as a new command set has been designed."
+msgstr ""
+"Поддержка USB-дисковода от Y-E Data также не прямолинейна, так как был "
+"разработан новый набор команд."
diff --git a/documentation/content/ru/books/arch-handbook/vm/_index.adoc b/documentation/content/ru/books/arch-handbook/vm/_index.adoc
new file mode 100644
index 0000000000..25c363a04b
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/vm/_index.adoc
@@ -0,0 +1,127 @@
+---
+description: 'Система управления виртуальной памятью во FreeBSD'
+next: books/arch-handbook/smp
+params:
+ path: /books/arch-handbook/vm/
+prev: books/arch-handbook/mac
+showBookMenu: true
+tags: ["Virtual memory", "vm_page_t", "vm_object_t", "I/O", "KVM"]
+title: 'Глава 7. Система управления виртуальной памятью'
+weight: 8
+---
+
+[[vm]]
+= Система управления виртуальной памятью
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 7
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/arch-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[vm-physmem]]
+== Управление физической памятью `vm_page_t`
+
+Физическая память управляется постранично с использованием структуры `vm_page_t`. Страницы физической памяти классифицируются посредством размещения соответствующих структур `vm_page_t` в одной из нескольких очередей подкачки.
+
+Страница может находиться в одном из следующих состояний: зафиксированном (Wired), активном (Active), неактивном (Inactive), кэшированном (Cache) или свободном (Free). За исключением зафиксированного состояния, страница обычно помещается в двусвязный список, представляющий её текущее состояние. Зафиксированные страницы не помещаются ни в одну из очередей.
+
+FreeBSD реализует более сложную очередь подкачки для кэшированных и свободных страниц с целью реализации раскраски страниц. Каждое из этих состояний включает несколько очередей, организованных в соответствии с размерами кэшей L1 и L2 процессора. Когда требуется выделить новую страницу, FreeBSD пытается получить такую, которая будет достаточно хорошо выровнена с точки зрения кэшей L1 и L2 относительно объекта виртуальной памяти, для которого выделяется страница.
+
+Кроме того, страница может удерживаться с помощью счётчика ссылок или быть заблокированной с помощью счётчика занятости. Система виртуальной памяти также реализует состояние «абсолютной блокировки» страницы с использованием бита PG_BUSY в флагах страницы.
+
+В общем случае каждая из очередей подкачки работает по принципу LRU (наименее недавно использованная). Обычно страница изначально помещается в зафиксированное или активное состояние. В зафиксированном состоянии страница, как правило, ассоциирована с какой-либо таблицей страниц. Система виртуальной памяти «состаривает» страницу, просматривая страницы в более активной очереди страниц (LRU), чтобы переместить их в менее активную очередь. Страницы, перемещённые в кэш, всё ещё связаны с объектом виртуальной памяти, но могут быть немедленно повторно использованы. Страницы в очереди свободных действительно являются полностью свободными. FreeBSD стремится минимизировать количество страниц в очереди свободных, но определённый минимальный объём таких страниц должен поддерживаться для обеспечения возможности выделения памяти во время обработки прерываний.
+
+Если процесс пытается обратиться к странице, которой нет в его таблице страниц, но которая присутствует в одной из очередей подкачки (например, в неактивной или кэшированной), происходит относительно недорогой сбой повторной активации страницы, в результате которого страница повторно активируется. Если же страницы вообще нет в памяти системы, процесс вынужден блокироваться до тех пор, пока страница не будет загружена с диска.
+
+FreeBSD динамически настраивает свои очереди страниц и старается поддерживать разумные пропорции количества страниц в различных очередях, а также сбалансированное соотношение чистых и грязных страниц. Объём перераспределения зависит от текущей нагрузки на память системы. Это перераспределение выполняется демоном выгрузки страниц (pageout daemon) и включает в себя очистку (laundering) грязных страниц (синхронизацию их с резервным хранилищем), отслеживание активности страниц по ссылкам на них (сброс их положения в очередях LRU или перемещение между очередями), миграцию страниц между очередями при разбалансировке очередей и другие действия. Система виртуальной памяти FreeBSD допускает определённое количество сбоев повторной активации страниц, чтобы точнее определить, насколько страница фактически активна или неактивна. Это позволяет принимать более обоснованные решения о том, когда очищать или выгружать страницу в файл подкачки.
+
+[[vm-cache]]
+== Унифицированный буферный кэш `vm_object_t`
+
+FreeBSD реализует концепцию универсального «объекта виртуальной памяти» (VM-объекта). VM-объекты могут быть связаны с резервным хранилищем различных типов: без резервного хранилища, с подкачкой, с физическим устройством или с файловым хранилищем. Поскольку файловая система использует те же VM-объекты для управления данными в оперативной памяти, связанными с файлами, в результате получается унифицированный буферный кэш.
+
+Объекты виртуальной памяти могут быть _затемнены_ (shadowed), то есть размещены друг над другом в виде стека. Например, объект виртуальной памяти с подкачкой может быть размещён поверх объекта, связанного с файловым хранилищем, для реализации отображения mmap() с флагом MAP_PRIVATE. Такое стековое размещение также используется для реализации различных общих свойств, включая копирование при записи (copy-on-write), для адресных пространств созданных при форке процесса.
+
+Следует отметить, что структура `vm_page_t` может быть связана только с одним объектом виртуальной памяти (VM-объектом) в данный момент времени. Механизм затемнения VM-объектов реализует кажущееся совместное использование одной и той же страницы между несколькими экземплярами.
+
+[[vm-fileio]]
+== Ввод-вывод файловой системы `struct buf`
+
+VM-объекты, поддерживаемые vnode, такие как объекты, связанные с файловым хранилищем, обычно должны поддерживать собственную информацию о чистоте/грязности, независимую от представления о чистоте/грязности в системе виртуальной памяти. Например, когда система виртуальной памяти решает синхронизировать физическую страницу с её резервным хранилищем, система виртуальной памяти должна отметить страницу как чистую до того, как она будет фактически записана в резервное хранилище. Кроме того, файловые системы должны иметь возможность отображать части файла или метаданных файла в KVM для выполнения операций с ними.
+
+Сущности, используемые для управления этим процессом, известны как файловые буферы, структуры ``struct buf`` или ``bp``. Когда файловая система должна работать с частью объекта виртуальной памяти, она обычно отображает часть объекта в структуру struct buf, а затем отображает страницы из этой структуры в KVM. Точно так же операции с дисковым вводом-выводом обычно выполняются путём отображения частей объектов в структуры буферов и последующего выполнения ввода-вывода на этих структурах. Соответствующие им страницы vm_page_t обычно блокируются на время выполнения операции ввода-вывода. Файловые буферы также имеют собственное представление о состоянии занятости, что полезно для кода драйвера файловой системы, который предпочитает работать с файловыми буферами, а не с обычными страницами виртуальной памяти.
+
+FreeBSD резервирует ограниченный объем виртуальной памяти ядра для хранения отображений из структур struct buf на физические страницы памяти, но следует подчеркнуть, что эта память используется исключительно для хранения отображений и не ограничивает возможность кэширования данных. Кэширование физических данных строго связано с ``vm_page_t``, а не с файловыми буферами. Однако, поскольку файловые буферы используются для операций ввода-вывода, они ограничивают количество возможных параллельных операций ввода-вывода. Тем не менее, поскольку обычно доступно несколько тысяч файловых буферов, это редко становится проблемой.
+
+[[vm-pagetables]]
+== Отображение таблиц страниц `vm_map_t, vm_entry_t`
+
+FreeBSD разделяет топологию физических таблиц страниц от системы виртуальной памяти. Все основные таблицы страниц, связанные с каждым процессом, могут быть восстановлены динамически и обычно считаются временными (throwaway). Специальные таблицы страниц, такие как те, которые управляют KVM (виртуальной памятью ядра), обычно предварительно выделяются навсегда. Эти таблицы страниц не являются временными.
+
+FreeBSD связывает части vm_object с диапазонами адресов в виртуальной памяти через структуры `vm_map_t` и `vm_entry_t`. Таблицы страниц напрямую создаются из иерархии `vm_map_t` / `vm_entry_t`/ `vm_object_t`. Напоминаем, что физические страницы непосредственно связаны только с `vm_object`, однако это не совсем так. Структуры ``vm_page_t`` также привязаны к таблицами страниц, с которыми они активно ассоциированы. Одна структура `vm_page_t` может быть привязана к нескольким _pmaps_ (так называют таблицы страниц). Тем не менее, иерархическая ассоциация сохраняется, и все ссылки на одну и ту же страницу в одном объекте ссылаются на один и тот же `vm_page_t`, что, в свою очередь, обеспечивает унификацию буферного кэша.
+
+[[vm-kvm]]
+== Отображение виртуальной памяти ядра
+
+FreeBSD использует KVM для хранения различных структур ядра. Самой крупной сущностью, хранящейся в KVM, является кэш файловых буферов. То есть, отображения, связанные с сущностями `struct buf`.
+
+В отличие от Linux, FreeBSD _не_ отображает всю физическую память в KVM. Это означает, что FreeBSD может обрабатывать конфигурации памяти до 4 ГБ на 32-битных платформах. На самом деле, если бы MMU это позволял, FreeBSD теоретически могла бы обрабатывать конфигурации памяти до 8 ТБ на 32-битной платформе. Однако, поскольку большинство 32-битных платформ способны отображать только 4 ГБ оперативной памяти, этот вопрос не имеет практического значения.
+
+KVM управляется через несколько механизмов. Основным механизмом для управления KVM является _аллокатор зон_. Аллокатор зон берет блок KVM и делит его на блоки памяти постоянного размера для выделения структур определённого типа. Вы можете использовать команду `vmstat -m`, чтобы получить обзор текущего использования KVM, разбитого по зонам.
+
+[[vm-tuning]]
+== Настройка системы виртуальной памяти во FreeBSD
+
+Были преложены значительные усилия сделать ядро FreeBSD динамически настраиваемым. Обычно вам не нужно вмешиваться в настройки, за исключением параметров конфигурации ядра `maxusers` и `NMBCLUSTERS`. Параметры компиляции ядра указанны (обычно) в файле [.filename]#/usr/src/sys/i386/conf/CONFIG_FILE#. Описание всех доступных параметров конфигурации ядра можно найти в файле [.filename]#/usr/src/sys/i386/conf/LINT#.
+
+В большой системе конфигурации, возможно, вам потребуется увеличить значение `maxusers`. Обычно значения варьируются от 10 до 128. Обратите внимание, что слишком большое значение для `maxusers` может привести к переполнению доступной KVM, что вызовет непредсказуемую работу системы. Лучше оставить `maxusers` на разумном уровне и добавлять другие параметры, такие как `NMBCLUSTERS`, для увеличения конкретных ресурсов.
+
+Если ваша система будет активно использовать сеть, возможно, вам захочется увеличить значение `NMBCLUSTERS`. Типичные значения варьируются от 1024 до 4096.
+
+Параметр `NBUF` также традиционно используется для масштабирования системы. Этот параметр определяет объем виртуальной памяти ядра, который система может использовать для отображения файловых буферов для ввода-вывода. Обратите внимание, что этот параметр никак не связан с унифицированным буферным кэшем! В ядрах 3.0-CURRENT и позднее этот параметр динамически настраивается, и в целом не следует настраивать его вручную. Мы рекомендуем вам _не_ пытаться задавать параметр NBUF. Позвольте системе выбрать его автоматически. Слишком малое значение может привести к крайне неэффективной работе файловой системы, в то время как слишком большое значение может привести к истощению очередей страниц из-за того, что слишком много страниц будет закреплено в памяти.
+
+По умолчанию ядра FreeBSD не оптимизированы. Вы можете установить флаги отладки и оптимизации с помощью директивы `makeoptions` в конфигурации ядра. Обратите внимание, что не следует использовать флаг `-g`, если вы не можете разместить в системе большие ядра (обычно более 7 МБ), которые получаются в результате.
+
+[.programlisting]
+....
+makeoptions DEBUG="-g"
+makeoptions COPTFLAGS="-O -pipe"
+....
+
+Sysctl предоставляет способ настройки параметров ядра во время работы системы. Обычно вам не нужно изменять какие-либо переменные sysctl, особенно те, что связаны с виртуальной памятью.
+
+Настройка виртуальной памяти (VM) и системы во время работы относительно проста. Во-первых, используйте Soft Updates на ваших файловых системах UFS/FFS, когда это возможно. Файл [.filename]#/usr/src/sys/ufs/ffs/README.softupdates# содержит инструкции (и ограничения) по конфигурации этой функции.
+
+Во-вторых, настройте достаточный объем подкачки (swap). Вы должны создать раздел подкачки на каждом физическом диске, до четырёх, даже на "рабочих" дисках. Объём подкачки должен быть как минимум в 2 раза больше объёма основной памяти, а возможно — и больше, если у вас немного ОЗУ. Размер раздела подкачки следует выбирать с учётом максимальной конфигурации памяти, которую вы когда-либо планируете установить на эту машину, чтобы в будущем не пришлось переразбивать диски. Если вы хотите иметь возможность сохранять дампы при сбое, ваш первый swap-раздел должен быть не меньше объёма основной памяти, а каталог [.filename]#/var/crash# должен иметь достаточно свободного места для хранения дампа.
+
+Подкачка на базе NFS вполне допустима в системах версии 4.X и новее, однако необходимо учитывать, что основная нагрузка на подкачку ляжет на NFS-сервер.
diff --git a/documentation/content/ru/books/arch-handbook/vm/_index.po b/documentation/content/ru/books/arch-handbook/vm/_index.po
new file mode 100644
index 0000000000..182ae77808
--- /dev/null
+++ b/documentation/content/ru/books/arch-handbook/vm/_index.po
@@ -0,0 +1,551 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-14 22:43+0300\n"
+"PO-Revision-Date: 2025-08-26 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksarch-handbookvm_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:1
+#, no-wrap
+msgid "Virtual Memory System in FreeBSD"
+msgstr "Система управления виртуальной памятью во FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:1
+#, no-wrap
+msgid "Chapter 7. Virtual Memory System"
+msgstr "Глава 7. Система управления виртуальной памятью"
+
+#. type: Title =
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:14
+#, no-wrap
+msgid "Virtual Memory System"
+msgstr "Система управления виртуальной памятью"
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:52
+#, no-wrap
+msgid "Management of Physical Memory `vm_page_t`"
+msgstr "Управление физической памятью `vm_page_t`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:55
+msgid ""
+"Physical memory is managed on a page-by-page basis through the `vm_page_t` "
+"structure. Pages of physical memory are categorized through the placement of "
+"their respective `vm_page_t` structures on one of several paging queues."
+msgstr ""
+"Физическая память управляется постранично с использованием структуры "
+"`vm_page_t`. Страницы физической памяти классифицируются посредством "
+"размещения соответствующих структур `vm_page_t` в одной из нескольких "
+"очередей подкачки."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:57
+msgid ""
+"A page can be in a wired, active, inactive, cache, or free state. Except for "
+"the wired state, the page is typically placed in a doubly link list queue "
+"representing the state that it is in. Wired pages are not placed on any "
+"queue."
+msgstr ""
+"Страница может находиться в одном из следующих состояний: зафиксированном "
+"(Wired), активном (Active), неактивном (Inactive), кэшированном (Cache) или "
+"свободном (Free). За исключением зафиксированного состояния, страница обычно "
+"помещается в двусвязный список, представляющий её текущее состояние. "
+"Зафиксированные страницы не помещаются ни в одну из очередей."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:59
+msgid ""
+"FreeBSD implements a more involved paging queue for cached and free pages in "
+"order to implement page coloring. Each of these states involves multiple "
+"queues arranged according to the size of the processor's L1 and L2 caches. "
+"When a new page needs to be allocated, FreeBSD attempts to obtain one that "
+"is reasonably well aligned from the point of view of the L1 and L2 caches "
+"relative to the VM object the page is being allocated for."
+msgstr ""
+"FreeBSD реализует более сложную очередь подкачки для кэшированных и "
+"свободных страниц с целью реализации раскраски страниц. Каждое из этих "
+"состояний включает несколько очередей, организованных в соответствии с "
+"размерами кэшей L1 и L2 процессора. Когда требуется выделить новую страницу, "
+"FreeBSD пытается получить такую, которая будет достаточно хорошо выровнена с "
+"точки зрения кэшей L1 и L2 относительно объекта виртуальной памяти, для "
+"которого выделяется страница."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:61
+msgid ""
+"Additionally, a page may be held with a reference count or locked with a "
+"busy count. The VM system also implements an \"ultimate locked\" state for a "
+"page using the PG_BUSY bit in the page's flags."
+msgstr ""
+"Кроме того, страница может удерживаться с помощью счётчика ссылок или быть "
+"заблокированной с помощью счётчика занятости. Система виртуальной памяти "
+"также реализует состояние «абсолютной блокировки» страницы с использованием "
+"бита PG_BUSY в флагах страницы."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:63
+msgid ""
+"In general terms, each of the paging queues operates in a LRU fashion. A "
+"page is typically placed in a wired or active state initially. When wired, "
+"the page is usually associated with a page table somewhere. The VM system "
+"ages the page by scanning pages in a more active paging queue (LRU) in order "
+"to move them to a less-active paging queue. Pages that get moved into the "
+"cache are still associated with a VM object but are candidates for immediate "
+"reuse. Pages in the free queue are truly free. FreeBSD attempts to minimize "
+"the number of pages in the free queue, but a certain minimum number of truly "
+"free pages must be maintained in order to accommodate page allocation at "
+"interrupt time."
+msgstr ""
+"В общем случае каждая из очередей подкачки работает по принципу LRU "
+"(наименее недавно использованная). Обычно страница изначально помещается в "
+"зафиксированное или активное состояние. В зафиксированном состоянии "
+"страница, как правило, ассоциирована с какой-либо таблицей страниц. Система "
+"виртуальной памяти «состаривает» страницу, просматривая страницы в более "
+"активной очереди страниц (LRU), чтобы переместить их в менее активную "
+"очередь. Страницы, перемещённые в кэш, всё ещё связаны с объектом "
+"виртуальной памяти, но могут быть немедленно повторно использованы. Страницы "
+"в очереди свободных действительно являются полностью свободными. FreeBSD "
+"стремится минимизировать количество страниц в очереди свободных, но "
+"определённый минимальный объём таких страниц должен поддерживаться для "
+"обеспечения возможности выделения памяти во время обработки прерываний."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:65
+msgid ""
+"If a process attempts to access a page that does not exist in its page table "
+"but does exist in one of the paging queues (such as the inactive or cache "
+"queues), a relatively inexpensive page reactivation fault occurs which "
+"causes the page to be reactivated. If the page does not exist in system "
+"memory at all, the process must block while the page is brought in from disk."
+msgstr ""
+"Если процесс пытается обратиться к странице, которой нет в его таблице "
+"страниц, но которая присутствует в одной из очередей подкачки (например, в "
+"неактивной или кэшированной), происходит относительно недорогой сбой "
+"повторной активации страницы, в результате которого страница повторно "
+"активируется. Если же страницы вообще нет в памяти системы, процесс вынужден "
+"блокироваться до тех пор, пока страница не будет загружена с диска."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:67
+msgid ""
+"FreeBSD dynamically tunes its paging queues and attempts to maintain "
+"reasonable ratios of pages in the various queues as well as attempts to "
+"maintain a reasonable breakdown of clean versus dirty pages. The amount of "
+"rebalancing that occurs depends on the system's memory load. This "
+"rebalancing is implemented by the pageout daemon and involves laundering "
+"dirty pages (syncing them with their backing store), noticing when pages are "
+"activity referenced (resetting their position in the LRU queues or moving "
+"them between queues), migrating pages between queues when the queues are out "
+"of balance, and so forth. FreeBSD's VM system is willing to take a "
+"reasonable number of reactivation page faults to determine how active or how "
+"idle a page actually is. This leads to better decisions being made as to "
+"when to launder or swap-out a page."
+msgstr ""
+"FreeBSD динамически настраивает свои очереди страниц и старается "
+"поддерживать разумные пропорции количества страниц в различных очередях, а "
+"также сбалансированное соотношение чистых и грязных страниц. Объём "
+"перераспределения зависит от текущей нагрузки на память системы. Это "
+"перераспределение выполняется демоном выгрузки страниц (pageout daemon) и "
+"включает в себя очистку (laundering) грязных страниц (синхронизацию их с "
+"резервным хранилищем), отслеживание активности страниц по ссылкам на них "
+"(сброс их положения в очередях LRU или перемещение между очередями), "
+"миграцию страниц между очередями при разбалансировке очередей и другие "
+"действия. Система виртуальной памяти FreeBSD допускает определённое "
+"количество сбоев повторной активации страниц, чтобы точнее определить, "
+"насколько страница фактически активна или неактивна. Это позволяет принимать "
+"более обоснованные решения о том, когда очищать или выгружать страницу в "
+"файл подкачки."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:69
+#, no-wrap
+msgid "The Unified Buffer Cache `vm_object_t`"
+msgstr "Унифицированный буферный кэш `vm_object_t`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:72
+msgid ""
+"FreeBSD implements the idea of a generic \"VM object\". VM objects can be "
+"associated with backing store of various typesunbacked, swap-backed, "
+"physical device-backed, or file-backed storage. Since the filesystem uses "
+"the same VM objects to manage in-core data relating to files, the result is "
+"a unified buffer cache."
+msgstr ""
+"FreeBSD реализует концепцию универсального «объекта виртуальной памяти» (VM-"
+"объекта). VM-объекты могут быть связаны с резервным хранилищем различных "
+"типов: без резервного хранилища, с подкачкой, с физическим устройством или с "
+"файловым хранилищем. Поскольку файловая система использует те же VM-объекты "
+"для управления данными в оперативной памяти, связанными с файлами, в "
+"результате получается унифицированный буферный кэш."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:74
+msgid ""
+"VM objects can be _shadowed_. That is, they can be stacked on top of each "
+"other. For example, you might have a swap-backed VM object stacked on top of "
+"a file-backed VM object in order to implement a MAP_PRIVATE mmap()ing. This "
+"stacking is also used to implement various sharing properties, including "
+"copy-on-write, for forked address spaces."
+msgstr ""
+"Объекты виртуальной памяти могут быть _затемнены_ (shadowed), то есть "
+"размещены друг над другом в виде стека. Например, объект виртуальной памяти "
+"с подкачкой может быть размещён поверх объекта, связанного с файловым "
+"хранилищем, для реализации отображения mmap() с флагом MAP_PRIVATE. Такое "
+"стековое размещение также используется для реализации различных общих "
+"свойств, включая копирование при записи (copy-on-write), для адресных "
+"пространств созданных при форке процесса."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:76
+msgid ""
+"It should be noted that a `vm_page_t` can only be associated with one VM "
+"object at a time. The VM object shadowing implements the perceived sharing "
+"of the same page across multiple instances."
+msgstr ""
+"Следует отметить, что структура `vm_page_t` может быть связана только с "
+"одним объектом виртуальной памяти (VM-объектом) в данный момент времени. "
+"Механизм затемнения VM-объектов реализует кажущееся совместное использование "
+"одной и той же страницы между несколькими экземплярами."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:78
+#, no-wrap
+msgid "Filesystem I/O `struct buf`"
+msgstr "Ввод-вывод файловой системы `struct buf`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:81
+msgid ""
+"vnode-backed VM objects, such as file-backed objects, generally need to "
+"maintain their own clean/dirty info independent from the VM system's idea of "
+"clean/dirty. For example, when the VM system decides to synchronize a "
+"physical page to its backing store, the VM system needs to mark the page "
+"clean before the page is actually written to its backing store. "
+"Additionally, filesystems need to be able to map portions of a file or file "
+"metadata into KVM in order to operate on it."
+msgstr ""
+"VM-объекты, поддерживаемые vnode, такие как объекты, связанные с файловым "
+"хранилищем, обычно должны поддерживать собственную информацию о чистоте/"
+"грязности, независимую от представления о чистоте/грязности в системе "
+"виртуальной памяти. Например, когда система виртуальной памяти решает "
+"синхронизировать физическую страницу с её резервным хранилищем, система "
+"виртуальной памяти должна отметить страницу как чистую до того, как она "
+"будет фактически записана в резервное хранилище. Кроме того, файловые "
+"системы должны иметь возможность отображать части файла или метаданных файла "
+"в KVM для выполнения операций с ними."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:83
+msgid ""
+"The entities used to manage this are known as filesystem buffers, ``struct "
+"buf``'s, or ``bp``'s. When a filesystem needs to operate on a portion of a "
+"VM object, it typically maps part of the object into a struct buf and then "
+"maps the pages in the struct buf into KVM. In the same manner, disk I/O is "
+"typically issued by mapping portions of objects into buffer structures and "
+"then issuing the I/O on the buffer structures. The underlying vm_page_t's "
+"are typically busied for the duration of the I/O. Filesystem buffers also "
+"have their own notion of being busy, which is useful to filesystem driver "
+"code which would rather operate on filesystem buffers instead of hard VM "
+"pages."
+msgstr ""
+"Сущности, используемые для управления этим процессом, известны как файловые "
+"буферы, структуры ``struct buf`` или ``bp``. Когда файловая система должна "
+"работать с частью объекта виртуальной памяти, она обычно отображает часть "
+"объекта в структуру struct buf, а затем отображает страницы из этой "
+"структуры в KVM. Точно так же операции с дисковым вводом-выводом обычно "
+"выполняются путём отображения частей объектов в структуры буферов и "
+"последующего выполнения ввода-вывода на этих структурах. Соответствующие им "
+"страницы vm_page_t обычно блокируются на время выполнения операции ввода-"
+"вывода. Файловые буферы также имеют собственное представление о состоянии "
+"занятости, что полезно для кода драйвера файловой системы, который "
+"предпочитает работать с файловыми буферами, а не с обычными страницами "
+"виртуальной памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:85
+msgid ""
+"FreeBSD reserves a limited amount of KVM to hold mappings from struct bufs, "
+"but it should be made clear that this KVM is used solely to hold mappings "
+"and does not limit the ability to cache data. Physical data caching is "
+"strictly a function of ``vm_page_t``'s, not filesystem buffers. However, "
+"since filesystem buffers are used to placehold I/O, they do inherently limit "
+"the amount of concurrent I/O possible. However, as there are usually a few "
+"thousand filesystem buffers available, this is not usually a problem."
+msgstr ""
+"FreeBSD резервирует ограниченный объем виртуальной памяти ядра для хранения "
+"отображений из структур struct buf на физические страницы памяти, но следует "
+"подчеркнуть, что эта память используется исключительно для хранения "
+"отображений и не ограничивает возможность кэширования данных. Кэширование "
+"физических данных строго связано с ``vm_page_t``, а не с файловыми буферами. "
+"Однако, поскольку файловые буферы используются для операций ввода-вывода, "
+"они ограничивают количество возможных параллельных операций ввода-вывода. "
+"Тем не менее, поскольку обычно доступно несколько тысяч файловых буферов, "
+"это редко становится проблемой."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:87
+#, no-wrap
+msgid "Mapping Page Tables `vm_map_t, vm_entry_t`"
+msgstr "Отображение таблиц страниц `vm_map_t, vm_entry_t`"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:90
+msgid ""
+"FreeBSD separates the physical page table topology from the VM system. All "
+"hard per-process page tables can be reconstructed on the fly and are usually "
+"considered throwaway. Special page tables such as those managing KVM are "
+"typically permanently preallocated. These page tables are not throwaway."
+msgstr ""
+"FreeBSD разделяет топологию физических таблиц страниц от системы виртуальной "
+"памяти. Все основные таблицы страниц, связанные с каждым процессом, могут "
+"быть восстановлены динамически и обычно считаются временными (throwaway). "
+"Специальные таблицы страниц, такие как те, которые управляют KVM "
+"(виртуальной памятью ядра), обычно предварительно выделяются навсегда. Эти "
+"таблицы страниц не являются временными."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:92
+msgid ""
+"FreeBSD associates portions of vm_objects with address ranges in virtual "
+"memory through `vm_map_t` and `vm_entry_t` structures. Page tables are "
+"directly synthesized from the `vm_map_t`/`vm_entry_t`/ `vm_object_t` "
+"hierarchy. Recall that I mentioned that physical pages are only directly "
+"associated with a `vm_object`; that is not quite true. ``vm_page_t``'s are "
+"also linked into page tables that they are actively associated with. One "
+"`vm_page_t` can be linked into several _pmaps_, as page tables are called. "
+"However, the hierarchical association holds, so all references to the same "
+"page in the same object reference the same `vm_page_t` and thus give us "
+"buffer cache unification across the board."
+msgstr ""
+"FreeBSD связывает части vm_object с диапазонами адресов в виртуальной памяти "
+"через структуры `vm_map_t` и `vm_entry_t`. Таблицы страниц напрямую "
+"создаются из иерархии `vm_map_t` / `vm_entry_t`/ `vm_object_t`. Напоминаем, "
+"что физические страницы непосредственно связаны только с `vm_object`, однако "
+"это не совсем так. Структуры ``vm_page_t`` также привязаны к таблицами "
+"страниц, с которыми они активно ассоциированы. Одна структура `vm_page_t` "
+"может быть привязана к нескольким _pmaps_ (так называют таблицы страниц). "
+"Тем не менее, иерархическая ассоциация сохраняется, и все ссылки на одну и "
+"ту же страницу в одном объекте ссылаются на один и тот же `vm_page_t`, что, "
+"в свою очередь, обеспечивает унификацию буферного кэша."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:94
+#, no-wrap
+msgid "KVM Memory Mapping"
+msgstr "Отображение виртуальной памяти ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:97
+msgid ""
+"FreeBSD uses KVM to hold various kernel structures. The single largest "
+"entity held in KVM is the filesystem buffer cache. That is, mappings "
+"relating to `struct buf` entities."
+msgstr ""
+"FreeBSD использует KVM для хранения различных структур ядра. Самой крупной "
+"сущностью, хранящейся в KVM, является кэш файловых буферов. То есть, "
+"отображения, связанные с сущностями `struct buf`."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:99
+msgid ""
+"Unlike Linux, FreeBSD does _not_ map all of physical memory into KVM. This "
+"means that FreeBSD can handle memory configurations up to 4G on 32 bit "
+"platforms. In fact, if the mmu were capable of it, FreeBSD could "
+"theoretically handle memory configurations up to 8TB on a 32 bit platform. "
+"However, since most 32 bit platforms are only capable of mapping 4GB of ram, "
+"this is a moot point."
+msgstr ""
+"В отличие от Linux, FreeBSD _не_ отображает всю физическую память в KVM. Это "
+"означает, что FreeBSD может обрабатывать конфигурации памяти до 4 ГБ на 32-"
+"битных платформах. На самом деле, если бы MMU это позволял, FreeBSD "
+"теоретически могла бы обрабатывать конфигурации памяти до 8 ТБ на 32-битной "
+"платформе. Однако, поскольку большинство 32-битных платформ способны "
+"отображать только 4 ГБ оперативной памяти, этот вопрос не имеет "
+"практического значения."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:101
+msgid ""
+"KVM is managed through several mechanisms. The main mechanism used to manage "
+"KVM is the _zone allocator_. The zone allocator takes a chunk of KVM and "
+"splits it up into constant-sized blocks of memory in order to allocate a "
+"specific type of structure. You can use `vmstat -m` to get an overview of "
+"current KVM utilization broken down by zone."
+msgstr ""
+"KVM управляется через несколько механизмов. Основным механизмом для "
+"управления KVM является _аллокатор зон_. Аллокатор зон берет блок KVM и "
+"делит его на блоки памяти постоянного размера для выделения структур "
+"определённого типа. Вы можете использовать команду `vmstat -m`, чтобы "
+"получить обзор текущего использования KVM, разбитого по зонам."
+
+#. type: Title ==
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:103
+#, no-wrap
+msgid "Tuning the FreeBSD VM System"
+msgstr "Настройка системы виртуальной памяти во FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:106
+msgid ""
+"A concerted effort has been made to make the FreeBSD kernel dynamically tune "
+"itself. Typically you do not need to mess with anything beyond the "
+"`maxusers` and `NMBCLUSTERS` kernel config options. That is, kernel "
+"compilation options specified in (typically) [.filename]#/usr/src/sys/i386/"
+"conf/CONFIG_FILE#. A description of all available kernel configuration "
+"options can be found in [.filename]#/usr/src/sys/i386/conf/LINT#."
+msgstr ""
+"Были преложены значительные усилия сделать ядро FreeBSD динамически "
+"настраиваемым. Обычно вам не нужно вмешиваться в настройки, за исключением "
+"параметров конфигурации ядра `maxusers` и `NMBCLUSTERS`. Параметры "
+"компиляции ядра указанны (обычно) в файле [.filename]#/usr/src/sys/i386/conf/"
+"CONFIG_FILE#. Описание всех доступных параметров конфигурации ядра можно "
+"найти в файле [.filename]#/usr/src/sys/i386/conf/LINT#."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:108
+msgid ""
+"In a large system configuration you may wish to increase `maxusers`. Values "
+"typically range from 10 to 128. Note that raising `maxusers` too high can "
+"cause the system to overflow available KVM resulting in unpredictable "
+"operation. It is better to leave `maxusers` at some reasonable number and "
+"add other options, such as `NMBCLUSTERS`, to increase specific resources."
+msgstr ""
+"В большой системе конфигурации, возможно, вам потребуется увеличить значение "
+"`maxusers`. Обычно значения варьируются от 10 до 128. Обратите внимание, что "
+"слишком большое значение для `maxusers` может привести к переполнению "
+"доступной KVM, что вызовет непредсказуемую работу системы. Лучше оставить "
+"`maxusers` на разумном уровне и добавлять другие параметры, такие как "
+"`NMBCLUSTERS`, для увеличения конкретных ресурсов."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:110
+msgid ""
+"If your system is going to use the network heavily, you may want to increase "
+"`NMBCLUSTERS`. Typical values range from 1024 to 4096."
+msgstr ""
+"Если ваша система будет активно использовать сеть, возможно, вам захочется "
+"увеличить значение `NMBCLUSTERS`. Типичные значения варьируются от 1024 до "
+"4096."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:112
+msgid ""
+"The `NBUF` parameter is also traditionally used to scale the system. This "
+"parameter determines the amount of KVA the system can use to map filesystem "
+"buffers for I/O. Note that this parameter has nothing whatsoever to do with "
+"the unified buffer cache! This parameter is dynamically tuned in 3.0-CURRENT "
+"and later kernels and should generally not be adjusted manually. We "
+"recommend that you _not_ try to specify an `NBUF` parameter. Let the system "
+"pick it. Too small a value can result in extremely inefficient filesystem "
+"operation while too large a value can starve the page queues by causing too "
+"many pages to become wired down."
+msgstr ""
+"Параметр `NBUF` также традиционно используется для масштабирования системы. "
+"Этот параметр определяет объем виртуальной памяти ядра, который система "
+"может использовать для отображения файловых буферов для ввода-вывода. "
+"Обратите внимание, что этот параметр никак не связан с унифицированным "
+"буферным кэшем! В ядрах 3.0-CURRENT и позднее этот параметр динамически "
+"настраивается, и в целом не следует настраивать его вручную. Мы рекомендуем "
+"вам _не_ пытаться задавать параметр NBUF. Позвольте системе выбрать его "
+"автоматически. Слишком малое значение может привести к крайне неэффективной "
+"работе файловой системы, в то время как слишком большое значение может "
+"привести к истощению очередей страниц из-за того, что слишком много страниц "
+"будет закреплено в памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:114
+msgid ""
+"By default, FreeBSD kernels are not optimized. You can set debugging and "
+"optimization flags with the `makeoptions` directive in the kernel "
+"configuration. Note that you should not use `-g` unless you can accommodate "
+"the large (typically 7 MB+) kernels that result."
+msgstr ""
+"По умолчанию ядра FreeBSD не оптимизированы. Вы можете установить флаги "
+"отладки и оптимизации с помощью директивы `makeoptions` в конфигурации ядра. "
+"Обратите внимание, что не следует использовать флаг `-g`, если вы не можете "
+"разместить в системе большие ядра (обычно более 7 МБ), которые получаются в "
+"результате."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:119
+#, no-wrap
+msgid ""
+"makeoptions DEBUG=\"-g\"\n"
+"makeoptions COPTFLAGS=\"-O -pipe\"\n"
+msgstr ""
+"makeoptions DEBUG=\"-g\" \n"
+"makeoptions COPTFLAGS=\"-O -pipe\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:122
+msgid ""
+"Sysctl provides a way to tune kernel parameters at run-time. You typically "
+"do not need to mess with any of the sysctl variables, especially the VM "
+"related ones."
+msgstr ""
+"Sysctl предоставляет способ настройки параметров ядра во время работы "
+"системы. Обычно вам не нужно изменять какие-либо переменные sysctl, особенно "
+"те, что связаны с виртуальной памятью."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:124
+msgid ""
+"Run time VM and system tuning is relatively straightforward. First, use Soft "
+"Updates on your UFS/FFS filesystems whenever possible. [.filename]#/usr/src/"
+"sys/ufs/ffs/README.softupdates# contains instructions (and restrictions) on "
+"how to configure it."
+msgstr ""
+"Настройка виртуальной памяти (VM) и системы во время работы относительно "
+"проста. Во-первых, используйте Soft Updates на ваших файловых системах UFS/"
+"FFS, когда это возможно. Файл [.filename]#/usr/src/sys/ufs/ffs/"
+"README.softupdates# содержит инструкции (и ограничения) по конфигурации этой "
+"функции."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:126
+msgid ""
+"Second, configure sufficient swap. You should have a swap partition "
+"configured on each physical disk, up to four, even on your \"work\" disks. "
+"You should have at least 2x the swap space as you have main memory, and "
+"possibly even more if you do not have a lot of memory. You should also size "
+"your swap partition based on the maximum memory configuration you ever "
+"intend to put on the machine so you do not have to repartition your disks "
+"later on. If you want to be able to accommodate a crash dump, your first "
+"swap partition must be at least as large as main memory and [.filename]#/var/"
+"crash# must have sufficient free space to hold the dump."
+msgstr ""
+"Во-вторых, настройте достаточный объем подкачки (swap). Вы должны создать "
+"раздел подкачки на каждом физическом диске, до четырёх, даже на \"рабочих\" "
+"дисках. Объём подкачки должен быть как минимум в 2 раза больше объёма "
+"основной памяти, а возможно — и больше, если у вас немного ОЗУ. Размер "
+"раздела подкачки следует выбирать с учётом максимальной конфигурации памяти, "
+"которую вы когда-либо планируете установить на эту машину, чтобы в будущем "
+"не пришлось переразбивать диски. Если вы хотите иметь возможность сохранять "
+"дампы при сбое, ваш первый swap-раздел должен быть не меньше объёма основной "
+"памяти, а каталог [.filename]#/var/crash# должен иметь достаточно свободного "
+"места для хранения дампа."
+
+#. type: Plain text
+#: documentation/content/en/books/arch-handbook/vm/_index.adoc:127
+msgid ""
+"NFS-based swap is perfectly acceptable on 4.X or later systems, but you must "
+"be aware that the NFS server will take the brunt of the paging load."
+msgstr ""
+"Подкачка на базе NFS вполне допустима в системах версии 4.X и новее, однако "
+"необходимо учитывать, что основная нагрузка на подкачку ляжет на NFS-сервер."
diff --git a/documentation/content/ru/books/design-44bsd/_index.adoc b/documentation/content/ru/books/design-44bsd/_index.adoc
index 439f26d9c2..7146569e37 100644
--- a/documentation/content/ru/books/design-44bsd/_index.adoc
+++ b/documentation/content/ru/books/design-44bsd/_index.adoc
@@ -1,13 +1,20 @@
---
-title: Архитектура и реализация операционной системы 4.4BSD
authors:
- - author: Marshall Kirk McKusick
- - author: Keith Bostic
- - author: Michael J. Karels
- - author: John S. Quarterman
-copyright: 1996 Addison-Wesley Longman, Inc
+ -
+ author: 'Marshall Kirk McKusick'
+ -
+ author: 'Keith Bostic'
+ -
+ author: 'Michael J. Karels'
+ -
+ author: 'John S. Quarterman'
+bookOrder: 60
+copyright: '1996 Addison-Wesley Longman, Inc'
+description: 'Предоставлено издательством Addison-Wesley и предоставляет обзор архитектуры 4.4BSD, от которой изначально произошел FreeBSD'
+layout: single
+tags: ["4.4BSD", "design", "operating system", "BSD", "UNIX"]
+title: 'Архитектура и реализация операционной системы 4.4BSD'
trademarks: ["design-44bsd"]
-isIndex: true
---
= Архитектура и реализация операционной системы 4.4BSD
@@ -51,9 +58,9 @@ toc::[]
== Обзор архитектуры 4.4BSD
[[overview-facilities]]
-=== Системные сервисы 4.4BSD и ядро
+=== Подсистемы и ядро 4.4BSD
-Ядро 4.4BSD предоставляет четыре основных системных сервиса: процессы, файловую систему, коммуникации и запуск системы. Этот раздел перечисляет, в каком месте этой книги описана каждая из этих служб.
+Ядро 4.4BSD предоставляет четыре базовых подсистемы: процессы, файловую систему, коммуникации и запуск системы. Этот раздел перечисляет, в каком месте этой книги описана каждая из этих подсистем.
. Процессы образуют поток управления в адресном пространстве. Механизмы создания, завершения и другие управляющие процессы описаны в Главе 4. Для каждого процесса система мультиплексирует отдельное виртуальное адресное пространство; такое управление памятью обсуждается в Главе 5.
. Механизм доступа пользователя к файловой системе и устройствам один и тот же; общие аспекты обсуждаются в Главе 6. Файловая система является набором именованных файлов, организованных в древовидную иерархию каталогов, а операции по управлению ими представлены в Главе 7. Файлы располагаются на таких физических носителях, как диски. 4.4BSD поддерживает несколько типов организации данных на диске, как описано далее в Главе 8. Доступ к файлам на удаленных машинах является предметом обсуждения в Главе 9. Для доступа к системе Терминалы используются терминалы; их функционированию посвящена глава 10.
@@ -64,11 +71,11 @@ toc::[]
==== Ядро
-_Ядро_ является частью системы, которая работает в защищенном режиме и управляет доступом всех пользовательских программ к низкоуровнему аппаратному обеспечению (к примеру, ЦПУ, дискам, терминалам, сетевым связям) и программным компонентам (к примеру, файловой системе, сетевым протоколам). Ядро предоставляет основные системные услуги; оно создает процессы и управляет ими, предоставляет функции для доступа к файловой системе и службам связи. Такие функции, называемые _системными вызовами_, доступны процессам пользователей в виде библиотечных подпрограмм. Эти системные вызовы являются единственным способом доступа к таким услугам. Подробно механизм работы системных вызовов дается в Главе 3, вместе с описанием некоторых механизмов ядра, работа которых не является прямым результатом процесса, выполняющего системный вызов.
+_Ядро_ является частью системы, которая работает в защищенном режиме и управляет доступом всех пользовательских программ к низкоуровнему аппаратному обеспечению (к примеру, ЦПУ, дискам, терминалам, сетевым связям) и программным компонентам (к примеру, файловой системе, сетевым протоколам). Ядро предоставляет основные подсистемы; оно создает процессы и управляет ими, предоставляет функции для доступа к файловой системе и службам связи. Такие функции, называемые _системными вызовами_, доступны процессам пользователей в виде библиотечных подпрограмм. Эти системные вызовы являются единственным способом доступа к этим подсистемам. Подробно механизм работы системных вызовов дается в Главе 3, вместе с описанием некоторых механизмов ядра, работа которых не является прямым результатом процесса, выполняющего системный вызов.
-_Ядро_, по традиционной терминологии операционных систем, является маленьким куском программного обеспечения, которое предоставляет только минимальный набор услуг, необходимый для реализации дополнительных служб операционной системы. В современных исследовательских операционных системах - таких, как Chorus <<biblio-rozier, [Rozier et al, 1988]>>, Mach <<biblio-accetta, [Accetta et al, 1986]>>, Tunis <<biblio-ewens, [Ewens et al, 1985]>>, и V Kernel <<biblio-cheriton, [Cheriton, 1988]>> - такое разделение функциональности выполнено не только логически. Такие службы, как файловые системы и сетевые протоколы, выполнены в виде прикладных процессов клиентов ядра или микроядра.
+_Ядро_, по традиционной терминологии операционных систем, является маленьким куском программного обеспечения, которое предоставляет только минимальный набор подсистем, необходимый для реализации дополнительных служб операционной системы. В современных исследовательских операционных системах — таких, как Chorus crossref:design-44bsd[biblio-rozier, [Rozier et al, 1988]], Mach crossref:design-44bsd[biblio-accetta, [Accetta et al, 1986]], Tunis crossref:design-44bsd[biblio-ewens, [Ewens et al, 1985]], и V Kernel crossref:design-44bsd[biblio-cheriton, [Cheriton, 1988]] - такое разделение функциональности выполнено не только логически. Такие службы, как файловые системы и сетевые протоколы, выполнены в виде прикладных процессов клиентов ядра или микроядра.
-Ядро 4.4BSD не разбивается на несколько процессов. Это основополагающее архитектурное решение было сделано в самых ранних версиях UNIX. В первых двух реализациях Кена Томпсона (Ken Thompson) не было отображаемой памяти, и поэтому не было аппаратного различия между адресным пространством пользователя и ядра <<biblio-ritchie, [Ritchie, 1988]>>. Могла бы быть придумана система обмена сообщениями как реально реализуемая модель процессов ядра и пользователя. Для простоты и увеличения производительности было выбрано монолитное ядро. К тому же ранние ядра были маленькими; включение таких служб, как сетевые коммуникации, в ядро увеличило его размер. Современные тенденции в области операционных систем сводятся к уменьшению размера ядра за счет перевода таких служб в пользовательское адресное пространство.
+Ядро 4.4BSD не разбивается на несколько процессов. Это основополагающее архитектурное решение было сделано в самых ранних версиях UNIX. В первых двух реализациях Кена Томпсона (Ken Thompson) не было отображаемой памяти, и поэтому не было аппаратного различия между адресным пространством пользователя и ядра crossref:design-44bsd[biblio-ritchie, [Ritchie, 1988]]. Могла бы быть придумана система обмена сообщениями как реально реализуемая модель процессов ядра и пользователя. Для простоты и увеличения производительности было выбрано монолитное ядро. К тому же ранние ядра были маленькими; включение таких подсистем, как сетевые коммуникации, в ядро увеличило его размер. Современные тенденции в области операционных систем сводятся к уменьшению размера ядра за счет перевода таких служб в пользовательское адресное пространство.
Пользователи обычно общаются с системой через интерпретатор языка команд, называемый оболочкой (_shell_), и, может быть, через дополнительные прикладные пользовательские программы. Такие программы и оболочка реализованы в виде процессов. Подробное описание таких программ выходит за рамки этой книги, которая практически полностью посвящена работе ядра.
@@ -79,109 +86,45 @@ _Ядро_, по традиционной терминологии операц
В этом разделе мы рассматриваем организацию ядра 4.4BSD с двух точек зрения:
+[arabic]
. Как статический блок программного обеспечения, категоризуемый по функциональности модулей, составляющих ядро
. В его динамике, категоризуемой по услугам, предоставляемым пользователям
Самая большая часть ядра реализует системные услуги, к которым приложения обращаются через системные вызовы. В 4.4BSD это программное обеспечение организуется по следующим принципам:
-* Базовые услуги ядра: обработка таймеров и системного таймера, управление дескрипторами и процессами
+* Базовые подсистемы ядра: обработка таймеров и системного таймера, управление дескрипторами и процессами
* Поддержка управления памятью: подкачка и выгрузка
* Общесистемные интерфейсы: ввод/вывод, управление и мультиплексирование операций, выполняемых над дескрипторами
* Файловая система: файлы, каталоги, преобразование маршрутов, блокировка файлов и управление буфером ввода/вывода
* Поддержка работы с терминалами: драйвер терминального интерфейса и режимы работы терминального канала
-* Службы межпроцессного взаимодействия: сокеты
-* Поддержка сетевых коммуникаций: коммуникационные протоколы и общесетевые службы, такие, как маршрутизация
+* Подсистемы межпроцессного взаимодействия: сокеты
+* Поддержка сетевых коммуникаций: коммуникационные протоколы и общесетевые подсистемы, такие, как маршрутизация
-[[table-mach-indep]]
.Машинно-независимое программное обеспечение в ядре 4.4BSD
-[cols="1,1,1", frame="none", options="header,footer"]
+[[table-mach-indep]]
+[cols=",,", options="header"]
|===
-| Категория
-| Количество строк кода
-| Процент от всего ядра
-
-|файлы заголовков
-|9,393
-|4.6
-
-|инициализация
-|1,107
-|0.6
-
-|службы ядра
-|8,793
-|4.4
-
-|общесистемные интерфейсы
-|4,782
-|2.4
-
-|межпроцессное взаимодействие
-|4,540
-|2.2
-
-|работа с терминалами
-|3,911
-|1.9
-
-|виртуальная память
-|11,813
-|5.8
-
-|управление vnode
-|7,954
-|3.9
-
-|именование файловой системы
-|6,550
-|3.2
-
-|хранение файлов
-|4,365
-|2.2
-
-|хранение log-структур
-|4,337
-|2.1
-
-|хранение на основе памяти
-|645
-|0.3
-
-|файловая система cd9660
-|4,177
-|2.1
-
-|различные файловые системы (10)
-|12,695
-|6.3
-
-|сетевая файловая система
-|17,199
-|8.5
-
-|сетевое взаимодействие
-|8,630
-|4.3
-
-|протоколы internet
-|11,984
-|5.9
-
-|протоколы ISO
-|23,924
-|11.8
-
-|протоколы X.25
-|10,626
-|5.3
-
-|протоколы XNS
-|5,192
-|2.6
-| всего машинно-независимая часть
-| 162,617
-| 80.4
+|Категория |Строк кода |Процент от строк ядра
+|заголовки |9,393 |4.6
+|инициализация |1,107 |0.6
+|подсистемы ядра |8,793 |4.4
+|универсальные интерфейсы |4,782 |2.4
+|межпроцессное взаимодействие |4,540 |2.2
+|работа с терминалом |3,911 |1.9
+|Виртуальная память |11,813 |5.8
+|управление vnode |7,954 |3.9
+|имена в файловой системы |6,550 |3.2
+|быстрое хранилище файлов |4,365 |2.2
+|логическая структура файлового хранилища |4,337 |2.1
+|хранилище файлов в памяти |645 |0.3
+|cd9660 файловая система |4,177 |2.1
+|различные файловые системы (10) |12,695 |6.3
+|сетевая файловая система |17,199 |8.5
+|сетевое взаимодействие |8,630 |4.3
+|интернет-протоколы |11,984 |5.9
+|протоколы ISO |23,924 |11.8
+|протоколы X.25 |10,626 |5.3
+|протоколы XNS |5,192 |2.6
|===
Большая часть программного обеспечения в этих категориях является машинно-независимой и переносима между различными аппаратными архитектурами.
@@ -194,47 +137,21 @@ _Ядро_, по традиционной терминологии операц
* Конфигурация и инициализация аппаратных устройств
* Поддержка устройств ввода/вывода во время работы
-[[table-mach-dep]]
.Машинно-зависимое программное обеспечение для HP300 в ядре 4.4BSD
-[cols="1,1,1", frame="none", options="header,footer"]
+[[table-mach-dep]]
+[cols=",,", options="header"]
|===
-| Категория
-| Количество строк кода
-| Процент от всего ядра
-
-|машинно-зависимые заголовки
-|1,562
-|0.8
-
-|заголовки драйверов устройств
-|3,495
-|1.7
-
-|исходные тексты драйверов устройств
-|17,506
-|8.7
-
-|виртуальная память
-|3,087
-|1.5
-
-|остальная машинно-зависимая часть
-|6,287
-|3.1
-
-|процедуры на ассемблере
-|3,014
-|1.5
-
-|совместимость с HP/UX
-|4,683
-|2.3
-| всего машинно-зависимая часть
-| 39,634
-| 19.6
+|Категория |Строк кода |Процент от строк ядра
+|заголовочные файлы, зависимые от машины |1,562 |0.8
+|заголовочные файлы драйверов устройств |3,495 |1.7
+|исходный код драйверов устройств |17,506 |8.7
+|Виртуальная память |3,087 |1.5
+|код, зависящий от других машин |6,287 |3.1
+|подпрограммы на языке ассемблера |3,014 |1.5
+|совместимость с HP/UX |4,683 |2.3
|===
-<<table-mach-indep>> суммаризует машинно-независимый код, который составляет ядро 4.4BSD для HP300. Числа во второй колонке обозначают количество строк исходного кода на языке C, заголовочных файлов и ассемблерного кода. Практически весь код ядра написан на языке программирования C; менее двух процентов написано на языке ассемблера. Как показывает статистика в <<table-mach-dep>>, машинно-зависимый код, не включающий поддержку HP/UX и устройств, составляет менее 6.9 процента ядра.
+crossref:design-44bsd[table-mach-indep, Машинно-независимое программное обеспечение в ядре 4.4BSD] показывает статистику машинно-независимого кода, который составляет ядро 4.4BSD для HP300. Числа во второй колонке обозначают количество строк исходного кода на языке C, заголовочных файлов и ассемблерного кода. Практически весь код ядра написан на языке программирования C; менее двух процентов написано на языке ассемблера. Как показывает статистика в crossref:design-44bsd[table-mach-dep, Машинно-зависимое программное обеспечение для HP300 в ядре 4.4BSD], машинно-зависимый код, не включающий поддержку HP/UX и устройств, составляет менее 6.9 процента ядра.
Лишь малая часть ядра отвечает за инициализацию системы. Этот код используется при _начальной загрузке_ системы для перехода в рабочий режим и отвечает за настройку аппаратного и программного окружения ядра (обратитесь к Главе 14). Некоторые операционные системы (особенно те, что ограничены объемом физической памяти) выполняют действия по выгрузке или _перекрытию_ программного кода, выполняющего эти функции, после окончания его работы. Ядро 4.4BSD не работает повторно с памятью, использованной начальным кодом, потому что этот объем памяти составляет менее 0.5 процентов ресурсов ядра, используемых на типичной машине. Также начальный код не находится только в одном месте ядра - он рассредоточен везде, и обычно появляется там, где логически связан с объектом инициализации.
@@ -256,9 +173,9 @@ _Ядро_, по традиционной терминологии операц
[[fig-process-lifecycle]]
.Жизненный цикл процесса
-image::fig1.png[Системные вызовы управления процессами]
+image:fig1.png[Жизненный цикл процесса]
-Жизненный цикл процесса изображен на <<fig-process-lifecycle>>. Процесс может создать новый процесс, который является копией исходного процесса с помощью системного вызова _fork_. Возврат из вызова _fork_ происходит два раза: один раз в родительском процессе, в котором возвращаемое значение является идентификатором порожденного процесса, и второй раз в порожденном процессе, в котором возвращаемое значение равно 0. Связь родитель-потомок порождает иерархическую структуру процессов в системе. Новый процесс имеет доступ ко всем ресурсам его родителя, таким, как файловые дескрипторы, состояние обработки сигналов и распределение памяти.
+Жизненный цикл процесса изображен на рисунке crossref:design-44bsd[fig-process-lifecycle,Жизненный цикл процесса]. Процесс может создать новый процесс, который является копией исходного процесса с помощью системного вызова _fork_. Возврат из вызова _fork_ происходит два раза: один раз в родительском процессе, в котором возвращаемое значение является идентификатором порожденного процесса, и второй раз в порожденном процессе, в котором возвращаемое значение равно 0. Связь родитель-потомок порождает иерархическую структуру процессов в системе. Новый процесс имеет доступ ко всем ресурсам его родителя, таким, как файловые дескрипторы, состояние обработки сигналов и распределение памяти.
Хотя есть ситуации, когда процесс должен быть копией своего родителя, наиболее типичным и полезным действием является загрузка и выполнение другой программы. Процесс может заместить себя образом памяти другой программы, передавая вновь созданному образу набор параметров, при помощи системного вызова _execve_. Одним из параметров является имя файла, содержимое которого имеет формате, распознаваемый системой - это либо двоичный выполняемый файл, либо файл, который приводит к запуску указанной программы интерпретации для обработки его содержимого.
@@ -268,7 +185,7 @@ image::fig1.png[Системные вызовы управления проце
Подробное описание того, как ядро создает и уничтожает процессы, дается в Главе 5.
-Планирование выполнения процессов осуществляется согласно параметру _приоритетности процесса_. Этот приоритет управляется алгоритмом планирования задач в ядре. Пользователи могут влиять на выполнение процесса, задавая этот параметр (_nice_), который влияет на суммарный приоритет, но но ограничен использованием ресурсов CPU согласно алгоритму планировщика задач ядра.
+Планирование выполнения процессов осуществляется согласно параметру _приоритетности процесса_. Этот приоритет управляется алгоритмом планирования задач в ядре. Пользователи могут влиять на выполнение процесса, задавая этот параметр (_nice_), который влияет на суммарный приоритет, но ограничен использованием ресурсов CPU согласно алгоритму планировщика задач ядра.
==== Сигналы
@@ -307,11 +224,11 @@ image::fig1.png[Системные вызовы управления проце
В 4.2BSD требовалось реализовать поддержку больших несвязанных адресных пространств, отображаемых в память файлов и совместно используемой памяти. Был спроектирован интерфейс, который назвали _mmap_, позволяющий несвязанным процессам запрашивать отображение в их адресное пространство файла в режиме совместного использования. Если несколько процессов отображают в свое адресное пространство один и тот же файл, то изменение адресного пространства процесса, соответствующего файлу, в одном процессе, будет отображено в области отображения этого файла в другом процессе, а также и в самом файле. Однако в конце концов 4.2BSD была выпущена без интерфейса _mmap_ из-за необходимости сделать в первую очередь другие возможности, такие, как работа с сетью.
-Затем разработка интерфейса _mmap_ продолжалась во время работы над 4.3BSD. Более 40 компаний и исследовательских групп принимали участие в обсуждениях, которые привели к появлению обновленной концепции, описанной в Berkeley Software Architecture Manual <<biblio-mckusick-1, [McKusick et al, 1994]>>. Несколько компаний реализовали этот обновленный интерфейс <<biblio-gingell, [Gingell et al, 1987]>>.
+Затем разработка интерфейса _mmap_ продолжалась во время работы над 4.3BSD. Более 40 компаний и исследовательских групп принимали участие в обсуждениях, которые привели к появлению обновленной концепции, описанной в Berkeley Software Architecture Manual crossref:design-44bsd[biblio-mckusick-1, [McKusick et al, 1994]]. Несколько компаний реализовали этот обновленный интерфейс crossref:design-44bsd[biblio-gingell, [Gingell et al, 1987]].
И снова сроки разработки не позволили включить в 4.3BSD реализацию этого интерфейса. Хотя позже она могла быть встроена в имеющуюся подсистему виртуальной памяти 4.3BSD, разработчики решили не включать ее сюда. потому что этой реализации было уже более 10 лет. Более того, оригинальная архитектура виртуальной памяти была основана на предположении, что компьютерная память мала и дорога, а диски подключены непосредственно к компьютеру, быстры и дешевы. Поэтому подсистема виртуальной памяти была разработана с упором на бережное использование памяти ценой более частых обращений к диску. Вдобавок реализация в 4.3BSD была пронизана зависимостями от аппаратной системы управления памятью машин VAX, что препятствовало ее переносу на другие аппаратные платформы. И наконец, подсистема виртуальной памяти не была предназначена для поддержки связных многопроцессорных систем, которые сейчас становятся все более распространенными и необходимыми.
-Попытки постепенно усовершенствовать старую реализацию заведомо были обречены на неудачу. Полностью новая архитектура, с другой стороны, могла бы использовать большие объемы памяти, уменьшить дисковые операции и обеспечивать работу с несколькими процессорами. Наконец, система виртуальной памяти в 4.4BSD была полностью изменена. Система виртуальной памяти 4.4BSD основана на системе виртуальной памяти (VM) Mach 2.0 <<biblio-tevanian, [Tevanian, 1987]>> с заимствованиями из Mach 2.5 и Mach 3.0. В ней была эффективная поддержка совместного использования, полное разделение машинно-зависимой и машинно-независимой частей, а также (сейчас не используемая) поддержка работы с несколькими процессорами. Процессы могут отображать файлы в любую область своего адресного пространства. Они могут совместно использовать части своих адресных пространств посредством отображения в память одного и того же файла. Изменения, сделанные одним процессом, видны в адресном пространстве другого процесса, а также записываются и в сам файл. Процессы могут также запрашивать эксклюзивное отображение файла в память, при котором любые изменения, сделанные процессом, не видны другим процессам, которые отображают файл в память и не записываются обратно в файл.
+Попытки постепенно усовершенствовать старую реализацию заведомо были обречены на неудачу. Полностью новая архитектура, с другой стороны, могла бы использовать большие объемы памяти, уменьшить дисковые операции и обеспечивать работу с несколькими процессорами. Наконец, система виртуальной памяти в 4.4BSD была полностью изменена. Система виртуальной памяти 4.4BSD основана на системе виртуальнй памяти (VM) crossref:design-44bsd[biblio-tevanian, [Tevanian, 1987]] с заимствованиями из Mach 2.5 и Mach 3.0. В ней была эффективная поддержка совместного использования, полное разделение машинно-зависимой и машинно-независимой частей, а также (сейчас не используемая) поддержка работы с несколькими процессорами. Процессы могут отображать файлы в любую область своего адресного пространства. Они могут совместно использовать части своих адресных пространств посредством отображения в память одного и того же файла. Изменения, сделанные одним процессом, видны в адресном пространстве другого процесса, а также записываются и в сам файл. Процессы могут также запрашивать эксклюзивное отображение файла в память, при котором любые изменения, сделанные процессом, не видны другим процессам, которые отображают файл в память и не записываются обратно в файл.
Еще одной проблемой с системой виртуальной памяти является способ, которым информация передается ядру при выполнении системного вызова. 4.4BSD всегда копирует данные из адресного пространства процесса в буфер ядра. Для операций чтения и записи, при которых передаются большие объемы данных, выполнение копирования может оказаться занимающим время процессом. Альтернативным способом является манипуляции с адресным пространством процесса в ядре. Ядро 4.4BSD всегда копирует данные о нескольким причинам:
@@ -326,14 +243,14 @@ image::fig1.png[Системные вызовы управления проце
Ядро часто выполняет выделение памяти, которое нужно только для выполнения единственного системного вызова. В пользовательском процессе такая кратковременно используемая память будет выделяться в стеке во время выполнения. Так как ядро имеет ограниченный объем стека времени выполнения, то неэффективно выделять в нем даже блоки памяти среднего размера. Таким образом, такая память должна выделяться посредством более гибкого механизма. Например, когда системный вызов должен преобразовать имя каталога, он должен выделить буфер размером 1 Кбайт для хранения имени. Другие блоки памяти должны выделяться на более продолжительный срок, чем один системный вызов, и поэтому не могут выделяться в стеке, даже если там есть место. В качестве примера можно взять блоки управления протоколами, которые существуют на всем протяжении сетевого соединения.
-Необходимость в динамическом выделении памяти в ядре становилась все более острой вместе с добавлением количества сервисов. Общий механизм выделения памяти уменьшает сложность написания кода в ядре. Поэтому в 4.4BSD ядро имеет единый механизм выделения памяти, который может использоваться в любой части системы. У него есть интерфейс, похожий на функции библиотеки языка C _malloc_ и _free_, которые обеспечивают выделение памяти в прикладных программах <<biblio-mckusick-2, [McKusick & Karels, 1988]>>. Как интерфейс библиотеки языка C, функция выделения памяти получает параметр, указывающий на размер памяти, который необходим. Диапазон запрашиваемых объемов выделяемой памяти не ограничен; однако выделяемая физическая память не подвергается постраничной подгрузке. Функции освобождения памяти передается указатель на освобождаемый участок памяти, но указывать размер освобождаемого участка памяти не нужно.
+Необходимость в динамическом выделении памяти в ядре становилась все более острой вместе с добавлением количества сервисов. Общий механизм выделения памяти уменьшает сложность написания кода в ядре. Поэтому в 4.4BSD ядро имеет единый механизм выделения памяти, который может использоваться в любой части системы. У него есть интерфейс, похожий на функции библиотеки языка C _malloc_ и _free_, которые обеспечивают выделение памяти в прикладных программах crossref:design-44bsd[biblio-mckusick-2, [McKusick & Karels, 1988]]. Как интерфейс библиотеки языка C, функция выделения памяти получает параметр, указывающий на размер памяти, который необходим. Диапазон запрашиваемых объемов выделяемой памяти не ограничен; однако выделяемая физическая память не подвергается постраничной подгрузке. Функции освобождения памяти передается указатель на освобождаемый участок памяти, но указывать размер освобождаемого участка памяти не нужно.
[[overview-io-system]]
=== Система ввода/вывода
Базовой моделью системы ввода/вывода UNIX является последовательность байт, доступ к которым может осуществляться как последовательно, так и в в произвольном порядке. В типичном пользовательском процессе UNIX нет таких понятий, как _методы доступа_ или _управляющие блоки_.
-Различные программы используют разнообразные структуры данных, но ядро не связывает ввод/вывод с используемыми структурами. Например, текстовым файлом считается файл из строк символов набора ASCII, которые разделены одним символом новой строки (символ ASCII перевода строки), но ядро не знает ничего об этом соглашении. Для удовлетворения потребностей большинства программ модель еще более упрощена и сводится к потоку байт данных, или _потоку ввода/вывода_. Такое единое представление данных позволяет работать характерному для UNIX подходу на основе инструментов <<biblio-kernighan, [Kernighan & Pike, 1984]>>. Поток ввода/вывода одной программы может быть подан в качестве входной информации практически любой другой программе. (Этот тип традиционных для UNIX потоков ввода/выводы не нужно путать с потоковой системой ввода/вывода из Eighth Edition или с потоками из System V, Release 3 (STREAMS), оба из которых доступны как обычные потоки ввода/вывода.)
+Различные программы используют разнообразные структуры данных, но ядро не связывает ввод/вывод с используемыми структурами. Например, текстовым файлом считается файл из строк символов набора ASCII, которые разделены одним символом новой строки (символ ASCII перевода строки), но ядро не знает ничего об этом соглашении. Для удовлетворения потребностей большинства программ модель еще более упрощена и сводится к потоку байт данных, или _потоку ввода/вывода_. Такое единое представление данных позволяет работать характерному для UNIX подходу на основе инструментов crossref:design-44bsd[biblio-kernighan, [Kernighan & Pike, 1984]]. Поток ввода/вывода одной программы может быть подан в качестве входной информации практически любой другой программе. (Этот тип традиционных для UNIX потоков ввода/выводы не нужно путать с потоковой системой ввода/вывода из Eighth Edition или с потоками из System V, Release 3 (STREAMS), оба из которых доступны как обычные потоки ввода/вывода.)
==== Дескрипторы и ввод/вывод
@@ -367,7 +284,7 @@ image::fig1.png[Системные вызовы управления проце
Аппаратные устройства имеют связанные с ними имена файлов, и к ним может обращаться пользователь при помощи тех же самых системных вызовов, что используются для обычных файлов. Ядро может различать _специальный файл устройства_ или просто _специальный файл_, и может определять, к какому устройству он относится, но большинство процессов не выполняют такого распознавания. Терминалы, принтеры и стримеры все доступны как последовательности байт, как дисковые файлы 4.4BSD. Таким образом, особенности работы устройств максимально скрываются ядром, и даже в ядре большинство из них отличаются в драйверах.
-Аппаратные устройства могут быть разделены на _структурированные_ или _неструктурированные_; они известны под названиями _блочные_ и _посимвольные_, соответственно. Как правило, процессы обращаются к устройствам посредством _специальных файлов_ в файловой системе. Операции ввода/вывода, выполняемые с такими файлами, обрабатываются постоянно находящимися в ядре программными модулями, называемыми _драйверами устройств_. Большинство аппаратных устройств для сетевых коммуникаций доступны только при помощи механизмов межпроцессного взаимодействия, и не имеют специальных устройств в пространстве имен файловой системы, так как интерфейс _низкоуровневых сокетов_ дает более естественный интерфейс, чем специальный файл.
+Аппаратные устройства могут быть разделены на _структурированные_ или _неструктурированные_; они известны под названиями _блочные_ и _посимвольные_, соответственно. Как правило, процессы обращаются к устройствам посредством _специальных файлов_ в файловой системе. Операции ввода/вывода, выполняемые с такими файлами, обрабатываются постоянно находящимися в ядре программными модулями, называемыми _драйверами устройств_. Большинство аппаратных устройств для сетевых коммуникаций доступны только при помощи подсистемы межпроцессного взаимодействия, и не имеют специальных устройств в пространстве имен файловой системы, так как интерфейс _низкоуровневых сокетов_ дает более естественный интерфейс, чем специальный файл.
Структурированные или блочные устройства разделяются на диски и магнитные ленты и включают в себя большинство устройств с произвольным доступом. Ядро поддерживает операции буферизации типа чтение-изменение-запись с блочными структурированными устройствами для того, чтобы разрешить последним осуществлять чтение и запись полностью произвольным образом, как с обычными файлами. Файловые системы создаются на блочных устройствах.
@@ -411,17 +328,17 @@ System V предоставляет механизм локального меж
Компонент под названием _имя файла_ является строкой длиной до 255 символов. Эти имена хранятся в файле особого типа, который называется _каталогом_. Информация о файле в каталоге называется _записью каталога_ и включает, кроме имени файла, указатель на сам файл. Записи каталога могут ссылаться как на другие каталоги, так и на обычные файлы. Таким образом формируется иерархия каталогов и файлов, которая и называется файловой системой _filesystem_;
-[[fig-small-fs]]
.Небольшая файловая система
-image::fig2.png[Дерево небольшой файловой системы]
+[[fig-small-fs]]
+image:fig2.png[Дерево небольшой файловой системы]
-Одна небольшая файловая система показана на <<fig-small-fs>>. Каталоги могут содержать подкаталоги, и нет ограничений вложенности одного каталога в другой по глубине. Для соблюдения целостности файловой системы, ядро не позволяет процессу производить запись непосредственно в каталоги. Файловая система может хранить не только обычные файлы и каталоги, но также ссылки на другие объекты, такие, как устройства и сокеты.
+Одна небольшая файловая система показана на crossref:design-44bsd[fig-small-fs, A small filesystem]. Каталоги могут содержать подкаталоги, и нет ограничений вложенности одного каталога в другой по глубине. Для соблюдения целостности файловой системы, ядро не позволяет процессу производить запись непосредственно в каталоги. Файловая система может хранить не только обычные файлы и каталоги, но также ссылки на другие объекты, такие, как устройства и сокеты.
Файловая система образует дерево, начало которого находится в _корневом каталоге_, иногда называемому по имени _слэш_, которое соответствует символу одинарной наклонной черты (/). Корневой каталог содержит файлы; в нашем примере на Рисунке 2.2, он содержит [.filename]#vmunix#, копию выполнимого объектного файла ядра. В нем также расположены каталоги; в этом примере он содержит каталог [.filename]#usr#. Внутри каталога [.filename]#usr# располагается каталог [.filename]#bin#, который в основном содержит выполнимый объектный код программ, таких, как [.filename]#ls# и [.filename]#vi#.
Процесс обращается к файлу, указывая _путь_ до него, который является строкой, состоящей из нескольких или ни одного имен файлов, разделенных символами слэша (/). С каждым процессом ядро связывает два каталога, при помощи которых можно интерпретировать маршруты до файлов. _Корневой каталог_ процесса является самой верхней точкой файловой системы, которую может достичь процесс; обычно он соответствует корневому каталогу всей файловой системы. Маршрут, начинающийся с символа слэша, называется _абсолютным маршрутом_, и интерпретируется ядром, начиная с корневого каталога процесса.
-Имя пути, которое не начинается со слэша, называется _относительным маршрутом_, и интерпретируется относительно _текущего рабочего каталога_ процесса. (Этот каталог кратко также называют _текущим каталогом_ или _рабочим каталогом_.) Текущий каталог сам по себе можно обозначить непосредственно по имени _dot_, что соответствует одной точке ([.filename]#.#). Имя файла _dot-dot_ ([.filename]#..#) обозначает родительский каталог текущего каталога. Корневой каталог является предком самому себе.
+Имя пути, которое не начинается со слэша, называется _относительным маршрутом_, и интерпретируется относительно _текущего рабочего каталога_ процесса. (Этот каталог кратко также называют _текущим каталогом_ или _рабочим каталогом_.) Текущий каталог сам по себе можно обозначить непосредственно по имени _dot_, что соответствует одной точке (`.`). Имя файла _dot-dot_ (`..`) обозначает родительский каталог текущего каталога. Корневой каталог является предком самому себе.
Процесс может задать собственный корневой каталог при помощи системного вызова _chroot_, и установить текущий каталог системным вызовом _chdir_. Каждый процесс может в любой момент выполнить вызов _chdir_, но _chroot_ позволено выполнять только процессу с административными привилегиями. _Chroot_ обычно используется для ограничения доступа к системе.
@@ -435,6 +352,7 @@ image::fig2.png[Дерево небольшой файловой системы]
Файлы организованы иерархически в _каталоги_. Каталог является типом файла, но, в отличие от обычных файлов, каталог имеет структуру, определяемую системой. Процесс может читать каталог, как будто это обычный файл, но только ядру разрешено изменять каталог. Каталоги создаются системным вызовом _mkdir_ и удаляются системным вызовом _rmdir_. До 4.2BSD системные вызовы _mkdir_ и _rmdir_ были реализованы как последовательность системных вызовов _link_ и _unlink_. Имелось три причины для добавления системных вызовов специально для создания и удаления каталогов:
+[arabic]
. Операция может быть сделана атомарной. Если система завершила работу аварийно, то каталог не может оставаться в промежуточном состоянии, что может случиться при последовательном вызове серии операций.
. При работе сетевой файловой системы создание и удаление файлов и каталогов должны выполняться атомарно, чтобы могли выполняться последовательно.
. При реализации поддержки не-UNIX файловых систем, таких, как файловая система MS-DOS, на другом разделе диска, может оказаться, что эта файловая система не поддерживает ссылочных операций. Хотя другие файловые системы могут поддерживать концепцию каталогов, скорее всего, они не будут создавать и удалять каталоги со ссылками, как это делается в файловой системе UNIX. Соответственно они могут создавать и и удалять каталоги только при наличии явных запросов на удаление или создание каталогов.
@@ -447,6 +365,7 @@ image::fig2.png[Дерево небольшой файловой системы]
Вновь создаваемым файлам присваивается идентификатор пользователя процесса, который их создал, и идентификатор группы каталога, в котором они были созданы. Для защиты файлов применяется трехуровневый механизм управления доступом. Эти три уровня определяют доступность файла для
+[arabic]
. Пользователя, который является владельцем файла
. Группы, которая приписана файлу
. Всех остальных
@@ -457,7 +376,7 @@ image::fig2.png[Дерево небольшой файловой системы]
Ранние версии UNIX имели ограничение в 14 символов на имя файла. Это ограничение зачастую вызывало проблемы. Например, кроме естественного желания пользователей давать файлам длинные описательные имена, распространенным способом формировать имена файлов является использование формата [.filename]#basename.extension#, где расширение (указывающее на тип файла, скажем, `.c` для исходного года на языке C или `.o` для промежуточного двоичного объекта) имеет длину от одного до трех символов, оставляя от 10 до 12 символов на имя файла. Системы управления исходным кодом и редакторы обычно используют дополнительно два символа для своих целей, для префикса или суффикса имени файла, при этом остается от восьми до 10 символов. В качестве имени файла легко использовать от 10 до 12 символов одного английского слова (например, `multiplexer`).
-Можно смириться с этими ограничениями, но это непоследовательно и даже опасно, потому что другие системы UNIX могут работать со строками, превышающими этот лимит, при создании файлов, но затем имя будет _обрезано_. Исходный файл с именем [.filename]#multiplexer.c#, содержащий исходный код на языке C, (уже 13 символов) может иметь соответствующий файл из системы управления исходным кодом с префиксом `s.`, при этом получается имя файла [.filename]#s.multiplexer#, которое не не будет отличаться от файла системы управления исходным кодом для файла [.filename]#multiplexer.ms#, содержащего исходный код `troff` для документации программы на языке C. Содержимое двух оригинальных файлов может оказаться перепутанным без каких-либо предупреждений от системы управления исходным кодом. При тщательном кодировании эту проблему можно обнаружить, но поддержка длинных имен файлов, впервые появившаяся в 4.2BSD, практически полностью ликвидировала эту проблему.
+Можно смириться с этими ограничениями, но это непоследовательно и даже опасно, потому что другие системы UNIX могут работать со строками, превышающими этот лимит, при создании файлов, но затем имя будет _обрезано_. Исходный файл с именем [.filename]#multiplexer.c#, содержащий исходный код на языке C, (уже 13 символов) может иметь соответствующий файл из системы управления исходным кодом с префиксом `s.`, при этом получается имя файла [.filename]#s.multiplexer#, которое не будет отличаться от файла системы управления исходным кодом для файла [.filename]#multiplexer.ms#, содержащего исходный код `troff` для документации программы на языке C. Содержимое двух оригинальных файлов может оказаться перепутанным без каких-либо предупреждений от системы управления исходным кодом. При тщательном кодировании эту проблему можно обнаружить, но поддержка длинных имен файлов, впервые появившаяся в 4.2BSD, практически полностью ликвидировала эту проблему.
[[overview-filestore]]
=== Размещение файлов
@@ -467,7 +386,7 @@ image::fig2.png[Дерево небольшой файловой системы]
Другой частью локальной файловой системы является организация и управление данными на носителях информации. Размещение содержимого файлов на носителях является вопросом хранилища файлов. В 4.4BSD поддерживает три различных типа хранилищ файлов:
* Традиционная файловая система Berkeley Fast Filesystem
-* Журналируемая файловая система, основанная на архитектуре операционной системы Sprite <<biblio-rosenblum, [Rosenblum & Ousterhout, 1992]>>
+* Журналируемая файловая система, основанная на архитектуре операционной системы Sprite crossref:design-44bsd[biblio-rosenblum, [Rosenblum & Ousterhout, 1992]]
* Файловая система в памяти
Хотя организация этих хранилищ совершенно различна, эти различия скрыты от процессов, использующих файловые системы.
@@ -487,7 +406,7 @@ image::fig2.png[Дерево небольшой файловой системы]
Когда локальный клиент выполняет операцию на удаленной файловой системе, оформляется и посылается запрос к серверу. Сервер выполняет запрошенную операцию и возвращает либо запрошенную информацию, либо ошибку, почему запрос был отклонен. Для получения удовлетворительной производительности, клиент должен кэшировать данные, к которым доступ осуществляется часто. Сложность удаленных файловых систем отражается на поддержке соответствия между сервером и множеством его клиентов.
-Хотя за эти годы было разработано множество протоколов работы с удаленными файловыми системами, самой распространенной на системах UNIX является сетевая файловая система Network Filesystem (NFS), которая была спроектирована и реализована в Sun Microsystems. Ядро 4.4BSD поддерживает протокол NFS, хотя его реализация была выполнена независимо от спецификаций протокола <<biblio-macklem, [Macklem, 1994]>>. Протокол NFS описан в Главе 9.
+Хотя за эти годы было разработано множество протоколов работы с удаленными файловыми системами, самой распространенной на системах UNIX является сетевая файловая система Network Filesystem (NFS), которая была спроектирована и реализована в Sun Microsystems. Ядро 4.4BSD поддерживает протокол NFS, хотя его реализация была выполнена независимо от спецификаций протокола crossref:design-44bsd[biblio-macklem, [Macklem, 1994]]. Протокол NFS описан в Главе 9.
[[overview-terminal]]
=== Терминалы
@@ -510,7 +429,7 @@ image::fig2.png[Дерево небольшой файловой системы]
Каждый из этих сервисов преобразования может быть независимо выключен процессом при помощи управляющих запросов.
[[overview-ipc]]
-=== Коммуникации между процессами
+=== Межпроцессное взаимодействие
Межпроцессные коммуникации в 4.4BSD организованы в _коммуникационные домены_. К поддерживаемым на данный момент доменам относятся _локальный домен_ для взаимодействия между процессами, выполняющимися на одной и той же машине; _межсетевой домен_ для связи между процессами посредством набора протоколов TCP/IP (возможно, в сети Интернет); семейство протоколов ISO/OSI для взаимодействия между сайтами, которым нужна именно такая связь, и _домен XNS_ для коммуникаций между процессами при помощи протоколов XEROX Network Systems (XNS).
@@ -520,7 +439,7 @@ image::fig2.png[Дерево небольшой файловой системы]
Сокеты могут иметь адреса, связанные с ними. Формат и смысл адресов сокетов зависят от коммуникационного домена, в котором был создан сокет. Привязка имени к сокету в локальном домене приводит к созданию файла в файловой системе.
-Обычные данные, передаваемые и получаемые при помощи сокетов, не имеют типа. Вопросы представления данных зависят от библиотек, которые находятся на верху коммуникационных сервисов. Вдобавок к передаче обычных данных, коммуникационные домены могут поддерживать передачу и прием специальных типов данных, которые называются _правами доступа_. Например, локальный домен использует эту возможность для передачи дескрипторов между процессами.
+Обычные данные, передаваемые и получаемые при помощи сокетов, не имеют типа. Вопросы представления данных зависят от библиотек, которые находятся на верху коммуникационной подсистемы. Вдобавок к передаче обычных данных, коммуникационные домены могут поддерживать передачу и прием специальных типов данных, которые называются _правами доступа_. Например, локальный домен использует эту возможность для передачи дескрипторов между процессами.
До 4.2BSD сетевые реализации в UNIX обычно работали через интерфейсы символьных устройств. Одной из целей создания интерфейса сокетов было обеспечение работы простеньким программам без изменения на потоковых соединениях. Такие программы могут работать, если только не меняются системные вызовы _read_ и _write_. Соответственно, оригинальные интерфейсы не трогались, но были исправлены для работы с потоковыми сокетами. Для более сложных сокетов, таких, как те, что используются для посылки датаграмм и в которых при каждом вызове _send_ должен указываться адрес назначения, был добавлен новый интерфейс.
@@ -553,7 +472,7 @@ image::fig2.png[Дерево небольшой файловой системы]
[bibliography]
[[references]]
-== Ссылки
+== Список литературы
[[biblio-accetta]] Accetta et al, 1986 Mach: A New Kernel Foundation for UNIX Development" M.Accetta R.Baron W.Bolosky D.Golub R.Rashid A.Tevanian M.Young 93-113 USENIX Association Conference Proceedings USENIX Association June 1986
diff --git a/documentation/content/ru/books/design-44bsd/_index.po b/documentation/content/ru/books/design-44bsd/_index.po
new file mode 100644
index 0000000000..e94660b26e
--- /dev/null
+++ b/documentation/content/ru/books/design-44bsd/_index.po
@@ -0,0 +1,3677 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-03 18:09+0300\n"
+"PO-Revision-Date: 2025-10-03 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdesign-44bsd_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/design-44bsd/_index.adoc:1
+#, no-wrap
+msgid "Donated by Addison-Wesley, provides a design overview of 4.4BSD, from which FreeBSD was originally derived"
+msgstr "Предоставлено издательством Addison-Wesley и предоставляет обзор архитектуры 4.4BSD, от которой изначально произошел FreeBSD"
+
+#. type: Title =
+#: documentation/content/en/books/design-44bsd/_index.adoc:1
+#: documentation/content/en/books/design-44bsd/_index.adoc:16
+#, no-wrap
+msgid "The Design and Implementation of the 4.4BSD Operating System"
+msgstr "Архитектура и реализация операционной системы 4.4BSD"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:50
+msgid "'''"
+msgstr "'''"
+
+#. type: Title ==
+#: documentation/content/en/books/design-44bsd/_index.adoc:54
+#, no-wrap
+msgid "Design Overview of 4.4BSD"
+msgstr "Обзор архитектуры 4.4BSD"
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:57
+#, no-wrap
+msgid "4.4BSD Facilities and the Kernel"
+msgstr "Подсистемы и ядро 4.4BSD"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:61
+msgid ""
+"The 4.4BSD kernel provides four basic facilities: processes, a filesystem, "
+"communications, and system startup. This section outlines where each of "
+"these four basic services is described in this book."
+msgstr ""
+"Ядро 4.4BSD предоставляет четыре базовых подсистемы: процессы, файловую "
+"систему, коммуникации и запуск системы. Этот раздел перечисляет, в каком "
+"месте этой книги описана каждая из этих подсистем."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:63
+msgid ""
+"Processes constitute a thread of control in an address space. Mechanisms for "
+"creating, terminating, and otherwise controlling processes are described in "
+"Chapter 4. The system multiplexes separate virtual-address spaces for each "
+"process; this memory management is discussed in Chapter 5."
+msgstr ""
+"Процессы образуют поток управления в адресном пространстве. Механизмы "
+"создания, завершения и другие управляющие процессы описаны в Главе 4. Для "
+"каждого процесса система мультиплексирует отдельное виртуальное адресное "
+"пространство; такое управление памятью обсуждается в Главе 5."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:64
+msgid ""
+"The user interface to the filesystem and devices is similar; common aspects "
+"are discussed in Chapter 6. The filesystem is a set of named files, "
+"organized in a tree-structured hierarchy of directories, and of operations "
+"to manipulate them, as presented in Chapter 7. Files reside on physical "
+"media such as disks. 4.4BSD supports several organizations of data on the "
+"disk, as set forth in Chapter 8. Access to files on remote machines is the "
+"subject of Chapter 9. Terminals are used to access the system; their "
+"operation is the subject of Chapter 10."
+msgstr ""
+"Механизм доступа пользователя к файловой системе и устройствам один и тот "
+"же; общие аспекты обсуждаются в Главе 6. Файловая система является набором "
+"именованных файлов, организованных в древовидную иерархию каталогов, а "
+"операции по управлению ими представлены в Главе 7. Файлы располагаются на "
+"таких физических носителях, как диски. 4.4BSD поддерживает несколько типов "
+"организации данных на диске, как описано далее в Главе 8. Доступ к файлам на "
+"удаленных машинах является предметом обсуждения в Главе 9. Для доступа к "
+"системе Терминалы используются терминалы; их функционированию посвящена "
+"глава 10."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:65
+msgid ""
+"Communication mechanisms provided by traditional UNIX systems include "
+"simplex reliable byte streams between related processes (see pipes, Section "
+"11.1), and notification of exceptional events (see signals, Section 4.7). "
+"4.4BSD also has a general interprocess-communication facility. This "
+"facility, described in Chapter 11, uses access mechanisms distinct from "
+"those of the filesystem, but, once a connection is set up, a process can "
+"access it as though it were a pipe. There is a general networking framework, "
+"discussed in Chapter 12, that is normally used as a layer underlying the IPC "
+"facility. Chapter 13 describes a particular networking implementation in "
+"detail."
+msgstr ""
+"Механизмы коммуникаций, предоставляемые традиционными UNIX-системами, "
+"включают однонаправленные потоки байтов между связанными процессами "
+"(смотрите материал о конвейерах в Разделе 11.1) и извещение об "
+"исключительных событиях (смотрите материал о сигналах в Разделе 4.7). В "
+"4.4BSD имеется также механизм межпроцессного взаимодействия между "
+"процессами. Этот механизм, описываемый в Главе 11, использует способы "
+"доступа, отличающиеся от тех, что используются в файловой системе, но, как "
+"только соединение установлено, процесс может работать с ним, как будто это "
+"конвейер. Имеется и механизм работы с сетью, описываемый в Главе 12, который "
+"обычно используется как слой ниже механизма IPC. В Главе 13 дается детальное "
+"описание конкретной реализации механизма работы с сетью."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:66
+msgid ""
+"Any real operating system has operational issues, such as how to start it "
+"running. Startup and operational issues are described in Chapter 14."
+msgstr ""
+"В любой операционной системе присутствуют вопросы управления, такие, как ее "
+"запуск. Запуск и вопросы управления обсуждаются в Главе 14."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:70
+msgid ""
+"Sections 2.3 through 2.14 present introductory material related to Chapters "
+"3 through 14. We shall define terms, mention basic system calls, and "
+"explore historical developments. Finally, we shall give the reasons for "
+"many major design decisions."
+msgstr ""
+"Разделы с 2.3 по 2.14 представляют собой вводный материал, относящийся к "
+"главам с 3 по 14. Мы определим понятия, коснемся основных системных вызовов "
+"и рассмотрим исторические разработки. Наконец, мы расскажем о причинах "
+"многих ключевых архитектурных решений."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:71
+#, no-wrap
+msgid "The Kernel"
+msgstr "Ядро"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:78
+msgid ""
+"The _kernel_ is the part of the system that runs in protected mode and "
+"mediates access by all user programs to the underlying hardware (e.g., CPU, "
+"disks, terminals, network links) and software constructs (e.g., filesystem, "
+"network protocols). The kernel provides the basic system facilities; it "
+"creates and manages processes, and provides functions to access the "
+"filesystem and communication facilities. These functions, called _system "
+"calls_ appear to user processes as library subroutines. These system calls "
+"are the only interface that processes have to these facilities. Details of "
+"the system-call mechanism are given in Chapter 3, as are descriptions of "
+"several kernel mechanisms that do not execute as the direct result of a "
+"process doing a system call."
+msgstr ""
+"_Ядро_ является частью системы, которая работает в защищенном режиме и "
+"управляет доступом всех пользовательских программ к низкоуровнему "
+"аппаратному обеспечению (к примеру, ЦПУ, дискам, терминалам, сетевым связям) "
+"и программным компонентам (к примеру, файловой системе, сетевым протоколам). "
+"Ядро предоставляет основные подсистемы; оно создает процессы и управляет "
+"ими, предоставляет функции для доступа к файловой системе и службам связи. "
+"Такие функции, называемые _системными вызовами_, доступны процессам "
+"пользователей в виде библиотечных подпрограмм. Эти системные вызовы являются "
+"единственным способом доступа к этим подсистемам. Подробно механизм работы "
+"системных вызовов дается в Главе 3, вместе с описанием некоторых механизмов "
+"ядра, работа которых не является прямым результатом процесса, выполняющего "
+"системный вызов."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:84
+msgid ""
+"A _kernel_ in traditional operating-system terminology, is a small nucleus "
+"of software that provides only the minimal facilities necessary for "
+"implementing additional operating-system services. In contemporary research "
+"operating systems -- such as Chorus crossref:design-44bsd[biblio-rozier, "
+"[Rozier et al, 1988]], Mach crossref:design-44bsd[biblio-accetta, [Accetta "
+"et al, 1986]], Tunis crossref:design-44bsd[biblio-ewens, [Ewens et al, "
+"1985]], and the V Kernel crossref:design-44bsd[biblio-cheriton, [Cheriton, "
+"1988]] -- this division of functionality is more than just a logical one. "
+"Services such as filesystems and networking protocols are implemented as "
+"client application processes of the nucleus or kernel."
+msgstr ""
+"_Ядро_, по традиционной терминологии операционных систем, является маленьким "
+"куском программного обеспечения, которое предоставляет только минимальный "
+"набор подсистем, необходимый для реализации дополнительных служб "
+"операционной системы. В современных исследовательских операционных системах "
+"— таких, как Chorus crossref:design-44bsd[biblio-rozier, [Rozier et al, "
+"1988]], Mach crossref:design-44bsd[biblio-accetta, [Accetta et al, 1986]], "
+"Tunis crossref:design-44bsd[biblio-ewens, [Ewens et al, 1985]], и V Kernel "
+"crossref:design-44bsd[biblio-cheriton, [Cheriton, 1988]] - такое разделение "
+"функциональности выполнено не только логически. Такие службы, как файловые "
+"системы и сетевые протоколы, выполнены в виде прикладных процессов клиентов "
+"ядра или микроядра."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:93
+msgid ""
+"The 4.4BSD kernel is not partitioned into multiple processes. This basic "
+"design decision was made in the earliest versions of UNIX. The first two "
+"implementations by Ken Thompson had no memory mapping, and thus made no "
+"hardware-enforced distinction between user and kernel space "
+"crossref:design-44bsd[biblio-ritchie, [Ritchie, 1988]]. A message-passing "
+"system could have been implemented as readily as the actually implemented "
+"model of kernel and user processes. The monolithic kernel was chosen for "
+"simplicity and performance. And the early kernels were small; the inclusion "
+"of facilities such as networking into the kernel has increased its size. "
+"The current trend in operating-systems research is to reduce the kernel size "
+"by placing such services in user space."
+msgstr ""
+"Ядро 4.4BSD не разбивается на несколько процессов. Это основополагающее "
+"архитектурное решение было сделано в самых ранних версиях UNIX. В первых "
+"двух реализациях Кена Томпсона (Ken Thompson) не было отображаемой памяти, и "
+"поэтому не было аппаратного различия между адресным пространством "
+"пользователя и ядра crossref:design-44bsd[biblio-ritchie, [Ritchie, 1988]]. "
+"Могла бы быть придумана система обмена сообщениями как реально реализуемая "
+"модель процессов ядра и пользователя. Для простоты и увеличения "
+"производительности было выбрано монолитное ядро. К тому же ранние ядра были "
+"маленькими; включение таких подсистем, как сетевые коммуникации, в ядро "
+"увеличило его размер. Современные тенденции в области операционных систем "
+"сводятся к уменьшению размера ядра за счет перевода таких служб в "
+"пользовательское адресное пространство."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:97
+msgid ""
+"Users ordinarily interact with the system through a command-language "
+"interpreter, called a _shell_, and perhaps through additional user "
+"application programs. Such programs and the shell are implemented with "
+"processes. Details of such programs are beyond the scope of this book, "
+"which instead concentrates almost exclusively on the kernel."
+msgstr ""
+"Пользователи обычно общаются с системой через интерпретатор языка команд, "
+"называемый оболочкой (_shell_), и, может быть, через дополнительные "
+"прикладные пользовательские программы. Такие программы и оболочка "
+"реализованы в виде процессов. Подробное описание таких программ выходит за "
+"рамки этой книги, которая практически полностью посвящена работе ядра."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:100
+msgid ""
+"Sections 2.3 and 2.4 describe the services provided by the 4.4BSD kernel, "
+"and give an overview of the latter's design. Later chapters describe the "
+"detailed design and implementation of these services as they appear in "
+"4.4BSD."
+msgstr ""
+"В разделах 2.3 и 2.4 описываются сервисы, предоставляемые ядром 4.4BSD, и "
+"дается обзор их архитектуры. Последующие главы описывают подробности "
+"архитектуры и реализации этих сервисов в 4.4BSD."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:102
+#, no-wrap
+msgid "Kernel Organization"
+msgstr "Организация ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:105
+msgid ""
+"In this section, we view the organization of the 4.4BSD kernel in two ways:"
+msgstr ""
+"В этом разделе мы рассматриваем организацию ядра 4.4BSD с двух точек зрения:"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:108
+msgid ""
+"As a static body of software, categorized by the functionality offered by "
+"the modules that make up the kernel"
+msgstr ""
+"Как статический блок программного обеспечения, категоризуемый по "
+"функциональности модулей, составляющих ядро"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:109
+msgid ""
+"By its dynamic operation, categorized according to the services provided to "
+"users"
+msgstr ""
+"В его динамике, категоризуемой по услугам, предоставляемым пользователям"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:112
+msgid ""
+"The largest part of the kernel implements the system services that "
+"applications access through system calls. In 4.4BSD, this software has been "
+"organized according to the following:"
+msgstr ""
+"Самая большая часть ядра реализует системные услуги, к которым приложения "
+"обращаются через системные вызовы. В 4.4BSD это программное обеспечение "
+"организуется по следующим принципам:"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:114
+msgid ""
+"Basic kernel facilities: timer and system-clock handling, descriptor "
+"management, and process management"
+msgstr ""
+"Базовые подсистемы ядра: обработка таймеров и системного таймера, управление "
+"дескрипторами и процессами"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:115
+msgid "Memory-management support: paging and swapping"
+msgstr "Поддержка управления памятью: подкачка и выгрузка"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:116
+msgid ""
+"Generic system interfaces: the I/O, control, and multiplexing operations "
+"performed on descriptors"
+msgstr ""
+"Общесистемные интерфейсы: ввод/вывод, управление и мультиплексирование "
+"операций, выполняемых над дескрипторами"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:117
+msgid ""
+"The filesystem: files, directories, pathname translation, file locking, and "
+"I/O buffer management"
+msgstr ""
+"Файловая система: файлы, каталоги, преобразование маршрутов, блокировка "
+"файлов и управление буфером ввода/вывода"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:118
+msgid ""
+"Terminal-handling support: the terminal-interface driver and terminal line "
+"disciplines"
+msgstr ""
+"Поддержка работы с терминалами: драйвер терминального интерфейса и режимы "
+"работы терминального канала"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:119
+msgid "Interprocess-communication facilities: sockets"
+msgstr "Подсистемы межпроцессного взаимодействия: сокеты"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:120
+msgid ""
+"Support for network communication: communication protocols and generic "
+"network facilities, such as routing"
+msgstr ""
+"Поддержка сетевых коммуникаций: коммуникационные протоколы и общесетевые "
+"подсистемы, такие, как маршрутизация"
+
+#. type: Block title
+#: documentation/content/en/books/design-44bsd/_index.adoc:121
+#, no-wrap
+msgid "Machine-independent software in the 4.4BSD kernel"
+msgstr "Машинно-независимое программное обеспечение в ядре 4.4BSD"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:125
+#: documentation/content/en/books/design-44bsd/_index.adoc:165
+#, no-wrap
+msgid "Category"
+msgstr "Категория"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:125
+#: documentation/content/en/books/design-44bsd/_index.adoc:165
+#, no-wrap
+msgid "Lines of code"
+msgstr "Строк кода"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:126
+#: documentation/content/en/books/design-44bsd/_index.adoc:166
+#, no-wrap
+msgid "Percentage of kernel"
+msgstr "Процент от строк ядра"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:126
+#, no-wrap
+msgid "headers"
+msgstr "заголовки"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:126
+#, no-wrap
+msgid "9,393"
+msgstr "9,393"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:127
+#, no-wrap
+msgid "4.6"
+msgstr "4.6"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:127
+#, no-wrap
+msgid "initialization"
+msgstr "инициализация"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:127
+#, no-wrap
+msgid "1,107"
+msgstr "1,107"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:128
+#, no-wrap
+msgid "0.6"
+msgstr "0.6"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:128
+#, no-wrap
+msgid "kernel facilities"
+msgstr "подсистемы ядра"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:128
+#, no-wrap
+msgid "8,793"
+msgstr "8,793"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:129
+#, no-wrap
+msgid "4.4"
+msgstr "4.4"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:129
+#, no-wrap
+msgid "generic interfaces"
+msgstr "универсальные интерфейсы"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:129
+#, no-wrap
+msgid "4,782"
+msgstr "4,782"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:130
+#, no-wrap
+msgid "2.4"
+msgstr "2.4"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:130
+#, no-wrap
+msgid "interprocess communication"
+msgstr "межпроцессное взаимодействие"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:130
+#, no-wrap
+msgid "4,540"
+msgstr "4,540"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:131
+#: documentation/content/en/books/design-44bsd/_index.adoc:136
+#, no-wrap
+msgid "2.2"
+msgstr "2.2"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:131
+#, no-wrap
+msgid "terminal handling"
+msgstr "работа с терминалом"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:131
+#, no-wrap
+msgid "3,911"
+msgstr "3,911"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:132
+#, no-wrap
+msgid "1.9"
+msgstr "1.9"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:132
+#: documentation/content/en/books/design-44bsd/_index.adoc:169
+#, no-wrap
+msgid "virtual memory"
+msgstr "Виртуальная память"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:132
+#, no-wrap
+msgid "11,813"
+msgstr "11,813"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:133
+#, no-wrap
+msgid "5.8"
+msgstr "5.8"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:133
+#, no-wrap
+msgid "vnode management"
+msgstr "управление vnode"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:133
+#, no-wrap
+msgid "7,954"
+msgstr "7,954"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:134
+#, no-wrap
+msgid "3.9"
+msgstr "3.9"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:134
+#, no-wrap
+msgid "filesystem naming"
+msgstr "имена в файловой системы"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:134
+#, no-wrap
+msgid "6,550"
+msgstr "6,550"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:135
+#, no-wrap
+msgid "3.2"
+msgstr "3.2"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:135
+#, no-wrap
+msgid "fast filestore"
+msgstr "быстрое хранилище файлов"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:135
+#, no-wrap
+msgid "4,365"
+msgstr "4,365"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:136
+#, no-wrap
+msgid "log-structure filestore"
+msgstr "логическая структура файлового хранилища"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:136
+#, no-wrap
+msgid "4,337"
+msgstr "4,337"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:137
+#: documentation/content/en/books/design-44bsd/_index.adoc:139
+#, no-wrap
+msgid "2.1"
+msgstr "2.1"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:137
+#, no-wrap
+msgid "memory-based filestore"
+msgstr "хранилище файлов в памяти"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:137
+#, no-wrap
+msgid "645"
+msgstr "645"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:138
+#, no-wrap
+msgid "0.3"
+msgstr "0.3"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:138
+#, no-wrap
+msgid "cd9660 filesystem"
+msgstr "cd9660 файловая система"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:138
+#, no-wrap
+msgid "4,177"
+msgstr "4,177"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:139
+#, no-wrap
+msgid "miscellaneous filesystems (10)"
+msgstr "различные файловые системы (10)"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:139
+#, no-wrap
+msgid "12,695"
+msgstr "12,695"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:140
+#, no-wrap
+msgid "6.3"
+msgstr "6.3"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:140
+#, no-wrap
+msgid "network filesystem"
+msgstr "сетевая файловая система"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:140
+#, no-wrap
+msgid "17,199"
+msgstr "17,199"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:141
+#, no-wrap
+msgid "8.5"
+msgstr "8.5"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:141
+#, no-wrap
+msgid "network communication"
+msgstr "сетевое взаимодействие"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:141
+#, no-wrap
+msgid "8,630"
+msgstr "8,630"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:142
+#, no-wrap
+msgid "4.3"
+msgstr "4.3"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:142
+#, no-wrap
+msgid "internet protocols"
+msgstr "интернет-протоколы"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:142
+#, no-wrap
+msgid "11,984"
+msgstr "11,984"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:143
+#, no-wrap
+msgid "5.9"
+msgstr "5.9"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:143
+#, no-wrap
+msgid "ISO protocols"
+msgstr "протоколы ISO"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:143
+#, no-wrap
+msgid "23,924"
+msgstr "23,924"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:144
+#, no-wrap
+msgid "11.8"
+msgstr "11.8"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:144
+#, no-wrap
+msgid "X.25 protocols"
+msgstr "протоколы X.25"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:144
+#, no-wrap
+msgid "10,626"
+msgstr "10,626"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:145
+#, no-wrap
+msgid "5.3"
+msgstr "5.3"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:145
+#, no-wrap
+msgid "XNS protocols"
+msgstr "протоколы XNS"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:145
+#, no-wrap
+msgid "5,192"
+msgstr "5,192"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:146
+#, no-wrap
+msgid "2.6"
+msgstr "2.6"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:149
+msgid ""
+"Most of the software in these categories is machine independent and is "
+"portable across different hardware architectures."
+msgstr ""
+"Большая часть программного обеспечения в этих категориях является машинно-"
+"независимой и переносима между различными аппаратными архитектурами."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:154
+msgid ""
+"The machine-dependent aspects of the kernel are isolated from the mainstream "
+"code. In particular, none of the machine-independent code contains "
+"conditional code for specific architecture. When an architecture-dependent "
+"action is needed, the machine-independent code calls an architecture-"
+"dependent function that is located in the machine-dependent code. The "
+"software that is machine dependent includes"
+msgstr ""
+"Машинно-зависимые аспекты ядра отделены от основного кода. В частности, ни в "
+"одной части машинно-независимого кода не содержится кода, зависимого от "
+"конкретной архитектуры. Когда требуется произвести действия, зависимые от "
+"архитектуры, машинно-независимый код вызывает функцию, зависимую от "
+"архитектуры машины, которая находится в машинно-зависимой части кода. "
+"Машинно-зависимое программное обеспечение включает в себя"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:156
+msgid "Low-level system-startup actions"
+msgstr "Низкоуровневые действия по запуску системы"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:157
+msgid "Trap and fault handling"
+msgstr "Обработка исключительных ситуаций и прерываний"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:158
+msgid "Low-level manipulation of the run-time context of a process"
+msgstr "Низкоуровневые манипуляции процессом во время работы"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:159
+msgid "Configuration and initialization of hardware devices"
+msgstr "Конфигурация и инициализация аппаратных устройств"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:160
+msgid "Run-time support for I/O devices"
+msgstr "Поддержка устройств ввода/вывода во время работы"
+
+#. type: Block title
+#: documentation/content/en/books/design-44bsd/_index.adoc:161
+#, no-wrap
+msgid "Machine-dependent software for the HP300 in the 4.4BSD kernel"
+msgstr "Машинно-зависимое программное обеспечение для HP300 в ядре 4.4BSD"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:166
+#, no-wrap
+msgid "machine dependent headers"
+msgstr "заголовочные файлы, зависимые от машины"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:166
+#, no-wrap
+msgid "1,562"
+msgstr "1,562"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:167
+#, no-wrap
+msgid "0.8"
+msgstr "0.8"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:167
+#, no-wrap
+msgid "device driver headers"
+msgstr "заголовочные файлы драйверов устройств"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:167
+#, no-wrap
+msgid "3,495"
+msgstr "3,495"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:168
+#, no-wrap
+msgid "1.7"
+msgstr "1.7"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:168
+#, no-wrap
+msgid "device driver source"
+msgstr "исходный код драйверов устройств"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:168
+#, no-wrap
+msgid "17,506"
+msgstr "17,506"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:169
+#, no-wrap
+msgid "8.7"
+msgstr "8.7"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:169
+#, no-wrap
+msgid "3,087"
+msgstr "3,087"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:170
+#: documentation/content/en/books/design-44bsd/_index.adoc:172
+#, no-wrap
+msgid "1.5"
+msgstr "1.5"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:170
+#, no-wrap
+msgid "other machine dependent"
+msgstr "код, зависящий от других машин"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:170
+#, no-wrap
+msgid "6,287"
+msgstr "6,287"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:171
+#, no-wrap
+msgid "3.1"
+msgstr "3.1"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:171
+#, no-wrap
+msgid "routines in assembly language"
+msgstr "подпрограммы на языке ассемблера"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:171
+#, no-wrap
+msgid "3,014"
+msgstr "3,014"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:172
+#, no-wrap
+msgid "HP/UX compatibility"
+msgstr "совместимость с HP/UX"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:172
+#, no-wrap
+msgid "4,683"
+msgstr "4,683"
+
+#. type: Table
+#: documentation/content/en/books/design-44bsd/_index.adoc:173
+#, no-wrap
+msgid "2.3"
+msgstr "2.3"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:179
+msgid ""
+"crossref:design-44bsd[table-mach-indep, Machine-independent software in the "
+"4.4BSD kernel] summarizes the machine-independent software that constitutes "
+"the 4.4BSD kernel for the HP300. The numbers in column 2 are for lines of C "
+"source code, header files, and assembly language. Virtually all the "
+"software in the kernel is written in the C programming language; less than 2 "
+"percent is written in assembly language. As the statistics in "
+"crossref:design-44bsd[table-mach-dep, Machine-dependent software in the "
+"4.4BSD kernel] show, the machine-dependent software, excluding HP/UX and "
+"device support, accounts for a minuscule 6.9 percent of the kernel."
+msgstr ""
+"crossref:design-44bsd[table-mach-indep, Машинно-независимое программное "
+"обеспечение в ядре 4.4BSD] показывает статистику машинно-независимого кода, "
+"который составляет ядро 4.4BSD для HP300. Числа во второй колонке обозначают "
+"количество строк исходного кода на языке C, заголовочных файлов и "
+"ассемблерного кода. Практически весь код ядра написан на языке "
+"программирования C; менее двух процентов написано на языке ассемблера. Как "
+"показывает статистика в crossref:design-44bsd[table-mach-dep, Машинно-"
+"зависимое программное обеспечение для HP300 в ядре 4.4BSD], машинно-"
+"зависимый код, не включающий поддержку HP/UX и устройств, составляет менее "
+"6.9 процента ядра."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:185
+msgid ""
+"Only a small part of the kernel is devoted to initializing the system. This "
+"code is used when the system is _bootstrapped_ into operation and is "
+"responsible for setting up the kernel hardware and software environment (see "
+"Chapter 14). Some operating systems (especially those with limited physical "
+"memory) discard or _overlay_ the software that performs these functions "
+"after that software has been executed. The 4.4BSD kernel does not reclaim "
+"the memory used by the startup code because that memory space is barely 0.5 "
+"percent of the kernel resources used on a typical machine. Also, the "
+"startup code does not appear in one place in the kernel -- it is scattered "
+"throughout, and it usually appears in places logically associated with what "
+"is being initialized."
+msgstr ""
+"Лишь малая часть ядра отвечает за инициализацию системы. Этот код "
+"используется при _начальной загрузке_ системы для перехода в рабочий режим и "
+"отвечает за настройку аппаратного и программного окружения ядра (обратитесь "
+"к Главе 14). Некоторые операционные системы (особенно те, что ограничены "
+"объемом физической памяти) выполняют действия по выгрузке или _перекрытию_ "
+"программного кода, выполняющего эти функции, после окончания его работы. "
+"Ядро 4.4BSD не работает повторно с памятью, использованной начальным кодом, "
+"потому что этот объем памяти составляет менее 0.5 процентов ресурсов ядра, "
+"используемых на типичной машине. Также начальный код не находится только в "
+"одном месте ядра - он рассредоточен везде, и обычно появляется там, где "
+"логически связан с объектом инициализации."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:187
+#, no-wrap
+msgid "Kernel Services"
+msgstr "Службы ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:197
+msgid ""
+"The boundary between the kernel- and user-level code is enforced by hardware-"
+"protection facilities provided by the underlying hardware. The kernel "
+"operates in a separate address space that is inaccessible to user "
+"processes. Privileged operations -- such as starting I/O and halting the "
+"central processing unit (CPU) -- are available to only the kernel. "
+"Applications request services from the kernel with _system calls_. System "
+"calls are used to cause the kernel to execute complicated operations, such "
+"as writing data to secondary storage, and simple operations, such as "
+"returning the current time of day. All system calls appear _synchronous_ to "
+"applications: The application does not run while the kernel does the actions "
+"associated with a system call. The kernel may finish some operations "
+"associated with a system call after it has returned. For example, a _write_ "
+"system call will copy the data to be written from the user process to a "
+"kernel buffer while the process waits, but will usually return from the "
+"system call before the kernel buffer is written to the disk."
+msgstr ""
+"Разграничение между кодом уровней ядра и пользователя обеспечивается "
+"аппаратными методами, предоставляемыми оборудованием. Ядро работает в "
+"отдельном адресном пространстве, которое недоступно процессам пользователя. "
+"Привилегированные операции - такие, как осуществление ввода/вывода и "
+"остановка модуля центрального процессора (CPU) - доступны только ядру. "
+"Приложения делают запросы ядру на доступ к его сервисам при помощи "
+"_системных вызовов_. Системные вызовы используются для указания ядру на "
+"выполнение как сложных операций, таких, как запись данных во вторичный "
+"носитель, так и простых, таких, как получение текущего времени. Все "
+"системные вызовы выполняются _синхронно_ с приложением: Приложение не будет "
+"продолжать работу, пока ядро не выполнит действия, соответствующие "
+"системному вызову. Ядро может завершить некоторые операции, связанные с "
+"системным вызовом, после его окончания. Например, системный вызов _write_ "
+"будет копировать записываемые данные от пользовательского процесса в буфер "
+"ядра, пока процесс находится в ожидании, но, как правило, будет немедленно "
+"завершаться до того, как буфер ядра реально будет записан на диск."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:206
+msgid ""
+"A system call usually is implemented as a hardware trap that changes the "
+"CPU's execution mode and the current address-space mapping. Parameters "
+"supplied by users in system calls are validated by the kernel before being "
+"used. Such checking ensures the integrity of the system. All parameters "
+"passed into the kernel are copied into the kernel's address space, to ensure "
+"that validated parameters are not changed as a side effect of the system "
+"call. System-call results are returned by the kernel, either in hardware "
+"registers or by their values being copied to user-specified memory "
+"addresses. Like parameters passed into the kernel, addresses used for the "
+"return of results must be validated to ensure that they are part of an "
+"application's address space. If the kernel encounters an error while "
+"processing a system call, it returns an error code to the user. For the C "
+"programming language, this error code is stored in the global variable "
+"_errno_, and the function that executed the system call returns the value -1."
+msgstr ""
+"Системный вызов обычно реализуется как аппаратное прерывание, которое "
+"изменяет режим работы CPU и текущее отображение адресного пространства. "
+"Параметры, передаваемые пользователями системным вызовам, перед "
+"использованием проверяются ядром. Такая проверка обеспечивает целостность "
+"системы. Все параметры, передаваемые в ядро, копируются в адресное "
+"пространство ядра, для того, чтобы проверенные параметры не могли быть "
+"изменены в результате побочного действия системного вызова. Результаты "
+"выполнения системного вызова возвращаются ядром либо в аппаратных регистрах, "
+"либо копированием их значений в области памяти, указанные пользователем. Как "
+"и параметры, переданные в ядро, адреса, используемые для возвращения "
+"результатов, должны быть проверены на то, что они являются частью адресного "
+"пространства приложения. Если при обработке системного вызова ядром "
+"возникает ошибка, код ошибки возвращается пользователю. В случае языка "
+"программирования C код этой ошибки сохраняется в глобальной переменной "
+"_errno_, а функция, соответствующая системному вызову, возвращает в качестве "
+"результата значение -1."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:211
+msgid ""
+"User applications and the kernel operate independently of each other. "
+"4.4BSD does not store I/O control blocks or other operating-system-related "
+"data structures in the application's address space. Each user-level "
+"application is provided an independent address space in which it executes. "
+"The kernel makes most state changes, such as suspending a process while "
+"another is running, invisible to the processes involved."
+msgstr ""
+"Пользовательские приложения и ядро работают независимо друг от друга. 4.4BSD "
+"не хранит управляющие блоки ввода/вывода и другие связанные с операционной "
+"системой структуры данных в адресном пространстве приложения. Каждому "
+"пользовательскому приложению предоставляется независимое адресное "
+"пространство, в котором оно и выполняется. Ядро выполняет большинство "
+"управляющих действий, таких, как приостановка процесса на время выполнения "
+"другого, незаметно для участвующих процессов."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:213
+#, no-wrap
+msgid "Process Management"
+msgstr "Управление процессами"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:222
+msgid ""
+"4.4BSD supports a multitasking environment. Each task or thread of "
+"execution is termed a _process_. The _context_ of a 4.4BSD process consists "
+"of user-level state, including the contents of its address space and the run-"
+"time environment, and kernel-level state, which includes scheduling "
+"parameters, resource controls, and identification information. The context "
+"includes everything used by the kernel in providing services for the "
+"process. Users can create processes, control the processes' execution, and "
+"receive notification when the processes' execution status changes. Every "
+"process is assigned a unique value, termed a _process identifier_ (PID). "
+"This value is used by the kernel to identify a process when reporting status "
+"changes to a user, and by a user when referencing a process in a system call."
+msgstr ""
+"4.4BSD поддерживает многозадачность. Каждая задача или выполняющийся поток "
+"называется _процессом_. _Контекст_ процесса 4.4BSD состоит из состояния "
+"пользовательского уровня, включая содержимое его адресного пространства и "
+"окружения времени выполнения, и состояния уровня ядра, в который включаются "
+"параметры планировщика задач, управляющие ресурсы и идентифицирующая "
+"информация. В контекст включается все, что используется ядром при "
+"предоставлении своих сервисов процессу. Пользователи могут создавать "
+"процессы, управлять их выполнением и получать уведомления при изменении "
+"состояния выполнения процессов. Каждому процессу назначается уникальное "
+"число, называемое _идентификатором процесса_ (PID). Это число используется "
+"ядром для идентификации процесса при сообщении пользователю об изменении его "
+"состояния, и пользователем для указания процесса в системном вызове."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:227
+msgid ""
+"The kernel creates a process by duplicating the context of another process. "
+"The new process is termed a _child process_ of the original _parent process_ "
+"The context duplicated in process creation includes both the user-level "
+"execution state of the process and the process's system state managed by the "
+"kernel. Important components of the kernel state are described in Chapter 4."
+msgstr ""
+"Ядро создает процесс, дублируя контекст другого процесса. Новый процесс "
+"считается _порожденным процессом_ исходного _родительского процесса_. "
+"Контекст, копируемый в ходе создания процесса, включает как состояние "
+"выполнения процесса уровня пользователя, так и системное состояние процесса, "
+"управляемое ядром. Важные компоненты состояния ядра описаны в Главе 4."
+
+#. type: Block title
+#: documentation/content/en/books/design-44bsd/_index.adoc:229
+#, no-wrap
+msgid "Process lifecycle"
+msgstr "Жизненный цикл процесса"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:231
+msgid "image:fig1.png[Process lifecycle]"
+msgstr "image:fig1.png[Жизненный цикл процесса]"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:238
+msgid ""
+"The process lifecycle is depicted in crossref:design-44bsd[fig-process-"
+"lifecycle,Process lifecycle]. A process may create a new process that is a "
+"copy of the original by using the _fork_ system call. The _fork_ call "
+"returns twice: once in the parent process, where the return value is the "
+"process identifier of the child, and once in the child process, where the "
+"return value is 0. The parent-child relationship induces a hierarchical "
+"structure on the set of processes in the system. The new process shares all "
+"its parent's resources, such as file descriptors, signal-handling status, "
+"and memory layout."
+msgstr ""
+"Жизненный цикл процесса изображен на рисунке crossref:design-44bsd[fig-"
+"process-lifecycle,Жизненный цикл процесса]. Процесс может создать новый "
+"процесс, который является копией исходного процесса с помощью системного "
+"вызова _fork_. Возврат из вызова _fork_ происходит два раза: один раз в "
+"родительском процессе, в котором возвращаемое значение является "
+"идентификатором порожденного процесса, и второй раз в порожденном процессе, "
+"в котором возвращаемое значение равно 0. Связь родитель-потомок порождает "
+"иерархическую структуру процессов в системе. Новый процесс имеет доступ ко "
+"всем ресурсам его родителя, таким, как файловые дескрипторы, состояние "
+"обработки сигналов и распределение памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:242
+msgid ""
+"Although there are occasions when the new process is intended to be a copy "
+"of the parent, the loading and execution of a different program is a more "
+"useful and typical action. A process can overlay itself with the memory "
+"image of another program, passing to the newly created image a set of "
+"parameters, using the system call _execve_. One parameter is the name of a "
+"file whose contents are in a format recognized by the system -- either a "
+"binary-executable file or a file that causes the execution of a specified "
+"interpreter program to process its contents."
+msgstr ""
+"Хотя есть ситуации, когда процесс должен быть копией своего родителя, "
+"наиболее типичным и полезным действием является загрузка и выполнение другой "
+"программы. Процесс может заместить себя образом памяти другой программы, "
+"передавая вновь созданному образу набор параметров, при помощи системного "
+"вызова _execve_. Одним из параметров является имя файла, содержимое которого "
+"имеет формате, распознаваемый системой - это либо двоичный выполняемый файл, "
+"либо файл, который приводит к запуску указанной программы интерпретации для "
+"обработки его содержимого."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:246
+msgid ""
+"A process may terminate by executing an _exit_ system call, sending 8 bits "
+"of exit status to its parent. If a process wants to communicate more than a "
+"single byte of information with its parent, it must either set up an "
+"interprocess-communication channel using pipes or sockets, or use an "
+"intermediate file. Interprocess communication is discussed extensively in "
+"Chapter 11."
+msgstr ""
+"Процесс может завершить работу, выполнив системный вызов _exit_, посылающий "
+"8-битовое значение состояния завершения своему родителю. Если процесс хочет "
+"передать родительскому процессу информацию, превышающую один байт, он должен "
+"либо создать канал межпроцессных коммуникаций при помощи конвейеров или "
+"сокетов, или при помощи промежуточного файла. Коммуникации между процессами "
+"подробно обсуждаются в Главе 11."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:251
+msgid ""
+"A process can suspend execution until any of its child processes terminate "
+"using the _wait_ system call, which returns the PID and exit status of the "
+"terminated child process. A parent process can arrange to be notified by a "
+"signal when a child process exits or terminates abnormally. Using the "
+"_wait4_ system call, the parent can retrieve information about the event "
+"that caused termination of the child process and about resources consumed by "
+"the process during its lifetime. If a process is orphaned because its "
+"parent exits before it is finished, then the kernel arranges for the child's "
+"exit status to be passed back to a special system process _init_: see "
+"Sections 3.1 and 14.6)."
+msgstr ""
+"Процесс может приостановить выполнение до тех пор, пока не завершит работу "
+"любой из порожденных им процессов, при помощи системного вызова _wait_, "
+"который возвращает PID и статус завершения выполненного дочернего процесса. "
+"Родительский процесс может быть настроен на получение сигнала в случае, "
+"когда порожденный процесс завершает работу или аварийно прекращает "
+"выполнение. При помощи системного вызова _wait4_ родитель может получить "
+"информацию о событии, приведшем к завершению порожденного процесса и о "
+"ресурсах, использованных процессом за время его работы. Если процесс "
+"становится сиротой из-за того, что процесс, его породивший, завершил работу "
+"до окончания работы потомка, то ядро перенаправляет состояние завершения "
+"порожденного процесса особому системному процессу _init_: обратитесь к "
+"разделам 3.1 и 14.6)."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:253
+msgid ""
+"The details of how the kernel creates and destroys processes are given in "
+"Chapter 5."
+msgstr ""
+"Подробное описание того, как ядро создает и уничтожает процессы, дается в "
+"Главе 5."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:257
+msgid ""
+"Processes are scheduled for execution according to a _process-priority_ "
+"parameter. This priority is managed by a kernel-based scheduling "
+"algorithm. Users can influence the scheduling of a process by specifying a "
+"parameter (_nice_) that weights the overall scheduling priority, but are "
+"still obligated to share the underlying CPU resources according to the "
+"kernel's scheduling policy."
+msgstr ""
+"Планирование выполнения процессов осуществляется согласно параметру "
+"_приоритетности процесса_. Этот приоритет управляется алгоритмом "
+"планирования задач в ядре. Пользователи могут влиять на выполнение процесса, "
+"задавая этот параметр (_nice_), который влияет на суммарный приоритет, но "
+"ограничен использованием ресурсов CPU согласно алгоритму планировщика задач "
+"ядра."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:258
+#, no-wrap
+msgid "Signals"
+msgstr "Сигналы"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:267
+msgid ""
+"The system defines a set of _signals_ that may be delivered to a process. "
+"Signals in 4.4BSD are modeled after hardware interrupts. A process may "
+"specify a user-level subroutine to be a _handler_ to which a signal should "
+"be delivered. When a signal is generated, it is blocked from further "
+"occurrence while it is being _caught_ by the handler. Catching a signal "
+"involves saving the current process context and building a new one in which "
+"to run the handler. The signal is then delivered to the handler, which can "
+"either abort the process or return to the executing process (perhaps after "
+"setting a global variable). If the handler returns, the signal is unblocked "
+"and can be generated (and caught) again."
+msgstr ""
+"В системе определен набор _сигналов_, которые могут быть отправлены "
+"процессу. Сигналы в 4.4BSD сделаны по образу аппаратных прерываний. Процесс "
+"может определить пользовательскую подпрограмму, которая будет являться "
+"_обработчиком_, и которой должен будет перенаправляться сигнал. Когда сигнал "
+"генерируется, он блокируется от повторного появления до тех пор, пока не "
+"будет _перехвачен_ обработчиком. Перехват сигнала включает в себя сохранение "
+"контекста текущего процесса и построение нового, в котором запускается "
+"обработчик. Затем сигнал направляется обработчику, который может либо "
+"прервать процесс, либо передать управление обратно выполняемому процессу "
+"(может быть, после установки значения глобальной переменной). Если "
+"обработчик возвратил управление, сигнал разблокировывается и может быть "
+"сгенерирован (и получен) снова."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:271
+msgid ""
+"Alternatively, a process may specify that a signal is to be _ignored_, or "
+"that a default action, as determined by the kernel, is to be taken. The "
+"default action of certain signals is to terminate the process. This "
+"termination may be accompanied by creation of a _core file_ that contains "
+"the current memory image of the process for use in postmortem debugging."
+msgstr ""
+"Либо процесс может определить, что сигнал будет _игнорироваться_ или будет "
+"выполняться действие по умолчанию, определяемое ядром. Действием по "
+"умолчанию для некоторых сигналов является прекращение процесса. Это "
+"завершение работы может сопровождаться созданием _файла дампа_, содержащего "
+"текущий образ памяти процесса для использования в последующей отладке."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:274
+msgid ""
+"Some signals cannot be caught or ignored. These signals include _SIGKILL_, "
+"which kills runaway processes, and the job-control signal _SIGSTOP_."
+msgstr ""
+"Некоторые сигналы не могут быть перехвачены или проигнорированы. К таким "
+"сигналам относятся _SIGKILL_, прерывающий неуправляемый процесс, и сигнал "
+"управления заданиями _SIGSTOP_."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:279
+msgid ""
+"A process may choose to have signals delivered on a special stack so that "
+"sophisticated software stack manipulations are possible. For example, a "
+"language supporting coroutines needs to provide a stack for each coroutine. "
+"The language run-time system can allocate these stacks by dividing up the "
+"single stack provided by 4.4BSD. If the kernel does not support a separate "
+"signal stack, the space allocated for each coroutine must be expanded by the "
+"amount of space required to catch a signal."
+msgstr ""
+"Процесс может выбрать получение сигналов в специальный стек для выполнения "
+"хитроумных программных манипуляций стеком. Например, подпрограммам поддержки "
+"языка нужно иметь стек для каждой подпрограммы. Система времени выполнения "
+"языка может выделять эти стеки, разделяя единственный стек, предоставляемый "
+"в 4.4BSD. Если ядро не поддерживает отдельный стек сигналов, то "
+"пространство, выделяемое каждой подпрограмме, должно быть расширено на "
+"объем, требуемый для перехвата сигнала."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:284
+msgid ""
+"All signals have the same _priority_. If multiple signals are pending "
+"simultaneously, the order in which signals are delivered to a process is "
+"implementation specific. Signal handlers execute with the signal that "
+"caused their invocation to be blocked, but other signals may yet occur. "
+"Mechanisms are provided so that processes can protect critical sections of "
+"code against the occurrence of specified signals."
+msgstr ""
+"Все сигналы имеют один и тот же _приоритет_. Если обработки ожидают "
+"несколько сигналов, то порядок их направления процессу зависит от "
+"реализации. Обработчики сигналов, выполняемые по сигналу, который их вызвал, "
+"блокируются, но при этом могут быть сгенерированы дополнительные сигналы. "
+"Имеется механизм, позволяющий защитить критический участок кода от появления "
+"заданных сигналов."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:286
+msgid ""
+"The detailed design and implementation of signals is described in Section "
+"4.7."
+msgstr ""
+"Подробное описание архитектуры и реализации механизма сигналов дается в "
+"Разделе 4.7."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:287
+#, no-wrap
+msgid "Process Groups and Sessions"
+msgstr "Группы управления и сеансы"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:294
+msgid ""
+"Processes are organized into _process groups_. Process groups are used to "
+"control access to terminals and to provide a means of distributing signals "
+"to collections of related processes. A process inherits its process group "
+"from its parent process. Mechanisms are provided by the kernel to allow a "
+"process to alter its process group or the process group of its descendants. "
+"Creating a new process group is easy; the value of a new process group is "
+"ordinarily the process identifier of the creating process."
+msgstr ""
+"Процессы организованы в _группы управления_. Группы управления используются "
+"для управления доступом к терминалам и для обеспечения передачи сигналов "
+"наборам связанных процессов. Процесс наследует группу управления от своего "
+"родительского процесса. Ядром обеспечиваются механизмы, позволяющие процессу "
+"изменять свою группу управления или группу управления своих наследников. "
+"Создание новой группы управления просто; значение, соответствующее новой "
+"группе управления, обычно является идентификатором создающего ее процесса."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:298
+msgid ""
+"The group of processes in a process group is sometimes referred to as a "
+"_job_ and is manipulated by high-level system software, such as the shell. "
+"A common kind of job created by a shell is a _pipeline_ of several processes "
+"connected by pipes, such that the output of the first process is the input "
+"of the second, the output of the second is the input of the third, and so "
+"forth. The shell creates such a job by forking a process for each stage of "
+"the pipeline, then putting all those processes into a separate process group."
+msgstr ""
+"Группу процессов в группе управления иногда называют _заданием_ и оно "
+"управляется высокоуровневым системным программным обеспечением, таким, как "
+"командный процессор. Типичным примером задания, созданного командным "
+"процессором, является _конвейер_ из нескольких связанных процессов, так что "
+"выходной поток первого процесса является входным потоком для второго, "
+"выходной поток второго процесса является входным потоком для третьего, и так "
+"далее. Командный процессор создает такое задание, порождая процесс для "
+"каждого участка конвейера, а затем помещая все эти процессы в отдельную "
+"группу обработки."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:301
+msgid ""
+"A user process can send a signal to each process in a process group, as well "
+"as to a single process. A process in a specific process group may receive "
+"software interrupts affecting the group, causing the group to suspend or "
+"resume execution, or to be interrupted or terminated."
+msgstr ""
+"Пользовательский процесс может послать сигнал как всем процессам в группе "
+"управления, так и конкретному процессу. Процесс в заданной группе управления "
+"может получать программные прерывания, отражающиеся на группе, приводящие к "
+"приостановке или продолжению выполнения, или к прерыванию или завершению "
+"работы."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:309
+msgid ""
+"A terminal has a process-group identifier assigned to it. This identifier "
+"is normally set to the identifier of a process group associated with the "
+"terminal. A job-control shell may create a number of process groups "
+"associated with the same terminal; the terminal is the _controlling "
+"terminal_ for each process in these groups. A process may read from a "
+"descriptor for its controlling terminal only if the terminal's process-group "
+"identifier matches that of the process. If the identifiers do not match, "
+"the process will be blocked if it attempts to read from the terminal. By "
+"changing the process-group identifier of the terminal, a shell can arbitrate "
+"a terminal among several different jobs. This arbitration is called _job "
+"control_ and is described, with process groups, in Section 4.8."
+msgstr ""
+"Терминалу ставится в соответствие идентификатор группы управления. Этот "
+"идентификатор обычно равен идентификатору группы управления, соответствующей "
+"терминалу. Управляющий заданиями командный процессор может создать несколько "
+"групп управления, связанных с одним и тем же терминалом; терминал является "
+"_управляющим терминалом_ для каждого процесса в этих группах. Процесс может "
+"выполнять чтение из дескриптора своего управляющего терминала, если только "
+"идентификатор группы управления соответствует идентификатору группы этого "
+"процесса. Если идентификаторы не совпадают, процесс будет блокирован при "
+"попытке чтения с терминала. Изменяя идентификатор группы управления "
+"терминала, командный процессор может распределять терминал между несколькими "
+"различными заданиями. Такое распределение называется _управлением заданиями_ "
+"и описывается вместе с группами управления в Разделе 4.8."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:312
+msgid ""
+"Just as a set of related processes can be collected into a process group, a "
+"set of process groups can be collected into a _session_. The main uses for "
+"sessions are to create an isolated environment for a daemon process and its "
+"children, and to collect together a user's login shell and the jobs that "
+"shell spawns."
+msgstr ""
+"Так же, как и наборы связанных процессов могут объединяться в группы "
+"управления, набор групп управления может быть объединен в _сеанс_. Основное "
+"назначение сеансов заключается создании изолированного окружения для "
+"процесса-даемона и порожденных им процессов, а также для объединения "
+"начального командного процессора пользователя и заданий, которые он "
+"порождает."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:314
+#, no-wrap
+msgid "Memory Management"
+msgstr "Управление памятью"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:324
+msgid ""
+"Each process has its own private address space. The address space is "
+"initially divided into three logical segments: _text_, _data_, and _stack_. "
+"The text segment is read-only and contains the machine instructions of a "
+"program. The data and stack segments are both readable and writable. The "
+"data segment contains the initialized and uninitialized data portions of a "
+"program, whereas the stack segment holds the application's run-time stack. "
+"On most machines, the stack segment is extended automatically by the kernel "
+"as the process executes. A process can expand or contract its data segment "
+"by making a system call, whereas a process can change the size of its text "
+"segment only when the segment's contents are overlaid with data from the "
+"filesystem, or when debugging takes place. The initial contents of the "
+"segments of a child process are duplicates of the segments of a parent "
+"process."
+msgstr ""
+"Каждый процесс имеет собственное адресное пространство. Адресное "
+"пространство изначально разделяется на три логических сегмента: _код_, "
+"_данные_ и _стек_. Сегмент кода доступен только для чтения и содержит "
+"машинные коды программы. Сегменты данных и стека оба доступны как для "
+"чтения, так и для записи. Сегмент данных содержит как инициализированные, "
+"так и неинициализированные области данных программы, когда как стековый "
+"сегмент представляет собой стек программы на этапе выполнения. На "
+"большинстве машин сегмент стека автоматически расширяется ядром в процессе "
+"работы программы. Процесс может расширять или уменьшать свой сегмент данных, "
+"выполняя системный вызов, когда как размер сегмента кода процесс может "
+"изменить только когда содержимое сегмента перекрывается данными файловой "
+"системы или в процессе отладки. Начальное содержимое сегментов порожденного "
+"процесса копируется из сегментов родительского процесса."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:332
+msgid ""
+"The entire contents of a process address space do not need to be resident "
+"for a process to execute. If a process references a part of its address "
+"space that is not resident in main memory, the system _pages_ the necessary "
+"information into memory. When system resources are scarce, the system uses "
+"a two-level approach to maintain available resources. If a modest amount of "
+"memory is available, the system will take memory resources away from "
+"processes if these resources have not been used recently. Should there be a "
+"severe resource shortage, the system will resort to _swapping_ the entire "
+"context of a process to secondary storage. The _demand paging_ and "
+"_swapping_ done by the system are effectively transparent to processes. A "
+"process may, however, advise the system about expected future memory "
+"utilization as a performance aid."
+msgstr ""
+"Для выполнения процесса вовсе не обязательно постоянно хранить в памяти "
+"полное содержимое его адресного пространства. Если процесс обращается к "
+"области адресного пространства, которая не присутствует в оперативной "
+"памяти, то система _подгружает страницу_ с необходимой информацией в память. "
+"Когда возникает нехватка системных ресурсов, то система использует "
+"двухуровневый подход к управлению имеющимися ресурсами. Если не хватает "
+"памяти, то система будет забирать ресурсы памяти от процессов, если они "
+"давно не использовались. Если ресурсов не хватает очень сильно, то система "
+"будет прибегать к _выгрузке_ всего контекста процесса во вторичную "
+"подсистему хранения данных. _Постраничная подгрузка по требованию_ и "
+"_выгрузка_ выполняются системой абсолютно незаметно для процессов. Процесс "
+"может, однако, указать системе объем памяти, который будет использоваться, в "
+"качестве помощи."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:333
+#, no-wrap
+msgid "BSD Memory-Management Design Decisions"
+msgstr "Решения BSD по архитектуре управления памятью"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:339
+msgid ""
+"The support of large sparse address spaces, mapped files, and shared memory "
+"was a requirement for 4.2BSD. An interface was specified, called _mmap_, "
+"that allowed unrelated processes to request a shared mapping of a file into "
+"their address spaces. If multiple processes mapped the same file into their "
+"address spaces, changes to the file's portion of an address space by one "
+"process would be reflected in the area mapped by the other processes, as "
+"well as in the file itself. Ultimately, 4.2BSD was shipped without the "
+"_mmap_ interface, because of pressure to make other features, such as "
+"networking, available."
+msgstr ""
+"В 4.2BSD требовалось реализовать поддержку больших несвязанных адресных "
+"пространств, отображаемых в память файлов и совместно используемой памяти. "
+"Был спроектирован интерфейс, который назвали _mmap_, позволяющий несвязанным "
+"процессам запрашивать отображение в их адресное пространство файла в режиме "
+"совместного использования. Если несколько процессов отображают в свое "
+"адресное пространство один и тот же файл, то изменение адресного "
+"пространства процесса, соответствующего файлу, в одном процессе, будет "
+"отображено в области отображения этого файла в другом процессе, а также и в "
+"самом файле. Однако в конце концов 4.2BSD была выпущена без интерфейса "
+"_mmap_ из-за необходимости сделать в первую очередь другие возможности, "
+"такие, как работа с сетью."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:346
+msgid ""
+"Further development of the _mmap_ interface continued during the work on "
+"4.3BSD. Over 40 companies and research groups participated in the "
+"discussions leading to the revised architecture that was described in the "
+"Berkeley Software Architecture Manual crossref:design-44bsd[biblio-"
+"mckusick-1, [McKusick et al, 1994]]. Several of the companies have "
+"implemented the revised interface crossref:design-44bsd[biblio-gingell, "
+"[Gingell et al, 1987]]."
+msgstr ""
+"Затем разработка интерфейса _mmap_ продолжалась во время работы над 4.3BSD. "
+"Более 40 компаний и исследовательских групп принимали участие в обсуждениях, "
+"которые привели к появлению обновленной концепции, описанной в Berkeley "
+"Software Architecture Manual crossref:design-44bsd[biblio-mckusick-1, "
+"[McKusick et al, 1994]]. Несколько компаний реализовали этот обновленный "
+"интерфейс crossref:design-44bsd[biblio-gingell, [Gingell et al, 1987]]."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:353
+msgid ""
+"Once again, time pressure prevented 4.3BSD from providing an implementation "
+"of the interface. Although the latter could have been built into the "
+"existing 4.3BSD virtual-memory system, the developers decided not to put it "
+"in because that implementation was nearly 10 years old. Furthermore, the "
+"original virtual-memory design was based on the assumption that computer "
+"memories were small and expensive, whereas disks were locally connected, "
+"fast, large, and inexpensive. Thus, the virtual-memory system was designed "
+"to be frugal with its use of memory at the expense of generating extra disk "
+"traffic. In addition, the 4.3BSD implementation was riddled with VAX memory-"
+"management hardware dependencies that impeded its portability to other "
+"computer architectures. Finally, the virtual-memory system was not designed "
+"to support the tightly coupled multiprocessors that are becoming "
+"increasingly common and important today."
+msgstr ""
+"И снова сроки разработки не позволили включить в 4.3BSD реализацию этого "
+"интерфейса. Хотя позже она могла быть встроена в имеющуюся подсистему "
+"виртуальной памяти 4.3BSD, разработчики решили не включать ее сюда. потому "
+"что этой реализации было уже более 10 лет. Более того, оригинальная "
+"архитектура виртуальной памяти была основана на предположении, что "
+"компьютерная память мала и дорога, а диски подключены непосредственно к "
+"компьютеру, быстры и дешевы. Поэтому подсистема виртуальной памяти была "
+"разработана с упором на бережное использование памяти ценой более частых "
+"обращений к диску. Вдобавок реализация в 4.3BSD была пронизана зависимостями "
+"от аппаратной системы управления памятью машин VAX, что препятствовало ее "
+"переносу на другие аппаратные платформы. И наконец, подсистема виртуальной "
+"памяти не была предназначена для поддержки связных многопроцессорных систем, "
+"которые сейчас становятся все более распространенными и необходимыми."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:364
+msgid ""
+"Attempts to improve the old implementation incrementally seemed doomed to "
+"failure. A completely new design, on the other hand, could take advantage "
+"of large memories, conserve disk transfers, and have the potential to run on "
+"multiprocessors. Consequently, the virtual-memory system was completely "
+"replaced in 4.4BSD. The 4.4BSD virtual-memory system is based on the Mach "
+"2.0 VM system crossref:design-44bsd[biblio-tevanian, [Tevanian, 1987]]. with "
+"updates from Mach 2.5 and Mach 3.0. It features efficient support for "
+"sharing, a clean separation of machine-independent and machine-dependent "
+"features, as well as (currently unused) multiprocessor support. Processes "
+"can map files anywhere in their address space. They can share parts of "
+"their address space by doing a shared mapping of the same file. Changes "
+"made by one process are visible in the address space of the other process, "
+"and also are written back to the file itself. Processes can also request "
+"private mappings of a file, which prevents any changes that they make from "
+"being visible to other processes mapping the file or being written back to "
+"the file itself."
+msgstr ""
+"Попытки постепенно усовершенствовать старую реализацию заведомо были "
+"обречены на неудачу. Полностью новая архитектура, с другой стороны, могла бы "
+"использовать большие объемы памяти, уменьшить дисковые операции и "
+"обеспечивать работу с несколькими процессорами. Наконец, система виртуальной "
+"памяти в 4.4BSD была полностью изменена. Система виртуальной памяти 4.4BSD "
+"основана на системе виртуальнй памяти (VM) crossref:design-44bsd[biblio-"
+"tevanian, [Tevanian, 1987]] с заимствованиями из Mach 2.5 и Mach 3.0. В ней "
+"была эффективная поддержка совместного использования, полное разделение "
+"машинно-зависимой и машинно-независимой частей, а также (сейчас не "
+"используемая) поддержка работы с несколькими процессорами. Процессы могут "
+"отображать файлы в любую область своего адресного пространства. Они могут "
+"совместно использовать части своих адресных пространств посредством "
+"отображения в память одного и того же файла. Изменения, сделанные одним "
+"процессом, видны в адресном пространстве другого процесса, а также "
+"записываются и в сам файл. Процессы могут также запрашивать эксклюзивное "
+"отображение файла в память, при котором любые изменения, сделанные "
+"процессом, не видны другим процессам, которые отображают файл в память и не "
+"записываются обратно в файл."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:370
+msgid ""
+"Another issue with the virtual-memory system is the way that information is "
+"passed into the kernel when a system call is made. 4.4BSD always copies "
+"data from the process address space into a buffer in the kernel. For read "
+"or write operations that are transferring large quantities of data, doing "
+"the copy can be time consuming. An alternative to doing the copying is to "
+"remap the process memory into the kernel. The 4.4BSD kernel always copies "
+"the data for several reasons:"
+msgstr ""
+"Еще одной проблемой с системой виртуальной памяти является способ, которым "
+"информация передается ядру при выполнении системного вызова. 4.4BSD всегда "
+"копирует данные из адресного пространства процесса в буфер ядра. Для "
+"операций чтения и записи, при которых передаются большие объемы данных, "
+"выполнение копирования может оказаться занимающим время процессом. "
+"Альтернативным способом является манипуляции с адресным пространством "
+"процесса в ядре. Ядро 4.4BSD всегда копирует данные о нескольким причинам:"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:372
+msgid ""
+"Often, the user data are not page aligned and are not a multiple of the "
+"hardware page length."
+msgstr ""
+"Зачастую пользовательские данные не выравнены по границе страницы памяти и "
+"их объем не кратен размеру аппаратной страницы памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:373
+msgid ""
+"If the page is taken away from the process, it will no longer be able to "
+"reference that page. Some programs depend on the data remaining in the "
+"buffer even after those data have been written."
+msgstr ""
+"Если страница памяти забирается от процесса, он не может больше ссылаться на "
+"эту страницу. Некоторые программы зависят от данных, остающихся в буфере, "
+"даже после записи этих данных."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:374
+msgid ""
+"If the process is allowed to keep a copy of the page (as it is in current "
+"4.4BSD semantics), the page must be made _copy-on-write_. A copy-on-write "
+"page is one that is protected against being written by being made read-only. "
+"If the process attempts to modify the page, the kernel gets a write fault. "
+"The kernel then makes a copy of the page that the process can modify. "
+"Unfortunately, the typical process will immediately try to write new data to "
+"its output buffer, forcing the data to be copied anyway."
+msgstr ""
+"Если процесс позволяет хранить копию страницы памяти (как это делается в "
+"существующей 4.4BSD), то страница должна иметь атрибут _копирования-при-"
+"записи_. Такая страница является одной из таковых, что защищается от записи "
+"при помощи атрибута только-для-чтения. Если процесс пытается модифицировать "
+"страницу памяти, в ядре возникает ситуация ошибки записи. После этого ядро "
+"делает копию страницы, которую процесс может изменять. К несчастью, "
+"большинство процессов будет немедленно пытаться записать новые данные в свой "
+"буфер вывода, что приводит в любом случае к копированию данных."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:375
+msgid ""
+"When pages are remapped to new virtual-memory addresses, most memory-"
+"management hardware requires that the hardware address-translation cache be "
+"purged selectively. The cache purges are often slow. The net effect is that "
+"remapping is slower than copying for blocks of data less than 4 to 8 Kbyte."
+msgstr ""
+"Когда страницы переносятся в новые адреса виртуальной памяти, большинство "
+"аппаратных менеджеров памяти требуют, чтобы кэш аппаратного переназначения "
+"адресов был выборочно очищен. Очистка кэша зачастую выполняется медленно. В "
+"итоге получается, что переназначение адресов оказывается медленнее, чем "
+"копирование блоков данных, не превышающих 4 или 8 килобайт."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:378
+msgid ""
+"The biggest incentives for memory mapping are the needs for accessing big "
+"files and for passing large quantities of data between processes. The "
+"_mmap_ interface provides a way for both of these tasks to be done without "
+"copying."
+msgstr ""
+"Больше всего отображение памяти нужно для работы к большими файлами и "
+"передачи больших объемов данных между процессами. Интерфейс _mmap_ дает "
+"методы для выполнения обеих этих операций без копирования."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:379
+#, no-wrap
+msgid "Memory Management Inside the Kernel"
+msgstr "Управление памятью внутри ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:388
+msgid ""
+"The kernel often does allocations of memory that are needed for only the "
+"duration of a single system call. In a user process, such short-term memory "
+"would be allocated on the run-time stack. Because the kernel has a limited "
+"run-time stack, it is not feasible to allocate even moderate-sized blocks of "
+"memory on it. Consequently, such memory must be allocated through a more "
+"dynamic mechanism. For example, when the system must translate a pathname, "
+"it must allocate a 1-Kbyte buffer to hold the name. Other blocks of memory "
+"must be more persistent than a single system call, and thus could not be "
+"allocated on the stack even if there was space. An example is protocol-"
+"control blocks that remain throughout the duration of a network connection."
+msgstr ""
+"Ядро часто выполняет выделение памяти, которое нужно только для выполнения "
+"единственного системного вызова. В пользовательском процессе такая "
+"кратковременно используемая память будет выделяться в стеке во время "
+"выполнения. Так как ядро имеет ограниченный объем стека времени выполнения, "
+"то неэффективно выделять в нем даже блоки памяти среднего размера. Таким "
+"образом, такая память должна выделяться посредством более гибкого механизма. "
+"Например, когда системный вызов должен преобразовать имя каталога, он должен "
+"выделить буфер размером 1 Кбайт для хранения имени. Другие блоки памяти "
+"должны выделяться на более продолжительный срок, чем один системный вызов, и "
+"поэтому не могут выделяться в стеке, даже если там есть место. В качестве "
+"примера можно взять блоки управления протоколами, которые существуют на всем "
+"протяжении сетевого соединения."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:398
+msgid ""
+"Demands for dynamic memory allocation in the kernel have increased as more "
+"services have been added. A generalized memory allocator reduces the "
+"complexity of writing code inside the kernel. Thus, the 4.4BSD kernel has a "
+"single memory allocator that can be used by any part of the system. It has "
+"an interface similar to the C library routines _malloc_ and _free_ that "
+"provide memory allocation to application programs "
+"crossref:design-44bsd[biblio-mckusick-2, [McKusick & Karels, 1988]]. Like "
+"the C library interface, the allocation routine takes a parameter specifying "
+"the size of memory that is needed. The range of sizes for memory requests "
+"is not constrained; however, physical memory is allocated and is not paged. "
+"The free routine takes a pointer to the storage being freed, but does not "
+"require the size of the piece of memory being freed."
+msgstr ""
+"Необходимость в динамическом выделении памяти в ядре становилась все более "
+"острой вместе с добавлением количества сервисов. Общий механизм выделения "
+"памяти уменьшает сложность написания кода в ядре. Поэтому в 4.4BSD ядро "
+"имеет единый механизм выделения памяти, который может использоваться в любой "
+"части системы. У него есть интерфейс, похожий на функции библиотеки языка C "
+"_malloc_ и _free_, которые обеспечивают выделение памяти в прикладных "
+"программах crossref:design-44bsd[biblio-mckusick-2, [McKusick & Karels, "
+"1988]]. Как интерфейс библиотеки языка C, функция выделения памяти получает "
+"параметр, указывающий на размер памяти, который необходим. Диапазон "
+"запрашиваемых объемов выделяемой памяти не ограничен; однако выделяемая "
+"физическая память не подвергается постраничной подгрузке. Функции "
+"освобождения памяти передается указатель на освобождаемый участок памяти, но "
+"указывать размер освобождаемого участка памяти не нужно."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:400
+#, no-wrap
+msgid "I/O System"
+msgstr "Система ввода/вывода"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:404
+msgid ""
+"The basic model of the UNIX I/O system is a sequence of bytes that can be "
+"accessed either randomly or sequentially. There are no _access methods_ and "
+"no _control blocks_ in a typical UNIX user process."
+msgstr ""
+"Базовой моделью системы ввода/вывода UNIX является последовательность байт, "
+"доступ к которым может осуществляться как последовательно, так и в в "
+"произвольном порядке. В типичном пользовательском процессе UNIX нет таких "
+"понятий, как _методы доступа_ или _управляющие блоки_."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:412
+msgid ""
+"Different programs expect various levels of structure, but the kernel does "
+"not impose structure on I/O. For instance, the convention for text files is "
+"lines of ASCII characters separated by a single newline character (the ASCII "
+"line-feed character), but the kernel knows nothing about this convention. "
+"For the purposes of most programs, the model is further simplified to being "
+"a stream of data bytes, or an _I/O stream_. It is this single common data "
+"form that makes the characteristic UNIX tool-based approach work "
+"crossref:design-44bsd[biblio-kernighan, [Kernighan & Pike, 1984]]. An I/O "
+"stream from one program can be fed as input to almost any other program. "
+"(This kind of traditional UNIX I/O stream should not be confused with the "
+"Eighth Edition stream I/O system or with the System V, Release 3 STREAMS, "
+"both of which can be accessed as traditional I/O streams.)"
+msgstr ""
+"Различные программы используют разнообразные структуры данных, но ядро не "
+"связывает ввод/вывод с используемыми структурами. Например, текстовым файлом "
+"считается файл из строк символов набора ASCII, которые разделены одним "
+"символом новой строки (символ ASCII перевода строки), но ядро не знает "
+"ничего об этом соглашении. Для удовлетворения потребностей большинства "
+"программ модель еще более упрощена и сводится к потоку байт данных, или "
+"_потоку ввода/вывода_. Такое единое представление данных позволяет работать "
+"характерному для UNIX подходу на основе инструментов "
+"crossref:design-44bsd[biblio-kernighan, [Kernighan & Pike, 1984]]. Поток "
+"ввода/вывода одной программы может быть подан в качестве входной информации "
+"практически любой другой программе. (Этот тип традиционных для UNIX потоков "
+"ввода/выводы не нужно путать с потоковой системой ввода/вывода из Eighth "
+"Edition или с потоками из System V, Release 3 (STREAMS), оба из которых "
+"доступны как обычные потоки ввода/вывода.)"
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:413
+#, no-wrap
+msgid "Descriptors and I/O"
+msgstr "Дескрипторы и ввод/вывод"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:421
+msgid ""
+"UNIX processes use _descriptors_ to reference I/O streams. Descriptors are "
+"small unsigned integers obtained from the _open_ and _socket_ system calls. "
+"The _open_ system call takes as arguments the name of a file and a "
+"permission mode to specify whether the file should be open for reading or "
+"for writing, or for both. This system call also can be used to create a "
+"new, empty file. A _read_ or _write_ system call can be applied to a "
+"descriptor to transfer data. The _close_ system call can be used to "
+"deallocate any descriptor."
+msgstr ""
+"Процессы UNIX для работы с потоками ввода/вывода используют _дескрипторы_. "
+"Дескрипторы представляют собой беззнаковые целые числа, получаемые после "
+"выполнения системных вызовов _open_ и _socket_. Системный вызов _open_ "
+"получает в качестве аргументов имя файла и режим доступа, который "
+"определяет, должен ли файл открываться для чтения, для записи или для обеих "
+"операций. Этот системный вызов может также использоваться для создания "
+"нового пустого файла. Системные вызовы _read_ и _write_ могут применяться к "
+"дескриптору для переноса данных. Системный вызов _close_ может "
+"использоваться для уничтожения любого дескриптора."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:424
+msgid ""
+"Descriptors represent underlying objects supported by the kernel, and are "
+"created by system calls specific to the type of object. In 4.4BSD, three "
+"kinds of objects can be represented by descriptors: files, pipes, and "
+"sockets."
+msgstr ""
+"Дескрипторы представляют низкоуровневые объекты, поддерживаемые ядром, и "
+"создаваемые системными вызовами, специфичными для каждого типа объектов. В "
+"4.4BSD дескрипторы могут представлять три типа таких объектов: файлы, каналы "
+"и сокеты."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:426
+msgid ""
+"A _file_ is a linear array of bytes with at least one name. A file exists "
+"until all its names are deleted explicitly and no process holds a descriptor "
+"for it. A process acquires a descriptor for a file by opening that file's "
+"name with the _open_ system call. I/O devices are accessed as files."
+msgstr ""
+"_Файл_ представляет собой линейную последовательность байт, имеющую по "
+"крайней мере одно имя. Файл существует, пока все его имена не удалены и ни "
+"один из процессов не хранит его дескриптор. Процесс получает дескриптор "
+"файла, открывая имя файла посредством системного вызова _open_. Работа с "
+"устройствами ввода/вывода осуществляется как с файлами."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:427
+msgid ""
+"A _pipe_ is a linear array of bytes, as is a file, but it is used solely as "
+"an I/O stream, and it is unidirectional. It also has no name, and thus "
+"cannot be opened with _open_. Instead, it is created by the _pipe_ system "
+"call, which returns two descriptors, one of which accepts input that is sent "
+"to the other descriptor reliably, without duplication, and in order. The "
+"system also supports a named pipe or FIFO. A FIFO has properties identical "
+"to a pipe, except that it appears in the filesystem; thus, it can be opened "
+"using the _open_ system call. Two processes that wish to communicate each "
+"open the FIFO: One opens it for reading, the other for writing."
+msgstr ""
+"_Каналом_ является линейная последовательность байт, такая же, как файл, но "
+"используемая исключительно как поток ввода/вывода, причем однонаправленный. "
+"У канала нет имени, и поэтому он не может быть открыт при помощи _open_. "
+"Вместо этого он создается посредством системного вызова _pipe_, который "
+"возвращает два дескриптора, один из которых принимает входные данные, без "
+"искажений, без повторений и в той же самой последовательности посылаемый на "
+"другой дескриптор. Система также поддерживает именованный канал, или FIFO. "
+"FIFO имеет те же самые свойства, что и канал, за исключением того, что он "
+"располагается в файловой системе; поэтому он может быть открыт системным "
+"вызовом _open_. Процессы, которые хотят обмениваться данными, открывают "
+"FIFO: Один процесс открывает его для чтения, а другой для записи."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:428
+msgid ""
+"A _socket_ is a transient object that is used for interprocess "
+"communication; it exists only as long as some process holds a descriptor "
+"referring to it. A socket is created by the _socket_ system call, which "
+"returns a descriptor for it. There are different kinds of sockets that "
+"support various communication semantics, such as reliable delivery of data, "
+"preservation of message ordering, and preservation of message boundaries."
+msgstr ""
+"_Сокет_ является промежуточным объектом, который используется для "
+"межпроцессных коммуникаций; он существует, пока какой-либо процесс хранит "
+"дескриптор, ссылающийся на него. Сокет создается системным вызовом _socket_, "
+"который возвращает его дескриптор. Имеется несколько типов сокетов, которые "
+"поддерживают различные коммуникационные возможности, такие, как надежную "
+"доставку данных, сохранение последовательности передаваемых сообщений, и "
+"сохранение границ сообщений."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:430
+msgid ""
+"In systems before 4.2BSD, pipes were implemented using the filesystem; when "
+"sockets were introduced in 4.2BSD, pipes were reimplemented as sockets."
+msgstr ""
+"В системах, предшествующих 4.2BSD, каналы были реализованы в файловой "
+"системе, когда в 4.2BSD появились сокеты, то каналы были повторно "
+"реализованы как сокеты."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:436
+msgid ""
+"The kernel keeps for each process a _descriptor table_, which is a table "
+"that the kernel uses to translate the external representation of a "
+"descriptor into an internal representation. (The descriptor is merely an "
+"index into this table.) The descriptor table of a process is inherited from "
+"that process's parent, and thus access to the objects to which the "
+"descriptors refer also is inherited. The main ways that a process can "
+"obtain a descriptor are by opening or creation of an object, and by "
+"inheritance from the parent process. In addition, socket IPC allows passing "
+"of descriptors in messages between unrelated processes on the same machine."
+msgstr ""
+"Для каждого процесса ядро хранит _таблицу дескрипторов_, которая является "
+"таблицей, используемой ядром для преобразования внешнего представления "
+"дескриптора в его внутреннее представление. (Дескриптор является просто "
+"индексом в этой таблице.) Таблица дескрипторов процесса наследуется от "
+"родительского процесса, и вместе с ней наследуется и доступ к объектам, на "
+"которые ссылаются дескрипторы. Основными способами, при помощи которых "
+"процесс может получить дескриптор, является открытие или создание объекта, а "
+"также наследование от родительского процесса. Кроме того, межпроцессные "
+"коммуникации при помощи сокетов позволяют передавать дескрипторы в "
+"сообщениях между несвязанными процессами на одной и той же машине."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:442
+msgid ""
+"Every valid descriptor has an associated _file offset_ in bytes from the "
+"beginning of the object. Read and write operations start at this offset, "
+"which is updated after each data transfer. For objects that permit random "
+"access, the file offset also may be set with the _lseek_ system call. "
+"Ordinary files permit random access, and some devices do, as well. Pipes "
+"and sockets do not."
+msgstr ""
+"Любой рабочий дескриптор имеет связанное с ним _смещение в файле_ в байтах "
+"от начала объекта. Операции чтения и записи начинаются от этого смещения, "
+"который обновляется после каждой передачи данных. Для объектов, к которым "
+"разрешен произвольный доступ, смещение в файле может быть установлено "
+"посредством системного вызова _lseek_. Обычные файлы, а также некоторые "
+"устройства, разрешают произвольный доступ к ним. Каналы и сокеты этого "
+"делать не позволяют."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:445
+msgid ""
+"When a process terminates, the kernel reclaims all the descriptors that were "
+"in use by that process. If the process was holding the final reference to "
+"an object, the object's manager is notified so that it can do any necessary "
+"cleanup actions, such as final deletion of a file or deallocation of a "
+"socket."
+msgstr ""
+"Когда процесс завершается, ядро освобождает все дескрипторы, которые "
+"использовались этим процессом. Если процесс хранил последнюю ссылку на "
+"объект, то менеджер объектов уведомляется для выполнения всех необходимых "
+"действий, таких, как окончательное удаление файла или уничтожение сокета."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:446
+#, no-wrap
+msgid "Descriptor Management"
+msgstr "Управление дескрипторами"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:453
+msgid ""
+"Most processes expect three descriptors to be open already when they start "
+"running. These descriptors are 0, 1, 2, more commonly known as _standard "
+"input_, _standard output_, and _standard error_, respectively. Usually, all "
+"three are associated with the user's terminal by the login process (see "
+"Section 14.6) and are inherited through _fork_ and _exec_ by processes run "
+"by the user. Thus, a program can read what the user types by reading "
+"standard input, and the program can send output to the user's screen by "
+"writing to standard output. The standard error descriptor also is open for "
+"writing and is used for error output, whereas standard output is used for "
+"ordinary output."
+msgstr ""
+"Большинство процессов ожидают, что перед началом их работы уже будут открыты "
+"три дескриптора. Это дескрипторы 0, 1 и 2, больше известные как _стандартный "
+"ввод_, _стандартный вывод_ и _стандартный поток диагностических сообщений_, "
+"соответственно. Как правило, все они связываются с пользовательским "
+"терминалом по время входа в систему (смотри Раздел 14.6) и наследуются через "
+"вызовы _fork_ и _exec_ процессами, запускаемыми пользователем. Таким "
+"образом, программа может считывать то, что набирает пользователь, из "
+"стандартного ввода, и программа может выдавать результат на экран "
+"пользователя, осуществляя запись в стандартный вывод. Дескриптор потока "
+"диагностических сообщений также открыт для записи и используется для вывода "
+"ошибок, когда как стандартный вывод используется для обычного вывода."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:457
+msgid ""
+"These (and other) descriptors can be mapped to objects other than the "
+"terminal; such mapping is called _I/O redirection_, and all the standard "
+"shells permit users to do it. The shell can direct the output of a program "
+"to a file by closing descriptor 1 (standard output) and opening the desired "
+"output file to produce a new descriptor 1. It can similarly redirect "
+"standard input to come from a file by closing descriptor 0 and opening the "
+"file."
+msgstr ""
+"Эти (и другие) дескрипторы могут отображаться на объекты, отличающиеся от "
+"терминала; такое отображение называется _перенаправлением ввода/вывода_, и "
+"все стандартные командные процессоры позволяют пользователю это делать. "
+"Оболочка может направить вывод программы в файл, закрывая дескриптор 1 "
+"(стандартный вывод) и открывая выбранный выходной файл для создания нового "
+"дескриптора 1. Подобным же образом стандартный ввод может браться из файла, "
+"при этом закрывается дескриптор 0 и открывается файл."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:463
+msgid ""
+"Pipes allow the output of one program to be input to another program without "
+"rewriting or even relinking of either program. Instead of descriptor 1 "
+"(standard output) of the source program being set up to write to the "
+"terminal, it is set up to be the input descriptor of a pipe. Similarly, "
+"descriptor 0 (standard input) of the sink program is set up to reference the "
+"output of the pipe, instead of the terminal keyboard. The resulting set of "
+"two processes and the connecting pipe is known as a _pipeline_. Pipelines "
+"can be arbitrarily long series of processes connected by pipes."
+msgstr ""
+"Каналы позволяют выводу одной программы становиться вводом другой программы "
+"без переписывания и даже перекомпоновки программ. Вместо того, чтобы "
+"дескриптор 1 (стандартный вывод) исходной программы был настроен на запись "
+"на терминал, он настраивается на входной дескриптор канала. Аналогично "
+"дескриптор 0 (стандартный ввод) принимающей программы настраивается на "
+"обращение к выводу канала, а не к клавиатуре терминала. Результирующий набор "
+"двух процессов и соединяющий канал называется _конвейером_. Конвейеры могут "
+"быть весьма большими последовательностями процессов, соединенных каналами."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:470
+msgid ""
+"The _open_, _pipe_, and _socket_ system calls produce new descriptors with "
+"the lowest unused number usable for a descriptor. For pipelines to work, "
+"some mechanism must be provided to map such descriptors into 0 and 1. The "
+"_dup_ system call creates a copy of a descriptor that points to the same "
+"file-table entry. The new descriptor is also the lowest unused one, but if "
+"the desired descriptor is closed first, _dup_ can be used to do the desired "
+"mapping. Care is required, however: If descriptor 1 is desired, and "
+"descriptor 0 happens also to have been closed, descriptor 0 will be the "
+"result. To avoid this problem, the system provides the _dup2_ system call; "
+"it is like _dup_, but it takes an additional argument specifying the number "
+"of the desired descriptor (if the desired descriptor was already open, "
+"_dup2_ closes it before reusing it)."
+msgstr ""
+"Системные вызовы _open_, _pipe_ и _socket_ порождают новые дескрипторы с "
+"наименьшим неиспользуемым номером, подходящим для дескриптора. Для того, "
+"чтобы конвейеры могли работать, должен существовать механизм для отображения "
+"таких дескрипторов в 0 и 1. Системный вызов _dup_ создает копию дескриптора, "
+"которая указывает на ту же самую запись в таблице файлов. Новый дескриптор "
+"также является наименьшим неиспользуемым, но если нужный дескриптор сначала "
+"закрыть, то _dup_ можно использовать для выполнения нужного отображения. "
+"Однако здесь требуется некоторая осторожность: если нужен дескриптор 1, а "
+"дескриптор 0 уже закрыт, то в результате получится дескриптор 0. Во "
+"избежание этой проблемы в системе имеется системный вызов _dup2_; он похож "
+"на _dup_, но воспринимает дополнительный аргумент, указывающий номер нужного "
+"дескриптора (если нужный дескриптор уже открыт, то _dup2_ его закроет перед "
+"повторным использованием)."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:471
+#, no-wrap
+msgid "Devices"
+msgstr "Устройства"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:477
+msgid ""
+"Hardware devices have filenames, and may be accessed by the user via the "
+"same system calls used for regular files. The kernel can distinguish a "
+"_device special file_ or _special file_, and can determine to what device it "
+"refers, but most processes do not need to make this determination. "
+"Terminals, printers, and tape drives are all accessed as though they were "
+"streams of bytes, like 4.4BSD disk files. Thus, device dependencies and "
+"peculiarities are kept in the kernel as much as possible, and even in the "
+"kernel most of them are segregated in the device drivers."
+msgstr ""
+"Аппаратные устройства имеют связанные с ними имена файлов, и к ним может "
+"обращаться пользователь при помощи тех же самых системных вызовов, что "
+"используются для обычных файлов. Ядро может различать _специальный файл "
+"устройства_ или просто _специальный файл_, и может определять, к какому "
+"устройству он относится, но большинство процессов не выполняют такого "
+"распознавания. Терминалы, принтеры и стримеры все доступны как "
+"последовательности байт, как дисковые файлы 4.4BSD. Таким образом, "
+"особенности работы устройств максимально скрываются ядром, и даже в ядре "
+"большинство из них отличаются в драйверах."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:482
+msgid ""
+"Hardware devices can be categorized as either _structured_ or "
+"_unstructured_; they are known as _block_ or _character_ devices, "
+"respectively. Processes typically access devices through _special files_ in "
+"the filesystem. I/O operations to these files are handled by kernel-"
+"resident software modules termed _device drivers_. Most network-"
+"communication hardware devices are accessible through only the interprocess-"
+"communication facilities, and do not have special files in the filesystem "
+"name space, because the _raw-socket_ interface provides a more natural "
+"interface than does a special file."
+msgstr ""
+"Аппаратные устройства могут быть разделены на _структурированные_ или "
+"_неструктурированные_; они известны под названиями _блочные_ и "
+"_посимвольные_, соответственно. Как правило, процессы обращаются к "
+"устройствам посредством _специальных файлов_ в файловой системе. Операции "
+"ввода/вывода, выполняемые с такими файлами, обрабатываются постоянно "
+"находящимися в ядре программными модулями, называемыми _драйверами "
+"устройств_. Большинство аппаратных устройств для сетевых коммуникаций "
+"доступны только при помощи подсистемы межпроцессного взаимодействия, и не "
+"имеют специальных устройств в пространстве имен файловой системы, так как "
+"интерфейс _низкоуровневых сокетов_ дает более естественный интерфейс, чем "
+"специальный файл."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:486
+msgid ""
+"Structured or block devices are typified by disks and magnetic tapes, and "
+"include most random-access devices. The kernel supports read-modify-write-"
+"type buffering actions on block-oriented structured devices to allow the "
+"latter to be read and written in a totally random byte-addressed fashion, "
+"like regular files. Filesystems are created on block devices."
+msgstr ""
+"Структурированные или блочные устройства разделяются на диски и магнитные "
+"ленты и включают в себя большинство устройств с произвольным доступом. Ядро "
+"поддерживает операции буферизации типа чтение-изменение-запись с блочными "
+"структурированными устройствами для того, чтобы разрешить последним "
+"осуществлять чтение и запись полностью произвольным образом, как с обычными "
+"файлами. Файловые системы создаются на блочных устройствах."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:490
+msgid ""
+"Unstructured devices are those devices that do not support a block "
+"structure. Familiar unstructured devices are communication lines, raster "
+"plotters, and unbuffered magnetic tapes and disks. Unstructured devices "
+"typically support large block I/O transfers."
+msgstr ""
+"Неструктурированными устройствами являются те, что не поддерживают блочную "
+"структуру. Типичными неструктурированными устройствами являются линии связи, "
+"растровые графопостроители и небуферизируемые магнитные ленты и диски. "
+"Неструктурированные устройства, как правило, поддерживают перенос больших "
+"объемов данных."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:493
+msgid ""
+"Unstructured files are called _character devices_ because the first of these "
+"to be implemented were terminal device drivers. The kernel interface to the "
+"driver for these devices proved convenient for other devices that were not "
+"block structured."
+msgstr ""
+"Неструктурированные файлы называют _символьными устройствами_, потому что "
+"первые из них являлись драйверами терминальных устройств. Интерфейс ядра к "
+"драйверу для этих устройств доказал удобство его использования для других "
+"неструктурированных устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:499
+msgid ""
+"Device special files are created by the _mknod_ system call. There is an "
+"additional system call, _ioctl_, for manipulating the underlying device "
+"parameters of special files. The operations that can be done differ for "
+"each device. This system call allows the special characteristics of devices "
+"to be accessed, rather than overloading the semantics of other system "
+"calls. For example, there is an _ioctl_ on a tape drive to write an end-of-"
+"tape mark, instead of there being a special or modified version of _write_."
+msgstr ""
+"Специальные файлы устройств создаются системным вызовом _mknod_. Имеется "
+"дополнительный системный вызов, _ioctl_, для управления низкоуровневыми "
+"параметрами специальных файлов. Выполняемые операции для каждого устройства "
+"различны. Этот системный вызов позволяет осуществлять доступ к специальным "
+"характеристикам устройств, не перегружая смысл других системных вызовов. "
+"Например, для стримера существует _ioctl_ для записи метки конца ленты, но "
+"нет особой или измененной версии функции _write_."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:500
+#, no-wrap
+msgid "Socket IPC"
+msgstr "Механизм межпроцессных коммуникаций посредством сокетов"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:509
+msgid ""
+"The 4.2BSD kernel introduced an IPC mechanism more flexible than pipes, "
+"based on _sockets_. A socket is an endpoint of communication referred to by "
+"a descriptor, just like a file or a pipe. Two processes can each create a "
+"socket, and then connect those two endpoints to produce a reliable byte "
+"stream. Once connected, the descriptors for the sockets can be read or "
+"written by processes, just as the latter would do with a pipe. The "
+"transparency of sockets allows the kernel to redirect the output of one "
+"process to the input of another process residing on another machine. A "
+"major difference between pipes and sockets is that pipes require a common "
+"parent process to set up the communications channel. A connection between "
+"sockets can be set up by two unrelated processes, possibly residing on "
+"different machines."
+msgstr ""
+"В ядре 4.2BSD появился механизм межпроцессного взаимодействия, более гибкий, "
+"чем каналы, основанный на _сокетах_. Сокет является конечной точкой "
+"коммуникаций, доступный через дескриптор, как файл или канал. Каждый из двух "
+"процессов может создать сокет, а затем соединить эти конечные точки для "
+"получения надежного канала передачи потока байт. После соединения процесс "
+"может выполнять с дескрипторами операции чтения и записи, как это делалось с "
+"каналами. Прозрачность сокетов позволяет ядру перенаправить вывод одного "
+"процесса на вход другого, работающего на другой машине. Большим различием "
+"между каналами и сокетами является то, что каналы требуют наличия общего "
+"родительского процесса для установки коммуникации. Соединение между сокетами "
+"может быть установлено двумя несвязанными процессами, возможно, работающими "
+"на разных машинах."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:516
+msgid ""
+"System V provides local interprocess communication through FIFOs (also known "
+"as _named pipes_). FIFOs appear as an object in the filesystem that "
+"unrelated processes can open and send data through in the same way as they "
+"would communicate through a pipe. Thus, FIFOs do not require a common "
+"parent to set them up; they can be connected after a pair of processes are "
+"up and running. Unlike sockets, FIFOs can be used on only a local machine; "
+"they cannot be used to communicate between processes on different machines. "
+"FIFOs are implemented in 4.4BSD only because they are required by the "
+"POSIX.1 standard. Their functionality is a subset of the socket interface."
+msgstr ""
+"System V предоставляет механизм локального межпроцессного взаимодействия "
+"через FIFO (также называемые _именованными каналами_). FIFO отображаются как "
+"объекты файловой системы, которые могут быть открыты несвязанными "
+"процессами, и в которые можно открывать и посылать данные так же, как в "
+"случае каналов. Таким образом, FIFO не требуют общего родительского процесса "
+"для установки соединения; они могут быть соединены после того, как будут "
+"запущены два процесса. В отличие от сокетов, FIFO могут быть использованы "
+"только на локальной машине; они не могут быть использованы для связи между "
+"процессами, работающими на разных машинах. FIFO реализованы в 4.4BSD, потому "
+"что это требует стандарт POSIX.1. Их функциональность является подмножеством "
+"функций интерфейса сокетов."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:523
+msgid ""
+"The socket mechanism requires extensions to the traditional UNIX I/O system "
+"calls to provide the associated naming and connection semantics. Rather "
+"than overloading the existing interface, the developers used the existing "
+"interfaces to the extent that the latter worked without being changed, and "
+"designed new interfaces to handle the added semantics. The _read_ and "
+"_write_ system calls were used for byte-stream type connections, but six new "
+"system calls were added to allow sending and receiving addressed messages "
+"such as network datagrams. The system calls for writing messages include "
+"_send_, _sendto_, and _sendmsg_. The system calls for reading messages "
+"include _recv_, _recvfrom_, and _recvmsg_. In retrospect, the first two in "
+"each class are special cases of the others; _recvfrom_ and _sendto_ probably "
+"should have been added as library interfaces to _recvmsg_ and _sendmsg_, "
+"respectively."
+msgstr ""
+"Механизм сокетов требует расширения традиционных для UNIX системных вызовов "
+"ввода/вывода для обеспечения соответствующих имен и смыслов соединениям. "
+"Вместо того, чтобы перегружать существующий интерфейс, разработчики "
+"использовали существующие интерфейсы, расширив их так, что они продолжили "
+"работать без изменений, и разработали новые интерфейсы для работы с новыми "
+"возможностями. Системные вызовы _read_ и _write_ использовались для "
+"соединений типа потока байт, и было добавлено шесть новых системных вызовов, "
+"что позволило посылать и принимать адресованные сообщения, такие, как "
+"сетевые датаграммы. Системные вызовы для записи сообщений включают в себя "
+"_send_, _sendto_ и _sendmsg_. Системные вызовы для чтения сообщений включают "
+"_recv_, _recvfrom_ и _recvmsg_. В ретроспективе, первые два в каждом классе "
+"являются особыми случаями других; _recvfrom_ и _sendto_, наверное, должны "
+"были быть добавлены как библиотечные интерфейсы к _recvmsg_ и _sendmsg_, "
+"соответственно."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:524
+#, no-wrap
+msgid "Scatter/Gather I/O"
+msgstr "Множественный ввод/вывод"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:530
+msgid ""
+"In addition to the traditional _read_ and _write_ system calls, 4.2BSD "
+"introduced the ability to do scatter/gather I/O. Scatter input uses the "
+"_readv_ system call to allow a single read to be placed in several different "
+"buffers. Conversely, the _writev_ system call allows several different "
+"buffers to be written in a single atomic write. Instead of passing a single "
+"buffer and length parameter, as is done with _read_ and _write_, the process "
+"passes in a pointer to an array of buffers and lengths, along with a count "
+"describing the size of the array."
+msgstr ""
+"Кроме традиционных системных вызовов _read_ и _write_, в 4.2BSD появилась "
+"возможность выполнять множественный ввод/вывод. Множественный ввод "
+"использует системный вызов _readv_ для размещения результата единственной "
+"операции чтения в нескольких различных буферах. Обратно, системный вызов "
+"_writev_ позволяет осуществлять запись нескольких различных буферов за одну "
+"атомарную операцию записи. Вместо передачи одного буфера и его длины в "
+"качестве параметров, как это делается при использовании системных вызовов "
+"_read_ и _write_, процесс передает указатель на массив буферов и их длин, а "
+"также счетчик, определяющий размер массива."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:535
+msgid ""
+"This facility allows buffers in different parts of a process address space "
+"to be written atomically, without the need to copy them to a single "
+"contiguous buffer. Atomic writes are necessary in the case where the "
+"underlying abstraction is record based, such as tape drives that output a "
+"tape block on each write request. It is also convenient to be able to read "
+"a single request into several different buffers (such as a record header "
+"into one place and the data into another). Although an application can "
+"simulate the ability to scatter data by reading the data into a large buffer "
+"and then copying the pieces to their intended destinations, the cost of "
+"memory-to-memory copying in such cases often would more than double the "
+"running time of the affected application."
+msgstr ""
+"Такой механизм позволяет буферам в различных областях адресного пространства "
+"процесса записываться атомарно, без необходимости копировать их в один "
+"буфер. Атомарные операции записи необходимы в случае, когда низкоуровневые "
+"абстракции основаны на записях, например, стримеры, которые выводят блок "
+"ленты при каждом запросе на запись. Также полезна возможность помещать "
+"результат одного запроса на чтение в нескольких различных буферах (например, "
+"заголовок записи в одно место, а данные в другое). Хотя приложение может "
+"симулировать возможность выполнять множественные операции посредством чтения "
+"данных в большой буфер с последующим копированием их частей в нужные "
+"области, и накладные расходы на копирование в памяти в таких случаях часто "
+"увеличивает время выполнения приложения чуть ли не вдвое."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:538
+msgid ""
+"Just as _send_ and _recv_ could have been implemented as library interfaces "
+"to _sendto_ and _recvfrom_, it also would have been possible to simulate "
+"_read_ with _readv_ and _write_ with _writev_. However, _read_ and _write_ "
+"are used so much more frequently that the added cost of simulating them "
+"would not have been worthwhile."
+msgstr ""
+"Так же, как _send_ и _recv_ могут быть реализованы в виде библиотечных "
+"интерфейсов к _sendto_ и _recvfrom_, возможно симулирование _read_ через "
+"_readv_ и _write_ через _writev_. Однако _read_ и _write_ используются столь "
+"часто, что накладные расходы на такую симуляцию не стоят того."
+
+#. type: Title ====
+#: documentation/content/en/books/design-44bsd/_index.adoc:539
+#, no-wrap
+msgid "Multiple Filesystem Support"
+msgstr "Поддержка нескольких файловых систем"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:545
+msgid ""
+"With the expansion of network computing, it became desirable to support both "
+"local and remote filesystems. To simplify the support of multiple "
+"filesystems, the developers added a new virtual node or _vnode_ interface to "
+"the kernel. The set of operations exported from the vnode interface appear "
+"much like the filesystem operations previously supported by the local "
+"filesystem. However, they may be supported by a wide range of filesystem "
+"types:"
+msgstr ""
+"Вместе с распространением сетевых вычислений возникла потребность в "
+"поддержке как локальных, так и удаленных файловых систем. Для облегчения "
+"поддержки нескольких файловых систем разработчики добавили в ядро интерфейс "
+"виртуальных узлов файловой системы, или интерфейс _vnode_. Набор операций, "
+"экспортируемых через интерфейс vnode, похож на операции файловой системы, "
+"ранее поддерживаемые локальной файловой системой. Однако они могут "
+"поддерживаться широким спектром типов файловых систем:"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:547
+msgid "Local disk-based filesystems"
+msgstr "Локальные файловые системы, использующие диск"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:548
+msgid "Files imported using a variety of remote filesystem protocols"
+msgstr ""
+"Файлы, импортируемые при помощи разнообразных протоколов удаленных файловых "
+"систем"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:549
+msgid "Read-only CD-ROM filesystems"
+msgstr "Файловые системы CD-ROM, доступные только для чтения"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:550
+msgid ""
+"Filesystems providing special-purpose interfaces -- for example, the `/proc` "
+"filesystem"
+msgstr ""
+"Файловые системы, предоставляющие специализированные услуги - к примеру, "
+"файловая система [.filename]#/proc#"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:553
+msgid ""
+"A few variants of 4.4BSD, such as FreeBSD, allow filesystems to be loaded "
+"dynamically when the filesystems are first referenced by the _mount_ system "
+"call. The vnode interface is described in Section 6.5; its ancillary "
+"support routines are described in Section 6.6; several of the special-"
+"purpose filesystems are described in Section 6.7."
+msgstr ""
+"Некоторые варианты 4.4BSD, такие, как FreeBSD, позволяют выполнять "
+"динамическую загрузку файловых систем при первом обращении к ним при помощи "
+"системного вызова _mount_. Интерфейс vnode описан в Разделе 6.5; вдобавок он "
+"поддерживает функции, описанные в Разделе 6.6; некоторые из файловых систем "
+"специального назначения описаны в Разделе 6.7."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:555
+#, no-wrap
+msgid "Filesystems"
+msgstr "Файловые системы"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:560
+msgid ""
+"A regular file is a linear array of bytes, and can be read and written "
+"starting at any byte in the file. The kernel distinguishes no record "
+"boundaries in regular files, although many programs recognize line-feed "
+"characters as distinguishing the ends of lines, and other programs may "
+"impose other structure. No system-related information about a file is kept "
+"in the file itself, but the filesystem stores a small amount of ownership, "
+"protection, and usage information with each file."
+msgstr ""
+"Обычный файл представляет собой массив байтов, и может читаться и "
+"записываться, начиная с произвольного байта файла. Ядро не различает в "
+"обычных файлах границ записей, хотя многие программы воспринимают символы "
+"перевода строки в качестве признаков конца строк, но другие программы могут "
+"предполагать наличие других структур. В самом файле не хранится никакой "
+"системной информации о файле, но в файловой системе размещается некоторая "
+"информация о владельце, правах доступа и об использовании каждого файла."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:565
+msgid ""
+"A _filename_ component is a string of up to 255 characters. These filenames "
+"are stored in a type of file called a _directory_. The information in a "
+"directory about a file is called a _directory entry_ and includes, in "
+"addition to the filename, a pointer to the file itself. Directory entries "
+"may refer to other directories, as well as to plain files. A hierarchy of "
+"directories and files is thus formed, and is called a _filesystem_;"
+msgstr ""
+"Компонент под названием _имя файла_ является строкой длиной до 255 символов. "
+"Эти имена хранятся в файле особого типа, который называется _каталогом_. "
+"Информация о файле в каталоге называется _записью каталога_ и включает, "
+"кроме имени файла, указатель на сам файл. Записи каталога могут ссылаться "
+"как на другие каталоги, так и на обычные файлы. Таким образом формируется "
+"иерархия каталогов и файлов, которая и называется файловой системой "
+"_filesystem_;"
+
+#. type: Block title
+#: documentation/content/en/books/design-44bsd/_index.adoc:566
+#, no-wrap
+msgid "A small filesystem"
+msgstr "Небольшая файловая система"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:569
+msgid "image:fig2.png[A small filesystem]"
+msgstr "image:fig2.png[Дерево небольшой файловой системы]"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:574
+msgid ""
+"a small one is shown in crossref:design-44bsd[fig-small-fs, A small "
+"filesystem]. Directories may contain subdirectories, and there is no "
+"inherent limitation to the depth with which directory nesting may occur. To "
+"protect the consistency of the filesystem, the kernel does not permit "
+"processes to write directly into directories. A filesystem may include not "
+"only plain files and directories, but also references to other objects, such "
+"as devices and sockets."
+msgstr ""
+"Одна небольшая файловая система показана на crossref:design-44bsd[fig-small-"
+"fs, A small filesystem]. Каталоги могут содержать подкаталоги, и нет "
+"ограничений вложенности одного каталога в другой по глубине. Для соблюдения "
+"целостности файловой системы, ядро не позволяет процессу производить запись "
+"непосредственно в каталоги. Файловая система может хранить не только обычные "
+"файлы и каталоги, но также ссылки на другие объекты, такие, как устройства и "
+"сокеты."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:579
+msgid ""
+"The filesystem forms a tree, the beginning of which is the _root directory_, "
+"sometimes referred to by the name _slash_, spelled with a single solidus "
+"character (/). The root directory contains files; in our example in Fig "
+"2.2, it contains `vmunix`, a copy of the kernel-executable object file. It "
+"also contains directories; in this example, it contains the `usr` "
+"directory. Within the `usr` directory is the `bin` directory, which mostly "
+"contains executable object code of programs, such as the files `ls` and `vi`."
+msgstr ""
+"Файловая система образует дерево, начало которого находится в _корневом "
+"каталоге_, иногда называемому по имени _слэш_, которое соответствует символу "
+"одинарной наклонной черты (/). Корневой каталог содержит файлы; в нашем "
+"примере на Рисунке 2.2, он содержит [.filename]#vmunix#, копию выполнимого "
+"объектного файла ядра. В нем также расположены каталоги; в этом примере он "
+"содержит каталог [.filename]#usr#. Внутри каталога [.filename]#usr# "
+"располагается каталог [.filename]#bin#, который в основном содержит "
+"выполнимый объектный код программ, таких, как [.filename]#ls# и "
+"[.filename]#vi#."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:584
+msgid ""
+"A process identifies a file by specifying that file's _pathname_, which is a "
+"string composed of zero or more filenames separated by slash (/) "
+"characters. The kernel associates two directories with each process for use "
+"in interpreting pathnames. A process's _root directory_ is the topmost "
+"point in the filesystem that the process can access; it is ordinarily set to "
+"the root directory of the entire filesystem. A pathname beginning with a "
+"slash is called an _absolute pathname_, and is interpreted by the kernel "
+"starting with the process's root directory."
+msgstr ""
+"Процесс обращается к файлу, указывая _путь_ до него, который является "
+"строкой, состоящей из нескольких или ни одного имен файлов, разделенных "
+"символами слэша (/). С каждым процессом ядро связывает два каталога, при "
+"помощи которых можно интерпретировать маршруты до файлов. _Корневой каталог_ "
+"процесса является самой верхней точкой файловой системы, которую может "
+"достичь процесс; обычно он соответствует корневому каталогу всей файловой "
+"системы. Маршрут, начинающийся с символа слэша, называется _абсолютным "
+"маршрутом_, и интерпретируется ядром, начиная с корневого каталога процесса."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:590
+msgid ""
+"A pathname that does not begin with a slash is called a _relative pathname_, "
+"and is interpreted relative to the _current working directory_ of the "
+"process. (This directory also is known by the shorter names _current "
+"directory_ or _working directory_.) The current directory itself may be "
+"referred to directly by the name _dot_, spelled with a single period (`.`) "
+"The filename _dot-dot_ (`..`) refers to a directory's parent directory. The "
+"root directory is its own parent."
+msgstr ""
+"Имя пути, которое не начинается со слэша, называется _относительным "
+"маршрутом_, и интерпретируется относительно _текущего рабочего каталога_ "
+"процесса. (Этот каталог кратко также называют _текущим каталогом_ или "
+"_рабочим каталогом_.) Текущий каталог сам по себе можно обозначить "
+"непосредственно по имени _dot_, что соответствует одной точке (`.`). Имя "
+"файла _dot-dot_ (`..`) обозначает родительский каталог текущего каталога. "
+"Корневой каталог является предком самому себе."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:594
+msgid ""
+"A process may set its root directory with the _chroot_ system call, and its "
+"current directory with the _chdir_ system call. Any process may do _chdir_ "
+"at any time, but _chroot_ is permitted only a process with superuser "
+"privileges. _Chroot_ is normally used to set up restricted access to the "
+"system."
+msgstr ""
+"Процесс может задать собственный корневой каталог при помощи системного "
+"вызова _chroot_, и установить текущий каталог системным вызовом _chdir_. "
+"Каждый процесс может в любой момент выполнить вызов _chdir_, но _chroot_ "
+"позволено выполнять только процессу с административными привилегиями. "
+"_Chroot_ обычно используется для ограничения доступа к системе."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:596
+msgid ""
+"Using the filesystem shown in Fig. 2.2, if a process has the root of the "
+"filesystem as its root directory, and has `/usr` as its current directory, "
+"it can refer to the file `vi` either from the root with the absolute "
+"pathname `/usr/bin/vi`, or from its current directory with the relative "
+"pathname `bin/vi`."
+msgstr ""
+"Взяв файловую систему, изображенную на Рисунке 2.2, и полагая, что процесс "
+"имеет в качестве корневого каталога корневой каталог файловой системы, и в "
+"качестве текущего каталога [.filename]#/usr#, он может обратиться к файлу "
+"[.filename]#vi# либо от корня по абсолютному имени [.filename]#/usr/bin/vi#, "
+"либо из текущего каталога с относительным именем [.filename]#bin/vi#."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:602
+msgid ""
+"System utilities and databases are kept in certain well-known directories. "
+"Part of the well-defined hierarchy includes a directory that contains the "
+"_home directory_ for each user -- for example, `/usr/staff/mckusick` and `/"
+"usr/staff/karels` in Fig. 2.2. When users log in, the current working "
+"directory of their shell is set to the home directory. Within their home "
+"directories, users can create directories as easily as they can regular "
+"files. Thus, a user can build arbitrarily complex subhierarchies."
+msgstr ""
+"Системные утилиты и базы данных располагаются в нескольких всем известных "
+"каталогах. Частью предопределенной иерархии является каталог, содержащий "
+"_домашний каталог_ для каждого пользователя - например, [.filename]#/usr/"
+"staff/mckusick# и [.filename]#/usr/staff/karels# на Рисунке 2.2. Когда "
+"пользователи регистрируются в системе, то рабочий каталог их командного "
+"процессора устанавливается в домашний каталог. В своих домашних каталогах "
+"пользователи могут создавать каталоги так же легко, как и обычные файлы. "
+"Таким образом, пользователь может строить иерархии каталогов произвольной "
+"сложности."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:609
+msgid ""
+"The user usually knows of only one filesystem, but the system may know that "
+"this one virtual filesystem is really composed of several physical "
+"filesystems, each on a different device. A physical filesystem may not span "
+"multiple hardware devices. Since most physical disk devices are divided "
+"into several logical devices, there may be more than one filesystem per "
+"physical device, but there will be no more than one per logical device. One "
+"filesystem -- the filesystem that anchors all absolute pathnames -- is "
+"called the _root filesystem_, and is always available. Others may be "
+"mounted; that is, they may be integrated into the directory hierarchy of the "
+"root filesystem. References to a directory that has a filesystem mounted on "
+"it are converted transparently by the kernel into references to the root "
+"directory of the mounted filesystem."
+msgstr ""
+"Пользователь обычно знает только об одной файловой системе, но система может "
+"знать, что одна виртуальная файловая система на самом деле состоит из "
+"нескольких физических файловых систем, каждая из которых расположена на "
+"отдельном устройстве. Физическая файловая система не может располагаться на "
+"нескольких физических устройствах. Так как большинство физических дисковых "
+"устройств разбиваются на несколько логических устройств, то на одном "
+"физическом устройстве может располагаться более одной файловой системы, но "
+"не более одной для каждого логического устройства. Одна из файловых систем - "
+"та, с которой начинаются все абсолютные имена - называется _корневой "
+"файловой системой_, и она всегда доступна. Другие файловые системы могут "
+"монтироваться; это значит, что они могут интегрироваться в иерархию "
+"каталогов корневой файловой системы. Ссылки на каталог, в котором находится "
+"смонтированная в него файловая системе, прозрачно преобразуются ядром в "
+"ссылки на корневой каталог смонтированной файловой системы."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:614
+msgid ""
+"The _link_ system call takes the name of an existing file and another name "
+"to create for that file. After a successful _link_, the file can be "
+"accessed by either filename. A filename can be removed with the _unlink_ "
+"system call. When the final name for a file is removed (and the final "
+"process that has the file open closes it), the file is deleted."
+msgstr ""
+"Системный вызов _link_ в качестве параметров принимает имя существующего "
+"файла и новое имя, которое будет присвоено файлу. После успешного выполнения "
+"вызова _link_, файл может быть доступен по любому из имен. Имя файла может "
+"быть удалено при помощи системного вызова _unlink_. Когда удаляется "
+"последнее имя для файла (и последний процесс, который держал файл открытым, "
+"закрыл его), удаляется и сам файл."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:621
+msgid ""
+"Files are organized hierarchically in _directories_. A directory is a type "
+"of file, but, in contrast to regular files, a directory has a structure "
+"imposed on it by the system. A process can read a directory as it would an "
+"ordinary file, but only the kernel is permitted to modify a directory. "
+"Directories are created by the _mkdir_ system call and are removed by the "
+"_rmdir_ system call. Before 4.2BSD, the _mkdir_ and _rmdir_ system calls "
+"were implemented by a series of _link_ and _unlink_ system calls being "
+"done. There were three reasons for adding systems calls explicitly to "
+"create and delete directories:"
+msgstr ""
+"Файлы организованы иерархически в _каталоги_. Каталог является типом файла, "
+"но, в отличие от обычных файлов, каталог имеет структуру, определяемую "
+"системой. Процесс может читать каталог, как будто это обычный файл, но "
+"только ядру разрешено изменять каталог. Каталоги создаются системным вызовом "
+"_mkdir_ и удаляются системным вызовом _rmdir_. До 4.2BSD системные вызовы "
+"_mkdir_ и _rmdir_ были реализованы как последовательность системных вызовов "
+"_link_ и _unlink_. Имелось три причины для добавления системных вызовов "
+"специально для создания и удаления каталогов:"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:624
+msgid ""
+"The operation could be made atomic. If the system crashed, the directory "
+"would not be left half-constructed, as could happen when a series of link "
+"operations were used."
+msgstr ""
+"Операция может быть сделана атомарной. Если система завершила работу "
+"аварийно, то каталог не может оставаться в промежуточном состоянии, что "
+"может случиться при последовательном вызове серии операций."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:625
+msgid ""
+"When a networked filesystem is being run, the creation and deletion of files "
+"and directories need to be specified atomically so that they can be "
+"serialized."
+msgstr ""
+"При работе сетевой файловой системы создание и удаление файлов и каталогов "
+"должны выполняться атомарно, чтобы могли выполняться последовательно."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:626
+msgid ""
+"When supporting non-UNIX filesystems, such as an MS-DOS filesystem, on "
+"another partition of the disk, the other filesystem may not support link "
+"operations. Although other filesystems might support the concept of "
+"directories, they probably would not create and delete the directories with "
+"links, as the UNIX filesystem does. Consequently, they could create and "
+"delete directories only if explicit directory create and delete requests "
+"were presented."
+msgstr ""
+"При реализации поддержки не-UNIX файловых систем, таких, как файловая "
+"система MS-DOS, на другом разделе диска, может оказаться, что эта файловая "
+"система не поддерживает ссылочных операций. Хотя другие файловые системы "
+"могут поддерживать концепцию каталогов, скорее всего, они не будут создавать "
+"и удалять каталоги со ссылками, как это делается в файловой системе UNIX. "
+"Соответственно они могут создавать и и удалять каталоги только при наличии "
+"явных запросов на удаление или создание каталогов."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:633
+msgid ""
+"The _chown_ system call sets the owner and group of a file, and _chmod_ "
+"changes protection attributes. _Stat_ applied to a filename can be used to "
+"read back such properties of a file. The _fchown_, _fchmod_, and _fstat_ "
+"system calls are applied to a descriptor, instead of to a filename, to do "
+"the same set of operations. The _rename_ system call can be used to give a "
+"file a new name in the filesystem, replacing one of the file's old names. "
+"Like the directory-creation and directory-deletion operations, the _rename_ "
+"system call was added to 4.2BSD to provide atomicity to name changes in the "
+"local filesystem. Later, it proved useful explicitly to export renaming "
+"operations to foreign filesystems and over the network."
+msgstr ""
+"Системный вызов _chown_ устанавливает владельца и группу файла, а _chmod_ "
+"изменяет атрибуты защиты. Вызов _stat_, примененный к имени файла, может "
+"использоваться для чтения этих свойств файла. Системные вызовы _fchown_, "
+"_fchmod_ и _fstat_ применяются с дескрипторами, а не с именами файлов, для "
+"выполнения того же самого набора операций. Системный вызов _rename_ может "
+"использоваться для присвоения файлу нового имени в файловой системе с "
+"заменой старого имени файла. Как и операции по созданию и удалению "
+"каталогов, системный вызов _rename_ был добавлен в 4.2BSD для придания "
+"атомарности изменению имен в локальной файловой системе. Позже он оправдал "
+"свою исключительную полезность для экспортирования операций по "
+"переименованию в сторонних файловых системах и по сети."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:638
+msgid ""
+"The _truncate_ system call was added to 4.2BSD to allow files to be "
+"shortened to an arbitrary offset. The call was added primarily in support "
+"of the Fortran run-time library, which has the semantics such that the end "
+"of a random-access file is set to be wherever the program most recently "
+"accessed that file. Without the _truncate_ system call, the only way to "
+"shorten a file was to copy the part that was desired to a new file, to "
+"delete the old file, then to rename the copy to the original name. As well "
+"as this algorithm being slow, the library could potentially fail on a full "
+"filesystem."
+msgstr ""
+"Системный вызов _truncate_ был добавлен в 4.2BSD для того, чтобы файлы могли "
+"обрезаться по указанному смещению. Вызов был добавлен первоначально для "
+"поддержки библиотеки времени выполнения языка Fortran, в котором применялось "
+"понятие конца файла с произвольным доступом, который мог устанавливаться в "
+"любую позицию, в которой был последний раз доступ к файлу. Без системного "
+"вызова _truncate_ единственным способом обрезать файл было копирование "
+"нужной части в новый файл, удаление старого и переименование копии в "
+"первоначальное имя. Библиотека могла теоретически отказываться работать на "
+"заполненной файловой системе, к тому же такой алгоритм оказывался медленным."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:641
+msgid ""
+"Once the filesystem had the ability to shorten files, the kernel took "
+"advantage of that ability to shorten large empty directories. The advantage "
+"of shortening empty directories is that it reduces the time spent in the "
+"kernel searching them when names are being created or deleted."
+msgstr ""
+"После того, как файловая система получила возможность обрезать файлы, ядро "
+"применяло эту возможность для уменьшения больших пустых каталогов. "
+"Преимущество в уменьшении пустых каталогов заключается в сокращении времени "
+"ядра на поиск в них при создании или удалении имен."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:645
+msgid ""
+"Newly created files are assigned the user identifier of the process that "
+"created them and the group identifier of the directory in which they were "
+"created. A three-level access-control mechanism is provided for the "
+"protection of files. These three levels specify the accessibility of a file "
+"to"
+msgstr ""
+"Вновь создаваемым файлам присваивается идентификатор пользователя процесса, "
+"который их создал, и идентификатор группы каталога, в котором они были "
+"созданы. Для защиты файлов применяется трехуровневый механизм управления "
+"доступом. Эти три уровня определяют доступность файла для"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:648
+msgid "The user who owns the file"
+msgstr "Пользователя, который является владельцем файла"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:649
+msgid "The group that owns the file"
+msgstr "Группы, которая приписана файлу"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:650
+msgid "Everyone else"
+msgstr "Всех остальных"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:652
+msgid ""
+"Each level of access has separate indicators for read permission, write "
+"permission, and execute permission."
+msgstr ""
+"Каждый уровень доступа имеет отдельные индикаторы прав для чтения, записи и "
+"выполнения."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:662
+msgid ""
+"Files are created with zero length, and may grow when they are written. "
+"While a file is open, the system maintains a pointer into the file "
+"indicating the current location in the file associated with the descriptor. "
+"This pointer can be moved about in the file in a random-access fashion. "
+"Processes sharing a file descriptor through a _fork_ or _dup_ system call "
+"share the current location pointer. Descriptors created by separate _open_ "
+"system calls have separate current location pointers. Files may have "
+"_holes_ in them. Holes are void areas in the linear extent of the file "
+"where data have never been written. A process can create these holes by "
+"positioning the pointer past the current end-of-file and writing. When "
+"read, holes are treated by the system as zero-valued bytes."
+msgstr ""
+"Файлы создаются с нулевым размером, который может увеличиться при выполнении "
+"операций записи. Пока файл открыт, система отслеживает указатель на файл, "
+"соответствующий текущему положению в файле, связанном с дескриптором. Этот "
+"указатель может перемешаться по файлу в произвольном порядке. Процессы, "
+"использующие один и тот же дескриптор файла посредством системных вызовов "
+"_fork_ или _dup_, используют одновременно один и тот же указатель текущей "
+"позиции. Дескрипторы, созданные различными системными вызовами _open_, имеют "
+"различные указатели текущей позиции. В файлах могут присутствовать _дыры_. "
+"Дыры представляют собой пустые пространства в теле файла, в которые никаких "
+"данных не записывалось. Процесс может создать такие дыры, перемещая "
+"указатель за текущий конец файла и производя запись. При чтении дыры "
+"интерпретируются системой как заполненные нулевыми байтами."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:668
+msgid ""
+"Earlier UNIX systems had a limit of 14 characters per filename component. "
+"This limitation was often a problem. For example, in addition to the "
+"natural desire of users to give files long descriptive names, a common way "
+"of forming filenames is as `basename.extension`, where the extension "
+"(indicating the kind of file, such as `.c` for C source or `.o` for "
+"intermediate binary object) is one to three characters, leaving 10 to 12 "
+"characters for the basename. Source-code-control systems and editors "
+"usually take up another two characters, either as a prefix or a suffix, for "
+"their purposes, leaving eight to 10 characters. It is easy to use 10 or 12 "
+"characters in a single English word as a basename (e.g., `multiplexer`)."
+msgstr ""
+"Ранние версии UNIX имели ограничение в 14 символов на имя файла. Это "
+"ограничение зачастую вызывало проблемы. Например, кроме естественного "
+"желания пользователей давать файлам длинные описательные имена, "
+"распространенным способом формировать имена файлов является использование "
+"формата [.filename]#basename.extension#, где расширение (указывающее на тип "
+"файла, скажем, `.c` для исходного года на языке C или `.o` для "
+"промежуточного двоичного объекта) имеет длину от одного до трех символов, "
+"оставляя от 10 до 12 символов на имя файла. Системы управления исходным "
+"кодом и редакторы обычно используют дополнительно два символа для своих "
+"целей, для префикса или суффикса имени файла, при этом остается от восьми до "
+"10 символов. В качестве имени файла легко использовать от 10 до 12 символов "
+"одного английского слова (например, `multiplexer`)."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:673
+msgid ""
+"It is possible to keep within these limits, but it is inconvenient or even "
+"dangerous, because other UNIX systems accept strings longer than the limit "
+"when creating files, but then _truncate_ to the limit. A C language source "
+"file named `multiplexer.c` (already 13 characters) might have a source-code-"
+"control file with `s.` prepended, producing a filename `s.multiplexer` that "
+"is indistinguishable from the source-code-control file for `multiplexer.ms`, "
+"a file containing `troff` source for documentation for the C program. The "
+"contents of the two original files could easily get confused with no warning "
+"from the source-code-control system. Careful coding can detect this "
+"problem, but the long filenames first introduced in 4.2BSD practically "
+"eliminate it."
+msgstr ""
+"Можно смириться с этими ограничениями, но это непоследовательно и даже "
+"опасно, потому что другие системы UNIX могут работать со строками, "
+"превышающими этот лимит, при создании файлов, но затем имя будет _обрезано_. "
+"Исходный файл с именем [.filename]#multiplexer.c#, содержащий исходный код "
+"на языке C, (уже 13 символов) может иметь соответствующий файл из системы "
+"управления исходным кодом с префиксом `s.`, при этом получается имя файла "
+"[.filename]#s.multiplexer#, которое не будет отличаться от файла системы "
+"управления исходным кодом для файла [.filename]#multiplexer.ms#, содержащего "
+"исходный код `troff` для документации программы на языке C. Содержимое двух "
+"оригинальных файлов может оказаться перепутанным без каких-либо "
+"предупреждений от системы управления исходным кодом. При тщательном "
+"кодировании эту проблему можно обнаружить, но поддержка длинных имен файлов, "
+"впервые появившаяся в 4.2BSD, практически полностью ликвидировала эту "
+"проблему."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:675
+#, no-wrap
+msgid "Filestores"
+msgstr "Размещение файлов"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:680
+msgid ""
+"The operations defined for local filesystems are divided into two parts. "
+"Common to all local filesystems are hierarchical naming, locking, quotas, "
+"attribute management, and protection. These features are independent of how "
+"the data will be stored. 4.4BSD has a single implementation to provide these "
+"semantics."
+msgstr ""
+"Операции, определенные для локальных файловых систем, делятся на две "
+"категории. Общими для всех локальных систем являются иерархический принцип "
+"именования, блокировка, квоты, управление атрибутами и защита. Эти механизмы "
+"не зависят от того, как хранятся данные. В 4.4BSD имеется единая реализация "
+"для предоставления этих сервисов."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:683
+msgid ""
+"The other part of the local filesystem is the organization and management of "
+"the data on the storage media. Laying out the contents of files on the "
+"storage media is the responsibility of the filestore. 4.4BSD supports three "
+"different filestore layouts:"
+msgstr ""
+"Другой частью локальной файловой системы является организация и управление "
+"данными на носителях информации. Размещение содержимого файлов на носителях "
+"является вопросом хранилища файлов. В 4.4BSD поддерживает три различных типа "
+"хранилищ файлов:"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:685
+msgid "The traditional Berkeley Fast Filesystem"
+msgstr "Традиционная файловая система Berkeley Fast Filesystem"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:687
+msgid ""
+"The log-structured filesystem, based on the Sprite operating-system design "
+"crossref:design-44bsd[biblio-rosenblum, [Rosenblum & Ousterhout, 1992]]"
+msgstr ""
+"Журналируемая файловая система, основанная на архитектуре операционной "
+"системы Sprite crossref:design-44bsd[biblio-rosenblum, [Rosenblum & "
+"Ousterhout, 1992]]"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:688
+msgid "A memory-based filesystem"
+msgstr "Файловая система в памяти"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:690
+msgid ""
+"Although the organizations of these filestores are completely different, "
+"these differences are indistinguishable to the processes using the "
+"filestores."
+msgstr ""
+"Хотя организация этих хранилищ совершенно различна, эти различия скрыты от "
+"процессов, использующих файловые системы."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:695
+msgid ""
+"The Fast Filesystem organizes data into cylinder groups. Files that are "
+"likely to be accessed together, based on their locations in the filesystem "
+"hierarchy, are stored in the same cylinder group. Files that are not "
+"expected to accessed together are moved into different cylinder groups. "
+"Thus, files written at the same time may be placed far apart on the disk."
+msgstr ""
+"В файловой системе Fast Filesystem организует данные в группы дорожек. "
+"Файлы, к которым, скорее всего, будет осуществляться доступ одновременно (на "
+"основе их расположения в иерархии файловой системы), хранятся на одной и той "
+"же группе дорожек. Файлы, к которым не предполагается одновременный доступ, "
+"перемещаются на разные группы дорожек. Таким образом, файлы, записываемые в "
+"одно и то же время, могут располагаться в абсолютно разных областях диска."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:700
+msgid ""
+"The log-structured filesystem organizes data as a log. All data being "
+"written at any point in time are gathered together, and are written at the "
+"same disk location. Data are never overwritten; instead, a new copy of the "
+"file is written that replaces the old one. The old files are reclaimed by a "
+"garbage-collection process that runs when the filesystem becomes full and "
+"additional free space is needed."
+msgstr ""
+"Файловая система с журнальной организацией организует данные в виде журнала. "
+"Все данные, записываемые в некоторый момент времени, собираются вместе и "
+"записываются в одно и то же место диска. Данные никогда не перезаписываются; "
+"вместо этого записывается новая копия файла, которая заменяет старую. Старые "
+"файлы уничтожаются процессом-сборщиком мусора, который запускается, когда "
+"файловая система переполняется и появляется необходимость в свободном "
+"пространстве."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:704
+msgid ""
+"The memory-based filesystem is designed to store data in virtual memory. It "
+"is used for filesystems that need to support fast but temporary data, such "
+"as `/tmp`. The goal of the memory-based filesystem is to keep the storage "
+"packed as compactly as possible to minimize the usage of virtual-memory "
+"resources."
+msgstr ""
+"Файловая система в памяти предназначена для хранения данных в виртуальной "
+"памяти. Она используется для файловых систем, в которых должны храниться "
+"временные данные с обеспечением быстрого доступа к ним, к примеру, "
+"[.filename]#/tmp#. При организации файловой системы в памяти преследуется "
+"цель организовать максимально компактное хранение данных для минимизации "
+"использования ресурсов виртуальной памяти."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:706
+#, no-wrap
+msgid "Network Filesystem"
+msgstr "Сетевая файловая система"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:712
+msgid ""
+"Initially, networking was used to transfer data from one machine to "
+"another. Later, it evolved to allowing users to log in remotely to another "
+"machine. The next logical step was to bring the data to the user, instead "
+"of having the user go to the data -- and network filesystems were born. "
+"Users working locally do not experience the network delays on each "
+"keystroke, so they have a more responsive environment."
+msgstr ""
+"Изначально сетевые возможности использовались для передачи данных от одной "
+"машины к другой. Позже это получило свое развитие в обеспечении подключения "
+"пользователей удаленно к другим машинам. Следующим логическим шагом было "
+"предоставление данных пользователю, а не приближение пользователя к данным - "
+"так родились сетевые файловые системы. Пользователи, работающие локально, не "
+"ощущают сетевых задержек при каждом нажатии клавиши, так что они получают "
+"более удобное рабочее окружение."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:718
+msgid ""
+"Bringing the filesystem to a local machine was among the first of the major "
+"client-server applications. The _server_ is the remote machine that exports "
+"one or more of its filesystems. The _client_ is the local machine that "
+"imports those filesystems. From the local client's point of view, a "
+"remotely mounted filesystem appears in the file-tree name space just like "
+"any other locally mounted filesystem. Local clients can change into "
+"directories on the remote filesystem, and can read, write, and execute "
+"binaries within that remote filesystem identically to the way that they can "
+"do these operations on a local filesystem."
+msgstr ""
+"Подключение файловой системы к локальной машине было одним из первых "
+"основных клиент-серверных приложений. _Сервер_ является удаленной машиной, "
+"которая экспортирует одну или более своих файловых систем. _Клиентом_ "
+"является локальная машина, которая импортирует эти файловые системы. С точки "
+"зрения локального клиента, смонтированные удаленные файловые системы "
+"появляются в пространстве имен дерева файлов, как любая другая локально "
+"смонтированная файловая система. Локальные клиенты могут перемещаться в "
+"каталоги на удаленной файловой системе, и могут осуществлять чтение, запись "
+"и выполнение двоичных файлов на удаленной файловой системе точно так же, как "
+"они выполняют эти операции на локальной файловой системе."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:723
+msgid ""
+"When the local client does an operation on a remote filesystem, the request "
+"is packaged and is sent to the server. The server does the requested "
+"operation and returns either the requested information or an error "
+"indicating why the request was denied. To get reasonable performance, the "
+"client must cache frequently accessed data. The complexity of remote "
+"filesystems lies in maintaining cache consistency between the server and its "
+"many clients."
+msgstr ""
+"Когда локальный клиент выполняет операцию на удаленной файловой системе, "
+"оформляется и посылается запрос к серверу. Сервер выполняет запрошенную "
+"операцию и возвращает либо запрошенную информацию, либо ошибку, почему "
+"запрос был отклонен. Для получения удовлетворительной производительности, "
+"клиент должен кэшировать данные, к которым доступ осуществляется часто. "
+"Сложность удаленных файловых систем отражается на поддержке соответствия "
+"между сервером и множеством его клиентов."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:729
+msgid ""
+"Although many remote-filesystem protocols have been developed over the "
+"years, the most pervasive one in use among UNIX systems is the Network "
+"Filesystem (NFS), whose protocol and most widely used implementation were "
+"done by Sun Microsystems. The 4.4BSD kernel supports the NFS protocol, "
+"although the implementation was done independently from the protocol "
+"specification crossref:design-44bsd[biblio-macklem, [Macklem, 1994]]. The "
+"NFS protocol is described in Chapter 9."
+msgstr ""
+"Хотя за эти годы было разработано множество протоколов работы с удаленными "
+"файловыми системами, самой распространенной на системах UNIX является "
+"сетевая файловая система Network Filesystem (NFS), которая была "
+"спроектирована и реализована в Sun Microsystems. Ядро 4.4BSD поддерживает "
+"протокол NFS, хотя его реализация была выполнена независимо от спецификаций "
+"протокола crossref:design-44bsd[biblio-macklem, [Macklem, 1994]]. Протокол "
+"NFS описан в Главе 9."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:731
+#, no-wrap
+msgid "Terminals"
+msgstr "Терминалы"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:736
+msgid ""
+"Terminals support the standard system I/O operations, as well as a "
+"collection of terminal-specific operations to control input-character "
+"editing and output delays. At the lowest level are the terminal device "
+"drivers that control the hardware terminal ports. Terminal input is handled "
+"according to the underlying communication characteristics, such as baud "
+"rate, and according to a set of software-controllable parameters, such as "
+"parity checking."
+msgstr ""
+"Терминалы поддерживают стандартные системные операции ввода/вывода, а также "
+"набор операций, специфичных для терминалов, для управления редактированием "
+"входных символов и задержек вывода. На самом нижнем уровне находятся "
+"драйверы терминальных устройств, которые управляют портами аппаратных "
+"терминалов. Терминальный ввод обрабатывается согласно низлежащим "
+"характеристикам связи, таким, как скорость передачи, и согласно набору "
+"программно контролируемых параметров, таких, как контроль четности."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:740
+msgid ""
+"Layered above the terminal device drivers are line disciplines that provide "
+"various degrees of character processing. The default line discipline is "
+"selected when a port is being used for an interactive login. The line "
+"discipline is run in _canonical mode_; input is processed to provide "
+"standard line-oriented editing functions, and input is presented to a "
+"process on a line-by-line basis."
+msgstr ""
+"Выше уровня драйверов терминальных устройств находятся режимы каналов, "
+"которые обеспечивают различные уровни обработки символов. По умолчанию режим "
+"работы канала выбирается, когда порт используется для интерактивного входа в "
+"систему. Режим работы канала устанавливается в _канонический_; входной поток "
+"обрабатывается так, что обеспечиваются стандартные функции, ориентированные "
+"на редактирование строк, и он представляется процессу в виде целых строк."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:744
+msgid ""
+"Screen editors and programs that communicate with other computers generally "
+"run in _noncanonical mode_ (also commonly referred to as _raw mode_ or "
+"_character-at-a-time mode_). In this mode, input is passed through to the "
+"reading process immediately and without interpretation. All special-"
+"character input processing is disabled, no erase or other line editing "
+"processing is done, and all characters are passed to the program that is "
+"reading from the terminal."
+msgstr ""
+"Экранные редакторы и программы, которые взаимодействуют с другими машинами, "
+"обычно работают в _неканоническом режиме_ (часто называемом _raw-режимом_ "
+"или _посимвольным режимом_). В этом режиме входной поток передается в "
+"читающий процесс сразу же и без всякой обработки. Выключается вся обработка "
+"специальных символов, не выполняется удаление символов и другое "
+"редактирование строк, все символы передаются программе, которая выполняет "
+"чтение с терминала."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:747
+msgid ""
+"It is possible to configure the terminal in thousands of combinations "
+"between these two extremes. For example, a screen editor that wanted to "
+"receive user interrupts asynchronously might enable the special characters "
+"that generate signals and enable output flow control, but otherwise run in "
+"noncanonical mode; all other characters would be passed through to the "
+"process uninterpreted."
+msgstr ""
+"Терминал может быть настроен тысячами различных способов, промежуточных "
+"между этими двумя. Например, экранный редактор, которому необходимо получать "
+"прерывания от пользователя асинхронно, может разрешить использование "
+"специальных символов, которые генерируют сигналы и разрешить управление "
+"выходным потоком, в противном случае работать в неканоническом режиме; все "
+"остальные символы будут передаваться в процесс необработанными."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:749
+msgid ""
+"On output, the terminal handler provides simple formatting services, "
+"including"
+msgstr ""
+"Что касается выходного потока, то терминальный обработчик предоставляет "
+"простые службы по его форматированию, включая"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:751
+msgid ""
+"Converting the line-feed character to the two-character carriage-return-line-"
+"feed sequence"
+msgstr ""
+"Преобразование символа перевода строки на двухсимвольную последовательность "
+"из символов возврата каретки и перевода строки"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:752
+msgid "Inserting delays after certain standard control characters"
+msgstr "Выдерживание пауз после некоторых стандартных управляющих символов"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:753
+msgid "Expanding tabs"
+msgstr "Замещение символов табуляции"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:754
+msgid ""
+"Displaying echoed nongraphic ASCII characters as a two-character sequence of "
+"the form `^C` (i.e., the ASCII caret character followed by the ASCII "
+"character that is the character's value offset from the ASCII `@` character)."
+msgstr ""
+"Вывод неграфических символов ASCII в виде двухсимвольных последовательностей "
+"вида `^C` (другими словами, вывод знака вставки, за которым следует символ, "
+"который находится по смещению от символа `@`, соответствующему значению "
+"этого символа)."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:756
+msgid ""
+"Each of these formatting services can be disabled individually by a process "
+"through control requests."
+msgstr ""
+"Каждый из этих сервисов преобразования может быть независимо выключен "
+"процессом при помощи управляющих запросов."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:758
+#, no-wrap
+msgid "Interprocess Communication"
+msgstr "Межпроцессное взаимодействие"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:762
+msgid ""
+"Interprocess communication in 4.4BSD is organized in _communication "
+"domains_. Domains currently supported include the _local domain_, for "
+"communication between processes executing on the same machine; the _internet "
+"domain_, for communication between processes using the TCP/IP protocol suite "
+"(perhaps within the Internet); the ISO/OSI protocol family for communication "
+"between sites required to run them; and the _XNS domain_, for communication "
+"between processes using the XEROX Network Systems (XNS) protocols."
+msgstr ""
+"Межпроцессные коммуникации в 4.4BSD организованы в _коммуникационные "
+"домены_. К поддерживаемым на данный момент доменам относятся _локальный "
+"домен_ для взаимодействия между процессами, выполняющимися на одной и той же "
+"машине; _межсетевой домен_ для связи между процессами посредством набора "
+"протоколов TCP/IP (возможно, в сети Интернет); семейство протоколов ISO/OSI "
+"для взаимодействия между сайтами, которым нужна именно такая связь, и _домен "
+"XNS_ для коммуникаций между процессами при помощи протоколов XEROX Network "
+"Systems (XNS)."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:766
+msgid ""
+"Within a domain, communication takes place between communication endpoints "
+"known as _sockets_. As mentioned in Section 2.6, the _socket_ system call "
+"creates a socket and returns a descriptor; other IPC system calls are "
+"described in Chapter 11. Each socket has a type that defines its "
+"communications semantics; these semantics include properties such as "
+"reliability, ordering, and prevention of duplication of messages."
+msgstr ""
+"В пределах домена соединения имеют место между конечными точками связи, "
+"также называемыми _сокетами_. Как отмечено в Разделе 2.6, системный вызов "
+"_socket_ создает сокет и возвращает дескриптор; другие системные вызовы IPC "
+"описаны в Главе 11. Каждый сокет имеет тип, определяющий его "
+"коммуникационные свойства; к ним относятся такие характеристики, как "
+"надежность, сохранение последовательности передаваемой информации и "
+"предупреждение дублирования сообщений."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:770
+msgid ""
+"Each socket has associated with it a _communication protocol_. This "
+"protocol provides the semantics required by the socket according to the "
+"latter's type. Applications may request a specific protocol when creating a "
+"socket, or may allow the system to select a protocol that is appropriate for "
+"the type of socket being created."
+msgstr ""
+"с каждым сокетом связан некоторый _коммуникационный протокол_. Этот протокол "
+"обеспечивает выполнение операций, требуемых сокету, согласно его типу. "
+"Приложения могут задавать нужный протокол при создании сокета или могут "
+"разрешить системе выбрать протокол, который соответствует типу создаваемого "
+"сокета."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:774
+msgid ""
+"Sockets may have addresses bound to them. The form and meaning of socket "
+"addresses are dependent on the communication domain in which the socket is "
+"created. Binding a name to a socket in the local domain causes a file to be "
+"created in the filesystem."
+msgstr ""
+"Сокеты могут иметь адреса, связанные с ними. Формат и смысл адресов сокетов "
+"зависят от коммуникационного домена, в котором был создан сокет. Привязка "
+"имени к сокету в локальном домене приводит к созданию файла в файловой "
+"системе."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:779
+msgid ""
+"Normal data transmitted and received through sockets are untyped. Data-"
+"representation issues are the responsibility of libraries built on top of "
+"the interprocess-communication facilities. In addition to transporting "
+"normal data, communication domains may support the transmission and "
+"reception of specially typed data, termed _access rights_. The local "
+"domain, for example, uses this facility to pass descriptors between "
+"processes."
+msgstr ""
+"Обычные данные, передаваемые и получаемые при помощи сокетов, не имеют типа. "
+"Вопросы представления данных зависят от библиотек, которые находятся на "
+"верху коммуникационной подсистемы. Вдобавок к передаче обычных данных, "
+"коммуникационные домены могут поддерживать передачу и прием специальных "
+"типов данных, которые называются _правами доступа_. Например, локальный "
+"домен использует эту возможность для передачи дескрипторов между процессами."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:785
+msgid ""
+"Networking implementations on UNIX before 4.2BSD usually worked by "
+"overloading the character-device interfaces. One goal of the socket "
+"interface was for naive programs to be able to work without change on stream-"
+"style connections. Such programs can work only if the _read_ and _write_ "
+"systems calls are unchanged. Consequently, the original interfaces were "
+"left intact, and were made to work on stream-type sockets. A new interface "
+"was added for more complicated sockets, such as those used to send "
+"datagrams, with which a destination address must be presented with each "
+"_send_ call."
+msgstr ""
+"До 4.2BSD сетевые реализации в UNIX обычно работали через интерфейсы "
+"символьных устройств. Одной из целей создания интерфейса сокетов было "
+"обеспечение работы простеньким программам без изменения на потоковых "
+"соединениях. Такие программы могут работать, если только не меняются "
+"системные вызовы _read_ и _write_. Соответственно, оригинальные интерфейсы "
+"не трогались, но были исправлены для работы с потоковыми сокетами. Для более "
+"сложных сокетов, таких, как те, что используются для посылки датаграмм и в "
+"которых при каждом вызове _send_ должен указываться адрес назначения, был "
+"добавлен новый интерфейс."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:790
+msgid ""
+"Another benefit is that the new interface is highly portable. Shortly after "
+"a test release was available from Berkeley, the socket interface had been "
+"ported to System III by a UNIX vendor (although AT&T did not support the "
+"socket interface until the release of System V Release 4, deciding instead "
+"to use the Eighth Edition stream mechanism). The socket interface was also "
+"ported to run in many Ethernet boards by vendors, such as Excelan and "
+"Interlan, that were selling into the PC market, where the machines were too "
+"small to run networking in the main processor. More recently, the socket "
+"interface was used as the basis for Microsoft's Winsock networking interface "
+"for Windows."
+msgstr ""
+"Другим достоинством является то, что новый интерфейс легко переносим. Вскоре "
+"после тестового релиза, полученного из Беркли, интерфейс сокетов был "
+"перенесен в System III поставщиком UNIX (хотя AT&T не поддерживала интерфейс "
+"сокетов до выхода System V Release 4, решив использовать вместо него "
+"механизм потоков из Eighth Edition). Интерфейс сокетов был также перенесен "
+"для работы на многих адаптерах Ethernet поставщиками, такими, как Excelan и "
+"Interlan, который продавался на рынке PC, где компьютеры были слишком "
+"слабыми, чтобы обрабатывать сетевой код на основном процессоре. Сравнительно "
+"недавно интерфейс сокетов был использован в качестве основы для сетевого "
+"интерфейса Winsock от Microsoft для Windows."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:792
+#, no-wrap
+msgid "Network Communication"
+msgstr "Сетевые коммуникации"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:797
+msgid ""
+"Some of the communication domains supported by the _socket_ IPC mechanism "
+"provide access to network protocols. These protocols are implemented as a "
+"separate software layer logically below the socket software in the kernel. "
+"The kernel provides many ancillary services, such as buffer management, "
+"message routing, standardized interfaces to the protocols, and interfaces to "
+"the network interface drivers for the use of the various network protocols."
+msgstr ""
+"Некоторые из коммуникационных доменов, поддерживаемых IPC-механизмом "
+"_сокетов_ дают доступ к сетевым протоколам. Эти протоколы реализованы как "
+"отдельный программный слой, логически находящийся ниже программного "
+"обеспечения сокетов в ядре. Ядро предоставляет много вспомогательных "
+"сервисов, таких, как управление буферами, маршрутизация сообщений, "
+"стандартные интерфейсы к протоколам и интерфейсы к драйверам сетевых "
+"интерфейсов для использования в различных сетевых протоколах."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:806
+msgid ""
+"At the time that 4.2BSD was being implemented, there were many networking "
+"protocols in use or under development, each with its own strengths and "
+"weaknesses. There was no clearly superior protocol or protocol suite. By "
+"supporting multiple protocols, 4.2BSD could provide interoperability and "
+"resource sharing among the diverse set of machines that was available in the "
+"Berkeley environment. Multiple-protocol support also provides for future "
+"changes. Today's protocols designed for 10- to 100-Mbit-per-second "
+"Ethernets are likely to be inadequate for tomorrow's 1- to 10-Gbit-per-"
+"second fiber-optic networks. Consequently, the network-communication layer "
+"is designed to support multiple protocols. New protocols are added to the "
+"kernel without the support for older protocols being affected. Older "
+"applications can continue to operate using the old protocol over the same "
+"physical network as is used by newer applications running with a newer "
+"network protocol."
+msgstr ""
+"В те времена, когда разрабатывалась 4.2BSD, использовалось или "
+"разрабатывалось много сетевых протоколов, каждый со своими сильными и "
+"слабыми сторонами. Не существует единственного подходящего на все случаи "
+"жизни протокола или набора протоколов. Поддерживая много протоколов, 4.2BSD "
+"может обеспечить взаимодействие и обмен ресурсами между различными машинами, "
+"которые были доступны в Беркли. Поддержка многих протоколов необходим также "
+"для изменений в будущем. Современные протоколы, разработанные для Ethernet "
+"со скоростями работы 10 и 100 Mbit в секунду, вряд ли будут соответствовать "
+"для завтрашних оптических сетей пропускной способностью 1 и 10 Gbit в "
+"секунду. Поэтому уровень сетевых коммуникаций разработан с учетом поддержки "
+"многих протоколов. Новые протоколы добавляются к ядру, не затрагивая "
+"поддержку старых протоколов. Старые приложения могут продолжать работать с "
+"использованием старых протоколов в той же самой физической сети, что "
+"использовалась для новых приложений, работающих с новым сетевым протоколом."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:808
+#, no-wrap
+msgid "Network Implementation"
+msgstr "Сетевая реализация"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:815
+msgid ""
+"The first protocol suite implemented in 4.2BSD was DARPA's Transmission "
+"Control Protocol/Internet Protocol (TCP/IP). The CSRG chose TCP/IP as the "
+"first network to incorporate into the socket IPC framework, because a 4.1BSD-"
+"based implementation was publicly available from a DARPA-sponsored project "
+"at Bolt, Beranek, and Newman (BBN). That was an influential choice: The "
+"4.2BSD implementation is the main reason for the extremely widespread use of "
+"this protocol suite. Later performance and capability improvements to the "
+"TCP/IP implementation have also been widely adopted. The TCP/IP "
+"implementation is described in detail in Chapter 13."
+msgstr ""
+"Первым набором протоколов, реализованным в 4.2BSD, был Transmission Control "
+"Protocol/Internet Protocol (TCP/IP) от DARPA. CSRG выбрала TCP/IP в качестве "
+"первого для включения в набор протоколов IPC, потому что реализация на "
+"основе 4.1 была всем доступна из проекта, спонсируемого DARPA, в Bolt, "
+"Beranek и Newman (BBN). Это был выбор, повлиявший на многое: Реализация в "
+"4.2BSD стала основной причиной очень широкой распространенности и "
+"использования этого набора протоколов. Более поздние усовершенствования "
+"производительности и возможностей TCP/IP были также широко приняты. "
+"Реализация TCP/IP подробно описана в Главе 13."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:818
+msgid ""
+"The release of 4.3BSD added the Xerox Network Systems (XNS) protocol suite, "
+"partly building on work done at the University of Maryland and at Cornell "
+"University. This suite was needed to connect isolated machines that could "
+"not communicate using TCP/IP."
+msgstr ""
+"В релизе 4.3BSD появился набор протоколов Xerox Network Systems (XNS), "
+"частично основанный на работе, выполненной в Университете Мэрилэнда и "
+"Университете Корнелла. Этот набор был нужен для объединения отдельных машин, "
+"которые не могли работать с протоколом TCP/IP."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:824
+msgid ""
+"The release of 4.4BSD added the ISO protocol suite because of the latter's "
+"increasing visibility both within and outside the United States. Because of "
+"the somewhat different semantics defined for the ISO protocols, some minor "
+"changes were required in the socket interface to accommodate these "
+"semantics. The changes were made such that they were invisible to clients "
+"of other existing protocols. The ISO protocols also required extensive "
+"addition to the two-level routing tables provided by the kernel in 4.3BSD. "
+"The greatly expanded routing capabilities of 4.4BSD include arbitrary levels "
+"of routing with variable-length addresses and network masks."
+msgstr ""
+"В релиз 4.4BSD был добавлен набор протоколов ISO из-за его все большей "
+"распространенности как внутри, так и во вне США. По причине использования в "
+"протоколах ISO несколько другого подхода к сети, в интерфейсе сокетов "
+"потребовалось сделать некоторые небольшие изменения для реализации этого "
+"подхода. Изменения были сделаны так, что они были незаметны для клиентов "
+"других существующих протоколов. Протоколы ISO требуют также большой работы с "
+"двухуровневыми таблицами маршрутизации, имеющимися в 4.3BSD. К значительно "
+"расширенным возможностям по маршрутизации в 4.4BSD относятся раздельные "
+"уровни маршрутизации с адресами переменной длины и сетевыми масками."
+
+#. type: Title ===
+#: documentation/content/en/books/design-44bsd/_index.adoc:826
+#, no-wrap
+msgid "System Operation"
+msgstr "Работа системы"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:834
+msgid ""
+"Bootstrapping mechanisms are used to start the system running. First, the "
+"4.4BSD kernel must be loaded into the main memory of the processor. Once "
+"loaded, it must go through an initialization phase to set the hardware into "
+"a known state. Next, the kernel must do autoconfiguration, a process that "
+"finds and configures the peripherals that are attached to the processor. "
+"The system begins running in single-user mode while a start-up script does "
+"disk checks and starts the accounting and quota checking. Finally, the "
+"start-up script starts the general system services and brings up the system "
+"to full multiuser operation."
+msgstr ""
+"Механизмы начальной загрузки используются для запуска системы. Сначала ядро "
+"4.4BSD должно быть загружено в основную память процессора. После загрузки "
+"оно должно пройти через фазу инициализации для установки аппаратуры в "
+"известное состояние. Затем ядро должно выполнить автоконфигурацию, в "
+"процессе которой распознаются и настраиваются периферийные устройства, "
+"подключенные к процессору. Система начинает работу в однопользовательском "
+"режиме, пока начальный скрипт выполняет проверку дисков и включает подсчет "
+"статистики и использования квот. Наконец, начальный скрипт запускает "
+"общесистемные службы и переводит систему в полностью многопользовательский "
+"режим."
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:838
+msgid ""
+"During multiuser operation, processes wait for login requests on the "
+"terminal lines and network ports that have been configured for user access. "
+"When a login request is detected, a login process is spawned and user "
+"validation is done. When the login validation is successful, a login shell "
+"is created from which the user can run additional processes."
+msgstr ""
+"При работе в многопользовательском режиме процессы ждут запросов на вход в "
+"систему с терминальных линий и сетевых портов, которые были настроены на "
+"вход пользователей. После обнаружения запроса на вход, вызывается процесс "
+"входа в систему и выполняется аутентификация пользователя. Если она прошла "
+"успешно, запускается начальная оболочка, из которой пользователь может "
+"запускать дополнительные процессы."
+
+#. type: Title ==
+#: documentation/content/en/books/design-44bsd/_index.adoc:843
+#, no-wrap
+msgid "References"
+msgstr "Список литературы"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:846
+msgid ""
+"[[biblio-accetta]] Accetta et al, 1986 Mach: A New Kernel Foundation for "
+"UNIX Development\" M.Accetta R.Baron W.Bolosky D.Golub R.Rashid A.Tevanian "
+"M.Young 93-113 USENIX Association Conference Proceedings USENIX Association "
+"June 1986"
+msgstr ""
+"[[biblio-accetta]] Accetta et al, 1986 Mach: A New Kernel Foundation for "
+"UNIX Development\" M.Accetta R.Baron W.Bolosky D.Golub R.Rashid A.Tevanian "
+"M.Young 93-113 USENIX Association Conference Proceedings USENIX Association "
+"June 1986"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:848
+msgid ""
+"[[biblio-cheriton]] Cheriton, 1988 The V Distributed System D. R.Cheriton "
+"314-333 Comm ACM, 31, 3 March 1988"
+msgstr ""
+"[[biblio-cheriton]] Cheriton, 1988 The V Distributed System D. R.Cheriton "
+"314-333 Comm ACM, 31, 3 March 1988"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:850
+msgid ""
+"[[biblio-ewens]] Ewens et al, 1985 Tunis: A Distributed Multiprocessor "
+"Operating System P.Ewens D. R.Blythe M.Funkenhauser R. C.Holt 247-254 USENIX "
+"Assocation Conference Proceedings USENIX Association June 1985"
+msgstr ""
+"[[biblio-ewens]] Ewens et al, 1985 Tunis: A Distributed Multiprocessor "
+"Operating System P.Ewens D. R.Blythe M.Funkenhauser R. C.Holt 247-254 USENIX "
+"Assocation Conference Proceedings USENIX Association June 1985"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:852
+msgid ""
+"[[biblio-gingell]] Gingell et al, 1987 Virtual Memory Architecture in SunOS "
+"R.Gingell J.Moran W.Shannon 81-94 USENIX Association Conference Proceedings "
+"USENIX Association June 1987"
+msgstr ""
+"[[biblio-gingell]] Gingell et al, 1987 Virtual Memory Architecture in SunOS "
+"R.Gingell J.Moran W.Shannon 81-94 USENIX Association Conference Proceedings "
+"USENIX Association June 1987"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:854
+msgid ""
+"[[biblio-kernighan]] Kernighan & Pike, 1984 The UNIX Programming Environment "
+"B. W.Kernighan R.Pike Prentice-Hall Englewood Cliffs NJ 1984"
+msgstr ""
+"[[biblio-kernighan]] Kernighan & Pike, 1984 The UNIX Programming Environment "
+"B. W.Kernighan R.Pike Prentice-Hall Englewood Cliffs NJ 1984"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:856
+msgid ""
+"[[biblio-macklem]] Macklem, 1994 The 4.4BSD NFS Implementation R.Macklem "
+"6:1-14 4.4BSD System Manager's Manual O'Reilly & Associates, Inc. Sebastopol "
+"CA 1994"
+msgstr ""
+"[[biblio-macklem]] Macklem, 1994 The 4.4BSD NFS Implementation R.Macklem "
+"6:1-14 4.4BSD System Manager's Manual O'Reilly & Associates, Inc. Sebastopol "
+"CA 1994"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:858
+msgid ""
+"[[biblio-mckusick-2]] McKusick & Karels, 1988 Design of a General Purpose "
+"Memory Allocator for the 4.3BSD UNIX Kernel M. K.McKusick M. J.Karels "
+"295-304 USENIX Assocation Conference Proceedings USENIX Assocation June 1998"
+msgstr ""
+"[[biblio-mckusick-2]] McKusick & Karels, 1988 Design of a General Purpose "
+"Memory Allocator for the 4.3BSD UNIX Kernel M. K.McKusick M. J.Karels "
+"295-304 USENIX Assocation Conference Proceedings USENIX Assocation June 1998"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:860
+msgid ""
+"[[biblio-mckusick-1]] McKusick et al, 1994 Berkeley Software Architecture "
+"Manual, 4.4BSD Edition M. K.McKusick M. J.Karels S. J.Leffler W. N.Joy R. "
+"S.Faber 5:1-42 4.4BSD Programmer's Supplementary Documents O'Reilly & "
+"Associates, Inc. Sebastopol CA 1994"
+msgstr ""
+"[[biblio-mckusick-1]] McKusick et al, 1994 Berkeley Software Architecture "
+"Manual, 4.4BSD Edition M. K.McKusick M. J.Karels S. J.Leffler W. N.Joy R. "
+"S.Faber 5:1-42 4.4BSD Programmer's Supplementary Documents O'Reilly & "
+"Associates, Inc. Sebastopol CA 1994"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:862
+msgid ""
+"[[biblio-ritchie]] Ritchie, 1988 Early Kernel Design private communication "
+"D. M.Ritchie March 1988"
+msgstr ""
+"[[biblio-ritchie]] Ritchie, 1988 Early Kernel Design private communication "
+"D. M.Ritchie March 1988"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:864
+msgid ""
+"[[biblio-rosenblum]] Rosenblum & Ousterhout, 1992 The Design and "
+"Implementation of a Log-Structured File System M.Rosenblum K.Ousterhout "
+"26-52 ACM Transactions on Computer Systems, 10, 1 Association for Computing "
+"Machinery February 1992"
+msgstr ""
+"[[biblio-rosenblum]] Rosenblum & Ousterhout, 1992 The Design and "
+"Implementation of a Log-Structured File System M.Rosenblum K.Ousterhout "
+"26-52 ACM Transactions on Computer Systems, 10, 1 Association for Computing "
+"Machinery February 1992"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:866
+msgid ""
+"[[biblio-rozier]] Rozier et al, 1988 Chorus Distributed Operating Systems "
+"M.Rozier V.Abrossimov F.Armand I.Boule M.Gien M.Guillemont F.Herrmann "
+"C.Kaiser S.Langlois P.Leonard W.Neuhauser 305-370 USENIX Computing Systems, "
+"1, 4 Fall 1988"
+msgstr ""
+"[[biblio-rozier]] Rozier et al, 1988 Chorus Distributed Operating Systems "
+"M.Rozier V.Abrossimov F.Armand I.Boule M.Gien M.Guillemont F.Herrmann "
+"C.Kaiser S.Langlois P.Leonard W.Neuhauser 305-370 USENIX Computing Systems, "
+"1, 4 Fall 1988"
+
+#. type: Plain text
+#: documentation/content/en/books/design-44bsd/_index.adoc:867
+msgid ""
+"[[biblio-tevanian]] Tevanian, 1987 Architecture-Independent Virtual Memory "
+"Management for Parallel and Distributed Environments: The Mach Approach "
+"Technical Report CMU-CS-88-106, A.Tevanian Department of Computer Science, "
+"Carnegie-Mellon University Pittsburgh PA December 1987"
+msgstr ""
+"[[biblio-tevanian]] Tevanian, 1987 Architecture-Independent Virtual Memory "
+"Management for Parallel and Distributed Environments: The Mach Approach "
+"Technical Report CMU-CS-88-106, A.Tevanian Department of Computer Science, "
+"Carnegie-Mellon University Pittsburgh PA December 1987"
diff --git a/documentation/content/ru/books/dev-model/_index.adoc b/documentation/content/ru/books/dev-model/_index.adoc
new file mode 100644
index 0000000000..a23147d91c
--- /dev/null
+++ b/documentation/content/ru/books/dev-model/_index.adoc
@@ -0,0 +1,903 @@
+---
+authors:
+ -
+ author: 'Niklas Saers'
+bookOrder: 45
+copyright: '2002-2005 Niklas Saers'
+description: 'Формальное исследование организации проекта FreeBSD'
+layout: single
+tags: ["model", "project model", "FreeBSD"]
+title: 'Проектная модель для проекта FreeBSD'
+trademarks: ["freebsd", "ibm", "ieee", "adobe", "intel", "linux", "microsoft", "opengroup", "sun", "netbsd", "general"]
+---
+
+////
+Copyright (c) 2002-2005 Niklas Saers
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+////
+
+= Проектная модель для проекта FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/dev-model/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../images/{images-path}
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+'''
+
+toc::[]
+
+[[foreword]]
+[.abstract-title]
+Предисловие
+
+До настоящего момента проект FreeBSD выпустил ряд описанных методик для выполнения различных частей работы. Однако, из-за растущего числа участников проекта, необходима модель проекта, обобщающая его структуру. footnote:[Это согласуется с законом Брукса, согласно которому добавление нового человека в задерживающийся проект сделает его ещё более задержанным, поскольку увеличит потребность в коммуникации. Модель проекта — это инструмент для снижения потребности в коммуникации.] Данная статья предоставляет такую модель проекта и передаётся в проект документации FreeBSD, где она может развиваться вместе с проектом, чтобы в любой момент времени отражать способ его работы. Она основана на [crossref:dev-model[диссертации, Saers,2003]].
+
+Я хотел бы поблагодарить следующих людей за то, что они нашли время объяснить мне непонятные моменты и проверить документ.
+
+* Andrey A. Chernov mailto:ache@freebsd.org[ache@freebsd.org]
+* Bruce A. Mah mailto:bmah@freebsd.org[bmah@freebsd.org]
+* Dag-Erling Smørgrav mailto:des@freebsd.org[des@freebsd.org]
+* Giorgos Keramidas mailto:keramida@freebsd.org[keramida@freebsd.org]
+* Ingvil Hovig mailto:ingvil.hovig@skatteetaten.no[ingvil.hovig@skatteetaten.no]
+* Jesper Holck mailto:jeh.inf@cbs.dk[jeh.inf@cbs.dk]
+* John Baldwin mailto:jhb@freebsd.org[jhb@freebsd.org]
+* John Polstra mailto:jdp@freebsd.org[jdp@freebsd.org]
+* Kirk McKusick mailto:mckusick@freebsd.org[mckusick@freebsd.org]
+* Mark Linimon mailto:linimon@freebsd.org[linimon@freebsd.org]
+* Marleen Devos
+* Niels Jørgenssen mailto:nielsj@ruc.dk[nielsj@ruc.dk]
+* Nik Clayton mailto:nik@freebsd.org[nik@freebsd.org]
+* Poul-Henning Kamp mailto:phk@freebsd.org[phk@freebsd.org]
+* Simon L. Nielsen mailto:simon@freebsd.org[simon@freebsd.org]
+
+[[overview]]
+== Обзор
+Модель проекта — это способ снижения накладных расходов на коммуникации в проекте. Как показано в [crossref:dev-model[brooks, Brooks, 1995]], увеличение числа участников проекта приводит к экспоненциальному росту коммуникаций в проекте. За последние годы FreeBSD значительно увеличил как количество активных пользователей, так и коммиттеров, что соответственно привело к росту коммуникаций. Данная модель проекта поможет снизить эти накладные расходы за счёт предоставления актуального описания проекта.
+
+Во время выборов в Core в 2002 году Марк Мюррей заявил: «Я против длинного свода правил, так как это удовлетворяет склонности к юриспруденции и противоречит техноцентричности, в которой проект так нуждается.» [crossref:dev-model[bsd-election2002, FreeBSD, 2002B]]. Эта модель проекта не предназначена для того, чтобы оправдывать создание ограничений для разработчиков, а служит инструментом для облегчения координации. Она призвана описывать проект, давая обзор того, как выполняются различные процессы. Это введение в то, как работает проект FreeBSD.
+
+Модель проекта FreeBSD будет описана по состоянию на 1 июля 2004 года. Она основана на работе Нильса Йоргенсена [crossref:dev-model[jorgensen2001, Jørгенсен, 2001]], официальных документах FreeBSD, обсуждениях в списках рассылки FreeBSD и интервью с разработчиками.
+
+После определения используемых терминов в этом документе будет описана организационная структура (включая описания ролей и линии коммуникации), рассмотрена модель методологии, а после представления инструментов, используемых для контроля процессов, будут описаны определенные процессы. В заключение будут представлены основные подпроекты проекта FreeBSD.
+
+[crossref:dev-model[freebsd-developer-handbook, FreeBSD, 2002A]] Разделы 1.2 и 1.3 описывают видение и архитектурные принципы проекта. Видение сформулировано как: "Создать наилучший пакет операционной системы, подобной UNIX®, с должным уважением к оригинальной идеологии программных инструментов, а также к удобству использования, производительности и стабильности." Архитектурные принципы помогают определить, находится ли проблема, которую кто-то хочет решить, в рамках проекта
+
+[[definitions]]
+== Определения
+
+[[ref-activity]]
+=== Активность
+
+"Активность" — это элемент работы, выполняемый в ходе проекта [crossref:dev-model[ref-pmbok, PMI, 2000]]. У неё есть результат, который ведёт к достижению цели. Такой результат может быть либо входом для другой активности, либо частью поставки процесса.
+
+[[def-process]]
+=== Процесс
+
+Процесс — это ряд действий, ведущих к определенному результату. Процесс может состоять из одного или нескольких подпроцессов. Примером процесса является проектирование программного обеспечения.
+
+[[ref-hat]]
+=== Роль (hat)
+
+"Hat" (шляпа) является синонимом роли. Роль имеет определенные обязанности в процессе и ответственность за результат процесса. Роль выполняет действия. Четко определено, по каким вопросам участники проекта и люди вне проекта должны обращаться к ответственному, выполняющему эту роль.
+
+[[ref-outcome]]
+=== Результат
+
+«Результат» — это конечный продукт процесса. Это синоним понятия «поставляемый результат», который определяется как «любой измеримый, осязаемый, проверяемый результат, итог или элемент, который должен быть произведён для завершения проекта или его части. Часто используется в более узком смысле в отношении внешнего поставляемого результата, который подлежит утверждению спонсором проекта или заказчиком» согласно [crossref:dev-model[ref-pmbok, PMI, 2000]]. Примерами результатов являются программное обеспечение, принятое решение или написанный отчёт.
+
+[[ref-freebsd]]
+=== FreeBSD
+
+Говоря "FreeBSD", мы подразумеваем UNIX-подобную операционную систему FreeBSD, основанную на BSD, тогда как говоря "Проект FreeBSD", мы подразумеваем организацию проекта.
+
+[[model-orgstruct]]
+== Организационная структура
+
+Хотя никто не является владельцем FreeBSD, организация FreeBSD разделена на ядро, коммиттеров и участников и является частью сообщества FreeBSD, которое существует вокруг неё.
+
+Структура проекта FreeBSD (в порядке убывания полномочий)
+
+[.informaltable]
+[cols="1,1", options="header"]
+|===
+| Группа
+| Количество людей
+
+|Основные участники
+|9
+
+|Коммиттеры
+|318
+
+|Участники
+|~3000
+|===
+
+Количество коммиттеров было определено путем анализа журналов CVS с 1 января 2004 года по 31 декабря 2004 года, а список участников — путем просмотра перечня внесенных изменений и отчетов о проблемах.
+
+Основной ресурс сообщества FreeBSD — это его разработчики: коммиттеры и контрибьюторы. Именно их вклад позволяет проекту развиваться. Обычные разработчики называются участниками (контрибьюторами). По состоянию на 1 января 2003 года в проекте насчитывается около 5500 контрибьюторов.
+
+Коммиттеры — это разработчики, обладающие привилегией вносить изменения. Обычно это наиболее активные разработчики, которые готовы тратить своё время не только на интеграцию собственного кода, но и на интеграцию кода, предоставленного разработчиками без такой привилегии. Они также выбирают основную команду и имеют доступ к закрытым обсуждениям.
+
+Проект можно разделить на четыре отдельные части, и большинство разработчиков сосредоточат своё участие на одной из частей FreeBSD. Эти четыре части — разработка ядра, разработка пользовательского пространства, порты и документация. Под базовой системой подразумеваются как ядро, так и пользовательское пространство.
+
+Это разделение изменяет нашу таблицу следующим образом:
+
+Структура проекта FreeBSD с участниками, имеющими права на запись, по категориям
+
+[.informaltable]
+[cols="1,1,1", options="header"]
+|===
+| Группа
+| Категория
+| Количество людей
+
+|Основные участники
+|
+|9
+
+|Коммиттеры
+|Базовый
+|164
+
+|
+|Docs
+|45
+
+|
+|Порты
+|166
+
+|
+|Total
+|374
+
+|Участники
+|
+|~3000
+|===
+
+Количество коммиттеров по областям было определено путем анализа журналов CVS с 1 января 2004 года по 31 декабря 2004 года. Обратите внимание, что многие коммиттеры работают в нескольких областях, поэтому общее число больше реального количества коммиттеров. Общее количество активных уникальных коммиттеров на июнь 2022 года составляло 317.
+
+Коммиттеры делятся на три группы: коммиттеры, занимающиеся только одной областью проекта (например, файловыми системами), коммиттеры, участвующие только в одном подпроекте, и коммиттеры, вносящие изменения в разные части кода, включая подпроекты. Поскольку некоторые коммиттеры работают над разными частями, общее количество в разделе коммиттеров таблицы выше, чем в предыдущей таблице.
+
+Ядро является основным строительным блоком FreeBSD. Хотя пользовательские приложения защищены от сбоев в других пользовательских приложениях, вся система уязвима от ошибок в ядре. Это, в сочетании с огромным количеством зависимостей в ядре и тем, что нелегко увидеть все последствия изменения ядра, требует от разработчиков относительно полного понимания ядра. Множественные усилия по разработке в ядре также требуют более тесной координации, чем пользовательские приложения.
+
+Основные утилиты, известные как пользовательское окружение (userland), предоставляют интерфейс, который определяет FreeBSD, включая пользовательский интерфейс, общие библиотеки и внешние интерфейсы для подключения клиентов. В настоящее время 162 человека участвуют в разработке и поддержке пользовательского окружения, многие из которых являются сопровождающими (maintainers) для своей части кода. Вопросы сопровождения будут рассмотрены в разделе crossref:dev-model[role-maintainer,Сопровождение].
+
+Документация обрабатывается crossref:dev-model[sub-project-documentation, Проектом документации FreeBSD] и включает все документы, связанные с проектом FreeBSD, включая веб-страницы. В течение 2004 года 101 человек внесли изменения в Проект документации FreeBSD.
+
+Порты — это коллекция метаданных, необходимых для корректной сборки программных пакетов в FreeBSD. Например, порт для веб-браузера Mozilla содержит информацию о том, откуда загружать исходный код, какие патчи применять и как, а также как пакет должен быть установлен в системе. Это позволяет автоматизированным инструментам загружать, собирать и устанавливать пакеты. На момент написания доступно более 12600 портов footnote:[Статистика получена подсчётом количества записей в файле, загруженном portsdb на 1 апреля 2005 года. portsdb является частью порта sysutils/portupgrade.], начиная от веб-серверов и игр до языков программирования и большинства типов приложений, используемых на современных компьютерах. Порты подробно рассматриваются в разделе crossref:dev-model[sub-project-ports, Подпроект Ports].
+
+[[methodology-model]]
+== Методологическая модель
+
+[[development-model]]
+=== Модель разработки
+
+Не существует определенной модели того, как люди пишут код в FreeBSD. Однако Нильс Йоргенссен предложил модель того, как написанный код интегрируется в проект.
+
+Модель Йоргенссена для интеграции изменений
+
+[.informaltable]
+[cols="1,1,1", options="header"]
+|===
+| Этап
+| Следующий, если успешно
+| Следующий, если неудачно
+
+|программирование
+|рецензирование
+|
+
+|рецензирование
+|предварительная проверка перед коммитом
+|программирование
+
+|предварительная проверка перед коммитом
+|релиз для разработки
+|программирование
+
+|релиз для разработки
+|параллельная отладка
+|программирование
+
+|параллельная отладка
+|релиз для производства
+|программирование
+
+|релиз для производства
+|
+|программирование
+|===
+
+"Релиз для разработки" — это ветка FreeBSD-CURRENT ("-CURRENT"), а "релиз для производства" — ветка FreeBSD-STABLE ("-STABLE") [crossref:dev-model[jorgensen2001, Jørgensen, 2001]].
+
+Это модель для одного изменения, которая показывает, что после написания кода разработчики ищут рецензирование сообщества и пытаются интегрировать это изменение в свои собственные системы. После интеграции изменения в версию разработки, называемую FreeBSD-CURRENT, оно тестируется многими пользователями и разработчиками сообщества FreeBSD. После достаточного тестирования оно объединяется с производственной версией, называемой FreeBSD-STABLE. Если каждая стадия не завершена успешно, разработчику необходимо вернуться, внести изменения в код и перезапустить процесс. Интеграция изменения в -CURRENT или -STABLE называется выполнением коммита.
+
+Йоргенсен обнаружил, что большинство разработчиков FreeBSD работают индивидуально, то есть эта модель используется параллельно многими разработчиками в различных текущих процессах разработки. Разработчик также может работать над несколькими изменениями одновременно, поэтому, ожидая рецензирования или тестирования одного или нескольких своих изменений, он может писать другое изменение.
+
+Поскольку каждый коммит представляет собой инкрементальное изменение, это модель с очень высокой степенью инкрементальности. Коммиты происходят настолько часто, что за один год footnote:[Для получения этого числа был исследован период с 1 января 2004 года по 31 декабря 2004 года.], было сделано 85427 коммитов, что составляет в среднем 233 коммита в день.
+
+В рамках "программирования" в модели Йоргенсена, каждый программист имеет свой собственный стиль работы и следует своим собственным моделям разработки. Этот этап вполне мог бы называться "разработкой", так как он включает сбор и анализ требований, системное и детальное проектирование, реализацию и проверку. Однако, единственным результатом этих подэтапов являются исходный код или документация системы.
+
+С точки зрения пошаговой модели (такой как каскадная модель), остальные этапы можно рассматривать как дальнейшую проверку и интеграцию системы. Эта интеграция системы также важна для определения того, будет ли изменение принято сообществом. До момента фиксации кода разработчик волен выбирать, насколько активно он будет обсуждать его с остальными участниками проекта. Чтобы -CURRENT мог выполнять роль буфера (позволяя откатывать идеи, которые оказались с невыявленными недостатками), минимальный срок, в течение которого изменения должны оставаться в -CURRENT перед слиянием в -STABLE, составляет 3 дня. Такое слияние называется MFC (Merge From Current).
+
+Важно обратить внимание на слово "изменение". Большинство коммитов не содержат радикально новых функций, а представляют собой обновления для поддержки.
+
+Единственными исключениями из этой модели являются исправления безопасности и изменения в функциях, объявленных устаревшими в ветке -CURRENT. В этих случаях изменения могут быть внесены напрямую в ветку -STABLE.
+
+В дополнение к множеству людей, работающих над проектом, существует множество связанных проектов в рамках FreeBSD. Это могут быть проекты, разрабатывающие совершенно новые функции, подпроекты или проекты, результаты которых интегрируются в FreeBSD footnote:[Например, разработка стека Bluetooth начиналась как подпроект, пока не была признана достаточно стабильной для включения в ветку -CURRENT. Теперь это часть основной системы FreeBSD.]. Эти проекты вписываются в FreeBSD так же, как и обычные разработки: они создают код, который интегрируется с проектом FreeBSD. Однако некоторые из них (например, Ports и Documentation) имеют привилегию применяться к обеим веткам или коммитить напрямую как в -CURRENT, так и в -STABLE.
+
+Не существует стандартов по выполнению проектирования, также как и централизованного репозитория для хранения проектов. Основной дизайн взят из 4.4BSD. footnote:[По словам Кирка Маккузика, после 20 лет разработки операционных систем UNIX, интерфейсы в основном уже определены. Поэтому нет необходимости в большом количестве проектирования. Однако новые применения системы и новое оборудование приводят к тому, что некоторые реализации становятся более выгодными по сравнению с ранее предпочитаемыми. Одним из примеров является появление веб-браузинга, который превратил обычное TCP/IP-соединение в короткие всплески данных, а не в устойчивый поток за более длительный период времени.] Поскольку проектирование является частью этапа "Программирование" в модели Йоргенсена, каждый разработчик или подпроект сам решает, как это должно выполняться. Даже если проектирование должно храниться в централизованном репозитории, результаты этапов проектирования будут иметь ограниченную полезность, так как различия в методологиях сделают их плохо совместимыми, если вообще совместимыми. Для общего проектирования проекта, проект полагается на подпроекты, которые договариваются о совместимых интерфейсах между собой, а не на диктат интерфейсов.
+
+[[release-branches]]
+=== Ветви релизов
+
+Версии FreeBSD лучше всего иллюстрируются деревом с множеством ветвей, где каждая основная ветвь представляет основную версию. Минорные версии представлены ветвями основных ветвей.
+
+В следующем дереве релизов стрелки, следующие друг за другом в определенном направлении, представляют ветку. Прямоугольники со сплошными линиями и ромбы обозначают официальные релизы. Прямоугольники с пунктирными линиями представляют ветку разработки на тот момент. Ветки безопасности обозначены овалами. Ромбы отличаются от прямоугольников тем, что они представляют развилку, то есть место, где ветка разделяется на две ветки, одна из которых становится подветкой. Например, на 4.0-RELEASE ветка 4.0-CURRENT разделилась на 4-STABLE и 5.0-CURRENT. На 4.5-RELEASE ветка разветвилась на ветку безопасности под названием RELENG_4_5.
+
+.Дерево релизов FreeBSD
+image::branches.png["Обратитесь к таблице ниже для удобной версии для экранных дикторов."]
+
+[.informaltable]
+[cols="1,1,1", options="header"]
+|===
+| Основные выпуски
+| Форкнут из
+| Следующие минорные выпуски
+
+|...
+|
+|
+
+|3.0 Current (ветка разработки)
+|
+|Ветки Releng 3: выпуски с 3.0 Release по 3.5 Release, ведущие к выпуску 3.5.1 Release и последующей ветке 3 Stable
+
+|4.0 Current (ветка разработки)
+|Релиз 3.1
+|Ветви Releng 4: релизы с 4.1 по 4.6 (и релиз 4.6.2), затем релизы с 4.7 по 4.11 (все, начиная с релиза 4.3, также ведущие к ветви Releng_4_n), и последующая ветвь релиза 4
+
+|5.0 Current (ветка разработки)
+|Релиз 4.0
+|Ветви Releng 5: Релизы с 5.0 до 5.4 (за исключением 5.0 и 5.3, которые также ведут к ветке Releng_5_n), и последующая ветка релиза 5
+
+|6.0 Current (ветка разработки)
+|Релиз 5.3
+|
+
+|...
+|
+|
+
+|===
+
+Последняя версия -CURRENT всегда обозначается как -CURRENT, а последний релиз -STABLE всегда обозначается как -STABLE. На этом рисунке -STABLE относится к 4-STABLE, а -CURRENT относится к 5.0-CURRENT после 5.0-RELEASE. [crossref:dev-model[freebsd-releng, FreeBSD, 2002E]]
+
+«Основной выпуск» всегда создаётся из ветки -CURRENT. Однако ветка -CURRENT не обязательно должна разветвляться в этот момент, а может сосредоточиться на стабилизации. Примером этого является то, что после 3.0-RELEASE, 3.1-RELEASE также был продолжением ветки -CURRENT, и -CURRENT не стал настоящей веткой разработки до тех пор, пока не был выпущен этот релиз и не была создана ветка 3-STABLE. Когда -CURRENT снова становится веткой разработки, за ним может следовать только основной выпуск. Ожидается, что ветка 5-STABLE будет отделена от 5.0-CURRENT примерно на момент выпуска 5.3-RELEASE. Только после отделения 5-STABLE ветка разработки получит название 6.0-CURRENT.
+
+"Минорный релиз" создается из ветки -CURRENT после основного релиза или из ветки -STABLE.
+
+Начиная с версии 4.3-RELEASE footnote:[Первым релизом, для которого это действительно произошло, был 4.5-RELEASE, но ветки безопасности были созданы одновременно для 4.3-RELEASE и 4.4-RELEASE.], когда выпускается минорный релиз, он становится «веткой безопасности». Это предназначено для организаций, которые не хотят следовать ветке -STABLE и потенциальным новым/изменённым функциям, которые она предлагает, но вместо этого требуют абсолютно стабильной среды, обновляемой только для внедрения исправлений безопасности. footnote:[Здесь вы видите терминологическое пересечение со словом «стабильный», что приводит к некоторой путанице. Ветка -STABLE по-прежнему является веткой разработки, цель которой — быть полезной для большинства пользователей. Если для системы неприемлемо получать изменения, которые не были объявлены на момент её развёртывания, такая система должна работать на ветке безопасности.]
+
+Каждое обновление в ветке безопасности называется "уровнем исправления" (patchlevel). Для каждого выполненного улучшения безопасности номер уровня исправления увеличивается, что позволяет легко отслеживать, какие улучшения безопасности были реализованы. В случаях особенно серьезных уязвимостей безопасности может быть выпущен полностью новый релиз из ветки безопасности. Примером этого является 4.6.2-RELEASE.
+
+[[model-summary]]
+=== Сводка модели
+
+Для подведения итогов, модель разработки FreeBSD можно представить в виде следующего дерева:
+
+.Общая модель разработки
+image::freebsd-code-model.png["Обратитесь к параграфам ниже для версии, удобной для экранных дикторов."]
+
+Дерево разработки FreeBSD с текущими усилиями по разработке и непрерывной интеграцией.
+
+Дерево символизирует версии выпусков, где основные версии порождают новые главные ветви, а второстепенные версии являются версиями главной ветви. Верхняя ветвь — это ветвь -CURRENT, в которую интегрируется вся новая разработка, а ветвь -STABLE находится непосредственно под ней. Под ветвью -STABLE находятся старые, неподдерживаемые версии.
+
+Проект находится в тумане постоянной разработки, и разработчики выбирают модели разработки, которые считают подходящими. Результаты их работы затем интегрируются в -CURRENT, где проходят параллельную отладку, и наконец объединяются из -CURRENT в -STABLE. Исправления безопасности объединяются из -STABLE в ветки безопасности.
+
+Многие коммиттеры имеют специальную область ответственности. Эти роли называются "hats" (шляпами). Эти роли могут быть либо проектными ролями, например, офицер по связям с общественностью, либо сопровождающим определённой части кода. Поскольку это проект, где люди добровольно уделяют своё свободное время, люди с назначенными ролями не всегда доступны. Поэтому они должны назначить заместителя, который может выполнять эту роль в их отсутствие. Другой вариант — передать роль группе.
+
+Многие из этих ролей не формализованы. Формализованные роли имеют устав, в котором указаны точные цели, привилегии и обязанности. Написание таких уставов — новая часть проекта, поэтому оно ещё не завершено для всех ролей. Эти описания ролей не являются формализацией, а скорее представляют собой краткое описание роли со ссылками на устав, где он доступен, и контактными адресами.
+
+[[sect-hats]]
+== Ответственные
+
+[[general-hats]]
+=== Стандартные роли
+
+[[role-contributor]]
+==== Участник (контрибьютор)
+
+Участник вносит вклад в проект FreeBSD в качестве разработчика, автора, отправляя отчеты о проблемах или другими способами способствуя прогрессу проекта. Участник не имеет особых привилегий в проекте FreeBSD. [crossref:dev-model[freebsd-contributors, FreeBSD, 2002F]]
+
+[[role-committer]]
+==== Коммиттер
+
+Человек, обладающий необходимыми привилегиями для добавления своего кода или документации в репозиторий. Коммиттер совершил коммит в течение последних 12 месяцев. [crossref:dev-model[freebsd-developer-handbook, FreeBSD, 2000A]] Активный коммиттер — это коммиттер, который в среднем совершал один коммит в месяц в течение этого времени.
+
+Стоит отметить, что нет технических препятствий, которые могли бы помешать кому-либо, получившему права на коммиты в основном или подпроекте, делать коммиты в частях исходного кода проекта, для которых у коммиттера нет явного разрешения на изменение. Однако, при желании внести изменения в части, с которыми коммиттер ранее не работал, следует изучить логи, чтобы понять, что происходило в этой области ранее, а также прочитать файл MAINTAINERS, чтобы узнать, есть ли у сопровождающего этой части какие-либо особые требования к внесению изменений в код.
+
+[[role-core]]
+==== Основная команда (Core Team)
+
+Основная команда избирается коммиттерами из числа коммиттеров и выполняет функции совета директоров проекта FreeBSD. Она повышает активных участников до коммиттеров, назначает людей на четко определенные роли (hats) и является окончательным арбитром при принятии решений о направлении развития проекта. На 1 июля 2004 года в состав основной команды входило 9 членов. Выборы проводятся каждые два года.
+
+[[role-maintainer]]
+==== Сопровождение
+
+Сопровождение означает, что человек ответственен за то, что допускается в определённую часть кода, и имеет решающее слово в случае разногласий по поводу кода. Это включает в себя как активную работу, направленную на стимулирование участников (контрибьюторов), так и реактивную работу по рецензированию коммитов.
+
+В исходном коде FreeBSD есть файл MAINTAINERS, содержащий краткое описание того, как каждый сопровождающий предпочитает получать вклады. Наличие этого уведомления и контактной информации позволяет разработчикам сосредоточиться на разработке, а не застревать в медленной переписке, если сопровождающий будет недоступен в течение некоторого времени.
+
+Если сопровождающий недоступен в течение неоправданно долгого времени, и другие люди выполняют значительный объем работы, сопровождение может быть передано без согласия сопровождающего. Это основано на позиции, что сопровождение должно быть продемонстрировано, а не заявлено.
+
+Сопровождение определенного участка кода — это роль, которая не осуществляется коллективно.
+
+[[official-hats]]
+=== Официальные Роли
+
+Официальные роли в проекте FreeBSD — это более или менее формализованные и в основном административные должности. Они обладают полномочиями и ответственностью в своей области. В следующем списке показаны направления ответственности и дано описание каждой роли, включая информацию о том, кто её занимает.
+
+[[role-doc-manager]]
+==== Менеджер проекта документации
+
+Архитектор crossref:dev-model[sub-project-documentation, Проекта документации FreeBSD] отвечает за определение и контроль целей документации для коммиттеров в проекте Документации, за которым они присматривают.
+
+Роль поддерживается: Командой DocEng mailto:doceng@FreeBSD.org[doceng@FreeBSD.org]. https://www.freebsd.org/internal/doceng/[Устав DocEng].
+
+[[role-postmaster]]
+==== Postmaster
+
+Postmaster отвечает за корректную доставку почты на адреса электронной почты коммиттеров. Также он отвечает за работоспособность почтовых рассылок и должен принимать меры против возможных сбоев в работе почты, таких как троллинг-, спам- и вирус-фильтры.
+
+Текущий руководитель: Команда почтовых серверов mailto:postmaster@FreeBSD.org[postmaster@FreeBSD.org].
+
+[[role-release-coordination]]
+==== Координация выпусков
+
+Обязанности команды выпуска релизов включают
+
+* Установка, публикация и соблюдение графика выпуска официальных релизов
+* Документирование и формализация процедур выпуска релизов
+* Создание и поддержка веток кода
+* Согласование с командами Ports и Documentation для выпуска обновленного набора пакетов и документации вместе с новыми релизами
+* Координация с командой безопасности для того, чтобы готовящиеся выпуски не были затронуты недавно обнаруженными уязвимостями.
+
+Дополнительная информация о процессе разработки доступна в разделе crossref:dev-model[process-release-engineering, Выпуск релизов].
+
+[[role-releng]]
+Роль поддерживается: командой выпуск релизов (Release Engineering) mailto:re@FreeBSD.org[re@FreeBSD.org]. https://www.freebsd.org/releng/charter/[ Устав Release Engineering].
+
+[[role-pr-cr]]
+==== Отношения с общественностью и корпоративные связи
+
+Обязанности отдела по связям с общественностью и корпоративным отношениям включают:
+
+* Публиковать пресс-релизы при возникновении событий, важных для проекта FreeBSD.
+* Быть официальным контактным лицом для корпораций, тесно сотрудничающих с проектом FreeBSD.
+* Принимать меры для продвижения FreeBSD как в сообществе Open Source, так и в корпоративном мире.
+* Обрабатывать список рассылки "freebsd-advocacy".
+
+Эта роль в настоящее время не занята.
+
+[[role-security-officer]]
+==== Ответственный за безопасность (Security Officer)
+
+Основная обязанность Ответственного за безопасность — координировать обмен информацией с сообществом безопасности и проектом FreeBSD. Ответственный за безопасность также принимает меры при поступлении сообщений о проблемах безопасности и способствует активному развитию в области безопасности.
+
+Из-за опасений, что информация об уязвимостях может попасть к злоумышленникам до выпуска исправления, только Ответственный за безопасность, включающий руководителя, заместителя и двух членов crossref:dev-model[role-core, Core Team], получает конфиденциальную информацию о проблемах безопасности. Однако для создания или внедрения исправления Ответственный за безопасность может обратиться к команде mailto:security-team@FreeBSD.org[security-team@FreeBSD.org] для помощи в выполнении работы.
+
+[[role-repo-manager]]
+==== Менеджер репозитория исходного кода
+
+Менеджер репозитория исходного кода — единственный, кому разрешено напрямую изменять репозиторий без использования инструмента crossref:dev-model[tool-git, Git]. В его обязанности входит оперативное решение технических проблем, возникающих в репозитории. Менеджер репозитория исходного кода имеет право отменять коммиты, если это необходимо для устранения технических проблем с Git.
+
+Роль принадлежит: Менеджеру репозитория исходного кода mailto:clusteradm@FreeBSD.org[clusteradm@FreeBSD.org].
+
+[[role-election-manager]]
+==== Менеджер выборов
+
+Менеджер выборов отвечает за процесс crossref:dev-model[process-core-election,выборов Core Team]. Он отвечает за проведение и поддержание системы выборов, а также является окончательной инстанцией в случае незначительных непредвиденных событий в процессе выборов. Крупные непредвиденные события должны обсуждаться с crossref:dev-model[role-core,Core Team]
+
+Роль выполняется только во время выборов.
+
+[[role-webmaster]]
+==== Управление веб-сайтом
+
+Роль управления веб-сайтом отвечает за координацию развертывания обновленных веб-страниц на зеркалах по всему миру, за общую структуру основного веб-сайта и систему, на которой он работает. Управление должно согласовывать содержимое с crossref:dev-model[документацией подпроекта, Документационный проект FreeBSD] и выступает в роли сопровождающего для дерева "www".
+
+Роль поддерживается: веб-мастеры FreeBSD mailto:www@FreeBSD.org[www@FreeBSD.org].
+
+[[role-ports-manager]]
+==== Менеджер портов
+
+Менеджер портов выступает в роли связующего звена между crossref:dev-model[sub-project-ports, Подпроектом портов] и основным проектом, и все запросы от проекта должны направляться менеджеру портов.
+
+Роль принадлежит: Команде управления портами mailto:portmgr@FreeBSD.org[portmgr@FreeBSD.org]. https://www.freebsd.org/portmgr/charter/[Устав Portmgr].
+
+[[role-standards]]
+==== Стандарты
+
+Роль стандартов отвечает за обеспечение соответствия FreeBSD стандартам, которым система следует, отслеживает развитие этих стандартов и уведомляет разработчиков FreeBSD о важных изменениях. Это позволяет разработчикам действовать проактивно и сокращать время между обновлением стандартов и достижением соответствия в FreeBSD.
+
+Текущий ответственный: Garrett Wollman mailto:wollman@FreeBSD.org[wollman@FreeBSD.org].
+
+[[role-core-secretary]]
+==== Секретарь Core Team
+
+Основная обязанность Секретаря Core Team — составление черновиков и публикация окончательных отчётов Core Team. Секретарь также ведёт повестку Core Team, гарантируя, что ни один вопрос не останется без решения.
+
+Ответственный в настоящее время: {rene}.
+
+[[role-bugmeister]]
+==== Ответственный за ошибки (Bugmeister)
+
+Ответственный за ошибки (Bugmeister) отвечает за поддержание базы данных по обслуживанию в рабочем состоянии, за корректную категоризацию записей и отсутствие недействительных записей. Они курируют исправителей ошибок (bugbusters).
+
+Текущий ответственный: команда Bugmeister Team mailto:bugmeister@FreeBSD.org[bugmeister@FreeBSD.org].
+
+[[role-donations]]
+==== Представитель по привлечению пожертвований
+
+Задача представителя по привлечению пожертвований — связывать разработчиков, которым что-то нужно, с людьми или организациями, готовыми сделать пожертвование.
+
+Роль поддерживается: Отделом по привлечению пожертвований mailto:donations@FreeBSD.org[donations@FreeBSD.org]. https://www.freebsd.org/donations/[ Устав Отдела по привлечению пожертвований].
+
+[[role-admin]]
+==== Администратор (Admin)
+
+(Также называется "Администратор кластера FreeBSD")
+
+Команда администраторов состоит из людей, ответственных за администрирование компьютеров, которые проект использует для распределённой работы и синхронизации коммуникации. В основном в неё входят те, кто имеет физический доступ к серверам.
+
+Роль поддерживается: командой администраторов mailto:admin@FreeBSD.org[admin@FreeBSD.org].
+
+[[proc-depend-hats]]
+=== Процессозависимые роли
+
+[[role-problem-originator]]
+==== Инициатор отчета
+
+Лицо, изначально ответственное за подачу отчета о проблеме.
+
+[[role-bugbuster]]
+==== Исправитель ошибок (Bugbuster)
+
+Человек, который либо найдет подходящего специалиста для решения проблемы, либо закроет PR, если он является дубликатом или по другим причинам не представляет интереса.
+
+[[role-mentor]]
+==== Наставник (Mentor)
+
+Наставник — это коммиттер, который берет на себя задачу ознакомить нового коммиттера с проектом. Это включает в себя проверку корректности настройки окружения нового коммиттера, обучение доступным инструментам, необходимым для работы, а также разъяснение ожидаемого поведения.
+
+[[role-vendor]]
+==== Поставщик
+
+Лицо (лица) или организация, от которых поступает внешний код и которым отправляются исправления.
+
+[[role-reviewer]]
+==== Рецензенты
+
+Люди из списка рассылки, куда отправлен запрос на рецензирование.
+
+Следующий раздел описывает установленные процессы проекта. Вопросы, не охваченные этими процессами, решаются по мере возникновения, исходя из сложившейся практики в аналогичных случаях.
+
+[[model-processes]]
+== Процессы
+
+[[proc-addrem-committer]]
+=== Добавление новых и удаление старых коммиттеров
+
+Основная команда (Core Team) отвечает за предоставление и отзыв прав на коммит для участников. Это может быть сделано только через голосование в списке рассылки Core Team. Подпроекты ports и documentation могут предоставлять права на коммит людям, работающим над этими проектами, но на данный момент не отзывали такие права.
+
+Обычно кандидата в коммиттеры основной команде (Core Team) рекомендуют коммиттеры. Для участников или посторонних обращаться в Core Team с просьбой стать коммиттером считается неблагоразумным и такая просьба, как правило, отклоняется.
+
+Если область, представляющая особый интерес для разработчика, потенциально пересекается с зоной ответственности других сопровождающих, запрашивается мнение этих сопровождающих. Однако часто именно этот сопровождающий рекомендует разработчика.
+
+Когда участнику предоставляется статус коммиттера, ему назначается наставник. В общем случае коммиттер, который рекомендовал нового коммиттера, берет на себя обязанности наставника для нового коммиттера.
+
+Когда участнику предоставляется право коммита (commit bit), отправляется подписанное с помощью crossref:dev-model[tool-pgp, Pretty Good Privacy] письмо от crossref:dev-model[role-core-secretary, Секретаря Core Team], crossref:dev-model[role-ports-manager, Менеджера портов] или nik@freebsd.org на адреса admins@freebsd.org, назначенного наставника, нового коммиттера и Core Team, подтверждая одобрение новой учётной записи. Затем наставник собирает строку пароля, crossref:dev-model[tool-ssh2, Secure Shell] открытый ключ и PGP-ключ от нового коммиттера и отправляет их crossref:dev-model[role-admin, Администратору]. Когда новая учётная запись создана, наставник активирует право коммита и проводит нового коммиттера через остальные этапы начального процесса.
+
+.Процесс вкратце: добавление нового коммиттера
+image::proc-add-committer.png["Обратитесь к абзацу ниже для версии, совместимой с программами чтения с экрана."]
+
+Когда участник отправляет фрагмент кода, принимающий коммиттер может предложить предоставить этому участнику права на коммит. Если он рекомендует это основной команде (Core Team), команда проводит голосование по этой рекомендации. Если голосование завершается в пользу предложения, новому коммиттеру назначается наставник, и новый коммиттер должен отправить свои данные администраторам для создания учётной записи. После этого новый коммиттер готов сделать свой первый коммит. По традиции, это делается путём добавления своего имени в список коммиттеров.
+
+Recall that a committer is considered to be someone who has committed code during the past 12 months. However, it is not until after 18 months of inactivity have passed that commit privileges are eligible to be revoked. [crossref:dev-model[freebsd-expiration-policy, FreeBSD, 2002H]] There are, however, no automatic procedures for doing this. For reactions concerning commit privileges not triggered by time, see crossref:dev-model[process-reactions,section 1.5.8].
+
+.Процесс: удаление коммиттера
+image::proc-rm-committer.png["Обратитесь к абзацу ниже для версии, совместимой с программами чтения с экрана."]
+
+Когда Основная команда (Core Team) принимает решение очистить список коммиттеров, они проверяют, кто не делал коммитов за последние 18 месяцев. Коммиттеры, которые этого не сделали, лишаются прав на коммит, и их учетные записи удаляются администраторами.
+
+Также возможно для коммиттеров запросить отзыв их права на коммит, если по какой-то причине они больше не будут активно участвовать в проекте. В этом случае, право может быть восстановлено позже по запросу коммиттера.
+
+Роли в этом процессе:
+
+. crossref:dev-model[role-core, Основная команда (Core Team)]
+. crossref:dev-model[role-contributor, Участник (контрибьютор)]
+. crossref:dev-model[role-committer, Коммиттер]
+. crossref:dev-model[role-maintainer, Сопровождение]
+. crossref:dev-model[role-mentor, Наставник (Mentor)]
+
+[crossref:dev-model[freebsd-bylaws, FreeBSD, 2000A]] [crossref:dev-model[freebsd-expiration-policy, FreeBSD, 2002H]] [crossref:dev-model[freebsd-new-account, FreeBSD, 2002I]]
+
+[[committing]]
+=== Коммит кода
+
+Добавление нового или изменённого кода — один из наиболее частых процессов в проекте FreeBSD и обычно происходит несколько раз в день. Фиксация кода может быть выполнена только "коммиттером". Коммиттеры фиксируют либо код, написанный ими самими, либо код, переданный им, либо код, отправленный через crossref:dev-model[model-pr,отчёт о проблеме].
+
+Когда разработчик пишет нетривиальный код, он должен запросить рецензирование кода у сообщества. Это делается путём отправки письма в соответствующий список рассылки с просьбой о рецензировании. Перед отправкой кода на проверку разработчик должен убедиться, что он корректно компилируется со всем деревом исходного кода и что все соответствующие тесты выполняются. Это называется "предварительной проверкой перед коммитом". Когда получен вклад в виде кода, коммиттер должен просмотреть его и протестировать таким же образом.
+
+Когда изменение фиксируется в части исходного кода, которая была получена от внешнего crossref:dev-model[role-vendor,поставщика], сопровождающий должен убедиться, что патч передан обратно поставщику. Это соответствует философии открытого исходного кода и упрощает синхронизацию с внешними проектами, так как патчи не придётся применять заново при каждом новом выпуске.
+
+После того как код был доступен для рецензирования и дальнейшие изменения не требуются, код вносится в ветку разработки -CURRENT. Если изменение применимо и для ветки -STABLE, или других веток, коммиттер устанавливает отсчёт времени для "слияния из текущей" ("MFC"). После того как пройдёт количество дней, выбранное коммиттером при установке MFC, автоматически будет отправлено письмо коммиттеру с напоминанием внести изменения в ветку -STABLE (а также, возможно, в ветки безопасности). В ветки безопасности следует сливать только критические изменения, связанные с безопасностью.
+
+Откладывание коммита в -STABLE и другие ветки позволяет проводить "параллельную отладку", когда закоммиченный код тестируется на широком спектре конфигураций. Это приводит к тому, что изменения в -STABLE содержат меньше ошибок, что и даёт ветке её название.
+
+.Процесс вкратце: коммиттер делает коммит кода
+image::proc-commit.png["Обратитесь к абзацу ниже для версии, совместимой с программами чтения с экрана."]
+
+Когда коммиттер написал часть кода и хочет его закоммитить, он сначала должен определить, достаточно ли он тривиален, чтобы попасть в репозиторий без предварительной рецензии, или ему сначала следует сделать рецензию в сообществе разработчиков. Если код тривиален или был отрецензирован, и коммиттер не является сопровождающим, он должен проконсультироваться с сопровождающим перед тем, как продолжить. Если код предоставлен внешним поставщиком, сопровождающий должен создать патч, который отправляется обратно поставщику. Затем код коммитится и развертывается пользователями. Если они обнаружат проблемы с кодом, это будет сообщено, и коммиттер может вернуться к написанию патча. Если затронут поставщик, он может выбрать реализацию или игнорирование патча.
+
+.Процесс вкратце: Участник делает коммит кода
+image::proc-contrib.png["Обратитесь к абзацам выше и ниже для версии, совместимой с программами чтения с экрана."]
+
+Разница, когда участник вносит код, заключается в том, что он отправляет код через интерфейс Bugzilla. Этот отчёт забирает сопровождающий, который просматривает код и делает ему коммит.
+
+Роли, задействованные в этом процессе:
+
+. crossref:dev-model[role-committer, Коммиттер]
+. crossref:dev-model[role-contributor, Участник (контрибьютор)]
+. crossref:dev-model[role-vendor, Поставщик]
+. crossref:dev-model[role-reviewer, Рецензенты]
+
+[crossref:dev-model[freebsd-committer, FreeBSD, 2001]] [crossref:dev-model[jorgensen2001, Jørgensen, 2001]]
+
+[[process-core-election]]
+=== Выборы основной команды (Core Team)
+
+Выборы Core Team проводятся не реже чем раз в два года. footnote:[Первые выборы Core Team состоялись в сентябре 2000 года] Избираются девять участников Core Team. Новые выборы проводятся, если количество участников Core Team становится меньше семи. Новые выборы также могут быть проведены, если этого потребуют как минимум 1/3 активных коммиттеров.
+
+Когда должны состояться выборы, Core Team объявляет об этом как минимум за 6 недель и назначает менеджера выборов для их проведения.
+
+Только коммиттеры могут быть избраны в состав основной команды (Core Team). Кандидаты должны подать свои заявки как минимум за одну неделю до начала выборов, но могут уточнять свои заявления до начала голосования. Они представлены в http://election.uk.freebsd.org/candidates.html[списке кандидатов]. При составлении своих предвыборных заявлений кандидаты должны ответить на несколько стандартных вопросов, предоставленных организатором выборов.
+
+Во время выборов строго соблюдается правило, что коммиттер должен был сделать коммит в течение последних 12 месяцев. Только эти коммиттеры имеют право голосовать.
+
+При голосовании коммиттер может проголосовать один раз в поддержку до девяти номинантов. Голосование проводится в течение четырёх недель, с напоминаниями, публикуемыми в рассылке "developers", доступной всем коммиттерам.
+
+Результаты выборов публикуются через неделю после их окончания, а новая основная команда вступает в должность через неделю после публикации результатов.
+
+В случае ничьей при голосовании, это будет разрешено новыми, однозначно избранными членами ядра.
+
+Голоса и заявления кандидатов архивируются, но архивы не являются общедоступными.
+
+.Процесс вкратце: Выборы основной команды (Core Team)
+image::proc-elections.png["Обратитесь к абзацу ниже для версии, совместимой с программами чтения с экрана."]
+
+Core Team объявляет выборы и назначает руководителя выборов, который подготавливает процесс. Когда всё готово, кандидаты могут объявить о своей кандидатуре, представив заявления. Затем коммиттеры голосуют. После завершения голосования результаты выборов объявляются, и новая основная команда вступает в должность.
+
+Ответственный за выборы Core Team:
+
+* crossref:dev-model[role-core, Основная команда (Core Team)]
+* crossref:dev-model[role-committer, Коммиттер]
+* crossref:dev-model[role-election-manager, Менеджер выборов]
+
+[crossref:dev-model[freebsd-bylaws, FreeBSD, 2000A]] [crossref:dev-model[bsd-election2002, FreeBSD, 2002B]] [crossref:dev-model[freebsd-election, FreeBSD, 2002G]]
+
+[[new-features]]
+=== Разработка новых функций
+
+В рамках проекта существуют подпроекты, работающие над новыми функциями. Эти проекты обычно выполняются одним человеком [crossref:dev-model[jorgensen2001, Йоргенсен, 2001]]. Каждый проект волен организовывать разработку так, как считает нужным. Однако, когда проект объединяется с ветвью -CURRENT, он должен следовать руководствам проекта. Когда код хорошо протестирован в ветви -CURRENT и признан достаточно стабильным и актуальным для ветви -STABLE, он объединяется с ветвью -STABLE.
+
+Требования проекта определяются пожеланиями разработчиков, запросами сообщества в виде прямых обращений по почте, отчетов о проблемах (Problem Reports), коммерческим финансированием разработки функциональности или вкладами научного сообщества. Пожелания, которые входят в зону ответственности разработчика, передаются этому разработчику, который расставляет приоритеты между запросом и своими собственными пожеланиями. Распространенный способ организации этого процесса — ведение списка задач (TODO-list), поддерживаемого проектом. Задачи, не входящие в чью-либо зону ответственности, собираются в списках TODO, пока кто-нибудь не возьмет на себя ответственность за их выполнение. Все запросы, их распределение и отслеживание обрабатываются с помощью инструмента crossref:dev-model[tool-bugzilla, Bugzilla].
+
+Анализ требований происходит двумя способами. Поступившие запросы обсуждаются в почтовых рассылках, как в основном проекте, так и в подпроекте, к которому относится запрос или который создается этим запросом. Кроме того, отдельные разработчики подпроекта оценивают осуществимость запросов и определяют приоритеты между ними. Помимо архивов обсуждений, на этом этапе не создается никаких результатов, которые включаются в основной проект.
+
+Поскольку запросы приоритизируются отдельными разработчиками на основе того, что они считают интересным, необходимым или за что им платят, отсутствует общая стратегия или приоритезация того, какие запросы считать требованиями, и как контролировать их корректную реализацию. Однако большинство разработчиков разделяют общее видение того, какие вопросы являются более важными, и они могут запросить рекомендации у команды инженеров по выпуску релизов.
+
+Фаза проверки проекта состоит из двух этапов. Перед внесением кода в текущую ветку разработчики запрашивают рецензирование своего кода коллегами. Это рецензирование в основном проводится с помощью функционального тестирования, но также важна проверка кода. Когда код внесён в ветку, проводится более широкое функциональное тестирование, которое может привести к дополнительной проверке кода и отладке, если код ведёт себя не так, как ожидалось. Эта вторая форма проверки может рассматриваться как структурная верификация. Хотя сами подпроекты могут писать формальные тесты, такие как модульные тесты, они обычно не собираются основным проектом и чаще всего удаляются перед внесением кода в текущую ветку. footnote:[Однако всё больше тестов выполняется при сборке системы (make world). Эти тесты являются очень новым дополнением, и систематическая структура для них ещё не создана.]
+
+[[model-maintenance]]
+=== Сопровождение
+
+Для проекта полезно, чтобы за каждую область исходного кода отвечал хотя бы один человек, который хорошо её знает. Некоторые части кода имеют назначенных сопровождающих. Другие имеют фактических сопровождающих, а некоторые части системы не имеют сопровождающих. Сопровождающий обычно является участником подпроекта, который написал и интегрировал код, или тем, кто портировал его с платформы, для которой он был написан. footnote:[sendmail и named — примеры кода, который был объединён с других платформ.] Задача сопровождающего — убедиться, что код синхронизирован с проектом, из которого он получен, если это сторонний код, а также применять патчи, предоставленные сообществом, или исправлять обнаруженные проблемы.
+
+Основной объем работы, вкладываемый в проект FreeBSD, связан с сопровождением. [crossref:dev-model[jorgensen2001, Jørgensen, 2001]] предоставляет схему, показывающую жизненный цикл изменений.
+
+Модель Йоргенссена для интеграции изменений
+
+[.informaltable]
+[cols="1,1,1", options="header"]
+|===
+| Этап
+| Следующий, если успешно
+| Следующий, если неудачно
+
+|программирование
+|рецензирование
+|
+
+|рецензирование
+|предварительная проверка перед коммитом
+|программирование
+
+|предварительная проверка перед коммитом
+|релиз для разработки
+|программирование
+
+|релиз для разработки
+|параллельная отладка
+|программирование
+
+|параллельная отладка
+|релиз для производства
+|программирование
+
+|релиз для производства
+|
+|программирование
+|===
+
+Здесь "релиз для разработки" относится к ветке -CURRENT, а "релиз для производства" — к ветке -STABLE. "Предварительная проверка перед коммитом" — это функциональное тестирование, проводимое коллегами-разработчиками по запросу или для проверки кода с целью определения состояния подпроекта. "Параллельная отладка" — это функциональное тестирование, которое может вызвать дополнительный обзор и отладку, когда код включён в ветку -CURRENT.
+
+На момент написания этого документа в проекте было 269 коммиттеров. Когда они вносят изменения в ветку, это создает новый выпуск. Очень часто пользователи в сообществе отслеживают определенную ветку. Мгновенное появление нового выпуска делает изменения широко доступными сразу же и позволяет быстро получать отзывы от сообщества. Это также дает сообществу ожидаемое время реакции на проблемы, которые важны для них. Это делает сообщество более вовлеченным, что, в свою очередь, позволяет получать больше и лучше отзывов, что снова стимулирует больше сопровождения и в конечном итоге должно создать лучший продукт.
+
+Прежде чем вносить изменения в код в частях дерева, история которых неизвестна коммиттеру, коммиттер обязан прочитать журналы коммитов, чтобы понять, почему определённые функции реализованы именно так, и избежать ошибок, которые уже были обдуманы или исправлены ранее.
+
+[[model-pr]]
+=== Сообщение о проблеме
+
+До FreeBSD 10 в FreeBSD входил инструмент для отправки отчётов о проблемах под названием `send-pr`. Проблемы включают отчёты об ошибках, запросы функций, улучшения функций и уведомления о новых версиях внешнего программного обеспечения, включённого в проект. Хотя `send-pr` доступен, пользователям и разработчикам рекомендуется отправлять проблемы, используя нашу https://bugs.freebsd.org/submit/[форму отчёта о проблемах].
+
+Отчёты о проблемах отправляются на электронный адрес, откуда они попадают в базу данных сопровождения отчётов о проблемах. crossref:dev-model[role-bugbuster, Исправитель ошибок (Bugbuster)] классифицирует проблему и направляет её соответствующей группе или сопровождающему в рамках проекта. После того, как кто-то берёт ответственность за отчёт, он анализируется. Этот анализ включает проверку проблемы и разработку решения. Часто требуется обратная связь от автора отчёта или даже от сообщества FreeBSD. Как только создаётся патч для устранения проблемы, автора отчета могут попросить его протестировать. В итоге рабочий патч интегрируется в проект и, если необходимо, документируется. Затем он проходит стандартный цикл сопровождения, как описано в разделе crossref:dev-model[model-maintenance, Сопровождение]. Отчёт о проблеме может находиться в следующих состояниях: открыт, анализируется, ожидает обратной связи, исправлен патчем, отложен и закрыт. Состояние "отложен" используется, когда дальнейшее продвижение невозможно из-за недостатка информации или когда задача требует столько работы, что в данный момент никто над ней не работает.
+
+.Сводка процесса: сообщение о проблеме
+image::proc-pr.png["Обратитесь к абзацу ниже для версии, совместимой с программами чтения с экрана."]
+
+Проблема сообщается автором отчета. Затем она классифицируется ответственным за обработку ошибок и передается соответствующему сопровождающему. Он проверяет проблему и обсуждает её с автором отчёта до тех пор, пока не будет собрано достаточно информации для создания рабочего исправления. Это исправление затем фиксируется, и отчёт о проблеме закрывается.
+
+Роли, включенные в этот процесс:
+
+. crossref:dev-model[role-problem-originator, Инициатор отчета]
+. crossref:dev-model[role-maintainer, Сопровождение]
+. crossref:dev-model[role-bugbuster, Исправитель ошибок (Bugbuster)]
+
+[crossref:dev-model[freebsd-handle-pr, FreeBSD, 2002C]]. [crossref:dev-model[freebsd-send-pr, FreeBSD, 2002D]]
+
+[[process-reactions]]
+=== Реагирование на неправильное поведение
+
+[crossref:dev-model[freebsd-committer, FreeBSD, 2001]] содержит ряд правил, которым должны следовать коммиттеры. Однако случается, что эти правила нарушаются. Следующие правила существуют для того, чтобы можно было реагировать на неподобающее поведение. Они определяют, какие действия приведут к приостановке привилегий коммиттера на тот или иной срок.
+
+* Совершение коммитов во время заморозки кода без одобрения команды Release Engineering — 2 дня
+* Коммит изменений в ветку безопасности без одобрения - 2 дня
+* Войны коммитов — 5 дней для всех участвующих сторон
+* Невежливое или неподобающее поведение — 5 дней
+
+[crossref:dev-model[ref-freebsd-trenches, Lehey, 2002]]
+
+Для эффективности приостановок любой член основной команды (Core Team) может применить приостановку до обсуждения на почтовой рассылке "core". Повторные нарушители могут, при 2/3 голосов от основной команды, получить более строгие наказания, включая постоянное лишение прав на коммиты. (Однако последнее всегда рассматривается как крайняя мера из-за присущей ему склонности вызывать споры.) Все приостановки публикуются в почтовой рассылке "developers", доступной только коммиттерам.
+
+Важно, что вас не могут приостановить за технические ошибки. Все наказания связаны с нарушением социального этикета.
+
+Роли, участвующие в этом процессе:
+
+* crossref:dev-model[role-core, Основная команда (Core Team)]
+* crossref:dev-model[role-committer, Коммиттер]
+
+[[process-release-engineering]]
+=== Выпуск релизов
+
+Проект FreeBSD имеет команду инженеров по выпуску релизов с главным инженером, который отвечает за создание релизов FreeBSD для распространения среди пользователей через интернет или продажи в розничных магазинах. Поскольку FreeBSD доступна на нескольких платформах, а релизы для различных архитектур выпускаются одновременно, в команде есть ответственный за каждую архитектуру. Также в команде есть роли, отвечающие за координацию усилий по обеспечению качества, сборку набора пакетов и актуализацию документации. Под инженером по выпуску релизов подразумевается представитель команды инженеров по выпуску релизов.
+
+Когда готовится выпуск релиза, проект FreeBSD несколько меняет свою структуру. Составляется график выпуска, включающий заморозку функциональности и кода, выпуск промежуточных релизов и финального релиза. Заморозка функциональности означает, что новые функции не могут быть добавлены в ветку без явного согласия инженеров релиза. Заморозка кода означает, что изменения в коде (например, исправления ошибок) не могут быть добавлены без явного согласия инженеров релиза. Этот процесс заморозки функциональности и кода известен как стабилизация. В процессе выпуска релиза инженер релиза имеет полномочия откатываться к более старым версиям кода и, таким образом, "отменять" изменения, если они сочтут, что эти изменения не подходят для включения в релиз.
+
+Существует три различных вида выпусков:
+
+. .0 выпуски являются первым релизом основной версии. Они ветвятся от ветки -CURRENT и имеют значительно более длительный цикл разработки из-за нестабильного характера ветки -CURRENT
+. .X релизы — это релизы ветки -STABLE. Они запланированы к выходу каждые 4 месяца.
+. .X.Y — это выпуски с исправлениями уязвимостей, следующие за веткой .X. Они выходят только тогда, когда с момента последнего выпуска в этой ветке было объединено достаточное количество исправлений уязвимостей. Новые функции включаются редко, а команда безопасности участвует в этих выпусках гораздо активнее, чем в обычных.
+
+Для выпусков ветки -STABLE процесс выпуска начинается за 45 дней до предполагаемой даты релиза. В течение первой фазы, первых 15 дней, разработчики переносят изменения из -CURRENT, которые они хотят включить в релиз, в ветку выпуска. По окончании этого периода код входит в 15-дневный период заморозки, в течение которого допускаются только исправления ошибок, обновления документации, исправления, связанные с безопасностью, и незначительные изменения драйверов устройств. Эти изменения должны быть предварительно одобрены инженером выпуска. В начале последнего 15-дневного периода создается кандидат на выпуск для широкого тестирования. В этот период вероятность внесения изменений снижается, за исключением важных исправлений ошибок и обновлений безопасности. В этот заключительный период все выпуски считаются кандидатами на выпуск. По завершении процесса выпуска создается релиз с новым номером версии, включая бинарные дистрибутивы на веб-сайтах и создание образов CD-ROM. Однако релиз не считается «действительно выпущенным» до тех пор, пока на список рассылки freebsd-announce не будет отправлено сообщение, подписанное с помощью crossref:dev-model[tool-pgp, Pretty Good Privacy], в котором явно указано, что релиз состоялся; все, что обозначено как «релиз» до этого момента, может находиться в процессе доработки и изменяться до отправки PGP-подписанного сообщения. footnote:[Многие коммерческие поставщики используют эти образы для создания CD-ROM, которые продаются в розничных магазинах.].
+
+Версии ветки -CURRENT (то есть все версии, оканчивающиеся на ".0"), очень похожи, но с вдвое большим временным промежутком. Процесс начинается за 8 недель до выпуска с объявления графика релиза. Через две недели после начала процесса выпуска вводится заморозка функциональности, и оптимизация производительности должна быть сведена к минимуму. За четыре недели до выпуска становится доступна официальная бета-версия. За две недели до выпуска код официально ветвится в новую версию. Этой версии присваивается статус релиз-кандидата, и, как и в случае с разработкой -STABLE, заморозка кода релиз-кандидата ужесточается. Однако разработка на основной ветке разработки может продолжаться. За исключением этих различий, процессы разработки релизов схожи.
+
+*.0 releases go into their own branch and are aimed mainly at early adopters. The branch then goes through a period of stabilisation, and it is not until the crossref:dev-model[role-releng, Release Engineering Team] decides the demands to stability have been satisfied that the branch becomes -STABLE and -CURRENT targets the next major version. While this for the majority has been with *.1 versions, this is not a demand.
+
+Большинство выпусков происходит по достижении даты, которая считается достаточно отдалённой от предыдущего выпуска. Установлена цель выпускать основные версии каждые 18 месяцев, а промежуточные — каждые 4 месяца. Сообщество пользователей чётко дало понять, что безопасность и стабильность не могут быть принесены в жертву из-за самостоятельно установленных сроков и целевых дат выпуска. Чтобы задержки не становились слишком длинными в вопросах безопасности и стабильности, требуется дополнительная дисциплина при внесении изменений в -STABLE.
+
+. Сделать график выпуска релизов
+. Заморозить функциональность
+. Заморозка кода
+. Создать ветку
+. Кандидат на выпуск
+. Стабилизировать выпуск (при необходимости вернуться к предыдущему шагу; когда выпуск считается стабильным, перейти к следующему шагу)
+. Собрать пакеты
+. Предупредить сайты-зеркала
+. Опубликовать выпуск
+
+// Keep the spaces around the external square bracket to avoid a warning in the
+// PDF converter
+[ crossref:dev-model[freebsd-releng, FreeBSD, 2002E] ]
+
+[[tools]]
+== Инструменты
+
+Основные инструменты поддержки процесса разработки — это Bugzilla, Mailman и OpenSSH. Это инструменты, разработанные сторонними организациями, которые широко используются в мире открытого исходного кода.
+
+[[tool-git]]
+=== Git
+
+Git — это система для управления несколькими версиями текстовых файлов, отслеживания внесённых изменений, их авторов и причин. Проект хранится в «репозитории», а разные версии считаются разными «ветками».
+
+[[tool-bugzilla]]
+=== Bugzilla
+
+Bugzilla — это база данных для сопровождения, состоящая из набора инструментов для отслеживания ошибок на центральном сайте. Она поддерживает процесс отслеживания ошибок, включая отправку и обработку ошибок, а также запросы и обновление базы данных, а также редактирование отчётов об ошибках. Проект использует веб-интерфейс для отправки "Отчётов о проблемах" на центральный сервер Bugzilla проекта. У коммиттеров также есть веб- и командные клиенты.
+
+[[model-mailman]]
+=== Mailman
+
+Mailman - это программа, которая автоматизирует управление почтовыми рассылками. Проект FreeBSD использует ее для ведения 16 общих рассылок, 60 технических рассылок, 4 ограниченных рассылок и 5 рассылок с логами коммитов Git. Она также используется для многих почтовых рассылок, созданных и используемых другими людьми и проектами в сообществе FreeBSD. Общие рассылки предназначены для широкой публики, технические рассылки в основном предназначены для разработки определенных областей интересов, а закрытые рассылки используются для внутренней коммуникации, не предназначенной для широкой публики. Большая часть всей коммуникации в проекте проходит через эти 85 рассылок [crossref:dev-model[ref-bsd-handbook, FreeBSD, 2003A], Приложение C].
+
+[[tool-pgp]]
+=== Pretty Good Privacy
+
+Pretty Good Privacy, более известный как PGP, — это криптосистема, использующая архитектуру открытого ключа, чтобы позволить пользователям подписывать и/или шифровать информацию цифровой подписью для обеспечения безопасной связи между двумя сторонами. Подпись используется при отправке информации множеству получателей, позволяя им убедиться, что информация не была изменена до того, как они её получили. В проекте FreeBSD это основной способ убедиться, что информация была написана тем, кто утверждает, что её создал, и не была изменена в процессе передачи.
+
+[[tool-ssh2]]
+=== Secure Shell (SSH)
+
+Secure Shell - это стандарт безопасного входа в удалённую систему и выполнения команд на ней. Он позволяет устанавливать и защищать другие соединения, называемые туннелями, между двумя взаимодействующими системами. Этот стандарт существует в двух основных версиях, и только версия два используется в проекте FreeBSD. Наиболее распространённая реализация стандарта - OpenSSH, которая входит в основную дистрибуцию проекта. Поскольку её исходный код обновляется чаще, чем выпуски FreeBSD, последняя версия также доступна в дереве портов.
+
+[[sub-projects]]
+== Подпроекты
+Подпроекты создаются для уменьшения объема коммуникации, необходимой для координации группы разработчиков. Когда проблемная область достаточно изолирована, большая часть коммуникации происходит внутри группы, сосредоточенной на проблеме, что требует меньше общения с другими группами по сравнению с ситуацией, когда группа не изолирована.
+
+[[sub-project-ports]]
+=== Подпроект Ports
+
+"Порт" — это набор метаданных и патчей, необходимых для загрузки, компиляции и корректной установки внешнего программного обеспечения в системе FreeBSD. Количество портов растёт с огромной скоростью, как показано на следующем рисунке.
+
+.Количество портов, добавленных между 1995 и 2022 годами
+[[fig-ports]]
+image::portsstatus.svg["Обратитесь к параграфам ниже для версии, удобной для экранных дикторов."]
+
+crossref:dev-model[fig-ports,image::portsstatus.svg] показывает количество портов, доступных для FreeBSD в период с 1995 по 2022 год. Похоже, что кривая сначала росла экспоненциально, а затем с середины 2001 до середины 2007 года росла линейно со скоростью около 2000 портов/год, после чего скорость роста снизилась.
+
+Поскольку внешнее программное обеспечение, описываемое портом, часто находится в стадии активной разработки, объем работы, необходимой для поддержки портов, уже велик и продолжает расти. Это привело к тому, что часть проекта FreeBSD, связанная с портами, получила более самостоятельную структуру и все больше становится подпроектом проекта FreeBSD.
+
+Порты имеют свою собственную основную команду с crossref:dev-model[role-ports-manager, Менеджером Портов] во главе, и эта команда может назначать коммиттеров без одобрения Основной команды FreeBSD (Core Team). В отличие от проекта FreeBSD, где активное сопровождение часто вознаграждается правом коммита, подпроект портов включает множество активных сопровождающих, не являющихся коммиттерами.
+
+В отличие от основного проекта, дерево портов не разветвляется. Каждый выпуск FreeBSD следует текущей коллекции портов, что обеспечивает доступ к обновлённой информации о том, где найти программы и как их собрать. Однако это означает, что порт, зависящий от системы, может требовать изменений в зависимости от версии FreeBSD, на которой он запущен.
+
+С неразветвлённым репозиторием портов невозможно гарантировать, что любой порт будет работать на чём-либо, кроме -CURRENT и -STABLE, в частности на старых, минорных выпусках. Для этого нет ни инфраструктуры, ни времени волонтёров.
+
+Команды, зависящие от Ports, такие как команда выпуска релизов, для эффективности коммуникации имеют своих собственных представителей по портам.
+
+[[sub-project-documentation]]
+=== Проект документации FreeBSD
+
+Проект документации FreeBSD был начат в январе 1995 года. От первоначальной группы, состоявшей из руководителя проекта, четырёх руководителей команд и 16 участников, сейчас общее число коммиттеров достигло 44. Список рассылки документации насчитывает чуть менее 300 участников, что указывает на довольно большое сообщество вокруг него.
+
+Цель проекта Документации — предоставить качественную и полезную документацию проекта FreeBSD, чтобы новые пользователи могли легче освоить систему, а также подробно описать расширенные функции для пользователей.
+
+Основные задачи проекта Documentation — работа над текущими проектами в "Наборе документации FreeBSD" и перевод документации на другие языки.
+
+Как и проект FreeBSD, документация разделена на те же ветви. Это сделано для того, чтобы для каждой версии всегда была обновлённая документация. В ветвях безопасности исправляются только ошибки в документации.
+
+Как и подпроект ports, проект Documentation может назначать коммиттеров документации без одобрения основной команды FreeBSD (Core Team). [crossref:dev-model[freebsd-doceng-charter, FreeBSD, 2003B]].
+
+Проект документации включает в себя extref:{fdp-primer}[вводное руководство]. Оно используется как для ознакомления новых участников проекта со стандартными инструментами и синтаксисом, так и в качестве справочника при работе над проектом.
+
+:sectnums!:
+
+[bibliography]
+[[bibliography]]
+== Список литературы
+
+[[brooks]]
+[Brooks, 1995] Фредерик П. Брукс. Авторское право © 1975, 1995 Pearson Education Limited. 0201835959. Addison-Wesley Pub Co. Мифический человекомесяц. Эссе о программной инженерии, юбилейное издание (2-е издание).
+
+[[thesis]]
+[Saers, 2003] Никлас Саерс. Авторское право © 2003. Модель проекта для FreeBSD. Кандидатская диссертация. http://niklas.saers.com/thesis.
+
+[[jorgensen2001]]
+[Йоргенсен, 2001] Нильс Йоргенсен. Copyright © 2001. _Putting it All in the Trunk. Incremental Software Development in the FreeBSD Open Source Project_. http://www.dat.ruc.dk/~nielsj/research/papers/freebsd.pdf.
+
+[[ref-pmbok]]
+[PMI, 2000] Институт управления проектами. Copyright © 1996, 2000 Институт управления проектами. 1-880410-23-0. Институт управления проектами. Ньютаун Сквер, Пенсильвания, США. PMBOK Guide. A Guide to the Project Management Body of Knowledge (Руководство PMBOK. Руководство к своду знаний по управлению проектами), издание 2000 года.
+
+[[freebsd-bylaws]]
+[FreeBSD, 2000A] Copyright © 2002 The FreeBSD Project. Core Bylaws. https://www.freebsd.org/internal/bylaws/.
+
+[[freebsd-developer-handbook]]
+[FreeBSD, 2002A] Copyright © 2002 The FreeBSD Documentation Project. Руководство FreeBSD для разработчиков. extref:{developers-handbook}[Руководство FreeBSD для разработчиков].
+
+[[bsd-election2002]]
+[FreeBSD, 2002B] Copyright © 2002 Проект FreeBSD. Выборы состава основной команды (Core Team) 2002. http://election.uk.freebsd.org/candidates.html.
+
+[[freebsd-handle-pr]]
+[FreeBSD, 2002C] Даг-Эрлинг Смёрграв и Хитен Пандья. Copyright © 2002 The FreeBSD Documentation Project. The FreeBSD Documentation Project. Рекомендации по работе с сообщениями о проблемах. extref:{pr-guidelines}[Рекомендации по работе с сообщениями о проблемах].
+
+[[freebsd-send-pr]]
+[FreeBSD, 2002D] Даг-Эрлинг Смёрграв. Copyright © 2002 Проект документации FreeBSD. Проект документации FreeBSD. Составление сообщений о проблеме во FreeBSD. extref:{problem-reports}[Составление сообщений о проблеме во FreeBSD].
+
+[[freebsd-committer]]
+[FreeBSD, 2001] Copyright © 2001 The FreeBSD Documentation Project. The FreeBSD Documentation Project. Справочник коммиттера. extref:{committers-guide}[Справочник коммиттера].
+
+[[freebsd-releng]]
+[FreeBSD, 2002E] Мюррей Стокли. Copyright © 2002 The FreeBSD Documentation Project. Проект документации FreeBSD. Подготовка релизов FreeBSD. extref:{releng}[Подготовка релизов FreeBSD].
+
+[[ref-bsd-handbook]]
+[FreeBSD, 2003A] Проект документации FreeBSD. Руководство FreeBSD. extref:{handbook}[Руководство FreeBSD].
+
+[[freebsd-contributors]]
+[FreeBSD, 2002F] Copyright © 2002 The FreeBSD Documentation Project. Проект документации FreeBSD. Участники проекта FreeBSD. extref:{contributors}[Участники проекта FreeBSD].
+
+[[freebsd-election]]
+[FreeBSD, 2002G] Copyright © 2002 The FreeBSD Project. The FreeBSD Project. Выборы состава основной команды (Core Team) 2002. http://election.uk.freebsd.org.
+
+[[freebsd-expiration-policy]]
+[FreeBSD, 2002H] Copyright © 2002 The FreeBSD Project. The FreeBSD Project. Политика истечения срока действия битов коммитов. 2002/04/06 15:35:30. https://www.freebsd.org/internal/expire-bits/.
+
+[[freebsd-new-account]]
+[FreeBSD, 2002I] Copyright © 2002 The FreeBSD Project. The FreeBSD Project. Процедура создания нового аккаунта. 2002/08/19 17:11:27. https://www.freebsd.org/internal/new-account/.
+
+[[freebsd-doceng-charter]]
+[FreeBSD, 2003B] Copyright © 2002 The FreeBSD Documentation Project. The FreeBSD Documentation Project. Устав команды разработчиков документации FreeBSD. 2003/03/16 12:17. https://www.freebsd.org/internal/doceng/.
+
+[[ref-freebsd-trenches]]
+[Lehey, 2002] Грег Лехи. Copyright © 2002 Грег Лехи. Грег Лехи. Two years in the trenches. The evolution of a software project (Два года в окопах. Эволюция программного проекта). http://www.lemis.com/grog/In-the-trenches.pdf.
diff --git a/documentation/content/ru/books/dev-model/_index.po b/documentation/content/ru/books/dev-model/_index.po
new file mode 100644
index 0000000000..b619bee136
--- /dev/null
+++ b/documentation/content/ru/books/dev-model/_index.po
@@ -0,0 +1,3865 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:30+0300\n"
+"PO-Revision-Date: 2025-09-20 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdev-model_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/dev-model/_index.adoc:1
+#, no-wrap
+msgid "A formal study of the organization of the FreeBSD project"
+msgstr "Формальное исследование организации проекта FreeBSD"
+
+#. Copyright (c) 2002-2005 Niklas Saers
+#. All rights reserved.
+#. Redistribution and use in source and binary forms, with or without
+#. modification, are permitted provided that the following conditions
+#. are met:
+#. 1. Redistributions of source code must retain the above copyright
+#. notice, this list of conditions and the following disclaimer.
+#. 2. Redistributions in binary form must reproduce the above copyright
+#. notice, this list of conditions and the following disclaimer in the
+#. documentation and/or other materials provided with the distribution.
+#. THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+#. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+#. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+#. ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+#. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+#. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+#. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+#. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+#. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+#. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+#. SUCH DAMAGE.
+#. type: Title =
+#: documentation/content/en/books/dev-model/_index.adoc:1
+#: documentation/content/en/books/dev-model/_index.adoc:39
+#, no-wrap
+msgid "A project model for the FreeBSD Project"
+msgstr "Проектная модель для проекта FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:72
+msgid "'''"
+msgstr "'''"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:78
+msgid "Foreword"
+msgstr "Предисловие"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:84
+msgid ""
+"Up until now, the FreeBSD project has released a number of described "
+"techniques to do different parts of work. However, a project model "
+"summarising how the project is structured is needed because of the "
+"increasing amount of project members. footnote:[This goes hand-in-hand with "
+"Brooks' law that adding another person to a late project will make it later "
+"since it will increase the communication needs . A project model is a tool "
+"to reduce the communication needs.] This paper will provide such a project "
+"model and is donated to the FreeBSD Documentation project where it can "
+"evolve together with the project so that it can at any point in time reflect "
+"the way the project works. It is based on [crossref:dev-model[thesis, "
+"Saers,2003]]."
+msgstr ""
+"До настоящего момента проект FreeBSD выпустил ряд описанных методик для "
+"выполнения различных частей работы. Однако, из-за растущего числа участников "
+"проекта, необходима модель проекта, обобщающая его структуру. footnote:[Это "
+"согласуется с законом Брукса, согласно которому добавление нового человека в "
+"задерживающийся проект сделает его ещё более задержанным, поскольку увеличит "
+"потребность в коммуникации. Модель проекта — это инструмент для снижения "
+"потребности в коммуникации.] Данная статья предоставляет такую модель "
+"проекта и передаётся в проект документации FreeBSD, где она может "
+"развиваться вместе с проектом, чтобы в любой момент времени отражать способ "
+"его работы. Она основана на [crossref:dev-model[диссертации, Saers,2003]]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:86
+msgid ""
+"I would like to thank the following people for taking the time to explain "
+"things that were unclear to me and for proofreading the document."
+msgstr ""
+"Я хотел бы поблагодарить следующих людей за то, что они нашли время "
+"объяснить мне непонятные моменты и проверить документ."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:88
+msgid "Andrey A. Chernov mailto:ache@freebsd.org[ache@freebsd.org]"
+msgstr "Andrey A. Chernov mailto:ache@freebsd.org[ache@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:89
+msgid "Bruce A. Mah mailto:bmah@freebsd.org[bmah@freebsd.org]"
+msgstr "Bruce A. Mah mailto:bmah@freebsd.org[bmah@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:90
+msgid "Dag-Erling Smørgrav mailto:des@freebsd.org[des@freebsd.org]"
+msgstr "Dag-Erling Smørgrav mailto:des@freebsd.org[des@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:91
+msgid "Giorgos Keramidas mailto:keramida@freebsd.org[keramida@freebsd.org]"
+msgstr "Giorgos Keramidas mailto:keramida@freebsd.org[keramida@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:92
+msgid ""
+"Ingvil Hovig "
+"mailto:ingvil.hovig@skatteetaten.no[ingvil.hovig@skatteetaten.no]"
+msgstr ""
+"Ingvil Hovig "
+"mailto:ingvil.hovig@skatteetaten.no[ingvil.hovig@skatteetaten.no]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:93
+msgid "Jesper Holck mailto:jeh.inf@cbs.dk[jeh.inf@cbs.dk]"
+msgstr "Jesper Holck mailto:jeh.inf@cbs.dk[jeh.inf@cbs.dk]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:94
+msgid "John Baldwin mailto:jhb@freebsd.org[jhb@freebsd.org]"
+msgstr "John Baldwin mailto:jhb@freebsd.org[jhb@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:95
+msgid "John Polstra mailto:jdp@freebsd.org[jdp@freebsd.org]"
+msgstr "John Polstra mailto:jdp@freebsd.org[jdp@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:96
+msgid "Kirk McKusick mailto:mckusick@freebsd.org[mckusick@freebsd.org]"
+msgstr "Kirk McKusick mailto:mckusick@freebsd.org[mckusick@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:97
+msgid "Mark Linimon mailto:linimon@freebsd.org[linimon@freebsd.org]"
+msgstr "Mark Linimon mailto:linimon@freebsd.org[linimon@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:98
+msgid "Marleen Devos"
+msgstr "Marleen Devos"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:99
+msgid "Niels Jørgenssen mailto:nielsj@ruc.dk[nielsj@ruc.dk]"
+msgstr "Niels Jørgenssen mailto:nielsj@ruc.dk[nielsj@ruc.dk]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:100
+msgid "Nik Clayton mailto:nik@freebsd.org[nik@freebsd.org]"
+msgstr "Nik Clayton mailto:nik@freebsd.org[nik@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:101
+msgid "Poul-Henning Kamp mailto:phk@freebsd.org[phk@freebsd.org]"
+msgstr "Poul-Henning Kamp mailto:phk@freebsd.org[phk@freebsd.org]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:102
+msgid "Simon L. Nielsen mailto:simon@freebsd.org[simon@freebsd.org]"
+msgstr "Simon L. Nielsen mailto:simon@freebsd.org[simon@freebsd.org]"
+
+#. type: Title ==
+#: documentation/content/en/books/dev-model/_index.adoc:104
+#, no-wrap
+msgid "Overview"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:109
+msgid ""
+"A project model is a means to reduce the communications overhead in a "
+"project. As shown by [crossref:dev-model[brooks, Brooks, 1995]], increasing "
+"the number of project participants increases the communication in the "
+"project exponentially. FreeBSD has during the past few years increased both "
+"its mass of active users and committers, and the communication in the "
+"project has risen accordingly. This project model will serve to reduce this "
+"overhead by providing an up-to-date description of the project."
+msgstr ""
+"Модель проекта — это способ снижения накладных расходов на коммуникации в "
+"проекте. Как показано в [crossref:dev-model[brooks, Brooks, 1995]], "
+"увеличение числа участников проекта приводит к экспоненциальному росту "
+"коммуникаций в проекте. За последние годы FreeBSD значительно увеличил как "
+"количество активных пользователей, так и коммиттеров, что соответственно "
+"привело к росту коммуникаций. Данная модель проекта поможет снизить эти "
+"накладные расходы за счёт предоставления актуального описания проекта."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:115
+msgid ""
+"During the Core elections in 2002, Mark Murray stated \"I am opposed to a "
+"long rule-book, as that satisfies lawyer-tendencies, and is counter to the "
+"technocentricity that the project so badly needs.\" [crossref:dev-model[bsd-"
+"election2002, FreeBSD, 2002B]]. This project model is not meant to be a "
+"tool to justify creating impositions for developers, but as a tool to "
+"facilitate coordination. It is meant as a description of the project, with "
+"an overview of how the different processes are executed. It is an "
+"introduction to how the FreeBSD project works."
+msgstr ""
+"Во время выборов в Core в 2002 году Марк Мюррей заявил: «Я против длинного "
+"свода правил, так как это удовлетворяет склонности к юриспруденции и "
+"противоречит техноцентричности, в которой проект так нуждается.» "
+"[crossref:dev-model[bsd-election2002, FreeBSD, 2002B]]. Эта модель проекта "
+"не предназначена для того, чтобы оправдывать создание ограничений для "
+"разработчиков, а служит инструментом для облегчения координации. Она "
+"призвана описывать проект, давая обзор того, как выполняются различные "
+"процессы. Это введение в то, как работает проект FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:118
+msgid ""
+"The FreeBSD project model will be described as of July 1st, 2004. It is "
+"based on the Niels Jørgensen's paper [crossref:dev-model[jorgensen2001, "
+"Jørgensen, 2001]], FreeBSD's official documents, discussions on FreeBSD "
+"mailing lists and interviews with developers."
+msgstr ""
+"Модель проекта FreeBSD будет описана по состоянию на 1 июля 2004 года. Она "
+"основана на работе Нильса Йоргенсена [crossref:dev-model[jorgensen2001, "
+"Jørгенсен, 2001]], официальных документах FreeBSD, обсуждениях в списках "
+"рассылки FreeBSD и интервью с разработчиками."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:121
+msgid ""
+"After providing definitions of terms used, this document will outline the "
+"organisational structure (including role descriptions and communication "
+"lines), discuss the methodology model and after presenting the tools used "
+"for process control, it will present the defined processes. Finally it will "
+"outline major sub-projects of the FreeBSD project."
+msgstr ""
+"После определения используемых терминов в этом документе будет описана "
+"организационная структура (включая описания ролей и линии коммуникации), "
+"рассмотрена модель методологии, а после представления инструментов, "
+"используемых для контроля процессов, будут описаны определенные процессы. В "
+"заключение будут представлены основные подпроекты проекта FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:125
+msgid ""
+"[crossref:dev-model[freebsd-developer-handbook, FreeBSD, 2002A]] Section 1.2 "
+"and 1.3 give the vision and the architectural guidelines for the project. "
+"The vision is \"To produce the best UNIX-like operating system package "
+"possible, with due respect to the original software tools ideology as well "
+"as usability, performance and stability.\" The architectural guidelines help "
+"determine whether a problem that someone wants to be solved is within the "
+"scope of the project"
+msgstr ""
+"[crossref:dev-model[freebsd-developer-handbook, FreeBSD, 2002A]] Разделы 1.2 "
+"и 1.3 описывают видение и архитектурные принципы проекта. Видение "
+"сформулировано как: \"Создать наилучший пакет операционной системы, подобной "
+"UNIX®, с должным уважением к оригинальной идеологии программных "
+"инструментов, а также к удобству использования, производительности и "
+"стабильности.\" Архитектурные принципы помогают определить, находится ли "
+"проблема, которую кто-то хочет решить, в рамках проекта"
+
+#. type: Title ==
+#: documentation/content/en/books/dev-model/_index.adoc:127
+#, no-wrap
+msgid "Definitions"
+msgstr "Определения"
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:130
+#, no-wrap
+msgid "Activity"
+msgstr "Активность"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:136
+msgid ""
+"An \"activity\" is an element of work performed during the course of a "
+"project [crossref:dev-model[ref-pmbok, PMI, 2000]]. It has an output and "
+"leads towards an outcome. Such an output can either be an input to another "
+"activity or a part of the process' delivery."
+msgstr ""
+"\"Активность\" — это элемент работы, выполняемый в ходе проекта "
+"[crossref:dev-model[ref-pmbok, PMI, 2000]]. У неё есть результат, который "
+"ведёт к достижению цели. Такой результат может быть либо входом для другой "
+"активности, либо частью поставки процесса."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:138
+#, no-wrap
+msgid "Process"
+msgstr "Процесс"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:143
+msgid ""
+"A \"process\" is a series of activities that lead towards a particular "
+"outcome. A process can consist of one or more sub-processes. An example of "
+"a process is software design."
+msgstr ""
+"Процесс — это ряд действий, ведущих к определенному результату. Процесс "
+"может состоять из одного или нескольких подпроцессов. Примером процесса "
+"является проектирование программного обеспечения."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:145
+#, no-wrap
+msgid "Hat"
+msgstr "Роль (hat)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:151
+msgid ""
+"A \"hat\" is synonymous with role. A hat has certain responsibilities in a "
+"process and for the process outcome. The hat executes activities. It is "
+"well defined what issues the hat should be contacted about by the project "
+"members and people outside the project."
+msgstr ""
+"\"Hat\" (шляпа) является синонимом роли. Роль имеет определенные обязанности "
+"в процессе и ответственность за результат процесса. Роль выполняет действия. "
+"Четко определено, по каким вопросам участники проекта и люди вне проекта "
+"должны обращаться к ответственному, выполняющему эту роль."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:153
+#, no-wrap
+msgid "Outcome"
+msgstr "Результат"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:161
+msgid ""
+"An \"outcome\" is the final output of the process. This is synonymous with "
+"deliverable, that is defined as \"any measurable, tangible, verifiable "
+"outcome, result or item that must be produced to complete a project or part "
+"of a project. Often used more narrowly in reference to an external "
+"deliverable, which is a deliverable that is subject to approval by the "
+"project sponsor or customer\" by [crossref:dev-model[ref-pmbok, PMI, "
+"2000]]. Examples of outcomes are a piece of software, a decision made or a "
+"report written."
+msgstr ""
+"«Результат» — это конечный продукт процесса. Это синоним понятия "
+"«поставляемый результат», который определяется как «любой измеримый, "
+"осязаемый, проверяемый результат, итог или элемент, который должен быть "
+"произведён для завершения проекта или его части. Часто используется в более "
+"узком смысле в отношении внешнего поставляемого результата, который подлежит "
+"утверждению спонсором проекта или заказчиком» согласно [crossref:dev-"
+"model[ref-pmbok, PMI, 2000]]. Примерами результатов являются программное "
+"обеспечение, принятое решение или написанный отчёт."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:163
+#, no-wrap
+msgid "FreeBSD"
+msgstr "FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:166
+msgid ""
+"When saying \"FreeBSD\" we will mean the BSD derivative UNIX-like operating "
+"system FreeBSD, whereas when saying \"the FreeBSD Project\" we will mean the "
+"project organisation."
+msgstr ""
+"Говоря \"FreeBSD\", мы подразумеваем UNIX-подобную операционную систему "
+"FreeBSD, основанную на BSD, тогда как говоря \"Проект FreeBSD\", мы "
+"подразумеваем организацию проекта."
+
+#. type: Title ==
+#: documentation/content/en/books/dev-model/_index.adoc:168
+#, no-wrap
+msgid "Organisational structure"
+msgstr "Организационная структура"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:171
+msgid ""
+"While no-one takes ownership of FreeBSD, the FreeBSD organisation is divided "
+"into core, committers and contributors and is part of the FreeBSD community "
+"that lives around it."
+msgstr ""
+"Хотя никто не является владельцем FreeBSD, организация FreeBSD разделена на "
+"ядро, коммиттеров и участников и является частью сообщества FreeBSD, которое "
+"существует вокруг неё."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:173
+msgid "The FreeBSD Project's structure (in order of descending authority)"
+msgstr "Структура проекта FreeBSD (в порядке убывания полномочий)"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:178
+#: documentation/content/en/books/dev-model/_index.adoc:213
+#, no-wrap
+msgid "Group"
+msgstr "Группа"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:180
+#: documentation/content/en/books/dev-model/_index.adoc:216
+#, no-wrap
+msgid "Number of people"
+msgstr "Количество людей"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:181
+#: documentation/content/en/books/dev-model/_index.adoc:217
+#, no-wrap
+msgid "Core members"
+msgstr "Основные участники"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:183
+#: documentation/content/en/books/dev-model/_index.adoc:220
+#, no-wrap
+msgid "9"
+msgstr "9"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:184
+#: documentation/content/en/books/dev-model/_index.adoc:221
+#, no-wrap
+msgid "Committers"
+msgstr "Коммиттеры"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:186
+#, no-wrap
+msgid "318"
+msgstr "318"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:187
+#: documentation/content/en/books/dev-model/_index.adoc:237
+#, no-wrap
+msgid "Contributors"
+msgstr "Участники"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:188
+#: documentation/content/en/books/dev-model/_index.adoc:239
+#, no-wrap
+msgid "~3000"
+msgstr "~3000"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:191
+msgid ""
+"Number of committers has been determined by going through CVS logs from "
+"January 1st, 2004 to December 31st, 2004 and contributors by going through "
+"the list of contributions and problem reports."
+msgstr ""
+"Количество коммиттеров было определено путем анализа журналов CVS с 1 января "
+"2004 года по 31 декабря 2004 года, а список участников — путем просмотра "
+"перечня внесенных изменений и отчетов о проблемах."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:196
+msgid ""
+"The main resource in the FreeBSD community is its developers: the committers "
+"and contributors. It is with their contributions that the project can move "
+"forward. Regular developers are referred to as contributors. As of January "
+"1st, 2003, there are an estimated 5500 contributors on the project."
+msgstr ""
+"Основной ресурс сообщества FreeBSD — это его разработчики: коммиттеры и "
+"контрибьюторы. Именно их вклад позволяет проекту развиваться. Обычные "
+"разработчики называются участниками (контрибьюторами). По состоянию на 1 "
+"января 2003 года в проекте насчитывается около 5500 контрибьюторов."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:200
+msgid ""
+"Committers are developers with the privilege of being able to commit "
+"changes. These are usually the most active developers who are willing to "
+"spend their time not only integrating their own code but integrating code "
+"submitted by the developers who do not have this privilege. They are also "
+"the developers who elect the core team, and they have access to closed "
+"discussions."
+msgstr ""
+"Коммиттеры — это разработчики, обладающие привилегией вносить изменения. "
+"Обычно это наиболее активные разработчики, которые готовы тратить своё время "
+"не только на интеграцию собственного кода, но и на интеграцию кода, "
+"предоставленного разработчиками без такой привилегии. Они также выбирают "
+"основную команду и имеют доступ к закрытым обсуждениям."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:204
+msgid ""
+"The project can be grouped into four distinct separate parts, and most "
+"developers will focus their involvement in one part of FreeBSD. The four "
+"parts are kernel development, userland development, ports and "
+"documentation. When referring to the base system, both kernel and userland "
+"is meant."
+msgstr ""
+"Проект можно разделить на четыре отдельные части, и большинство "
+"разработчиков сосредоточат своё участие на одной из частей FreeBSD. Эти "
+"четыре части — разработка ядра, разработка пользовательского пространства, "
+"порты и документация. Под базовой системой подразумеваются как ядро, так и "
+"пользовательское пространство."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:206
+msgid "This split changes our table to look like this:"
+msgstr "Это разделение изменяет нашу таблицу следующим образом:"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:208
+msgid "The FreeBSD Project's structure with committers in categories"
+msgstr ""
+"Структура проекта FreeBSD с участниками, имеющими права на запись, по "
+"категориям"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:214
+#, no-wrap
+msgid "Category"
+msgstr "Категория"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:222
+#, no-wrap
+msgid "Base"
+msgstr "Базовый"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:224
+#, no-wrap
+msgid "164"
+msgstr "164"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:226
+#, no-wrap
+msgid "Docs"
+msgstr "Docs"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:228
+#, no-wrap
+msgid "45"
+msgstr "45"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:230
+#, no-wrap
+msgid "Ports"
+msgstr "Порты"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:232
+#, no-wrap
+msgid "166"
+msgstr "166"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:234
+#, no-wrap
+msgid "Total"
+msgstr "Total"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:236
+#, no-wrap
+msgid "374"
+msgstr "374"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:244
+msgid ""
+"Number of committers per area has been determined by going through CVS logs "
+"from January 1st, 2004 to December 31st, 2004. Note that many committers "
+"work in multiple areas, making the total number higher than the real number "
+"of committers. The total number of active unique committers on June 2022 "
+"was 317."
+msgstr ""
+"Количество коммиттеров по областям было определено путем анализа журналов "
+"CVS с 1 января 2004 года по 31 декабря 2004 года. Обратите внимание, что "
+"многие коммиттеры работают в нескольких областях, поэтому общее число больше "
+"реального количества коммиттеров. Общее количество активных уникальных "
+"коммиттеров на июнь 2022 года составляло 317."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:247
+msgid ""
+"Committers fall into three groups: committers who are only concerned with "
+"one area of the project (for instance file systems), committers who are "
+"involved only with one sub-project, and committers who commit to different "
+"parts of the code, including sub-projects. Because some committers work on "
+"different parts, the total number in the committers section of the table is "
+"higher than in the above table."
+msgstr ""
+"Коммиттеры делятся на три группы: коммиттеры, занимающиеся только одной "
+"областью проекта (например, файловыми системами), коммиттеры, участвующие "
+"только в одном подпроекте, и коммиттеры, вносящие изменения в разные части "
+"кода, включая подпроекты. Поскольку некоторые коммиттеры работают над "
+"разными частями, общее количество в разделе коммиттеров таблицы выше, чем в "
+"предыдущей таблице."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:252
+msgid ""
+"The kernel is the main building block of FreeBSD. While the userland "
+"applications are protected against faults in other userland applications, "
+"the entire system is vulnerable to errors in the kernel. This, combined "
+"with the vast amount of dependencies in the kernel and that it is not easy "
+"to see all the consequences of a kernel change, demands developers with a "
+"relative full understanding of the kernel. Multiple development efforts in "
+"the kernel also require a closer coordination than userland applications do."
+msgstr ""
+"Ядро является основным строительным блоком FreeBSD. Хотя пользовательские "
+"приложения защищены от сбоев в других пользовательских приложениях, вся "
+"система уязвима от ошибок в ядре. Это, в сочетании с огромным количеством "
+"зависимостей в ядре и тем, что нелегко увидеть все последствия изменения "
+"ядра, требует от разработчиков относительно полного понимания ядра. "
+"Множественные усилия по разработке в ядре также требуют более тесной "
+"координации, чем пользовательские приложения."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:256
+msgid ""
+"The core utilities, known as userland, provide the interface that identifies "
+"FreeBSD, both user interface, shared libraries and external interfaces to "
+"connecting clients. Currently, 162 people are involved in userland "
+"development and maintenance, many being maintainers for their own part of "
+"the code. Maintainership will be discussed in the crossref:dev-model[role-"
+"maintainer, Maintainership] section."
+msgstr ""
+"Основные утилиты, известные как пользовательское окружение (userland), "
+"предоставляют интерфейс, который определяет FreeBSD, включая "
+"пользовательский интерфейс, общие библиотеки и внешние интерфейсы для "
+"подключения клиентов. В настоящее время 162 человека участвуют в разработке "
+"и поддержке пользовательского окружения, многие из которых являются "
+"сопровождающими (maintainers) для своей части кода. Вопросы сопровождения "
+"будут рассмотрены в разделе crossref:dev-model[role-"
+"maintainer,Сопровождение]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:259
+msgid ""
+"Documentation is handled by crossref:dev-model[sub-project-documentation, "
+"The FreeBSD Documentation Project] and includes all documents surrounding "
+"the FreeBSD project, including the web pages. There were during 2004 101 "
+"people making commits to the FreeBSD Documentation Project."
+msgstr ""
+"Документация обрабатывается crossref:dev-model[sub-project-documentation, "
+"Проектом документации FreeBSD] и включает все документы, связанные с "
+"проектом FreeBSD, включая веб-страницы. В течение 2004 года 101 человек "
+"внесли изменения в Проект документации FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:267
+msgid ""
+"Ports is the collection of meta-data that is needed to make software "
+"packages build correctly on FreeBSD. An example of a port is the port for "
+"the web-browser Mozilla. It contains information about where to fetch the "
+"source, what patches to apply and how, and how the package should be "
+"installed on the system. This allows automated tools to fetch, build and "
+"install the package. As of this writing, there are more than 12600 ports "
+"available. footnote:[Statistics are generated by counting the number of "
+"entries in the file fetched by portsdb by April 1st, 2005. portsdb is a part "
+"of the port sysutils/portupgrade.] , ranging from web servers to games, "
+"programming languages and most of the application types that are in use on "
+"modern computers. Ports will be discussed further in the section "
+"crossref:dev-model[sub-project-ports, The Ports Subproject]."
+msgstr ""
+"Порты — это коллекция метаданных, необходимых для корректной сборки "
+"программных пакетов в FreeBSD. Например, порт для веб-браузера Mozilla "
+"содержит информацию о том, откуда загружать исходный код, какие патчи "
+"применять и как, а также как пакет должен быть установлен в системе. Это "
+"позволяет автоматизированным инструментам загружать, собирать и "
+"устанавливать пакеты. На момент написания доступно более 12600 портов "
+"footnote:[Статистика получена подсчётом количества записей в файле, "
+"загруженном portsdb на 1 апреля 2005 года. portsdb является частью порта "
+"sysutils/portupgrade.], начиная от веб-серверов и игр до языков "
+"программирования и большинства типов приложений, используемых на современных "
+"компьютерах. Порты подробно рассматриваются в разделе crossref:dev-model[sub-"
+"project-ports, Подпроект Ports]."
+
+#. type: Title ==
+#: documentation/content/en/books/dev-model/_index.adoc:269
+#, no-wrap
+msgid "Methodology model"
+msgstr "Методологическая модель"
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:272
+#, no-wrap
+msgid "Development model"
+msgstr "Модель разработки"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:276
+msgid ""
+"There is no defined model for how people write code in FreeBSD. However, "
+"Niels Jørgenssen has suggested a model of how written code is integrated "
+"into the project."
+msgstr ""
+"Не существует определенной модели того, как люди пишут код в FreeBSD. Однако "
+"Нильс Йоргенссен предложил модель того, как написанный код интегрируется в "
+"проект."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:278
+#: documentation/content/en/books/dev-model/_index.adoc:877
+msgid "Jørgenssen's model for change integration"
+msgstr "Модель Йоргенссена для интеграции изменений"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:283
+#: documentation/content/en/books/dev-model/_index.adoc:882
+#, no-wrap
+msgid "Stage"
+msgstr "Этап"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:284
+#: documentation/content/en/books/dev-model/_index.adoc:883
+#, no-wrap
+msgid "Next if successful"
+msgstr "Следующий, если успешно"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:286
+#: documentation/content/en/books/dev-model/_index.adoc:885
+#, no-wrap
+msgid "Next if unsuccessful"
+msgstr "Следующий, если неудачно"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:287
+#: documentation/content/en/books/dev-model/_index.adoc:294
+#: documentation/content/en/books/dev-model/_index.adoc:298
+#: documentation/content/en/books/dev-model/_index.adoc:302
+#: documentation/content/en/books/dev-model/_index.adoc:306
+#: documentation/content/en/books/dev-model/_index.adoc:309
+#: documentation/content/en/books/dev-model/_index.adoc:886
+#: documentation/content/en/books/dev-model/_index.adoc:893
+#: documentation/content/en/books/dev-model/_index.adoc:897
+#: documentation/content/en/books/dev-model/_index.adoc:901
+#: documentation/content/en/books/dev-model/_index.adoc:905
+#: documentation/content/en/books/dev-model/_index.adoc:908
+#, no-wrap
+msgid "code"
+msgstr "программирование"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:288
+#: documentation/content/en/books/dev-model/_index.adoc:291
+#: documentation/content/en/books/dev-model/_index.adoc:887
+#: documentation/content/en/books/dev-model/_index.adoc:890
+#, no-wrap
+msgid "review"
+msgstr "рецензирование"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:292
+#: documentation/content/en/books/dev-model/_index.adoc:295
+#: documentation/content/en/books/dev-model/_index.adoc:891
+#: documentation/content/en/books/dev-model/_index.adoc:894
+#, no-wrap
+msgid "pre-commit test"
+msgstr "предварительная проверка перед коммитом"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:296
+#: documentation/content/en/books/dev-model/_index.adoc:299
+#: documentation/content/en/books/dev-model/_index.adoc:895
+#: documentation/content/en/books/dev-model/_index.adoc:898
+#, no-wrap
+msgid "development release"
+msgstr "релиз для разработки"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:300
+#: documentation/content/en/books/dev-model/_index.adoc:303
+#: documentation/content/en/books/dev-model/_index.adoc:899
+#: documentation/content/en/books/dev-model/_index.adoc:902
+#, no-wrap
+msgid "parallel debugging"
+msgstr "параллельная отладка"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:304
+#: documentation/content/en/books/dev-model/_index.adoc:307
+#: documentation/content/en/books/dev-model/_index.adoc:903
+#: documentation/content/en/books/dev-model/_index.adoc:906
+#, no-wrap
+msgid "production release"
+msgstr "релиз для производства"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:313
+msgid ""
+"The \"development release\" is the FreeBSD-CURRENT (\"-CURRENT\") branch and "
+"the \"production release\" is the FreeBSD-STABLE branch (\"-STABLE\") "
+"[crossref:dev-model[jorgensen2001, Jørgensen, 2001]]."
+msgstr ""
+"\"Релиз для разработки\" — это ветка FreeBSD-CURRENT (\"-CURRENT\"), а "
+"\"релиз для производства\" — ветка FreeBSD-STABLE (\"-STABLE\") "
+"[crossref:dev-model[jorgensen2001, Jørgensen, 2001]]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:319
+msgid ""
+"This is a model for one change, and shows that after coding, developers seek "
+"community review and try integrating it with their own systems. After "
+"integrating the change into the development release, called FreeBSD-CURRENT, "
+"it is tested by many users and developers in the FreeBSD community. After "
+"it has gone through enough testing, it is merged into the production "
+"release, called FreeBSD-STABLE. Unless each stage is finished successfully, "
+"the developer needs to go back and make modifications in the code and "
+"restart the process. To integrate a change with either -CURRENT or -STABLE "
+"is called making a commit."
+msgstr ""
+"Это модель для одного изменения, которая показывает, что после написания "
+"кода разработчики ищут рецензирование сообщества и пытаются интегрировать "
+"это изменение в свои собственные системы. После интеграции изменения в "
+"версию разработки, называемую FreeBSD-CURRENT, оно тестируется многими "
+"пользователями и разработчиками сообщества FreeBSD. После достаточного "
+"тестирования оно объединяется с производственной версией, называемой FreeBSD-"
+"STABLE. Если каждая стадия не завершена успешно, разработчику необходимо "
+"вернуться, внести изменения в код и перезапустить процесс. Интеграция "
+"изменения в -CURRENT или -STABLE называется выполнением коммита."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:322
+msgid ""
+"Jørgensen found that most FreeBSD developers work individually, meaning that "
+"this model is used in parallel by many developers on the different ongoing "
+"development efforts. A developer can also be working on multiple changes, "
+"so that while they are waiting for review or people to test one or more of "
+"their changes, they may be writing another change."
+msgstr ""
+"Йоргенсен обнаружил, что большинство разработчиков FreeBSD работают "
+"индивидуально, то есть эта модель используется параллельно многими "
+"разработчиками в различных текущих процессах разработки. Разработчик также "
+"может работать над несколькими изменениями одновременно, поэтому, ожидая "
+"рецензирования или тестирования одного или нескольких своих изменений, он "
+"может писать другое изменение."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:325
+msgid ""
+"As each commit represents an increment, this is a massively incremental "
+"model. The commits are in fact so frequent that during one year footnote:"
+"[The period from January 1st, 2004 to December 31st, 2004 was examined to "
+"find this number.] , 85427 commits were made, making a daily average of 233 "
+"commits."
+msgstr ""
+"Поскольку каждый коммит представляет собой инкрементальное изменение, это "
+"модель с очень высокой степенью инкрементальности. Коммиты происходят "
+"настолько часто, что за один год footnote:[Для получения этого числа был "
+"исследован период с 1 января 2004 года по 31 декабря 2004 года.], было "
+"сделано 85427 коммитов, что составляет в среднем 233 коммита в день."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:329
+msgid ""
+"Within the \"code\" bracket in Jørgensen's model, each programmer has their "
+"own working style and follows their own development models. The bracket "
+"could very well have been called \"development\" as it includes requirements "
+"gathering and analysis, system and detailed design, implementation and "
+"verification. However, the only output from these stages is the source code "
+"or system documentation."
+msgstr ""
+"В рамках \"программирования\" в модели Йоргенсена, каждый программист имеет "
+"свой собственный стиль работы и следует своим собственным моделям "
+"разработки. Этот этап вполне мог бы называться \"разработкой\", так как он "
+"включает сбор и анализ требований, системное и детальное проектирование, "
+"реализацию и проверку. Однако, единственным результатом этих подэтапов "
+"являются исходный код или документация системы."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:335
+msgid ""
+"From a stepwise model's perspective (such as the waterfall model), the other "
+"brackets can be seen as further verification and system integration. This "
+"system integration is also important to see if a change is accepted by the "
+"community. Up until the code is committed, the developer is free to choose "
+"how much to communicate about it to the rest of the project. In order for "
+"-CURRENT to work as a buffer (so that bright ideas that had some "
+"undiscovered drawbacks can be backed out) the minimum time a commit should "
+"be in -CURRENT before merging it to -STABLE is 3 days. Such a merge is "
+"referred to as an MFC (Merge From Current)."
+msgstr ""
+"С точки зрения пошаговой модели (такой как каскадная модель), остальные "
+"этапы можно рассматривать как дальнейшую проверку и интеграцию системы. Эта "
+"интеграция системы также важна для определения того, будет ли изменение "
+"принято сообществом. До момента фиксации кода разработчик волен выбирать, "
+"насколько активно он будет обсуждать его с остальными участниками проекта. "
+"Чтобы -CURRENT мог выполнять роль буфера (позволяя откатывать идеи, которые "
+"оказались с невыявленными недостатками), минимальный срок, в течение "
+"которого изменения должны оставаться в -CURRENT перед слиянием в -STABLE, "
+"составляет 3 дня. Такое слияние называется MFC (Merge From Current)."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:338
+msgid ""
+"It is important to notice the word \"change\". Most commits do not contain "
+"radical new features, but are maintenance updates."
+msgstr ""
+"Важно обратить внимание на слово \"изменение\". Большинство коммитов не "
+"содержат радикально новых функций, а представляют собой обновления для "
+"поддержки."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:341
+msgid ""
+"The only exceptions from this model are security fixes and changes to "
+"features that are deprecated in the -CURRENT branch. In these cases, "
+"changes can be committed directly to the -STABLE branch."
+msgstr ""
+"Единственными исключениями из этой модели являются исправления безопасности "
+"и изменения в функциях, объявленных устаревшими в ветке -CURRENT. В этих "
+"случаях изменения могут быть внесены напрямую в ветку -STABLE."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:346
+msgid ""
+"In addition to many people working on the project, there are many related "
+"projects to the FreeBSD Project. These are either projects developing brand "
+"new features, sub-projects or projects whose outcome is incorporated into "
+"FreeBSD footnote:[For instance, the development of the Bluetooth stack "
+"started as a sub-project until it was deemed stable enough to be merged into "
+"the -CURRENT branch. Now it is a part of the core FreeBSD system.]. These "
+"projects fit into the FreeBSD Project just like regular development efforts: "
+"they produce code that is integrated with the FreeBSD Project. However, "
+"some of them (like Ports and Documentation) have the privilege of being "
+"applicable to both branches or commit directly to both -CURRENT and -STABLE."
+msgstr ""
+"В дополнение к множеству людей, работающих над проектом, существует "
+"множество связанных проектов в рамках FreeBSD. Это могут быть проекты, "
+"разрабатывающие совершенно новые функции, подпроекты или проекты, результаты "
+"которых интегрируются в FreeBSD footnote:[Например, разработка стека "
+"Bluetooth начиналась как подпроект, пока не была признана достаточно "
+"стабильной для включения в ветку -CURRENT. Теперь это часть основной системы "
+"FreeBSD.]. Эти проекты вписываются в FreeBSD так же, как и обычные "
+"разработки: они создают код, который интегрируется с проектом FreeBSD. "
+"Однако некоторые из них (например, Ports и Documentation) имеют привилегию "
+"применяться к обеим веткам или коммитить напрямую как в -CURRENT, так и в "
+"-STABLE."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:353
+msgid ""
+"There is no standards to how design should be done, nor is design collected "
+"in a centralised repository. The main design is that of 4.4BSD. footnote:"
+"[According to Kirk McKusick, after 20 years of developing UNIX operating "
+"systems, the interfaces are for the most part figured out. There is "
+"therefore no need for much design. However, new applications of the system "
+"and new hardware leads to some implementations being more beneficial than "
+"those that used to be preferred. One example is the introduction of web "
+"browsing that made the normal TCP/IP connection a short burst of data rather "
+"than a steady stream over a longer period of time.] As design is a part of "
+"the \"Code\" bracket in Jørgenssen's model, it is up to every developer or "
+"sub-project how this should be done. Even if the design should be stored in "
+"a central repository, the output from the design stages would be of limited "
+"use as the differences of methodologies would make them poorly if at all "
+"interoperable. For the overall design of the project, the project relies on "
+"the sub-projects to negotiate fit interfaces between each other rather than "
+"to dictate interfacing."
+msgstr ""
+"Не существует стандартов по выполнению проектирования, также как и "
+"централизованного репозитория для хранения проектов. Основной дизайн взят из "
+"4.4BSD. footnote:[По словам Кирка Маккузика, после 20 лет разработки "
+"операционных систем UNIX, интерфейсы в основном уже определены. Поэтому нет "
+"необходимости в большом количестве проектирования. Однако новые применения "
+"системы и новое оборудование приводят к тому, что некоторые реализации "
+"становятся более выгодными по сравнению с ранее предпочитаемыми. Одним из "
+"примеров является появление веб-браузинга, который превратил обычное TCP/IP-"
+"соединение в короткие всплески данных, а не в устойчивый поток за более "
+"длительный период времени.] Поскольку проектирование является частью этапа "
+"\"Программирование\" в модели Йоргенсена, каждый разработчик или подпроект "
+"сам решает, как это должно выполняться. Даже если проектирование должно "
+"храниться в централизованном репозитории, результаты этапов проектирования "
+"будут иметь ограниченную полезность, так как различия в методологиях сделают "
+"их плохо совместимыми, если вообще совместимыми. Для общего проектирования "
+"проекта, проект полагается на подпроекты, которые договариваются о "
+"совместимых интерфейсах между собой, а не на диктат интерфейсов."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:355
+#, no-wrap
+msgid "Release branches"
+msgstr "Ветви релизов"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:359
+msgid ""
+"The releases of FreeBSD are best illustrated by a tree with many branches "
+"where each major branch represents a major version. Minor versions are "
+"represented by branches of the major branches."
+msgstr ""
+"Версии FreeBSD лучше всего иллюстрируются деревом с множеством ветвей, где "
+"каждая основная ветвь представляет основную версию. Минорные версии "
+"представлены ветвями основных ветвей."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:366
+msgid ""
+"In the following release tree, arrows that follow one-another in a "
+"particular direction represent a branch. Boxes with full lines and diamonds "
+"represent official releases. Boxes with dotted lines represent the "
+"development branch at that time. Security branches are represented by "
+"ovals. Diamonds differ from boxes in that they represent a fork, meaning a "
+"place where a branch splits into two branches where one of the branches "
+"becomes a sub-branch. For example, at 4.0-RELEASE the 4.0-CURRENT branch "
+"split into 4-STABLE and 5.0-CURRENT. At 4.5-RELEASE, the branch forked off a "
+"security branch called RELENG_4_5."
+msgstr ""
+"В следующем дереве релизов стрелки, следующие друг за другом в определенном "
+"направлении, представляют ветку. Прямоугольники со сплошными линиями и ромбы "
+"обозначают официальные релизы. Прямоугольники с пунктирными линиями "
+"представляют ветку разработки на тот момент. Ветки безопасности обозначены "
+"овалами. Ромбы отличаются от прямоугольников тем, что они представляют "
+"развилку, то есть место, где ветка разделяется на две ветки, одна из которых "
+"становится подветкой. Например, на 4.0-RELEASE ветка 4.0-CURRENT разделилась "
+"на 4-STABLE и 5.0-CURRENT. На 4.5-RELEASE ветка разветвилась на ветку "
+"безопасности под названием RELENG_4_5."
+
+#. type: Block title
+#: documentation/content/en/books/dev-model/_index.adoc:367
+#, no-wrap
+msgid "The FreeBSD release tree"
+msgstr "Дерево релизов FreeBSD"
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/dev-model/_index.adoc:368
+#, no-wrap
+msgid "Refer to table below for a screen-reader friendly version."
+msgstr "Обратитесь к таблице ниже для удобной версии для экранных дикторов."
+
+#. type: Target for macro image
+#: documentation/content/en/books/dev-model/_index.adoc:368
+#, no-wrap
+msgid "branches.png"
+msgstr "branches.png"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:374
+#, no-wrap
+msgid "Major release"
+msgstr "Основные выпуски"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:375
+#, no-wrap
+msgid "Forked from"
+msgstr "Форкнут из"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:377
+#, no-wrap
+msgid "Following minor releases"
+msgstr "Следующие минорные выпуски"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:378
+#: documentation/content/en/books/dev-model/_index.adoc:398
+#, no-wrap
+msgid "..."
+msgstr "..."
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:382
+#, no-wrap
+msgid "3.0 Current (development branch)"
+msgstr "3.0 Current (ветка разработки)"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:385
+#, no-wrap
+msgid "Releng 3 branches: 3.0 Release to 3.5 Release, leading to 3.5.1 Release and the subsequent 3 Stable branch"
+msgstr "Ветки Releng 3: выпуски с 3.0 Release по 3.5 Release, ведущие к выпуску 3.5.1 Release и последующей ветке 3 Stable"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:386
+#, no-wrap
+msgid "4.0 Current (development branch)"
+msgstr "4.0 Current (ветка разработки)"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:387
+#, no-wrap
+msgid "3.1 Release"
+msgstr "Релиз 3.1"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:389
+#, no-wrap
+msgid "Releng 4 branches: 4.1 Release to 4.6 Release (and 4.6.2 Release), then 4.7 Release to 4.11 Release (all starting at 4.3 Release also leading to a Releng_4_n branch), and the subsequent 4 Release branch"
+msgstr "Ветви Releng 4: релизы с 4.1 по 4.6 (и релиз 4.6.2), затем релизы с 4.7 по 4.11 (все, начиная с релиза 4.3, также ведущие к ветви Releng_4_n), и последующая ветвь релиза 4"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:390
+#, no-wrap
+msgid "5.0 Current (development branch)"
+msgstr "5.0 Current (ветка разработки)"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:391
+#, no-wrap
+msgid "4.0 Release"
+msgstr "Релиз 4.0"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:393
+#, no-wrap
+msgid "Releng 5 branches: 5.0 Release to 5.4 Release (all except 5.0 and 5.3 also leading to a Releng_5_n branch), and the subsequent 5 Release branch"
+msgstr "Ветви Releng 5: Релизы с 5.0 до 5.4 (за исключением 5.0 и 5.3, которые также ведут к ветке Releng_5_n), и последующая ветка релиза 5"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:394
+#, no-wrap
+msgid "6.0 Current (development branch)"
+msgstr "6.0 Current (ветка разработки)"
+
+#. type: Table
+#: documentation/content/en/books/dev-model/_index.adoc:395
+#, no-wrap
+msgid "5.3 Release"
+msgstr "Релиз 5.3"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:405
+msgid ""
+"The latest -CURRENT version is always referred to as -CURRENT, while the "
+"latest -STABLE release is always referred to as -STABLE. In this figure, "
+"-STABLE refers to 4-STABLE while -CURRENT refers to 5.0-CURRENT following "
+"5.0-RELEASE. [crossref:dev-model[freebsd-releng, FreeBSD, 2002E]]"
+msgstr ""
+"Последняя версия -CURRENT всегда обозначается как -CURRENT, а последний "
+"релиз -STABLE всегда обозначается как -STABLE. На этом рисунке -STABLE "
+"относится к 4-STABLE, а -CURRENT относится к 5.0-CURRENT после 5.0-RELEASE. "
+"[crossref:dev-model[freebsd-releng, FreeBSD, 2002E]]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:412
+msgid ""
+"A \"major release\" is always made from the -CURRENT branch. However, the "
+"-CURRENT branch does not need to fork at that point in time, but can focus "
+"on stabilising. An example of this is that following 3.0-RELEASE, 3.1-"
+"RELEASE was also a continuation of the -CURRENT-branch, and -CURRENT did not "
+"become a true development branch until this version was released and the 3-"
+"STABLE branch was forked. When -CURRENT returns to becoming a development "
+"branch, it can only be followed by a major release. 5-STABLE is predicted "
+"to be forked off 5.0-CURRENT at around 5.3-RELEASE. It is not until 5-"
+"STABLE is forked that the development branch will be branded 6.0-CURRENT."
+msgstr ""
+"«Основной выпуск» всегда создаётся из ветки -CURRENT. Однако ветка -CURRENT "
+"не обязательно должна разветвляться в этот момент, а может сосредоточиться "
+"на стабилизации. Примером этого является то, что после 3.0-RELEASE, 3.1-"
+"RELEASE также был продолжением ветки -CURRENT, и -CURRENT не стал настоящей "
+"веткой разработки до тех пор, пока не был выпущен этот релиз и не была "
+"создана ветка 3-STABLE. Когда -CURRENT снова становится веткой разработки, "
+"за ним может следовать только основной выпуск. Ожидается, что ветка 5-STABLE "
+"будет отделена от 5.0-CURRENT примерно на момент выпуска 5.3-RELEASE. Только "
+"после отделения 5-STABLE ветка разработки получит название 6.0-CURRENT."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:414
+msgid ""
+"A \"minor release\" is made from the -CURRENT branch following a major "
+"release, or from the -STABLE branch."
+msgstr ""
+"\"Минорный релиз\" создается из ветки -CURRENT после основного релиза или из "
+"ветки -STABLE."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:417
+msgid ""
+"Following and including, 4.3-RELEASEfootnote:[The first release this "
+"actually happened for was 4.5-RELEASE, but security branches were at the "
+"same time created for 4.3-RELEASE and 4.4-RELEASE.], when a minor release "
+"has been made, it becomes a \"security branch\". This is meant for "
+"organisations that do not want to follow the -STABLE branch and the "
+"potential new/changed features it offers, but instead require an absolutely "
+"stable environment, only updating to implement security updates. footnote:"
+"[There is a terminology overlap with respect to the word \"stable\", which "
+"leads to some confusion. The -STABLE branch is still a development branch, "
+"whose goal is to be useful for most people. If it is never acceptable for a "
+"system to get changes that are not announced at the time it is deployed, "
+"that system should run a security branch.]"
+msgstr ""
+"Начиная с версии 4.3-RELEASE footnote:[Первым релизом, для которого это "
+"действительно произошло, был 4.5-RELEASE, но ветки безопасности были созданы "
+"одновременно для 4.3-RELEASE и 4.4-RELEASE.], когда выпускается минорный "
+"релиз, он становится «веткой безопасности». Это предназначено для "
+"организаций, которые не хотят следовать ветке -STABLE и потенциальным новым/"
+"изменённым функциям, которые она предлагает, но вместо этого требуют "
+"абсолютно стабильной среды, обновляемой только для внедрения исправлений "
+"безопасности. footnote:[Здесь вы видите терминологическое пересечение со "
+"словом «стабильный», что приводит к некоторой путанице. Ветка -STABLE по-"
+"прежнему является веткой разработки, цель которой — быть полезной для "
+"большинства пользователей. Если для системы неприемлемо получать изменения, "
+"которые не были объявлены на момент её развёртывания, такая система должна "
+"работать на ветке безопасности.]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:422
+msgid ""
+"Each update to a security branch is called a \"patchlevel\". For every "
+"security enhancement that is done, the patchlevel number is increased, "
+"making it easy for people tracking the branch to see what security "
+"enhancements they have implemented. In cases where there have been "
+"especially serious security flaws, an entire new release can be made from a "
+"security branch. An example of this is 4.6.2-RELEASE."
+msgstr ""
+"Каждое обновление в ветке безопасности называется \"уровнем исправления\" "
+"(patchlevel). Для каждого выполненного улучшения безопасности номер уровня "
+"исправления увеличивается, что позволяет легко отслеживать, какие улучшения "
+"безопасности были реализованы. В случаях особенно серьезных уязвимостей "
+"безопасности может быть выпущен полностью новый релиз из ветки безопасности. "
+"Примером этого является 4.6.2-RELEASE."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:424
+#, no-wrap
+msgid "Model summary"
+msgstr "Сводка модели"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:427
+msgid ""
+"To summarise, the development model of FreeBSD can be seen as the following "
+"tree:"
+msgstr ""
+"Для подведения итогов, модель разработки FreeBSD можно представить в виде "
+"следующего дерева:"
+
+#. type: Block title
+#: documentation/content/en/books/dev-model/_index.adoc:428
+#, no-wrap
+msgid "The overall development model"
+msgstr "Общая модель разработки"
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/dev-model/_index.adoc:429
+#: documentation/content/en/books/dev-model/_index.adoc:1109
+#, no-wrap
+msgid "Refer to paragraphs below for a screen-reader friendly version."
+msgstr "Обратитесь к параграфам ниже для версии, удобной для экранных дикторов."
+
+#. type: Target for macro image
+#: documentation/content/en/books/dev-model/_index.adoc:429
+#, no-wrap
+msgid "freebsd-code-model.png"
+msgstr "freebsd-code-model.png"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:432
+msgid ""
+"The tree of the FreeBSD development with ongoing development efforts and "
+"continuous integration."
+msgstr ""
+"Дерево разработки FreeBSD с текущими усилиями по разработке и непрерывной "
+"интеграцией."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:436
+msgid ""
+"The tree symbolises the release versions with major versions spawning new "
+"main branches and minor versions being versions of the main branch. The top "
+"branch is the -CURRENT branch where all new development is integrated, and "
+"the -STABLE branch is the branch directly below it. Below the -STABLE "
+"branch are old, unsupported versions."
+msgstr ""
+"Дерево символизирует версии выпусков, где основные версии порождают новые "
+"главные ветви, а второстепенные версии являются версиями главной ветви. "
+"Верхняя ветвь — это ветвь -CURRENT, в которую интегрируется вся новая "
+"разработка, а ветвь -STABLE находится непосредственно под ней. Под ветвью "
+"-STABLE находятся старые, неподдерживаемые версии."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:440
+msgid ""
+"Clouds of development efforts hang over the project where developers use the "
+"development models they see fit. The product of their work is then "
+"integrated into -CURRENT where it undergoes parallel debugging and is "
+"finally merged from -CURRENT into -STABLE. Security fixes are merged from "
+"-STABLE to the security branches."
+msgstr ""
+"Проект находится в тумане постоянной разработки, и разработчики выбирают "
+"модели разработки, которые считают подходящими. Результаты их работы затем "
+"интегрируются в -CURRENT, где проходят параллельную отладку, и наконец "
+"объединяются из -CURRENT в -STABLE. Исправления безопасности объединяются из "
+"-STABLE в ветки безопасности."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:447
+msgid ""
+"Many committers have a special area of responsibility. These roles are "
+"called hats. These hats can be either project roles, such as public "
+"relations officer, or maintainer for a certain area of the code. Because "
+"this is a project where people give voluntarily of their spare time, people "
+"with assigned hats are not always available. They must therefore appoint a "
+"deputy that can perform the hat's role in their absence. The other option "
+"is to have the role held by a group."
+msgstr ""
+"Многие коммиттеры имеют специальную область ответственности. Эти роли "
+"называются \"hats\" (шляпами). Эти роли могут быть либо проектными ролями, "
+"например, офицер по связям с общественностью, либо сопровождающим "
+"определённой части кода. Поскольку это проект, где люди добровольно уделяют "
+"своё свободное время, люди с назначенными ролями не всегда доступны. Поэтому "
+"они должны назначить заместителя, который может выполнять эту роль в их "
+"отсутствие. Другой вариант — передать роль группе."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:452
+msgid ""
+"Many of these hats are not formalised. Formalised hats have a charter "
+"stating the exact purpose of the hat along with its privileges and "
+"responsibilities. The writing of such charters is a new part of the "
+"project, and has thus yet to be completed for all hats. These hat "
+"descriptions are not such a formalisation, rather a summary of the role with "
+"links to the charter where available and contact addresses."
+msgstr ""
+"Многие из этих ролей не формализованы. Формализованные роли имеют устав, в "
+"котором указаны точные цели, привилегии и обязанности. Написание таких "
+"уставов — новая часть проекта, поэтому оно ещё не завершено для всех ролей. "
+"Эти описания ролей не являются формализацией, а скорее представляют собой "
+"краткое описание роли со ссылками на устав, где он доступен, и контактными "
+"адресами."
+
+#. type: Title ==
+#: documentation/content/en/books/dev-model/_index.adoc:454
+#, no-wrap
+msgid "Hats"
+msgstr "Ответственные"
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:457
+#, no-wrap
+msgid "General Hats"
+msgstr "Стандартные роли"
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:460
+#, no-wrap
+msgid "Contributor"
+msgstr "Участник (контрибьютор)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:465
+msgid ""
+"A Contributor contributes to the FreeBSD project either as a developer, as "
+"an author, by sending problem reports, or in other ways contributing to the "
+"progress of the project. A contributor has no special privileges in the "
+"FreeBSD project. [crossref:dev-model[freebsd-contributors, FreeBSD, 2002F]]"
+msgstr ""
+"Участник вносит вклад в проект FreeBSD в качестве разработчика, автора, "
+"отправляя отчеты о проблемах или другими способами способствуя прогрессу "
+"проекта. Участник не имеет особых привилегий в проекте FreeBSD. "
+"[crossref:dev-model[freebsd-contributors, FreeBSD, 2002F]]"
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:467
+#, no-wrap
+msgid "Committer"
+msgstr "Коммиттер"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:472
+msgid ""
+"A person who has the required privileges to add their code or documentation "
+"to the repository. A committer has made a commit within the past 12 "
+"months. [crossref:dev-model[freebsd-developer-handbook, FreeBSD, 2000A]] An "
+"active committer is a committer who has made an average of one commit per "
+"month during that time."
+msgstr ""
+"Человек, обладающий необходимыми привилегиями для добавления своего кода или "
+"документации в репозиторий. Коммиттер совершил коммит в течение последних 12 "
+"месяцев. [crossref:dev-model[freebsd-developer-handbook, FreeBSD, 2000A]] "
+"Активный коммиттер — это коммиттер, который в среднем совершал один коммит в "
+"месяц в течение этого времени."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:475
+msgid ""
+"It is worth noting that there are no technical barriers to prevent someone, "
+"once having gained commit privileges to the main- or a sub-project, to make "
+"commits in parts of that project's source the committer did not specifically "
+"get permission to modify. However, when wanting to make modifications to "
+"parts a committer has not been involved in before, they should read the logs "
+"to see what has happened in this area before, and also read the MAINTAINERS "
+"file to see if the maintainer of this part has any special requests on how "
+"changes in the code should be made."
+msgstr ""
+"Стоит отметить, что нет технических препятствий, которые могли бы помешать "
+"кому-либо, получившему права на коммиты в основном или подпроекте, делать "
+"коммиты в частях исходного кода проекта, для которых у коммиттера нет явного "
+"разрешения на изменение. Однако, при желании внести изменения в части, с "
+"которыми коммиттер ранее не работал, следует изучить логи, чтобы понять, что "
+"происходило в этой области ранее, а также прочитать файл MAINTAINERS, чтобы "
+"узнать, есть ли у сопровождающего этой части какие-либо особые требования к "
+"внесению изменений в код."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:477
+#, no-wrap
+msgid "Core Team"
+msgstr "Основная команда (Core Team)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:483
+msgid ""
+"The core team is elected by the committers from the pool of committers and "
+"serves as the board of directors of the FreeBSD project. It promotes active "
+"contributors to committers, assigns people to well-defined hats, and is the "
+"final arbiter of decisions involving which way the project should be "
+"heading. As of July 1st, 2004, core consisted of 9 members. Elections are "
+"held every two years."
+msgstr ""
+"Основная команда избирается коммиттерами из числа коммиттеров и выполняет "
+"функции совета директоров проекта FreeBSD. Она повышает активных участников "
+"до коммиттеров, назначает людей на четко определенные роли (hats) и является "
+"окончательным арбитром при принятии решений о направлении развития проекта. "
+"На 1 июля 2004 года в состав основной команды входило 9 членов. Выборы "
+"проводятся каждые два года."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:485
+#, no-wrap
+msgid "Maintainership"
+msgstr "Сопровождение"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:489
+msgid ""
+"Maintainership means that the person is responsible for what is allowed to "
+"go into that area of the code and has the final say should disagreements "
+"over the code occur. This involves proactive work aimed at stimulating "
+"contributions and reactive work in reviewing commits."
+msgstr ""
+"Сопровождение означает, что человек ответственен за то, что допускается в "
+"определённую часть кода, и имеет решающее слово в случае разногласий по "
+"поводу кода. Это включает в себя как активную работу, направленную на "
+"стимулирование участников (контрибьюторов), так и реактивную работу по "
+"рецензированию коммитов."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:492
+msgid ""
+"With the FreeBSD source comes the MAINTAINERS file that contains a one-line "
+"summary of how each maintainer would like contributions to be made. Having "
+"this notice and contact information enables developers to focus on the "
+"development effort rather than being stuck in a slow correspondence should "
+"the maintainer be unavailable for some time."
+msgstr ""
+"В исходном коде FreeBSD есть файл MAINTAINERS, содержащий краткое описание "
+"того, как каждый сопровождающий предпочитает получать вклады. Наличие этого "
+"уведомления и контактной информации позволяет разработчикам сосредоточиться "
+"на разработке, а не застревать в медленной переписке, если сопровождающий "
+"будет недоступен в течение некоторого времени."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:495
+msgid ""
+"If the maintainer is unavailable for an unreasonably long period of time, "
+"and other people do a significant amount of work, maintainership may be "
+"switched without the maintainer's approval. This is based on the stance "
+"that maintainership should be demonstrated, not declared."
+msgstr ""
+"Если сопровождающий недоступен в течение неоправданно долгого времени, и "
+"другие люди выполняют значительный объем работы, сопровождение может быть "
+"передано без согласия сопровождающего. Это основано на позиции, что "
+"сопровождение должно быть продемонстрировано, а не заявлено."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:497
+msgid ""
+"Maintainership of a particular piece of code is a hat that is not held as a "
+"group."
+msgstr ""
+"Сопровождение определенного участка кода — это роль, которая не "
+"осуществляется коллективно."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:499
+#, no-wrap
+msgid "Official Hats"
+msgstr "Официальные Роли"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:504
+msgid ""
+"The official hats in the FreeBSD Project are hats that are more or less "
+"formalised and mainly administrative roles. They have the authority and "
+"responsibility for their area. The following list shows the responsibility "
+"lines and gives a description of each hat, including who it is held by."
+msgstr ""
+"Официальные роли в проекте FreeBSD — это более или менее формализованные и в "
+"основном административные должности. Они обладают полномочиями и "
+"ответственностью в своей области. В следующем списке показаны направления "
+"ответственности и дано описание каждой роли, включая информацию о том, кто "
+"её занимает."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:506
+#, no-wrap
+msgid "Documentation project manager"
+msgstr "Менеджер проекта документации"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:509
+msgid ""
+"crossref:dev-model[sub-project-documentation, The FreeBSD Documentation "
+"Project] architect is responsible for defining and following up "
+"documentation goals for the committers in the Documentation project, which "
+"they supervise."
+msgstr ""
+"Архитектор crossref:dev-model[sub-project-documentation, Проекта "
+"документации FreeBSD] отвечает за определение и контроль целей документации "
+"для коммиттеров в проекте Документации, за которым они присматривают."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:512
+msgid ""
+"Hat held by: The DocEng team mailto:doceng@FreeBSD.org[doceng@FreeBSD.org]. "
+"The https://www.freebsd.org/internal/doceng/[ DocEng Charter]."
+msgstr ""
+"Роль поддерживается: Командой DocEng "
+"mailto:doceng@FreeBSD.org[doceng@FreeBSD.org]. https://www.freebsd.org/"
+"internal/doceng/[Устав DocEng]."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:514
+#, no-wrap
+msgid "Postmaster"
+msgstr "Postmaster"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:518
+msgid ""
+"The Postmaster is responsible for mail being correctly delivered to the "
+"committers' email address. They are also responsible for ensuring that the "
+"mailing lists work and should take measures against possible disruptions of "
+"mail such as having troll-, spam- and virus-filters."
+msgstr ""
+"Postmaster отвечает за корректную доставку почты на адреса электронной почты "
+"коммиттеров. Также он отвечает за работоспособность почтовых рассылок и "
+"должен принимать меры против возможных сбоев в работе почты, таких как "
+"троллинг-, спам- и вирус-фильтры."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:520
+msgid ""
+"Hat currently held by: the Postmaster Team "
+"mailto:postmaster@FreeBSD.org[postmaster@FreeBSD.org]."
+msgstr ""
+"Текущий руководитель: Команда почтовых серверов "
+"mailto:postmaster@FreeBSD.org[postmaster@FreeBSD.org]."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:522
+#, no-wrap
+msgid "Release Coordination"
+msgstr "Координация выпусков"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:525
+msgid "The responsibilities of the Release Engineering Team are"
+msgstr "Обязанности команды выпуска релизов включают"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:527
+msgid ""
+"Setting, publishing and following a release schedule for official releases"
+msgstr "Установка, публикация и соблюдение графика выпуска официальных релизов"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:528
+msgid "Documenting and formalising release engineering procedures"
+msgstr "Документирование и формализация процедур выпуска релизов"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:529
+msgid "Creation and maintenance of code branches"
+msgstr "Создание и поддержка веток кода"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:530
+msgid ""
+"Coordinating with the Ports and Documentation teams to have an updated set "
+"of packages and documentation released with the new releases"
+msgstr ""
+"Согласование с командами Ports и Documentation для выпуска обновленного "
+"набора пакетов и документации вместе с новыми релизами"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:531
+msgid ""
+"Coordinating with the Security team so that pending releases are not "
+"affected by recently disclosed vulnerabilities."
+msgstr ""
+"Координация с командой безопасности для того, чтобы готовящиеся выпуски не "
+"были затронуты недавно обнаруженными уязвимостями."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:534
+msgid ""
+"Further information about the development process is available in the "
+"crossref:dev-model[process-release-engineering, Release engineering] section."
+msgstr ""
+"Дополнительная информация о процессе разработки доступна в разделе "
+"crossref:dev-model[process-release-engineering, Выпуск релизов]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:538
+msgid ""
+"Hat held by: the Release Engineering team "
+"mailto:re@FreeBSD.org[re@FreeBSD.org]. The https://www.freebsd.org/releng/"
+"charter/[ Release Engineering Charter]."
+msgstr ""
+"Роль поддерживается: командой выпуск релизов (Release Engineering) "
+"mailto:re@FreeBSD.org[re@FreeBSD.org]. https://www.freebsd.org/releng/"
+"charter/[ Устав Release Engineering]."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:540
+#, no-wrap
+msgid "Public Relations & Corporate Liaison"
+msgstr "Отношения с общественностью и корпоративные связи"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:543
+msgid "The Public Relations & Corporate Liaison's responsibilities are:"
+msgstr ""
+"Обязанности отдела по связям с общественностью и корпоративным отношениям "
+"включают:"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:545
+msgid ""
+"Making press statements when happenings that are important to the FreeBSD "
+"Project happen."
+msgstr ""
+"Публиковать пресс-релизы при возникновении событий, важных для проекта "
+"FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:546
+msgid ""
+"Being the official contact person for corporations that are working close "
+"with the FreeBSD Project."
+msgstr ""
+"Быть официальным контактным лицом для корпораций, тесно сотрудничающих с "
+"проектом FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:547
+msgid ""
+"Take steps to promote FreeBSD within both the Open Source community and the "
+"corporate world."
+msgstr ""
+"Принимать меры для продвижения FreeBSD как в сообществе Open Source, так и в "
+"корпоративном мире."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:548
+msgid "Handle the \"freebsd-advocacy\" mailing list."
+msgstr "Обрабатывать список рассылки \"freebsd-advocacy\"."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:550
+msgid "This hat is currently not occupied."
+msgstr "Эта роль в настоящее время не занята."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:552
+#, no-wrap
+msgid "Security Officer"
+msgstr "Ответственный за безопасность (Security Officer)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:556
+msgid ""
+"The Security Officer's main responsibility is to coordinate information "
+"exchange with others in the security community and in the FreeBSD project. "
+"The Security Officer is also responsible for taking action when security "
+"problems are reported and promoting proactive development behavior when it "
+"comes to security."
+msgstr ""
+"Основная обязанность Ответственного за безопасность — координировать обмен "
+"информацией с сообществом безопасности и проектом FreeBSD. Ответственный за "
+"безопасность также принимает меры при поступлении сообщений о проблемах "
+"безопасности и способствует активному развитию в области безопасности."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:562
+msgid ""
+"Because of the fear that information about vulnerabilities may leak out to "
+"people with malicious intent before a patch is available, only the Security "
+"Officer, consisting of an officer, a deputy and two crossref:dev-model[role-"
+"core, Core Team] members, receive sensitive information about security "
+"issues. However, to create or implement a patch, the Security Officer has "
+"the Security Officer Team mailto:security-team@FreeBSD.org[security-"
+"team@FreeBSD.org] to help do the work."
+msgstr ""
+"Из-за опасений, что информация об уязвимостях может попасть к "
+"злоумышленникам до выпуска исправления, только Ответственный за "
+"безопасность, включающий руководителя, заместителя и двух членов "
+"crossref:dev-model[role-core, Core Team], получает конфиденциальную "
+"информацию о проблемах безопасности. Однако для создания или внедрения "
+"исправления Ответственный за безопасность может обратиться к команде "
+"mailto:security-team@FreeBSD.org[security-team@FreeBSD.org] для помощи в "
+"выполнении работы."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:564
+#, no-wrap
+msgid "Source Repository Manager"
+msgstr "Менеджер репозитория исходного кода"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:570
+msgid ""
+"The Source Repository Manager is the only one who is allowed to directly "
+"modify the repository without using the crossref:dev-model[tool-git, Git] "
+"tool. It is their responsibility to ensure that technical problems that "
+"arise in the repository are resolved quickly. The source repository manager "
+"has the authority to back out commits if this is necessary to resolve a Git "
+"technical problem."
+msgstr ""
+"Менеджер репозитория исходного кода — единственный, кому разрешено напрямую "
+"изменять репозиторий без использования инструмента crossref:dev-model[tool-"
+"git, Git]. В его обязанности входит оперативное решение технических проблем, "
+"возникающих в репозитории. Менеджер репозитория исходного кода имеет право "
+"отменять коммиты, если это необходимо для устранения технических проблем с "
+"Git."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:572
+msgid ""
+"Hat held by: the Source Repository Manager "
+"mailto:clusteradm@FreeBSD.org[clusteradm@FreeBSD.org]."
+msgstr ""
+"Роль принадлежит: Менеджеру репозитория исходного кода "
+"mailto:clusteradm@FreeBSD.org[clusteradm@FreeBSD.org]."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:574
+#, no-wrap
+msgid "Election Manager"
+msgstr "Менеджер выборов"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:581
+msgid ""
+"The Election Manager is responsible for the crossref:dev-model[process-core-"
+"election, Core election] process. The manager is responsible for running "
+"and maintaining the election system, and is the final authority should minor "
+"unforeseen events happen in the election process. Major unforeseen events "
+"have to be discussed with the crossref:dev-model[role-core, Core Team]"
+msgstr ""
+"Менеджер выборов отвечает за процесс crossref:dev-model[process-core-"
+"election,выборов Core Team]. Он отвечает за проведение и поддержание системы "
+"выборов, а также является окончательной инстанцией в случае незначительных "
+"непредвиденных событий в процессе выборов. Крупные непредвиденные события "
+"должны обсуждаться с crossref:dev-model[role-core,Core Team]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:583
+msgid "Hat held only during elections."
+msgstr "Роль выполняется только во время выборов."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:585
+#, no-wrap
+msgid "Web site Management"
+msgstr "Управление веб-сайтом"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:590
+msgid ""
+"The Web site Management hat is responsible for coordinating the rollout of "
+"updated web pages on mirrors around the world, for the overall structure of "
+"the primary web site and the system it is running upon. The management "
+"needs to coordinate the content with crossref:dev-model[sub-project-"
+"documentation, The FreeBSD Documentation Project] and acts as maintainer for "
+"the \"www\" tree."
+msgstr ""
+"Роль управления веб-сайтом отвечает за координацию развертывания обновленных "
+"веб-страниц на зеркалах по всему миру, за общую структуру основного веб-"
+"сайта и систему, на которой он работает. Управление должно согласовывать "
+"содержимое с crossref:dev-model[документацией подпроекта, Документационный "
+"проект FreeBSD] и выступает в роли сопровождающего для дерева \"www\"."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:592
+msgid ""
+"Hat held by: the FreeBSD Webmasters mailto:www@FreeBSD.org[www@FreeBSD.org]."
+msgstr ""
+"Роль поддерживается: веб-мастеры FreeBSD "
+"mailto:www@FreeBSD.org[www@FreeBSD.org]."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:594
+#, no-wrap
+msgid "Ports Manager"
+msgstr "Менеджер портов"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:597
+msgid ""
+"The Ports Manager acts as a liaison between crossref:dev-model[sub-project-"
+"ports, The Ports Subproject] and the core project, and all requests from the "
+"project should go to the ports manager."
+msgstr ""
+"Менеджер портов выступает в роли связующего звена между crossref:dev-"
+"model[sub-project-ports, Подпроектом портов] и основным проектом, и все "
+"запросы от проекта должны направляться менеджеру портов."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:600
+msgid ""
+"Hat held by: the Ports Management Team "
+"mailto:portmgr@FreeBSD.org[portmgr@FreeBSD.org]. The https://"
+"www.freebsd.org/portmgr/charter/[Portmgr charter]."
+msgstr ""
+"Роль принадлежит: Команде управления портами "
+"mailto:portmgr@FreeBSD.org[portmgr@FreeBSD.org]. https://www.freebsd.org/"
+"portmgr/charter/[Устав Portmgr]."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:602
+#, no-wrap
+msgid "Standards"
+msgstr "Стандарты"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:605
+msgid ""
+"The Standards hat is responsible for ensuring that FreeBSD complies with the "
+"standards it is committed to , keeping up to date on the development of "
+"these standards and notifying FreeBSD developers of important changes that "
+"allows them to take a proactive role and decrease the time between a "
+"standards update and FreeBSD's compliancy."
+msgstr ""
+"Роль стандартов отвечает за обеспечение соответствия FreeBSD стандартам, "
+"которым система следует, отслеживает развитие этих стандартов и уведомляет "
+"разработчиков FreeBSD о важных изменениях. Это позволяет разработчикам "
+"действовать проактивно и сокращать время между обновлением стандартов и "
+"достижением соответствия в FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:607
+msgid ""
+"Hat currently held by: Garrett Wollman "
+"mailto:wollman@FreeBSD.org[wollman@FreeBSD.org]."
+msgstr ""
+"Текущий ответственный: Garrett Wollman "
+"mailto:wollman@FreeBSD.org[wollman@FreeBSD.org]."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:609
+#, no-wrap
+msgid "Core Secretary"
+msgstr "Секретарь Core Team"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:613
+msgid ""
+"The Core Secretary's main responsibility is to write drafts to and publish "
+"the final Core Reports. The secretary also keeps the core agenda, thus "
+"ensuring that no balls are dropped unresolved."
+msgstr ""
+"Основная обязанность Секретаря Core Team — составление черновиков и "
+"публикация окончательных отчётов Core Team. Секретарь также ведёт повестку "
+"Core Team, гарантируя, что ни один вопрос не останется без решения."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:615
+msgid "Hat currently held by: {rene}."
+msgstr "Ответственный в настоящее время: {rene}."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:617
+#, no-wrap
+msgid "Bugmeister"
+msgstr "Ответственный за ошибки (Bugmeister)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:621
+msgid ""
+"The Bugmeister is responsible for ensuring that the maintenance database is "
+"in working order, that the entries are correctly categorised and that there "
+"are no invalid entries. They supervise bugbusters."
+msgstr ""
+"Ответственный за ошибки (Bugmeister) отвечает за поддержание базы данных по "
+"обслуживанию в рабочем состоянии, за корректную категоризацию записей и "
+"отсутствие недействительных записей. Они курируют исправителей ошибок "
+"(bugbusters)."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:623
+msgid ""
+"Hat currently held by: the Bugmeister Team "
+"mailto:bugmeister@FreeBSD.org[bugmeister@FreeBSD.org]."
+msgstr ""
+"Текущий ответственный: команда Bugmeister Team "
+"mailto:bugmeister@FreeBSD.org[bugmeister@FreeBSD.org]."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:625
+#, no-wrap
+msgid "Donations Liaison Officer"
+msgstr "Представитель по привлечению пожертвований"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:628
+msgid ""
+"The task of the donations liaison officer is to match the developers with "
+"needs with people or organisations willing to make a donation."
+msgstr ""
+"Задача представителя по привлечению пожертвований — связывать разработчиков, "
+"которым что-то нужно, с людьми или организациями, готовыми сделать "
+"пожертвование."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:631
+msgid ""
+"Hat held by: the Donations Liaison Office "
+"mailto:donations@FreeBSD.org[donations@FreeBSD.org]. The https://"
+"www.freebsd.org/donations/[ Donations Liaison Charter]."
+msgstr ""
+"Роль поддерживается: Отделом по привлечению пожертвований "
+"mailto:donations@FreeBSD.org[donations@FreeBSD.org]. https://"
+"www.freebsd.org/donations/[ Устав Отдела по привлечению пожертвований]."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:633
+#, no-wrap
+msgid "Admin"
+msgstr "Администратор (Admin)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:636
+msgid "(Also called \"FreeBSD Cluster Admin\")"
+msgstr "(Также называется \"Администратор кластера FreeBSD\")"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:639
+msgid ""
+"The admin team consists of the people responsible for administrating the "
+"computers that the project relies on for its distributed work and "
+"communication to be synchronised. It consists mainly of those people who "
+"have physical access to the servers."
+msgstr ""
+"Команда администраторов состоит из людей, ответственных за администрирование "
+"компьютеров, которые проект использует для распределённой работы и "
+"синхронизации коммуникации. В основном в неё входят те, кто имеет физический "
+"доступ к серверам."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:641
+msgid ""
+"Hat held by: the Admin team mailto:admin@FreeBSD.org[admin@FreeBSD.org]."
+msgstr ""
+"Роль поддерживается: командой администраторов "
+"mailto:admin@FreeBSD.org[admin@FreeBSD.org]."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:643
+#, no-wrap
+msgid "Process dependent hats"
+msgstr "Процессозависимые роли"
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:646
+#, no-wrap
+msgid "Report originator"
+msgstr "Инициатор отчета"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:649
+msgid "The person originally responsible for filing a Problem Report."
+msgstr "Лицо, изначально ответственное за подачу отчета о проблеме."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:651
+#, no-wrap
+msgid "Bugbuster"
+msgstr "Исправитель ошибок (Bugbuster)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:654
+msgid ""
+"A person who will either find the right person to solve the problem, or "
+"close the PR if it is a duplicate or otherwise not an interesting one."
+msgstr ""
+"Человек, который либо найдет подходящего специалиста для решения проблемы, "
+"либо закроет PR, если он является дубликатом или по другим причинам не "
+"представляет интереса."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:656
+#, no-wrap
+msgid "Mentor"
+msgstr "Наставник (Mentor)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:659
+msgid ""
+"A mentor is a committer who takes it upon them to introduce a new committer "
+"to the project, both in terms of ensuring the new committer's setup is "
+"valid, that the new committer knows the available tools required in their "
+"work, and that the new committer knows what is expected of them in terms of "
+"behavior."
+msgstr ""
+"Наставник — это коммиттер, который берет на себя задачу ознакомить нового "
+"коммиттера с проектом. Это включает в себя проверку корректности настройки "
+"окружения нового коммиттера, обучение доступным инструментам, необходимым "
+"для работы, а также разъяснение ожидаемого поведения."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:661
+#, no-wrap
+msgid "Vendor"
+msgstr "Поставщик"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:664
+msgid ""
+"The person(s) or organisation whom external code comes from and whom patches "
+"are sent to."
+msgstr ""
+"Лицо (лица) или организация, от которых поступает внешний код и которым "
+"отправляются исправления."
+
+#. type: Title ====
+#: documentation/content/en/books/dev-model/_index.adoc:666
+#, no-wrap
+msgid "Reviewers"
+msgstr "Рецензенты"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:669
+msgid "People on the mailing list where the request for review is posted."
+msgstr "Люди из списка рассылки, куда отправлен запрос на рецензирование."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:672
+msgid ""
+"The following section will describe the defined project processes. Issues "
+"that are not handled by these processes happen on an ad-hoc basis based on "
+"what has been customary to do in similar cases."
+msgstr ""
+"Следующий раздел описывает установленные процессы проекта. Вопросы, не "
+"охваченные этими процессами, решаются по мере возникновения, исходя из "
+"сложившейся практики в аналогичных случаях."
+
+#. type: Title ==
+#: documentation/content/en/books/dev-model/_index.adoc:674
+#, no-wrap
+msgid "Processes"
+msgstr "Процессы"
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:677
+#, no-wrap
+msgid "Adding new and removing old committers"
+msgstr "Добавление новых и удаление старых коммиттеров"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:682
+msgid ""
+"The Core team has the responsibility of giving and removing commit "
+"privileges to contributors. This can only be done through a vote on the "
+"core mailing list. The ports and documentation sub-projects can give commit "
+"privileges to people working on these projects, but have to date not removed "
+"such privileges."
+msgstr ""
+"Основная команда (Core Team) отвечает за предоставление и отзыв прав на "
+"коммит для участников. Это может быть сделано только через голосование в "
+"списке рассылки Core Team. Подпроекты ports и documentation могут "
+"предоставлять права на коммит людям, работающим над этими проектами, но на "
+"данный момент не отзывали такие права."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:685
+msgid ""
+"Normally a contributor is recommended to core by a committer. For "
+"contributors or outsiders to contact core asking to be a committer is not "
+"well thought of and is usually rejected."
+msgstr ""
+"Обычно кандидата в коммиттеры основной команде (Core Team) рекомендуют "
+"коммиттеры. Для участников или посторонних обращаться в Core Team с просьбой "
+"стать коммиттером считается неблагоразумным и такая просьба, как правило, "
+"отклоняется."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:688
+msgid ""
+"If the area of particular interest for the developer potentially overlaps "
+"with other committers' area of maintainership, the opinion of those "
+"maintainers is sought. However, it is frequently this committer that "
+"recommends the developer."
+msgstr ""
+"Если область, представляющая особый интерес для разработчика, потенциально "
+"пересекается с зоной ответственности других сопровождающих, запрашивается "
+"мнение этих сопровождающих. Однако часто именно этот сопровождающий "
+"рекомендует разработчика."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:691
+msgid ""
+"When a contributor is given committer status, they are assigned a mentor. "
+"The committer who recommended the new committer will, in the general case, "
+"take it upon themselves to be the new committers mentor."
+msgstr ""
+"Когда участнику предоставляется статус коммиттера, ему назначается "
+"наставник. В общем случае коммиттер, который рекомендовал нового коммиттера, "
+"берет на себя обязанности наставника для нового коммиттера."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:699
+msgid ""
+"When a contributor is given their commit bit, a crossref:dev-model[tool-pgp, "
+"Pretty Good Privacy]-signed email is sent from either crossref:dev-"
+"model[role-core-secretary, Core Secretary], crossref:dev-model[role-ports-"
+"manager, Ports Manager], or nik@freebsd.org to both admins@freebsd.org, the "
+"assigned mentor, the new committer, and core confirming the approval of a "
+"new account. The mentor then gathers a password line, crossref:dev-"
+"model[tool-ssh2, Secure Shell] public key, and PGP key from the new "
+"committer and sends them to crossref:dev-model[role-admin, Admin]. When the "
+"new account is created, the mentor activates the commit bit and guides the "
+"new committer through the rest of the initial process."
+msgstr ""
+"Когда участнику предоставляется право коммита (commit bit), отправляется "
+"подписанное с помощью crossref:dev-model[tool-pgp, Pretty Good Privacy] "
+"письмо от crossref:dev-model[role-core-secretary, Секретаря Core Team], "
+"crossref:dev-model[role-ports-manager, Менеджера портов] или nik@freebsd.org "
+"на адреса admins@freebsd.org, назначенного наставника, нового коммиттера и "
+"Core Team, подтверждая одобрение новой учётной записи. Затем наставник "
+"собирает строку пароля, crossref:dev-model[tool-ssh2, Secure Shell] открытый "
+"ключ и PGP-ключ от нового коммиттера и отправляет их crossref:dev-model[role-"
+"admin, Администратору]. Когда новая учётная запись создана, наставник "
+"активирует право коммита и проводит нового коммиттера через остальные этапы "
+"начального процесса."
+
+#. type: Block title
+#: documentation/content/en/books/dev-model/_index.adoc:700
+#, no-wrap
+msgid "Process summary: adding a new committer"
+msgstr "Процесс вкратце: добавление нового коммиттера"
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/dev-model/_index.adoc:701
+#: documentation/content/en/books/dev-model/_index.adoc:717
+#: documentation/content/en/books/dev-model/_index.adoc:764
+#: documentation/content/en/books/dev-model/_index.adoc:816
+#: documentation/content/en/books/dev-model/_index.adoc:943
+#, no-wrap
+msgid "Refer to paragraph below for a screen-reader friendly version."
+msgstr "Обратитесь к абзацу ниже для версии, совместимой с программами чтения с экрана."
+
+#. type: Target for macro image
+#: documentation/content/en/books/dev-model/_index.adoc:701
+#, no-wrap
+msgid "proc-add-committer.png"
+msgstr "proc-add-committer.png"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:708
+msgid ""
+"When a contributor sends a piece of code, the receiving committer may choose "
+"to recommend that the contributor is given commit privileges. If they "
+"recommend this to core, core will vote on this recommendation. If the vote "
+"is in favour, a mentor is assigned the new committer and the new committer "
+"has to email their details to the administrators for an account to be "
+"created. After this, the new committer is all set to make their first "
+"commit. By tradition, this is by adding their name to the committers list."
+msgstr ""
+"Когда участник отправляет фрагмент кода, принимающий коммиттер может "
+"предложить предоставить этому участнику права на коммит. Если он рекомендует "
+"это основной команде (Core Team), команда проводит голосование по этой "
+"рекомендации. Если голосование завершается в пользу предложения, новому "
+"коммиттеру назначается наставник, и новый коммиттер должен отправить свои "
+"данные администраторам для создания учётной записи. После этого новый "
+"коммиттер готов сделать свой первый коммит. По традиции, это делается путём "
+"добавления своего имени в список коммиттеров."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:715
+#, fuzzy
+#| msgid ""
+#| "Recall that a committer is considered to be someone who has committed "
+#| "code during the past 12 months. However, it is not until after 18 months "
+#| "of inactivity have passed that commit privileges are eligible to be "
+#| "revoked."
+msgid ""
+"Recall that a committer is considered to be someone who has committed code "
+"during the past 12 months. However, it is not until after 18 months of "
+"inactivity have passed that commit privileges are eligible to be revoked. "
+"[crossref:dev-model[freebsd-expiration-policy, FreeBSD, 2002H]] There are, "
+"however, no automatic procedures for doing this. For reactions concerning "
+"commit privileges not triggered by time, see crossref:dev-model[process-"
+"reactions,section 1.5.8]."
+msgstr ""
+"Напомним, что коммиттером считается тот, кто за последние 12 месяцев внёс "
+"изменения в код. Однако право на коммиты может быть отозвано только после 18 "
+"месяцев неактивности."
+
+#. type: Block title
+#: documentation/content/en/books/dev-model/_index.adoc:716
+#, no-wrap
+msgid "Process summary: removing a committer"
+msgstr "Процесс: удаление коммиттера"
+
+#. type: Target for macro image
+#: documentation/content/en/books/dev-model/_index.adoc:717
+#, no-wrap
+msgid "proc-rm-committer.png"
+msgstr "proc-rm-committer.png"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:721
+msgid ""
+"When Core decides to clean up the committers list, they check who has not "
+"made a commit for the past 18 months. Committers who have not done so have "
+"their commit bits revoked and their account removed by the administrators."
+msgstr ""
+"Когда Основная команда (Core Team) принимает решение очистить список "
+"коммиттеров, они проверяют, кто не делал коммитов за последние 18 месяцев. "
+"Коммиттеры, которые этого не сделали, лишаются прав на коммит, и их учетные "
+"записи удаляются администраторами."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:724
+msgid ""
+"It is also possible for committers to request that their commit bit be "
+"retired if for some reason they are no longer going to be actively "
+"committing to the project. In this case, it can also be restored at a later "
+"time by core, should the committer ask."
+msgstr ""
+"Также возможно для коммиттеров запросить отзыв их права на коммит, если по "
+"какой-то причине они больше не будут активно участвовать в проекте. В этом "
+"случае, право может быть восстановлено позже по запросу коммиттера."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:726
+msgid "Roles in this process:"
+msgstr "Роли в этом процессе:"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:728
+#: documentation/content/en/books/dev-model/_index.adoc:825
+#: documentation/content/en/books/dev-model/_index.adoc:985
+msgid "crossref:dev-model[role-core, Core Team]"
+msgstr "crossref:dev-model[role-core, Основная команда (Core Team)]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:729
+#: documentation/content/en/books/dev-model/_index.adoc:783
+msgid "crossref:dev-model[role-contributor, Contributor]"
+msgstr "crossref:dev-model[role-contributor, Участник (контрибьютор)]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:730
+#: documentation/content/en/books/dev-model/_index.adoc:782
+#: documentation/content/en/books/dev-model/_index.adoc:826
+#: documentation/content/en/books/dev-model/_index.adoc:986
+msgid "crossref:dev-model[role-committer, Committer]"
+msgstr "crossref:dev-model[role-committer, Коммиттер]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:731
+#: documentation/content/en/books/dev-model/_index.adoc:954
+msgid "crossref:dev-model[role-maintainer, Maintainership]"
+msgstr "crossref:dev-model[role-maintainer, Сопровождение]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:732
+msgid "crossref:dev-model[role-mentor, Mentor]"
+msgstr "crossref:dev-model[role-mentor, Наставник (Mentor)]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:736
+msgid ""
+"[crossref:dev-model[freebsd-bylaws, FreeBSD, 2000A]] [crossref:dev-"
+"model[freebsd-expiration-policy, FreeBSD, 2002H]] [crossref:dev-"
+"model[freebsd-new-account, FreeBSD, 2002I]]"
+msgstr ""
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:738
+#, no-wrap
+msgid "Committing code"
+msgstr "Коммит кода"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:744
+msgid ""
+"The committing of new or modified code is one of the most frequent processes "
+"in the FreeBSD project and will usually happen many times a day. Committing "
+"of code can only be done by a \"committer\". Committers commit either code "
+"written by themselves, code submitted to them, or code submitted through a "
+"crossref:dev-model[model-pr,problem report]."
+msgstr ""
+"Добавление нового или изменённого кода — один из наиболее частых процессов в "
+"проекте FreeBSD и обычно происходит несколько раз в день. Фиксация кода "
+"может быть выполнена только \"коммиттером\". Коммиттеры фиксируют либо код, "
+"написанный ими самими, либо код, переданный им, либо код, отправленный через "
+"crossref:dev-model[model-pr,отчёт о проблеме]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:750
+msgid ""
+"When code is written by the developer that is non-trivial, they should seek "
+"a code review from the community. This is done by sending mail to the "
+"relevant list asking for review. Before submitting the code for review, "
+"they should ensure it compiles correctly with the entire tree and that all "
+"relevant tests run. This is called \"pre-commit test\". When contributed "
+"code is received, it should be reviewed by the committer and tested the same "
+"way."
+msgstr ""
+"Когда разработчик пишет нетривиальный код, он должен запросить "
+"рецензирование кода у сообщества. Это делается путём отправки письма в "
+"соответствующий список рассылки с просьбой о рецензировании. Перед отправкой "
+"кода на проверку разработчик должен убедиться, что он корректно "
+"компилируется со всем деревом исходного кода и что все соответствующие тесты "
+"выполняются. Это называется \"предварительной проверкой перед коммитом\". "
+"Когда получен вклад в виде кода, коммиттер должен просмотреть его и "
+"протестировать таким же образом."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:754
+msgid ""
+"When a change is committed to a part of the source that has been contributed "
+"from an outside crossref:dev-model[role-vendor, Vendor], the maintainer "
+"should ensure that the patch is contributed back to the vendor. This is in "
+"line with the open source philosophy and makes it easier to stay in sync "
+"with outside projects as the patches do not have to be reapplied every time "
+"a new release is made."
+msgstr ""
+"Когда изменение фиксируется в части исходного кода, которая была получена от "
+"внешнего crossref:dev-model[role-vendor,поставщика], сопровождающий должен "
+"убедиться, что патч передан обратно поставщику. Это соответствует философии "
+"открытого исходного кода и упрощает синхронизацию с внешними проектами, так "
+"как патчи не придётся применять заново при каждом новом выпуске."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:759
+msgid ""
+"After the code has been available for review and no further changes are "
+"necessary, the code is committed into the development branch, -CURRENT. If "
+"the change applies for the -STABLE branch or the other branches as well, a "
+"\"Merge From Current\" (\"MFC\") countdown is set by the committer. After "
+"the number of days the committer chose when setting the MFC have passed, an "
+"email will automatically be sent to the committer reminding them to commit "
+"it to the -STABLE branch (and possibly security branches as well). Only "
+"security critical changes should be merged to security branches."
+msgstr ""
+"После того как код был доступен для рецензирования и дальнейшие изменения не "
+"требуются, код вносится в ветку разработки -CURRENT. Если изменение "
+"применимо и для ветки -STABLE, или других веток, коммиттер устанавливает "
+"отсчёт времени для \"слияния из текущей\" (\"MFC\"). После того как пройдёт "
+"количество дней, выбранное коммиттером при установке MFC, автоматически "
+"будет отправлено письмо коммиттеру с напоминанием внести изменения в ветку "
+"-STABLE (а также, возможно, в ветки безопасности). В ветки безопасности "
+"следует сливать только критические изменения, связанные с безопасностью."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:762
+msgid ""
+"Delaying the commit to -STABLE and other branches allows for \"parallel "
+"debugging\" where the committed code is tested on a wide range of "
+"configurations. This makes changes to -STABLE to contain fewer faults and "
+"thus giving the branch its name."
+msgstr ""
+"Откладывание коммита в -STABLE и другие ветки позволяет проводить "
+"\"параллельную отладку\", когда закоммиченный код тестируется на широком "
+"спектре конфигураций. Это приводит к тому, что изменения в -STABLE содержат "
+"меньше ошибок, что и даёт ветке её название."
+
+#. type: Block title
+#: documentation/content/en/books/dev-model/_index.adoc:763
+#, no-wrap
+msgid "Process summary: A committer commits code"
+msgstr "Процесс вкратце: коммиттер делает коммит кода"
+
+#. type: Target for macro image
+#: documentation/content/en/books/dev-model/_index.adoc:764
+#, no-wrap
+msgid "proc-commit.png"
+msgstr "proc-commit.png"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:772
+msgid ""
+"When a committer has written a piece of code and wants to commit it, they "
+"first need to determine if it is trivial enough to go in without prior "
+"review or if it should first be reviewed by the developer community. If the "
+"code is trivial or has been reviewed and the committer is not the "
+"maintainer, they should consult the maintainer before proceeding. If the "
+"code is contributed by an outside vendor, the maintainer should create a "
+"patch that is sent back to the vendor. The code is then committed and then "
+"deployed by the users. Should they find problems with the code, this will "
+"be reported and the committer can go back to writing a patch. If a vendor "
+"is affected, they can choose to implement or ignore the patch."
+msgstr ""
+"Когда коммиттер написал часть кода и хочет его закоммитить, он сначала "
+"должен определить, достаточно ли он тривиален, чтобы попасть в репозиторий "
+"без предварительной рецензии, или ему сначала следует сделать рецензию в "
+"сообществе разработчиков. Если код тривиален или был отрецензирован, и "
+"коммиттер не является сопровождающим, он должен проконсультироваться с "
+"сопровождающим перед тем, как продолжить. Если код предоставлен внешним "
+"поставщиком, сопровождающий должен создать патч, который отправляется "
+"обратно поставщику. Затем код коммитится и развертывается пользователями. "
+"Если они обнаружат проблемы с кодом, это будет сообщено, и коммиттер может "
+"вернуться к написанию патча. Если затронут поставщик, он может выбрать "
+"реализацию или игнорирование патча."
+
+#. type: Block title
+#: documentation/content/en/books/dev-model/_index.adoc:773
+#, no-wrap
+msgid "Process summary: A contributor commits code"
+msgstr "Процесс вкратце: Участник делает коммит кода"
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/dev-model/_index.adoc:774
+#, no-wrap
+msgid "Refer to paragraphs below and above for a screen-reader friendly version."
+msgstr "Обратитесь к абзацам выше и ниже для версии, совместимой с программами чтения с экрана."
+
+#. type: Target for macro image
+#: documentation/content/en/books/dev-model/_index.adoc:774
+#, no-wrap
+msgid "proc-contrib.png"
+msgstr "proc-contrib.png"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:778
+msgid ""
+"The difference when a contributor makes a code contribution is that they "
+"submit the code through the Bugzilla interface. This report is picked up by "
+"the maintainer who reviews the code and commits it."
+msgstr ""
+"Разница, когда участник вносит код, заключается в том, что он отправляет код "
+"через интерфейс Bugzilla. Этот отчёт забирает сопровождающий, который "
+"просматривает код и делает ему коммит."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:780
+msgid "Hats included in this process are:"
+msgstr "Роли, задействованные в этом процессе:"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:784
+msgid "crossref:dev-model[role-vendor, Vendor]"
+msgstr "crossref:dev-model[role-vendor, Поставщик]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:785
+msgid "crossref:dev-model[role-reviewer, Reviewers]"
+msgstr "crossref:dev-model[role-reviewer, Рецензенты]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:788
+msgid ""
+"[crossref:dev-model[freebsd-committer, FreeBSD, 2001]] [crossref:dev-"
+"model[jorgensen2001, Jørgensen, 2001]]"
+msgstr ""
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:790
+#, no-wrap
+msgid "Core election"
+msgstr "Выборы основной команды (Core Team)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:795
+msgid ""
+"Core elections are held at least every two years. footnote:[The first Core "
+"election was held September 2000] Nine core members are elected. New "
+"elections are held if the number of core members drops below seven. New "
+"elections can also be held should at least 1/3 of the active committers "
+"demand this."
+msgstr ""
+"Выборы Core Team проводятся не реже чем раз в два года. footnote:[Первые "
+"выборы Core Team состоялись в сентябре 2000 года] Избираются девять "
+"участников Core Team. Новые выборы проводятся, если количество участников "
+"Core Team становится меньше семи. Новые выборы также могут быть проведены, "
+"если этого потребуют как минимум 1/3 активных коммиттеров."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:797
+msgid ""
+"When an election is to take place, core announces this at least 6 weeks in "
+"advance, and appoints an election manager to run the elections."
+msgstr ""
+"Когда должны состояться выборы, Core Team объявляет об этом как минимум за 6 "
+"недель и назначает менеджера выборов для их проведения."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:802
+msgid ""
+"Only committers can be elected into core. The candidates need to submit "
+"their candidacy at least one week before the election starts, but can refine "
+"their statements until the voting starts. They are presented in the http://"
+"election.uk.freebsd.org/candidates.html[candidates list]. When writing "
+"their election statements, the candidates must answer a few standard "
+"questions submitted by the election manager."
+msgstr ""
+"Только коммиттеры могут быть избраны в состав основной команды (Core Team). "
+"Кандидаты должны подать свои заявки как минимум за одну неделю до начала "
+"выборов, но могут уточнять свои заявления до начала голосования. Они "
+"представлены в http://election.uk.freebsd.org/candidates.html[списке "
+"кандидатов]. При составлении своих предвыборных заявлений кандидаты должны "
+"ответить на несколько стандартных вопросов, предоставленных организатором "
+"выборов."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:805
+msgid ""
+"During elections, the rule that a committer must have committed during the "
+"12 past months is followed strictly. Only these committers are eligible to "
+"vote."
+msgstr ""
+"Во время выборов строго соблюдается правило, что коммиттер должен был "
+"сделать коммит в течение последних 12 месяцев. Только эти коммиттеры имеют "
+"право голосовать."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:808
+msgid ""
+"When voting, the committer may vote once in support of up to nine nominees. "
+"The voting is done over a period of four weeks with reminders being posted "
+"on \"developers\" mailing list that is available to all committers."
+msgstr ""
+"При голосовании коммиттер может проголосовать один раз в поддержку до девяти "
+"номинантов. Голосование проводится в течение четырёх недель, с "
+"напоминаниями, публикуемыми в рассылке \"developers\", доступной всем "
+"коммиттерам."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:810
+msgid ""
+"The election results are released one week after the election ends, and the "
+"new core team takes office one week after the results have been posted."
+msgstr ""
+"Результаты выборов публикуются через неделю после их окончания, а новая "
+"основная команда вступает в должность через неделю после публикации "
+"результатов."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:812
+msgid ""
+"Should there be a voting tie, this will be resolved by the new, "
+"unambiguously elected core members."
+msgstr ""
+"В случае ничьей при голосовании, это будет разрешено новыми, однозначно "
+"избранными членами ядра."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:814
+msgid ""
+"Votes and candidate statements are archived, but the archives are not "
+"publicly available."
+msgstr ""
+"Голоса и заявления кандидатов архивируются, но архивы не являются "
+"общедоступными."
+
+#. type: Block title
+#: documentation/content/en/books/dev-model/_index.adoc:815
+#, no-wrap
+msgid "Process summary: Core elections"
+msgstr "Процесс вкратце: Выборы основной команды (Core Team)"
+
+#. type: Target for macro image
+#: documentation/content/en/books/dev-model/_index.adoc:816
+#, no-wrap
+msgid "proc-elections.png"
+msgstr "proc-elections.png"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:821
+msgid ""
+"Core announces the election and selects an election manager who prepares the "
+"elections, and when ready, candidates can announce their candidacies through "
+"submitting their statements. The committers then vote. After the vote is "
+"over, the election results are announced and the new core team takes office."
+msgstr ""
+"Core Team объявляет выборы и назначает руководителя выборов, который "
+"подготавливает процесс. Когда всё готово, кандидаты могут объявить о своей "
+"кандидатуре, представив заявления. Затем коммиттеры голосуют. После "
+"завершения голосования результаты выборов объявляются, и новая основная "
+"команда вступает в должность."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:823
+msgid "Hats in core elections are:"
+msgstr "Ответственный за выборы Core Team:"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:827
+msgid "crossref:dev-model[role-election-manager, Election Manager]"
+msgstr "crossref:dev-model[role-election-manager, Менеджер выборов]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:831
+msgid ""
+"[crossref:dev-model[freebsd-bylaws, FreeBSD, 2000A]] [crossref:dev-model[bsd-"
+"election2002, FreeBSD, 2002B]] [crossref:dev-model[freebsd-election, "
+"FreeBSD, 2002G]]"
+msgstr ""
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:833
+#, no-wrap
+msgid "Development of new features"
+msgstr "Разработка новых функций"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:841
+msgid ""
+"Within the project there are sub-projects that are working on new features. "
+"These projects are generally done by one person [crossref:dev-"
+"model[jorgensen2001, Jørgensen, 2001]]. Every project is free to organise "
+"development as it sees fit. However, when the project is merged to the "
+"-CURRENT branch it must follow the project guidelines. When the code has "
+"been well tested in the -CURRENT branch and deemed stable enough and "
+"relevant to the -STABLE branch, it is merged to the -STABLE branch."
+msgstr ""
+"В рамках проекта существуют подпроекты, работающие над новыми функциями. Эти "
+"проекты обычно выполняются одним человеком [crossref:dev-"
+"model[jorgensen2001, Йоргенсен, 2001]]. Каждый проект волен организовывать "
+"разработку так, как считает нужным. Однако, когда проект объединяется с "
+"ветвью -CURRENT, он должен следовать руководствам проекта. Когда код хорошо "
+"протестирован в ветви -CURRENT и признан достаточно стабильным и актуальным "
+"для ветви -STABLE, он объединяется с ветвью -STABLE."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:848
+msgid ""
+"The requirements of the project are given by developer wishes, requests from "
+"the community in terms of direct requests by mail, Problem Reports, "
+"commercial funding for the development of features, or contributions by the "
+"scientific community. The wishes that come within the responsibility of a "
+"developer are given to that developer who prioritises their time between the "
+"request and their wishes. A common way to do this is maintain a TODO-list "
+"maintained by the project. Items that do not come within someone's "
+"responsibility are collected on TODO-lists unless someone volunteers to take "
+"the responsibility. All requests, their distribution and follow-up are "
+"handled by the crossref:dev-model[tool-bugzilla, Bugzilla] tool."
+msgstr ""
+"Требования проекта определяются пожеланиями разработчиков, запросами "
+"сообщества в виде прямых обращений по почте, отчетов о проблемах (Problem "
+"Reports), коммерческим финансированием разработки функциональности или "
+"вкладами научного сообщества. Пожелания, которые входят в зону "
+"ответственности разработчика, передаются этому разработчику, который "
+"расставляет приоритеты между запросом и своими собственными пожеланиями. "
+"Распространенный способ организации этого процесса — ведение списка задач "
+"(TODO-list), поддерживаемого проектом. Задачи, не входящие в чью-либо зону "
+"ответственности, собираются в списках TODO, пока кто-нибудь не возьмет на "
+"себя ответственность за их выполнение. Все запросы, их распределение и "
+"отслеживание обрабатываются с помощью инструмента crossref:dev-model[tool-"
+"bugzilla, Bugzilla]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:853
+msgid ""
+"Requirements analysis happens in two ways. The requests that come in are "
+"discussed on mailing lists, both within the main project and in the sub-"
+"project that the request belongs to or is spawned by the request. "
+"Furthermore, individual developers on the sub-project will evaluate the "
+"feasibility of the requests and determine the prioritisation between them. "
+"Other than archives of the discussions that have taken place, no outcome is "
+"created by this phase that is merged into the main project."
+msgstr ""
+"Анализ требований происходит двумя способами. Поступившие запросы "
+"обсуждаются в почтовых рассылках, как в основном проекте, так и в "
+"подпроекте, к которому относится запрос или который создается этим запросом. "
+"Кроме того, отдельные разработчики подпроекта оценивают осуществимость "
+"запросов и определяют приоритеты между ними. Помимо архивов обсуждений, на "
+"этом этапе не создается никаких результатов, которые включаются в основной "
+"проект."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:856
+msgid ""
+"As the requests are prioritised by the individual developers on the basis of "
+"doing what they find interesting, necessary, or are funded to do, there is "
+"no overall strategy or prioritisation of what requests to regard as "
+"requirements and following up their correct implementation. However, most "
+"developers have some shared vision of what issues are more important, and "
+"they can ask for guidelines from the release engineering team."
+msgstr ""
+"Поскольку запросы приоритизируются отдельными разработчиками на основе того, "
+"что они считают интересным, необходимым или за что им платят, отсутствует "
+"общая стратегия или приоритезация того, какие запросы считать требованиями, "
+"и как контролировать их корректную реализацию. Однако большинство "
+"разработчиков разделяют общее видение того, какие вопросы являются более "
+"важными, и они могут запросить рекомендации у команды инженеров по выпуску "
+"релизов."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:863
+msgid ""
+"The verification phase of the project is two-fold. Before committing code "
+"to the current-branch, developers request their code to be reviewed by their "
+"peers. This review is for the most part done by functional testing, but "
+"also code review is important. When the code is committed to the branch, a "
+"broader functional testing will happen, that may trigger further code review "
+"and debugging should the code not behave as expected. This second "
+"verification form may be regarded as structural verification. Although the "
+"sub-projects themselves may write formal tests such as unit tests, these are "
+"usually not collected by the main project and are usually removed before the "
+"code is committed to the current branch. footnote:[More and more tests are "
+"however performed when building the system (make world). These tests are "
+"however a very new addition and no systematic framework for these tests have "
+"yet been created.]"
+msgstr ""
+"Фаза проверки проекта состоит из двух этапов. Перед внесением кода в текущую "
+"ветку разработчики запрашивают рецензирование своего кода коллегами. Это "
+"рецензирование в основном проводится с помощью функционального тестирования, "
+"но также важна проверка кода. Когда код внесён в ветку, проводится более "
+"широкое функциональное тестирование, которое может привести к дополнительной "
+"проверке кода и отладке, если код ведёт себя не так, как ожидалось. Эта "
+"вторая форма проверки может рассматриваться как структурная верификация. "
+"Хотя сами подпроекты могут писать формальные тесты, такие как модульные "
+"тесты, они обычно не собираются основным проектом и чаще всего удаляются "
+"перед внесением кода в текущую ветку. footnote:[Однако всё больше тестов "
+"выполняется при сборке системы (make world). Эти тесты являются очень новым "
+"дополнением, и систематическая структура для них ещё не создана.]"
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:865
+#, no-wrap
+msgid "Maintenance"
+msgstr "Сопровождение"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:872
+msgid ""
+"It is an advantage to the project to for each area of the source have at "
+"least one person that knows this area well. Some parts of the code have "
+"designated maintainers. Others have de-facto maintainers, and some parts of "
+"the system do not have maintainers. The maintainer is usually a person from "
+"the sub-project that wrote and integrated the code, or someone who has "
+"ported it from the platform it was written for. footnote:[sendmail and "
+"named are examples of code that has been merged from other platforms.] The "
+"maintainer's job is to make sure the code is in sync with the project the "
+"code comes from if it is contributed code, and apply patches submitted by "
+"the community or write fixes to issues that are discovered."
+msgstr ""
+"Для проекта полезно, чтобы за каждую область исходного кода отвечал хотя бы "
+"один человек, который хорошо её знает. Некоторые части кода имеют "
+"назначенных сопровождающих. Другие имеют фактических сопровождающих, а "
+"некоторые части системы не имеют сопровождающих. Сопровождающий обычно "
+"является участником подпроекта, который написал и интегрировал код, или тем, "
+"кто портировал его с платформы, для которой он был написан. footnote:"
+"[sendmail и named — примеры кода, который был объединён с других платформ.] "
+"Задача сопровождающего — убедиться, что код синхронизирован с проектом, из "
+"которого он получен, если это сторонний код, а также применять патчи, "
+"предоставленные сообществом, или исправлять обнаруженные проблемы."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:875
+msgid ""
+"The main bulk of work that is put into the FreeBSD project is maintenance. "
+"[crossref:dev-model[jorgensen2001, Jørgensen, 2001]] has made a figure "
+"showing the life cycle of changes."
+msgstr ""
+"Основной объем работы, вкладываемый в проект FreeBSD, связан с "
+"сопровождением. [crossref:dev-model[jorgensen2001, Jørgensen, 2001]] "
+"предоставляет схему, показывающую жизненный цикл изменений."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:913
+msgid ""
+"Here \"development release\" refers to the -CURRENT branch while "
+"\"production release\" refers to the -STABLE branch. The \"pre-commit "
+"test\" is the functional testing by peer developers when asked to do so or "
+"trying out the code to determine the status of the sub-project. \"Parallel "
+"debugging\" is the functional testing that can trigger more review, and "
+"debugging when the code is included in the -CURRENT branch."
+msgstr ""
+"Здесь \"релиз для разработки\" относится к ветке -CURRENT, а \"релиз для "
+"производства\" — к ветке -STABLE. \"Предварительная проверка перед "
+"коммитом\" — это функциональное тестирование, проводимое коллегами-"
+"разработчиками по запросу или для проверки кода с целью определения "
+"состояния подпроекта. \"Параллельная отладка\" — это функциональное "
+"тестирование, которое может вызвать дополнительный обзор и отладку, когда "
+"код включён в ветку -CURRENT."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:920
+msgid ""
+"As of this writing, there were 269 committers in the project. When they "
+"commit a change to a branch, that constitutes a new release. It is very "
+"common for users in the community to track a particular branch. The "
+"immediate existence of a new release makes the changes widely available "
+"right away and allows for rapid feedback from the community. This also "
+"gives the community the response time they expect on issues that are of "
+"importance to them. This makes the community more engaged, and thus allows "
+"for more and better feedback that again spurs more maintenance and "
+"ultimately should create a better product."
+msgstr ""
+"На момент написания этого документа в проекте было 269 коммиттеров. Когда "
+"они вносят изменения в ветку, это создает новый выпуск. Очень часто "
+"пользователи в сообществе отслеживают определенную ветку. Мгновенное "
+"появление нового выпуска делает изменения широко доступными сразу же и "
+"позволяет быстро получать отзывы от сообщества. Это также дает сообществу "
+"ожидаемое время реакции на проблемы, которые важны для них. Это делает "
+"сообщество более вовлеченным, что, в свою очередь, позволяет получать больше "
+"и лучше отзывов, что снова стимулирует больше сопровождения и в конечном "
+"итоге должно создать лучший продукт."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:922
+msgid ""
+"Before making changes to code in parts of the tree that has a history "
+"unknown to the committer, the committer is required to read the commit logs "
+"to see why certain features are implemented the way they are in order not to "
+"make mistakes that have previously either been thought through or resolved."
+msgstr ""
+"Прежде чем вносить изменения в код в частях дерева, история которых "
+"неизвестна коммиттеру, коммиттер обязан прочитать журналы коммитов, чтобы "
+"понять, почему определённые функции реализованы именно так, и избежать "
+"ошибок, которые уже были обдуманы или исправлены ранее."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:924
+#, no-wrap
+msgid "Problem reporting"
+msgstr "Сообщение о проблеме"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:929
+msgid ""
+"Before FreeBSD 10, FreeBSD included a problem reporting tool called `send-"
+"pr`. Problems include bug reports, feature requests, feature enhancements "
+"and notices of new versions of external software that are included in the "
+"project. Although `send-pr` is available, users and developers are "
+"encouraged to submit issues using our https://bugs.freebsd.org/submit/"
+"[ problem report form]."
+msgstr ""
+"До FreeBSD 10 в FreeBSD входил инструмент для отправки отчётов о проблемах "
+"под названием `send-pr`. Проблемы включают отчёты об ошибках, запросы "
+"функций, улучшения функций и уведомления о новых версиях внешнего "
+"программного обеспечения, включённого в проект. Хотя `send-pr` доступен, "
+"пользователям и разработчикам рекомендуется отправлять проблемы, используя "
+"нашу https://bugs.freebsd.org/submit/[форму отчёта о проблемах]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:941
+msgid ""
+"Problem reports are sent to an email address where it is inserted into the "
+"Problem Reports maintenance database. A crossref:dev-model[role-bugbuster, "
+"Bugbuster] classifies the problem and sends it to the correct group or "
+"maintainer within the project. After someone has taken responsibility for "
+"the report, the report is being analysed. This analysis includes verifying "
+"the problem and thinking out a solution for the problem. Often feedback is "
+"required from the report originator or even from the FreeBSD community. "
+"Once a patch for the problem is made, the originator may be asked to try it "
+"out. Finally, the working patch is integrated into the project, and "
+"documented if applicable. It there goes through the regular maintenance "
+"cycle as described in section crossref:dev-model[model-maintenance, "
+"Maintenance]. These are the states a problem report can be in: open, "
+"analyzed, feedback, patched, suspended and closed. The suspended state is "
+"for when further progress is not possible due to the lack of information or "
+"for when the task would require so much work that nobody is working on it at "
+"the moment."
+msgstr ""
+"Отчёты о проблемах отправляются на электронный адрес, откуда они попадают в "
+"базу данных сопровождения отчётов о проблемах. crossref:dev-model[role-"
+"bugbuster, Исправитель ошибок (Bugbuster)] классифицирует проблему и "
+"направляет её соответствующей группе или сопровождающему в рамках проекта. "
+"После того, как кто-то берёт ответственность за отчёт, он анализируется. "
+"Этот анализ включает проверку проблемы и разработку решения. Часто "
+"требуется обратная связь от автора отчёта или даже от сообщества FreeBSD. "
+"Как только создаётся патч для устранения проблемы, автора отчета могут "
+"попросить его протестировать. В итоге рабочий патч интегрируется в проект "
+"и, если необходимо, документируется. Затем он проходит стандартный цикл "
+"сопровождения, как описано в разделе crossref:dev-model[model-maintenance, "
+"Сопровождение]. Отчёт о проблеме может находиться в следующих состояниях: "
+"открыт, анализируется, ожидает обратной связи, исправлен патчем, отложен и "
+"закрыт. Состояние \"отложен\" используется, когда дальнейшее продвижение "
+"невозможно из-за недостатка информации или когда задача требует столько "
+"работы, что в данный момент никто над ней не работает."
+
+#. type: Block title
+#: documentation/content/en/books/dev-model/_index.adoc:942
+#, no-wrap
+msgid "Process summary: problem reporting"
+msgstr "Сводка процесса: сообщение о проблеме"
+
+#. type: Target for macro image
+#: documentation/content/en/books/dev-model/_index.adoc:943
+#, no-wrap
+msgid "proc-pr.png"
+msgstr "proc-pr.png"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:949
+msgid ""
+"A problem is reported by the report originator. It is then classified by a "
+"bugbuster and handed to the correct maintainer. They verify the problem and "
+"discuss the problem with the originator until they have enough information "
+"to create a working patch. This patch is then committed and the problem "
+"report is closed."
+msgstr ""
+"Проблема сообщается автором отчета. Затем она классифицируется ответственным "
+"за обработку ошибок и передается соответствующему сопровождающему. Он "
+"проверяет проблему и обсуждает её с автором отчёта до тех пор, пока не будет "
+"собрано достаточно информации для создания рабочего исправления. Это "
+"исправление затем фиксируется, и отчёт о проблеме закрывается."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:951
+msgid "The roles included in this process are:"
+msgstr "Роли, включенные в этот процесс:"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:953
+msgid "crossref:dev-model[role-problem-originator, Report originator]"
+msgstr "crossref:dev-model[role-problem-originator, Инициатор отчета]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:955
+msgid "crossref:dev-model[role-bugbuster, Bugbuster]"
+msgstr "crossref:dev-model[role-bugbuster, Исправитель ошибок (Bugbuster)]"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:958
+#, fuzzy
+#| msgid "[crossref:dev-model[freebsd-handle-pr, FreeBSD, 2002C]]."
+msgid ""
+"[crossref:dev-model[freebsd-handle-pr, FreeBSD, 2002C]]. [crossref:dev-"
+"model[freebsd-send-pr, FreeBSD, 2002D]]"
+msgstr "[crossref::dev-model[freebsd-handle-pr, FreeBSD, 2002C]]."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:960
+#, no-wrap
+msgid "Reacting to misbehavior"
+msgstr "Реагирование на неправильное поведение"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:966
+msgid ""
+"[crossref:dev-model[freebsd-committer, FreeBSD, 2001]] has a number of rules "
+"that committers should follow. However, it happens that these rules are "
+"broken. The following rules exist in order to be able to react to "
+"misbehavior. They specify what actions will result in how long a suspension "
+"of the committer's commit privileges."
+msgstr ""
+"[crossref:dev-model[freebsd-committer, FreeBSD, 2001]] содержит ряд правил, "
+"которым должны следовать коммиттеры. Однако случается, что эти правила "
+"нарушаются. Следующие правила существуют для того, чтобы можно было "
+"реагировать на неподобающее поведение. Они определяют, какие действия "
+"приведут к приостановке привилегий коммиттера на тот или иной срок."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:968
+msgid ""
+"Committing during code freezes without the approval of the Release "
+"Engineering team - 2 days"
+msgstr ""
+"Совершение коммитов во время заморозки кода без одобрения команды Release "
+"Engineering — 2 дня"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:969
+msgid "Committing to a security branch without approval - 2 days"
+msgstr "Коммит изменений в ветку безопасности без одобрения - 2 дня"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:970
+msgid "Commit wars - 5 days to all participating parties"
+msgstr "Войны коммитов — 5 дней для всех участвующих сторон"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:971
+msgid "Impolite or inappropriate behavior - 5 days"
+msgstr "Невежливое или неподобающее поведение — 5 дней"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:973
+#, fuzzy
+#| msgid "[crossref:dev-model[freebsd-handle-pr, FreeBSD, 2002C]]."
+msgid "[crossref:dev-model[ref-freebsd-trenches, Lehey, 2002]]"
+msgstr "[crossref::dev-model[freebsd-handle-pr, FreeBSD, 2002C]]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:978
+msgid ""
+"For the suspensions to be efficient, any single core member can implement a "
+"suspension before discussing it on the \"core\" mailing list. Repeat "
+"offenders can, with a 2/3 vote by core, receive harsher penalties, including "
+"permanent removal of commit privileges. (However, the latter is always "
+"viewed as a last resort, due to its inherent tendency to create "
+"controversy.) All suspensions are posted to the \"developers\" mailing "
+"list, a list available to committers only."
+msgstr ""
+"Для эффективности приостановок любой член основной команды (Core Team) может "
+"применить приостановку до обсуждения на почтовой рассылке \"core\". "
+"Повторные нарушители могут, при 2/3 голосов от основной команды, получить "
+"более строгие наказания, включая постоянное лишение прав на коммиты. (Однако "
+"последнее всегда рассматривается как крайняя мера из-за присущей ему "
+"склонности вызывать споры.) Все приостановки публикуются в почтовой рассылке "
+"\"developers\", доступной только коммиттерам."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:981
+msgid ""
+"It is important that you cannot be suspended for making technical errors. "
+"All penalties come from breaking social etiquette."
+msgstr ""
+"Важно, что вас не могут приостановить за технические ошибки. Все наказания "
+"связаны с нарушением социального этикета."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:983
+msgid "Hats involved in this process:"
+msgstr "Роли, участвующие в этом процессе:"
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:988
+#, no-wrap
+msgid "Release engineering"
+msgstr "Выпуск релизов"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:994
+msgid ""
+"The FreeBSD project has a Release Engineering team with a principal release "
+"engineer that is responsible for creating releases of FreeBSD that can be "
+"brought out to the user community via the net or sold in retail outlets. "
+"Since FreeBSD is available on multiple platforms and releases for the "
+"different architectures are made available at the same time, the team has "
+"one person in charge of each architecture. Also, there are roles in the "
+"team responsible for coordinating quality assurance efforts, building a "
+"package set and for having an updated set of documents. When referring to "
+"the release engineer, a representative for the release engineering team is "
+"meant."
+msgstr ""
+"Проект FreeBSD имеет команду инженеров по выпуску релизов с главным "
+"инженером, который отвечает за создание релизов FreeBSD для распространения "
+"среди пользователей через интернет или продажи в розничных магазинах. "
+"Поскольку FreeBSD доступна на нескольких платформах, а релизы для различных "
+"архитектур выпускаются одновременно, в команде есть ответственный за каждую "
+"архитектуру. Также в команде есть роли, отвечающие за координацию усилий по "
+"обеспечению качества, сборку набора пакетов и актуализацию документации. Под "
+"инженером по выпуску релизов подразумевается представитель команды инженеров "
+"по выпуску релизов."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1001
+msgid ""
+"When a release is coming, the FreeBSD project changes shape somewhat. A "
+"release schedule is made containing feature- and code-freezes, release of "
+"interim releases and the final release. A feature-freeze means no new "
+"features are allowed to be committed to the branch without the release "
+"engineers' explicit consent. Code-freeze means no changes to the code (like "
+"bugs-fixes) are allowed to be committed without the release engineers' "
+"explicit consent. This feature- and code-freeze is known as stabilising. "
+"During the release process, the release engineer has the full authority to "
+"revert to older versions of code and thus \"back out\" changes should they "
+"find that the changes are not suitable to be included in the release."
+msgstr ""
+"Когда готовится выпуск релиза, проект FreeBSD несколько меняет свою "
+"структуру. Составляется график выпуска, включающий заморозку "
+"функциональности и кода, выпуск промежуточных релизов и финального релиза. "
+"Заморозка функциональности означает, что новые функции не могут быть "
+"добавлены в ветку без явного согласия инженеров релиза. Заморозка кода "
+"означает, что изменения в коде (например, исправления ошибок) не могут быть "
+"добавлены без явного согласия инженеров релиза. Этот процесс заморозки "
+"функциональности и кода известен как стабилизация. В процессе выпуска релиза "
+"инженер релиза имеет полномочия откатываться к более старым версиям кода и, "
+"таким образом, \"отменять\" изменения, если они сочтут, что эти изменения не "
+"подходят для включения в релиз."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1003
+msgid "There are three different kinds of releases:"
+msgstr "Существует три различных вида выпусков:"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1005
+msgid ""
+".0 releases are the first release of a major version. These are branched of "
+"the -CURRENT branch and have a significantly longer release engineering "
+"cycle due to the unstable nature of the -CURRENT branch"
+msgstr ""
+".0 выпуски являются первым релизом основной версии. Они ветвятся от ветки "
+"-CURRENT и имеют значительно более длительный цикл разработки из-за "
+"нестабильного характера ветки -CURRENT"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1006
+msgid ""
+".X releases are releases of the -STABLE branch. They are scheduled to come "
+"out every 4 months."
+msgstr ""
+".X релизы — это релизы ветки -STABLE. Они запланированы к выходу каждые 4 "
+"месяца."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1007
+msgid ""
+".X.Y releases are security releases that follow the .X branch. These come "
+"out only when sufficient security fixes have been merged since the last "
+"release on that branch. New features are rarely included, and the security "
+"team is far more involved in these than in regular releases."
+msgstr ""
+".X.Y — это выпуски с исправлениями уязвимостей, следующие за веткой .X. Они "
+"выходят только тогда, когда с момента последнего выпуска в этой ветке было "
+"объединено достаточное количество исправлений уязвимостей. Новые функции "
+"включаются редко, а команда безопасности участвует в этих выпусках гораздо "
+"активнее, чем в обычных."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1017
+msgid ""
+"For releases of the -STABLE-branch, the release process starts 45 days "
+"before the anticipated release date. During the first phase, the first 15 "
+"days, the developers merge what changes they have had in -CURRENT that they "
+"want to have in the release to the release branch. When this period is "
+"over, the code enters a 15 day code freeze in which only bug fixes, "
+"documentation updates, security-related fixes and minor device driver "
+"changes are allowed. These changes must be approved by the release engineer "
+"in advance. At the beginning of the last 15 day period a release candidate "
+"is created for widespread testing. Updates are less likely to be allowed "
+"during this period, except for important bug fixes and security updates. In "
+"this final period, all releases are considered release candidates. At the "
+"end of the release process, a release is created with the new version "
+"number, including binary distributions on web sites and the creation of CD-"
+"ROM images. However, the release is not considered \"really released\" "
+"until a crossref:dev-model[tool-pgp, Pretty Good Privacy]-signed message "
+"stating exactly that, is sent to the mailing list freebsd-announce; anything "
+"labelled as a \"release\" before that may well be in-process and subject to "
+"change before the PGP-signed message is sent. footnote:[Many commercial "
+"vendors use these images to create CD-ROMs that are sold in retail outlets.]."
+msgstr ""
+"Для выпусков ветки -STABLE процесс выпуска начинается за 45 дней до "
+"предполагаемой даты релиза. В течение первой фазы, первых 15 дней, "
+"разработчики переносят изменения из -CURRENT, которые они хотят включить в "
+"релиз, в ветку выпуска. По окончании этого периода код входит в 15-дневный "
+"период заморозки, в течение которого допускаются только исправления ошибок, "
+"обновления документации, исправления, связанные с безопасностью, и "
+"незначительные изменения драйверов устройств. Эти изменения должны быть "
+"предварительно одобрены инженером выпуска. В начале последнего 15-дневного "
+"периода создается кандидат на выпуск для широкого тестирования. В этот "
+"период вероятность внесения изменений снижается, за исключением важных "
+"исправлений ошибок и обновлений безопасности. В этот заключительный период "
+"все выпуски считаются кандидатами на выпуск. По завершении процесса выпуска "
+"создается релиз с новым номером версии, включая бинарные дистрибутивы на веб-"
+"сайтах и создание образов CD-ROM. Однако релиз не считается «действительно "
+"выпущенным» до тех пор, пока на список рассылки freebsd-announce не будет "
+"отправлено сообщение, подписанное с помощью crossref:dev-model[tool-pgp, "
+"Pretty Good Privacy], в котором явно указано, что релиз состоялся; все, что "
+"обозначено как «релиз» до этого момента, может находиться в процессе "
+"доработки и изменяться до отправки PGP-подписанного сообщения. footnote:"
+"[Многие коммерческие поставщики используют эти образы для создания CD-ROM, "
+"которые продаются в розничных магазинах.]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1026
+msgid ""
+"The releases of the -CURRENT-branch (that is, all releases that end with "
+"\".0\") are very similar, but with twice as long timeframe. It starts 8 "
+"weeks prior to the release with announcement of the release time line. Two "
+"weeks into the release process, the feature freeze is initiated and "
+"performance tweaks should be kept to a minimum. Four weeks prior to the "
+"release, an official beta version is made available. Two weeks prior to "
+"release, the code is officially branched into a new version. This version "
+"is given release candidate status, and as with the release engineering of "
+"-STABLE, the code freeze of the release candidate is hardened. However, "
+"development on the main development branch can continue. Other than these "
+"differences, the release engineering processes are alike."
+msgstr ""
+"Версии ветки -CURRENT (то есть все версии, оканчивающиеся на \".0\"), очень "
+"похожи, но с вдвое большим временным промежутком. Процесс начинается за 8 "
+"недель до выпуска с объявления графика релиза. Через две недели после начала "
+"процесса выпуска вводится заморозка функциональности, и оптимизация "
+"производительности должна быть сведена к минимуму. За четыре недели до "
+"выпуска становится доступна официальная бета-версия. За две недели до "
+"выпуска код официально ветвится в новую версию. Этой версии присваивается "
+"статус релиз-кандидата, и, как и в случае с разработкой -STABLE, заморозка "
+"кода релиз-кандидата ужесточается. Однако разработка на основной ветке "
+"разработки может продолжаться. За исключением этих различий, процессы "
+"разработки релизов схожи."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1030
+#, fuzzy
+#| msgid ""
+#| "*.0 releases go into their own branch and are aimed mainly at early "
+#| "adopters.\n"
+#| "The branch then goes through a period of stabilisation, and it is not "
+#| "until the\n"
+#| "crossref:dev-model[role-releng, Release Engineering Team] decides the "
+#| "demands to stability have been satisfied that the branch becomes -STABLE "
+#| "and -CURRENT targets the next major version. While this for the majority "
+#| "has been with *.1 versions, this is not a demand.\n"
+msgid ""
+"*.0 releases go into their own branch and are aimed mainly at early "
+"adopters. The branch then goes through a period of stabilisation, and it is "
+"not until the crossref:dev-model[role-releng, Release Engineering Team] "
+"decides the demands to stability have been satisfied that the branch becomes "
+"-STABLE and -CURRENT targets the next major version. While this for the "
+"majority has been with *.1 versions, this is not a demand."
+msgstr ""
+"*.0 выпуски выделяются в отдельную ветку и ориентированы в основном на "
+"ранних последователей.\n"
+"Затем ветка проходит период стабилизации, и только после того, как\n"
+"crossref:dev-model[role-releng, Команда разработки релизов] решит, что "
+"требования к стабильности выполнены, ветка становится -STABLE, а -CURRENT "
+"переключается на следующую мажорную версию. Хотя в большинстве случаев это "
+"происходило с версиями *.1, это не является обязательным требованием.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1035
+msgid ""
+"Most releases are made when a given date that has been deemed a long enough "
+"time since the previous release comes. A target is set for having major "
+"releases every 18 months and minor releases every 4 months. The user "
+"community has made it very clear that security and stability cannot be "
+"sacrificed by self-imposed deadlines and target release dates. For slips of "
+"time not to become too long with regards to security and stability issues, "
+"extra discipline is required when committing changes to -STABLE."
+msgstr ""
+"Большинство выпусков происходит по достижении даты, которая считается "
+"достаточно отдалённой от предыдущего выпуска. Установлена цель выпускать "
+"основные версии каждые 18 месяцев, а промежуточные — каждые 4 месяца. "
+"Сообщество пользователей чётко дало понять, что безопасность и стабильность "
+"не могут быть принесены в жертву из-за самостоятельно установленных сроков и "
+"целевых дат выпуска. Чтобы задержки не становились слишком длинными в "
+"вопросах безопасности и стабильности, требуется дополнительная дисциплина "
+"при внесении изменений в -STABLE."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1037
+msgid "Make release schedule"
+msgstr "Сделать график выпуска релизов"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1038
+msgid "Feature freeze"
+msgstr "Заморозить функциональность"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1039
+msgid "Code freeze"
+msgstr "Заморозка кода"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1040
+msgid "Make branch"
+msgstr "Создать ветку"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1041
+msgid "Release candidate"
+msgstr "Кандидат на выпуск"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1042
+msgid ""
+"Stabilize release (loop back to previous step as many times as necessary; "
+"when release is considered stable, proceed with next step)"
+msgstr ""
+"Стабилизировать выпуск (при необходимости вернуться к предыдущему шагу; "
+"когда выпуск считается стабильным, перейти к следующему шагу)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1043
+msgid "Build packages"
+msgstr "Собрать пакеты"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1044
+msgid "Warn mirrors"
+msgstr "Предупредить сайты-зеркала"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1045
+msgid "Publish release"
+msgstr "Опубликовать выпуск"
+
+#. Keep the spaces around the external square bracket to avoid a warning in the
+#. PDF converter
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1049
+#, fuzzy
+#| msgid "[crossref:dev-model[freebsd-handle-pr, FreeBSD, 2002C]]."
+msgid "[ crossref:dev-model[freebsd-releng, FreeBSD, 2002E] ]"
+msgstr "[crossref::dev-model[freebsd-handle-pr, FreeBSD, 2002C]]."
+
+#. type: Title ==
+#: documentation/content/en/books/dev-model/_index.adoc:1051
+#, no-wrap
+msgid "Tools"
+msgstr "Инструменты"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1055
+msgid ""
+"The major support tools for supporting the development process are Bugzilla, "
+"Mailman, and OpenSSH. These are externally developed tools and are commonly "
+"used in the open source world."
+msgstr ""
+"Основные инструменты поддержки процесса разработки — это Bugzilla, Mailman и "
+"OpenSSH. Это инструменты, разработанные сторонними организациями, которые "
+"широко используются в мире открытого исходного кода."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:1057
+#, no-wrap
+msgid "Git"
+msgstr "Git"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1061
+msgid ""
+"Git is a system to handle multiple versions of text files and tracking who "
+"committed what changes and why. A project lives within a \"repository\" and "
+"different versions are considered different \"branches\"."
+msgstr ""
+"Git — это система для управления несколькими версиями текстовых файлов, "
+"отслеживания внесённых изменений, их авторов и причин. Проект хранится в "
+"«репозитории», а разные версии считаются разными «ветками»."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:1063
+#, no-wrap
+msgid "Bugzilla"
+msgstr "Bugzilla"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1069
+msgid ""
+"Bugzilla is a maintenance database consisting of a set of tools to track "
+"bugs at a central site. It supports the bug tracking process for sending "
+"and handling bugs as well as querying and updating the database and editing "
+"bug reports. The project uses its web interface to send \"Problem Reports\" "
+"to the project's central Bugzilla server. The committers also have web and "
+"command-line clients."
+msgstr ""
+"Bugzilla — это база данных для сопровождения, состоящая из набора "
+"инструментов для отслеживания ошибок на центральном сайте. Она поддерживает "
+"процесс отслеживания ошибок, включая отправку и обработку ошибок, а также "
+"запросы и обновление базы данных, а также редактирование отчётов об ошибках. "
+"Проект использует веб-интерфейс для отправки \"Отчётов о проблемах\" на "
+"центральный сервер Bugzilla проекта. У коммиттеров также есть веб- и "
+"командные клиенты."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:1071
+#, no-wrap
+msgid "Mailman"
+msgstr "Mailman"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1079
+msgid ""
+"Mailman is a program that automates the management of mailing lists. The "
+"FreeBSD Project uses it to run 16 general lists, 60 technical lists, 4 "
+"limited lists and 5 lists with Git commit logs. It is also used for many "
+"mailing lists set up and used by other people and projects in the FreeBSD "
+"community. General lists are lists for the general public, technical lists "
+"are mainly for the development of specific areas of interest, and closed "
+"lists are for internal communication not intended for the general public. "
+"The majority of all the communication in the project goes through these 85 "
+"lists [crossref:dev-model[ref-bsd-handbook, FreeBSD, 2003A], Appendix C]."
+msgstr ""
+"Mailman - это программа, которая автоматизирует управление почтовыми "
+"рассылками. Проект FreeBSD использует ее для ведения 16 общих рассылок, 60 "
+"технических рассылок, 4 ограниченных рассылок и 5 рассылок с логами коммитов "
+"Git. Она также используется для многих почтовых рассылок, созданных и "
+"используемых другими людьми и проектами в сообществе FreeBSD. Общие рассылки "
+"предназначены для широкой публики, технические рассылки в основном "
+"предназначены для разработки определенных областей интересов, а закрытые "
+"рассылки используются для внутренней коммуникации, не предназначенной для "
+"широкой публики. Большая часть всей коммуникации в проекте проходит через "
+"эти 85 рассылок [crossref:dev-model[ref-bsd-handbook, FreeBSD, 2003A], "
+"Приложение C]."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:1081
+#, no-wrap
+msgid "Pretty Good Privacy"
+msgstr "Pretty Good Privacy"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1086
+msgid ""
+"Pretty Good Privacy, better known as PGP, is a cryptosystem using a public "
+"key architecture to allow people to digitally sign and/or encrypt "
+"information in order to ensure secure communication between two parties. A "
+"signature is used when sending information out to many recipients, enabling "
+"them to verify that the information has not been tampered with before they "
+"received it. In the FreeBSD Project this is the primary means of ensuring "
+"that information has been written by the person who claims to have written "
+"it, and not altered in transit."
+msgstr ""
+"Pretty Good Privacy, более известный как PGP, — это криптосистема, "
+"использующая архитектуру открытого ключа, чтобы позволить пользователям "
+"подписывать и/или шифровать информацию цифровой подписью для обеспечения "
+"безопасной связи между двумя сторонами. Подпись используется при отправке "
+"информации множеству получателей, позволяя им убедиться, что информация не "
+"была изменена до того, как они её получили. В проекте FreeBSD это основной "
+"способ убедиться, что информация была написана тем, кто утверждает, что её "
+"создал, и не была изменена в процессе передачи."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:1088
+#, no-wrap
+msgid "Secure Shell"
+msgstr "Secure Shell (SSH)"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1095
+msgid ""
+"Secure Shell is a standard for securely logging into a remote system and for "
+"executing commands on the remote system. It allows other connections, "
+"called tunnels, to be established and protected between the two involved "
+"systems. This standard exists in two primary versions, and only version two "
+"is used for the FreeBSD Project. The most common implementation of the "
+"standard is OpenSSH that is a part of the project's main distribution. "
+"Since its source is updated more often than FreeBSD releases, the latest "
+"version is also available in the ports tree."
+msgstr ""
+"Secure Shell - это стандарт безопасного входа в удалённую систему и "
+"выполнения команд на ней. Он позволяет устанавливать и защищать другие "
+"соединения, называемые туннелями, между двумя взаимодействующими системами. "
+"Этот стандарт существует в двух основных версиях, и только версия два "
+"используется в проекте FreeBSD. Наиболее распространённая реализация "
+"стандарта - OpenSSH, которая входит в основную дистрибуцию проекта. "
+"Поскольку её исходный код обновляется чаще, чем выпуски FreeBSD, последняя "
+"версия также доступна в дереве портов."
+
+#. type: Title ==
+#: documentation/content/en/books/dev-model/_index.adoc:1097
+#, no-wrap
+msgid "Sub-projects"
+msgstr "Подпроекты"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1100
+msgid ""
+"Sub-projects are formed to reduce the amount of communication needed to "
+"coordinate the group of developers. When a problem area is sufficiently "
+"isolated, most communication would be within the group focusing on the "
+"problem, requiring less communication with the groups they communicate with "
+"than were the group not isolated."
+msgstr ""
+"Подпроекты создаются для уменьшения объема коммуникации, необходимой для "
+"координации группы разработчиков. Когда проблемная область достаточно "
+"изолирована, большая часть коммуникации происходит внутри группы, "
+"сосредоточенной на проблеме, что требует меньше общения с другими группами "
+"по сравнению с ситуацией, когда группа не изолирована."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:1102
+#, no-wrap
+msgid "The Ports Subproject"
+msgstr "Подпроект Ports"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1106
+msgid ""
+"A \"port\" is a set of meta-data and patches that are needed to fetch, "
+"compile and install correctly an external piece of software on a FreeBSD "
+"system. The amount of ports has grown at a tremendous rate, as shown by the "
+"following figure."
+msgstr ""
+"\"Порт\" — это набор метаданных и патчей, необходимых для загрузки, "
+"компиляции и корректной установки внешнего программного обеспечения в "
+"системе FreeBSD. Количество портов растёт с огромной скоростью, как показано "
+"на следующем рисунке."
+
+#. type: Block title
+#: documentation/content/en/books/dev-model/_index.adoc:1107
+#, no-wrap
+msgid "Number of ports added between 1995 and 2022"
+msgstr "Количество портов, добавленных между 1995 и 2022 годами"
+
+#. type: Target for macro image
+#: documentation/content/en/books/dev-model/_index.adoc:1109
+#, no-wrap
+msgid "portsstatus.svg"
+msgstr "portsstatus.svg"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1113
+msgid ""
+"crossref:dev-model[fig-ports,image::portsstatus.svg] shows the number of "
+"ports available to FreeBSD in the period 1995 to 2022. It looks like the "
+"curve has first grown exponentially, and then from the middle of 2001 to the "
+"middle of 2007 grown linearly at a rate of about 2000 ports/year, before its "
+"growth rate gets lower."
+msgstr ""
+"crossref:dev-model[fig-ports,image::portsstatus.svg] показывает количество "
+"портов, доступных для FreeBSD в период с 1995 по 2022 год. Похоже, что "
+"кривая сначала росла экспоненциально, а затем с середины 2001 до середины "
+"2007 года росла линейно со скоростью около 2000 портов/год, после чего "
+"скорость роста снизилась."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1116
+msgid ""
+"As the external software described by the port often is under continued "
+"development, the amount of work required to maintain the ports is already "
+"large, and increasing. This has led to the ports part of the FreeBSD "
+"project gaining a more empowered structure, and is more and more becoming a "
+"sub-project of the FreeBSD project."
+msgstr ""
+"Поскольку внешнее программное обеспечение, описываемое портом, часто "
+"находится в стадии активной разработки, объем работы, необходимой для "
+"поддержки портов, уже велик и продолжает расти. Это привело к тому, что "
+"часть проекта FreeBSD, связанная с портами, получила более самостоятельную "
+"структуру и все больше становится подпроектом проекта FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1119
+msgid ""
+"Ports has its own core team with the crossref:dev-model[role-ports-manager, "
+"Ports Manager] as its leader, and this team can appoint committers without "
+"FreeBSD Core's approval. Unlike in the FreeBSD Project, where a lot of "
+"maintenance frequently is rewarded with a commit bit, the ports sub-project "
+"contains many active maintainers that are not committers."
+msgstr ""
+"Порты имеют свою собственную основную команду с crossref:dev-model[role-"
+"ports-manager, Менеджером Портов] во главе, и эта команда может назначать "
+"коммиттеров без одобрения Основной команды FreeBSD (Core Team). В отличие от "
+"проекта FreeBSD, где активное сопровождение часто вознаграждается правом "
+"коммита, подпроект портов включает множество активных сопровождающих, не "
+"являющихся коммиттерами."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1123
+msgid ""
+"Unlike the main project, the ports tree is not branched. Every release of "
+"FreeBSD follows the current ports collection and has thus available updated "
+"information on where to find programs and how to build them. This, however, "
+"means that a port that makes dependencies on the system may need to have "
+"variations depending on what version of FreeBSD it runs on."
+msgstr ""
+"В отличие от основного проекта, дерево портов не разветвляется. Каждый "
+"выпуск FreeBSD следует текущей коллекции портов, что обеспечивает доступ к "
+"обновлённой информации о том, где найти программы и как их собрать. Однако "
+"это означает, что порт, зависящий от системы, может требовать изменений в "
+"зависимости от версии FreeBSD, на которой он запущен."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1126
+msgid ""
+"With an unbranched ports repository it is not possible to guarantee that any "
+"port will run on anything other than -CURRENT and -STABLE, in particular "
+"older, minor releases. There is neither the infrastructure nor volunteer "
+"time needed to guarantee this."
+msgstr ""
+"С неразветвлённым репозиторием портов невозможно гарантировать, что любой "
+"порт будет работать на чём-либо, кроме -CURRENT и -STABLE, в частности на "
+"старых, минорных выпусках. Для этого нет ни инфраструктуры, ни времени "
+"волонтёров."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1128
+msgid ""
+"For efficiency of communication, teams depending on Ports, such as the "
+"release engineering team, have their own ports liaisons."
+msgstr ""
+"Команды, зависящие от Ports, такие как команда выпуска релизов, для "
+"эффективности коммуникации имеют своих собственных представителей по портам."
+
+#. type: Title ===
+#: documentation/content/en/books/dev-model/_index.adoc:1130
+#, no-wrap
+msgid "The FreeBSD Documentation Project"
+msgstr "Проект документации FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1135
+msgid ""
+"The FreeBSD Documentation project was started January 1995. From the "
+"initial group of a project leader, four team leaders and 16 members, they "
+"are now a total of 44 committers. The documentation mailing list has just "
+"under 300 members, indicating that there is quite a large community around "
+"it."
+msgstr ""
+"Проект документации FreeBSD был начат в январе 1995 года. От первоначальной "
+"группы, состоявшей из руководителя проекта, четырёх руководителей команд и "
+"16 участников, сейчас общее число коммиттеров достигло 44. Список рассылки "
+"документации насчитывает чуть менее 300 участников, что указывает на "
+"довольно большое сообщество вокруг него."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1137
+msgid ""
+"The goal of the Documentation project is to provide good and useful "
+"documentation of the FreeBSD project, thus making it easier for new users to "
+"get familiar with the system and detailing advanced features for the users."
+msgstr ""
+"Цель проекта Документации — предоставить качественную и полезную "
+"документацию проекта FreeBSD, чтобы новые пользователи могли легче освоить "
+"систему, а также подробно описать расширенные функции для пользователей."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1139
+msgid ""
+"The main tasks in the Documentation project are to work on current projects "
+"in the \"FreeBSD Documentation Set\", and translate the documentation to "
+"other languages."
+msgstr ""
+"Основные задачи проекта Documentation — работа над текущими проектами в "
+"\"Наборе документации FreeBSD\" и перевод документации на другие языки."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1143
+msgid ""
+"Like the FreeBSD Project, documentation is split in the same branches. This "
+"is done so that there is always an updated version of the documentation for "
+"each version. Only documentation errors are corrected in the security "
+"branches."
+msgstr ""
+"Как и проект FreeBSD, документация разделена на те же ветви. Это сделано для "
+"того, чтобы для каждой версии всегда была обновлённая документация. В ветвях "
+"безопасности исправляются только ошибки в документации."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1147
+msgid ""
+"Like the ports sub-project, the Documentation project can appoint "
+"documentation committers without FreeBSD Core's approval. [crossref:dev-"
+"model[freebsd-doceng-charter, FreeBSD, 2003B]]."
+msgstr ""
+"Как и подпроект ports, проект Documentation может назначать коммиттеров "
+"документации без одобрения основной команды FreeBSD (Core Team). "
+"[crossref:dev-model[freebsd-doceng-charter, FreeBSD, 2003B]]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1150
+msgid ""
+"The Documentation project has extref:{fdp-primer}[a primer]. This is used "
+"both to introduce new project members to the standard tools and syntaxes and "
+"to act as a reference when working on the project."
+msgstr ""
+"Проект документации включает в себя extref:{fdp-primer}[вводное "
+"руководство]. Оно используется как для ознакомления новых участников проекта "
+"со стандартными инструментами и синтаксисом, так и в качестве справочника "
+"при работе над проектом."
+
+#. type: Title ==
+#: documentation/content/en/books/dev-model/_index.adoc:1155
+#, no-wrap
+msgid "References"
+msgstr "Список литературы"
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1159
+msgid ""
+"[Brooks, 1995] Frederick P. Brooks. Copyright © 1975, 1995 Pearson Education "
+"Limited. 0201835959. Addison-Wesley Pub Co. The Mythical Man-Month. Essays "
+"on Software Engineering, Anniversary Edition (2nd Edition)."
+msgstr ""
+"[Brooks, 1995] Фредерик П. Брукс. Авторское право © 1975, 1995 Pearson "
+"Education Limited. 0201835959. Addison-Wesley Pub Co. Мифический "
+"человекомесяц. Эссе о программной инженерии, юбилейное издание (2-е издание)."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1162
+msgid ""
+"[Saers, 2003] Niklas Saers. Copyright © 2003. A project model for the "
+"FreeBSD Project. Candidatus Scientiarum thesis. http://niklas.saers.com/"
+"thesis."
+msgstr ""
+"[Saers, 2003] Никлас Саерс. Авторское право © 2003. Модель проекта для "
+"FreeBSD. Кандидатская диссертация. http://niklas.saers.com/thesis."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1165
+msgid ""
+"[Jørgensen, 2001] Niels Jørgensen. Copyright © 2001. Putting it All in the "
+"Trunk. Incremental Software Development in the FreeBSD Open Source Project. "
+"http://www.dat.ruc.dk/~nielsj/research/papers/freebsd.pdf."
+msgstr ""
+"[Йоргенсен, 2001] Нильс Йоргенсен. Copyright © 2001. _Putting it All in the "
+"Trunk. Incremental Software Development in the FreeBSD Open Source Project_. "
+"http://www.dat.ruc.dk/~nielsj/research/papers/freebsd.pdf."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1168
+msgid ""
+"[PMI, 2000] Project Management Institute. Copyright © 1996, 2000 Project "
+"Management Institute. 1-880410-23-0. Project Management Institute. Newtown "
+"Square Pennsylvania USA . PMBOK Guide. A Guide to the Project Management "
+"Body of Knowledge, 2000 Edition."
+msgstr ""
+"[PMI, 2000] Институт управления проектами. Copyright © 1996, 2000 Институт "
+"управления проектами. 1-880410-23-0. Институт управления проектами. Ньютаун "
+"Сквер, Пенсильвания, США. PMBOK Guide. A Guide to the Project Management "
+"Body of Knowledge (Руководство PMBOK. Руководство к своду знаний по "
+"управлению проектами), издание 2000 года."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1171
+msgid ""
+"[FreeBSD, 2000A] Copyright © 2002 The FreeBSD Project. Core Bylaws. https://"
+"www.freebsd.org/internal/bylaws/."
+msgstr ""
+"[FreeBSD, 2000A] Copyright © 2002 The FreeBSD Project. Core Bylaws. https://"
+"www.freebsd.org/internal/bylaws/."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1174
+msgid ""
+"[FreeBSD, 2002A] Copyright © 2002 The FreeBSD Documentation Project. FreeBSD "
+"Developer's Handbook. extref:{developers-handbook}[Developers Handbook]."
+msgstr ""
+"[FreeBSD, 2002A] Copyright © 2002 The FreeBSD Documentation Project. "
+"Руководство FreeBSD для разработчиков. extref:{developers-handbook}"
+"[Руководство FreeBSD для разработчиков]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1177
+msgid ""
+"[FreeBSD, 2002B] Copyright © 2002 The FreeBSD Project. Core team election "
+"2002. http://election.uk.freebsd.org/candidates.html."
+msgstr ""
+"[FreeBSD, 2002B] Copyright © 2002 Проект FreeBSD. Выборы состава основной "
+"команды (Core Team) 2002. http://election.uk.freebsd.org/candidates.html."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1180
+msgid ""
+"[FreeBSD, 2002C] Dag-Erling Smørgrav and Hiten Pandya. Copyright © 2002 The "
+"FreeBSD Documentation Project. The FreeBSD Documentation Project. Problem "
+"Report Handling Guidelines. extref:{pr-guidelines}[Problem Report Handling "
+"Guidelines]."
+msgstr ""
+"[FreeBSD, 2002C] Даг-Эрлинг Смёрграв и Хитен Пандья. Copyright © 2002 The "
+"FreeBSD Documentation Project. The FreeBSD Documentation Project. "
+"Рекомендации по работе с сообщениями о проблемах. extref:{pr-guidelines}"
+"[Рекомендации по работе с сообщениями о проблемах]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1183
+msgid ""
+"[FreeBSD, 2002D] Dag-Erling Smørgrav. Copyright © 2002 The FreeBSD "
+"Documentation Project. The FreeBSD Documentation Project. Writing FreeBSD "
+"Problem Reports. extref:{problem-reports}[Writing FreeBSD Problem Reports]."
+msgstr ""
+"[FreeBSD, 2002D] Даг-Эрлинг Смёрграв. Copyright © 2002 Проект документации "
+"FreeBSD. Проект документации FreeBSD. Составление сообщений о проблеме во "
+"FreeBSD. extref:{problem-reports}[Составление сообщений о проблеме во "
+"FreeBSD]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1186
+msgid ""
+"[FreeBSD, 2001] Copyright © 2001 The FreeBSD Documentation Project. The "
+"FreeBSD Documentation Project. Committers Guide. extref:{committers-guide}"
+"[Committer's Guide]."
+msgstr ""
+"[FreeBSD, 2001] Copyright © 2001 The FreeBSD Documentation Project. The "
+"FreeBSD Documentation Project. Справочник коммиттера. extref:{committers-"
+"guide}[Справочник коммиттера]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1189
+msgid ""
+"[FreeBSD, 2002E] Murray Stokely. Copyright © 2002 The FreeBSD Documentation "
+"Project. The FreeBSD Documentation Project. FreeBSD Release Engineering. "
+"extref:{releng}[FreeBSD Release Engineering]."
+msgstr ""
+"[FreeBSD, 2002E] Мюррей Стокли. Copyright © 2002 The FreeBSD Documentation "
+"Project. Проект документации FreeBSD. Подготовка релизов FreeBSD. extref:"
+"{releng}[Подготовка релизов FreeBSD]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1192
+msgid ""
+"[FreeBSD, 2003A] The FreeBSD Documentation Project. FreeBSD Handbook. extref:"
+"{handbook}[FreeBSD Handbook]."
+msgstr ""
+"[FreeBSD, 2003A] Проект документации FreeBSD. Руководство FreeBSD. extref:"
+"{handbook}[Руководство FreeBSD]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1195
+msgid ""
+"[FreeBSD, 2002F] Copyright © 2002 The FreeBSD Documentation Project. The "
+"FreeBSD Documentation Project. Contributors to FreeBSD. extref:{contributors}"
+"[Contributors to FreeBSD]."
+msgstr ""
+"[FreeBSD, 2002F] Copyright © 2002 The FreeBSD Documentation Project. Проект "
+"документации FreeBSD. Участники проекта FreeBSD. extref:{contributors}"
+"[Участники проекта FreeBSD]."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1198
+msgid ""
+"[FreeBSD, 2002G] Copyright © 2002 The FreeBSD Project. The FreeBSD Project. "
+"Core team elections 2002. http://election.uk.freebsd.org."
+msgstr ""
+"[FreeBSD, 2002G] Copyright © 2002 The FreeBSD Project. The FreeBSD Project. "
+"Выборы состава основной команды (Core Team) 2002. http://"
+"election.uk.freebsd.org."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1201
+msgid ""
+"[FreeBSD, 2002H] Copyright © 2002 The FreeBSD Project. The FreeBSD Project. "
+"Commit Bit Expiration Policy. 2002/04/06 15:35:30. https://www.freebsd.org/"
+"internal/expire-bits/."
+msgstr ""
+"[FreeBSD, 2002H] Copyright © 2002 The FreeBSD Project. The FreeBSD Project. "
+"Политика истечения срока действия битов коммитов. 2002/04/06 15:35:30. "
+"https://www.freebsd.org/internal/expire-bits/."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1204
+msgid ""
+"[FreeBSD, 2002I] Copyright © 2002 The FreeBSD Project. The FreeBSD Project. "
+"New Account Creation Procedure. 2002/08/19 17:11:27. https://www.freebsd.org/"
+"internal/new-account/."
+msgstr ""
+"[FreeBSD, 2002I] Copyright © 2002 The FreeBSD Project. The FreeBSD Project. "
+"Процедура создания нового аккаунта. 2002/08/19 17:11:27. https://"
+"www.freebsd.org/internal/new-account/."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1207
+msgid ""
+"[FreeBSD, 2003B] Copyright © 2002 The FreeBSD Documentation Project. The "
+"FreeBSD Documentation Project. FreeBSD DocEng Team Charter. 2003/03/16 "
+"12:17. https://www.freebsd.org/internal/doceng/."
+msgstr ""
+"[FreeBSD, 2003B] Copyright © 2002 The FreeBSD Documentation Project. The "
+"FreeBSD Documentation Project. Устав команды разработчиков документации "
+"FreeBSD. 2003/03/16 12:17. https://www.freebsd.org/internal/doceng/."
+
+#. type: Plain text
+#: documentation/content/en/books/dev-model/_index.adoc:1209
+msgid ""
+"[Lehey, 2002] Greg Lehey. Copyright © 2002 Greg Lehey. Greg Lehey. Two years "
+"in the trenches. The evolution of a software project. http://www.lemis.com/"
+"grog/In-the-trenches.pdf."
+msgstr ""
+"[Lehey, 2002] Грег Лехи. Copyright © 2002 Грег Лехи. Грег Лехи. Two years in "
+"the trenches. The evolution of a software project (Два года в окопах. "
+"Эволюция программного проекта). http://www.lemis.com/grog/In-the-"
+"trenches.pdf."
+
+#~ msgid ""
+#~ "There are, however, no automatic procedures for doing this. For "
+#~ "reactions concerning commit privileges not triggered by time, see "
+#~ "crossref:dev-model[process-reactions,section 1.5.8]."
+#~ msgstr ""
+#~ "Однако не существует автоматических процедур для этого. Для действий, "
+#~ "связанных с привилегиями коммитов, не вызванных временем, см. "
+#~ "crossref:dev-model[process-reactions,раздел 1.5.8]."
diff --git a/documentation/content/ru/books/developers-handbook/_index.adoc b/documentation/content/ru/books/developers-handbook/_index.adoc
index 98a3fbc883..9e83164861 100644
--- a/documentation/content/ru/books/developers-handbook/_index.adoc
+++ b/documentation/content/ru/books/developers-handbook/_index.adoc
@@ -1,24 +1,31 @@
---
-title: Руководство FreeBSD для разработчиков
+add_single_page_link: true
authors:
- - author: The FreeBSD Documentation Project
-copyright: 1995-2020 The FreeBSD Documentation Project
+ -
+ author: 'The FreeBSD Documentation Project'
+bookOrder: 25
+copyright: '1995-2023 The FreeBSD Documentation Project'
+description: 'Для тех, кто хочет разрабатывать программное обеспечение для FreeBSD (а не только для тех, кто разрабатывает саму FreeBSD)'
+next: books/developers-handbook/parti
+params:
+ path: /books/developers-handbook/
+showBookMenu: true
+tags: "[\"FreeBSD Developers' Handbook\"]"
+title: 'Руководство разработчика FreeBSD'
trademarks: ["freebsd", "apple", "ibm", "ieee", "intel", "linux", "microsoft", "opengroup", "sun", "general"]
-isIndex: true
+weight: 0
---
-= Руководство FreeBSD для разработчиков
+= Руководство разработчика FreeBSD
:doctype: book
:toc: macro
-:toclevels: 2
+:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:partnums:
:source-highlighter: rouge
:experimental:
-:book: true
-:pdf: false
:images-path: books/developers-handbook/
ifdef::env-beastie[]
@@ -30,245 +37,21 @@ include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
-:chapters-path: content/{{% lang %}}/books/developers-handbook/
endif::[]
ifdef::backend-pdf,backend-epub3[]
-:chapters-path:
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]
ifndef::env-beastie[]
-:chapters-path:
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
[.abstract-title]
Аннотация
-Добро пожаловать в руководство FreeBSD для разработчиков.
+Добро пожаловать в Руководство разработчика. Этот документ находится в _процессе разработки_ и создаётся усилиями многих людей. Многие разделы пока отсутствуют, а существующие нуждаются в обновлении. Если вы хотите помочь с этим проектом, отправьте письмо на {freebsd-doc}.
-'''
-
-toc::[]
-
-[[introduction]]
-= Введение
-
-[[developmentplatform]]
-== Разработка во FreeBSD
-
-Здесь необходимо будет обсудить FreeBSD в качестве платформы для разработки, подход к этому BSD, обзор архитектуры, структура /usr/src, история и так далее.
-
-Спасибо вам за выбор FreeBSD в качестве платформы разработки! Надеемся, что она вас не подведет.
-
-[[bsdvision]]
-== Парадигма BSD
-
-[[archoverview]]
-== Обзор архитектуры
-
-[[sourcelayout]]
-== Структура /usr/src
-
-Полный исходный код FreeBSD имеется на нашем общедоступном хранилище CVS. Как правило, исходный код устанавливается в каталог [.filename]#/usr/src#, содержащий следующие подкаталоги.
-
-[.informaltable]
-[cols="1,1", frame="none", options="header"]
-|===
-| Каталог
-| Описание
-
-|[.filename]#bin/#
-|Исходный код файлов из [.filename]#/bin#
-
-|[.filename]#contrib/#
-|Исходный код файлов программного обеспечения, которое предоставлено третьими лицами.
-
-|[.filename]#crypto/#
-|Исходный код DES
-
-|[.filename]#etc/#
-|Исходный код файлов из [.filename]#/etc#
-
-|[.filename]#games/#
-|Исходный код файлов из [.filename]#/usr/games#
-
-|[.filename]#gnu/#
-|Утилиты, подпадающие под условия GNU Public License
-
-|[.filename]#include/#
-|Исходный код файлов из [.filename]#/usr/include#
-
-|[.filename]#kerberosIV/#
-|Исходный код Kerbereros версии IV
-
-|[.filename]#kerberos5/#
-|Исходный код Kerbereros версии 5
-
-|[.filename]#lib/#
-|Исходный код файлов из [.filename]#/usr/lib#
-
-|[.filename]#libexec/#
-|Исходный код файлов из [.filename]#/usr/libexec#
-
-|[.filename]#release/#
-|Файлы, необходимые для выпуска релиза FreeBSD
-
-|[.filename]#sbin/#
-|Исходный код файлов из [.filename]#/sbin#
-
-|[.filename]#secure/#
-|Исходный код FreeSec
-
-|[.filename]#share/#
-|Исходный код файлов из [.filename]#/sbin#
-
-|[.filename]#sys/#
-|Исходные тексты ядра
-
-|[.filename]#tools/#
-|Инструментальные средства, использемые для обслуживания и тестирования FreeBSD
-
-|[.filename]#usr.bin/#
-|Исходный код файлов из [.filename]#/usr/bin#
-
-|[.filename]#usr.sbin/#
-|Исходный код файлов из [.filename]#/usr/sbin#
-|===
-
-[[Basics]]
-= Основы
-include::{chapters-path}secure/chapter.adoc[leveloffset=+1]
-
-[[kernel]]
-= Ядро
-
-[[kernelhistory]]
-== История ядра Unix
-
-Немного истории о ядре Unix/BSD, системных вызовах, как работают процессы, блокировке, планировке задач, нити (ядра), переключение контекста, сигналы, прерывания, модули и так далее.
-
-[[memory]]
-= Память и виртуальная память
-
-[[virtualmemory]]
-== Виртуальная память
-
-VM, постраничная подкачка и свопирование, выделение памяти, тестирование ошибок утечки памяти, mmap, vnode и так далее.
-
-[[iosystem]]
-= Система ввода/вывода
-
-[[ufs]]
-== UFS
-
-UFS, FFS, Ext2FS, JFS, inodes, buffer cache, labeling, locking, metadata, soft-updates, LFS, portalfs, procfs, vnodes, memory sharing, memory objects, TLBs, caching
-
-[[ipc]]
-= Межпроцессное взаимодействие
+Последняя версия этого документа всегда доступна по ссылке link:https://www.FreeBSD.org[веб-сервер FreeBSD]. Его также можно загрузить в различных форматах и с разными вариантами сжатия с link:https://download.freebsd.org/doc/[сервера загрузки FreeBSD] или одного из многочисленных extref:{handbook}[зеркальных сайтов, mirrors].
-[[signals]]
-== Сигналы
-
-Сигналы, конвейеры, семафоры, очереди сообщений, совместно используемая память, сокеты, двери
-
-[[networking]]
-= Работа в сети
-
-[[sockets]]
-== Сокеты
-
-Сокеты, bpf, IP, TCP, UDP, ICMP, OSI, bridging, firewalling, NAT, коммутация и так далее
-
-[[networkfs]]
-= Сетевые файловые системы
-
-[[afs]]
-== AFS
-
-AFS, NFS, SANs etc]
-
-[[terminal]]
-= Работа с терминалами
-
-[[syscons]]
-== Системные консоли
-
-Syscons, tty, PCVT, последовательная консоль, хранители экрана и так далее
-
-[[sound]]
-= Звук
-
-[[oss]]
-== OSS
-
-OSS, waveforms, etc
-
-[[devicedrivers]]
-= Драйверы устройств
-
-[[usb]]
-== Устройства USB
-
-Эта глава расскажет о механизмах, используемых во FreeBSD для написания драйверов для устройств на шине USB.
-
-[[newbus]]
-== NewBus
-
-Эта глава расскажет об архитектуре NewBus во FreeBSD.
-
-[[architectures]]
-= Аппаратные платформы
-
-[[ia32]]
-== IA-32
-
-Рассказ об архитектурных особенностях FreeBSD/x86.
-
-[[alpha]]
-== Alpha
-
-Рассказ об архитектурных особенностях FreeBSD/alpha.
-
-Описание ошибок выравнивания, как их исправлять и как игнорировать.
-
-Пример ассемблерного кода для FreeBSD/alpha.
-
-[[ia64]]
-== IA-64
-
-Рассказ об архитектурных особенностях FreeBSD/ia64.
-
-[[debuggingpart]]
-= Отладка
-
-[[truss]]
-== Truss
-
-Различные описания того, как отлаживать отдельные компоненты системы при помощи утилит truss, ktrace, gdb, kgdb, etc
-
-[[compatibility]]
-= Обеспечение совместимости
-
-[[linux]]
-== Linux
-
-Linux, SVR4 и так далее
-
-// Appendices
-[[appendices]]
-[bibliography]
-= Приложения
-
-[[COD,1]] [1] Dave A Patterson and John L Hennessy. Copyright(R) 1998 Morgan Kaufmann Publishers, Inc. 1-55860-428-6. Morgan Kaufmann Publishers, Inc. Computer Organization and Design. The Hardware / Software Interface. 1-2.
-
-[[APUE, 2]] [2] W. Richard Stevens. Copyright(R) 1993 Addison Wesley Longman, Inc. 0-201-56317-7. Addison Wesley Longman, Inc. Advanced Programming in the Unix Environment. 1-2.
-
-[[DIFOS, 3]] [3] Marshall Kirk McKusick and George Neville-Neil. Copyright(R) 2004 Addison-Wesley. 0-201-70245-2. Addison-Wesley. The Design and Implementation of the FreeBSD Operating System. 1-2.
-
-[[Phrack, 4]] [4] Aleph One. Phrack 49; "Smashing the Stack for Fun and Profit".
-
-[[StackGuard, 5]] [5] Chrispin Cowan, Calton Pu, and Dave Maier. StackGuard; Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks.
-
-[[OpenBSD, 6]] [6] Todd Miller and Theo de Raadt. strlcpy and strlcat -- consistent, safe string copy and concatenation.
+'''
diff --git a/documentation/content/ru/books/developers-handbook/_index.po b/documentation/content/ru/books/developers-handbook/_index.po
new file mode 100644
index 0000000000..17abcc726d
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/_index.po
@@ -0,0 +1,70 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-07-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbook_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/developers-handbook/_index.adoc:1
+#, no-wrap
+msgid "For people who want to develop software for FreeBSD (and not just people who are developing FreeBSD itself)"
+msgstr "Для тех, кто хочет разрабатывать программное обеспечение для FreeBSD (а не только для тех, кто разрабатывает саму FreeBSD)"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/_index.adoc:1
+#: documentation/content/en/books/developers-handbook/_index.adoc:18
+#, no-wrap
+msgid "FreeBSD Developers' Handbook"
+msgstr "Руководство разработчика FreeBSD"
+
+#. type: .abstract-title
+#: documentation/content/en/books/developers-handbook/_index.adoc:51
+msgid "Abstract"
+msgstr "Аннотация"
+
+#. type: .abstract-title
+#: documentation/content/en/books/developers-handbook/_index.adoc:56
+msgid ""
+"Welcome to the Developers' Handbook. This manual is a _work in progress_ "
+"and is the work of many individuals. Many sections do not yet exist and "
+"some of those that do exist need to be updated. If you are interested in "
+"helping with this project, send email to the {freebsd-doc}."
+msgstr ""
+"Добро пожаловать в Руководство разработчика. Этот документ находится в "
+"_процессе разработки_ и создаётся усилиями многих людей. Многие разделы пока "
+"отсутствуют, а существующие нуждаются в обновлении. Если вы хотите помочь с "
+"этим проектом, отправьте письмо на {freebsd-doc}."
+
+#. type: .abstract-title
+#: documentation/content/en/books/developers-handbook/_index.adoc:59
+msgid ""
+"The latest version of this document is always available from the "
+"link:https://www.FreeBSD.org[FreeBSD World Wide Web server]. It may also be "
+"downloaded in a variety of formats and compression options from the "
+"link:https://download.freebsd.org/doc/[FreeBSD download server] or one of "
+"the numerous extref:{handbook}[mirror sites, mirrors]."
+msgstr ""
+"Последняя версия этого документа всегда доступна по ссылке link:https://"
+"www.FreeBSD.org[веб-сервер FreeBSD]. Его также можно загрузить в различных "
+"форматах и с разными вариантами сжатия с link:https://download.freebsd.org/"
+"doc/[сервера загрузки FreeBSD] или одного из многочисленных extref:{handbook}"
+"[зеркальных сайтов, mirrors]."
+
+#. type: .abstract-title
+#: documentation/content/en/books/developers-handbook/_index.adoc:60
+msgid "'''"
+msgstr "'''"
diff --git a/documentation/content/ru/books/developers-handbook/bibliography/_index.adoc b/documentation/content/ru/books/developers-handbook/bibliography/_index.adoc
new file mode 100644
index 0000000000..d107cef3fa
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/bibliography/_index.adoc
@@ -0,0 +1,62 @@
+---
+description: 'Библиография Руководства разработчика FreeBSD'
+params:
+ path: /books/developers-handbook/bibliography/
+prev: books/developers-handbook/partv
+showBookMenu: true
+tags: "[\"FreeBSD Developers' Handbook\", \"bibliography\"]"
+title: Библиография
+weight: 17
+---
+
+[appendix]
+[[bibliography]]
+= Библиография
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: A
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[COD,1]] [1] Dave A Patterson and John L Hennessy. Copyright(R) 1998 Morgan Kaufmann Publishers, Inc. 1-55860-428-6. Morgan Kaufmann Publishers, Inc. Computer Organization and Design. The Hardware / Software Interface. 1-2.
+
+[[APUE, 2]] [2] W. Richard Stevens. Copyright(R) 1993 Addison Wesley Longman, Inc. 0-201-56317-7. Addison Wesley Longman, Inc. Advanced Programming in the Unix Environment. 1-2.
+
+[[DIFOS, 3]] [3] Marshall Kirk McKusick and George Neville-Neil. Copyright(R) 2004 Addison-Wesley. 0-201-70245-2. Addison-Wesley. The Design and Implementation of the FreeBSD Operating System. 1-2.
+
+[[Phrack, 4]] [4] Aleph One. Phrack 49; "Smashing the Stack for Fun and Profit".
+
+[[StackGuard, 5]] [5] Chrispin Cowan, Calton Pu, and Dave Maier. StackGuard; Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks.
+
+[[OpenBSD, 6]] [6] Todd Miller and Theo de Raadt. strlcpy and strlcat -- consistent, safe string copy and concatenation.
+
diff --git a/documentation/content/ru/books/developers-handbook/bibliography/_index.po b/documentation/content/ru/books/developers-handbook/bibliography/_index.po
new file mode 100644
index 0000000000..82f48421ac
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/bibliography/_index.po
@@ -0,0 +1,92 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-06-21 19:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookbibliography_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/developers-handbook/bibliography/_index.adoc:1
+#, no-wrap
+msgid "FreeBSD Developers Handbook Bibliography"
+msgstr "Библиография Руководства разработчика FreeBSD"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/bibliography/_index.adoc:1
+#: documentation/content/en/books/developers-handbook/bibliography/_index.adoc:14
+#, no-wrap
+msgid "Bibliography"
+msgstr "Библиография"
+
+#. type: appendix
+#: documentation/content/en/books/developers-handbook/bibliography/_index.adoc:52
+msgid ""
+"[[COD,1]] [1] Dave A Patterson and John L Hennessy. Copyright(R) 1998 Morgan "
+"Kaufmann Publishers, Inc. 1-55860-428-6. Morgan Kaufmann Publishers, Inc. "
+"Computer Organization and Design. The Hardware / Software Interface. 1-2."
+msgstr ""
+"[[COD,1]] [1] Dave A Patterson and John L Hennessy. Copyright(R) 1998 Morgan "
+"Kaufmann Publishers, Inc. 1-55860-428-6. Morgan Kaufmann Publishers, Inc. "
+"Computer Organization and Design. The Hardware / Software Interface. 1-2."
+
+#. type: appendix
+#: documentation/content/en/books/developers-handbook/bibliography/_index.adoc:54
+msgid ""
+"[[APUE, 2]] [2] W. Richard Stevens. Copyright(R) 1993 Addison Wesley "
+"Longman, Inc. 0-201-56317-7. Addison Wesley Longman, Inc. Advanced "
+"Programming in the Unix Environment. 1-2."
+msgstr ""
+"[[APUE, 2]] [2] W. Richard Stevens. Copyright(R) 1993 Addison Wesley "
+"Longman, Inc. 0-201-56317-7. Addison Wesley Longman, Inc. Advanced "
+"Programming in the Unix Environment. 1-2."
+
+#. type: appendix
+#: documentation/content/en/books/developers-handbook/bibliography/_index.adoc:56
+msgid ""
+"[[DIFOS, 3]] [3] Marshall Kirk McKusick and George Neville-Neil. "
+"Copyright(R) 2004 Addison-Wesley. 0-201-70245-2. Addison-Wesley. The Design "
+"and Implementation of the FreeBSD Operating System. 1-2."
+msgstr ""
+"[[DIFOS, 3]] [3] Marshall Kirk McKusick and George Neville-Neil. "
+"Copyright(R) 2004 Addison-Wesley. 0-201-70245-2. Addison-Wesley. The Design "
+"and Implementation of the FreeBSD Operating System. 1-2."
+
+#. type: appendix
+#: documentation/content/en/books/developers-handbook/bibliography/_index.adoc:58
+msgid ""
+"[[Phrack, 4]] [4] Aleph One. Phrack 49; \"Smashing the Stack for Fun and "
+"Profit\"."
+msgstr ""
+"[[Phrack, 4]] [4] Aleph One. Phrack 49; \"Smashing the Stack for Fun and "
+"Profit\"."
+
+#. type: appendix
+#: documentation/content/en/books/developers-handbook/bibliography/_index.adoc:60
+msgid ""
+"[[StackGuard, 5]] [5] Chrispin Cowan, Calton Pu, and Dave Maier. StackGuard; "
+"Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks."
+msgstr ""
+"[[StackGuard, 5]] [5] Chrispin Cowan, Calton Pu, and Dave Maier. StackGuard; "
+"Automatic Adaptive Detection and Prevention of Buffer-Overflow Attacks."
+
+#. type: appendix
+#: documentation/content/en/books/developers-handbook/bibliography/_index.adoc:62
+msgid ""
+"[[OpenBSD, 6]] [6] Todd Miller and Theo de Raadt. strlcpy and strlcat -- "
+"consistent, safe string copy and concatenation."
+msgstr ""
+"[[OpenBSD, 6]] [6] Todd Miller and Theo de Raadt. strlcpy and strlcat -- "
+"consistent, safe string copy and concatenation."
diff --git a/documentation/content/ru/books/developers-handbook/book.adoc b/documentation/content/ru/books/developers-handbook/book.adoc
new file mode 100644
index 0000000000..1ff909d433
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/book.adoc
@@ -0,0 +1,84 @@
+---
+add_split_page_link: true
+authors:
+ -
+ author: 'The FreeBSD Documentation Project'
+copyright: '1995-2023 The FreeBSD Documentation Project'
+description: 'Для тех, кто хочет разрабатывать программное обеспечение для FreeBSD (а не только для тех, кто разрабатывает саму FreeBSD)'
+tags: "[\"FreeBSD Developers' Handbook\"]"
+title: 'Руководство разработчика FreeBSD'
+trademarks: ["freebsd", "apple", "ibm", "ieee", "intel", "linux", "microsoft", "opengroup", "sun", "general"]
+---
+
+= Руководство разработчика FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:book: true
+:pdf: false
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+:chapters-path: content/{{% lang %}}/books/developers-handbook/
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+:chapters-path:
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+:chapters-path:
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[.abstract-title]
+Аннотация
+
+Добро пожаловать в Руководство разработчика. Этот документ находится в _процессе разработки_ и создаётся усилиями многих людей. Многие разделы пока отсутствуют, а существующие нуждаются в обновлении. Если вы хотите помочь с этим проектом, отправьте письмо на {freebsd-doc}.
+
+Последняя версия этого документа всегда доступна по ссылке link:https://www.FreeBSD.org[веб-сервер FreeBSD]. Его также можно загрузить в различных форматах и с разными вариантами сжатия с link:https://download.freebsd.org/doc/[сервера загрузки FreeBSD] или одного из многочисленных extref:{handbook}[зеркальных сайтов, mirrors].
+
+'''
+
+toc::[]
+
+// Section one
+include::{chapters-path}parti.adoc[]
+include::{chapters-path}introduction/_index.adoc[leveloffset=+1]
+include::{chapters-path}tools/_index.adoc[leveloffset=+1]
+include::{chapters-path}secure/_index.adoc[leveloffset=+1]
+include::{chapters-path}l10n/_index.adoc[leveloffset=+1]
+include::{chapters-path}policies/_index.adoc[leveloffset=+1]
+include::{chapters-path}testing/_index.adoc[leveloffset=+1]
+
+// Section two
+include::{chapters-path}partii.adoc[]
+include::{chapters-path}sockets/_index.adoc[leveloffset=+1]
+include::{chapters-path}ipv6/_index.adoc[leveloffset=+1]
+
+// Section three
+include::{chapters-path}partiii.adoc[]
+include::{chapters-path}kernelbuild/_index.adoc[leveloffset=+1]
+include::{chapters-path}kerneldebug/_index.adoc[leveloffset=+1]
+
+// Section four
+include::{chapters-path}partiv.adoc[]
+include::{chapters-path}x86/_index.adoc[leveloffset=+1]
+
+// Appendices
+include::{chapters-path}partv.adoc[]
+include::{chapters-path}bibliography/_index.adoc[leveloffset=+1]
diff --git a/documentation/content/ru/books/developers-handbook/book.po b/documentation/content/ru/books/developers-handbook/book.po
new file mode 100644
index 0000000000..cf8b6b30d0
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/book.po
@@ -0,0 +1,70 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-07-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookbook/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/developers-handbook/book.adoc:1
+#, no-wrap
+msgid "For people who want to develop software for FreeBSD (and not just people who are developing FreeBSD itself)"
+msgstr "Для тех, кто хочет разрабатывать программное обеспечение для FreeBSD (а не только для тех, кто разрабатывает саму FreeBSD)"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/book.adoc:1
+#: documentation/content/en/books/developers-handbook/book.adoc:12
+#, no-wrap
+msgid "FreeBSD Developers' Handbook"
+msgstr "Руководство разработчика FreeBSD"
+
+#. type: .abstract-title
+#: documentation/content/en/books/developers-handbook/book.adoc:49
+msgid "Abstract"
+msgstr "Аннотация"
+
+#. type: .abstract-title
+#: documentation/content/en/books/developers-handbook/book.adoc:54
+msgid ""
+"Welcome to the Developers' Handbook. This manual is a _work in progress_ "
+"and is the work of many individuals. Many sections do not yet exist and "
+"some of those that do exist need to be updated. If you are interested in "
+"helping with this project, send email to the {freebsd-doc}."
+msgstr ""
+"Добро пожаловать в Руководство разработчика. Этот документ находится в "
+"_процессе разработки_ и создаётся усилиями многих людей. Многие разделы пока "
+"отсутствуют, а существующие нуждаются в обновлении. Если вы хотите помочь с "
+"этим проектом, отправьте письмо на {freebsd-doc}."
+
+#. type: .abstract-title
+#: documentation/content/en/books/developers-handbook/book.adoc:57
+msgid ""
+"The latest version of this document is always available from the "
+"link:https://www.FreeBSD.org[FreeBSD World Wide Web server]. It may also be "
+"downloaded in a variety of formats and compression options from the "
+"link:https://download.freebsd.org/doc/[FreeBSD download server] or one of "
+"the numerous extref:{handbook}[mirror sites, mirrors]."
+msgstr ""
+"Последняя версия этого документа всегда доступна по ссылке link:https://"
+"www.FreeBSD.org[веб-сервер FreeBSD]. Его также можно загрузить в различных "
+"форматах и с разными вариантами сжатия с link:https://download.freebsd.org/"
+"doc/[сервера загрузки FreeBSD] или одного из многочисленных extref:{handbook}"
+"[зеркальных сайтов, mirrors]."
+
+#. type: .abstract-title
+#: documentation/content/en/books/developers-handbook/book.adoc:59
+msgid "'''"
+msgstr "'''"
diff --git a/documentation/content/ru/books/developers-handbook/introduction/_index.adoc b/documentation/content/ru/books/developers-handbook/introduction/_index.adoc
new file mode 100644
index 0000000000..d212e92f3a
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/introduction/_index.adoc
@@ -0,0 +1,86 @@
+---
+authors:
+ -
+ author: 'Murray Stokely'
+ -
+ author: 'Jeroen Ruigrok van der Werven'
+description: 'Введение в Руководство разработчика FreeBSD'
+next: books/developers-handbook/tools
+params:
+ path: /books/developers-handbook/introduction/
+prev: books/developers-handbook/parti
+showBookMenu: true
+tags: ["introduction", "Developing on FreeBSD", "BSD Vision", "Architectural Guidelines"]
+title: 'Глава 1. Введение'
+weight: 2
+---
+
+[[introduction]]
+= Введение
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 1
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[introduction-devel]]
+== Разработка на FreeBSD
+
+Вот мы и здесь. Система установлена, и вы готовы начать программировать. Но с чего начать? Что предоставляет FreeBSD? Что она может сделать для меня как для программиста?
+
+Вот некоторые вопросы, на которые эта глава пытается ответить. Конечно, программирование, как и любое другое ремесло, имеет разные уровни мастерства. Для кого-то это хобби, для других — профессия. Информация в этой главе может быть ориентирована на начинающего программиста; действительно, она может быть полезна программисту, не знакомому с платформой FreeBSD.
+
+[[introduction-bsdvision]]
+== Видение BSD
+
+Создать наилучший пакет операционной системы, подобной UNIX(R), с должным уважением к оригинальной идеологии программных инструментов, а также к удобству использования, производительности и стабильности.
+
+[[introduction-archguide]]
+== Архитектурные рекомендации
+
+Наша идеология может быть описана следующими принципами
+
+* Не добавляйте новую функциональность, если разработчик не может завершить реальное приложение без неё.
+* Важно не только определить, чем является система, но и чем она не является. Не стоит пытаться удовлетворить все возможные потребности; вместо этого сделайте систему расширяемой, чтобы дополнительные требования могли быть реализованы с сохранением совместимости.
+* Худшее, чем обобщение на основе одного примера — это обобщение без примеров вообще.
+* Если проблема не до конца понятна, вероятно, лучше вообще не предоставлять решения.
+* Если вы можете получить 90% желаемого эффекта за 10% работы, используйте более простое решение.
+* Изолируйте сложность настолько, насколько это возможно.
+* Предоставлять механизмы, а не политики. В частности, передайте политику пользовательского интерфейса в руки клиента.
+
+Из Шейфлера и Геттиса: «X Window System»
+
+[[introduction-layout]]
+== Структура каталога /usr/src
+
+Полный исходный код FreeBSD доступен в нашем link:https://cgit.freebsd.org/src/[публичном Git-репозитории]. Исходный код обычно устанавливается в [.filename]#/usr/src#. Структура дерева каталогов исходного кода описана в файле link:https://cgit.freebsd.org/src/tree/README.md[README.md] на верхнем уровне дерева.
diff --git a/documentation/content/ru/books/developers-handbook/introduction/_index.po b/documentation/content/ru/books/developers-handbook/introduction/_index.po
new file mode 100644
index 0000000000..8c010f6a5d
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/introduction/_index.po
@@ -0,0 +1,185 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-07-06 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookintroduction_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:1
+#, no-wrap
+msgid "Introduction to the FreeBSD Developers Handbook"
+msgstr "Введение в Руководство разработчика FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:1
+#, no-wrap
+msgid "Chapter 1. Introduction"
+msgstr "Глава 1. Введение"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:17
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:55
+#, no-wrap
+msgid "Developing on FreeBSD"
+msgstr "Разработка на FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:60
+msgid ""
+"So here we are. System all installed and you are ready to start "
+"programming. But where to start? What does FreeBSD provide? What can it do "
+"for me, as a programmer?"
+msgstr ""
+"Вот мы и здесь. Система установлена, и вы готовы начать программировать. Но "
+"с чего начать? Что предоставляет FreeBSD? Что она может сделать для меня как "
+"для программиста?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:66
+msgid ""
+"These are some questions which this chapter tries to answer. Of course, "
+"programming has different levels of proficiency like any other trade. For "
+"some it is a hobby, for others it is their profession. The information in "
+"this chapter might be aimed toward the beginning programmer; indeed, it "
+"could serve useful for the programmer unfamiliar with the FreeBSD platform."
+msgstr ""
+"Вот некоторые вопросы, на которые эта глава пытается ответить. Конечно, "
+"программирование, как и любое другое ремесло, имеет разные уровни "
+"мастерства. Для кого-то это хобби, для других — профессия. Информация в этой "
+"главе может быть ориентирована на начинающего программиста; действительно, "
+"она может быть полезна программисту, не знакомому с платформой FreeBSD."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:68
+#, no-wrap
+msgid "The BSD Vision"
+msgstr "Видение BSD"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:71
+msgid ""
+"To produce the best UNIX(R) like operating system package possible, with due "
+"respect to the original software tools ideology as well as usability, "
+"performance and stability."
+msgstr ""
+"Создать наилучший пакет операционной системы, подобной UNIX(R), с должным "
+"уважением к оригинальной идеологии программных инструментов, а также к "
+"удобству использования, производительности и стабильности."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:73
+#, no-wrap
+msgid "Architectural Guidelines"
+msgstr "Архитектурные рекомендации"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:76
+msgid "Our ideology can be described by the following guidelines"
+msgstr "Наша идеология может быть описана следующими принципами"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:78
+msgid ""
+"Do not add new functionality unless an implementor cannot complete a real "
+"application without it."
+msgstr ""
+"Не добавляйте новую функциональность, если разработчик не может завершить "
+"реальное приложение без неё."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:79
+msgid ""
+"It is as important to decide what a system is not as to decide what it is. "
+"Do not serve all the world's needs; rather, make the system extensible so "
+"that additional needs can be met in an upwardly compatible fashion."
+msgstr ""
+"Важно не только определить, чем является система, но и чем она не является. "
+"Не стоит пытаться удовлетворить все возможные потребности; вместо этого "
+"сделайте систему расширяемой, чтобы дополнительные требования могли быть "
+"реализованы с сохранением совместимости."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:80
+msgid ""
+"The only thing worse than generalizing from one example is generalizing from "
+"no examples at all."
+msgstr ""
+"Худшее, чем обобщение на основе одного примера — это обобщение без примеров "
+"вообще."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:81
+msgid ""
+"If a problem is not completely understood, it is probably best to provide no "
+"solution at all."
+msgstr ""
+"Если проблема не до конца понятна, вероятно, лучше вообще не предоставлять "
+"решения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:82
+msgid ""
+"If you can get 90 percent of the desired effect for 10 percent of the work, "
+"use the simpler solution."
+msgstr ""
+"Если вы можете получить 90% желаемого эффекта за 10% работы, используйте "
+"более простое решение."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:83
+msgid "Isolate complexity as much as possible."
+msgstr "Изолируйте сложность настолько, насколько это возможно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:84
+msgid ""
+"Provide mechanism, rather than policy. In particular, place user interface "
+"policy in the client's hands."
+msgstr ""
+"Предоставлять механизмы, а не политики. В частности, передайте политику "
+"пользовательского интерфейса в руки клиента."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:86
+msgid "From Scheifler & Gettys: \"X Window System\""
+msgstr "Из Шейфлера и Геттиса: «X Window System»"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:88
+#, no-wrap
+msgid "The Layout of /usr/src"
+msgstr "Структура каталога /usr/src"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/introduction/_index.adoc:92
+msgid ""
+"The complete source code for FreeBSD is available from our link:https://"
+"cgit.freebsd.org/src/[public Git repository]. The source code is normally "
+"installed in [.filename]#/usr/src#. The layout of the source tree is "
+"described by the top-level link:https://cgit.freebsd.org/src/tree/"
+"README.md[README.md] file."
+msgstr ""
+"Полный исходный код FreeBSD доступен в нашем link:https://cgit.freebsd.org/"
+"src/[публичном Git-репозитории]. Исходный код обычно устанавливается в "
+"[.filename]#/usr/src#. Структура дерева каталогов исходного кода описана в "
+"файле link:https://cgit.freebsd.org/src/tree/README.md[README.md] на верхнем "
+"уровне дерева."
diff --git a/documentation/content/ru/books/developers-handbook/ipv6/_index.adoc b/documentation/content/ru/books/developers-handbook/ipv6/_index.adoc
new file mode 100644
index 0000000000..70f6853b87
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/ipv6/_index.adoc
@@ -0,0 +1,687 @@
+---
+authors:
+ -
+ author: 'Yoshinobu Inoue'
+description: 'Внутреннее устройство IPv6'
+next: books/developers-handbook/partiii
+params:
+ path: /books/developers-handbook/ipv6/
+prev: books/developers-handbook/sockets
+showBookMenu: true
+tags: ["IPv6", "FreeBSD"]
+title: 'Глава 8. Внутреннее устройство IPv6'
+weight: 10
+---
+
+[[ipv6]]
+= Внутреннее устройство IPv6
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 8
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[ipv6-implementation]]
+== Реализация IPv6/IPsec
+
+В этом разделе мы объясним внутреннюю реализацию, связанную с IPv6 и IPsec. Данная функциональность заимствована из http://www.kame.net/[проекта KAME]
+
+[[ipv6details]]
+=== IPv6
+
+==== Соответствие
+
+Функции, связанные с IPv6, соответствуют или пытаются соответствовать последнему набору спецификаций IPv6. Для дальнейшего использования мы приводим некоторые из соответствующих документов ниже (_ПРИМЕЧАНИЕ_: это не полный список — его слишком сложно поддерживать...).
+
+Для подробностей обратитесь к соответствующей главе документа, RFC, страницам Справосника или комментариям в исходном коде.
+
+Тесты на соответствие стандартам были проведены для KAME STABLE в проекте TAHI. Результаты можно посмотреть по ссылке http://www.tahi.org/report/KAME/[http://www.tahi.org/report/KAME/]. Мы также участвовали в тестах IOL Университета Нью-Гэмпшира (http://www.iol.unh.edu/[http://www.iol.unh.edu/]) в прошлом, используя наши предыдущие версии.
+
+* RFC1639: FTP Operation Over Big Address Records (FOOBAR)
+
+** RFC2428 предпочтительнее RFC1639. FTP-клиенты сначала попробуют RFC2428, затем RFC1639 в случае неудачи.
+
+* RFC1886: DNS Extensions to support IPv6
+* RFC1933: Transition Mechanisms for IPv6 Hosts and Routers
+
+** IPv4-совместимый адрес не поддерживается.
+** автоматическое туннелирование (описано в разделе 4.3 данного RFC) не поддерживается.
+** man:gif[4] интерфейс реализует IPv[46]-поверх-IPv[46] туннель в общем виде и включает "настроенный туннель", описанный в спецификации. Подробности см. в crossref:ipv6[gif,23.5.1.5] этого документа.
+
+* RFC1981: Path MTU Discovery for IPv6
+* RFC2080: RIPng for IPv6
+
+** usr.sbin/route6d это поддерживает.
+
+* RFC2292: Advanced Sockets API for IPv6
+
+** Для поддерживаемых функций библиотек/API ядра см. [.filename]#sys/netinet6/ADVAPI#.
+
+* RFC2362: Protocol Independent Multicast-Sparse Mode (PIM-SM)
+
+** RFC2362 определяет форматы пакетов для PIM-SM. [.filename]#draft-ietf-pim-ipv6-01.txt# написан на основе этого.
+
+* RFC2373: IPv6 Addressing Architecture
+
+** поддерживает обязательные адреса узлов и соответствует требованиям области видимости.
+
+* RFC2374: An IPv6 Aggregatable Global Unicast Address Format
+
+** поддерживает 64-битную длину Идентификатора Интерфейса.
+
+* RFC2375: IPv6 Multicast Address Assignments
+
+** Пользовательские приложения используют общеизвестные адреса, назначенные в RFC.
+
+* RFC2428: FTP Extensions for IPv6 and NATs
+
+** RFC2428 предпочтительнее RFC1639. FTP-клиенты сначала попробуют RFC2428, затем RFC1639 в случае неудачи.
+
+* RFC2460: IPv6 specification
+* RFC2461: Neighbor discovery for IPv6
+
+** См. crossref:ipv6[neighbor-discovery,23.5.1.2] в этом документе для получения подробностей.
+
+* RFC2462: IPv6 Stateless Address Autoconfiguration
+
+** См. crossref:ipv6[ipv6-pnp,23.5.1.4] в этом документе для получения подробностей.
+
+* RFC2463: ICMPv6 for IPv6 specification
+
+** См. crossref:ipv6[icmpv6,23.5.1.9] в этом документе для получения подробностей.
+
+* RFC2464: Transmission of IPv6 Packets over Ethernet Networks
+* RFC2465: MIB for IPv6: Textual Conventions and General Group
+
+** Необходимая статистика собирается ядром. Фактическая поддержка MIB для IPv6 предоставляется в виде набора патчей для ucd-snmp.
+
+* RFC2466: MIB for IPv6: ICMPv6 group
+
+** Необходимая статистика собирается ядром. Фактическая поддержка MIB IPv6 предоставляется в виде патча для ucd-snmp.
+
+* RFC2467: Transmission of IPv6 Packets over FDDI Networks
+* RFC2497: Transmission of IPv6 packet over ARCnet Networks
+* RFC2553: Basic Socket Interface Extensions for IPv6
+
+** Отображаемый адрес IPv4 (3.7) и особое поведение сокета с привязкой по шаблону IPv6 (3.8) поддерживаются. Подробности см. в разделе crossref:ipv6[ipv6-wildcard-socket,23.5.1.12] этого документа.
+
+* RFC2675: IPv6 Jumbograms
+
+** См. crossref:ipv6[ipv6-jumbo,23.5.1.7] в этом документе для получения подробностей.
+
+* RFC2710: Multicast Listener Discovery for IPv6
+* RFC2711: IPv6 router alert option
+* [.filename]#draft-ietf-ipngwg-router-renum-08#: Перенумерация маршрутизаторов для IPv6
+* [.filename]#draft-ietf-ipngwg-icmp-namelookups-02#: Поиск имен через ICMP в IPv6
+* [.filename]#draft-ietf-ipngwg-icmp-name-lookups-03#: Поиск имен IPv6 через ICMP
+* [.filename]#draft-ietf-pim-ipv6-01.txt#: PIM for IPv6
+
+** man:pim6dd[8] реализует плотный режим. man:pim6sd[8] реализует разреженный режим.
+
+* [.filename]#draft-itojun-ipv6-tcp-to-anycast-00#: Разрыв TCP-соединения с anycast-адресом IPv6
+* [.filename]#draft-yamamoto-wideipv6-comm-model-00#
+
+** См. crossref:ipv6[ipv6-sas,23.5.1.6] в этом документе для более подробной информации.
+
+* [.filename]#draft-ietf-ipngwg-scopedaddr-format-00.txt#: Расширение формата для адресов с областью действия IPv6
+
+[[neighbor-discovery]]
+==== Функция "Обнаружение соседей"
+
+Обнаружение соседей достаточно стабильно. В настоящее время поддерживаются следующие функции: определение адреса (Address Resolution), обнаружение дублирования адресов (DAD — Duplicated Address Detection) и обнаружение недоступности соседей (Neighbor Unreachability Detection). В ближайшем будущем мы добавим поддержку прокси-объявлений соседей (Proxy Neighbor Advertisement) в ядро и команду передачи непрошенных объявлений соседей (Unsolicited Neighbor Advertisement) в качестве инструмента администратора.
+
+Если DAD завершается неудачно, адрес будет помечен как "дублированный" (duplicated), и сообщение будет записано в syslog (а также обычно выведено на консоль). Метку "дублированный" можно проверить с помощью man:ifconfig[8]. Обязанность администратора — проверять и устранять сбои DAD. В ближайшем будущем поведение должно быть улучшено.
+
+Некоторые сетевые драйверы закольцовывают multicast-пакеты обратно на себя, даже если им указано так не делать (особенно в promiscuous mode). В таких случаях DAD может завершиться неудачей, так как механизм DAD видит входящий NS-пакет (на самом деле от самого узла) и считает его признаком дубликата. В качестве обходного решения можно рассмотреть условие #if с пометкой "heuristics" в sys/netinet6/nd6_nbr.c:nd6_dad_timer() (обратите внимание, что фрагмент кода в разделе "heuristics" не соответствует спецификации).
+
+Спецификация обнаружения соседей (RFC2461) не рассматривает обработку кэша соседей в следующих случаях:
+
+. когда отсутствовала запись в кэше соседей, узел получал нежелательный пакет RS/NS/NA/редирект без адреса канального уровня
+. обработка кэша соседей в среде без адреса канального уровня (нам нужна запись в кэше соседей для бита IsRouter)
+
+Для первого случая мы реализовали временное решение на основе обсуждений в рассылке IETF ipngwg. Подробности можно найти в комментариях исходного кода и ветке электронной почты, начавшейся с (IPng 7155) от 6 февраля 1999 года.
+
+Правило определения локальной IPv6 сети (RFC2461) значительно отличается от предположений в сетевом коде BSD. На данный момент не поддерживается правило определения локальной сети при пустом списке маршрутизаторов по умолчанию (RFC2461, раздел 5.2, последнее предложение во 2-м абзаце - обратите внимание, что в спецификации некорректно используются слова "host" и "node" в нескольких местах раздела).
+
+Во избежание возможных атак типа DoS и бесконечных циклов, сейчас принимается только 10 опций в ND-пакете. Таким образом, если к RA прикреплено 20 опций префиксов, будут распознаны только первые 10 префиксов. Если это вызывает проблемы, пожалуйста, задайте вопрос в рассылке FREEBSD-CURRENT и/или измените nd6_maxndopt в [.filename]#sys/netinet6/nd6.c#. При высоком спросе мы можем предоставить sysctl-параметр для этой переменной.
+
+[[ipv6-scope-index]]
+==== Индекс зоны
+
+В IPv6 используются адреса с областями видимости — зонами. Поэтому очень важно указывать индекс зоны (индекс интерфейса для линк-локального адреса или индекс сайта для сайт-локального адреса) вместе с IPv6 адресом. Без индекса зоны адрес IPv6 с ограниченной областью действия является неоднозначным для ядра, и ядро не сможет определить исходящий интерфейс для пакета.
+
+Обычные пользовательские приложения должны использовать расширенный API (RFC2292) для указания индекса зоны или индекса интерфейса. Для аналогичных целей член sin6_scope_id в структуре sockaddr_in6 определён в RFC2553. Однако семантика sin6_scope_id довольно расплывчата. Если важна переносимость вашего приложения, мы рекомендуем использовать расширенный API вместо sin6_scope_id.
+
+В ядре индекс интерфейса для адреса с областью действия link-local встраивается во второе 16-битное слово (3-й и 4-й байт) в IPv6-адресе. Например, вы можете увидеть что-то вроде:
+
+[source, bash]
+....
+ fe80:1::200:f8ff:fe01:6317
+....
+
+в таблице маршрутизации и структуре адреса интерфейса (struct in6_ifaddr). Указанный выше адрес является линк-локальным уникастным адресом, который принадлежит сетевому интерфейсу с идентификатором интерфейса 1. Встроенный индекс позволяет эффективно идентифицировать локальные адреса IPv6 на нескольких интерфейсах с минимальными изменениями кода.
+
+Демоны маршрутизации и программы настройки, такие как man:route6d[8] и man:ifconfig[8], должны управлять "встроенным" индексом зоны. Эти программы используют сокеты маршрутизации и ioctl (например, SIOCGIFADDR_IN6), и API ядра будет возвращать IPv6-адреса с заполненным вторым 16-битным словом. API предназначены для управления внутренними структурами ядра. Программы, использующие эти API, в любом случае должны быть готовы к различиям в ядрах.
+
+При указании адреса с ограниченной областью действия в командной строке НИКОГДА не используйте встроенную форму (например, ff02:1::1 или fe80:2::fedc). Это не должно работать. Всегда используйте стандартную форму, такую как ff02::1 или fe80::fedc, с параметром командной строки для указания интерфейса (например, `ping -6 -I ne0 ff02::1`). В общем, если команда не имеет параметра командной строки для указания исходящего интерфейса, эта команда не готова принимать адрес с областью действия. Это кажется противоречащим принципу IPv6 поддерживать сценарий "кабинета стоматолога". Мы считаем, что спецификации нуждаются в некоторых улучшениях для этого.
+
+Некоторые пользовательские утилиты поддерживают расширенный числовой синтаксис IPv6, как описано в [.filename]#draft-ietf-ipngwg-scopedaddr-format-00.txt#. Можно указать исходящее соединение, используя имя исходящего интерфейса, например "fe80::1%ne0". Таким образом можно легко указать линк-локальный адрес с ограниченной областью действия.
+
+Для использования этого расширения в вашей программе потребуется использовать man:getaddrinfo[3] и man:getnameinfo[3] с NI_WITHSCOPEID. В текущей реализации предполагается однозначное соответствие между каналом и интерфейсом, что является более строгим условием, чем указано в спецификациях.
+
+[[ipv6-pnp]]
+==== Plug and Play (подключи и работай)
+
+Большая часть автонастройки адресов IPv6 без сохранения состояния реализована в ядре. Функции обнаружения соседей (Neighbor Discovery) реализованы в ядре целиком. Ввод рекламы маршрутизатора (RA) для хостов реализован в ядре. Вывод запроса маршрутизатора (RS) для конечных хостов, ввод RS для маршрутизаторов и вывод RA для маршрутизаторов реализованы в пользовательском пространстве.
+
+===== Назначение линк-локальных и специальных адресов
+
+Линк-локальный адрес IPv6 генерируется из IEEE802 адреса (Ethernet MAC адреса). Каждому интерфейсу автоматически присваивается IPv6 линк-локальный адрес, когда интерфейс поднимается (IFF_UP). Также в таблицу маршрутизации добавляется прямой маршрут для линк-локального адреса.
+
+Вот вывод команды netstat:
+
+[source, bash]
+....
+Internet6:
+Destination Gateway Flags Netif Expire
+fe80:1::%ed0/64 link#1 UC ed0
+fe80:2::%ep0/64 link#2 UC ep0
+....
+
+Интерфейсы, не имеющие адреса IEEE802 (псевдоинтерфейсы, такие как туннельные интерфейсы или интерфейсы ppp), будут заимствовать адрес IEEE802 у других интерфейсов, например, Ethernet-интерфейсов, когда это возможно. Если нет подключенного оборудования IEEE802, в качестве последнего средства будет использовано псевдослучайное значение MD5(hostname) для формирования линк-локального адреса. Если это не подходит для вашего использования, вам потребуется настроить линк-локальный адрес вручную.
+
+Если интерфейс не поддерживает IPv6 (например, отсутствует поддержка multicast), на этот интерфейс не будет назначен линк-локальный адрес. Подробности см. в разделе 2.
+
+Каждый интерфейс присоединяется к запрашиваемому широковещательному адресу и линк-локальным широковещательным адресам всех узлов (например, fe80::1:ff01:6317 и ff02::1 соответственно на соединении, к которому подключен интерфейс). В дополнение к линк-локальному адресу, адрес обратной петли (::1 — loopback) будет назначен интерфейсу обратной петли. Также, ::1/128 и ff01::/32 автоматически добавляются в таблицу маршрутизации, а loopback-интерфейс (интерфейс обратной петли) присоединяется к групповому адресу в пределах узла ff01::1.
+
+===== Автоматическая настройка адресов без состояния на узлах
+
+В спецификации IPv6 узлы разделены на две категории: _маршрутизаторы_ и _хосты_. Маршрутизаторы пересылают пакеты, адресованные другим, хосты не пересылают пакеты. Параметр net.inet6.ip6.forwarding определяет, является ли данный узел маршрутизатором или хостом (маршрутизатор, если значение равно 1, хост, если 0).
+
+Когда хост получает Объявление Маршрутизатора (Router Advertisement) от маршрутизатора, он может автоматически настроить себя с помощью автонастройки адреса без сохранения состояния. Это поведение можно контролировать с помощью параметра net.inet6.ip6.accept_rtadv (хост автонастраивается, если значение равно 1). При автонастройке добавляется префикс сетевого адреса для принимающего интерфейса (обычно префикс глобального адреса). Также настраивается маршрут по умолчанию. Маршрутизаторы периодически генерируют пакеты Router Advertisement. Чтобы запросить соседний маршрутизатор сгенерировать RA-пакет, хост может отправить Router Solicitation. Для генерации RS-пакета в любое время используйте команду _rtsol_. Также доступен демон man:rtsold[8]. man:rtsold[8] генерирует Router Solicitation по мере необходимости и отлично подходит для мобильного использования (ноутбуки/лэптопы). Если необходимо игнорировать Router Advertisements, используйте sysctl для установки net.inet6.ip6.accept_rtadv в 0.
+
+Для генерации Router Advertisement от маршрутизатора используйте демон man:rtadvd[8].
+
+Обратите внимание, что спецификация IPv6 предполагает следующие пункты, а случаи несоответствия остаются неуточнёнными:
+
+* Только хосты будут принимать объявления от маршрутизаторов
+* Узлы имеют один сетевой интерфейс (за исключением loopback)
+
+Поэтому не рекомендуется включать net.inet6.ip6.accept_rtadv на маршрутизаторах или многопортовых хостах. Неправильно настроенный узел может вести себя странно (нестандартная конфигурация разрешена для тех, кто хочет провести эксперименты).
+
+Резюмируя настройку sysctl:
+
+[source, bash]
+....
+ accept_rtadv forwarding role of the node
+ --- --- ---
+ 0 0 host (to be manually configured)
+ 0 1 router
+ 1 0 autoconfigured host
+ (spec assumes that host has single
+ interface only, autoconfigured host
+ with multiple interface is
+ out-of-scope)
+ 1 1 invalid, or experimental
+ (out-of-scope of spec)
+....
+
+В RFC2462 есть правило проверки для входящей информации о префиксе в RA, в разделе 5.5.3 (e). Это защищает хосты от злонамеренных (или неправильно настроенных) маршрутизаторов, которые анонсируют очень короткое время жизни префикса. Было обновление от Джима Баунда в рассылке ipngwg (ищите "(ipng 6712)" в архиве), и это обновление Джима реализовано.
+
+См. crossref:ipv6[neighbor-discovery,23.5.1.2] в документе для информации о взаимосвязи между DAD и автонастройкой.
+
+[[gif]]
+==== Универсальный Туннельный Интерфейс
+
+GIF (Generic InterFace) — это псевдоинтерфейс для настроенного туннеля. Подробности описаны в man:gif[4]. В настоящее время
+
+* v6 в v6
+* v6 в v4
+* v4 в v6
+* v4 в v4
+
+доступны. Используйте man:gifconfig[8] для назначения физических (внешних) исходных и конечных адресов интерфейсам gif. Конфигурация, использующая одно семейство адресов для внутреннего и внешнего IP-заголовка (v4 в v4 или v6 в v6), является опасной. Очень легко настроить интерфейсы и таблицы маршрутизации для выполнения бесконечного уровня туннелирования. _Пожалуйста, будьте осторожны_.
+
+gif можно настроить так, чтобы он был дружественным к ECN. Подробнее о дружелюбности к ECN для туннелей см. crossref:ipv6[ipsec-ecn,23.5.4.5], а о настройке — в man:gif[4].
+
+Если вы хотите настроить туннель IPv4-в-IPv6 с интерфейсом gif, внимательно прочитайте man:gif[4]. Вам потребуется удалить линк-локальный адрес IPv6, автоматически назначенный интерфейсу gif.
+
+[[ipv6-sas]]
+==== Выбор исходящего адреса
+
+Текущее правило выбора источника ориентировано на зону (есть несколько исключений — см. ниже). Для заданного адреса назначения исходящий IPv6-адрес выбирается по следующему правилу:
+
+. Если исходящий адрес явно указан пользователем (например, через расширенный API), используется указанный адрес.
+. Если на исходящем интерфейсе назначен адрес (который обычно определяется путем просмотра таблицы маршрутизации) с той же зоной действия, что и адрес назначения, используется этот адрес.
++
+Это наиболее типичный случай.
+. Если нет адреса, удовлетворяющего указанному выше условию, выберите глобальный адрес, назначенный одному из интерфейсов на отправляющем узле.
+. Если нет адреса, удовлетворяющего указанному выше условию, и адрес назначения имеет сайт-локальную зону, выберите сайт-локальный адрес, назначенный одному из интерфейсов на отправляющем узле.
+. Если нет адреса, удовлетворяющего указанному условию, выберите адрес, связанный с записью таблицы маршрутизации для назначения. Это крайняя мера, которая может нарушить границы зоны действия.
+
+Например, ::1 выбирается для ff01::1, fe80:1::200:f8ff:fe01:6317 для fe80:1::2a0:24ff:feab:839b (обратите внимание, что встроенный индекс интерфейса — описанный в crossref:ipv6[ipv6-scope-index,23.5.1.3] — помогает нам выбрать правильный исходный адрес. Эти встроенные индексы не будут передаваться по сети). Если исходящий интерфейс имеет несколько адресов для данной зоны, исходный адрес выбирается на основе наибольшего соответствия (правило 3). Предположим, что 2001:0DB8:808:1:200:f8ff:fe01:6317 и 2001:0DB8:9:124:200:f8ff:fe01:6317 назначены исходящему интерфейсу. 2001:0DB8:808:1:200:f8ff:fe01:6317 выбирается в качестве исходящего адреса для адреса назначения 2001:0DB8:800::1.
+
+Обратите внимание, что приведенное выше правило не документировано в спецификации IPv6. Оно считается элементом, оставленным "на усмотрение реализации". Существуют случаи, когда мы не используем это правило. Один из примеров — установленное TCP-соединение, где мы используем адрес, сохраненный в tcb, в качестве источника. Другой пример — исходящий адрес для Объявления Соседа (Neighbor Advertisement). Согласно спецификации (RFC2461 7.2.2) источник NA должен быть целевым адресом соответствующего NS. В этом случае мы следуем спецификации, а не приведенному выше правилу наибольшего совпадения.
+
+Для новых соединений (когда правило 1 не применяется), устаревшие адреса (адреса с предпочтительным временем жизни = 0) не будут выбираться в качестве исходящего адреса, если доступны другие варианты. Если других вариантов нет, устаревший адрес будет использован в качестве последнего средства. Если есть несколько устаревших адресов, для выбора между ними будет применено указанное выше правило области видимости. Если вы хотите запретить использование устаревших адресов по какой-либо причине, установите параметр net.inet6.ip6.use_deprecated в значение 0. Проблема, связанная с устаревшими адресами, описана в RFC2462 5.5.4 (ПРИМЕЧАНИЕ: в IETF ipngwg ведутся дебаты о том, как использовать "устаревшие" адреса).
+
+[[ipv6-jumbo]]
+==== Джамбо-пакет (Jumbo Payload)
+
+Опция джамбо-пакет типа "от прыжка к прыжку" реализована и может использоваться для отправки IPv6-пакетов с полезной нагрузкой длиной более 65 535 октетов. Однако в настоящее время не поддерживаются физические интерфейсы с MTU более 65 535, поэтому такие нагрузки могут быть только на интерфейсе loopback (т.е. lo0).
+
+Если вы хотите попробовать джамбо-пакеты, сначала необходимо переконфигурировать ядро, чтобы MTU интерфейса loopback превышал 65 535 байт; добавьте следующее в конфигурационный файл ядра:
+
+`options "LARGE_LOMTU" #To test jumbo payload`
+
+и пересоберите новое ядро.
+
+Затем вы можете проверить работу с большими пакетами с помощью команды man:ping[8] с опциями -6, -b и -s. Опция -b необходима для увеличения размера буфера сокета, а опция -s задает длину пакета, которая должна быть больше 65 535. Например, введите следующее:
+
+[source, bash]
+....
+% ping -6 -b 70000 -s 68000 ::1
+....
+
+Спецификация IPv6 требует, чтобы опция Джамбо-пакет не использовалась в пакете, содержащем заголовок фрагмента. Если это условие нарушено, должно быть отправлено ICMPv6 сообщение Parameter Problem отправителю. Спецификация соблюдается, но обычно вы не можете увидеть ICMPv6 ошибку, вызванную этим требованием.
+
+При получении IPv6-пакета проверяется длина кадра и сравнивается с длиной, указанной в поле длины полезной нагрузки заголовка IPv6 или в значении опции Джамбо-пакета, если она присутствует. Если первое значение меньше второго, пакет отбрасывается, и статистика увеличивается. Статистику можно увидеть в выводе команды man:netstat[8] с опцией `-s -p ip6`:
+
+[source, bash]
+....
+% netstat -s -p ip6
+ ip6:
+ (snip)
+ 1 with data size < data length
+....
+
+Итак, ядро не отправляет ICMPv6 ошибку, если ошибочный пакет не является фактически Джамбо-пакетом, то есть его размер пакета превышает 65 535 байт. Как описано выше, в настоящее время не поддерживаются физические интерфейсы с таким огромным MTU, поэтому ICMPv6 ошибка возвращается редко.
+
+В настоящее время поддержка TCP/UDP через jumbogram не реализована. Это связано с отсутствием среды (кроме loopback) для тестирования данной функциональности. Свяжитесь с нами, если вам это необходимо.
+
+IPsec не работает с jumbogram. Это связано с особенностями спецификации, касающимися поддержки AH для джамбограмм (размер заголовка AH влияет на длину полезной нагрузки, что делает крайне сложной аутентификацию входящего пакета с опцией Джамбо-пакет, а также AH).
+
+Существуют фундаментальные проблемы в поддержке *BSD для jumbogram. Мы хотели бы решить их, но нам нужно больше времени для завершения работы. Вот некоторые из них:
+
+* Поле `mbuf pkthdr.len` имеет тип `int` в 4.4BSD, поэтому оно не сможет содержать джамбограмму с длиной > 2G на 32-битных архитектурах CPU. Если мы хотим правильно поддерживать джамбограммы, это поле необходимо расширить, чтобы оно могло содержать 4G + заголовок IPv6 + заголовок канального уровня. Следовательно, его необходимо расширить как минимум до `int64_t` (`u_int32_t` НЕ достаточно).
+
+* Мы ошибочно используем "int" для хранения длины пакета во многих местах. Нам необходимо преобразовать их в более крупный целочисленный тип. Это требует большой осторожности, так как мы можем столкнуться с переполнением во время вычисления длины пакета.
+* Мы ошибочно проверяем поле ip6_plen заголовка IPv6 для определения длины полезной нагрузки пакета в различных местах. Вместо этого следует проверять mbuf pkthdr.len. Функция ip6_input() выполняет проверку корректности опции Джамбо-пакет при вводе, и после этого можно безопасно использовать mbuf pkthdr.len.
+* Код TCP требует тщательного обновления в ряде мест, разумеется.
+
+==== Предотвращение петель при обработке заголовков
+
+Спецификация IPv6 допускает размещение произвольного количества расширений в заголовках пакетов. Если реализовать код обработки пакетов IPv6 так, как реализован код IPv4 в BSD, может произойти переполнение стека ядра из-за длинной цепочки вызовов функций. Код в sys/netinet6 тщательно спроектирован, чтобы избежать переполнения стека ядра, поэтому он определяет собственную структуру переключения протоколов — "struct ip6protosw" (см. [.filename]#netinet6/ip6protosw.h#). Для IPv4 части (sys/netinet) подобных обновлений не было сделано для сохранения совместимости, но в прототип pr_input() внесено небольшое изменение. Поэтому также определена "struct ipprotosw". В результате, если получен пакет IPsec-over-IPv4 с большим количеством заголовков IPsec, стек ядра может переполниться. С IPsec-over-IPv6 такой проблемы нет. (Разумеется, чтобы все эти заголовки IPsec были обработаны, каждый такой заголовок должен пройти все проверки IPsec. Поэтому анонимный злоумышленник не сможет осуществить подобную атаку.)
+
+[[icmpv6]]
+==== ICMPv6
+
+После публикации RFC2463 IETF ipngwg решил запретить ICMPv6 пакеты ошибок для ICMPv6 перенаправлений, чтобы предотвратить ICMPv6 шторм в сетевой среде. Это уже реализовано в ядре.
+
+==== Приложения (Applications)
+
+Для программирования в пользовательском пространстве мы поддерживаем API сокетов IPv6, как указано в RFC2553, RFC2292 и готовящихся интернет-черновиках.
+
+TCP/UDP поверх IPv6 доступны и достаточно стабильны. Вы можете использовать man:telnet[1], man:ftp[1], man:rlogin[1], man:rsh[1], man:ssh[1] и т.д. Эти приложения не зависят от протокола. То есть они автоматически выбирают IPv4 или IPv6 в соответствии с DNS.
+
+==== Внутреннее устройство ядра
+
+В то время как ip_forward() вызывает ip_output(), ip6_forward() напрямую вызывает if_output(), поскольку маршрутизаторы не должны разделять пакеты IPv6 на фрагменты.
+
+ICMPv6 должен содержать исходный пакет по возможности вплоть до 1280 байт. Например, сообщение "Ошибка недоступности порта UDP6/IP6" должно содержать все расширенные заголовки и *неизменённые* заголовки UDP6 и IP6. Таким образом, все функции IP6, кроме TCP, никогда не преобразуют порядок байтов сети в порядок байтов хоста, чтобы сохранить исходный пакет.
+
+Функции tcp_input(), udp6_input() и icmp6_input() не могут предполагать, что заголовок IP6 предшествует транспортным заголовкам из-за наличия расширенных заголовков. Поэтому была реализована in6_cksum() для обработки пакетов, у которых заголовок IP6 и транспортный заголовок не являются непрерывными. Но ни для TCP/IP6, ни для UDP6/IP6 в заголовке нет структуры для расчёта контрольной суммы.
+
+Для удобной обработки заголовка IP6, дополнительных заголовков и транспортных заголовков, от сетевых драйверов теперь требуется хранить пакеты в одном внутреннем mbuf или одном или нескольких внешних mbuf. Типичный старый драйвер подготавливает два внутренних mbuf для данных размером 96–204 байт, однако теперь такие данные пакета хранятся в одном внешнем mbuf.
+
+`netstat -s -p ip6` показывает, соответствует ли ваш драйвер этому требованию. В следующем примере "cce0" нарушает это требование. (Для получения дополнительной информации обратитесь к разделу 2.)
+
+[source, bash]
+....
+Mbuf statistics:
+ 317 one mbuf
+ two or more mbuf::
+ lo0 = 8
+ cce0 = 10
+ 3282 one ext mbuf
+ 0 two or more ext mbuf
+....
+
+Каждая входная функция вызывает IP6_EXTHDR_CHECK в начале, чтобы проверить, является ли область между IP6 и его заголовком непрерывной. IP6_EXTHDR_CHECK вызывает m_pullup() только если mbuf имеет флаг M_LOOP, то есть пакет пришел с интерфейса loopback. m_pullup() никогда не вызывается для пакетов, приходящих с физических сетевых интерфейсов.
+
+Как функции повторной сборки IP, так и IP6 никогда не вызывают m_pullup().
+
+[[ipv6-wildcard-socket]]
+==== IPv4-отображённые адреса и IPv6-сокет с подстановочным адресом
+
+RFC2553 описывает IPv4 отображённые адреса (3.7) и особое поведение IPv6 сокета с привязкой к любому адресу (3.8). Спецификация позволяет вам:
+
+* Принимать IPv4-подключения через сокет с привязкой к подстановочному адресу AF_INET6.
+* Передача IPv4-пакета через сокет AF_INET6 с использованием специальной формы адреса, например ::ffff:10.1.1.1.
+
+но сама спецификация очень сложна и не определяет, как должен вести себя сокетный уровень. Здесь мы называем первую сторону «слушающей», а вторую — «инициирующей» для удобства ссылок.
+
+Вы можете выполнить привязку к подстановочному адресу для обоих семейств адресов на одном и том же порту.
+
+Следующая таблица показывает поведение FreeBSD 4.x.
+
+[source, bash]
+....
+listening side initiating side
+ (AF_INET6 wildcard (connection to ::ffff:10.1.1.1)
+ socket gets IPv4 conn.)
+ --- ---
+FreeBSD 4.x configurable supported
+ default: enabled
+....
+
+Следующие разделы предоставят вам более подробную информацию и объяснят, как можно настроить поведение.
+
+Комментарии о принимающей стороне:
+
+Похоже, что в RFC2553 слишком мало сказано о проблеме привязки к подстановочному адресу, особенно о вопросе пространства портов, режиме отказа и взаимосвязи между AF_INET/INET6 wildcard bind. Может быть несколько различных интерпретаций этого RFC, которые соответствуют ему, но ведут себя по-разному. Поэтому для создания переносимых приложений не следует делать никаких предположений о поведении в ядре. Использование man:getaddrinfo[3] является наиболее безопасным способом. Вопросы пространства номеров портов и привязки к подстановочному адресу подробно обсуждались в рассылке ipv6imp в середине марта 1999 года, и похоже, что конкретного консенсуса нет (то есть, остается на усмотрение реализаторов). Возможно, вам стоит проверить архивы рассылки.
+
+Если серверное приложение хочет принимать IPv4 и IPv6 соединения, есть два варианта.
+
+Один из способов — использование сокетов AF_INET и AF_INET6 (вам понадобятся два сокета). Используйте man:getaddrinfo[3] с AI_PASSIVE в ai_flags, а также man:socket[2] и man:bind[2] для всех возвращённых адресов. Открыв несколько сокетов, вы можете принимать соединения сокетом соответствующей адресной семьи. IPv4-соединения будут приниматься сокетом AF_INET, а IPv6-соединения — сокетом AF_INET6.
+
+Еще один способ — использование одного сокета с универсальной привязкой AF_INET6. Используйте man:getaddrinfo[3] с AI_PASSIVE в ai_flags и AF_INET6 в ai_family, установив первый аргумент hostname в NULL. Затем используйте man:socket[2] и man:bind[2] для адреса, который был возвращен. (должен быть неспецифицированный адрес IPv6). Через этот один сокет можно принимать пакеты как IPv4, так и IPv6.
+
+Для поддержки только IPv6-трафика на AF_INET6-сокете с привязкой к любому адресу переносимым способом всегда проверяйте адрес узла при установке соединения с AF_INET6-сокетом в режиме прослушивания. Если адрес является IPv4-отображённым, возможно, стоит отклонить соединение. Это условие можно проверить с помощью макроса IN6_IS_ADDR_V4MAPPED().
+
+Для более простого решения этой задачи существует зависящий от системы параметр man:setsockopt[2] под названием IPV6_BINDV6ONLY, используемый следующим образом.
+
+[.programlisting]
+....
+ int on;
+
+ setsockopt(s, IPPROTO_IPV6, IPV6_BINDV6ONLY,
+ (char *)&on, sizeof (on)) < 0));
+....
+
+При успешном вызове этот сокет будет принимать только IPv6-пакеты.
+
+Комментарии о стороне инициатора:
+
+Совет разработчикам приложений: для создания переносимого IPv6-приложения (которое работает на различных IPv6-ядрах), мы считаем, что следующие моменты являются ключом к успеху:
+
+* НИКОГДА не используйте жёстко заданные AF_INET или AF_INET6.
+* Используйте man:getaddrinfo[3] и man:getnameinfo[3] во всей системе. Никогда не используйте gethostby*(), getaddrby*(), inet_*() или getipnodeby*(). (Для облегчения обновления существующих приложений для поддержки IPv6 иногда может быть полезен getipnodeby*(). Но по возможности старайтесь переписать код для использования man:getaddrinfo[3] и man:getnameinfo[3].)
+* Если вы хотите подключиться к назначению, используйте man:getaddrinfo[3] и попробуйте все возвращённые назначения, как это делает man:telnet[1].
+* Некоторые реализации стека IPv6 поставляются с некорректной man:getaddrinfo[3]. Включите минимально рабочую версию в ваше приложение и используйте её в крайнем случае.
+
+Если вы хотите использовать сокет AF_INET6 для исходящих подключений как IPv4, так и IPv6, вам потребуется использовать man:getipnodebyname[3]. Если вы хотите обновить существующее приложение для поддержки IPv6 с минимальными усилиями, можно выбрать этот подход. Однако учтите, что это временное решение, поскольку man:getipnodebyname[3] сам по себе не рекомендуется, так как он вообще не обрабатывает IPv6-адреса с зоной. Для разрешения IPv6-имён предпочтительным API является man:getaddrinfo[3]. Поэтому вам следует переписать ваше приложение для использования man:getaddrinfo[3], когда у вас будет время это сделать.
+
+При написании приложений, которые устанавливают исходящие соединения, история становится намного проще, если рассматривать AF_INET и AF_INET6 как совершенно отдельные семейства адресов. Проблемы с {set,get}sockopt упрощаются, проблемы с DNS также станут проще. Мы не рекомендуем полагаться на IPv4-отображённые адреса.
+
+===== унифицированный код tcp и inpcb
+
+FreeBSD 4.x использует общий код tcp для IPv4 и IPv6 (из sys/netinet/tcp*) и раздельный код udp4/6. В нем используется унифицированная структура inpcb.
+
+Платформа может быть настроена для поддержки IPv4-отображённых адресов. Конфигурация ядра кратко описана ниже:
+
+* По умолчанию сокет AF_INET6 может принимать IPv4-соединения при определённых условиях и инициировать соединение с IPv4-адресами, встроенными в IPv4-отображённые IPv6-адреса.
+* Вы можете отключить это во всей системе с помощью sysctl, как показано ниже.
++
+`sysctl net.inet6.ip6.mapped_addr=0`
+
+====== Сторона, принимающая соединения
+
+Каждый сокет может быть настроен для поддержки специальной привязки к подстановочному адресу AF_INET6 (включено по умолчанию). Это можно отключить для каждого отдельного сокета с помощью man:setsockopt[2], как показано ниже.
+
+[.programlisting]
+....
+ int on;
+
+ setsockopt(s, IPPROTO_IPV6, IPV6_BINDV6ONLY,
+ (char *)&on, sizeof (on)) < 0));
+....
+
+Сокет с универсальной привязкой AF_INET6 перехватывает IPv4-подключение тогда и только тогда, когда выполнены следующие условия:
+
+* нет AF_INET сокета, соответствующего IPv4-подключению
+* Сокет AF_INET6 настроен на прием IPv4-трафика, т.е., getsockopt(IPV6_BINDV6ONLY) возвращает 0.
+
+Нет проблем с порядком открытия/закрытия.
+
+====== Инициирующая сторона
+
+FreeBSD 4.x поддерживает исходящее соединение с IPv4-отображённым адресом (::ffff:10.1.1.1), если узел настроен на поддержку IPv4-отображённых адресов.
+
+==== sockaddr_storage
+
+Когда RFC2553 был близок к завершению, велись дискуссии о том, как называть элементы структуры `sockaddr_storage`. Одно предложение заключалось в добавлении "__" перед именами элементов (например, "__ss_len"), так как к ним не следует обращаться напрямую. Другое предложение было не добавлять префикс (например, "ss_len"), поскольку необходимо прямое обращение к этим элементам. Четкого консенсуса по этому вопросу достигнуто не было.
+
+В результате, RFC2553 определяет структуру sockaddr_storage следующим образом:
+
+[.programlisting]
+....
+ struct sockaddr_storage {
+ u_char __ss_len; /* address length */
+ u_char __ss_family; /* address family */
+ /* and bunch of padding */
+ };
+....
+
+Напротив, черновик XNET определяет следующее:
+
+[.programlisting]
+....
+ struct sockaddr_storage {
+ u_char ss_len; /* address length */
+ u_char ss_family; /* address family */
+ /* and bunch of padding */
+ };
+....
+
+В декабре 1999 года было согласовано, что RFC2553bis должен принять последнее (XNET) определение.
+
+Текущая реализация соответствует определению XNET, основанному на обсуждении RFC2553bis.
+
+Если вы рассмотрите несколько реализаций IPv6, то сможете увидеть оба определения. Для программиста в пользовательском пространстве наиболее переносимый способ работы с этим:
+
+. с помощью GNU autoconf сконфигурировать доступ к `ss_family` и/или `ss_len` на целевой платформе,
+. добавить -Dss_family=__ss_family для унификации всех использований (включая заголовочный файл) __ss_family, или
+. никогда не трогайте __ss_family. Приводите к sockaddr * и используйте sa_family, например:
++
+[.programlisting]
+....
+ struct sockaddr_storage ss;
+ family = ((struct sockaddr *)&ss)->sa_family
+....
+
+=== Драйверы сетевых устройств
+
+В настоящее время следующие два пункта должны поддерживаться стандартными драйверами:
+
+. Требование к кластеризации mbuf. В этом стабильном выпуске мы изменили MINCLSIZE на MHLEN+1 для всех операционных систем, чтобы все драйверы работали так, как мы ожидаем.
+. многоадресная рассылка (multicast). Если man:ifmcstat[8] не выводит ни одной многоадресной группы для интерфейса, этот интерфейс необходимо исправить.
+
+Если какие-либо драйверы не поддерживают требования, то их нельзя использовать для IPv6 и/или IPsec-связи. Если вы обнаружили проблему с вашей картой при использовании IPv6/IPsec, пожалуйста, сообщите об этом в {freebsd-bugs}.
+
+(NOTE: Раньше мы требовали, чтобы все драйверы PCMCIA содержали вызов in6_ifattach(). Теперь такого требования нет)
+
+=== Транслятор
+
+Мы классифицируем трансляторы IPv4/IPv6 на 4 типа:
+
+* _Транслятор А_ --- Он используется на раннем этапе перехода, чтобы позволить установить соединение с IPv6-хоста на IPv6-острове к IPv4-хосту в IPv4-океане.
+* _Транслятор Б_ --- Он используется на раннем этапе перехода, чтобы обеспечить возможность установления соединения с IPv6-узлом на IPv6-острове от IPv4-узла в IPv4-океане.
+* _Транслятор C_ --- Он используется на позднем этапе перехода, чтобы сделать возможным установление соединения с IPv6-узлом в IPv6-океане от IPv4-узла на IPv4-острове.
+* _Транслятор D_ --- Он используется на позднем этапе перехода, чтобы сделать возможным установление соединения с IPv6-хоста в IPv6-океане на IPv4-хост на IPv4-острове.
+
+[[ipsec-implementation]]
+=== IPsec
+
+IPsec состоит в основном из трех компонент.
+
+. Управление политиками
+. Управление ключами
+. Обработка AH и ESP
+
+==== Управление политиками
+
+Ядро реализует экспериментальный код управления политикой безопасности. Существует два способа управления политикой безопасности. Первый — настройка политики для каждого сокета с помощью man:setsockopt[2]. В этом случае конфигурация политики описана в man:ipsec_set_policy[3]. Второй способ — настройка политики на основе фильтра пакетов ядра с использованием интерфейса PF_KEY через man:setkey[8].
+
+Запись политики не переупорядочивается вместе со своими индексами, поэтому порядок добавления записей очень важен.
+
+==== Управление ключами
+
+Код управления ключами, реализованный в этом наборе (sys/netkey), представляет собой собственную реализацию PFKEY v2. Это соответствует RFC2367.
+
+В комплект включена "домашняя" реализация демона IKE — "racoon" (kame/kame/racoon). Обычно вам потребуется запустить racoon в качестве демона, затем настроить политику для требования ключей (например, `ping -P 'out ipsec esp/transport//use'`). Ядро будет связываться с демоном racoon по мере необходимости для обмена ключами.
+
+==== Обработка AH и ESP
+
+Модуль IPsec реализован в виде "хуков" к стандартной обработке IPv4/IPv6. При отправке пакета функция ip{,6}_output() проверяет, требуется ли обработка ESP/AH, путем поиска соответствующей базы данных политик безопасности (SPD — Security Policy Database). Если ESP/AH необходим, вызывается {esp,ah}{4,6}_output(), и mbuf соответствующим образом обновляется. При получении пакета функция {esp,ah}4_input() вызывается на основе номера протокола, т.е. (*inetsw[proto])(). {esp,ah}4_input() расшифровывает/проверяет подлинность пакета, а также удаляет цепочку заголовков и выравнивание для ESP/AH. Безопасно удалять заголовок ESP/AH при получении пакета, так как полученный пакет никогда не будет использоваться в "сыром" виде.
+
+Использование ESP/AH влияет на эффективный размер сегмента данных TCP4/6 из-за дополнительных цепочечных заголовков, вставляемых ESP/AH. Наш код учитывает этот случай.
+
+Основные криптографические функции можно найти в директории `sys/crypto`. Преобразования ESP/AH перечислены в `{esp,ah}_core.c` с обёрточными функциями. Если вы хотите добавить какой-либо алгоритм, добавьте обёрточную функцию в `{esp,ah}_core.c` и поместите код вашего криптографического алгоритма в `sys/crypto`.
+
+Режим туннеля частично поддерживается в этом выпуске со следующими ограничениями:
+
+* Туннель IPsec не объединён с универсальным туннельным интерфейсом GIF. Это требует особой осторожности, так как может возникнуть бесконечный цикл между `ip_output()` и `tunnelifp->if_output()`. Мнения расходятся относительно того, лучше ли их объединить или нет.
+* MTU и бит Don't Fragment (IPv4) требуют дополнительной проверки, но в основном работают нормально.
+* Модель аутентификации для туннеля AH должна быть пересмотрена. Нам потребуется улучшить механизм управления политиками в конечном итоге.
+
+==== Соответствие RFC и ID
+
+Код IPsec в ядре соответствует (или пытается соответствовать) следующим стандартам:
+
+Спецификация "старого IPsec", описанная в [.filename]#rfc182[5-9].txt#
+
+Спецификация "new IPsec" описана в [.filename]#rfc240[1-6].txt#, [.filename]#rfc241[01].txt#, [.filename]#rfc2451.txt# и [.filename]#draft-mcdonald-simple-ipsec-api-01.txt# (черновик устарел, но его можно взять по ссылке: link:ftp://ftp.kame.net/pub/internet-drafts/[ ftp://ftp.kame.net/pub/internet-drafts/]). (ПРИМЕЧАНИЕ: Спецификации IKE, [.filename]#rfc241[7-9].txt#, реализованы в пользовательском пространстве в виде демона IKE "racoon")
+
+В настоящее время поддерживаются следующие алгоритмы:
+
+* old IPsec AH
+
+** нулевая криптографическая контрольная сумма (нет документа, только для отладки)
+** MD5 с ключом и с 128-битной криптографической контрольной суммой ([.filename]#rfc1828.txt#)
+** SHA1 с ключом и с 128-битной криптографической контрольной суммой (без документа)
+** HMAC MD5 с 128-битной криптографической контрольной суммой ([.filename]#rfc2085.txt#)
+** HMAC SHA1 с 128-битной криптографической контрольной суммой (без документа)
+
+* old IPsec ESP
+
+** нулевое шифрование (нет документа, аналогично [.filename]#rfc2410.txt#)
+** Режим DES-CBC ([.filename]#rfc1829.txt#)
+
+* new IPsec AH
+
+** нулевая криптографическая контрольная сумма (нет документа, только для отладки)
+** MD5 с ключом и с 96-битной криптографической контрольной суммой (нет документа)
+** SHA1 с ключом и с 96-битной криптографической контрольной суммой (без документа)
+** HMAC MD5 с 96-битной криптографической контрольной суммой ([.filename]#rfc2403.txt#)
+** HMAC SHA1 с 96-битной криптографической контрольной суммой ([.filename]#rfc2404.txt#)
+
+* new IPsec ESP
+
+** нулевое шифрование ([.filename]#rfc2410.txt#)
+** DES-CBC с производным IV ([.filename]#draft-ietf-ipsec-ciph-des-derived-01.txt#, черновик истек)
+** DES-CBC с явным вектором инициализации ([.filename]#rfc2405.txt#)
+** 3DES-CBC с явным вектором инициализации ([.filename]#rfc2451.txt#)
+** BLOWFISH CBC ([.filename]#rfc2451.txt#)
+** CAST128 CBC ([.filename]#rfc2451.txt#)
+** RC5 CBC ([.filename]#rfc2451.txt#)
+** каждый из вышеперечисленных может быть объединён с:
+
+*** Аутентификация ESP с HMAC-MD5 (96 бит)
+*** Аутентификация ESP с HMAC-SHA1(96 бит)
+
+Следующие алгоритмы НЕ поддерживаются:
+
+* old IPsec AH
+
+** HMAC MD5 с 128-битной криптографической контрольной суммой + 64-битная защита от повторного воспроизведения ([.filename]#rfc2085.txt#)
+** SHA1 с ключом и с 160-битной криптографической контрольной суммой +
+32-битное дополнение ([.filename]#rfc1852.txt#)
+
+IPsec (в ядре) и IKE (в пользовательском пространстве как "racoon") были протестированы на нескольких мероприятиях по тестированию взаимодействия и известно, что они хорошо работают со многими другими реализациями. Кроме того, текущая реализация IPsec поддерживает довольно широкий спектр криптографических алгоритмов IPsec, описанных в RFC (мы поддерживаем только алгоритмы без проблем с интеллектуальной собственностью).
+
+[[ipsec-ecn]]
+==== Учет ECN в IPsec-туннелях
+
+Поддерживается ECN-совместимый IPsec-туннель, как описано в [.filename]#draft-ipsec-ecn-00.txt#.
+
+Обычный IPsec-туннель описан в RFC2401. При инкапсуляции поле TOS IPv4 (или поле класса трафика IPv6) копируется из внутреннего IP-заголовка во внешний IP-заголовок. При декапсуляции внешний IP-заголовок просто отбрасывается. Правило декапсуляции несовместимо с ECN, так как бит ECN в поле TOS/класса трафика внешнего IP-заголовка будет потерян.
+
+Чтобы сделать IPsec-туннель дружественным к ECN, следует изменить процедуры инкапсуляции и декапсуляции. Это описано в http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt[ http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt], глава 3.
+
+Реализация туннеля IPsec может обеспечить три варианта поведения, в зависимости от значения параметра `net.inet.ipsec.ecn` (или `net.inet6.ipsec6.ecn`):
+
+* RFC2401: отсутствие учета ECN (значение sysctl -1)
+* ECN запрещён (значение sysctl 0)
+* ECN разрешён (значение sysctl 1)
+
+Обратите внимание, что поведение настраивается для каждого узла, а не для каждой SA (в draft-ipsec-ecn-00 предлагается настройка для каждой SA, но это кажется излишним).
+
+Поведение можно обобщить следующим образом (подробности см. в исходном коде):
+
+[source, bash]
+....
+encapsulate decapsulate
+ --- ---
+RFC2401 copy all TOS bits drop TOS bits on outer
+ from inner to outer. (use inner TOS bits as is)
+
+ECN forbidden copy TOS bits except for ECN drop TOS bits on outer
+ (masked with 0xfc) from inner (use inner TOS bits as is)
+ to outer. set ECN bits to 0.
+
+ECN allowed copy TOS bits except for ECN use inner TOS bits with some
+ CE (masked with 0xfe) from change. if outer ECN CE bit
+ inner to outer. is 1, enable ECN CE bit on
+ set ECN CE bit to 0. the inner.
+....
+
+Общая стратегия настройки выглядит следующим образом:
+
+* если оба конечных пункта туннеля IPsec поддерживают поведение, дружественное к ECN, лучше настроить оба конца на "разрешено ECN" (значение sysctl 1).
+* если другая сторона очень строга к биту TOS, используйте "RFC2401" (значение sysctl -1).
+* в остальных случаях используйте "ECN запрещено" (значение sysctl 0).
+
+Поведение по умолчанию — "ECN запрещён" (значение sysctl 0).
+
+Для получения дополнительной информации обратитесь к:
+
+http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt[ http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt], RFC2481 (Явное Уведомление о Перегрузке), src/sys/netinet6/{ah,esp}_input.c
+
+(Благодарности Kenjiro Cho mailto:kjc@csl.sony.co.jp[kjc@csl.sony.co.jp] за детальный анализ)
+
+==== Совместимость
+
+Вот некоторые из платформ, на которых код KAME тестировал взаимодействие IPsec/IKE в прошлом. Обратите внимание, что обе стороны могли изменить свои реализации, поэтому используйте следующий список только в справочных целях.
+
+Altiga, Ashley-laurent (vpcom.com), Data Fellows (F-Secure), Ericsson ACC, FreeS/WAN, HITACHI, IBM AIX(R), IIJ, Intel, Microsoft(R) Windows NT(R), NIST (linux IPsec + plutoplus), Netscreen, OpenBSD, RedCreek, Routerware, SSH, Secure Computing, Soliton, Toshiba, VPNet, Yamaha RT100i
diff --git a/documentation/content/ru/books/developers-handbook/ipv6/_index.po b/documentation/content/ru/books/developers-handbook/ipv6/_index.po
new file mode 100644
index 0000000000..d842459698
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/ipv6/_index.po
@@ -0,0 +1,2818 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-09-23 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookipv6_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:1
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:16
+#, no-wrap
+msgid "IPv6 Internals"
+msgstr "Внутреннее устройство IPv6"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:1
+#, no-wrap
+msgid "Chapter 8. IPv6 Internals"
+msgstr "Глава 8. Внутреннее устройство IPv6"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:54
+#, no-wrap
+msgid "IPv6/IPsec Implementation"
+msgstr "Реализация IPv6/IPsec"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:58
+msgid ""
+"This section should explain IPv6 and IPsec related implementation "
+"internals. These functionalities are derived from http://www.kame.net/[KAME "
+"project]"
+msgstr ""
+"В этом разделе мы объясним внутреннюю реализацию, связанную с IPv6 и IPsec. "
+"Данная функциональность заимствована из http://www.kame.net/[проекта KAME]"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:60
+#, no-wrap
+msgid "IPv6"
+msgstr "IPv6"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:62
+#, no-wrap
+msgid "Conformance"
+msgstr "Соответствие"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:66
+msgid ""
+"The IPv6 related functions conforms, or tries to conform to the latest set "
+"of IPv6 specifications. For future reference we list some of the relevant "
+"documents below (_NOTE_: this is not a complete list - this is too hard to "
+"maintain...)."
+msgstr ""
+"Функции, связанные с IPv6, соответствуют или пытаются соответствовать "
+"последнему набору спецификаций IPv6. Для дальнейшего использования мы "
+"приводим некоторые из соответствующих документов ниже (_ПРИМЕЧАНИЕ_: это не "
+"полный список — его слишком сложно поддерживать...)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:68
+msgid ""
+"For details please refer to specific chapter in the document, RFCs, manual "
+"pages, or comments in the source code."
+msgstr ""
+"Для подробностей обратитесь к соответствующей главе документа, RFC, "
+"страницам Справосника или комментариям в исходном коде."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:72
+msgid ""
+"Conformance tests have been performed on the KAME STABLE kit at TAHI "
+"project. Results can be viewed at http://www.tahi.org/report/KAME/[http://"
+"www.tahi.org/report/KAME/]. We also attended University of New Hampshire "
+"IOL tests (http://www.iol.unh.edu/[http://www.iol.unh.edu/]) in the past, "
+"with our past snapshots."
+msgstr ""
+"Тесты на соответствие стандартам были проведены для KAME STABLE в проекте "
+"TAHI. Результаты можно посмотреть по ссылке http://www.tahi.org/report/KAME/"
+"[http://www.tahi.org/report/KAME/]. Мы также участвовали в тестах IOL "
+"Университета Нью-Гэмпшира (http://www.iol.unh.edu/[http://www.iol.unh.edu/]) "
+"в прошлом, используя наши предыдущие версии."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:74
+msgid "RFC1639: FTP Operation Over Big Address Records (FOOBAR)"
+msgstr "RFC1639: FTP Operation Over Big Address Records (FOOBAR)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:76
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:113
+msgid ""
+"RFC2428 is preferred over RFC1639. FTP clients will first try RFC2428, then "
+"RFC1639 if failed."
+msgstr ""
+"RFC2428 предпочтительнее RFC1639. FTP-клиенты сначала попробуют RFC2428, "
+"затем RFC1639 в случае неудачи."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:78
+msgid "RFC1886: DNS Extensions to support IPv6"
+msgstr "RFC1886: DNS Extensions to support IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:79
+msgid "RFC1933: Transition Mechanisms for IPv6 Hosts and Routers"
+msgstr "RFC1933: Transition Mechanisms for IPv6 Hosts and Routers"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:81
+msgid "IPv4 compatible address is not supported."
+msgstr "IPv4-совместимый адрес не поддерживается."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:82
+msgid "automatic tunneling (described in 4.3 of this RFC) is not supported."
+msgstr ""
+"автоматическое туннелирование (описано в разделе 4.3 данного RFC) не "
+"поддерживается."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:84
+msgid ""
+"man:gif[4] interface implements IPv[46]-over-IPv[46] tunnel in a generic "
+"way, and it covers \"configured tunnel\" described in the spec. See "
+"crossref:ipv6[gif,23.5.1.5] in this document for details."
+msgstr ""
+"man:gif[4] интерфейс реализует IPv[46]-поверх-IPv[46] туннель в общем виде и "
+"включает \"настроенный туннель\", описанный в спецификации. Подробности см. "
+"в crossref:ipv6[gif,23.5.1.5] этого документа."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:86
+msgid "RFC1981: Path MTU Discovery for IPv6"
+msgstr "RFC1981: Path MTU Discovery for IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:87
+msgid "RFC2080: RIPng for IPv6"
+msgstr "RFC2080: RIPng for IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:89
+msgid "usr.sbin/route6d support this."
+msgstr "usr.sbin/route6d это поддерживает."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:91
+msgid "RFC2292: Advanced Sockets API for IPv6"
+msgstr "RFC2292: Advanced Sockets API for IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:93
+msgid ""
+"For supported library functions/kernel APIs, see [.filename]#sys/netinet6/"
+"ADVAPI#."
+msgstr ""
+"Для поддерживаемых функций библиотек/API ядра см. [.filename]#sys/netinet6/"
+"ADVAPI#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:95
+msgid "RFC2362: Protocol Independent Multicast-Sparse Mode (PIM-SM)"
+msgstr "RFC2362: Protocol Independent Multicast-Sparse Mode (PIM-SM)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:97
+msgid ""
+"RFC2362 defines packet formats for PIM-SM. [.filename]#draft-ietf-pim-"
+"ipv6-01.txt# is written based on this."
+msgstr ""
+"RFC2362 определяет форматы пакетов для PIM-SM. [.filename]#draft-ietf-pim-"
+"ipv6-01.txt# написан на основе этого."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:99
+msgid "RFC2373: IPv6 Addressing Architecture"
+msgstr "RFC2373: IPv6 Addressing Architecture"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:101
+msgid ""
+"supports node required addresses, and conforms to the scope requirement."
+msgstr ""
+"поддерживает обязательные адреса узлов и соответствует требованиям области "
+"видимости."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:103
+msgid "RFC2374: An IPv6 Aggregatable Global Unicast Address Format"
+msgstr "RFC2374: An IPv6 Aggregatable Global Unicast Address Format"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:105
+msgid "supports 64-bit length of Interface ID."
+msgstr "поддерживает 64-битную длину Идентификатора Интерфейса."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:107
+msgid "RFC2375: IPv6 Multicast Address Assignments"
+msgstr "RFC2375: IPv6 Multicast Address Assignments"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:109
+msgid "Userland applications use the well-known addresses assigned in the RFC."
+msgstr ""
+"Пользовательские приложения используют общеизвестные адреса, назначенные в "
+"RFC."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:111
+msgid "RFC2428: FTP Extensions for IPv6 and NATs"
+msgstr "RFC2428: FTP Extensions for IPv6 and NATs"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:115
+msgid "RFC2460: IPv6 specification"
+msgstr "RFC2460: IPv6 specification"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:116
+msgid "RFC2461: Neighbor discovery for IPv6"
+msgstr "RFC2461: Neighbor discovery for IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:118
+msgid ""
+"See crossref:ipv6[neighbor-discovery,23.5.1.2] in this document for details."
+msgstr ""
+"См. crossref:ipv6[neighbor-discovery,23.5.1.2] в этом документе для "
+"получения подробностей."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:120
+msgid "RFC2462: IPv6 Stateless Address Autoconfiguration"
+msgstr "RFC2462: IPv6 Stateless Address Autoconfiguration"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:122
+msgid "See crossref:ipv6[ipv6-pnp,23.5.1.4] in this document for details."
+msgstr ""
+"См. crossref:ipv6[ipv6-pnp,23.5.1.4] в этом документе для получения "
+"подробностей."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:124
+msgid "RFC2463: ICMPv6 for IPv6 specification"
+msgstr "RFC2463: ICMPv6 for IPv6 specification"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:126
+msgid "See crossref:ipv6[icmpv6,23.5.1.9] in this document for details."
+msgstr ""
+"См. crossref:ipv6[icmpv6,23.5.1.9] в этом документе для получения "
+"подробностей."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:128
+msgid "RFC2464: Transmission of IPv6 Packets over Ethernet Networks"
+msgstr "RFC2464: Transmission of IPv6 Packets over Ethernet Networks"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:129
+msgid "RFC2465: MIB for IPv6: Textual Conventions and General Group"
+msgstr "RFC2465: MIB for IPv6: Textual Conventions and General Group"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:131
+msgid ""
+"Necessary statistics are gathered by the kernel. Actual IPv6 MIB support is "
+"provided as a patchkit for ucd-snmp."
+msgstr ""
+"Необходимая статистика собирается ядром. Фактическая поддержка MIB для IPv6 "
+"предоставляется в виде набора патчей для ucd-snmp."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:133
+msgid "RFC2466: MIB for IPv6: ICMPv6 group"
+msgstr "RFC2466: MIB for IPv6: ICMPv6 group"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:135
+msgid ""
+"Necessary statistics are gathered by the kernel. Actual IPv6 MIB support is "
+"provided as patchkit for ucd-snmp."
+msgstr ""
+"Необходимая статистика собирается ядром. Фактическая поддержка MIB IPv6 "
+"предоставляется в виде патча для ucd-snmp."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:137
+msgid "RFC2467: Transmission of IPv6 Packets over FDDI Networks"
+msgstr "RFC2467: Transmission of IPv6 Packets over FDDI Networks"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:138
+msgid "RFC2497: Transmission of IPv6 packet over ARCnet Networks"
+msgstr "RFC2497: Transmission of IPv6 packet over ARCnet Networks"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:139
+msgid "RFC2553: Basic Socket Interface Extensions for IPv6"
+msgstr "RFC2553: Basic Socket Interface Extensions for IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:142
+msgid ""
+"IPv4 mapped address (3.7) and special behavior of IPv6 wildcard bind socket "
+"(3.8) are supported. See crossref:ipv6[ipv6-wildcard-socket,23.5.1.12] in "
+"this document for details."
+msgstr ""
+"Отображаемый адрес IPv4 (3.7) и особое поведение сокета с привязкой по "
+"шаблону IPv6 (3.8) поддерживаются. Подробности см. в разделе "
+"crossref:ipv6[ipv6-wildcard-socket,23.5.1.12] этого документа."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:144
+msgid "RFC2675: IPv6 Jumbograms"
+msgstr "RFC2675: IPv6 Jumbograms"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:146
+msgid "See crossref:ipv6[ipv6-jumbo,23.5.1.7] in this document for details."
+msgstr ""
+"См. crossref:ipv6[ipv6-jumbo,23.5.1.7] в этом документе для получения "
+"подробностей."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:148
+msgid "RFC2710: Multicast Listener Discovery for IPv6"
+msgstr "RFC2710: Multicast Listener Discovery for IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:149
+msgid "RFC2711: IPv6 router alert option"
+msgstr "RFC2711: IPv6 router alert option"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:150
+msgid ""
+"[.filename]#draft-ietf-ipngwg-router-renum-08#: Router renumbering for IPv6"
+msgstr ""
+"[.filename]#draft-ietf-ipngwg-router-renum-08#: Перенумерация "
+"маршрутизаторов для IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:151
+msgid ""
+"[.filename]#draft-ietf-ipngwg-icmp-namelookups-02#: IPv6 Name Lookups "
+"Through ICMP"
+msgstr ""
+"[.filename]#draft-ietf-ipngwg-icmp-namelookups-02#: Поиск имен через ICMP в "
+"IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:152
+msgid ""
+"[.filename]#draft-ietf-ipngwg-icmp-name-lookups-03#: IPv6 Name Lookups "
+"Through ICMP"
+msgstr ""
+"[.filename]#draft-ietf-ipngwg-icmp-name-lookups-03#: Поиск имен IPv6 через "
+"ICMP"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:153
+msgid "[.filename]#draft-ietf-pim-ipv6-01.txt#: PIM for IPv6"
+msgstr "[.filename]#draft-ietf-pim-ipv6-01.txt#: PIM for IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:155
+msgid ""
+"man:pim6dd[8] implements dense mode. man:pim6sd[8] implements sparse mode."
+msgstr ""
+"man:pim6dd[8] реализует плотный режим. man:pim6sd[8] реализует разреженный "
+"режим."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:157
+msgid ""
+"[.filename]#draft-itojun-ipv6-tcp-to-anycast-00#: Disconnecting TCP "
+"connection toward IPv6 anycast address"
+msgstr ""
+"[.filename]#draft-itojun-ipv6-tcp-to-anycast-00#: Разрыв TCP-соединения с "
+"anycast-адресом IPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:158
+msgid "[.filename]#draft-yamamoto-wideipv6-comm-model-00#"
+msgstr "[.filename]#draft-yamamoto-wideipv6-comm-model-00#"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:160
+msgid "See crossref:ipv6[ipv6-sas,23.5.1.6] in this document for details."
+msgstr ""
+"См. crossref:ipv6[ipv6-sas,23.5.1.6] в этом документе для более подробной "
+"информации."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:162
+msgid ""
+"[.filename]#draft-ietf-ipngwg-scopedaddr-format-00.txt#: An Extension of "
+"Format for IPv6 Scoped Addresses"
+msgstr ""
+"[.filename]#draft-ietf-ipngwg-scopedaddr-format-00.txt#: Расширение формата "
+"для адресов с областью действия IPv6"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:164
+#, no-wrap
+msgid "Neighbor Discovery"
+msgstr "Функция \"Обнаружение соседей\""
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:169
+msgid ""
+"Neighbor Discovery is fairly stable. Currently Address Resolution, "
+"Duplicated Address Detection, and Neighbor Unreachability Detection are "
+"supported. In the near future we will be adding Proxy Neighbor "
+"Advertisement support in the kernel and Unsolicited Neighbor Advertisement "
+"transmission command as admin tool."
+msgstr ""
+"Обнаружение соседей достаточно стабильно. В настоящее время поддерживаются "
+"следующие функции: определение адреса (Address Resolution), обнаружение "
+"дублирования адресов (DAD — Duplicated Address Detection) и обнаружение "
+"недоступности соседей (Neighbor Unreachability Detection). В ближайшем "
+"будущем мы добавим поддержку прокси-объявлений соседей (Proxy Neighbor "
+"Advertisement) в ядро и команду передачи непрошенных объявлений соседей "
+"(Unsolicited Neighbor Advertisement) в качестве инструмента администратора."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:174
+msgid ""
+"If DAD fails, the address will be marked \"duplicated\" and message will be "
+"generated to syslog (and usually to console). The \"duplicated\" mark can "
+"be checked with man:ifconfig[8]. It is administrators' responsibility to "
+"check for and recover from DAD failures. The behavior should be improved in "
+"the near future."
+msgstr ""
+"Если DAD завершается неудачно, адрес будет помечен как \"дублированный\" "
+"(duplicated), и сообщение будет записано в syslog (а также обычно выведено "
+"на консоль). Метку \"дублированный\" можно проверить с помощью "
+"man:ifconfig[8]. Обязанность администратора — проверять и устранять сбои "
+"DAD. В ближайшем будущем поведение должно быть улучшено."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:178
+msgid ""
+"Some of the network driver loops multicast packets back to itself, even if "
+"instructed not to do so (especially in promiscuous mode). In such cases DAD "
+"may fail, because DAD engine sees inbound NS packet (actually from the node "
+"itself) and considers it as a sign of duplicate. You may want to look at "
+"#if condition marked \"heuristics\" in sys/netinet6/"
+"nd6_nbr.c:nd6_dad_timer() as workaround (note that the code fragment in "
+"\"heuristics\" section is not spec conformant)."
+msgstr ""
+"Некоторые сетевые драйверы закольцовывают multicast-пакеты обратно на себя, "
+"даже если им указано так не делать (особенно в promiscuous mode). В таких "
+"случаях DAD может завершиться неудачей, так как механизм DAD видит входящий "
+"NS-пакет (на самом деле от самого узла) и считает его признаком дубликата. В "
+"качестве обходного решения можно рассмотреть условие #if с пометкой "
+"\"heuristics\" в sys/netinet6/nd6_nbr.c:nd6_dad_timer() (обратите внимание, "
+"что фрагмент кода в разделе \"heuristics\" не соответствует спецификации)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:180
+msgid ""
+"Neighbor Discovery specification (RFC2461) does not talk about neighbor "
+"cache handling in the following cases:"
+msgstr ""
+"Спецификация обнаружения соседей (RFC2461) не рассматривает обработку кэша "
+"соседей в следующих случаях:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:182
+msgid ""
+"when there was no neighbor cache entry, node received unsolicited RS/NS/NA/"
+"redirect packet without link-layer address"
+msgstr ""
+"когда отсутствовала запись в кэше соседей, узел получал нежелательный пакет "
+"RS/NS/NA/редирект без адреса канального уровня"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:183
+msgid ""
+"neighbor cache handling on medium without link-layer address (we need a "
+"neighbor cache entry for IsRouter bit)"
+msgstr ""
+"обработка кэша соседей в среде без адреса канального уровня (нам нужна "
+"запись в кэше соседей для бита IsRouter)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:186
+msgid ""
+"For first case, we implemented workaround based on discussions on IETF "
+"ipngwg mailing list. For more details, see the comments in the source code "
+"and email thread started from (IPng 7155), dated Feb 6 1999."
+msgstr ""
+"Для первого случая мы реализовали временное решение на основе обсуждений в "
+"рассылке IETF ipngwg. Подробности можно найти в комментариях исходного кода "
+"и ветке электронной почты, начавшейся с (IPng 7155) от 6 февраля 1999 года."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:189
+msgid ""
+"IPv6 on-link determination rule (RFC2461) is quite different from "
+"assumptions in BSD network code. At this moment, no on-link determination "
+"rule is supported where default router list is empty (RFC2461, section 5.2, "
+"last sentence in 2nd paragraph - note that the spec misuse the word \"host\" "
+"and \"node\" in several places in the section)."
+msgstr ""
+"Правило определения локальной IPv6 сети (RFC2461) значительно отличается от "
+"предположений в сетевом коде BSD. На данный момент не поддерживается правило "
+"определения локальной сети при пустом списке маршрутизаторов по умолчанию "
+"(RFC2461, раздел 5.2, последнее предложение во 2-м абзаце - обратите "
+"внимание, что в спецификации некорректно используются слова \"host\" и "
+"\"node\" в нескольких местах раздела)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:194
+msgid ""
+"To avoid possible DoS attacks and infinite loops, only 10 options on ND "
+"packet is accepted now. Therefore, if you have 20 prefix options attached "
+"to RA, only the first 10 prefixes will be recognized. If this troubles you, "
+"please ask it on FREEBSD-CURRENT mailing list and/or modify nd6_maxndopt in "
+"[.filename]#sys/netinet6/nd6.c#. If there are high demands we may provide "
+"sysctl knob for the variable."
+msgstr ""
+"Во избежание возможных атак типа DoS и бесконечных циклов, сейчас "
+"принимается только 10 опций в ND-пакете. Таким образом, если к RA "
+"прикреплено 20 опций префиксов, будут распознаны только первые 10 префиксов. "
+"Если это вызывает проблемы, пожалуйста, задайте вопрос в рассылке FREEBSD-"
+"CURRENT и/или измените nd6_maxndopt в [.filename]#sys/netinet6/nd6.c#. При "
+"высоком спросе мы можем предоставить sysctl-параметр для этой переменной."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:196
+#, no-wrap
+msgid "Scope Index"
+msgstr "Индекс зоны"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:201
+msgid ""
+"IPv6 uses scoped addresses. Therefore, it is very important to specify "
+"scope index (interface index for link-local address, or site index for site-"
+"local address) with an IPv6 address. Without scope index, scoped IPv6 "
+"address is ambiguous to the kernel, and kernel will not be able to determine "
+"the outbound interface for a packet."
+msgstr ""
+"В IPv6 используются адреса с областями видимости — зонами. Поэтому очень "
+"важно указывать индекс зоны (индекс интерфейса для линк-локального адреса "
+"или индекс сайта для сайт-локального адреса) вместе с IPv6 адресом. Без "
+"индекса зоны адрес IPv6 с ограниченной областью действия является "
+"неоднозначным для ядра, и ядро не сможет определить исходящий интерфейс для "
+"пакета."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:206
+msgid ""
+"Ordinary userland applications should use advanced API (RFC2292) to specify "
+"scope index, or interface index. For similar purpose, sin6_scope_id member "
+"in sockaddr_in6 structure is defined in RFC2553. However, the semantics for "
+"sin6_scope_id is rather vague. If you care about portability of your "
+"application, we suggest you to use advanced API rather than sin6_scope_id."
+msgstr ""
+"Обычные пользовательские приложения должны использовать расширенный API "
+"(RFC2292) для указания индекса зоны или индекса интерфейса. Для аналогичных "
+"целей член sin6_scope_id в структуре sockaddr_in6 определён в RFC2553. "
+"Однако семантика sin6_scope_id довольно расплывчата. Если важна "
+"переносимость вашего приложения, мы рекомендуем использовать расширенный API "
+"вместо sin6_scope_id."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:209
+msgid ""
+"In the kernel, an interface index for link-local scoped address is embedded "
+"into 2nd 16bit-word (3rd and 4th byte) in IPv6 address. For example, you "
+"may see something like:"
+msgstr ""
+"В ядре индекс интерфейса для адреса с областью действия link-local "
+"встраивается во второе 16-битное слово (3-й и 4-й байт) в IPv6-адресе. "
+"Например, вы можете увидеть что-то вроде:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:213
+#, no-wrap
+msgid "\tfe80:1::200:f8ff:fe01:6317\n"
+msgstr "\tfe80:1::200:f8ff:fe01:6317\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:218
+msgid ""
+"in the routing table and interface address structure (struct in6_ifaddr). "
+"The address above is a link-local unicast address which belongs to a network "
+"interface whose interface identifier is 1. The embedded index enables us to "
+"identify IPv6 link local addresses over multiple interfaces effectively and "
+"with only a little code change."
+msgstr ""
+"в таблице маршрутизации и структуре адреса интерфейса (struct in6_ifaddr). "
+"Указанный выше адрес является линк-локальным уникастным адресом, который "
+"принадлежит сетевому интерфейсу с идентификатором интерфейса 1. Встроенный "
+"индекс позволяет эффективно идентифицировать локальные адреса IPv6 на "
+"нескольких интерфейсах с минимальными изменениями кода."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:223
+msgid ""
+"Routing daemons and configuration programs, like man:route6d[8] and "
+"man:ifconfig[8], will need to manipulate the \"embedded\" scope index. "
+"These programs use routing sockets and ioctls (like SIOCGIFADDR_IN6) and the "
+"kernel API will return IPv6 addresses with 2nd 16bit-word filled in. The "
+"APIs are for manipulating kernel internal structure. Programs that use "
+"these APIs have to be prepared about differences in kernels anyway."
+msgstr ""
+"Демоны маршрутизации и программы настройки, такие как man:route6d[8] и "
+"man:ifconfig[8], должны управлять \"встроенным\" индексом зоны. Эти "
+"программы используют сокеты маршрутизации и ioctl (например, "
+"SIOCGIFADDR_IN6), и API ядра будет возвращать IPv6-адреса с заполненным "
+"вторым 16-битным словом. API предназначены для управления внутренними "
+"структурами ядра. Программы, использующие эти API, в любом случае должны "
+"быть готовы к различиям в ядрах."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:230
+msgid ""
+"When you specify scoped address to the command line, NEVER write the "
+"embedded form (such as ff02:1::1 or fe80:2::fedc). This is not supposed to "
+"work. Always use standard form, like ff02::1 or fe80::fedc, with command "
+"line option for specifying interface (like `ping -6 -I ne0 ff02::1`). In "
+"general, if a command does not have command line option to specify outgoing "
+"interface, that command is not ready to accept scoped address. This may "
+"seem to be opposite from IPv6's premise to support \"dentist office\" "
+"situation. We believe that specifications need some improvements for this."
+msgstr ""
+"При указании адреса с ограниченной областью действия в командной строке "
+"НИКОГДА не используйте встроенную форму (например, ff02:1::1 или "
+"fe80:2::fedc). Это не должно работать. Всегда используйте стандартную форму, "
+"такую как ff02::1 или fe80::fedc, с параметром командной строки для указания "
+"интерфейса (например, `ping -6 -I ne0 ff02::1`). В общем, если команда не "
+"имеет параметра командной строки для указания исходящего интерфейса, эта "
+"команда не готова принимать адрес с областью действия. Это кажется "
+"противоречащим принципу IPv6 поддерживать сценарий \"кабинета стоматолога\". "
+"Мы считаем, что спецификации нуждаются в некоторых улучшениях для этого."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:234
+msgid ""
+"Some of the userland tools support extended numeric IPv6 syntax, as "
+"documented in [.filename]#draft-ietf-ipngwg-scopedaddr-format-00.txt#. You "
+"can specify outgoing link, by using name of the outgoing interface like "
+"\"fe80::1%ne0\". This way you will be able to specify link-local scoped "
+"address without much trouble."
+msgstr ""
+"Некоторые пользовательские утилиты поддерживают расширенный числовой "
+"синтаксис IPv6, как описано в [.filename]#draft-ietf-ipngwg-scopedaddr-"
+"format-00.txt#. Можно указать исходящее соединение, используя имя исходящего "
+"интерфейса, например \"fe80::1%ne0\". Таким образом можно легко указать линк-"
+"локальный адрес с ограниченной областью действия."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:237
+msgid ""
+"To use this extension in your program, you will need to use "
+"man:getaddrinfo[3], and man:getnameinfo[3] with NI_WITHSCOPEID. The "
+"implementation currently assumes 1-to-1 relationship between a link and an "
+"interface, which is stronger than what specs say."
+msgstr ""
+"Для использования этого расширения в вашей программе потребуется "
+"использовать man:getaddrinfo[3] и man:getnameinfo[3] с NI_WITHSCOPEID. В "
+"текущей реализации предполагается однозначное соответствие между каналом и "
+"интерфейсом, что является более строгим условием, чем указано в "
+"спецификациях."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:239
+#, no-wrap
+msgid "Plug and Play"
+msgstr "Plug and Play (подключи и работай)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:245
+msgid ""
+"Most of the IPv6 stateless address autoconfiguration is implemented in the "
+"kernel. Neighbor Discovery functions are implemented in the kernel as a "
+"whole. Router Advertisement (RA) input for hosts is implemented in the "
+"kernel. Router Solicitation (RS) output for endhosts, RS input for routers, "
+"and RA output for routers are implemented in the userland."
+msgstr ""
+"Большая часть автонастройки адресов IPv6 без сохранения состояния "
+"реализована в ядре. Функции обнаружения соседей (Neighbor Discovery) "
+"реализованы в ядре целиком. Ввод рекламы маршрутизатора (RA) для хостов "
+"реализован в ядре. Вывод запроса маршрутизатора (RS) для конечных хостов, "
+"ввод RS для маршрутизаторов и вывод RA для маршрутизаторов реализованы в "
+"пользовательском пространстве."
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:246
+#, no-wrap
+msgid "Assignment of link-local, and special addresses"
+msgstr "Назначение линк-локальных и специальных адресов"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:251
+msgid ""
+"IPv6 link-local address is generated from IEEE802 address (Ethernet MAC "
+"address). Each of interface is assigned an IPv6 link-local address "
+"automatically, when the interface becomes up (IFF_UP). Also, direct route "
+"for the link-local address is added to routing table."
+msgstr ""
+"Линк-локальный адрес IPv6 генерируется из IEEE802 адреса (Ethernet MAC "
+"адреса). Каждому интерфейсу автоматически присваивается IPv6 линк-локальный "
+"адрес, когда интерфейс поднимается (IFF_UP). Также в таблицу маршрутизации "
+"добавляется прямой маршрут для линк-локального адреса."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:253
+msgid "Here is an output of netstat command:"
+msgstr "Вот вывод команды netstat:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:260
+#, no-wrap
+msgid ""
+"Internet6:\n"
+"Destination Gateway Flags Netif Expire\n"
+"fe80:1::%ed0/64 link#1 UC ed0\n"
+"fe80:2::%ep0/64 link#2 UC ep0\n"
+msgstr ""
+"Internet6:\n"
+"Destination Gateway Flags Netif Expire\n"
+"fe80:1::%ed0/64 link#1 UC ed0\n"
+"fe80:2::%ep0/64 link#2 UC ep0\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:265
+msgid ""
+"Interfaces that has no IEEE802 address (pseudo interfaces like tunnel "
+"interfaces, or ppp interfaces) will borrow IEEE802 address from other "
+"interfaces, such as Ethernet interfaces, whenever possible. If there is no "
+"IEEE802 hardware attached, a last resort pseudo-random value, MD5(hostname), "
+"will be used as source of link-local address. If it is not suitable for "
+"your usage, you will need to configure the link-local address manually."
+msgstr ""
+"Интерфейсы, не имеющие адреса IEEE802 (псевдоинтерфейсы, такие как "
+"туннельные интерфейсы или интерфейсы ppp), будут заимствовать адрес IEEE802 "
+"у других интерфейсов, например, Ethernet-интерфейсов, когда это возможно. "
+"Если нет подключенного оборудования IEEE802, в качестве последнего средства "
+"будет использовано псевдослучайное значение MD5(hostname) для формирования "
+"линк-локального адреса. Если это не подходит для вашего использования, вам "
+"потребуется настроить линк-локальный адрес вручную."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:268
+msgid ""
+"If an interface is not capable of handling IPv6 (such as lack of multicast "
+"support), link-local address will not be assigned to that interface. See "
+"section 2 for details."
+msgstr ""
+"Если интерфейс не поддерживает IPv6 (например, отсутствует поддержка "
+"multicast), на этот интерфейс не будет назначен линк-локальный адрес. "
+"Подробности см. в разделе 2."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:272
+msgid ""
+"Each interface joins the solicited multicast address and the link-local all-"
+"nodes multicast addresses (e.g., fe80::1:ff01:6317 and ff02::1, "
+"respectively, on the link the interface is attached). In addition to a link-"
+"local address, the loopback address (::1) will be assigned to the loopback "
+"interface. Also, ::1/128 and ff01::/32 are automatically added to routing "
+"table, and loopback interface joins node-local multicast group ff01::1."
+msgstr ""
+"Каждый интерфейс присоединяется к запрашиваемому широковещательному адресу и "
+"линк-локальным широковещательным адресам всех узлов (например, "
+"fe80::1:ff01:6317 и ff02::1 соответственно на соединении, к которому "
+"подключен интерфейс). В дополнение к линк-локальному адресу, адрес обратной "
+"петли (::1 — loopback) будет назначен интерфейсу обратной петли. "
+"Также, ::1/128 и ff01::/32 автоматически добавляются в таблицу "
+"маршрутизации, а loopback-интерфейс (интерфейс обратной петли) "
+"присоединяется к групповому адресу в пределах узла ff01::1."
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:273
+#, no-wrap
+msgid "Stateless address autoconfiguration on Hosts"
+msgstr "Автоматическая настройка адресов без состояния на узлах"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:277
+msgid ""
+"In IPv6 specification, nodes are separated into two categories: _routers_ "
+"and _hosts_. Routers forward packets addressed to others, hosts does not "
+"forward the packets. net.inet6.ip6.forwarding defines whether this node is "
+"router or host (router if it is 1, host if it is 0)."
+msgstr ""
+"В спецификации IPv6 узлы разделены на две категории: _маршрутизаторы_ и "
+"_хосты_. Маршрутизаторы пересылают пакеты, адресованные другим, хосты не "
+"пересылают пакеты. Параметр net.inet6.ip6.forwarding определяет, является ли "
+"данный узел маршрутизатором или хостом (маршрутизатор, если значение равно "
+"1, хост, если 0)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:286
+msgid ""
+"When a host hears Router Advertisement from the router, a host may "
+"autoconfigure itself by stateless address autoconfiguration. This behavior "
+"can be controlled by net.inet6.ip6.accept_rtadv (host autoconfigures itself "
+"if it is set to 1). By autoconfiguration, network address prefix for the "
+"receiving interface (usually global address prefix) is added. Default route "
+"is also configured. Routers periodically generate Router Advertisement "
+"packets. To request an adjacent router to generate RA packet, a host can "
+"transmit Router Solicitation. To generate a RS packet at any time, use the "
+"_rtsol_ command. man:rtsold[8] daemon is also available. man:rtsold[8] "
+"generates Router Solicitation whenever necessary, and it works great for "
+"nomadic usage (notebooks/laptops). If one wishes to ignore Router "
+"Advertisements, use sysctl to set net.inet6.ip6.accept_rtadv to 0."
+msgstr ""
+"Когда хост получает Объявление Маршрутизатора (Router Advertisement) от "
+"маршрутизатора, он может автоматически настроить себя с помощью "
+"автонастройки адреса без сохранения состояния. Это поведение можно "
+"контролировать с помощью параметра net.inet6.ip6.accept_rtadv (хост "
+"автонастраивается, если значение равно 1). При автонастройке добавляется "
+"префикс сетевого адреса для принимающего интерфейса (обычно префикс "
+"глобального адреса). Также настраивается маршрут по умолчанию. "
+"Маршрутизаторы периодически генерируют пакеты Router Advertisement. Чтобы "
+"запросить соседний маршрутизатор сгенерировать RA-пакет, хост может "
+"отправить Router Solicitation. Для генерации RS-пакета в любое время "
+"используйте команду _rtsol_. Также доступен демон man:rtsold[8]. "
+"man:rtsold[8] генерирует Router Solicitation по мере необходимости и отлично "
+"подходит для мобильного использования (ноутбуки/лэптопы). Если необходимо "
+"игнорировать Router Advertisements, используйте sysctl для установки "
+"net.inet6.ip6.accept_rtadv в 0."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:288
+msgid ""
+"To generate Router Advertisement from a router, use the man:rtadvd[8] daemon."
+msgstr ""
+"Для генерации Router Advertisement от маршрутизатора используйте демон "
+"man:rtadvd[8]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:290
+msgid ""
+"Note that, IPv6 specification assumes the following items, and nonconforming "
+"cases are left unspecified:"
+msgstr ""
+"Обратите внимание, что спецификация IPv6 предполагает следующие пункты, а "
+"случаи несоответствия остаются неуточнёнными:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:292
+msgid "Only hosts will listen to router advertisements"
+msgstr "Только хосты будут принимать объявления от маршрутизаторов"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:293
+msgid "Hosts have single network interface (except loopback)"
+msgstr "Узлы имеют один сетевой интерфейс (за исключением loopback)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:296
+msgid ""
+"Therefore, this is unwise to enable net.inet6.ip6.accept_rtadv on routers, "
+"or multi-interface host. A misconfigured node can behave strange "
+"(nonconforming configuration allowed for those who would like to do some "
+"experiments)."
+msgstr ""
+"Поэтому не рекомендуется включать net.inet6.ip6.accept_rtadv на "
+"маршрутизаторах или многопортовых хостах. Неправильно настроенный узел может "
+"вести себя странно (нестандартная конфигурация разрешена для тех, кто хочет "
+"провести эксперименты)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:298
+msgid "To summarize the sysctl knob:"
+msgstr "Резюмируя настройку sysctl:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:312
+#, no-wrap
+msgid ""
+"\taccept_rtadv\tforwarding\trole of the node\n"
+"\t---\t\t---\t\t---\n"
+"\t0\t\t0\t\thost (to be manually configured)\n"
+"\t0\t\t1\t\trouter\n"
+"\t1\t\t0\t\tautoconfigured host\n"
+"\t\t\t\t\t(spec assumes that host has single\n"
+"\t\t\t\t\tinterface only, autoconfigured host\n"
+"\t\t\t\t\twith multiple interface is\n"
+"\t\t\t\t\tout-of-scope)\n"
+"\t1\t\t1\t\tinvalid, or experimental\n"
+"\t\t\t\t\t(out-of-scope of spec)\n"
+msgstr ""
+"\taccept_rtadv\tforwarding\trole of the node\n"
+"\t---\t\t---\t\t---\n"
+"\t0\t\t0\t\thost (to be manually configured)\n"
+"\t0\t\t1\t\trouter\n"
+"\t1\t\t0\t\tautoconfigured host\n"
+"\t\t\t\t\t(spec assumes that host has single\n"
+"\t\t\t\t\tinterface only, autoconfigured host\n"
+"\t\t\t\t\twith multiple interface is\n"
+"\t\t\t\t\tout-of-scope)\n"
+"\t1\t\t1\t\tinvalid, or experimental\n"
+"\t\t\t\t\t(out-of-scope of spec)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:317
+msgid ""
+"RFC2462 has validation rule against incoming RA prefix information option, "
+"in 5.5.3 (e). This is to protect hosts from malicious (or misconfigured) "
+"routers that advertise very short prefix lifetime. There was an update from "
+"Jim Bound to ipngwg mailing list (look for \"(ipng 6712)\" in the archive) "
+"and it is implemented Jim's update."
+msgstr ""
+"В RFC2462 есть правило проверки для входящей информации о префиксе в RA, в "
+"разделе 5.5.3 (e). Это защищает хосты от злонамеренных (или неправильно "
+"настроенных) маршрутизаторов, которые анонсируют очень короткое время жизни "
+"префикса. Было обновление от Джима Баунда в рассылке ipngwg (ищите \"(ipng "
+"6712)\" в архиве), и это обновление Джима реализовано."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:319
+msgid ""
+"See crossref:ipv6[neighbor-discovery,23.5.1.2] in the document for "
+"relationship between DAD and autoconfiguration."
+msgstr ""
+"См. crossref:ipv6[neighbor-discovery,23.5.1.2] в документе для информации о "
+"взаимосвязи между DAD и автонастройкой."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:321
+#, no-wrap
+msgid "Generic Tunnel Interface"
+msgstr "Универсальный Туннельный Интерфейс"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:325
+msgid ""
+"GIF (Generic InterFace) is a pseudo interface for configured tunnel. "
+"Details are described in man:gif[4]. Currently"
+msgstr ""
+"GIF (Generic InterFace) — это псевдоинтерфейс для настроенного туннеля. "
+"Подробности описаны в man:gif[4]. В настоящее время"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:327
+msgid "v6 in v6"
+msgstr "v6 в v6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:328
+msgid "v6 in v4"
+msgstr "v6 в v4"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:329
+msgid "v4 in v6"
+msgstr "v4 в v6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:330
+msgid "v4 in v4"
+msgstr "v4 в v4"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:335
+msgid ""
+"are available. Use man:gifconfig[8] to assign physical (outer) source and "
+"destination address to gif interfaces. Configuration that uses same address "
+"family for inner and outer IP header (v4 in v4, or v6 in v6) is dangerous. "
+"It is very easy to configure interfaces and routing tables to perform "
+"infinite level of tunneling. _Please be warned_."
+msgstr ""
+"доступны. Используйте man:gifconfig[8] для назначения физических (внешних) "
+"исходных и конечных адресов интерфейсам gif. Конфигурация, использующая одно "
+"семейство адресов для внутреннего и внешнего IP-заголовка (v4 в v4 или v6 в "
+"v6), является опасной. Очень легко настроить интерфейсы и таблицы "
+"маршрутизации для выполнения бесконечного уровня туннелирования. "
+"_Пожалуйста, будьте осторожны_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:338
+msgid ""
+"gif can be configured to be ECN-friendly. See crossref:ipv6[ipsec-"
+"ecn,23.5.4.5] for ECN-friendliness of tunnels, and man:gif[4] for how to "
+"configure."
+msgstr ""
+"gif можно настроить так, чтобы он был дружественным к ECN. Подробнее о "
+"дружелюбности к ECN для туннелей см. crossref:ipv6[ipsec-ecn,23.5.4.5], а о "
+"настройке — в man:gif[4]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:341
+msgid ""
+"If you would like to configure an IPv4-in-IPv6 tunnel with gif interface, "
+"read man:gif[4] carefully. You will need to remove IPv6 link-local address "
+"automatically assigned to the gif interface."
+msgstr ""
+"Если вы хотите настроить туннель IPv4-в-IPv6 с интерфейсом gif, внимательно "
+"прочитайте man:gif[4]. Вам потребуется удалить линк-локальный адрес IPv6, "
+"автоматически назначенный интерфейсу gif."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:343
+#, no-wrap
+msgid "Source Address Selection"
+msgstr "Выбор исходящего адреса"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:347
+msgid ""
+"Current source selection rule is scope oriented (there are some exceptions - "
+"see below). For a given destination, a source IPv6 address is selected by "
+"the following rule:"
+msgstr ""
+"Текущее правило выбора источника ориентировано на зону (есть несколько "
+"исключений — см. ниже). Для заданного адреса назначения исходящий IPv6-адрес "
+"выбирается по следующему правилу:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:349
+msgid ""
+"If the source address is explicitly specified by the user (e.g., via the "
+"advanced API), the specified address is used."
+msgstr ""
+"Если исходящий адрес явно указан пользователем (например, через расширенный "
+"API), используется указанный адрес."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:350
+msgid ""
+"If there is an address assigned to the outgoing interface (which is usually "
+"determined by looking up the routing table) that has the same scope as the "
+"destination address, the address is used."
+msgstr ""
+"Если на исходящем интерфейсе назначен адрес (который обычно определяется "
+"путем просмотра таблицы маршрутизации) с той же зоной действия, что и адрес "
+"назначения, используется этот адрес."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:352
+msgid "This is the most typical case."
+msgstr "Это наиболее типичный случай."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:353
+msgid ""
+"If there is no address that satisfies the above condition, choose a global "
+"address assigned to one of the interfaces on the sending node."
+msgstr ""
+"Если нет адреса, удовлетворяющего указанному выше условию, выберите "
+"глобальный адрес, назначенный одному из интерфейсов на отправляющем узле."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:354
+msgid ""
+"If there is no address that satisfies the above condition, and destination "
+"address is site local scope, choose a site local address assigned to one of "
+"the interfaces on the sending node."
+msgstr ""
+"Если нет адреса, удовлетворяющего указанному выше условию, и адрес "
+"назначения имеет сайт-локальную зону, выберите сайт-локальный адрес, "
+"назначенный одному из интерфейсов на отправляющем узле."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:355
+msgid ""
+"If there is no address that satisfies the above condition, choose the "
+"address associated with the routing table entry for the destination. This is "
+"the last resort, which may cause scope violation."
+msgstr ""
+"Если нет адреса, удовлетворяющего указанному условию, выберите адрес, "
+"связанный с записью таблицы маршрутизации для назначения. Это крайняя мера, "
+"которая может нарушить границы зоны действия."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:361
+msgid ""
+"For instance, ::1 is selected for ff01::1, fe80:1::200:f8ff:fe01:6317 for "
+"fe80:1::2a0:24ff:feab:839b (note that embedded interface index - described "
+"in crossref:ipv6[ipv6-scope-index,23.5.1.3] - helps us choose the right "
+"source address. Those embedded indices will not be on the wire). If the "
+"outgoing interface has multiple address for the scope, a source is selected "
+"longest match basis (rule 3). Suppose 2001:0DB8:808:1:200:f8ff:fe01:6317 "
+"and 2001:0DB8:9:124:200:f8ff:fe01:6317 are given to the outgoing interface. "
+"2001:0DB8:808:1:200:f8ff:fe01:6317 is chosen as the source for the "
+"destination 2001:0DB8:800::1."
+msgstr ""
+"Например, ::1 выбирается для ff01::1, fe80:1::200:f8ff:fe01:6317 для "
+"fe80:1::2a0:24ff:feab:839b (обратите внимание, что встроенный индекс "
+"интерфейса — описанный в crossref:ipv6[ipv6-scope-index,23.5.1.3] — помогает "
+"нам выбрать правильный исходный адрес. Эти встроенные индексы не будут "
+"передаваться по сети). Если исходящий интерфейс имеет несколько адресов для "
+"данной зоны, исходный адрес выбирается на основе наибольшего соответствия "
+"(правило 3). Предположим, что 2001:0DB8:808:1:200:f8ff:fe01:6317 и "
+"2001:0DB8:9:124:200:f8ff:fe01:6317 назначены исходящему интерфейсу. "
+"2001:0DB8:808:1:200:f8ff:fe01:6317 выбирается в качестве исходящего адреса "
+"для адреса назначения 2001:0DB8:800::1."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:368
+msgid ""
+"Note that the above rule is not documented in the IPv6 spec. It is "
+"considered \"up to implementation\" item. There are some cases where we do "
+"not use the above rule. One example is connected TCP session, and we use "
+"the address kept in tcb as the source. Another example is source address "
+"for Neighbor Advertisement. Under the spec (RFC2461 7.2.2) NA's source "
+"should be the target address of the corresponding NS's target. In this case "
+"we follow the spec rather than the above longest-match rule."
+msgstr ""
+"Обратите внимание, что приведенное выше правило не документировано в "
+"спецификации IPv6. Оно считается элементом, оставленным \"на усмотрение "
+"реализации\". Существуют случаи, когда мы не используем это правило. Один из "
+"примеров — установленное TCP-соединение, где мы используем адрес, "
+"сохраненный в tcb, в качестве источника. Другой пример — исходящий адрес для "
+"Объявления Соседа (Neighbor Advertisement). Согласно спецификации (RFC2461 "
+"7.2.2) источник NA должен быть целевым адресом соответствующего NS. В этом "
+"случае мы следуем спецификации, а не приведенному выше правилу наибольшего "
+"совпадения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:374
+msgid ""
+"For new connections (when rule 1 does not apply), deprecated addresses "
+"(addresses with preferred lifetime = 0) will not be chosen as source address "
+"if other choices are available. If no other choices are available, "
+"deprecated address will be used as a last resort. If there are multiple "
+"choice of deprecated addresses, the above scope rule will be used to choose "
+"from those deprecated addresses. If you would like to prohibit the use of "
+"deprecated address for some reason, configure net.inet6.ip6.use_deprecated "
+"to 0. The issue related to deprecated address is described in RFC2462 5.5.4 "
+"(NOTE: there is some debate underway in IETF ipngwg on how to use "
+"\"deprecated\" address)."
+msgstr ""
+"Для новых соединений (когда правило 1 не применяется), устаревшие адреса "
+"(адреса с предпочтительным временем жизни = 0) не будут выбираться в "
+"качестве исходящего адреса, если доступны другие варианты. Если других "
+"вариантов нет, устаревший адрес будет использован в качестве последнего "
+"средства. Если есть несколько устаревших адресов, для выбора между ними "
+"будет применено указанное выше правило области видимости. Если вы хотите "
+"запретить использование устаревших адресов по какой-либо причине, установите "
+"параметр net.inet6.ip6.use_deprecated в значение 0. Проблема, связанная с "
+"устаревшими адресами, описана в RFC2462 5.5.4 (ПРИМЕЧАНИЕ: в IETF ipngwg "
+"ведутся дебаты о том, как использовать \"устаревшие\" адреса)."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:376
+#, no-wrap
+msgid "Jumbo Payload"
+msgstr "Джамбо-пакет (Jumbo Payload)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:380
+msgid ""
+"The Jumbo Payload hop-by-hop option is implemented and can be used to send "
+"IPv6 packets with payloads longer than 65,535 octets. But currently no "
+"physical interface whose MTU is more than 65,535 is supported, so such "
+"payloads can be seen only on the loopback interface (i.e., lo0)."
+msgstr ""
+"Опция джамбо-пакет типа \"от прыжка к прыжку\" реализована и может "
+"использоваться для отправки IPv6-пакетов с полезной нагрузкой длиной более "
+"65 535 октетов. Однако в настоящее время не поддерживаются физические "
+"интерфейсы с MTU более 65 535, поэтому такие нагрузки могут быть только на "
+"интерфейсе loopback (т.е. lo0)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:382
+msgid ""
+"If you want to try jumbo payloads, you first have to reconfigure the kernel "
+"so that the MTU of the loopback interface is more than 65,535 bytes; add the "
+"following to the kernel configuration file:"
+msgstr ""
+"Если вы хотите попробовать джамбо-пакеты, сначала необходимо "
+"переконфигурировать ядро, чтобы MTU интерфейса loopback превышал 65 535 "
+"байт; добавьте следующее в конфигурационный файл ядра:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:384
+msgid "`options \"LARGE_LOMTU\" #To test jumbo payload`"
+msgstr "`options \"LARGE_LOMTU\" #To test jumbo payload`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:386
+msgid "and recompile the new kernel."
+msgstr "и пересоберите новое ядро."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:390
+msgid ""
+"Then you can test jumbo payloads by the man:ping[8] command with -6, -b and "
+"-s options. The -b option must be specified to enlarge the size of the "
+"socket buffer and the -s option specifies the length of the packet, which "
+"should be more than 65,535. For example, type as follows:"
+msgstr ""
+"Затем вы можете проверить работу с большими пакетами с помощью команды "
+"man:ping[8] с опциями -6, -b и -s. Опция -b необходима для увеличения "
+"размера буфера сокета, а опция -s задает длину пакета, которая должна быть "
+"больше 65 535. Например, введите следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:394
+#, no-wrap
+msgid "% ping -6 -b 70000 -s 68000 ::1\n"
+msgstr "% ping -6 -b 70000 -s 68000 ::1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:399
+msgid ""
+"The IPv6 specification requires that the Jumbo Payload option must not be "
+"used in a packet that carries a fragment header. If this condition is "
+"broken, an ICMPv6 Parameter Problem message must be sent to the sender. "
+"specification is followed, but you cannot usually see an ICMPv6 error caused "
+"by this requirement."
+msgstr ""
+"Спецификация IPv6 требует, чтобы опция Джамбо-пакет не использовалась в "
+"пакете, содержащем заголовок фрагмента. Если это условие нарушено, должно "
+"быть отправлено ICMPv6 сообщение Parameter Problem отправителю. Спецификация "
+"соблюдается, но обычно вы не можете увидеть ICMPv6 ошибку, вызванную этим "
+"требованием."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:403
+msgid ""
+"When an IPv6 packet is received, the frame length is checked and compared to "
+"the length specified in the payload length field of the IPv6 header or in "
+"the value of the Jumbo Payload option, if any. If the former is shorter "
+"than the latter, the packet is discarded and statistics are incremented. "
+"You can see the statistics as output of man:netstat[8] command with `-s -p "
+"ip6' option:"
+msgstr ""
+"При получении IPv6-пакета проверяется длина кадра и сравнивается с длиной, "
+"указанной в поле длины полезной нагрузки заголовка IPv6 или в значении опции "
+"Джамбо-пакета, если она присутствует. Если первое значение меньше второго, "
+"пакет отбрасывается, и статистика увеличивается. Статистику можно увидеть в "
+"выводе команды man:netstat[8] с опцией `-s -p ip6`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:410
+#, no-wrap
+msgid ""
+"% netstat -s -p ip6\n"
+"\t ip6:\n"
+"\t\t(snip)\n"
+"\t\t1 with data size < data length\n"
+msgstr ""
+"% netstat -s -p ip6\n"
+"\t ip6:\n"
+"\t\t(snip)\n"
+"\t\t1 with data size < data length\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:414
+msgid ""
+"So, kernel does not send an ICMPv6 error unless the erroneous packet is an "
+"actual Jumbo Payload, that is, its packet size is more than 65,535 bytes. "
+"As described above, currently no physical interface with such a huge MTU is "
+"supported, so it rarely returns an ICMPv6 error."
+msgstr ""
+"Итак, ядро не отправляет ICMPv6 ошибку, если ошибочный пакет не является "
+"фактически Джамбо-пакетом, то есть его размер пакета превышает 65 535 байт. "
+"Как описано выше, в настоящее время не поддерживаются физические интерфейсы "
+"с таким огромным MTU, поэтому ICMPv6 ошибка возвращается редко."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:417
+msgid ""
+"TCP/UDP over jumbogram is not supported at this moment. This is because we "
+"have no medium (other than loopback) to test this. Contact us if you need "
+"this."
+msgstr ""
+"В настоящее время поддержка TCP/UDP через jumbogram не реализована. Это "
+"связано с отсутствием среды (кроме loopback) для тестирования данной "
+"функциональности. Свяжитесь с нами, если вам это необходимо."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:420
+msgid ""
+"IPsec does not work on jumbograms. This is due to some specification twists "
+"in supporting AH with jumbograms (AH header size influences payload length, "
+"and this makes it real hard to authenticate inbound packet with jumbo "
+"payload option as well as AH)."
+msgstr ""
+"IPsec не работает с jumbogram. Это связано с особенностями спецификации, "
+"касающимися поддержки AH для джамбограмм (размер заголовка AH влияет на "
+"длину полезной нагрузки, что делает крайне сложной аутентификацию входящего "
+"пакета с опцией Джамбо-пакет, а также AH)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:424
+msgid ""
+"There are fundamental issues in *BSD support for jumbograms. We would like "
+"to address those, but we need more time to finalize these. To name a few:"
+msgstr ""
+"Существуют фундаментальные проблемы в поддержке *BSD для jumbogram. Мы "
+"хотели бы решить их, но нам нужно больше времени для завершения работы. Вот "
+"некоторые из них:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:428
+msgid ""
+"mbuf pkthdr.len field is typed as \"int\" in 4.4BSD, so it will not hold "
+"jumbogram with len > 2G on 32bit architecture CPUs. If we would like to "
+"support jumbogram properly, the field must be expanded to hold 4G + IPv6 "
+"header + link-layer header. Therefore, it must be expanded to at least "
+"int64_t (u_int32_t is NOT enough)."
+msgstr ""
+"Поле `mbuf pkthdr.len` имеет тип `int` в 4.4BSD, поэтому оно не сможет "
+"содержать джамбограмму с длиной > 2G на 32-битных архитектурах CPU. Если мы "
+"хотим правильно поддерживать джамбограммы, это поле необходимо расширить, "
+"чтобы оно могло содержать 4G + заголовок IPv6 + заголовок канального уровня. "
+"Следовательно, его необходимо расширить как минимум до `int64_t` "
+"(`u_int32_t` НЕ достаточно)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:430
+msgid ""
+"We mistakingly use \"int\" to hold packet length in many places. We need to "
+"convert them into larger integral type. It needs a great care, as we may "
+"experience overflow during packet length computation."
+msgstr ""
+"Мы ошибочно используем \"int\" для хранения длины пакета во многих местах. "
+"Нам необходимо преобразовать их в более крупный целочисленный тип. Это "
+"требует большой осторожности, так как мы можем столкнуться с переполнением "
+"во время вычисления длины пакета."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:431
+msgid ""
+"We mistakingly check for ip6_plen field of IPv6 header for packet payload "
+"length in various places. We should be checking mbuf pkthdr.len instead. "
+"ip6_input() will perform sanity check on jumbo payload option on input, and "
+"we can safely use mbuf pkthdr.len afterwards."
+msgstr ""
+"Мы ошибочно проверяем поле ip6_plen заголовка IPv6 для определения длины "
+"полезной нагрузки пакета в различных местах. Вместо этого следует проверять "
+"mbuf pkthdr.len. Функция ip6_input() выполняет проверку корректности опции "
+"Джамбо-пакет при вводе, и после этого можно безопасно использовать mbuf "
+"pkthdr.len."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:432
+msgid "TCP code needs a careful update in bunch of places, of course."
+msgstr "Код TCP требует тщательного обновления в ряде мест, разумеется."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:433
+#, no-wrap
+msgid "Loop Prevention in Header Processing"
+msgstr "Предотвращение петель при обработке заголовков"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:444
+msgid ""
+"IPv6 specification allows arbitrary number of extension headers to be placed "
+"onto packets. If we implement IPv6 packet processing code in the way BSD "
+"IPv4 code is implemented, kernel stack may overflow due to long function "
+"call chain. sys/netinet6 code is carefully designed to avoid kernel stack "
+"overflow, so sys/netinet6 code defines its own protocol switch structure, as "
+"\"struct ip6protosw\" (see [.filename]#netinet6/ip6protosw.h#). There is no "
+"such update to IPv4 part (sys/netinet) for compatibility, but small change "
+"is added to its pr_input() prototype. So \"struct ipprotosw\" is also "
+"defined. As a result, if you receive IPsec-over-IPv4 packet with massive "
+"number of IPsec headers, kernel stack may blow up. IPsec-over-IPv6 is "
+"okay. (Of-course, for those all IPsec headers to be processed, each such "
+"IPsec header must pass each IPsec check. So an anonymous attacker will not "
+"be able to do such an attack.)"
+msgstr ""
+"Спецификация IPv6 допускает размещение произвольного количества расширений в "
+"заголовках пакетов. Если реализовать код обработки пакетов IPv6 так, как "
+"реализован код IPv4 в BSD, может произойти переполнение стека ядра из-за "
+"длинной цепочки вызовов функций. Код в sys/netinet6 тщательно спроектирован, "
+"чтобы избежать переполнения стека ядра, поэтому он определяет собственную "
+"структуру переключения протоколов — \"struct ip6protosw\" (см. "
+"[.filename]#netinet6/ip6protosw.h#). Для IPv4 части (sys/netinet) подобных "
+"обновлений не было сделано для сохранения совместимости, но в прототип "
+"pr_input() внесено небольшое изменение. Поэтому также определена \"struct "
+"ipprotosw\". В результате, если получен пакет IPsec-over-IPv4 с большим "
+"количеством заголовков IPsec, стек ядра может переполниться. С IPsec-over-"
+"IPv6 такой проблемы нет. (Разумеется, чтобы все эти заголовки IPsec были "
+"обработаны, каждый такой заголовок должен пройти все проверки IPsec. Поэтому "
+"анонимный злоумышленник не сможет осуществить подобную атаку.)"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:446
+#, no-wrap
+msgid "ICMPv6"
+msgstr "ICMPv6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:450
+msgid ""
+"After RFC2463 was published, IETF ipngwg has decided to disallow ICMPv6 "
+"error packet against ICMPv6 redirect, to prevent ICMPv6 storm on a network "
+"medium. This is already implemented into the kernel."
+msgstr ""
+"После публикации RFC2463 IETF ipngwg решил запретить ICMPv6 пакеты ошибок "
+"для ICMPv6 перенаправлений, чтобы предотвратить ICMPv6 шторм в сетевой "
+"среде. Это уже реализовано в ядре."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:451
+#, no-wrap
+msgid "Applications"
+msgstr "Приложения (Applications)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:454
+msgid ""
+"For userland programming, we support IPv6 socket API as specified in "
+"RFC2553, RFC2292 and upcoming Internet drafts."
+msgstr ""
+"Для программирования в пользовательском пространстве мы поддерживаем API "
+"сокетов IPv6, как указано в RFC2553, RFC2292 и готовящихся интернет-"
+"черновиках."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:459
+msgid ""
+"TCP/UDP over IPv6 is available and quite stable. You can enjoy "
+"man:telnet[1], man:ftp[1], man:rlogin[1], man:rsh[1], man:ssh[1], etc. "
+"These applications are protocol independent. That is, they automatically "
+"chooses IPv4 or IPv6 according to DNS."
+msgstr ""
+"TCP/UDP поверх IPv6 доступны и достаточно стабильны. Вы можете использовать "
+"man:telnet[1], man:ftp[1], man:rlogin[1], man:rsh[1], man:ssh[1] и т.д. Эти "
+"приложения не зависят от протокола. То есть они автоматически выбирают IPv4 "
+"или IPv6 в соответствии с DNS."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:460
+#, no-wrap
+msgid "Kernel Internals"
+msgstr "Внутреннее устройство ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:463
+msgid ""
+"While ip_forward() calls ip_output(), ip6_forward() directly calls "
+"if_output() since routers must not divide IPv6 packets into fragments."
+msgstr ""
+"В то время как ip_forward() вызывает ip_output(), ip6_forward() напрямую "
+"вызывает if_output(), поскольку маршрутизаторы не должны разделять пакеты "
+"IPv6 на фрагменты."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:467
+msgid ""
+"ICMPv6 should contain the original packet as long as possible up to 1280. "
+"UDP6/IP6 port unreach, for instance, should contain all extension headers "
+"and the *unchanged* UDP6 and IP6 headers. So, all IP6 functions except TCP "
+"never convert network byte order into host byte order, to save the original "
+"packet."
+msgstr ""
+"ICMPv6 должен содержать исходный пакет по возможности вплоть до 1280 байт. "
+"Например, сообщение \"Ошибка недоступности порта UDP6/IP6\" должно содержать "
+"все расширенные заголовки и *неизменённые* заголовки UDP6 и IP6. Таким "
+"образом, все функции IP6, кроме TCP, никогда не преобразуют порядок байтов "
+"сети в порядок байтов хоста, чтобы сохранить исходный пакет."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:471
+msgid ""
+"tcp_input(), udp6_input() and icmp6_input() can not assume that IP6 header "
+"is preceding the transport headers due to extension headers. So, "
+"in6_cksum() was implemented to handle packets whose IP6 header and transport "
+"header is not continuous. TCP/IP6 nor UDP6/IP6 header structures do not "
+"exist for checksum calculation."
+msgstr ""
+"Функции tcp_input(), udp6_input() и icmp6_input() не могут предполагать, что "
+"заголовок IP6 предшествует транспортным заголовкам из-за наличия расширенных "
+"заголовков. Поэтому была реализована in6_cksum() для обработки пакетов, у "
+"которых заголовок IP6 и транспортный заголовок не являются непрерывными. Но "
+"ни для TCP/IP6, ни для UDP6/IP6 в заголовке нет структуры для расчёта "
+"контрольной суммы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:474
+msgid ""
+"To process IP6 header, extension headers and transport headers easily, "
+"network drivers are now required to store packets in one internal mbuf or "
+"one or more external mbufs. A typical old driver prepares two internal "
+"mbufs for 96 - 204 bytes data, however, now such packet data is stored in "
+"one external mbuf."
+msgstr ""
+"Для удобной обработки заголовка IP6, дополнительных заголовков и "
+"транспортных заголовков, от сетевых драйверов теперь требуется хранить "
+"пакеты в одном внутреннем mbuf или одном или нескольких внешних mbuf. "
+"Типичный старый драйвер подготавливает два внутренних mbuf для данных "
+"размером 96–204 байт, однако теперь такие данные пакета хранятся в одном "
+"внешнем mbuf."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:478
+msgid ""
+"`netstat -s -p ip6` tells you whether or not your driver conforms such "
+"requirement. In the following example, \"cce0\" violates the requirement. "
+"(For more information, refer to Section 2.)"
+msgstr ""
+"`netstat -s -p ip6` показывает, соответствует ли ваш драйвер этому "
+"требованию. В следующем примере \"cce0\" нарушает это требование. (Для "
+"получения дополнительной информации обратитесь к разделу 2.)"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:488
+#, no-wrap
+msgid ""
+"Mbuf statistics:\n"
+" 317 one mbuf\n"
+" two or more mbuf::\n"
+" lo0 = 8\n"
+"\t\t\tcce0 = 10\n"
+" 3282 one ext mbuf\n"
+" 0 two or more ext mbuf\n"
+msgstr ""
+"Mbuf statistics:\n"
+" 317 one mbuf\n"
+" two or more mbuf::\n"
+" lo0 = 8\n"
+"\t\t\tcce0 = 10\n"
+" 3282 one ext mbuf\n"
+" 0 two or more ext mbuf\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:493
+msgid ""
+"Each input function calls IP6_EXTHDR_CHECK in the beginning to check if the "
+"region between IP6 and its header is continuous. IP6_EXTHDR_CHECK calls "
+"m_pullup() only if the mbuf has M_LOOP flag, that is, the packet comes from "
+"the loopback interface. m_pullup() is never called for packets coming from "
+"physical network interfaces."
+msgstr ""
+"Каждая входная функция вызывает IP6_EXTHDR_CHECK в начале, чтобы проверить, "
+"является ли область между IP6 и его заголовком непрерывной. IP6_EXTHDR_CHECK "
+"вызывает m_pullup() только если mbuf имеет флаг M_LOOP, то есть пакет пришел "
+"с интерфейса loopback. m_pullup() никогда не вызывается для пакетов, "
+"приходящих с физических сетевых интерфейсов."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:495
+msgid "Both IP and IP6 reassemble functions never call m_pullup()."
+msgstr ""
+"Как функции повторной сборки IP, так и IP6 никогда не вызывают m_pullup()."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:497
+#, no-wrap
+msgid "IPv4 Mapped Address and IPv6 Wildcard Socket"
+msgstr "IPv4-отображённые адреса и IPv6-сокет с подстановочным адресом"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:501
+msgid ""
+"RFC2553 describes IPv4 mapped address (3.7) and special behavior of IPv6 "
+"wildcard bind socket (3.8). The spec allows you to:"
+msgstr ""
+"RFC2553 описывает IPv4 отображённые адреса (3.7) и особое поведение IPv6 "
+"сокета с привязкой к любому адресу (3.8). Спецификация позволяет вам:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:503
+msgid "Accept IPv4 connections by AF_INET6 wildcard bind socket."
+msgstr ""
+"Принимать IPv4-подключения через сокет с привязкой к подстановочному адресу "
+"AF_INET6."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:504
+msgid ""
+"Transmit IPv4 packet over AF_INET6 socket by using special form of the "
+"address like ::ffff:10.1.1.1."
+msgstr ""
+"Передача IPv4-пакета через сокет AF_INET6 с использованием специальной формы "
+"адреса, например ::ffff:10.1.1.1."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:507
+msgid ""
+"but the spec itself is very complicated and does not specify how the socket "
+"layer should behave. Here we call the former one \"listening side\" and the "
+"latter one \"initiating side\", for reference purposes."
+msgstr ""
+"но сама спецификация очень сложна и не определяет, как должен вести себя "
+"сокетный уровень. Здесь мы называем первую сторону «слушающей», а вторую — "
+"«инициирующей» для удобства ссылок."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:509
+msgid ""
+"You can perform wildcard bind on both of the address families, on the same "
+"port."
+msgstr ""
+"Вы можете выполнить привязку к подстановочному адресу для обоих семейств "
+"адресов на одном и том же порту."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:511
+msgid "The following table show the behavior of FreeBSD 4.x."
+msgstr "Следующая таблица показывает поведение FreeBSD 4.x."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:520
+#, no-wrap
+msgid ""
+"listening side initiating side\n"
+" (AF_INET6 wildcard (connection to ::ffff:10.1.1.1)\n"
+" socket gets IPv4 conn.)\n"
+" --- ---\n"
+"FreeBSD 4.x configurable supported\n"
+" default: enabled\n"
+msgstr ""
+"listening side initiating side\n"
+" (AF_INET6 wildcard (connection to ::ffff:10.1.1.1)\n"
+" socket gets IPv4 conn.)\n"
+" --- ---\n"
+"FreeBSD 4.x configurable supported\n"
+" default: enabled\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:523
+msgid ""
+"The following sections will give you more details, and how you can configure "
+"the behavior."
+msgstr ""
+"Следующие разделы предоставят вам более подробную информацию и объяснят, как "
+"можно настроить поведение."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:525
+msgid "Comments on listening side:"
+msgstr "Комментарии о принимающей стороне:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:532
+msgid ""
+"It looks that RFC2553 talks too little on wildcard bind issue, especially on "
+"the port space issue, failure mode and relationship between AF_INET/INET6 "
+"wildcard bind. There can be several separate interpretation for this RFC "
+"which conform to it but behaves differently. So, to implement portable "
+"application you should assume nothing about the behavior in the kernel. "
+"Using man:getaddrinfo[3] is the safest way. Port number space and wildcard "
+"bind issues were discussed in detail on ipv6imp mailing list, in mid March "
+"1999 and it looks that there is no concrete consensus (means, up to "
+"implementers). You may want to check the mailing list archives."
+msgstr ""
+"Похоже, что в RFC2553 слишком мало сказано о проблеме привязки к "
+"подстановочному адресу, особенно о вопросе пространства портов, режиме "
+"отказа и взаимосвязи между AF_INET/INET6 wildcard bind. Может быть "
+"несколько различных интерпретаций этого RFC, которые соответствуют ему, но "
+"ведут себя по-разному. Поэтому для создания переносимых приложений не "
+"следует делать никаких предположений о поведении в ядре. Использование "
+"man:getaddrinfo[3] является наиболее безопасным способом. Вопросы "
+"пространства номеров портов и привязки к подстановочному адресу подробно "
+"обсуждались в рассылке ipv6imp в середине марта 1999 года, и похоже, что "
+"конкретного консенсуса нет (то есть, остается на усмотрение реализаторов). "
+"Возможно, вам стоит проверить архивы рассылки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:534
+msgid ""
+"If a server application would like to accept IPv4 and IPv6 connections, "
+"there will be two alternatives."
+msgstr ""
+"Если серверное приложение хочет принимать IPv4 и IPv6 соединения, есть два "
+"варианта."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:539
+msgid ""
+"One is using AF_INET and AF_INET6 socket (you will need two sockets). Use "
+"man:getaddrinfo[3] with AI_PASSIVE into ai_flags, and man:socket[2] and "
+"man:bind[2] to all the addresses returned. By opening multiple sockets, you "
+"can accept connections onto the socket with proper address family. IPv4 "
+"connections will be accepted by AF_INET socket, and IPv6 connections will be "
+"accepted by AF_INET6 socket."
+msgstr ""
+"Один из способов — использование сокетов AF_INET и AF_INET6 (вам понадобятся "
+"два сокета). Используйте man:getaddrinfo[3] с AI_PASSIVE в ai_flags, а также "
+"man:socket[2] и man:bind[2] для всех возвращённых адресов. Открыв несколько "
+"сокетов, вы можете принимать соединения сокетом соответствующей адресной "
+"семьи. IPv4-соединения будут приниматься сокетом AF_INET, а IPv6-соединения "
+"— сокетом AF_INET6."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:545
+msgid ""
+"Another way is using one AF_INET6 wildcard bind socket. Use "
+"man:getaddrinfo[3] with AI_PASSIVE into ai_flags and with AF_INET6 into "
+"ai_family, and set the 1st argument hostname to NULL. And man:socket[2] and "
+"man:bind[2] to the address returned. (should be IPv6 unspecified addr). "
+"You can accept either of IPv4 and IPv6 packet via this one socket."
+msgstr ""
+"Еще один способ — использование одного сокета с универсальной привязкой "
+"AF_INET6. Используйте man:getaddrinfo[3] с AI_PASSIVE в ai_flags и AF_INET6 "
+"в ai_family, установив первый аргумент hostname в NULL. Затем используйте "
+"man:socket[2] и man:bind[2] для адреса, который был возвращен. (должен быть "
+"неспецифицированный адрес IPv6). Через этот один сокет можно принимать "
+"пакеты как IPv4, так и IPv6."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:549
+msgid ""
+"To support only IPv6 traffic on AF_INET6 wildcard binded socket portably, "
+"always check the peer address when a connection is made toward AF_INET6 "
+"listening socket. If the address is IPv4 mapped address, you may want to "
+"reject the connection. You can check the condition by using "
+"IN6_IS_ADDR_V4MAPPED() macro."
+msgstr ""
+"Для поддержки только IPv6-трафика на AF_INET6-сокете с привязкой к любому "
+"адресу переносимым способом всегда проверяйте адрес узла при установке "
+"соединения с AF_INET6-сокетом в режиме прослушивания. Если адрес является "
+"IPv4-отображённым, возможно, стоит отклонить соединение. Это условие можно "
+"проверить с помощью макроса IN6_IS_ADDR_V4MAPPED()."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:551
+msgid ""
+"To resolve this issue more easily, there is system dependent "
+"man:setsockopt[2] option, IPV6_BINDV6ONLY, used like below."
+msgstr ""
+"Для более простого решения этой задачи существует зависящий от системы "
+"параметр man:setsockopt[2] под названием IPV6_BINDV6ONLY, используемый "
+"следующим образом."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:555
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:602
+#, no-wrap
+msgid "\tint on;\n"
+msgstr "\tint on;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:558
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:605
+#, no-wrap
+msgid ""
+"\tsetsockopt(s, IPPROTO_IPV6, IPV6_BINDV6ONLY,\n"
+"\t\t (char *)&on, sizeof (on)) < 0));\n"
+msgstr ""
+"\tsetsockopt(s, IPPROTO_IPV6, IPV6_BINDV6ONLY,\n"
+"\t\t (char *)&on, sizeof (on)) < 0));\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:561
+msgid "When this call succeed, then this socket only receive IPv6 packets."
+msgstr "При успешном вызове этот сокет будет принимать только IPv6-пакеты."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:563
+msgid "Comments on initiating side:"
+msgstr "Комментарии о стороне инициатора:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:565
+msgid ""
+"Advise to application implementers: to implement a portable IPv6 application "
+"(which works on multiple IPv6 kernels), we believe that the following is the "
+"key to the success:"
+msgstr ""
+"Совет разработчикам приложений: для создания переносимого IPv6-приложения "
+"(которое работает на различных IPv6-ядрах), мы считаем, что следующие "
+"моменты являются ключом к успеху:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:567
+msgid "NEVER hardcode AF_INET nor AF_INET6."
+msgstr "НИКОГДА не используйте жёстко заданные AF_INET или AF_INET6."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:568
+msgid ""
+"Use man:getaddrinfo[3] and man:getnameinfo[3] throughout the system. Never "
+"use gethostby*(), getaddrby*(), inet_*() or getipnodeby*(). (To update "
+"existing applications to be IPv6 aware easily, sometime getipnodeby*() will "
+"be useful. But if possible, try to rewrite the code to use "
+"man:getaddrinfo[3] and man:getnameinfo[3].)"
+msgstr ""
+"Используйте man:getaddrinfo[3] и man:getnameinfo[3] во всей системе. Никогда "
+"не используйте gethostby*(), getaddrby*(), inet_*() или getipnodeby*(). (Для "
+"облегчения обновления существующих приложений для поддержки IPv6 иногда "
+"может быть полезен getipnodeby*(). Но по возможности старайтесь переписать "
+"код для использования man:getaddrinfo[3] и man:getnameinfo[3].)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:569
+msgid ""
+"If you would like to connect to destination, use man:getaddrinfo[3] and try "
+"all the destination returned, like man:telnet[1] does."
+msgstr ""
+"Если вы хотите подключиться к назначению, используйте man:getaddrinfo[3] и "
+"попробуйте все возвращённые назначения, как это делает man:telnet[1]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:570
+msgid ""
+"Some of the IPv6 stack is shipped with buggy man:getaddrinfo[3]. Ship a "
+"minimal working version with your application and use that as last resort."
+msgstr ""
+"Некоторые реализации стека IPv6 поставляются с некорректной "
+"man:getaddrinfo[3]. Включите минимально рабочую версию в ваше приложение и "
+"используйте её в крайнем случае."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:576
+msgid ""
+"If you would like to use AF_INET6 socket for both IPv4 and IPv6 outgoing "
+"connection, you will need to use man:getipnodebyname[3]. When you would "
+"like to update your existing application to be IPv6 aware with minimal "
+"effort, this approach might be chosen. But please note that it is a "
+"temporal solution, because man:getipnodebyname[3] itself is not recommended "
+"as it does not handle scoped IPv6 addresses at all. For IPv6 name "
+"resolution, man:getaddrinfo[3] is the preferred API. So you should rewrite "
+"your application to use man:getaddrinfo[3], when you get the time to do it."
+msgstr ""
+"Если вы хотите использовать сокет AF_INET6 для исходящих подключений как "
+"IPv4, так и IPv6, вам потребуется использовать man:getipnodebyname[3]. Если "
+"вы хотите обновить существующее приложение для поддержки IPv6 с минимальными "
+"усилиями, можно выбрать этот подход. Однако учтите, что это временное "
+"решение, поскольку man:getipnodebyname[3] сам по себе не рекомендуется, так "
+"как он вообще не обрабатывает IPv6-адреса с зоной. Для разрешения IPv6-имён "
+"предпочтительным API является man:getaddrinfo[3]. Поэтому вам следует "
+"переписать ваше приложение для использования man:getaddrinfo[3], когда у вас "
+"будет время это сделать."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:580
+msgid ""
+"When writing applications that make outgoing connections, story goes much "
+"simpler if you treat AF_INET and AF_INET6 as totally separate address "
+"family. {set,get}sockopt issue goes simpler, DNS issue will be made "
+"simpler. We do not recommend you to rely upon IPv4 mapped address."
+msgstr ""
+"При написании приложений, которые устанавливают исходящие соединения, "
+"история становится намного проще, если рассматривать AF_INET и AF_INET6 как "
+"совершенно отдельные семейства адресов. Проблемы с {set,get}sockopt "
+"упрощаются, проблемы с DNS также станут проще. Мы не рекомендуем полагаться "
+"на IPv4-отображённые адреса."
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:581
+#, no-wrap
+msgid "unified tcp and inpcb code"
+msgstr "унифицированный код tcp и inpcb"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:585
+msgid ""
+"FreeBSD 4.x uses shared tcp code between IPv4 and IPv6 (from sys/netinet/"
+"tcp*) and separate udp4/6 code. It uses unified inpcb structure."
+msgstr ""
+"FreeBSD 4.x использует общий код tcp для IPv4 и IPv6 (из sys/netinet/tcp*) и "
+"раздельный код udp4/6. В нем используется унифицированная структура inpcb."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:588
+msgid ""
+"The platform can be configured to support IPv4 mapped address. Kernel "
+"configuration is summarized as follows:"
+msgstr ""
+"Платформа может быть настроена для поддержки IPv4-отображённых адресов. "
+"Конфигурация ядра кратко описана ниже:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:590
+msgid ""
+"By default, AF_INET6 socket will grab IPv4 connections in certain condition, "
+"and can initiate connection to IPv4 destination embedded in IPv4 mapped IPv6 "
+"address."
+msgstr ""
+"По умолчанию сокет AF_INET6 может принимать IPv4-соединения при определённых "
+"условиях и инициировать соединение с IPv4-адресами, встроенными в IPv4-"
+"отображённые IPv6-адреса."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:591
+msgid "You can disable it on entire system with sysctl like below."
+msgstr ""
+"Вы можете отключить это во всей системе с помощью sysctl, как показано ниже."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:593
+msgid "`sysctl net.inet6.ip6.mapped_addr=0`"
+msgstr "`sysctl net.inet6.ip6.mapped_addr=0`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:595
+msgid "====== Listening Side"
+msgstr "====== Сторона, принимающая соединения"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:598
+msgid ""
+"Each socket can be configured to support special AF_INET6 wildcard bind "
+"(enabled by default). You can disable it on each socket basis with "
+"man:setsockopt[2] like below."
+msgstr ""
+"Каждый сокет может быть настроен для поддержки специальной привязки к "
+"подстановочному адресу AF_INET6 (включено по умолчанию). Это можно отключить "
+"для каждого отдельного сокета с помощью man:setsockopt[2], как показано ниже."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:608
+msgid ""
+"Wildcard AF_INET6 socket grabs IPv4 connection if and only if the following "
+"conditions are satisfied:"
+msgstr ""
+"Сокет с универсальной привязкой AF_INET6 перехватывает IPv4-подключение "
+"тогда и только тогда, когда выполнены следующие условия:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:610
+msgid "there is no AF_INET socket that matches the IPv4 connection"
+msgstr "нет AF_INET сокета, соответствующего IPv4-подключению"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:611
+msgid ""
+"the AF_INET6 socket is configured to accept IPv4 traffic, i.e., "
+"getsockopt(IPV6_BINDV6ONLY) returns 0."
+msgstr ""
+"Сокет AF_INET6 настроен на прием IPv4-трафика, т.е., "
+"getsockopt(IPV6_BINDV6ONLY) возвращает 0."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:613
+msgid "There is no problem with open/close ordering."
+msgstr "Нет проблем с порядком открытия/закрытия."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:615
+msgid "====== Initiating Side"
+msgstr "====== Инициирующая сторона"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:617
+msgid ""
+"FreeBSD 4.x supports outgoing connection to IPv4 mapped address "
+"(::ffff:10.1.1.1), if the node is configured to support IPv4 mapped address."
+msgstr ""
+"FreeBSD 4.x поддерживает исходящее соединение с IPv4-отображённым адресом "
+"(::ffff:10.1.1.1), если узел настроен на поддержку IPv4-отображённых адресов."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:618
+#, no-wrap
+msgid "sockaddr_storage"
+msgstr "sockaddr_storage"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:624
+msgid ""
+"When RFC2553 was about to be finalized, there was discussion on how struct "
+"sockaddr_storage members are named. One proposal is to prepend \"__\" to "
+"the members (like \"__ss_len\") as they should not be touched. The other "
+"proposal was not to prepend it (like \"ss_len\") as we need to touch those "
+"members directly. There was no clear consensus on it."
+msgstr ""
+"Когда RFC2553 был близок к завершению, велись дискуссии о том, как называть "
+"элементы структуры `sockaddr_storage`. Одно предложение заключалось в "
+"добавлении \"__\" перед именами элементов (например, \"__ss_len\"), так как "
+"к ним не следует обращаться напрямую. Другое предложение было не добавлять "
+"префикс (например, \"ss_len\"), поскольку необходимо прямое обращение к этим "
+"элементам. Четкого консенсуса по этому вопросу достигнуто не было."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:626
+msgid "As a result, RFC2553 defines struct sockaddr_storage as follows:"
+msgstr ""
+"В результате, RFC2553 определяет структуру sockaddr_storage следующим "
+"образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:634
+#, no-wrap
+msgid ""
+"\tstruct sockaddr_storage {\n"
+"\t\tu_char\t__ss_len;\t/* address length */\n"
+"\t\tu_char\t__ss_family;\t/* address family */\n"
+"\t\t/* and bunch of padding */\n"
+"\t};\n"
+msgstr ""
+"\tstruct sockaddr_storage {\n"
+"\t\tu_char\t__ss_len;\t/* address length */\n"
+"\t\tu_char\t__ss_family;\t/* address family */\n"
+"\t\t/* and bunch of padding */\n"
+"\t};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:637
+msgid "On the contrary, XNET draft defines as follows:"
+msgstr "Напротив, черновик XNET определяет следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:645
+#, no-wrap
+msgid ""
+"\tstruct sockaddr_storage {\n"
+"\t\tu_char\tss_len;\t\t/* address length */\n"
+"\t\tu_char\tss_family;\t/* address family */\n"
+"\t\t/* and bunch of padding */\n"
+"\t};\n"
+msgstr ""
+"\tstruct sockaddr_storage {\n"
+"\t\tu_char\tss_len;\t\t/* address length */\n"
+"\t\tu_char\tss_family;\t/* address family */\n"
+"\t\t/* and bunch of padding */\n"
+"\t};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:648
+msgid ""
+"In December 1999, it was agreed that RFC2553bis should pick the latter "
+"(XNET) definition."
+msgstr ""
+"В декабре 1999 года было согласовано, что RFC2553bis должен принять "
+"последнее (XNET) определение."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:650
+msgid ""
+"Current implementation conforms to XNET definition, based on RFC2553bis "
+"discussion."
+msgstr ""
+"Текущая реализация соответствует определению XNET, основанному на обсуждении "
+"RFC2553bis."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:653
+msgid ""
+"If you look at multiple IPv6 implementations, you will be able to see both "
+"definitions. As an userland programmer, the most portable way of dealing "
+"with it is to:"
+msgstr ""
+"Если вы рассмотрите несколько реализаций IPv6, то сможете увидеть оба "
+"определения. Для программиста в пользовательском пространстве наиболее "
+"переносимый способ работы с этим:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:655
+msgid ""
+"ensure ss_family and/or ss_len are available on the platform, by using GNU "
+"autoconf,"
+msgstr ""
+"с помощью GNU autoconf сконфигурировать доступ к `ss_family` и/или `ss_len` "
+"на целевой платформе,"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:656
+msgid ""
+"have -Dss_family=__ss_family to unify all occurrences (including header "
+"file) into __ss_family, or"
+msgstr ""
+"добавить -Dss_family=__ss_family для унификации всех использований (включая "
+"заголовочный файл) __ss_family, или"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:657
+msgid "never touch __ss_family. cast to sockaddr * and use sa_family like:"
+msgstr ""
+"никогда не трогайте __ss_family. Приводите к sockaddr * и используйте "
+"sa_family, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:662
+#, no-wrap
+msgid ""
+"\tstruct sockaddr_storage ss;\n"
+"\tfamily = ((struct sockaddr *)&ss)->sa_family\n"
+msgstr ""
+"\tstruct sockaddr_storage ss;\n"
+"\tfamily = ((struct sockaddr *)&ss)->sa_family\n"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:664
+#, no-wrap
+msgid "Network Drivers"
+msgstr "Драйверы сетевых устройств"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:667
+msgid ""
+"Now following two items are required to be supported by standard drivers:"
+msgstr ""
+"В настоящее время следующие два пункта должны поддерживаться стандартными "
+"драйверами:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:669
+msgid ""
+"mbuf clustering requirement. In this stable release, we changed MINCLSIZE "
+"into MHLEN+1 for all the operating systems in order to make all the drivers "
+"behave as we expect."
+msgstr ""
+"Требование к кластеризации mbuf. В этом стабильном выпуске мы изменили "
+"MINCLSIZE на MHLEN+1 для всех операционных систем, чтобы все драйверы "
+"работали так, как мы ожидаем."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:670
+msgid ""
+"multicast. If man:ifmcstat[8] yields no multicast group for a interface, "
+"that interface has to be patched."
+msgstr ""
+"многоадресная рассылка (multicast). Если man:ifmcstat[8] не выводит ни одной "
+"многоадресной группы для интерфейса, этот интерфейс необходимо исправить."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:673
+msgid ""
+"If any of the drivers do not support the requirements, then the drivers "
+"cannot be used for IPv6 and/or IPsec communication. If you find any problem "
+"with your card using IPv6/IPsec, then, please report it to the {freebsd-"
+"bugs}."
+msgstr ""
+"Если какие-либо драйверы не поддерживают требования, то их нельзя "
+"использовать для IPv6 и/или IPsec-связи. Если вы обнаружили проблему с вашей "
+"картой при использовании IPv6/IPsec, пожалуйста, сообщите об этом в {freebsd-"
+"bugs}."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:676
+msgid ""
+"(NOTE: In the past we required all PCMCIA drivers to have a call to "
+"in6_ifattach(). We have no such requirement any more)"
+msgstr ""
+"(NOTE: Раньше мы требовали, чтобы все драйверы PCMCIA содержали вызов "
+"in6_ifattach(). Теперь такого требования нет)"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:677
+#, no-wrap
+msgid "Translator"
+msgstr "Транслятор"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:680
+msgid "We categorize IPv4/IPv6 translator into 4 types:"
+msgstr "Мы классифицируем трансляторы IPv4/IPv6 на 4 типа:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:682
+msgid ""
+"_Translator A_ --- It is used in the early stage of transition to make it "
+"possible to establish a connection from an IPv6 host in an IPv6 island to an "
+"IPv4 host in the IPv4 ocean."
+msgstr ""
+"_Транслятор А_ --- Он используется на раннем этапе перехода, чтобы позволить "
+"установить соединение с IPv6-хоста на IPv6-острове к IPv4-хосту в IPv4-"
+"океане."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:683
+msgid ""
+"_Translator B_ --- It is used in the early stage of transition to make it "
+"possible to establish a connection from an IPv4 host in the IPv4 ocean to an "
+"IPv6 host in an IPv6 island."
+msgstr ""
+"_Транслятор Б_ --- Он используется на раннем этапе перехода, чтобы "
+"обеспечить возможность установления соединения с IPv6-узлом на IPv6-острове "
+"от IPv4-узла в IPv4-океане."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:684
+msgid ""
+"_Translator C_ --- It is used in the late stage of transition to make it "
+"possible to establish a connection from an IPv4 host in an IPv4 island to an "
+"IPv6 host in the IPv6 ocean."
+msgstr ""
+"_Транслятор C_ --- Он используется на позднем этапе перехода, чтобы сделать "
+"возможным установление соединения с IPv6-узлом в IPv6-океане от IPv4-узла на "
+"IPv4-острове."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:685
+msgid ""
+"_Translator D_ --- It is used in the late stage of transition to make it "
+"possible to establish a connection from an IPv6 host in the IPv6 ocean to an "
+"IPv4 host in an IPv4 island."
+msgstr ""
+"_Транслятор D_ --- Он используется на позднем этапе перехода, чтобы сделать "
+"возможным установление соединения с IPv6-хоста в IPv6-океане на IPv4-хост на "
+"IPv4-острове."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:687
+#, no-wrap
+msgid "IPsec"
+msgstr "IPsec"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:690
+msgid "IPsec is mainly organized by three components."
+msgstr "IPsec состоит в основном из трех компонент."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:692
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:695
+#, no-wrap
+msgid "Policy Management"
+msgstr "Управление политиками"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:693
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:705
+#, no-wrap
+msgid "Key Management"
+msgstr "Управление ключами"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:694
+msgid "AH and ESP handling"
+msgstr "Обработка AH и ESP"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:702
+msgid ""
+"The kernel implements experimental policy management code. There are two "
+"way to manage security policy. One is to configure per-socket policy using "
+"man:setsockopt[2]. In this cases, policy configuration is described in "
+"man:ipsec_set_policy[3]. The other is to configure kernel packet filter-"
+"based policy using PF_KEY interface, via man:setkey[8]."
+msgstr ""
+"Ядро реализует экспериментальный код управления политикой безопасности. "
+"Существует два способа управления политикой безопасности. Первый — настройка "
+"политики для каждого сокета с помощью man:setsockopt[2]. В этом случае "
+"конфигурация политики описана в man:ipsec_set_policy[3]. Второй способ — "
+"настройка политики на основе фильтра пакетов ядра с использованием "
+"интерфейса PF_KEY через man:setkey[8]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:704
+msgid ""
+"The policy entry is not re-ordered with its indexes, so the order of entry "
+"when you add is very significant."
+msgstr ""
+"Запись политики не переупорядочивается вместе со своими индексами, поэтому "
+"порядок добавления записей очень важен."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:709
+msgid ""
+"The key management code implemented in this kit (sys/netkey) is a home-brew "
+"PFKEY v2 implementation. This conforms to RFC2367."
+msgstr ""
+"Код управления ключами, реализованный в этом наборе (sys/netkey), "
+"представляет собой собственную реализацию PFKEY v2. Это соответствует "
+"RFC2367."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:713
+msgid ""
+"The home-brew IKE daemon, \"racoon\" is included in the kit (kame/kame/"
+"racoon). Basically you will need to run racoon as daemon, then set up a "
+"policy to require keys (like `ping -P 'out ipsec esp/transport//use'`). The "
+"kernel will contact racoon daemon as necessary to exchange keys."
+msgstr ""
+"В комплект включена \"домашняя\" реализация демона IKE — \"racoon\" (kame/"
+"kame/racoon). Обычно вам потребуется запустить racoon в качестве демона, "
+"затем настроить политику для требования ключей (например, `ping -P 'out "
+"ipsec esp/transport//use'`). Ядро будет связываться с демоном racoon по мере "
+"необходимости для обмена ключами."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:714
+#, no-wrap
+msgid "AH and ESP Handling"
+msgstr "Обработка AH и ESP"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:722
+msgid ""
+"IPsec module is implemented as \"hooks\" to the standard IPv4/IPv6 "
+"processing. When sending a packet, ip{,6}_output() checks if ESP/AH "
+"processing is required by checking if a matching SPD (Security Policy "
+"Database) is found. If ESP/AH is needed, {esp,ah}{4,6}_output() will be "
+"called and mbuf will be updated accordingly. When a packet is received, "
+"{esp,ah}4_input() will be called based on protocol number, i.e., "
+"(*inetsw[proto])(). {esp,ah}4_input() will decrypt/check authenticity of "
+"the packet, and strips off daisy-chained header and padding for ESP/AH. It "
+"is safe to strip off the ESP/AH header on packet reception, since we will "
+"never use the received packet in \"as is\" form."
+msgstr ""
+"Модуль IPsec реализован в виде \"хуков\" к стандартной обработке IPv4/IPv6. "
+"При отправке пакета функция ip{,6}_output() проверяет, требуется ли "
+"обработка ESP/AH, путем поиска соответствующей базы данных политик "
+"безопасности (SPD — Security Policy Database). Если ESP/AH необходим, "
+"вызывается {esp,ah}{4,6}_output(), и mbuf соответствующим образом "
+"обновляется. При получении пакета функция {esp,ah}4_input() вызывается на "
+"основе номера протокола, т.е. (*inetsw[proto])(). {esp,ah}4_input() "
+"расшифровывает/проверяет подлинность пакета, а также удаляет цепочку "
+"заголовков и выравнивание для ESP/AH. Безопасно удалять заголовок ESP/AH при "
+"получении пакета, так как полученный пакет никогда не будет использоваться в "
+"\"сыром\" виде."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:725
+msgid ""
+"By using ESP/AH, TCP4/6 effective data segment size will be affected by "
+"extra daisy-chained headers inserted by ESP/AH. Our code takes care of the "
+"case."
+msgstr ""
+"Использование ESP/AH влияет на эффективный размер сегмента данных TCP4/6 из-"
+"за дополнительных цепочечных заголовков, вставляемых ESP/AH. Наш код "
+"учитывает этот случай."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:729
+msgid ""
+"Basic crypto functions can be found in directory \"sys/crypto\". ESP/AH "
+"transform are listed in {esp,ah}_core.c with wrapper functions. If you wish "
+"to add some algorithm, add wrapper function in {esp,ah}_core.c, and add your "
+"crypto algorithm code into sys/crypto."
+msgstr ""
+"Основные криптографические функции можно найти в директории `sys/crypto`. "
+"Преобразования ESP/AH перечислены в `{esp,ah}_core.c` с обёрточными "
+"функциями. Если вы хотите добавить какой-либо алгоритм, добавьте обёрточную "
+"функцию в `{esp,ah}_core.c` и поместите код вашего криптографического "
+"алгоритма в `sys/crypto`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:731
+msgid ""
+"Tunnel mode is partially supported in this release, with the following "
+"restrictions:"
+msgstr ""
+"Режим туннеля частично поддерживается в этом выпуске со следующими "
+"ограничениями:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:733
+msgid ""
+"IPsec tunnel is not combined with GIF generic tunneling interface. It needs "
+"a great care because we may create an infinite loop between ip_output() and "
+"tunnelifp->if_output(). Opinion varies if it is better to unify them, or not."
+msgstr ""
+"Туннель IPsec не объединён с универсальным туннельным интерфейсом GIF. Это "
+"требует особой осторожности, так как может возникнуть бесконечный цикл между "
+"`ip_output()` и `tunnelifp->if_output()`. Мнения расходятся относительно "
+"того, лучше ли их объединить или нет."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:734
+msgid ""
+"MTU and Don't Fragment bit (IPv4) considerations need more checking, but "
+"basically works fine."
+msgstr ""
+"MTU и бит Don't Fragment (IPv4) требуют дополнительной проверки, но в "
+"основном работают нормально."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:735
+msgid ""
+"Authentication model for AH tunnel must be revisited. We will need to "
+"improve the policy management engine, eventually."
+msgstr ""
+"Модель аутентификации для туннеля AH должна быть пересмотрена. Нам "
+"потребуется улучшить механизм управления политиками в конечном итоге."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:736
+#, no-wrap
+msgid "Conformance to RFCs and IDs"
+msgstr "Соответствие RFC и ID"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:739
+msgid ""
+"The IPsec code in the kernel conforms (or, tries to conform) to the "
+"following standards:"
+msgstr ""
+"Код IPsec в ядре соответствует (или пытается соответствовать) следующим "
+"стандартам:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:741
+msgid "\"old IPsec\" specification documented in [.filename]#rfc182[5-9].txt#"
+msgstr ""
+"Спецификация \"старого IPsec\", описанная в [.filename]#rfc182[5-9].txt#"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:744
+msgid ""
+"\"new IPsec\" specification documented in [.filename]#rfc240[1-6].txt#, "
+"[.filename]#rfc241[01].txt#, [.filename]#rfc2451.txt# and [.filename]#draft-"
+"mcdonald-simple-ipsec-api-01.txt# (draft expired, but you can take from "
+"link:ftp://ftp.kame.net/pub/internet-drafts/[ ftp://ftp.kame.net/pub/"
+"internet-drafts/]). (NOTE: IKE specifications, [.filename]#rfc241[7-9].txt# "
+"are implemented in userland, as \"racoon\" IKE daemon)"
+msgstr ""
+"Спецификация \"new IPsec\" описана в [.filename]#rfc240[1-6].txt#, "
+"[.filename]#rfc241[01].txt#, [.filename]#rfc2451.txt# и [.filename]#draft-"
+"mcdonald-simple-ipsec-api-01.txt# (черновик устарел, но его можно взять по "
+"ссылке: link:ftp://ftp.kame.net/pub/internet-drafts/[ ftp://ftp.kame.net/pub/"
+"internet-drafts/]). (ПРИМЕЧАНИЕ: Спецификации IKE, "
+"[.filename]#rfc241[7-9].txt#, реализованы в пользовательском пространстве в "
+"виде демона IKE \"racoon\")"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:746
+msgid "Currently supported algorithms are:"
+msgstr "В настоящее время поддерживаются следующие алгоритмы:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:748
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:785
+msgid "old IPsec AH"
+msgstr "old IPsec AH"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:750
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:763
+msgid "null crypto checksum (no document, just for debugging)"
+msgstr ""
+"нулевая криптографическая контрольная сумма (нет документа, только для "
+"отладки)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:751
+msgid "keyed MD5 with 128bit crypto checksum ([.filename]#rfc1828.txt#)"
+msgstr ""
+"MD5 с ключом и с 128-битной криптографической контрольной суммой "
+"([.filename]#rfc1828.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:752
+msgid "keyed SHA1 with 128bit crypto checksum (no document)"
+msgstr ""
+"SHA1 с ключом и с 128-битной криптографической контрольной суммой (без "
+"документа)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:753
+msgid "HMAC MD5 with 128bit crypto checksum ([.filename]#rfc2085.txt#)"
+msgstr ""
+"HMAC MD5 с 128-битной криптографической контрольной суммой "
+"([.filename]#rfc2085.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:754
+msgid "HMAC SHA1 with 128bit crypto checksum (no document)"
+msgstr ""
+"HMAC SHA1 с 128-битной криптографической контрольной суммой (без документа)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:756
+msgid "old IPsec ESP"
+msgstr "old IPsec ESP"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:758
+msgid "null encryption (no document, similar to [.filename]#rfc2410.txt#)"
+msgstr ""
+"нулевое шифрование (нет документа, аналогично [.filename]#rfc2410.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:759
+msgid "DES-CBC mode ([.filename]#rfc1829.txt#)"
+msgstr "Режим DES-CBC ([.filename]#rfc1829.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:761
+msgid "new IPsec AH"
+msgstr "new IPsec AH"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:764
+msgid "keyed MD5 with 96bit crypto checksum (no document)"
+msgstr ""
+"MD5 с ключом и с 96-битной криптографической контрольной суммой (нет "
+"документа)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:765
+msgid "keyed SHA1 with 96bit crypto checksum (no document)"
+msgstr ""
+"SHA1 с ключом и с 96-битной криптографической контрольной суммой (без "
+"документа)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:766
+msgid "HMAC MD5 with 96bit crypto checksum ([.filename]#rfc2403.txt#)"
+msgstr ""
+"HMAC MD5 с 96-битной криптографической контрольной суммой "
+"([.filename]#rfc2403.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:767
+msgid "HMAC SHA1 with 96bit crypto checksum ([.filename]#rfc2404.txt#)"
+msgstr ""
+"HMAC SHA1 с 96-битной криптографической контрольной суммой "
+"([.filename]#rfc2404.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:769
+msgid "new IPsec ESP"
+msgstr "new IPsec ESP"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:771
+msgid "null encryption ([.filename]#rfc2410.txt#)"
+msgstr "нулевое шифрование ([.filename]#rfc2410.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:772
+msgid ""
+"DES-CBC with derived IV ([.filename]#draft-ietf-ipsec-ciph-des-"
+"derived-01.txt#, draft expired)"
+msgstr ""
+"DES-CBC с производным IV ([.filename]#draft-ietf-ipsec-ciph-des-"
+"derived-01.txt#, черновик истек)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:773
+msgid "DES-CBC with explicit IV ([.filename]#rfc2405.txt#)"
+msgstr "DES-CBC с явным вектором инициализации ([.filename]#rfc2405.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:774
+msgid "3DES-CBC with explicit IV ([.filename]#rfc2451.txt#)"
+msgstr "3DES-CBC с явным вектором инициализации ([.filename]#rfc2451.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:775
+msgid "BLOWFISH CBC ([.filename]#rfc2451.txt#)"
+msgstr "BLOWFISH CBC ([.filename]#rfc2451.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:776
+msgid "CAST128 CBC ([.filename]#rfc2451.txt#)"
+msgstr "CAST128 CBC ([.filename]#rfc2451.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:777
+msgid "RC5 CBC ([.filename]#rfc2451.txt#)"
+msgstr "RC5 CBC ([.filename]#rfc2451.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:778
+msgid "each of the above can be combined with:"
+msgstr "каждый из вышеперечисленных может быть объединён с:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:780
+msgid "ESP authentication with HMAC-MD5(96bit)"
+msgstr "Аутентификация ESP с HMAC-MD5 (96 бит)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:781
+msgid "ESP authentication with HMAC-SHA1(96bit)"
+msgstr "Аутентификация ESP с HMAC-SHA1(96 бит)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:783
+msgid "The following algorithms are NOT supported:"
+msgstr "Следующие алгоритмы НЕ поддерживаются:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:787
+msgid ""
+"HMAC MD5 with 128bit crypto checksum + 64bit replay prevention "
+"([.filename]#rfc2085.txt#)"
+msgstr ""
+"HMAC MD5 с 128-битной криптографической контрольной суммой + 64-битная "
+"защита от повторного воспроизведения ([.filename]#rfc2085.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:788
+msgid ""
+"keyed SHA1 with 160bit crypto checksum + 32bit padding "
+"([.filename]#rfc1852.txt#)"
+msgstr ""
+"SHA1 с ключом и с 160-битной криптографической контрольной суммой + 32-"
+"битное дополнение ([.filename]#rfc1852.txt#)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:791
+msgid ""
+"IPsec (in kernel) and IKE (in userland as \"racoon\") has been tested at "
+"several interoperability test events, and it is known to interoperate with "
+"many other implementations well. Also, current IPsec implementation as "
+"quite wide coverage for IPsec crypto algorithms documented in RFC (we cover "
+"algorithms without intellectual property issues only)."
+msgstr ""
+"IPsec (в ядре) и IKE (в пользовательском пространстве как \"racoon\") были "
+"протестированы на нескольких мероприятиях по тестированию взаимодействия и "
+"известно, что они хорошо работают со многими другими реализациями. Кроме "
+"того, текущая реализация IPsec поддерживает довольно широкий спектр "
+"криптографических алгоритмов IPsec, описанных в RFC (мы поддерживаем только "
+"алгоритмы без проблем с интеллектуальной собственностью)."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:793
+#, no-wrap
+msgid "ECN Consideration on IPsec Tunnels"
+msgstr "Учет ECN в IPsec-туннелях"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:796
+msgid ""
+"ECN-friendly IPsec tunnel is supported as described in [.filename]#draft-"
+"ipsec-ecn-00.txt#."
+msgstr ""
+"Поддерживается ECN-совместимый IPsec-туннель, как описано в "
+"[.filename]#draft-ipsec-ecn-00.txt#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:801
+msgid ""
+"Normal IPsec tunnel is described in RFC2401. On encapsulation, IPv4 TOS "
+"field (or, IPv6 traffic class field) will be copied from inner IP header to "
+"outer IP header. On decapsulation outer IP header will be simply dropped. "
+"The decapsulation rule is not compatible with ECN, since ECN bit on the "
+"outer IP TOS/traffic class field will be lost."
+msgstr ""
+"Обычный IPsec-туннель описан в RFC2401. При инкапсуляции поле TOS IPv4 (или "
+"поле класса трафика IPv6) копируется из внутреннего IP-заголовка во внешний "
+"IP-заголовок. При декапсуляции внешний IP-заголовок просто отбрасывается. "
+"Правило декапсуляции несовместимо с ECN, так как бит ECN в поле TOS/класса "
+"трафика внешнего IP-заголовка будет потерян."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:804
+msgid ""
+"To make IPsec tunnel ECN-friendly, we should modify encapsulation and "
+"decapsulation procedure. This is described in http://www.aciri.org/floyd/"
+"papers/draft-ipsec-ecn-00.txt[ http://www.aciri.org/floyd/papers/draft-ipsec-"
+"ecn-00.txt], chapter 3."
+msgstr ""
+"Чтобы сделать IPsec-туннель дружественным к ECN, следует изменить процедуры "
+"инкапсуляции и декапсуляции. Это описано в http://www.aciri.org/floyd/papers/"
+"draft-ipsec-ecn-00.txt[ http://www.aciri.org/floyd/papers/draft-ipsec-"
+"ecn-00.txt], глава 3."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:806
+msgid ""
+"IPsec tunnel implementation can give you three behaviors, by setting "
+"net.inet.ipsec.ecn (or net.inet6.ipsec6.ecn) to some value:"
+msgstr ""
+"Реализация туннеля IPsec может обеспечить три варианта поведения, в "
+"зависимости от значения параметра `net.inet.ipsec.ecn` (или "
+"`net.inet6.ipsec6.ecn`):"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:808
+msgid "RFC2401: no consideration for ECN (sysctl value -1)"
+msgstr "RFC2401: отсутствие учета ECN (значение sysctl -1)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:809
+msgid "ECN forbidden (sysctl value 0)"
+msgstr "ECN запрещён (значение sysctl 0)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:810
+msgid "ECN allowed (sysctl value 1)"
+msgstr "ECN разрешён (значение sysctl 1)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:812
+msgid ""
+"Note that the behavior is configurable in per-node manner, not per-SA manner "
+"(draft-ipsec-ecn-00 wants per-SA configuration, but it looks too much for "
+"me)."
+msgstr ""
+"Обратите внимание, что поведение настраивается для каждого узла, а не для "
+"каждой SA (в draft-ipsec-ecn-00 предлагается настройка для каждой SA, но это "
+"кажется излишним)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:814
+msgid ""
+"The behavior is summarized as follows (see source code for more detail):"
+msgstr ""
+"Поведение можно обобщить следующим образом (подробности см. в исходном коде):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:821
+#, no-wrap
+msgid ""
+"encapsulate decapsulate\n"
+" --- ---\n"
+"RFC2401 copy all TOS bits drop TOS bits on outer\n"
+" from inner to outer. (use inner TOS bits as is)\n"
+msgstr ""
+"encapsulate decapsulate\n"
+" --- ---\n"
+"RFC2401 copy all TOS bits drop TOS bits on outer\n"
+" from inner to outer. (use inner TOS bits as is)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:825
+#, no-wrap
+msgid ""
+"ECN forbidden copy TOS bits except for ECN drop TOS bits on outer\n"
+" (masked with 0xfc) from inner (use inner TOS bits as is)\n"
+" to outer. set ECN bits to 0.\n"
+msgstr ""
+"ECN forbidden copy TOS bits except for ECN drop TOS bits on outer\n"
+" (masked with 0xfc) from inner (use inner TOS bits as is)\n"
+" to outer. set ECN bits to 0.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:830
+#, no-wrap
+msgid ""
+"ECN allowed copy TOS bits except for ECN use inner TOS bits with some\n"
+" CE (masked with 0xfe) from change. if outer ECN CE bit\n"
+" inner to outer. is 1, enable ECN CE bit on\n"
+" set ECN CE bit to 0. the inner.\n"
+msgstr ""
+"ECN allowed copy TOS bits except for ECN use inner TOS bits with some\n"
+" CE (masked with 0xfe) from change. if outer ECN CE bit\n"
+" inner to outer. is 1, enable ECN CE bit on\n"
+" set ECN CE bit to 0. the inner.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:833
+msgid "General strategy for configuration is as follows:"
+msgstr "Общая стратегия настройки выглядит следующим образом:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:835
+msgid ""
+"if both IPsec tunnel endpoint are capable of ECN-friendly behavior, you "
+"should better configure both end to \"ECN allowed\" (sysctl value 1)."
+msgstr ""
+"если оба конечных пункта туннеля IPsec поддерживают поведение, дружественное "
+"к ECN, лучше настроить оба конца на \"разрешено ECN\" (значение sysctl 1)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:836
+msgid ""
+"if the other end is very strict about TOS bit, use \"RFC2401\" (sysctl value "
+"-1)."
+msgstr ""
+"если другая сторона очень строга к биту TOS, используйте \"RFC2401\" "
+"(значение sysctl -1)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:837
+msgid "in other cases, use \"ECN forbidden\" (sysctl value 0)."
+msgstr "в остальных случаях используйте \"ECN запрещено\" (значение sysctl 0)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:839
+msgid "The default behavior is \"ECN forbidden\" (sysctl value 0)."
+msgstr "Поведение по умолчанию — \"ECN запрещён\" (значение sysctl 0)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:841
+msgid "For more information, please refer to:"
+msgstr "Для получения дополнительной информации обратитесь к:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:843
+msgid ""
+"http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt[ http://"
+"www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt], RFC2481 (Explicit "
+"Congestion Notification), src/sys/netinet6/{ah,esp}_input.c"
+msgstr ""
+"http://www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt[ http://"
+"www.aciri.org/floyd/papers/draft-ipsec-ecn-00.txt], RFC2481 (Явное "
+"Уведомление о Перегрузке), src/sys/netinet6/{ah,esp}_input.c"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:845
+msgid ""
+"(Thanks goes to Kenjiro Cho mailto:kjc@csl.sony.co.jp[kjc@csl.sony.co.jp] "
+"for detailed analysis)"
+msgstr ""
+"(Благодарности Kenjiro Cho mailto:kjc@csl.sony.co.jp[kjc@csl.sony.co.jp] за "
+"детальный анализ)"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:846
+#, no-wrap
+msgid "Interoperability"
+msgstr "Совместимость"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:850
+msgid ""
+"Here are (some of) platforms that KAME code have tested IPsec/IKE "
+"interoperability in the past. Note that both ends may have modified their "
+"implementation, so use the following list just for reference purposes."
+msgstr ""
+"Вот некоторые из платформ, на которых код KAME тестировал взаимодействие "
+"IPsec/IKE в прошлом. Обратите внимание, что обе стороны могли изменить свои "
+"реализации, поэтому используйте следующий список только в справочных целях."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/ipv6/_index.adoc:851
+msgid ""
+"Altiga, Ashley-laurent (vpcom.com), Data Fellows (F-Secure), Ericsson ACC, "
+"FreeS/WAN, HITACHI, IBM AIX(R), IIJ, Intel, Microsoft(R) Windows NT(R), NIST "
+"(linux IPsec + plutoplus), Netscreen, OpenBSD, RedCreek, Routerware, SSH, "
+"Secure Computing, Soliton, Toshiba, VPNet, Yamaha RT100i"
+msgstr ""
+"Altiga, Ashley-laurent (vpcom.com), Data Fellows (F-Secure), Ericsson ACC, "
+"FreeS/WAN, HITACHI, IBM AIX(R), IIJ, Intel, Microsoft(R) Windows NT(R), NIST "
+"(linux IPsec + plutoplus), Netscreen, OpenBSD, RedCreek, Routerware, SSH, "
+"Secure Computing, Soliton, Toshiba, VPNet, Yamaha RT100i"
diff --git a/documentation/content/ru/books/developers-handbook/kernelbuild/_index.adoc b/documentation/content/ru/books/developers-handbook/kernelbuild/_index.adoc
new file mode 100644
index 0000000000..a020ccd898
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/kernelbuild/_index.adoc
@@ -0,0 +1,94 @@
+---
+authors:
+description: 'Сборка и установка ядра FreeBSD'
+next: books/developers-handbook/kerneldebug
+params:
+ path: /books/developers-handbook/kernelbuild/
+prev: books/developers-handbook/partiii
+showBookMenu: true
+tags: ["building", "installing", "kernel", "FreeBSD"]
+title: 'Глава 9. Сборка и установка ядра FreeBSD'
+weight: 12
+---
+
+[[kernelbuild]]
+= Сборка и установка ядра FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 9
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Чтобы быть разработчиком ядра, требуется понимания процесса сборки ядра. Для отладки ядра FreeBSD необходимо уметь его собирать. Существует два известных способа сделать это:
+
+Поддерживаемая процедура сборки и установки ядра описана в главе extref:{handbook}kernelconfig/[Сборка и установка пользовательского ядра, kernelconfig-building] Руководства FreeBSD.
+
+[NOTE]
+====
+Предполагается, что читатель этой главы знаком с информацией, изложенной в главе extref:{handbook}kernelconfig/[Сборка и установка пользовательского ядра, kernelconfig-building] Руководства FreeBSD. Если это не так, пожалуйста, ознакомьтесь с упомянутой главой, чтобы понять, как работает процесс сборки.
+====
+
+[[kernelbuild-traditional]]
+== Построение более быстрым, но менее надежным способом
+
+Сборка ядра таким способом может быть полезной при работе с кодом ядра и может оказаться быстрее, чем описанная процедура, если в конфигурационном файле ядра были изменены только одна или две опции. С другой стороны, это может привести к неожиданным сбоям при сборке ядра.
+
+[.procedure]
+. Выполните man:config[8] для генерации исходного кода ядра:
++
+[source, bash]
+....
+# /usr/sbin/config MYKERNEL
+....
+
+. Перейдите в каталог сборки. man:config[8] выведет имя этого каталога после выполнения, как указано выше.
++
+[source, bash]
+....
+# cd ../compile/MYKERNEL
+....
+
+. Скомпилируйте ядро:
++
+[source, bash]
+....
+# make depend
+# make
+....
+
+. Установите новое ядро:
++
+[source, bash]
+....
+# make install
+....
diff --git a/documentation/content/ru/books/developers-handbook/kernelbuild/_index.po b/documentation/content/ru/books/developers-handbook/kernelbuild/_index.po
new file mode 100644
index 0000000000..0230e59c60
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/kernelbuild/_index.po
@@ -0,0 +1,140 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-06-24 20:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookkernelbuild_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:1
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:15
+#, no-wrap
+msgid "Building and Installing a FreeBSD Kernel"
+msgstr "Сборка и установка ядра FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:1
+#, no-wrap
+msgid "Chapter 9. Building and Installing a FreeBSD Kernel"
+msgstr "Глава 9. Сборка и установка ядра FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:55
+msgid ""
+"Being a kernel developer requires understanding of the kernel build "
+"process. To debug the FreeBSD kernel it is required to be able to build "
+"one. There are two known ways to do so:"
+msgstr ""
+"Чтобы быть разработчиком ядра, требуется понимания процесса сборки ядра. Для "
+"отладки ядра FreeBSD необходимо уметь его собирать. Существует два известных "
+"способа сделать это:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:57
+msgid ""
+"The supported procedure to build and install a kernel is documented in the "
+"extref:{handbook}kernelconfig/[Building and Installing a Custom Kernel, "
+"kernelconfig-building] chapter of the FreeBSD Handbook."
+msgstr ""
+"Поддерживаемая процедура сборки и установки ядра описана в главе extref:"
+"{handbook}kernelconfig/[Сборка и установка пользовательского ядра, "
+"kernelconfig-building] Руководства FreeBSD."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:62
+msgid ""
+"It is supposed that the reader of this chapter is familiar with the "
+"information described in the extref:{handbook}kernelconfig/[Building and "
+"Installing a Custom Kernel, kernelconfig-building] chapter of the FreeBSD "
+"Handbook. If this is not the case, please read through the above mentioned "
+"chapter to understand how the build process works."
+msgstr ""
+"Предполагается, что читатель этой главы знаком с информацией, изложенной в "
+"главе extref:{handbook}kernelconfig/[Сборка и установка пользовательского "
+"ядра, kernelconfig-building] Руководства FreeBSD. Если это не так, "
+"пожалуйста, ознакомьтесь с упомянутой главой, чтобы понять, как работает "
+"процесс сборки."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:65
+#, no-wrap
+msgid "Building the Faster but Brittle Way"
+msgstr "Построение более быстрым, но менее надежным способом"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:69
+msgid ""
+"Building the kernel this way may be useful when working on the kernel code "
+"and it may actually be faster than the documented procedure when only a "
+"single option or two were tweaked in the kernel configuration file. On the "
+"other hand, it might lead to unexpected kernel build breakage."
+msgstr ""
+"Сборка ядра таким способом может быть полезной при работе с кодом ядра и "
+"может оказаться быстрее, чем описанная процедура, если в конфигурационном "
+"файле ядра были изменены только одна или две опции. С другой стороны, это "
+"может привести к неожиданным сбоям при сборке ядра."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:72
+msgid "Run man:config[8] to generate the kernel source code:"
+msgstr "Выполните man:config[8] для генерации исходного кода ядра:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:76
+#, no-wrap
+msgid "# /usr/sbin/config MYKERNEL\n"
+msgstr "# /usr/sbin/config MYKERNEL\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:79
+msgid ""
+"Change into the build directory. man:config[8] will print the name of this "
+"directory after being run as above."
+msgstr ""
+"Перейдите в каталог сборки. man:config[8] выведет имя этого каталога после "
+"выполнения, как указано выше."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:83
+#, no-wrap
+msgid "# cd ../compile/MYKERNEL\n"
+msgstr "# cd ../compile/MYKERNEL\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:86
+msgid "Compile the kernel:"
+msgstr "Скомпилируйте ядро:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:91
+#, no-wrap
+msgid ""
+"# make depend\n"
+"# make\n"
+msgstr ""
+"# make depend\n"
+"# make\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:94
+msgid "Install the new kernel:"
+msgstr "Установите новое ядро:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kernelbuild/_index.adoc:98
+#, no-wrap
+msgid "# make install\n"
+msgstr "# make install\n"
diff --git a/documentation/content/ru/books/developers-handbook/kerneldebug/_index.adoc b/documentation/content/ru/books/developers-handbook/kerneldebug/_index.adoc
new file mode 100644
index 0000000000..5ac6d8df9f
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/kerneldebug/_index.adoc
@@ -0,0 +1,773 @@
+---
+authors:
+ -
+ author: 'Paul Richards'
+ -
+ author: 'Jörg Wunsch'
+ -
+ author: 'Robert Watson'
+description: 'Отладка ядра FreeBSD'
+next: books/developers-handbook/partiv
+params:
+ path: /books/developers-handbook/kerneldebug/
+prev: books/developers-handbook/kernelbuild
+showBookMenu: true
+tags: ["Debugging", "Dump", "kgdb", "DDB", "GDB"]
+title: 'Глава 10. Отладка ядра'
+weight: 13
+---
+
+[[kerneldebug]]
+= Отладка ядра
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 10
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[kerneldebug-obtain]]
+== Получение аварийного дампа ядра
+
+При работе с разрабатываемым ядром (например, FreeBSD-CURRENT), особенно в экстремальных условиях (например, при очень высокой загрузке, десятках тысяч соединений, чрезвычайно большом количестве одновременных пользователей, сотнях man:jail[8] и т.д.), или при использовании новой функции или драйвера устройства в FreeBSD-STABLE (например, PAE), иногда может возникнуть паника ядра. В случае, если это произойдет, данная глава покажет, как извлечь полезную информацию из аварийного дампа.
+
+Перезагрузка системы неизбежна после паники ядра. После перезагрузки системы содержимое физической памяти (RAM) теряется, как и любые данные на устройстве подкачки перед паникой. Чтобы сохранить данные в физической памяти, ядро использует устройство подкачки как временное хранилище для данных из RAM после сбоя и перезагрузки. Благодаря этому, когда FreeBSD загружается после сбоя, образ ядра может быть извлечен и проведена отладка.
+
+[NOTE]
+====
+Устройство подкачки, настроенное как устройство для дампа, продолжает функционировать как устройство подкачки. В настоящее время дампы на устройства, не являющиеся устройствами подкачки (например, на ленты или CDRW), не поддерживаются. Термин "устройство подкачки" является синонимом термина "раздел подкачки".
+====
+
+Есть несколько типов аварийных дампов ядра:
+
+Полные дампы памяти::
+Содержат полное содержимое физической памяти.
+
+Минидампы::
+Содержат только страницы памяти, используемые ядром (FreeBSD 6.2 и выше).
+
+Текстовые дампы::
+Содержать захваченные, записанные или интерактивные выходные данные отладчика (FreeBSD 7.1 и выше).
+
+Минидампы являются типом дампа по умолчанию, начиная с FreeBSD 7.0, и в большинстве случаев они сохраняют всю необходимую информацию, присутствующую в полном дампе памяти, так как большинство проблем можно изолировать, используя только состояние ядра.
+
+[[config-dumpdev]]
+=== Настройка устройства дампа
+
+Прежде чем ядро запишет содержимое своей физической памяти на устройство дампа, необходимо настроить это устройство. Устройство дампа указывается с помощью команды man:dumpon[8], чтобы сообщить ядру, куда сохранять аварийные дампы. Программа man:dumpon[8] должна быть вызвана после настройки раздела подкачки с помощью man:swapon[8]. Обычно это обрабатывается установкой переменной `dumpdev` в man:rc.conf[5] в путь к устройству подкачки (рекомендуемый способ извлечения дампа ядра) или в значение `AUTO` для использования первого настроенного устройства подкачки. По умолчанию `dumpdev` имеет значение `AUTO` в HEAD и изменено на `NO` в ветках RELENG_* (за исключением RELENG_7, где оставлено значение `AUTO`). Начиная с FreeBSD 9.0-RELEASE и более поздних версий, bsdinstall будет спрашивать, следует ли включить аварийные дампы на целевой системе во время процесса установки.
+
+[TIP]
+====
+Проверьте [.filename]#/etc/fstab# или man:swapinfo[8] для получения списка устройств подкачки.
+====
+
+[IMPORTANT]
+====
+Убедитесь, что каталог `dumpdir`, указанный в man:rc.conf[5], существует перед аварией ядра!
+
+[source, bash]
+....
+# mkdir /var/crash
+# chmod 700 /var/crash
+....
+
+Также помните, что содержимое [.filename]#/var/crash# является конфиденциальным и, скорее всего, содержит секретную информацию, такую как пароли.
+====
+
+[[extract-dump]]
+=== Извлечение дампа ядра
+
+После записи дампа на устройство дампа, дамп должен быть извлечен до монтирования устройства подкачки. Для извлечения дампа с устройства дампа используйте программу man:savecore[8]. Если в man:rc.conf[5] установлен параметр `dumpdev`, man:savecore[8] будет автоматически вызван при первой загрузке в многопользовательском режиме после сбоя и до монтирования устройства подкачки. Расположение извлеченного ядра указывается в параметре `dumpdir` файла man:rc.conf[5], по умолчанию это [.filename]#/var/crash#, а имя файла будет [.filename]#vmcore.0#.
+
+В случае, если файл с именем [.filename]#vmcore.0# уже существует в [.filename]#/var/crash# (или в каталоге, указанном в параметре `dumpdir`), ядро будет увеличивать завершающее число при каждом сбое, чтобы избежать перезаписи существующего файла [.filename]#vmcore# (например, [.filename]#vmcore.1#). man:savecore[8] всегда создает символическую ссылку с именем [.filename]#vmcore.last# в [.filename]#/var/crash# после сохранения дампа. Эта символическая ссылка может быть использована для определения имени последнего дампа.
+
+Утилита man:crashinfo[8] создаёт текстовый файл, содержащий сводную информацию из полного дампа памяти или минидампа. Если параметр `dumpdev` установлен в man:rc.conf[5], man:crashinfo[8] будет автоматически вызван после man:savecore[8]. Результат сохраняется в файл с именем [.filename]#core.txt.N# в директории `dumpdir`.
+
+[TIP]
+====
+Если вы тестируете новое ядро, но вам нужно загрузить другое, чтобы снова запустить систему, загрузите его только в однопользовательском режиме, используя флаг `-s` при загрузке, а затем выполните следующие шаги:
+
+[source, bash]
+....
+# fsck -p
+# mount -a -t ufs # make sure /var/crash is writable
+# savecore /var/crash /dev/ad0s1b
+# exit # exit to multi-user
+....
+
+Это указывает man:savecore[8] извлечь дамп ядра из [.filename]#/dev/ad0s1b# и поместить содержимое в [.filename]#/var/crash#. Не забудьте убедиться, что целевой каталог [.filename]#/var/crash# имеет достаточно места для дампа. Также не забудьте указать правильный путь к вашему swap-устройству, так как он, скорее всего, отличается от [.filename]#/dev/ad0s1b#!
+====
+
+=== Тестирование конфигурации дампа ядра
+
+Ядро включает узел man:sysctl[8], который вызывает панику ядра. Это можно использовать для проверки того, что ваша система правильно настроена для сохранения дампов аварийного завершения работы ядра. Возможно, вы захотите перемонтировать существующие файловые системы в режиме только для чтения в однопользовательском режиме перед тем, как вызвать панику, чтобы избежать потери данных.
+
+[source, bash]
+....
+# shutdown now
+...
+Enter full pathname of shell or RETURN for /bin/sh:
+# mount -a -u -r
+# sysctl debug.kdb.panic=1
+debug.kdb.panic:panic: kdb_sysctl_panic
+...
+....
+
+После перезагрузки система должна сохранить дамп в [.filename]#/var/crash# вместе с соответствующим отчетом из man:crashinfo[8].
+
+[[kerneldebug-gdb]]
+== Отладка аварийного дампа ядра с помощью `kgdb`
+
+[NOTE]
+====
+Этот раздел посвящен man:kgdb[1]. Последняя версия включена в пакет package:devel/gdb[]. Более старая версия также присутствует в FreeBSD 11 и более ранних версиях.
+====
+
+Чтобы войти в отладчик и начать получение информации из дампа, запустите kgdb:
+
+[source, bash]
+....
+# kgdb -n N
+....
+
+Где _N_ — это суффикс файла [.filename]#vmcore.N#, который нужно изучить. Чтобы открыть последний дамп, используйте:
+
+[source, bash]
+....
+# kgdb -n last
+....
+
+Обычно man:kgdb[1] должен быть способен найти ядро, работавшее в момент создания дампа. Если он не может найти нужное ядро, передайте путь к ядру и дампу в качестве двух аргументов для kgdb:
+
+[source, bash]
+....
+# kgdb /boot/kernel/kernel /var/crash/vmcore.0
+....
+
+Вы можете отлаживать дамп аварийного завершения, используя исходные коды ядра, так же, как и для любой другой программы.
+
+Этот дамп получен из ядра версии 5.2-BETA, а крах произошел глубоко внутри ядра. Приведенный ниже вывод был изменен для добавления номеров строк слева. Первый трассировочный вывод проверяет указатель инструкции и получает обратную трассировку. Адрес, используемый в строке 41 для команды `list`, является указателем инструкции и может быть найден в строке 17. Большинство разработчиков запросят как минимум эту информацию, если вы не сможете отладить проблему самостоятельно. Однако, если вы решите проблему, убедитесь, что ваш патч попадет в дерево исходников через отчет о проблеме, списки рассылки, или, может быть, у вас есть возможность его закоммитить!
+
+[source, bash]
+....
+ 1:# cd /usr/obj/usr/src/sys/KERNCONF
+ 2:# kgdb kernel.debug /var/crash/vmcore.0
+ 3:GNU gdb 5.2.1 (FreeBSD)
+ 4:Copyright 2002 Free Software Foundation, Inc.
+ 5:GDB is free software, covered by the GNU General Public License, and you are
+ 6:welcome to change it and/or distribute copies of it under certain conditions.
+ 7:Type "show copying" to see the conditions.
+ 8:There is absolutely no warranty for GDB. Type "show warranty" for details.
+ 9:This GDB was configured as "i386-undermydesk-freebsd"...
+10:panic: page fault
+11:panic messages:
+12:---
+13:Fatal trap 12: page fault while in kernel mode
+14:cpuid = 0; apic id = 00
+15:fault virtual address = 0x300
+16:fault code: = supervisor read, page not present
+17:instruction pointer = 0x8:0xc0713860
+18:stack pointer = 0x10:0xdc1d0b70
+19:frame pointer = 0x10:0xdc1d0b7c
+20:code segment = base 0x0, limit 0xfffff, type 0x1b
+21: = DPL 0, pres 1, def32 1, gran 1
+22:processor eflags = resume, IOPL = 0
+23:current process = 14394 (uname)
+24:trap number = 12
+25:panic: page fault
+26 cpuid = 0;
+27:Stack backtrace:
+28
+29:syncing disks, buffers remaining... 2199 2199 panic: mi_switch: switch in a critical section
+30:cpuid = 0;
+31:Uptime: 2h43m19s
+32:Dumping 255 MB
+33: 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240
+34:---
+35:Reading symbols from /boot/kernel/snd_maestro3.ko...done.
+36:Loaded symbols for /boot/kernel/snd_maestro3.ko
+37:Reading symbols from /boot/kernel/snd_pcm.ko...done.
+38:Loaded symbols for /boot/kernel/snd_pcm.ko
+39:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240
+40:240 dumping++;
+41:(kgdb) list *0xc0713860
+42:0xc0713860 is in lapic_ipi_wait (/usr/src/sys/i386/i386/local_apic.c:663).
+43:658 incr = 0;
+44:659 delay = 1;
+45:660 } else
+46:661 incr = 1;
+47:662 for (x = 0; x < delay; x += incr) {
+48:663 if ((lapic->icr_lo & APIC_DELSTAT_MASK) == APIC_DELSTAT_IDLE)
+49:664 return (1);
+50:665 ia32_pause();
+51:666 }
+52:667 return (0);
+53:(kgdb) backtrace
+54:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240
+55:#1 0xc055fd9b in boot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:372
+56:#2 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550
+57:#3 0xc0567ef5 in mi_switch () at /usr/src/sys/kern/kern_synch.c:470
+58:#4 0xc055fa87 in boot (howto=256) at /usr/src/sys/kern/kern_shutdown.c:312
+59:#5 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550
+60:#6 0xc0720c66 in trap_fatal (frame=0xdc1d0b30, eva=0)
+61: at /usr/src/sys/i386/i386/trap.c:821
+62:#7 0xc07202b3 in trap (frame=
+63: {tf_fs = -1065484264, tf_es = -1065484272, tf_ds = -1065484272, tf_edi = 1, tf_esi = 0, tf_ebp = -602076292, tf_isp = -602076324, tf_ebx = 0, tf_edx = 0, tf_ecx = 1000000, tf_eax = 243, tf_trapno = 12, tf_err = 0, tf_eip = -1066321824, tf_cs = 8, tf_eflags = 65671, tf_esp = 243, tf_ss = 0})
+64: at /usr/src/sys/i386/i386/trap.c:250
+65:#8 0xc070c9f8 in calltrap () at {standard input}:94
+66:#9 0xc07139f3 in lapic_ipi_vectored (vector=0, dest=0)
+67: at /usr/src/sys/i386/i386/local_apic.c:733
+68:#10 0xc0718b23 in ipi_selected (cpus=1, ipi=1)
+69: at /usr/src/sys/i386/i386/mp_machdep.c:1115
+70:#11 0xc057473e in kseq_notify (ke=0xcc05e360, cpu=0)
+71: at /usr/src/sys/kern/sched_ule.c:520
+72:#12 0xc0575cad in sched_add (td=0xcbcf5c80)
+73: at /usr/src/sys/kern/sched_ule.c:1366
+74:#13 0xc05666c6 in setrunqueue (td=0xcc05e360)
+75: at /usr/src/sys/kern/kern_switch.c:422
+76:#14 0xc05752f4 in sched_wakeup (td=0xcbcf5c80)
+77: at /usr/src/sys/kern/sched_ule.c:999
+78:#15 0xc056816c in setrunnable (td=0xcbcf5c80)
+79: at /usr/src/sys/kern/kern_synch.c:570
+80:#16 0xc0567d53 in wakeup (ident=0xcbcf5c80)
+81: at /usr/src/sys/kern/kern_synch.c:411
+82:#17 0xc05490a8 in exit1 (td=0xcbcf5b40, rv=0)
+83: at /usr/src/sys/kern/kern_exit.c:509
+84:#18 0xc0548011 in sys_exit () at /usr/src/sys/kern/kern_exit.c:102
+85:#19 0xc0720fd0 in syscall (frame=
+86: {tf_fs = 47, tf_es = 47, tf_ds = 47, tf_edi = 0, tf_esi = -1, tf_ebp = -1077940712, tf_isp = -602075788, tf_ebx = 672411944, tf_edx = 10, tf_ecx = 672411600, tf_eax = 1, tf_trapno = 12, tf_err = 2, tf_eip = 671899563, tf_cs = 31, tf_eflags = 642, tf_esp = -1077940740, tf_ss = 47})
+87: at /usr/src/sys/i386/i386/trap.c:1010
+88:#20 0xc070ca4d in Xint0x80_syscall () at {standard input}:136
+89:---Can't read userspace from dump, or kernel process---
+90:(kgdb) quit
+....
+
+[TIP]
+====
+Если ваша система регулярно завершается аварийно и у вас заканчивается место на диске, удаление старых файлов [.filename]#vmcore# в [.filename]#/var/crash# может освободить значительное количество дискового пространства!
+====
+
+[[kerneldebug-online-ddb]]
+== Онлайн-отладка ядра с использованием DDB
+
+В то время как `kgdb` как автономный отладчик предоставляет очень высокий уровень пользовательского интерфейса, есть некоторые вещи, которые он не может выполнить. Наиболее важные из них — установка точек останова и пошаговое выполнение кода ядра.
+
+Если вам требуется выполнить низкоуровневую отладку ядра, доступен отладчик DDB, работающий в режиме реального времени. Он позволяет устанавливать точки останова, выполнять пошаговое выполнение функций ядра, проверять и изменять переменные ядра и т.д. Однако он не имеет доступа к исходным файлам ядра и работает только с глобальными и статическими символами, без доступа к полной отладочной информации, как это делает `kgdb`.
+
+Для настройки ядра с включенной поддержкой DDB добавьте параметры
+[.programlisting]
+....
+options KDB
+....
+
+[.programlisting]
+....
+options DDB
+....
+
+в ваш конфигурационный файл, и пересоберите. (Подробности о настройке ядра FreeBSD см. в extref:{handbook}[Руководстве FreeBSD]).
+
+После загрузки ядра DDB существует несколько способов войти в него. Первый и самый ранний способ — использовать флаг загрузки `-d`. Ядро запустится в режиме отладки и перейдет в DDB до начала обнаружения любого из устройств. Таким образом, можно отлаживать даже функции обнаружить (probe)/ присоединить (attach) устройств. Для использования этого метода выйдите из меню загрузки загрузчика и введите `boot -d` в командной строке загрузчика.
+
+Второй сценарий — перейти в отладчик после загрузки системы. Есть два простых способа это сделать. Если вы хотите перейти в отладчик из командной строки, просто введите команду:
+
+[source, bash]
+....
+# sysctl debug.kdb.enter=1
+....
+
+В качестве альтернативы, если вы находитесь за системной консолью, можно использовать горячую клавишу на клавиатуре. Стандартной комбинацией для перехода в отладчик является kbd:[Ctrl+Alt+ESC]. В syscons эта последовательность может быть переназначена, и некоторые распространённые раскладки клавиатуры делают это, поэтому убедитесь, что знаете правильную комбинацию. Для последовательных консолей доступна опция, позволяющая использовать сигнал BREAK на линии консоли для входа в DDB (`options BREAK_TO_DEBUGGER` в конфигурационном файле ядра). Это не установлено по умолчанию, так как существует множество последовательных адаптеров, которые излишне генерируют условие BREAK, например, при отключении кабеля.
+
+Третий способ заключается в том, чтобы любое условие паники переходило в DDB, если ядро настроено на его использование. По этой причине не рекомендуется настраивать ядро с DDB для машины, работающей без присмотра.
+
+Для получения неинтерактивной функциональности добавьте:
+
+[.programlisting]
+....
+options KDB_UNATTENDED
+....
+
+в файл конфигурации ядра и пересоберите/переустановите ядро.
+
+Команды DDB примерно напоминают некоторые команды `gdb`. Первое, что вам, вероятно, нужно сделать, это установить точку останова:
+
+[source, bash]
+....
+ break function-name address
+....
+
+Числа по умолчанию интерпретируются как шестнадцатеричные, но чтобы отличить
+их от символьных имен, шестнадцатеричные числа, начинающиеся с букв `a-f`,
+должны предваряться префиксом `0x` (для остальных чисел это
+необязательно). Допускаются простые выражения, например: `function-name +
+0x103`.
+
+Для выхода из отладчика и продолжения выполнения введите:
+
+[source, bash]
+....
+ continue
+....
+
+Для получения трассировки стека текущего потока используйте:
+
+[source, bash]
+....
+ trace
+....
+
+Для получения трассировки стека произвольного потока укажите идентификатор процесса или идентификатор потока в качестве второго аргумента команды `trace`.
+
+Если вы хотите удалить точку останова, используйте
+
+[source, bash]
+....
+ del
+ del address-expression
+....
+
+Первая форма будет принята сразу после срабатывания точки останова и удаляет текущую точку останова. Вторая форма может удалить любую точку останова, но необходимо указать точный адрес; его можно получить из:
+
+[source, bash]
+....
+ show b
+....
+
+или:
+
+[source, bash]
+....
+ show break
+....
+
+Для пошагового выполнения ядра попробуйте:
+
+[source, bash]
+....
+ s
+....
+
+Это позволит войти в функции, но вы можете заставить DDB отслеживать их до достижения соответствующего оператора return с помощью:
+
+[source, bash]
+....
+ n
+....
+
+[NOTE]
+====
+Это отличается от оператора `next` в ``gdb``; это похоже на `finish` в ``gdb``. Нажатие kbd:[n] более одного раза приведёт к продолжению.
+====
+
+Для просмотра данных в памяти используйте (например):
+
+[source, bash]
+....
+ x/wx 0xf0133fe0,40
+ x/hd db_symtab_space
+ x/bc termbuf,10
+ x/s stringbuf
+....
+
+для доступа к словам/полусловам/байтам и отображения в шестнадцатеричном/десятичном/символьном/строковом формате. Число после запятой указывает количество объектов. Для отображения следующих 0x10 элементов просто введите:
+
+[source, bash]
+....
+ x ,10
+....
+
+Аналогично, используйте
+
+[source, bash]
+....
+ x/ia foofunc,10
+....
+
+для дизассемблирования первых 0x10 инструкций функции `foofunc` и их отображения вместе с их смещением от начала `foofunc`.
+
+Для записи в память используйте команду write:
+
+[source, bash]
+....
+ w/b termbuf 0xa 0xb 0
+ w/w 0xf0010030 0 0
+....
+
+Модификатор команды (`b`/`h`/`w`) определяет размер данных для записи, первое следующее выражение — это адрес для записи, а остальное интерпретируется как данные для записи в последующие ячейки памяти.
+
+Если вам необходимо узнать текущее содержимое регистров, введите:
+
+[source, bash]
+....
+ show reg
+....
+
+Также можно отобразить значение одного регистра, например:
+
+[source, bash]
+....
+ p $eax
+....
+
+и изменить его с помощью:
+
+[source, bash]
+....
+ set $eax new-value
+....
+
+Если вам потребуется вызвать некоторые функции ядра из DDB, просто напишите:
+
+[source, bash]
+....
+ call func(arg1, arg2, ...)
+....
+
+Будет выведено возвращаемое значение.
+
+Для вывода информации о всех запущенных процессах в стиле man:ps[1] используйте:
+
+[source, bash]
+....
+ ps
+....
+
+Теперь вы выяснили причину сбоя ядра и хотите выполнить перезагрузку. Помните, что в зависимости от серьезности предыдущего сбоя не все части ядра могут работать корректно. Выполните одно из следующих действий для завершения работы и перезагрузки системы:
+
+[source, bash]
+....
+ panic
+....
+
+Это приведёт к дампу ядра и перезагрузке, чтобы позже можно было проанализировать дамп на более высоком уровне с помощью man:kgdb[1].
+
+[source, bash]
+....
+ call boot(0)
+....
+
+Может быть хорошим способом чисто завершить работу работающей системы, `sync()` все диски и, наконец, в некоторых случаях перезагрузиться. Пока интерфейсы дисков и файловых систем ядра не повреждены, это может быть хорошим способом для почти чистого завершения работы.
+
+[source, bash]
+....
+ reset
+....
+
+Это последний способ избежать катастрофы, и он почти такой же, как нажатие на Большую Красную Кнопку.
+
+Если вам нужна краткая сводка команд, просто введите:
+
+[source, bash]
+....
+ help
+....
+
+Настоятельно рекомендуется иметь распечатанную копию страницы руководства man:ddb[4] для сеанса отладки. Помните, что читать онлайн-руководство во время пошагового выполнения ядра сложно.
+
+[[kerneldebug-online-gdb]]
+== Онлайн-отладка ядра с использованием удаленного GDB
+
+Ядро FreeBSD предоставляет второй бэкенд KDB для отладки в реальном времени: man:gdb[4]. Эта возможность поддерживается с FreeBSD 2.2 и является действительно очень удобной.
+
+GDB давно поддерживает _удалённую отладку_. Это осуществляется с помощью очень простого протокола через последовательное соединение. В отличие от других методов отладки, описанных выше, для этого потребуются две машины. Одна — это хост, предоставляющий среду отладки, включая все исходные тексты и копию бинарного файла ядра со всеми символами. Другая — целевая машина, на которой запущена копия того же самого ядра (возможно, без отладочной информации).
+
+Чтобы использовать удалённый GDB, убедитесь, что следующие параметры присутствуют в конфигурации вашего ядра:
+[.programlisting]
+....
+makeoptions DEBUG=-g
+options KDB
+options GDB
+....
+
+Обратите внимание, что опция `GDB` отключена по умолчанию в ядрах `GENERIC` для веток -STABLE и -RELEASE, но включена в -CURRENT.
+
+После сборки скопируйте ядро на целевую машину и загрузите его. Подключите последовательный порт целевой машины, у которого на устройстве uart установлены флаги "080", к любому последовательному порту отладочной машины. Подробности о настройке флагов на устройстве uart смотрите в man:uart[4].
+
+Целевая машина должна быть переведена в режим отладчика GDB, либо из-за паники, либо путем преднамеренного перехода в отладчик. Перед этим выберите бэкенд отладчика GDB:
+[source, bash]
+....
+# sysctl debug.kdb.current=gdb
+debug.kdb.current: ddb -> gdb
+....
+
+[NOTE]
+====
+Поддерживаемые бэкенды можно вывести с помощью sysctl `debug.kdb.available`. Если конфигурация ядра включает `options DDB`, то man:ddb[4] будет выбран по умолчанию. Если `gdb` не отображается в списке доступных бэкендов, значит, последовательный порт отладки может быть настроен неправильно.
+====
+
+Затем принудительно войдите в отладчик:
+[source, bash]
+....
+# sysctl debug.kdb.enter=1
+debug.kdb.enter: 0KDB: enter: sysctl debug.kdb.enter
+....
+
+Целевая машина теперь ожидает подключения от удалённого клиента GDB. На машине для отладки перейдите в каталог сборки целевого ядра и запустите `gdb`:
+
+[source, bash]
+....
+# cd /usr/obj/usr/src/amd64.amd64/sys/GENERIC/
+# kgdb kernel
+GNU gdb (GDB) 10.2 [GDB v10.2 for FreeBSD]
+Copyright (C) 2021 Free Software Foundation, Inc.
+...
+Reading symbols from kernel...
+Reading symbols from /usr/obj/usr/src/amd64.amd64/sys/GENERIC/kernel.debug...
+(kgdb)
+....
+
+Инициализируйте сеанс удаленной отладки (предполагая, что используется первый последовательный порт) с помощью:
+
+[source, bash]
+....
+(kgdb) target remote /dev/cuau0
+....
+
+Ваш хостинг GDB теперь получит контроль над целевым ядром:
+
+[source, bash]
+....
+Remote debugging using /dev/cuau0
+kdb_enter (why=<optimized out>, msg=<optimized out>) at /usr/src/sys/kern/subr_kdb.c:506
+506 kdb_why = KDB_WHY_UNSET;
+(kgdb)
+....
+
+[TIP]
+====
+В зависимости от используемого компилятора, некоторые локальные переменные могут отображаться как `<optimized out>`, что не позволяет их напрямую исследовать с помощью `gdb`. Если это вызывает проблемы при отладке, можно собрать ядро с пониженным уровнем оптимизации, что может улучшить видимость некоторых переменных. Это можно сделать, передав `COPTFLAGS=-O1` в man:make[1]. Однако определённые классы ошибок в ядре могут проявляться иначе (или вообще не проявляться) при изменении уровня оптимизации.
+====
+
+Вы можете использовать этот сеанс почти как любой другой сеанс GDB, включая полный доступ к исходному коду, запуск в режиме gud (Grand Unified Debugger) внутри окна Emacs (что дает автоматическое отображение исходного кода в другом окне Emacs) и т.д.
+
+[[kerneldebug-console]]
+== Отладка драйвера консоли
+
+Поскольку для работы DDB требуется драйвер консоли, ситуация усложняется, если сам драйвер консоли неисправен. Возможно, вы вспомните о возможности использования последовательной консоли (либо с модифицированными загрузочными блоками, либо указав `-h` в строке `Boot:`), подключив стандартный терминал к первому последовательному порту. DDB работает с любым настроенным драйвером консоли, включая последовательную консоль.
+
+[[kerneldebug-deadlocks]]
+== Отладка взаимоблокировок
+
+Вы можете столкнуться с так называемыми взаимоблокировками — ситуацией, когда система перестает выполнять полезную работу. Чтобы предоставить полезный отчет об ошибке в такой ситуации, используйте man:ddb[4], как описано в предыдущем разделе. Включите в отчет вывод команд `ps` и `trace` для подозрительных процессов.
+
+Если возможно, рассмотрите проведение дополнительного исследования. Приведенный ниже рецепт особенно полезен, если вы подозреваете, что взаимная блокировка происходит на уровне VFS. Добавьте следующие параметры в файл конфигурации ядра.
+
+[.programlisting]
+....
+makeoptions DEBUG=-g
+options INVARIANTS
+options INVARIANT_SUPPORT
+options WITNESS
+options WITNESS_SKIPSPIN
+options DEBUG_LOCKS
+options DEBUG_VFS_LOCKS
+options DIAGNOSTIC
+....
+
+При возникновении взаимоблокировки, помимо вывода команды `ps`, предоставьте информацию из `show pcpu`, `show allpcpu`, `show locks`, `show alllocks`, `show lockedvnods` и `alltrace`.
+
+Для получения осмысленных трассировок стека для потоковых процессов используйте `thread thread-id` для переключения на стек потока и выполните трассировку с помощью `where`.
+
+[[kerneldebug-dcons]]
+== Отладка ядра с помощью Dcons
+
+man:dcons[4] — это очень простой драйвер консоли, который не связан напрямую с какими-либо физическими устройствами. Он просто читает и записывает символы из буфера в ядре или загрузчике и обратно. Благодаря своей простоте он очень полезен для отладки ядра, особенно с устройством FireWire(R). В настоящее время FreeBSD предоставляет два способа взаимодействия с буфером извне ядра с помощью man:dconschat[8].
+
+=== Dcons через FireWire(R)
+
+Большинство контроллеров FireWire(R) (IEEE1394) основаны на спецификации OHCI, которая поддерживает физический доступ к памяти хоста. Это означает, что после инициализации контроллера хоста мы можем получить доступ к памяти хоста без помощи программного обеспечения (ядра). Мы можем использовать эту возможность для взаимодействия с man:dcons[4]. man:dcons[4] предоставляет функциональность, аналогичную последовательной консоли. Он эмулирует два последовательных порта: один для консоли и DDB, другой для GDB. Поскольку удалённый доступ к памяти полностью обрабатывается аппаратным обеспечением, буфер man:dcons[4] остаётся доступным даже при крахе системы.
+
+Устройства FireWire(R) не только встраиваются в материнские платы. Для настольных компьютеров существуют PCI-карты, а для ноутбуков можно приобрести интерфейс CardBus.
+
+==== Включение поддержки FireWire(R) и Dcons на целевой машине
+
+Чтобы включить поддержку FireWire(R) и Dcons в ядре _целевой машины_:
+
+* Убедитесь, что ваше ядро поддерживает `dcons`, `dcons_crom` и `firewire`. `Dcons` должен быть статически связан с ядром. Для `dcons_crom` и `firewire` модули должны подойти.
+* Убедитесь, что физический DMA включен. Возможно, потребуется добавить `hw.firewire.phydma_enable=1` в [.filename]#/boot/loader.conf#.
+* Добавьте параметры для отладки.
+* Добавьте `dcons_gdb=1` в [.filename]#/boot/loader.conf#, если вы используете GDB через FireWire(R).
+* Включите `dcons` в [.filename]#/etc/ttys#.
+* Это необязательно: чтобы принудительно сделать `dcons` высокоуровневой консолью, добавьте `hw.firewire.dcons_crom.force_console=1` в [.filename]#loader.conf#.
+
+Чтобы включить поддержку FireWire(R) и Dcons в man:loader[8] на i386 или amd64:
+
+Добавьте `LOADER_FIREWIRE_SUPPORT=YES` в [.filename]#/etc/make.conf# и пересоберите man:loader[8]:
+
+[source, bash]
+....
+# cd /sys/boot/i386 && make clean && make && make install
+....
+
+Чтобы включить man:dcons[4] в качестве активной низкоуровневой консоли, добавьте `boot_multicons="YES"` в [.filename]#/boot/loader.conf#.
+
+Вот несколько примеров конфигурации. Образец файла конфигурации ядра может содержать:
+
+[source, bash]
+....
+device dcons
+device dcons_crom
+options KDB
+options DDB
+options GDB
+options ALT_BREAK_TO_DEBUGGER
+....
+
+И образец [.filename]#/boot/loader.conf# может содержать:
+
+[source, bash]
+....
+dcons_crom_load="YES"
+dcons_gdb=1
+boot_multicons="YES"
+hw.firewire.phydma_enable=1
+hw.firewire.dcons_crom.force_console=1
+....
+
+==== Включение поддержки FireWire(R) и Dcons на главной машине
+
+Чтобы включить поддержку FireWire(R) в ядре на _основной машине_:
+
+[source, bash]
+....
+# kldload firewire
+....
+
+Определите EUI64 (уникальный 64-битный идентификатор) контроллера FireWire(R) и используйте man:fwcontrol[8] или `dmesg`, чтобы найти EUI64 целевой машины.
+
+Запустите man:dconschat[8], с:
+
+[source, bash]
+....
+# dconschat -e \# -br -G 12345 -t 00-11-22-33-44-55-66-77
+....
+
+Следующие комбинации клавиш могут быть использованы после запуска man:dconschat[8]:
+
+[.informaltable]
+[cols="1,1"]
+|===
+
+|kbd:[~+.]
+|Отсоединиться
+
+|kbd:[~]
+|ALT BREAK
+
+|kbd:[~]
+|ПЕРЕЗАГРУЗИТЬ (RESET) целевую машину
+
+|kbd:[~]
+|Приостановить dconschat
+|===
+
+Присоедините удаленный GDB, запустив man:kgdb[1] с сеансом удаленной отладки:
+
+[source, bash]
+....
+ kgdb -r :12345 kernel
+....
+
+==== Некоторые общие рекомендации
+
+Вот несколько общих советов:
+
+Чтобы в полной мере использовать скорость FireWire(R), отключите другие медленные драйверы консоли:
+
+[source, bash]
+....
+# conscontrol delete ttyd0 # serial console
+# conscontrol delete consolectl # video/keyboard
+....
+
+Существует режим GDB для man:emacs[1]; вот что нужно добавить в ваш [.filename]#.emacs#:
+
+[source, bash]
+....
+(setq gud-gdba-command-name "kgdb -a -a -a -r :12345")
+(setq gdb-many-windows t)
+(xterm-mouse-mode 1)
+M-x gdba
+....
+
+=== Dcons с KVM
+
+Мы можем напрямую читать буфер man:dcons[4] через [.filename]#/dev/mem# для работающих систем и в дампе памяти для систем после аварии. Это даёт аналогичный вывод команде `dmesg -a`, но буфер man:dcons[4] содержит больше информации.
+
+==== Использование Dcons с KVM
+
+Для использования man:dcons[4] с KVM:
+
+Дамп буфера man:dcons[4] работающей системы:
+
+[source, bash]
+....
+# dconschat -1
+....
+
+Дамп буфера man:dcons[4] аварийного дампа:
+
+[source, bash]
+....
+# dconschat -1 -M vmcore.XX
+....
+
+Отладка ядра в реальном времени может быть выполнена через:
+
+[source, bash]
+....
+# fwcontrol -m target_eui64
+# kgdb kernel /dev/fwmem0.2
+....
+
+[[kerneldebug-options]]
+== Глоссарий параметров ядра для отладки
+
+В этом разделе представлен краткий глоссарий параметров ядра, указываемых при компиляции и относящихся к отладке:
+
+* `options KDB`: включает фреймворк отладки ядра. Необходим для `options DDB` и `options GDB`. Практически не влияет на производительность. По умолчанию отладчик будет запущен при панике вместо автоматической перезагрузки.
+* `options KDB_UNATTENDED`: изменяет значение по умолчанию системной настройки `debug.debugger_on_panic` на 0, что управляет входом в отладчик при панике. Если `options KDB` не вкомпилировано в ядро, поведение по умолчанию — автоматическая перезагрузка при панике; если оно вкомпилировано в ядро, поведение по умолчанию — переход в отладчик, если не вкомпилирована опция `options KDB_UNATTENDED`. Если вы хотите оставить отладчик ядра вкомпилированным в ядро, но желаете, чтобы система перезагружалась, пока вы не готовы использовать отладчик для диагностики, используйте эту опцию.
+* `options KDB_TRACE`: изменяет значение по умолчанию системной настройки `debug.trace_on_panic` на 1, что управляет автоматическим выводом трассировки стека при панике. Особенно полезно при использовании с `options KDB_UNATTENDED`, так как позволяет собрать базовую отладочную информацию на последовательной консоли или консоли FireWire, продолжая перезагрузку для восстановления.
+* `options DDB`: включает поддержку консольного отладчика DDB. Этот интерактивный отладчик работает на активной низкоуровневой консоли системы, включая видеоконсоль, последовательную консоль или консоль FireWire. Он предоставляет базовые встроенные средства отладки, такие как трассировка стека, список процессов и потоков, вывод состояния блокировок, состояния виртуальной памяти, состояния файловой системы и управления ядром памяти. DDB не требует работы программного обеспечения на второй машине или возможности создания дампа памяти или полных символов отладки ядра, а также предоставляет детальную диагностику ядра во время выполнения. Многие ошибки могут быть полностью диагностированы с использованием только вывода DDB. Эта опция зависит от `options KDB`.
+* `options GDB`: включает поддержку удалённого отладчика GDB, который может работать через последовательный кабель или FireWire. При входе в отладчик можно подключить GDB для проверки содержимого структур, генерации трассировки стека и т.д. Некоторые состояния ядра сложнее исследовать, чем в DDB, который способен автоматически создавать полезные сводки состояния ядра, например, автоматически обходить структуры отладки блокировок или управления памятью ядра, но для этого требуется вторая машина с запущенным отладчиком. С другой стороны, GDB объединяет информацию из исходного кода ядра и полных отладочных символов, знает полные определения структур данных, локальные переменные и поддерживает написание скриптов. Эта опция не требуется для запуска GDB на дампе памяти ядра. Данная опция зависит от `options KDB`.
+* `options BREAK_TO_DEBUGGER`, `options ALT_BREAK_TO_DEBUGGER`: позволяют сигналу прерывания или альтернативному сигналу на консоли войти в отладчик. Если система зависает без паники, это полезный способ попасть в отладчик. Из-за текущей блокировки ядра сигнал прерывания, сгенерированный на последовательной консоли, значительно надежнее для входа в отладчик и обычно рекомендуется. Данная опция оказывает незначительное или нулевое влияние на производительность.
+* `options INVARIANTS`: включает в ядро большое количество проверок и тестов во время выполнения, которые постоянно проверяют целостность структур данных ядра и инварианты алгоритмов ядра. Эти тесты могут быть затратными, поэтому по умолчанию не включены, но они помогают обеспечить полезное поведение "fail stop", при котором определённые классы нежелательного поведения попадают в отладчик до возникновения повреждения данных ядра, что упрощает их отладку. Тесты включают в себя очистку памяти и проверку использования после освобождения, что является одним из наиболее значимых источников накладных расходов. Эта опция зависит от `options INVARIANT_SUPPORT`.
+* `options INVARIANT_SUPPORT`: многие тесты, присутствующие в `options INVARIANTS`, требуют модифицированных структур данных или определения дополнительных символов ядра.
+* `options WITNESS`: эта опция включает отслеживание и проверку порядка блокировок во время выполнения, что является неоценимым инструментом для диагностики взаимоблокировок. WITNESS поддерживает граф полученных порядков блокировок по типам блокировок и проверяет граф на каждом получении на наличие циклов (явных или неявных). Если цикл обнаружен, на консоль выводится предупреждение и трассировка стека, указывающие на возможное возникновение взаимоблокировки. WITNESS необходим для использования команд DDB `show locks`, `show witness` и `show alllocks`. Эта отладочная опция создает значительную нагрузку на производительность, которую можно несколько уменьшить с помощью `options WITNESS_SKIPSPIN`. Подробная документация доступна в man:witness[4].
+* `options WITNESS_SKIPSPIN`: отключает проверку порядка блокировки spinlock во время выполнения с WITNESS. Поскольку spin-блокировки чаще всего захватываются в планировщике, а события планировщика происходят часто, эта опция может значительно ускорить системы, работающие с WITNESS. Эта опция зависит от `options WITNESS`.
+* `options WITNESS_KDB`: изменяет значение по умолчанию системной настройки `debug.witness.kdb` на 1, что приводит к входу в отладчик при обнаружении нарушения порядка блокировок вместо простого вывода предупреждения. Эта опция зависит от `options WITNESS`.
+* `options SOCKBUF_DEBUG`: выполнять расширенную проверку согласованности сокетных буферов во время выполнения, что может быть полезно для отладки как ошибок в сокетах, так и состояний гонки в протоколах и драйверах устройств, взаимодействующих с сокетами. Данная опция значительно влияет на производительность сети и может изменить временные параметры в состояниях гонки драйверов устройств.
+* `options DEBUG_VFS_LOCKS`: отслеживает точки получения блокировок для lockmgr/vnode, расширяя объем информации, отображаемой командой `show lockedvnods` в DDB. Данная опция оказывает заметное влияние на производительность.
+* `options DEBUG_MEMGUARD`: замена для man:malloc[9], аллокатор памяти ядра, который использует систему VM для обнаружения чтения или записи в освобождённую память. Подробности можно найти в man:memguard[9]. Данная опция значительно влияет на производительность, но может быть очень полезна при отладке ошибок повреждения памяти ядра.
+* `options DIAGNOSTIC`: включает дополнительные, более затратные диагностические тесты, аналогичные `options INVARIANTS`.
+* `options KASAN`: включает отладчик адресов ядра (Kernel Address Sanitizer). Это включает инструментирование компилятора, которое может использоваться для обнаружения недопустимых обращений к памяти в ядре, таких как использование после освобождения и переполнение буфера. В значительной степени заменяет `options DEBUG_MEMGUARD`. Подробности и список поддерживаемых платформ см. в man:kasan[9].
+* `options KMSAN`: включить отладчик использования памяти ядра (Kernel Memory Sanitizer). Это включает инструментирование компилятора, которое может использоваться для обнаружения использования неинициализированной памяти. Подробности и список поддерживаемых платформ см. в man:kmsan[9].
diff --git a/documentation/content/ru/books/developers-handbook/kerneldebug/_index.po b/documentation/content/ru/books/developers-handbook/kerneldebug/_index.po
new file mode 100644
index 0000000000..dd46c18a3c
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/kerneldebug/_index.po
@@ -0,0 +1,2243 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookkerneldebug_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:1
+#, no-wrap
+msgid "FreeBSD Kernel Debugging"
+msgstr "Отладка ядра FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:1
+#, no-wrap
+msgid "Chapter 10. Kernel Debugging"
+msgstr "Глава 10. Отладка ядра"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:18
+#, no-wrap
+msgid "Kernel Debugging"
+msgstr "Отладка ядра"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:56
+#, no-wrap
+msgid "Obtaining a Kernel Crash Dump"
+msgstr "Получение аварийного дампа ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:61
+msgid ""
+"When running a development kernel (e.g., FreeBSD-CURRENT), such as a kernel "
+"under extreme conditions (e.g., very high load averages, tens of thousands "
+"of connections, exceedingly high number of concurrent users, hundreds of "
+"man:jail[8]s, etc.), or using a new feature or device driver on FreeBSD-"
+"STABLE (e.g., PAE), sometimes a kernel will panic. In the event that it "
+"does, this chapter will demonstrate how to extract useful information out of "
+"a crash."
+msgstr ""
+"При работе с разрабатываемым ядром (например, FreeBSD-CURRENT), особенно в "
+"экстремальных условиях (например, при очень высокой загрузке, десятках тысяч "
+"соединений, чрезвычайно большом количестве одновременных пользователей, "
+"сотнях man:jail[8] и т.д.), или при использовании новой функции или драйвера "
+"устройства в FreeBSD-STABLE (например, PAE), иногда может возникнуть паника "
+"ядра. В случае, если это произойдет, данная глава покажет, как извлечь "
+"полезную информацию из аварийного дампа."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:66
+msgid ""
+"A system reboot is inevitable once a kernel panics. Once a system is "
+"rebooted, the contents of a system's physical memory (RAM) is lost, as well "
+"as any bits that are on the swap device before the panic. To preserve the "
+"bits in physical memory, the kernel makes use of the swap device as a "
+"temporary place to store the bits that are in RAM across a reboot after a "
+"crash. In doing this, when FreeBSD boots after a crash, a kernel image can "
+"now be extracted and debugging can take place."
+msgstr ""
+"Перезагрузка системы неизбежна после паники ядра. После перезагрузки системы "
+"содержимое физической памяти (RAM) теряется, как и любые данные на "
+"устройстве подкачки перед паникой. Чтобы сохранить данные в физической "
+"памяти, ядро использует устройство подкачки как временное хранилище для "
+"данных из RAM после сбоя и перезагрузки. Благодаря этому, когда FreeBSD "
+"загружается после сбоя, образ ядра может быть извлечен и проведена отладка."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:72
+msgid ""
+"A swap device that has been configured as a dump device still acts as a swap "
+"device. Dumps to non-swap devices (such as tapes or CDRWs, for example) are "
+"not supported at this time. A \"swap device\" is synonymous with a \"swap "
+"partition.\""
+msgstr ""
+"Устройство подкачки, настроенное как устройство для дампа, продолжает "
+"функционировать как устройство подкачки. В настоящее время дампы на "
+"устройства, не являющиеся устройствами подкачки (например, на ленты или "
+"CDRW), не поддерживаются. Термин \"устройство подкачки\" является синонимом "
+"термина \"раздел подкачки\"."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:75
+msgid "Several types of kernel crash dumps are available:"
+msgstr "Есть несколько типов аварийных дампов ядра:"
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:76
+#, no-wrap
+msgid "Full memory dumps"
+msgstr "Полные дампы памяти"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:78
+msgid "Hold the complete contents of physical memory."
+msgstr "Содержат полное содержимое физической памяти."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:79
+#, no-wrap
+msgid "Minidumps"
+msgstr "Минидампы"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:81
+msgid "Hold only memory pages in use by the kernel (FreeBSD 6.2 and higher)."
+msgstr ""
+"Содержат только страницы памяти, используемые ядром (FreeBSD 6.2 и выше)."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:82
+#, no-wrap
+msgid "Textdumps"
+msgstr "Текстовые дампы"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:84
+msgid ""
+"Hold captured, scripted, or interactive debugger output (FreeBSD 7.1 and "
+"higher)."
+msgstr ""
+"Содержать захваченные, записанные или интерактивные выходные данные "
+"отладчика (FreeBSD 7.1 и выше)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:86
+msgid ""
+"Minidumps are the default dump type as of FreeBSD 7.0, and in most cases "
+"will capture all necessary information present in a full memory dump, as "
+"most problems can be isolated only using kernel state."
+msgstr ""
+"Минидампы являются типом дампа по умолчанию, начиная с FreeBSD 7.0, и в "
+"большинстве случаев они сохраняют всю необходимую информацию, присутствующую "
+"в полном дампе памяти, так как большинство проблем можно изолировать, "
+"используя только состояние ядра."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:88
+#, no-wrap
+msgid "Configuring the Dump Device"
+msgstr "Настройка устройства дампа"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:96
+msgid ""
+"Before the kernel will dump the contents of its physical memory to a dump "
+"device, a dump device must be configured. A dump device is specified by "
+"using the man:dumpon[8] command to tell the kernel where to save kernel "
+"crash dumps. The man:dumpon[8] program must be called after the swap "
+"partition has been configured with man:swapon[8]. This is normally handled "
+"by setting the `dumpdev` variable in man:rc.conf[5] to the path of the swap "
+"device (the recommended way to extract a kernel dump) or `AUTO` to use the "
+"first configured swap device. The default for `dumpdev` is `AUTO` in HEAD, "
+"and changed to `NO` on RELENG_* branches (except for RELENG_7, which was "
+"left set to `AUTO`). On FreeBSD 9.0-RELEASE and later versions, bsdinstall "
+"will ask whether crash dumps should be enabled on the target system during "
+"the install process."
+msgstr ""
+"Прежде чем ядро запишет содержимое своей физической памяти на устройство "
+"дампа, необходимо настроить это устройство. Устройство дампа указывается с "
+"помощью команды man:dumpon[8], чтобы сообщить ядру, куда сохранять аварийные "
+"дампы. Программа man:dumpon[8] должна быть вызвана после настройки раздела "
+"подкачки с помощью man:swapon[8]. Обычно это обрабатывается установкой "
+"переменной `dumpdev` в man:rc.conf[5] в путь к устройству подкачки "
+"(рекомендуемый способ извлечения дампа ядра) или в значение `AUTO` для "
+"использования первого настроенного устройства подкачки. По умолчанию "
+"`dumpdev` имеет значение `AUTO` в HEAD и изменено на `NO` в ветках RELENG_* "
+"(за исключением RELENG_7, где оставлено значение `AUTO`). Начиная с FreeBSD "
+"9.0-RELEASE и более поздних версий, bsdinstall будет спрашивать, следует ли "
+"включить аварийные дампы на целевой системе во время процесса установки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:100
+msgid ""
+"Check [.filename]#/etc/fstab# or man:swapinfo[8] for a list of swap devices."
+msgstr ""
+"Проверьте [.filename]#/etc/fstab# или man:swapinfo[8] для получения списка "
+"устройств подкачки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:105
+msgid ""
+"Make sure the `dumpdir` specified in man:rc.conf[5] exists before a kernel "
+"crash!"
+msgstr ""
+"Убедитесь, что каталог `dumpdir`, указанный в man:rc.conf[5], существует "
+"перед аварией ядра!"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:110
+#, no-wrap
+msgid ""
+"# mkdir /var/crash\n"
+"# chmod 700 /var/crash\n"
+msgstr ""
+"# mkdir /var/crash\n"
+"# chmod 700 /var/crash\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:113
+msgid ""
+"Also, remember that the contents of [.filename]#/var/crash# is sensitive and "
+"very likely contains confidential information such as passwords."
+msgstr ""
+"Также помните, что содержимое [.filename]#/var/crash# является "
+"конфиденциальным и, скорее всего, содержит секретную информацию, такую как "
+"пароли."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:116
+#, no-wrap
+msgid "Extracting a Kernel Dump"
+msgstr "Извлечение дампа ядра"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:122
+msgid ""
+"Once a dump has been written to a dump device, the dump must be extracted "
+"before the swap device is mounted. To extract a dump from a dump device, "
+"use the man:savecore[8] program. If `dumpdev` has been set in "
+"man:rc.conf[5], man:savecore[8] will be called automatically on the first "
+"multi-user boot after the crash and before the swap device is mounted. The "
+"location of the extracted core is placed in the man:rc.conf[5] value "
+"`dumpdir`, by default [.filename]#/var/crash# and will be named "
+"[.filename]#vmcore.0#."
+msgstr ""
+"После записи дампа на устройство дампа, дамп должен быть извлечен до "
+"монтирования устройства подкачки. Для извлечения дампа с устройства дампа "
+"используйте программу man:savecore[8]. Если в man:rc.conf[5] установлен "
+"параметр `dumpdev`, man:savecore[8] будет автоматически вызван при первой "
+"загрузке в многопользовательском режиме после сбоя и до монтирования "
+"устройства подкачки. Расположение извлеченного ядра указывается в параметре "
+"`dumpdir` файла man:rc.conf[5], по умолчанию это [.filename]#/var/crash#, а "
+"имя файла будет [.filename]#vmcore.0#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:126
+msgid ""
+"In the event that there is already a file called [.filename]#vmcore.0# in "
+"[.filename]#/var/crash# (or whatever `dumpdir` is set to), the kernel will "
+"increment the trailing number for every crash to avoid overwriting an "
+"existing [.filename]#vmcore# (e.g., [.filename]#vmcore.1#). man:savecore[8] "
+"will always create a symbolic link to named [.filename]#vmcore.last# in "
+"[.filename]#/var/crash# after a dump is saved. This symbolic link can be "
+"used to locate the name of the most recent dump."
+msgstr ""
+"В случае, если файл с именем [.filename]#vmcore.0# уже существует в "
+"[.filename]#/var/crash# (или в каталоге, указанном в параметре `dumpdir`), "
+"ядро будет увеличивать завершающее число при каждом сбое, чтобы избежать "
+"перезаписи существующего файла [.filename]#vmcore# (например, "
+"[.filename]#vmcore.1#). man:savecore[8] всегда создает символическую ссылку "
+"с именем [.filename]#vmcore.last# в [.filename]#/var/crash# после сохранения "
+"дампа. Эта символическая ссылка может быть использована для определения "
+"имени последнего дампа."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:130
+msgid ""
+"The man:crashinfo[8] utility generates a text file containing a summary of "
+"information from a full memory dump or minidump. If `dumpdev` has been set "
+"in man:rc.conf[5], man:crashinfo[8] will be invoked automatically after "
+"man:savecore[8]. The output is saved to a file in `dumpdir` named "
+"[.filename]#core.txt.N#."
+msgstr ""
+"Утилита man:crashinfo[8] создаёт текстовый файл, содержащий сводную "
+"информацию из полного дампа памяти или минидампа. Если параметр `dumpdev` "
+"установлен в man:rc.conf[5], man:crashinfo[8] будет автоматически вызван "
+"после man:savecore[8]. Результат сохраняется в файл с именем "
+"[.filename]#core.txt.N# в директории `dumpdir`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:135
+msgid ""
+"If you are testing a new kernel but need to boot a different one in order to "
+"get your system up and running again, boot it only into single user mode "
+"using the `-s` flag at the boot prompt, and then perform the following steps:"
+msgstr ""
+"Если вы тестируете новое ядро, но вам нужно загрузить другое, чтобы снова "
+"запустить систему, загрузите его только в однопользовательском режиме, "
+"используя флаг `-s` при загрузке, а затем выполните следующие шаги:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:142
+#, no-wrap
+msgid ""
+"# fsck -p\n"
+"# mount -a -t ufs # make sure /var/crash is writable\n"
+"# savecore /var/crash /dev/ad0s1b\n"
+"# exit # exit to multi-user\n"
+msgstr ""
+"# fsck -p\n"
+"# mount -a -t ufs # make sure /var/crash is writable\n"
+"# savecore /var/crash /dev/ad0s1b\n"
+"# exit # exit to multi-user\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:147
+msgid ""
+"This instructs man:savecore[8] to extract a kernel dump from [.filename]#/"
+"dev/ad0s1b# and place the contents in [.filename]#/var/crash#. Do not "
+"forget to make sure the destination directory [.filename]#/var/crash# has "
+"enough space for the dump. Also, do not forget to specify the correct path "
+"to your swap device as it is likely different than [.filename]#/dev/ad0s1b#!"
+msgstr ""
+"Это указывает man:savecore[8] извлечь дамп ядра из [.filename]#/dev/ad0s1b# "
+"и поместить содержимое в [.filename]#/var/crash#. Не забудьте убедиться, что "
+"целевой каталог [.filename]#/var/crash# имеет достаточно места для дампа. "
+"Также не забудьте указать правильный путь к вашему swap-устройству, так как "
+"он, скорее всего, отличается от [.filename]#/dev/ad0s1b#!"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:149
+#, no-wrap
+msgid "Testing Kernel Dump Configuration"
+msgstr "Тестирование конфигурации дампа ядра"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:154
+msgid ""
+"The kernel includes a man:sysctl[8] node that requests a kernel panic. This "
+"can be used to verify that your system is properly configured to save kernel "
+"crash dumps. You may wish to remount existing file systems as read-only in "
+"single user mode before triggering the crash to avoid data loss."
+msgstr ""
+"Ядро включает узел man:sysctl[8], который вызывает панику ядра. Это можно "
+"использовать для проверки того, что ваша система правильно настроена для "
+"сохранения дампов аварийного завершения работы ядра. Возможно, вы захотите "
+"перемонтировать существующие файловые системы в режиме только для чтения в "
+"однопользовательском режиме перед тем, как вызвать панику, чтобы избежать "
+"потери данных."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:164
+#, no-wrap
+msgid ""
+"# shutdown now\n"
+"...\n"
+"Enter full pathname of shell or RETURN for /bin/sh:\n"
+"# mount -a -u -r\n"
+"# sysctl debug.kdb.panic=1\n"
+"debug.kdb.panic:panic: kdb_sysctl_panic\n"
+"...\n"
+msgstr ""
+"# shutdown now\n"
+"...\n"
+"Enter full pathname of shell or RETURN for /bin/sh:\n"
+"# mount -a -u -r\n"
+"# sysctl debug.kdb.panic=1\n"
+"debug.kdb.panic:panic: kdb_sysctl_panic\n"
+"...\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:167
+msgid ""
+"After rebooting, your system should save a dump in [.filename]#/var/crash# "
+"along with a matching summary from man:crashinfo[8]."
+msgstr ""
+"После перезагрузки система должна сохранить дамп в [.filename]#/var/crash# "
+"вместе с соответствующим отчетом из man:crashinfo[8]."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:169
+#, no-wrap
+msgid "Debugging a Kernel Crash Dump with `kgdb`"
+msgstr "Отладка аварийного дампа ядра с помощью `kgdb`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:176
+msgid ""
+"This section covers man:kgdb[1]. The latest version is included in the "
+"package:devel/gdb[]. An older version is also present in FreeBSD 11 and "
+"earlier."
+msgstr ""
+"Этот раздел посвящен man:kgdb[1]. Последняя версия включена в пакет "
+"package:devel/gdb[]. Более старая версия также присутствует в FreeBSD 11 и "
+"более ранних версиях."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:179
+msgid ""
+"To enter into the debugger and begin getting information from the dump, "
+"start kgdb:"
+msgstr ""
+"Чтобы войти в отладчик и начать получение информации из дампа, запустите "
+"kgdb:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:183
+#, no-wrap
+msgid "# kgdb -n N\n"
+msgstr "# kgdb -n N\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:187
+msgid ""
+"Where _N_ is the suffix of the [.filename]#vmcore.N# to examine. To open "
+"the most recent dump use:"
+msgstr ""
+"Где _N_ — это суффикс файла [.filename]#vmcore.N#, который нужно изучить. "
+"Чтобы открыть последний дамп, используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:191
+#, no-wrap
+msgid "# kgdb -n last\n"
+msgstr "# kgdb -n last\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:195
+msgid ""
+"Normally, man:kgdb[1] should be able to locate the kernel running at the "
+"time the dump was generated. If it is not able to locate the correct "
+"kernel, pass the pathname of the kernel and dump as two arguments to kgdb:"
+msgstr ""
+"Обычно man:kgdb[1] должен быть способен найти ядро, работавшее в момент "
+"создания дампа. Если он не может найти нужное ядро, передайте путь к ядру и "
+"дампу в качестве двух аргументов для kgdb:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:199
+#, no-wrap
+msgid "# kgdb /boot/kernel/kernel /var/crash/vmcore.0\n"
+msgstr "# kgdb /boot/kernel/kernel /var/crash/vmcore.0\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:202
+msgid ""
+"You can debug the crash dump using the kernel sources just like you can for "
+"any other program."
+msgstr ""
+"Вы можете отлаживать дамп аварийного завершения, используя исходные коды "
+"ядра, так же, как и для любой другой программы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:209
+msgid ""
+"This dump is from a 5.2-BETA kernel and the crash comes from deep within the "
+"kernel. The output below has been modified to include line numbers on the "
+"left. This first trace inspects the instruction pointer and obtains a back "
+"trace. The address that is used on line 41 for the `list` command is the "
+"instruction pointer and can be found on line 17. Most developers will "
+"request having at least this information sent to them if you are unable to "
+"debug the problem yourself. If, however, you do solve the problem, make "
+"sure that your patch winds its way into the source tree via a problem "
+"report, mailing lists, or by being able to commit it!"
+msgstr ""
+"Этот дамп получен из ядра версии 5.2-BETA, а крах произошел глубоко внутри "
+"ядра. Приведенный ниже вывод был изменен для добавления номеров строк слева. "
+"Первый трассировочный вывод проверяет указатель инструкции и получает "
+"обратную трассировку. Адрес, используемый в строке 41 для команды `list`, "
+"является указателем инструкции и может быть найден в строке 17. Большинство "
+"разработчиков запросят как минимум эту информацию, если вы не сможете "
+"отладить проблему самостоятельно. Однако, если вы решите проблему, "
+"убедитесь, что ваш патч попадет в дерево исходников через отчет о проблеме, "
+"списки рассылки, или, может быть, у вас есть возможность его закоммитить!"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:302
+#, no-wrap
+msgid ""
+" 1:# cd /usr/obj/usr/src/sys/KERNCONF\n"
+" 2:# kgdb kernel.debug /var/crash/vmcore.0\n"
+" 3:GNU gdb 5.2.1 (FreeBSD)\n"
+" 4:Copyright 2002 Free Software Foundation, Inc.\n"
+" 5:GDB is free software, covered by the GNU General Public License, and you are\n"
+" 6:welcome to change it and/or distribute copies of it under certain conditions.\n"
+" 7:Type \"show copying\" to see the conditions.\n"
+" 8:There is absolutely no warranty for GDB. Type \"show warranty\" for details.\n"
+" 9:This GDB was configured as \"i386-undermydesk-freebsd\"...\n"
+"10:panic: page fault\n"
+"11:panic messages:\n"
+"12:---\n"
+"13:Fatal trap 12: page fault while in kernel mode\n"
+"14:cpuid = 0; apic id = 00\n"
+"15:fault virtual address = 0x300\n"
+"16:fault code: = supervisor read, page not present\n"
+"17:instruction pointer = 0x8:0xc0713860\n"
+"18:stack pointer = 0x10:0xdc1d0b70\n"
+"19:frame pointer = 0x10:0xdc1d0b7c\n"
+"20:code segment = base 0x0, limit 0xfffff, type 0x1b\n"
+"21: = DPL 0, pres 1, def32 1, gran 1\n"
+"22:processor eflags = resume, IOPL = 0\n"
+"23:current process = 14394 (uname)\n"
+"24:trap number = 12\n"
+"25:panic: page fault\n"
+"26 cpuid = 0;\n"
+"27:Stack backtrace:\n"
+"28\n"
+"29:syncing disks, buffers remaining... 2199 2199 panic: mi_switch: switch in a critical section\n"
+"30:cpuid = 0;\n"
+"31:Uptime: 2h43m19s\n"
+"32:Dumping 255 MB\n"
+"33: 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240\n"
+"34:---\n"
+"35:Reading symbols from /boot/kernel/snd_maestro3.ko...done.\n"
+"36:Loaded symbols for /boot/kernel/snd_maestro3.ko\n"
+"37:Reading symbols from /boot/kernel/snd_pcm.ko...done.\n"
+"38:Loaded symbols for /boot/kernel/snd_pcm.ko\n"
+"39:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240\n"
+"40:240 dumping++;\n"
+"41:(kgdb) list *0xc0713860\n"
+"42:0xc0713860 is in lapic_ipi_wait (/usr/src/sys/i386/i386/local_apic.c:663).\n"
+"43:658 incr = 0;\n"
+"44:659 delay = 1;\n"
+"45:660 } else\n"
+"46:661 incr = 1;\n"
+"47:662 for (x = 0; x < delay; x += incr) {\n"
+"48:663 if ((lapic->icr_lo & APIC_DELSTAT_MASK) == APIC_DELSTAT_IDLE)\n"
+"49:664 return (1);\n"
+"50:665 ia32_pause();\n"
+"51:666 }\n"
+"52:667 return (0);\n"
+"53:(kgdb) backtrace\n"
+"54:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240\n"
+"55:#1 0xc055fd9b in boot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:372\n"
+"56:#2 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550\n"
+"57:#3 0xc0567ef5 in mi_switch () at /usr/src/sys/kern/kern_synch.c:470\n"
+"58:#4 0xc055fa87 in boot (howto=256) at /usr/src/sys/kern/kern_shutdown.c:312\n"
+"59:#5 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550\n"
+"60:#6 0xc0720c66 in trap_fatal (frame=0xdc1d0b30, eva=0)\n"
+"61: at /usr/src/sys/i386/i386/trap.c:821\n"
+"62:#7 0xc07202b3 in trap (frame=\n"
+"63: {tf_fs = -1065484264, tf_es = -1065484272, tf_ds = -1065484272, tf_edi = 1, tf_esi = 0, tf_ebp = -602076292, tf_isp = -602076324, tf_ebx = 0, tf_edx = 0, tf_ecx = 1000000, tf_eax = 243, tf_trapno = 12, tf_err = 0, tf_eip = -1066321824, tf_cs = 8, tf_eflags = 65671, tf_esp = 243, tf_ss = 0})\n"
+"64: at /usr/src/sys/i386/i386/trap.c:250\n"
+"65:#8 0xc070c9f8 in calltrap () at {standard input}:94\n"
+"66:#9 0xc07139f3 in lapic_ipi_vectored (vector=0, dest=0)\n"
+"67: at /usr/src/sys/i386/i386/local_apic.c:733\n"
+"68:#10 0xc0718b23 in ipi_selected (cpus=1, ipi=1)\n"
+"69: at /usr/src/sys/i386/i386/mp_machdep.c:1115\n"
+"70:#11 0xc057473e in kseq_notify (ke=0xcc05e360, cpu=0)\n"
+"71: at /usr/src/sys/kern/sched_ule.c:520\n"
+"72:#12 0xc0575cad in sched_add (td=0xcbcf5c80)\n"
+"73: at /usr/src/sys/kern/sched_ule.c:1366\n"
+"74:#13 0xc05666c6 in setrunqueue (td=0xcc05e360)\n"
+"75: at /usr/src/sys/kern/kern_switch.c:422\n"
+"76:#14 0xc05752f4 in sched_wakeup (td=0xcbcf5c80)\n"
+"77: at /usr/src/sys/kern/sched_ule.c:999\n"
+"78:#15 0xc056816c in setrunnable (td=0xcbcf5c80)\n"
+"79: at /usr/src/sys/kern/kern_synch.c:570\n"
+"80:#16 0xc0567d53 in wakeup (ident=0xcbcf5c80)\n"
+"81: at /usr/src/sys/kern/kern_synch.c:411\n"
+"82:#17 0xc05490a8 in exit1 (td=0xcbcf5b40, rv=0)\n"
+"83: at /usr/src/sys/kern/kern_exit.c:509\n"
+"84:#18 0xc0548011 in sys_exit () at /usr/src/sys/kern/kern_exit.c:102\n"
+"85:#19 0xc0720fd0 in syscall (frame=\n"
+"86: {tf_fs = 47, tf_es = 47, tf_ds = 47, tf_edi = 0, tf_esi = -1, tf_ebp = -1077940712, tf_isp = -602075788, tf_ebx = 672411944, tf_edx = 10, tf_ecx = 672411600, tf_eax = 1, tf_trapno = 12, tf_err = 2, tf_eip = 671899563, tf_cs = 31, tf_eflags = 642, tf_esp = -1077940740, tf_ss = 47})\n"
+"87: at /usr/src/sys/i386/i386/trap.c:1010\n"
+"88:#20 0xc070ca4d in Xint0x80_syscall () at {standard input}:136\n"
+"89:---Can't read userspace from dump, or kernel process---\n"
+"90:(kgdb) quit\n"
+msgstr ""
+" 1:# cd /usr/obj/usr/src/sys/KERNCONF\n"
+" 2:# kgdb kernel.debug /var/crash/vmcore.0\n"
+" 3:GNU gdb 5.2.1 (FreeBSD)\n"
+" 4:Copyright 2002 Free Software Foundation, Inc.\n"
+" 5:GDB is free software, covered by the GNU General Public License, and you are\n"
+" 6:welcome to change it and/or distribute copies of it under certain conditions.\n"
+" 7:Type \"show copying\" to see the conditions.\n"
+" 8:There is absolutely no warranty for GDB. Type \"show warranty\" for details.\n"
+" 9:This GDB was configured as \"i386-undermydesk-freebsd\"...\n"
+"10:panic: page fault\n"
+"11:panic messages:\n"
+"12:---\n"
+"13:Fatal trap 12: page fault while in kernel mode\n"
+"14:cpuid = 0; apic id = 00\n"
+"15:fault virtual address = 0x300\n"
+"16:fault code: = supervisor read, page not present\n"
+"17:instruction pointer = 0x8:0xc0713860\n"
+"18:stack pointer = 0x10:0xdc1d0b70\n"
+"19:frame pointer = 0x10:0xdc1d0b7c\n"
+"20:code segment = base 0x0, limit 0xfffff, type 0x1b\n"
+"21: = DPL 0, pres 1, def32 1, gran 1\n"
+"22:processor eflags = resume, IOPL = 0\n"
+"23:current process = 14394 (uname)\n"
+"24:trap number = 12\n"
+"25:panic: page fault\n"
+"26 cpuid = 0;\n"
+"27:Stack backtrace:\n"
+"28\n"
+"29:syncing disks, buffers remaining... 2199 2199 panic: mi_switch: switch in a critical section\n"
+"30:cpuid = 0;\n"
+"31:Uptime: 2h43m19s\n"
+"32:Dumping 255 MB\n"
+"33: 16 32 48 64 80 96 112 128 144 160 176 192 208 224 240\n"
+"34:---\n"
+"35:Reading symbols from /boot/kernel/snd_maestro3.ko...done.\n"
+"36:Loaded symbols for /boot/kernel/snd_maestro3.ko\n"
+"37:Reading symbols from /boot/kernel/snd_pcm.ko...done.\n"
+"38:Loaded symbols for /boot/kernel/snd_pcm.ko\n"
+"39:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240\n"
+"40:240 dumping++;\n"
+"41:(kgdb) list *0xc0713860\n"
+"42:0xc0713860 is in lapic_ipi_wait (/usr/src/sys/i386/i386/local_apic.c:663).\n"
+"43:658 incr = 0;\n"
+"44:659 delay = 1;\n"
+"45:660 } else\n"
+"46:661 incr = 1;\n"
+"47:662 for (x = 0; x < delay; x += incr) {\n"
+"48:663 if ((lapic->icr_lo & APIC_DELSTAT_MASK) == APIC_DELSTAT_IDLE)\n"
+"49:664 return (1);\n"
+"50:665 ia32_pause();\n"
+"51:666 }\n"
+"52:667 return (0);\n"
+"53:(kgdb) backtrace\n"
+"54:#0 doadump () at /usr/src/sys/kern/kern_shutdown.c:240\n"
+"55:#1 0xc055fd9b in boot (howto=260) at /usr/src/sys/kern/kern_shutdown.c:372\n"
+"56:#2 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550\n"
+"57:#3 0xc0567ef5 in mi_switch () at /usr/src/sys/kern/kern_synch.c:470\n"
+"58:#4 0xc055fa87 in boot (howto=256) at /usr/src/sys/kern/kern_shutdown.c:312\n"
+"59:#5 0xc056019d in panic () at /usr/src/sys/kern/kern_shutdown.c:550\n"
+"60:#6 0xc0720c66 in trap_fatal (frame=0xdc1d0b30, eva=0)\n"
+"61: at /usr/src/sys/i386/i386/trap.c:821\n"
+"62:#7 0xc07202b3 in trap (frame=\n"
+"63: {tf_fs = -1065484264, tf_es = -1065484272, tf_ds = -1065484272, tf_edi = 1, tf_esi = 0, tf_ebp = -602076292, tf_isp = -602076324, tf_ebx = 0, tf_edx = 0, tf_ecx = 1000000, tf_eax = 243, tf_trapno = 12, tf_err = 0, tf_eip = -1066321824, tf_cs = 8, tf_eflags = 65671, tf_esp = 243, tf_ss = 0})\n"
+"64: at /usr/src/sys/i386/i386/trap.c:250\n"
+"65:#8 0xc070c9f8 in calltrap () at {standard input}:94\n"
+"66:#9 0xc07139f3 in lapic_ipi_vectored (vector=0, dest=0)\n"
+"67: at /usr/src/sys/i386/i386/local_apic.c:733\n"
+"68:#10 0xc0718b23 in ipi_selected (cpus=1, ipi=1)\n"
+"69: at /usr/src/sys/i386/i386/mp_machdep.c:1115\n"
+"70:#11 0xc057473e in kseq_notify (ke=0xcc05e360, cpu=0)\n"
+"71: at /usr/src/sys/kern/sched_ule.c:520\n"
+"72:#12 0xc0575cad in sched_add (td=0xcbcf5c80)\n"
+"73: at /usr/src/sys/kern/sched_ule.c:1366\n"
+"74:#13 0xc05666c6 in setrunqueue (td=0xcc05e360)\n"
+"75: at /usr/src/sys/kern/kern_switch.c:422\n"
+"76:#14 0xc05752f4 in sched_wakeup (td=0xcbcf5c80)\n"
+"77: at /usr/src/sys/kern/sched_ule.c:999\n"
+"78:#15 0xc056816c in setrunnable (td=0xcbcf5c80)\n"
+"79: at /usr/src/sys/kern/kern_synch.c:570\n"
+"80:#16 0xc0567d53 in wakeup (ident=0xcbcf5c80)\n"
+"81: at /usr/src/sys/kern/kern_synch.c:411\n"
+"82:#17 0xc05490a8 in exit1 (td=0xcbcf5b40, rv=0)\n"
+"83: at /usr/src/sys/kern/kern_exit.c:509\n"
+"84:#18 0xc0548011 in sys_exit () at /usr/src/sys/kern/kern_exit.c:102\n"
+"85:#19 0xc0720fd0 in syscall (frame=\n"
+"86: {tf_fs = 47, tf_es = 47, tf_ds = 47, tf_edi = 0, tf_esi = -1, tf_ebp = -1077940712, tf_isp = -602075788, tf_ebx = 672411944, tf_edx = 10, tf_ecx = 672411600, tf_eax = 1, tf_trapno = 12, tf_err = 2, tf_eip = 671899563, tf_cs = 31, tf_eflags = 642, tf_esp = -1077940740, tf_ss = 47})\n"
+"87: at /usr/src/sys/i386/i386/trap.c:1010\n"
+"88:#20 0xc070ca4d in Xint0x80_syscall () at {standard input}:136\n"
+"89:---Can't read userspace from dump, or kernel process---\n"
+"90:(kgdb) quit\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:308
+msgid ""
+"If your system is crashing regularly and you are running out of disk space, "
+"deleting old [.filename]#vmcore# files in [.filename]#/var/crash# could save "
+"a considerable amount of disk space!"
+msgstr ""
+"Если ваша система регулярно завершается аварийно и у вас заканчивается место "
+"на диске, удаление старых файлов [.filename]#vmcore# в [.filename]#/var/"
+"crash# может освободить значительное количество дискового пространства!"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:311
+#, no-wrap
+msgid "On-Line Kernel Debugging Using DDB"
+msgstr "Онлайн-отладка ядра с использованием DDB"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:315
+msgid ""
+"While `kgdb` as an off-line debugger provides a very high level of user "
+"interface, there are some things it cannot do. The most important ones "
+"being breakpointing and single-stepping kernel code."
+msgstr ""
+"В то время как `kgdb` как автономный отладчик предоставляет очень высокий "
+"уровень пользовательского интерфейса, есть некоторые вещи, которые он не "
+"может выполнить. Наиболее важные из них — установка точек останова и "
+"пошаговое выполнение кода ядра."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:319
+msgid ""
+"If you need to do low-level debugging on your kernel, there is an on-line "
+"debugger available called DDB. It allows setting of breakpoints, single-"
+"stepping kernel functions, examining and changing kernel variables, etc. "
+"However, it cannot access kernel source files, and only has access to the "
+"global and static symbols, not to the full debug information like `kgdb` "
+"does."
+msgstr ""
+"Если вам требуется выполнить низкоуровневую отладку ядра, доступен отладчик "
+"DDB, работающий в режиме реального времени. Он позволяет устанавливать точки "
+"останова, выполнять пошаговое выполнение функций ядра, проверять и изменять "
+"переменные ядра и т.д. Однако он не имеет доступа к исходным файлам ядра и "
+"работает только с глобальными и статическими символами, без доступа к полной "
+"отладочной информации, как это делает `kgdb`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:321
+msgid "To configure your kernel to include DDB, add the options"
+msgstr "Для настройки ядра с включенной поддержкой DDB добавьте параметры"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:324
+#, no-wrap
+msgid "options KDB\n"
+msgstr "options KDB\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:329
+#, no-wrap
+msgid "options DDB\n"
+msgstr "options DDB\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:333
+msgid ""
+"to your config file, and rebuild. (See extref:{handbook}[The FreeBSD "
+"Handbook] for details on configuring the FreeBSD kernel)."
+msgstr ""
+"в ваш конфигурационный файл, и пересоберите. (Подробности о настройке ядра "
+"FreeBSD см. в extref:{handbook}[Руководстве FreeBSD])."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:339
+msgid ""
+"Once your DDB kernel is running, there are several ways to enter DDB. The "
+"first, and earliest way is to use the boot flag `-d`. The kernel will start "
+"up in debug mode and enter DDB prior to any device probing. Hence you can "
+"even debug the device probe/attach functions. To use this, exit the "
+"loader's boot menu and enter `boot -d` at the loader prompt."
+msgstr ""
+"После загрузки ядра DDB существует несколько способов войти в него. Первый и "
+"самый ранний способ — использовать флаг загрузки `-d`. Ядро запустится в "
+"режиме отладки и перейдет в DDB до начала обнаружения любого из устройств. "
+"Таким образом, можно отлаживать даже функции обнаружить (probe)/ "
+"присоединить (attach) устройств. Для использования этого метода выйдите из "
+"меню загрузки загрузчика и введите `boot -d` в командной строке загрузчика."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:343
+msgid ""
+"The second scenario is to drop to the debugger once the system has booted. "
+"There are two simple ways to accomplish this. If you would like to break to "
+"the debugger from the command prompt, simply type the command:"
+msgstr ""
+"Второй сценарий — перейти в отладчик после загрузки системы. Есть два "
+"простых способа это сделать. Если вы хотите перейти в отладчик из командной "
+"строки, просто введите команду:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:347
+#, no-wrap
+msgid "# sysctl debug.kdb.enter=1\n"
+msgstr "# sysctl debug.kdb.enter=1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:354
+msgid ""
+"Alternatively, if you are at the system console, you may use a hot-key on "
+"the keyboard. The default break-to-debugger sequence is kbd:"
+"[Ctrl+Alt+ESC]. For syscons, this sequence can be remapped and some of the "
+"distributed maps out there do this, so check to make sure you know the right "
+"sequence to use. There is an option available for serial consoles that "
+"allows the use of a serial line BREAK on the console line to enter DDB "
+"(`options BREAK_TO_DEBUGGER` in the kernel config file). It is not the "
+"default since there are a lot of serial adapters around that gratuitously "
+"generate a BREAK condition, for example when pulling the cable."
+msgstr ""
+"В качестве альтернативы, если вы находитесь за системной консолью, можно "
+"использовать горячую клавишу на клавиатуре. Стандартной комбинацией для "
+"перехода в отладчик является kbd:[Ctrl+Alt+ESC]. В syscons эта "
+"последовательность может быть переназначена, и некоторые распространённые "
+"раскладки клавиатуры делают это, поэтому убедитесь, что знаете правильную "
+"комбинацию. Для последовательных консолей доступна опция, позволяющая "
+"использовать сигнал BREAK на линии консоли для входа в DDB (`options "
+"BREAK_TO_DEBUGGER` в конфигурационном файле ядра). Это не установлено по "
+"умолчанию, так как существует множество последовательных адаптеров, которые "
+"излишне генерируют условие BREAK, например, при отключении кабеля."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:357
+msgid ""
+"The third way is that any panic condition will branch to DDB if the kernel "
+"is configured to use it. For this reason, it is not wise to configure a "
+"kernel with DDB for a machine running unattended."
+msgstr ""
+"Третий способ заключается в том, чтобы любое условие паники переходило в "
+"DDB, если ядро настроено на его использование. По этой причине не "
+"рекомендуется настраивать ядро с DDB для машины, работающей без присмотра."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:359
+msgid "To obtain the unattended functionality, add:"
+msgstr "Для получения неинтерактивной функциональности добавьте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:363
+#, no-wrap
+msgid "options\tKDB_UNATTENDED\n"
+msgstr "options\tKDB_UNATTENDED\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:366
+msgid "to the kernel configuration file and rebuild/reinstall."
+msgstr "в файл конфигурации ядра и пересоберите/переустановите ядро."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:369
+msgid ""
+"The DDB commands roughly resemble some `gdb` commands. The first thing you "
+"probably need to do is to set a breakpoint:"
+msgstr ""
+"Команды DDB примерно напоминают некоторые команды `gdb`. Первое, что вам, "
+"вероятно, нужно сделать, это установить точку останова:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:373
+#, no-wrap
+msgid " break function-name address\n"
+msgstr " break function-name address\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:378
+msgid ""
+"Numbers are taken hexadecimal by default, but to make them distinct from "
+"symbol names; hexadecimal numbers starting with the letters `a-f` need to be "
+"preceded with `0x` (this is optional for other numbers). Simple expressions "
+"are allowed, for example: `function-name + 0x103`."
+msgstr ""
+"Числа по умолчанию интерпретируются как шестнадцатеричные, но чтобы отличить "
+"их от символьных имен, шестнадцатеричные числа, начинающиеся с букв `a-f`, "
+"должны предваряться префиксом `0x` (для остальных чисел это необязательно). "
+"Допускаются простые выражения, например: `function-name + 0x103`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:380
+msgid "To exit the debugger and continue execution, type:"
+msgstr "Для выхода из отладчика и продолжения выполнения введите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:384
+#, no-wrap
+msgid " continue\n"
+msgstr " continue\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:387
+msgid "To get a stack trace of the current thread, use:"
+msgstr "Для получения трассировки стека текущего потока используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:391
+#, no-wrap
+msgid " trace\n"
+msgstr " trace\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:394
+msgid ""
+"To get a stack trace of an arbitrary thread, specify a process ID or thread "
+"ID as a second argument to `trace`."
+msgstr ""
+"Для получения трассировки стека произвольного потока укажите идентификатор "
+"процесса или идентификатор потока в качестве второго аргумента команды "
+"`trace`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:396
+msgid "If you want to remove a breakpoint, use"
+msgstr "Если вы хотите удалить точку останова, используйте"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:401
+#, no-wrap
+msgid ""
+" del\n"
+" del address-expression\n"
+msgstr ""
+" del\n"
+" del address-expression\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:405
+msgid ""
+"The first form will be accepted immediately after a breakpoint hit, and "
+"deletes the current breakpoint. The second form can remove any breakpoint, "
+"but you need to specify the exact address; this can be obtained from:"
+msgstr ""
+"Первая форма будет принята сразу после срабатывания точки останова и удаляет "
+"текущую точку останова. Вторая форма может удалить любую точку останова, но "
+"необходимо указать точный адрес; его можно получить из:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:409
+#, no-wrap
+msgid " show b\n"
+msgstr " show b\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:412
+msgid "or:"
+msgstr "или:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:416
+#, no-wrap
+msgid " show break\n"
+msgstr " show break\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:419
+msgid "To single-step the kernel, try:"
+msgstr "Для пошагового выполнения ядра попробуйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:423
+#, no-wrap
+msgid " s\n"
+msgstr " s\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:426
+msgid ""
+"This will step into functions, but you can make DDB trace them until the "
+"matching return statement is reached by:"
+msgstr ""
+"Это позволит войти в функции, но вы можете заставить DDB отслеживать их до "
+"достижения соответствующего оператора return с помощью:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:430
+#, no-wrap
+msgid " n\n"
+msgstr " n\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:436
+msgid ""
+"This is different from ``gdb``'s `next` statement; it is like ``gdb``'s "
+"`finish`. Pressing kbd:[n] more than once will cause a continue."
+msgstr ""
+"Это отличается от оператора `next` в ``gdb``; это похоже на `finish` в "
+"``gdb``. Нажатие kbd:[n] более одного раза приведёт к продолжению."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:439
+msgid "To examine data from memory, use (for example):"
+msgstr "Для просмотра данных в памяти используйте (например):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:446
+#, no-wrap
+msgid ""
+" x/wx 0xf0133fe0,40\n"
+" x/hd db_symtab_space\n"
+" x/bc termbuf,10\n"
+" x/s stringbuf\n"
+msgstr ""
+" x/wx 0xf0133fe0,40\n"
+" x/hd db_symtab_space\n"
+" x/bc termbuf,10\n"
+" x/s stringbuf\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:451
+msgid ""
+"for word/halfword/byte access, and hexadecimal/decimal/character/ string "
+"display. The number after the comma is the object count. To display the "
+"next 0x10 items, simply use:"
+msgstr ""
+"для доступа к словам/полусловам/байтам и отображения в шестнадцатеричном/"
+"десятичном/символьном/строковом формате. Число после запятой указывает "
+"количество объектов. Для отображения следующих 0x10 элементов просто введите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:455
+#, no-wrap
+msgid " x ,10\n"
+msgstr " x ,10\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:458
+msgid "Similarly, use"
+msgstr "Аналогично, используйте"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:462
+#, no-wrap
+msgid " x/ia foofunc,10\n"
+msgstr " x/ia foofunc,10\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:465
+msgid ""
+"to disassemble the first 0x10 instructions of `foofunc`, and display them "
+"along with their offset from the beginning of `foofunc`."
+msgstr ""
+"для дизассемблирования первых 0x10 инструкций функции `foofunc` и их "
+"отображения вместе с их смещением от начала `foofunc`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:467
+msgid "To modify memory, use the write command:"
+msgstr "Для записи в память используйте команду write:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:472
+#, no-wrap
+msgid ""
+" w/b termbuf 0xa 0xb 0\n"
+" w/w 0xf0010030 0 0\n"
+msgstr ""
+" w/b termbuf 0xa 0xb 0\n"
+" w/w 0xf0010030 0 0\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:476
+msgid ""
+"The command modifier (`b`/`h`/`w`) specifies the size of the data to be "
+"written, the first following expression is the address to write to and the "
+"remainder is interpreted as data to write to successive memory locations."
+msgstr ""
+"Модификатор команды (`b`/`h`/`w`) определяет размер данных для записи, "
+"первое следующее выражение — это адрес для записи, а остальное "
+"интерпретируется как данные для записи в последующие ячейки памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:478
+msgid "If you need to know the current registers, use:"
+msgstr "Если вам необходимо узнать текущее содержимое регистров, введите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:482
+#, no-wrap
+msgid " show reg\n"
+msgstr " show reg\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:485
+msgid "Alternatively, you can display a single register value by e.g."
+msgstr "Также можно отобразить значение одного регистра, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:489
+#, no-wrap
+msgid " p $eax\n"
+msgstr " p $eax\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:492
+msgid "and modify it by:"
+msgstr "и изменить его с помощью:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:496
+#, no-wrap
+msgid " set $eax new-value\n"
+msgstr " set $eax new-value\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:499
+msgid "Should you need to call some kernel functions from DDB, simply say:"
+msgstr ""
+"Если вам потребуется вызвать некоторые функции ядра из DDB, просто напишите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:503
+#, no-wrap
+msgid " call func(arg1, arg2, ...)\n"
+msgstr " call func(arg1, arg2, ...)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:506
+msgid "The return value will be printed."
+msgstr "Будет выведено возвращаемое значение."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:508
+msgid "For a man:ps[1] style summary of all running processes, use:"
+msgstr ""
+"Для вывода информации о всех запущенных процессах в стиле man:ps[1] "
+"используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:512
+#, no-wrap
+msgid " ps\n"
+msgstr " ps\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:517
+msgid ""
+"Now you have examined why your kernel failed, and you wish to reboot. "
+"Remember that, depending on the severity of previous malfunctioning, not all "
+"parts of the kernel might still be working as expected. Perform one of the "
+"following actions to shut down and reboot your system:"
+msgstr ""
+"Теперь вы выяснили причину сбоя ядра и хотите выполнить перезагрузку. "
+"Помните, что в зависимости от серьезности предыдущего сбоя не все части ядра "
+"могут работать корректно. Выполните одно из следующих действий для "
+"завершения работы и перезагрузки системы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:521
+#, no-wrap
+msgid " panic\n"
+msgstr " panic\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:524
+msgid ""
+"This will cause your kernel to dump core and reboot, so you can later "
+"analyze the core on a higher level with man:kgdb[1]."
+msgstr ""
+"Это приведёт к дампу ядра и перезагрузке, чтобы позже можно было "
+"проанализировать дамп на более высоком уровне с помощью man:kgdb[1]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:528
+#, no-wrap
+msgid " call boot(0)\n"
+msgstr " call boot(0)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:532
+msgid ""
+"Might be a good way to cleanly shut down the running system, `sync()` all "
+"disks, and finally, in some cases, reboot. As long as the disk and "
+"filesystem interfaces of the kernel are not damaged, this could be a good "
+"way for an almost clean shutdown."
+msgstr ""
+"Может быть хорошим способом чисто завершить работу работающей системы, "
+"`sync()` все диски и, наконец, в некоторых случаях перезагрузиться. Пока "
+"интерфейсы дисков и файловых систем ядра не повреждены, это может быть "
+"хорошим способом для почти чистого завершения работы."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:536
+#, no-wrap
+msgid " reset\n"
+msgstr " reset\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:539
+msgid ""
+"This is the final way out of disaster and almost the same as hitting the Big "
+"Red Button."
+msgstr ""
+"Это последний способ избежать катастрофы, и он почти такой же, как нажатие "
+"на Большую Красную Кнопку."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:541
+msgid "If you need a short command summary, simply type:"
+msgstr "Если вам нужна краткая сводка команд, просто введите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:545
+#, no-wrap
+msgid " help\n"
+msgstr " help\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:549
+msgid ""
+"It is highly recommended to have a printed copy of the man:ddb[4] manual "
+"page ready for a debugging session. Remember that it is hard to read the on-"
+"line manual while single-stepping the kernel."
+msgstr ""
+"Настоятельно рекомендуется иметь распечатанную копию страницы руководства "
+"man:ddb[4] для сеанса отладки. Помните, что читать онлайн-руководство во "
+"время пошагового выполнения ядра сложно."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:551
+#, no-wrap
+msgid "On-Line Kernel Debugging Using Remote GDB"
+msgstr "Онлайн-отладка ядра с использованием удаленного GDB"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:555
+msgid ""
+"The FreeBSD kernel provides a second KDB backend for on-line debugging: "
+"man:gdb[4]. This feature has been supported since FreeBSD 2.2, and it is "
+"actually a very neat one."
+msgstr ""
+"Ядро FreeBSD предоставляет второй бэкенд KDB для отладки в реальном времени: "
+"man:gdb[4]. Эта возможность поддерживается с FreeBSD 2.2 и является "
+"действительно очень удобной."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:561
+msgid ""
+"GDB has supported _remote debugging_ for a long time. This is done using a "
+"very simple protocol along a serial line. Unlike the other debugging "
+"methods described above, you will need two machines for doing this. One is "
+"the host providing the debugging environment, including all the sources, and "
+"a copy of the kernel binary with all the symbols in it. The other is the "
+"target machine that runs a copy of the very same kernel (optionally stripped "
+"of the debugging information)."
+msgstr ""
+"GDB давно поддерживает _удалённую отладку_. Это осуществляется с помощью "
+"очень простого протокола через последовательное соединение. В отличие от "
+"других методов отладки, описанных выше, для этого потребуются две машины. "
+"Одна — это хост, предоставляющий среду отладки, включая все исходные тексты "
+"и копию бинарного файла ядра со всеми символами. Другая — целевая машина, на "
+"которой запущена копия того же самого ядра (возможно, без отладочной "
+"информации)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:563
+msgid ""
+"In order to use remote GDB, ensure that the following options are present in "
+"your kernel configuration:"
+msgstr ""
+"Чтобы использовать удалённый GDB, убедитесь, что следующие параметры "
+"присутствуют в конфигурации вашего ядра:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:568
+#, no-wrap
+msgid ""
+"makeoptions DEBUG=-g\n"
+"options KDB\n"
+"options GDB\n"
+msgstr ""
+"makeoptions DEBUG=-g\n"
+"options KDB\n"
+"options GDB\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:571
+msgid ""
+"Note that the `GDB` option is turned off by default in `GENERIC` kernels on "
+"-STABLE and -RELEASE branches, but enabled on -CURRENT."
+msgstr ""
+"Обратите внимание, что опция `GDB` отключена по умолчанию в ядрах `GENERIC` "
+"для веток -STABLE и -RELEASE, но включена в -CURRENT."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:575
+msgid ""
+"Once built, copy the kernel to the target machine, and boot it. Connect the "
+"serial line of the target machine that has \"flags 080\" set on its uart "
+"device to any serial line of the debugging host. See man:uart[4] for "
+"information on how to set the flags on a uart device."
+msgstr ""
+"После сборки скопируйте ядро на целевую машину и загрузите его. Подключите "
+"последовательный порт целевой машины, у которого на устройстве uart "
+"установлены флаги \"080\", к любому последовательному порту отладочной "
+"машины. Подробности о настройке флагов на устройстве uart смотрите в "
+"man:uart[4]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:578
+msgid ""
+"The target machine must be made to enter the GDB backend, either due to a "
+"panic or by taking a purposeful trap into the debugger. Before doing this, "
+"select the GDB debugger backend:"
+msgstr ""
+"Целевая машина должна быть переведена в режим отладчика GDB, либо из-за "
+"паники, либо путем преднамеренного перехода в отладчик. Перед этим выберите "
+"бэкенд отладчика GDB:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:582
+#, no-wrap
+msgid ""
+"# sysctl debug.kdb.current=gdb\n"
+"debug.kdb.current: ddb -> gdb\n"
+msgstr ""
+"# sysctl debug.kdb.current=gdb\n"
+"debug.kdb.current: ddb -> gdb\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:589
+msgid ""
+"The supported backends can be listed by the `debug.kdb.available` sysctl. "
+"If the kernel configuration includes `options DDB`, then man:ddb[4] will be "
+"selected by default. If `gdb` does not appear in the list of available "
+"backends, then the debug serial port may not have been configured correctly."
+msgstr ""
+"Поддерживаемые бэкенды можно вывести с помощью sysctl `debug.kdb.available`. "
+"Если конфигурация ядра включает `options DDB`, то man:ddb[4] будет выбран по "
+"умолчанию. Если `gdb` не отображается в списке доступных бэкендов, значит, "
+"последовательный порт отладки может быть настроен неправильно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:592
+msgid "Then, force entry to the debugger:"
+msgstr "Затем принудительно войдите в отладчик:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:596
+#, no-wrap
+msgid ""
+"# sysctl debug.kdb.enter=1\n"
+"debug.kdb.enter: 0KDB: enter: sysctl debug.kdb.enter\n"
+msgstr ""
+"# sysctl debug.kdb.enter=1\n"
+"debug.kdb.enter: 0KDB: enter: sysctl debug.kdb.enter\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:600
+msgid ""
+"The target machine now awaits connection from a remote GDB client. On the "
+"debugging machine, go to the compile directory of the target kernel, and "
+"start `gdb`:"
+msgstr ""
+"Целевая машина теперь ожидает подключения от удалённого клиента GDB. На "
+"машине для отладки перейдите в каталог сборки целевого ядра и запустите "
+"`gdb`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:611
+#, no-wrap
+msgid ""
+"# cd /usr/obj/usr/src/amd64.amd64/sys/GENERIC/\n"
+"# kgdb kernel\n"
+"GNU gdb (GDB) 10.2 [GDB v10.2 for FreeBSD]\n"
+"Copyright (C) 2021 Free Software Foundation, Inc.\n"
+"...\n"
+"Reading symbols from kernel...\n"
+"Reading symbols from /usr/obj/usr/src/amd64.amd64/sys/GENERIC/kernel.debug...\n"
+"(kgdb)\n"
+msgstr ""
+"# cd /usr/obj/usr/src/amd64.amd64/sys/GENERIC/\n"
+"# kgdb kernel\n"
+"GNU gdb (GDB) 10.2 [GDB v10.2 for FreeBSD]\n"
+"Copyright (C) 2021 Free Software Foundation, Inc.\n"
+"...\n"
+"Reading symbols from kernel...\n"
+"Reading symbols from /usr/obj/usr/src/amd64.amd64/sys/GENERIC/kernel.debug...\n"
+"(kgdb)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:614
+msgid ""
+"Initialize the remote debugging session (assuming the first serial port is "
+"being used) by:"
+msgstr ""
+"Инициализируйте сеанс удаленной отладки (предполагая, что используется "
+"первый последовательный порт) с помощью:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:618
+#, no-wrap
+msgid "(kgdb) target remote /dev/cuau0\n"
+msgstr "(kgdb) target remote /dev/cuau0\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:621
+msgid "Your hosting GDB will now gain control over the target kernel:"
+msgstr "Ваш хостинг GDB теперь получит контроль над целевым ядром:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:628
+#, no-wrap
+msgid ""
+"Remote debugging using /dev/cuau0\n"
+"kdb_enter (why=<optimized out>, msg=<optimized out>) at /usr/src/sys/kern/subr_kdb.c:506\n"
+"506 kdb_why = KDB_WHY_UNSET;\n"
+"(kgdb)\n"
+msgstr ""
+"Remote debugging using /dev/cuau0\n"
+"kdb_enter (why=<optimized out>, msg=<optimized out>) at /usr/src/sys/kern/subr_kdb.c:506\n"
+"506 kdb_why = KDB_WHY_UNSET;\n"
+"(kgdb)\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:636
+msgid ""
+"Depending on the compiler used, some local variables may appear as "
+"`<optimized out>`, preventing them from being inspected directly by `gdb`. "
+"If this causes problems while debugging, it is possible to build the kernel "
+"at a decreased optimization level, which may improve the visibility of some "
+"variables. This can be done by passing `COPTFLAGS=-O1` to man:make[1]. "
+"However, certain classes of kernel bugs may manifest differently (or not at "
+"all) when the optimization level is changed."
+msgstr ""
+"В зависимости от используемого компилятора, некоторые локальные переменные "
+"могут отображаться как `<optimized out>`, что не позволяет их напрямую "
+"исследовать с помощью `gdb`. Если это вызывает проблемы при отладке, можно "
+"собрать ядро с пониженным уровнем оптимизации, что может улучшить видимость "
+"некоторых переменных. Это можно сделать, передав `COPTFLAGS=-O1` в "
+"man:make[1]. Однако определённые классы ошибок в ядре могут проявляться "
+"иначе (или вообще не проявляться) при изменении уровня оптимизации."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:640
+msgid ""
+"You can use this session almost as any other GDB session, including full "
+"access to the source, running it in gud-mode inside an Emacs window (which "
+"gives you an automatic source code display in another Emacs window), etc."
+msgstr ""
+"Вы можете использовать этот сеанс почти как любой другой сеанс GDB, включая "
+"полный доступ к исходному коду, запуск в режиме gud (Grand Unified Debugger) "
+"внутри окна Emacs (что дает автоматическое отображение исходного кода в "
+"другом окне Emacs) и т.д."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:642
+#, no-wrap
+msgid "Debugging a Console Driver"
+msgstr "Отладка драйвера консоли"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:648
+msgid ""
+"Since you need a console driver to run DDB on, things are more complicated "
+"if the console driver itself is failing. You might remember the use of a "
+"serial console (either with modified boot blocks, or by specifying `-h` at "
+"the `Boot:` prompt), and hook up a standard terminal onto your first serial "
+"port. DDB works on any configured console driver, including a serial "
+"console."
+msgstr ""
+"Поскольку для работы DDB требуется драйвер консоли, ситуация усложняется, "
+"если сам драйвер консоли неисправен. Возможно, вы вспомните о возможности "
+"использования последовательной консоли (либо с модифицированными "
+"загрузочными блоками, либо указав `-h` в строке `Boot:`), подключив "
+"стандартный терминал к первому последовательному порту. DDB работает с любым "
+"настроенным драйвером консоли, включая последовательную консоль."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:650
+#, no-wrap
+msgid "Debugging Deadlocks"
+msgstr "Отладка взаимоблокировок"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:655
+msgid ""
+"You may experience so called deadlocks, a situation where a system stops "
+"doing useful work. To provide a helpful bug report in this situation, use "
+"man:ddb[4] as described in the previous section. Include the output of `ps` "
+"and `trace` for suspected processes in the report."
+msgstr ""
+"Вы можете столкнуться с так называемыми взаимоблокировками — ситуацией, "
+"когда система перестает выполнять полезную работу. Чтобы предоставить "
+"полезный отчет об ошибке в такой ситуации, используйте man:ddb[4], как "
+"описано в предыдущем разделе. Включите в отчет вывод команд `ps` и `trace` "
+"для подозрительных процессов."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:659
+msgid ""
+"If possible, consider doing further investigation. The recipe below is "
+"especially useful if you suspect that a deadlock occurs in the VFS layer. "
+"Add these options to the kernel configuration file."
+msgstr ""
+"Если возможно, рассмотрите проведение дополнительного исследования. "
+"Приведенный ниже рецепт особенно полезен, если вы подозреваете, что взаимная "
+"блокировка происходит на уровне VFS. Добавьте следующие параметры в файл "
+"конфигурации ядра."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:670
+#, no-wrap
+msgid ""
+"makeoptions \tDEBUG=-g\n"
+"options \tINVARIANTS\n"
+"options \tINVARIANT_SUPPORT\n"
+"options \tWITNESS\n"
+"options \tWITNESS_SKIPSPIN\n"
+"options \tDEBUG_LOCKS\n"
+"options \tDEBUG_VFS_LOCKS\n"
+"options \tDIAGNOSTIC\n"
+msgstr ""
+"makeoptions \tDEBUG=-g\n"
+"options \tINVARIANTS\n"
+"options \tINVARIANT_SUPPORT\n"
+"options \tWITNESS\n"
+"options \tWITNESS_SKIPSPIN\n"
+"options \tDEBUG_LOCKS\n"
+"options \tDEBUG_VFS_LOCKS\n"
+"options \tDIAGNOSTIC\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:673
+msgid ""
+"When a deadlock occurs, in addition to the output of the `ps` command, "
+"provide information from the `show pcpu`, `show allpcpu`, `show locks`, "
+"`show alllocks`, `show lockedvnods` and `alltrace`."
+msgstr ""
+"При возникновении взаимоблокировки, помимо вывода команды `ps`, предоставьте "
+"информацию из `show pcpu`, `show allpcpu`, `show locks`, `show alllocks`, "
+"`show lockedvnods` и `alltrace`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:675
+msgid ""
+"To obtain meaningful backtraces for threaded processes, use `thread thread-"
+"id` to switch to the thread stack, and do a backtrace with `where`."
+msgstr ""
+"Для получения осмысленных трассировок стека для потоковых процессов "
+"используйте `thread thread-id` для переключения на стек потока и выполните "
+"трассировку с помощью `where`."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:677
+#, no-wrap
+msgid "Kernel debugging with Dcons"
+msgstr "Отладка ядра с помощью Dcons"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:683
+msgid ""
+"man:dcons[4] is a very simple console driver that is not directly connected "
+"with any physical devices. It just reads and writes characters from and to "
+"a buffer in a kernel or loader. Due to its simple nature, it is very useful "
+"for kernel debugging, especially with a FireWire(R) device. Currently, "
+"FreeBSD provides two ways to interact with the buffer from outside of the "
+"kernel using man:dconschat[8]."
+msgstr ""
+"man:dcons[4] — это очень простой драйвер консоли, который не связан напрямую "
+"с какими-либо физическими устройствами. Он просто читает и записывает "
+"символы из буфера в ядре или загрузчике и обратно. Благодаря своей простоте "
+"он очень полезен для отладки ядра, особенно с устройством FireWire(R). В "
+"настоящее время FreeBSD предоставляет два способа взаимодействия с буфером "
+"извне ядра с помощью man:dconschat[8]."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:684
+#, no-wrap
+msgid "Dcons over FireWire(R)"
+msgstr "Dcons через FireWire(R)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:692
+msgid ""
+"Most FireWire(R) (IEEE1394) host controllers are based on the OHCI "
+"specification that supports physical access to the host memory. This means "
+"that once the host controller is initialized, we can access the host memory "
+"without the help of software (kernel). We can exploit this facility for "
+"interaction with man:dcons[4]. man:dcons[4] provides similar functionality "
+"as a serial console. It emulates two serial ports, one for the console and "
+"DDB, the other for GDB. Since remote memory access is fully handled by the "
+"hardware, the man:dcons[4] buffer is accessible even when the system crashes."
+msgstr ""
+"Большинство контроллеров FireWire(R) (IEEE1394) основаны на спецификации "
+"OHCI, которая поддерживает физический доступ к памяти хоста. Это означает, "
+"что после инициализации контроллера хоста мы можем получить доступ к памяти "
+"хоста без помощи программного обеспечения (ядра). Мы можем использовать эту "
+"возможность для взаимодействия с man:dcons[4]. man:dcons[4] предоставляет "
+"функциональность, аналогичную последовательной консоли. Он эмулирует два "
+"последовательных порта: один для консоли и DDB, другой для GDB. Поскольку "
+"удалённый доступ к памяти полностью обрабатывается аппаратным обеспечением, "
+"буфер man:dcons[4] остаётся доступным даже при крахе системы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:695
+msgid ""
+"FireWire(R) devices are not limited to those integrated into motherboards. "
+"PCI cards exist for desktops, and a cardbus interface can be purchased for "
+"laptops."
+msgstr ""
+"Устройства FireWire(R) не только встраиваются в материнские платы. Для "
+"настольных компьютеров существуют PCI-карты, а для ноутбуков можно "
+"приобрести интерфейс CardBus."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:696
+#, no-wrap
+msgid "Enabling FireWire(R) and Dcons support on the target machine"
+msgstr "Включение поддержки FireWire(R) и Dcons на целевой машине"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:699
+msgid ""
+"To enable FireWire(R) and Dcons support in the kernel of the _target "
+"machine_:"
+msgstr "Чтобы включить поддержку FireWire(R) и Dcons в ядре _целевой машины_:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:701
+msgid ""
+"Make sure your kernel supports `dcons`, `dcons_crom` and `firewire`. `Dcons` "
+"should be statically linked with the kernel. For `dcons_crom` and "
+"`firewire`, modules should be OK."
+msgstr ""
+"Убедитесь, что ваше ядро поддерживает `dcons`, `dcons_crom` и `firewire`. "
+"`Dcons` должен быть статически связан с ядром. Для `dcons_crom` и `firewire` "
+"модули должны подойти."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:702
+msgid ""
+"Make sure physical DMA is enabled. You may need to add "
+"`hw.firewire.phydma_enable=1` to [.filename]#/boot/loader.conf#."
+msgstr ""
+"Убедитесь, что физический DMA включен. Возможно, потребуется добавить "
+"`hw.firewire.phydma_enable=1` в [.filename]#/boot/loader.conf#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:703
+msgid "Add options for debugging."
+msgstr "Добавьте параметры для отладки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:704
+msgid ""
+"Add `dcons_gdb=1` in [.filename]#/boot/loader.conf# if you use GDB over "
+"FireWire(R)."
+msgstr ""
+"Добавьте `dcons_gdb=1` в [.filename]#/boot/loader.conf#, если вы используете "
+"GDB через FireWire(R)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:705
+msgid "Enable `dcons` in [.filename]#/etc/ttys#."
+msgstr "Включите `dcons` в [.filename]#/etc/ttys#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:706
+msgid ""
+"Optionally, to force `dcons` to be the high-level console, add "
+"`hw.firewire.dcons_crom.force_console=1` to [.filename]#loader.conf#."
+msgstr ""
+"Это необязательно: чтобы принудительно сделать `dcons` высокоуровневой "
+"консолью, добавьте `hw.firewire.dcons_crom.force_console=1` в "
+"[.filename]#loader.conf#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:708
+msgid ""
+"To enable FireWire(R) and Dcons support in man:loader[8] on i386 or amd64:"
+msgstr ""
+"Чтобы включить поддержку FireWire(R) и Dcons в man:loader[8] на i386 или "
+"amd64:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:710
+msgid ""
+"Add `LOADER_FIREWIRE_SUPPORT=YES` in [.filename]#/etc/make.conf# and rebuild "
+"man:loader[8]:"
+msgstr ""
+"Добавьте `LOADER_FIREWIRE_SUPPORT=YES` в [.filename]#/etc/make.conf# и "
+"пересоберите man:loader[8]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:714
+#, no-wrap
+msgid "# cd /sys/boot/i386 && make clean && make && make install\n"
+msgstr "# cd /sys/boot/i386 && make clean && make && make install\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:717
+msgid ""
+"To enable man:dcons[4] as an active low-level console, add "
+"`boot_multicons=\"YES\"` to [.filename]#/boot/loader.conf#."
+msgstr ""
+"Чтобы включить man:dcons[4] в качестве активной низкоуровневой консоли, "
+"добавьте `boot_multicons=\"YES\"` в [.filename]#/boot/loader.conf#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:720
+msgid ""
+"Here are a few configuration examples. A sample kernel configuration file "
+"would contain:"
+msgstr ""
+"Вот несколько примеров конфигурации. Образец файла конфигурации ядра может "
+"содержать:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:729
+#, no-wrap
+msgid ""
+"device dcons\n"
+"device dcons_crom\n"
+"options KDB\n"
+"options DDB\n"
+"options GDB\n"
+"options ALT_BREAK_TO_DEBUGGER\n"
+msgstr ""
+"device dcons\n"
+"device dcons_crom\n"
+"options KDB\n"
+"options DDB\n"
+"options GDB\n"
+"options ALT_BREAK_TO_DEBUGGER\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:732
+msgid "And a sample [.filename]#/boot/loader.conf# would contain:"
+msgstr "И образец [.filename]#/boot/loader.conf# может содержать:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:740
+#, no-wrap
+msgid ""
+"dcons_crom_load=\"YES\"\n"
+"dcons_gdb=1\n"
+"boot_multicons=\"YES\"\n"
+"hw.firewire.phydma_enable=1\n"
+"hw.firewire.dcons_crom.force_console=1\n"
+msgstr ""
+"dcons_crom_load=\"YES\"\n"
+"dcons_gdb=1\n"
+"boot_multicons=\"YES\"\n"
+"hw.firewire.phydma_enable=1\n"
+"hw.firewire.dcons_crom.force_console=1\n"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:742
+#, no-wrap
+msgid "Enabling FireWire(R) and Dcons support on the host machine"
+msgstr "Включение поддержки FireWire(R) и Dcons на главной машине"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:745
+msgid "To enable FireWire(R) support in the kernel on the _host machine_:"
+msgstr "Чтобы включить поддержку FireWire(R) в ядре на _основной машине_:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:749
+#, no-wrap
+msgid "# kldload firewire\n"
+msgstr "# kldload firewire\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:752
+msgid ""
+"Find out the EUI64 (the unique 64 bit identifier) of the FireWire(R) host "
+"controller, and use man:fwcontrol[8] or `dmesg` to find the EUI64 of the "
+"target machine."
+msgstr ""
+"Определите EUI64 (уникальный 64-битный идентификатор) контроллера "
+"FireWire(R) и используйте man:fwcontrol[8] или `dmesg`, чтобы найти EUI64 "
+"целевой машины."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:754
+msgid "Run man:dconschat[8], with:"
+msgstr "Запустите man:dconschat[8], с:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:758
+#, no-wrap
+msgid "# dconschat -e \\# -br -G 12345 -t 00-11-22-33-44-55-66-77\n"
+msgstr "# dconschat -e \\# -br -G 12345 -t 00-11-22-33-44-55-66-77\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:761
+msgid ""
+"The following key combinations can be used once man:dconschat[8] is running:"
+msgstr ""
+"Следующие комбинации клавиш могут быть использованы после запуска "
+"man:dconschat[8]:"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:767
+#, no-wrap
+msgid "kbd:[~+.]"
+msgstr "kbd:[~+.]"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:769
+#, no-wrap
+msgid "Disconnect"
+msgstr "Отсоединиться"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:770
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:773
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:776
+#, no-wrap
+msgid "kbd:[~]"
+msgstr "kbd:[~]"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:772
+#, no-wrap
+msgid "ALT BREAK"
+msgstr "ALT BREAK"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:775
+#, no-wrap
+msgid "RESET target"
+msgstr "ПЕРЕЗАГРУЗИТЬ (RESET) целевую машину"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:777
+#, no-wrap
+msgid "Suspend dconschat"
+msgstr "Приостановить dconschat"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:780
+msgid ""
+"Attach remote GDB by starting man:kgdb[1] with a remote debugging session:"
+msgstr ""
+"Присоедините удаленный GDB, запустив man:kgdb[1] с сеансом удаленной отладки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:784
+#, no-wrap
+msgid " kgdb -r :12345 kernel\n"
+msgstr " kgdb -r :12345 kernel\n"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:786
+#, no-wrap
+msgid "Some general tips"
+msgstr "Некоторые общие рекомендации"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:789
+msgid "Here are some general tips:"
+msgstr "Вот несколько общих советов:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:791
+msgid ""
+"To take full advantage of the speed of FireWire(R), disable other slow "
+"console drivers:"
+msgstr ""
+"Чтобы в полной мере использовать скорость FireWire(R), отключите другие "
+"медленные драйверы консоли:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:796
+#, no-wrap
+msgid ""
+"# conscontrol delete ttyd0\t # serial console\n"
+"# conscontrol delete consolectl\t# video/keyboard\n"
+msgstr ""
+"# conscontrol delete ttyd0\t # serial console\n"
+"# conscontrol delete consolectl\t# video/keyboard\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:799
+msgid ""
+"There exists a GDB mode for man:emacs[1]; this is what you will need to add "
+"to your [.filename]#.emacs#:"
+msgstr ""
+"Существует режим GDB для man:emacs[1]; вот что нужно добавить в ваш "
+"[.filename]#.emacs#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:806
+#, no-wrap
+msgid ""
+"(setq gud-gdba-command-name \"kgdb -a -a -a -r :12345\")\n"
+"(setq gdb-many-windows t)\n"
+"(xterm-mouse-mode 1)\n"
+"M-x gdba\n"
+msgstr ""
+"(setq gud-gdba-command-name \"kgdb -a -a -a -r :12345\")\n"
+"(setq gdb-many-windows t)\n"
+"(xterm-mouse-mode 1)\n"
+"M-x gdba\n"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:808
+#, no-wrap
+msgid "Dcons with KVM"
+msgstr "Dcons с KVM"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:812
+msgid ""
+"We can directly read the man:dcons[4] buffer via [.filename]#/dev/mem# for "
+"live systems, and in the core dump for crashed systems. These give you "
+"similar output to `dmesg -a`, but the man:dcons[4] buffer includes more "
+"information."
+msgstr ""
+"Мы можем напрямую читать буфер man:dcons[4] через [.filename]#/dev/mem# для "
+"работающих систем и в дампе памяти для систем после аварии. Это даёт "
+"аналогичный вывод команде `dmesg -a`, но буфер man:dcons[4] содержит больше "
+"информации."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:813
+#, no-wrap
+msgid "Using Dcons with KVM"
+msgstr "Использование Dcons с KVM"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:816
+msgid "To use man:dcons[4] with KVM:"
+msgstr "Для использования man:dcons[4] с KVM:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:818
+msgid "Dump a man:dcons[4] buffer of a live system:"
+msgstr "Дамп буфера man:dcons[4] работающей системы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:822
+#, no-wrap
+msgid "# dconschat -1\n"
+msgstr "# dconschat -1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:825
+msgid "Dump a man:dcons[4] buffer of a crash dump:"
+msgstr "Дамп буфера man:dcons[4] аварийного дампа:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:829
+#, no-wrap
+msgid "# dconschat -1 -M vmcore.XX\n"
+msgstr "# dconschat -1 -M vmcore.XX\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:832
+msgid "Live core debugging can be done via:"
+msgstr "Отладка ядра в реальном времени может быть выполнена через:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:837
+#, no-wrap
+msgid ""
+"# fwcontrol -m target_eui64\n"
+"# kgdb kernel /dev/fwmem0.2\n"
+msgstr ""
+"# fwcontrol -m target_eui64\n"
+"# kgdb kernel /dev/fwmem0.2\n"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:840
+#, no-wrap
+msgid "Glossary of Kernel Options for Debugging"
+msgstr "Глоссарий параметров ядра для отладки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:843
+msgid ""
+"This section provides a brief glossary of compile-time kernel options used "
+"for debugging:"
+msgstr ""
+"В этом разделе представлен краткий глоссарий параметров ядра, указываемых "
+"при компиляции и относящихся к отладке:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:845
+msgid ""
+"`options KDB`: compiles in the kernel debugger framework. Required for "
+"`options DDB` and `options GDB`. Little or no performance overhead. By "
+"default, the debugger will be entered on panic instead of an automatic "
+"reboot."
+msgstr ""
+"`options KDB`: включает фреймворк отладки ядра. Необходим для `options DDB` "
+"и `options GDB`. Практически не влияет на производительность. По умолчанию "
+"отладчик будет запущен при панике вместо автоматической перезагрузки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:846
+msgid ""
+"`options KDB_UNATTENDED`: change the default value of the "
+"`debug.debugger_on_panic` sysctl to 0, which controls whether the debugger "
+"is entered on panic. When `options KDB` is not compiled into the kernel, the "
+"behavior is to automatically reboot on panic; when it is compiled into the "
+"kernel, the default behavior is to drop into the debugger unless `options "
+"KDB_UNATTENDED` is compiled in. If you want to leave the kernel debugger "
+"compiled into the kernel but want the system to come back up unless you're "
+"on-hand to use the debugger for diagnostics, use this option."
+msgstr ""
+"`options KDB_UNATTENDED`: изменяет значение по умолчанию системной настройки "
+"`debug.debugger_on_panic` на 0, что управляет входом в отладчик при панике. "
+"Если `options KDB` не вкомпилировано в ядро, поведение по умолчанию — "
+"автоматическая перезагрузка при панике; если оно вкомпилировано в ядро, "
+"поведение по умолчанию — переход в отладчик, если не вкомпилирована опция "
+"`options KDB_UNATTENDED`. Если вы хотите оставить отладчик ядра "
+"вкомпилированным в ядро, но желаете, чтобы система перезагружалась, пока вы "
+"не готовы использовать отладчик для диагностики, используйте эту опцию."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:847
+msgid ""
+"`options KDB_TRACE`: change the default value of the `debug.trace_on_panic` "
+"sysctl to 1, which controls whether the debugger automatically prints a "
+"stack trace on panic. Especially if running with `options KDB_UNATTENDED`, "
+"this can be helpful to gather basic debugging information on the serial or "
+"firewire console while still rebooting to recover."
+msgstr ""
+"`options KDB_TRACE`: изменяет значение по умолчанию системной настройки "
+"`debug.trace_on_panic` на 1, что управляет автоматическим выводом "
+"трассировки стека при панике. Особенно полезно при использовании с `options "
+"KDB_UNATTENDED`, так как позволяет собрать базовую отладочную информацию на "
+"последовательной консоли или консоли FireWire, продолжая перезагрузку для "
+"восстановления."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:848
+msgid ""
+"`options DDB`: compile in support for the console debugger, DDB. This "
+"interactive debugger runs on whatever the active low-level console of the "
+"system is, which includes the video console, serial console, or firewire "
+"console. It provides basic integrated debugging facilities, such as stack "
+"tracing, process and thread listing, dumping of lock state, VM state, file "
+"system state, and kernel memory management. DDB does not require software "
+"running on a second machine or being able to generate a core dump or full "
+"debugging kernel symbols, and provides detailed diagnostics of the kernel at "
+"run-time. Many bugs can be fully diagnosed using only DDB output. This "
+"option depends on `options KDB`."
+msgstr ""
+"`options DDB`: включает поддержку консольного отладчика DDB. Этот "
+"интерактивный отладчик работает на активной низкоуровневой консоли системы, "
+"включая видеоконсоль, последовательную консоль или консоль FireWire. Он "
+"предоставляет базовые встроенные средства отладки, такие как трассировка "
+"стека, список процессов и потоков, вывод состояния блокировок, состояния "
+"виртуальной памяти, состояния файловой системы и управления ядром памяти. "
+"DDB не требует работы программного обеспечения на второй машине или "
+"возможности создания дампа памяти или полных символов отладки ядра, а также "
+"предоставляет детальную диагностику ядра во время выполнения. Многие ошибки "
+"могут быть полностью диагностированы с использованием только вывода DDB. Эта "
+"опция зависит от `options KDB`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:849
+msgid ""
+"`options GDB`: compile in support for the remote debugger, GDB, which can "
+"operate over serial cable or firewire. When the debugger is entered, GDB may "
+"be attached to inspect structure contents, generate stack traces, etc. Some "
+"kernel state is more awkward to access than in DDB, which is able to "
+"generate useful summaries of kernel state automatically, such as "
+"automatically walking lock debugging or kernel memory management structures, "
+"and a second machine running the debugger is required. On the other hand, "
+"GDB combines information from the kernel source and full debugging symbols, "
+"and is aware of full data structure definitions, local variables, and is "
+"scriptable. This option is not required to run GDB on a kernel core dump. "
+"This option depends on `options KDB`."
+msgstr ""
+"`options GDB`: включает поддержку удалённого отладчика GDB, который может "
+"работать через последовательный кабель или FireWire. При входе в отладчик "
+"можно подключить GDB для проверки содержимого структур, генерации "
+"трассировки стека и т.д. Некоторые состояния ядра сложнее исследовать, чем в "
+"DDB, который способен автоматически создавать полезные сводки состояния "
+"ядра, например, автоматически обходить структуры отладки блокировок или "
+"управления памятью ядра, но для этого требуется вторая машина с запущенным "
+"отладчиком. С другой стороны, GDB объединяет информацию из исходного кода "
+"ядра и полных отладочных символов, знает полные определения структур данных, "
+"локальные переменные и поддерживает написание скриптов. Эта опция не "
+"требуется для запуска GDB на дампе памяти ядра. Данная опция зависит от "
+"`options KDB`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:850
+msgid ""
+"`options BREAK_TO_DEBUGGER`, `options ALT_BREAK_TO_DEBUGGER`: allow a break "
+"signal or alternative signal on the console to enter the debugger. If the "
+"system hangs without a panic, this is a useful way to reach the debugger. "
+"Due to the current kernel locking, a break signal generated on a serial "
+"console is significantly more reliable at getting into the debugger, and is "
+"generally recommended. This option has little or no performance impact."
+msgstr ""
+"`options BREAK_TO_DEBUGGER`, `options ALT_BREAK_TO_DEBUGGER`: позволяют "
+"сигналу прерывания или альтернативному сигналу на консоли войти в отладчик. "
+"Если система зависает без паники, это полезный способ попасть в отладчик. Из-"
+"за текущей блокировки ядра сигнал прерывания, сгенерированный на "
+"последовательной консоли, значительно надежнее для входа в отладчик и обычно "
+"рекомендуется. Данная опция оказывает незначительное или нулевое влияние на "
+"производительность."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:851
+msgid ""
+"`options INVARIANTS`: compile into the kernel a large number of run-time "
+"assertion checks and tests, which constantly test the integrity of kernel "
+"data structures and the invariants of kernel algorithms. These tests can be "
+"expensive, so are not compiled in by default, but help provide useful \"fail "
+"stop\" behavior, in which certain classes of undesired behavior enter the "
+"debugger before kernel data corruption occurs, making them easier to debug. "
+"Tests include memory scrubbing and use-after-free testing, which is one of "
+"the more significant sources of overhead. This option depends on `options "
+"INVARIANT_SUPPORT`."
+msgstr ""
+"`options INVARIANTS`: включает в ядро большое количество проверок и тестов "
+"во время выполнения, которые постоянно проверяют целостность структур данных "
+"ядра и инварианты алгоритмов ядра. Эти тесты могут быть затратными, поэтому "
+"по умолчанию не включены, но они помогают обеспечить полезное поведение "
+"\"fail stop\", при котором определённые классы нежелательного поведения "
+"попадают в отладчик до возникновения повреждения данных ядра, что упрощает "
+"их отладку. Тесты включают в себя очистку памяти и проверку использования "
+"после освобождения, что является одним из наиболее значимых источников "
+"накладных расходов. Эта опция зависит от `options INVARIANT_SUPPORT`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:852
+msgid ""
+"`options INVARIANT_SUPPORT`: many of the tests present in `options "
+"INVARIANTS` require modified data structures or additional kernel symbols to "
+"be defined."
+msgstr ""
+"`options INVARIANT_SUPPORT`: многие тесты, присутствующие в `options "
+"INVARIANTS`, требуют модифицированных структур данных или определения "
+"дополнительных символов ядра."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:853
+msgid ""
+"`options WITNESS`: this option enables run-time lock order tracking and "
+"verification, and is an invaluable tool for deadlock diagnosis. WITNESS "
+"maintains a graph of acquired lock orders by lock type, and checks the graph "
+"at each acquire for cycles (implicit or explicit). If a cycle is detected, a "
+"warning and stack trace are generated to the console, indicating that a "
+"potential deadlock might have occurred. WITNESS is required in order to use "
+"the `show locks`, `show witness` and `show alllocks` DDB commands. This "
+"debug option has significant performance overhead, which may be somewhat "
+"mitigated through the use of `options WITNESS_SKIPSPIN`. Detailed "
+"documentation may be found in man:witness[4]."
+msgstr ""
+"`options WITNESS`: эта опция включает отслеживание и проверку порядка "
+"блокировок во время выполнения, что является неоценимым инструментом для "
+"диагностики взаимоблокировок. WITNESS поддерживает граф полученных порядков "
+"блокировок по типам блокировок и проверяет граф на каждом получении на "
+"наличие циклов (явных или неявных). Если цикл обнаружен, на консоль "
+"выводится предупреждение и трассировка стека, указывающие на возможное "
+"возникновение взаимоблокировки. WITNESS необходим для использования команд "
+"DDB `show locks`, `show witness` и `show alllocks`. Эта отладочная опция "
+"создает значительную нагрузку на производительность, которую можно несколько "
+"уменьшить с помощью `options WITNESS_SKIPSPIN`. Подробная документация "
+"доступна в man:witness[4]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:854
+msgid ""
+"`options WITNESS_SKIPSPIN`: disable run-time checking of spinlock lock order "
+"with WITNESS. As spin locks are acquired most frequently in the scheduler, "
+"and scheduler events occur often, this option can significantly speed up "
+"systems running with WITNESS. This option depends on `options WITNESS`."
+msgstr ""
+"`options WITNESS_SKIPSPIN`: отключает проверку порядка блокировки spinlock "
+"во время выполнения с WITNESS. Поскольку spin-блокировки чаще всего "
+"захватываются в планировщике, а события планировщика происходят часто, эта "
+"опция может значительно ускорить системы, работающие с WITNESS. Эта опция "
+"зависит от `options WITNESS`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:855
+msgid ""
+"`options WITNESS_KDB`: change the default value of the `debug.witness.kdb` "
+"sysctl to 1, which causes WITNESS to enter the debugger when a lock order "
+"violation is detected, rather than simply printing a warning. This option "
+"depends on `options WITNESS`."
+msgstr ""
+"`options WITNESS_KDB`: изменяет значение по умолчанию системной настройки "
+"`debug.witness.kdb` на 1, что приводит к входу в отладчик при обнаружении "
+"нарушения порядка блокировок вместо простого вывода предупреждения. Эта "
+"опция зависит от `options WITNESS`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:856
+msgid ""
+"`options SOCKBUF_DEBUG`: perform extensive run-time consistency checking on "
+"socket buffers, which can be useful for debugging both socket bugs and race "
+"conditions in protocols and device drivers that interact with sockets. This "
+"option significantly impacts network performance, and may change the timing "
+"in device driver races."
+msgstr ""
+"`options SOCKBUF_DEBUG`: выполнять расширенную проверку согласованности "
+"сокетных буферов во время выполнения, что может быть полезно для отладки как "
+"ошибок в сокетах, так и состояний гонки в протоколах и драйверах устройств, "
+"взаимодействующих с сокетами. Данная опция значительно влияет на "
+"производительность сети и может изменить временные параметры в состояниях "
+"гонки драйверов устройств."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:857
+msgid ""
+"`options DEBUG_VFS_LOCKS`: track lock acquisition points for lockmgr/vnode "
+"locks, expanding the amount of information displayed by `show lockedvnods` "
+"in DDB. This option has a measurable performance impact."
+msgstr ""
+"`options DEBUG_VFS_LOCKS`: отслеживает точки получения блокировок для "
+"lockmgr/vnode, расширяя объем информации, отображаемой командой `show "
+"lockedvnods` в DDB. Данная опция оказывает заметное влияние на "
+"производительность."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:858
+msgid ""
+"`options DEBUG_MEMGUARD`: a replacement for the man:malloc[9] kernel memory "
+"allocator that uses the VM system to detect reads or writes from allocated "
+"memory after free. Details may be found in man:memguard[9]. This option has "
+"a significant performance impact, but can be very helpful in debugging "
+"kernel memory corruption bugs."
+msgstr ""
+"`options DEBUG_MEMGUARD`: замена для man:malloc[9], аллокатор памяти ядра, "
+"который использует систему VM для обнаружения чтения или записи в "
+"освобождённую память. Подробности можно найти в man:memguard[9]. Данная "
+"опция значительно влияет на производительность, но может быть очень полезна "
+"при отладке ошибок повреждения памяти ядра."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:859
+msgid ""
+"`options DIAGNOSTIC`: enable additional, more expensive diagnostic tests "
+"along the lines of `options INVARIANTS`."
+msgstr ""
+"`options DIAGNOSTIC`: включает дополнительные, более затратные "
+"диагностические тесты, аналогичные `options INVARIANTS`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:860
+msgid ""
+"`options KASAN`: enable the Kernel Address Sanitizer. This enables compiler "
+"instrumentation which can be used to detect invalid memory accesses in the "
+"kernel, such as use-after-frees and buffer overflows. This largely "
+"supersedes `options DEBUG_MEMGUARD`. See man:kasan[9] for details, and for "
+"the currently supported platforms."
+msgstr ""
+"`options KASAN`: включает отладчик адресов ядра (Kernel Address Sanitizer). "
+"Это включает инструментирование компилятора, которое может использоваться "
+"для обнаружения недопустимых обращений к памяти в ядре, таких как "
+"использование после освобождения и переполнение буфера. В значительной "
+"степени заменяет `options DEBUG_MEMGUARD`. Подробности и список "
+"поддерживаемых платформ см. в man:kasan[9]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/kerneldebug/_index.adoc:860
+msgid ""
+"`options KMSAN`: enable the Kernel Memory Sanitizer. This enables compiler "
+"instrumentation which can be used to detect uses of uninitialized memory. "
+"See man:kmsan[9] for details, and for the currently supported platforms."
+msgstr ""
+"`options KMSAN`: включить отладчик использования памяти ядра (Kernel Memory "
+"Sanitizer). Это включает инструментирование компилятора, которое может "
+"использоваться для обнаружения использования неинициализированной памяти. "
+"Подробности и список поддерживаемых платформ см. в man:kmsan[9]."
+
+#~ msgid "And for DDD ([.filename]#devel/ddd#):"
+#~ msgstr "И для DDD ([.filename]#devel/ddd#):"
+
+#, no-wrap
+#~ msgid ""
+#~ "# remote serial protocol\n"
+#~ "LANG=C ddd --debugger kgdb -r :12345 kernel\n"
+#~ "# live core debug\n"
+#~ "LANG=C ddd --debugger kgdb kernel /dev/fwmem0.2\n"
+#~ msgstr ""
+#~ "# remote serial protocol\n"
+#~ "LANG=C ddd --debugger kgdb -r :12345 kernel\n"
+#~ "# live core debug\n"
+#~ "LANG=C ddd --debugger kgdb kernel /dev/fwmem0.2\n"
diff --git a/documentation/content/ru/books/developers-handbook/l10n/_index.adoc b/documentation/content/ru/books/developers-handbook/l10n/_index.adoc
new file mode 100644
index 0000000000..7b21ea51f3
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/l10n/_index.adoc
@@ -0,0 +1,228 @@
+---
+authors:
+description: 'Локализация и интернационализация - L10N и I18N в FreeBSD'
+next: books/developers-handbook/policies
+params:
+ path: /books/developers-handbook/l10n/
+prev: books/developers-handbook/secure
+showBookMenu: true
+tags: ["L10N", "I18N", "Localization", "Internationalization", "FreeBSD"]
+title: 'Глава 4. Локализация и интернационализация - L10N и I18N'
+weight: 5
+---
+
+[[l10n]]
+= Локализация и интернационализация - L10N и I18N
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 4
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[l10n-programming]]
+== Программирование приложений с поддержкой I18N
+
+Чтобы сделать ваше приложение более полезным для пользователей, говорящих на других языках, мы надеемся, что вы будете разрабатывать его с поддержкой интернационализации (I18N). Компилятор GNU gcc и библиотеки для графического интерфейса, такие как QT и GTK, поддерживают I18N за счёт специальной обработки строк. Создание программы с поддержкой I18N очень просто. Это позволяет участникам быстро адаптировать ваше приложение для других языков. Для получения более подробной информации обратитесь к документации по I18N для конкретной библиотеки.
+
+Вопреки распространённому мнению, написание кода, соответствующего стандарту I18N, является простой задачей. Обычно оно заключается лишь в оборачивании строк в специфичные для библиотеки функции. Кроме того, убедитесь, что поддерживаются широкие или многобайтовые символы.
+
+=== Призыв к объединению усилий по интернационализации
+
+Нам стало известно, что индивидуальные усилия по интернационализации (I18N) и локализации (L10N) в каждой стране дублируют работу друг друга. Многие из нас снова и снова неэффективно изобретают велосипед. Мы надеемся, что различные крупные группы разработчиков в области I18N смогут объединится для совместной работы и ответственности, подобно Core Team в FreeBSD.
+
+В настоящее время мы надеемся, что при написании или портировании I18N-программ вы будете отправлять их в соответствующие списки рассылки FreeBSD каждой страны для тестирования. В будущем мы надеемся создать приложения, которые будут работать на всех языках "из коробки" без грязных хаков.
+
+Создана группа {freebsd-i18n}. Если вы разработчик в области I18N/L10N, присылайте свои комментарии, идеи, вопросы и всё, что относится к этой теме по вашему мнению.
+
+=== Perl и Python
+
+В Perl и Python есть библиотеки для I18N и работы с широкими символами. Пожалуйста, используйте их для соответствия требованиям I18N.
+
+[[posix-nls]]
+== Локализованные сообщения с поддержкой родного языка POSIX.1 (NLS — Native Language Support)
+
+Помимо основных функций интернационализации (I18N), таких как поддержка различных кодировок ввода или национальных соглашений, например, различных разделителей десятичных знаков, на более высоком уровне I18N можно локализовать сообщения, выводимые различными программами. Распространённый способ сделать это — использовать функции NLS POSIX.1, которые предоставляются как часть базовой системы FreeBSD.
+
+[[nls-catalogs]]
+=== Организация локализованных сообщений в файлы каталогов
+
+POSIX.1 NLS использует файлы каталогов. Эти файлы содержат локализованные сообщения в желаемой кодировке. Сообщения организованы в наборы, и каждое сообщение идентифицируется целым числом в соответствующем наборе. Файлы каталогов традиционно называются по имени локали, для которой они содержат локализованные сообщения, с добавлением расширения `.msg`. Например, венгерские сообщения для кодировки ISO8859-2 должны храниться в файле с именем [.filename]#hu_HU.ISO8859-2#.
+
+Эти файлы каталогов представляют собой обычные текстовые файлы, содержащие нумерованные сообщения. Можно добавлять комментарии, начиная строку со знака `$`. Границы наборов также разделяются специальными комментариями, где ключевое слово `set` должно следовать непосредственно за знаком `$`. После ключевого слова `set` указывается номер набора. Например:
+
+[.programlisting]
+....
+$set 1
+....
+
+Фактические записи сообщений начинаются с номера сообщения, за которым следует локализованное сообщение. Допускаются известные модификаторы из man:printf[3]:
+
+[.programlisting]
+....
+15 "File not found: %s\n"
+....
+
+Файлы языкового каталога должны быть скомпилированы в бинарный формат перед тем, как они могут быть открыты программой. Это преобразование выполняется с помощью утилиты man:gencat[1]. Её первый аргумент — это имя файла скомпилированного каталога, а последующие аргументы — входные каталоги. Локализованные сообщения также могут быть организованы в несколько файлов каталогов, и затем все они могут быть обработаны с помощью man:gencat[1].
+
+[[nls-using]]
+=== Использование файлов каталога из исходного кода
+
+Использование файлов каталогов простое. Чтобы вызвать функции, работающие с ними, необходимо включить файл [.filename]#nl_types.h#. Перед использованием каталога его нужно открыть с помощью man:catopen[3]. Функция принимает два аргумента. Первый параметр — это имя установленного и скомпилированного каталога. Обычно используется имя программы, например, grep. Это имя будет использоваться при поиске скомпилированного файла каталога. Вызов man:catopen[3] ищет этот файл в [.filename]#/usr/share/nls/locale/catname# и в [.filename]#/usr/local/share/nls/locale/catname#, где `locale` — установленная локализация, а `catname` — имя обсуждаемого каталога. Второй параметр — это константа, которая может принимать два значения:
+
+* `NL_CAT_LOCALE`, что означает, что используемый файл каталога будет основан на `LC_MESSAGES`.
+* `0`, что означает, что для открытия соответствующего каталога необходимо использовать `LANG`.
+
+Вызов man:catopen[3] возвращает идентификатор каталога типа `nl_catd`. Обратитесь к справочной странице для получения списка возможных кодов ошибок.
+
+После открытия каталога man:catgets[3] может быть использована для извлечения сообщения. Первый параметр — это идентификатор каталога, возвращаемый man:catopen[3], второй — номер набора, третий — номер сообщения, а четвертый — резервное сообщение, которое будет возвращено, если запрошенное сообщение не может быть извлечено из файла каталога.
+
+После использования файла каталога его необходимо закрыть, вызвав man:catclose[3], которая принимает один аргумент — идентификатор каталога.
+
+[[nls-example]]
+=== Практический пример
+
+Следующий пример демонстрирует простое решение по гибкому использованию каталогов NLS.
+
+Нижеследующие строки необходимо поместить в общий заголовочный файл программы, который включается во все исходные файлы, где необходимы локализованные сообщения:
+
+[.programlisting]
+....
+#ifdef WITHOUT_NLS
+#define getstr(n) nlsstr[n]
+#else
+#include nl_types.h
+
+extern nl_catd catalog;
+#define getstr(n) catgets(catalog, 1, n, nlsstr[n])
+#endif
+
+extern char *nlsstr[];
+....
+
+Далее, добавьте эти строки в глобальную секцию объявлений основного исходного файла:
+
+[.programlisting]
+....
+#ifndef WITHOUT_NLS
+#include nl_types.h
+nl_catd catalog;
+#endif
+
+/*
+ * Default messages to use when NLS is disabled or no catalog
+ * is found.
+ */
+char *nlsstr[] = {
+ "",
+/* 1*/ "some random message",
+/* 2*/ "some other message"
+};
+....
+
+Далее следуют реальные фрагменты кода, которые открывают, читают и закрывают каталог:
+
+[.programlisting]
+....
+#ifndef WITHOUT_NLS
+ catalog = catopen("myapp", NL_CAT_LOCALE);
+#endif
+
+...
+
+printf(getstr(1));
+
+...
+
+#ifndef WITHOUT_NLS
+ catclose(catalog);
+#endif
+....
+
+==== Уменьшение количества строк для локализации
+
+Хороший способ уменьшить количество строк, требующих локализации, — использовать сообщения об ошибках из libc. Это также полезно для избежания дублирования и обеспечения единообразия сообщений об ошибках, с которыми может столкнуться множество программ.
+
+Вот пример, который не использует сообщения об ошибках из libc:
+
+[.programlisting]
+....
+#include err.h
+...
+if (!S_ISDIR(st.st_mode))
+ errx(1, "argument is not a directory");
+....
+
+Это можно преобразовать для вывода сообщения об ошибке, считывая `errno` и выводя соответствующее сообщение об ошибке:
+
+[.programlisting]
+....
+#include err.h
+#include errno.h
+...
+if (!S_ISDIR(st.st_mode)) {
+ errno = ENOTDIR;
+ err(1, NULL);
+}
+....
+
+В этом примере пользовательская строка исключена, что упростит работу переводчиков при локализации программы, а пользователи увидят стандартное сообщение об ошибке "Not a directory" при возникновении данной ошибки. Это сообщение, вероятно, будет выглядеть более привычным для них. Обратите внимание, что для прямого доступа к `errno` потребовалось включить [.filename]#errno.h#.
+
+Стоит отметить, что бывают случаи, когда `errno` устанавливается автоматически предыдущим вызовом, поэтому нет необходимости устанавливать его явно:
+
+[.programlisting]
+....
+#include err.h
+...
+if ((p = malloc(size)) == NULL)
+ err(1, NULL);
+....
+
+[[nls-mk]]
+=== Использование [.filename]#bsd.nls.mk#
+
+Использование файлов каталогов требует нескольких повторяемых шагов, таких как компиляция каталогов и их установка в нужное место. Чтобы ещё больше упростить этот процесс, [.filename]#bsd.nls.mk# вводит некоторые макросы. Нет необходимости явно включать [.filename]#bsd.nls.mk#, он подключается автоматически из общих Makefiles, таких как [.filename]#bsd.prog.mk# или [.filename]#bsd.lib.mk#.
+
+Обычно достаточно определить `NLSNAME`, которое должно содержать имя каталога, указанное в качестве первого аргумента man:catopen[3], и перечислить файлы каталогов в `NLS` без расширения `.msg`. Вот пример, который позволяет отключить NLS при использовании с предыдущими примерами кода. Для сборки программы без поддержки NLS необходимо определить переменную `WITHOUT_NLS` man:make[1].
+
+[.programlisting]
+....
+.if !defined(WITHOUT_NLS)
+NLS= es_ES.ISO8859-1
+NLS+= hu_HU.ISO8859-2
+NLS+= pt_BR.ISO8859-1
+.else
+CFLAGS+= -DWITHOUT_NLS
+.endif
+....
+
+Обычно файлы каталогов размещаются в подкаталоге [.filename]#nls#, и это поведение по умолчанию для [.filename]#bsd.nls.mk#. Однако можно переопределить расположение каталогов с помощью переменной `NLSSRCDIR` man:make[1]. Имя по умолчанию для предварительно скомпилированных файлов каталогов также следует упомянутому ранее соглашению об именовании. Его можно переопределить, установив переменную `NLSNAME`. Существуют и другие параметры для точной настройки обработки файлов каталогов, но обычно в этом нет необходимости, поэтому они здесь не описаны. Для получения дополнительной информации о [.filename]#bsd.nls.mk# обратитесь к самому файлу — он короткий и легко понятен.
diff --git a/documentation/content/ru/books/developers-handbook/l10n/_index.po b/documentation/content/ru/books/developers-handbook/l10n/_index.po
new file mode 100644
index 0000000000..3a8d1dfcbc
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/l10n/_index.po
@@ -0,0 +1,659 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-06-24 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookl10n_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:1
+#, no-wrap
+msgid "Localization and Internationalization - L10N and I18N in FreeBSD"
+msgstr "Локализация и интернационализация - L10N и I18N в FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:1
+#, no-wrap
+msgid "Chapter 4. Localization and Internationalization - L10N and I18N"
+msgstr "Глава 4. Локализация и интернационализация - L10N и I18N"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:15
+#, no-wrap
+msgid "Localization and Internationalization - L10N and I18N"
+msgstr "Локализация и интернационализация - L10N и I18N"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:53
+#, no-wrap
+msgid "Programming I18N Compliant Applications"
+msgstr "Программирование приложений с поддержкой I18N"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:60
+msgid ""
+"To make your application more useful for speakers of other languages, we "
+"hope that you will program I18N compliant. The GNU gcc compiler and GUI "
+"libraries like QT and GTK support I18N through special handling of strings. "
+"Making a program I18N compliant is very easy. It allows contributors to "
+"port your application to other languages quickly. Refer to the library "
+"specific I18N documentation for more details."
+msgstr ""
+"Чтобы сделать ваше приложение более полезным для пользователей, говорящих на "
+"других языках, мы надеемся, что вы будете разрабатывать его с поддержкой "
+"интернационализации (I18N). Компилятор GNU gcc и библиотеки для графического "
+"интерфейса, такие как QT и GTK, поддерживают I18N за счёт специальной "
+"обработки строк. Создание программы с поддержкой I18N очень просто. Это "
+"позволяет участникам быстро адаптировать ваше приложение для других языков. "
+"Для получения более подробной информации обратитесь к документации по I18N "
+"для конкретной библиотеки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:64
+msgid ""
+"In contrast with common perception, I18N compliant code is easy to write. "
+"Usually, it only involves wrapping your strings with library specific "
+"functions. In addition, please be sure to allow for wide or multibyte "
+"character support."
+msgstr ""
+"Вопреки распространённому мнению, написание кода, соответствующего стандарту "
+"I18N, является простой задачей. Обычно оно заключается лишь в оборачивании "
+"строк в специфичные для библиотеки функции. Кроме того, убедитесь, что "
+"поддерживаются широкие или многобайтовые символы."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:65
+#, no-wrap
+msgid "A Call to Unify the I18N Effort"
+msgstr "Призыв к объединению усилий по интернационализации"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:70
+msgid ""
+"It has come to our attention that the individual I18N/L10N efforts for each "
+"country has been repeating each others' efforts. Many of us have been "
+"reinventing the wheel repeatedly and inefficiently. We hope that the "
+"various major groups in I18N could congregate into a group effort similar to "
+"the Core Team's responsibility."
+msgstr ""
+"Нам стало известно, что индивидуальные усилия по интернационализации (I18N) "
+"и локализации (L10N) в каждой стране дублируют работу друг друга. Многие из "
+"нас снова и снова неэффективно изобретают велосипед. Мы надеемся, что "
+"различные крупные группы разработчиков в области I18N смогут объединится для "
+"совместной работы и ответственности, подобно Core Team в FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:73
+msgid ""
+"Currently, we hope that, when you write or port I18N programs, you would "
+"send it out to each country's related FreeBSD mailing list for testing. In "
+"the future, we hope to create applications that work in all the languages "
+"out-of-the-box without dirty hacks."
+msgstr ""
+"В настоящее время мы надеемся, что при написании или портировании I18N-"
+"программ вы будете отправлять их в соответствующие списки рассылки FreeBSD "
+"каждой страны для тестирования. В будущем мы надеемся создать приложения, "
+"которые будут работать на всех языках \"из коробки\" без грязных хаков."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:76
+msgid ""
+"The {freebsd-i18n} has been established. If you are an I18N/L10N developer, "
+"please send your comments, ideas, questions, and anything you deem related "
+"to it."
+msgstr ""
+"Создана группа {freebsd-i18n}. Если вы разработчик в области I18N/L10N, "
+"присылайте свои комментарии, идеи, вопросы и всё, что относится к этой теме "
+"по вашему мнению."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:77
+#, no-wrap
+msgid "Perl and Python"
+msgstr "Perl и Python"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:81
+msgid ""
+"Perl and Python have I18N and wide character handling libraries. Please use "
+"them for I18N compliance."
+msgstr ""
+"В Perl и Python есть библиотеки для I18N и работы с широкими символами. "
+"Пожалуйста, используйте их для соответствия требованиям I18N."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:83
+#, no-wrap
+msgid "Localized Messages with POSIX.1 Native Language Support (NLS)"
+msgstr "Локализованные сообщения с поддержкой родного языка POSIX.1 (NLS — Native Language Support)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:87
+msgid ""
+"Beyond the basic I18N functions, like supporting various input encodings or "
+"supporting national conventions, such as the different decimal separators, "
+"at a higher level of I18N, it is possible to localize the messages written "
+"to the output by the various programs. A common way of doing this is using "
+"the POSIX.1 NLS functions, which are provided as a part of the FreeBSD base "
+"system."
+msgstr ""
+"Помимо основных функций интернационализации (I18N), таких как поддержка "
+"различных кодировок ввода или национальных соглашений, например, различных "
+"разделителей десятичных знаков, на более высоком уровне I18N можно "
+"локализовать сообщения, выводимые различными программами. Распространённый "
+"способ сделать это — использовать функции NLS POSIX.1, которые "
+"предоставляются как часть базовой системы FreeBSD."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:89
+#, no-wrap
+msgid "Organizing Localized Messages into Catalog Files"
+msgstr "Организация локализованных сообщений в файлы каталогов"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:95
+msgid ""
+"POSIX.1 NLS is based on catalog files, which contain the localized messages "
+"in the desired encoding. The messages are organized into sets and each "
+"message is identified by an integer number in the containing set. The "
+"catalog files are conventionally named after the locale they contain "
+"localized messages for, followed by the `.msg` extension. For instance, the "
+"Hungarian messages for ISO8859-2 encoding should be stored in a file called "
+"[.filename]#hu_HU.ISO8859-2#."
+msgstr ""
+"POSIX.1 NLS использует файлы каталогов. Эти файлы содержат локализованные "
+"сообщения в желаемой кодировке. Сообщения организованы в наборы, и каждое "
+"сообщение идентифицируется целым числом в соответствующем наборе. Файлы "
+"каталогов традиционно называются по имени локали, для которой они содержат "
+"локализованные сообщения, с добавлением расширения `.msg`. Например, "
+"венгерские сообщения для кодировки ISO8859-2 должны храниться в файле с "
+"именем [.filename]#hu_HU.ISO8859-2#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:100
+msgid ""
+"These catalog files are common text files that contain the numbered "
+"messages. It is possible to write comments by starting the line with a `$` "
+"sign. Set boundaries are also separated by special comments, where the "
+"keyword `set` must directly follow the `$` sign. The `set` keyword is then "
+"followed by the set number. For example:"
+msgstr ""
+"Эти файлы каталогов представляют собой обычные текстовые файлы, содержащие "
+"нумерованные сообщения. Можно добавлять комментарии, начиная строку со знака "
+"`$`. Границы наборов также разделяются специальными комментариями, где "
+"ключевое слово `set` должно следовать непосредственно за знаком `$`. После "
+"ключевого слова `set` указывается номер набора. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:104
+#, no-wrap
+msgid "$set 1\n"
+msgstr "$set 1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:108
+msgid ""
+"The actual message entries start with the message number and followed by the "
+"localized message. The well-known modifiers from man:printf[3] are accepted:"
+msgstr ""
+"Фактические записи сообщений начинаются с номера сообщения, за которым "
+"следует локализованное сообщение. Допускаются известные модификаторы из "
+"man:printf[3]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:112
+#, no-wrap
+msgid "15 \"File not found: %s\\n\"\n"
+msgstr "15 \"File not found: %s\\n\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:118
+msgid ""
+"The language catalog files have to be compiled into a binary form before "
+"they can be opened from the program. This conversion is done with the "
+"man:gencat[1] utility. Its first argument is the filename of the compiled "
+"catalog and its further arguments are the input catalogs. The localized "
+"messages can also be organized into more catalog files and then all of them "
+"can be processed with man:gencat[1]."
+msgstr ""
+"Файлы языкового каталога должны быть скомпилированы в бинарный формат перед "
+"тем, как они могут быть открыты программой. Это преобразование выполняется с "
+"помощью утилиты man:gencat[1]. Её первый аргумент — это имя файла "
+"скомпилированного каталога, а последующие аргументы — входные каталоги. "
+"Локализованные сообщения также могут быть организованы в несколько файлов "
+"каталогов, и затем все они могут быть обработаны с помощью man:gencat[1]."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:120
+#, no-wrap
+msgid "Using the Catalog Files from the Source Code"
+msgstr "Использование файлов каталога из исходного кода"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:131
+msgid ""
+"Using the catalog files is simple. To use the related functions, "
+"[.filename]#nl_types.h# must be included. Before using a catalog, it has to "
+"be opened with man:catopen[3]. The function takes two arguments. The first "
+"parameter is the name of the installed and compiled catalog. Usually, the "
+"name of the program is used, such as grep. This name will be used when "
+"looking for the compiled catalog file. The man:catopen[3] call looks for "
+"this file in [.filename]#/usr/share/nls/locale/catname# and in [.filename]#/"
+"usr/local/share/nls/locale/catname#, where `locale` is the locale set and "
+"`catname` is the catalog name being discussed. The second parameter is a "
+"constant, which can have two values:"
+msgstr ""
+"Использование файлов каталогов простое. Чтобы вызвать функции, работающие с "
+"ними, необходимо включить файл [.filename]#nl_types.h#. Перед использованием "
+"каталога его нужно открыть с помощью man:catopen[3]. Функция принимает два "
+"аргумента. Первый параметр — это имя установленного и скомпилированного "
+"каталога. Обычно используется имя программы, например, grep. Это имя будет "
+"использоваться при поиске скомпилированного файла каталога. Вызов "
+"man:catopen[3] ищет этот файл в [.filename]#/usr/share/nls/locale/catname# и "
+"в [.filename]#/usr/local/share/nls/locale/catname#, где `locale` — "
+"установленная локализация, а `catname` — имя обсуждаемого каталога. Второй "
+"параметр — это константа, которая может принимать два значения:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:133
+msgid ""
+"`NL_CAT_LOCALE`, which means that the used catalog file will be based on "
+"`LC_MESSAGES`."
+msgstr ""
+"`NL_CAT_LOCALE`, что означает, что используемый файл каталога будет основан "
+"на `LC_MESSAGES`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:134
+msgid "`0`, which means that `LANG` has to be used to open the proper catalog."
+msgstr ""
+"`0`, что означает, что для открытия соответствующего каталога необходимо "
+"использовать `LANG`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:137
+msgid ""
+"The man:catopen[3] call returns a catalog identifier of type `nl_catd`. "
+"Please refer to the manual page for a list of possible returned error codes."
+msgstr ""
+"Вызов man:catopen[3] возвращает идентификатор каталога типа `nl_catd`. "
+"Обратитесь к справочной странице для получения списка возможных кодов ошибок."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:140
+msgid ""
+"After opening a catalog man:catgets[3] can be used to retrieve a message. "
+"The first parameter is the catalog identifier returned by man:catopen[3], "
+"the second one is the number of the set, the third one is the number of the "
+"messages, and the fourth one is a fallback message, which will be returned "
+"if the requested message cannot be retrieved from the catalog file."
+msgstr ""
+"После открытия каталога man:catgets[3] может быть использована для "
+"извлечения сообщения. Первый параметр — это идентификатор каталога, "
+"возвращаемый man:catopen[3], второй — номер набора, третий — номер "
+"сообщения, а четвертый — резервное сообщение, которое будет возвращено, если "
+"запрошенное сообщение не может быть извлечено из файла каталога."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:142
+msgid ""
+"After using the catalog file, it must be closed by calling man:catclose[3], "
+"which has one argument, the catalog id."
+msgstr ""
+"После использования файла каталога его необходимо закрыть, вызвав "
+"man:catclose[3], которая принимает один аргумент — идентификатор каталога."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:144
+#, no-wrap
+msgid "A Practical Example"
+msgstr "Практический пример"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:147
+msgid ""
+"The following example will demonstrate an easy solution on how to use NLS "
+"catalogs in a flexible way."
+msgstr ""
+"Следующий пример демонстрирует простое решение по гибкому использованию "
+"каталогов NLS."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:149
+msgid ""
+"The below lines need to be put into a common header file of the program, "
+"which is included into all source files where localized messages are "
+"necessary:"
+msgstr ""
+"Нижеследующие строки необходимо поместить в общий заголовочный файл "
+"программы, который включается во все исходные файлы, где необходимы "
+"локализованные сообщения:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:156
+#, no-wrap
+msgid ""
+"#ifdef WITHOUT_NLS\n"
+"#define getstr(n)\t nlsstr[n]\n"
+"#else\n"
+"#include nl_types.h\n"
+msgstr ""
+"#ifdef WITHOUT_NLS\n"
+"#define getstr(n)\t nlsstr[n]\n"
+"#else\n"
+"#include nl_types.h\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:160
+#, no-wrap
+msgid ""
+"extern nl_catd\t\t catalog;\n"
+"#define getstr(n)\t catgets(catalog, 1, n, nlsstr[n])\n"
+"#endif\n"
+msgstr ""
+"extern nl_catd\t\t catalog;\n"
+"#define getstr(n)\t catgets(catalog, 1, n, nlsstr[n])\n"
+"#endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:162
+#, no-wrap
+msgid "extern char\t\t*nlsstr[];\n"
+msgstr "extern char\t\t*nlsstr[];\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:165
+msgid ""
+"Next, put these lines into the global declaration part of the main source "
+"file:"
+msgstr ""
+"Далее, добавьте эти строки в глобальную секцию объявлений основного "
+"исходного файла:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:172
+#, no-wrap
+msgid ""
+"#ifndef WITHOUT_NLS\n"
+"#include nl_types.h\n"
+"nl_catd\t catalog;\n"
+"#endif\n"
+msgstr ""
+"#ifndef WITHOUT_NLS\n"
+"#include nl_types.h\n"
+"nl_catd\t catalog;\n"
+"#endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:182
+#, no-wrap
+msgid ""
+"/*\n"
+" * Default messages to use when NLS is disabled or no catalog\n"
+" * is found.\n"
+" */\n"
+"char *nlsstr[] = {\n"
+" \"\",\n"
+"/* 1*/ \"some random message\",\n"
+"/* 2*/ \"some other message\"\n"
+"};\n"
+msgstr ""
+"/*\n"
+" * Default messages to use when NLS is disabled or no catalog\n"
+" * is found.\n"
+" */\n"
+"char *nlsstr[] = {\n"
+" \"\",\n"
+"/* 1*/ \"some random message\",\n"
+"/* 2*/ \"some other message\"\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:185
+msgid ""
+"Next come the real code snippets, which open, read, and close the catalog:"
+msgstr ""
+"Далее следуют реальные фрагменты кода, которые открывают, читают и закрывают "
+"каталог:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:191
+#, no-wrap
+msgid ""
+"#ifndef WITHOUT_NLS\n"
+"\tcatalog = catopen(\"myapp\", NL_CAT_LOCALE);\n"
+"#endif\n"
+msgstr ""
+"#ifndef WITHOUT_NLS\n"
+"\tcatalog = catopen(\"myapp\", NL_CAT_LOCALE);\n"
+"#endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:193
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:197
+#, no-wrap
+msgid "...\n"
+msgstr "...\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:195
+#, no-wrap
+msgid "printf(getstr(1));\n"
+msgstr "printf(getstr(1));\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:201
+#, no-wrap
+msgid ""
+"#ifndef WITHOUT_NLS\n"
+"\tcatclose(catalog);\n"
+"#endif\n"
+msgstr ""
+"#ifndef WITHOUT_NLS\n"
+"\tcatclose(catalog);\n"
+"#endif\n"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:203
+#, no-wrap
+msgid "Reducing Strings to Localize"
+msgstr "Уменьшение количества строк для локализации"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:207
+msgid ""
+"There is a good way of reducing the strings that need to be localized by "
+"using libc error messages. This is also useful to just avoid duplication "
+"and provide consistent error messages for the common errors that can be "
+"encountered by a great many of programs."
+msgstr ""
+"Хороший способ уменьшить количество строк, требующих локализации, — "
+"использовать сообщения об ошибках из libc. Это также полезно для избежания "
+"дублирования и обеспечения единообразия сообщений об ошибках, с которыми "
+"может столкнуться множество программ."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:209
+msgid "First, here is an example that does not use libc error messages:"
+msgstr "Вот пример, который не использует сообщения об ошибках из libc:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:216
+#, no-wrap
+msgid ""
+"#include err.h\n"
+"...\n"
+"if (!S_ISDIR(st.st_mode))\n"
+"\terrx(1, \"argument is not a directory\");\n"
+msgstr ""
+"#include err.h\n"
+"...\n"
+"if (!S_ISDIR(st.st_mode))\n"
+"\terrx(1, \"argument is not a directory\");\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:219
+msgid ""
+"This can be transformed to print an error message by reading `errno` and "
+"printing an error message accordingly:"
+msgstr ""
+"Это можно преобразовать для вывода сообщения об ошибке, считывая `errno` и "
+"выводя соответствующее сообщение об ошибке:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:229
+#, no-wrap
+msgid ""
+"#include err.h\n"
+"#include errno.h\n"
+"...\n"
+"if (!S_ISDIR(st.st_mode)) {\n"
+"\terrno = ENOTDIR;\n"
+"\terr(1, NULL);\n"
+"}\n"
+msgstr ""
+"#include err.h\n"
+"#include errno.h\n"
+"...\n"
+"if (!S_ISDIR(st.st_mode)) {\n"
+"\terrno = ENOTDIR;\n"
+"\terr(1, NULL);\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:234
+msgid ""
+"In this example, the custom string is eliminated, thus translators will have "
+"less work when localizing the program and users will see the usual \"Not a "
+"directory\" error message when they encounter this error. This message will "
+"probably seem more familiar to them. Please note that it was necessary to "
+"include [.filename]#errno.h# in order to directly access `errno`."
+msgstr ""
+"В этом примере пользовательская строка исключена, что упростит работу "
+"переводчиков при локализации программы, а пользователи увидят стандартное "
+"сообщение об ошибке \"Not a directory\" при возникновении данной ошибки. Это "
+"сообщение, вероятно, будет выглядеть более привычным для них. Обратите "
+"внимание, что для прямого доступа к `errno` потребовалось включить "
+"[.filename]#errno.h#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:236
+msgid ""
+"It is worth to note that there are cases when `errno` is set automatically "
+"by a preceding call, so it is not necessary to set it explicitly:"
+msgstr ""
+"Стоит отметить, что бывают случаи, когда `errno` устанавливается "
+"автоматически предыдущим вызовом, поэтому нет необходимости устанавливать "
+"его явно:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:243
+#, no-wrap
+msgid ""
+"#include err.h\n"
+"...\n"
+"if ((p = malloc(size)) == NULL)\n"
+"\terr(1, NULL);\n"
+msgstr ""
+"#include err.h\n"
+"...\n"
+"if ((p = malloc(size)) == NULL)\n"
+"\terr(1, NULL);\n"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:246
+#, no-wrap
+msgid "Making use of [.filename]#bsd.nls.mk#"
+msgstr "Использование [.filename]#bsd.nls.mk#"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:251
+msgid ""
+"Using the catalog files requires few repeatable steps, such as compiling the "
+"catalogs and installing them to the proper location. In order to simplify "
+"this process even more, [.filename]#bsd.nls.mk# introduces some macros. It "
+"is not necessary to include [.filename]#bsd.nls.mk# explicitly, it is pulled "
+"in from the common Makefiles, such as [.filename]#bsd.prog.mk# or "
+"[.filename]#bsd.lib.mk#."
+msgstr ""
+"Использование файлов каталогов требует нескольких повторяемых шагов, таких "
+"как компиляция каталогов и их установка в нужное место. Чтобы ещё больше "
+"упростить этот процесс, [.filename]#bsd.nls.mk# вводит некоторые макросы. "
+"Нет необходимости явно включать [.filename]#bsd.nls.mk#, он подключается "
+"автоматически из общих Makefiles, таких как [.filename]#bsd.prog.mk# или "
+"[.filename]#bsd.lib.mk#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:255
+msgid ""
+"Usually it is enough to define `NLSNAME`, which should have the catalog name "
+"mentioned as the first argument of man:catopen[3] and list the catalog files "
+"in `NLS` without their `.msg` extension. Here is an example, which makes it "
+"possible to to disable NLS when used with the code examples before. The "
+"`WITHOUT_NLS` man:make[1] variable has to be defined in order to build the "
+"program without NLS support."
+msgstr ""
+"Обычно достаточно определить `NLSNAME`, которое должно содержать имя "
+"каталога, указанное в качестве первого аргумента man:catopen[3], и "
+"перечислить файлы каталогов в `NLS` без расширения `.msg`. Вот пример, "
+"который позволяет отключить NLS при использовании с предыдущими примерами "
+"кода. Для сборки программы без поддержки NLS необходимо определить "
+"переменную `WITHOUT_NLS` man:make[1]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:265
+#, no-wrap
+msgid ""
+".if !defined(WITHOUT_NLS)\n"
+"NLS=\tes_ES.ISO8859-1\n"
+"NLS+=\thu_HU.ISO8859-2\n"
+"NLS+=\tpt_BR.ISO8859-1\n"
+".else\n"
+"CFLAGS+=\t-DWITHOUT_NLS\n"
+".endif\n"
+msgstr ""
+".if !defined(WITHOUT_NLS)\n"
+"NLS=\tes_ES.ISO8859-1\n"
+"NLS+=\thu_HU.ISO8859-2\n"
+"NLS+=\tpt_BR.ISO8859-1\n"
+".else\n"
+"CFLAGS+=\t-DWITHOUT_NLS\n"
+".endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/l10n/_index.adoc:272
+msgid ""
+"Conventionally, the catalog files are placed under the [.filename]#nls# "
+"subdirectory and this is the default behavior of [.filename]#bsd.nls.mk#. "
+"It is possible, though to override the location of the catalogs with the "
+"`NLSSRCDIR` man:make[1] variable. The default name of the precompiled "
+"catalog files also follow the naming convention mentioned before. It can be "
+"overridden by setting the `NLSNAME` variable. There are other options to "
+"fine tune the processing of the catalog files but usually it is not needed, "
+"thus they are not described here. For further information on "
+"[.filename]#bsd.nls.mk#, please refer to the file itself, it is short and "
+"easy to understand."
+msgstr ""
+"Обычно файлы каталогов размещаются в подкаталоге [.filename]#nls#, и это "
+"поведение по умолчанию для [.filename]#bsd.nls.mk#. Однако можно "
+"переопределить расположение каталогов с помощью переменной `NLSSRCDIR` "
+"man:make[1]. Имя по умолчанию для предварительно скомпилированных файлов "
+"каталогов также следует упомянутому ранее соглашению об именовании. Его "
+"можно переопределить, установив переменную `NLSNAME`. Существуют и другие "
+"параметры для точной настройки обработки файлов каталогов, но обычно в этом "
+"нет необходимости, поэтому они здесь не описаны. Для получения "
+"дополнительной информации о [.filename]#bsd.nls.mk# обратитесь к самому "
+"файлу — он короткий и легко понятен."
diff --git a/documentation/content/ru/books/developers-handbook/parti.adoc b/documentation/content/ru/books/developers-handbook/parti.adoc
new file mode 100644
index 0000000000..adce578cf4
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/parti.adoc
@@ -0,0 +1,12 @@
+---
+next: books/developers-handbook/introduction
+params:
+ path: /books/developers-handbook/parti/
+prev: books/developers-handbook
+showBookMenu: true
+title: 'Часть I. Основы'
+weight: 1
+---
+
+[[basics]]
+= Основы
diff --git a/documentation/content/ru/books/developers-handbook/parti.po b/documentation/content/ru/books/developers-handbook/parti.po
new file mode 100644
index 0000000000..1b1ac9c56c
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/parti.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-06-22 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookparti/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/parti.adoc:1
+#, no-wrap
+msgid "Part I. Basics"
+msgstr "Часть I. Основы"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/parti.adoc:12
+#, no-wrap
+msgid "Basics"
+msgstr "Основы"
diff --git a/documentation/content/ru/books/developers-handbook/partii.adoc b/documentation/content/ru/books/developers-handbook/partii.adoc
new file mode 100644
index 0000000000..90b195599b
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/partii.adoc
@@ -0,0 +1,12 @@
+---
+next: books/developers-handbook/sockets
+params:
+ path: /books/developers-handbook/partii/
+prev: books/developers-handbook/testing
+showBookMenu: true
+title: 'Часть II. Межпроцессное взаимодействие'
+weight: 8
+---
+
+[[ipc]]
+= Межпроцессное взаимодействие
diff --git a/documentation/content/ru/books/developers-handbook/partii.po b/documentation/content/ru/books/developers-handbook/partii.po
new file mode 100644
index 0000000000..e6ef620442
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/partii.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-06-22 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookpartii/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/partii.adoc:1
+#, no-wrap
+msgid "Part II. Interprocess Communication"
+msgstr "Часть II. Межпроцессное взаимодействие"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/partii.adoc:12
+#, no-wrap
+msgid "Interprocess Communication"
+msgstr "Межпроцессное взаимодействие"
diff --git a/documentation/content/ru/books/developers-handbook/partiii.adoc b/documentation/content/ru/books/developers-handbook/partiii.adoc
new file mode 100644
index 0000000000..af235ae481
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/partiii.adoc
@@ -0,0 +1,12 @@
+---
+next: books/developers-handbook/kernelbuild
+params:
+ path: /books/developers-handbook/partiii/
+prev: books/developers-handbook/ipv6
+showBookMenu: true
+title: 'Часть III. Ядро системы'
+weight: 11
+---
+
+[[kernel]]
+= Ядро системы
diff --git a/documentation/content/ru/books/developers-handbook/partiii.po b/documentation/content/ru/books/developers-handbook/partiii.po
new file mode 100644
index 0000000000..784ac2476a
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/partiii.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-06-12 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookpartiii/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/partiii.adoc:1
+#, no-wrap
+msgid "Part III. Kernel"
+msgstr "Часть III. Ядро системы"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/partiii.adoc:12
+#, no-wrap
+msgid "Kernel"
+msgstr "Ядро системы"
diff --git a/documentation/content/ru/books/developers-handbook/partiv.adoc b/documentation/content/ru/books/developers-handbook/partiv.adoc
new file mode 100644
index 0000000000..e97b97bcaa
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/partiv.adoc
@@ -0,0 +1,12 @@
+---
+next: books/developers-handbook/x86
+params:
+ path: /books/developers-handbook/partiv/
+prev: books/developers-handbook/kerneldebug
+showBookMenu: true
+title: 'Часть IV. Архитектуры'
+weight: 14
+---
+
+[[architectures]]
+= Архитектуры
diff --git a/documentation/content/ru/books/developers-handbook/partiv.po b/documentation/content/ru/books/developers-handbook/partiv.po
new file mode 100644
index 0000000000..729cc84399
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/partiv.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-06-22 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookpartiv/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/partiv.adoc:1
+#, no-wrap
+msgid "Part IV. Architectures"
+msgstr "Часть IV. Архитектуры"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/partiv.adoc:12
+#, no-wrap
+msgid "Architectures"
+msgstr "Архитектуры"
diff --git a/documentation/content/ru/books/developers-handbook/partv.adoc b/documentation/content/ru/books/developers-handbook/partv.adoc
new file mode 100644
index 0000000000..a5f2aec1f5
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/partv.adoc
@@ -0,0 +1,12 @@
+---
+next: books/developers-handbook/bibliography
+params:
+ path: /books/developers-handbook/partv/
+prev: books/developers-handbook/x86
+showBookMenu: true
+title: 'Часть V. Приложения'
+weight: 16
+---
+
+[[appendices]]
+= Приложения
diff --git a/documentation/content/ru/books/developers-handbook/partv.po b/documentation/content/ru/books/developers-handbook/partv.po
new file mode 100644
index 0000000000..1871f3f359
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/partv.po
@@ -0,0 +1,31 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-06-07 17:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookpartv/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/partv.adoc:1
+#, no-wrap
+msgid "Part V. Appendices"
+msgstr "Часть V. Приложения"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/partv.adoc:12
+#, no-wrap
+msgid "Appendices"
+msgstr "Приложения"
diff --git a/documentation/content/ru/books/developers-handbook/policies/_index.adoc b/documentation/content/ru/books/developers-handbook/policies/_index.adoc
new file mode 100644
index 0000000000..7264035d7e
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/policies/_index.adoc
@@ -0,0 +1,148 @@
+---
+authors:
+ -
+ author: 'Poul-Henning Kamp'
+ -
+ author: 'Giorgos Keramidas'
+description: 'Руководство и политика работы с деревом исходного кода'
+next: books/developers-handbook/testing
+params:
+ path: /books/developers-handbook/policies/
+prev: books/developers-handbook/l10n
+showBookMenu: true
+tags: ["Style Guidelines", "MAINTAINER", "Makefiles", "Contributed Software", "Shared libraries"]
+title: 'Глава 5. Руководство и политика работы с деревом исходного кода'
+weight: 6
+---
+
+[[policies]]
+= Руководство и политика работы с деревом исходного кода
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 5
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Эта глава документирует различные руководства и политики, действующие для дерева исходных кодов FreeBSD.
+
+[[policies-style]]
+== Рекомендации по стилю
+
+Соблюдение единого стиля написания кода чрезвычайно важно, особенно в крупных проектах, таких как FreeBSD. Код должен соответствовать стилям программирования FreeBSD, описанным в man:style[9] и man:style.Makefile[5].
+
+[[policies-maintainer]]
+== `MAINTAINER` в Makefile-ах
+
+Если определённая часть дистрибутива FreeBSD [.filename]#src/# поддерживается человеком или группой лиц, это указывается в файле [.filename]#src/MAINTAINERS#. Сопровождающие портов в Коллекции портов указывают свою ответственность, добавляя строку `MAINTAINER` в [.filename]#Makefile# соответствующего порта:
+
+[.programlisting]
+....
+MAINTAINER= email-addresses
+....
+
+[TIP]
+====
+Для других частей репозитория или для разделов, в которых не указан сопровождающий, или если вы не уверены, кто является активным сопровождающим, попробуйте посмотреть историю последних коммитов соответствующих частей дерева исходного кода. Довольно часто сопровождающий явно не указан, но люди, которые активно работали с частью дерева исходного кода, скажем, последние пару лет, заинтересованы в проверке изменений. Даже если это не указано явно в документации или в самом исходном коде, запросить проверку из вежливости — вполне разумное действие.
+====
+
+Роль сопровождающего заключается в следующем:
+
+* Сопровождающий является владельцем и ответственным за этот код. Это означает, что он или она отвечает за исправление ошибок и решение проблем, связанных с этой частью кода, а в случае с предоставленным программным обеспечением — за отслеживание новых версий, если это необходимо.
+* Изменения в каталогах, для которых определен сопровождающий, должны быть отправлены сопровождающему на проверку и рецензирование перед коммитом. Только если сопровождающий не отвечает в течение недопустимо долгого времени на несколько писем, допустимо закоммитить изменения без его проверки. Тем не менее, рекомендуется по возможности попытаться получить рецензирование изменений у кого-нибудь ещё.
+* Конечно, недопустимо добавлять человека или группу в качестве сопровождающего, если они не согласны взять на себя эти обязанности. С другой стороны, это не обязательно должен быть один коммиттер, и это может быть и группа людей.
+
+[[policies-contributed]]
+== Стороннее программное обеспечение
+
+Некоторые части дистрибутива FreeBSD состоят из программного обеспечения, которое активно поддерживается за пределами проекта FreeBSD. По историческим причинам мы называем это _сторонним_ программным обеспечением. Некоторые примеры: LLVM, man:zlib[3] и man:awk[1].
+
+Принятая процедура управления вносимым программным обеспечением включает создание _ветки поставщика_ (_vendor branch_), где программное обеспечение может быть импортировано в чистом виде (без изменений), а обновления могут отслеживаться с учётом версий. Затем содержимое ветки поставщика применяется к дереву исходного кода, возможно, с локальными изменениями. Специфичные для FreeBSD элементы сборки поддерживаются в дереве исходного кода, а не в ветке поставщика.
+
+В зависимости от потребностей и сложности, отдельные программные проекты могут отклоняться от этой процедуры по усмотрению сопровождающего. Точные шаги, необходимые для обновления конкретного программного обеспечения, должны быть записаны в файле с именем `FREEBSD-upgrade`; например, link:https://cgit.freebsd.org/src/tree/contrib/libarchive/FREEBSD-upgrade[файл FREEBSD-upgrade libarchive].
+
+Стороннее программное обеспечение обычно размещается в подкаталоге [.filepath]#contrib/# дерева исходных кодов, за некоторыми исключениями. Стороннее программное обеспечение, используемое только ядром, находится в [.filepath]#sys/contrib/#.
+
+[NOTE]
+====
+Поскольку это затрудняет импорт будущих версий, незначительные, тривиальные и/или косметические изменения _настоятельно не рекомендуются_ для файлов, которые всё ещё отслеживают ветку поставщика.
+====
+
+[[vendor-import]]
+=== Импорт веток поставщика
+
+Стандартный процесс управления сторонним программным обеспечением и ветками поставщиков подробно описан в extref:{committers-guide}#vendor-import-git[Руководстве коммиттера].
+
+[[policies-encumbered]]
+== Файлы с правовыми ограничениями
+
+Время от времени может возникнуть необходимость включить файл с правовыми ограничениями (обремененными лицензиями, патентами) в дерево исходного кода FreeBSD. Например, если устройство требует загрузки небольшого бинарного кода перед началом работы, а у нас нет исходного кода для него, то такой бинарный файл считается обремененным. Следующие политики применяются к включению обремененных файлов в дерево исходного кода FreeBSD.
+
+. Любой файл, который интерпретируется или выполняется процессором(-ами) системы и не представлен в исходном формате, является обременённым.
+. Любой файл с лицензией более ограничительной, чем BSD или GNU, является обременённым.
+. Файл, содержащий загружаемые двоичные данные для использования оборудованием, не является обремененным, если к нему не применяется пункт (1) или (2).
+. Любой файл с правовыми ограничениями требует специального одобрения от link:https://www.FreeBSD.org/administration/#t-core[Core Team] перед добавлением в репозиторий.
+. Обремененные файлы помещаются в [.filename]#src/contrib# или [.filename]#src/sys/contrib#.
+. Весь модуль должен храниться вместе. Нет смысла разделять его, если только нет совместного использования кода с необременённой частью кода.
+. В прошлом бинарные файлы обычно кодировались с помощью uuencode и назывались [.filename]#arch/filename.o.uu#. Теперь в этом нет необходимости, и бинарные файлы могут добавляться в репозиторий без изменений.
+. Файлы ядра системы:
+.. Всегда должны быть указана в [.filename]#conf/files.*# (для упрощения сборки).
+.. Всегда должны быть в [.filename]#LINT#, но link:https://www.FreeBSD.org/administration/#t-core[Core Team] решает в каждом конкретном случае, следует ли их закомментировать или нет. link:https://www.FreeBSD.org/administration/#t-core[Core Team] может, конечно, позже изменить свое решение.
+.. _Инженер по выпуску_ решает, будет ли это включено в выпуск.
+
+. Пользовательские файлы:
+.. Команда link:https://www.FreeBSD.org/administration/#t-core[Core team] принимает решение о включении кода в базовую устанавливаемую систему.
+.. link:https://www.FreeBSD.org/administration/#t-re[Отдел разработки релизов] решает, войдет ли это в релиз.
+
+[[policies-shlib]]
+== Динамические библиотеки
+
+Если вы добавляете поддержку динамических библиотек в порт или другое программное обеспечение, у которого её нет, номера версий библиотек должны следовать этим правилам. Обычно итоговые номера не будут иметь ничего общего с версией выпуска программного обеспечения.
+
+Для портов:
+
+* Предпочитайте использовать номер, уже выбранный вышестоящим проектом
+* Если вышестоящий источник предоставляет управление версиями символов, убедитесь, что мы используем их скрипт
+
+Для базовой системы:
+
+* Начните версии библиотеки с 1
+* Настоятельно рекомендуется добавить контроль версий символов в новую библиотеку
+* Если есть несовместимое изменение, обработайте его с помощью версионирования символов, сохраняя обратную совместимость ABI
+* Если это невозможно или библиотека не использует версионирование символов, увеличьте версию библиотеки
+* Прежде чем даже рассматривать увеличение версии библиотеки для библиотеки с версионированием символов, проконсультируйтесь с командой Release Engineering, предоставив причины, почему изменение настолько важно, что его следует разрешить, несмотря на нарушение ABI
+
+Например, добавленные функции и исправления ошибок, не изменяющие интерфейсы, допустимы, тогда как удалённые функции, изменённый синтаксис вызовов и т.д. должны либо предоставлять обратно-совместимые символы, либо приведут к изменению старшего номера версии.
+
+Обязанность коммиттера, вносящего изменения, — управлять версионированием библиотек.
+
+Динамический загрузчик ELF сопоставляет имена библиотек буквально. Существует популярное соглашение, согласно которому версия библиотеки записывается в виде `libexample.so.x.y`, где x — это мажорная версия, а y — минорная. Общепринятой практикой является установка поля soname у библиотеки (тег ELF `DT_SONAME`) в `libexample.so.x`, а также создание символических ссылок `libexample.so.x->libexample.so.x.y`, `libexample.so->libexample.so.x` при установке библиотеки для последней минорной версии y. Таким образом, поскольку статический компоновщик ищет `libexample.so`, когда указана опция командной строки `-lexample`, объекты, скомпонованные с libexample, получают информацию о зависимости от правильной библиотеки. Почти все популярные системы сборки автоматически используют эту схему.
diff --git a/documentation/content/ru/books/developers-handbook/policies/_index.po b/documentation/content/ru/books/developers-handbook/policies/_index.po
new file mode 100644
index 0000000000..a5bda85033
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/policies/_index.po
@@ -0,0 +1,523 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookpolicies_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:1
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:17
+#, no-wrap
+msgid "Source Tree Guidelines and Policies"
+msgstr "Руководство и политика работы с деревом исходного кода"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:1
+#, no-wrap
+msgid "Chapter 5. Source Tree Guidelines and Policies"
+msgstr "Глава 5. Руководство и политика работы с деревом исходного кода"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:55
+msgid ""
+"This chapter documents various guidelines and policies in force for the "
+"FreeBSD source tree."
+msgstr ""
+"Эта глава документирует различные руководства и политики, действующие для "
+"дерева исходных кодов FreeBSD."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:57
+#, no-wrap
+msgid "Style Guidelines"
+msgstr "Рекомендации по стилю"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:61
+msgid ""
+"Consistent coding style is extremely important, particularly with large "
+"projects like FreeBSD. Code should follow the FreeBSD coding styles "
+"described in man:style[9] and man:style.Makefile[5]."
+msgstr ""
+"Соблюдение единого стиля написания кода чрезвычайно важно, особенно в "
+"крупных проектах, таких как FreeBSD. Код должен соответствовать стилям "
+"программирования FreeBSD, описанным в man:style[9] и man:style.Makefile[5]."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:63
+#, no-wrap
+msgid "`MAINTAINER` on Makefiles"
+msgstr "`MAINTAINER` в Makefile-ах"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:67
+msgid ""
+"If a particular portion of the FreeBSD [.filename]#src/# distribution is "
+"being maintained by a person or group of persons, this is communicated "
+"through an entry in [.filename]#src/MAINTAINERS#. Maintainers of ports "
+"within the Ports Collection express their maintainership to the world by "
+"adding a `MAINTAINER` line to the [.filename]#Makefile# of the port in "
+"question:"
+msgstr ""
+"Если определённая часть дистрибутива FreeBSD [.filename]#src/# "
+"поддерживается человеком или группой лиц, это указывается в файле "
+"[.filename]#src/MAINTAINERS#. Сопровождающие портов в Коллекции портов "
+"указывают свою ответственность, добавляя строку `MAINTAINER` в "
+"[.filename]#Makefile# соответствующего порта:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:71
+#, no-wrap
+msgid "MAINTAINER= email-addresses\n"
+msgstr "MAINTAINER= email-addresses\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:78
+msgid ""
+"For other parts of the repository, or for sections not listed as having a "
+"maintainer, or when you are unsure who the active maintainer is, try looking "
+"at the recent commit history of the relevant parts of the source tree. It "
+"is quite often the case that a maintainer is not explicitly named, but the "
+"people who are actively working in a part of the source tree for, say, the "
+"last couple of years are interested in reviewing changes. Even if this is "
+"not specifically mentioned in the documentation or the source itself, asking "
+"for a review as a form of courtesy is a very reasonable thing to do."
+msgstr ""
+"Для других частей репозитория или для разделов, в которых не указан "
+"сопровождающий, или если вы не уверены, кто является активным "
+"сопровождающим, попробуйте посмотреть историю последних коммитов "
+"соответствующих частей дерева исходного кода. Довольно часто сопровождающий "
+"явно не указан, но люди, которые активно работали с частью дерева исходного "
+"кода, скажем, последние пару лет, заинтересованы в проверке изменений. Даже "
+"если это не указано явно в документации или в самом исходном коде, запросить "
+"проверку из вежливости — вполне разумное действие."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:81
+msgid "The role of the maintainer is as follows:"
+msgstr "Роль сопровождающего заключается в следующем:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:83
+msgid ""
+"The maintainer owns and is responsible for that code. This means that he or "
+"she is responsible for fixing bugs and answering problem reports pertaining "
+"to that piece of the code, and in the case of contributed software, for "
+"tracking new versions, as appropriate."
+msgstr ""
+"Сопровождающий является владельцем и ответственным за этот код. Это "
+"означает, что он или она отвечает за исправление ошибок и решение проблем, "
+"связанных с этой частью кода, а в случае с предоставленным программным "
+"обеспечением — за отслеживание новых версий, если это необходимо."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:84
+msgid ""
+"Changes to directories which have a maintainer defined shall be sent to the "
+"maintainer for review before being committed. Only if the maintainer does "
+"not respond for an unacceptable period of time, to several emails, will it "
+"be acceptable to commit changes without review by the maintainer. However, "
+"it is suggested that you try to have the changes reviewed by someone else if "
+"at all possible."
+msgstr ""
+"Изменения в каталогах, для которых определен сопровождающий, должны быть "
+"отправлены сопровождающему на проверку и рецензирование перед коммитом. "
+"Только если сопровождающий не отвечает в течение недопустимо долгого времени "
+"на несколько писем, допустимо закоммитить изменения без его проверки. Тем не "
+"менее, рекомендуется по возможности попытаться получить рецензирование "
+"изменений у кого-нибудь ещё."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:85
+msgid ""
+"It is of course not acceptable to add a person or group as maintainer unless "
+"they agree to assume this duty. On the other hand it does not have to be a "
+"committer and it can easily be a group of people."
+msgstr ""
+"Конечно, недопустимо добавлять человека или группу в качестве "
+"сопровождающего, если они не согласны взять на себя эти обязанности. С "
+"другой стороны, это не обязательно должен быть один коммиттер, и это может "
+"быть и группа людей."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:87
+#, no-wrap
+msgid "Contributed Software"
+msgstr "Стороннее программное обеспечение"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:92
+msgid ""
+"Some parts of the FreeBSD distribution consist of software that is actively "
+"being maintained outside the FreeBSD project. For historical reasons, we "
+"call this _contributed_ software. Some examples are LLVM, man:zlib[3], and "
+"man:awk[1]."
+msgstr ""
+"Некоторые части дистрибутива FreeBSD состоят из программного обеспечения, "
+"которое активно поддерживается за пределами проекта FreeBSD. По историческим "
+"причинам мы называем это _сторонним_ программным обеспечением. Некоторые "
+"примеры: LLVM, man:zlib[3] и man:awk[1]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:96
+msgid ""
+"The accepted procedure for managing contributed software involves creating a "
+"_vendor branch_, where the software can be imported cleanly (without "
+"modification) and updates can be tracked in a versioned manner. Then, the "
+"content of the vendor branch is applied to the source tree, possibly with "
+"local modifications. FreeBSD-specific build glue is maintained in the "
+"source tree, not in the vendor branch."
+msgstr ""
+"Принятая процедура управления вносимым программным обеспечением включает "
+"создание _ветки поставщика_ (_vendor branch_), где программное обеспечение "
+"может быть импортировано в чистом виде (без изменений), а обновления могут "
+"отслеживаться с учётом версий. Затем содержимое ветки поставщика применяется "
+"к дереву исходного кода, возможно, с локальными изменениями. Специфичные для "
+"FreeBSD элементы сборки поддерживаются в дереве исходного кода, а не в ветке "
+"поставщика."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:100
+msgid ""
+"Depending on their needs and complexity, individual software projects may "
+"deviate from this procedure, at the discretion of the maintainer. The exact "
+"steps required to update a particular piece of contributed software should "
+"be recorded in a file named `FREEBSD-upgrade`; for example, link:https://"
+"cgit.freebsd.org/src/tree/contrib/libarchive/FREEBSD-upgrade[libarchive's "
+"FREEBSD-upgrade file]."
+msgstr ""
+"В зависимости от потребностей и сложности, отдельные программные проекты "
+"могут отклоняться от этой процедуры по усмотрению сопровождающего. Точные "
+"шаги, необходимые для обновления конкретного программного обеспечения, "
+"должны быть записаны в файле с именем `FREEBSD-upgrade`; например, "
+"link:https://cgit.freebsd.org/src/tree/contrib/libarchive/FREEBSD-"
+"upgrade[файл FREEBSD-upgrade libarchive]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:103
+msgid ""
+"Contributed software is usually placed in the [.filepath]#contrib/# "
+"subdirectory of the source tree, with some exceptions. Contributed software "
+"used only by the kernel lives under [.filepath]#sys/contrib/#."
+msgstr ""
+"Стороннее программное обеспечение обычно размещается в подкаталоге "
+"[.filepath]#contrib/# дерева исходных кодов, за некоторыми исключениями. "
+"Стороннее программное обеспечение, используемое только ядром, находится в "
+"[.filepath]#sys/contrib/#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:107
+msgid ""
+"Because it makes it harder to import future versions minor, trivial and/or "
+"cosmetic changes are _strongly discouraged_ on files that are still tracking "
+"the vendor branch."
+msgstr ""
+"Поскольку это затрудняет импорт будущих версий, незначительные, тривиальные "
+"и/или косметические изменения _настоятельно не рекомендуются_ для файлов, "
+"которые всё ещё отслеживают ветку поставщика."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:110
+#, no-wrap
+msgid "Vendor Imports"
+msgstr "Импорт веток поставщика"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:113
+msgid ""
+"The standard process for managing contributed software and vendor branches "
+"is described in detail by the extref:{committers-guide}#vendor-import-"
+"git[Committer's Guide]."
+msgstr ""
+"Стандартный процесс управления сторонним программным обеспечением и ветками "
+"поставщиков подробно описан в extref:{committers-guide}#vendor-import-"
+"git[Руководстве коммиттера]."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:115
+#, no-wrap
+msgid "Encumbered Files"
+msgstr "Файлы с правовыми ограничениями"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:121
+msgid ""
+"It might occasionally be necessary to include an encumbered file in the "
+"FreeBSD source tree. For example, if a device requires a small piece of "
+"binary code to be loaded to it before the device will operate, and we do not "
+"have the source to that code, then the binary file is said to be "
+"encumbered. The following policies apply to including encumbered files in "
+"the FreeBSD source tree."
+msgstr ""
+"Время от времени может возникнуть необходимость включить файл с правовыми "
+"ограничениями (обремененными лицензиями, патентами) в дерево исходного кода "
+"FreeBSD. Например, если устройство требует загрузки небольшого бинарного "
+"кода перед началом работы, а у нас нет исходного кода для него, то такой "
+"бинарный файл считается обремененным. Следующие политики применяются к "
+"включению обремененных файлов в дерево исходного кода FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:123
+msgid ""
+"Any file which is interpreted or executed by the system CPU(s) and not in "
+"source format is encumbered."
+msgstr ""
+"Любой файл, который интерпретируется или выполняется процессором(-ами) "
+"системы и не представлен в исходном формате, является обременённым."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:124
+msgid "Any file with a license more restrictive than BSD or GNU is encumbered."
+msgstr ""
+"Любой файл с лицензией более ограничительной, чем BSD или GNU, является "
+"обременённым."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:125
+msgid ""
+"A file which contains downloadable binary data for use by the hardware is "
+"not encumbered, unless (1) or (2) apply to it."
+msgstr ""
+"Файл, содержащий загружаемые двоичные данные для использования "
+"оборудованием, не является обремененным, если к нему не применяется пункт "
+"(1) или (2)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:126
+msgid ""
+"Any encumbered file requires specific approval from the link:https://"
+"www.FreeBSD.org/administration/#t-core[Core Team] before it is added to the "
+"repository."
+msgstr ""
+"Любой файл с правовыми ограничениями требует специального одобрения от "
+"link:https://www.FreeBSD.org/administration/#t-core[Core Team] перед "
+"добавлением в репозиторий."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:127
+msgid ""
+"Encumbered files go in [.filename]#src/contrib# or [.filename]#src/sys/"
+"contrib#."
+msgstr ""
+"Обремененные файлы помещаются в [.filename]#src/contrib# или [.filename]#src/"
+"sys/contrib#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:128
+msgid ""
+"The entire module should be kept together. There is no point in splitting "
+"it, unless there is code-sharing with non-encumbered code."
+msgstr ""
+"Весь модуль должен храниться вместе. Нет смысла разделять его, если только "
+"нет совместного использования кода с необременённой частью кода."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:130
+msgid ""
+"In the past binary files were typically uuencoded, and named "
+"[.filename]#arch/filename.o.uu#. This is no longer necessary, and binary "
+"files may be added to the repository unchanged."
+msgstr ""
+"В прошлом бинарные файлы обычно кодировались с помощью uuencode и назывались "
+"[.filename]#arch/filename.o.uu#. Теперь в этом нет необходимости, и бинарные "
+"файлы могут добавляться в репозиторий без изменений."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:131
+msgid "Kernel files:"
+msgstr "Файлы ядра системы:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:132
+msgid ""
+"Should always be referenced in [.filename]#conf/files.*# (for build "
+"simplicity)."
+msgstr ""
+"Всегда должны быть указана в [.filename]#conf/files.*# (для упрощения "
+"сборки)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:133
+msgid ""
+"Should always be in [.filename]#LINT#, but the link:https://www.FreeBSD.org/"
+"administration/#t-core[Core Team] decides per case if it should be commented "
+"out or not. The link:https://www.FreeBSD.org/administration/#t-core[Core "
+"Team] can, of course, change their minds later on."
+msgstr ""
+"Всегда должны быть в [.filename]#LINT#, но link:https://www.FreeBSD.org/"
+"administration/#t-core[Core Team] решает в каждом конкретном случае, следует "
+"ли их закомментировать или нет. link:https://www.FreeBSD.org/administration/"
+"#t-core[Core Team] может, конечно, позже изменить свое решение."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:134
+msgid "The _Release Engineer_ decides whether or not it goes into the release."
+msgstr "_Инженер по выпуску_ решает, будет ли это включено в выпуск."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:136
+msgid "User-land files:"
+msgstr "Пользовательские файлы:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:137
+msgid ""
+"The link:https://www.FreeBSD.org/administration/#t-core[Core team] decides "
+"if the code should be part of the installed base system."
+msgstr ""
+"Команда link:https://www.FreeBSD.org/administration/#t-core[Core team] "
+"принимает решение о включении кода в базовую устанавливаемую систему."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:138
+msgid ""
+"The link:https://www.FreeBSD.org/administration/#t-re[Release Engineering] "
+"decides if it goes into the release."
+msgstr ""
+"link:https://www.FreeBSD.org/administration/#t-re[Отдел разработки релизов] "
+"решает, войдет ли это в релиз."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:140
+#, no-wrap
+msgid "Shared Libraries"
+msgstr "Динамические библиотеки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:144
+msgid ""
+"If you are adding shared library support to a port or other piece of "
+"software that does not have one, the version numbers should follow these "
+"rules. Generally, the resulting numbers will have nothing to do with the "
+"release version of the software."
+msgstr ""
+"Если вы добавляете поддержку динамических библиотек в порт или другое "
+"программное обеспечение, у которого её нет, номера версий библиотек должны "
+"следовать этим правилам. Обычно итоговые номера не будут иметь ничего общего "
+"с версией выпуска программного обеспечения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:146
+msgid "For ports:"
+msgstr "Для портов:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:148
+msgid "Prefer using the number already selected by upstream"
+msgstr "Предпочитайте использовать номер, уже выбранный вышестоящим проектом"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:149
+msgid "If upstream provides symbol versioning, ensure that we use their script"
+msgstr ""
+"Если вышестоящий источник предоставляет управление версиями символов, "
+"убедитесь, что мы используем их скрипт"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:151
+msgid "For the base system:"
+msgstr "Для базовой системы:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:153
+msgid "Start library version from 1"
+msgstr "Начните версии библиотеки с 1"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:154
+msgid "It is strongly recommended to add symbol versioning to the new library"
+msgstr ""
+"Настоятельно рекомендуется добавить контроль версий символов в новую "
+"библиотеку"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:155
+msgid ""
+"If there is an incompatible change, handle it with symbol versioning, "
+"maintaining backward ABI compatibility"
+msgstr ""
+"Если есть несовместимое изменение, обработайте его с помощью версионирования "
+"символов, сохраняя обратную совместимость ABI"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:156
+msgid ""
+"If this is impossible, or the library does not use symbol versioning, bump "
+"the library version"
+msgstr ""
+"Если это невозможно или библиотека не использует версионирование символов, "
+"увеличьте версию библиотеки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:157
+msgid ""
+"Before even considering bumping library version for symbol-versioned "
+"library, consult with Release Engineering team, providing reasons why the "
+"change is so important that it should be allowed despite breaking the ABI"
+msgstr ""
+"Прежде чем даже рассматривать увеличение версии библиотеки для библиотеки с "
+"версионированием символов, проконсультируйтесь с командой Release "
+"Engineering, предоставив причины, почему изменение настолько важно, что его "
+"следует разрешить, несмотря на нарушение ABI"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:159
+msgid ""
+"For instance, added functions and bugfixes not changing the interfaces are "
+"fine, while deleted functions, changed function call syntax, etc. should "
+"either provide backward-compat symbols, or will force the major version "
+"number to change."
+msgstr ""
+"Например, добавленные функции и исправления ошибок, не изменяющие "
+"интерфейсы, допустимы, тогда как удалённые функции, изменённый синтаксис "
+"вызовов и т.д. должны либо предоставлять обратно-совместимые символы, либо "
+"приведут к изменению старшего номера версии."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:161
+msgid ""
+"It is the duty of the committer making the change to handle library "
+"versioning."
+msgstr ""
+"Обязанность коммиттера, вносящего изменения, — управлять версионированием "
+"библиотек."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/policies/_index.adoc:166
+msgid ""
+"The ELF dynamic linker matches library names literally. There is a popular "
+"convention where library version is written in the form `libexample.so.x.y`, "
+"where x is the major version, and y is minor. Common practice is to set the "
+"library' soname (`DT_SONAME` ELF tag) to `libexample.so.x`, and set up "
+"symlinks `libexample.so.x->libexample.so.x.y`, `libexample.so-"
+">libexample.so.x` on library installation for the latest minor version y. "
+"Then, since the static linker searches for `libexample.so` when the `-"
+"lexample` command line option is specified, objects linked with libexample "
+"get a dependency on the right library. Almost all popular build systems use "
+"this scheme automatically."
+msgstr ""
+"Динамический загрузчик ELF сопоставляет имена библиотек буквально. "
+"Существует популярное соглашение, согласно которому версия библиотеки "
+"записывается в виде `libexample.so.x.y`, где x — это мажорная версия, а y — "
+"минорная. Общепринятой практикой является установка поля soname у библиотеки "
+"(тег ELF `DT_SONAME`) в `libexample.so.x`, а также создание символических "
+"ссылок `libexample.so.x->libexample.so.x.y`, `libexample.so-"
+">libexample.so.x` при установке библиотеки для последней минорной версии y. "
+"Таким образом, поскольку статический компоновщик ищет `libexample.so`, когда "
+"указана опция командной строки `-lexample`, объекты, скомпонованные с "
+"libexample, получают информацию о зависимости от правильной библиотеки. "
+"Почти все популярные системы сборки автоматически используют эту схему."
diff --git a/documentation/content/ru/books/developers-handbook/secure/_index.adoc b/documentation/content/ru/books/developers-handbook/secure/_index.adoc
new file mode 100644
index 0000000000..1631ee018b
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/secure/_index.adoc
@@ -0,0 +1,230 @@
+---
+authors:
+ -
+ author: 'Murray Stokely'
+description: 'Безопасное программирование в FreeBSD'
+next: books/developers-handbook/l10n
+params:
+ path: /books/developers-handbook/secure/
+prev: books/developers-handbook/tools
+showBookMenu: true
+tags: ["secure programming", "Buffer Overflows", "SetUID issues"]
+title: 'Глава 3. Безопасное программирование'
+weight: 4
+---
+
+[[secure]]
+= Безопасное программирование
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 3
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[secure-synopsis]]
+== Обзор
+
+В этой главе описываются некоторые проблемы безопасности, которые преследуют программистов UNIX(R) на протяжении десятилетий, а также новые инструменты, помогающие избежать написания уязвимого кода.
+
+[[secure-philosophy]]
+== Методология безопасного проектирования
+
+Написание безопасных приложений требует очень внимательного и пессимистичного взгляда на жизнь. Приложения должны работать по принципу "наименьших привилегий", чтобы ни один процесс не выполнялся с доступом, превышающим необходимый минимум для выполнения его функций. По возможности следует повторно использовать уже проверенный код, чтобы избежать распространённых ошибок, которые, возможно, уже исправили другие.
+
+Одной из ловушек среды UNIX(R) является то, насколько легко делать предположения о разумности окружения. Приложения никогда не должны доверять пользовательскому вводу (во всех его формах), системным ресурсам, межпроцессному взаимодействию или времени событий. Процессы UNIX(R) выполняются не синхронно, поэтому логические операции редко бывают атомарными.
+
+[[secure-bufferov]]
+== Переполнение буфера
+
+Переполнение буфера существовало с самых истоков архитектуры фон Неймана crossref:bibliography[cod,1]. Впервые оно получило широкую известность в 1988 году благодаря червю Морриса. К сожалению, эта базовая атака остаётся эффективной и по сей день. Наиболее распространённый тип атаки с переполнением буфера основан на повреждении стека.
+
+Большинство современных компьютерных систем используют стек для передачи аргументов процедурам и хранения локальных переменных. Стек — это буфер типа "последним пришёл — первым ушёл" (LIFO) в верхней области памяти процесса. Когда программа вызывает функцию, создаётся новый "стековый кадр". Этот стековый кадр состоит из аргументов, переданных функции, а также динамического количества места для локальных переменных. "Указатель стека" — это регистр, который содержит текущее местоположение вершины стека. Поскольку это значение постоянно меняется по мере добавления новых значений на вершину стека, многие реализации также предоставляют "указатель кадра", который располагается вблизи начала стекового кадра, чтобы локальные переменные могли легче адресоваться относительно этого значения. crossref:bibliography[cod,1] Адрес возврата для вызовов функций также хранится в стеке, и это является причиной эксплойтов переполнения стека, поскольку переполнение локальной переменной в функции может перезаписать адрес возврата этой функции, потенциально позволяя злоумышленнику выполнить любой код по своему усмотрению.
+
+Хотя атаки на стек являются наиболее распространенными, также возможно переполнение стека с помощью атаки на кучу (malloc/free).
+
+Язык программирования C не выполняет автоматическую проверку границ массивов или указателей, как это делают многие другие языки. Кроме того, стандартная библиотека C содержит множество очень опасных функций.
+
+[.informaltable]
+[cols="1,1", frame="none"]
+|===
+
+|`strcpy`(char *dest, const char *src)
+|
+
+Может переполнить буфер назначения
+
+|`strcat`(char *dest, const char *src)
+|
+
+Может переполнить буфер назначения
+
+|`getwd`(char *buf)
+|
+
+Может переполнить буфер buf
+
+|`gets`(char *s)
+|
+
+Может переполнить буфер s
+
+|`[vf]scanf`(const char *format, ...)
+|
+
+Может переполнить свои аргументы.
+
+|`realpath`(char *path, char resolved_path[])
+|
+
+Может переполнить буфер пути
+
+|`[v]sprintf`(char *str, const char *format, ...)
+|
+
+Может переполнить буфер str.
+|===
+
+=== Пример переполнения буфера
+
+Следующий пример кода содержит переполнение буфера, предназначенное для перезаписи адреса возврата и пропуска инструкции, следующей сразу после вызова функции. (Вдохновлено crossref:bibliography[Phrack,4])
+
+[.programlisting]
+....
+#include <stdio.h>
+
+void manipulate(char *buffer) {
+ char newbuffer[80];
+ strcpy(newbuffer,buffer);
+}
+
+int main() {
+ char ch,buffer[4096];
+ int i=0;
+
+ while ((buffer[i++] = getchar()) != '\n') {};
+
+ i=1;
+ manipulate(buffer);
+ i=2;
+ printf("The value of i is : %d\n",i);
+ return 0;
+}
+....
+
+Давайте рассмотрим, как будет выглядеть образ памяти этого процесса, если мы введем 160 пробелов в нашу небольшую программу перед нажатием Enter.
+
+[XXX figure here!]
+
+Очевидно, что можно разработать более вредоносные входные данные для выполнения реальных скомпилированных инструкций (например, exec(/bin/sh)).
+
+=== Избегание переполнения буфера
+
+Наиболее простое решение проблемы переполнения стека — всегда использовать функции копирования памяти и строк с ограничением длины. `strncpy` и `strncat` являются частью стандартной библиотеки C. Эти функции принимают параметр длины, который не должен превышать размер целевого буфера. Затем эти функции копируют до 'length' байтов из источника в назначение. Однако у этих функций есть ряд проблем. Ни одна из них не гарантирует завершающий NUL, если размер входного буфера равен размеру целевого. Параметр длины также используется неодинаково между `strncpy` и `strncat`, что может сбивать программистов с толку относительно их правильного использования. Также наблюдается значительное снижение производительности по сравнению с `strcpy` при копировании короткой строки в большой буфер, поскольку `strncpy` заполняет оставшееся пространство до указанного размера символами NUL.
+
+Существует другая реализация копирования памяти для решения этих проблем. Функции `strlcpy` и `strlcat` гарантируют, что они всегда завершат строку назначения нулевым символом при передаче аргумента ненулевой длины.
+
+==== Скомпилированная проверка границ во время выполнения
+
+К сожалению, до сих пор существует очень большое количество кода в открытом доступе, который бездумно копирует память, не используя ни одну из ограниченных функций копирования, которые мы только что обсудили. К счастью, есть способ помочь предотвратить такие атаки — проверка границ во время выполнения, которая реализована в нескольких компиляторах C/C++.
+
+ProPolice — это одна из таких функций компилятора, интегрированная в man:gcc[1] версий 4.1 и выше. Она заменяет и расширяет более раннее расширение StackGuard для man:gcc[1].
+
+ProPolice помогает защититься от переполнений буфера на стеке и других атак, размещая псевдослучайные числа в ключевых областях стека перед вызовом любой функции. Когда функция завершается, эти "канарейки" проверяются, и если обнаруживается, что они были изменены, выполнение программы немедленно прекращается. Таким образом, любая попытка изменить адрес возврата или другие переменные, хранящиеся на стеке, с целью запуска вредоносного кода, вряд ли увенчается успехом, так как злоумышленнику также необходимо оставить псевдослучайные канарейки нетронутыми.
+
+Перекомпиляция вашего приложения с использованием ProPolice является эффективным способом предотвращения большинства атак, связанных с переполнением буфера, но оно всё ещё может быть скомпрометировано.
+
+==== Библиотечная проверка границ во время выполнения
+
+Механизмы на основе компилятора совершенно бесполезны для проприетарного программного обеспечения, которое невозможно перекомпилировать. Для таких ситуаций существует ряд библиотек, которые переопределяют небезопасные функции стандартной библиотеки C (`strcpy`, `fscanf`, `getwd` и т.д.) и гарантируют, что эти функции никогда не смогут записать данные за указатель стека.
+
+* libsafe
+* libverify
+* libparanoia
+
+К сожалению, эти защиты на основе библиотек имеют ряд недостатков. Они защищают лишь от очень небольшого набора проблем, связанных с безопасностью, и не устраняют основную причину. Эти защиты могут не сработать, если приложение было скомпилировано с флагом -fomit-frame-pointer. Кроме того, переменные окружения LD_PRELOAD и LD_LIBRARY_PATH могут быть перезаписаны или сброшены пользователем.
+
+[[secure-setuid]]
+== Проблемы с SetUID
+
+Существует как минимум 6 различных идентификаторов, связанных с каждым процессом, поэтому необходимо очень внимательно следить за уровнем доступа вашего процесса в любой момент времени. В частности, все приложения с seteuid должны отказываться от своих привилегий, как только в них больше нет необходимости.
+
+Действительный идентификатор пользователя может быть изменён только процессом с правами суперпользователя. Программа login устанавливает его при первоначальном входе пользователя в систему, и он редко изменяется.
+
+Эффективный идентификатор пользователя устанавливается функциями `exec()`, если у программы установлен бит seteuid. Приложение может вызывать `seteuid()` в любое время, чтобы установить эффективный идентификатор пользователя либо в реальный идентификатор пользователя, либо в сохранённый set-user-ID. Когда эффективный идентификатор пользователя устанавливается функциями `exec()`, предыдущее значение сохраняется в сохранённом set-user-ID.
+
+[[secure-chroot]]
+== Ограничение окружения вашей программы
+
+Традиционный метод ограничения процесса — это системный вызов `chroot()`. Этот системный вызов изменяет корневой каталог, от которого ссылаются все остальные пути для процесса и любых дочерних процессов. Для успешного выполнения этого вызова процесс должен иметь право на выполнение (поиск) в указанном каталоге. Новая среда фактически не вступает в силу, пока вы не выполните `chdir()` в новой среде. Также следует отметить, что процесс может легко выйти из окружения chroot, если он имеет привилегии root. Это может быть достигнуто путем создания узлов устройств для чтения памяти ядра, подключения отладчика к процессу вне окружения man:chroot[8] или многими другими творческими способами.
+
+Поведение системного вызова `chroot()` можно частично контролировать с помощью переменной `sysctl` kern.chroot_allow_open_directories. Если этому параметру присвоено значение 0, `chroot()` завершится с ошибкой EPERM, если есть какие-либо открытые каталоги. Если установлено значение по умолчанию 1, то `chroot()` завершится с ошибкой EPERM, если есть открытые каталоги и процесс уже находится внутри вызова `chroot()`. Для любого другого значения проверка на открытые каталоги будет полностью пропущена.
+
+=== Функциональность клеток FreeBSD
+
+Концепция `клетки` расширяет возможности `chroot()`, ограничивая права суперпользователя для создания настоящего `виртуального сервера`. После настройки клетки все сетевые взаимодействия должны осуществляться через указанный IP-адрес, а привилегии `root` внутри этой клетки сильно ограничены.
+
+Находясь в клетке, любые проверки прав суперпользователя в ядре с использованием вызова `suser()` завершатся неудачей. Однако некоторые вызовы `suser()` были заменены на новый интерфейс `suser_xxx()`. Эта функция отвечает за распознавание или запрет доступа к правам суперпользователя для процессов в клетке.
+
+Суперпользователь в среде клетки имеет возможность:
+
+* Управлять учетными данными с помощью `setuid`, `seteuid`, `setgid`, `setegid`, `setgroups`, `setreuid`, `setregid`, `setlogin`
+* Установливать ограничений ресурсов с помощью `setrlimit`
+* Изменять некоторые узлы sysctl (kern.hostname)
+* `chroot()`
+* Устанавливать флаги на vnode: `chflags`, `fchflags`
+* Устанавливать атрибуты vnode, такие как права доступа к файлу, владелец, группа, размер, время доступа и время изменения.
+* Привязываться к привилегированным портам в домене Интернета (порты < 1024)
+
+`Клетка` — это очень полезный инструмент для запуска приложений в безопасной среде, но у него есть некоторые недостатки. В настоящее время механизмы IPC не были преобразованы в `suser_xxx`, поэтому такие приложения, как MySQL, не могут быть запущены внутри клетки. Доступ суперпользователя может иметь очень ограниченное значение внутри клетки, но нет возможности точно указать, что означает «очень ограниченный».
+
+=== Возможности процесса в POSIX(R).1e
+
+POSIX(R) выпустил рабочий проект, который добавляет аудит событий, списки контроля доступа, детализированные привилегии, маркировку информации и обязательный контроль доступа.
+
+Это работа в процессе, и она является основным направлением проекта http://www.trustedbsd.org/[TrustedBSD]. Некоторые первоначальные наработки были добавлены в FreeBSD-CURRENT (cap_set_proc(3)).
+
+[[secure-trust]]
+== Доверие
+
+Приложение никогда не должно предполагать, что окружение пользователя является предсказуемым. Это включает (но не ограничивается): пользовательский ввод, сигналы, переменные окружения, ресурсы, IPC, mmaps, текущую рабочую директорию файловой системы, файловые дескрипторы, количество открытых файлов и т.д.
+
+Никогда не следует предполагать, что можно отловить все виды некорректных входных данных, которые может предоставить пользователь. Вместо этого ваше приложение должно использовать позитивную фильтрацию, разрешая только определённое подмножество входных данных, которые вы считаете безопасными. Некорректная проверка данных стала причиной многих уязвимостей, особенно в CGI-скриптах во всемирной паутине. Для имён файлов необходимо быть особенно осторожными с путями ("../", "/"), символическими ссылками и escape-символами оболочки.
+
+В Perl есть замечательная функция под названием "Режим Taint", которая может использоваться для предотвращения небезопасного использования данных, полученных извне программы. Этот режим проверяет аргументы командной строки, переменные окружения, информацию о локали, результаты определённых системных вызовов (`readdir()`, `readlink()`, `getpwxxx()`) и все вводимые данные из файлов.
+
+[[secure-race-conditions]]
+== Состояние гонки
+
+Состояние гонки — это аномальное поведение, вызванное непредвиденной зависимостью от относительного времени событий. Другими словами, программист ошибочно предположил, что определенное событие всегда произойдет раньше другого.
+
+Некоторые из распространённых причин состояний гонки — это сигналы, проверки доступа и открытие файлов. Сигналы по своей природе являются асинхронными событиями, поэтому при работе с ними необходимо проявлять особую осторожность. Проверка доступа с помощью `access(2)`, а затем `open(2)` явно неатомарна. Пользователи могут перемещать файлы между этими двумя вызовами. Вместо этого привилегированные приложения должны использовать `seteuid()`, а затем вызывать `open()` напрямую. По аналогии, приложение всегда должно устанавливать правильную маску (`umask`) перед вызовом `open()`, чтобы избежать необходимости в лишних вызовах `chmod()`.
diff --git a/documentation/content/ru/books/developers-handbook/secure/_index.po b/documentation/content/ru/books/developers-handbook/secure/_index.po
new file mode 100644
index 0000000000..c2900d4b7a
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/secure/_index.po
@@ -0,0 +1,824 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbooksecure_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:1
+#, no-wrap
+msgid "Secure Programming in FreeBSD"
+msgstr "Безопасное программирование в FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:1
+#, no-wrap
+msgid "Chapter 3. Secure Programming"
+msgstr "Глава 3. Безопасное программирование"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:16
+#, no-wrap
+msgid "Secure Programming"
+msgstr "Безопасное программирование"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:54
+#, no-wrap
+msgid "Synopsis"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:57
+msgid ""
+"This chapter describes some of the security issues that have plagued UNIX(R) "
+"programmers for decades and some of the new tools available to help "
+"programmers avoid writing exploitable code."
+msgstr ""
+"В этой главе описываются некоторые проблемы безопасности, которые преследуют "
+"программистов UNIX(R) на протяжении десятилетий, а также новые инструменты, "
+"помогающие избежать написания уязвимого кода."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:59
+#, no-wrap
+msgid "Secure Design Methodology"
+msgstr "Методология безопасного проектирования"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:64
+msgid ""
+"Writing secure applications takes a very scrutinous and pessimistic outlook "
+"on life. Applications should be run with the principle of \"least "
+"privilege\" so that no process is ever running with more than the bare "
+"minimum access that it needs to accomplish its function. Previously tested "
+"code should be reused whenever possible to avoid common mistakes that others "
+"may have already fixed."
+msgstr ""
+"Написание безопасных приложений требует очень внимательного и "
+"пессимистичного взгляда на жизнь. Приложения должны работать по принципу "
+"\"наименьших привилегий\", чтобы ни один процесс не выполнялся с доступом, "
+"превышающим необходимый минимум для выполнения его функций. По возможности "
+"следует повторно использовать уже проверенный код, чтобы избежать "
+"распространённых ошибок, которые, возможно, уже исправили другие."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:68
+msgid ""
+"One of the pitfalls of the UNIX(R) environment is how easy it is to make "
+"assumptions about the sanity of the environment. Applications should never "
+"trust user input (in all its forms), system resources, inter-process "
+"communication, or the timing of events. UNIX(R) processes do not execute "
+"synchronously so logical operations are rarely atomic."
+msgstr ""
+"Одной из ловушек среды UNIX(R) является то, насколько легко делать "
+"предположения о разумности окружения. Приложения никогда не должны доверять "
+"пользовательскому вводу (во всех его формах), системным ресурсам, "
+"межпроцессному взаимодействию или времени событий. Процессы UNIX(R) "
+"выполняются не синхронно, поэтому логические операции редко бывают "
+"атомарными."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:70
+#, no-wrap
+msgid "Buffer Overflows"
+msgstr "Переполнение буфера"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:76
+msgid ""
+"Buffer Overflows have been around since the very beginnings of the von "
+"Neumann crossref:bibliography[cod,1] architecture. They first gained "
+"widespread notoriety in 1988 with the Morris Internet worm. Unfortunately, "
+"the same basic attack remains effective today. By far the most common type "
+"of buffer overflow attack is based on corrupting the stack."
+msgstr ""
+"Переполнение буфера существовало с самых истоков архитектуры фон Неймана "
+"crossref:bibliography[cod,1]. Впервые оно получило широкую известность в "
+"1988 году благодаря червю Морриса. К сожалению, эта базовая атака остаётся "
+"эффективной и по сей день. Наиболее распространённый тип атаки с "
+"переполнением буфера основан на повреждении стека."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:85
+msgid ""
+"Most modern computer systems use a stack to pass arguments to procedures and "
+"to store local variables. A stack is a last in first out (LIFO) buffer in "
+"the high memory area of a process image. When a program invokes a function "
+"a new \"stack frame\" is created. This stack frame consists of the "
+"arguments passed to the function as well as a dynamic amount of local "
+"variable space. The \"stack pointer\" is a register that holds the current "
+"location of the top of the stack. Since this value is constantly changing "
+"as new values are pushed onto the top of the stack, many implementations "
+"also provide a \"frame pointer\" that is located near the beginning of a "
+"stack frame so that local variables can more easily be addressed relative to "
+"this value. crossref:bibliography[cod,1] The return address for function "
+"calls is also stored on the stack, and this is the cause of stack-overflow "
+"exploits since overflowing a local variable in a function can overwrite the "
+"return address of that function, potentially allowing a malicious user to "
+"execute any code he or she wants."
+msgstr ""
+"Большинство современных компьютерных систем используют стек для передачи "
+"аргументов процедурам и хранения локальных переменных. Стек — это буфер типа "
+"\"последним пришёл — первым ушёл\" (LIFO) в верхней области памяти процесса. "
+"Когда программа вызывает функцию, создаётся новый \"стековый кадр\". Этот "
+"стековый кадр состоит из аргументов, переданных функции, а также "
+"динамического количества места для локальных переменных. \"Указатель стека\" "
+"— это регистр, который содержит текущее местоположение вершины стека. "
+"Поскольку это значение постоянно меняется по мере добавления новых значений "
+"на вершину стека, многие реализации также предоставляют \"указатель кадра\", "
+"который располагается вблизи начала стекового кадра, чтобы локальные "
+"переменные могли легче адресоваться относительно этого значения. "
+"crossref:bibliography[cod,1] Адрес возврата для вызовов функций также "
+"хранится в стеке, и это является причиной эксплойтов переполнения стека, "
+"поскольку переполнение локальной переменной в функции может перезаписать "
+"адрес возврата этой функции, потенциально позволяя злоумышленнику выполнить "
+"любой код по своему усмотрению."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:88
+msgid ""
+"Although stack-based attacks are by far the most common, it would also be "
+"possible to overrun the stack with a heap-based (malloc/free) attack."
+msgstr ""
+"Хотя атаки на стек являются наиболее распространенными, также возможно "
+"переполнение стека с помощью атаки на кучу (malloc/free)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:91
+msgid ""
+"The C programming language does not perform automatic bounds checking on "
+"arrays or pointers as many other languages do. In addition, the standard C "
+"library is filled with a handful of very dangerous functions."
+msgstr ""
+"Язык программирования C не выполняет автоматическую проверку границ массивов "
+"или указателей, как это делают многие другие языки. Кроме того, стандартная "
+"библиотека C содержит множество очень опасных функций."
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:97
+#, no-wrap
+msgid "`strcpy`(char *dest, const char *src)"
+msgstr "`strcpy`(char *dest, const char *src)"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:101
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:106
+#, no-wrap
+msgid "May overflow the dest buffer"
+msgstr "Может переполнить буфер назначения"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:102
+#, no-wrap
+msgid "`strcat`(char *dest, const char *src)"
+msgstr "`strcat`(char *dest, const char *src)"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:107
+#, no-wrap
+msgid "`getwd`(char *buf)"
+msgstr "`getwd`(char *buf)"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:111
+#, no-wrap
+msgid "May overflow the buf buffer"
+msgstr "Может переполнить буфер buf"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:112
+#, no-wrap
+msgid "`gets`(char *s)"
+msgstr "`gets`(char *s)"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:116
+#, no-wrap
+msgid "May overflow the s buffer"
+msgstr "Может переполнить буфер s"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:117
+#, no-wrap
+msgid "`[vf]scanf`(const char *format, ...)"
+msgstr "`[vf]scanf`(const char *format, ...)"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:121
+#, no-wrap
+msgid "May overflow its arguments."
+msgstr "Может переполнить свои аргументы."
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:122
+#, no-wrap
+msgid "`realpath`(char *path, char resolved_path[])"
+msgstr "`realpath`(char *path, char resolved_path[])"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:126
+#, no-wrap
+msgid "May overflow the path buffer"
+msgstr "Может переполнить буфер пути"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:127
+#, no-wrap
+msgid "`[v]sprintf`(char *str, const char *format, ...)"
+msgstr "`[v]sprintf`(char *str, const char *format, ...)"
+
+#. type: Table
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:130
+#, no-wrap
+msgid "May overflow the str buffer."
+msgstr "Может переполнить буфер str."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:132
+#, no-wrap
+msgid "Example Buffer Overflow"
+msgstr "Пример переполнения буфера"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:135
+msgid ""
+"The following example code contains a buffer overflow designed to overwrite "
+"the return address and skip the instruction immediately following the "
+"function call. (Inspired by crossref:bibliography[Phrack,4])"
+msgstr ""
+"Следующий пример кода содержит переполнение буфера, предназначенное для "
+"перезаписи адреса возврата и пропуска инструкции, следующей сразу после "
+"вызова функции. (Вдохновлено crossref:bibliography[Phrack,4])"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:139
+#, no-wrap
+msgid "#include <stdio.h>\n"
+msgstr "#include <stdio.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:144
+#, no-wrap
+msgid ""
+"void manipulate(char *buffer) {\n"
+" char newbuffer[80];\n"
+" strcpy(newbuffer,buffer);\n"
+"}\n"
+msgstr ""
+"void manipulate(char *buffer) {\n"
+" char newbuffer[80];\n"
+" strcpy(newbuffer,buffer);\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:148
+#, no-wrap
+msgid ""
+"int main() {\n"
+" char ch,buffer[4096];\n"
+" int i=0;\n"
+msgstr ""
+"int main() {\n"
+" char ch,buffer[4096];\n"
+" int i=0;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:150
+#, no-wrap
+msgid " while ((buffer[i++] = getchar()) != '\\n') {};\n"
+msgstr " while ((buffer[i++] = getchar()) != '\\n') {};\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:157
+#, no-wrap
+msgid ""
+" i=1;\n"
+" manipulate(buffer);\n"
+" i=2;\n"
+" printf(\"The value of i is : %d\\n\",i);\n"
+" return 0;\n"
+"}\n"
+msgstr ""
+" i=1;\n"
+" manipulate(buffer);\n"
+" i=2;\n"
+" printf(\"The value of i is : %d\\n\",i);\n"
+" return 0;\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:160
+msgid ""
+"Let us examine what the memory image of this process would look like if we "
+"were to input 160 spaces into our little program before hitting return."
+msgstr ""
+"Давайте рассмотрим, как будет выглядеть образ памяти этого процесса, если мы "
+"введем 160 пробелов в нашу небольшую программу перед нажатием Enter."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:164
+msgid ""
+"Obviously more malicious input can be devised to execute actual compiled "
+"instructions (such as exec(/bin/sh))."
+msgstr ""
+"Очевидно, что можно разработать более вредоносные входные данные для "
+"выполнения реальных скомпилированных инструкций (например, exec(/bin/sh))."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:165
+#, no-wrap
+msgid "Avoiding Buffer Overflows"
+msgstr "Избегание переполнения буфера"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:175
+msgid ""
+"The most straightforward solution to the problem of stack-overflows is to "
+"always use length restricted memory and string copy functions. `strncpy` "
+"and `strncat` are part of the standard C library. These functions accept a "
+"length value as a parameter which should be no larger than the size of the "
+"destination buffer. These functions will then copy up to 'length' bytes "
+"from the source to the destination. However there are a number of problems "
+"with these functions. Neither function guarantees NUL termination if the "
+"size of the input buffer is as large as the destination. The length "
+"parameter is also used inconsistently between strncpy and strncat so it is "
+"easy for programmers to get confused as to their proper usage. There is "
+"also a significant performance loss compared to `strcpy` when copying a "
+"short string into a large buffer since `strncpy` NUL fills up the size "
+"specified."
+msgstr ""
+"Наиболее простое решение проблемы переполнения стека — всегда использовать "
+"функции копирования памяти и строк с ограничением длины. `strncpy` и "
+"`strncat` являются частью стандартной библиотеки C. Эти функции принимают "
+"параметр длины, который не должен превышать размер целевого буфера. Затем "
+"эти функции копируют до 'length' байтов из источника в назначение. Однако у "
+"этих функций есть ряд проблем. Ни одна из них не гарантирует завершающий "
+"NUL, если размер входного буфера равен размеру целевого. Параметр длины "
+"также используется неодинаково между `strncpy` и `strncat`, что может "
+"сбивать программистов с толку относительно их правильного использования. "
+"Также наблюдается значительное снижение производительности по сравнению с "
+"`strcpy` при копировании короткой строки в большой буфер, поскольку "
+"`strncpy` заполняет оставшееся пространство до указанного размера символами "
+"NUL."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:178
+msgid ""
+"Another memory copy implementation exists to get around these problems. The "
+"`strlcpy` and `strlcat` functions guarantee that they will always null "
+"terminate the destination string when given a non-zero length argument."
+msgstr ""
+"Существует другая реализация копирования памяти для решения этих проблем. "
+"Функции `strlcpy` и `strlcat` гарантируют, что они всегда завершат строку "
+"назначения нулевым символом при передаче аргумента ненулевой длины."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:179
+#, no-wrap
+msgid "Compiler based run-time bounds checking"
+msgstr "Скомпилированная проверка границ во время выполнения"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:183
+msgid ""
+"Unfortunately there is still a very large assortment of code in public use "
+"which blindly copies memory around without using any of the bounded copy "
+"routines we just discussed. Fortunately, there is a way to help prevent "
+"such attacks - run-time bounds checking, which is implemented by several C/C+"
+"+ compilers."
+msgstr ""
+"К сожалению, до сих пор существует очень большое количество кода в открытом "
+"доступе, который бездумно копирует память, не используя ни одну из "
+"ограниченных функций копирования, которые мы только что обсудили. К счастью, "
+"есть способ помочь предотвратить такие атаки — проверка границ во время "
+"выполнения, которая реализована в нескольких компиляторах C/C++."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:186
+msgid ""
+"ProPolice is one such compiler feature, and is integrated into man:gcc[1] "
+"versions 4.1 and later. It replaces and extends the earlier StackGuard "
+"man:gcc[1] extension."
+msgstr ""
+"ProPolice — это одна из таких функций компилятора, интегрированная в "
+"man:gcc[1] версий 4.1 и выше. Она заменяет и расширяет более раннее "
+"расширение StackGuard для man:gcc[1]."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:190
+msgid ""
+"ProPolice helps to protect against stack-based buffer overflows and other "
+"attacks by laying pseudo-random numbers in key areas of the stack before "
+"calling any function. When a function returns, these \"canaries\" are "
+"checked and if they are found to have been changed the executable is "
+"immediately aborted. Thus any attempt to modify the return address or other "
+"variable stored on the stack in an attempt to get malicious code to run is "
+"unlikely to succeed, as the attacker would have to also manage to leave the "
+"pseudo-random canaries untouched."
+msgstr ""
+"ProPolice помогает защититься от переполнений буфера на стеке и других атак, "
+"размещая псевдослучайные числа в ключевых областях стека перед вызовом любой "
+"функции. Когда функция завершается, эти \"канарейки\" проверяются, и если "
+"обнаруживается, что они были изменены, выполнение программы немедленно "
+"прекращается. Таким образом, любая попытка изменить адрес возврата или "
+"другие переменные, хранящиеся на стеке, с целью запуска вредоносного кода, "
+"вряд ли увенчается успехом, так как злоумышленнику также необходимо оставить "
+"псевдослучайные канарейки нетронутыми."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:192
+msgid ""
+"Recompiling your application with ProPolice is an effective means of "
+"stopping most buffer-overflow attacks, but it can still be compromised."
+msgstr ""
+"Перекомпиляция вашего приложения с использованием ProPolice является "
+"эффективным способом предотвращения большинства атак, связанных с "
+"переполнением буфера, но оно всё ещё может быть скомпрометировано."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:193
+#, no-wrap
+msgid "Library based run-time bounds checking"
+msgstr "Библиотечная проверка границ во время выполнения"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:197
+msgid ""
+"Compiler-based mechanisms are completely useless for binary-only software "
+"for which you cannot recompile. For these situations there are a number of "
+"libraries which re-implement the unsafe functions of the C-library "
+"(`strcpy`, `fscanf`, `getwd`, etc..) and ensure that these functions can "
+"never write past the stack pointer."
+msgstr ""
+"Механизмы на основе компилятора совершенно бесполезны для проприетарного "
+"программного обеспечения, которое невозможно перекомпилировать. Для таких "
+"ситуаций существует ряд библиотек, которые переопределяют небезопасные "
+"функции стандартной библиотеки C (`strcpy`, `fscanf`, `getwd` и т.д.) и "
+"гарантируют, что эти функции никогда не смогут записать данные за указатель "
+"стека."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:199
+msgid "libsafe"
+msgstr "libsafe"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:200
+msgid "libverify"
+msgstr "libverify"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:201
+msgid "libparanoia"
+msgstr "libparanoia"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:206
+msgid ""
+"Unfortunately these library-based defenses have a number of shortcomings. "
+"These libraries only protect against a very small set of security related "
+"issues and they neglect to fix the actual problem. These defenses may fail "
+"if the application was compiled with -fomit-frame-pointer. Also, the "
+"LD_PRELOAD and LD_LIBRARY_PATH environment variables can be overwritten/"
+"unset by the user."
+msgstr ""
+"К сожалению, эти защиты на основе библиотек имеют ряд недостатков. Они "
+"защищают лишь от очень небольшого набора проблем, связанных с безопасностью, "
+"и не устраняют основную причину. Эти защиты могут не сработать, если "
+"приложение было скомпилировано с флагом -fomit-frame-pointer. Кроме того, "
+"переменные окружения LD_PRELOAD и LD_LIBRARY_PATH могут быть перезаписаны "
+"или сброшены пользователем."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:208
+#, no-wrap
+msgid "SetUID issues"
+msgstr "Проблемы с SetUID"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:212
+msgid ""
+"There are at least 6 different IDs associated with any given process, and "
+"you must therefore be very careful with the access that your process has at "
+"any given time. In particular, all seteuid applications should give up "
+"their privileges as soon as it is no longer required."
+msgstr ""
+"Существует как минимум 6 различных идентификаторов, связанных с каждым "
+"процессом, поэтому необходимо очень внимательно следить за уровнем доступа "
+"вашего процесса в любой момент времени. В частности, все приложения с "
+"seteuid должны отказываться от своих привилегий, как только в них больше нет "
+"необходимости."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:215
+msgid ""
+"The real user ID can only be changed by a superuser process. The login "
+"program sets this when a user initially logs in and it is seldom changed."
+msgstr ""
+"Действительный идентификатор пользователя может быть изменён только "
+"процессом с правами суперпользователя. Программа login устанавливает его при "
+"первоначальном входе пользователя в систему, и он редко изменяется."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:219
+msgid ""
+"The effective user ID is set by the `exec()` functions if a program has its "
+"seteuid bit set. An application can call `seteuid()` at any time to set the "
+"effective user ID to either the real user ID or the saved set-user-ID. When "
+"the effective user ID is set by `exec()` functions, the previous value is "
+"saved in the saved set-user-ID."
+msgstr ""
+"Эффективный идентификатор пользователя устанавливается функциями `exec()`, "
+"если у программы установлен бит seteuid. Приложение может вызывать "
+"`seteuid()` в любое время, чтобы установить эффективный идентификатор "
+"пользователя либо в реальный идентификатор пользователя, либо в сохранённый "
+"set-user-ID. Когда эффективный идентификатор пользователя устанавливается "
+"функциями `exec()`, предыдущее значение сохраняется в сохранённом set-user-"
+"ID."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:221
+#, no-wrap
+msgid "Limiting your program's environment"
+msgstr "Ограничение окружения вашей программы"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:229
+msgid ""
+"The traditional method of restricting a process is with the `chroot()` "
+"system call. This system call changes the root directory from which all "
+"other paths are referenced for a process and any child processes. For this "
+"call to succeed the process must have execute (search) permission on the "
+"directory being referenced. The new environment does not actually take "
+"effect until you `chdir()` into your new environment. It should also be "
+"noted that a process can easily break out of a chroot environment if it has "
+"root privilege. This could be accomplished by creating device nodes to read "
+"kernel memory, attaching a debugger to a process outside of the "
+"man:chroot[8] environment, or in many other creative ways."
+msgstr ""
+"Традиционный метод ограничения процесса — это системный вызов `chroot()`. "
+"Этот системный вызов изменяет корневой каталог, от которого ссылаются все "
+"остальные пути для процесса и любых дочерних процессов. Для успешного "
+"выполнения этого вызова процесс должен иметь право на выполнение (поиск) в "
+"указанном каталоге. Новая среда фактически не вступает в силу, пока вы не "
+"выполните `chdir()` в новой среде. Также следует отметить, что процесс может "
+"легко выйти из окружения chroot, если он имеет привилегии root. Это может "
+"быть достигнуто путем создания узлов устройств для чтения памяти ядра, "
+"подключения отладчика к процессу вне окружения man:chroot[8] или многими "
+"другими творческими способами."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:234
+msgid ""
+"The behavior of the `chroot()` system call can be controlled somewhat with "
+"the kern.chroot_allow_open_directories `sysctl` variable. When this value "
+"is set to 0, `chroot()` will fail with EPERM if there are any directories "
+"open. If set to the default value of 1, then `chroot()` will fail with "
+"EPERM if there are any directories open and the process is already subject "
+"to a `chroot()` call. For any other value, the check for open directories "
+"will be bypassed completely."
+msgstr ""
+"Поведение системного вызова `chroot()` можно частично контролировать с "
+"помощью переменной `sysctl` kern.chroot_allow_open_directories. Если этому "
+"параметру присвоено значение 0, `chroot()` завершится с ошибкой EPERM, если "
+"есть какие-либо открытые каталоги. Если установлено значение по умолчанию 1, "
+"то `chroot()` завершится с ошибкой EPERM, если есть открытые каталоги и "
+"процесс уже находится внутри вызова `chroot()`. Для любого другого значения "
+"проверка на открытые каталоги будет полностью пропущена."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:235
+#, no-wrap
+msgid "FreeBSD's jail functionality"
+msgstr "Функциональность клеток FreeBSD"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:239
+msgid ""
+"The concept of a Jail extends upon the `chroot()` by limiting the powers of "
+"the superuser to create a true `virtual server'. Once a prison is set up "
+"all network communication must take place through the specified IP address, "
+"and the power of \"root privilege\" in this jail is severely constrained."
+msgstr ""
+"Концепция `клетки` расширяет возможности `chroot()`, ограничивая права "
+"суперпользователя для создания настоящего `виртуального сервера`. После "
+"настройки клетки все сетевые взаимодействия должны осуществляться через "
+"указанный IP-адрес, а привилегии `root` внутри этой клетки сильно ограничены."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:243
+msgid ""
+"While in a prison, any tests of superuser power within the kernel using the "
+"`suser()` call will fail. However, some calls to `suser()` have been "
+"changed to a new interface `suser_xxx()`. This function is responsible for "
+"recognizing or denying access to superuser power for imprisoned processes."
+msgstr ""
+"Находясь в клетке, любые проверки прав суперпользователя в ядре с "
+"использованием вызова `suser()` завершатся неудачей. Однако некоторые вызовы "
+"`suser()` были заменены на новый интерфейс `suser_xxx()`. Эта функция "
+"отвечает за распознавание или запрет доступа к правам суперпользователя для "
+"процессов в клетке."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:245
+msgid "A superuser process within a jailed environment has the power to:"
+msgstr "Суперпользователь в среде клетки имеет возможность:"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:247
+msgid ""
+"Manipulate credential with `setuid`, `seteuid`, `setgid`, `setegid`, "
+"`setgroups`, `setreuid`, `setregid`, `setlogin`"
+msgstr ""
+"Управлять учетными данными с помощью `setuid`, `seteuid`, `setgid`, "
+"`setegid`, `setgroups`, `setreuid`, `setregid`, `setlogin`"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:248
+msgid "Set resource limits with `setrlimit`"
+msgstr "Установливать ограничений ресурсов с помощью `setrlimit`"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:249
+msgid "Modify some sysctl nodes (kern.hostname)"
+msgstr "Изменять некоторые узлы sysctl (kern.hostname)"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:250
+msgid "`chroot()`"
+msgstr "`chroot()`"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:251
+msgid "Set flags on a vnode: `chflags`, `fchflags`"
+msgstr "Устанавливать флаги на vnode: `chflags`, `fchflags`"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:252
+msgid ""
+"Set attributes of a vnode such as file permission, owner, group, size, "
+"access time, and modification time."
+msgstr ""
+"Устанавливать атрибуты vnode, такие как права доступа к файлу, владелец, "
+"группа, размер, время доступа и время изменения."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:253
+msgid "Bind to privileged ports in the Internet domain (ports < 1024)"
+msgstr ""
+"Привязываться к привилегированным портам в домене Интернета (порты < 1024)"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:257
+msgid ""
+"`Jail` is a very useful tool for running applications in a secure "
+"environment but it does have some shortcomings. Currently, the IPC "
+"mechanisms have not been converted to the `suser_xxx` so applications such "
+"as MySQL cannot be run within a jail. Superuser access may have a very "
+"limited meaning within a jail, but there is no way to specify exactly what "
+"\"very limited\" means."
+msgstr ""
+"`Клетка` — это очень полезный инструмент для запуска приложений в безопасной "
+"среде, но у него есть некоторые недостатки. В настоящее время механизмы IPC "
+"не были преобразованы в `suser_xxx`, поэтому такие приложения, как MySQL, не "
+"могут быть запущены внутри клетки. Доступ суперпользователя может иметь "
+"очень ограниченное значение внутри клетки, но нет возможности точно указать, "
+"что означает «очень ограниченный»."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:258
+#, no-wrap
+msgid "POSIX(R).1e Process Capabilities"
+msgstr "Возможности процесса в POSIX(R).1e"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:261
+msgid ""
+"POSIX(R) has released a working draft that adds event auditing, access "
+"control lists, fine grained privileges, information labeling, and mandatory "
+"access control."
+msgstr ""
+"POSIX(R) выпустил рабочий проект, который добавляет аудит событий, списки "
+"контроля доступа, детализированные привилегии, маркировку информации и "
+"обязательный контроль доступа."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:264
+msgid ""
+"This is a work in progress and is the focus of the http://www.trustedbsd.org/"
+"[TrustedBSD] project. Some of the initial work has been committed to "
+"FreeBSD-CURRENT (cap_set_proc(3))."
+msgstr ""
+"Это работа в процессе, и она является основным направлением проекта http://"
+"www.trustedbsd.org/[TrustedBSD]. Некоторые первоначальные наработки были "
+"добавлены в FreeBSD-CURRENT (cap_set_proc(3))."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:266
+#, no-wrap
+msgid "Trust"
+msgstr "Доверие"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:270
+msgid ""
+"An application should never assume that anything about the users environment "
+"is sane. This includes (but is certainly not limited to): user input, "
+"signals, environment variables, resources, IPC, mmaps, the filesystem "
+"working directory, file descriptors, the # of open files, etc."
+msgstr ""
+"Приложение никогда не должно предполагать, что окружение пользователя "
+"является предсказуемым. Это включает (но не ограничивается): "
+"пользовательский ввод, сигналы, переменные окружения, ресурсы, IPC, mmaps, "
+"текущую рабочую директорию файловой системы, файловые дескрипторы, "
+"количество открытых файлов и т.д."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:275
+msgid ""
+"You should never assume that you can catch all forms of invalid input that a "
+"user might supply. Instead, your application should use positive filtering "
+"to only allow a specific subset of inputs that you deem safe. Improper data "
+"validation has been the cause of many exploits, especially with CGI scripts "
+"on the world wide web. For filenames you need to be extra careful about "
+"paths (\"../\", \"/\"), symbolic links, and shell escape characters."
+msgstr ""
+"Никогда не следует предполагать, что можно отловить все виды некорректных "
+"входных данных, которые может предоставить пользователь. Вместо этого ваше "
+"приложение должно использовать позитивную фильтрацию, разрешая только "
+"определённое подмножество входных данных, которые вы считаете безопасными. "
+"Некорректная проверка данных стала причиной многих уязвимостей, особенно в "
+"CGI-скриптах во всемирной паутине. Для имён файлов необходимо быть особенно "
+"осторожными с путями (\"../\", \"/\"), символическими ссылками и escape-"
+"символами оболочки."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:278
+msgid ""
+"Perl has a really cool feature called \"Taint\" mode which can be used to "
+"prevent scripts from using data derived outside the program in an unsafe "
+"way. This mode will check command line arguments, environment variables, "
+"locale information, the results of certain syscalls (`readdir()`, "
+"`readlink()`, `getpwxxx()`), and all file input."
+msgstr ""
+"В Perl есть замечательная функция под названием \"Режим Taint\", которая "
+"может использоваться для предотвращения небезопасного использования данных, "
+"полученных извне программы. Этот режим проверяет аргументы командной строки, "
+"переменные окружения, информацию о локали, результаты определённых системных "
+"вызовов (`readdir()`, `readlink()`, `getpwxxx()`) и все вводимые данные из "
+"файлов."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:280
+#, no-wrap
+msgid "Race Conditions"
+msgstr "Состояние гонки"
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:284
+msgid ""
+"A race condition is anomalous behavior caused by the unexpected dependence "
+"on the relative timing of events. In other words, a programmer incorrectly "
+"assumed that a particular event would always happen before another."
+msgstr ""
+"Состояние гонки — это аномальное поведение, вызванное непредвиденной "
+"зависимостью от относительного времени событий. Другими словами, программист "
+"ошибочно предположил, что определенное событие всегда произойдет раньше "
+"другого."
+
+#. type: XXX figure here!
+#: documentation/content/en/books/developers-handbook/secure/_index.adoc:290
+msgid ""
+"Some of the common causes of race conditions are signals, access checks, and "
+"file opens. Signals are asynchronous events by nature so special care must "
+"be taken in dealing with them. Checking access with `access(2)` then "
+"`open(2)` is clearly non-atomic. Users can move files in between the two "
+"calls. Instead, privileged applications should `seteuid()` and then call "
+"`open()` directly. Along the same lines, an application should always set a "
+"proper umask before `open()` to obviate the need for spurious `chmod()` "
+"calls."
+msgstr ""
+"Некоторые из распространённых причин состояний гонки — это сигналы, проверки "
+"доступа и открытие файлов. Сигналы по своей природе являются асинхронными "
+"событиями, поэтому при работе с ними необходимо проявлять особую "
+"осторожность. Проверка доступа с помощью `access(2)`, а затем `open(2)` явно "
+"неатомарна. Пользователи могут перемещать файлы между этими двумя вызовами. "
+"Вместо этого привилегированные приложения должны использовать `seteuid()`, а "
+"затем вызывать `open()` напрямую. По аналогии, приложение всегда должно "
+"устанавливать правильную маску (`umask`) перед вызовом `open()`, чтобы "
+"избежать необходимости в лишних вызовах `chmod()`."
diff --git a/documentation/content/ru/books/developers-handbook/sockets/_index.adoc b/documentation/content/ru/books/developers-handbook/sockets/_index.adoc
new file mode 100644
index 0000000000..669a53fb60
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/sockets/_index.adoc
@@ -0,0 +1,909 @@
+---
+authors:
+ -
+ author: 'G. Adam Stanislav'
+description: 'Сокеты FreeBSD'
+next: books/developers-handbook/ipv6
+params:
+ path: /books/developers-handbook/sockets/
+prev: books/developers-handbook/partii
+showBookMenu: true
+tags: ["Sockets", "Protocols"]
+title: 'Глава 7. Сокеты'
+weight: 9
+---
+
+[[sockets]]
+= Сокеты
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 7
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[sockets-synopsis]]
+== Обзор
+
+Сокеты BSD выводят межпроцессное взаимодействие на новый уровень. Теперь взаимодействующие процессы не обязательно должны выполняться на одной машине. Они всё ещё _могут_, но не обязаны.
+
+Не только эти процессы не обязаны выполняться на одной машине, они также могут работать под разными операционными системами. Благодаря BSD-сокетам, ваше ПО на FreeBSD может легко взаимодействовать с программой, работающей на Macintosh(R), другой — на рабочей станции Sun(TM), и ещё одной — под Windows(R) 2000, при этом все они подключены к локальной сети на основе Ethernet.
+
+Но ваше программное обеспечение может так же эффективно взаимодействовать с процессами, работающими в другом здании, на другом континенте, внутри подводной лодки или космического челнока.
+
+Он также может взаимодействовать с процессами, которые не являются частью компьютера (по крайней мере, не в строгом смысле этого слова), а таких устройств, как принтеры, цифровые камеры, медицинское оборудование. Практически со всем, что способно к цифровой коммуникации.
+
+[[sockets-diversity]]
+== Сетевое взаимодействие и разнообразие
+
+Мы уже упоминали о _разнообразии_ сетевых технологий. Множество различных систем должны взаимодействовать друг с другом. И они должны говорить на одном языке. Также они должны _понимать_ этот язык одинаковым образом.
+
+Часто думают, что _язык тела_ универсален. Но это не так. В ранней юности отец взял меня с собой в Болгарию. Мы сидели за столиком в парке Софии, когда к нам подошел продавец, предлагая купить жареный миндаль.
+
+Я тогда еще не знал болгарского, поэтому вместо словесного отказа я покачал головой из стороны в сторону — это «универсальный» язык тела для обозначения _нет_. Продавец тут же начал угощать нас миндалем.
+
+Затем я вспомнил, что мне говорили, будто в Болгарии покачивание головой из стороны в сторону означает _да_. Быстро я начал кивать головой вверх-вниз. Продавец заметил, взял свои миндалины и ушёл. Для непосвящённого наблюдателя я не изменил язык тела: я продолжал использовать движения головой — покачивание и кивание. Изменился _смысл_ языка тела. Сначала продавец и я интерпретировали одни и те же жесты как имеющие совершенно разный смысл. Мне пришлось скорректировать свою собственную интерпретацию этих жестов, чтобы продавец меня понял.
+
+То же самое и с компьютерами: одни и те же символы могут иметь разное, даже полностью противоположное значение. Поэтому, чтобы два компьютера понимали друг друга, они должны договориться не только об одном _языке_, но и об одном _толковании_ языка.
+
+[[sockets-protocols]]
+== Протоколы
+
+В то время как различные языки программирования обычно имеют сложный синтаксис и используют множество многосимвольных зарезервированных слов (что облегчает их понимание для человека-программиста), языки передачи данных, как правило, очень лаконичны. Вместо многосимвольных слов они часто используют отдельные _биты_. Для этого есть очень убедительная причина: хотя данные внутри вашего компьютера передаются со скоростью, близкой к скорости света, между двумя компьютерами они часто передаются значительно медленнее.
+
+Поскольку языки, используемые в передаче данных, настолько лаконичны, мы обычно называем их _протоколами_, а не языками.
+
+При передаче данных от одного компьютера к другому всегда используется более одного протокола. Эти протоколы _располагаются слоями_. Данные можно сравнить с внутренней частью лука: необходимо снять несколько слоёв «кожи», чтобы добраться до данных. Это лучше всего проиллюстрировано на рисунке:
+
+.Уровни протоколов
+image::layers.png[]
+
+В этом примере мы пытаемся получить изображение с веб-страницы, к которой подключены через Ethernet.
+
+Изображение состоит из необработанных данных, которые представляют собой просто последовательность значений RGB, которые наше программное обеспечение может обработать, т.е. преобразовать в изображение и отобразить на нашем мониторе.
+
+Увы, наше программное обеспечение не может определить, как организованы сырые данные: это последовательность значений RGB, последовательность интенсивностей в градациях серого или, возможно, цвета в кодировке CMYK? Представлены ли данные 8-битными квантами, или они имеют размер 16 бит, а может быть, 4 бита? Из скольких строк и столбцов состоит изображение? Должны ли определённые пиксели быть прозрачными?
+
+Я думаю, вы поняли...
+
+Чтобы наше программное обеспечение понимало, как обрабатывать сырые данные, они кодируются в формате PNG. Это мог бы быть GIF или JPEG, но выбран PNG.
+
+И PNG — это протокол.
+
+В этот момент я слышу, как некоторые из вас кричат: _"Нет, это не так! Это формат файла!"_
+
+Ну что ж, конечно, это формат файла. Но с точки зрения передачи данных, формат файла — это протокол: структура файла — это _язык_, причем лаконичный, сообщающий нашему _процессу_, как организованы данные. Следовательно, это _протокол_.
+
+Увы, если бы мы получили только PNG-файл, наше программное обеспечение столкнулось бы с серьёзной проблемой: как ему узнать, что данные представляют изображение, а не текст, звук или что-то ещё? Во-вторых, как ему определить, что изображение сохранено в формате PNG, а не GIF, JPEG или каком-либо другом формате изображений?
+
+Для получения этой информации мы используем другой протокол: HTTP. Этот протокол может точно сообщить нам, что данные представляют изображение и используют протокол PNG. Он также может сообщить некоторые другие сведения, но давайте сосредоточимся на уровнях протоколов здесь.
+
+Итак, теперь у нас есть некоторые данные, упакованные в протокол PNG, который в свою очередь упакован в протокол HTTP. Как мы получили их с сервера?
+
+Используя TCP/IP поверх Ethernet, вот как. Действительно, это ещё три протокола. Вместо того чтобы продолжать изнутри наружу, я теперь расскажу про Ethernet, просто потому что так проще объяснить остальное.
+
+Ethernet — это интересная система соединения компьютеров в _локальной сети_ (LAN). У каждого компьютера есть _карта сетевого интерфейса_ (NIC — Network Interface Card) с уникальным 48-битным идентификатором, называемым _адресом_. Не существует двух сетевых интерфейсов Ethernet в мире с одинаковым адресом.
+
+Эти сетевые карты соединены между собой. Когда один компьютер хочет связаться с другим в той же локальной сети Ethernet, он отправляет сообщение по сети. Каждая сетевая карта видит это сообщение. Однако, согласно _протоколу_ Ethernet, данные содержат адрес сетевой карты назначения (среди прочего). Таким образом, только одна из всех сетевых карт обратит на него внимание, остальные проигнорируют его.
+
+Но не все компьютеры подключены к одной сети. Тот факт, что мы получили данные через наш Ethernet, не означает, что они возникли в нашей локальной сети. Они могли попасть к нам из другой сети (которая может быть даже не на основе Ethernet), соединённой с нашей сетью через Интернет.
+
+Все данные передаются через Интернет с использованием IP, что означает _Internet Protocol_. Его основная роль — сообщать нам, откуда в мире пришли данные и куда они должны быть направлены. Он не _гарантирует_, что мы получим данные, только что мы узнаем, откуда они пришли, _если_ мы их получим.
+
+Даже если мы получим данные, IP не гарантирует, что различные фрагменты данных придут в том же порядке, в котором их отправил другой компьютер. Например, мы можем получить центр нашего изображения до того, как получим его верхний левый угол, а после — нижний правый.
+
+Это TCP (_Transmission Control Protocol_), который запрашивает у отправителя повторную отправку потерянных данных и располагает их в правильном порядке.
+
+В итоге потребовалось _пять_ различных протоколов, чтобы один компьютер мог сообщить другому, как выглядит изображение. Мы получили данные, упакованные в протокол PNG, который был упакован в протокол HTTP, который был упакован в протокол TCP, который был упакован в протокол IP, который был упакован в протокол Ethernet.
+
+О, и кстати, вероятно, на пути были задействованы и несколько других протоколов. Например, если наша локальная сеть была подключена к Интернету через дозвон, то использовался протокол PPP над модемом, который, в свою очередь, использовал один (или несколько) из различных модемных протоколов, и так далее, и так далее, и так далее...
+
+Как разработчик, вы уже должны задаваться вопросом: _"Как я должен со всем этим справляться?"_
+
+К счастью для вас, вам _не_ нужно разбираться во всём этом. Вам _придётся_ разобраться в некоторой части, но не во всей. В частности, вам не нужно беспокоиться о физическом подключении (в нашем случае Ethernet и, возможно, PPP и т.д.). Также вам не нужно разбираться с протоколом IP или протоколом TCP.
+
+Другими словами, вам не нужно ничего делать, чтобы получить данные с другого компьютера. Ну, разве что _попросить_ их, но это почти так же просто, как открыть файл.
+
+Получив данные, вам предстоит решить, что с ними делать. В нашем случае потребуется понимание протокола HTTP и структуры файла PNG.
+
+Используя аналогию, все межсетевые протоколы становятся серой зоной: не столько потому, что мы не понимаем, как они работают, а потому, что нас это больше не беспокоит. Интерфейс сокетов берёт на себя заботу об этой серой зоне:
+
+.Уровни протоколов, покрываемые сокетами
+image::slayers.png[]
+
+Нам нужно понимать только те протоколы, которые говорят нам, как _интерпретировать данные_, а не как _получать_ их от другого процесса или как _передавать_ их другому процессу.
+
+[[sockets-model]]
+== Модель сокетов
+
+Сокеты BSD построены по базовой модели UNIX(R): _Все является файлом._ Таким образом, в нашем примере сокеты позволят нам получить, образно говоря, _HTTP-файл_. Затем нам предстоит извлечь из него _PNG-файл_.
+
+Из-за сложности межсетевого взаимодействия мы не можем просто использовать системный вызов `open` или функцию `open()` в языке C. Вместо этого необходимо выполнить несколько шагов для "открытия" сокета.
+
+Однако, как только мы это сделаем, мы можем начать обращаться с _сокетом_ так же, как и с любым _файловым дескриптором_: мы можем `читать` из него, `писать` в него, передавать его через `канал` и, в конечном итоге, `закрывать` его.
+
+[[sockets-essential-functions]]
+== Основные функции сокетов
+
+В то время как FreeBSD предлагает различные функции для работы с сокетами, нам _требуется_ только четыре, чтобы "открыть" сокет. А в некоторых случаях достаточно двух.
+
+[[sockets-client-server]]
+=== Разница между клиентом и сервером
+
+Обычно одним из концов связи на основе сокетов является _сервер_, а другой — _клиент_.
+
+[[sockets-common-elements]]
+==== Общие элементы
+
+[[sockets-socket]]
+===== `socket`
+
+Функция, используемая как клиентами, так и серверами, это man:socket[2]. Она объявляется следующим образом:
+
+[.programlisting]
+....
+int socket(int domain, int type, int protocol);
+....
+
+Возвращаемое значение имеет тот же тип, что и у `open`, целое число. FreeBSD выделяет его значение из того же пула, что и дескрипторы файлов. Это позволяет обрабатывать сокеты так же, как файлы.
+
+Аргумент `domain` указывает системе, какое _семейство протоколов_ следует использовать. Существует множество семейств, некоторые из них специфичны для определённых поставщиков, другие широко распространены. Они объявлены в [.filename]#sys/socket.h#.
+
+Используйте `PF_INET` для UDP, TCP и других интернет-протоколов (IPv4).
+
+Для аргумента `type` определено пять значений, также указанных в [.filename]#sys/socket.h#. Все они начинаются с "`SOCK_`". Наиболее распространённое — `SOCK_STREAM`, которое указывает системе, что запрашивается _надёжный сервис потоковой доставки_ (это TCP при использовании с `PF_INET`).
+
+Если бы вы запросили `SOCK_DGRAM`, вы бы запросили _сервис доставки датаграмм без установления соединения_ (в нашем случае, UDP).
+
+Если вы хотите управлять низкоуровневыми протоколами (такими как IP) или даже сетевыми интерфейсами (например, Ethernet), вам потребуется указать `SOCK_RAW`.
+
+Наконец, аргумент `protocol` зависит от двух предыдущих аргументов и не всегда имеет смысл. В таком случае используйте значение `0`.
+
+[NOTE]
+.Неподключенный сокет
+====
+Нигде в функции `socket` мы не указали, к какой другой системе должны быть подключены. Наш только что созданный сокет остаётся _неподключённым_.
+
+Это сделано намеренно: если проводить аналогию с телефоном, мы только что подключили модем к телефонной линии. Мы не сказали модему совершить звонок или ответить, если телефон зазвонит.
+====
+
+[[sockets-sockaddr]]
+===== `sockaddr`
+
+Различные функции семейства сокетов ожидают адрес (или указатель, если использовать терминологию языка C) небольшой области памяти. Различные объявления на языке C в файле [.filename]#sys/socket.h# ссылаются на неё как на `struct sockaddr`. Эта структура объявлена в том же файле:
+
+[.programlisting]
+....
+/*
+ * Structure used by kernel to store most
+ * addresses.
+ */
+struct sockaddr {
+ unsigned char sa_len; /* total length */
+ sa_family_t sa_family; /* address family */
+ char sa_data[14]; /* actually longer; address value */
+};
+#define SOCK_MAXADDRLEN 255 /* longest possible addresses */
+....
+
+Обратите внимание на _неопределённость_, с которой объявлено поле `sa_data` — просто как массив из `14` байт, с комментарием, намекающим, что их может быть больше `14`.
+
+Эта неопределенность вполне преднамеренна. Сокеты — это очень мощный интерфейс. Хотя большинство людей, возможно, считают их не более чем интерфейсом для Интернета — и большинство приложений, вероятно, используют их именно для этого в наши дни — сокеты могут быть использованы практически для _любого_ вида межпроцессного взаимодействия, из которых Интернет (или, точнее, IP) — лишь один из них.
+
+[.filename]#sys/socket.h# ссылается на различные типы протоколов, с которыми работают сокеты, как на _семейства адресов_, и перечисляет их непосредственно перед определением `sockaddr`:
+
+[.programlisting]
+....
+/*
+ * Address families.
+ */
+#define AF_UNSPEC 0 /* unspecified */
+#define AF_LOCAL 1 /* local to host (pipes, portals) */
+#define AF_UNIX AF_LOCAL /* backward compatibility */
+#define AF_INET 2 /* internetwork: UDP, TCP, etc. */
+#define AF_IMPLINK 3 /* arpanet imp addresses */
+#define AF_PUP 4 /* pup protocols: e.g. BSP */
+#define AF_CHAOS 5 /* mit CHAOS protocols */
+#define AF_NS 6 /* XEROX NS protocols */
+#define AF_ISO 7 /* ISO protocols */
+#define AF_OSI AF_ISO
+#define AF_ECMA 8 /* European computer manufacturers */
+#define AF_DATAKIT 9 /* datakit protocols */
+#define AF_CCITT 10 /* CCITT protocols, X.25 etc */
+#define AF_SNA 11 /* IBM SNA */
+#define AF_DECnet 12 /* DECnet */
+#define AF_DLI 13 /* DEC Direct data link interface */
+#define AF_LAT 14 /* LAT */
+#define AF_HYLINK 15 /* NSC Hyperchannel */
+#define AF_APPLETALK 16 /* Apple Talk */
+#define AF_ROUTE 17 /* Internal Routing Protocol */
+#define AF_LINK 18 /* Link layer interface */
+#define pseudo_AF_XTP 19 /* eXpress Transfer Protocol (no AF) */
+#define AF_COIP 20 /* connection-oriented IP, aka ST II */
+#define AF_CNT 21 /* Computer Network Technology */
+#define pseudo_AF_RTIP 22 /* Help Identify RTIP packets */
+#define AF_IPX 23 /* Novell Internet Protocol */
+#define AF_SIP 24 /* Simple Internet Protocol */
+#define pseudo_AF_PIP 25 /* Help Identify PIP packets */
+#define AF_ISDN 26 /* Integrated Services Digital Network*/
+#define AF_E164 AF_ISDN /* CCITT E.164 recommendation */
+#define pseudo_AF_KEY 27 /* Internal key-management function */
+#define AF_INET6 28 /* IPv6 */
+#define AF_NATM 29 /* native ATM access */
+#define AF_ATM 30 /* ATM */
+#define pseudo_AF_HDRCMPLT 31 /* Used by BPF to not rewrite headers
+ * in interface output routine
+ */
+#define AF_NETGRAPH 32 /* Netgraph sockets */
+#define AF_SLOW 33 /* 802.3ad slow protocol */
+#define AF_SCLUSTER 34 /* Sitara cluster protocol */
+#define AF_ARP 35
+#define AF_BLUETOOTH 36 /* Bluetooth sockets */
+#define AF_MAX 37
+....
+
+Используемый для IP — это AF_INET. Это символ для константы `2`.
+
+Это _семейство адресов_, указанное в поле `sa_family` структуры `sockaddr`, определяет, как именно будут использоваться нечетко названные байты `sa_data`.
+
+В частности, когда _семейство адресов_ — AF_INET, можно использовать `struct sockaddr_in` из [.filename]#netinet/in.h# везде, где ожидается `sockaddr`:
+
+[.programlisting]
+....
+/*
+ * Socket address, internet style.
+ */
+struct sockaddr_in {
+ uint8_t sin_len;
+ sa_family_t sin_family;
+ in_port_t sin_port;
+ struct in_addr sin_addr;
+ char sin_zero[8];
+};
+....
+
+Мы можем визуализировать его организацию следующим образом:
+
+.Структура `sockaddr_in`
+image::sain.png[]
+
+Три важных поля — это `sin_family`, которое находится в байте 1 структуры, `sin_port`, 16-битное значение, расположенное в байтах 2 и 3, и `sin_addr`, 32-битное целочисленное представление IP-адреса, хранящееся в байтах 4–7.
+
+Теперь попробуем заполнить его. Предположим, мы пытаемся написать клиент для протокола _daytime_, который просто указывает, что его сервер записывает текстовую строку с текущей датой и временем в порт 13. Мы хотим использовать TCP/IP, поэтому нам нужно указать `AF_INET` в поле семейства адресов. `AF_INET` определен как `2`. Давайте используем IP-адрес `192.43.244.18`, который является сервером времени федерального правительства США (`time.nist.gov`).
+
+.Конкретный пример sockaddr_in
+image::sainfill.png[]
+
+Кстати, поле `sin_addr` объявлено как имеющее тип `struct in_addr`, который определён в [.filename]#netinet/in.h#:
+
+[.programlisting]
+....
+/*
+ * Internet address (a structure for historical reasons)
+ */
+struct in_addr {
+ in_addr_t s_addr;
+};
+....
+
+В дополнение, `in_addr_t` является 32-битным целым числом.
+
+`192.43.244.18` — это просто удобная форма записи 32-битного целого числа, в которой перечисляются все его 8-битные байты, начиная с _старшего_.
+
+До сих пор мы рассматривали `sockaddr` как абстракцию. Наш компьютер не хранит `short` целые числа как единую 16-битную сущность, а как последовательность 2 байт. Аналогично, он хранит 32-битные целые числа как последовательность 4 байт.
+
+Предположим, мы написали что-то вроде этого:
+
+[.programlisting]
+....
+sa.sin_family = AF_INET;
+sa.sin_port = 13;
+sa.sin_addr.s_addr = (((((192 << 8) | 43) << 8) | 244) << 8) | 18;
+....
+
+Как будет выглядеть результат?
+
+Ну, это, конечно, зависит от многого. На компьютере с процессором Pentium(R) или другим на базе x86 это будет выглядеть так:
+
+.`sockaddr_in` в системе с архитектурой Intel
+image::sainlsb.png[]
+
+На другой системе это может выглядеть так:
+
+.`sockaddr_in` в системе с порядком байтов от старшего к младшему
+image::sainmsb.png[]
+
+И на PDP это может выглядеть иначе. Однако два приведённых выше варианта являются наиболее распространёнными на сегодняшний день.
+
+Обычно, стремясь писать переносимый код, программисты делают вид, что этих различий не существует. И им это сходит с рук (за исключением случаев, когда они пишут на ассемблере). Увы, при программировании сокетов так легко отделаться не получится.
+
+Почему?
+
+Потому что при обмене данными с другим компьютером вы обычно не знаете, хранит ли он данные, начиная со _старшего байта_ (MSB) или с _младшего байта_ (LSB).
+
+Вы можете задаться вопросом: _"Значит, сокеты не будут это делать за меня?"_
+
+Не будут.
+
+Хотя этот ответ может сначала вас удивить, помните, что общий интерфейс сокетов понимает только поля `sa_len` и `sa_family` структуры `sockaddr`. Вам не нужно беспокоиться о порядке байтов (конечно, в FreeBSD `sa_family` занимает всего 1 байт, но многие другие UNIX(R)-системы не имеют `sa_len` и используют 2 байта для `sa_family`, ожидая данные в том порядке, который является родным для компьютера).
+
+Но остальные данные — это просто `sa_data[14]` с точки зрения сокетов. В зависимости от _семейства адресов_ сокеты просто передают эти данные по назначению.
+
+Действительно, когда мы указываем номер порта, это делается для того, чтобы другая компьютерная система знала, какую службу мы запрашиваем. И, когда мы выступаем в роли сервера, мы считываем номер порта, чтобы понять, какую службу ожидает от нас другая система. В любом случае, сокетам нужно лишь передать номер порта в качестве данных. Они никак его не интерпретируют.
+
+Аналогично, мы указываем IP-адрес, чтобы сообщить всем на пути, куда отправлять наши данные. Сокеты, опять же, просто пересылают их как данные.
+
+Вот почему мы (программисты, а не сокеты) должны различать порядок байтов, используемый нашим компьютером, и условный порядок байтов для отправки данных на другой компьютер.
+
+Мы будем называть порядок байтов, который использует наш компьютер, _порядком байтов хоста_ или просто _хост-порядком_.
+
+Существует соглашение о передаче многобайтовых данных по IP _старшим байтом вперёд_. Это мы будем называть _порядком байтов сети_ или просто _сетевым порядком_.
+
+Вот, если бы мы скомпилировали приведённый выше код для компьютера на базе Intel, наш _порядок байтов хоста_ выдал бы:
+
+.Порядок байтов на хосте в системе Intel
+image::sainlsb.png[]
+
+Но порядок байтов в _сетевом формате_ требует, чтобы данные хранились начиная со старшего байта (MSB):
+
+.Порядок байтов в сети
+image::sainmsb.png[]
+
+К сожалению, наш _порядок хоста_ полностью противоположен _порядку сети_.
+
+У нас есть несколько способов решения этой проблемы. Один из них — _инвертировать_ значения в нашем коде:
+
+[.programlisting]
+....
+sa.sin_family = AF_INET;
+sa.sin_port = 13 << 8;
+sa.sin_addr.s_addr = (((((18 << 8) | 244) << 8) | 43) << 8) | 192;
+....
+
+Это _обманет_ наш компилятор, заставив его сохранить данные в _порядке байтов сети_. В некоторых случаях это именно тот способ, который нужен (например, при программировании на ассемблере). Однако в большинстве случаев это может вызвать проблему.
+
+Предположим, вы написали программу на C, использующую сокеты. Вы знаете, что она будет работать на Pentium(R), поэтому вводите все константы в обратном порядке и приводите их к _порядку байтов сети_. Она работает хорошо.
+
+Затем, однажды, ваш надежный старый Pentium(R) превращается в ржавый старый Pentium(R). Вы заменяете его системой, у которой _порядок байтов хоста_ совпадает с _сетевым порядком байтов_. Вам нужно перекомпилировать все ваше программное обеспечение. Все ваши программы продолжают работать хорошо, кроме той одной программы, которую вы написали.
+
+Вы уже забыли, что принудительно задали все свои константы противоположными _порядку хоста_. Вы проводите некоторое время, яростно рвя на себе волосы, взывая ко всем известным вам богам (и к некоторым, которых вы придумали), стуча нерф-битой по монитору и выполняя прочие традиционные ритуалы в попытке понять, почему то, что работало так хорошо, внезапно перестало работать вообще.
+
+В конце концов, вы разбираетесь в проблеме, произносите пару крепких словечек и начинаете переписывать свой код.
+
+К счастью, вы не первый, кто столкнулся с этой проблемой. Кто-то уже создал функции man:htons[3] и man:htonl[3] на языке C для преобразования `short` и `long` соответственно из _порядка байтов хоста_ в _порядок байтов сети_, а также функции man:ntohs[3] и man:ntohl[3] на языке C для обратного преобразования.
+
+На системах с порядком _старший байт первый_ эти функции не выполняют никаких действий. На системах с порядком _младший байт первый_ они преобразуют значения в правильный порядок.
+
+Итак, независимо от того, на какой системе компилируется ваше программное обеспечение, ваши данные будут в правильном порядке, если вы используете эти функции.
+
+[[sockets-client-functions]]
+==== Функции клиента
+
+Обычно клиент инициирует подключение к серверу. Клиент знает, к какому серверу он собирается обратиться: он знает его IP-адрес и _порт_, на котором работает сервер. Это похоже на то, как вы поднимаете трубку и набираете номер (_адрес_), а затем, когда кто-то отвечает, просите соединить со специалистом по непонятным символам (_порт_).
+
+[[sockets-connect]]
+===== `connect`
+
+Как только клиент создал сокет, ему нужно подключить его к определённому порту на удалённой системе. Для этого используется man:connect[2]:
+
+[.programlisting]
+....
+int connect(int s, const struct sockaddr *name, socklen_t namelen);
+....
+
+Аргумент `s` — это сокет, то есть значение, возвращаемое функцией `socket`. Аргумент `name` — это указатель на структуру `sockaddr`, которую мы подробно обсуждали. Наконец, `namelen` сообщает системе, сколько байт находится в нашей структуре `sockaddr`.
+
+Если `connect` завершается успешно, он возвращает `0`. В противном случае возвращается `-1`, а код ошибки сохраняется в `errno`.
+
+Существует множество причин, по которым `connect` может завершиться неудачей. Например, при попытке подключения к интернету, IP-адрес может не существовать, быть недоступен, перегружен или на указанном порту может не быть сервера. Или же подключение может быть явно _отклонено_ по определённым причинам.
+
+[[sockets-first-client]]
+===== Наш первый клиент
+
+Теперь мы знаем достаточно, чтобы написать очень простого клиента, который получит текущее время от `192.43.244.18` и выведет его в [.filename]#stdout#.
+
+[.programlisting]
+....
+/*
+ * daytime.c
+ *
+ * Programmed by G. Adam Stanislav
+ */
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <unistd.h>
+
+int main() {
+ int s, bytes;
+ struct sockaddr_in sa;
+ char buffer[BUFSIZ+1];
+
+ if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
+ perror("socket");
+ return 1;
+ }
+
+ memset(&sa, '\0', sizeof(sa));
+
+ sa.sin_family = AF_INET;
+ sa.sin_port = htons(13);
+ sa.sin_addr.s_addr = htonl((((((192 << 8) | 43) << 8) | 244) << 8) | 18);
+ if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
+ perror("connect");
+ close(s);
+ return 2;
+ }
+
+ while ((bytes = read(s, buffer, BUFSIZ)) > 0)
+ write(1, buffer, bytes);
+
+ close(s);
+ return 0;
+}
+....
+
+Вперед! Введите это в вашем редакторе, сохраните как [.filename]#daytime.c#, затем скомпилируйте и запустите:
+
+[source, bash]
+....
+% cc -O3 -o daytime daytime.c
+% ./daytime
+
+52079 01-06-19 02:29:25 50 0 1 543.9 UTC(NIST) *
+%
+....
+
+В данном случае дата была 19 июня 2001 года, время — 02:29:25 UTC. Естественно, ваши результаты могут отличаться.
+
+[[sockets-server-functions]]
+==== Функции сервера
+
+Типичный сервер не инициирует соединение. Вместо этого он ожидает, когда клиент обратится к нему и запросит услуги. Он не знает, когда клиент обратится, ни сколько клиентов обратится. В один момент он может просто спокойно ожидать, а в следующий момент он может оказаться перегруженным запросами от множества клиентов, обращающихся одновременно.
+
+Интерфейс сокетов предоставляет три основные функции для обработки этого.
+
+[[sockets-bind]]
+===== `bind`
+
+Порты подобны внутренним номерам телефонной линии: после набора основного номера вы набираете внутренний номер, чтобы связаться с конкретным человеком или отделом.
+
+Существует 65535 IP-портов, но сервер обычно обрабатывает запросы, поступающие только на один из них. Это как сказать оператору телефонной комнаты, что мы сейчас на месте и готовы отвечать на звонки по определённому внутреннему номеру. Мы используем man:bind[2], чтобы указать сокетам, на каком порту мы хотим обслуживать запросы.
+
+[.programlisting]
+....
+int bind(int s, const struct sockaddr *addr, socklen_t addrlen);
+....
+
+Помимо указания порта в `addr`, сервер может включать свой IP-адрес. Однако он может просто использовать символическую константу INADDR_ANY, чтобы указать, что будет обслуживать все запросы на указанный порт, независимо от его IP-адреса. Этот символ, наряду с несколькими аналогичными, объявлен в [.filename]#netinet/in.h#
+
+[.programlisting]
+....
+#define INADDR_ANY (u_int32_t)0x00000000
+....
+
+Предположим, мы пишем сервер для протокола _daytime_ поверх TCP/IP. Напомним, что он использует порт 13. Наша структура `sockaddr_in` будет выглядеть так:
+
+.Пример sockaddr_in сервера
+image::sainserv.png[]
+
+[[sockets-listen]]
+===== `listen`
+
+Продолжая аналогию с офисным телефоном, после того как вы сообщили оператору АТС, на каком внутреннем номере вы будете находиться, вы заходите в свой офис и убеждаетесь, что ваш телефон подключен и звонок включен. Кроме того, вы активируете функцию ожидания вызова, чтобы слышать звонок даже во время разговора с кем-то.
+
+Сервер обеспечивает все это с помощью функции man:listen[2].
+
+[.programlisting]
+....
+int listen(int s, int backlog);
+....
+
+Здесь переменная `backlog` указывает сокетам, сколько входящих запросов принимать, пока вы заняты обработкой последнего запроса. Другими словами, она определяет максимальный размер очереди ожидающих соединений.
+
+[[sockets-accept]]
+===== `accept`
+
+После того как вы услышите телефонный звонок, вы принимаете вызов, отвечая на звонок. Теперь вы установили соединение с вашим клиентом. Это соединение остается активным, пока вы или ваш клиент не повесите трубку.
+
+Сервер принимает соединение, используя функцию man:accept[2].
+
+[.programlisting]
+....
+int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
+....
+
+Обратите внимание, что в этот раз `addrlen` является указателем. Это необходимо, потому что в данном случае именно сокет заполняет структуру `addr` — `sockaddr_in`.
+
+Возвращаемое значение является целым числом. Действительно, `accept` возвращает _новый сокет_. Этот новый сокет будет использоваться для обмена данными с клиентом.
+
+Что происходит со старым сокетом? Он продолжает ожидать новые запросы (помните переменную `backlog`, которую мы передали в `listen`?), пока мы не закроем его (`close`).
+
+Теперь новый сокет предназначен только для обмена данными. Он полностью подключен. Мы не можем снова передать его в `listen`, чтобы принимать дополнительные соединения.
+
+[[sockets-first-server]]
+===== Наш первый сервер
+
+Наш первый сервер будет несколько сложнее, чем первый клиент: нам нужно не только использовать больше функций сокетов, но и написать его как демон.
+
+Это лучше всего достигается созданием _дочернего процесса_ после привязки порта. Затем основной процесс завершается и возвращает управление оболочке (или любой другой программе, которая его вызвала).
+
+Дочерний процесс вызывает `listen`, затем запускает бесконечный цикл, который принимает соединение, обслуживает его и в конечном итоге закрывает свой сокет.
+
+[.programlisting]
+....
+/*
+ * daytimed - a port 13 server
+ *
+ * Programmed by G. Adam Stanislav
+ * June 19, 2001
+ */
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+
+#define BACKLOG 4
+
+int main() {
+ int s, c;
+ socklen_t b;
+ struct sockaddr_in sa;
+ time_t t;
+ struct tm *tm;
+ FILE *client;
+
+ if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
+ perror("socket");
+ return 1;
+ }
+
+ memset(&sa, '\0', sizeof(sa));
+
+ sa.sin_family = AF_INET;
+ sa.sin_port = htons(13);
+
+ if (INADDR_ANY)
+ sa.sin_addr.s_addr = htonl(INADDR_ANY);
+
+ if (bind(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
+ perror("bind");
+ return 2;
+ }
+
+ switch (fork()) {
+ case -1:
+ perror("fork");
+ return 3;
+ default:
+ close(s);
+ return 0;
+ case 0:
+ break;
+ }
+
+ listen(s, BACKLOG);
+
+ for (;;) {
+ b = sizeof sa;
+
+ if ((c = accept(s, (struct sockaddr *)&sa, &b)) < 0) {
+ perror("daytimed accept");
+ return 4;
+ }
+
+ if ((client = fdopen(c, "w")) == NULL) {
+ perror("daytimed fdopen");
+ return 5;
+ }
+
+ if ((t = time(NULL)) < 0) {
+ perror("daytimed time");
+ return 6;
+ }
+
+ tm = gmtime(&t);
+ fprintf(client, "%.4i-%.2i-%.2iT%.2i:%.2i:%.2iZ\n",
+ tm->tm_year + 1900,
+ tm->tm_mon + 1,
+ tm->tm_mday,
+ tm->tm_hour,
+ tm->tm_min,
+ tm->tm_sec);
+
+ fclose(client);
+ }
+}
+....
+
+Начинаем с создания сокета. Затем заполняем структуру `sockaddr_in` в `sa`. Обратите внимание на условное использование INADDR_ANY:
+
+[.programlisting]
+....
+if (INADDR_ANY)
+ sa.sin_addr.s_addr = htonl(INADDR_ANY);
+....
+
+Его значение равно `0`. Поскольку мы только что использовали `bzero` для всей структуры, будет избыточным снова устанавливать его в `0`. Но если мы перенесем наш код на другую систему, где INADDR_ANY, возможно, не равен нулю, нам нужно будет присвоить его `sa.sin_addr.s_addr`. Большинство современных компиляторов C достаточно умны, чтобы заметить, что INADDR_ANY — это константа. Пока она равна нулю, они оптимизируют все условное выражение из кода.
+
+После успешного вызова `bind` мы готовы стать _демоном_: используем `fork` для создания дочернего процесса. В обоих процессах, родительском и дочернем, переменная `s` является нашим сокетом. Родительскому процессу он больше не нужен, поэтому он вызывает `close`, затем возвращает `0`, чтобы сообщить своему родителю об успешном завершении.
+
+Между тем, дочерний процесс продолжает работать в фоновом режиме. Он вызывает `listen` и устанавливает размер очереди ожидания (`backlog`) равным `4`. Здесь не требуется большое значение, так как _daytime_ — это не протокол, который часто запрашивают клиенты, и, кроме того, он может мгновенно обрабатывать каждый запрос.
+
+Наконец, демон запускает бесконечный цикл, который выполняет следующие шаги:
+
+[.procedure]
+. Вызовите `accept`. Он ожидает здесь, пока клиент не свяжется с ним. В этот момент он получает новый сокет, `c`, который можно использовать для обмена данными с этим конкретным клиентом.
+. Он использует функцию C `fdopen` для преобразования сокета из низкоуровневого _дескриптора файла_ в указатель типа `FILE` в стиле C. Это позволит в дальнейшем использовать `fprintf`.
+. Он проверяет время и выводит его в формате _ISO 8601_ в «файл» `client`. Затем он использует `fclose` для закрытия файла. Это также автоматически закроет сокет.
+
+Мы можем _обобщить_ это и использовать в качестве модели для многих других серверов:
+
+.Последовательный Сервер
+image::serv.png[]
+
+Эта блок-схема подходит для _последовательных серверов_, то есть серверов, которые могут обслуживать одного клиента за раз, как это было возможно с нашим _daytime_ сервером. Это возможно только в тех случаях, когда между клиентом и сервером не происходит реального "диалога": как только сервер обнаруживает подключение клиента, он отправляет некоторые данные и закрывает соединение. Вся операция может занять наносекунды, и она завершена.
+
+Преимущество этой блок-схемы в том, что, за исключением короткого момента после того, как родительский процесс выполняет ``fork`` и до его завершения, всегда активен только один _процесс_: Наш сервер не занимает много памяти и других системных ресурсов.
+
+Обратите внимание, что мы добавили _инициализацию демона_ в нашу блок-схему. Нам не нужно было инициализировать собственный демон, но это подходящее место в потоке выполнения программы для настройки обработчиков `signal`, открытия необходимых файлов и т. д.
+
+Почти все элементы блок-схемы могут быть использованы буквально на множестве различных серверов. Элемент _serve_ является исключением. Мы рассматриваем его как _"чёрный ящик"_, то есть нечто, что вы проектируете специально для своего сервера и просто "подключаете к остальной системе."
+
+Не все протоколы настолько просты. Многие получают запрос от клиента, отвечают на него, а затем получают ещё один запрос от того же клиента. В результате, они не знают заранее, как долго будут обслуживать клиента. Такие серверы обычно запускают новый процесс для каждого клиента. Пока новый процесс обслуживает своего клиента, демон может продолжать прослушивать новые подключения.
+
+Теперь сохраните приведённый исходный код в файл [.filename]#daytimed.c# (обычно имена демонов оканчиваются буквой `d`). После компиляции попробуйте запустить его:
+
+[source, bash]
+....
+% ./daytimed
+bind: Permission denied
+%
+....
+
+Что произошло? Как вы помните, протокол _daytime_ использует порт 13. Однако все порты ниже 1024 зарезервированы для суперпользователя (в противном случае любой мог бы запустить демон, притворяясь, что обслуживает часто используемый порт, создавая угрозу безопасности).
+
+Попробуйте снова, на этот раз как суперпользователь:
+
+[source, bash]
+....
+# ./daytimed
+#
+....
+
+Что... Ничего? Давайте попробуем еще раз:
+
+[source, bash]
+....
+# ./daytimed
+
+bind: Address already in use
+#
+....
+
+Каждый порт может быть связан только одной программой одновременно. Наша первая попытка действительно была успешной: она запустила дочерний демон и завершилась без ошибок. Он продолжает работать и будет работать до тех пор, пока вы его не завершите командой kill, пока какой-либо из его системных вызовов не завершится с ошибкой или пока вы не перезагрузите систему.
+
+Хорошо, мы знаем, что он работает в фоновом режиме. Но работает ли он? Как мы можем убедиться, что это настоящий сервер _daytime_? Просто:
+
+[source, bash]
+....
+% telnet localhost 13
+
+Trying ::1...
+telnet: connect to address ::1: Connection refused
+Trying 127.0.0.1...
+Connected to localhost.
+Escape character is '^]'.
+2001-06-19T21:04:42Z
+Connection closed by foreign host.
+%
+....
+
+telnet попробовал использовать новый IPv6, но не смог. Затем он повторил попытку с IPv4, и это удалось. Демон работает.
+
+Если у вас есть доступ к другой UNIX(R)-системе через telnet, вы можете использовать её для проверки удалённого доступа к серверу. Мой компьютер не имеет статического IP-адреса, поэтому я сделал следующее:
+
+[source, bash]
+....
+% who
+
+whizkid ttyp0 Jun 19 16:59 (216.127.220.143)
+xxx ttyp1 Jun 19 16:06 (xx.xx.xx.xx)
+% telnet 216.127.220.143 13
+
+Trying 216.127.220.143...
+Connected to r47.bfm.org.
+Escape character is '^]'.
+2001-06-19T21:31:11Z
+Connection closed by foreign host.
+%
+....
+
+Снова, это сработало. Сработает ли это с использованием доменного имени?
+
+[source, bash]
+....
+% telnet r47.bfm.org 13
+
+Trying 216.127.220.143...
+Connected to r47.bfm.org.
+Escape character is '^]'.
+2001-06-19T21:31:40Z
+Connection closed by foreign host.
+%
+....
+
+Кстати, telnet выводит сообщение _Connection closed by foreign host_ после того, как наш демон закрыл сокет. Это показывает, что использование `fclose(client);` в нашем коде действительно работает, как заявлено.
+
+[[sockets-helper-functions]]
+== Вспомогательные функции
+
+Библиотека C в FreeBSD содержит множество вспомогательных функций для программирования сокетов. Например, в нашем примере клиента мы жестко прописали IP-адрес `time.nist.gov`. Но мы не всегда знаем IP-адрес. Даже если знаем, наше программное обеспечение будет более гибким, если позволит пользователю ввести IP-адрес или даже доменное имя.
+
+[[sockets-gethostbyname]]
+=== `gethostbyname`
+
+Хотя нет возможности передать имя домена напрямую в какие-либо функции сокетов, стандартная библиотека C в FreeBSD предоставляет функции man:gethostbyname[3] и man:gethostbyname2[3], объявленные в [.filename]#netdb.h#.
+
+[.programlisting]
+....
+struct hostent * gethostbyname(const char *name);
+struct hostent * gethostbyname2(const char *name, int af);
+....
+
+Оба возвращают указатель на структуру `hostent`, содержащую много информации о домене. Для наших целей поле `h_addr_list[0]` структуры указывает на `h_length` байтов правильного адреса, уже сохранённого в _порядке байтов сети_.
+
+Это позволяет нам создать гораздо более гибкую — и гораздо более полезную — версию нашей программы daytime:
+
+[.programlisting]
+....
+/*
+ * daytime.c
+ *
+ * Programmed by G. Adam Stanislav
+ * 19 June 2001
+ */
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+int main(int argc, char *argv[]) {
+ int s, bytes;
+ struct sockaddr_in sa;
+ struct hostent *he;
+ char buf[BUFSIZ+1];
+ char *host;
+
+ if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
+ perror("socket");
+ return 1;
+ }
+
+ memset(&sa, '\0', sizeof(sa));
+
+ sa.sin_family = AF_INET;
+ sa.sin_port = htons(13);
+
+ host = (argc > 1) ? argv[1] : "time.nist.gov";
+
+ if ((he = gethostbyname(host)) == NULL) {
+ herror(host);
+ return 2;
+ }
+
+ memcpy(&sa.sin_addr, he->h_addr_list[0], he->h_length);
+
+ if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {
+ perror("connect");
+ return 3;
+ }
+
+ while ((bytes = read(s, buf, BUFSIZ)) > 0)
+ write(1, buf, bytes);
+
+ close(s);
+ return 0;
+}
+....
+
+Теперь мы можем ввести доменное имя (или IP-адрес, это работает в обоих направлениях) в командной строке, и программа попытается подключиться к его серверу _daytime_. В противном случае, по умолчанию будет использоваться `time.nist.gov`. Однако даже в этом случае мы будем использовать `gethostbyname` вместо жесткого задания `192.43.244.18`. Таким образом, даже если его IP-адрес изменится в будущем, мы всё равно сможем его найти.
+
+Поскольку получение времени от локального сервера занимает практически нулевое время, вы можете запустить daytime дважды подряд: сначала для получения времени от `time.nist.gov`, а затем от вашей собственной системы. После этого вы можете сравнить результаты и увидеть, насколько точны часы вашей системы:
+
+[source, bash]
+....
+% daytime ; daytime localhost
+
+52080 01-06-20 04:02:33 50 0 0 390.2 UTC(NIST) *
+2001-06-20T04:02:35Z
+%
+....
+
+Как видно, моя система опережала время NIST на две секунды.
+
+[[sockets-getservbyname]]
+=== `getservbyname`
+
+Иногда вы можете быть не уверены, какой порт использует определённая служба. В таких случаях очень полезна функция man:getservbyname[3], также объявленная в [.filename]#netdb.h#:
+
+[.programlisting]
+....
+struct servent * getservbyname(const char *name, const char *proto);
+....
+
+Структура `servent` содержит `s_port`, в котором находится соответствующий порт, уже в _порядке байтов сети_.
+
+Если бы мы не знали правильный порт для службы _daytime_, мы могли бы найти его следующим образом:
+
+[.programlisting]
+....
+struct servent *se;
+ ...
+ if ((se = getservbyname("daytime", "tcp")) == NULL {
+ fprintf(stderr, "Cannot determine which port to use.\n");
+ return 7;
+ }
+ sa.sin_port = se->s_port;
+....
+
+Обычно порт известен. Но если вы разрабатываете новый протокол, вы можете тестировать его на неофициальном порту. Когда-нибудь вы зарегистрируете протокол и его порт (если не где-то ещё, то хотя бы в вашем [.filename]#/etc/services#, где `getservbyname` ищет). Вместо возврата ошибки в приведённом выше коде вы просто используете временный номер порта. Как только вы добавите протокол в [.filename]#/etc/services#, ваше программное обеспечение найдёт его порт без необходимости переписывать код.
+
+[[sockets-concurrent-servers]]
+== Многозадачные серверы
+
+В отличие от последовательного сервера, _многозадачный сервер_ должен иметь возможность обслуживать более одного клиента одновременно. Например, _сервер чата_ может обслуживать конкретного клиента часами — он не может ждать, пока закончит обслуживать текущего клиента, прежде чем перейти к следующему.
+
+Это требует значительных изменений в нашей блок-схеме:
+
+.Многозадачный сервер
+image::serv2.png[]
+
+Мы переместили _службу_ из _демона_ в её собственный _серверный процесс_. Однако, поскольку каждый дочерний процесс наследует все открытые файлы (а сокет обрабатывается так же, как файл), новый процесс наследует не только _"принятый дескриптор"_, т.е. сокет, возвращённый вызовом `accept`, но и _главный сокет_, т.е. тот, который был открыт главным процессом в самом начале.
+
+Однако _серверному процессу_ этот сокет не нужен, и он должен немедленно вызвать ему `close`. Аналогично, _демону_ больше не нужен _сокет, принятый вызовом accept_, и он не только должен, но и _обязан_ вызвать ему `close` — в противном случае рано или поздно закончатся доступные _файловые дескрипторы_.
+
+После завершения обслуживания _серверного процесса_ он должен закрыть _принятый сокет_. Вместо возврата к `accept`, процесс теперь завершается.
+
+В UNIX(R) процесс на самом деле не _завершается_. Вместо этого он _возвращается_ к своему родителю. Обычно родительский процесс ``ждёт`` (wait) завершения своего дочернего процесса и получает возвращаемое значение. Однако наш _демон-процесс_ не может просто остановиться и ждать. Это бы свело на нет всю цель создания дополнительных процессов. Но если он никогда не выполняет `wait`, его дочерние процессы станут _зомби_ — более не функционирующими, но всё ещё бродящими вокруг.
+
+По этой причине _демону_ необходимо установить _обработчики сигналов_ на этапе _инициализации демона_. Как минимум, должен обрабатываться сигнал SIGCHLD, чтобы демон мог удалять зомби-процессы из системы и освобождать занимаемые ими системные ресурсы.
+
+Вот почему наша блок-схема теперь содержит блок _обработки сигналов_, который не соединен с другими блоками. Кстати, многие серверы также обрабатывают SIGHUP и обычно интерпретируют его как сигнал от суперпользователя, указывающий на необходимость перечитать конфигурационные файлы. Это позволяет нам изменять настройки без необходимости завершать и перезапускать эти серверы.
diff --git a/documentation/content/ru/books/developers-handbook/sockets/_index.po b/documentation/content/ru/books/developers-handbook/sockets/_index.po
new file mode 100644
index 0000000000..7136478a70
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/sockets/_index.po
@@ -0,0 +1,3021 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbooksockets_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1
+#, no-wrap
+msgid "FreeBSD Sockets"
+msgstr "Сокеты FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1
+#, no-wrap
+msgid "Chapter 7. Sockets"
+msgstr "Глава 7. Сокеты"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:16
+#, no-wrap
+msgid "Sockets"
+msgstr "Сокеты"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:54
+#, no-wrap
+msgid "Synopsis"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:59
+msgid ""
+"BSD sockets take interprocess communications to a new level. It is no "
+"longer necessary for the communicating processes to run on the same "
+"machine. They still _can_, but they do not have to."
+msgstr ""
+"Сокеты BSD выводят межпроцессное взаимодействие на новый уровень. Теперь "
+"взаимодействующие процессы не обязательно должны выполняться на одной "
+"машине. Они всё ещё _могут_, но не обязаны."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:62
+msgid ""
+"Not only do these processes not have to run on the same machine, they do not "
+"have to run under the same operating system. Thanks to BSD sockets, your "
+"FreeBSD software can smoothly cooperate with a program running on a "
+"Macintosh(R), another one running on a Sun(TM) workstation, yet another one "
+"running under Windows(R) 2000, all connected with an Ethernet-based local "
+"area network."
+msgstr ""
+"Не только эти процессы не обязаны выполняться на одной машине, они также "
+"могут работать под разными операционными системами. Благодаря BSD-сокетам, "
+"ваше ПО на FreeBSD может легко взаимодействовать с программой, работающей на "
+"Macintosh(R), другой — на рабочей станции Sun(TM), и ещё одной — под "
+"Windows(R) 2000, при этом все они подключены к локальной сети на основе "
+"Ethernet."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:64
+msgid ""
+"But your software can equally well cooperate with processes running in "
+"another building, or on another continent, inside a submarine, or a space "
+"shuttle."
+msgstr ""
+"Но ваше программное обеспечение может так же эффективно взаимодействовать с "
+"процессами, работающими в другом здании, на другом континенте, внутри "
+"подводной лодки или космического челнока."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:67
+msgid ""
+"It can also cooperate with processes that are not part of a computer (at "
+"least not in the strict sense of the word), but of such devices as printers, "
+"digital cameras, medical equipment. Just about anything capable of digital "
+"communications."
+msgstr ""
+"Он также может взаимодействовать с процессами, которые не являются частью "
+"компьютера (по крайней мере, не в строгом смысле этого слова), а таких "
+"устройств, как принтеры, цифровые камеры, медицинское оборудование. "
+"Практически со всем, что способно к цифровой коммуникации."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:69
+#, no-wrap
+msgid "Networking and Diversity"
+msgstr "Сетевое взаимодействие и разнообразие"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:75
+msgid ""
+"We have already hinted on the _diversity_ of networking. Many different "
+"systems have to talk to each other. And they have to speak the same "
+"language. They also have to _understand_ the same language the same way."
+msgstr ""
+"Мы уже упоминали о _разнообразии_ сетевых технологий. Множество различных "
+"систем должны взаимодействовать друг с другом. И они должны говорить на "
+"одном языке. Также они должны _понимать_ этот язык одинаковым образом."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:80
+msgid ""
+"People often think that _body language_ is universal. But it is not. Back "
+"in my early teens, my father took me to Bulgaria. We were sitting at a "
+"table in a park in Sofia, when a vendor approached us trying to sell us some "
+"roasted almonds."
+msgstr ""
+"Часто думают, что _язык тела_ универсален. Но это не так. В ранней юности "
+"отец взял меня с собой в Болгарию. Мы сидели за столиком в парке Софии, "
+"когда к нам подошел продавец, предлагая купить жареный миндаль."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:83
+msgid ""
+"I had not learned much Bulgarian by then, so, instead of saying no, I shook "
+"my head from side to side, the \"universal\" body language for _no_. The "
+"vendor quickly started serving us some almonds."
+msgstr ""
+"Я тогда еще не знал болгарского, поэтому вместо словесного отказа я покачал "
+"головой из стороны в сторону — это «универсальный» язык тела для обозначения "
+"_нет_. Продавец тут же начал угощать нас миндалем."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:91
+msgid ""
+"I then remembered I had been told that in Bulgaria shaking your head "
+"sideways meant _yes_. Quickly, I started nodding my head up and down. The "
+"vendor noticed, took his almonds, and walked away. To an uninformed "
+"observer, I did not change the body language: I continued using the language "
+"of shaking and nodding my head. What changed was the _meaning_ of the body "
+"language. At first, the vendor and I interpreted the same language as "
+"having completely different meaning. I had to adjust my own interpretation "
+"of that language so the vendor would understand."
+msgstr ""
+"Затем я вспомнил, что мне говорили, будто в Болгарии покачивание головой из "
+"стороны в сторону означает _да_. Быстро я начал кивать головой вверх-вниз. "
+"Продавец заметил, взял свои миндалины и ушёл. Для непосвящённого наблюдателя "
+"я не изменил язык тела: я продолжал использовать движения головой — "
+"покачивание и кивание. Изменился _смысл_ языка тела. Сначала продавец и я "
+"интерпретировали одни и те же жесты как имеющие совершенно разный смысл. Мне "
+"пришлось скорректировать свою собственную интерпретацию этих жестов, чтобы "
+"продавец меня понял."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:95
+msgid ""
+"It is the same with computers: The same symbols may have different, even "
+"outright opposite meaning. Therefore, for two computers to understand each "
+"other, they must not only agree on the same _language_, but on the same "
+"_interpretation_ of the language."
+msgstr ""
+"То же самое и с компьютерами: одни и те же символы могут иметь разное, даже "
+"полностью противоположное значение. Поэтому, чтобы два компьютера понимали "
+"друг друга, они должны договориться не только об одном _языке_, но и об "
+"одном _толковании_ языка."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:97
+#, no-wrap
+msgid "Protocols"
+msgstr "Протоколы"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:104
+msgid ""
+"While various programming languages tend to have complex syntax and use a "
+"number of multi-letter reserved words (which makes them easy for the human "
+"programmer to understand), the languages of data communications tend to be "
+"very terse. Instead of multi-byte words, they often use individual _bits_. "
+"There is a very convincing reason for it: While data travels _inside_ your "
+"computer at speeds approaching the speed of light, it often travels "
+"considerably slower between two computers."
+msgstr ""
+"В то время как различные языки программирования обычно имеют сложный "
+"синтаксис и используют множество многосимвольных зарезервированных слов (что "
+"облегчает их понимание для человека-программиста), языки передачи данных, "
+"как правило, очень лаконичны. Вместо многосимвольных слов они часто "
+"используют отдельные _биты_. Для этого есть очень убедительная причина: хотя "
+"данные внутри вашего компьютера передаются со скоростью, близкой к скорости "
+"света, между двумя компьютерами они часто передаются значительно медленнее."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:106
+msgid ""
+"As the languages used in data communications are so terse, we usually refer "
+"to them as _protocols_ rather than languages."
+msgstr ""
+"Поскольку языки, используемые в передаче данных, настолько лаконичны, мы "
+"обычно называем их _протоколами_, а не языками."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:111
+msgid ""
+"As data travels from one computer to another, it always uses more than one "
+"protocol. These protocols are _layered_. The data can be compared to the "
+"inside of an onion: You have to peel off several layers of \"skin\" to get "
+"to the data. This is best illustrated with a picture:"
+msgstr ""
+"При передаче данных от одного компьютера к другому всегда используется более "
+"одного протокола. Эти протоколы _располагаются слоями_. Данные можно "
+"сравнить с внутренней частью лука: необходимо снять несколько слоёв «кожи», "
+"чтобы добраться до данных. Это лучше всего проиллюстрировано на рисунке:"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:112
+#, no-wrap
+msgid "Protocol Layers"
+msgstr "Уровни протоколов"
+
+#. type: Target for macro image
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:113
+#, no-wrap
+msgid "layers.png"
+msgstr "layers.png"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:116
+msgid ""
+"In this example, we are trying to get an image from a web page we are "
+"connected to via an Ethernet."
+msgstr ""
+"В этом примере мы пытаемся получить изображение с веб-страницы, к которой "
+"подключены через Ethernet."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:119
+msgid ""
+"The image consists of raw data, which is simply a sequence of RGB values "
+"that our software can process, i.e., convert into an image and display on "
+"our monitor."
+msgstr ""
+"Изображение состоит из необработанных данных, которые представляют собой "
+"просто последовательность значений RGB, которые наше программное обеспечение "
+"может обработать, т.е. преобразовать в изображение и отобразить на нашем "
+"мониторе."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:124
+msgid ""
+"Alas, our software has no way of knowing how the raw data is organized: Is "
+"it a sequence of RGB values, or a sequence of grayscale intensities, or "
+"perhaps of CMYK encoded colors? Is the data represented by 8-bit quanta, or "
+"are they 16 bits in size, or perhaps 4 bits? How many rows and columns does "
+"the image consist of? Should certain pixels be transparent?"
+msgstr ""
+"Увы, наше программное обеспечение не может определить, как организованы "
+"сырые данные: это последовательность значений RGB, последовательность "
+"интенсивностей в градациях серого или, возможно, цвета в кодировке CMYK? "
+"Представлены ли данные 8-битными квантами, или они имеют размер 16 бит, а "
+"может быть, 4 бита? Из скольких строк и столбцов состоит изображение? Должны "
+"ли определённые пиксели быть прозрачными?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:126
+msgid "I think you get the picture..."
+msgstr "Я думаю, вы поняли..."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:129
+msgid ""
+"To inform our software how to handle the raw data, it is encoded as a PNG "
+"file. It could be a GIF, or a JPEG, but it is a PNG."
+msgstr ""
+"Чтобы наше программное обеспечение понимало, как обрабатывать сырые данные, "
+"они кодируются в формате PNG. Это мог бы быть GIF или JPEG, но выбран PNG."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:131
+msgid "And PNG is a protocol."
+msgstr "И PNG — это протокол."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:133
+msgid ""
+"At this point, I can hear some of you yelling, _\"No, it is not! It is a "
+"file format!\"_"
+msgstr ""
+"В этот момент я слышу, как некоторые из вас кричат: _\"Нет, это не так! Это "
+"формат файла!\"_"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:138
+msgid ""
+"Well, of course it is a file format. But from the perspective of data "
+"communications, a file format is a protocol: The file structure is a "
+"_language_, a terse one at that, communicating to our _process_ how the data "
+"is organized. Ergo, it is a _protocol_."
+msgstr ""
+"Ну что ж, конечно, это формат файла. Но с точки зрения передачи данных, "
+"формат файла — это протокол: структура файла — это _язык_, причем "
+"лаконичный, сообщающий нашему _процессу_, как организованы данные. "
+"Следовательно, это _протокол_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:141
+msgid ""
+"Alas, if all we received was the PNG file, our software would be facing a "
+"serious problem: How is it supposed to know the data is representing an "
+"image, as opposed to some text, or perhaps a sound, or what not? Secondly, "
+"how is it supposed to know the image is in the PNG format as opposed to GIF, "
+"or JPEG, or some other image format?"
+msgstr ""
+"Увы, если бы мы получили только PNG-файл, наше программное обеспечение "
+"столкнулось бы с серьёзной проблемой: как ему узнать, что данные "
+"представляют изображение, а не текст, звук или что-то ещё? Во-вторых, как "
+"ему определить, что изображение сохранено в формате PNG, а не GIF, JPEG или "
+"каком-либо другом формате изображений?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:145
+msgid ""
+"To obtain that information, we are using another protocol: HTTP. This "
+"protocol can tell us exactly that the data represents an image, and that it "
+"uses the PNG protocol. It can also tell us some other things, but let us "
+"stay focused on protocol layers here."
+msgstr ""
+"Для получения этой информации мы используем другой протокол: HTTP. Этот "
+"протокол может точно сообщить нам, что данные представляют изображение и "
+"используют протокол PNG. Он также может сообщить некоторые другие сведения, "
+"но давайте сосредоточимся на уровнях протоколов здесь."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:148
+msgid ""
+"So, now we have some data wrapped in the PNG protocol, wrapped in the HTTP "
+"protocol. How did we get it from the server?"
+msgstr ""
+"Итак, теперь у нас есть некоторые данные, упакованные в протокол PNG, "
+"который в свою очередь упакован в протокол HTTP. Как мы получили их с "
+"сервера?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:152
+msgid ""
+"By using TCP/IP over Ethernet, that is how. Indeed, that is three more "
+"protocols. Instead of continuing inside out, I am now going to talk about "
+"Ethernet, simply because it is easier to explain the rest that way."
+msgstr ""
+"Используя TCP/IP поверх Ethernet, вот как. Действительно, это ещё три "
+"протокола. Вместо того чтобы продолжать изнутри наружу, я теперь расскажу "
+"про Ethernet, просто потому что так проще объяснить остальное."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:156
+msgid ""
+"Ethernet is an interesting system of connecting computers in a _local area "
+"network_ (LAN). Each computer has a _network interface card_ (NIC), which "
+"has a unique 48-bit ID called its _address_. No two Ethernet NICs in the "
+"world have the same address."
+msgstr ""
+"Ethernet — это интересная система соединения компьютеров в _локальной сети_ "
+"(LAN). У каждого компьютера есть _карта сетевого интерфейса_ (NIC — Network "
+"Interface Card) с уникальным 48-битным идентификатором, называемым "
+"_адресом_. Не существует двух сетевых интерфейсов Ethernet в мире с "
+"одинаковым адресом."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:162
+msgid ""
+"These NICs are all connected with each other. Whenever one computer wants "
+"to communicate with another in the same Ethernet LAN, it sends a message "
+"over the network. Every NIC sees the message. But as part of the Ethernet "
+"_protocol_, the data contains the address of the destination NIC (among "
+"other things). So, only one of all the network interface cards will pay "
+"attention to it, the rest will ignore it."
+msgstr ""
+"Эти сетевые карты соединены между собой. Когда один компьютер хочет "
+"связаться с другим в той же локальной сети Ethernet, он отправляет сообщение "
+"по сети. Каждая сетевая карта видит это сообщение. Однако, согласно "
+"_протоколу_ Ethernet, данные содержат адрес сетевой карты назначения (среди "
+"прочего). Таким образом, только одна из всех сетевых карт обратит на него "
+"внимание, остальные проигнорируют его."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:166
+msgid ""
+"But not all computers are connected to the same network. Just because we "
+"have received the data over our Ethernet does not mean it originated in our "
+"own local area network. It could have come to us from some other network "
+"(which may not even be Ethernet based) connected with our own network via "
+"the Internet."
+msgstr ""
+"Но не все компьютеры подключены к одной сети. Тот факт, что мы получили "
+"данные через наш Ethernet, не означает, что они возникли в нашей локальной "
+"сети. Они могли попасть к нам из другой сети (которая может быть даже не на "
+"основе Ethernet), соединённой с нашей сетью через Интернет."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:170
+msgid ""
+"All data is transferred over the Internet using IP, which stands for "
+"_Internet Protocol_. Its basic role is to let us know where in the world "
+"the data has arrived from, and where it is supposed to go to. It does not "
+"_guarantee_ we will receive the data, only that we will know where it came "
+"from _if_ we do receive it."
+msgstr ""
+"Все данные передаются через Интернет с использованием IP, что означает "
+"_Internet Protocol_. Его основная роль — сообщать нам, откуда в мире пришли "
+"данные и куда они должны быть направлены. Он не _гарантирует_, что мы "
+"получим данные, только что мы узнаем, откуда они пришли, _если_ мы их "
+"получим."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:173
+msgid ""
+"Even if we do receive the data, IP does not guarantee we will receive "
+"various chunks of data in the same order the other computer has sent it to "
+"us. So, we can receive the center of our image before we receive the upper "
+"left corner and after the lower right, for example."
+msgstr ""
+"Даже если мы получим данные, IP не гарантирует, что различные фрагменты "
+"данных придут в том же порядке, в котором их отправил другой компьютер. "
+"Например, мы можем получить центр нашего изображения до того, как получим "
+"его верхний левый угол, а после — нижний правый."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:175
+msgid ""
+"It is TCP (_Transmission Control Protocol_) that asks the sender to resend "
+"any lost data and that places it all into the proper order."
+msgstr ""
+"Это TCP (_Transmission Control Protocol_), который запрашивает у отправителя "
+"повторную отправку потерянных данных и располагает их в правильном порядке."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:178
+msgid ""
+"All in all, it took _five_ different protocols for one computer to "
+"communicate to another what an image looks like. We received the data "
+"wrapped into the PNG protocol, which was wrapped into the HTTP protocol, "
+"which was wrapped into the TCP protocol, which was wrapped into the IP "
+"protocol, which was wrapped into the Ethernet protocol."
+msgstr ""
+"В итоге потребовалось _пять_ различных протоколов, чтобы один компьютер мог "
+"сообщить другому, как выглядит изображение. Мы получили данные, упакованные "
+"в протокол PNG, который был упакован в протокол HTTP, который был упакован в "
+"протокол TCP, который был упакован в протокол IP, который был упакован в "
+"протокол Ethernet."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:182
+msgid ""
+"Oh, and by the way, there probably were several other protocols involved "
+"somewhere on the way. For example, if our LAN was connected to the Internet "
+"through a dial-up call, it used the PPP protocol over the modem which used "
+"one (or several) of the various modem protocols, et cetera, et cetera, et "
+"cetera..."
+msgstr ""
+"О, и кстати, вероятно, на пути были задействованы и несколько других "
+"протоколов. Например, если наша локальная сеть была подключена к Интернету "
+"через дозвон, то использовался протокол PPP над модемом, который, в свою "
+"очередь, использовал один (или несколько) из различных модемных протоколов, "
+"и так далее, и так далее, и так далее..."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:184
+msgid ""
+"As a developer you should be asking by now, _\"How am I supposed to handle "
+"it all?\"_"
+msgstr ""
+"Как разработчик, вы уже должны задаваться вопросом: _\"Как я должен со всем "
+"этим справляться?\"_"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:189
+msgid ""
+"Luckily for you, you are _not_ supposed to handle it all. You _are_ "
+"supposed to handle some of it, but not all of it. Specifically, you need "
+"not worry about the physical connection (in our case Ethernet and possibly "
+"PPP, etc). Nor do you need to handle the Internet Protocol, or the "
+"Transmission Control Protocol."
+msgstr ""
+"К счастью для вас, вам _не_ нужно разбираться во всём этом. Вам _придётся_ "
+"разобраться в некоторой части, но не во всей. В частности, вам не нужно "
+"беспокоиться о физическом подключении (в нашем случае Ethernet и, возможно, "
+"PPP и т.д.). Также вам не нужно разбираться с протоколом IP или протоколом "
+"TCP."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:192
+msgid ""
+"In other words, you do not have to do anything to receive the data from the "
+"other computer. Well, you do have to _ask_ for it, but that is almost as "
+"simple as opening a file."
+msgstr ""
+"Другими словами, вам не нужно ничего делать, чтобы получить данные с другого "
+"компьютера. Ну, разве что _попросить_ их, но это почти так же просто, как "
+"открыть файл."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:195
+msgid ""
+"Once you have received the data, it is up to you to figure out what to do "
+"with it. In our case, you would need to understand the HTTP protocol and "
+"the PNG file structure."
+msgstr ""
+"Получив данные, вам предстоит решить, что с ними делать. В нашем случае "
+"потребуется понимание протокола HTTP и структуры файла PNG."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:199
+msgid ""
+"To use an analogy, all the internetworking protocols become a gray area: Not "
+"so much because we do not understand how it works, but because we are no "
+"longer concerned about it. The sockets interface takes care of this gray "
+"area for us:"
+msgstr ""
+"Используя аналогию, все межсетевые протоколы становятся серой зоной: не "
+"столько потому, что мы не понимаем, как они работают, а потому, что нас это "
+"больше не беспокоит. Интерфейс сокетов берёт на себя заботу об этой серой "
+"зоне:"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:200
+#, no-wrap
+msgid "Sockets Covered Protocol Layers"
+msgstr "Уровни протоколов, покрываемые сокетами"
+
+#. type: Target for macro image
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:201
+#, no-wrap
+msgid "slayers.png"
+msgstr "slayers.png"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:204
+msgid ""
+"We only need to understand any protocols that tell us how to _interpret the "
+"data_, not how to _receive_ it from another process, nor how to _send_ it to "
+"another process."
+msgstr ""
+"Нам нужно понимать только те протоколы, которые говорят нам, как "
+"_интерпретировать данные_, а не как _получать_ их от другого процесса или "
+"как _передавать_ их другому процессу."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:206
+#, no-wrap
+msgid "The Sockets Model"
+msgstr "Модель сокетов"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:211
+msgid ""
+"BSD sockets are built on the basic UNIX(R) model: _Everything is a file._ In "
+"our example, then, sockets would let us receive an _HTTP file_, so to "
+"speak. It would then be up to us to extract the _PNG file_ from it."
+msgstr ""
+"Сокеты BSD построены по базовой модели UNIX(R): _Все является файлом._ Таким "
+"образом, в нашем примере сокеты позволят нам получить, образно говоря, _HTTP-"
+"файл_. Затем нам предстоит извлечь из него _PNG-файл_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:214
+msgid ""
+"Due to the complexity of internetworking, we cannot just use the `open` "
+"system call, or the `open()` C function. Instead, we need to take several "
+"steps to \"opening\" a socket."
+msgstr ""
+"Из-за сложности межсетевого взаимодействия мы не можем просто использовать "
+"системный вызов `open` или функцию `open()` в языке C. Вместо этого "
+"необходимо выполнить несколько шагов для \"открытия\" сокета."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:217
+msgid ""
+"Once we do, however, we can start treating the _socket_ the same way we "
+"treat any _file descriptor_: We can `read` from it, `write` to it, `pipe` "
+"it, and, eventually, `close` it."
+msgstr ""
+"Однако, как только мы это сделаем, мы можем начать обращаться с _сокетом_ "
+"так же, как и с любым _файловым дескриптором_: мы можем `читать` из него, "
+"`писать` в него, передавать его через `канал` и, в конечном итоге, "
+"`закрывать` его."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:219
+#, no-wrap
+msgid "Essential Socket Functions"
+msgstr "Основные функции сокетов"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:223
+msgid ""
+"While FreeBSD offers different functions to work with sockets, we only "
+"_need_ four to \"open\" a socket. And in some cases we only need two."
+msgstr ""
+"В то время как FreeBSD предлагает различные функции для работы с сокетами, "
+"нам _требуется_ только четыре, чтобы \"открыть\" сокет. А в некоторых "
+"случаях достаточно двух."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:225
+#, no-wrap
+msgid "The Client-Server Difference"
+msgstr "Разница между клиентом и сервером"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:228
+msgid ""
+"Typically, one of the ends of a socket-based data communication is a "
+"_server_, the other is a _client_."
+msgstr ""
+"Обычно одним из концов связи на основе сокетов является _сервер_, а другой — "
+"_клиент_."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:230
+#, no-wrap
+msgid "The Common Elements"
+msgstr "Общие элементы"
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:233
+#, no-wrap
+msgid "`socket`"
+msgstr "`socket`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:237
+msgid ""
+"The one function used by both, clients and servers, is man:socket[2]. It is "
+"declared this way:"
+msgstr ""
+"Функция, используемая как клиентами, так и серверами, это man:socket[2]. Она "
+"объявляется следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:241
+#, no-wrap
+msgid "int socket(int domain, int type, int protocol);\n"
+msgstr "int socket(int domain, int type, int protocol);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:246
+msgid ""
+"The return value is of the same type as that of `open`, an integer. FreeBSD "
+"allocates its value from the same pool as that of file handles. That is "
+"what allows sockets to be treated the same way as files."
+msgstr ""
+"Возвращаемое значение имеет тот же тип, что и у `open`, целое число. FreeBSD "
+"выделяет его значение из того же пула, что и дескрипторы файлов. Это "
+"позволяет обрабатывать сокеты так же, как файлы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:250
+msgid ""
+"The `domain` argument tells the system what _protocol family_ you want it to "
+"use. Many of them exist, some are vendor specific, others are very common. "
+"They are declared in [.filename]#sys/socket.h#."
+msgstr ""
+"Аргумент `domain` указывает системе, какое _семейство протоколов_ следует "
+"использовать. Существует множество семейств, некоторые из них специфичны для "
+"определённых поставщиков, другие широко распространены. Они объявлены в "
+"[.filename]#sys/socket.h#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:252
+msgid "Use `PF_INET` for UDP, TCP and other Internet protocols (IPv4)."
+msgstr ""
+"Используйте `PF_INET` для UDP, TCP и других интернет-протоколов (IPv4)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:256
+msgid ""
+"Five values are defined for the `type` argument, again, in [.filename]#sys/"
+"socket.h#. All of them start with \"`SOCK_`\". The most common one is "
+"`SOCK_STREAM`, which tells the system you are asking for a _reliable stream "
+"delivery service_ (which is TCP when used with `PF_INET`)."
+msgstr ""
+"Для аргумента `type` определено пять значений, также указанных в "
+"[.filename]#sys/socket.h#. Все они начинаются с \"`SOCK_`\". Наиболее "
+"распространённое — `SOCK_STREAM`, которое указывает системе, что "
+"запрашивается _надёжный сервис потоковой доставки_ (это TCP при "
+"использовании с `PF_INET`)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:258
+msgid ""
+"If you asked for `SOCK_DGRAM`, you would be requesting a _connectionless "
+"datagram delivery service_ (in our case, UDP)."
+msgstr ""
+"Если бы вы запросили `SOCK_DGRAM`, вы бы запросили _сервис доставки "
+"датаграмм без установления соединения_ (в нашем случае, UDP)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:260
+msgid ""
+"If you wanted to be in charge of the low-level protocols (such as IP), or "
+"even network interfaces (e.g., the Ethernet), you would need to specify "
+"`SOCK_RAW`."
+msgstr ""
+"Если вы хотите управлять низкоуровневыми протоколами (такими как IP) или "
+"даже сетевыми интерфейсами (например, Ethernet), вам потребуется указать "
+"`SOCK_RAW`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:263
+msgid ""
+"Finally, the `protocol` argument depends on the previous two arguments, and "
+"is not always meaningful. In that case, use `0` for its value."
+msgstr ""
+"Наконец, аргумент `protocol` зависит от двух предыдущих аргументов и не "
+"всегда имеет смысл. В таком случае используйте значение `0`."
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:265
+#, no-wrap
+msgid "The Unconnected Socket"
+msgstr "Неподключенный сокет"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:269
+msgid ""
+"Nowhere, in the `socket` function have we specified to what other system we "
+"should be connected. Our newly created socket remains _unconnected_."
+msgstr ""
+"Нигде в функции `socket` мы не указали, к какой другой системе должны быть "
+"подключены. Наш только что созданный сокет остаётся _неподключённым_."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:272
+msgid ""
+"This is on purpose: To use a telephone analogy, we have just attached a "
+"modem to the phone line. We have neither told the modem to make a call, nor "
+"to answer if the phone rings."
+msgstr ""
+"Это сделано намеренно: если проводить аналогию с телефоном, мы только что "
+"подключили модем к телефонной линии. Мы не сказали модему совершить звонок "
+"или ответить, если телефон зазвонит."
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:275
+#, no-wrap
+msgid "`sockaddr`"
+msgstr "`sockaddr`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:280
+msgid ""
+"Various functions of the sockets family expect the address of (or pointer "
+"to, to use C terminology) a small area of the memory. The various C "
+"declarations in the [.filename]#sys/socket.h# refer to it as `struct "
+"sockaddr`. This structure is declared in the same file:"
+msgstr ""
+"Различные функции семейства сокетов ожидают адрес (или указатель, если "
+"использовать терминологию языка C) небольшой области памяти. Различные "
+"объявления на языке C в файле [.filename]#sys/socket.h# ссылаются на неё как "
+"на `struct sockaddr`. Эта структура объявлена в том же файле:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:293
+#, no-wrap
+msgid ""
+"/*\n"
+" * Structure used by kernel to store most\n"
+" * addresses.\n"
+" */\n"
+"struct sockaddr {\n"
+"\tunsigned char\tsa_len;\t\t/* total length */\n"
+"\tsa_family_t\tsa_family;\t/* address family */\n"
+"\tchar\t\tsa_data[14];\t/* actually longer; address value */\n"
+"};\n"
+"#define\tSOCK_MAXADDRLEN\t255\t\t/* longest possible addresses */\n"
+msgstr ""
+"/*\n"
+" * Structure used by kernel to store most\n"
+" * addresses.\n"
+" */\n"
+"struct sockaddr {\n"
+"\tunsigned char\tsa_len;\t\t/* total length */\n"
+"\tsa_family_t\tsa_family;\t/* address family */\n"
+"\tchar\t\tsa_data[14];\t/* actually longer; address value */\n"
+"};\n"
+"#define\tSOCK_MAXADDRLEN\t255\t\t/* longest possible addresses */\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:297
+msgid ""
+"Please note the _vagueness_ with which the `sa_data` field is declared, just "
+"as an array of `14` bytes, with the comment hinting there can be more than "
+"`14` of them."
+msgstr ""
+"Обратите внимание на _неопределённость_, с которой объявлено поле `sa_data` "
+"— просто как массив из `14` байт, с комментарием, намекающим, что их может "
+"быть больше `14`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:300
+msgid ""
+"This vagueness is quite deliberate. Sockets is a very powerful interface. "
+"While most people perhaps think of it as nothing more than the Internet "
+"interface-and most applications probably use it for that nowadays-sockets "
+"can be used for just about _any_ kind of interprocess communications, of "
+"which the Internet (or, more precisely, IP) is only one."
+msgstr ""
+"Эта неопределенность вполне преднамеренна. Сокеты — это очень мощный "
+"интерфейс. Хотя большинство людей, возможно, считают их не более чем "
+"интерфейсом для Интернета — и большинство приложений, вероятно, используют "
+"их именно для этого в наши дни — сокеты могут быть использованы практически "
+"для _любого_ вида межпроцессного взаимодействия, из которых Интернет (или, "
+"точнее, IP) — лишь один из них."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:303
+msgid ""
+"The [.filename]#sys/socket.h# refers to the various types of protocols "
+"sockets will handle as _address families_, and lists them right before the "
+"definition of `sockaddr`:"
+msgstr ""
+"[.filename]#sys/socket.h# ссылается на различные типы протоколов, с которыми "
+"работают сокеты, как на _семейства адресов_, и перечисляет их "
+"непосредственно перед определением `sockaddr`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:352
+#, no-wrap
+msgid ""
+"/*\n"
+" * Address families.\n"
+" */\n"
+"#define\tAF_UNSPEC\t0\t\t/* unspecified */\n"
+"#define\tAF_LOCAL\t1\t\t/* local to host (pipes, portals) */\n"
+"#define\tAF_UNIX\t\tAF_LOCAL\t/* backward compatibility */\n"
+"#define\tAF_INET\t\t2\t\t/* internetwork: UDP, TCP, etc. */\n"
+"#define\tAF_IMPLINK\t3\t\t/* arpanet imp addresses */\n"
+"#define\tAF_PUP\t\t4\t\t/* pup protocols: e.g. BSP */\n"
+"#define\tAF_CHAOS\t5\t\t/* mit CHAOS protocols */\n"
+"#define\tAF_NS\t\t6\t\t/* XEROX NS protocols */\n"
+"#define\tAF_ISO\t\t7\t\t/* ISO protocols */\n"
+"#define\tAF_OSI\t\tAF_ISO\n"
+"#define\tAF_ECMA\t\t8\t\t/* European computer manufacturers */\n"
+"#define\tAF_DATAKIT\t9\t\t/* datakit protocols */\n"
+"#define\tAF_CCITT\t10\t\t/* CCITT protocols, X.25 etc */\n"
+"#define\tAF_SNA\t\t11\t\t/* IBM SNA */\n"
+"#define AF_DECnet\t12\t\t/* DECnet */\n"
+"#define AF_DLI\t\t13\t\t/* DEC Direct data link interface */\n"
+"#define AF_LAT\t\t14\t\t/* LAT */\n"
+"#define\tAF_HYLINK\t15\t\t/* NSC Hyperchannel */\n"
+"#define\tAF_APPLETALK\t16\t\t/* Apple Talk */\n"
+"#define\tAF_ROUTE\t17\t\t/* Internal Routing Protocol */\n"
+"#define\tAF_LINK\t\t18\t\t/* Link layer interface */\n"
+"#define\tpseudo_AF_XTP\t19\t\t/* eXpress Transfer Protocol (no AF) */\n"
+"#define\tAF_COIP\t\t20\t\t/* connection-oriented IP, aka ST II */\n"
+"#define\tAF_CNT\t\t21\t\t/* Computer Network Technology */\n"
+"#define pseudo_AF_RTIP\t22\t\t/* Help Identify RTIP packets */\n"
+"#define\tAF_IPX\t\t23\t\t/* Novell Internet Protocol */\n"
+"#define\tAF_SIP\t\t24\t\t/* Simple Internet Protocol */\n"
+"#define\tpseudo_AF_PIP\t25\t\t/* Help Identify PIP packets */\n"
+"#define\tAF_ISDN\t\t26\t\t/* Integrated Services Digital Network*/\n"
+"#define\tAF_E164\t\tAF_ISDN\t\t/* CCITT E.164 recommendation */\n"
+"#define\tpseudo_AF_KEY\t27\t\t/* Internal key-management function */\n"
+"#define\tAF_INET6\t28\t\t/* IPv6 */\n"
+"#define\tAF_NATM\t\t29\t\t/* native ATM access */\n"
+"#define\tAF_ATM\t\t30\t\t/* ATM */\n"
+"#define pseudo_AF_HDRCMPLT 31\t\t/* Used by BPF to not rewrite headers\n"
+"\t\t\t\t\t * in interface output routine\n"
+"\t\t\t\t\t */\n"
+"#define\tAF_NETGRAPH\t32\t\t/* Netgraph sockets */\n"
+"#define\tAF_SLOW\t\t33\t\t/* 802.3ad slow protocol */\n"
+"#define\tAF_SCLUSTER\t34\t\t/* Sitara cluster protocol */\n"
+"#define\tAF_ARP\t\t35\n"
+"#define\tAF_BLUETOOTH\t36\t\t/* Bluetooth sockets */\n"
+"#define\tAF_MAX\t\t37\n"
+msgstr ""
+"/*\n"
+" * Address families.\n"
+" */\n"
+"#define\tAF_UNSPEC\t0\t\t/* unspecified */\n"
+"#define\tAF_LOCAL\t1\t\t/* local to host (pipes, portals) */\n"
+"#define\tAF_UNIX\t\tAF_LOCAL\t/* backward compatibility */\n"
+"#define\tAF_INET\t\t2\t\t/* internetwork: UDP, TCP, etc. */\n"
+"#define\tAF_IMPLINK\t3\t\t/* arpanet imp addresses */\n"
+"#define\tAF_PUP\t\t4\t\t/* pup protocols: e.g. BSP */\n"
+"#define\tAF_CHAOS\t5\t\t/* mit CHAOS protocols */\n"
+"#define\tAF_NS\t\t6\t\t/* XEROX NS protocols */\n"
+"#define\tAF_ISO\t\t7\t\t/* ISO protocols */\n"
+"#define\tAF_OSI\t\tAF_ISO\n"
+"#define\tAF_ECMA\t\t8\t\t/* European computer manufacturers */\n"
+"#define\tAF_DATAKIT\t9\t\t/* datakit protocols */\n"
+"#define\tAF_CCITT\t10\t\t/* CCITT protocols, X.25 etc */\n"
+"#define\tAF_SNA\t\t11\t\t/* IBM SNA */\n"
+"#define AF_DECnet\t12\t\t/* DECnet */\n"
+"#define AF_DLI\t\t13\t\t/* DEC Direct data link interface */\n"
+"#define AF_LAT\t\t14\t\t/* LAT */\n"
+"#define\tAF_HYLINK\t15\t\t/* NSC Hyperchannel */\n"
+"#define\tAF_APPLETALK\t16\t\t/* Apple Talk */\n"
+"#define\tAF_ROUTE\t17\t\t/* Internal Routing Protocol */\n"
+"#define\tAF_LINK\t\t18\t\t/* Link layer interface */\n"
+"#define\tpseudo_AF_XTP\t19\t\t/* eXpress Transfer Protocol (no AF) */\n"
+"#define\tAF_COIP\t\t20\t\t/* connection-oriented IP, aka ST II */\n"
+"#define\tAF_CNT\t\t21\t\t/* Computer Network Technology */\n"
+"#define pseudo_AF_RTIP\t22\t\t/* Help Identify RTIP packets */\n"
+"#define\tAF_IPX\t\t23\t\t/* Novell Internet Protocol */\n"
+"#define\tAF_SIP\t\t24\t\t/* Simple Internet Protocol */\n"
+"#define\tpseudo_AF_PIP\t25\t\t/* Help Identify PIP packets */\n"
+"#define\tAF_ISDN\t\t26\t\t/* Integrated Services Digital Network*/\n"
+"#define\tAF_E164\t\tAF_ISDN\t\t/* CCITT E.164 recommendation */\n"
+"#define\tpseudo_AF_KEY\t27\t\t/* Internal key-management function */\n"
+"#define\tAF_INET6\t28\t\t/* IPv6 */\n"
+"#define\tAF_NATM\t\t29\t\t/* native ATM access */\n"
+"#define\tAF_ATM\t\t30\t\t/* ATM */\n"
+"#define pseudo_AF_HDRCMPLT 31\t\t/* Used by BPF to not rewrite headers\n"
+"\t\t\t\t\t * in interface output routine\n"
+"\t\t\t\t\t */\n"
+"#define\tAF_NETGRAPH\t32\t\t/* Netgraph sockets */\n"
+"#define\tAF_SLOW\t\t33\t\t/* 802.3ad slow protocol */\n"
+"#define\tAF_SCLUSTER\t34\t\t/* Sitara cluster protocol */\n"
+"#define\tAF_ARP\t\t35\n"
+"#define\tAF_BLUETOOTH\t36\t\t/* Bluetooth sockets */\n"
+"#define\tAF_MAX\t\t37\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:356
+msgid "The one used for IP is AF_INET. It is a symbol for the constant `2`."
+msgstr "Используемый для IP — это AF_INET. Это символ для константы `2`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:358
+msgid ""
+"It is the _address family_ listed in the `sa_family` field of `sockaddr` "
+"that decides how exactly the vaguely named bytes of `sa_data` will be used."
+msgstr ""
+"Это _семейство адресов_, указанное в поле `sa_family` структуры `sockaddr`, "
+"определяет, как именно будут использоваться нечетко названные байты "
+"`sa_data`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:360
+msgid ""
+"Specifically, whenever the _address family_ is AF_INET, we can use `struct "
+"sockaddr_in` found in [.filename]#netinet/in.h#, wherever `sockaddr` is "
+"expected:"
+msgstr ""
+"В частности, когда _семейство адресов_ — AF_INET, можно использовать `struct "
+"sockaddr_in` из [.filename]#netinet/in.h# везде, где ожидается `sockaddr`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:373
+#, no-wrap
+msgid ""
+"/*\n"
+" * Socket address, internet style.\n"
+" */\n"
+"struct sockaddr_in {\n"
+"\tuint8_t\t\tsin_len;\n"
+"\tsa_family_t\tsin_family;\n"
+"\tin_port_t\tsin_port;\n"
+"\tstruct\tin_addr sin_addr;\n"
+"\tchar\tsin_zero[8];\n"
+"};\n"
+msgstr ""
+"/*\n"
+" * Socket address, internet style.\n"
+" */\n"
+"struct sockaddr_in {\n"
+"\tuint8_t\t\tsin_len;\n"
+"\tsa_family_t\tsin_family;\n"
+"\tin_port_t\tsin_port;\n"
+"\tstruct\tin_addr sin_addr;\n"
+"\tchar\tsin_zero[8];\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:376
+msgid "We can visualize its organization this way:"
+msgstr "Мы можем визуализировать его организацию следующим образом:"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:377
+#, no-wrap
+msgid "sockaddr_in structure"
+msgstr "Структура `sockaddr_in`"
+
+#. type: Target for macro image
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:378
+#, no-wrap
+msgid "sain.png"
+msgstr "sain.png"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:381
+msgid ""
+"The three important fields are `sin_family`, which is byte 1 of the "
+"structure, `sin_port`, a 16-bit value found in bytes 2 and 3, and "
+"`sin_addr`, a 32-bit integer representation of the IP address, stored in "
+"bytes 4-7."
+msgstr ""
+"Три важных поля — это `sin_family`, которое находится в байте 1 структуры, "
+"`sin_port`, 16-битное значение, расположенное в байтах 2 и 3, и `sin_addr`, "
+"32-битное целочисленное представление IP-адреса, хранящееся в байтах 4–7."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:387
+msgid ""
+"Now, let us try to fill it out. Let us assume we are trying to write a "
+"client for the _daytime_ protocol, which simply states that its server will "
+"write a text string representing the current date and time to port 13. We "
+"want to use TCP/IP, so we need to specify `AF_INET` in the address family "
+"field. `AF_INET` is defined as `2`. Let us use the IP address of "
+"`192.43.244.18`, which is the time server of US federal government "
+"(`time.nist.gov`)."
+msgstr ""
+"Теперь попробуем заполнить его. Предположим, мы пытаемся написать клиент для "
+"протокола _daytime_, который просто указывает, что его сервер записывает "
+"текстовую строку с текущей датой и временем в порт 13. Мы хотим использовать "
+"TCP/IP, поэтому нам нужно указать `AF_INET` в поле семейства адресов. "
+"`AF_INET` определен как `2`. Давайте используем IP-адрес `192.43.244.18`, "
+"который является сервером времени федерального правительства США "
+"(`time.nist.gov`)."
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:388
+#, no-wrap
+msgid "Specific example of sockaddr_in"
+msgstr "Конкретный пример sockaddr_in"
+
+#. type: Target for macro image
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:389
+#, no-wrap
+msgid "sainfill.png"
+msgstr "sainfill.png"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:392
+msgid ""
+"By the way the `sin_addr` field is declared as being of the `struct in_addr` "
+"type, which is defined in [.filename]#netinet/in.h#:"
+msgstr ""
+"Кстати, поле `sin_addr` объявлено как имеющее тип `struct in_addr`, который "
+"определён в [.filename]#netinet/in.h#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:401
+#, no-wrap
+msgid ""
+"/*\n"
+" * Internet address (a structure for historical reasons)\n"
+" */\n"
+"struct in_addr {\n"
+"\tin_addr_t s_addr;\n"
+"};\n"
+msgstr ""
+"/*\n"
+" * Internet address (a structure for historical reasons)\n"
+" */\n"
+"struct in_addr {\n"
+"\tin_addr_t s_addr;\n"
+"};\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:404
+msgid "In addition, `in_addr_t` is a 32-bit integer."
+msgstr "В дополнение, `in_addr_t` является 32-битным целым числом."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:406
+msgid ""
+"The `192.43.244.18` is just a convenient notation of expressing a 32-bit "
+"integer by listing all of its 8-bit bytes, starting with the _most "
+"significant_ one."
+msgstr ""
+"`192.43.244.18` — это просто удобная форма записи 32-битного целого числа, в "
+"которой перечисляются все его 8-битные байты, начиная с _старшего_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:410
+msgid ""
+"So far, we have viewed `sockaddr` as an abstraction. Our computer does not "
+"store `short` integers as a single 16-bit entity, but as a sequence of 2 "
+"bytes. Similarly, it stores 32-bit integers as a sequence of 4 bytes."
+msgstr ""
+"До сих пор мы рассматривали `sockaddr` как абстракцию. Наш компьютер не "
+"хранит `short` целые числа как единую 16-битную сущность, а как "
+"последовательность 2 байт. Аналогично, он хранит 32-битные целые числа как "
+"последовательность 4 байт."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:412
+msgid "Suppose we coded something like this:"
+msgstr "Предположим, мы написали что-то вроде этого:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:418
+#, no-wrap
+msgid ""
+"sa.sin_family = AF_INET;\n"
+"sa.sin_port = 13;\n"
+"sa.sin_addr.s_addr = (((((192 << 8) | 43) << 8) | 244) << 8) | 18;\n"
+msgstr ""
+"sa.sin_family = AF_INET;\n"
+"sa.sin_port = 13;\n"
+"sa.sin_addr.s_addr = (((((192 << 8) | 43) << 8) | 244) << 8) | 18;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:421
+msgid "What would the result look like?"
+msgstr "Как будет выглядеть результат?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:424
+msgid ""
+"Well, that depends, of course. On a Pentium(R), or other x86, based "
+"computer, it would look like this:"
+msgstr ""
+"Ну, это, конечно, зависит от многого. На компьютере с процессором Pentium(R) "
+"или другим на базе x86 это будет выглядеть так:"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:425
+#, no-wrap
+msgid "sockaddr_in on an Intel system"
+msgstr "`sockaddr_in` в системе с архитектурой Intel"
+
+#. type: Target for macro image
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:426
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:472
+#, no-wrap
+msgid "sainlsb.png"
+msgstr "sainlsb.png"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:429
+msgid "On a different system, it might look like this:"
+msgstr "На другой системе это может выглядеть так:"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:430
+#, no-wrap
+msgid "sockaddr_in on an MSB system"
+msgstr "`sockaddr_in` в системе с порядком байтов от старшего к младшему"
+
+#. type: Target for macro image
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:431
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:477
+#, no-wrap
+msgid "sainmsb.png"
+msgstr "sainmsb.png"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:435
+msgid ""
+"And on a PDP it might look different yet. But the above two are the most "
+"common ways in use today."
+msgstr ""
+"И на PDP это может выглядеть иначе. Однако два приведённых выше варианта "
+"являются наиболее распространёнными на сегодняшний день."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:439
+msgid ""
+"Ordinarily, wanting to write portable code, programmers pretend that these "
+"differences do not exist. And they get away with it (except when they code "
+"in assembly language). Alas, you cannot get away with it that easily when "
+"coding for sockets."
+msgstr ""
+"Обычно, стремясь писать переносимый код, программисты делают вид, что этих "
+"различий не существует. И им это сходит с рук (за исключением случаев, когда "
+"они пишут на ассемблере). Увы, при программировании сокетов так легко "
+"отделаться не получится."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:441
+msgid "Why?"
+msgstr "Почему?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:443
+msgid ""
+"Because when communicating with another computer, you usually do not know "
+"whether it stores data _most significant byte_ (MSB) or _least significant "
+"byte_ (LSB) first."
+msgstr ""
+"Потому что при обмене данными с другим компьютером вы обычно не знаете, "
+"хранит ли он данные, начиная со _старшего байта_ (MSB) или с _младшего "
+"байта_ (LSB)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:445
+msgid "You might be wondering, _\"So, will sockets not handle it for me?\"_"
+msgstr ""
+"Вы можете задаться вопросом: _\"Значит, сокеты не будут это делать за меня?"
+"\"_"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:447
+msgid "It will not."
+msgstr "Не будут."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:450
+msgid ""
+"While that answer may surprise you at first, remember that the general "
+"sockets interface only understands the `sa_len` and `sa_family` fields of "
+"the `sockaddr` structure. You do not have to worry about the byte order "
+"there (of course, on FreeBSD `sa_family` is only 1 byte anyway, but many "
+"other UNIX(R) systems do not have `sa_len` and use 2 bytes for `sa_family`, "
+"and expect the data in whatever order is native to the computer)."
+msgstr ""
+"Хотя этот ответ может сначала вас удивить, помните, что общий интерфейс "
+"сокетов понимает только поля `sa_len` и `sa_family` структуры `sockaddr`. "
+"Вам не нужно беспокоиться о порядке байтов (конечно, в FreeBSD `sa_family` "
+"занимает всего 1 байт, но многие другие UNIX(R)-системы не имеют `sa_len` и "
+"используют 2 байта для `sa_family`, ожидая данные в том порядке, который "
+"является родным для компьютера)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:453
+msgid ""
+"But the rest of the data is just `sa_data[14]` as far as sockets goes. "
+"Depending on the _address family_, sockets just forwards that data to its "
+"destination."
+msgstr ""
+"Но остальные данные — это просто `sa_data[14]` с точки зрения сокетов. В "
+"зависимости от _семейства адресов_ сокеты просто передают эти данные по "
+"назначению."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:458
+msgid ""
+"Indeed, when we enter a port number, it is because we want the other "
+"computer to know what service we are asking for. And, when we are the "
+"server, we read the port number so we know what service the other computer "
+"is expecting from us. Either way, sockets only has to forward the port "
+"number as data. It does not interpret it in any way."
+msgstr ""
+"Действительно, когда мы указываем номер порта, это делается для того, чтобы "
+"другая компьютерная система знала, какую службу мы запрашиваем. И, когда мы "
+"выступаем в роли сервера, мы считываем номер порта, чтобы понять, какую "
+"службу ожидает от нас другая система. В любом случае, сокетам нужно лишь "
+"передать номер порта в качестве данных. Они никак его не интерпретируют."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:461
+msgid ""
+"Similarly, we enter the IP address to tell everyone on the way where to send "
+"our data to. Sockets, again, only forwards it as data."
+msgstr ""
+"Аналогично, мы указываем IP-адрес, чтобы сообщить всем на пути, куда "
+"отправлять наши данные. Сокеты, опять же, просто пересылают их как данные."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:463
+msgid ""
+"That is why, we (the _programmers_, not the _sockets_) have to distinguish "
+"between the byte order used by our computer and a conventional byte order to "
+"send the data in to the other computer."
+msgstr ""
+"Вот почему мы (программисты, а не сокеты) должны различать порядок байтов, "
+"используемый нашим компьютером, и условный порядок байтов для отправки "
+"данных на другой компьютер."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:465
+msgid ""
+"We will call the byte order our computer uses the _host byte order_, or just "
+"the _host order_."
+msgstr ""
+"Мы будем называть порядок байтов, который использует наш компьютер, "
+"_порядком байтов хоста_ или просто _хост-порядком_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:468
+msgid ""
+"There is a convention of sending the multi-byte data over IP _MSB first_. "
+"This, we will refer to as the _network byte order_, or simply the _network "
+"order_."
+msgstr ""
+"Существует соглашение о передаче многобайтовых данных по IP _старшим байтом "
+"вперёд_. Это мы будем называть _порядком байтов сети_ или просто _сетевым "
+"порядком_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:470
+msgid ""
+"Now, if we compiled the above code for an Intel based computer, our _host "
+"byte order_ would produce:"
+msgstr ""
+"Вот, если бы мы скомпилировали приведённый выше код для компьютера на базе "
+"Intel, наш _порядок байтов хоста_ выдал бы:"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:471
+#, no-wrap
+msgid "Host byte order on an Intel system"
+msgstr "Порядок байтов на хосте в системе Intel"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:475
+msgid "But the _network byte order_ requires that we store the data MSB first:"
+msgstr ""
+"Но порядок байтов в _сетевом формате_ требует, чтобы данные хранились "
+"начиная со старшего байта (MSB):"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:476
+#, no-wrap
+msgid "Network byte order"
+msgstr "Порядок байтов в сети"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:480
+msgid ""
+"Unfortunately, our _host order_ is the exact opposite of the _network order_."
+msgstr ""
+"К сожалению, наш _порядок хоста_ полностью противоположен _порядку сети_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:483
+msgid ""
+"We have several ways of dealing with it. One would be to _reverse_ the "
+"values in our code:"
+msgstr ""
+"У нас есть несколько способов решения этой проблемы. Один из них — "
+"_инвертировать_ значения в нашем коде:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:489
+#, no-wrap
+msgid ""
+"sa.sin_family = AF_INET;\n"
+"sa.sin_port = 13 << 8;\n"
+"sa.sin_addr.s_addr = (((((18 << 8) | 244) << 8) | 43) << 8) | 192;\n"
+msgstr ""
+"sa.sin_family = AF_INET;\n"
+"sa.sin_port = 13 << 8;\n"
+"sa.sin_addr.s_addr = (((((18 << 8) | 244) << 8) | 43) << 8) | 192;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:494
+msgid ""
+"This will _trick_ our compiler into storing the data in the _network byte "
+"order_. In some cases, this is exactly the way to do it (e.g., when "
+"programming in assembly language). In most cases, however, it can cause a "
+"problem."
+msgstr ""
+"Это _обманет_ наш компилятор, заставив его сохранить данные в _порядке "
+"байтов сети_. В некоторых случаях это именно тот способ, который нужен "
+"(например, при программировании на ассемблере). Однако в большинстве случаев "
+"это может вызвать проблему."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:498
+msgid ""
+"Suppose, you wrote a sockets-based program in C. You know it is going to "
+"run on a Pentium(R), so you enter all your constants in reverse and force "
+"them to the _network byte order_. It works well."
+msgstr ""
+"Предположим, вы написали программу на C, использующую сокеты. Вы знаете, что "
+"она будет работать на Pentium(R), поэтому вводите все константы в обратном "
+"порядке и приводите их к _порядку байтов сети_. Она работает хорошо."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:503
+msgid ""
+"Then, some day, your trusted old Pentium(R) becomes a rusty old Pentium(R). "
+"You replace it with a system whose _host order_ is the same as the _network "
+"order_. You need to recompile all your software. All of your software "
+"continues to perform well, except the one program you wrote."
+msgstr ""
+"Затем, однажды, ваш надежный старый Pentium(R) превращается в ржавый старый "
+"Pentium(R). Вы заменяете его системой, у которой _порядок байтов хоста_ "
+"совпадает с _сетевым порядком байтов_. Вам нужно перекомпилировать все ваше "
+"программное обеспечение. Все ваши программы продолжают работать хорошо, "
+"кроме той одной программы, которую вы написали."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:507
+msgid ""
+"You have since forgotten that you had forced all of your constants to the "
+"opposite of the _host order_. You spend some quality time tearing out your "
+"hair, calling the names of all gods you ever heard of (and some you made "
+"up), hitting your monitor with a nerf bat, and performing all the other "
+"traditional ceremonies of trying to figure out why something that has worked "
+"so well is suddenly not working at all."
+msgstr ""
+"Вы уже забыли, что принудительно задали все свои константы противоположными "
+"_порядку хоста_. Вы проводите некоторое время, яростно рвя на себе волосы, "
+"взывая ко всем известным вам богам (и к некоторым, которых вы придумали), "
+"стуча нерф-битой по монитору и выполняя прочие традиционные ритуалы в "
+"попытке понять, почему то, что работало так хорошо, внезапно перестало "
+"работать вообще."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:509
+msgid ""
+"Eventually, you figure it out, say a couple of swear words, and start "
+"rewriting your code."
+msgstr ""
+"В конце концов, вы разбираетесь в проблеме, произносите пару крепких "
+"словечек и начинаете переписывать свой код."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:512
+msgid ""
+"Luckily, you are not the first one to face the problem. Someone else has "
+"created the man:htons[3] and man:htonl[3] C functions to convert a `short` "
+"and `long` respectively from the _host byte order_ to the _network byte "
+"order_, and the man:ntohs[3] and man:ntohl[3] C functions to go the other "
+"way."
+msgstr ""
+"К счастью, вы не первый, кто столкнулся с этой проблемой. Кто-то уже создал "
+"функции man:htons[3] и man:htonl[3] на языке C для преобразования `short` и "
+"`long` соответственно из _порядка байтов хоста_ в _порядок байтов сети_, а "
+"также функции man:ntohs[3] и man:ntohl[3] на языке C для обратного "
+"преобразования."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:515
+msgid ""
+"On _MSB-first_ systems these functions do nothing. On _LSB-first_ systems "
+"they convert values to the proper order."
+msgstr ""
+"На системах с порядком _старший байт первый_ эти функции не выполняют "
+"никаких действий. На системах с порядком _младший байт первый_ они "
+"преобразуют значения в правильный порядок."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:517
+msgid ""
+"So, regardless of what system your software is compiled on, your data will "
+"end up in the correct order if you use these functions."
+msgstr ""
+"Итак, независимо от того, на какой системе компилируется ваше программное "
+"обеспечение, ваши данные будут в правильном порядке, если вы используете эти "
+"функции."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:519
+#, no-wrap
+msgid "Client Functions"
+msgstr "Функции клиента"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:524
+msgid ""
+"Typically, the client initiates the connection to the server. The client "
+"knows which server it is about to call: It knows its IP address, and it "
+"knows the _port_ the server resides at. It is akin to you picking up the "
+"phone and dialing the number (the _address_), then, after someone answers, "
+"asking for the person in charge of wingdings (the _port_)."
+msgstr ""
+"Обычно клиент инициирует подключение к серверу. Клиент знает, к какому "
+"серверу он собирается обратиться: он знает его IP-адрес и _порт_, на котором "
+"работает сервер. Это похоже на то, как вы поднимаете трубку и набираете "
+"номер (_адрес_), а затем, когда кто-то отвечает, просите соединить со "
+"специалистом по непонятным символам (_порт_)."
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:526
+#, no-wrap
+msgid "`connect`"
+msgstr "`connect`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:529
+msgid ""
+"Once a client has created a socket, it needs to connect it to a specific "
+"port on a remote system. It uses man:connect[2]:"
+msgstr ""
+"Как только клиент создал сокет, ему нужно подключить его к определённому "
+"порту на удалённой системе. Для этого используется man:connect[2]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:533
+#, no-wrap
+msgid "int connect(int s, const struct sockaddr *name, socklen_t namelen);\n"
+msgstr "int connect(int s, const struct sockaddr *name, socklen_t namelen);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:538
+msgid ""
+"The `s` argument is the socket, i.e., the value returned by the `socket` "
+"function. The `name` is a pointer to `sockaddr`, the structure we have "
+"talked about extensively. Finally, `namelen` informs the system how many "
+"bytes are in our `sockaddr` structure."
+msgstr ""
+"Аргумент `s` — это сокет, то есть значение, возвращаемое функцией `socket`. "
+"Аргумент `name` — это указатель на структуру `sockaddr`, которую мы подробно "
+"обсуждали. Наконец, `namelen` сообщает системе, сколько байт находится в "
+"нашей структуре `sockaddr`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:541
+msgid ""
+"If `connect` is successful, it returns `0`. Otherwise it returns `-1` and "
+"stores the error code in `errno`."
+msgstr ""
+"Если `connect` завершается успешно, он возвращает `0`. В противном случае "
+"возвращается `-1`, а код ошибки сохраняется в `errno`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:545
+msgid ""
+"There are many reasons why `connect` may fail. For example, with an attempt "
+"to an Internet connection, the IP address may not exist, or it may be down, "
+"or just too busy, or it may not have a server listening at the specified "
+"port. Or it may outright _refuse_ any request for specific code."
+msgstr ""
+"Существует множество причин, по которым `connect` может завершиться "
+"неудачей. Например, при попытке подключения к интернету, IP-адрес может не "
+"существовать, быть недоступен, перегружен или на указанном порту может не "
+"быть сервера. Или же подключение может быть явно _отклонено_ по определённым "
+"причинам."
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:547
+#, no-wrap
+msgid "Our First Client"
+msgstr "Наш первый клиент"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:550
+msgid ""
+"We now know enough to write a very simple client, one that will get current "
+"time from `192.43.244.18` and print it to [.filename]#stdout#."
+msgstr ""
+"Теперь мы знаем достаточно, чтобы написать очень простого клиента, который "
+"получит текущее время от `192.43.244.18` и выведет его в [.filename]#stdout#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:564
+#, no-wrap
+msgid ""
+"/*\n"
+" * daytime.c\n"
+" *\n"
+" * Programmed by G. Adam Stanislav\n"
+" */\n"
+"#include <stdio.h>\n"
+"#include <string.h>\n"
+"#include <sys/types.h>\n"
+"#include <sys/socket.h>\n"
+"#include <netinet/in.h>\n"
+"#include <unistd.h>\n"
+msgstr ""
+"/*\n"
+" * daytime.c\n"
+" *\n"
+" * Programmed by G. Adam Stanislav\n"
+" */\n"
+"#include <stdio.h>\n"
+"#include <string.h>\n"
+"#include <sys/types.h>\n"
+"#include <sys/socket.h>\n"
+"#include <netinet/in.h>\n"
+"#include <unistd.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:569
+#, no-wrap
+msgid ""
+"int main() {\n"
+" int s, bytes;\n"
+" struct sockaddr_in sa;\n"
+" char buffer[BUFSIZ+1];\n"
+msgstr ""
+"int main() {\n"
+" int s, bytes;\n"
+" struct sockaddr_in sa;\n"
+" char buffer[BUFSIZ+1];\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:574
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:993
+#, no-wrap
+msgid ""
+" if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {\n"
+" perror(\"socket\");\n"
+" return 1;\n"
+" }\n"
+msgstr ""
+" if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {\n"
+" perror(\"socket\");\n"
+" return 1;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:576
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:995
+#, no-wrap
+msgid " memset(&sa, '\\0', sizeof(sa));\n"
+msgstr " memset(&sa, '\\0', sizeof(sa));\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:585
+#, no-wrap
+msgid ""
+" sa.sin_family = AF_INET;\n"
+" sa.sin_port = htons(13);\n"
+" sa.sin_addr.s_addr = htonl((((((192 << 8) | 43) << 8) | 244) << 8) | 18);\n"
+" if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {\n"
+" perror(\"connect\");\n"
+" close(s);\n"
+" return 2;\n"
+" }\n"
+msgstr ""
+" sa.sin_family = AF_INET;\n"
+" sa.sin_port = htons(13);\n"
+" sa.sin_addr.s_addr = htonl((((((192 << 8) | 43) << 8) | 244) << 8) | 18);\n"
+" if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {\n"
+" perror(\"connect\");\n"
+" close(s);\n"
+" return 2;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:588
+#, no-wrap
+msgid ""
+" while ((bytes = read(s, buffer, BUFSIZ)) > 0)\n"
+" write(1, buffer, bytes);\n"
+msgstr ""
+" while ((bytes = read(s, buffer, BUFSIZ)) > 0)\n"
+" write(1, buffer, bytes);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:592
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1019
+#, no-wrap
+msgid ""
+" close(s);\n"
+" return 0;\n"
+"}\n"
+msgstr ""
+" close(s);\n"
+" return 0;\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:595
+msgid ""
+"Go ahead, enter it in your editor, save it as [.filename]#daytime.c#, then "
+"compile and run it:"
+msgstr ""
+"Вперед! Введите это в вашем редакторе, сохраните как [.filename]#daytime.c#, "
+"затем скомпилируйте и запустите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:600
+#, no-wrap
+msgid ""
+"% cc -O3 -o daytime daytime.c\n"
+"% ./daytime\n"
+msgstr ""
+"% cc -O3 -o daytime daytime.c\n"
+"% ./daytime\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:603
+#, no-wrap
+msgid ""
+"52079 01-06-19 02:29:25 50 0 1 543.9 UTC(NIST) *\n"
+"%\n"
+msgstr ""
+"52079 01-06-19 02:29:25 50 0 1 543.9 UTC(NIST) *\n"
+"%\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:607
+msgid ""
+"In this case, the date was June 19, 2001, the time was 02:29:25 UTC. "
+"Naturally, your results will vary."
+msgstr ""
+"В данном случае дата была 19 июня 2001 года, время — 02:29:25 UTC. "
+"Естественно, ваши результаты могут отличаться."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:609
+#, no-wrap
+msgid "Server Functions"
+msgstr "Функции сервера"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:615
+msgid ""
+"The typical server does not initiate the connection. Instead, it waits for "
+"a client to call it and request services. It does not know when the client "
+"will call, nor how many clients will call. It may be just sitting there, "
+"waiting patiently, one moment, The next moment, it can find itself swamped "
+"with requests from a number of clients, all calling in at the same time."
+msgstr ""
+"Типичный сервер не инициирует соединение. Вместо этого он ожидает, когда "
+"клиент обратится к нему и запросит услуги. Он не знает, когда клиент "
+"обратится, ни сколько клиентов обратится. В один момент он может просто "
+"спокойно ожидать, а в следующий момент он может оказаться перегруженным "
+"запросами от множества клиентов, обращающихся одновременно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:617
+msgid "The sockets interface offers three basic functions to handle this."
+msgstr ""
+"Интерфейс сокетов предоставляет три основные функции для обработки этого."
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:619
+#, no-wrap
+msgid "`bind`"
+msgstr "`bind`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:622
+msgid ""
+"Ports are like extensions to a phone line: After you dial a number, you dial "
+"the extension to get to a specific person or department."
+msgstr ""
+"Порты подобны внутренним номерам телефонной линии: после набора основного "
+"номера вы набираете внутренний номер, чтобы связаться с конкретным человеком "
+"или отделом."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:626
+msgid ""
+"There are 65535 IP ports, but a server usually processes requests that come "
+"in on only one of them. It is like telling the phone room operator that we "
+"are now at work and available to answer the phone at a specific extension. "
+"We use man:bind[2] to tell sockets which port we want to serve."
+msgstr ""
+"Существует 65535 IP-портов, но сервер обычно обрабатывает запросы, "
+"поступающие только на один из них. Это как сказать оператору телефонной "
+"комнаты, что мы сейчас на месте и готовы отвечать на звонки по определённому "
+"внутреннему номеру. Мы используем man:bind[2], чтобы указать сокетам, на "
+"каком порту мы хотим обслуживать запросы."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:630
+#, no-wrap
+msgid "int bind(int s, const struct sockaddr *addr, socklen_t addrlen);\n"
+msgstr "int bind(int s, const struct sockaddr *addr, socklen_t addrlen);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:635
+msgid ""
+"Beside specifying the port in `addr`, the server may include its IP "
+"address. However, it can just use the symbolic constant INADDR_ANY to "
+"indicate it will serve all requests to the specified port regardless of what "
+"its IP address is. This symbol, along with several similar ones, is "
+"declared in [.filename]#netinet/in.h#"
+msgstr ""
+"Помимо указания порта в `addr`, сервер может включать свой IP-адрес. Однако "
+"он может просто использовать символическую константу INADDR_ANY, чтобы "
+"указать, что будет обслуживать все запросы на указанный порт, независимо от "
+"его IP-адреса. Этот символ, наряду с несколькими аналогичными, объявлен в "
+"[.filename]#netinet/in.h#"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:639
+#, no-wrap
+msgid "#define\tINADDR_ANY\t\t(u_int32_t)0x00000000\n"
+msgstr "#define\tINADDR_ANY\t\t(u_int32_t)0x00000000\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:644
+msgid ""
+"Suppose we were writing a server for the _daytime_ protocol over TCP/IP. "
+"Recall that it uses port 13. Our `sockaddr_in` structure would look like "
+"this:"
+msgstr ""
+"Предположим, мы пишем сервер для протокола _daytime_ поверх TCP/IP. "
+"Напомним, что он использует порт 13. Наша структура `sockaddr_in` будет "
+"выглядеть так:"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:645
+#, no-wrap
+msgid "Example Server sockaddr_in"
+msgstr "Пример sockaddr_in сервера"
+
+#. type: Target for macro image
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:646
+#, no-wrap
+msgid "sainserv.png"
+msgstr "sainserv.png"
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:649
+#, no-wrap
+msgid "`listen`"
+msgstr "`listen`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:653
+msgid ""
+"To continue our office phone analogy, after you have told the phone central "
+"operator what extension you will be at, you now walk into your office, and "
+"make sure your own phone is plugged in and the ringer is turned on. Plus, "
+"you make sure your call waiting is activated, so you can hear the phone ring "
+"even while you are talking to someone."
+msgstr ""
+"Продолжая аналогию с офисным телефоном, после того как вы сообщили оператору "
+"АТС, на каком внутреннем номере вы будете находиться, вы заходите в свой "
+"офис и убеждаетесь, что ваш телефон подключен и звонок включен. Кроме того, "
+"вы активируете функцию ожидания вызова, чтобы слышать звонок даже во время "
+"разговора с кем-то."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:655
+msgid "The server ensures all of that with the man:listen[2] function."
+msgstr "Сервер обеспечивает все это с помощью функции man:listen[2]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:659
+#, no-wrap
+msgid "int listen(int s, int backlog);\n"
+msgstr "int listen(int s, int backlog);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:663
+msgid ""
+"In here, the `backlog` variable tells sockets how many incoming requests to "
+"accept while you are busy processing the last request. In other words, it "
+"determines the maximum size of the queue of pending connections."
+msgstr ""
+"Здесь переменная `backlog` указывает сокетам, сколько входящих запросов "
+"принимать, пока вы заняты обработкой последнего запроса. Другими словами, "
+"она определяет максимальный размер очереди ожидающих соединений."
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:665
+#, no-wrap
+msgid "`accept`"
+msgstr "`accept`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:670
+msgid ""
+"After you hear the phone ringing, you accept the call by answering the "
+"call. You have now established a connection with your client. This "
+"connection remains active until either you or your client hang up."
+msgstr ""
+"После того как вы услышите телефонный звонок, вы принимаете вызов, отвечая "
+"на звонок. Теперь вы установили соединение с вашим клиентом. Это соединение "
+"остается активным, пока вы или ваш клиент не повесите трубку."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:672
+msgid "The server accepts the connection by using the man:accept[2] function."
+msgstr "Сервер принимает соединение, используя функцию man:accept[2]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:676
+#, no-wrap
+msgid "int accept(int s, struct sockaddr *addr, socklen_t *addrlen);\n"
+msgstr "int accept(int s, struct sockaddr *addr, socklen_t *addrlen);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:680
+msgid ""
+"Note that this time `addrlen` is a pointer. This is necessary because in "
+"this case it is the socket that fills out `addr`, the `sockaddr_in` "
+"structure."
+msgstr ""
+"Обратите внимание, что в этот раз `addrlen` является указателем. Это "
+"необходимо, потому что в данном случае именно сокет заполняет структуру "
+"`addr` — `sockaddr_in`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:684
+msgid ""
+"The return value is an integer. Indeed, the `accept` returns a _new "
+"socket_. You will use this new socket to communicate with the client."
+msgstr ""
+"Возвращаемое значение является целым числом. Действительно, `accept` "
+"возвращает _новый сокет_. Этот новый сокет будет использоваться для обмена "
+"данными с клиентом."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:686
+msgid ""
+"What happens to the old socket? It continues to listen for more requests "
+"(remember the `backlog` variable we passed to `listen`?) until we `close` it."
+msgstr ""
+"Что происходит со старым сокетом? Он продолжает ожидать новые запросы "
+"(помните переменную `backlog`, которую мы передали в `listen`?), пока мы не "
+"закроем его (`close`)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:690
+msgid ""
+"Now, the new socket is meant only for communications. It is fully "
+"connected. We cannot pass it to `listen` again, trying to accept additional "
+"connections."
+msgstr ""
+"Теперь новый сокет предназначен только для обмена данными. Он полностью "
+"подключен. Мы не можем снова передать его в `listen`, чтобы принимать "
+"дополнительные соединения."
+
+#. type: Title =====
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:692
+#, no-wrap
+msgid "Our First Server"
+msgstr "Наш первый сервер"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:696
+msgid ""
+"Our first server will be somewhat more complex than our first client was: "
+"Not only do we have more sockets functions to use, but we need to write it "
+"as a daemon."
+msgstr ""
+"Наш первый сервер будет несколько сложнее, чем первый клиент: нам нужно не "
+"только использовать больше функций сокетов, но и написать его как демон."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:699
+msgid ""
+"This is best achieved by creating a _child process_ after binding the port. "
+"The main process then exits and returns control to the shell (or whatever "
+"program invoked it)."
+msgstr ""
+"Это лучше всего достигается созданием _дочернего процесса_ после привязки "
+"порта. Затем основной процесс завершается и возвращает управление оболочке "
+"(или любой другой программе, которая его вызвала)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:701
+msgid ""
+"The child calls `listen`, then starts an endless loop, which accepts a "
+"connection, serves it, and eventually closes its socket."
+msgstr ""
+"Дочерний процесс вызывает `listen`, затем запускает бесконечный цикл, "
+"который принимает соединение, обслуживает его и в конечном итоге закрывает "
+"свой сокет."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:717
+#, no-wrap
+msgid ""
+"/*\n"
+" * daytimed - a port 13 server\n"
+" *\n"
+" * Programmed by G. Adam Stanislav\n"
+" * June 19, 2001\n"
+" */\n"
+"#include <stdio.h>\n"
+"#include <string.h>\n"
+"#include <time.h>\n"
+"#include <unistd.h>\n"
+"#include <sys/types.h>\n"
+"#include <sys/socket.h>\n"
+"#include <netinet/in.h>\n"
+msgstr ""
+"/*\n"
+" * daytimed - a port 13 server\n"
+" *\n"
+" * Programmed by G. Adam Stanislav\n"
+" * June 19, 2001\n"
+" */\n"
+"#include <stdio.h>\n"
+"#include <string.h>\n"
+"#include <time.h>\n"
+"#include <unistd.h>\n"
+"#include <sys/types.h>\n"
+"#include <sys/socket.h>\n"
+"#include <netinet/in.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:719
+#, no-wrap
+msgid "#define BACKLOG 4\n"
+msgstr "#define BACKLOG 4\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:727
+#, no-wrap
+msgid ""
+"int main() {\n"
+" int s, c;\n"
+" socklen_t b;\n"
+" struct sockaddr_in sa;\n"
+" time_t t;\n"
+" struct tm *tm;\n"
+" FILE *client;\n"
+msgstr ""
+"int main() {\n"
+" int s, c;\n"
+" socklen_t b;\n"
+" struct sockaddr_in sa;\n"
+" time_t t;\n"
+" struct tm *tm;\n"
+" FILE *client;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:732
+#, no-wrap
+msgid ""
+" if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {\n"
+" perror(\"socket\");\n"
+" return 1;\n"
+" }\n"
+msgstr ""
+" if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {\n"
+" perror(\"socket\");\n"
+" return 1;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:734
+#, no-wrap
+msgid " memset(&sa, '\\0', sizeof(sa));\n"
+msgstr " memset(&sa, '\\0', sizeof(sa));\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:737
+#, no-wrap
+msgid ""
+" sa.sin_family = AF_INET;\n"
+" sa.sin_port = htons(13);\n"
+msgstr ""
+" sa.sin_family = AF_INET;\n"
+" sa.sin_port = htons(13);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:740
+#, no-wrap
+msgid ""
+" if (INADDR_ANY)\n"
+" sa.sin_addr.s_addr = htonl(INADDR_ANY);\n"
+msgstr ""
+" if (INADDR_ANY)\n"
+" sa.sin_addr.s_addr = htonl(INADDR_ANY);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:745
+#, no-wrap
+msgid ""
+" if (bind(s, (struct sockaddr *)&sa, sizeof sa) < 0) {\n"
+" perror(\"bind\");\n"
+" return 2;\n"
+" }\n"
+msgstr ""
+" if (bind(s, (struct sockaddr *)&sa, sizeof sa) < 0) {\n"
+" perror(\"bind\");\n"
+" return 2;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:756
+#, no-wrap
+msgid ""
+" switch (fork()) {\n"
+" case -1:\n"
+" perror(\"fork\");\n"
+" return 3;\n"
+" default:\n"
+" close(s);\n"
+" return 0;\n"
+" case 0:\n"
+" break;\n"
+" }\n"
+msgstr ""
+" switch (fork()) {\n"
+" case -1:\n"
+" perror(\"fork\");\n"
+" return 3;\n"
+" default:\n"
+" close(s);\n"
+" return 0;\n"
+" case 0:\n"
+" break;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:758
+#, no-wrap
+msgid " listen(s, BACKLOG);\n"
+msgstr " listen(s, BACKLOG);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:761
+#, no-wrap
+msgid ""
+" for (;;) {\n"
+" b = sizeof sa;\n"
+msgstr ""
+" for (;;) {\n"
+" b = sizeof sa;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:766
+#, no-wrap
+msgid ""
+" if ((c = accept(s, (struct sockaddr *)&sa, &b)) < 0) {\n"
+" perror(\"daytimed accept\");\n"
+" return 4;\n"
+" }\n"
+msgstr ""
+" if ((c = accept(s, (struct sockaddr *)&sa, &b)) < 0) {\n"
+" perror(\"daytimed accept\");\n"
+" return 4;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:771
+#, no-wrap
+msgid ""
+" if ((client = fdopen(c, \"w\")) == NULL) {\n"
+" perror(\"daytimed fdopen\");\n"
+" return 5;\n"
+" }\n"
+msgstr ""
+" if ((client = fdopen(c, \"w\")) == NULL) {\n"
+" perror(\"daytimed fdopen\");\n"
+" return 5;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:776
+#, no-wrap
+msgid ""
+" if ((t = time(NULL)) < 0) {\n"
+" perror(\"daytimed time\");\n"
+" return 6;\n"
+" }\n"
+msgstr ""
+" if ((t = time(NULL)) < 0) {\n"
+" perror(\"daytimed time\");\n"
+" return 6;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:785
+#, no-wrap
+msgid ""
+" tm = gmtime(&t);\n"
+" fprintf(client, \"%.4i-%.2i-%.2iT%.2i:%.2i:%.2iZ\\n\",\n"
+" tm->tm_year + 1900,\n"
+" tm->tm_mon + 1,\n"
+" tm->tm_mday,\n"
+" tm->tm_hour,\n"
+" tm->tm_min,\n"
+" tm->tm_sec);\n"
+msgstr ""
+" tm = gmtime(&t);\n"
+" fprintf(client, \"%.4i-%.2i-%.2iT%.2i:%.2i:%.2iZ\\n\",\n"
+" tm->tm_year + 1900,\n"
+" tm->tm_mon + 1,\n"
+" tm->tm_mday,\n"
+" tm->tm_hour,\n"
+" tm->tm_min,\n"
+" tm->tm_sec);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:789
+#, no-wrap
+msgid ""
+" fclose(client);\n"
+" }\n"
+"}\n"
+msgstr ""
+" fclose(client);\n"
+" }\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:794
+msgid ""
+"We start by creating a socket. Then we fill out the `sockaddr_in` structure "
+"in `sa`. Note the conditional use of INADDR_ANY:"
+msgstr ""
+"Начинаем с создания сокета. Затем заполняем структуру `sockaddr_in` в `sa`. "
+"Обратите внимание на условное использование INADDR_ANY:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:799
+#, no-wrap
+msgid ""
+"if (INADDR_ANY)\n"
+" sa.sin_addr.s_addr = htonl(INADDR_ANY);\n"
+msgstr ""
+"if (INADDR_ANY)\n"
+" sa.sin_addr.s_addr = htonl(INADDR_ANY);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:806
+msgid ""
+"Its value is `0`. Since we have just used `bzero` on the entire structure, "
+"it would be redundant to set it to `0` again. But if we port our code to "
+"some other system where INADDR_ANY is perhaps not a zero, we need to assign "
+"it to `sa.sin_addr.s_addr`. Most modern C compilers are clever enough to "
+"notice that INADDR_ANY is a constant. As long as it is a zero, they will "
+"optimize the entire conditional statement out of the code."
+msgstr ""
+"Его значение равно `0`. Поскольку мы только что использовали `bzero` для "
+"всей структуры, будет избыточным снова устанавливать его в `0`. Но если мы "
+"перенесем наш код на другую систему, где INADDR_ANY, возможно, не равен "
+"нулю, нам нужно будет присвоить его `sa.sin_addr.s_addr`. Большинство "
+"современных компиляторов C достаточно умны, чтобы заметить, что INADDR_ANY — "
+"это константа. Пока она равна нулю, они оптимизируют все условное выражение "
+"из кода."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:810
+msgid ""
+"After we have called `bind` successfully, we are ready to become a _daemon_: "
+"We use `fork` to create a child process. In both, the parent and the child, "
+"the `s` variable is our socket. The parent process will not need it, so it "
+"calls `close`, then it returns `0` to inform its own parent it had "
+"terminated successfully."
+msgstr ""
+"После успешного вызова `bind` мы готовы стать _демоном_: используем `fork` "
+"для создания дочернего процесса. В обоих процессах, родительском и дочернем, "
+"переменная `s` является нашим сокетом. Родительскому процессу он больше не "
+"нужен, поэтому он вызывает `close`, затем возвращает `0`, чтобы сообщить "
+"своему родителю об успешном завершении."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:815
+msgid ""
+"Meanwhile, the child process continues working in the background. It calls "
+"`listen` and sets its backlog to `4`. It does not need a large value here "
+"because _daytime_ is not a protocol many clients request all the time, and "
+"because it can process each request instantly anyway."
+msgstr ""
+"Между тем, дочерний процесс продолжает работать в фоновом режиме. Он "
+"вызывает `listen` и устанавливает размер очереди ожидания (`backlog`) равным "
+"`4`. Здесь не требуется большое значение, так как _daytime_ — это не "
+"протокол, который часто запрашивают клиенты, и, кроме того, он может "
+"мгновенно обрабатывать каждый запрос."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:817
+msgid ""
+"Finally, the daemon starts an endless loop, which performs the following "
+"steps:"
+msgstr ""
+"Наконец, демон запускает бесконечный цикл, который выполняет следующие шаги:"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:820
+msgid ""
+"Call `accept`. It waits here until a client contacts it. At that point, it "
+"receives a new socket, `c`, which it can use to communicate with this "
+"particular client."
+msgstr ""
+"Вызовите `accept`. Он ожидает здесь, пока клиент не свяжется с ним. В этот "
+"момент он получает новый сокет, `c`, который можно использовать для обмена "
+"данными с этим конкретным клиентом."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:821
+msgid ""
+"It uses the C function `fdopen` to turn the socket from a low-level _file "
+"descriptor_ to a C-style `FILE` pointer. This will allow the use of "
+"`fprintf` later on."
+msgstr ""
+"Он использует функцию C `fdopen` для преобразования сокета из "
+"низкоуровневого _дескриптора файла_ в указатель типа `FILE` в стиле C. Это "
+"позволит в дальнейшем использовать `fprintf`."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:822
+msgid ""
+"It checks the time, and prints it in the _ISO 8601_ format to the `client` "
+"\"file\". It then uses `fclose` to close the file. That will automatically "
+"close the socket as well."
+msgstr ""
+"Он проверяет время и выводит его в формате _ISO 8601_ в «файл» `client`. "
+"Затем он использует `fclose` для закрытия файла. Это также автоматически "
+"закроет сокет."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:824
+msgid "We can _generalize_ this, and use it as a model for many other servers:"
+msgstr ""
+"Мы можем _обобщить_ это и использовать в качестве модели для многих других "
+"серверов:"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:825
+#, no-wrap
+msgid "Sequential Server"
+msgstr "Последовательный Сервер"
+
+#. type: Target for macro image
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:826
+#, no-wrap
+msgid "serv.png"
+msgstr "serv.png"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:832
+msgid ""
+"This flowchart is good for _sequential servers_, i.e., servers that can "
+"serve one client at a time, just as we were able to with our _daytime_ "
+"server. This is only possible whenever there is no real \"conversation\" "
+"going on between the client and the server: As soon as the server detects a "
+"connection to the client, it sends out some data and closes the connection. "
+"The entire operation may take nanoseconds, and it is finished."
+msgstr ""
+"Эта блок-схема подходит для _последовательных серверов_, то есть серверов, "
+"которые могут обслуживать одного клиента за раз, как это было возможно с "
+"нашим _daytime_ сервером. Это возможно только в тех случаях, когда между "
+"клиентом и сервером не происходит реального \"диалога\": как только сервер "
+"обнаруживает подключение клиента, он отправляет некоторые данные и закрывает "
+"соединение. Вся операция может занять наносекунды, и она завершена."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:835
+msgid ""
+"The advantage of this flowchart is that, except for the brief moment after "
+"the parent ``fork``s and before it exits, there is always only one _process_ "
+"active: Our server does not take up much memory and other system resources."
+msgstr ""
+"Преимущество этой блок-схемы в том, что, за исключением короткого момента "
+"после того, как родительский процесс выполняет ``fork`` и до его завершения, "
+"всегда активен только один _процесс_: Наш сервер не занимает много памяти и "
+"других системных ресурсов."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:839
+msgid ""
+"Note that we have added _initialize daemon_ in our flowchart. We did not "
+"need to initialize our own daemon, but this is a good place in the flow of "
+"the program to set up any `signal` handlers, open any files we may need, etc."
+msgstr ""
+"Обратите внимание, что мы добавили _инициализацию демона_ в нашу блок-схему. "
+"Нам не нужно было инициализировать собственный демон, но это подходящее "
+"место в потоке выполнения программы для настройки обработчиков `signal`, "
+"открытия необходимых файлов и т. д."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:843
+msgid ""
+"Just about everything in the flow chart can be used literally on many "
+"different servers. The _serve_ entry is the exception. We think of it as a "
+"_\"black box\"_, i.e., something you design specifically for your own "
+"server, and just \"plug it into the rest.\""
+msgstr ""
+"Почти все элементы блок-схемы могут быть использованы буквально на множестве "
+"различных серверов. Элемент _serve_ является исключением. Мы рассматриваем "
+"его как _\"чёрный ящик\"_, то есть нечто, что вы проектируете специально для "
+"своего сервера и просто \"подключаете к остальной системе.\""
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:849
+msgid ""
+"Not all protocols are that simple. Many receive a request from the client, "
+"reply to it, then receive another request from the same client. As a "
+"result, they do not know in advance how long they will be serving the "
+"client. Such servers usually start a new process for each client. While "
+"the new process is serving its client, the daemon can continue listening for "
+"more connections."
+msgstr ""
+"Не все протоколы настолько просты. Многие получают запрос от клиента, "
+"отвечают на него, а затем получают ещё один запрос от того же клиента. В "
+"результате, они не знают заранее, как долго будут обслуживать клиента. Такие "
+"серверы обычно запускают новый процесс для каждого клиента. Пока новый "
+"процесс обслуживает своего клиента, демон может продолжать прослушивать "
+"новые подключения."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:852
+msgid ""
+"Now, go ahead, save the above source code as [.filename]#daytimed.c# (it is "
+"customary to end the names of daemons with the letter `d`). After you have "
+"compiled it, try running it:"
+msgstr ""
+"Теперь сохраните приведённый исходный код в файл [.filename]#daytimed.c# "
+"(обычно имена демонов оканчиваются буквой `d`). После компиляции попробуйте "
+"запустить его:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:858
+#, no-wrap
+msgid ""
+"% ./daytimed\n"
+"bind: Permission denied\n"
+"%\n"
+msgstr ""
+"% ./daytimed\n"
+"bind: Permission denied\n"
+"%\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:862
+msgid ""
+"What happened here? As you will recall, the _daytime_ protocol uses port "
+"13. But all ports below 1024 are reserved to the superuser (otherwise, "
+"anyone could start a daemon pretending to serve a commonly used port, while "
+"causing a security breach)."
+msgstr ""
+"Что произошло? Как вы помните, протокол _daytime_ использует порт 13. Однако "
+"все порты ниже 1024 зарезервированы для суперпользователя (в противном "
+"случае любой мог бы запустить демон, притворяясь, что обслуживает часто "
+"используемый порт, создавая угрозу безопасности)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:864
+msgid "Try again, this time as the superuser:"
+msgstr "Попробуйте снова, на этот раз как суперпользователь:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:869
+#, no-wrap
+msgid ""
+"# ./daytimed\n"
+"#\n"
+msgstr ""
+"# ./daytimed\n"
+"#\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:872
+msgid "What... Nothing? Let us try again:"
+msgstr "Что... Ничего? Давайте попробуем еще раз:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:876
+#, no-wrap
+msgid "# ./daytimed\n"
+msgstr "# ./daytimed\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:879
+#, no-wrap
+msgid ""
+"bind: Address already in use\n"
+"#\n"
+msgstr ""
+"bind: Address already in use\n"
+"#\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:884
+msgid ""
+"Every port can only be bound by one program at a time. Our first attempt "
+"was indeed successful: It started the child daemon and returned quietly. It "
+"is still running and will continue to run until you either kill it, or any "
+"of its system calls fail, or you reboot the system."
+msgstr ""
+"Каждый порт может быть связан только одной программой одновременно. Наша "
+"первая попытка действительно была успешной: она запустила дочерний демон и "
+"завершилась без ошибок. Он продолжает работать и будет работать до тех пор, "
+"пока вы его не завершите командой kill, пока какой-либо из его системных "
+"вызовов не завершится с ошибкой или пока вы не перезагрузите систему."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:887
+msgid ""
+"Fine, we know it is running in the background. But is it working? How do we "
+"know it is a proper _daytime_ server? Simple:"
+msgstr ""
+"Хорошо, мы знаем, что он работает в фоновом режиме. Но работает ли он? Как "
+"мы можем убедиться, что это настоящий сервер _daytime_? Просто:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:891
+#, no-wrap
+msgid "% telnet localhost 13\n"
+msgstr "% telnet localhost 13\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:900
+#, no-wrap
+msgid ""
+"Trying ::1...\n"
+"telnet: connect to address ::1: Connection refused\n"
+"Trying 127.0.0.1...\n"
+"Connected to localhost.\n"
+"Escape character is '^]'.\n"
+"2001-06-19T21:04:42Z\n"
+"Connection closed by foreign host.\n"
+"%\n"
+msgstr ""
+"Trying ::1...\n"
+"telnet: connect to address ::1: Connection refused\n"
+"Trying 127.0.0.1...\n"
+"Connected to localhost.\n"
+"Escape character is '^]'.\n"
+"2001-06-19T21:04:42Z\n"
+"Connection closed by foreign host.\n"
+"%\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:905
+msgid ""
+"telnet tried the new IPv6, and failed. It retried with IPv4 and succeeded. "
+"The daemon works."
+msgstr ""
+"telnet попробовал использовать новый IPv6, но не смог. Затем он повторил "
+"попытку с IPv4, и это удалось. Демон работает."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:908
+msgid ""
+"If you have access to another UNIX(R) system via telnet, you can use it to "
+"test accessing the server remotely. My computer does not have a static IP "
+"address, so this is what I did:"
+msgstr ""
+"Если у вас есть доступ к другой UNIX(R)-системе через telnet, вы можете "
+"использовать её для проверки удалённого доступа к серверу. Мой компьютер не "
+"имеет статического IP-адреса, поэтому я сделал следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:912
+#, no-wrap
+msgid "% who\n"
+msgstr "% who\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:916
+#, no-wrap
+msgid ""
+"whizkid ttyp0 Jun 19 16:59 (216.127.220.143)\n"
+"xxx ttyp1 Jun 19 16:06 (xx.xx.xx.xx)\n"
+"% telnet 216.127.220.143 13\n"
+msgstr ""
+"whizkid ttyp0 Jun 19 16:59 (216.127.220.143)\n"
+"xxx ttyp1 Jun 19 16:06 (xx.xx.xx.xx)\n"
+"% telnet 216.127.220.143 13\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:923
+#, no-wrap
+msgid ""
+"Trying 216.127.220.143...\n"
+"Connected to r47.bfm.org.\n"
+"Escape character is '^]'.\n"
+"2001-06-19T21:31:11Z\n"
+"Connection closed by foreign host.\n"
+"%\n"
+msgstr ""
+"Trying 216.127.220.143...\n"
+"Connected to r47.bfm.org.\n"
+"Escape character is '^]'.\n"
+"2001-06-19T21:31:11Z\n"
+"Connection closed by foreign host.\n"
+"%\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:926
+msgid "Again, it worked. Will it work using the domain name?"
+msgstr ""
+"Снова, это сработало. Сработает ли это с использованием доменного имени?"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:930
+#, no-wrap
+msgid "% telnet r47.bfm.org 13\n"
+msgstr "% telnet r47.bfm.org 13\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:937
+#, no-wrap
+msgid ""
+"Trying 216.127.220.143...\n"
+"Connected to r47.bfm.org.\n"
+"Escape character is '^]'.\n"
+"2001-06-19T21:31:40Z\n"
+"Connection closed by foreign host.\n"
+"%\n"
+msgstr ""
+"Trying 216.127.220.143...\n"
+"Connected to r47.bfm.org.\n"
+"Escape character is '^]'.\n"
+"2001-06-19T21:31:40Z\n"
+"Connection closed by foreign host.\n"
+"%\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:941
+msgid ""
+"By the way, telnet prints the _Connection closed by foreign host_ message "
+"after our daemon has closed the socket. This shows us that, indeed, using "
+"`fclose(client);` in our code works as advertised."
+msgstr ""
+"Кстати, telnet выводит сообщение _Connection closed by foreign host_ после "
+"того, как наш демон закрыл сокет. Это показывает, что использование "
+"`fclose(client);` в нашем коде действительно работает, как заявлено."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:943
+#, no-wrap
+msgid "Helper Functions"
+msgstr "Вспомогательные функции"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:949
+msgid ""
+"FreeBSD C library contains many helper functions for sockets programming. "
+"For example, in our sample client we hard coded the `time.nist.gov` IP "
+"address. But we do not always know the IP address. Even if we do, our "
+"software is more flexible if it allows the user to enter the IP address, or "
+"even the domain name."
+msgstr ""
+"Библиотека C в FreeBSD содержит множество вспомогательных функций для "
+"программирования сокетов. Например, в нашем примере клиента мы жестко "
+"прописали IP-адрес `time.nist.gov`. Но мы не всегда знаем IP-адрес. Даже "
+"если знаем, наше программное обеспечение будет более гибким, если позволит "
+"пользователю ввести IP-адрес или даже доменное имя."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:951
+#, no-wrap
+msgid "`gethostbyname`"
+msgstr "`gethostbyname`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:954
+msgid ""
+"While there is no way to pass the domain name directly to any of the sockets "
+"functions, the FreeBSD C library comes with the man:gethostbyname[3] and "
+"man:gethostbyname2[3] functions, declared in [.filename]#netdb.h#."
+msgstr ""
+"Хотя нет возможности передать имя домена напрямую в какие-либо функции "
+"сокетов, стандартная библиотека C в FreeBSD предоставляет функции "
+"man:gethostbyname[3] и man:gethostbyname2[3], объявленные в "
+"[.filename]#netdb.h#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:959
+#, no-wrap
+msgid ""
+"struct hostent * gethostbyname(const char *name);\n"
+"struct hostent * gethostbyname2(const char *name, int af);\n"
+msgstr ""
+"struct hostent * gethostbyname(const char *name);\n"
+"struct hostent * gethostbyname2(const char *name, int af);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:963
+msgid ""
+"Both return a pointer to the `hostent` structure, with much information "
+"about the domain. For our purposes, the `h_addr_list[0]` field of the "
+"structure points at `h_length` bytes of the correct address, already stored "
+"in the _network byte order_."
+msgstr ""
+"Оба возвращают указатель на структуру `hostent`, содержащую много информации "
+"о домене. Для наших целей поле `h_addr_list[0]` структуры указывает на "
+"`h_length` байтов правильного адреса, уже сохранённого в _порядке байтов "
+"сети_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:965
+msgid ""
+"This allows us to create a much more flexible-and much more useful-version "
+"of our daytime program:"
+msgstr ""
+"Это позволяет нам создать гораздо более гибкую — и гораздо более полезную — "
+"версию нашей программы daytime:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:981
+#, no-wrap
+msgid ""
+"/*\n"
+" * daytime.c\n"
+" *\n"
+" * Programmed by G. Adam Stanislav\n"
+" * 19 June 2001\n"
+" */\n"
+"#include <stdio.h>\n"
+"#include <string.h>\n"
+"#include <unistd.h>\n"
+"#include <sys/types.h>\n"
+"#include <sys/socket.h>\n"
+"#include <netinet/in.h>\n"
+"#include <netdb.h>\n"
+msgstr ""
+"/*\n"
+" * daytime.c\n"
+" *\n"
+" * Programmed by G. Adam Stanislav\n"
+" * 19 June 2001\n"
+" */\n"
+"#include <stdio.h>\n"
+"#include <string.h>\n"
+"#include <unistd.h>\n"
+"#include <sys/types.h>\n"
+"#include <sys/socket.h>\n"
+"#include <netinet/in.h>\n"
+"#include <netdb.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:988
+#, no-wrap
+msgid ""
+"int main(int argc, char *argv[]) {\n"
+" int s, bytes;\n"
+" struct sockaddr_in sa;\n"
+" struct hostent *he;\n"
+" char buf[BUFSIZ+1];\n"
+" char *host;\n"
+msgstr ""
+"int main(int argc, char *argv[]) {\n"
+" int s, bytes;\n"
+" struct sockaddr_in sa;\n"
+" struct hostent *he;\n"
+" char buf[BUFSIZ+1];\n"
+" char *host;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:998
+#, no-wrap
+msgid ""
+" sa.sin_family = AF_INET;\n"
+" sa.sin_port = htons(13);\n"
+msgstr ""
+" sa.sin_family = AF_INET;\n"
+" sa.sin_port = htons(13);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1000
+#, no-wrap
+msgid " host = (argc > 1) ? argv[1] : \"time.nist.gov\";\n"
+msgstr " host = (argc > 1) ? argv[1] : \"time.nist.gov\";\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1005
+#, no-wrap
+msgid ""
+" if ((he = gethostbyname(host)) == NULL) {\n"
+" herror(host);\n"
+" return 2;\n"
+" }\n"
+msgstr ""
+" if ((he = gethostbyname(host)) == NULL) {\n"
+" herror(host);\n"
+" return 2;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1007
+#, no-wrap
+msgid " memcpy(&sa.sin_addr, he->h_addr_list[0], he->h_length);\n"
+msgstr " memcpy(&sa.sin_addr, he->h_addr_list[0], he->h_length);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1012
+#, no-wrap
+msgid ""
+" if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {\n"
+" perror(\"connect\");\n"
+" return 3;\n"
+" }\n"
+msgstr ""
+" if (connect(s, (struct sockaddr *)&sa, sizeof sa) < 0) {\n"
+" perror(\"connect\");\n"
+" return 3;\n"
+" }\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1015
+#, no-wrap
+msgid ""
+" while ((bytes = read(s, buf, BUFSIZ)) > 0)\n"
+" write(1, buf, bytes);\n"
+msgstr ""
+" while ((bytes = read(s, buf, BUFSIZ)) > 0)\n"
+" write(1, buf, bytes);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1025
+msgid ""
+"We now can type a domain name (or an IP address, it works both ways) on the "
+"command line, and the program will try to connect to its _daytime_ server. "
+"Otherwise, it will still default to `time.nist.gov`. However, even in this "
+"case we will use `gethostbyname` rather than hard coding `192.43.244.18`. "
+"That way, even if its IP address changes in the future, we will still find "
+"it."
+msgstr ""
+"Теперь мы можем ввести доменное имя (или IP-адрес, это работает в обоих "
+"направлениях) в командной строке, и программа попытается подключиться к его "
+"серверу _daytime_. В противном случае, по умолчанию будет использоваться "
+"`time.nist.gov`. Однако даже в этом случае мы будем использовать "
+"`gethostbyname` вместо жесткого задания `192.43.244.18`. Таким образом, даже "
+"если его IP-адрес изменится в будущем, мы всё равно сможем его найти."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1029
+msgid ""
+"Since it takes virtually no time to get the time from your local server, you "
+"could run daytime twice in a row: First to get the time from "
+"`time.nist.gov`, the second time from your own system. You can then compare "
+"the results and see how exact your system clock is:"
+msgstr ""
+"Поскольку получение времени от локального сервера занимает практически "
+"нулевое время, вы можете запустить daytime дважды подряд: сначала для "
+"получения времени от `time.nist.gov`, а затем от вашей собственной системы. "
+"После этого вы можете сравнить результаты и увидеть, насколько точны часы "
+"вашей системы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1033
+#, no-wrap
+msgid "% daytime ; daytime localhost\n"
+msgstr "% daytime ; daytime localhost\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1037
+#, no-wrap
+msgid ""
+"52080 01-06-20 04:02:33 50 0 0 390.2 UTC(NIST) *\n"
+"2001-06-20T04:02:35Z\n"
+"%\n"
+msgstr ""
+"52080 01-06-20 04:02:33 50 0 0 390.2 UTC(NIST) *\n"
+"2001-06-20T04:02:35Z\n"
+"%\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1040
+msgid "As you can see, my system was two seconds ahead of the NIST time."
+msgstr "Как видно, моя система опережала время NIST на две секунды."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1042
+#, no-wrap
+msgid "`getservbyname`"
+msgstr "`getservbyname`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1046
+msgid ""
+"Sometimes you may not be sure what port a certain service uses. The "
+"man:getservbyname[3] function, also declared in [.filename]#netdb.h# comes "
+"in very handy in those cases:"
+msgstr ""
+"Иногда вы можете быть не уверены, какой порт использует определённая служба. "
+"В таких случаях очень полезна функция man:getservbyname[3], также "
+"объявленная в [.filename]#netdb.h#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1050
+#, no-wrap
+msgid "struct servent * getservbyname(const char *name, const char *proto);\n"
+msgstr "struct servent * getservbyname(const char *name, const char *proto);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1053
+msgid ""
+"The `servent` structure contains the `s_port`, which contains the proper "
+"port, already in _network byte order_."
+msgstr ""
+"Структура `servent` содержит `s_port`, в котором находится соответствующий "
+"порт, уже в _порядке байтов сети_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1055
+msgid ""
+"Had we not known the correct port for the _daytime_ service, we could have "
+"found it this way:"
+msgstr ""
+"Если бы мы не знали правильный порт для службы _daytime_, мы могли бы найти "
+"его следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1065
+#, no-wrap
+msgid ""
+"struct servent *se;\n"
+" ...\n"
+" if ((se = getservbyname(\"daytime\", \"tcp\")) == NULL {\n"
+" fprintf(stderr, \"Cannot determine which port to use.\\n\");\n"
+" return 7;\n"
+" }\n"
+" sa.sin_port = se->s_port;\n"
+msgstr ""
+"struct servent *se;\n"
+" ...\n"
+" if ((se = getservbyname(\"daytime\", \"tcp\")) == NULL {\n"
+" fprintf(stderr, \"Cannot determine which port to use.\\n\");\n"
+" return 7;\n"
+" }\n"
+" sa.sin_port = se->s_port;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1072
+msgid ""
+"You usually do know the port. But if you are developing a new protocol, you "
+"may be testing it on an unofficial port. Some day, you will register the "
+"protocol and its port (if nowhere else, at least in your [.filename]#/etc/"
+"services#, which is where `getservbyname` looks). Instead of returning an "
+"error in the above code, you just use the temporary port number. Once you "
+"have listed the protocol in [.filename]#/etc/services#, your software will "
+"find its port without you having to rewrite the code."
+msgstr ""
+"Обычно порт известен. Но если вы разрабатываете новый протокол, вы можете "
+"тестировать его на неофициальном порту. Когда-нибудь вы зарегистрируете "
+"протокол и его порт (если не где-то ещё, то хотя бы в вашем [.filename]#/etc/"
+"services#, где `getservbyname` ищет). Вместо возврата ошибки в приведённом "
+"выше коде вы просто используете временный номер порта. Как только вы "
+"добавите протокол в [.filename]#/etc/services#, ваше программное обеспечение "
+"найдёт его порт без необходимости переписывать код."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1074
+#, no-wrap
+msgid "Concurrent Servers"
+msgstr "Многозадачные серверы"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1078
+msgid ""
+"Unlike a sequential server, a _concurrent server_ has to be able to serve "
+"more than one client at a time. For example, a _chat server_ may be serving "
+"a specific client for hours-it cannot wait till it stops serving a client "
+"before it serves the next one."
+msgstr ""
+"В отличие от последовательного сервера, _многозадачный сервер_ должен иметь "
+"возможность обслуживать более одного клиента одновременно. Например, _сервер "
+"чата_ может обслуживать конкретного клиента часами — он не может ждать, пока "
+"закончит обслуживать текущего клиента, прежде чем перейти к следующему."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1080
+msgid "This requires a significant change in our flowchart:"
+msgstr "Это требует значительных изменений в нашей блок-схеме:"
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1081
+#, no-wrap
+msgid "Concurrent Server"
+msgstr "Многозадачный сервер"
+
+#. type: Target for macro image
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1082
+#, no-wrap
+msgid "serv2.png"
+msgstr "serv2.png"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1086
+msgid ""
+"We moved the _serve_ from the _daemon process_ to its own _server process_. "
+"However, because each child process inherits all open files (and a socket is "
+"treated just like a file), the new process inherits not only the _\"accepted "
+"handle,\"_ i.e., the socket returned by the `accept` call, but also the _top "
+"socket_, i.e., the one opened by the top process right at the beginning."
+msgstr ""
+"Мы переместили _службу_ из _демона_ в её собственный _серверный процесс_. "
+"Однако, поскольку каждый дочерний процесс наследует все открытые файлы (а "
+"сокет обрабатывается так же, как файл), новый процесс наследует не только "
+"_\"принятый дескриптор\"_, т.е. сокет, возвращённый вызовом `accept`, но и "
+"_главный сокет_, т.е. тот, который был открыт главным процессом в самом "
+"начале."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1089
+msgid ""
+"However, the _server process_ does not need this socket and should `close` "
+"it immediately. Similarly, the _daemon process_ no longer needs the "
+"_accepted socket_, and not only should, but _must_ `close` it-otherwise, it "
+"will run out of available _file descriptors_ sooner or later."
+msgstr ""
+"Однако _серверному процессу_ этот сокет не нужен, и он должен немедленно "
+"вызвать ему `close`. Аналогично, _демону_ больше не нужен _сокет, принятый "
+"вызовом accept_, и он не только должен, но и _обязан_ вызвать ему `close` — "
+"в противном случае рано или поздно закончатся доступные _файловые "
+"дескрипторы_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1092
+msgid ""
+"After the _server process_ is done serving, it should close the _accepted "
+"socket_. Instead of returning to `accept`, it now exits."
+msgstr ""
+"После завершения обслуживания _серверного процесса_ он должен закрыть "
+"_принятый сокет_. Вместо возврата к `accept`, процесс теперь завершается."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1099
+msgid ""
+"Under UNIX(R), a process does not really _exit_. Instead, it _returns_ to "
+"its parent. Typically, a parent process ``wait``s for its child process, "
+"and obtains a return value. However, our _daemon process_ cannot simply "
+"stop and wait. That would defeat the whole purpose of creating additional "
+"processes. But if it never does `wait`, its children will become _zombies_-"
+"no longer functional but still roaming around."
+msgstr ""
+"В UNIX(R) процесс на самом деле не _завершается_. Вместо этого он "
+"_возвращается_ к своему родителю. Обычно родительский процесс ``ждёт`` "
+"(wait) завершения своего дочернего процесса и получает возвращаемое "
+"значение. Однако наш _демон-процесс_ не может просто остановиться и ждать. "
+"Это бы свело на нет всю цель создания дополнительных процессов. Но если он "
+"никогда не выполняет `wait`, его дочерние процессы станут _зомби_ — более не "
+"функционирующими, но всё ещё бродящими вокруг."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1102
+msgid ""
+"For that reason, the _daemon process_ needs to set _signal handlers_ in its "
+"_initialize daemon_ phase. At least a SIGCHLD signal has to be processed, "
+"so the daemon can remove the zombie return values from the system and "
+"release the system resources they are taking up."
+msgstr ""
+"По этой причине _демону_ необходимо установить _обработчики сигналов_ на "
+"этапе _инициализации демона_. Как минимум, должен обрабатываться сигнал "
+"SIGCHLD, чтобы демон мог удалять зомби-процессы из системы и освобождать "
+"занимаемые ими системные ресурсы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/sockets/_index.adoc:1105
+msgid ""
+"That is why our flowchart now contains a _process signals_ box, which is not "
+"connected to any other box. By the way, many servers also process SIGHUP, "
+"and typically interpret as the signal from the superuser that they should "
+"reread their configuration files. This allows us to change settings without "
+"having to kill and restart these servers."
+msgstr ""
+"Вот почему наша блок-схема теперь содержит блок _обработки сигналов_, "
+"который не соединен с другими блоками. Кстати, многие серверы также "
+"обрабатывают SIGHUP и обычно интерпретируют его как сигнал от "
+"суперпользователя, указывающий на необходимость перечитать конфигурационные "
+"файлы. Это позволяет нам изменять настройки без необходимости завершать и "
+"перезапускать эти серверы."
diff --git a/documentation/content/ru/books/developers-handbook/testing/_index.adoc b/documentation/content/ru/books/developers-handbook/testing/_index.adoc
new file mode 100644
index 0000000000..a801c9644f
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/testing/_index.adoc
@@ -0,0 +1,187 @@
+---
+authors:
+description: 'Регрессионное и нагрузочное тестирование'
+next: books/developers-handbook/partii
+params:
+ path: /books/developers-handbook/testing/
+prev: books/developers-handbook/policies
+showBookMenu: true
+tags: ["Regression", "Performance Testing", "Testing", "Tinderbox"]
+title: 'Глава 6. Регрессионное и нагрузочное тестирование'
+weight: 7
+---
+
+[[testing]]
+= Регрессионное и нагрузочное тестирование
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Регрессионные тесты используются для проверки определенной части системы, чтобы убедиться, что она работает как ожидается, и для предотвращения повторного появления старых ошибок.
+
+Инструменты для регрессионного тестирования FreeBSD можно найти в дереве исходных кодов FreeBSD в каталоге [.filename]#src/tools/regression#.
+
+[[testing-micro-benchmark]]
+== Контрольный список для бенчмарка низкоуровневых операций
+
+Этот раздел содержит рекомендации по проведению корректного бенчмарка низкоуровненых операций на FreeBSD или самой FreeBSD.
+
+Невозможно использовать все приведенные ниже рекомендации каждый раз, но чем больше их применяется, тем лучше способность теста выявлять небольшие различия.
+
+* Отключить APM и любые другие манипуляции с часами (ACPI ?).
+* Запускайте тесты в однопользовательском режиме. Например, man:cron[8] и другие демоны только добавляют шум. Демон man:sshd[8] также может вызвать проблемы. Если требуется доступ по SSH во время тестирования, либо отключите перегенерацию ключа SSHv1, либо завершите родительский демон `sshd` во время тестов.
+* Не запускайте man:ntpd[8].
+* Если события man:syslog[3] генерируются, запустите man:syslogd[8] с пустым [.filename]#/etc/syslogd.conf#, в противном случае не запускайте его.
+* Минимизируйте дисковые операции ввода-вывода, по возможности избегайте их полностью.
+* Не монтируйте файловые системы, которые не требуются.
+* Смонтируйте [.filename]#/#, [.filename]#/usr# и любые другие файловые системы в режиме только для чтения, если это возможно. Это исключает обновления atime на диске (и т.д.) из общей картины ввода-вывода.
+* Переинициализируйте тестовую файловую систему с возможностью чтения/записи с помощью man:newfs[8] и заполните её из файла man:tar[1] или man:dump[8] перед каждым запуском. Размонтируйте и смонтируйте её перед началом теста. Это обеспечит согласованную структуру файловой системы. Для теста worldstone это применимо к [.filename]#/usr/obj# (просто переинициализируйте с помощью `newfs` и смонтируйте). Для достижения 100% воспроизводимости заполните файловую систему из файла man:dd[1] (например: `dd if=myimage of=/dev/ad0s1h bs=1m`)
+* Используйте разделы man:md[4] с поддержкой malloc или предзагруженные.
+* Перезагружайтесь между отдельными итерациями теста, это обеспечивает более согласованное состояние.
+* Удалите все необязательные драйверы устройств из ядра. Например, если USB не нужен для теста, не включайте поддержку USB в ядре. Драйверы, которые подключаются, часто имеют работающие таймауты.
+* Отключите неиспользуемое оборудование. Отсоедините диски с помощью man:atacontrol[8] и man:camcontrol[8], если диски не используются для тестирования.
+* Не настраивайте сеть, если она не тестируется, или дождитесь завершения тестирования, чтобы отправить результаты на другой компьютер.
+* Отключите "турбо-режимы", так как они делают тактовую частоту явно зависимой от окружающей среды. Это означает, что результаты тестирования на 100% идентичном коде могут зависеть от времени суток, употребления кофе или газировки или даже от количества людей в офисе.
+
+Если система должна быть подключена к общедоступной сети, следите за всплесками широковещательного трафика. Даже если они почти незаметны, они будут занимать циклы процессора. Многоадресная рассылка имеет аналогичные предостережения.
+* Размещайте каждую файловую систему на отдельном диске. Это минимизирует задержки, вызванные оптимизацией перемещения головок диска.
+* Минимизируйте вывод на последовательные или VGA-консоли. Запись вывода в файлы снижает дрожание. (Консоли на последовательном порту легко становятся узким местом.) Не касайтесь клавиатуры во время выполнения теста, даже нажатия kbd:[пробел] или kbd:[back-space] отражаются в числах.
+* Убедитесь, что тест достаточно длинный, но не слишком. Если тест слишком короткий, возникают проблемы с временными метками. Если он слишком длинный, изменения температуры и дрейф повлияют на частоту кварцевых кристаллов в компьютере. Эмпирическое правило: больше минуты, меньше часа.
+* Попытайтесь поддерживать температуру вокруг машины как можно более стабильной. Это влияет как на кварцевые резонаторы, так и на алгоритмы работы дисковых накопителей. Для получения действительно стабильных часов рассмотрите возможность использования стабилизированного тактового сигнала. Например, используйте OCXO + PLL и подавайте выходной сигнал в тактовые схемы вместо кварцевого резонатора на материнской плате. Для получения дополнительной информации по этому вопросу свяжитесь с {phk}.
+* Выполните тест как минимум 3 раза, но лучше запустить более 20 раз как для кода "до", так и для кода "после". По возможности чередуйте запуски (т.е. не следует запускать 20 раз "до", а затем 20 раз "после"), это поможет выявить влияние окружения. Не чередуйте строго 1:1, а лучше 3:3, чтобы можно было обнаружить эффекты взаимодействия.
++
+Хороший шаблон: `bababa{bbbaaa}*`. Это дает подсказку после первых 1+1 прогонов (так что можно остановить тест, если всё идет совсем не так), стандартное отклонение после первых 3+3 (дает хорошее представление, стоит ли проводить длительный прогон), а также тренды и показатели взаимодействия позже.
+* Используйте man:ministat[1], чтобы определить, являются ли числа значимыми. Рекомендуется приобрести книгу "Cartoon guide to statistics" ISBN: 0062731025, особенно если вы забыли или никогда не изучали стандартное отклонение и t-критерий Стьюдента.
+* Не используйте фоновый man:fsck[8], если тест не является бенчмарком фонового `fsck`. Также отключите `background_fsck` в [.filename]#/etc/rc.conf#, если бенчмарк не запускается как минимум через 60+«время работы ``fsck``» секунд после загрузки, так как man:rc[8] пробуждается и проверяет, нужно ли запускать `fsck` для каких-либо файловых систем, когда включен фоновый `fsck`. Аналогично, убедитесь, что нет оставшихся снимков, если только бенчмарк не является тестом со снимками.
+* Если тесты производительности показывают неожиданно низкие результаты, проверьте такие факторы, как высокий объем прерываний из неожиданного источника. Сообщалось, что некоторые версии ACPI могут "вести себя неправильно" и генерировать избыточные прерывания. Для диагностики необычных результатов тестов сделайте несколько снимков `vmstat -i` и поищите что-то необычное.
+* Будьте внимательны к параметрам оптимизации для ядра и пользовательского пространства, а также отладки. Легко упустить что-то и позже понять, что тест сравнивал не одно и то же.
+* Никогда не проводите тестирование производительности с включёнными параметрами ядра `WITNESS` и `INVARIANTS`, если тест не направлен на оценку производительности именно этих функций. `WITNESS` может привести к снижению производительности на 400% и более. Аналогично, параметры userspace man:malloc[3] по умолчанию отличаются в -CURRENT от тех, что поставляются в релизах.
+
+[[testing-tinderbox]]
+== Tinderbox для исходного текста FreeBSD
+
+Исходный Tinderbox состоит из:
+
+* Скрипта сборки [.filename]#tinderbox#, который автоматизирует выгрузку определённой версии исходного кода FreeBSD и её сборку.
+* Скрипта-супервизора [.filename]#tbmaster#, который отслеживает отдельные экземпляры Tinderbox, записывает их вывод и отправляет уведомления о сбоях по электронной почте.
+* Скрипта CGI с именем [.filename]#index.cgi#, который читает набор журналов tbmaster и представляет их в виде удобочитаемой HTML-сводки.
+* Набора серверов сборки, которые постоянно тестируют последние изменения наиболее важных веток кода FreeBSD.
+* Веб-сервера, хранящего полный набор журналов Tinderbox и отображающий актуальную сводку.
+
+Скрипты поддерживаются и были разработаны {des}, и сейчас написаны на Perl, что стало шагом вперед по сравнению с их первоначальной версией в виде shell-скриптов. Все скрипты и конфигурационные файлы хранятся в https://www.freebsd.org/cgi/cvsweb.cgi/projects/tinderbox/[/projects/tinderbox/].
+
+Для получения дополнительной информации о скриптах tinderbox и tbmaster на данном этапе обратитесь к соответствующим руководствам: tinderbox(1) и tbmaster(1).
+
+== Скрипт index.cgi
+
+Скрипт [.filename]#index.cgi# генерирует HTML-сводку журналов tinderbox и tbmaster. Хотя изначально он предназначался для использования в качестве CGI-скрипта, как следует из его названия, этот скрипт также может быть запущен из командной строки или из задачи man:cron[8], в таком случае он будет искать логи в директории, где расположен сам скрипт. Он автоматически определяет контекст, генерируя HTTP-заголовки при запуске в качестве CGI-скрипта. Он соответствует стандартам XHTML и использует CSS для стилизации.
+
+Скрипт начинает работу в блоке `main()`, пытаясь проверить, что он выполняется на официальном сайте Tinderbox. Если это не так, создается страница с указанием, что это не официальный сайт, и предоставляется URL официального сайта.
+
+Далее выполняется сканирование каталога журналов для получения перечня конфигураций, веток и архитектур, для которых существуют файлы журналов, чтобы избежать жесткого задания списка в скрипте и потенциального появления пустых строк или столбцов. Эта информация извлекается из имен файлов журналов, соответствующих следующему шаблону:
+
+[.programlisting]
+....
+tinderbox-$config-$branch-$arch-$machine.{brief,full}
+....
+
+Конфигурации, используемые на официальных серверах сборки Tinderbox, названы в соответствии с ветками, которые они собирают. Например, конфигурация `releng_8` используется для сборки `RELENG_8`, а также всех поддерживаемых веток выпусков.
+
+После успешного завершения всей процедуры запуска для каждой конфигурации вызывается `do_config()`.
+
+Функция `do_config()` генерирует HTML для отдельной конфигурации Tinderbox.
+
+Он работает, сначала создавая строку заголовка, затем перебирая каждую сборку ветки с указанной конфигурацией, формируя одну строку результатов для каждой следующим образом:
+
+* Для каждого элемента:
+
+** Для каждой машины в рамках этой архитектуры:
+
+*** Если существует краткий файл журнала, то:
+
+**** Вызвать `success()`, чтобы определить результат сборки.
+**** Вывести размер изменения.
+**** Вывести размер краткого файла журнала со ссылкой на сам файл журнала.
+**** Если также существует полный файл журнала, то:
+
+***** Вывести размер полного файла журнала со ссылкой на сам файл журнала.
+
+*** В противном случае:
+
+**** Нечего не выводить.
+
+Упомянутая выше функция `success()` проверяет краткий лог-файл на наличие строки "tinderbox run completed", чтобы определить, был ли сборка успешной.
+
+Конфигурации и ветви сортируются в соответствии с их рангом. Это вычисляется следующим образом:
+
+* `HEAD` и `CURRENT` имеют ранг 9999.
+* `RELENG_x` имеет ранг __``xx``__99.
+* `RELENG_x_y` имеет ранг _xxyy_.
+
+Это означает, что `HEAD` всегда имеет наивысший приоритет, а ветви `RELENG` ранжируются в числовом порядке, причём каждая ветвь `STABLE` имеет более высокий приоритет, чем ветви выпусков, ответвлённые от неё. Например, для FreeBSD 8 порядок от наивысшего к низшему будет следующим:
+
+* `RELENG_8` (ранг ветки 899).
+* `RELENG_8_3` (ранг ветки 803).
+* `RELENG_8_2` (ранг ветки 802).
+* `RELENG_8_1` (ранг ветки 801).
+* `RELENG_8_0` (ранг ветки 800).
+
+Цвета, которые Tinderbox использует для каждой ячейки в таблице, определяются CSS. Успешные сборки отображаются зелёным текстом; неудачные сборки отображаются красным текстом. Цвет блекнет со временем с момента соответствующей сборки, приближаясь к серому каждые полчаса.
+
+== Официальные серверы сборки
+
+Официальные серверы сборки Tinderbox размещены на площадке http://www.sentex.ca[Sentex Data Communications], которая также предоставляет хостинг для кластера Netperf FreeBSD.
+
+В настоящее время работают три сервера сборки:
+
+_freebsd-current.sentex.ca_ собирает:
+
+* `HEAD` для amd64, arm, i386, i386/pc98, ia64, mips, powerpc, powerpc64 и sparc64.
+* `RELENG_9` и поддерживаемые ветки 9._X_ для amd64, arm, i386, i386/pc98, ia64, mips, powerpc, powerpc64 и sparc64.
+
+_freebsd-stable.sentex.ca_ собирает:
+
+* `RELENG_8` и поддерживаемые ветки 8._X_ для amd64, i386, i386/pc98, ia64, mips, powerpc и sparc64.
+
+_freebsd-legacy.sentex.ca_ собирает:
+
+* `RELENG_7` и поддерживаемые ветки 7._X_ для amd64, i386, i386/pc98, ia64, powerpc и sparc64.
+
+== Официальный сайт со сводками
+
+Сводки и журналы с официальных серверов сборки доступны в сети по адресу http://tinderbox.FreeBSD.org[http://tinderbox.FreeBSD.org], размещены на {des} и настроены следующим образом:
+
+* Задание man:cron[8] проверяет серверы сборки через регулярные интервалы и загружает все новые файлы журналов с помощью man:rsync[1].
+* Apache настроен на использование [.filename]#index.cgi# в качестве `DirectoryIndex`.
diff --git a/documentation/content/ru/books/developers-handbook/testing/_index.po b/documentation/content/ru/books/developers-handbook/testing/_index.po
new file mode 100644
index 0000000000..220968249a
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/testing/_index.po
@@ -0,0 +1,802 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-06-27 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbooktesting_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:1
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:15
+#, no-wrap
+msgid "Regression and Performance Testing"
+msgstr "Регрессионное и нагрузочное тестирование"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:1
+#, no-wrap
+msgid "Chapter 6. Regression and Performance Testing"
+msgstr "Глава 6. Регрессионное и нагрузочное тестирование"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:53
+msgid ""
+"Regression tests are used to exercise a particular bit of the system to "
+"check that it works as expected, and to make sure that old bugs are not "
+"reintroduced."
+msgstr ""
+"Регрессионные тесты используются для проверки определенной части системы, "
+"чтобы убедиться, что она работает как ожидается, и для предотвращения "
+"повторного появления старых ошибок."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:55
+msgid ""
+"The FreeBSD regression testing tools can be found in the FreeBSD source tree "
+"in the directory [.filename]#src/tools/regression#."
+msgstr ""
+"Инструменты для регрессионного тестирования FreeBSD можно найти в дереве "
+"исходных кодов FreeBSD в каталоге [.filename]#src/tools/regression#."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:57
+#, no-wrap
+msgid "Micro Benchmark Checklist"
+msgstr "Контрольный список для бенчмарка низкоуровневых операций"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:60
+msgid ""
+"This section contains hints for doing proper micro-benchmarking on FreeBSD "
+"or of FreeBSD itself."
+msgstr ""
+"Этот раздел содержит рекомендации по проведению корректного бенчмарка "
+"низкоуровненых операций на FreeBSD или самой FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:62
+msgid ""
+"It is not possible to use all of the suggestions below every single time, "
+"but the more used, the better the benchmark's ability to test small "
+"differences will be."
+msgstr ""
+"Невозможно использовать все приведенные ниже рекомендации каждый раз, но чем "
+"больше их применяется, тем лучше способность теста выявлять небольшие "
+"различия."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:64
+msgid "Disable APM and any other kind of clock fiddling (ACPI ?)."
+msgstr "Отключить APM и любые другие манипуляции с часами (ACPI ?)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:65
+msgid ""
+"Run in single user mode. E.g., man:cron[8], and other daemons only add "
+"noise. The man:sshd[8] daemon can also cause problems. If ssh access is "
+"required during testing either disable the SSHv1 key regeneration, or kill "
+"the parent `sshd` daemon during the tests."
+msgstr ""
+"Запускайте тесты в однопользовательском режиме. Например, man:cron[8] и "
+"другие демоны только добавляют шум. Демон man:sshd[8] также может вызвать "
+"проблемы. Если требуется доступ по SSH во время тестирования, либо отключите "
+"перегенерацию ключа SSHv1, либо завершите родительский демон `sshd` во время "
+"тестов."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:66
+msgid "Do not run man:ntpd[8]."
+msgstr "Не запускайте man:ntpd[8]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:67
+msgid ""
+"If man:syslog[3] events are generated, run man:syslogd[8] with an empty "
+"[.filename]#/etc/syslogd.conf#, otherwise, do not run it."
+msgstr ""
+"Если события man:syslog[3] генерируются, запустите man:syslogd[8] с пустым "
+"[.filename]#/etc/syslogd.conf#, в противном случае не запускайте его."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:68
+msgid "Minimize disk-I/O, avoid it entirely if possible."
+msgstr ""
+"Минимизируйте дисковые операции ввода-вывода, по возможности избегайте их "
+"полностью."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:69
+msgid "Do not mount file systems that are not needed."
+msgstr "Не монтируйте файловые системы, которые не требуются."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:70
+msgid ""
+"Mount [.filename]#/#, [.filename]#/usr#, and any other file system as read-"
+"only if possible. This removes atime updates to disk (etc.) from the I/O "
+"picture."
+msgstr ""
+"Смонтируйте [.filename]#/#, [.filename]#/usr# и любые другие файловые "
+"системы в режиме только для чтения, если это возможно. Это исключает "
+"обновления atime на диске (и т.д.) из общей картины ввода-вывода."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:71
+msgid ""
+"Reinitialize the read/write test file system with man:newfs[8] and populate "
+"it from a man:tar[1] or man:dump[8] file before every run. Unmount and mount "
+"it before starting the test. This results in a consistent file system "
+"layout. For a worldstone test this would apply to [.filename]#/usr/obj# "
+"(just reinitialize with `newfs` and mount). To get 100% reproducibility, "
+"populate the file system from a man:dd[1] file (i.e.: `dd if=myimage of=/dev/"
+"ad0s1h bs=1m`)"
+msgstr ""
+"Переинициализируйте тестовую файловую систему с возможностью чтения/записи с "
+"помощью man:newfs[8] и заполните её из файла man:tar[1] или man:dump[8] "
+"перед каждым запуском. Размонтируйте и смонтируйте её перед началом теста. "
+"Это обеспечит согласованную структуру файловой системы. Для теста worldstone "
+"это применимо к [.filename]#/usr/obj# (просто переинициализируйте с помощью "
+"`newfs` и смонтируйте). Для достижения 100% воспроизводимости заполните "
+"файловую систему из файла man:dd[1] (например: `dd if=myimage of=/dev/ad0s1h "
+"bs=1m`)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:72
+msgid "Use malloc backed or preloaded man:md[4] partitions."
+msgstr "Используйте разделы man:md[4] с поддержкой malloc или предзагруженные."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:73
+msgid ""
+"Reboot between individual iterations of the test, this gives a more "
+"consistent state."
+msgstr ""
+"Перезагружайтесь между отдельными итерациями теста, это обеспечивает более "
+"согласованное состояние."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:74
+msgid ""
+"Remove all non-essential device drivers from the kernel. For instance if USB "
+"is not needed for the test, do not put USB in the kernel. Drivers which "
+"attach often have timeouts ticking away."
+msgstr ""
+"Удалите все необязательные драйверы устройств из ядра. Например, если USB не "
+"нужен для теста, не включайте поддержку USB в ядре. Драйверы, которые "
+"подключаются, часто имеют работающие таймауты."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:75
+msgid ""
+"Unconfigure hardware that are not in use. Detach disks with "
+"man:atacontrol[8] and man:camcontrol[8] if the disks are not used for the "
+"test."
+msgstr ""
+"Отключите неиспользуемое оборудование. Отсоедините диски с помощью "
+"man:atacontrol[8] и man:camcontrol[8], если диски не используются для "
+"тестирования."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:76
+msgid ""
+"Do not configure the network unless it is being tested, or wait until after "
+"the test has been performed to ship the results off to another computer."
+msgstr ""
+"Не настраивайте сеть, если она не тестируется, или дождитесь завершения "
+"тестирования, чтобы отправить результаты на другой компьютер."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:78
+msgid ""
+"Disable \"Turbo-modes\" because they make the clock frequency explicitly "
+"depend on the environment. This means that benchmark runs on 100% identical "
+"code, may depend on time of day, coffee vs. soda or even how many other "
+"people are in the office."
+msgstr ""
+"Отключите \"турбо-режимы\", так как они делают тактовую частоту явно "
+"зависимой от окружающей среды. Это означает, что результаты тестирования на "
+"100% идентичном коде могут зависеть от времени суток, употребления кофе или "
+"газировки или даже от количества людей в офисе."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:80
+msgid ""
+"If the system must be connected to a public network, watch out for spikes of "
+"broadcast traffic. Even though it is hardly noticeable, it will take up CPU "
+"cycles. Multicast has similar caveats."
+msgstr ""
+"Если система должна быть подключена к общедоступной сети, следите за "
+"всплесками широковещательного трафика. Даже если они почти незаметны, они "
+"будут занимать циклы процессора. Многоадресная рассылка имеет аналогичные "
+"предостережения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:81
+msgid ""
+"Put each file system on its own disk. This minimizes jitter from head-seek "
+"optimizations."
+msgstr ""
+"Размещайте каждую файловую систему на отдельном диске. Это минимизирует "
+"задержки, вызванные оптимизацией перемещения головок диска."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:82
+msgid ""
+"Minimize output to serial or VGA consoles. Running output into files gives "
+"less jitter. (Serial consoles easily become a bottleneck.) Do not touch "
+"keyboard while the test is running, even kbd:[space] or kbd:[back-space] "
+"shows up in the numbers."
+msgstr ""
+"Минимизируйте вывод на последовательные или VGA-консоли. Запись вывода в "
+"файлы снижает дрожание. (Консоли на последовательном порту легко становятся "
+"узким местом.) Не касайтесь клавиатуры во время выполнения теста, даже "
+"нажатия kbd:[пробел] или kbd:[back-space] отражаются в числах."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:83
+msgid ""
+"Make sure the test is long enough, but not too long. If the test is too "
+"short, timestamping is a problem. If it is too long temperature changes and "
+"drift will affect the frequency of the quartz crystals in the computer. Rule "
+"of thumb: more than a minute, less than an hour."
+msgstr ""
+"Убедитесь, что тест достаточно длинный, но не слишком. Если тест слишком "
+"короткий, возникают проблемы с временными метками. Если он слишком длинный, "
+"изменения температуры и дрейф повлияют на частоту кварцевых кристаллов в "
+"компьютере. Эмпирическое правило: больше минуты, меньше часа."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:84
+msgid ""
+"Try to keep the temperature as stable as possible around the machine. This "
+"affects both quartz crystals and disk drive algorithms. To get real stable "
+"clock, consider stabilized clock injection. E.g., get a OCXO + PLL, inject "
+"output into clock circuits instead of motherboard xtal. Contact {phk} for "
+"more information about this."
+msgstr ""
+"Попытайтесь поддерживать температуру вокруг машины как можно более "
+"стабильной. Это влияет как на кварцевые резонаторы, так и на алгоритмы "
+"работы дисковых накопителей. Для получения действительно стабильных часов "
+"рассмотрите возможность использования стабилизированного тактового сигнала. "
+"Например, используйте OCXO + PLL и подавайте выходной сигнал в тактовые "
+"схемы вместо кварцевого резонатора на материнской плате. Для получения "
+"дополнительной информации по этому вопросу свяжитесь с {phk}."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:85
+msgid ""
+"Run the test at least 3 times but it is better to run more than 20 times "
+"both for \"before\" and \"after\" code. Try to interleave if possible (i.e.: "
+"do not run 20 times before then 20 times after), this makes it possible to "
+"spot environmental effects. Do not interleave 1:1, but 3:3, this makes it "
+"possible to spot interaction effects."
+msgstr ""
+"Выполните тест как минимум 3 раза, но лучше запустить более 20 раз как для "
+"кода \"до\", так и для кода \"после\". По возможности чередуйте запуски "
+"(т.е. не следует запускать 20 раз \"до\", а затем 20 раз \"после\"), это "
+"поможет выявить влияние окружения. Не чередуйте строго 1:1, а лучше 3:3, "
+"чтобы можно было обнаружить эффекты взаимодействия."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:88
+msgid ""
+"A good pattern is: `bababa{bbbaaa}*`. This gives hint after the first 1+1 "
+"runs (so it is possible to stop the test if it goes entirely the wrong way), "
+"a standard deviation after the first 3+3 (gives a good indication if it is "
+"going to be worth a long run) and trending and interaction numbers later on."
+msgstr ""
+"Хороший шаблон: `bababa{bbbaaa}*`. Это дает подсказку после первых 1+1 "
+"прогонов (так что можно остановить тест, если всё идет совсем не так), "
+"стандартное отклонение после первых 3+3 (дает хорошее представление, стоит "
+"ли проводить длительный прогон), а также тренды и показатели взаимодействия "
+"позже."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:89
+msgid ""
+"Use man:ministat[1] to see if the numbers are significant. Consider buying "
+"\"Cartoon guide to statistics\" ISBN: 0062731025, highly recommended, if you "
+"have forgotten or never learned about standard deviation and Student's T."
+msgstr ""
+"Используйте man:ministat[1], чтобы определить, являются ли числа значимыми. "
+"Рекомендуется приобрести книгу \"Cartoon guide to statistics\" ISBN: "
+"0062731025, особенно если вы забыли или никогда не изучали стандартное "
+"отклонение и t-критерий Стьюдента."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:90
+msgid ""
+"Do not use background man:fsck[8] unless the test is a benchmark of "
+"background `fsck`. Also, disable `background_fsck` in [.filename]#/etc/"
+"rc.conf# unless the benchmark is not started at least 60+\"``fsck`` "
+"runtime\" seconds after the boot, as man:rc[8] wakes up and checks if `fsck` "
+"needs to run on any file systems when background `fsck` is enabled. "
+"Likewise, make sure there are no snapshots lying around unless the benchmark "
+"is a test with snapshots."
+msgstr ""
+"Не используйте фоновый man:fsck[8], если тест не является бенчмарком "
+"фонового `fsck`. Также отключите `background_fsck` в [.filename]#/etc/"
+"rc.conf#, если бенчмарк не запускается как минимум через 60+«время работы "
+"``fsck``» секунд после загрузки, так как man:rc[8] пробуждается и проверяет, "
+"нужно ли запускать `fsck` для каких-либо файловых систем, когда включен "
+"фоновый `fsck`. Аналогично, убедитесь, что нет оставшихся снимков, если "
+"только бенчмарк не является тестом со снимками."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:91
+msgid ""
+"If the benchmark show unexpected bad performance, check for things like high "
+"interrupt volume from an unexpected source. Some versions of ACPI have been "
+"reported to \"misbehave\" and generate excess interrupts. To help diagnose "
+"odd test results, take a few snapshots of `vmstat -i` and look for anything "
+"unusual."
+msgstr ""
+"Если тесты производительности показывают неожиданно низкие результаты, "
+"проверьте такие факторы, как высокий объем прерываний из неожиданного "
+"источника. Сообщалось, что некоторые версии ACPI могут \"вести себя "
+"неправильно\" и генерировать избыточные прерывания. Для диагностики "
+"необычных результатов тестов сделайте несколько снимков `vmstat -i` и "
+"поищите что-то необычное."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:92
+msgid ""
+"Make sure to be careful about optimization parameters for kernel and "
+"userspace, likewise debugging. It is easy to let something slip through and "
+"realize later the test was not comparing the same thing."
+msgstr ""
+"Будьте внимательны к параметрам оптимизации для ядра и пользовательского "
+"пространства, а также отладки. Легко упустить что-то и позже понять, что "
+"тест сравнивал не одно и то же."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:93
+msgid ""
+"Do not ever benchmark with the `WITNESS` and `INVARIANTS` kernel options "
+"enabled unless the test is interested to benchmarking those features. "
+"`WITNESS` can cause 400%+ drops in performance. Likewise, userspace "
+"man:malloc[3] parameters default differently in -CURRENT from the way they "
+"ship in production releases."
+msgstr ""
+"Никогда не проводите тестирование производительности с включёнными "
+"параметрами ядра `WITNESS` и `INVARIANTS`, если тест не направлен на оценку "
+"производительности именно этих функций. `WITNESS` может привести к снижению "
+"производительности на 400% и более. Аналогично, параметры userspace "
+"man:malloc[3] по умолчанию отличаются в -CURRENT от тех, что поставляются в "
+"релизах."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:95
+#, no-wrap
+msgid "The FreeBSD Source Tinderbox"
+msgstr "Tinderbox для исходного текста FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:98
+msgid "The source Tinderbox consists of:"
+msgstr "Исходный Tinderbox состоит из:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:100
+msgid ""
+"A build script, [.filename]#tinderbox#, that automates checking out a "
+"specific version of the FreeBSD source tree and building it."
+msgstr ""
+"Скрипта сборки [.filename]#tinderbox#, который автоматизирует выгрузку "
+"определённой версии исходного кода FreeBSD и её сборку."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:101
+msgid ""
+"A supervisor script, [.filename]#tbmaster#, that monitors individual "
+"Tinderbox instances, logs their output, and emails failure notices."
+msgstr ""
+"Скрипта-супервизора [.filename]#tbmaster#, который отслеживает отдельные "
+"экземпляры Tinderbox, записывает их вывод и отправляет уведомления о сбоях "
+"по электронной почте."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:102
+msgid ""
+"A CGI script named [.filename]#index.cgi# that reads a set of tbmaster logs "
+"and presents an easy-to-read HTML summary of them."
+msgstr ""
+"Скрипта CGI с именем [.filename]#index.cgi#, который читает набор журналов "
+"tbmaster и представляет их в виде удобочитаемой HTML-сводки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:103
+msgid ""
+"A set of build servers that continually test the tip of the most important "
+"FreeBSD code branches."
+msgstr ""
+"Набора серверов сборки, которые постоянно тестируют последние изменения "
+"наиболее важных веток кода FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:104
+msgid ""
+"A webserver that keeps a complete set of Tinderbox logs and displays an up-"
+"to-date summary."
+msgstr ""
+"Веб-сервера, хранящего полный набор журналов Tinderbox и отображающий "
+"актуальную сводку."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:107
+msgid ""
+"The scripts are maintained and were developed by {des}, and are now written "
+"in Perl, a move on from their original incarnation as shell scripts. All "
+"scripts and configuration files are kept in https://www.freebsd.org/cgi/"
+"cvsweb.cgi/projects/tinderbox/[/projects/tinderbox/]."
+msgstr ""
+"Скрипты поддерживаются и были разработаны {des}, и сейчас написаны на Perl, "
+"что стало шагом вперед по сравнению с их первоначальной версией в виде shell-"
+"скриптов. Все скрипты и конфигурационные файлы хранятся в https://"
+"www.freebsd.org/cgi/cvsweb.cgi/projects/tinderbox/[/projects/tinderbox/]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:109
+msgid ""
+"For more information about the tinderbox and tbmaster scripts at this stage, "
+"see their respective man pages: tinderbox(1) and tbmaster(1)."
+msgstr ""
+"Для получения дополнительной информации о скриптах tinderbox и tbmaster на "
+"данном этапе обратитесь к соответствующим руководствам: tinderbox(1) и "
+"tbmaster(1)."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:110
+#, no-wrap
+msgid "The index.cgi Script"
+msgstr "Скрипт index.cgi"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:117
+msgid ""
+"The [.filename]#index.cgi# script generates the HTML summary of tinderbox "
+"and tbmaster logs. Although originally intended to be used as a CGI script, "
+"as indicated by its name, this script can also be run from the command line "
+"or from a man:cron[8] job, in which case it will look for logs in the "
+"directory where the script is located. It will automatically detect "
+"context, generating HTTP headers when it is run as a CGI script. It "
+"conforms to XHTML standards and is styled using CSS."
+msgstr ""
+"Скрипт [.filename]#index.cgi# генерирует HTML-сводку журналов tinderbox и "
+"tbmaster. Хотя изначально он предназначался для использования в качестве CGI-"
+"скрипта, как следует из его названия, этот скрипт также может быть запущен "
+"из командной строки или из задачи man:cron[8], в таком случае он будет "
+"искать логи в директории, где расположен сам скрипт. Он автоматически "
+"определяет контекст, генерируя HTTP-заголовки при запуске в качестве CGI-"
+"скрипта. Он соответствует стандартам XHTML и использует CSS для стилизации."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:120
+msgid ""
+"The script starts in the `main()` block by attempting to verify that it is "
+"running on the official Tinderbox website. If it is not, a page indicating "
+"it is not an official website is produced, and a URL to the official site is "
+"provided."
+msgstr ""
+"Скрипт начинает работу в блоке `main()`, пытаясь проверить, что он "
+"выполняется на официальном сайте Tinderbox. Если это не так, создается "
+"страница с указанием, что это не официальный сайт, и предоставляется URL "
+"официального сайта."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:123
+msgid ""
+"Next, it scans the log directory to get an inventory of configurations, "
+"branches and architectures for which log files exist, to avoid hard-coding a "
+"list into the script and potentially ending up with blank rows or columns. "
+"This information is derived from the names of the log files matching the "
+"following pattern:"
+msgstr ""
+"Далее выполняется сканирование каталога журналов для получения перечня "
+"конфигураций, веток и архитектур, для которых существуют файлы журналов, "
+"чтобы избежать жесткого задания списка в скрипте и потенциального появления "
+"пустых строк или столбцов. Эта информация извлекается из имен файлов "
+"журналов, соответствующих следующему шаблону:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:127
+#, no-wrap
+msgid "tinderbox-$config-$branch-$arch-$machine.{brief,full}\n"
+msgstr "tinderbox-$config-$branch-$arch-$machine.{brief,full}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:131
+msgid ""
+"The configurations used on the official Tinderbox build servers are named "
+"for the branches they build. For example, the `releng_8` configuration is "
+"used to build `RELENG_8` as well as all still-supported release branches."
+msgstr ""
+"Конфигурации, используемые на официальных серверах сборки Tinderbox, названы "
+"в соответствии с ветками, которые они собирают. Например, конфигурация "
+"`releng_8` используется для сборки `RELENG_8`, а также всех поддерживаемых "
+"веток выпусков."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:133
+msgid ""
+"Once all of this startup procedure has been successfully completed, "
+"`do_config()` is called for each configuration."
+msgstr ""
+"После успешного завершения всей процедуры запуска для каждой конфигурации "
+"вызывается `do_config()`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:135
+msgid ""
+"The `do_config()` function generates HTML for a single Tinderbox "
+"configuration."
+msgstr ""
+"Функция `do_config()` генерирует HTML для отдельной конфигурации Tinderbox."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:138
+msgid ""
+"It works by first generating a header row, then iterating over each branch "
+"build with the specified configuration, producing a single row of results "
+"for each in the following manner:"
+msgstr ""
+"Он работает, сначала создавая строку заголовка, затем перебирая каждую "
+"сборку ветки с указанной конфигурацией, формируя одну строку результатов для "
+"каждой следующим образом:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:140
+msgid "For each item:"
+msgstr "Для каждого элемента:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:142
+msgid "For each machine within that architecture:"
+msgstr "Для каждой машины в рамках этой архитектуры:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:144
+msgid "If a brief log file exists, then:"
+msgstr "Если существует краткий файл журнала, то:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:146
+msgid "Call `success()` to determine the outcome of the build."
+msgstr "Вызвать `success()`, чтобы определить результат сборки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:147
+msgid "Output the modification size."
+msgstr "Вывести размер изменения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:148
+msgid ""
+"Output the size of the brief log file with a link to the log file itself."
+msgstr "Вывести размер краткого файла журнала со ссылкой на сам файл журнала."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:149
+msgid "If a full log file also exists, then:"
+msgstr "Если также существует полный файл журнала, то:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:151
+msgid ""
+"Output the size of the full log file with a link to the log file itself."
+msgstr "Вывести размер полного файла журнала со ссылкой на сам файл журнала."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:153
+msgid "Otherwise:"
+msgstr "В противном случае:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:155
+msgid "No output."
+msgstr "Нечего не выводить."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:157
+msgid ""
+"The `success()` function mentioned above scans a brief log file for the "
+"string \"tinderbox run completed\" in order to determine whether the build "
+"was successful."
+msgstr ""
+"Упомянутая выше функция `success()` проверяет краткий лог-файл на наличие "
+"строки \"tinderbox run completed\", чтобы определить, был ли сборка успешной."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:160
+msgid ""
+"Configurations and branches are sorted according to their branch rank. This "
+"is computed as follows:"
+msgstr ""
+"Конфигурации и ветви сортируются в соответствии с их рангом. Это вычисляется "
+"следующим образом:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:162
+msgid "`HEAD` and `CURRENT` have rank 9999."
+msgstr "`HEAD` и `CURRENT` имеют ранг 9999."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:163
+msgid "`RELENG_x` has rank __``xx``__99."
+msgstr "`RELENG_x` имеет ранг __``xx``__99."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:164
+msgid "`RELENG_x_y` has rank _xxyy_."
+msgstr "`RELENG_x_y` имеет ранг _xxyy_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:167
+msgid ""
+"This means that `HEAD` always ranks highest, and `RELENG` branches are "
+"ranked in numerical order, with each `STABLE` branch ranking higher than the "
+"release branches forked off of it. For instance, for FreeBSD 8, the order "
+"from highest to lowest would be:"
+msgstr ""
+"Это означает, что `HEAD` всегда имеет наивысший приоритет, а ветви `RELENG` "
+"ранжируются в числовом порядке, причём каждая ветвь `STABLE` имеет более "
+"высокий приоритет, чем ветви выпусков, ответвлённые от неё. Например, для "
+"FreeBSD 8 порядок от наивысшего к низшему будет следующим:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:169
+msgid "`RELENG_8` (branch rank 899)."
+msgstr "`RELENG_8` (ранг ветки 899)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:170
+msgid "`RELENG_8_3` (branch rank 803)."
+msgstr "`RELENG_8_3` (ранг ветки 803)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:171
+msgid "`RELENG_8_2` (branch rank 802)."
+msgstr "`RELENG_8_2` (ранг ветки 802)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:172
+msgid "`RELENG_8_1` (branch rank 801)."
+msgstr "`RELENG_8_1` (ранг ветки 801)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:173
+msgid "`RELENG_8_0` (branch rank 800)."
+msgstr "`RELENG_8_0` (ранг ветки 800)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:177
+msgid ""
+"The colors that Tinderbox uses for each cell in the table are defined by "
+"CSS. Successful builds are displayed with green text; unsuccessful builds "
+"are displayed with red text. The color fades as time passes since the "
+"corresponding build, with every half an hour bringing the color closer to "
+"grey."
+msgstr ""
+"Цвета, которые Tinderbox использует для каждой ячейки в таблице, "
+"определяются CSS. Успешные сборки отображаются зелёным текстом; неудачные "
+"сборки отображаются красным текстом. Цвет блекнет со временем с момента "
+"соответствующей сборки, приближаясь к серому каждые полчаса."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:178
+#, no-wrap
+msgid "Official Build Servers"
+msgstr "Официальные серверы сборки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:181
+msgid ""
+"The official Tinderbox build servers are hosted by http://"
+"www.sentex.ca[Sentex Data Communications], who also host the FreeBSD Netperf "
+"Cluster."
+msgstr ""
+"Официальные серверы сборки Tinderbox размещены на площадке http://"
+"www.sentex.ca[Sentex Data Communications], которая также предоставляет "
+"хостинг для кластера Netperf FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:183
+msgid "Three build servers currently exist:"
+msgstr "В настоящее время работают три сервера сборки:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:185
+msgid "_freebsd-current.sentex.ca_ builds:"
+msgstr "_freebsd-current.sentex.ca_ собирает:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:187
+msgid ""
+"`HEAD` for amd64, arm, i386, i386/pc98, ia64, mips, powerpc, powerpc64, and "
+"sparc64."
+msgstr ""
+"`HEAD` для amd64, arm, i386, i386/pc98, ia64, mips, powerpc, powerpc64 и "
+"sparc64."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:188
+msgid ""
+"`RELENG_9` and supported 9._X_ branches for amd64, arm, i386, i386/pc98, "
+"ia64, mips, powerpc, powerpc64, and sparc64."
+msgstr ""
+"`RELENG_9` и поддерживаемые ветки 9._X_ для amd64, arm, i386, i386/pc98, "
+"ia64, mips, powerpc, powerpc64 и sparc64."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:190
+msgid "_freebsd-stable.sentex.ca_ builds:"
+msgstr "_freebsd-stable.sentex.ca_ собирает:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:192
+msgid ""
+"`RELENG_8` and supported 8._X_ branches for amd64, i386, i386/pc98, ia64, "
+"mips, powerpc and sparc64."
+msgstr ""
+"`RELENG_8` и поддерживаемые ветки 8._X_ для amd64, i386, i386/pc98, ia64, "
+"mips, powerpc и sparc64."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:194
+msgid "_freebsd-legacy.sentex.ca_ builds:"
+msgstr "_freebsd-legacy.sentex.ca_ собирает:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:196
+msgid ""
+"`RELENG_7` and supported 7._X_ branches for amd64, i386, i386/pc98, ia64, "
+"powerpc, and sparc64."
+msgstr ""
+"`RELENG_7` и поддерживаемые ветки 7._X_ для amd64, i386, i386/pc98, ia64, "
+"powerpc и sparc64."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:197
+#, no-wrap
+msgid "Official Summary Site"
+msgstr "Официальный сайт со сводками"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:200
+msgid ""
+"Summaries and logs from the official build servers are available online at "
+"http://tinderbox.FreeBSD.org[http://tinderbox.FreeBSD.org], hosted by {des} "
+"and set up as follows:"
+msgstr ""
+"Сводки и журналы с официальных серверов сборки доступны в сети по адресу "
+"http://tinderbox.FreeBSD.org[http://tinderbox.FreeBSD.org], размещены на "
+"{des} и настроены следующим образом:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:202
+msgid ""
+"A man:cron[8] job checks the build servers at regular intervals and "
+"downloads any new log files using man:rsync[1]."
+msgstr ""
+"Задание man:cron[8] проверяет серверы сборки через регулярные интервалы и "
+"загружает все новые файлы журналов с помощью man:rsync[1]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/testing/_index.adoc:202
+msgid "Apache is set up to use [.filename]#index.cgi# as `DirectoryIndex`."
+msgstr ""
+"Apache настроен на использование [.filename]#index.cgi# в качестве "
+"`DirectoryIndex`."
diff --git a/documentation/content/ru/books/developers-handbook/tools/_index.adoc b/documentation/content/ru/books/developers-handbook/tools/_index.adoc
new file mode 100644
index 0000000000..83dbc7784c
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/tools/_index.adoc
@@ -0,0 +1,1428 @@
+---
+authors:
+ -
+ author: 'James Raynard'
+ -
+ author: 'Murray Stokely'
+description: 'Инструменты разработки'
+next: books/developers-handbook/secure
+params:
+ path: /books/developers-handbook/tools/
+prev: books/developers-handbook/introduction
+showBookMenu: true
+tags: ["tools", "Interpreters", "Compilers", "cc", "make", "Debugging", "lldb", "gdb", "clang", "Emacs"]
+title: 'Глава 2. Инструменты разработки'
+weight: 3
+---
+
+[[tools]]
+= Инструменты разработки
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 2
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:c-plus-plus-command: c++
+:clang-plus-plus-command: clang++
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[tools-synopsis]]
+== Обзор
+
+В этой главе представлено введение в использование некоторых инструментов для программирования, поставляемых с FreeBSD, хотя многое из описанного применимо и к другим версиям UNIX(R). Она _не_ претендует на детальное описание процесса написания кода. Большая часть главы предполагает наличие минимальных или отсутствие знаний в программировании, хотя предполагается, что даже опытные программисты найдут в ней что-то полезное.
+
+[[tools-intro]]
+== Введение
+
+FreeBSD предоставляет отличную среду разработки. Компиляторы для C и C++, а также ассемблер входят в базовую систему, не говоря уже о классических инструментах UNIX(R), таких как `sed` и `awk`. Если этого недостаточно, в коллекции Ports доступно множество других компиляторов и интерпретаторов. В следующем разделе, crossref:tools[tools-programming,Введение в программирование], перечислены некоторые из доступных вариантов. FreeBSD обладает высокой совместимостью со стандартами, такими как POSIX(R) и ANSI C, а также с собственным наследием BSD, что позволяет создавать приложения, которые будут компилироваться и запускаться с минимальными изменениями или без них на широком спектре платформ.
+
+Однако вся эта мощь может поначалу ошеломить, если вы никогда раньше не писали программы на платформе UNIX(R). Этот документ призван помочь вам начать работу, не углубляясь слишком сильно в более сложные темы. Цель заключается в том, чтобы дать вам достаточно базовых знаний для понимания документации.
+
+Большая часть документа не требует или почти не требует знаний программирования, хотя предполагает базовые навыки работы с UNIX(R) и готовность учиться!
+
+[[tools-programming]]
+== Введение в программирование
+
+Программа — это набор инструкций, которые указывают компьютеру выполнять различные действия; иногда выполняемая инструкция зависит от результата предыдущей. В этом разделе представлен обзор двух основных способов передачи таких инструкций, или, как их обычно называют, «команд». Один способ использует _интерпретатор_, другой — _компилятор_. Поскольку человеческие языки слишком сложны для однозначного понимания компьютером, команды обычно записываются на одном из специально разработанных для этого языков.
+
+=== Интерпретаторы
+
+С интерпретатором язык поставляется как среда, в которой вы вводите команды в приглашении, и среда выполняет их для вас. Для более сложных программ вы можете ввести команды в файл и заставить интерпретатор загрузить файл и выполнить команды в нём. Если что-то пойдёт не так, многие интерпретаторы переведут вас в отладчик, чтобы помочь найти проблему.
+
+Преимущество этого подхода в том, что вы сразу видите результаты выполнения команд, а ошибки можно легко исправить. Самый большой недостаток проявляется, когда вы хотите поделиться своими программами с кем-то. У них должен быть такой же интерпретатор, или у вас должен быть способ предоставить его, и они должны понимать, как им пользоваться. Кроме того, пользователям может не понравиться, если они попадут в отладчик при нажатии не той клавиши! С точки зрения производительности интерпретаторы могут потреблять много памяти и обычно генерируют код менее эффективно, чем компиляторы.
+
+По моему мнению, интерпретируемые языки — это лучший способ начать, если вы раньше не занимались программированием. Такая среда обычно встречается в языках вроде Lisp, Smalltalk, Perl и Basic. Можно также утверждать, что UNIX(R) shell (`sh`, `csh`) сам по себе является интерпретатором, и многие часто пишут shell-«скрипты» для помощи в различных «хозяйственных» задачах на своих машинах. Действительно, часть оригинальной философии UNIX(R) заключалась в предоставлении множества небольших утилит, которые можно было связывать вместе в shell-скриптах для выполнения полезных задач.
+
+=== Доступные интерпретаторы в FreeBSD
+
+Вот список интерпретаторов, доступных в Коллекции портов FreeBSD, с кратким обзором некоторых наиболее популярных интерпретируемых языков.
+
+Инструкции по получению и установке приложений из Коллекции портов можно найти в extref:{handbook}[разделе Порты, ports-using] руководства.
+
+BASIC::
+Сокращение от Beginner's All-purpose Symbolic Instruction Code. Разработан в 1950-х годах для обучения студентов университетов программированию и поставлялся с каждым уважающим себя персональным компьютером в 1980-х. BASIC — первый язык программирования для многих программистов. Он также является основой для Visual Basic.
++
+Интерпретатор Bywater Basic можно найти в Коллекции портов как package:lang/bwbasic[], а интерпретатор Phil Cockroft's Basic (ранее известный как Rabbit Basic) доступен как package:lang/pbasic[].
+
+Lisp::
+Язык, разработанный в конце 1950-х годов как альтернатива популярным в то время языкам для «численных расчётов». В отличие от них, Lisp основан на списках; фактически, название является сокращением от «List Processing» (обработка списков). Он очень популярен в кругах, связанных с ИИ (искусственным интеллектом).
++
+Lisp — это чрезвычайно мощный и сложный язык, но он может показаться довольно большим и громоздким.
++
+В Коллекции портов FreeBSD доступны различные реализации Lisp, которые могут работать в системах UNIX(R). CLISP от Bruno Haible и Michael Stoll доступен как package:lang/clisp[]. Более простая реализация Lisp, SLisp, доступна как package:lang/slisp[].
+
+Perl::
+Очень популярен среди системных администраторов для написания скриптов; также часто используется на веб-серверах для написания CGI-скриптов.
++
+Perl доступен в Коллекции портов как package:lang/perl5.36[] для всех выпусков FreeBSD.
+
+Scheme::
+Диалект Lisp, который более компактен и чист по сравнению с Common Lisp. Популярен в университетах, так как достаточно прост для обучения студентов в качестве первого языка, и при этом обладает достаточным уровнем абстракции для использования в исследовательской работе.
++
+Схема доступна из Коллекции Портов как package:lang/elk[] для Интерпретатора Elk Scheme. Интерпретатор MIT Scheme можно найти в package:lang/mit-scheme[], а Интерпретатор SCM Scheme — в package:lang/scm[].
+
+Lua::
+Lua — это легковесный встраиваемый язык сценариев. Он обладает высокой переносимостью и относительно прост. Lua доступен в коллекции портов в пакете package:lang/lua54[]. Он также включен в базовую систему как [.filename]#/usr/libexec/flua# для использования компонентами базовой системы. Стороннее программное обеспечение не должно зависеть от [.filename]#flua#.
+
+Python::
+Python — это объектно-ориентированный интерпретируемый язык. Его сторонники утверждают, что это один из лучших языков для начала программирования, поскольку он относительно прост в освоении, но не уступает другим популярным интерпретируемым языкам, используемым для разработки крупных и сложных приложений (Perl и Tcl — два других языка, популярных для таких задач).
++
+Последняя версия Python доступна в Коллекции портов в пакете package:lang/python[].
+
+Ruby::
+Ruby — это интерпретируемый, чисто объектно-ориентированный язык программирования. Он получил широкую популярность благодаря простому для понимания синтаксису, гибкости при написании кода и возможности легко разрабатывать и поддерживать большие, сложные программы.
++
+Ruby доступен в Коллекции портов как package:lang/ruby32[].
+
+Tcl и Tk::
+Tcl — это встраиваемый интерпретируемый язык, который получил широкое распространение и популярность в основном благодаря своей переносимости на множество платформ. Он может использоваться как для быстрого написания небольших прототипов приложений, так и (в сочетании с Tk, набором инструментов для графического интерфейса) полноценных программ с богатым функционалом.
++
+Различные версии Tcl доступны в качестве портов для FreeBSD. Последняя версия, Tcl 8.7, находится в пакете package:lang/tcl87[].
+
+=== Компиляторы
+
+Компиляторы довольно сильно различаются. Прежде всего, вы пишете свой код в файле (или файлах) с помощью редактора. Затем вы запускаете компилятор и проверяете, принимает ли он вашу программу. Если программа не скомпилировалась, стисните зубы и вернитесь к редактору; если же компиляция прошла успешно и программа была создана, вы можете запустить её либо в командной строке оболочки, либо в отладчике, чтобы проверить её работу.footnote:[Если вы запустите её в оболочке, может произойти дамп памяти.]
+
+Очевидно, это требует больше усилий по сравнению с использованием интерпретатора. Однако это позволяет делать множество вещей, которые очень сложны или даже невозможны с интерпретатором, например, писать код, тесно взаимодействующий с операционной системой — или даже создавать собственную операционную систему! Это также полезно, если требуется написать очень эффективный код, так как компилятор может не спешить и оптимизировать код, что было бы неприемлемо в интерпретаторе. Более того, распространение программы, написанной для компилятора, обычно проще, чем для интерпретатора — можно просто предоставить копию исполняемого файла, предполагая, что у пользователя та же операционная система, что и у вас.
+
+Поскольку цикл редактирования-компиляции-запуска-отладки довольно утомителен при использовании отдельных программ, многие производители коммерческих компиляторов создали интегрированные среды разработки (сокращённо IDE). FreeBSD не включает IDE в базовую систему, но в Коллекции портов доступен package:devel/kdevelop[], и многие используют для этой цели Emacs. Использование Emacs в качестве IDE обсуждается в crossref:tools[emacs, Использование Emacs как среды разработки].
+
+[[tools-compiling]]
+== Компиляция с помощью `cc`
+
+Этот раздел посвящён компилятору clang для языков C и C++, так как он устанавливается вместе с базовой системой FreeBSD. Clang устанавливается как `cc`; пакет GNU-компилятора package:lang/gcc[gcc] доступен в Коллекции портов. Детали создания программы с интерпретатором значительно различаются в зависимости от интерпретатора и обычно хорошо описаны в документации и онлайн-справке интерпретатора.
+
+Как только вы напишете свой шедевр, следующий шаг — преобразовать его во что-то, что (надеюсь!) будет работать на FreeBSD. Обычно это включает несколько шагов, каждый из которых выполняется отдельной программой.
+
+[.procedure]
+. Обработь исходный код, чтобы удалить комментарии и выполнить другие действия, такие как раскрытие макросов в C.
+. Проверить синтаксис вашего кода, чтобы убедиться, что вы соблюдаете правила языка. Если нет, он пожалуется!
+. Преобразовать исходный код в ассемблерный язык — это очень близко к машинному коду, но всё ещё понятно человеку. Как утверждается.
+. Преобразовать язык ассемблера в машинный код — да, здесь речь идет о битах и байтах, единицах и нулях.
+. Проверить, что вы использовали такие элементы, как функции и глобальные переменные, правильно и последовательно. Например, если вы вызвали несуществующую функцию, это будет отмечено.
+. Если вы пытаетесь создать исполняемый файл из нескольких исходных файлов, определить, как объединить их все вместе.
+. Определить, как создать что-то, что загрузчик времени выполнения системы сможет загрузить в память и запустить.
+. Наконец, записать исполняемый файл в файловую систему.
+
+Слово _компиляция_ часто относится только к шагам с 1 по 4, а остальные шаги называются _линковкой_. Иногда шаг 1 называют _препроцессированием_, а шаги 3-4 — _ассемблированием_.
+
+К счастью, почти все эти детали скрыты от вас, так как `cc` — это интерфейс, который управляет вызовом всех этих программ с правильными аргументами за вас; достаточно просто набрать
+
+[source, bash]
+....
+% cc foobar.c
+....
+
+и это вызовет компиляцию файла [.filename]#foobar.c# всеми перечисленными выше шагами. Если у вас несколько файлов для компиляции, просто сделайте что-то вроде
+
+[source, bash]
+....
+% cc foo.c bar.c
+....
+
+Обратите внимание, что проверка синтаксиса — это всего лишь проверка синтаксиса. Она не выявит логических ошибок, которые вы могли допустить, например, создание бесконечного цикла или использование пузырьковой сортировки вместо бинарной.footnote:[На случай, если вы не знали: бинарная сортировка — это эффективный способ упорядочивания элементов, в отличие от пузырьковой.]
+
+Существует множество опций для `cc`, все они описаны в руководстве. Вот несколько наиболее важных из них с примерами использования.
+
+`-o _filename_`::
+Имя выходного файла. Если вы не используете эту опцию, `cc` создаст исполняемый файл с именем [.filename]#a.out#.footnote:[Причины этого кроются в глубинах истории.]
++
+[source, bash]
+....
+% cc foobar.c executable is a.out
+% cc -o foobar foobar.c executable is foobar
+....
+
+`-c`::
+Просто скомпилирует файл, не связывая его. Полезно для небольших программ, где нужно только проверить синтаксис, или если вы используете [.filename]#Makefile#.
++
+[source, bash]
+....
+% cc -c foobar.c
+....
++
+Это создаст _объектный файл_ (не исполняемый) с именем [.filename]#foobar.o#. Его можно скомпоновать с другими объектными файлами в исполняемый файл.
+
+`-g`::
+Создать отладочную версию исполняемого файла. Это заставляет компилятор записывать в исполняемый файл информацию о том, какая строка какого исходного файла соответствует какому вызову функции. Отладчик может использовать эту информацию для отображения исходного кода при пошаговом выполнении программы, что _очень_ полезно; недостатком является то, что вся эта дополнительная информация значительно увеличивает размер программы. Обычно вы компилируете с `-g` во время разработки программы, а затем компилируете "релизную версию" без `-g`, когда убедитесь, что она работает правильно.
++
+
+[source, bash]
+....
+% cc -g foobar.c
+....
++
+Это создаст отладочную версию программы. footnote:[Примечание: мы не использовали флаг -o для указания имени исполняемого файла, поэтому получим исполняемый файл с именем a.out. Создание отладочной версии с именем foobar остается упражнением для читателя!]
+
+`-O`::
+Создает оптимизированную версию исполняемого файла. Компилятор применяет различные хитрые приёмы, чтобы попытаться создать исполняемый файл, который работает быстрее обычного. Вы можете добавить число после `-O`, чтобы указать более высокий уровень оптимизации, но это часто выявляет ошибки в оптимизаторе компилятора.
++
+[source, bash]
+....
+% cc -O -o foobar foobar.c
+....
++
+Это создаст оптимизированную версию [.filename]#foobar#.
+
+Следующие три флага заставят `cc` проверять, что ваш код соответствует соответствующему международному стандарту, часто называемому стандартом ANSI, хотя строго говоря, это стандарт ISO.
+
+`-Wall`::
+Включить все предупреждения, которые разработчики `cc` считают полезными. Несмотря на название, это не включит все предупреждения, которые `cc` способен выдавать.
+
+`-ansi`::
+Отключит большинство, но не все, не-ANSI C функции, предоставляемые `cc`. Несмотря на название, это не гарантирует строгого соответствия вашего кода стандарту.
+
+`-pedantic`::
+Отключит _все_ не-ANSI C возможности ``cc``.
+
+Без этих флагов `cc` позволит вам использовать некоторые из своих нестандартных расширений стандарта. Некоторые из них очень полезны, но не будут работать с другими компиляторами — фактически, одна из основных целей стандарта заключается в том, чтобы позволить людям писать код, который будет работать с любым компилятором на любой системе. Это известно как _переносимый код_.
+
+Обычно следует стремиться к тому, чтобы ваш код был как можно более переносимым, иначе позже вам, возможно, придётся полностью переписать программу для её работы в другом месте — а кто знает, что вы будете использовать через несколько лет?
+
+[source, bash]
+....
+% cc -Wall -ansi -pedantic -o foobar foobar.c
+....
+
+В результате будет создан исполняемый файл [.filename]#foobar# после проверки [.filename]#foobar.c# на соответствие стандартам.
+
+`-l__library__`::
+Укажите библиотеку функций, которая будет использоваться во время компоновки.
++
+Наиболее распространённый пример этого — компиляция программы, использующей некоторые математические функции в C. В отличие от большинства других платформ, они находятся в отдельной библиотеке, отличной от стандартной библиотеки C, и необходимо указать компилятору добавить её.
++
+Правило заключается в том, что если библиотека называется [.filename]#libsomething.a#, то вы передаёте `cc` аргумент `-l__something__`. Например, математическая библиотека называется [.filename]#libm.a#, поэтому вы передаёте `cc` аргумент `-lm`. Типичный подводный камень с математической библиотекой заключается в том, что она должна быть последней библиотекой в командной строке.
++
+[source, bash]
+....
+% cc -o foobar foobar.c -lm
+....
++
+Это приведёт к подключению функций математической библиотеки в [.filename]#foobar#.
++
+Если вы компилируете код на C++, используйте {c-plus-plus-command}. {c-plus-plus-command} также может быть вызван как {clang-plus-plus-command} в FreeBSD.
++
+[source, bash]
+....
+% c++ -o foobar foobar.cc
+....
++
+Это создаст исполняемый файл [.filename]#foobar# из исходного файла на C++
+[.filename]#foobar.cc#.
+
+=== Распространённые вопросы и проблемы `cc`
+
+==== Я скомпилировал файл с именем foobar.c и не могу найти исполняемый файл с именем foobar. Куда он пропал?
+
+Помните, что `cc` вызовет исполняемый файл [.filename]#a.out#, если вы не укажете иное. Используйте опцию `-o _имя_файла_`:
+
+[source, bash]
+....
+% cc -o foobar foobar.c
+....
+
+==== Хорошо, у меня есть исполняемый файл с именем foobar, я вижу его при выполнении команды ls, но когда я ввожу foobar в командной строке, система сообщает, что такого файла нет. Почему он не может его найти?
+
+В отличие от MS-DOS(R), UNIX(R) не ищет в текущем каталоге, когда пытается определить, какую программу нужно запустить, если вы явно не укажете это. Введите `./foobar`, что означает "запустить файл с именем [.filename]#foobar# в текущем каталоге."
+
+=== Я назвал свой исполняемый файл test, но при запуске ничего не происходит. В чем дело?
+
+Большинство UNIX(R) систем имеют программу под названием `test` в [.filename]#/usr/bin#, и оболочка выбирает её, прежде чем проверить текущий каталог. Введите следующее:
+
+[source, bash]
+....
+% ./test
+....
+
+или выберите более подходящее название для вашей программы!
+
+==== Я скомпилировал свою программу, и сначала она работала нормально, но потом произошла ошибка, и было сообщение о core dumped. Что это значит?
+
+Название _core dump_ восходит к самым ранним дням UNIX(R), когда машины использовали ферритовую память для хранения данных. По сути, если программа завершалась сбоем при определённых условиях, система записывала содержимое ферритовой памяти на диск в файл с именем [.filename]#core#, который программист затем мог изучить, чтобы выяснить причину ошибки.
+
+==== Увлекательный материал, но что мне теперь делать?
+
+Используйте отладчик для анализа образа памяти (см. crossref:tools[debugging, Отладка]).
+
+==== Когда моя программа сбросила core, она сообщила что-то о segmentation fault. Что это?
+
+Это означает, что ваша программа попыталась выполнить какую-то недопустимую операцию с памятью; UNIX(R) разработана для защиты операционной системы и других программ от некорректно работающих программ.
+
+Распространенные причины этого:
+
+* Попытка записи в NULL-указатель, например:
++
+[.programlisting]
+....
+char *foo = NULL;
+strcpy(foo, "bang!");
+....
+
+* Использование неинициализированного указателя, например:
++
+[.programlisting]
+....
+char *foo;
+strcpy(foo, "bang!");
+....
++
+Указатель будет иметь случайное значение, которое, возможно, укажет на область памяти, недоступную вашей программе, и ядро завершит вашу программу до того, как она сможет нанести какой-либо ущерб. Если вам не повезет, он укажет внутрь вашей собственной программы и повредит одну из структур данных, что приведет к загадочному сбою программы.
+* Попытка доступа за пределы массива, например
++
+[.programlisting]
+....
+int bar[20];
+bar[27] = 6;
+....
+
+* Попытка сохранить что-то в память только для чтения, например
++
+[.programlisting]
+....
+char *foo = "My string";
+strcpy(foo, "bang!");
+....
++
+Версии UNIX(R) компиляторы часто помещают строковые литералы, такие как `"Моя строка"`, в области памяти только для чтения.
+* Выполнение нежелательных действий с `malloc()` и `free()`, например
++
+[.programlisting]
+....
+char bar[80];
+free(bar);
+....
++
+или
++
+[.programlisting]
+....
+char *foo = malloc(27);
+free(foo);
+free(foo);
+....
+
+Совершение одной из этих ошибок не всегда приведет к сбою, но это всегда плохая практика. Некоторые системы и компиляторы более терпимы, чем другие, поэтому программы, которые хорошо работают на одной системе, могут аварийно завершаться при попытке запустить их на другой.
+
+==== Иногда при получении дампа памяти я вижу сообщение ошибки шины (bus error). В моей книге по UNIX(R) сказано, что это означает аппаратную проблему, но компьютер продолжает работать. Это правда?
+
+Нет, к счастью, нет (если, конечно, у вас действительно нет аппаратной проблемы...). Обычно это означает, что вы обратились к памяти способом, который не следует использовать.
+
+==== Этот процесс создания дампа памяти звучит довольно полезно, если я могу запускать его по своему желанию. Могу ли я это сделать, или нужно ждать возникновения ошибки?
+
+Можете. Просто перейдите на другую консоль или xterm, выполните
+
+[source, bash]
+....
+% ps
+....
+
+чтобы узнать идентификатор процесса вашей программы и выполните
+
+[source, bash]
+....
+% kill -ABRT pid
+....
+
+где `_pid_` — идентификатор процесса, который вы нашли.
+
+Это полезно, если ваша программа зависла в бесконечном цикле, например. Если ваша программа перехватывает SIGABRT, есть несколько других сигналов, которые оказывают аналогичный эффект.
+
+В качестве альтернативы, вы можете создать дамп памяти изнутри вашей программы, вызвав функцию `abort()`. Дополнительную информацию можно найти на man:abort[3].
+
+Если вы хотите создать дамп памяти извне вашей программы, но не хотите завершать процесс, вы можете использовать программу `gcore`. Подробнее см. на странице руководства man:gcore[1].
+
+[[tools-make]]
+== Make
+
+=== Что такое `make`?
+
+Когда вы работаете над простой программой с одним или двумя исходными файлами, вводя
+
+[source, bash]
+....
+% cc file1.c file2.c
+....
+
+это не слишком плохо, но быстро становится очень утомительным, когда есть несколько файлов — и компиляция тоже может занять время.
+
+Один из способов обойти это — использовать объектные файлы и перекомпилировать исходный файл только в случае изменения исходного кода. Таким образом, у нас может получиться что-то вроде:
+
+[source, bash]
+....
+% cc file1.o file2.o … file37.c …
+....
+
+если бы мы изменили файл [.filename]#file37.c#, но не трогали остальные с момента последней компиляции. Это может значительно ускорить компиляцию, но не решает проблему с вводом.
+
+Или мы могли бы написать shell-скрипт для решения проблемы с вводом, но тогда пришлось бы перекомпилировать всё, что сделало бы его очень неэффективным для крупного проекта.
+
+Что произойдет, если у нас есть сотни исходных файлов? Что, если мы работаем в команде с другими людьми, которые забывают сообщить нам, когда они изменили один из своих исходных файлов, которые мы используем?
+
+Возможно, мы могли бы объединить два решения и написать что-то вроде shell-скрипта, который содержал бы какое-то волшебное правило, указывающее, когда исходный файл нужно компилировать. Теперь нам осталось только найти программу, которая сможет понимать эти правила, так как для shell это немного слишком сложно.
+
+Эта программа называется `make`. Она читает файл, называемый _makefile_, который указывает, как различные файлы зависят друг от друга, и определяет, какие файлы нужно перекомпилировать, а какие нет. Например, правило может звучать так: «если [.filename]#fromboz.o# старше, чем [.filename]#fromboz.c#, значит, кто-то изменил [.filename]#fromboz.c#, и его нужно перекомпилировать». В makefile также содержатся правила, указывающие make, _как_ именно перекомпилировать исходный файл, что делает эту программу гораздо более мощным инструментом.
+
+Файлы Makefile обычно хранятся в том же каталоге, что и исходный код, к которому они применяются, и могут называться [.filename]#makefile#, [.filename]#Makefile# или [.filename]#MAKEFILE#. Большинство программистов используют имя [.filename]#Makefile#, так как это помещает его в начало списка файлов в каталоге, где его легко заметить.footnote:[Они не используют форму MAKEFILE, так как заглавные буквы часто применяются для файлов документации, таких как README.]
+
+=== Пример использования `make`
+
+Вот очень простой файл для make:
+
+[.programlisting]
+....
+foo: foo.c
+ cc -o foo foo.c
+....
+
+Он состоит из двух строк: строки зависимости и строки создания.
+
+Строка зависимости здесь состоит из имени программы (известного как _цель_), за которым следует двоеточие, пробел и имя исходного файла. Когда `make` читает эту строку, он проверяет, существует ли файл [.filename]#foo#; если он существует, программа сравнивает время последнего изменения файла [.filename]#foo# с временем последнего изменения файла [.filename]#foo.c#. Если файл [.filename]#foo# не существует или старше файла [.filename]#foo.c#, программа смотрит на строку создания, чтобы выяснить, что делать. Другими словами, это правило для определения, когда файл [.filename]#foo.c# нужно перекомпилировать.
+
+Строка создания начинается с табуляции (нажмите kbd:[tab]), а затем следует команда, которую вы бы ввели для создания [.filename]#foo#, если бы делали это в командной строке. Если [.filename]#foo# устарел или не существует, `make` выполняет эту команду для его создания. Другими словами, это правило, которое сообщает make, как перекомпилировать [.filename]#foo.c#.
+
+Таким образом, при вводе команды `make` система обеспечит актуальность файла [.filename]#foo# относительно последних изменений в [.filename]#foo.c#. Этот принцип можно распространить на [.filename]#Makefile#, содержащие сотни целей — фактически, в FreeBSD можно собрать всю операционную систему, просто введя `make buildworld buildkernel` в корневом каталоге дерева исходных кодов (src).
+
+Еще одно полезное свойство makefile заключается в том, что цели не обязательно должны быть программами. Например, у нас может быть makefile, который выглядит так:
+
+[.programlisting]
+....
+foo: foo.c
+ cc -o foo foo.c
+
+install:
+ cp foo /home/me
+....
+
+Мы можем указать make, какую цель мы хотим собрать, набрав:
+
+[source, bash]
+....
+% make target
+....
+
+`make` будет рассматривать только указанную цель и игнорировать все остальные. Например, если мы введём `make foo` с указанным выше makefile, make проигнорирует цель `install`.
+
+Если мы просто введем `make` без параметров, make всегда будет обращаться к первой цели и затем остановится, не рассматривая остальные. Поэтому если мы введем `make` здесь, он просто перейдет к цели `foo`, перекомпилирует [.filename]#foo# при необходимости и затем остановится, не переходя к цели `install`.
+
+Обратите внимание, что цель `install` не зависит ни от чего! Это означает, что команда в следующей строке всегда выполняется при попытке создать эту цель с помощью команды `make install`. В данном случае она скопирует [.filename]#foo# в домашний каталог пользователя. Это часто используется в makefile приложений, чтобы приложение можно было установить в правильный каталог после успешной компиляции.
+
+Это немного запутанная тема для объяснения. Если вы не до конца понимаете, как работает `make`, лучше всего написать простую программу, например, "hello world", и make-файл, как указано выше, и поэкспериментировать. Затем можно перейти к использованию нескольких исходных файлов или добавлению заголовочного файла в исходный код. В этом случае очень полезен `touch` — он изменяет дату файла без необходимости его редактирования.
+
+=== make и include-файлы
+
+Код на C часто начинается со списка подключаемых файлов, например stdio.h. Некоторые из этих файлов являются системными, а некоторые принадлежат текущему проекту:
+
+[.programlisting]
+....
+#include <stdio.h>
+#include "foo.h"
+
+int main(....
+....
+
+Чтобы убедиться, что этот файл перекомпилируется при изменении [.filename]#foo.h#, необходимо добавить его в [.filename]#Makefile#:
+
+[.programlisting]
+....
+foo: foo.c foo.h
+....
+
+В момент, когда ваш проект становится больше и у вас появляется все больше собственных включаемых файлов для поддержки, отслеживание всех включаемых файлов и файлов, которые от них зависят, становится проблемой. Если вы измените включаемый файл, но забудете перекомпилировать все файлы, которые от него зависят, последствия будут катастрофическими. У `clang` есть опция для анализа ваших файлов и создания списка включаемых файлов и их зависимостей: `-MM`.
+
+Если вы добавите это в ваш Makefile:
+
+[.programlisting]
+....
+depend:
+ cc -E -MM *.c > .depend
+....
+
+и выполните `make depend`, появится файл [.filename]#.depend# со списком объектных файлов, C-файлов и включаемых файлов:
+
+[.programlisting]
+....
+foo.o: foo.c foo.h
+....
+
+Если вы измените файл [.filename]#foo.h#, при следующем запуске `make` все файлы, зависящие от [.filename]#foo.h#, будут перекомпилированы.
+
+Не забудьте выполнить `make depend` каждый раз, когда вы добавляете include-файл в один из своих файлов.
+
+=== Файлы Makefile системы FreeBSD
+
+Makefile-ы могут быть довольно сложными для написания. К счастью, в BSD-системах, таких как FreeBSD, есть очень мощные Makefile-ы, поставляемые в составе системы. Отличным примером этого является система портов FreeBSD. Вот основная часть типичного [.filename]#Makefile# для портов:
+
+[.programlisting]
+....
+MASTER_SITES= ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/
+DISTFILES= scheme-microcode+dist-7.3-freebsd.tgz
+
+.include <bsd.port.mk>
+....
+
+Теперь, если мы перейдем в каталог этого порта и наберем `make`, произойдет следующее:
+
+[.procedure]
+. Проверяется, есть ли исходный код этого порта уже в системе.
+. Если это не так, устанавливается FTP-соединение с URL в MASTER_SITES для загрузки исходного кода.
+. Контрольная сумма исходного кода вычисляется и сравнивается с контрольной суммой известной и хорошей копии исходного кода. Это делается для того, чтобы убедиться, что исходный код не был поврежден во время передачи.
+. Все необходимые изменения для адаптации исходного кода к работе в FreeBSD применяются — это называется применением _патча_.
+. Любая необходимая специальная настройка для исходного кода выполнена. (Многие дистрибутивы программ UNIX(R) пытаются определить, на какой версии UNIX(R) они компилируются и какие дополнительные функции UNIX(R) доступны — именно здесь они получают эту информацию в сценарии портов FreeBSD).
+. Компилируется исходный код программы. По сути, мы переходим в каталог, куда были распакованы исходные файлы, и выполняем `make` — собственный make-файл программы содержит необходимую информацию для сборки программы.
+. Теперь у нас есть скомпилированная версия программы. При желании мы можем протестировать её сейчас; когда мы уверены в программе, можно ввести `make install`. Это приведёт к копированию программы и всех необходимых вспомогательных файлов в нужные места, а также к добавлению записи в `базу данных пакетов`, чтобы позже можно было легко удалить порт, если мы передумаем.
+
+Вот теперь, я думаю, вы согласитесь, что это довольно впечатляюще для скрипта из четырёх строк!
+
+Секрет кроется в последней строке, которая указывает `make` обратиться к системному makefile под названием [.filename]#bsd.port.mk#. Эту строку легко пропустить, но именно здесь начинается вся магия — кто-то написал makefile, который предписывает `make` выполнить все вышеперечисленные действия (плюс несколько других, которые я не упомянул, включая обработку возможных ошибок), и любой может получить доступ к этому функционалу, просто добавив одну строку в свой собственный makefile!
+
+Если вы хотите взглянуть на эти системные makefile-ы, они находятся в [.filename]#/usr/share/mk#, но, вероятно, лучше подождать, пока у вас не появится немного практики с makefile, так как они очень сложные (и если вы всё же решите их посмотреть, убедитесь, что у вас под рукой есть фляга крепкого кофе!)
+
+=== Более сложные способы использования `make`
+
+`Make` — это очень мощный инструмент, способный на гораздо большее, чем показано в простом примере выше. К сожалению, существует несколько различных версий `make`, и все они значительно отличаются друг от друга. Лучший способ узнать, на что они способны, — вероятно, прочитать документацию. Надеюсь, это введение дало вам основу, с которой вы сможете это сделать. В man:make[1] подробно обсуждаются переменные, аргументы и то, как использовать `make`.
+
+Многие приложения в портах используют GNU make, который имеет очень хороший набор страниц "info". Если вы установили любой из этих портов, GNU make будет автоматически установлен как `gmake`. Он также доступен как отдельный порт и пакет.
+
+Для просмотра справочных страниц (info) GNU make вам потребуется отредактировать файл [.filename]#dir# в каталоге [.filename]#/usr/local/info#, добавив соответствующую запись. Добавьте строку
+
+[.programlisting]
+....
+ * Make: (make). The GNU Make utility.
+....
+
+в файл. После этого вы можете ввести `info` и затем выбрать [.guimenuitem]#make# из меню (или в Emacs выполнить `C-h i`).
+
+[[debugging]]
+== Отладка
+
+=== Обзор отладчиков, поставляемых в системе
+
+Использование отладчика позволяет запускать программу в более контролируемых условиях. Обычно можно выполнять программу построчно, проверять значения переменных, изменять их, указывать отладчику выполнение до определённой точки и затем останавливаться и так далее. Также можно подключиться к уже работающей программе или загрузить core-файл, чтобы исследовать причину аварийного завершения программы.
+
+Этот раздел представляет собой краткое введение в использование отладчиков и не затрагивает специализированные темы, такие как отладка ядра. Для получения дополнительной информации по этой теме обратитесь к главе crossref:kerneldebug[kerneldebug,Отладка ядра].
+
+Стандартный отладчик, поставляемый с FreeBSD, называется `lldb` (LLVM debugger). Поскольку он является частью стандартной установки для данного выпуска, нет необходимости выполнять какие-либо дополнительные действия для его использования. Он обладает хорошей справкой по командам, доступной через команду `help`, а также https://lldb.llvm.org/[руководством и документацией в интернете].
+
+[NOTE]
+====
+Команда `lldb` также доступна extref:{handbook}ports/[из портов или пакетов, ports-using] как пакет package:devel/llvm[].
+====
+
+Другой отладчик, доступный в FreeBSD, называется `gdb` (GNU debugger). В отличие от lldb, он не устанавливается по умолчанию в FreeBSD; для его использования необходимо extref:{handbook}#ports-using/[установить] пакет package:devel/gdb[] из портов или пакетов. Он обладает отличной встроенной справкой, а также набором info-страниц.
+
+Два отладчика обладают схожим набором функций, поэтому выбор между ними в основном зависит от личных предпочтений. Если вы знакомы только с одним из них, используйте его. Тем, кто не знаком ни с одним или знаком с обоими, но хочет использовать отладчик внутри Emacs, придётся выбрать `gdb`, так как `lldb` не поддерживается Emacs. В остальных случаях попробуйте оба и решите, какой вам больше нравится.
+
+=== Использование lldb
+
+==== Запуск lldb
+
+Запустите lldb, набрав
+
+[source, bash]
+....
+% lldb -- progname
+....
+
+==== Запуск программы с lldb
+
+Скомпилируйте программу с `-g`, чтобы максимально использовать возможности `lldb`. Без этого флаг она будет работать, но отображать только имя текущей выполняемой функции вместо исходного кода. Если отображается строка вида:
+
+[source, bash]
+....
+Breakpoint 1: where = temp`main, address = …
+....
+
+(без указания имени файла исходного кода и номера строки) при установке точки останова это означает, что программа не была скомпилирована с параметром `-g`.
+
+[TIP]
+====
+Большинство команд `lldb` имеют более короткие формы, которые можно использовать вместо полных. Здесь используются полные формы для ясности.
+====
+
+На строке `lldb` введите `breakpoint set -n main`. Это укажет отладчику не показывать предварительный код настройки в запускаемой программе и остановить выполнение в начале кода программы. Теперь введите `process launch`, чтобы фактически запустить программу — она начнётся с кода настройки, а затем будет остановлена отладчиком при вызове `main()`.
+
+Для пошагового выполнения программы строка за строкой введите `thread step-over`. Когда программа дойдёт до вызова функции, войдите в неё, набрав `thread step-in`. Оказавшись внутри вызова функции, вернитесь из него с помощью команды `thread step-out` или используйте `up` и `down`, чтобы быстро посмотреть на вызывающий код.
+
+Вот простой пример того, как найти ошибку в программе с помощью `lldb`. Это наша программа (с умышленной ошибкой):
+
+[.programlisting]
+....
+#include <stdio.h>
+
+int bazz(int anint);
+
+main() {
+ int i;
+
+ printf("This is my program\n");
+ bazz(i);
+ return 0;
+}
+
+int bazz(int anint) {
+ printf("You gave me %d\n", anint);
+ return anint;
+}
+....
+
+Эта программа устанавливает значение `i` равным `5` и передает его в функцию `bazz()`, которая выводит переданное число.
+
+Компиляция и запуск программы отображают
+
+[source, bash]
+....
+% cc -g -o temp temp.c
+% ./temp
+This is my program
+anint = -5360
+....
+
+Это не то, что ожидалось! Пора разобраться, что происходит!
+
+[source, bash]
+....
+% lldb -- temp
+(lldb) target create "temp"
+Current executable set to 'temp' (x86_64).
+(lldb) breakpoint set -n main Skip the set-up code
+Breakpoint 1: where = temp`main + 15 at temp.c:8:2, address = 0x00000000002012ef lldb puts breakpoint at main()
+(lldb) process launch Run as far as main()
+Process 9992 launching
+Process 9992 launched: '/home/pauamma/tmp/temp' (x86_64) Program starts running
+
+Process 9992 stopped
+* thread #1, name = 'temp', stop reason = breakpoint 1.1 lldb stops at main()
+ frame #0: 0x00000000002012ef temp`main at temp.c:8:2
+ 5 main() {
+ 6 int i;
+ 7
+-> 8 printf("This is my program\n"); Indicates the line where it stopped
+ 9 bazz(i);
+ 10 return 0;
+ 11 }
+(lldb) thread step-over Go to next line
+This is my program Program prints out
+Process 9992 stopped
+* thread #1, name = 'temp', stop reason = step over
+ frame #0: 0x0000000000201300 temp`main at temp.c:9:7
+ 6 int i;
+ 7
+ 8 printf("This is my program\n");
+-> 9 bazz(i);
+ 10 return 0;
+ 11 }
+ 12
+(lldb) thread step-in step into bazz()
+Process 9992 stopped
+* thread #1, name = 'temp', stop reason = step in
+ frame #0: 0x000000000020132b temp`bazz(anint=-5360) at temp.c:14:29 lldb displays stack frame
+ 11 }
+ 12
+ 13 int bazz(int anint) {
+-> 14 printf("You gave me %d\n", anint);
+ 15 return anint;
+ 16 }
+(lldb)
+....
+
+Подождите минуту! Как переменная `int` стала равна `-5360`? Разве она не была установлена в `5` в `main()`? Давайте поднимемся к `main()` и посмотрим.
+
+[source, bash]
+....
+(lldb) up Move up call stack
+frame #1: 0x000000000020130b temp`main at temp.c:9:2 lldb displays stack frame
+ 6 int i;
+ 7
+ 8 printf("This is my program\n");
+-> 9 bazz(i);
+ 10 return 0;
+ 11 }
+ 12
+(lldb) frame variable i Show us the value of i
+(int) i = -5360 lldb displays -5360
+....
+
+О боже! Глядя на код, мы забыли инициализировать i. Мы хотели добавить
+
+[.programlisting]
+....
+...
+main() {
+ int i;
+
+ i = 5;
+ printf("This is my program\n");
+...
+....
+
+но мы пропустили строку `i=5;`. Поскольку мы не инициализировали `i`, она содержала любое число, которое оказалось в той области памяти при запуске программы, и в данном случае это оказалось `-5360`.
+
+[NOTE]
+====
+Команда `lldb` отображает стек вызовов каждый раз, когда мы входим в функцию или выходим из неё, даже если мы используем `up` и `down` для перемещения по стеку вызовов. Это показывает имя функции и значения её аргументов, что помогает отслеживать текущее положение и происходящее. (Стек — это область хранения, где программа сохраняет информацию об аргументах, переданных в функции, и о том, куда возвращаться после вызова функции.)
+====
+
+==== Изучение файла Core с помощью lldb
+
+Файл core — это, по сути, файл, содержащий полное состояние процесса на момент его аварийного завершения. В «старые добрые времена» программистам приходилось распечатывать шестнадцатеричные дампы файлов core и корпеть над руководствами по машинному коду, но сейчас жизнь стала немного проще. Кстати, в FreeBSD и других системах на базе 4.4BSD файл core называется [.filename]#progname.core#, а не просто [.filename]#core#, чтобы было понятнее, какой программе он принадлежит.
+
+Для анализа файла core укажите имя файла core в дополнение к самой программе. Вместо обычного запуска `lldb` введите `lldb -c _имя_программы_.core \-- _имя_программы_`.
+
+Отладчик отобразит что-то вроде этого:
+
+[source, bash, subs="verbatim,quotes"]
+....
+% lldb -c [.filename]#progname.core# -- [.filename]#progname#
+(lldb) target create "[.filename]#progname#" --core "[.filename]#progname#.core"
+Core file '/home/pauamma/tmp/[.filename]#progname.core#' (x86_64) was loaded.
+(lldb)
+....
+
+В этом случае программа называлась [.filename]#progname#, поэтому файл дампа имеет имя [.filename]#progname.core#. Отладчик не показывает, почему программа завершилась аварийно или где это произошло. Для этого используйте команду `thread backtrace all`. Она также покажет, как была вызвана функция, в которой программа завершилась дампом ядра.
+
+[source, bash, subs="verbatim,quotes"]
+....
+(lldb) thread backtrace all
+* thread #1, name = 'progname', stop reason = signal SIGSEGV
+ * frame #0: 0x0000000000201347 progname`bazz(anint=5) at temp2.c:17:10
+ frame #1: 0x0000000000201312 progname`main at temp2.c:10:2
+ frame #2: 0x000000000020110f progname`_start(ap=<unavailable>, cleanup=<unavailable>) at crt1.c:76:7
+(lldb)
+....
+
+`SIGSEGV` указывает, что программа пыталась получить доступ к памяти (обычно выполнить код или прочитать/записать данные) по адресу, который ей не принадлежит, но не предоставляет конкретных деталей. Для этого обратитесь к исходному коду на строке 10 файла temp2.c, в функции `bazz()`. Трассировка также показывает, что в данном случае `bazz()` была вызвана из `main()`.
+
+==== Подключение к работающей программе с помощью lldb
+
+Одной из самых замечательных особенностей `lldb` является возможность подключения к уже работающей программе. Конечно, для этого требуются соответствующие разрешения. Распространённая проблема — пошаговое выполнение программы, которая создаёт ответвления, с необходимостью отслеживать дочерний процесс, но отладчик отслеживает только родительский.
+
+Для этого запустите другой `lldb`, используйте `ps` для поиска идентификатора процесса дочернего процесса и выполните
+
+[source, bash]
+....
+(lldb) process attach -p pid
+....
+
+в `lldb`, а затем отлаживайте как обычно.
+
+Для того чтобы это работало правильно, код, который вызывает `fork` для создания дочернего процесса, должен делать что-то вроде следующего (предоставлено из документации `gdb`):
+
+[.programlisting]
+....
+...
+if ((pid = fork()) < 0) /* _Always_ check this */
+ error();
+else if (pid == 0) { /* child */
+ int PauseMode = 1;
+
+ while (PauseMode)
+ sleep(10); /* Wait until someone attaches to us */
+ ...
+} else { /* parent */
+ ...
+....
+
+Вот все, что нужно сделать: подключиться к дочернему процессу, установить `PauseMode` в `0` с помощью `expr PauseMode = 0` и дождаться возврата из вызова `sleep()`.
+
+=== Удаленная отладка с использованием LLDB
+
+[NOTE]
+====
+Описанная функциональность доступна начиная с версии LLDB 12.0.0. Пользователи релизов FreeBSD, содержащих более раннюю версию LLDB, могут воспользоваться снимком из extref:{handbook}[портов или пакетов, ports-using], как package:devel/llvm-devel[].
+====
+
+Начиная с LLDB 12.0.0, удалённая отладка поддерживается в FreeBSD. Это означает, что `lldb-server` может быть запущен для отладки программы на одном узле, в то время как интерактивный клиент `lldb` подключается к нему с другого.
+
+Чтобы запустить новый процесс для удалённой отладки, выполните `lldb-server` на удалённом сервере, набрав
+
+[source, bash]
+....
+% lldb-server g host:port -- progname
+....
+
+Процесс будет остановлен сразу после запуска, и `lldb-server` будет ожидать подключения клиента.
+
+Запустите `lldb` локально и введите следующую команду для подключения к удалённому серверу:
+
+[source, bash]
+....
+(lldb) gdb-remote host:port
+....
+
+`lldb-server` также может присоединиться к работающему процессу. Для этого введите следующее на удалённом сервере:
+
+[source, bash]
+....
+% lldb-server g host:port --attach pid-or-name
+....
+
+=== Использование gdb
+
+==== Запуск gdb
+
+Запустите gdb, набрав
+
+[source, bash]
+....
+% gdb progname
+....
+
+хотя многие предпочитают запускать его внутри Emacs. Для этого введите:
+
+[source, bash]
+....
+ M-x gdb RET progname RET
+....
+
+Наконец, для тех, кого отпугивает текстовый интерфейс командной строки, существует графический интерфейс (package:devel/xxgdb[]) в Коллекции портов.
+
+==== Запуск программы под отладчиком gdb
+
+Скомпилируйте программу с `-g`, чтобы максимально использовать возможности `gdb`. Она будет работать и без этого, но отобразит только имя текущей выполняемой функции вместо исходного кода. Строка вида:
+
+[source, bash]
+....
+... (no debugging symbols found) ...
+....
+
+когда `gdb` запускается, это означает, что программа не была скомпилирована с опцией `-g`.
+
+На приглашении `gdb` введите `break main`. Это укажет отладчику пропустить предварительный код настройки в выполняемой программе и остановить выполнение в начале кода программы. Теперь введите `run`, чтобы запустить программу — она начнётся с начала кода настройки, а затем будет остановлена отладчиком при вызове `main()`.
+
+Для пошагового выполнения программы нажимайте `n`. При вызове функции войдите в неё, нажав `s`. Оказавшись внутри функции, вернитесь из неё, нажав `f`, или используйте `up` и `down` для быстрого просмотра вызывающего кода.
+
+Вот простой пример того, как найти ошибку в программе с помощью `gdb`. Это наша программа (с умышленной ошибкой):
+
+[.programlisting]
+....
+#include <stdio.h>
+
+int bazz(int anint);
+
+main() {
+ int i;
+
+ printf("This is my program\n");
+ bazz(i);
+ return 0;
+}
+
+int bazz(int anint) {
+ printf("You gave me %d\n", anint);
+ return anint;
+}
+....
+
+Эта программа устанавливает значение `i` равным `5` и передает его в функцию `bazz()`, которая выводит переданное число.
+
+Компиляция и запуск программы отображают
+
+[source, bash]
+....
+% cc -g -o temp temp.c
+% ./temp
+This is my program
+anint = 4231
+....
+
+Это было не то, что мы ожидали! Пора разобраться, что происходит!
+
+[source, bash]
+....
+% gdb temp
+GDB is free software and you are welcome to distribute copies of it
+ under certain conditions; type "show copying" to see the conditions.
+There is absolutely no warranty for GDB; type "show warranty" for details.
+GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
+(gdb) break main Skip the set-up code
+Breakpoint 1 at 0x160f: file temp.c, line 9. gdb puts breakpoint at main()
+(gdb) run Run as far as main()
+Starting program: /home/james/tmp/temp Program starts running
+
+Breakpoint 1, main () at temp.c:9 gdb stops at main()
+(gdb) n Go to next line
+This is my program Program prints out
+(gdb) s step into bazz()
+bazz (anint=4231) at temp.c:17 gdb displays stack frame
+(gdb)
+....
+
+Подождите минуту! Как `int` стал равен `4231`? Разве он не был установлен в `5` в `main()`? Давайте поднимемся к `main()` и посмотрим.
+
+[source, bash]
+....
+(gdb) up Move up call stack
+#1 0x1625 in main () at temp.c:11 gdb displays stack frame
+(gdb) p i Show us the value of i
+$1 = 4231 gdb displays 4231
+....
+
+О боже! Глядя на код, мы забыли инициализировать i. Мы хотели добавить
+
+[.programlisting]
+....
+...
+main() {
+ int i;
+
+ i = 5;
+ printf("This is my program\n");
+...
+....
+
+но мы пропустили строку `i=5;`. Поскольку мы не инициализировали `i`, она содержала любое число, которое оказалось в той области памяти при запуске программы, и в данном случае это оказалось `4231`.
+
+[NOTE]
+====
+Команда `gdb` отображает стек вызовов каждый раз при входе в функцию или выходе из неё, даже при использовании `up` и `down` для перемещения по стеку вызовов. Это показывает имя функции и значения её аргументов, что помогает отслеживать текущее положение и происходящее. (Стек — это область хранения, где программа сохраняет информацию об аргументах, переданных в функции, и о месте, куда нужно вернуться после вызова функции.)
+====
+
+==== Изучение файла core с помощью gdb
+
+Файл core — это, по сути, файл, содержащий полное состояние процесса на момент его аварийного завершения. В «старые добрые времена» программистам приходилось распечатывать шестнадцатеричные дампы файлов core и корпеть над руководствами по машинному коду, но сейчас жизнь стала немного проще. Кстати, в FreeBSD и других системах на базе 4.4BSD файл core называется [.filename]#progname.core#, а не просто [.filename]#core#, чтобы было понятнее, какой программе он принадлежит.
+
+Для анализа файла core запустите `gdb` обычным способом. Вместо ввода команд `break` или `run` введите
+
+[source, bash]
+....
+(gdb) core progname.core
+....
+
+Если файл core отсутствует в текущем каталоге, сначала введите `dir /путь/к/core/файлу`.
+
+Отладчик должен отобразить что-то вроде этого:
+
+[source, bash, subs="verbatim,quotes"]
+....
+% gdb [.filename]#progname#
+GDB is free software and you are welcome to distribute copies of it
+ under certain conditions; type "show copying" to see the conditions.
+There is absolutely no warranty for GDB; type "show warranty" for details.
+GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.
+(gdb) core [.filename]#progname.core#
+Core was generated by `[.filename]#progname#'.
+Program terminated with signal 11, Segmentation fault.
+Cannot access memory at address 0x7020796d.
+#0 0x164a in bazz (anint=0x5) at temp.c:17
+(gdb)
+....
+
+В этом случае программа называлась [.filename]#progname#, поэтому файл дампа памяти называется [.filename]#progname.core#. Мы видим, что программа завершилась аварийно из-за попытки доступа к области памяти, которая ей не доступна, в функции `bazz`.
+
+Иногда полезно увидеть, как была вызвана функция, поскольку проблема могла возникнуть гораздо выше по стеку вызовов в сложной программе. `bt` заставляет `gdb` вывести трассировку стека вызовов:
+
+[source, bash]
+....
+(gdb) bt
+#0 0x164a in bazz (anint=0x5) at temp.c:17
+#1 0xefbfd888 in end ()
+#2 0x162c in main () at temp.c:11
+(gdb)
+....
+
+Функция `end()` вызывается при аварийном завершении программы; в данном случае функция `bazz()` была вызвана из `main()`.
+
+==== Подключение к работающей программе с помощью gdb
+
+Одной из самых удобных функций `gdb` является возможность подключения к уже запущенной программе. Конечно, для этого требуются соответствующие разрешения. Частой проблемой является пошаговое выполнение программы, которая создает дочерний процесс, когда нужно отслеживать дочерний процесс, но отладчик продолжает отслеживать только родительский.
+
+Для этого запустите другой `gdb`, используйте `ps` для поиска идентификатора процесса дочернего элемента и выполните
+
+[source, bash]
+....
+(gdb) attach pid
+....
+
+в `gdb`, а затем отлаживайте как обычно.
+
+Для того чтобы это работало правильно, код, который вызывает `fork` для создания дочернего процесса, должен делать что-то вроде следующего (предоставлено из документации `gdb`):
+
+[.programlisting]
+....
+...
+if ((pid = fork()) < 0) /* _Always_ check this */
+ error();
+else if (pid == 0) { /* child */
+ int PauseMode = 1;
+
+ while (PauseMode)
+ sleep(10); /* Wait until someone attaches to us */
+ ...
+} else { /* parent */
+ ...
+....
+
+Теперь осталось только подключиться к дочернему процессу, установить PauseMode в `0` и дождаться возврата из вызова `sleep()`!
+
+[[emacs]]
+== Использование Emacs в качестве среды разработки
+
+=== Emacs
+
+Emacs — это высоконастраиваемый редактор — настолько, что его можно скорее назвать операционной системой, чем редактором! Многие разработчики и системные администраторы действительно проводят практически всё своё время, работая внутри Emacs, выходя из него только для завершения сеанса.
+
+Невозможно даже кратко описать все, что может делать Emacs, но вот некоторые особенности, которые могут быть интересны разработчикам:
+
+* Очень мощный редактор, позволяющий выполнять поиск и замену как строк, так и регулярных выражений (шаблонов), переход к началу/концу блока выражения и многое другое.
+* Выпадающие меню и встроенная справка.
+* Подсветка синтаксиса и форматирование отступов в зависимости от языка.
+* Полностью настраиваемый.
+* Вы можете компилировать и отлаживать программы из Emacs.
+* При ошибке компиляции можно перейти к проблемной строке исходного кода.
+* Дружелюбный интерфейс для программы `info`, используемой для чтения гипертекстовой документации GNU, включая документацию по самому Emacs.
+* Дружелюбный интерфейс для `gdb`, позволяющий просматривать исходный код во время пошагового выполнения программы.
+
+И, несомненно, множество других, которые были упущены из виду.
+
+Emacs можно установить на FreeBSD с помощью пакета package:editors/emacs[].
+
+После установки запустите его и выполните `C-h t`, чтобы прочитать руководство по Emacs — это означает, что нужно удерживать kbd:[control], нажать kbd:[h], отпустить kbd:[control], а затем нажать kbd:[t]. (Также можно использовать мышь для выбора [.guimenuitem]#Руководство по Emacs# в меню menu:Help[].)
+
+Хотя в Emacs и есть меню, стоит изучить сочетания клавиш, так как редактировать что-либо с их помощью гораздо быстрее, чем искать мышку и кликать в нужное место. Кроме того, общаясь с опытными пользователями Emacs, вы часто услышите выражения вроде «`M-x replace-s RET foo RET bar RET`» — полезно понимать, что они значат. Да и вообще, в Emacs столько полезных функций, что все они просто не поместятся на панелях меню.
+
+К счастью, освоить сочетания клавиш довольно легко, так как они отображаются рядом с пунктами меню. Мой совет — использовать пункты меню для, скажем, открытия файла, пока вы не разберётесь, как это работает, и не почувствуете себя уверенно, а затем попробуйте выполнить `C-x C-f`. Когда освоитесь с этим, переходите к следующей команде меню.
+
+Если вы не можете вспомнить, что делает определённая комбинация клавиш, выберите [.guimenuitem]#Описание Клавиши# в меню menu:Help[] и введите её — Emacs сообщит, что она делает. Вы также можете использовать пункт меню [.guimenuitem]#Command Apropos#, чтобы найти все команды, содержащие определённое слово, с указанием соответствующих клавишных сочетаний.
+
+Между прочим, выражение выше означает: удерживайте клавишу kbd:[Meta], нажмите kbd:[x], отпустите клавишу kbd:[Meta], введите `replace-s` (сокращение от `replace-string` — ещё одна особенность Emacs в том, что команды можно сокращать), нажмите клавишу kbd:[return], введите `foo` (строка, которую нужно заменить), нажмите клавишу kbd:[return], введите `bar` (строка, на которую нужно заменить `foo`) и снова нажмите kbd:[return]. Emacs выполнит операцию поиска и замены, которую вы только что запросили.
+
+Если вам интересно, что такое kbd:[Meta], то это специальная клавиша, которая есть на многих рабочих станциях UNIX(R). К сожалению, на PC её нет, поэтому обычно используется kbd:[alt] (или, если вам не повезло, kbd:[escape]).
+
+Ах да, чтобы выйти из Emacs, нажмите `C-x C-c` (это значит зажмите клавишу kbd:[control], нажмите kbd:[x], затем kbd:[c] и отпустите kbd:[control]). Если у вас есть несохранённые файлы, Emacs спросит, хотите ли вы их сохранить. (Игнорируйте часть документации, где говорится, что `C-z` — это обычный способ выхода из Emacs — это оставляет Emacs работающим в фоне и полезно только на системах без виртуальных терминалов).
+
+=== Настройка Emacs
+
+Emacs делает много замечательных вещей; некоторые из них встроены, некоторые требуют настройки.
+
+Вместо использования проприетарного языка макросов для конфигурации, Emacs применяет версию Lisp, специально адаптированную для редакторов, известную как Emacs Lisp. Работа с Emacs Lisp может быть весьма полезной, если вы хотите продолжить и изучить что-то вроде Common Lisp. Emacs Lisp обладает многими возможностями Common Lisp, хотя и значительно меньше (и, следовательно, проще для освоения).
+
+Лучший способ изучить Emacs Lisp — это прочитать онлайн-руководство link:https://www.gnu.org/software/emacs/manual/elisp.html[Emacs Reference].
+
+Однако для начала настройки Emacs не обязательно знать Lisp, так как я включил пример файла [.filename]#.emacs#, которого должно быть достаточно для старта. Просто скопируйте его в свой домашний каталог и перезапустите Emacs, если он уже запущен; он прочитает команды из файла и (надеюсь) предоставит вам полезную базовую конфигурацию.
+
+=== Пример файла [.filename]#.emacs#
+
+К сожалению, здесь слишком много информации, чтобы объяснять всё подробно; однако есть один или два момента, которые стоит упомянуть.
+
+* Всё, что начинается с `;`, является комментарием и игнорируется Emacs.
+* В первой строке `-*- Emacs-Lisp -*-` нужен для того, чтобы мы могли редактировать сам файл [.filename]#.emacs# в Emacs и использовать все удобные функции для редактирования Emacs Lisp. Обычно Emacs пытается угадать это по имени файла, но может не сделать это правильно для [.filename]#.emacs#.
+* Клавиша kbd:[tab] связана с функцией отступа в некоторых режимах, поэтому при нажатии клавиши tab текущая строка кода будет с отступом. Если вы хотите вставить символ табуляции в текст, удерживайте клавишу kbd:[control] во время нажатия kbd:[tab].
+* Этот файл поддерживает подсветку синтаксиса для C, C++, Perl, Lisp и Scheme, определяя язык по имени файла.
+* В Emacs уже есть предопределённая функция `next-error`. В окне вывода компиляции это позволяет переходить от одной ошибки компиляции к следующей с помощью `M-n`; мы определяем дополнительную функцию `previous-error`, которая позволяет вернуться к предыдущей ошибке с помощью `M-p`. Самое приятное — сочетание `C-c C-c` откроет исходный файл, в котором произошла ошибка, и перейдёт на соответствующую строку.
+* Включаем возможность Emacs работать как сервер, так что если вы заняты чем-то вне Emacs и хотите отредактировать файл, можно просто ввести
++
+[source, bash]
+....
+% emacsclient filename
+....
++
+и затем вы можете редактировать файл в вашем Emacs!footnote:[Многие пользователи Emacs устанавливают переменную окружения EDITOR в emacsclient, так что это происходит каждый раз, когда им нужно отредактировать файл.]
+
+.Пример файла [.filename]#.emacs#
+====
+[.programlisting]
+....
+;; -*-Emacs-Lisp-*-
+
+;; This file is designed to be re-evaled; use the variable first-time
+;; to avoid any problems with this.
+(defvar first-time t
+ "Flag signifying this is the first time that .emacs has been evaled")
+
+;; Meta
+(global-set-key "\M- " 'set-mark-command)
+(global-set-key "\M-\C-h" 'backward-kill-word)
+(global-set-key "\M-\C-r" 'query-replace)
+(global-set-key "\M-r" 'replace-string)
+(global-set-key "\M-g" 'goto-line)
+(global-set-key "\M-h" 'help-command)
+
+;; Function keys
+(global-set-key [f1] 'manual-entry)
+(global-set-key [f2] 'info)
+(global-set-key [f3] 'repeat-complex-command)
+(global-set-key [f4] 'advertised-undo)
+(global-set-key [f5] 'eval-current-buffer)
+(global-set-key [f6] 'buffer-menu)
+(global-set-key [f7] 'other-window)
+(global-set-key [f8] 'find-file)
+(global-set-key [f9] 'save-buffer)
+(global-set-key [f10] 'next-error)
+(global-set-key [f11] 'compile)
+(global-set-key [f12] 'grep)
+(global-set-key [C-f1] 'compile)
+(global-set-key [C-f2] 'grep)
+(global-set-key [C-f3] 'next-error)
+(global-set-key [C-f4] 'previous-error)
+(global-set-key [C-f5] 'display-faces)
+(global-set-key [C-f8] 'dired)
+(global-set-key [C-f10] 'kill-compilation)
+
+;; Keypad bindings
+(global-set-key [up] "\C-p")
+(global-set-key [down] "\C-n")
+(global-set-key [left] "\C-b")
+(global-set-key [right] "\C-f")
+(global-set-key [home] "\C-a")
+(global-set-key [end] "\C-e")
+(global-set-key [prior] "\M-v")
+(global-set-key [next] "\C-v")
+(global-set-key [C-up] "\M-\C-b")
+(global-set-key [C-down] "\M-\C-f")
+(global-set-key [C-left] "\M-b")
+(global-set-key [C-right] "\M-f")
+(global-set-key [C-home] "\M-<")
+(global-set-key [C-end] "\M->")
+(global-set-key [C-prior] "\M-<")
+(global-set-key [C-next] "\M->")
+
+;; Mouse
+(global-set-key [mouse-3] 'imenu)
+
+;; Misc
+(global-set-key [C-tab] "\C-q\t") ; Control tab quotes a tab.
+(setq backup-by-copying-when-mismatch t)
+
+;; Treat 'y' or <CR> as yes, 'n' as no.
+(fset 'yes-or-no-p 'y-or-n-p)
+(define-key query-replace-map [return] 'act)
+(define-key query-replace-map [?\C-m] 'act)
+
+;; Load packages
+(require 'desktop)
+(require 'tar-mode)
+
+;; Pretty diff mode
+(autoload 'ediff-buffers "ediff" "Intelligent Emacs interface to diff" t)
+(autoload 'ediff-files "ediff" "Intelligent Emacs interface to diff" t)
+(autoload 'ediff-files-remote "ediff"
+ "Intelligent Emacs interface to diff")
+
+(if first-time
+ (setq auto-mode-alist
+ (append '(("\\.cpp$" . c++-mode)
+ ("\\.hpp$" . c++-mode)
+ ("\\.lsp$" . lisp-mode)
+ ("\\.scm$" . scheme-mode)
+ ("\\.pl$" . perl-mode)
+ ) auto-mode-alist)))
+
+;; Auto font lock mode
+(defvar font-lock-auto-mode-list
+ (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)
+ "List of modes to always start in font-lock-mode")
+
+(defvar font-lock-mode-keyword-alist
+ '((c++-c-mode . c-font-lock-keywords)
+ (perl-mode . perl-font-lock-keywords))
+ "Associations between modes and keywords")
+
+(defun font-lock-auto-mode-select ()
+ "Automatically select font-lock-mode if the current major mode is in font-lock-auto-mode-list"
+ (if (memq major-mode font-lock-auto-mode-list)
+ (progn
+ (font-lock-mode t))
+ )
+ )
+
+(global-set-key [M-f1] 'font-lock-fontify-buffer)
+
+;; New dabbrev stuff
+;(require 'new-dabbrev)
+(setq dabbrev-always-check-other-buffers t)
+(setq dabbrev-abbrev-char-regexp "\\sw\\|\\s_")
+(add-hook 'emacs-lisp-mode-hook
+ '(lambda ()
+ (set (make-local-variable 'dabbrev-case-fold-search) nil)
+ (set (make-local-variable 'dabbrev-case-replace) nil)))
+(add-hook 'c-mode-hook
+ '(lambda ()
+ (set (make-local-variable 'dabbrev-case-fold-search) nil)
+ (set (make-local-variable 'dabbrev-case-replace) nil)))
+(add-hook 'text-mode-hook
+ '(lambda ()
+ (set (make-local-variable 'dabbrev-case-fold-search) t)
+ (set (make-local-variable 'dabbrev-case-replace) t)))
+
+;; C++ and C mode...
+(defun my-c++-mode-hook ()
+ (setq tab-width 4)
+ (define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
+ (define-key c++-mode-map "\C-ce" 'c-comment-edit)
+ (setq c++-auto-hungry-initial-state 'none)
+ (setq c++-delete-function 'backward-delete-char)
+ (setq c++-tab-always-indent t)
+ (setq c-indent-level 4)
+ (setq c-continued-statement-offset 4)
+ (setq c++-empty-arglist-indent 4))
+
+(defun my-c-mode-hook ()
+ (setq tab-width 4)
+ (define-key c-mode-map "\C-m" 'reindent-then-newline-and-indent)
+ (define-key c-mode-map "\C-ce" 'c-comment-edit)
+ (setq c-auto-hungry-initial-state 'none)
+ (setq c-delete-function 'backward-delete-char)
+ (setq c-tab-always-indent t)
+;; BSD-ish indentation style
+ (setq c-indent-level 4)
+ (setq c-continued-statement-offset 4)
+ (setq c-brace-offset -4)
+ (setq c-argdecl-indent 0)
+ (setq c-label-offset -4))
+
+;; Perl mode
+(defun my-perl-mode-hook ()
+ (setq tab-width 4)
+ (define-key c++-mode-map "\C-m" 'reindent-then-newline-and-indent)
+ (setq perl-indent-level 4)
+ (setq perl-continued-statement-offset 4))
+
+;; Scheme mode...
+(defun my-scheme-mode-hook ()
+ (define-key scheme-mode-map "\C-m" 'reindent-then-newline-and-indent))
+
+;; Emacs-Lisp mode...
+(defun my-lisp-mode-hook ()
+ (define-key lisp-mode-map "\C-m" 'reindent-then-newline-and-indent)
+ (define-key lisp-mode-map "\C-i" 'lisp-indent-line)
+ (define-key lisp-mode-map "\C-j" 'eval-print-last-sexp))
+
+;; Add all of the hooks...
+(add-hook 'c++-mode-hook 'my-c++-mode-hook)
+(add-hook 'c-mode-hook 'my-c-mode-hook)
+(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)
+(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)
+(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)
+(add-hook 'perl-mode-hook 'my-perl-mode-hook)
+
+;; Complement to next-error
+(defun previous-error (n)
+ "Visit previous compilation error message and corresponding source code."
+ (interactive "p")
+ (next-error (- n)))
+
+;; Misc...
+(transient-mark-mode 1)
+(setq mark-even-if-inactive t)
+(setq visible-bell nil)
+(setq next-line-add-newlines nil)
+(setq compile-command "make")
+(setq suggest-key-bindings nil)
+(put 'eval-expression 'disabled nil)
+(put 'narrow-to-region 'disabled nil)
+(put 'set-goal-column 'disabled nil)
+(if (>= emacs-major-version 21)
+ (setq show-trailing-whitespace t))
+
+;; Elisp archive searching
+(autoload 'format-lisp-code-directory "lispdir" nil t)
+(autoload 'lisp-dir-apropos "lispdir" nil t)
+(autoload 'lisp-dir-retrieve "lispdir" nil t)
+(autoload 'lisp-dir-verify "lispdir" nil t)
+
+;; Font lock mode
+(defun my-make-face (face color &optional bold)
+ "Create a face from a color and optionally make it bold"
+ (make-face face)
+ (copy-face 'default face)
+ (set-face-foreground face color)
+ (if bold (make-face-bold face))
+ )
+
+(if (eq window-system 'x)
+ (progn
+ (my-make-face 'blue "blue")
+ (my-make-face 'red "red")
+ (my-make-face 'green "dark green")
+ (setq font-lock-comment-face 'blue)
+ (setq font-lock-string-face 'bold)
+ (setq font-lock-type-face 'bold)
+ (setq font-lock-keyword-face 'bold)
+ (setq font-lock-function-name-face 'red)
+ (setq font-lock-doc-string-face 'green)
+ (add-hook 'find-file-hooks 'font-lock-auto-mode-select)
+
+ (setq baud-rate 1000000)
+ (global-set-key "\C-cmm" 'menu-bar-mode)
+ (global-set-key "\C-cms" 'scroll-bar-mode)
+ (global-set-key [backspace] 'backward-delete-char)
+ ; (global-set-key [delete] 'delete-char)
+ (standard-display-european t)
+ (load-library "iso-transl")))
+
+;; X11 or PC using direct screen writes
+(if window-system
+ (progn
+ ;; (global-set-key [M-f1] 'hilit-repaint-command)
+ ;; (global-set-key [M-f2] [?\C-u M-f1])
+ (setq hilit-mode-enable-list
+ '(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode
+ scheme-mode)
+ hilit-auto-highlight nil
+ hilit-auto-rehighlight 'visible
+ hilit-inhibit-hooks nil
+ hilit-inhibit-rebinding t)
+ (require 'hilit19)
+ (require 'paren))
+ (setq baud-rate 2400) ; For slow serial connections
+ )
+
+;; TTY type terminal
+(if (and (not window-system)
+ (not (equal system-type 'ms-dos)))
+ (progn
+ (if first-time
+ (progn
+ (keyboard-translate ?\C-h ?\C-?)
+ (keyboard-translate ?\C-? ?\C-h)))))
+
+;; Under UNIX
+(if (not (equal system-type 'ms-dos))
+ (progn
+ (if first-time
+ (server-start))))
+
+;; Add any face changes here
+(add-hook 'term-setup-hook 'my-term-setup-hook)
+(defun my-term-setup-hook ()
+ (if (eq window-system 'pc)
+ (progn
+;; (set-face-background 'default "red")
+ )))
+
+;; Restore the "desktop" - do this as late as possible
+(if first-time
+ (progn
+ (desktop-load-default)
+ (desktop-read)))
+
+;; Indicate that this file has been read at least once
+(setq first-time nil)
+
+;; No need to debug anything now
+
+(setq debug-on-error nil)
+
+;; All done
+(message "All done, %s%s" (user-login-name) ".")
+....
+====
+
+=== Расширение списка языков, понимаемых Emacs
+
+Вот, это все хорошо, если вы хотите программировать только на языках, уже предусмотренных в [.filename]#.emacs# (C, C++, Perl, Lisp и Scheme), но что произойдет, если появится новый язык под названием "whizbang", полный захватывающих возможностей?
+
+Первое, что нужно сделать, — это выяснить, поставляются ли с whizbang какие-либо файлы, сообщающие Emacs о языке. Обычно они заканчиваются на [.filename]#.el#, что означает "Emacs Lisp". Например, если whizbang является портом FreeBSD, мы можем найти эти файлы, выполнив
+
+[source, bash]
+....
+% find /usr/ports/lang/whizbang -name "*.el" -print
+....
+
+и установите их, скопировав в каталог Emacs, где находятся файлы Lisp (site Lisp). В FreeBSD это [.filename]#/usr/local/share/emacs/site-lisp#.
+
+Вот пример, если вывод команды find был
+
+[source, bash]
+....
+/usr/ports/lang/whizbang/work/misc/whizbang.el
+....
+
+мы бы сделали
+
+[source, bash]
+....
+# cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/share/emacs/site-lisp
+....
+
+Далее нам нужно решить, какое расширение имеют исходные файлы whizbang. Допустим, для примера, что все они заканчиваются на [.filename]#.wiz#. Нам необходимо добавить запись в наш [.filename]#.emacs#, чтобы убедиться, что Emacs сможет использовать информацию из [.filename]#whizbang.el#.
+
+Найдите запись auto-mode-alist в файле [.filename]#.emacs# и добавьте строку для whizbang, например:
+
+[.programlisting]
+....
+...
+("\\.lsp$" . lisp-mode)
+("\\.wiz$" . whizbang-mode)
+("\\.scm$" . scheme-mode)
+...
+....
+
+Это означает, что Emacs автоматически перейдёт в режим `whizbang-mode` при редактировании файла с расширением [.filename]#.wiz#.
+
+Непосредственно ниже вы найдете запись font-lock-auto-mode-list. Добавьте `whizbang-mode` в нее следующим образом:
+
+[.programlisting]
+....
+;; Auto font lock mode
+(defvar font-lock-auto-mode-list
+ (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)
+ "List of modes to always start in font-lock-mode")
+....
+
+Это означает, что Emacs всегда будет включать `font-lock-mode` (т.е. подсветку синтаксиса) при редактировании файла [.filename]#.wiz#.
+
+И это всё, что требуется. Если вам нужно, чтобы что-то ещё выполнялось автоматически при открытии [.filename]#.wiz#, вы можете добавить `whizbang-mode hook` (см. `my-scheme-mode-hook` для простого примера, который добавляет `auto-indent`).
+
+[[tools-reading]]
+== Для дальнейшего ознакомления
+
+Для получения информации о настройке среды разработки для внесения исправлений в саму FreeBSD см. man:development[7].
+
+* Brian Harvey and Matthew Wright _Simply Scheme_ MIT 1994. ISBN 0-262-08226-8
+* Randall Schwartz _Learning Perl_ O'Reilly 1993 ISBN 1-56592-042-2
+* Patrick Henry Winston and Berthold Klaus Paul Horn _Lisp (3rd Edition)_ Addison-Wesley 1989 ISBN 0-201-08319-1
+* Brian W. Kernighan and Rob Pike _The Unix Programming Environment_ Prentice-Hall 1984 ISBN 0-13-937681-X
+* Brian W. Kernighan and Dennis M. Ritchie _The C Programming Language (2nd Edition)_ Prentice-Hall 1988 ISBN 0-13-110362-8
+* Bjarne Stroustrup _The C++ Programming Language_ Addison-Wesley 1991 ISBN 0-201-53992-6
+* W. Richard Stevens _Advanced Programming in the Unix Environment_ Addison-Wesley 1992 ISBN 0-201-56317-7
+* W. Richard Stevens _Unix Network Programming_ Prentice-Hall 1990 ISBN 0-13-949876-1
diff --git a/documentation/content/ru/books/developers-handbook/tools/_index.po b/documentation/content/ru/books/developers-handbook/tools/_index.po
new file mode 100644
index 0000000000..47c68c25ff
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/tools/_index.po
@@ -0,0 +1,4483 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-07-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbooktools_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:17
+#, no-wrap
+msgid "Programming Tools"
+msgstr "Инструменты разработки"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1
+#, no-wrap
+msgid "Chapter 2. Programming Tools"
+msgstr "Глава 2. Инструменты разработки"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:57
+#, no-wrap
+msgid "Synopsis"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:64
+msgid ""
+"This chapter is an introduction to using some of the programming tools "
+"supplied with FreeBSD, although much of it will be applicable to many other "
+"versions of UNIX(R). It does _not_ attempt to describe coding in any "
+"detail. Most of the chapter assumes little or no previous programming "
+"knowledge, although it is hoped that most programmers will find something of "
+"value in it."
+msgstr ""
+"В этой главе представлено введение в использование некоторых инструментов "
+"для программирования, поставляемых с FreeBSD, хотя многое из описанного "
+"применимо и к другим версиям UNIX(R). Она _не_ претендует на детальное "
+"описание процесса написания кода. Большая часть главы предполагает наличие "
+"минимальных или отсутствие знаний в программировании, хотя предполагается, "
+"что даже опытные программисты найдут в ней что-то полезное."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:66
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:73
+msgid ""
+"FreeBSD offers an excellent development environment. Compilers for C and C+"
+"+ and an assembler come with the basic system, not to mention classic "
+"UNIX(R) tools such as `sed` and `awk`. If that is not enough, there are "
+"many more compilers and interpreters in the Ports collection. The following "
+"section, crossref:tools[tools-programming,Introduction to Programming], "
+"lists some of the available options. FreeBSD is very compatible with "
+"standards such as POSIX(R) and ANSI C, as well with its own BSD heritage, so "
+"it is possible to write applications that will compile and run with little "
+"or no modification on a wide range of platforms."
+msgstr ""
+"FreeBSD предоставляет отличную среду разработки. Компиляторы для C и C++, а "
+"также ассемблер входят в базовую систему, не говоря уже о классических "
+"инструментах UNIX(R), таких как `sed` и `awk`. Если этого недостаточно, в "
+"коллекции Ports доступно множество других компиляторов и интерпретаторов. В "
+"следующем разделе, crossref:tools[tools-programming,Введение в "
+"программирование], перечислены некоторые из доступных вариантов. FreeBSD "
+"обладает высокой совместимостью со стандартами, такими как POSIX(R) и ANSI "
+"C, а также с собственным наследием BSD, что позволяет создавать приложения, "
+"которые будут компилироваться и запускаться с минимальными изменениями или "
+"без них на широком спектре платформ."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:77
+msgid ""
+"However, all this power can be rather overwhelming at first if you have "
+"never written programs on a UNIX(R) platform before. This document aims to "
+"help you get up and running, without getting too deeply into more advanced "
+"topics. The intention is that this document should give you enough of the "
+"basics to be able to make some sense of the documentation."
+msgstr ""
+"Однако вся эта мощь может поначалу ошеломить, если вы никогда раньше не "
+"писали программы на платформе UNIX(R). Этот документ призван помочь вам "
+"начать работу, не углубляясь слишком сильно в более сложные темы. Цель "
+"заключается в том, чтобы дать вам достаточно базовых знаний для понимания "
+"документации."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:79
+msgid ""
+"Most of the document requires little or no knowledge of programming, "
+"although it does assume a basic competence with using UNIX(R) and a "
+"willingness to learn!"
+msgstr ""
+"Большая часть документа не требует или почти не требует знаний "
+"программирования, хотя предполагает базовые навыки работы с UNIX(R) и "
+"готовность учиться!"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:81
+#, no-wrap
+msgid "Introduction to Programming"
+msgstr "Введение в программирование"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:87
+msgid ""
+"A program is a set of instructions that tell the computer to do various "
+"things; sometimes the instruction it has to perform depends on what happened "
+"when it performed a previous instruction. This section gives an overview of "
+"the two main ways in which you can give these instructions, or \"commands\" "
+"as they are usually called. One way uses an _interpreter_, the other a "
+"_compiler_. As human languages are too difficult for a computer to "
+"understand in an unambiguous way, commands are usually written in one or "
+"other languages specially designed for the purpose."
+msgstr ""
+"Программа — это набор инструкций, которые указывают компьютеру выполнять "
+"различные действия; иногда выполняемая инструкция зависит от результата "
+"предыдущей. В этом разделе представлен обзор двух основных способов передачи "
+"таких инструкций, или, как их обычно называют, «команд». Один способ "
+"использует _интерпретатор_, другой — _компилятор_. Поскольку человеческие "
+"языки слишком сложны для однозначного понимания компьютером, команды обычно "
+"записываются на одном из специально разработанных для этого языков."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:88
+#, no-wrap
+msgid "Interpreters"
+msgstr "Интерпретаторы"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:93
+msgid ""
+"With an interpreter, the language comes as an environment, where you type in "
+"commands at a prompt and the environment executes them for you. For more "
+"complicated programs, you can type the commands into a file and get the "
+"interpreter to load the file and execute the commands in it. If anything "
+"goes wrong, many interpreters will drop you into a debugger to help you "
+"track down the problem."
+msgstr ""
+"С интерпретатором язык поставляется как среда, в которой вы вводите команды "
+"в приглашении, и среда выполняет их для вас. Для более сложных программ вы "
+"можете ввести команды в файл и заставить интерпретатор загрузить файл и "
+"выполнить команды в нём. Если что-то пойдёт не так, многие интерпретаторы "
+"переведут вас в отладчик, чтобы помочь найти проблему."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:98
+msgid ""
+"The advantage of this is that you can see the results of your commands "
+"immediately, and mistakes can be corrected readily. The biggest "
+"disadvantage comes when you want to share your programs with someone. They "
+"must have the same interpreter, or you must have some way of giving it to "
+"them, and they need to understand how to use it. Also users may not "
+"appreciate being thrown into a debugger if they press the wrong key! From a "
+"performance point of view, interpreters can use up a lot of memory, and "
+"generally do not generate code as efficiently as compilers."
+msgstr ""
+"Преимущество этого подхода в том, что вы сразу видите результаты выполнения "
+"команд, а ошибки можно легко исправить. Самый большой недостаток "
+"проявляется, когда вы хотите поделиться своими программами с кем-то. У них "
+"должен быть такой же интерпретатор, или у вас должен быть способ "
+"предоставить его, и они должны понимать, как им пользоваться. Кроме того, "
+"пользователям может не понравиться, если они попадут в отладчик при нажатии "
+"не той клавиши! С точки зрения производительности интерпретаторы могут "
+"потреблять много памяти и обычно генерируют код менее эффективно, чем "
+"компиляторы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:103
+msgid ""
+"In my opinion, interpreted languages are the best way to start if you have "
+"not done any programming before. This kind of environment is typically "
+"found with languages like Lisp, Smalltalk, Perl and Basic. It could also be "
+"argued that the UNIX(R) shell (`sh`, `csh`) is itself an interpreter, and "
+"many people do in fact write shell \"scripts\" to help with various "
+"\"housekeeping\" tasks on their machine. Indeed, part of the original "
+"UNIX(R) philosophy was to provide lots of small utility programs that could "
+"be linked together in shell scripts to perform useful tasks."
+msgstr ""
+"По моему мнению, интерпретируемые языки — это лучший способ начать, если вы "
+"раньше не занимались программированием. Такая среда обычно встречается в "
+"языках вроде Lisp, Smalltalk, Perl и Basic. Можно также утверждать, что "
+"UNIX(R) shell (`sh`, `csh`) сам по себе является интерпретатором, и многие "
+"часто пишут shell-«скрипты» для помощи в различных «хозяйственных» задачах "
+"на своих машинах. Действительно, часть оригинальной философии UNIX(R) "
+"заключалась в предоставлении множества небольших утилит, которые можно было "
+"связывать вместе в shell-скриптах для выполнения полезных задач."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:104
+#, no-wrap
+msgid "Interpreters Available with FreeBSD"
+msgstr "Доступные интерпретаторы в FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:107
+msgid ""
+"Here is a list of interpreters that are available from the FreeBSD Ports "
+"Collection, with a brief discussion of some of the more popular interpreted "
+"languages."
+msgstr ""
+"Вот список интерпретаторов, доступных в Коллекции портов FreeBSD, с кратким "
+"обзором некоторых наиболее популярных интерпретируемых языков."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:109
+msgid ""
+"Instructions on how to get and install applications from the Ports "
+"Collection can be found in the extref:{handbook}[Ports section, ports-using] "
+"of the handbook."
+msgstr ""
+"Инструкции по получению и установке приложений из Коллекции портов можно "
+"найти в extref:{handbook}[разделе Порты, ports-using] руководства."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:110
+#, no-wrap
+msgid "BASIC"
+msgstr "BASIC"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:114
+msgid ""
+"Short for Beginner's All-purpose Symbolic Instruction Code. Developed in "
+"the 1950s for teaching University students to program and provided with "
+"every self-respecting personal computer in the 1980s, BASIC has been the "
+"first programming language for many programmers. It is also the foundation "
+"for Visual Basic."
+msgstr ""
+"Сокращение от Beginner's All-purpose Symbolic Instruction Code. Разработан в "
+"1950-х годах для обучения студентов университетов программированию и "
+"поставлялся с каждым уважающим себя персональным компьютером в 1980-х. BASIC "
+"— первый язык программирования для многих программистов. Он также является "
+"основой для Visual Basic."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:116
+msgid ""
+"The Bywater Basic Interpreter can be found in the Ports Collection as "
+"package:lang/bwbasic[] and the Phil Cockroft's Basic Interpreter (formerly "
+"Rabbit Basic) is available as package:lang/pbasic[]."
+msgstr ""
+"Интерпретатор Bywater Basic можно найти в Коллекции портов как package:lang/"
+"bwbasic[], а интерпретатор Phil Cockroft's Basic (ранее известный как Rabbit "
+"Basic) доступен как package:lang/pbasic[]."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:117
+#, no-wrap
+msgid "Lisp"
+msgstr "Lisp"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:121
+msgid ""
+"A language that was developed in the late 1950s as an alternative to the "
+"\"number-crunching\" languages that were popular at the time. Instead of "
+"being based on numbers, Lisp is based on lists; in fact, the name is short "
+"for \"List Processing\". It is very popular in AI (Artificial Intelligence) "
+"circles."
+msgstr ""
+"Язык, разработанный в конце 1950-х годов как альтернатива популярным в то "
+"время языкам для «численных расчётов». В отличие от них, Lisp основан на "
+"списках; фактически, название является сокращением от «List Processing» "
+"(обработка списков). Он очень популярен в кругах, связанных с ИИ "
+"(искусственным интеллектом)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:123
+msgid ""
+"Lisp is an extremely powerful and sophisticated language, but can be rather "
+"large and unwieldy."
+msgstr ""
+"Lisp — это чрезвычайно мощный и сложный язык, но он может показаться "
+"довольно большим и громоздким."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:127
+msgid ""
+"Various implementations of Lisp that can run on UNIX(R) systems are "
+"available in the Ports Collection for FreeBSD. CLISP by Bruno Haible and "
+"Michael Stoll is available as package:lang/clisp[]. SLisp, a simpler Lisp "
+"implementations, is available as package:lang/slisp[]."
+msgstr ""
+"В Коллекции портов FreeBSD доступны различные реализации Lisp, которые могут "
+"работать в системах UNIX(R). CLISP от Bruno Haible и Michael Stoll доступен "
+"как package:lang/clisp[]. Более простая реализация Lisp, SLisp, доступна как "
+"package:lang/slisp[]."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:128
+#, no-wrap
+msgid "Perl"
+msgstr "Perl"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:130
+msgid ""
+"Very popular with system administrators for writing scripts; also often used "
+"on World Wide Web servers for writing CGI scripts."
+msgstr ""
+"Очень популярен среди системных администраторов для написания скриптов; "
+"также часто используется на веб-серверах для написания CGI-скриптов."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:132
+msgid ""
+"Perl is available in the Ports Collection as package:lang/perl5.36[] for all "
+"FreeBSD releases."
+msgstr ""
+"Perl доступен в Коллекции портов как package:lang/perl5.36[] для всех "
+"выпусков FreeBSD."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:133
+#, no-wrap
+msgid "Scheme"
+msgstr "Scheme"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:137
+msgid ""
+"A dialect of Lisp that is rather more compact and cleaner than Common Lisp. "
+"Popular in Universities as it is simple enough to teach to undergraduates as "
+"a first language, while it has a high enough level of abstraction to be used "
+"in research work."
+msgstr ""
+"Диалект Lisp, который более компактен и чист по сравнению с Common Lisp. "
+"Популярен в университетах, так как достаточно прост для обучения студентов в "
+"качестве первого языка, и при этом обладает достаточным уровнем абстракции "
+"для использования в исследовательской работе."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:140
+msgid ""
+"Scheme is available from the Ports Collection as package:lang/elk[] for the "
+"Elk Scheme Interpreter. The MIT Scheme Interpreter can be found in "
+"package:lang/mit-scheme[] and the SCM Scheme Interpreter in package:lang/"
+"scm[]."
+msgstr ""
+"Схема доступна из Коллекции Портов как package:lang/elk[] для Интерпретатора "
+"Elk Scheme. Интерпретатор MIT Scheme можно найти в package:lang/mit-"
+"scheme[], а Интерпретатор SCM Scheme — в package:lang/scm[]."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:141
+#, no-wrap
+msgid "Lua"
+msgstr "Lua"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:147
+msgid ""
+"Lua is a lightweight embeddable scripting language. It is widely portable "
+"and relatively simple. Lua is available in the Ports Collection in "
+"package:lang/lua54[]. It is also included in the base system as "
+"[.filename]#/usr/libexec/flua# for use by base system components. Third "
+"party software should not depend on [.filename]#flua#."
+msgstr ""
+"Lua — это легковесный встраиваемый язык сценариев. Он обладает высокой "
+"переносимостью и относительно прост. Lua доступен в коллекции портов в "
+"пакете package:lang/lua54[]. Он также включен в базовую систему как "
+"[.filename]#/usr/libexec/flua# для использования компонентами базовой "
+"системы. Стороннее программное обеспечение не должно зависеть от "
+"[.filename]#flua#."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:148
+#, no-wrap
+msgid "Python"
+msgstr "Python"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:151
+msgid ""
+"Python is an Object-Oriented, interpreted language. Its advocates argue "
+"that it is one of the best languages to start programming with, since it is "
+"relatively easy to start with, but is not limited in comparison to other "
+"popular interpreted languages that are used for the development of large, "
+"complex applications (Perl and Tcl are two other languages that are popular "
+"for such tasks)."
+msgstr ""
+"Python — это объектно-ориентированный интерпретируемый язык. Его сторонники "
+"утверждают, что это один из лучших языков для начала программирования, "
+"поскольку он относительно прост в освоении, но не уступает другим популярным "
+"интерпретируемым языкам, используемым для разработки крупных и сложных "
+"приложений (Perl и Tcl — два других языка, популярных для таких задач)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:153
+msgid ""
+"The latest version of Python is available from the Ports Collection in "
+"package:lang/python[]."
+msgstr ""
+"Последняя версия Python доступна в Коллекции портов в пакете package:lang/"
+"python[]."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:154
+#, no-wrap
+msgid "Ruby"
+msgstr "Ruby"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:157
+msgid ""
+"Ruby is an interpreter, pure object-oriented programming language. It has "
+"become widely popular because of its easy to understand syntax, flexibility "
+"when writing code, and the ability to easily develop and maintain large, "
+"complex programs."
+msgstr ""
+"Ruby — это интерпретируемый, чисто объектно-ориентированный язык "
+"программирования. Он получил широкую популярность благодаря простому для "
+"понимания синтаксису, гибкости при написании кода и возможности легко "
+"разрабатывать и поддерживать большие, сложные программы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:159
+msgid "Ruby is available from the Ports Collection as package:lang/ruby32[]."
+msgstr "Ruby доступен в Коллекции портов как package:lang/ruby32[]."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:160
+#, no-wrap
+msgid "Tcl and Tk"
+msgstr "Tcl и Tk"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:163
+msgid ""
+"Tcl is an embeddable, interpreted language, that has become widely used and "
+"became popular mostly because of its portability to many platforms. It can "
+"be used both for quickly writing small, prototype applications, or (when "
+"combined with Tk, a GUI toolkit) fully-fledged, featureful programs."
+msgstr ""
+"Tcl — это встраиваемый интерпретируемый язык, который получил широкое "
+"распространение и популярность в основном благодаря своей переносимости на "
+"множество платформ. Он может использоваться как для быстрого написания "
+"небольших прототипов приложений, так и (в сочетании с Tk, набором "
+"инструментов для графического интерфейса) полноценных программ с богатым "
+"функционалом."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:166
+msgid ""
+"Various versions of Tcl are available as ports for FreeBSD. The latest "
+"version, Tcl 8.7, can be found in package:lang/tcl87[]."
+msgstr ""
+"Различные версии Tcl доступны в качестве портов для FreeBSD. Последняя "
+"версия, Tcl 8.7, находится в пакете package:lang/tcl87[]."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:167
+#, no-wrap
+msgid "Compilers"
+msgstr "Компиляторы"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:174
+msgid ""
+"Compilers are rather different. First of all, you write your code in a file "
+"(or files) using an editor. You then run the compiler and see if it accepts "
+"your program. If it did not compile, grit your teeth and go back to the "
+"editor; if it did compile and gave you a program, you can run it either at a "
+"shell command prompt or in a debugger to see if it works properly.footnote:"
+"[If you run it in the shell, you may get a core dump.]"
+msgstr ""
+"Компиляторы довольно сильно различаются. Прежде всего, вы пишете свой код в "
+"файле (или файлах) с помощью редактора. Затем вы запускаете компилятор и "
+"проверяете, принимает ли он вашу программу. Если программа не "
+"скомпилировалась, стисните зубы и вернитесь к редактору; если же компиляция "
+"прошла успешно и программа была создана, вы можете запустить её либо в "
+"командной строке оболочки, либо в отладчике, чтобы проверить её "
+"работу.footnote:[Если вы запустите её в оболочке, может произойти дамп "
+"памяти.]"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:181
+msgid ""
+"Obviously, this is not quite as direct as using an interpreter. However it "
+"allows you to do a lot of things which are very difficult or even impossible "
+"with an interpreter, such as writing code which interacts closely with the "
+"operating system-or even writing your own operating system! It is also "
+"useful if you need to write very efficient code, as the compiler can take "
+"its time and optimize the code, which would not be acceptable in an "
+"interpreter. Moreover, distributing a program written for a compiler is "
+"usually more straightforward than one written for an interpreter-you can "
+"just give them a copy of the executable, assuming they have the same "
+"operating system as you."
+msgstr ""
+"Очевидно, это требует больше усилий по сравнению с использованием "
+"интерпретатора. Однако это позволяет делать множество вещей, которые очень "
+"сложны или даже невозможны с интерпретатором, например, писать код, тесно "
+"взаимодействующий с операционной системой — или даже создавать собственную "
+"операционную систему! Это также полезно, если требуется написать очень "
+"эффективный код, так как компилятор может не спешить и оптимизировать код, "
+"что было бы неприемлемо в интерпретаторе. Более того, распространение "
+"программы, написанной для компилятора, обычно проще, чем для интерпретатора "
+"— можно просто предоставить копию исполняемого файла, предполагая, что у "
+"пользователя та же операционная система, что и у вас."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:185
+msgid ""
+"As the edit-compile-run-debug cycle is rather tedious when using separate "
+"programs, many commercial compiler makers have produced Integrated "
+"Development Environments (IDEs for short). FreeBSD does not include an IDE "
+"in the base system, but package:devel/kdevelop[] is available in the Ports "
+"Collection and many use Emacs for this purpose. Using Emacs as an IDE is "
+"discussed in crossref:tools[emacs, Using Emacs as a Development Environment]."
+msgstr ""
+"Поскольку цикл редактирования-компиляции-запуска-отладки довольно утомителен "
+"при использовании отдельных программ, многие производители коммерческих "
+"компиляторов создали интегрированные среды разработки (сокращённо IDE). "
+"FreeBSD не включает IDE в базовую систему, но в Коллекции портов доступен "
+"package:devel/kdevelop[], и многие используют для этой цели Emacs. "
+"Использование Emacs в качестве IDE обсуждается в crossref:tools[emacs, "
+"Использование Emacs как среды разработки]."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:187
+#, no-wrap
+msgid "Compiling with `cc`"
+msgstr "Компиляция с помощью `cc`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:192
+msgid ""
+"This section deals with the clang compiler for C and C++, as it's installed "
+"with the FreeBSD base system. Clang is installed as `cc`; the GNU compiler "
+"package:lang/gcc[gcc] is available in the Ports Collection. The details of "
+"producing a program with an interpreter vary considerably between "
+"interpreters, and are usually well covered in the documentation and on-line "
+"help for the interpreter."
+msgstr ""
+"Этот раздел посвящён компилятору clang для языков C и C++, так как он "
+"устанавливается вместе с базовой системой FreeBSD. Clang устанавливается как "
+"`cc`; пакет GNU-компилятора package:lang/gcc[gcc] доступен в Коллекции "
+"портов. Детали создания программы с интерпретатором значительно различаются "
+"в зависимости от интерпретатора и обычно хорошо описаны в документации и "
+"онлайн-справке интерпретатора."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:195
+msgid ""
+"Once you have written your masterpiece, the next step is to convert it into "
+"something that will (hopefully!) run on FreeBSD. This usually involves "
+"several steps, each of which is done by a separate program."
+msgstr ""
+"Как только вы напишете свой шедевр, следующий шаг — преобразовать его во что-"
+"то, что (надеюсь!) будет работать на FreeBSD. Обычно это включает несколько "
+"шагов, каждый из которых выполняется отдельной программой."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:198
+msgid ""
+"Pre-process your source code to remove comments and do other tricks like "
+"expanding macros in C."
+msgstr ""
+"Обработь исходный код, чтобы удалить комментарии и выполнить другие "
+"действия, такие как раскрытие макросов в C."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:199
+msgid ""
+"Check the syntax of your code to see if you have obeyed the rules of the "
+"language. If you have not, it will complain!"
+msgstr ""
+"Проверить синтаксис вашего кода, чтобы убедиться, что вы соблюдаете правила "
+"языка. Если нет, он пожалуется!"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:200
+msgid ""
+"Convert the source code into assembly language-this is very close to machine "
+"code, but still understandable by humans. Allegedly."
+msgstr ""
+"Преобразовать исходный код в ассемблерный язык — это очень близко к "
+"машинному коду, но всё ещё понятно человеку. Как утверждается."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:201
+msgid ""
+"Convert the assembly language into machine code-yep, we are talking bits and "
+"bytes, ones and zeros here."
+msgstr ""
+"Преобразовать язык ассемблера в машинный код — да, здесь речь идет о битах и "
+"байтах, единицах и нулях."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:202
+msgid ""
+"Check that you have used things like functions and global variables in a "
+"consistent way. For example, if you have called a non-existent function, it "
+"will complain."
+msgstr ""
+"Проверить, что вы использовали такие элементы, как функции и глобальные "
+"переменные, правильно и последовательно. Например, если вы вызвали "
+"несуществующую функцию, это будет отмечено."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:203
+msgid ""
+"If you are trying to produce an executable from several source code files, "
+"work out how to fit them all together."
+msgstr ""
+"Если вы пытаетесь создать исполняемый файл из нескольких исходных файлов, "
+"определить, как объединить их все вместе."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:204
+msgid ""
+"Work out how to produce something that the system's run-time loader will be "
+"able to load into memory and run."
+msgstr ""
+"Определить, как создать что-то, что загрузчик времени выполнения системы "
+"сможет загрузить в память и запустить."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:205
+msgid "Finally, write the executable on the filesystem."
+msgstr "Наконец, записать исполняемый файл в файловую систему."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:208
+msgid ""
+"The word _compiling_ is often used to refer to just steps 1 to 4-the others "
+"are referred to as _linking_. Sometimes step 1 is referred to as _pre-"
+"processing_ and steps 3-4 as _assembling_."
+msgstr ""
+"Слово _компиляция_ часто относится только к шагам с 1 по 4, а остальные шаги "
+"называются _линковкой_. Иногда шаг 1 называют _препроцессированием_, а шаги "
+"3-4 — _ассемблированием_."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:210
+msgid ""
+"Fortunately, almost all this detail is hidden from you, as `cc` is a front "
+"end that manages calling all these programs with the right arguments for "
+"you; simply typing"
+msgstr ""
+"К счастью, почти все эти детали скрыты от вас, так как `cc` — это интерфейс, "
+"который управляет вызовом всех этих программ с правильными аргументами за "
+"вас; достаточно просто набрать"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:214
+#, no-wrap
+msgid "% cc foobar.c\n"
+msgstr "% cc foobar.c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:218
+msgid ""
+"will cause [.filename]#foobar.c# to be compiled by all the steps above. If "
+"you have more than one file to compile, just do something like"
+msgstr ""
+"и это вызовет компиляцию файла [.filename]#foobar.c# всеми перечисленными "
+"выше шагами. Если у вас несколько файлов для компиляции, просто сделайте что-"
+"то вроде"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:222
+#, no-wrap
+msgid "% cc foo.c bar.c\n"
+msgstr "% cc foo.c bar.c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:227
+msgid ""
+"Note that the syntax checking is just that - checking the syntax. It will "
+"not check for any logical mistakes you may have made, like putting the "
+"program into an infinite loop, or using a bubble sort when you meant to use "
+"a binary sort.footnote:[In case you did not know, a binary sort is an "
+"efficient way of sorting things into order and a bubble sort is not.]"
+msgstr ""
+"Обратите внимание, что проверка синтаксиса — это всего лишь проверка "
+"синтаксиса. Она не выявит логических ошибок, которые вы могли допустить, "
+"например, создание бесконечного цикла или использование пузырьковой "
+"сортировки вместо бинарной.footnote:[На случай, если вы не знали: бинарная "
+"сортировка — это эффективный способ упорядочивания элементов, в отличие от "
+"пузырьковой.]"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:230
+msgid ""
+"There are lots and lots of options for `cc`, which are all in the manual "
+"page. Here are a few of the most important ones, with examples of how to "
+"use them."
+msgstr ""
+"Существует множество опций для `cc`, все они описаны в руководстве. Вот "
+"несколько наиболее важных из них с примерами использования."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:231
+#, no-wrap
+msgid "`-o _filename_`"
+msgstr "`-o _filename_`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:233
+msgid ""
+"The output name of the file. If you do not use this option, `cc` will "
+"produce an executable called [.filename]#a.out#.footnote:[The reasons for "
+"this are buried in the mists of history.]"
+msgstr ""
+"Имя выходного файла. Если вы не используете эту опцию, `cc` создаст "
+"исполняемый файл с именем [.filename]#a.out#.footnote:[Причины этого кроются "
+"в глубинах истории.]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:238
+#, no-wrap
+msgid ""
+"% cc foobar.c executable is a.out\n"
+"% cc -o foobar foobar.c executable is foobar\n"
+msgstr ""
+"% cc foobar.c executable is a.out\n"
+"% cc -o foobar foobar.c executable is foobar\n"
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:240
+#, no-wrap
+msgid "`-c`"
+msgstr "`-c`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:243
+msgid ""
+"Just compile the file, do not link it. Useful for toy programs where you "
+"just want to check the syntax, or if you are using a [.filename]#Makefile#."
+msgstr ""
+"Просто скомпилирует файл, не связывая его. Полезно для небольших программ, "
+"где нужно только проверить синтаксис, или если вы используете "
+"[.filename]#Makefile#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:247
+#, no-wrap
+msgid "% cc -c foobar.c\n"
+msgstr "% cc -c foobar.c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:251
+msgid ""
+"This will produce an _object file_ (not an executable) called "
+"[.filename]#foobar.o#. This can be linked together with other object files "
+"into an executable."
+msgstr ""
+"Это создаст _объектный файл_ (не исполняемый) с именем "
+"[.filename]#foobar.o#. Его можно скомпоновать с другими объектными файлами в "
+"исполняемый файл."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:252
+#, no-wrap
+msgid "`-g`"
+msgstr "`-g`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:258
+msgid ""
+"Create a debug version of the executable. This makes the compiler put "
+"information into the executable about which line of which source file "
+"corresponds to which function call. A debugger can use this information to "
+"show the source code as you step through the program, which is _very_ "
+"useful; the disadvantage is that all this extra information makes the "
+"program much bigger. Normally, you compile with `-g` while you are "
+"developing a program and then compile a \"release version\" without `-g` "
+"when you are satisfied it works properly."
+msgstr ""
+"Создать отладочную версию исполняемого файла. Это заставляет компилятор "
+"записывать в исполняемый файл информацию о том, какая строка какого "
+"исходного файла соответствует какому вызову функции. Отладчик может "
+"использовать эту информацию для отображения исходного кода при пошаговом "
+"выполнении программы, что _очень_ полезно; недостатком является то, что вся "
+"эта дополнительная информация значительно увеличивает размер программы. "
+"Обычно вы компилируете с `-g` во время разработки программы, а затем "
+"компилируете \"релизную версию\" без `-g`, когда убедитесь, что она работает "
+"правильно."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:263
+#, no-wrap
+msgid "% cc -g foobar.c\n"
+msgstr "% cc -g foobar.c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:266
+msgid ""
+"This will produce a debug version of the program. footnote:[Note, we did not "
+"use the -o flag to specify the executable name, so we will get an executable "
+"called a.out. Producing a debug version called foobar is left as an exercise "
+"for the reader!]"
+msgstr ""
+"Это создаст отладочную версию программы. footnote:[Примечание: мы не "
+"использовали флаг -o для указания имени исполняемого файла, поэтому получим "
+"исполняемый файл с именем a.out. Создание отладочной версии с именем foobar "
+"остается упражнением для читателя!]"
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:267
+#, no-wrap
+msgid "`-O`"
+msgstr "`-O`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:271
+msgid ""
+"Create an optimized version of the executable. The compiler performs "
+"various clever tricks to try to produce an executable that runs faster than "
+"normal. You can add a number after the `-O` to specify a higher level of "
+"optimization, but this often exposes bugs in the compiler's optimizer."
+msgstr ""
+"Создает оптимизированную версию исполняемого файла. Компилятор применяет "
+"различные хитрые приёмы, чтобы попытаться создать исполняемый файл, который "
+"работает быстрее обычного. Вы можете добавить число после `-O`, чтобы "
+"указать более высокий уровень оптимизации, но это часто выявляет ошибки в "
+"оптимизаторе компилятора."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:275
+#, no-wrap
+msgid "% cc -O -o foobar foobar.c\n"
+msgstr "% cc -O -o foobar foobar.c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:278
+msgid "This will produce an optimized version of [.filename]#foobar#."
+msgstr "Это создаст оптимизированную версию [.filename]#foobar#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:281
+msgid ""
+"The following three flags will force `cc` to check that your code complies "
+"to the relevant international standard, often referred to as the ANSI "
+"standard, though strictly speaking it is an ISO standard."
+msgstr ""
+"Следующие три флага заставят `cc` проверять, что ваш код соответствует "
+"соответствующему международному стандарту, часто называемому стандартом "
+"ANSI, хотя строго говоря, это стандарт ISO."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:282
+#, no-wrap
+msgid "`-Wall`"
+msgstr "`-Wall`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:285
+msgid ""
+"Enable all the warnings which the authors of `cc` believe are worthwhile. "
+"Despite the name, it will not enable all the warnings `cc` is capable of."
+msgstr ""
+"Включить все предупреждения, которые разработчики `cc` считают полезными. "
+"Несмотря на название, это не включит все предупреждения, которые `cc` "
+"способен выдавать."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:286
+#, no-wrap
+msgid "`-ansi`"
+msgstr "`-ansi`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:289
+msgid ""
+"Turn off most, but not all, of the non-ANSI C features provided by `cc`. "
+"Despite the name, it does not guarantee strictly that your code will comply "
+"to the standard."
+msgstr ""
+"Отключит большинство, но не все, не-ANSI C функции, предоставляемые `cc`. "
+"Несмотря на название, это не гарантирует строгого соответствия вашего кода "
+"стандарту."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:290
+#, no-wrap
+msgid "`-pedantic`"
+msgstr "`-pedantic`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:292
+msgid "Turn off _all_ ``cc``'s non-ANSI C features."
+msgstr "Отключит _все_ не-ANSI C возможности ``cc``."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:297
+msgid ""
+"Without these flags, `cc` will allow you to use some of its non-standard "
+"extensions to the standard. Some of these are very useful, but will not "
+"work with other compilers - in fact, one of the main aims of the standard is "
+"to allow people to write code that will work with any compiler on any "
+"system. This is known as _portable code_."
+msgstr ""
+"Без этих флагов `cc` позволит вам использовать некоторые из своих "
+"нестандартных расширений стандарта. Некоторые из них очень полезны, но не "
+"будут работать с другими компиляторами — фактически, одна из основных целей "
+"стандарта заключается в том, чтобы позволить людям писать код, который будет "
+"работать с любым компилятором на любой системе. Это известно как "
+"_переносимый код_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:300
+msgid ""
+"Generally, you should try to make your code as portable as possible, as "
+"otherwise you may have to completely rewrite the program later to get it to "
+"work somewhere else - and who knows what you may be using in a few years "
+"time?"
+msgstr ""
+"Обычно следует стремиться к тому, чтобы ваш код был как можно более "
+"переносимым, иначе позже вам, возможно, придётся полностью переписать "
+"программу для её работы в другом месте — а кто знает, что вы будете "
+"использовать через несколько лет?"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:304
+#, no-wrap
+msgid "% cc -Wall -ansi -pedantic -o foobar foobar.c\n"
+msgstr "% cc -Wall -ansi -pedantic -o foobar foobar.c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:307
+msgid ""
+"This will produce an executable [.filename]#foobar# after checking "
+"[.filename]#foobar.c# for standard compliance."
+msgstr ""
+"В результате будет создан исполняемый файл [.filename]#foobar# после "
+"проверки [.filename]#foobar.c# на соответствие стандартам."
+
+#. type: Labeled list
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:308
+#, no-wrap
+msgid "`-l__library__`"
+msgstr "`-l__library__`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:310
+msgid "Specify a function library to be used at link time."
+msgstr ""
+"Укажите библиотеку функций, которая будет использоваться во время компоновки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:313
+msgid ""
+"The most common example of this is when compiling a program that uses some "
+"of the mathematical functions in C. Unlike most other platforms, these are "
+"in a separate library from the standard C one and you have to tell the "
+"compiler to add it."
+msgstr ""
+"Наиболее распространённый пример этого — компиляция программы, использующей "
+"некоторые математические функции в C. В отличие от большинства других "
+"платформ, они находятся в отдельной библиотеке, отличной от стандартной "
+"библиотеки C, и необходимо указать компилятору добавить её."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:317
+msgid ""
+"The rule is that if the library is called [.filename]#libsomething.a#, you "
+"give `cc` the argument `-l__something__`. For example, the math library is "
+"[.filename]#libm.a#, so you give `cc` the argument `-lm`. A common "
+"\"gotcha\" with the math library is that it has to be the last library on "
+"the command line."
+msgstr ""
+"Правило заключается в том, что если библиотека называется "
+"[.filename]#libsomething.a#, то вы передаёте `cc` аргумент `-"
+"l__something__`. Например, математическая библиотека называется "
+"[.filename]#libm.a#, поэтому вы передаёте `cc` аргумент `-lm`. Типичный "
+"подводный камень с математической библиотекой заключается в том, что она "
+"должна быть последней библиотекой в командной строке."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:321
+#, no-wrap
+msgid "% cc -o foobar foobar.c -lm\n"
+msgstr "% cc -o foobar foobar.c -lm\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:324
+msgid "This will link the math library functions into [.filename]#foobar#."
+msgstr ""
+"Это приведёт к подключению функций математической библиотеки в "
+"[.filename]#foobar#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:327
+msgid ""
+"If you are compiling C++ code, use {c-plus-plus-command}. {c-plus-plus-"
+"command} can also be invoked as {clang-plus-plus-command} on FreeBSD."
+msgstr ""
+"Если вы компилируете код на C++, используйте {c-plus-plus-command}. {c-plus-"
+"plus-command} также может быть вызван как {clang-plus-plus-command} в "
+"FreeBSD."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:331
+#, no-wrap
+msgid "% c++ -o foobar foobar.cc\n"
+msgstr "% c++ -o foobar foobar.cc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:334
+msgid ""
+"This will both produce an executable [.filename]#foobar# from the C++ source "
+"file [.filename]#foobar.cc#."
+msgstr ""
+"Это создаст исполняемый файл [.filename]#foobar# из исходного файла на C++ "
+"[.filename]#foobar.cc#."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:335
+#, no-wrap
+msgid "Common `cc` Queries and Problems"
+msgstr "Распространённые вопросы и проблемы `cc`"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:337
+#, no-wrap
+msgid "I compiled a file called foobar.c and I cannot find an executable called foobar. Where has it gone?"
+msgstr "Я скомпилировал файл с именем foobar.c и не могу найти исполняемый файл с именем foobar. Куда он пропал?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:341
+msgid ""
+"Remember, `cc` will call the executable [.filename]#a.out# unless you tell "
+"it differently. Use the `-o _filename_` option:"
+msgstr ""
+"Помните, что `cc` вызовет исполняемый файл [.filename]#a.out#, если вы не "
+"укажете иное. Используйте опцию `-o _имя_файла_`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:345
+#, no-wrap
+msgid "% cc -o foobar foobar.c\n"
+msgstr "% cc -o foobar foobar.c\n"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:347
+#, no-wrap
+msgid "OK, I have an executable called foobar, I can see it when I run ls, but when I type in foobar at the command prompt it tells me there is no such file. Why can it not find it?"
+msgstr "Хорошо, у меня есть исполняемый файл с именем foobar, я вижу его при выполнении команды ls, но когда я ввожу foobar в командной строке, система сообщает, что такого файла нет. Почему он не может его найти?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:351
+msgid ""
+"Unlike MS-DOS(R), UNIX(R) does not look in the current directory when it is "
+"trying to find out which executable you want it to run, unless you tell it "
+"to. Type `./foobar`, which means \"run the file called [.filename]#foobar# "
+"in the current directory.\""
+msgstr ""
+"В отличие от MS-DOS(R), UNIX(R) не ищет в текущем каталоге, когда пытается "
+"определить, какую программу нужно запустить, если вы явно не укажете это. "
+"Введите `./foobar`, что означает \"запустить файл с именем "
+"[.filename]#foobar# в текущем каталоге.\""
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:352
+#, no-wrap
+msgid "I called my executable test, but nothing happens when I run it. What is going on?"
+msgstr "Я назвал свой исполняемый файл test, но при запуске ничего не происходит. В чем дело?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:356
+msgid ""
+"Most UNIX(R) systems have a program called `test` in [.filename]#/usr/bin# "
+"and the shell is picking that one up before it gets to checking the current "
+"directory. Either type:"
+msgstr ""
+"Большинство UNIX(R) систем имеют программу под названием `test` в "
+"[.filename]#/usr/bin#, и оболочка выбирает её, прежде чем проверить текущий "
+"каталог. Введите следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:360
+#, no-wrap
+msgid "% ./test\n"
+msgstr "% ./test\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:363
+msgid "or choose a better name for your program!"
+msgstr "или выберите более подходящее название для вашей программы!"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:364
+#, no-wrap
+msgid "I compiled my program and it seemed to run all right at first, then there was an error and it said something about core dumped. What does that mean?"
+msgstr "Я скомпилировал свою программу, и сначала она работала нормально, но потом произошла ошибка, и было сообщение о core dumped. Что это значит?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:368
+msgid ""
+"The name _core dump_ dates back to the very early days of UNIX(R), when the "
+"machines used core memory for storing data. Basically, if the program "
+"failed under certain conditions, the system would write the contents of core "
+"memory to disk in a file called [.filename]#core#, which the programmer "
+"could then pore over to find out what went wrong."
+msgstr ""
+"Название _core dump_ восходит к самым ранним дням UNIX(R), когда машины "
+"использовали ферритовую память для хранения данных. По сути, если программа "
+"завершалась сбоем при определённых условиях, система записывала содержимое "
+"ферритовой памяти на диск в файл с именем [.filename]#core#, который "
+"программист затем мог изучить, чтобы выяснить причину ошибки."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:369
+#, no-wrap
+msgid "Fascinating stuff, but what I am supposed to do now?"
+msgstr "Увлекательный материал, но что мне теперь делать?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:372
+msgid ""
+"Use a debugger to analyze the core (see crossref:tools[debugging, "
+"Debugging])."
+msgstr ""
+"Используйте отладчик для анализа образа памяти (см. "
+"crossref:tools[debugging, Отладка])."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:373
+#, no-wrap
+msgid "When my program dumped core, it said something about a segmentation fault. What is that?"
+msgstr "Когда моя программа сбросила core, она сообщила что-то о segmentation fault. Что это?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:377
+msgid ""
+"This basically means that your program tried to perform some sort of illegal "
+"operation on memory; UNIX(R) is designed to protect the operating system and "
+"other programs from rogue programs."
+msgstr ""
+"Это означает, что ваша программа попыталась выполнить какую-то недопустимую "
+"операцию с памятью; UNIX(R) разработана для защиты операционной системы и "
+"других программ от некорректно работающих программ."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:379
+msgid "Common causes for this are:"
+msgstr "Распространенные причины этого:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:381
+msgid "Trying to write to a NULL pointer, eg"
+msgstr "Попытка записи в NULL-указатель, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:386
+#, no-wrap
+msgid ""
+"char *foo = NULL;\n"
+"strcpy(foo, \"bang!\");\n"
+msgstr ""
+"char *foo = NULL;\n"
+"strcpy(foo, \"bang!\");\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:389
+msgid "Using a pointer that has not been initialized, eg"
+msgstr "Использование неинициализированного указателя, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:394
+#, no-wrap
+msgid ""
+"char *foo;\n"
+"strcpy(foo, \"bang!\");\n"
+msgstr ""
+"char *foo;\n"
+"strcpy(foo, \"bang!\");\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:398
+msgid ""
+"The pointer will have some random value that, with luck, will point into an "
+"area of memory that is not available to your program and the kernel will "
+"kill your program before it can do any damage. If you are unlucky, it will "
+"point somewhere inside your own program and corrupt one of your data "
+"structures, causing the program to fail mysteriously."
+msgstr ""
+"Указатель будет иметь случайное значение, которое, возможно, укажет на "
+"область памяти, недоступную вашей программе, и ядро завершит вашу программу "
+"до того, как она сможет нанести какой-либо ущерб. Если вам не повезет, он "
+"укажет внутрь вашей собственной программы и повредит одну из структур "
+"данных, что приведет к загадочному сбою программы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:399
+msgid "Trying to access past the end of an array, eg"
+msgstr "Попытка доступа за пределы массива, например"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:404
+#, no-wrap
+msgid ""
+"int bar[20];\n"
+"bar[27] = 6;\n"
+msgstr ""
+"int bar[20];\n"
+"bar[27] = 6;\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:407
+msgid "Trying to store something in read-only memory, eg"
+msgstr "Попытка сохранить что-то в память только для чтения, например"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:412
+#, no-wrap
+msgid ""
+"char *foo = \"My string\";\n"
+"strcpy(foo, \"bang!\");\n"
+msgstr ""
+"char *foo = \"My string\";\n"
+"strcpy(foo, \"bang!\");\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:415
+msgid ""
+"UNIX(R) compilers often put string literals like `\"My string\"` into read-"
+"only areas of memory."
+msgstr ""
+"Версии UNIX(R) компиляторы часто помещают строковые литералы, такие как "
+"`\"Моя строка\"`, в области памяти только для чтения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:416
+msgid "Doing naughty things with `malloc()` and `free()`, eg"
+msgstr "Выполнение нежелательных действий с `malloc()` и `free()`, например"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:421
+#, no-wrap
+msgid ""
+"char bar[80];\n"
+"free(bar);\n"
+msgstr ""
+"char bar[80];\n"
+"free(bar);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:424
+msgid "or"
+msgstr "или"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:430
+#, no-wrap
+msgid ""
+"char *foo = malloc(27);\n"
+"free(foo);\n"
+"free(foo);\n"
+msgstr ""
+"char *foo = malloc(27);\n"
+"free(foo);\n"
+"free(foo);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:435
+msgid ""
+"Making one of these mistakes will not always lead to an error, but they are "
+"always bad practice. Some systems and compilers are more tolerant than "
+"others, which is why programs that run well on one system can crash when you "
+"try them on another."
+msgstr ""
+"Совершение одной из этих ошибок не всегда приведет к сбою, но это всегда "
+"плохая практика. Некоторые системы и компиляторы более терпимы, чем другие, "
+"поэтому программы, которые хорошо работают на одной системе, могут аварийно "
+"завершаться при попытке запустить их на другой."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:436
+#, no-wrap
+msgid "Sometimes when I get a core dump it says bus error. It says in my UNIX(R) book that this means a hardware problem, but the computer still seems to be working. Is this true?"
+msgstr "Иногда при получении дампа памяти я вижу сообщение ошибки шины (bus error). В моей книге по UNIX(R) сказано, что это означает аппаратную проблему, но компьютер продолжает работать. Это правда?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:440
+msgid ""
+"No, fortunately not (unless of course you really do have a hardware "
+"problem...). This is usually another way of saying that you accessed memory "
+"in a way you should not have."
+msgstr ""
+"Нет, к счастью, нет (если, конечно, у вас действительно нет аппаратной "
+"проблемы...). Обычно это означает, что вы обратились к памяти способом, "
+"который не следует использовать."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:441
+#, no-wrap
+msgid "This dumping core business sounds as though it could be quite useful, if I can make it happen when I want to. Can I do this, or do I have to wait until there is an error?"
+msgstr "Этот процесс создания дампа памяти звучит довольно полезно, если я могу запускать его по своему желанию. Могу ли я это сделать, или нужно ждать возникновения ошибки?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:444
+msgid "Yes, just go to another console or xterm, do"
+msgstr "Можете. Просто перейдите на другую консоль или xterm, выполните"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:448
+#, no-wrap
+msgid "% ps\n"
+msgstr "% ps\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:451
+msgid "to find out the process ID of your program, and do"
+msgstr "чтобы узнать идентификатор процесса вашей программы и выполните"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:455
+#, no-wrap
+msgid "% kill -ABRT pid\n"
+msgstr "% kill -ABRT pid\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:458
+msgid "where `_pid_` is the process ID you looked up."
+msgstr "где `_pid_` — идентификатор процесса, который вы нашли."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:461
+msgid ""
+"This is useful if your program has got stuck in an infinite loop, for "
+"instance. If your program happens to trap SIGABRT, there are several other "
+"signals which have a similar effect."
+msgstr ""
+"Это полезно, если ваша программа зависла в бесконечном цикле, например. Если "
+"ваша программа перехватывает SIGABRT, есть несколько других сигналов, "
+"которые оказывают аналогичный эффект."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:464
+msgid ""
+"Alternatively, you can create a core dump from inside your program, by "
+"calling the `abort()` function. See the manual page of man:abort[3] to "
+"learn more."
+msgstr ""
+"В качестве альтернативы, вы можете создать дамп памяти изнутри вашей "
+"программы, вызвав функцию `abort()`. Дополнительную информацию можно найти "
+"на man:abort[3]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:467
+msgid ""
+"If you want to create a core dump from outside your program, but do not want "
+"the process to terminate, you can use the `gcore` program. See the manual "
+"page of man:gcore[1] for more information."
+msgstr ""
+"Если вы хотите создать дамп памяти извне вашей программы, но не хотите "
+"завершать процесс, вы можете использовать программу `gcore`. Подробнее см. "
+"на странице руководства man:gcore[1]."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:469
+#, no-wrap
+msgid "Make"
+msgstr "Make"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:471
+#, no-wrap
+msgid "What is `make`?"
+msgstr "Что такое `make`?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:474
+msgid ""
+"When you are working on a simple program with only one or two source files, "
+"typing in"
+msgstr ""
+"Когда вы работаете над простой программой с одним или двумя исходными "
+"файлами, вводя"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:478
+#, no-wrap
+msgid "% cc file1.c file2.c\n"
+msgstr "% cc file1.c file2.c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:481
+msgid ""
+"is not too bad, but it quickly becomes very tedious when there are several "
+"files-and it can take a while to compile, too."
+msgstr ""
+"это не слишком плохо, но быстро становится очень утомительным, когда есть "
+"несколько файлов — и компиляция тоже может занять время."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:484
+msgid ""
+"One way to get around this is to use object files and only recompile the "
+"source file if the source code has changed. So we could have something like:"
+msgstr ""
+"Один из способов обойти это — использовать объектные файлы и "
+"перекомпилировать исходный файл только в случае изменения исходного кода. "
+"Таким образом, у нас может получиться что-то вроде:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:488
+#, no-wrap
+msgid "% cc file1.o file2.o … file37.c …\n"
+msgstr "% cc file1.o file2.o … file37.c …\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:492
+msgid ""
+"if we had changed [.filename]#file37.c#, but not any of the others, since "
+"the last time we compiled. This may speed up the compilation quite a bit, "
+"but does not solve the typing problem."
+msgstr ""
+"если бы мы изменили файл [.filename]#file37.c#, но не трогали остальные с "
+"момента последней компиляции. Это может значительно ускорить компиляцию, но "
+"не решает проблему с вводом."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:494
+msgid ""
+"Or we could write a shell script to solve the typing problem, but it would "
+"have to re-compile everything, making it very inefficient on a large project."
+msgstr ""
+"Или мы могли бы написать shell-скрипт для решения проблемы с вводом, но "
+"тогда пришлось бы перекомпилировать всё, что сделало бы его очень "
+"неэффективным для крупного проекта."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:496
+msgid ""
+"What happens if we have hundreds of source files lying about? What if we are "
+"working in a team with other people who forget to tell us when they have "
+"changed one of their source files that we use?"
+msgstr ""
+"Что произойдет, если у нас есть сотни исходных файлов? Что, если мы работаем "
+"в команде с другими людьми, которые забывают сообщить нам, когда они "
+"изменили один из своих исходных файлов, которые мы используем?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:499
+msgid ""
+"Perhaps we could put the two solutions together and write something like a "
+"shell script that would contain some kind of magic rule saying when a source "
+"file needs compiling. Now all we need now is a program that can understand "
+"these rules, as it is a bit too complicated for the shell."
+msgstr ""
+"Возможно, мы могли бы объединить два решения и написать что-то вроде shell-"
+"скрипта, который содержал бы какое-то волшебное правило, указывающее, когда "
+"исходный файл нужно компилировать. Теперь нам осталось только найти "
+"программу, которая сможет понимать эти правила, так как для shell это "
+"немного слишком сложно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:504
+msgid ""
+"This program is called `make`. It reads in a file, called a _makefile_, "
+"that tells it how different files depend on each other, and works out which "
+"files need to be re-compiled and which ones do not. For example, a rule "
+"could say something like \"if [.filename]#fromboz.o# is older than "
+"[.filename]#fromboz.c#, that means someone must have changed "
+"[.filename]#fromboz.c#, so it needs to be re-compiled.\" The makefile also "
+"has rules telling make _how_ to re-compile the source file, making it a much "
+"more powerful tool."
+msgstr ""
+"Эта программа называется `make`. Она читает файл, называемый _makefile_, "
+"который указывает, как различные файлы зависят друг от друга, и определяет, "
+"какие файлы нужно перекомпилировать, а какие нет. Например, правило может "
+"звучать так: «если [.filename]#fromboz.o# старше, чем "
+"[.filename]#fromboz.c#, значит, кто-то изменил [.filename]#fromboz.c#, и его "
+"нужно перекомпилировать». В makefile также содержатся правила, указывающие "
+"make, _как_ именно перекомпилировать исходный файл, что делает эту программу "
+"гораздо более мощным инструментом."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:507
+msgid ""
+"Makefiles are typically kept in the same directory as the source they apply "
+"to, and can be called [.filename]#makefile#, [.filename]#Makefile# or "
+"[.filename]#MAKEFILE#. Most programmers use the name [.filename]#Makefile#, "
+"as this puts it near the top of a directory listing, where it can easily be "
+"seen.footnote:[They do not use the MAKEFILE form as block capitals are often "
+"used for documentation files like README.]"
+msgstr ""
+"Файлы Makefile обычно хранятся в том же каталоге, что и исходный код, к "
+"которому они применяются, и могут называться [.filename]#makefile#, "
+"[.filename]#Makefile# или [.filename]#MAKEFILE#. Большинство программистов "
+"используют имя [.filename]#Makefile#, так как это помещает его в начало "
+"списка файлов в каталоге, где его легко заметить.footnote:[Они не используют "
+"форму MAKEFILE, так как заглавные буквы часто применяются для файлов "
+"документации, таких как README.]"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:508
+#, no-wrap
+msgid "Example of Using `make`"
+msgstr "Пример использования `make`"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:511
+msgid "Here is a very simple make file:"
+msgstr "Вот очень простой файл для make:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:516
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:542
+#, no-wrap
+msgid ""
+"foo: foo.c\n"
+"\tcc -o foo foo.c\n"
+msgstr ""
+"foo: foo.c\n"
+"\tcc -o foo foo.c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:519
+msgid "It consists of two lines, a dependency line and a creation line."
+msgstr "Он состоит из двух строк: строки зависимости и строки создания."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:526
+msgid ""
+"The dependency line here consists of the name of the program (known as the "
+"_target_), followed by a colon, then whitespace, then the name of the source "
+"file. When `make` reads this line, it looks to see if [.filename]#foo# "
+"exists; if it exists, it compares the time [.filename]#foo# was last "
+"modified to the time [.filename]#foo.c# was last modified. If "
+"[.filename]#foo# does not exist, or is older than [.filename]#foo.c#, it "
+"then looks at the creation line to find out what to do. In other words, "
+"this is the rule for working out when [.filename]#foo.c# needs to be re-"
+"compiled."
+msgstr ""
+"Строка зависимости здесь состоит из имени программы (известного как _цель_), "
+"за которым следует двоеточие, пробел и имя исходного файла. Когда `make` "
+"читает эту строку, он проверяет, существует ли файл [.filename]#foo#; если "
+"он существует, программа сравнивает время последнего изменения файла "
+"[.filename]#foo# с временем последнего изменения файла [.filename]#foo.c#. "
+"Если файл [.filename]#foo# не существует или старше файла "
+"[.filename]#foo.c#, программа смотрит на строку создания, чтобы выяснить, "
+"что делать. Другими словами, это правило для определения, когда файл "
+"[.filename]#foo.c# нужно перекомпилировать."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:530
+msgid ""
+"The creation line starts with a tab (press kbd:[tab]) and then the command "
+"you would type to create [.filename]#foo# if you were doing it at a command "
+"prompt. If [.filename]#foo# is out of date, or does not exist, `make` then "
+"executes this command to create it. In other words, this is the rule which "
+"tells make how to re-compile [.filename]#foo.c#."
+msgstr ""
+"Строка создания начинается с табуляции (нажмите kbd:[tab]), а затем следует "
+"команда, которую вы бы ввели для создания [.filename]#foo#, если бы делали "
+"это в командной строке. Если [.filename]#foo# устарел или не существует, "
+"`make` выполняет эту команду для его создания. Другими словами, это правило, "
+"которое сообщает make, как перекомпилировать [.filename]#foo.c#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:534
+msgid ""
+"So, when you type `make`, it will make sure that [.filename]#foo# is up to "
+"date with respect to your latest changes to [.filename]#foo.c#. This "
+"principle can be extended to [.filename]#Makefile#'s with hundreds of "
+"targets-in fact, on FreeBSD, it is possible to compile the entire operating "
+"system just by typing `make buildworld buildkernel` at the top level "
+"directory in the src tree."
+msgstr ""
+"Таким образом, при вводе команды `make` система обеспечит актуальность файла "
+"[.filename]#foo# относительно последних изменений в [.filename]#foo.c#. Этот "
+"принцип можно распространить на [.filename]#Makefile#, содержащие сотни "
+"целей — фактически, в FreeBSD можно собрать всю операционную систему, просто "
+"введя `make buildworld buildkernel` в корневом каталоге дерева исходных "
+"кодов (src)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:537
+msgid ""
+"Another useful property of makefiles is that the targets do not have to be "
+"programs. For instance, we could have a make file that looks like this:"
+msgstr ""
+"Еще одно полезное свойство makefile заключается в том, что цели не "
+"обязательно должны быть программами. Например, у нас может быть makefile, "
+"который выглядит так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:545
+#, no-wrap
+msgid ""
+"install:\n"
+"\tcp foo /home/me\n"
+msgstr ""
+"install:\n"
+"\tcp foo /home/me\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:548
+msgid "We can tell make which target we want to make by typing:"
+msgstr "Мы можем указать make, какую цель мы хотим собрать, набрав:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:552
+#, no-wrap
+msgid "% make target\n"
+msgstr "% make target\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:556
+msgid ""
+"`make` will then only look at that target and ignore any others. For "
+"example, if we type `make foo` with the makefile above, make will ignore the "
+"`install` target."
+msgstr ""
+"`make` будет рассматривать только указанную цель и игнорировать все "
+"остальные. Например, если мы введём `make foo` с указанным выше makefile, "
+"make проигнорирует цель `install`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:559
+msgid ""
+"If we just type `make` on its own, make will always look at the first target "
+"and then stop without looking at any others. So if we typed `make` here, it "
+"will just go to the `foo` target, re-compile [.filename]#foo# if necessary, "
+"and then stop without going on to the `install` target."
+msgstr ""
+"Если мы просто введем `make` без параметров, make всегда будет обращаться к "
+"первой цели и затем остановится, не рассматривая остальные. Поэтому если мы "
+"введем `make` здесь, он просто перейдет к цели `foo`, перекомпилирует "
+"[.filename]#foo# при необходимости и затем остановится, не переходя к цели "
+"`install`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:563
+msgid ""
+"Notice that the `install` target does not actually depend on anything! This "
+"means that the command on the following line is always executed when we try "
+"to make that target by typing `make install`. In this case, it will copy "
+"[.filename]#foo# into the user's home directory. This is often used by "
+"application makefiles, so that the application can be installed in the "
+"correct directory when it has been correctly compiled."
+msgstr ""
+"Обратите внимание, что цель `install` не зависит ни от чего! Это означает, "
+"что команда в следующей строке всегда выполняется при попытке создать эту "
+"цель с помощью команды `make install`. В данном случае она скопирует "
+"[.filename]#foo# в домашний каталог пользователя. Это часто используется в "
+"makefile приложений, чтобы приложение можно было установить в правильный "
+"каталог после успешной компиляции."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:568
+msgid ""
+"This is a slightly confusing subject to try to explain. If you do not quite "
+"understand how `make` works, the best thing to do is to write a simple "
+"program like \"hello world\" and a make file like the one above and "
+"experiment. Then progress to using more than one source file, or having the "
+"source file include a header file. `touch` is very useful here-it changes "
+"the date on a file without you having to edit it."
+msgstr ""
+"Это немного запутанная тема для объяснения. Если вы не до конца понимаете, "
+"как работает `make`, лучше всего написать простую программу, например, "
+"\"hello world\", и make-файл, как указано выше, и поэкспериментировать. "
+"Затем можно перейти к использованию нескольких исходных файлов или "
+"добавлению заголовочного файла в исходный код. В этом случае очень полезен "
+"`touch` — он изменяет дату файла без необходимости его редактирования."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:569
+#, no-wrap
+msgid "Make and include-files"
+msgstr "make и include-файлы"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:573
+msgid ""
+"C code often starts with a list of files to include, for example stdio.h. "
+"Some of these files are system-include files, some of them are from the "
+"project you are now working on:"
+msgstr ""
+"Код на C часто начинается со списка подключаемых файлов, например stdio.h. "
+"Некоторые из этих файлов являются системными, а некоторые принадлежат "
+"текущему проекту:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:578
+#, no-wrap
+msgid ""
+"#include <stdio.h>\n"
+"#include \"foo.h\"\n"
+msgstr ""
+"#include <stdio.h>\n"
+"#include \"foo.h\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:580
+#, no-wrap
+msgid "int main(....\n"
+msgstr "int main(....\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:583
+msgid ""
+"To make sure that this file is recompiled the moment [.filename]#foo.h# is "
+"changed, you have to add it in your [.filename]#Makefile#:"
+msgstr ""
+"Чтобы убедиться, что этот файл перекомпилируется при изменении "
+"[.filename]#foo.h#, необходимо добавить его в [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:587
+#, no-wrap
+msgid "foo: foo.c foo.h\n"
+msgstr "foo: foo.c foo.h\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:594
+msgid ""
+"The moment your project is getting bigger and you have more and more own "
+"include-files to maintain, it will be a pain to keep track of all include "
+"files and the files which are depending on it. If you change an include-"
+"file but forget to recompile all the files which are depending on it, the "
+"results will be devastating. `clang` has an option to analyze your files "
+"and to produce a list of include-files and their dependencies: `-MM`."
+msgstr ""
+"В момент, когда ваш проект становится больше и у вас появляется все больше "
+"собственных включаемых файлов для поддержки, отслеживание всех включаемых "
+"файлов и файлов, которые от них зависят, становится проблемой. Если вы "
+"измените включаемый файл, но забудете перекомпилировать все файлы, которые "
+"от него зависят, последствия будут катастрофическими. У `clang` есть опция "
+"для анализа ваших файлов и создания списка включаемых файлов и их "
+"зависимостей: `-MM`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:596
+msgid "If you add this to your Makefile:"
+msgstr "Если вы добавите это в ваш Makefile:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:601
+#, no-wrap
+msgid ""
+"depend:\n"
+"\tcc -E -MM *.c > .depend\n"
+msgstr ""
+"depend:\n"
+"\tcc -E -MM *.c > .depend\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:604
+msgid ""
+"and run `make depend`, the file [.filename]#.depend# will appear with a list "
+"of object-files, C-files and the include-files:"
+msgstr ""
+"и выполните `make depend`, появится файл [.filename]#.depend# со списком "
+"объектных файлов, C-файлов и включаемых файлов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:608
+#, no-wrap
+msgid "foo.o: foo.c foo.h\n"
+msgstr "foo.o: foo.c foo.h\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:611
+msgid ""
+"If you change [.filename]#foo.h#, next time you run `make` all files "
+"depending on [.filename]#foo.h# will be recompiled."
+msgstr ""
+"Если вы измените файл [.filename]#foo.h#, при следующем запуске `make` все "
+"файлы, зависящие от [.filename]#foo.h#, будут перекомпилированы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:613
+msgid ""
+"Do not forget to run `make depend` each time you add an include-file to one "
+"of your files."
+msgstr ""
+"Не забудьте выполнить `make depend` каждый раз, когда вы добавляете include-"
+"файл в один из своих файлов."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:614
+#, no-wrap
+msgid "FreeBSD Makefiles"
+msgstr "Файлы Makefile системы FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:620
+msgid ""
+"Makefiles can be rather complicated to write. Fortunately, BSD-based "
+"systems like FreeBSD come with some very powerful ones as part of the "
+"system. One very good example of this is the FreeBSD ports system. Here is "
+"the essential part of a typical ports [.filename]#Makefile#:"
+msgstr ""
+"Makefile-ы могут быть довольно сложными для написания. К счастью, в BSD-"
+"системах, таких как FreeBSD, есть очень мощные Makefile-ы, поставляемые в "
+"составе системы. Отличным примером этого является система портов FreeBSD. "
+"Вот основная часть типичного [.filename]#Makefile# для портов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:625
+#, no-wrap
+msgid ""
+"MASTER_SITES= ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/\n"
+"DISTFILES= scheme-microcode+dist-7.3-freebsd.tgz\n"
+msgstr ""
+"MASTER_SITES= ftp://freefall.cdrom.com/pub/FreeBSD/LOCAL_PORTS/\n"
+"DISTFILES= scheme-microcode+dist-7.3-freebsd.tgz\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:627
+#, no-wrap
+msgid ".include <bsd.port.mk>\n"
+msgstr ".include <bsd.port.mk>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:630
+msgid ""
+"Now, if we go to the directory for this port and type `make`, the following "
+"happens:"
+msgstr ""
+"Теперь, если мы перейдем в каталог этого порта и наберем `make`, произойдет "
+"следующее:"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:633
+msgid ""
+"A check is made to see if the source code for this port is already on the "
+"system."
+msgstr "Проверяется, есть ли исходный код этого порта уже в системе."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:634
+msgid ""
+"If it is not, an FTP connection to the URL in MASTER_SITES is set up to "
+"download the source."
+msgstr ""
+"Если это не так, устанавливается FTP-соединение с URL в MASTER_SITES для "
+"загрузки исходного кода."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:635
+msgid ""
+"The checksum for the source is calculated and compared it with one for a "
+"known, good, copy of the source. This is to make sure that the source was "
+"not corrupted while in transit."
+msgstr ""
+"Контрольная сумма исходного кода вычисляется и сравнивается с контрольной "
+"суммой известной и хорошей копии исходного кода. Это делается для того, "
+"чтобы убедиться, что исходный код не был поврежден во время передачи."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:636
+msgid ""
+"Any changes required to make the source work on FreeBSD are applied-this is "
+"known as _patching_."
+msgstr ""
+"Все необходимые изменения для адаптации исходного кода к работе в FreeBSD "
+"применяются — это называется применением _патча_."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:637
+msgid ""
+"Any special configuration needed for the source is done. (Many UNIX(R) "
+"program distributions try to work out which version of UNIX(R) they are "
+"being compiled on and which optional UNIX(R) features are present-this is "
+"where they are given the information in the FreeBSD ports scenario)."
+msgstr ""
+"Любая необходимая специальная настройка для исходного кода выполнена. "
+"(Многие дистрибутивы программ UNIX(R) пытаются определить, на какой версии "
+"UNIX(R) они компилируются и какие дополнительные функции UNIX(R) доступны — "
+"именно здесь они получают эту информацию в сценарии портов FreeBSD)."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:638
+msgid ""
+"The source code for the program is compiled. In effect, we change to the "
+"directory where the source was unpacked and do `make`-the program's own make "
+"file has the necessary information to build the program."
+msgstr ""
+"Компилируется исходный код программы. По сути, мы переходим в каталог, куда "
+"были распакованы исходные файлы, и выполняем `make` — собственный make-файл "
+"программы содержит необходимую информацию для сборки программы."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:639
+msgid ""
+"We now have a compiled version of the program. If we wish, we can test it "
+"now; when we feel confident about the program, we can type `make install`. "
+"This will cause the program and any supporting files it needs to be copied "
+"into the correct location; an entry is also made into a `package database`, "
+"so that the port can easily be uninstalled later if we change our mind about "
+"it."
+msgstr ""
+"Теперь у нас есть скомпилированная версия программы. При желании мы можем "
+"протестировать её сейчас; когда мы уверены в программе, можно ввести `make "
+"install`. Это приведёт к копированию программы и всех необходимых "
+"вспомогательных файлов в нужные места, а также к добавлению записи в `базу "
+"данных пакетов`, чтобы позже можно было легко удалить порт, если мы "
+"передумаем."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:641
+msgid ""
+"Now I think you will agree that is rather impressive for a four line script!"
+msgstr ""
+"Вот теперь, я думаю, вы согласитесь, что это довольно впечатляюще для "
+"скрипта из четырёх строк!"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:645
+msgid ""
+"The secret lies in the last line, which tells `make` to look in the system "
+"makefile called [.filename]#bsd.port.mk#. It is easy to overlook this line, "
+"but this is where all the clever stuff comes from-someone has written a "
+"makefile that tells `make` to do all the things above (plus a couple of "
+"other things I did not mention, including handling any errors that may "
+"occur) and anyone can get access to that just by putting a single line in "
+"their own make file!"
+msgstr ""
+"Секрет кроется в последней строке, которая указывает `make` обратиться к "
+"системному makefile под названием [.filename]#bsd.port.mk#. Эту строку легко "
+"пропустить, но именно здесь начинается вся магия — кто-то написал makefile, "
+"который предписывает `make` выполнить все вышеперечисленные действия (плюс "
+"несколько других, которые я не упомянул, включая обработку возможных "
+"ошибок), и любой может получить доступ к этому функционалу, просто добавив "
+"одну строку в свой собственный makefile!"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:649
+msgid ""
+"If you want to have a look at these system makefiles, they are in "
+"[.filename]#/usr/share/mk#, but it is probably best to wait until you have "
+"had a bit of practice with makefiles, as they are very complicated (and if "
+"you do look at them, make sure you have a flask of strong coffee handy!)"
+msgstr ""
+"Если вы хотите взглянуть на эти системные makefile-ы, они находятся в "
+"[.filename]#/usr/share/mk#, но, вероятно, лучше подождать, пока у вас не "
+"появится немного практики с makefile, так как они очень сложные (и если вы "
+"всё же решите их посмотреть, убедитесь, что у вас под рукой есть фляга "
+"крепкого кофе!)"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:650
+#, no-wrap
+msgid "More Advanced Uses of `make`"
+msgstr "Более сложные способы использования `make`"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:656
+msgid ""
+"`Make` is a very powerful tool, and can do much more than the simple example "
+"above shows. Unfortunately, there are several different versions of `make`, "
+"and they all differ considerably. The best way to learn what they can do is "
+"probably to read the documentation-hopefully this introduction will have "
+"given you a base from which you can do this. The man:make[1] manual page "
+"offers a comprehensive discussion of variables, arguments, and how to use "
+"make."
+msgstr ""
+"`Make` — это очень мощный инструмент, способный на гораздо большее, чем "
+"показано в простом примере выше. К сожалению, существует несколько различных "
+"версий `make`, и все они значительно отличаются друг от друга. Лучший способ "
+"узнать, на что они способны, — вероятно, прочитать документацию. Надеюсь, "
+"это введение дало вам основу, с которой вы сможете это сделать. В "
+"man:make[1] подробно обсуждаются переменные, аргументы и то, как "
+"использовать `make`."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:660
+msgid ""
+"Many applications in the ports use GNU make, which has a very good set of "
+"\"info\" pages. If you have installed any of these ports, GNU make will "
+"automatically have been installed as `gmake`. It is also available as a "
+"port and package in its own right."
+msgstr ""
+"Многие приложения в портах используют GNU make, который имеет очень хороший "
+"набор страниц \"info\". Если вы установили любой из этих портов, GNU make "
+"будет автоматически установлен как `gmake`. Он также доступен как отдельный "
+"порт и пакет."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:663
+msgid ""
+"To view the info pages for GNU make, you will have to edit [.filename]#dir# "
+"in the [.filename]#/usr/local/info# directory to add an entry for it. This "
+"involves adding a line like"
+msgstr ""
+"Для просмотра справочных страниц (info) GNU make вам потребуется "
+"отредактировать файл [.filename]#dir# в каталоге [.filename]#/usr/local/"
+"info#, добавив соответствующую запись. Добавьте строку"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:667
+#, no-wrap
+msgid " * Make: (make). The GNU Make utility.\n"
+msgstr " * Make: (make). The GNU Make utility.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:670
+msgid ""
+"to the file. Once you have done this, you can type `info` and then select "
+"[.guimenuitem]#make# from the menu (or in Emacs, do `C-h i`)."
+msgstr ""
+"в файл. После этого вы можете ввести `info` и затем выбрать "
+"[.guimenuitem]#make# из меню (или в Emacs выполнить `C-h i`)."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:672
+#, no-wrap
+msgid "Debugging"
+msgstr "Отладка"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:674
+#, no-wrap
+msgid "Introduction to Available Debuggers"
+msgstr "Обзор отладчиков, поставляемых в системе"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:679
+msgid ""
+"Using a debugger allows running the program under more controlled "
+"circumstances. Typically, it is possible to step through the program a line "
+"at a time, inspect the value of variables, change them, tell the debugger to "
+"run up to a certain point and then stop, and so on. It is also possible to "
+"attach to a program that is already running, or load a core file to "
+"investigate why the program crashed."
+msgstr ""
+"Использование отладчика позволяет запускать программу в более контролируемых "
+"условиях. Обычно можно выполнять программу построчно, проверять значения "
+"переменных, изменять их, указывать отладчику выполнение до определённой "
+"точки и затем останавливаться и так далее. Также можно подключиться к уже "
+"работающей программе или загрузить core-файл, чтобы исследовать причину "
+"аварийного завершения программы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:682
+msgid ""
+"This section is intended to be a quick introduction to using debuggers and "
+"does not cover specialized topics such as debugging the kernel. For more "
+"information about that, refer to crossref:kerneldebug[kerneldebug,Kernel "
+"Debugging]."
+msgstr ""
+"Этот раздел представляет собой краткое введение в использование отладчиков и "
+"не затрагивает специализированные темы, такие как отладка ядра. Для "
+"получения дополнительной информации по этой теме обратитесь к главе "
+"crossref:kerneldebug[kerneldebug,Отладка ядра]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:686
+msgid ""
+"The standard debugger supplied with FreeBSD is called `lldb` (LLVM "
+"debugger). As it is part of the standard installation for that release, "
+"there is no need to do anything special to use it. It has good command "
+"help, accessible via the `help` command, as well as https://lldb.llvm.org/[a "
+"web tutorial and documentation]."
+msgstr ""
+"Стандартный отладчик, поставляемый с FreeBSD, называется `lldb` (LLVM "
+"debugger). Поскольку он является частью стандартной установки для данного "
+"выпуска, нет необходимости выполнять какие-либо дополнительные действия для "
+"его использования. Он обладает хорошей справкой по командам, доступной через "
+"команду `help`, а также https://lldb.llvm.org/[руководством и документацией "
+"в интернете]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:690
+msgid ""
+"The `lldb` command is also available extref:{handbook}ports/[from ports or "
+"packages, ports-using] as package:devel/llvm[]."
+msgstr ""
+"Команда `lldb` также доступна extref:{handbook}ports/[из портов или пакетов, "
+"ports-using] как пакет package:devel/llvm[]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:696
+msgid ""
+"The other debugger available with FreeBSD is called `gdb` (GNU debugger). "
+"Unlike lldb, it is not installed by default on FreeBSD; to use it, extref:"
+"{handbook}#ports-using/[install] package:devel/gdb[] from ports or "
+"packages. It has excellent on-line help, as well as a set of info pages."
+msgstr ""
+"Другой отладчик, доступный в FreeBSD, называется `gdb` (GNU debugger). В "
+"отличие от lldb, он не устанавливается по умолчанию в FreeBSD; для его "
+"использования необходимо extref:{handbook}#ports-using/[установить] пакет "
+"package:devel/gdb[] из портов или пакетов. Он обладает отличной встроенной "
+"справкой, а также набором info-страниц."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:701
+msgid ""
+"The two debuggers have a similar feature set, so which one to use is largely "
+"a matter of taste. If familiar with one only, use that one. People "
+"familiar with neither or both but wanting to use one from inside Emacs will "
+"need to use `gdb` as `lldb` is unsupported by Emacs. Otherwise, try both "
+"and see which one you prefer."
+msgstr ""
+"Два отладчика обладают схожим набором функций, поэтому выбор между ними в "
+"основном зависит от личных предпочтений. Если вы знакомы только с одним из "
+"них, используйте его. Тем, кто не знаком ни с одним или знаком с обоими, но "
+"хочет использовать отладчик внутри Emacs, придётся выбрать `gdb`, так как "
+"`lldb` не поддерживается Emacs. В остальных случаях попробуйте оба и решите, "
+"какой вам больше нравится."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:702
+#, no-wrap
+msgid "Using lldb"
+msgstr "Использование lldb"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:704
+#, no-wrap
+msgid "Starting lldb"
+msgstr "Запуск lldb"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:707
+msgid "Start up lldb by typing"
+msgstr "Запустите lldb, набрав"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:711
+#, no-wrap
+msgid "% lldb -- progname\n"
+msgstr "% lldb -- progname\n"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:713
+#, no-wrap
+msgid "Running a Program with lldb"
+msgstr "Запуск программы с lldb"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:718
+msgid ""
+"Compile the program with `-g` to get the most out of using `lldb`. It will "
+"work without, but will only display the name of the function currently "
+"running, instead of the source code. If it displays a line like:"
+msgstr ""
+"Скомпилируйте программу с `-g`, чтобы максимально использовать возможности "
+"`lldb`. Без этого флаг она будет работать, но отображать только имя текущей "
+"выполняемой функции вместо исходного кода. Если отображается строка вида:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:722
+#, no-wrap
+msgid "Breakpoint 1: where = temp`main, address = …\n"
+msgstr "Breakpoint 1: where = temp`main, address = …\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:725
+msgid ""
+"(without an indication of source code filename and line number) when setting "
+"a breakpoint, this means that the program was not compiled with `-g`."
+msgstr ""
+"(без указания имени файла исходного кода и номера строки) при установке "
+"точки останова это означает, что программа не была скомпилирована с "
+"параметром `-g`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:730
+msgid ""
+"Most `lldb` commands have shorter forms that can be used instead. The "
+"longer forms are used here for clarity."
+msgstr ""
+"Большинство команд `lldb` имеют более короткие формы, которые можно "
+"использовать вместо полных. Здесь используются полные формы для ясности."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:735
+msgid ""
+"At the `lldb` prompt, type `breakpoint set -n main`. This will tell the "
+"debugger not to display the preliminary set-up code in the program being run "
+"and to stop execution at the beginning of the program's code. Now type "
+"`process launch` to actually start the program- it will start at the "
+"beginning of the set-up code and then get stopped by the debugger when it "
+"calls `main()`."
+msgstr ""
+"На строке `lldb` введите `breakpoint set -n main`. Это укажет отладчику не "
+"показывать предварительный код настройки в запускаемой программе и "
+"остановить выполнение в начале кода программы. Теперь введите `process "
+"launch`, чтобы фактически запустить программу — она начнётся с кода "
+"настройки, а затем будет остановлена отладчиком при вызове `main()`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:739
+msgid ""
+"To step through the program a line at a time, type `thread step-over`. When "
+"the program gets to a function call, step into it by typing `thread step-"
+"in`. Once in a function call, return from it by typing `thread step-out` or "
+"use `up` and `down` to take a quick look at the caller."
+msgstr ""
+"Для пошагового выполнения программы строка за строкой введите `thread step-"
+"over`. Когда программа дойдёт до вызова функции, войдите в неё, набрав "
+"`thread step-in`. Оказавшись внутри вызова функции, вернитесь из него с "
+"помощью команды `thread step-out` или используйте `up` и `down`, чтобы "
+"быстро посмотреть на вызывающий код."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:742
+msgid ""
+"Here is a simple example of how to spot a mistake in a program with `lldb`. "
+"This is our program (with a deliberate mistake):"
+msgstr ""
+"Вот простой пример того, как найти ошибку в программе с помощью `lldb`. Это "
+"наша программа (с умышленной ошибкой):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:746
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1020
+#, no-wrap
+msgid "#include <stdio.h>\n"
+msgstr "#include <stdio.h>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:748
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1022
+#, no-wrap
+msgid "int bazz(int anint);\n"
+msgstr "int bazz(int anint);\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:751
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1025
+#, no-wrap
+msgid ""
+"main() {\n"
+"\tint i;\n"
+msgstr ""
+"main() {\n"
+"\tint i;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:756
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1030
+#, no-wrap
+msgid ""
+"\tprintf(\"This is my program\\n\");\n"
+"\tbazz(i);\n"
+"\treturn 0;\n"
+"}\n"
+msgstr ""
+"\tprintf(\"This is my program\\n\");\n"
+"\tbazz(i);\n"
+"\treturn 0;\n"
+"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:761
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1035
+#, no-wrap
+msgid ""
+"int bazz(int anint) {\n"
+"\tprintf(\"You gave me %d\\n\", anint);\n"
+"\treturn anint;\n"
+"}\n"
+msgstr ""
+"int bazz(int anint) {\n"
+"\tprintf(\"You gave me %d\\n\", anint);\n"
+"\treturn anint;\n"
+"}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:764
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1038
+msgid ""
+"This program sets i to be `5` and passes it to a function `bazz()` which "
+"prints out the number we gave it."
+msgstr ""
+"Эта программа устанавливает значение `i` равным `5` и передает его в функцию "
+"`bazz()`, которая выводит переданное число."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:766
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1040
+msgid "Compiling and running the program displays"
+msgstr "Компиляция и запуск программы отображают"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:773
+#, no-wrap
+msgid ""
+"% cc -g -o temp temp.c\n"
+"% ./temp\n"
+"This is my program\n"
+"anint = -5360\n"
+msgstr ""
+"% cc -g -o temp temp.c\n"
+"% ./temp\n"
+"This is my program\n"
+"anint = -5360\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:776
+msgid "That is not what was expected! Time to see what is going on!"
+msgstr "Это не то, что ожидалось! Пора разобраться, что происходит!"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:787
+#, no-wrap
+msgid ""
+"% lldb -- temp\n"
+"(lldb) target create \"temp\"\n"
+"Current executable set to 'temp' (x86_64).\n"
+"(lldb) breakpoint set -n main\t\t\t\tSkip the set-up code\n"
+"Breakpoint 1: where = temp`main + 15 at temp.c:8:2, address = 0x00000000002012ef\tlldb puts breakpoint at main()\n"
+"(lldb) process launch\t\t\t\t\tRun as far as main()\n"
+"Process 9992 launching\n"
+"Process 9992 launched: '/home/pauamma/tmp/temp' (x86_64)\tProgram starts running\n"
+msgstr ""
+"% lldb -- temp\n"
+"(lldb) target create \"temp\"\n"
+"Current executable set to 'temp' (x86_64).\n"
+"(lldb) breakpoint set -n main\t\t\t\tSkip the set-up code\n"
+"Breakpoint 1: where = temp`main + 15 at temp.c:8:2, address = 0x00000000002012ef\tlldb puts breakpoint at main()\n"
+"(lldb) process launch\t\t\t\t\tRun as far as main()\n"
+"Process 9992 launching\n"
+"Process 9992 launched: '/home/pauamma/tmp/temp' (x86_64)\tProgram starts running\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:821
+#, no-wrap
+msgid ""
+"Process 9992 stopped\n"
+"* thread #1, name = 'temp', stop reason = breakpoint 1.1\tlldb stops at main()\n"
+" frame #0: 0x00000000002012ef temp`main at temp.c:8:2\n"
+" 5\tmain() {\n"
+" 6\t\tint i;\n"
+" 7\n"
+"-> 8\t\tprintf(\"This is my program\\n\");\t\t\tIndicates the line where it stopped\n"
+" 9\t\tbazz(i);\n"
+" 10\t\treturn 0;\n"
+" 11\t}\n"
+"(lldb) thread step-over\t\t\tGo to next line\n"
+"This is my program\t\t\t\t\t\tProgram prints out\n"
+"Process 9992 stopped\n"
+"* thread #1, name = 'temp', stop reason = step over\n"
+" frame #0: 0x0000000000201300 temp`main at temp.c:9:7\n"
+" 6\t\tint i;\n"
+" 7\n"
+" 8\t\tprintf(\"This is my program\\n\");\n"
+"-> 9\t\tbazz(i);\n"
+" 10\t\treturn 0;\n"
+" 11\t}\n"
+" 12\n"
+"(lldb) thread step-in\t\t\tstep into bazz()\n"
+"Process 9992 stopped\n"
+"* thread #1, name = 'temp', stop reason = step in\n"
+" frame #0: 0x000000000020132b temp`bazz(anint=-5360) at temp.c:14:29\tlldb displays stack frame\n"
+" 11\t}\n"
+" 12\n"
+" 13\tint bazz(int anint) {\n"
+"-> 14\t\tprintf(\"You gave me %d\\n\", anint);\n"
+" 15\t\treturn anint;\n"
+" 16\t}\n"
+"(lldb)\n"
+msgstr ""
+"Process 9992 stopped\n"
+"* thread #1, name = 'temp', stop reason = breakpoint 1.1\tlldb stops at main()\n"
+" frame #0: 0x00000000002012ef temp`main at temp.c:8:2\n"
+" 5\tmain() {\n"
+" 6\t\tint i;\n"
+" 7\n"
+"-> 8\t\tprintf(\"This is my program\\n\");\t\t\tIndicates the line where it stopped\n"
+" 9\t\tbazz(i);\n"
+" 10\t\treturn 0;\n"
+" 11\t}\n"
+"(lldb) thread step-over\t\t\tGo to next line\n"
+"This is my program\t\t\t\t\t\tProgram prints out\n"
+"Process 9992 stopped\n"
+"* thread #1, name = 'temp', stop reason = step over\n"
+" frame #0: 0x0000000000201300 temp`main at temp.c:9:7\n"
+" 6\t\tint i;\n"
+" 7\n"
+" 8\t\tprintf(\"This is my program\\n\");\n"
+"-> 9\t\tbazz(i);\n"
+" 10\t\treturn 0;\n"
+" 11\t}\n"
+" 12\n"
+"(lldb) thread step-in\t\t\tstep into bazz()\n"
+"Process 9992 stopped\n"
+"* thread #1, name = 'temp', stop reason = step in\n"
+" frame #0: 0x000000000020132b temp`bazz(anint=-5360) at temp.c:14:29\tlldb displays stack frame\n"
+" 11\t}\n"
+" 12\n"
+" 13\tint bazz(int anint) {\n"
+"-> 14\t\tprintf(\"You gave me %d\\n\", anint);\n"
+" 15\t\treturn anint;\n"
+" 16\t}\n"
+"(lldb)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:824
+msgid ""
+"Hang on a minute! How did anint get to be `-5360`? Was it not set to `5` in "
+"`main()`? Let us move up to `main()` and have a look."
+msgstr ""
+"Подождите минуту! Как переменная `int` стала равна `-5360`? Разве она не "
+"была установлена в `5` в `main()`? Давайте поднимемся к `main()` и посмотрим."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:838
+#, no-wrap
+msgid ""
+"(lldb) up\t\tMove up call stack\n"
+"frame #1: 0x000000000020130b temp`main at temp.c:9:2\t\tlldb displays stack frame\n"
+" 6\t\tint i;\n"
+" 7\n"
+" 8\t\tprintf(\"This is my program\\n\");\n"
+"-> 9\t\tbazz(i);\n"
+" 10\t\treturn 0;\n"
+" 11\t}\n"
+" 12\n"
+"(lldb) frame variable i\t\t\tShow us the value of i\n"
+"(int) i = -5360\t\t\t\t\t\t\tlldb displays -5360\n"
+msgstr ""
+"(lldb) up\t\tMove up call stack\n"
+"frame #1: 0x000000000020130b temp`main at temp.c:9:2\t\tlldb displays stack frame\n"
+" 6\t\tint i;\n"
+" 7\n"
+" 8\t\tprintf(\"This is my program\\n\");\n"
+"-> 9\t\tbazz(i);\n"
+" 10\t\treturn 0;\n"
+" 11\t}\n"
+" 12\n"
+"(lldb) frame variable i\t\t\tShow us the value of i\n"
+"(int) i = -5360\t\t\t\t\t\t\tlldb displays -5360\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:842
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1083
+msgid ""
+"Oh dear! Looking at the code, we forgot to initialize i. We meant to put"
+msgstr "О боже! Глядя на код, мы забыли инициализировать i. Мы хотели добавить"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:848
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1089
+#, no-wrap
+msgid ""
+"...\n"
+"main() {\n"
+"\tint i;\n"
+msgstr ""
+"...\n"
+"main() {\n"
+"\tint i;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:852
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1093
+#, no-wrap
+msgid ""
+"\ti = 5;\n"
+"\tprintf(\"This is my program\\n\");\n"
+"...\n"
+msgstr ""
+"\ti = 5;\n"
+"\tprintf(\"This is my program\\n\");\n"
+"...\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:857
+msgid ""
+"but we left the `i=5;` line out. As we did not initialize i, it had "
+"whatever number happened to be in that area of memory when the program ran, "
+"which in this case happened to be `-5360`."
+msgstr ""
+"но мы пропустили строку `i=5;`. Поскольку мы не инициализировали `i`, она "
+"содержала любое число, которое оказалось в той области памяти при запуске "
+"программы, и в данном случае это оказалось `-5360`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:863
+msgid ""
+"The `lldb` command displays the stack frame every time we go into or out of "
+"a function, even if we are using `up` and `down` to move around the call "
+"stack. This shows the name of the function and the values of its arguments, "
+"which helps us keep track of where we are and what is going on. (The stack "
+"is a storage area where the program stores information about the arguments "
+"passed to functions and where to go when it returns from a function call.)"
+msgstr ""
+"Команда `lldb` отображает стек вызовов каждый раз, когда мы входим в функцию "
+"или выходим из неё, даже если мы используем `up` и `down` для перемещения по "
+"стеку вызовов. Это показывает имя функции и значения её аргументов, что "
+"помогает отслеживать текущее положение и происходящее. (Стек — это область "
+"хранения, где программа сохраняет информацию об аргументах, переданных в "
+"функции, и о том, куда возвращаться после вызова функции.)"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:865
+#, no-wrap
+msgid "Examining a Core File with lldb"
+msgstr "Изучение файла Core с помощью lldb"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:870
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1111
+msgid ""
+"A core file is basically a file which contains the complete state of the "
+"process when it crashed. In \"the good old days\", programmers had to print "
+"out hex listings of core files and sweat over machine code manuals, but now "
+"life is a bit easier. Incidentally, under FreeBSD and other 4.4BSD systems, "
+"a core file is called [.filename]#progname.core# instead of just "
+"[.filename]#core#, to make it clearer which program a core file belongs to."
+msgstr ""
+"Файл core — это, по сути, файл, содержащий полное состояние процесса на "
+"момент его аварийного завершения. В «старые добрые времена» программистам "
+"приходилось распечатывать шестнадцатеричные дампы файлов core и корпеть над "
+"руководствами по машинному коду, но сейчас жизнь стала немного проще. "
+"Кстати, в FreeBSD и других системах на базе 4.4BSD файл core называется "
+"[.filename]#progname.core#, а не просто [.filename]#core#, чтобы было "
+"понятнее, какой программе он принадлежит."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:873
+msgid ""
+"To examine a core file, specify the name of the core file in addition to the "
+"program itself. Instead of starting up `lldb` in the usual way, type `lldb "
+"-c _progname_.core \\-- _progname_`."
+msgstr ""
+"Для анализа файла core укажите имя файла core в дополнение к самой "
+"программе. Вместо обычного запуска `lldb` введите `lldb -c "
+"_имя_программы_.core \\-- _имя_программы_`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:875
+msgid "The debugger will display something like this:"
+msgstr "Отладчик отобразит что-то вроде этого:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:882
+#, no-wrap
+msgid ""
+"% lldb -c [.filename]#progname.core# -- [.filename]#progname#\n"
+"(lldb) target create \"[.filename]#progname#\" --core \"[.filename]#progname#.core\"\n"
+"Core file '/home/pauamma/tmp/[.filename]#progname.core#' (x86_64) was loaded.\n"
+"(lldb)\n"
+msgstr ""
+"% lldb -c [.filename]#progname.core# -- [.filename]#progname#\n"
+"(lldb) target create \"[.filename]#progname#\" --core \"[.filename]#progname#.core\"\n"
+"Core file '/home/pauamma/tmp/[.filename]#progname.core#' (x86_64) was loaded.\n"
+"(lldb)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:888
+msgid ""
+"In this case, the program was called [.filename]#progname#, so the core file "
+"is called [.filename]#progname.core#. The debugger does not display why the "
+"program crashed or where. For this, use `thread backtrace all`. This will "
+"also show how the function where the program dumped core was called."
+msgstr ""
+"В этом случае программа называлась [.filename]#progname#, поэтому файл дампа "
+"имеет имя [.filename]#progname.core#. Отладчик не показывает, почему "
+"программа завершилась аварийно или где это произошло. Для этого используйте "
+"команду `thread backtrace all`. Она также покажет, как была вызвана функция, "
+"в которой программа завершилась дампом ядра."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:897
+#, no-wrap
+msgid ""
+"(lldb) thread backtrace all\n"
+"* thread #1, name = 'progname', stop reason = signal SIGSEGV\n"
+" * frame #0: 0x0000000000201347 progname`bazz(anint=5) at temp2.c:17:10\n"
+" frame #1: 0x0000000000201312 progname`main at temp2.c:10:2\n"
+" frame #2: 0x000000000020110f progname`_start(ap=<unavailable>, cleanup=<unavailable>) at crt1.c:76:7\n"
+"(lldb)\n"
+msgstr ""
+"(lldb) thread backtrace all\n"
+"* thread #1, name = 'progname', stop reason = signal SIGSEGV\n"
+" * frame #0: 0x0000000000201347 progname`bazz(anint=5) at temp2.c:17:10\n"
+" frame #1: 0x0000000000201312 progname`main at temp2.c:10:2\n"
+" frame #2: 0x000000000020110f progname`_start(ap=<unavailable>, cleanup=<unavailable>) at crt1.c:76:7\n"
+"(lldb)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:902
+msgid ""
+"`SIGSEGV` indicates that the program tried to access memory (run code or "
+"read/write data usually) at a location that does not belong to it, but does "
+"not give any specifics. For that, look at the source code at line 10 of "
+"file temp2.c, in `bazz()`. The backtrace also says that in this case, "
+"`bazz()` was called from `main()`."
+msgstr ""
+"`SIGSEGV` указывает, что программа пыталась получить доступ к памяти (обычно "
+"выполнить код или прочитать/записать данные) по адресу, который ей не "
+"принадлежит, но не предоставляет конкретных деталей. Для этого обратитесь к "
+"исходному коду на строке 10 файла temp2.c, в функции `bazz()`. Трассировка "
+"также показывает, что в данном случае `bazz()` была вызвана из `main()`."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:903
+#, no-wrap
+msgid "Attaching to a Running Program with lldb"
+msgstr "Подключение к работающей программе с помощью lldb"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:908
+msgid ""
+"One of the neatest features about `lldb` is that it can attach to a program "
+"that is already running. Of course, that requires sufficient permissions to "
+"do so. A common problem is stepping through a program that forks and "
+"wanting to trace the child, but the debugger will only trace the parent."
+msgstr ""
+"Одной из самых замечательных особенностей `lldb` является возможность "
+"подключения к уже работающей программе. Конечно, для этого требуются "
+"соответствующие разрешения. Распространённая проблема — пошаговое выполнение "
+"программы, которая создаёт ответвления, с необходимостью отслеживать "
+"дочерний процесс, но отладчик отслеживает только родительский."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:910
+msgid ""
+"To do that, start up another `lldb`, use `ps` to find the process ID for the "
+"child, and do"
+msgstr ""
+"Для этого запустите другой `lldb`, используйте `ps` для поиска "
+"идентификатора процесса дочернего процесса и выполните"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:914
+#, no-wrap
+msgid "(lldb) process attach -p pid\n"
+msgstr "(lldb) process attach -p pid\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:917
+msgid "in `lldb`, and then debug as usual."
+msgstr "в `lldb`, а затем отлаживайте как обычно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:919
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1174
+msgid ""
+"For that to work well, the code that calls `fork` to create the child needs "
+"to do something like the following (courtesy of the `gdb` info pages):"
+msgstr ""
+"Для того чтобы это работало правильно, код, который вызывает `fork` для "
+"создания дочернего процесса, должен делать что-то вроде следующего "
+"(предоставлено из документации `gdb`):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:927
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1182
+#, no-wrap
+msgid ""
+"...\n"
+"if ((pid = fork()) < 0)\t\t/* _Always_ check this */\n"
+"\terror();\n"
+"else if (pid == 0) {\t\t/* child */\n"
+"\tint PauseMode = 1;\n"
+msgstr ""
+"...\n"
+"if ((pid = fork()) < 0)\t\t/* _Always_ check this */\n"
+"\terror();\n"
+"else if (pid == 0) {\t\t/* child */\n"
+"\tint PauseMode = 1;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:933
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1188
+#, no-wrap
+msgid ""
+"\twhile (PauseMode)\n"
+"\t\tsleep(10);\t/* Wait until someone attaches to us */\n"
+"\t...\n"
+"} else {\t\t\t/* parent */\n"
+"\t...\n"
+msgstr ""
+"\twhile (PauseMode)\n"
+"\t\tsleep(10);\t/* Wait until someone attaches to us */\n"
+"\t...\n"
+"} else {\t\t\t/* parent */\n"
+"\t...\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:936
+msgid ""
+"Now all that is needed is to attach to the child, set PauseMode to `0` with "
+"`expr PauseMode = 0` and wait for the `sleep()` call to return."
+msgstr ""
+"Вот все, что нужно сделать: подключиться к дочернему процессу, установить "
+"`PauseMode` в `0` с помощью `expr PauseMode = 0` и дождаться возврата из "
+"вызова `sleep()`."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:937
+#, no-wrap
+msgid "Remote Debugging Using LLDB"
+msgstr "Удаленная отладка с использованием LLDB"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:943
+msgid ""
+"The described functionality is available starting with LLDB version 12.0.0. "
+"Users of FreeBSD releases containing an earlier LLDB version may wish to use "
+"the snapshot available in extref:{handbook}[ports or packages, ports-using], "
+"as package:devel/llvm-devel[]."
+msgstr ""
+"Описанная функциональность доступна начиная с версии LLDB 12.0.0. "
+"Пользователи релизов FreeBSD, содержащих более раннюю версию LLDB, могут "
+"воспользоваться снимком из extref:{handbook}[портов или пакетов, ports-"
+"using], как package:devel/llvm-devel[]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:947
+msgid ""
+"Starting with LLDB 12.0.0, remote debugging is supported on FreeBSD. This "
+"means that `lldb-server` can be started to debug a program on one host, "
+"while the interactive `lldb` client connects to it from another one."
+msgstr ""
+"Начиная с LLDB 12.0.0, удалённая отладка поддерживается в FreeBSD. Это "
+"означает, что `lldb-server` может быть запущен для отладки программы на "
+"одном узле, в то время как интерактивный клиент `lldb` подключается к нему с "
+"другого."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:949
+msgid ""
+"To launch a new process to be debugged remotely, run `lldb-server` on the "
+"remote server by typing"
+msgstr ""
+"Чтобы запустить новый процесс для удалённой отладки, выполните `lldb-server` "
+"на удалённом сервере, набрав"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:953
+#, no-wrap
+msgid "% lldb-server g host:port -- progname\n"
+msgstr "% lldb-server g host:port -- progname\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:956
+msgid ""
+"The process will be stopped immediately after launching, and `lldb-server` "
+"will wait for the client to connect."
+msgstr ""
+"Процесс будет остановлен сразу после запуска, и `lldb-server` будет ожидать "
+"подключения клиента."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:958
+msgid ""
+"Start `lldb` locally and type the following command to connect to the remote "
+"server:"
+msgstr ""
+"Запустите `lldb` локально и введите следующую команду для подключения к "
+"удалённому серверу:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:962
+#, no-wrap
+msgid "(lldb) gdb-remote host:port\n"
+msgstr "(lldb) gdb-remote host:port\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:966
+msgid ""
+"`lldb-server` can also attach to a running process. To do that, type the "
+"following on the remote server:"
+msgstr ""
+"`lldb-server` также может присоединиться к работающему процессу. Для этого "
+"введите следующее на удалённом сервере:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:970
+#, no-wrap
+msgid "% lldb-server g host:port --attach pid-or-name\n"
+msgstr "% lldb-server g host:port --attach pid-or-name\n"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:972
+#, no-wrap
+msgid "Using gdb"
+msgstr "Использование gdb"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:974
+#, no-wrap
+msgid "Starting gdb"
+msgstr "Запуск gdb"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:977
+msgid "Start up gdb by typing"
+msgstr "Запустите gdb, набрав"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:981
+#, no-wrap
+msgid "% gdb progname\n"
+msgstr "% gdb progname\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:985
+msgid "although many people prefer to run it inside Emacs. To do this, type:"
+msgstr ""
+"хотя многие предпочитают запускать его внутри Emacs. Для этого введите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:989
+#, no-wrap
+msgid " M-x gdb RET progname RET\n"
+msgstr " M-x gdb RET progname RET\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:992
+msgid ""
+"Finally, for those finding its text-based command-prompt style off-putting, "
+"there is a graphical front-end for it (package:devel/xxgdb[]) in the Ports "
+"Collection."
+msgstr ""
+"Наконец, для тех, кого отпугивает текстовый интерфейс командной строки, "
+"существует графический интерфейс (package:devel/xxgdb[]) в Коллекции портов."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:993
+#, no-wrap
+msgid "Running a Program with gdb"
+msgstr "Запуск программы под отладчиком gdb"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:998
+msgid ""
+"Compile the program with `-g` to get the most out of using `gdb`. It will "
+"work without, but will only display the name of the function currently "
+"running, instead of the source code. A line like:"
+msgstr ""
+"Скомпилируйте программу с `-g`, чтобы максимально использовать возможности "
+"`gdb`. Она будет работать и без этого, но отобразит только имя текущей "
+"выполняемой функции вместо исходного кода. Строка вида:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1002
+#, no-wrap
+msgid "... (no debugging symbols found) ...\n"
+msgstr "... (no debugging symbols found) ...\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1005
+msgid "when `gdb` starts up means that the program was not compiled with `-g`."
+msgstr ""
+"когда `gdb` запускается, это означает, что программа не была скомпилирована "
+"с опцией `-g`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1009
+msgid ""
+"At the `gdb` prompt, type `break main`. This will tell the debugger to skip "
+"the preliminary set-up code in the program being run and to stop execution "
+"at the beginning of the program's code. Now type `run` to start the "
+"program- it will start at the beginning of the set-up code and then get "
+"stopped by the debugger when it calls `main()`."
+msgstr ""
+"На приглашении `gdb` введите `break main`. Это укажет отладчику пропустить "
+"предварительный код настройки в выполняемой программе и остановить "
+"выполнение в начале кода программы. Теперь введите `run`, чтобы запустить "
+"программу — она начнётся с начала кода настройки, а затем будет остановлена "
+"отладчиком при вызове `main()`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1013
+msgid ""
+"To step through the program a line at a time, press `n`. When at a function "
+"call, step into it by pressing `s`. Once in a function call, return from it "
+"by pressing `f`, or use `up` and `down` to take a quick look at the caller."
+msgstr ""
+"Для пошагового выполнения программы нажимайте `n`. При вызове функции "
+"войдите в неё, нажав `s`. Оказавшись внутри функции, вернитесь из неё, нажав "
+"`f`, или используйте `up` и `down` для быстрого просмотра вызывающего кода."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1016
+msgid ""
+"Here is a simple example of how to spot a mistake in a program with `gdb`. "
+"This is our program (with a deliberate mistake):"
+msgstr ""
+"Вот простой пример того, как найти ошибку в программе с помощью `gdb`. Это "
+"наша программа (с умышленной ошибкой):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1047
+#, no-wrap
+msgid ""
+"% cc -g -o temp temp.c\n"
+"% ./temp\n"
+"This is my program\n"
+"anint = 4231\n"
+msgstr ""
+"% cc -g -o temp temp.c\n"
+"% ./temp\n"
+"This is my program\n"
+"anint = 4231\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1050
+msgid "That was not what we expected! Time to see what is going on!"
+msgstr "Это было не то, что мы ожидали! Пора разобраться, что происходит!"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1062
+#, no-wrap
+msgid ""
+"% gdb temp\n"
+"GDB is free software and you are welcome to distribute copies of it\n"
+" under certain conditions; type \"show copying\" to see the conditions.\n"
+"There is absolutely no warranty for GDB; type \"show warranty\" for details.\n"
+"GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.\n"
+"(gdb) break main\t\t\t\tSkip the set-up code\n"
+"Breakpoint 1 at 0x160f: file temp.c, line 9.\tgdb puts breakpoint at main()\n"
+"(gdb) run\t\t\t\t\tRun as far as main()\n"
+"Starting program: /home/james/tmp/temp\t\tProgram starts running\n"
+msgstr ""
+"% gdb temp\n"
+"GDB is free software and you are welcome to distribute copies of it\n"
+" under certain conditions; type \"show copying\" to see the conditions.\n"
+"There is absolutely no warranty for GDB; type \"show warranty\" for details.\n"
+"GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.\n"
+"(gdb) break main\t\t\t\tSkip the set-up code\n"
+"Breakpoint 1 at 0x160f: file temp.c, line 9.\tgdb puts breakpoint at main()\n"
+"(gdb) run\t\t\t\t\tRun as far as main()\n"
+"Starting program: /home/james/tmp/temp\t\tProgram starts running\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1069
+#, no-wrap
+msgid ""
+"Breakpoint 1, main () at temp.c:9\t\tgdb stops at main()\n"
+"(gdb) n\t\t\t\t\t\tGo to next line\n"
+"This is my program\t\t\t\tProgram prints out\n"
+"(gdb) s\t\t\t\t\t\tstep into bazz()\n"
+"bazz (anint=4231) at temp.c:17\t\t\tgdb displays stack frame\n"
+"(gdb)\n"
+msgstr ""
+"Breakpoint 1, main () at temp.c:9\t\tgdb stops at main()\n"
+"(gdb) n\t\t\t\t\t\tGo to next line\n"
+"This is my program\t\t\t\tProgram prints out\n"
+"(gdb) s\t\t\t\t\t\tstep into bazz()\n"
+"bazz (anint=4231) at temp.c:17\t\t\tgdb displays stack frame\n"
+"(gdb)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1072
+msgid ""
+"Hang on a minute! How did anint get to be `4231`? Was it not set to `5` in "
+"`main()`? Let us move up to `main()` and have a look."
+msgstr ""
+"Подождите минуту! Как `int` стал равен `4231`? Разве он не был установлен в "
+"`5` в `main()`? Давайте поднимемся к `main()` и посмотрим."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1079
+#, no-wrap
+msgid ""
+"(gdb) up\t\t\t\t\tMove up call stack\n"
+"#1 0x1625 in main () at temp.c:11\t\tgdb displays stack frame\n"
+"(gdb) p i\t\t\t\t\tShow us the value of i\n"
+"$1 = 4231\t\t\t\t\tgdb displays 4231\n"
+msgstr ""
+"(gdb) up\t\t\t\t\tMove up call stack\n"
+"#1 0x1625 in main () at temp.c:11\t\tgdb displays stack frame\n"
+"(gdb) p i\t\t\t\t\tShow us the value of i\n"
+"$1 = 4231\t\t\t\t\tgdb displays 4231\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1098
+msgid ""
+"but we left the `i=5;` line out. As we did not initialize i, it had "
+"whatever number happened to be in that area of memory when the program ran, "
+"which in this case happened to be `4231`."
+msgstr ""
+"но мы пропустили строку `i=5;`. Поскольку мы не инициализировали `i`, она "
+"содержала любое число, которое оказалось в той области памяти при запуске "
+"программы, и в данном случае это оказалось `4231`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1104
+msgid ""
+"The `gdb` command displays the stack frame every time we go into or out of a "
+"function, even if we are using `up` and `down` to move around the call "
+"stack. This shows the name of the function and the values of its arguments, "
+"which helps us keep track of where we are and what is going on. (The stack "
+"is a storage area where the program stores information about the arguments "
+"passed to functions and where to go when it returns from a function call.)"
+msgstr ""
+"Команда `gdb` отображает стек вызовов каждый раз при входе в функцию или "
+"выходе из неё, даже при использовании `up` и `down` для перемещения по стеку "
+"вызовов. Это показывает имя функции и значения её аргументов, что помогает "
+"отслеживать текущее положение и происходящее. (Стек — это область хранения, "
+"где программа сохраняет информацию об аргументах, переданных в функции, и о "
+"месте, куда нужно вернуться после вызова функции.)"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1106
+#, no-wrap
+msgid "Examining a Core File with gdb"
+msgstr "Изучение файла core с помощью gdb"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1114
+msgid ""
+"To examine a core file, start up `gdb` in the usual way. Instead of typing "
+"`break` or `run`, type"
+msgstr ""
+"Для анализа файла core запустите `gdb` обычным способом. Вместо ввода команд "
+"`break` или `run` введите"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1118
+#, no-wrap
+msgid "(gdb) core progname.core\n"
+msgstr "(gdb) core progname.core\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1121
+msgid ""
+"If the core file is not in the current directory, type `dir /path/to/core/"
+"file` first."
+msgstr ""
+"Если файл core отсутствует в текущем каталоге, сначала введите `dir /путь/к/"
+"core/файлу`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1123
+msgid "The debugger should display something like this:"
+msgstr "Отладчик должен отобразить что-то вроде этого:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1137
+#, no-wrap
+msgid ""
+"% gdb [.filename]#progname#\n"
+"GDB is free software and you are welcome to distribute copies of it\n"
+" under certain conditions; type \"show copying\" to see the conditions.\n"
+"There is absolutely no warranty for GDB; type \"show warranty\" for details.\n"
+"GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.\n"
+"(gdb) core [.filename]#progname.core#\n"
+"Core was generated by `[.filename]#progname#'.\n"
+"Program terminated with signal 11, Segmentation fault.\n"
+"Cannot access memory at address 0x7020796d.\n"
+"#0 0x164a in bazz (anint=0x5) at temp.c:17\n"
+"(gdb)\n"
+msgstr ""
+"% gdb [.filename]#progname#\n"
+"GDB is free software and you are welcome to distribute copies of it\n"
+" under certain conditions; type \"show copying\" to see the conditions.\n"
+"There is absolutely no warranty for GDB; type \"show warranty\" for details.\n"
+"GDB 4.13 (i386-unknown-freebsd), Copyright 1994 Free Software Foundation, Inc.\n"
+"(gdb) core [.filename]#progname.core#\n"
+"Core was generated by `[.filename]#progname#'.\n"
+"Program terminated with signal 11, Segmentation fault.\n"
+"Cannot access memory at address 0x7020796d.\n"
+"#0 0x164a in bazz (anint=0x5) at temp.c:17\n"
+"(gdb)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1141
+msgid ""
+"In this case, the program was called [.filename]#progname#, so the core file "
+"is called [.filename]#progname.core#. We can see that the program crashed "
+"due to trying to access an area in memory that was not available to it in a "
+"function called `bazz`."
+msgstr ""
+"В этом случае программа называлась [.filename]#progname#, поэтому файл дампа "
+"памяти называется [.filename]#progname.core#. Мы видим, что программа "
+"завершилась аварийно из-за попытки доступа к области памяти, которая ей не "
+"доступна, в функции `bazz`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1145
+msgid ""
+"Sometimes it is useful to be able to see how a function was called, as the "
+"problem could have occurred a long way up the call stack in a complex "
+"program. `bt` causes `gdb` to print out a back-trace of the call stack:"
+msgstr ""
+"Иногда полезно увидеть, как была вызвана функция, поскольку проблема могла "
+"возникнуть гораздо выше по стеку вызовов в сложной программе. `bt` "
+"заставляет `gdb` вывести трассировку стека вызовов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1153
+#, no-wrap
+msgid ""
+"(gdb) bt\n"
+"#0 0x164a in bazz (anint=0x5) at temp.c:17\n"
+"#1 0xefbfd888 in end ()\n"
+"#2 0x162c in main () at temp.c:11\n"
+"(gdb)\n"
+msgstr ""
+"(gdb) bt\n"
+"#0 0x164a in bazz (anint=0x5) at temp.c:17\n"
+"#1 0xefbfd888 in end ()\n"
+"#2 0x162c in main () at temp.c:11\n"
+"(gdb)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1157
+msgid ""
+"The `end()` function is called when a program crashes; in this case, the "
+"`bazz()` function was called from `main()`."
+msgstr ""
+"Функция `end()` вызывается при аварийном завершении программы; в данном "
+"случае функция `bazz()` была вызвана из `main()`."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1158
+#, no-wrap
+msgid "Attaching to a Running Program with gdb"
+msgstr "Подключение к работающей программе с помощью gdb"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1163
+msgid ""
+"One of the neatest features about `gdb` is that it can attach to a program "
+"that is already running. Of course, that requires sufficient permissions to "
+"do so. A common problem is stepping through a program that forks and "
+"wanting to trace the child, but the debugger will only trace the parent."
+msgstr ""
+"Одной из самых удобных функций `gdb` является возможность подключения к уже "
+"запущенной программе. Конечно, для этого требуются соответствующие "
+"разрешения. Частой проблемой является пошаговое выполнение программы, "
+"которая создает дочерний процесс, когда нужно отслеживать дочерний процесс, "
+"но отладчик продолжает отслеживать только родительский."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1165
+msgid ""
+"To do that, start up another `gdb`, use `ps` to find the process ID for the "
+"child, and do"
+msgstr ""
+"Для этого запустите другой `gdb`, используйте `ps` для поиска идентификатора "
+"процесса дочернего элемента и выполните"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1169
+#, no-wrap
+msgid "(gdb) attach pid\n"
+msgstr "(gdb) attach pid\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1172
+msgid "in `gdb`, and then debug as usual."
+msgstr "в `gdb`, а затем отлаживайте как обычно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1191
+msgid ""
+"Now all that is needed is to attach to the child, set PauseMode to `0`, and "
+"wait for the `sleep()` call to return!"
+msgstr ""
+"Теперь осталось только подключиться к дочернему процессу, установить "
+"PauseMode в `0` и дождаться возврата из вызова `sleep()`!"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1193
+#, no-wrap
+msgid "Using Emacs as a Development Environment"
+msgstr "Использование Emacs в качестве среды разработки"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1195
+#, no-wrap
+msgid "Emacs"
+msgstr "Emacs"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1199
+msgid ""
+"Emacs is a highly customizable editor-indeed, it has been customized to the "
+"point where it is more like an operating system than an editor! Many "
+"developers and sysadmins do in fact spend practically all their time working "
+"inside Emacs, leaving it only to log out."
+msgstr ""
+"Emacs — это высоконастраиваемый редактор — настолько, что его можно скорее "
+"назвать операционной системой, чем редактором! Многие разработчики и "
+"системные администраторы действительно проводят практически всё своё время, "
+"работая внутри Emacs, выходя из него только для завершения сеанса."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1201
+msgid ""
+"It is impossible even to summarize everything Emacs can do here, but here "
+"are some of the features of interest to developers:"
+msgstr ""
+"Невозможно даже кратко описать все, что может делать Emacs, но вот некоторые "
+"особенности, которые могут быть интересны разработчикам:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1203
+msgid ""
+"Very powerful editor, allowing search-and-replace on both strings and "
+"regular expressions (patterns), jumping to start/end of block expression, "
+"etc, etc."
+msgstr ""
+"Очень мощный редактор, позволяющий выполнять поиск и замену как строк, так и "
+"регулярных выражений (шаблонов), переход к началу/концу блока выражения и "
+"многое другое."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1204
+msgid "Pull-down menus and online help."
+msgstr "Выпадающие меню и встроенная справка."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1205
+msgid "Language-dependent syntax highlighting and indentation."
+msgstr "Подсветка синтаксиса и форматирование отступов в зависимости от языка."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1206
+msgid "Completely customizable."
+msgstr "Полностью настраиваемый."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1207
+msgid "You can compile and debug programs within Emacs."
+msgstr "Вы можете компилировать и отлаживать программы из Emacs."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1208
+msgid ""
+"On a compilation error, you can jump to the offending line of source code."
+msgstr ""
+"При ошибке компиляции можно перейти к проблемной строке исходного кода."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1209
+msgid ""
+"Friendly-ish front-end to the `info` program used for reading GNU hypertext "
+"documentation, including the documentation on Emacs itself."
+msgstr ""
+"Дружелюбный интерфейс для программы `info`, используемой для чтения "
+"гипертекстовой документации GNU, включая документацию по самому Emacs."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1210
+msgid ""
+"Friendly front-end to `gdb`, allowing you to look at the source code as you "
+"step through your program."
+msgstr ""
+"Дружелюбный интерфейс для `gdb`, позволяющий просматривать исходный код во "
+"время пошагового выполнения программы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1212
+msgid "And doubtless many more that have been overlooked."
+msgstr "И, несомненно, множество других, которые были упущены из виду."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1214
+msgid ""
+"Emacs can be installed on FreeBSD using the package:editors/emacs[] port."
+msgstr ""
+"Emacs можно установить на FreeBSD с помощью пакета package:editors/emacs[]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1217
+msgid ""
+"Once it is installed, start it up and do `C-h t` to read an Emacs tutorial-"
+"that means hold down kbd:[control], press kbd:[h], let go of kbd:[control], "
+"and then press kbd:[t]. (Alternatively, you can use the mouse to select "
+"[.guimenuitem]#Emacs Tutorial# from the menu:Help[] menu.)"
+msgstr ""
+"После установки запустите его и выполните `C-h t`, чтобы прочитать "
+"руководство по Emacs — это означает, что нужно удерживать kbd:[control], "
+"нажать kbd:[h], отпустить kbd:[control], а затем нажать kbd:[t]. (Также "
+"можно использовать мышь для выбора [.guimenuitem]#Руководство по Emacs# в "
+"меню menu:Help[].)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1222
+msgid ""
+"Although Emacs does have menus, it is well worth learning the key bindings, "
+"as it is much quicker when you are editing something to press a couple of "
+"keys than to try to find the mouse and then click on the right place. And, "
+"when you are talking to seasoned Emacs users, you will find they often "
+"casually throw around expressions like \"`M-x replace-s RET foo RET bar "
+"RET`\" so it is useful to know what they mean. And in any case, Emacs has "
+"far too many useful functions for them to all fit on the menu bars."
+msgstr ""
+"Хотя в Emacs и есть меню, стоит изучить сочетания клавиш, так как "
+"редактировать что-либо с их помощью гораздо быстрее, чем искать мышку и "
+"кликать в нужное место. Кроме того, общаясь с опытными пользователями Emacs, "
+"вы часто услышите выражения вроде «`M-x replace-s RET foo RET bar RET`» — "
+"полезно понимать, что они значат. Да и вообще, в Emacs столько полезных "
+"функций, что все они просто не поместятся на панелях меню."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1226
+msgid ""
+"Fortunately, it is quite easy to pick up the key-bindings, as they are "
+"displayed next to the menu item. My advice is to use the menu item for, "
+"say, opening a file until you understand how it works and feel confident "
+"with it, then try doing C-x C-f. When you are happy with that, move on to "
+"another menu command."
+msgstr ""
+"К счастью, освоить сочетания клавиш довольно легко, так как они отображаются "
+"рядом с пунктами меню. Мой совет — использовать пункты меню для, скажем, "
+"открытия файла, пока вы не разберётесь, как это работает, и не почувствуете "
+"себя уверенно, а затем попробуйте выполнить `C-x C-f`. Когда освоитесь с "
+"этим, переходите к следующей команде меню."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1229
+msgid ""
+"If you cannot remember what a particular combination of keys does, select "
+"[.guimenuitem]#Describe Key# from the menu:Help[] menu and type it in-Emacs "
+"will tell you what it does. You can also use the [.guimenuitem]#Command "
+"Apropos# menu item to find out all the commands which contain a particular "
+"word in them, with the key binding next to it."
+msgstr ""
+"Если вы не можете вспомнить, что делает определённая комбинация клавиш, "
+"выберите [.guimenuitem]#Описание Клавиши# в меню menu:Help[] и введите её — "
+"Emacs сообщит, что она делает. Вы также можете использовать пункт меню "
+"[.guimenuitem]#Command Apropos#, чтобы найти все команды, содержащие "
+"определённое слово, с указанием соответствующих клавишных сочетаний."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1232
+msgid ""
+"By the way, the expression above means hold down the kbd:[Meta] key, press "
+"kbd:[x], release the kbd:[Meta] key, type `replace-s` (short for `replace-"
+"string`-another feature of Emacs is that you can abbreviate commands), press "
+"the kbd:[return] key, type `foo` (the string you want replaced), press the "
+"kbd:[return] key, type bar (the string you want to replace `foo` with) and "
+"press kbd:[return] again. Emacs will then do the search-and-replace "
+"operation you have just requested."
+msgstr ""
+"Между прочим, выражение выше означает: удерживайте клавишу kbd:[Meta], "
+"нажмите kbd:[x], отпустите клавишу kbd:[Meta], введите `replace-s` "
+"(сокращение от `replace-string` — ещё одна особенность Emacs в том, что "
+"команды можно сокращать), нажмите клавишу kbd:[return], введите `foo` "
+"(строка, которую нужно заменить), нажмите клавишу kbd:[return], введите "
+"`bar` (строка, на которую нужно заменить `foo`) и снова нажмите kbd:"
+"[return]. Emacs выполнит операцию поиска и замены, которую вы только что "
+"запросили."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1235
+msgid ""
+"If you are wondering what on earth kbd:[Meta] is, it is a special key that "
+"many UNIX(R) workstations have. Unfortunately, PC's do not have one, so it "
+"is usually kbd:[alt] (or if you are unlucky, the kbd:[escape] key)."
+msgstr ""
+"Если вам интересно, что такое kbd:[Meta], то это специальная клавиша, "
+"которая есть на многих рабочих станциях UNIX(R). К сожалению, на PC её нет, "
+"поэтому обычно используется kbd:[alt] (или, если вам не повезло, kbd:"
+"[escape])."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1239
+msgid ""
+"Oh, and to get out of Emacs, do `C-x C-c` (that means hold down the kbd:"
+"[control] key, press kbd:[x], press kbd:[c] and release the kbd:[control] "
+"key). If you have any unsaved files open, Emacs will ask you if you want to "
+"save them. (Ignore the bit in the documentation where it says `C-z` is the "
+"usual way to leave Emacs-that leaves Emacs hanging around in the background, "
+"and is only really useful if you are on a system which does not have virtual "
+"terminals)."
+msgstr ""
+"Ах да, чтобы выйти из Emacs, нажмите `C-x C-c` (это значит зажмите клавишу "
+"kbd:[control], нажмите kbd:[x], затем kbd:[c] и отпустите kbd:[control]). "
+"Если у вас есть несохранённые файлы, Emacs спросит, хотите ли вы их "
+"сохранить. (Игнорируйте часть документации, где говорится, что `C-z` — это "
+"обычный способ выхода из Emacs — это оставляет Emacs работающим в фоне и "
+"полезно только на системах без виртуальных терминалов)."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1240
+#, no-wrap
+msgid "Configuring Emacs"
+msgstr "Настройка Emacs"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1243
+msgid ""
+"Emacs does many wonderful things; some of them are built in, some of them "
+"need to be configured."
+msgstr ""
+"Emacs делает много замечательных вещей; некоторые из них встроены, некоторые "
+"требуют настройки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1247
+msgid ""
+"Instead of using a proprietary macro language for configuration, Emacs uses "
+"a version of Lisp specially adapted for editors, known as Emacs Lisp. "
+"Working with Emacs Lisp can be quite helpful if you want to go on and learn "
+"something like Common Lisp. Emacs Lisp has many features of Common Lisp, "
+"although it is considerably smaller (and thus easier to master)."
+msgstr ""
+"Вместо использования проприетарного языка макросов для конфигурации, Emacs "
+"применяет версию Lisp, специально адаптированную для редакторов, известную "
+"как Emacs Lisp. Работа с Emacs Lisp может быть весьма полезной, если вы "
+"хотите продолжить и изучить что-то вроде Common Lisp. Emacs Lisp обладает "
+"многими возможностями Common Lisp, хотя и значительно меньше (и, "
+"следовательно, проще для освоения)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1249
+msgid ""
+"The best way to learn Emacs Lisp is to read the online link:https://"
+"www.gnu.org/software/emacs/manual/elisp.html[Emacs Reference] manual."
+msgstr ""
+"Лучший способ изучить Emacs Lisp — это прочитать онлайн-руководство "
+"link:https://www.gnu.org/software/emacs/manual/elisp.html[Emacs Reference]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1254
+msgid ""
+"However, there is no need to actually know any Lisp to get started with "
+"configuring Emacs, as I have included a sample [.filename]#.emacs#, which "
+"should be enough to get you started. Just copy it into your home directory "
+"and restart Emacs if it is already running; it will read the commands from "
+"the file and (hopefully) give you a useful basic setup."
+msgstr ""
+"Однако для начала настройки Emacs не обязательно знать Lisp, так как я "
+"включил пример файла [.filename]#.emacs#, которого должно быть достаточно "
+"для старта. Просто скопируйте его в свой домашний каталог и перезапустите "
+"Emacs, если он уже запущен; он прочитает команды из файла и (надеюсь) "
+"предоставит вам полезную базовую конфигурацию."
+
+#. type: Block title
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1255
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1273
+#, no-wrap
+msgid "A Sample [.filename]#.emacs#"
+msgstr "Пример файла [.filename]#.emacs#"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1258
+msgid ""
+"Unfortunately, there is far too much here to explain it in detail; however "
+"there are one or two points worth mentioning."
+msgstr ""
+"К сожалению, здесь слишком много информации, чтобы объяснять всё подробно; "
+"однако есть один или два момента, которые стоит упомянуть."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1260
+msgid "Everything beginning with a `;` is a comment and is ignored by Emacs."
+msgstr "Всё, что начинается с `;`, является комментарием и игнорируется Emacs."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1261
+msgid ""
+"In the first line, the `-*- Emacs-Lisp -*-` is so that we can edit "
+"[.filename]#.emacs# itself within Emacs and get all the fancy features for "
+"editing Emacs Lisp. Emacs usually tries to guess this based on the filename, "
+"and may not get it right for [.filename]#.emacs#."
+msgstr ""
+"В первой строке `-*- Emacs-Lisp -*-` нужен для того, чтобы мы могли "
+"редактировать сам файл [.filename]#.emacs# в Emacs и использовать все "
+"удобные функции для редактирования Emacs Lisp. Обычно Emacs пытается угадать "
+"это по имени файла, но может не сделать это правильно для "
+"[.filename]#.emacs#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1262
+msgid ""
+"The kbd:[tab] key is bound to an indentation function in some modes, so when "
+"you press the tab key, it will indent the current line of code. If you want "
+"to put a tab character in whatever you are writing, hold the kbd:[control] "
+"key down while you are pressing the kbd:[tab] key."
+msgstr ""
+"Клавиша kbd:[tab] связана с функцией отступа в некоторых режимах, поэтому "
+"при нажатии клавиши tab текущая строка кода будет с отступом. Если вы хотите "
+"вставить символ табуляции в текст, удерживайте клавишу kbd:[control] во "
+"время нажатия kbd:[tab]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1263
+msgid ""
+"This file supports syntax highlighting for C, C++, Perl, Lisp and Scheme, by "
+"guessing the language from the filename."
+msgstr ""
+"Этот файл поддерживает подсветку синтаксиса для C, C++, Perl, Lisp и Scheme, "
+"определяя язык по имени файла."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1264
+msgid ""
+"Emacs already has a pre-defined function called `next-error`. In a "
+"compilation output window, this allows you to move from one compilation "
+"error to the next by doing `M-n`; we define a complementary function, "
+"`previous-error`, that allows you to go to a previous error by doing `M-p`. "
+"The nicest feature of all is that `C-c C-c` will open up the source file in "
+"which the error occurred and jump to the appropriate line."
+msgstr ""
+"В Emacs уже есть предопределённая функция `next-error`. В окне вывода "
+"компиляции это позволяет переходить от одной ошибки компиляции к следующей с "
+"помощью `M-n`; мы определяем дополнительную функцию `previous-error`, "
+"которая позволяет вернуться к предыдущей ошибке с помощью `M-p`. Самое "
+"приятное — сочетание `C-c C-c` откроет исходный файл, в котором произошла "
+"ошибка, и перейдёт на соответствующую строку."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1265
+msgid ""
+"We enable Emacs's ability to act as a server, so that if you are doing "
+"something outside Emacs and you want to edit a file, you can just type in"
+msgstr ""
+"Включаем возможность Emacs работать как сервер, так что если вы заняты чем-"
+"то вне Emacs и хотите отредактировать файл, можно просто ввести"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1269
+#, no-wrap
+msgid "% emacsclient filename\n"
+msgstr "% emacsclient filename\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1272
+msgid ""
+"and then you can edit the file in your Emacs!footnote:[Many Emacs users set "
+"their EDITOR environment to emacsclient so this happens every time they need "
+"to edit a file.]"
+msgstr ""
+"и затем вы можете редактировать файл в вашем Emacs!footnote:[Многие "
+"пользователи Emacs устанавливают переменную окружения EDITOR в emacsclient, "
+"так что это происходит каждый раз, когда им нужно отредактировать файл.]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1278
+#, no-wrap
+msgid ";; -*-Emacs-Lisp-*-\n"
+msgstr ";; -*-Emacs-Lisp-*-\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1283
+#, no-wrap
+msgid ""
+";; This file is designed to be re-evaled; use the variable first-time\n"
+";; to avoid any problems with this.\n"
+"(defvar first-time t\n"
+" \"Flag signifying this is the first time that .emacs has been evaled\")\n"
+msgstr ""
+";; This file is designed to be re-evaled; use the variable first-time\n"
+";; to avoid any problems with this.\n"
+"(defvar first-time t\n"
+" \"Flag signifying this is the first time that .emacs has been evaled\")\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1291
+#, no-wrap
+msgid ""
+";; Meta\n"
+"(global-set-key \"\\M- \" 'set-mark-command)\n"
+"(global-set-key \"\\M-\\C-h\" 'backward-kill-word)\n"
+"(global-set-key \"\\M-\\C-r\" 'query-replace)\n"
+"(global-set-key \"\\M-r\" 'replace-string)\n"
+"(global-set-key \"\\M-g\" 'goto-line)\n"
+"(global-set-key \"\\M-h\" 'help-command)\n"
+msgstr ""
+";; Meta\n"
+"(global-set-key \"\\M- \" 'set-mark-command)\n"
+"(global-set-key \"\\M-\\C-h\" 'backward-kill-word)\n"
+"(global-set-key \"\\M-\\C-r\" 'query-replace)\n"
+"(global-set-key \"\\M-r\" 'replace-string)\n"
+"(global-set-key \"\\M-g\" 'goto-line)\n"
+"(global-set-key \"\\M-h\" 'help-command)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1312
+#, no-wrap
+msgid ""
+";; Function keys\n"
+"(global-set-key [f1] 'manual-entry)\n"
+"(global-set-key [f2] 'info)\n"
+"(global-set-key [f3] 'repeat-complex-command)\n"
+"(global-set-key [f4] 'advertised-undo)\n"
+"(global-set-key [f5] 'eval-current-buffer)\n"
+"(global-set-key [f6] 'buffer-menu)\n"
+"(global-set-key [f7] 'other-window)\n"
+"(global-set-key [f8] 'find-file)\n"
+"(global-set-key [f9] 'save-buffer)\n"
+"(global-set-key [f10] 'next-error)\n"
+"(global-set-key [f11] 'compile)\n"
+"(global-set-key [f12] 'grep)\n"
+"(global-set-key [C-f1] 'compile)\n"
+"(global-set-key [C-f2] 'grep)\n"
+"(global-set-key [C-f3] 'next-error)\n"
+"(global-set-key [C-f4] 'previous-error)\n"
+"(global-set-key [C-f5] 'display-faces)\n"
+"(global-set-key [C-f8] 'dired)\n"
+"(global-set-key [C-f10] 'kill-compilation)\n"
+msgstr ""
+";; Function keys\n"
+"(global-set-key [f1] 'manual-entry)\n"
+"(global-set-key [f2] 'info)\n"
+"(global-set-key [f3] 'repeat-complex-command)\n"
+"(global-set-key [f4] 'advertised-undo)\n"
+"(global-set-key [f5] 'eval-current-buffer)\n"
+"(global-set-key [f6] 'buffer-menu)\n"
+"(global-set-key [f7] 'other-window)\n"
+"(global-set-key [f8] 'find-file)\n"
+"(global-set-key [f9] 'save-buffer)\n"
+"(global-set-key [f10] 'next-error)\n"
+"(global-set-key [f11] 'compile)\n"
+"(global-set-key [f12] 'grep)\n"
+"(global-set-key [C-f1] 'compile)\n"
+"(global-set-key [C-f2] 'grep)\n"
+"(global-set-key [C-f3] 'next-error)\n"
+"(global-set-key [C-f4] 'previous-error)\n"
+"(global-set-key [C-f5] 'display-faces)\n"
+"(global-set-key [C-f8] 'dired)\n"
+"(global-set-key [C-f10] 'kill-compilation)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1330
+#, no-wrap
+msgid ""
+";; Keypad bindings\n"
+"(global-set-key [up] \"\\C-p\")\n"
+"(global-set-key [down] \"\\C-n\")\n"
+"(global-set-key [left] \"\\C-b\")\n"
+"(global-set-key [right] \"\\C-f\")\n"
+"(global-set-key [home] \"\\C-a\")\n"
+"(global-set-key [end] \"\\C-e\")\n"
+"(global-set-key [prior] \"\\M-v\")\n"
+"(global-set-key [next] \"\\C-v\")\n"
+"(global-set-key [C-up] \"\\M-\\C-b\")\n"
+"(global-set-key [C-down] \"\\M-\\C-f\")\n"
+"(global-set-key [C-left] \"\\M-b\")\n"
+"(global-set-key [C-right] \"\\M-f\")\n"
+"(global-set-key [C-home] \"\\M-<\")\n"
+"(global-set-key [C-end] \"\\M->\")\n"
+"(global-set-key [C-prior] \"\\M-<\")\n"
+"(global-set-key [C-next] \"\\M->\")\n"
+msgstr ""
+";; Keypad bindings\n"
+"(global-set-key [up] \"\\C-p\")\n"
+"(global-set-key [down] \"\\C-n\")\n"
+"(global-set-key [left] \"\\C-b\")\n"
+"(global-set-key [right] \"\\C-f\")\n"
+"(global-set-key [home] \"\\C-a\")\n"
+"(global-set-key [end] \"\\C-e\")\n"
+"(global-set-key [prior] \"\\M-v\")\n"
+"(global-set-key [next] \"\\C-v\")\n"
+"(global-set-key [C-up] \"\\M-\\C-b\")\n"
+"(global-set-key [C-down] \"\\M-\\C-f\")\n"
+"(global-set-key [C-left] \"\\M-b\")\n"
+"(global-set-key [C-right] \"\\M-f\")\n"
+"(global-set-key [C-home] \"\\M-<\")\n"
+"(global-set-key [C-end] \"\\M->\")\n"
+"(global-set-key [C-prior] \"\\M-<\")\n"
+"(global-set-key [C-next] \"\\M->\")\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1333
+#, no-wrap
+msgid ""
+";; Mouse\n"
+"(global-set-key [mouse-3] 'imenu)\n"
+msgstr ""
+";; Mouse\n"
+"(global-set-key [mouse-3] 'imenu)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1337
+#, no-wrap
+msgid ""
+";; Misc\n"
+"(global-set-key [C-tab] \"\\C-q\\t\")\t; Control tab quotes a tab.\n"
+"(setq backup-by-copying-when-mismatch t)\n"
+msgstr ""
+";; Misc\n"
+"(global-set-key [C-tab] \"\\C-q\\t\")\t; Control tab quotes a tab.\n"
+"(setq backup-by-copying-when-mismatch t)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1342
+#, no-wrap
+msgid ""
+";; Treat 'y' or <CR> as yes, 'n' as no.\n"
+"(fset 'yes-or-no-p 'y-or-n-p)\n"
+"(define-key query-replace-map [return] 'act)\n"
+"(define-key query-replace-map [?\\C-m] 'act)\n"
+msgstr ""
+";; Treat 'y' or <CR> as yes, 'n' as no.\n"
+"(fset 'yes-or-no-p 'y-or-n-p)\n"
+"(define-key query-replace-map [return] 'act)\n"
+"(define-key query-replace-map [?\\C-m] 'act)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1346
+#, no-wrap
+msgid ""
+";; Load packages\n"
+"(require 'desktop)\n"
+"(require 'tar-mode)\n"
+msgstr ""
+";; Load packages\n"
+"(require 'desktop)\n"
+"(require 'tar-mode)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1352
+#, no-wrap
+msgid ""
+";; Pretty diff mode\n"
+"(autoload 'ediff-buffers \"ediff\" \"Intelligent Emacs interface to diff\" t)\n"
+"(autoload 'ediff-files \"ediff\" \"Intelligent Emacs interface to diff\" t)\n"
+"(autoload 'ediff-files-remote \"ediff\"\n"
+" \"Intelligent Emacs interface to diff\")\n"
+msgstr ""
+";; Pretty diff mode\n"
+"(autoload 'ediff-buffers \"ediff\" \"Intelligent Emacs interface to diff\" t)\n"
+"(autoload 'ediff-files \"ediff\" \"Intelligent Emacs interface to diff\" t)\n"
+"(autoload 'ediff-files-remote \"ediff\"\n"
+" \"Intelligent Emacs interface to diff\")\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1361
+#, no-wrap
+msgid ""
+"(if first-time\n"
+" (setq auto-mode-alist\n"
+"\t (append '((\"\\\\.cpp$\" . c++-mode)\n"
+"\t\t (\"\\\\.hpp$\" . c++-mode)\n"
+"\t\t (\"\\\\.lsp$\" . lisp-mode)\n"
+"\t\t (\"\\\\.scm$\" . scheme-mode)\n"
+"\t\t (\"\\\\.pl$\" . perl-mode)\n"
+"\t\t ) auto-mode-alist)))\n"
+msgstr ""
+"(if first-time\n"
+" (setq auto-mode-alist\n"
+"\t (append '((\"\\\\.cpp$\" . c++-mode)\n"
+"\t\t (\"\\\\.hpp$\" . c++-mode)\n"
+"\t\t (\"\\\\.lsp$\" . lisp-mode)\n"
+"\t\t (\"\\\\.scm$\" . scheme-mode)\n"
+"\t\t (\"\\\\.pl$\" . perl-mode)\n"
+"\t\t ) auto-mode-alist)))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1366
+#, no-wrap
+msgid ""
+";; Auto font lock mode\n"
+"(defvar font-lock-auto-mode-list\n"
+" (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)\n"
+" \"List of modes to always start in font-lock-mode\")\n"
+msgstr ""
+";; Auto font lock mode\n"
+"(defvar font-lock-auto-mode-list\n"
+" (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode)\n"
+" \"List of modes to always start in font-lock-mode\")\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1371
+#, no-wrap
+msgid ""
+"(defvar font-lock-mode-keyword-alist\n"
+" '((c++-c-mode . c-font-lock-keywords)\n"
+" (perl-mode . perl-font-lock-keywords))\n"
+" \"Associations between modes and keywords\")\n"
+msgstr ""
+"(defvar font-lock-mode-keyword-alist\n"
+" '((c++-c-mode . c-font-lock-keywords)\n"
+" (perl-mode . perl-font-lock-keywords))\n"
+" \"Associations between modes and keywords\")\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1379
+#, no-wrap
+msgid ""
+"(defun font-lock-auto-mode-select ()\n"
+" \"Automatically select font-lock-mode if the current major mode is in font-lock-auto-mode-list\"\n"
+" (if (memq major-mode font-lock-auto-mode-list)\n"
+" (progn\n"
+"\t(font-lock-mode t))\n"
+" )\n"
+" )\n"
+msgstr ""
+"(defun font-lock-auto-mode-select ()\n"
+" \"Automatically select font-lock-mode if the current major mode is in font-lock-auto-mode-list\"\n"
+" (if (memq major-mode font-lock-auto-mode-list)\n"
+" (progn\n"
+"\t(font-lock-mode t))\n"
+" )\n"
+" )\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1381
+#, no-wrap
+msgid "(global-set-key [M-f1] 'font-lock-fontify-buffer)\n"
+msgstr "(global-set-key [M-f1] 'font-lock-fontify-buffer)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1398
+#, no-wrap
+msgid ""
+";; New dabbrev stuff\n"
+";(require 'new-dabbrev)\n"
+"(setq dabbrev-always-check-other-buffers t)\n"
+"(setq dabbrev-abbrev-char-regexp \"\\\\sw\\\\|\\\\s_\")\n"
+"(add-hook 'emacs-lisp-mode-hook\n"
+"\t '(lambda ()\n"
+"\t (set (make-local-variable 'dabbrev-case-fold-search) nil)\n"
+"\t (set (make-local-variable 'dabbrev-case-replace) nil)))\n"
+"(add-hook 'c-mode-hook\n"
+"\t '(lambda ()\n"
+"\t (set (make-local-variable 'dabbrev-case-fold-search) nil)\n"
+"\t (set (make-local-variable 'dabbrev-case-replace) nil)))\n"
+"(add-hook 'text-mode-hook\n"
+"\t '(lambda ()\n"
+"\t (set (make-local-variable 'dabbrev-case-fold-search) t)\n"
+"\t (set (make-local-variable 'dabbrev-case-replace) t)))\n"
+msgstr ""
+";; New dabbrev stuff\n"
+";(require 'new-dabbrev)\n"
+"(setq dabbrev-always-check-other-buffers t)\n"
+"(setq dabbrev-abbrev-char-regexp \"\\\\sw\\\\|\\\\s_\")\n"
+"(add-hook 'emacs-lisp-mode-hook\n"
+"\t '(lambda ()\n"
+"\t (set (make-local-variable 'dabbrev-case-fold-search) nil)\n"
+"\t (set (make-local-variable 'dabbrev-case-replace) nil)))\n"
+"(add-hook 'c-mode-hook\n"
+"\t '(lambda ()\n"
+"\t (set (make-local-variable 'dabbrev-case-fold-search) nil)\n"
+"\t (set (make-local-variable 'dabbrev-case-replace) nil)))\n"
+"(add-hook 'text-mode-hook\n"
+"\t '(lambda ()\n"
+"\t (set (make-local-variable 'dabbrev-case-fold-search) t)\n"
+"\t (set (make-local-variable 'dabbrev-case-replace) t)))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1410
+#, no-wrap
+msgid ""
+";; C++ and C mode...\n"
+"(defun my-c++-mode-hook ()\n"
+" (setq tab-width 4)\n"
+" (define-key c++-mode-map \"\\C-m\" 'reindent-then-newline-and-indent)\n"
+" (define-key c++-mode-map \"\\C-ce\" 'c-comment-edit)\n"
+" (setq c++-auto-hungry-initial-state 'none)\n"
+" (setq c++-delete-function 'backward-delete-char)\n"
+" (setq c++-tab-always-indent t)\n"
+" (setq c-indent-level 4)\n"
+" (setq c-continued-statement-offset 4)\n"
+" (setq c++-empty-arglist-indent 4))\n"
+msgstr ""
+";; C++ and C mode...\n"
+"(defun my-c++-mode-hook ()\n"
+" (setq tab-width 4)\n"
+" (define-key c++-mode-map \"\\C-m\" 'reindent-then-newline-and-indent)\n"
+" (define-key c++-mode-map \"\\C-ce\" 'c-comment-edit)\n"
+" (setq c++-auto-hungry-initial-state 'none)\n"
+" (setq c++-delete-function 'backward-delete-char)\n"
+" (setq c++-tab-always-indent t)\n"
+" (setq c-indent-level 4)\n"
+" (setq c-continued-statement-offset 4)\n"
+" (setq c++-empty-arglist-indent 4))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1424
+#, no-wrap
+msgid ""
+"(defun my-c-mode-hook ()\n"
+" (setq tab-width 4)\n"
+" (define-key c-mode-map \"\\C-m\" 'reindent-then-newline-and-indent)\n"
+" (define-key c-mode-map \"\\C-ce\" 'c-comment-edit)\n"
+" (setq c-auto-hungry-initial-state 'none)\n"
+" (setq c-delete-function 'backward-delete-char)\n"
+" (setq c-tab-always-indent t)\n"
+";; BSD-ish indentation style\n"
+" (setq c-indent-level 4)\n"
+" (setq c-continued-statement-offset 4)\n"
+" (setq c-brace-offset -4)\n"
+" (setq c-argdecl-indent 0)\n"
+" (setq c-label-offset -4))\n"
+msgstr ""
+"(defun my-c-mode-hook ()\n"
+" (setq tab-width 4)\n"
+" (define-key c-mode-map \"\\C-m\" 'reindent-then-newline-and-indent)\n"
+" (define-key c-mode-map \"\\C-ce\" 'c-comment-edit)\n"
+" (setq c-auto-hungry-initial-state 'none)\n"
+" (setq c-delete-function 'backward-delete-char)\n"
+" (setq c-tab-always-indent t)\n"
+";; BSD-ish indentation style\n"
+" (setq c-indent-level 4)\n"
+" (setq c-continued-statement-offset 4)\n"
+" (setq c-brace-offset -4)\n"
+" (setq c-argdecl-indent 0)\n"
+" (setq c-label-offset -4))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1431
+#, no-wrap
+msgid ""
+";; Perl mode\n"
+"(defun my-perl-mode-hook ()\n"
+" (setq tab-width 4)\n"
+" (define-key c++-mode-map \"\\C-m\" 'reindent-then-newline-and-indent)\n"
+" (setq perl-indent-level 4)\n"
+" (setq perl-continued-statement-offset 4))\n"
+msgstr ""
+";; Perl mode\n"
+"(defun my-perl-mode-hook ()\n"
+" (setq tab-width 4)\n"
+" (define-key c++-mode-map \"\\C-m\" 'reindent-then-newline-and-indent)\n"
+" (setq perl-indent-level 4)\n"
+" (setq perl-continued-statement-offset 4))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1435
+#, no-wrap
+msgid ""
+";; Scheme mode...\n"
+"(defun my-scheme-mode-hook ()\n"
+" (define-key scheme-mode-map \"\\C-m\" 'reindent-then-newline-and-indent))\n"
+msgstr ""
+";; Scheme mode...\n"
+"(defun my-scheme-mode-hook ()\n"
+" (define-key scheme-mode-map \"\\C-m\" 'reindent-then-newline-and-indent))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1441
+#, no-wrap
+msgid ""
+";; Emacs-Lisp mode...\n"
+"(defun my-lisp-mode-hook ()\n"
+" (define-key lisp-mode-map \"\\C-m\" 'reindent-then-newline-and-indent)\n"
+" (define-key lisp-mode-map \"\\C-i\" 'lisp-indent-line)\n"
+" (define-key lisp-mode-map \"\\C-j\" 'eval-print-last-sexp))\n"
+msgstr ""
+";; Emacs-Lisp mode...\n"
+"(defun my-lisp-mode-hook ()\n"
+" (define-key lisp-mode-map \"\\C-m\" 'reindent-then-newline-and-indent)\n"
+" (define-key lisp-mode-map \"\\C-i\" 'lisp-indent-line)\n"
+" (define-key lisp-mode-map \"\\C-j\" 'eval-print-last-sexp))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1449
+#, no-wrap
+msgid ""
+";; Add all of the hooks...\n"
+"(add-hook 'c++-mode-hook 'my-c++-mode-hook)\n"
+"(add-hook 'c-mode-hook 'my-c-mode-hook)\n"
+"(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)\n"
+"(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)\n"
+"(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)\n"
+"(add-hook 'perl-mode-hook 'my-perl-mode-hook)\n"
+msgstr ""
+";; Add all of the hooks...\n"
+"(add-hook 'c++-mode-hook 'my-c++-mode-hook)\n"
+"(add-hook 'c-mode-hook 'my-c-mode-hook)\n"
+"(add-hook 'scheme-mode-hook 'my-scheme-mode-hook)\n"
+"(add-hook 'emacs-lisp-mode-hook 'my-lisp-mode-hook)\n"
+"(add-hook 'lisp-mode-hook 'my-lisp-mode-hook)\n"
+"(add-hook 'perl-mode-hook 'my-perl-mode-hook)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1455
+#, no-wrap
+msgid ""
+";; Complement to next-error\n"
+"(defun previous-error (n)\n"
+" \"Visit previous compilation error message and corresponding source code.\"\n"
+" (interactive \"p\")\n"
+" (next-error (- n)))\n"
+msgstr ""
+";; Complement to next-error\n"
+"(defun previous-error (n)\n"
+" \"Visit previous compilation error message and corresponding source code.\"\n"
+" (interactive \"p\")\n"
+" (next-error (- n)))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1468
+#, no-wrap
+msgid ""
+";; Misc...\n"
+"(transient-mark-mode 1)\n"
+"(setq mark-even-if-inactive t)\n"
+"(setq visible-bell nil)\n"
+"(setq next-line-add-newlines nil)\n"
+"(setq compile-command \"make\")\n"
+"(setq suggest-key-bindings nil)\n"
+"(put 'eval-expression 'disabled nil)\n"
+"(put 'narrow-to-region 'disabled nil)\n"
+"(put 'set-goal-column 'disabled nil)\n"
+"(if (>= emacs-major-version 21)\n"
+"\t(setq show-trailing-whitespace t))\n"
+msgstr ""
+";; Misc...\n"
+"(transient-mark-mode 1)\n"
+"(setq mark-even-if-inactive t)\n"
+"(setq visible-bell nil)\n"
+"(setq next-line-add-newlines nil)\n"
+"(setq compile-command \"make\")\n"
+"(setq suggest-key-bindings nil)\n"
+"(put 'eval-expression 'disabled nil)\n"
+"(put 'narrow-to-region 'disabled nil)\n"
+"(put 'set-goal-column 'disabled nil)\n"
+"(if (>= emacs-major-version 21)\n"
+"\t(setq show-trailing-whitespace t))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1474
+#, no-wrap
+msgid ""
+";; Elisp archive searching\n"
+"(autoload 'format-lisp-code-directory \"lispdir\" nil t)\n"
+"(autoload 'lisp-dir-apropos \"lispdir\" nil t)\n"
+"(autoload 'lisp-dir-retrieve \"lispdir\" nil t)\n"
+"(autoload 'lisp-dir-verify \"lispdir\" nil t)\n"
+msgstr ""
+";; Elisp archive searching\n"
+"(autoload 'format-lisp-code-directory \"lispdir\" nil t)\n"
+"(autoload 'lisp-dir-apropos \"lispdir\" nil t)\n"
+"(autoload 'lisp-dir-retrieve \"lispdir\" nil t)\n"
+"(autoload 'lisp-dir-verify \"lispdir\" nil t)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1483
+#, no-wrap
+msgid ""
+";; Font lock mode\n"
+"(defun my-make-face (face color &optional bold)\n"
+" \"Create a face from a color and optionally make it bold\"\n"
+" (make-face face)\n"
+" (copy-face 'default face)\n"
+" (set-face-foreground face color)\n"
+" (if bold (make-face-bold face))\n"
+" )\n"
+msgstr ""
+";; Font lock mode\n"
+"(defun my-make-face (face color &optional bold)\n"
+" \"Create a face from a color and optionally make it bold\"\n"
+" (make-face face)\n"
+" (copy-face 'default face)\n"
+" (set-face-foreground face color)\n"
+" (if bold (make-face-bold face))\n"
+" )\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1496
+#, no-wrap
+msgid ""
+"(if (eq window-system 'x)\n"
+" (progn\n"
+" (my-make-face 'blue \"blue\")\n"
+" (my-make-face 'red \"red\")\n"
+" (my-make-face 'green \"dark green\")\n"
+" (setq font-lock-comment-face 'blue)\n"
+" (setq font-lock-string-face 'bold)\n"
+" (setq font-lock-type-face 'bold)\n"
+" (setq font-lock-keyword-face 'bold)\n"
+" (setq font-lock-function-name-face 'red)\n"
+" (setq font-lock-doc-string-face 'green)\n"
+" (add-hook 'find-file-hooks 'font-lock-auto-mode-select)\n"
+msgstr ""
+"(if (eq window-system 'x)\n"
+" (progn\n"
+" (my-make-face 'blue \"blue\")\n"
+" (my-make-face 'red \"red\")\n"
+" (my-make-face 'green \"dark green\")\n"
+" (setq font-lock-comment-face 'blue)\n"
+" (setq font-lock-string-face 'bold)\n"
+" (setq font-lock-type-face 'bold)\n"
+" (setq font-lock-keyword-face 'bold)\n"
+" (setq font-lock-function-name-face 'red)\n"
+" (setq font-lock-doc-string-face 'green)\n"
+" (add-hook 'find-file-hooks 'font-lock-auto-mode-select)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1504
+#, no-wrap
+msgid ""
+" (setq baud-rate 1000000)\n"
+" (global-set-key \"\\C-cmm\" 'menu-bar-mode)\n"
+" (global-set-key \"\\C-cms\" 'scroll-bar-mode)\n"
+" (global-set-key [backspace] 'backward-delete-char)\n"
+"\t\t\t\t\t; (global-set-key [delete] 'delete-char)\n"
+" (standard-display-european t)\n"
+" (load-library \"iso-transl\")))\n"
+msgstr ""
+" (setq baud-rate 1000000)\n"
+" (global-set-key \"\\C-cmm\" 'menu-bar-mode)\n"
+" (global-set-key \"\\C-cms\" 'scroll-bar-mode)\n"
+" (global-set-key [backspace] 'backward-delete-char)\n"
+"\t\t\t\t\t; (global-set-key [delete] 'delete-char)\n"
+" (standard-display-european t)\n"
+" (load-library \"iso-transl\")))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1521
+#, no-wrap
+msgid ""
+";; X11 or PC using direct screen writes\n"
+"(if window-system\n"
+" (progn\n"
+" ;; (global-set-key [M-f1] 'hilit-repaint-command)\n"
+" ;; (global-set-key [M-f2] [?\\C-u M-f1])\n"
+" (setq hilit-mode-enable-list\n"
+"\t '(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode\n"
+"\t\t scheme-mode)\n"
+"\t hilit-auto-highlight nil\n"
+"\t hilit-auto-rehighlight 'visible\n"
+"\t hilit-inhibit-hooks nil\n"
+"\t hilit-inhibit-rebinding t)\n"
+" (require 'hilit19)\n"
+" (require 'paren))\n"
+" (setq baud-rate 2400)\t\t\t; For slow serial connections\n"
+" )\n"
+msgstr ""
+";; X11 or PC using direct screen writes\n"
+"(if window-system\n"
+" (progn\n"
+" ;; (global-set-key [M-f1] 'hilit-repaint-command)\n"
+" ;; (global-set-key [M-f2] [?\\C-u M-f1])\n"
+" (setq hilit-mode-enable-list\n"
+"\t '(not text-mode c-mode c++-mode emacs-lisp-mode lisp-mode\n"
+"\t\t scheme-mode)\n"
+"\t hilit-auto-highlight nil\n"
+"\t hilit-auto-rehighlight 'visible\n"
+"\t hilit-inhibit-hooks nil\n"
+"\t hilit-inhibit-rebinding t)\n"
+" (require 'hilit19)\n"
+" (require 'paren))\n"
+" (setq baud-rate 2400)\t\t\t; For slow serial connections\n"
+" )\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1530
+#, no-wrap
+msgid ""
+";; TTY type terminal\n"
+"(if (and (not window-system)\n"
+"\t (not (equal system-type 'ms-dos)))\n"
+" (progn\n"
+" (if first-time\n"
+"\t (progn\n"
+"\t (keyboard-translate ?\\C-h ?\\C-?)\n"
+"\t (keyboard-translate ?\\C-? ?\\C-h)))))\n"
+msgstr ""
+";; TTY type terminal\n"
+"(if (and (not window-system)\n"
+"\t (not (equal system-type 'ms-dos)))\n"
+" (progn\n"
+" (if first-time\n"
+"\t (progn\n"
+"\t (keyboard-translate ?\\C-h ?\\C-?)\n"
+"\t (keyboard-translate ?\\C-? ?\\C-h)))))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1536
+#, no-wrap
+msgid ""
+";; Under UNIX\n"
+"(if (not (equal system-type 'ms-dos))\n"
+" (progn\n"
+" (if first-time\n"
+"\t (server-start))))\n"
+msgstr ""
+";; Under UNIX\n"
+"(if (not (equal system-type 'ms-dos))\n"
+" (progn\n"
+" (if first-time\n"
+"\t (server-start))))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1544
+#, no-wrap
+msgid ""
+";; Add any face changes here\n"
+"(add-hook 'term-setup-hook 'my-term-setup-hook)\n"
+"(defun my-term-setup-hook ()\n"
+" (if (eq window-system 'pc)\n"
+" (progn\n"
+";;\t(set-face-background 'default \"red\")\n"
+"\t)))\n"
+msgstr ""
+";; Add any face changes here\n"
+"(add-hook 'term-setup-hook 'my-term-setup-hook)\n"
+"(defun my-term-setup-hook ()\n"
+" (if (eq window-system 'pc)\n"
+" (progn\n"
+";;\t(set-face-background 'default \"red\")\n"
+"\t)))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1550
+#, no-wrap
+msgid ""
+";; Restore the \"desktop\" - do this as late as possible\n"
+"(if first-time\n"
+" (progn\n"
+" (desktop-load-default)\n"
+" (desktop-read)))\n"
+msgstr ""
+";; Restore the \"desktop\" - do this as late as possible\n"
+"(if first-time\n"
+" (progn\n"
+" (desktop-load-default)\n"
+" (desktop-read)))\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1553
+#, no-wrap
+msgid ""
+";; Indicate that this file has been read at least once\n"
+"(setq first-time nil)\n"
+msgstr ""
+";; Indicate that this file has been read at least once\n"
+"(setq first-time nil)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1555
+#, no-wrap
+msgid ";; No need to debug anything now\n"
+msgstr ";; No need to debug anything now\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1557
+#, no-wrap
+msgid "(setq debug-on-error nil)\n"
+msgstr "(setq debug-on-error nil)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1560
+#, no-wrap
+msgid ""
+";; All done\n"
+"(message \"All done, %s%s\" (user-login-name) \".\")\n"
+msgstr ""
+";; All done\n"
+"(message \"All done, %s%s\" (user-login-name) \".\")\n"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1563
+#, no-wrap
+msgid "Extending the Range of Languages Emacs Understands"
+msgstr "Расширение списка языков, понимаемых Emacs"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1566
+msgid ""
+"Now, this is all very well if you only want to program in the languages "
+"already catered for in [.filename]#.emacs# (C, C++, Perl, Lisp and Scheme), "
+"but what happens if a new language called \"whizbang\" comes out, full of "
+"exciting features?"
+msgstr ""
+"Вот, это все хорошо, если вы хотите программировать только на языках, уже "
+"предусмотренных в [.filename]#.emacs# (C, C++, Perl, Lisp и Scheme), но что "
+"произойдет, если появится новый язык под названием \"whizbang\", полный "
+"захватывающих возможностей?"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1570
+msgid ""
+"The first thing to do is find out if whizbang comes with any files that tell "
+"Emacs about the language. These usually end in [.filename]#.el#, short for "
+"\"Emacs Lisp\". For example, if whizbang is a FreeBSD port, we can locate "
+"these files by doing"
+msgstr ""
+"Первое, что нужно сделать, — это выяснить, поставляются ли с whizbang какие-"
+"либо файлы, сообщающие Emacs о языке. Обычно они заканчиваются на "
+"[.filename]#.el#, что означает \"Emacs Lisp\". Например, если whizbang "
+"является портом FreeBSD, мы можем найти эти файлы, выполнив"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1574
+#, no-wrap
+msgid "% find /usr/ports/lang/whizbang -name \"*.el\" -print\n"
+msgstr "% find /usr/ports/lang/whizbang -name \"*.el\" -print\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1578
+msgid ""
+"and install them by copying them into the Emacs site Lisp directory. On "
+"FreeBSD, this is [.filename]#/usr/local/share/emacs/site-lisp#."
+msgstr ""
+"и установите их, скопировав в каталог Emacs, где находятся файлы Lisp (site "
+"Lisp). В FreeBSD это [.filename]#/usr/local/share/emacs/site-lisp#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1580
+msgid "So for example, if the output from the find command was"
+msgstr "Вот пример, если вывод команды find был"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1584
+#, no-wrap
+msgid "/usr/ports/lang/whizbang/work/misc/whizbang.el\n"
+msgstr "/usr/ports/lang/whizbang/work/misc/whizbang.el\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1587
+msgid "we would do"
+msgstr "мы бы сделали"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1591
+#, no-wrap
+msgid "# cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/share/emacs/site-lisp\n"
+msgstr "# cp /usr/ports/lang/whizbang/work/misc/whizbang.el /usr/local/share/emacs/site-lisp\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1596
+msgid ""
+"Next, we need to decide what extension whizbang source files have. Let us "
+"say for the sake of argument that they all end in [.filename]#.wiz#. We "
+"need to add an entry to our [.filename]#.emacs# to make sure Emacs will be "
+"able to use the information in [.filename]#whizbang.el#."
+msgstr ""
+"Далее нам нужно решить, какое расширение имеют исходные файлы whizbang. "
+"Допустим, для примера, что все они заканчиваются на [.filename]#.wiz#. Нам "
+"необходимо добавить запись в наш [.filename]#.emacs#, чтобы убедиться, что "
+"Emacs сможет использовать информацию из [.filename]#whizbang.el#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1598
+msgid ""
+"Find the auto-mode-alist entry in [.filename]#.emacs# and add a line for "
+"whizbang, such as:"
+msgstr ""
+"Найдите запись auto-mode-alist в файле [.filename]#.emacs# и добавьте строку "
+"для whizbang, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1606
+#, no-wrap
+msgid ""
+"...\n"
+"(\"\\\\.lsp$\" . lisp-mode)\n"
+"(\"\\\\.wiz$\" . whizbang-mode)\n"
+"(\"\\\\.scm$\" . scheme-mode)\n"
+"...\n"
+msgstr ""
+"...\n"
+"(\"\\\\.lsp$\" . lisp-mode)\n"
+"(\"\\\\.wiz$\" . whizbang-mode)\n"
+"(\"\\\\.scm$\" . scheme-mode)\n"
+"...\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1609
+msgid ""
+"This means that Emacs will automatically go into `whizbang-mode` when you "
+"edit a file ending in [.filename]#.wiz#."
+msgstr ""
+"Это означает, что Emacs автоматически перейдёт в режим `whizbang-mode` при "
+"редактировании файла с расширением [.filename]#.wiz#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1612
+msgid ""
+"Just below this, you will find the font-lock-auto-mode-list entry. Add "
+"`whizbang-mode` to it like so:"
+msgstr ""
+"Непосредственно ниже вы найдете запись font-lock-auto-mode-list. Добавьте "
+"`whizbang-mode` в нее следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1619
+#, no-wrap
+msgid ""
+";; Auto font lock mode\n"
+"(defvar font-lock-auto-mode-list\n"
+" (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)\n"
+" \"List of modes to always start in font-lock-mode\")\n"
+msgstr ""
+";; Auto font lock mode\n"
+"(defvar font-lock-auto-mode-list\n"
+" (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'whizbang-mode 'lisp-mode 'perl-mode 'scheme-mode)\n"
+" \"List of modes to always start in font-lock-mode\")\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1622
+msgid ""
+"This means that Emacs will always enable `font-lock-mode` (ie syntax "
+"highlighting) when editing a [.filename]#.wiz# file."
+msgstr ""
+"Это означает, что Emacs всегда будет включать `font-lock-mode` (т.е. "
+"подсветку синтаксиса) при редактировании файла [.filename]#.wiz#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1625
+msgid ""
+"And that is all that is needed. If there is anything else you want done "
+"automatically when you open up [.filename]#.wiz#, you can add a `whizbang-"
+"mode hook` (see `my-scheme-mode-hook` for a simple example that adds `auto-"
+"indent`)."
+msgstr ""
+"И это всё, что требуется. Если вам нужно, чтобы что-то ещё выполнялось "
+"автоматически при открытии [.filename]#.wiz#, вы можете добавить `whizbang-"
+"mode hook` (см. `my-scheme-mode-hook` для простого примера, который "
+"добавляет `auto-indent`)."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1627
+#, no-wrap
+msgid "Further Reading"
+msgstr "Для дальнейшего ознакомления"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1630
+msgid ""
+"For information about setting up a development environment for contributing "
+"fixes to FreeBSD itself, please see man:development[7]."
+msgstr ""
+"Для получения информации о настройке среды разработки для внесения "
+"исправлений в саму FreeBSD см. man:development[7]."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1632
+msgid ""
+"Brian Harvey and Matthew Wright _Simply Scheme_ MIT 1994. ISBN 0-262-08226-8"
+msgstr ""
+"Brian Harvey and Matthew Wright _Simply Scheme_ MIT 1994. ISBN 0-262-08226-8"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1633
+msgid "Randall Schwartz _Learning Perl_ O'Reilly 1993 ISBN 1-56592-042-2"
+msgstr "Randall Schwartz _Learning Perl_ O'Reilly 1993 ISBN 1-56592-042-2"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1634
+msgid ""
+"Patrick Henry Winston and Berthold Klaus Paul Horn _Lisp (3rd Edition)_ "
+"Addison-Wesley 1989 ISBN 0-201-08319-1"
+msgstr ""
+"Patrick Henry Winston and Berthold Klaus Paul Horn _Lisp (3rd Edition)_ "
+"Addison-Wesley 1989 ISBN 0-201-08319-1"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1635
+msgid ""
+"Brian W. Kernighan and Rob Pike _The Unix Programming Environment_ Prentice-"
+"Hall 1984 ISBN 0-13-937681-X"
+msgstr ""
+"Brian W. Kernighan and Rob Pike _The Unix Programming Environment_ Prentice-"
+"Hall 1984 ISBN 0-13-937681-X"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1636
+msgid ""
+"Brian W. Kernighan and Dennis M. Ritchie _The C Programming Language (2nd "
+"Edition)_ Prentice-Hall 1988 ISBN 0-13-110362-8"
+msgstr ""
+"Brian W. Kernighan and Dennis M. Ritchie _The C Programming Language (2nd "
+"Edition)_ Prentice-Hall 1988 ISBN 0-13-110362-8"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1637
+msgid ""
+"Bjarne Stroustrup _The C++ Programming Language_ Addison-Wesley 1991 ISBN "
+"0-201-53992-6"
+msgstr ""
+"Bjarne Stroustrup _The C++ Programming Language_ Addison-Wesley 1991 ISBN "
+"0-201-53992-6"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1638
+msgid ""
+"W. Richard Stevens _Advanced Programming in the Unix Environment_ Addison-"
+"Wesley 1992 ISBN 0-201-56317-7"
+msgstr ""
+"W. Richard Stevens _Advanced Programming in the Unix Environment_ Addison-"
+"Wesley 1992 ISBN 0-201-56317-7"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/tools/_index.adoc:1638
+msgid ""
+"W. Richard Stevens _Unix Network Programming_ Prentice-Hall 1990 ISBN "
+"0-13-949876-1"
+msgstr ""
+"W. Richard Stevens _Unix Network Programming_ Prentice-Hall 1990 ISBN "
+"0-13-949876-1"
diff --git a/documentation/content/ru/books/developers-handbook/x86/_index.adoc b/documentation/content/ru/books/developers-handbook/x86/_index.adoc
new file mode 100644
index 0000000000..c44f67bb5c
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/x86/_index.adoc
@@ -0,0 +1,3864 @@
+---
+authors:
+description: 'Программирование на ассемблере x86'
+next: books/developers-handbook/partv
+params:
+ path: /books/developers-handbook/x86/
+prev: books/developers-handbook/partiv
+showBookMenu: true
+tags: ["x86", "guide"]
+title: 'Глава 11. Программирование на языке ассемблера для x86'
+weight: 15
+---
+
+[[x86]]
+= Программирование на ассемблере x86
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: A
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/developers-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+_Эта глава была написана {stanislav}._
+
+[[x86-intro]]
+== Обзор
+
+Программирование на ассемблере в UNIX(R) крайне плохо документировано. Обычно предполагается, что никто не захочет его использовать, поскольку различные системы UNIX(R) работают на разных микропроцессорах, и поэтому всё должно быть написано на C для обеспечения переносимости.
+
+В действительности переносимость программ на C — это скорее миф. Даже программы на C требуют изменений при переносе с одной UNIX(R)-системы на другую, независимо от процессора, на котором они работают. Обычно такая программа содержит множество условных операторов, зависящих от системы, для которой она компилируется.
+
+Даже если мы считаем, что всё программное обеспечение UNIX(R) должно быть написано на C или другом языке высокого уровня, нам всё равно нужны программисты на ассемблере: кто же ещё напишет часть библиотеки C, которая обращается к ядру?
+
+В этой главе я попытаюсь показать вам, как можно использовать язык ассемблера для написания программ под UNIX(R), в частности под FreeBSD.
+
+В этой главе не объясняются основы языка ассемблера. Существует достаточно ресурсов на эту тему (например, полный онлайн-курс по языку ассемблера можно найти в http://webster.cs.ucr.edu/[Искусстве языка ассемблера] Рэндалла Хайда; если вы предпочитаете печатные книги, обратите внимание на «Язык ассемблера шаг за шагом» Джеффа Дантемана (ISBN: 0471375233)). Однако после прочтения этой главы любой программист на языке ассемблера сможет писать программы для FreeBSD быстро и эффективно.
+
+Copyright (R) 2000-2001 G. Adam Stanislav. All rights reserved.
+
+[[x86-the-tools]]
+== Инструменты
+
+[[x86-the-assembler]]
+=== Ассемблер
+
+Важнейшим инструментом для программирования на языке ассемблера является ассемблер — программа, преобразующая код на языке ассемблера в машинный код.
+
+Три очень разных ассемблера доступны для FreeBSD. И man:llvm-as[1] (включён в package:devel/llvm[]), и man:as[1] (включён в package:devel/binutils[]) используют традиционный синтаксис ассемблера UNIX(R).
+
+С другой стороны, man:nasm[1] (устанавливаемый через package:devel/nasm[]) использует синтаксис Intel. Его основное преимущество в том, что он может ассемблировать код для многих операционных систем.
+
+В этой главе используется синтаксис nasm, потому что большинство программистов на ассемблере, приходящих в FreeBSD из других операционных систем, найдут его более понятным. Кроме того, если честно, это то, к чему я привык.
+
+[[x86-the-linker]]
+=== Компоновщик
+
+Результат работы ассемблера, как и любого компилятора, необходимо связать, чтобы получить исполняемый файл.
+
+Стандартный компоновщик man:ld[1] поставляется с FreeBSD. Он работает с кодом, собранным любым из ассемблеров.
+
+[[x86-system-calls]]
+== Системные вызовы
+
+[[x86-default-calling-convention]]
+=== Стандартное соглашение о вызовах
+
+По умолчанию ядро FreeBSD использует соглашение о вызовах C. Кроме того, хотя доступ к ядру осуществляется с помощью `int 80h`, предполагается, что программа вызовет функцию, которая выполняет `int 80h`, а не будет выполнять `int 80h` напрямую.
+
+Эта традиция очень удобна и значительно превосходит соглашение Microsoft(R), используемое в MS-DOS(R). Почему? Потому что соглашение UNIX(R) позволяет любой программе, написанной на любом языке, обращаться к ядру.
+
+Программа на ассемблере также может это сделать. Например, мы могли бы открыть файл:
+
+[.programlisting]
+....
+kernel:
+ int 80h ; Call kernel
+ ret
+
+open:
+ push dword mode
+ push dword flags
+ push dword path
+ mov eax, 5
+ call kernel
+ add esp, byte 12
+ ret
+....
+
+Это очень понятный и переносимый способ написания кода. Если вам нужно перенести код на UNIX(R)-систему, которая использует другое прерывание или другой способ передачи параметров, все, что вам нужно изменить, это процедуру kernel.
+
+Но программисты на ассемблере любят экономить такты. Приведённый выше пример требует комбинации `call/ret`. Мы можем исключить её, сделав ``push`` дополнительного двойного слова:
+
+[.programlisting]
+....
+open:
+ push dword mode
+ push dword flags
+ push dword path
+ mov eax, 5
+ push eax ; Or any other dword
+ int 80h
+ add esp, byte 16
+....
+
+Помещённое в `EAX` значение `5` идентифицирует функцию ядра, в данном случае `open`.
+
+[[x86-alternate-calling-convention]]
+=== Альтернативное соглашение о вызовах
+
+FreeBSD — это чрезвычайно гибкая система. Она предлагает другие способы вызова ядра. Однако для работы необходимо, чтобы в системе была установлена эмуляция Linux.
+
+Linux — это система, подобная UNIX(R). Однако ее ядро использует то же соглашение о системных вызовов для передачи параметров в регистрах, что и MS-DOS(R). Как и в соглашении UNIX(R), номер функции помещается в `EAX`. Однако параметры передаются не в стеке, а в регистрах `EBX, ECX, EDX, ESI, EDI, EBP`:
+
+[.programlisting]
+....
+open:
+ mov eax, 5
+ mov ebx, path
+ mov ecx, flags
+ mov edx, mode
+ int 80h
+....
+
+Этот подход имеет значительный недостаток по сравнению с UNIX(R), по крайней мере, в контексте программирования на ассемблере: каждый раз при вызове ядра необходимо сохранять регистры с помощью `push`, а затем восстанавливать их с помощью `pop`. Это делает ваш код более громоздким и медленным. Тем не менее, FreeBSD предоставляет вам выбор.
+
+Если вы решите использовать соглашение Linux, вы должны сообщить об этом системе. После того как ваша программа будет ассемблирована и слинкована, вам нужно пометить исполняемый файл:
+
+[source, shell]
+....
+% brandelf -t Linux filename
+....
+
+[[x86-use-geneva]]
+=== Какое соглашение следует использовать?
+
+Если вы разрабатываете код специально для FreeBSD, всегда следует использовать соглашение UNIX(R): это быстрее, вы можете хранить глобальные переменные в регистрах, вам не нужно маркировать исполняемый файл, и вы не требуете установки пакета эмуляции Linux на целевой системе.
+
+Хотя вы можете хотеть создать переносимый код, который также работает на Linux, вам, вероятно, по-прежнему будет нужен максимально эффективный код для пользователей FreeBSD. Я покажу вам, как этого добиться, после того как объясню основы.
+
+[[x86-call-numbers]]
+=== Номера вызовов
+
+Чтобы сообщить ядру, какую системную службу вы вызываете, поместите её номер в `EAX`. Разумеется, вам необходимо знать, что это за номер.
+
+[[x86-the-syscalls-file]]
+==== Файл [.filename]#syscalls#
+
+Номера перечислены в [.filename]#syscalls#. Команда `locate syscalls` находит этот файл в нескольких различных форматах, все они создаются автоматически из [.filename]#syscalls.master#.
+
+Основной файл для стандартного соглашения о вызовах UNIX(R) можно найти в [.filename]#/usr/src/sys/kern/syscalls.master#. Если вам необходимо использовать другое соглашение, реализованное в режиме эмуляции Linux, обратитесь к [.filename]#/usr/src/sys/i386/linux/syscalls.master#.
+
+[NOTE]
+====
+Не только FreeBSD и Linux используют разные соглашения о вызовах, но иногда они используют разные номера для одних и тех же функций.
+====
+
+[.filename]#syscalls.master# описывает, как должен быть выполнен вызов:
+
+[.programlisting]
+....
+0 STD NOHIDE { int nosys(void); } syscall nosys_args int
+1 STD NOHIDE { void exit(int rval); } exit rexit_args void
+2 STD POSIX { int fork(void); }
+3 STD POSIX { ssize_t read(int fd, void *buf, size_t nbyte); }
+4 STD POSIX { ssize_t write(int fd, const void *buf, size_t nbyte); }
+5 STD POSIX { int open(char *path, int flags, int mode); }
+6 STD POSIX { int close(int fd); }
+etc...
+....
+
+Это крайний левый столбец, который указывает число, которое нужно поместить в `EAX`.
+
+Самый правый столбец указывает, какие параметры нужно `втолкнуть` в стек командой push. Они `вталкиваются` _справа налево_.
+
+Например, чтобы `открыть` файл, нам сначала нужно сделать `push` для `mode`, затем `flags`, а затем адрес, по которому хранится `path`.
+
+[[x86-return-values]]
+== Возвращаемые значения
+
+От системных вызовов не было бы никакой пользы, если бы они не возвращали какое-либо значение: дескриптор открытого файла, количество байтов, прочитанных в буфер, системное время и т.д.
+
+Кроме того, система должна уведомлять нас, если возникает ошибка: файл не существует, системные ресурсы исчерпаны, передан недопустимый параметр и т. д.
+
+[[x86-man-pages]]
+=== Страницы справочника
+
+Традиционным источником информации о различных системных вызовах в UNIX(R)-системах являются страницы Справочника. В FreeBSD системные вызовы описаны в разделе 2, иногда в разделе 3.
+
+Например, man:open[2] говорит:
+
+[.blockquote]
+В случае успеха `open()` возвращает неотрицательное целое число, называемое файловым дескриптором. В случае ошибки возвращается `-1`, а переменной `errno` присваивается код ошибки.
+
+Программист на ассемблере, впервые столкнувшийся с UNIX(R) и FreeBSD, сразу же задастся вопросом: где находится `errno` и как к ней обратиться?
+
+[NOTE]
+====
+Информация, представленная в руководствах, применима к программам на языке C. Программистам на языке ассемблера требуется дополнительная информация.
+====
+
+[[x86-where-return-values]]
+=== Где возвращаемые значения?
+
+К сожалению, это зависит от ситуации... Для большинства системных вызовов возвращаемое значение находится в `EAX`, но не для всех. Хорошее правило при первой работе с системным вызовом — искать возвращаемое значение в `EAX`. Если его там нет, потребуется дополнительное исследование.
+
+[NOTE]
+====
+Я знаю о одном системном вызове, который возвращает значение в `EDX`: `SYS_fork`. Все остальные, с которыми я работал, используют `EAX`. Но я еще не работал со всеми из них.
+====
+
+[TIP]
+====
+Если вы не можете найти ответ здесь или где-либо ещё, изучите исходный код libc и посмотрите, как он взаимодействует с ядром.
+====
+
+[[x86-where-errno]]
+=== Где находится `errno`?
+
+Фактически, нигде...
+
+`errno` является частью языка C, а не ядра UNIX(R). При прямом доступе к сервисам ядра код ошибки возвращается в регистре `EAX` — том же регистре, в котором обычно оказывается корректное возвращаемое значение.
+
+Это совершенно логично. Если нет ошибки, то нет и кода ошибки. Если есть ошибка, то нет возвращаемого значения. Один регистр может содержать либо то, либо другое.
+
+[[x86-how-to-know-error]]
+=== Определение возникновения ошибки
+
+При использовании стандартного соглашения о вызовах FreeBSD флаг `carry flag` сбрасывается при успехе и устанавливается при неудаче.
+
+При использовании режима эмуляции Linux знаковое значение в `EAX` неотрицательно в случае успеха и содержит возвращаемое значение. В случае ошибки значение отрицательное, т.е. `-errno`.
+
+[[x86-portable-code]]
+== Создание переносимого кода
+
+Портативность обычно не является сильной стороной языка ассемблера. Тем не менее, написание программ на ассемблере для разных платформ возможно, особенно с использованием nasm. Я создавал библиотеки на ассемблере, которые можно было собрать для таких разных операционных систем, как Windows(R) и FreeBSD.
+
+Это становится еще более возможным, когда вы хотите, чтобы ваш код работал на двух платформах, которые, хотя и различны, основаны на схожих архитектурах.
+
+Например, FreeBSD — это UNIX(R), а Linux — UNIX(R)-подобная система. Я упомянул лишь три различия между ними (с точки зрения программиста на ассемблере): соглашение о вызовах, номера функций и способ возврата значений.
+
+[[x86-deal-with-function-numbers]]
+=== Работа с номерами функций
+
+Во многих случаях номера функций совпадают. Однако, даже если это не так, проблему легко решить: вместо использования чисел в коде применяйте константы, объявленные по-разному в зависимости от целевой архитектуры:
+
+[.programlisting]
+....
+%ifdef LINUX
+%define SYS_execve 11
+%else
+%define SYS_execve 59
+%endif
+....
+
+[[x86-deal-with-geneva]]
+=== Работа с соглашениями
+
+Оба, соглашение о вызовах и возвращаемое значение (проблема `errno`) могут быть решены с помощью макросов:
+
+[.programlisting]
+....
+%ifdef LINUX
+
+%macro system 0
+ call kernel
+%endmacro
+
+align 4
+kernel:
+ push ebx
+ push ecx
+ push edx
+ push esi
+ push edi
+ push ebp
+
+ mov ebx, [esp+32]
+ mov ecx, [esp+36]
+ mov edx, [esp+40]
+ mov esi, [esp+44]
+ mov ebp, [esp+48]
+ int 80h
+
+ pop ebp
+ pop edi
+ pop esi
+ pop edx
+ pop ecx
+ pop ebx
+
+ or eax, eax
+ js .errno
+ clc
+ ret
+
+.errno:
+ neg eax
+ stc
+ ret
+
+%else
+
+%macro system 0
+ int 80h
+%endmacro
+
+%endif
+....
+
+[[x86-deal-with-other-portability]]
+=== Устранение прочих проблем с переносимостью
+
+Приведённые выше решения могут помочь в большинстве случаев написания кода, переносимого между FreeBSD и Linux. Тем не менее, с некоторыми сервисами ядра различия более глубокие.
+
+В таком случае необходимо написать два разных обработчика для этих конкретных системных вызовов и использовать условную компиляцию. К счастью, большая часть вашего кода выполняет действия, отличные от вызовов ядра, поэтому обычно потребуется лишь несколько таких условных секций в коде.
+
+[[x86-portable-library]]
+=== Использование библиотеки
+
+Вы можете полностью избежать проблем с переносимостью в основном коде, написав библиотеку системных вызовов. Создайте отдельную библиотеку для FreeBSD, другую для Linux и ещё другие библиотеки для дополнительных операционных систем.
+
+В вашей библиотеке напишите отдельную функцию (или процедуру, если вы предпочитаете традиционную терминологию ассемблера) для каждого системного вызова. Используйте соглашение о вызовах C для передачи параметров. Однако по-прежнему передавайте номер вызова через `EAX`. В таком случае ваша библиотека FreeBSD может быть очень простой, так как множество внешне различных функций могут быть просто метками одного и того же кода:
+
+[.programlisting]
+....
+sys.open:
+sys.close:
+[etc...]
+ int 80h
+ ret
+....
+
+Ваша библиотека Linux потребует больше различных функций. Но даже здесь вы можете группировать системные вызовы, используя одинаковое количество параметров:
+
+[.programlisting]
+....
+sys.exit:
+sys.close:
+[etc... one-parameter functions]
+ push ebx
+ mov ebx, [esp+12]
+ int 80h
+ pop ebx
+ jmp sys.return
+
+...
+
+sys.return:
+ or eax, eax
+ js sys.err
+ clc
+ ret
+
+sys.err:
+ neg eax
+ stc
+ ret
+....
+
+Подход с использованием библиотек может показаться неудобным на первый взгляд, так как требует создания отдельного файла, от которого зависит ваш код. Однако у него есть множество преимуществ: во-первых, вам нужно написать его лишь один раз, и затем вы можете использовать его во всех своих программах. Вы даже можете позволить другим программистам на ассемблере использовать его или, возможно, воспользоваться библиотекой, написанной кем-то другим. Но, пожалуй, самое большое преимущество библиотеки заключается в том, что ваш код может быть перенесён на другие системы, даже другими программистами, просто путём написания новой библиотеки без каких-либо изменений в вашем коде.
+
+Если вам не нравится идея использования библиотеки, вы можете хотя бы разместить все системные вызовы в отдельном файле на ассемблере и скомпоновать его с основной программой. Здесь, опять же, все, что нужно сделать переносчикам, — это создать новый объектный файл для компоновки с основной программой.
+
+[[x86-portable-include]]
+=== Использование включаемого файла
+
+Если вы выпускаете своё программное обеспечение в виде исходного кода (или вместе с ним), вы можете использовать макросы и размещать их в отдельном файле, который включается в ваш код.
+
+Портеры вашего программного обеспечения просто напишут новый include-файл. Никакая библиотека или внешний объектный файл не требуются, и ваш код остается переносимым без необходимости редактирования.
+
+[NOTE]
+====
+Это подход, который мы будем использовать на протяжении всей главы. Мы назовем наш включаемый файл [.filename]#system.inc# и будем добавлять в него новые системные вызовы по мере их рассмотрения.
+====
+
+Мы можем начать наш [.filename]#system.inc# с объявления стандартных файловых дескрипторов:
+
+[.programlisting]
+....
+%define stdin 0
+%define stdout 1
+%define stderr 2
+....
+
+Далее мы создаем символическое имя для каждого системного вызова:
+
+[.programlisting]
+....
+%define SYS_nosys 0
+%define SYS_exit 1
+%define SYS_fork 2
+%define SYS_read 3
+%define SYS_write 4
+; [etc...]
+....
+
+Добавляем короткую, неглобальную процедуру с длинным именем, чтобы случайно не использовать это имя в нашем коде:
+
+[.programlisting]
+....
+section .text
+align 4
+access.the.bsd.kernel:
+ int 80h
+ ret
+....
+
+Мы создаем макрос, который принимает один аргумент — номер системного вызова:
+
+[.programlisting]
+....
+%macro system 1
+ mov eax, %1
+ call access.the.bsd.kernel
+%endmacro
+....
+
+Наконец, мы создаем макросы для каждого системного вызова. Эти макросы не принимают аргументов.
+
+[.programlisting]
+....
+%macro sys.exit 0
+ system SYS_exit
+%endmacro
+
+%macro sys.fork 0
+ system SYS_fork
+%endmacro
+
+%macro sys.read 0
+ system SYS_read
+%endmacro
+
+%macro sys.write 0
+ system SYS_write
+%endmacro
+
+; [etc...]
+....
+
+Продолжайте, введите это в ваш редактор и сохраните как [.filename]#system.inc#. Мы добавим больше по мере обсуждения дополнительных системных вызовов.
+
+[[x86-first-program]]
+== Наша первая программа
+
+Мы готовы к нашей первой обязательной программе — Hello, World!
+
+[.programlisting]
+....
+ %include 'system.inc'
+
+ section .data
+ hello db 'Hello, World!', 0Ah
+ hbytes equ $-hello
+
+ section .text
+ global _start
+_start:
+ push dword hbytes
+ push dword hello
+ push dword stdout
+ sys.write
+
+ push dword 0
+ sys.exit
+....
+
+Вот что он делает: Строка 1 включает определения, макросы и код из файла [.filename]#system.inc#.
+
+Строки 3-5 содержат данные: строка 3 начинает раздел/сегмент данных. Строка 4 содержит строку "Hello, World!", за которой следует новая строка (`0Ah`). Строка 5 создает константу, содержащую длину строки из строки 4 в байтах.
+
+Строки 7-16 содержат код. Обратите внимание, что FreeBSD использует формат файлов _elf_ для исполняемых файлов, который требует, чтобы каждая программа запускается с адреса, помеченного как `_start` (или, точнее, компоновщик ожидает этого). Эта метка должна быть глобальной.
+
+Строки 10-13 указывают системе записать `hbytes` байтов строки `hello` в `stdout`.
+
+Строки 15-16 указывают системе завершить программу с возвращаемым значением `0`. Системный вызов `SYS_exit` никогда не возвращает управление, поэтому код завершается в этой точке.
+
+[NOTE]
+====
+Если вы перешли на UNIX(R) с опытом программирования на ассемблере для MS-DOS(R), вы, возможно, привыкли писать напрямую в видеопамять. В FreeBSD или любой другой разновидности UNIX(R) вам не придётся об этом беспокоиться. С вашей точки зрения, вы записываете данные в файл под названием [.filename]#stdout#. Это может быть экран, терминал telnet, обычный файл или даже входные данные другой программы. Определять, что именно это будет, — задача системы.
+====
+
+[[x86-assemble-1]]
+=== Ассемблирование кода
+
+Наберите код в редакторе и сохраните его в файле с именем [.filename]#hello.asm#. Для сборки вам понадобится nasm.
+
+[[x86-get-nasm]]
+==== Установка nasm
+
+Если у вас нет nasm, введите:
+
+[source, shell]
+....
+% su
+Password:your root password
+# cd /usr/ports/devel/nasm
+# make install
+# exit
+%
+....
+
+Вы можете ввести `make install clean` вместо просто `make install`, если не хотите сохранять исходный код nasm.
+
+В любом случае FreeBSD автоматически загрузит nasm из интернета, скомпилирует его и установит в вашу систему.
+
+[NOTE]
+====
+Если ваша система не FreeBSD, вам нужно получить nasm с его https://sourceforge.net/projects/nasm[домашней страницы]. Вы по-прежнему можете использовать его для ассемблирования кода FreeBSD.
+====
+
+Теперь вы можете собрать, скомпоновать и запустить код:
+
+[source, shell]
+....
+% nasm -f elf hello.asm
+% ld -s -o hello hello.o
+% ./hello
+Hello, World!
+%
+....
+
+[[x86-unix-filters]]
+== Написание фильтров UNIX(R)
+
+Распространённым типом приложений в UNIX(R) являются фильтры — программы, которые читают данные из [.filename]#stdin#, обрабатывают их определённым образом, а затем записывают результат в [.filename]#stdout#.
+
+В этой главе мы разработаем простой фильтр и научимся читать из [.filename]#stdin# и писать в [.filename]#stdout#. Этот фильтр будет преобразовывать каждый байт входных данных в шестнадцатеричное число, за которым следует пробел.
+
+[.programlisting]
+....
+%include 'system.inc'
+
+section .data
+hex db '0123456789ABCDEF'
+buffer db 0, 0, ' '
+
+section .text
+global _start
+_start:
+ ; read a byte from stdin
+ push dword 1
+ push dword buffer
+ push dword stdin
+ sys.read
+ add esp, byte 12
+ or eax, eax
+ je .done
+
+ ; convert it to hex
+ movzx eax, byte [buffer]
+ mov edx, eax
+ shr dl, 4
+ mov dl, [hex+edx]
+ mov [buffer], dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ mov [buffer+1], al
+
+ ; print it
+ push dword 3
+ push dword buffer
+ push dword stdout
+ sys.write
+ add esp, byte 12
+ jmp short _start
+
+.done:
+ push dword 0
+ sys.exit
+....
+
+В разделе данных мы создаем массив с именем `hex`. Он содержит 16 шестнадцатеричных цифр в порядке возрастания. За массивом следует буфер, который мы будем использовать как для ввода, так и для вывода. Первые два байта буфера изначально установлены в `0`. Именно сюда мы будем записывать две шестнадцатеричные цифры (первый байт также является местом, откуда мы будем считывать ввод). Третий байт — это пробел.
+
+Фрагмент кода состоит из четырех частей: чтение байта, преобразование его в шестнадцатеричное число, запись результата и завершение программы.
+
+Для чтения байта мы просим систему прочитать один байт из [.filename]#stdin# и сохранить его в первом байте `buffer`. Система возвращает количество прочитанных байтов в `EAX`. Это значение будет `1`, пока поступают данные, или `0`, если больше нет доступных входных данных. Поэтому мы проверяем значение `EAX`. Если оно равно `0`, мы переходим к метке `.done`, в противном случае продолжаем выполнение.
+
+[NOTE]
+====
+Для простоты мы пока игнорируем возможность возникновения ошибки.
+====
+
+Шестнадцатеричное преобразование считывает байт из `buffer` в `EAX`, а точнее только в `AL`, обнуляя остальные биты `EAX`. Мы также копируем байт в `EDX`, потому что нам нужно преобразовать верхние четыре бита (ниббл) отдельно от нижних четырех битов. Результат сохраняется в первых двух байтах буфера.
+
+Далее мы просим систему записать три байта буфера, то есть две шестнадцатеричные цифры и пробел, в [.filename]#stdout#. Затем мы возвращаемся к началу программы и обрабатываем следующий байт.
+
+Когда ввод больше не остаётся, мы просим систему завершить нашу программу, возвращая ноль, что традиционно означает успешное выполнение программы.
+
+Продолжайте и сохраните код в файле с именем [.filename]#hex.asm#, затем введите следующее (символ `^D` означает, что нужно нажать клавишу управления и, удерживая её, ввести `D`):
+
+[source, shell]
+....
+% nasm -f elf hex.asm
+% ld -s -o hex hex.o
+% ./hex
+Hello, World!
+48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come!
+48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D %
+....
+
+[NOTE]
+====
+Если вы переходите на UNIX(R) с MS-DOS(R), вам может быть интересно, почему каждая строка заканчивается на `0A` вместо `0D 0A`. Это связано с тем, что UNIX(R) не использует соглашение cr/lf, а использует соглашение "новая строка", которое в шестнадцатеричном виде представлено как `0A`.
+====
+
+Можем ли мы это улучшить? Что ж, во-первых, это немного запутанно, потому что после преобразования строки текста наш ввод больше не начинается с начала строки. Мы можем изменить это, чтобы после каждого `0A` выводилась новая строка вместо пробела:
+
+[.programlisting]
+....
+%include 'system.inc'
+
+section .data
+hex db '0123456789ABCDEF'
+buffer db 0, 0, ' '
+
+section .text
+global _start
+_start:
+ mov cl, ' '
+
+.loop:
+ ; read a byte from stdin
+ push dword 1
+ push dword buffer
+ push dword stdin
+ sys.read
+ add esp, byte 12
+ or eax, eax
+ je .done
+
+ ; convert it to hex
+ movzx eax, byte [buffer]
+ mov [buffer+2], cl
+ cmp al, 0Ah
+ jne .hex
+ mov [buffer+2], al
+
+.hex:
+ mov edx, eax
+ shr dl, 4
+ mov dl, [hex+edx]
+ mov [buffer], dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ mov [buffer+1], al
+
+ ; print it
+ push dword 3
+ push dword buffer
+ push dword stdout
+ sys.write
+ add esp, byte 12
+ jmp short .loop
+
+.done:
+ push dword 0
+ sys.exit
+....
+
+Мы сохранили пробел в регистре `CL`. Это безопасно, потому что, в отличие от Microsoft(R) Windows(R), вызовы системы UNIX(R) не изменяют значение регистров, которые не используются для возврата значения.
+
+Это означает, что нам нужно установить `CL` только один раз. Поэтому мы добавили новую метку `.loop` и переходим к ней для следующего байта вместо перехода к `_start`. Мы также добавили метку `.hex`, чтобы третий байт `buffer` мог быть либо пробелом, либо новой строкой.
+
+После внесения изменений в файл [.filename]#hex.asm# введите:
+
+[source, shell]
+....
+% nasm -f elf hex.asm
+% ld -s -o hex hex.o
+% ./hex
+Hello, World!
+48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
+Here I come!
+48 65 72 65 20 49 20 63 6F 6D 65 21 0A
+^D %
+....
+
+Выглядит лучше. Но этот код довольно неэффективен! Мы выполняем системный вызов для каждого отдельного байта дважды (один раз для чтения и ещё один для записи вывода).
+
+[[x86-buffered-io]]
+== Буферизованный ввод и вывод
+
+Мы можем повысить эффективность нашего кода, буферизуя ввод и вывод. Мы создаём входной буфер и читаем сразу целую последовательность байтов. Затем мы извлекаем их по одному из буфера.
+
+Мы также создаем выходной буфер. Мы сохраняем наш вывод в нем, пока он не заполнится. В этот момент мы просим ядро записать содержимое буфера в [.filename]#stdout#.
+
+Программа завершается, когда больше нет входных данных. Но нам всё ещё нужно попросить ядро записать содержимое нашего выходного буфера в [.filename]#stdout# в последний раз, иначе часть нашего вывода попадёт в буфер, но так и не будет отправлена. Не забудьте об этом, иначе будете недоумевать, куда пропала часть вывода.
+
+[.programlisting]
+....
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+hex db '0123456789ABCDEF'
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+
+section .text
+global _start
+_start:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ mov edi, obuffer
+
+.loop:
+ ; read a byte from stdin
+ call getchar
+
+ ; convert it to hex
+ mov dl, al
+ shr al, 4
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, ' '
+ cmp dl, 0Ah
+ jne .put
+ mov al, dl
+
+.put:
+ call putchar
+ jmp short .loop
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ ret
+
+read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword stdin
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .done
+ sub eax, eax
+ ret
+
+align 4
+.done:
+ call write ; flush output buffer
+ push dword 0
+ sys.exit
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword stdout
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+ ret
+....
+
+Теперь у нас есть третий раздел в исходном коде с именем `.bss`. Этот раздел не включается в исполняемый файл и, следовательно, не может быть инициализирован. Мы используем `resb` вместо `db`. Это просто резервирует запрошенный размер неинициализированной памяти для нашего использования.
+
+Мы используем тот факт, что система не изменяет регистры: мы используем регистры для того, что в противном случае пришлось бы хранить в глобальных переменных в секции `.data`. Именно поэтому соглашение UNIX(R) о передаче параметров системных вызовов через стек превосходит соглашение Microsoft о передаче их в регистрах: мы можем оставить регистры для собственного использования.
+
+Мы используем `EDI` и `ESI` как указатели на следующий байт для чтения или записи. Мы используем `EBX` и `ECX` для отслеживания количества байтов в двух буферах, чтобы знать, когда нужно вывести данные в систему или считать новые данные из системы.
+
+Давайте посмотрим, как это работает сейчас:
+
+[source, shell]
+....
+% nasm -f elf hex.asm
+% ld -s -o hex hex.o
+% ./hex
+Hello, World!
+Here I come!
+48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
+48 65 72 65 20 49 20 63 6F 6D 65 21 0A
+^D %
+....
+
+Не то, что вы ожидали? Программа не выводила результат, пока мы не нажали `^D`. Это легко исправить, добавив три строки кода для вывода результата каждый раз, когда мы преобразуем новую строку в `0A`. Я пометил эти три строки символом > (не копируйте > в ваш [.filename]#hex.asm#).
+
+[.programlisting]
+....
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+hex db '0123456789ABCDEF'
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+
+section .text
+global _start
+_start:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ mov edi, obuffer
+
+.loop:
+ ; read a byte from stdin
+ call getchar
+
+ ; convert it to hex
+ mov dl, al
+ shr al, 4
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, ' '
+ cmp dl, 0Ah
+ jne .put
+ mov al, dl
+
+.put:
+ call putchar
+> cmp al, 0Ah
+> jne .loop
+> call write
+ jmp short .loop
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ ret
+
+read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword stdin
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .done
+ sub eax, eax
+ ret
+
+align 4
+.done:
+ call write ; flush output buffer
+ push dword 0
+ sys.exit
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword stdout
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+ ret
+....
+
+Теперь давайте посмотрим, как это работает:
+
+[source, shell]
+....
+% nasm -f elf hex.asm
+% ld -s -o hex hex.o
+% ./hex
+Hello, World!
+48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A
+Here I come!
+48 65 72 65 20 49 20 63 6F 6D 65 21 0A
+^D %
+....
+
+Неплохо для исполняемого файла размером 644 байта, не так ли!
+
+[NOTE]
+====
+Такой подход к буферизированному вводу/выводу всё ещё содержит скрытую опасность. Я расскажу об этом и исправлю её позже, когда речь пойдёт о crossref:x86[x86-buffered-dark-side,тёмной стороне буферизации].
+====
+
+[[x86-ungetc]]
+=== Как отменить чтение символа
+
+[WARNING]
+====
+Это может быть несколько сложной темой, в основном представляющей интерес для программистов, знакомых с теорией компиляторов. Если хотите, вы можете crossref:x86[x86-command-line, перейти к следующему разделу], и, возможно, прочитаете это позже.
+====
+
+Хотя наш пример программы не требует этого, более сложные фильтры часто нуждаются в предварительном просмотре. Другими словами, им может потребоваться узнать, какой следующий символ (или даже несколько символов). Если следующий символ имеет определённое значение, он является частью текущего обрабатываемого токена. В противном случае — нет.
+
+Например, вы можете анализировать входной поток на наличие текстовой строки (например, при реализации компилятора языка): если символ следует за другим символом или, возможно, цифрой, он является частью обрабатываемой лексемы. Если за ним следует пробел или другое значение, то он не является частью текущей лексемы.
+
+Это представляет интересную проблему: как вернуть следующий символ обратно во входной поток, чтобы его можно было прочитать позже?
+
+Одно из возможных решений — сохранить его в символьной переменной, а затем установить флаг. Мы можем изменить `getchar`, чтобы он проверял флаг, и если он установлен, извлекал байт из этой переменной вместо буфера ввода, а затем сбрасывал флаг. Но, конечно, это замедляет работу.
+
+В языке C есть функция `ungetc()`, как раз для этой цели. Есть ли быстрый способ реализовать её в нашем коде? Я хочу, чтобы вы пролистали назад и взглянули на процедуру `getchar`, и попробовали найти красивое и быстрое решение, прежде чем читать следующий абзац. Затем вернитесь сюда и посмотрите моё собственное решение.
+
+Ключом к возвращению символа обратно в поток является то, как мы получаем символы изначально:
+
+Сначала проверяем, пуст ли буфер, проверяя значение `EBX`. Если оно равно нулю, вызываем процедуру `read`.
+
+Если у нас есть доступный символ, мы используем `lodsb`, затем уменьшаем значение `EBX`. Инструкция `lodsb` фактически идентична:
+
+[.programlisting]
+....
+mov al, [esi]
+ inc esi
+....
+
+Байт, который мы извлекли, остается в буфере до следующего вызова `read`. Мы не знаем, когда это произойдет, но знаем, что этого не случится до следующего вызова `getchar`. Следовательно, чтобы "вернуть" последний прочитанный байт обратно в поток, нам достаточно уменьшить значение `ESI` и увеличить значение `EBX`:
+
+[.programlisting]
+....
+ungetc:
+ dec esi
+ inc ebx
+ ret
+....
+
+Но будьте осторожны! Мы в полной безопасности, если заглядываем вперед только на один символ за раз. Если же мы проверяем несколько следующих символов и вызываем `ungetc` несколько раз подряд, это будет работать в большинстве случаев, но не всегда (и ошибки будет сложно отладить). Почему?
+
+Потому что пока `getchar` не вызывает `read`, все предварительно прочитанные байты остаются в буфере, и наш `ungetc` работает без сбоев. Но как только `getchar` вызывает `read`, содержимое буфера изменяется.
+
+Мы всегда можем рассчитывать на корректную работу `ungetc` с последним символом, прочитанным через `getchar`, но не с любым символом, прочитанным до этого.
+
+Если ваша программа читает более одного байта вперед, у вас есть как минимум два варианта:
+
+Если возможно, измените программу так, чтобы она читала только один байт вперед. Это самое простое решение.
+
+Если эта опция недоступна, сначала определите максимальное количество символов, которое вашей программе может потребоваться вернуть во входной поток за один раз. Увеличьте это число немного, чтобы быть уверенным, предпочтительно до кратного 16 — так оно будет лучше выровнено. Затем измените секцию `.bss` в вашем коде и создайте небольшой "запасной" буфер прямо перед вашим входным буфером, примерно так:
+
+[.programlisting]
+....
+section .bss
+ resb 16 ; or whatever the value you came up with
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+....
+
+Вам также необходимо изменить ваш `ungetc`, чтобы передать значение байта для возврата в `AL`:
+
+[.programlisting]
+....
+ungetc:
+ dec esi
+ inc ebx
+ mov [esi], al
+ ret
+....
+
+С этим изменением вы можете безопасно вызывать `ungetc` до 17 раз подряд (первый вызов всё ещё будет в пределах буфера, остальные 16 могут быть либо в пределах буфера, либо в пределах "запасного" пространства).
+
+[[x86-command-line]]
+== Аргументы командной строки
+
+Наша программа hex будет полезнее, если она сможет читать имена входного и выходного файлов из командной строки, т.е. если она сможет обрабатывать аргументы командной строки. Но... Где они?
+
+Прежде чем UNIX(R) система запустит программу, она делает ``push`` для некоторых данных, помещая их в стек, затем переходит к метке `_start` программы. Да, я сказал "переходит", а не "вызывает". Это означает, что данные можно прочитать с помощью `[esp+offset]` или просто сделать ``pop`` для них.
+
+Значение на вершине стека содержит количество аргументов командной строки. Оно традиционно называется `argc`, что означает "argument count".
+
+Далее следуют аргументы командной строки, все `argc` штук. Обычно их называют `argv`, что означает "значение(я) аргумента". То есть мы получаем `argv[0]`, `argv[1]`, `...`, `argv[argc-1]`. Это не сами аргументы, а указатели на аргументы, то есть адреса памяти, где находятся реальные аргументы. Сами аргументы представляют собой строки символов, завершающиеся нулевым символом ('\0').
+
+Список `argv` завершается указателем NULL, который представляет собой просто `0`. Есть и другие детали, но пока этого достаточно для наших целей.
+
+[NOTE]
+====
+Если вы перешли из среды программирования MS-DOS(R), основное различие заключается в том, что каждый аргумент находится в отдельной строке. Второе различие состоит в том, что нет практического ограничения на количество аргументов.
+====
+
+Вооружившись этими знаниями, мы почти готовы к следующей версии [.filename]#hex.asm#. Однако сначала нам нужно добавить несколько строк в [.filename]#system.inc#:
+
+Сначала нам нужно добавить две новые записи в наш список номеров системных вызовов:
+
+[.programlisting]
+....
+%define SYS_open 5
+%define SYS_close 6
+....
+
+Затем мы добавляем два новых макроса в конце файла:
+
+[.programlisting]
+....
+%macro sys.open 0
+ system SYS_open
+%endmacro
+
+%macro sys.close 0
+ system SYS_close
+%endmacro
+....
+
+Вот наш измененный исходный код:
+
+[.programlisting]
+....
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+fd.in dd stdin
+fd.out dd stdout
+hex db '0123456789ABCDEF'
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+
+section .text
+align 4
+err:
+ push dword 1 ; return failure
+ sys.exit
+
+align 4
+global _start
+_start:
+ add esp, byte 8 ; discard argc and argv[0]
+
+ pop ecx
+ jecxz .init ; no more arguments
+
+ ; ECX contains the path to input file
+ push dword 0 ; O_RDONLY
+ push ecx
+ sys.open
+ jc err ; open failed
+
+ add esp, byte 8
+ mov [fd.in], eax
+
+ pop ecx
+ jecxz .init ; no more arguments
+
+ ; ECX contains the path to output file
+ push dword 420 ; file mode (644 octal)
+ push dword 0200h | 0400h | 01h
+ ; O_CREAT | O_TRUNC | O_WRONLY
+ push ecx
+ sys.open
+ jc err
+
+ add esp, byte 12
+ mov [fd.out], eax
+
+.init:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ mov edi, obuffer
+
+.loop:
+ ; read a byte from input file or stdin
+ call getchar
+
+ ; convert it to hex
+ mov dl, al
+ shr al, 4
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, dl
+ and al, 0Fh
+ mov al, [hex+eax]
+ call putchar
+
+ mov al, ' '
+ cmp dl, 0Ah
+ jne .put
+ mov al, dl
+
+.put:
+ call putchar
+ cmp al, dl
+ jne .loop
+ call write
+ jmp short .loop
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ ret
+
+read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword [fd.in]
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .done
+ sub eax, eax
+ ret
+
+align 4
+.done:
+ call write ; flush output buffer
+
+ ; close files
+ push dword [fd.in]
+ sys.close
+
+ push dword [fd.out]
+ sys.close
+
+ ; return success
+ push dword 0
+ sys.exit
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword [fd.out]
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+ ret
+....
+
+В нашем разделе `.data` теперь есть две новые переменные, `fd.in` и `fd.out`. Здесь мы сохраняем дескрипторы файлов для ввода и вывода.
+
+В разделе `.text` мы заменили ссылки с `stdin` и `stdout` на `[fd.in]` и `[fd.out]`.
+
+Раздел `.text` теперь начинается с простого обработчика ошибок, который просто завершает программу с кодом возврата `1`. Обработчик ошибок расположен перед `_start`, чтобы находиться вблизи от места возникновения ошибок.
+
+Естественно, выполнение программы по-прежнему начинается с `_start`. Сначала мы удаляем `argc` и `argv[0]` из стека: они не представляют для нас интереса (по крайней мере, в этой программе).
+
+Мы помещаем `argv[1]` в `ECX`. Этот регистр особенно подходит для указателей, так как мы можем обрабатывать NULL-указатели с помощью `jecxz`. Если `argv[1]` не равен NULL, мы пытаемся открыть файл с именем, указанным в первом аргументе. В противном случае продолжаем программу как раньше: чтение из `stdin`, запись в `stdout`. Если нам не удаётся открыть входной файл (например, он не существует), мы переходим к обработчику ошибок и завершаем работу.
+
+Если всё прошло успешно, мы проверяем второй аргумент. Если он присутствует, мы открываем выходной файл. В противном случае, мы отправляем вывод в `stdout`. Если нам не удаётся открыть выходной файл (например, он существует и у нас нет прав на запись), мы снова переходим к обработчику ошибок.
+
+Остальная часть кода остается прежней, за исключением того, что мы закрываем входной и выходной файлы перед завершением, и, как упоминалось, используем `[fd.in]` и `[fd.out]`.
+
+Наш исполняемый файл теперь имеет внушительный размер в 768 байт.
+
+Можем ли мы улучшить его еще? Конечно! Каждую программу можно улучшить. Вот несколько идей, что мы могли бы сделать:
+
+* Сделать наш обработчик ошибок, выводящий сообщение в `stderr`.
+* Добавить обработчики ошибок в функции `read` и `write`.
+* Закрывать `stdin` при открытии входного файла, `stdout` при открытии выходного файла.
+* Добавить параметры командной строки, такие как `-i` и `-o`, чтобы можно было перечислять входные и выходные файлы в любом порядке или, возможно, читать из `stdin` и записывать в файл.
+* Выводить сообщение с подсказкой об использовании программы, если аргументы командной строки указаны неверно.
+
+Я оставлю эти улучшения в качестве упражнения для читателя: вы уже знаете всё необходимое для их реализации.
+
+[[x86-environment]]
+== Окружение UNIX(R)
+
+Важным концептом UNIX(R) является окружение, которое определяется _переменными окружения_. Некоторые из них устанавливаются системой, другие — пользователем, третьи — оболочкой или любой программой, которая загружает другую программу.
+
+[[x86-find-environment]]
+=== Как найти переменные окружения
+
+Я говорил ранее, что когда программа начинает выполняться, в стеке находятся `argc`, за которым следует массив `argv`, завершающийся NULL, а затем что-то ещё. Это "что-то ещё" — это _окружение_, или, если быть точнее, массив указателей на _переменные окружения_, завершающийся NULL. Это часто называют `env`.
+
+Структура `env` такая же, как у `argv` — список адресов памяти, заканчивающийся NULL (`0`). В данном случае нет `"envc"` — конец массива определяется поиском последнего NULL.
+
+Переменные обычно имеют формат `name=value`, но иногда часть `=value` может отсутствовать. Необходимо учитывать эту вероятность.
+
+[[x86-webvar]]
+=== webvars
+
+Я мог бы просто показать вам код, который выводит окружение так же, как команда UNIX(R) env. Но я подумал, что будет интереснее написать простую CGI-утилиту на ассемблере.
+
+[[x86-cgi]]
+==== CGI: краткий обзор
+
+У меня есть http://www.whizkidtech.redprince.net/cgi-bin/tutorial[подробное руководство по CGI] на моем веб-сайте, но вот очень краткий обзор CGI:
+
+* Веб-сервер взаимодействует с CGI-программой, устанавливая _переменные окружения_.
+* Программа CGI отправляет свой вывод в [.filename]#stdout#. Веб-сервер считывает его оттуда.
+* Он должен начинаться с HTTP-заголовка, за которым следуют две пустые строки.
+* Затем он выводит HTML-код или любые другие данные, которые он генерирует.
+
+[NOTE]
+====
+В то время как некоторые _переменные окружения_ используют стандартные имена, другие различаются в зависимости от веб-сервера. Это делает программу webvars весьма полезным инструментом для диагностики.
+====
+
+[[x86-webvars-the-code]]
+==== Код
+
+Наша программа webvars, таким образом, должна отправить HTTP-заголовок, за которым следует HTML-разметка. Затем она должна прочитать _переменные окружения_ одну за другой и отправить их как часть HTML-страницы.
+
+Код приведен ниже. Я разместил комментарии и пояснения прямо в коде:
+
+[.programlisting]
+....
+;;;;;;; webvars.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Copyright (c) 2000 G. Adam Stanislav
+; All rights reserved.
+;
+; Redistribution and use in source and binary forms, with or without
+; modification, are permitted provided that the following conditions
+; are met:
+; 1. Redistributions of source code must retain the above copyright
+; notice, this list of conditions and the following disclaimer.
+; 2. Redistributions in binary form must reproduce the above copyright
+; notice, this list of conditions and the following disclaimer in the
+; documentation and/or other materials provided with the distribution.
+;
+; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+; SUCH DAMAGE.
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Version 1.0
+;
+; Started: 8-Dec-2000
+; Updated: 8-Dec-2000
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+%include 'system.inc'
+
+section .data
+http db 'Content-type: text/html', 0Ah, 0Ah
+ db '<?xml version="1.0" encoding="utf-8"?>', 0Ah
+ db '<!DOCTYPE html PUBLIC "-//W3C/DTD XHTML Strict//EN" '
+ db '"DTD/xhtml1-strict.dtd">', 0Ah
+ db '<html xmlns="http://www.w3.org/1999/xhtml" '
+ db 'xml.lang="en" lang="en">', 0Ah
+ db '<head>', 0Ah
+ db '<title>Web Environment</title>', 0Ah
+ db '<meta name="author" content="G. Adam Stanislav" />', 0Ah
+ db '</head>', 0Ah, 0Ah
+ db '<body bgcolor="#ffffff" text="#000000" link="#0000ff" '
+ db 'vlink="#840084" alink="#0000ff">', 0Ah
+ db '<div class="webvars">', 0Ah
+ db '<h1>Web Environment</h1>', 0Ah
+ db '<p>The following <b>environment variables</b> are defined '
+ db 'on this web server:</p>', 0Ah, 0Ah
+ db '<table align="center" width="80" border="0" cellpadding="10" '
+ db 'cellspacing="0" class="webvars">', 0Ah
+httplen equ $-http
+left db '<tr>', 0Ah
+ db '<td class="name"><tt>'
+leftlen equ $-left
+middle db '</tt></td>', 0Ah
+ db '<td class="value"><tt><b>'
+midlen equ $-middle
+undef db '<i>(undefined)</i>'
+undeflen equ $-undef
+right db '</b></tt></td>', 0Ah
+ db '</tr>', 0Ah
+rightlen equ $-right
+wrap db '</table>', 0Ah
+ db '</div>', 0Ah
+ db '</body>', 0Ah
+ db '</html>', 0Ah, 0Ah
+wraplen equ $-wrap
+
+section .text
+global _start
+_start:
+ ; First, send out all the http and xhtml stuff that is
+ ; needed before we start showing the environment
+ push dword httplen
+ push dword http
+ push dword stdout
+ sys.write
+
+ ; Now find how far on the stack the environment pointers
+ ; are. We have 12 bytes we have pushed before "argc"
+ mov eax, [esp+12]
+
+ ; We need to remove the following from the stack:
+ ;
+ ; The 12 bytes we pushed for sys.write
+ ; The 4 bytes of argc
+ ; The EAX*4 bytes of argv
+ ; The 4 bytes of the NULL after argv
+ ;
+ ; Total:
+ ; 20 + eax * 4
+ ;
+ ; Because stack grows down, we need to ADD that many bytes
+ ; to ESP.
+ lea esp, [esp+20+eax*4]
+ cld ; This should already be the case, but let's be sure.
+
+ ; Loop through the environment, printing it out
+.loop:
+ pop edi
+ or edi, edi ; Done yet?
+ je near .wrap
+
+ ; Print the left part of HTML
+ push dword leftlen
+ push dword left
+ push dword stdout
+ sys.write
+
+ ; It may be tempting to search for the '=' in the env string next.
+ ; But it is possible there is no '=', so we search for the
+ ; terminating NUL first.
+ mov esi, edi ; Save start of string
+ sub ecx, ecx
+ not ecx ; ECX = FFFFFFFF
+ sub eax, eax
+repne scasb
+ not ecx ; ECX = string length + 1
+ mov ebx, ecx ; Save it in EBX
+
+ ; Now is the time to find '='
+ mov edi, esi ; Start of string
+ mov al, '='
+repne scasb
+ not ecx
+ add ecx, ebx ; Length of name
+
+ push ecx
+ push esi
+ push dword stdout
+ sys.write
+
+ ; Print the middle part of HTML table code
+ push dword midlen
+ push dword middle
+ push dword stdout
+ sys.write
+
+ ; Find the length of the value
+ not ecx
+ lea ebx, [ebx+ecx-1]
+
+ ; Print "undefined" if 0
+ or ebx, ebx
+ jne .value
+
+ mov ebx, undeflen
+ mov edi, undef
+
+.value:
+ push ebx
+ push edi
+ push dword stdout
+ sys.write
+
+ ; Print the right part of the table row
+ push dword rightlen
+ push dword right
+ push dword stdout
+ sys.write
+
+ ; Get rid of the 60 bytes we have pushed
+ add esp, byte 60
+
+ ; Get the next variable
+ jmp .loop
+
+.wrap:
+ ; Print the rest of HTML
+ push dword wraplen
+ push dword wrap
+ push dword stdout
+ sys.write
+
+ ; Return success
+ push dword 0
+ sys.exit
+....
+
+Этот код создает исполняемый файл размером 1 396 байт. Большая его часть — это данные, а именно HTML-разметка, которую нам нужно отправить.
+
+Запустите ассемблер и слинкуйте как обычно:
+
+[source, shell]
+....
+% nasm -f elf webvars.asm
+% ld -s -o webvars webvars.o
+....
+
+Для использования необходимо загрузить [.filename]#webvars# на ваш веб-сервер. В зависимости от настроек веб-сервера, возможно, потребуется разместить его в специальном каталоге [.filename]#cgi-bin# или переименовать с расширением [.filename]#.cgi#.
+
+Затем вам нужно использовать браузер для просмотра вывода. Чтобы увидеть вывод на моем веб-сервере, перейдите по ссылке http://www.int80h.org/webvars/[http://www.int80h.org/webvars/]. Если вам интересно узнать о дополнительных переменных окружения в защищенном паролем веб-каталоге, перейдите по адресу http://www.int80h.org/private/[http://www.int80h.org/private/], используя имя `asm` и пароль `programmer`.
+
+[[x86-files]]
+== Работа с файлами
+
+Мы уже выполнили некоторые базовые операции с файлами: мы знаем, как их открывать и закрывать, как читать и записывать их с использованием буферов. Однако UNIX(R) предлагает гораздо больше возможностей при работе с файлами. В этом разделе мы рассмотрим некоторые из них и в итоге создадим удобную утилиту для преобразования файлов.
+
+В самом деле, начнем с конца, то есть с утилиты преобразования файлов. Всегда легче программировать, когда с самого начала известно, каким должен быть конечный продукт.
+
+Одной из первых программ, которые я написал для UNIX(R), была link:ftp://ftp.int80h.org/unix/tuc/[tuc] — конвертер текста в файл UNIX(R). Она преобразует текстовый файл из других операционных систем в текстовый файл UNIX(R). Другими словами, она изменяет различные виды окончаний строк на стандартные для UNIX(R). Результат сохраняется в другом файле. По желанию, она может преобразовать текстовый файл UNIX(R) в текстовый файл DOS.
+
+Я широко использовал `tuc`, но всегда только для преобразования из какой-либо другой ОС в UNIX(R), никогда наоборот. Мне всегда хотелось, чтобы он просто перезаписывал файл, вместо того чтобы мне приходилось отправлять вывод в другой файл. В большинстве случаев я в итоге использую его так:
+
+[source, shell]
+....
+% tuc myfile tempfile
+% mv tempfile myfile
+....
+
+Было бы здорово иметь ftuc, т.е., _быстрый tuc_, и использовать его вот так:
+
+[source, shell]
+....
+% ftuc myfile
+....
+
+В этой главе мы напишем ftuc на языке ассемблера (оригинальный tuc написан на C) и в процессе изучим различные файловые сервисы ядра.
+
+На первый взгляд, такое преобразование файла кажется очень простым: нужно всего лишь удалить символы возврата каретки, верно?
+
+Если вы ответили «да», подумайте ещё раз: такой подход будет работать в большинстве случаев (по крайней мере, с текстовыми файлами MS DOS), но иногда он будет давать сбой.
+
+Проблема в том, что не все текстовые файлы, не относящиеся к UNIX(R), завершают строки последовательностью возврата каретки / перевода строки. Некоторые используют возврат каретки без перевода строки. Другие объединяют несколько пустых строк в один возврат каретки, за которым следует несколько переводов строки. И так далее.
+
+Конвертер текстовых файлов, следовательно, должен уметь обрабатывать любые возможные окончания строк:
+
+* возврат каретки (carriage return) / перевод строки (line feed)
+* возврат каретки
+* перевод строки / возврат каретки
+* перевод строки
+
+Это также должно обрабатывать файлы, использующие комбинации вышеуказанного (например, возврат каретки с последующими несколькими переводами строки).
+
+[[x86-finite-state-machine]]
+=== Конечный автомат
+
+Проблема легко решается с использованием техники, называемой _конечный автомат_, изначально разработанной создателями цифровых электронных схем. _Конечный автомат_ — это цифровая схема, выход которой зависит не только от входа, но и от предыдущего входа, то есть от её состояния. Микропроцессор является примером _конечного автомата_: наш код на языке ассемблера транслируется в машинный язык, где одни инструкции ассемблера превращаются в один байт машинного кода, а другие — в несколько байтов. Когда микропроцессор извлекает байты из памяти один за другим, некоторые из них просто изменяют его состояние, а не производят какой-либо выходной сигнал. После извлечения всех байтов кода операции микропроцессор выдает выходной сигнал, изменяет значение регистра и т. д.
+
+Из-за этого всё программное обеспечение по сути представляет собой последовательность инструкций состояния для микропроцессора. Тем не менее, концепция _конечного автомата_ также полезна при проектировании программного обеспечения.
+
+Наш конвертер текстовых файлов можно представить в виде _конечного автомата_ с тремя возможными состояниями. Мы могли бы назвать их состояниями 0-2, но будет проще, если дадим им символические имена:
+
+* ordinary
+* cr
+* lf
+
+Наша программа начнёт работу в обычном состоянии. В этом состоянии действие программы зависит от её входных данных следующим образом:
+
+* Если ввод представляет собой что-либо, кроме возврата каретки или перевода строки, ввод просто передаётся на вывод. Состояние остаётся неизменным.
+* Если входной символ — возврат каретки, состояние изменяется на cr. Затем входной символ отбрасывается, т.е. вывод не производится.
+* Если входной символ является переводом строки, состояние изменяется на lf. Затем входной символ отбрасывается.
+
+Всякий раз, когда мы находимся в состоянии `cr`, это означает, что последним вводом был символ возврата каретки, который не был обработан. Действия нашего программного обеспечения в этом состоянии снова зависят от текущего ввода:
+
+* Если ввод отличается от возврата каретки или перевода строки, вывести перевод строки, затем вывести ввод, а затем изменить состояние на обычное.
+* Если входной символ — возврат каретки, значит, мы получили два (или более) возврата каретки подряд. Мы отбрасываем ввод, выводим перевод строки и оставляем состояние неизменным.
+* Если входной символ — это перевод строки, мы выводим перевод строки и меняем состояние на обычное. Обратите внимание, что это не то же самое, что в первом случае выше — если бы мы попытались объединить их, мы бы выводили два перевода строки вместо одного.
+
+Наконец, мы находимся в состоянии `lf` после получения перевода строки, которому не предшествовал возврат каретки. Это произойдет, если наш файл уже в формате UNIX(R), или когда несколько строк подряд выражены одним возвратом каретки, за которым следуют несколько переводов строк, или когда строка заканчивается последовательностью перевода строки / возврата каретки. Вот как нам нужно обрабатывать ввод в этом состоянии:
+
+* Если ввод отличается от возврата каретки или перевода строки, мы выводим перевод строки, затем выводим ввод и изменяем состояние на обычное. Это действие полностью совпадает с действием в состоянии `cr` при получении аналогичного ввода.
+* Если ввод представляет собой символ возврата каретки, мы отбрасываем ввод, выводим символ перевода строки, затем изменяем состояние на обычное.
+* Если входной символ — перевод строки, мы выводим перевод строки и оставляем состояние неизменным.
+
+[[x86-final-state]]
+==== Конечное состояние
+
+Приведённый выше _конечный автомат_ работает для всего файла, но оставляет возможность, что последний конец строки будет проигнорирован. Это произойдёт, если файл заканчивается одиночным возвратом каретки или одиночным переводом строки. Я не подумал об этом, когда писал tuc, и лишь позже обнаружил, что иногда он удаляет последний конец строки.
+
+Эта проблема легко решается проверкой состояния после обработки всего файла. Если состояние не является обычным, нам просто нужно вывести последний перевод строки.
+
+[NOTE]
+====
+Теперь, когда мы выразили наш алгоритм в виде _конечного автомата_, мы могли бы легко разработать специализированную цифровую электронную схему («чип») для выполнения преобразования. Конечно, это было бы значительно дороже, чем написание программы на языке ассемблера.
+====
+
+[[x86-tuc-counter]]
+==== Счетчик вывода
+
+Поскольку наша программа преобразования файлов может объединять два символа в один, нам необходимо использовать счётчик вывода. Мы инициализируем его значением `0` и увеличиваем каждый раз, когда отправляем символ на выход. В конце программы счётчик укажет, какой размер необходимо установить для файла.
+
+[[x86-software-fsm]]
+=== Реализация конечного автомата в программном обеспечении
+
+Самая сложная часть работы с _конечным автоматом_ — это анализ задачи и её представление в виде _конечного автомата_. После этого программное обеспечение практически пишется само.
+
+На языке высокого уровня, таком как C, существует несколько основных подходов. Один из них — использование оператора `switch`, который выбирает, какую функцию следует выполнить. Например,
+
+[.programlisting]
+....
+switch (state) {
+ default:
+ case REGULAR:
+ regular(inputchar);
+ break;
+ case CR:
+ cr(inputchar);
+ break;
+ case LF:
+ lf(inputchar);
+ break;
+ }
+....
+
+Еще один подход заключается в использовании массива указателей на функции, например:
+
+[.programlisting]
+....
+(output[state])(inputchar);
+....
+
+Еще один вариант — сделать `state` указателем на функцию, установив его на соответствующую функцию:
+
+[.programlisting]
+....
+(*state)(inputchar);
+....
+
+Это подход, который мы будем использовать в нашей программе, потому что его очень легко реализовать на языке ассемблера, и он также очень быстрый. Мы просто будем хранить адрес нужной процедуры в `EBX`, а затем выполним:
+
+[.programlisting]
+....
+call ebx
+....
+
+Это возможно быстрее, чем жестко задавать адрес в коде, потому что микропроцессору не нужно извлекать адрес из памяти — он уже хранится в одном из его регистров. Я сказал _возможно_, потому что с учетом кэширования, которое выполняют современные микропроцессоры, оба варианта могут быть одинаково быстрыми.
+
+[[memory-mapped-files]]
+=== Отображенные в память файлы
+
+Поскольку наша программа работает с одним файлом, мы не можем использовать подход, который работал ранее, то есть чтение из входного файла и запись в выходной файл.
+
+UNIX(R) позволяет нам отображать файл или его часть в память. Для этого сначала необходимо открыть файл с соответствующими флагами чтения/записи. Затем мы используем системный вызов `mmap`, чтобы отобразить его в память. Одно из преимуществ `mmap` заключается в том, что он автоматически работает с виртуальной памятью: мы можем отобразить в память больше файла, чем имеется физической памяти, и при этом обращаться к нему с помощью обычных команд работы с памятью, таких как `mov`, `lods` и `stos`. Все изменения, внесённые в память, отображённую из файла, будут записаны в файл системой. Нам даже не нужно держать файл открытым: пока он остаётся отображённым, мы можем читать из него и записывать в него.
+
+32-разрядные микропроцессоры Intel могут адресовать до четырёх гигабайт памяти — физической или виртуальной. Система FreeBSD позволяет использовать до половины этого объёма для отображения файлов.
+
+Для упрощения в этом руководстве мы будем преобразовывать только файлы, которые могут быть полностью отображены в памяти. Вероятно, не так много текстовых файлов превышают размер в два гигабайта. Если наша программа встретит такой файл, она просто выведет сообщение с предложением использовать оригинальный tuc.
+
+Если вы изучите свою копию файла [.filename]#syscalls.master#, вы найдёте два отдельных системных вызова с именем `mmap`. Это связано с эволюцией UNIX(R): существовал традиционный BSD `mmap`, системный вызов 71. Он был заменён на POSIX(R) `mmap`, системный вызов 197. Система FreeBSD поддерживает оба, поскольку старые программы были написаны с использованием оригинальной BSD-версии. Но новое программное обеспечение использует версию POSIX(R), которую мы и будем применять.
+
+В [.filename]#syscalls.master# POSIX(R) версия указана следующим образом:
+
+[.programlisting]
+....
+197 STD BSD { caddr_t mmap(caddr_t addr, size_t len, int prot, \
+ int flags, int fd, long pad, off_t pos); }
+....
+
+Это немного отличается от того, что указано в man:mmap[2]. Это связано с тем, что man:mmap[2] описывает версию на языке C.
+
+Разница заключается в аргументе `long pad`, который отсутствует в версии на C. Однако системные вызовы FreeBSD добавляют 32-битный заполнитель после ``push`` 64-битного аргумента. В данном случае `off_t` является 64-битным значением.
+
+Когда мы завершаем работу с файлом, отображённым в память, мы освобождаем его с помощью системного вызова `munmap`:
+
+[TIP]
+====
+Для подробного изучения `mmap` см. http://www.int80h.org/cgi-bin/isbn?isbn=0130810819[Unix Network Programming, Volume 2, Chapter 12] У. Ричарда Стивенса.
+====
+
+[[x86-file-size]]
+=== Определение размера файла
+
+Поскольку нам нужно указать `mmap`, сколько байт файла отобразить в памяти, и поскольку мы хотим отобразить весь файл, нам необходимо определить его размер.
+
+Мы можем использовать системный вызов `fstat` для получения всей информации об открытом файле, которую система может нам предоставить. Это включает в себя размер файла.
+
+Вновь, в [.filename]#syscalls.master# указаны две версии `fstat`: традиционная (системный вызов 62) и POSIX(R) (системный вызов 189). Естественно, мы будем использовать версию POSIX(R):
+
+[.programlisting]
+....
+189 STD POSIX { int fstat(int fd, struct stat *sb); }
+....
+
+Это очень простой вызов: мы передаем ему адрес структуры `stat` и дескриптор открытого файла. Он заполнит содержимое структуры `stat`.
+
+Однако должен сказать, что я пытался объявить структуру `stat` в секции `.bss`, и `fstat` это не понравилось: был установлен флаг переноса, указывающий на ошибку. После того как я изменил код, чтобы разместить структуру в стеке, всё заработало как надо.
+
+[[x86-ftruncate]]
+=== Изменение размера файла
+
+Поскольку наша программа может объединять последовательности возврата каретки / перевода строки в простые переводы строк, наш вывод может быть меньше, чем ввод. Однако, так как мы помещаем вывод в тот же файл, из которого читаем ввод, нам может потребоваться изменить размер файла.
+
+Системный вызов `ftruncate` позволяет нам сделать именно это. Несмотря на название , несколько вводящее в звблуждение, системный вызов `ftruncate` может использоваться как для усечения файла (уменьшения его размера), так и для его увеличения.
+
+И да, мы найдем две версии `ftruncate` в [.filename]#syscalls.master#, старую (130) и новую (201). Мы будем использовать новую:
+
+[.programlisting]
+....
+201 STD BSD { int ftruncate(int fd, int pad, off_t length); }
+....
+
+Обратите внимание, что здесь снова присутствует `int pad`.
+
+[[x86-ftuc]]
+=== ftuc
+
+Теперь мы знаем всё, что нужно для написания ftuc. Начнём с добавления нескольких новых строк в [.filename]#system.inc#. Сначала определим некоторые константы и структуры, где-нибудь в начале или около начала файла:
+
+[.programlisting]
+....
+;;;;;;; open flags
+%define O_RDONLY 0
+%define O_WRONLY 1
+%define O_RDWR 2
+
+;;;;;;; mmap flags
+%define PROT_NONE 0
+%define PROT_READ 1
+%define PROT_WRITE 2
+%define PROT_EXEC 4
+;;
+%define MAP_SHARED 0001h
+%define MAP_PRIVATE 0002h
+
+;;;;;;; stat structure
+struc stat
+st_dev resd 1 ; = 0
+st_ino resd 1 ; = 4
+st_mode resw 1 ; = 8, size is 16 bits
+st_nlink resw 1 ; = 10, ditto
+st_uid resd 1 ; = 12
+st_gid resd 1 ; = 16
+st_rdev resd 1 ; = 20
+st_atime resd 1 ; = 24
+st_atimensec resd 1 ; = 28
+st_mtime resd 1 ; = 32
+st_mtimensec resd 1 ; = 36
+st_ctime resd 1 ; = 40
+st_ctimensec resd 1 ; = 44
+st_size resd 2 ; = 48, size is 64 bits
+st_blocks resd 2 ; = 56, ditto
+st_blksize resd 1 ; = 64
+st_flags resd 1 ; = 68
+st_gen resd 1 ; = 72
+st_lspare resd 1 ; = 76
+st_qspare resd 4 ; = 80
+endstruc
+....
+
+Мы определяем новые системные вызовы:
+
+[.programlisting]
+....
+%define SYS_mmap 197
+%define SYS_munmap 73
+%define SYS_fstat 189
+%define SYS_ftruncate 201
+....
+
+Добавляем макросы для их использования:
+
+[.programlisting]
+....
+%macro sys.mmap 0
+ system SYS_mmap
+%endmacro
+
+%macro sys.munmap 0
+ system SYS_munmap
+%endmacro
+
+%macro sys.ftruncate 0
+ system SYS_ftruncate
+%endmacro
+
+%macro sys.fstat 0
+ system SYS_fstat
+%endmacro
+....
+
+И вот наш код:
+
+[.programlisting]
+....
+;;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; Started: 21-Dec-2000
+;; Updated: 22-Dec-2000
+;;
+;; Copyright 2000 G. Adam Stanislav.
+;; All rights reserved.
+;;
+;;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+%include 'system.inc'
+
+section .data
+ db 'Copyright 2000 G. Adam Stanislav.', 0Ah
+ db 'All rights reserved.', 0Ah
+usg db 'Usage: ftuc filename', 0Ah
+usglen equ $-usg
+co db "ftuc: Can't open file.", 0Ah
+colen equ $-co
+fae db 'ftuc: File access error.', 0Ah
+faelen equ $-fae
+ftl db 'ftuc: File too long, use regular tuc instead.', 0Ah
+ftllen equ $-ftl
+mae db 'ftuc: Memory allocation error.', 0Ah
+maelen equ $-mae
+
+section .text
+
+align 4
+memerr:
+ push dword maelen
+ push dword mae
+ jmp short error
+
+align 4
+toolong:
+ push dword ftllen
+ push dword ftl
+ jmp short error
+
+align 4
+facerr:
+ push dword faelen
+ push dword fae
+ jmp short error
+
+align 4
+cantopen:
+ push dword colen
+ push dword co
+ jmp short error
+
+align 4
+usage:
+ push dword usglen
+ push dword usg
+
+error:
+ push dword stderr
+ sys.write
+
+ push dword 1
+ sys.exit
+
+align 4
+global _start
+_start:
+ pop eax ; argc
+ pop eax ; program name
+ pop ecx ; file to convert
+ jecxz usage
+
+ pop eax
+ or eax, eax ; Too many arguments?
+ jne usage
+
+ ; Open the file
+ push dword O_RDWR
+ push ecx
+ sys.open
+ jc cantopen
+
+ mov ebp, eax ; Save fd
+
+ sub esp, byte stat_size
+ mov ebx, esp
+
+ ; Find file size
+ push ebx
+ push ebp ; fd
+ sys.fstat
+ jc facerr
+
+ mov edx, [ebx + st_size + 4]
+
+ ; File is too long if EDX != 0 ...
+ or edx, edx
+ jne near toolong
+ mov ecx, [ebx + st_size]
+ ; ... or if it is above 2 GB
+ or ecx, ecx
+ js near toolong
+
+ ; Do nothing if the file is 0 bytes in size
+ jecxz .quit
+
+ ; Map the entire file in memory
+ push edx
+ push edx ; starting at offset 0
+ push edx ; pad
+ push ebp ; fd
+ push dword MAP_SHARED
+ push dword PROT_READ | PROT_WRITE
+ push ecx ; entire file size
+ push edx ; let system decide on the address
+ sys.mmap
+ jc near memerr
+
+ mov edi, eax
+ mov esi, eax
+ push ecx ; for SYS_munmap
+ push edi
+
+ ; Use EBX for state machine
+ mov ebx, ordinary
+ mov ah, 0Ah
+ cld
+
+.loop:
+ lodsb
+ call ebx
+ loop .loop
+
+ cmp ebx, ordinary
+ je .filesize
+
+ ; Output final lf
+ mov al, ah
+ stosb
+ inc edx
+
+.filesize:
+ ; truncate file to new size
+ push dword 0 ; high dword
+ push edx ; low dword
+ push eax ; pad
+ push ebp
+ sys.ftruncate
+
+ ; close it (ebp still pushed)
+ sys.close
+
+ add esp, byte 16
+ sys.munmap
+
+.quit:
+ push dword 0
+ sys.exit
+
+align 4
+ordinary:
+ cmp al, 0Dh
+ je .cr
+
+ cmp al, ah
+ je .lf
+
+ stosb
+ inc edx
+ ret
+
+align 4
+.cr:
+ mov ebx, cr
+ ret
+
+align 4
+.lf:
+ mov ebx, lf
+ ret
+
+align 4
+cr:
+ cmp al, 0Dh
+ je .cr
+
+ cmp al, ah
+ je .lf
+
+ xchg al, ah
+ stosb
+ inc edx
+
+ xchg al, ah
+ ; fall through
+
+.lf:
+ stosb
+ inc edx
+ mov ebx, ordinary
+ ret
+
+align 4
+.cr:
+ mov al, ah
+ stosb
+ inc edx
+ ret
+
+align 4
+lf:
+ cmp al, ah
+ je .lf
+
+ cmp al, 0Dh
+ je .cr
+
+ xchg al, ah
+ stosb
+ inc edx
+
+ xchg al, ah
+ stosb
+ inc edx
+ mov ebx, ordinary
+ ret
+
+align 4
+.cr:
+ mov ebx, ordinary
+ mov al, ah
+ ; fall through
+
+.lf:
+ stosb
+ inc edx
+ ret
+....
+
+[WARNING]
+====
+Не используйте эту программу для файлов, хранящихся на диске, отформатированном в MS-DOS(R) или Windows(R). В коде FreeBSD присутствует неочевидная ошибка при использовании `mmap` на таких дисках, смонтированных в FreeBSD: если размер файла превышает определённое значение, `mmap` заполнит память нулями, а затем запишет их в файл, перезаписав его содержимое.
+====
+
+[[x86-one-pointed-mind]]
+== Спокойствие ума
+
+Как ученик дзэн, мне нравится идея спокойствия ума (экаггата): делай одно дело за раз и делай его хорошо.
+
+Вот именно так, в большинстве случаев, работает и UNIX(R). В то время как типичное приложение Windows(R) пытается сделать всё, что только можно (и поэтому кишит ошибками), типичная программа UNIX(R) делает только одну вещь, но делает её хорошо.
+
+Типичный пользователь UNIX(R) по сути собирает свои собственные приложения, написав shell-скрипт, который объединяет различные существующие программы, передавая вывод одной программы на вход другой.
+
+При написании собственного программного обеспечения для UNIX(R) обычно рекомендуется определить, какие части решаемой задачи могут быть обработаны существующими программами, и создавать собственные программы только для той части задачи, для которой нет готового решения.
+
+[[x86-csv]]
+=== CSV
+
+Я проиллюстрирую этот принцип конкретным примером из реальной жизни, с которым недавно столкнулся:
+
+Мне нужно было извлечь 11-е поле каждой записи из базы данных, которую я загрузил с веб-сайта. База данных представляла собой CSV-файл, то есть список _значений, разделённых запятыми_. Это довольно стандартный формат для обмена данными между людьми, которые могут использовать разное программное обеспечение для работы с базами данных.
+
+Первая строка файла содержит список различных полей, разделенных запятыми. Остальная часть файла содержит данные, перечисленные построчно, со значениями, разделенными запятыми.
+
+Я попробовал awk, используя запятую в качестве разделителя. Но поскольку несколько строк содержали запятую в кавычках, awk извлекал неправильное поле из этих строк.
+
+Следовательно, мне нужно было написать собственное программное обеспечение для извлечения 11-го поля из CSV-файла. Однако, следуя духу UNIX(R), мне нужно было лишь создать простой фильтр, выполняющий следующие действия:
+
+* Удалить первую строку из файла;
+* Заменить все не заключённые в кавычки запятые на другой символ;
+* Удалить все кавычки.
+
+Строго говоря, я мог бы использовать sed для удаления первой строки из файла, но сделать это в моей собственной программе было очень просто, поэтому я решил так поступить и уменьшить размер конвейера.
+
+В любом случае, написание подобной программы заняло у меня около 20 минут. Написание программы, которая извлекает 11-е поле из CSV-файла, заняло бы гораздо больше времени, и я не смог бы повторно использовать её для извлечения другого поля из другой базы данных.
+
+На этот раз я решил позволить ей выполнить немного больше работы, чем обычная учебная программа:
+
+* Она анализирует свою командную строку на наличие опций;
+* Она отображает подсказку, если обнаруживает неверные аргументы;
+* Она выдает понятные сообщения об ошибках.
+
+Вот какое сообщение она выводит о том, как ее использовать:
+
+[source, shell]
+....
+Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]
+....
+
+Все параметры необязательны и могут располагаться в любом порядке.
+
+Параметр `-t` указывает, на что заменить запятые. По умолчанию используется `tab`. Например, `-t;` заменит все незакавыченные запятые на точку с запятой.
+
+Мне не понадобилась опция `-c`, но в будущем она может пригодиться. Она позволяет указать, что я хочу заменить символ, отличный от запятой, на что-то другое. Например, `-c@` заменит все знаки @ (полезно, если нужно разделить список email-адресов на имена пользователей и домены).
+
+Опция `-p` сохраняет первую строку, т.е. не удаляет её. По умолчанию мы удаляем первую строку, потому что в CSV-файле она содержит названия полей, а не данные.
+
+Опции `-i` и `-o` позволяют указать входной и выходной файлы. По умолчанию используются [.filename]#stdin# и [.filename]#stdout#, как обычно работает стандартный фильтр UNIX(R).
+
+Я убедился, что принимаются как `-i filename`, так и `-ifilename`. Также я убедился, что может быть указан только один входной и один выходной файл.
+
+Чтобы получить 11-е поле каждой записи, теперь я могу сделать:
+
+[source, shell]
+....
+% csv '-t;' data.csv | awk '-F;' '{print $11}'
+....
+
+Код сохраняет параметры (за исключением файловых дескрипторов) в `EDX`: запятая в `DH`, новый разделитель в `DL`, а флаг параметра `-p` в старшем бите `EDX`, поэтому проверка его знака даст нам быстрое решение о дальнейших действиях.
+
+Вот код:
+
+[.programlisting]
+....
+;;;;;;; csv.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Convert a comma-separated file to a something-else separated file.
+;
+; Started: 31-May-2001
+; Updated: 1-Jun-2001
+;
+; Copyright (c) 2001 G. Adam Stanislav
+; All rights reserved.
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+fd.in dd stdin
+fd.out dd stdout
+usg db 'Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]', 0Ah
+usglen equ $-usg
+iemsg db "csv: Can't open input file", 0Ah
+iemlen equ $-iemsg
+oemsg db "csv: Can't create output file", 0Ah
+oemlen equ $-oemsg
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+
+section .text
+align 4
+ierr:
+ push dword iemlen
+ push dword iemsg
+ push dword stderr
+ sys.write
+ push dword 1 ; return failure
+ sys.exit
+
+align 4
+oerr:
+ push dword oemlen
+ push dword oemsg
+ push dword stderr
+ sys.write
+ push dword 2
+ sys.exit
+
+align 4
+usage:
+ push dword usglen
+ push dword usg
+ push dword stderr
+ sys.write
+ push dword 3
+ sys.exit
+
+align 4
+global _start
+_start:
+ add esp, byte 8 ; discard argc and argv[0]
+ mov edx, (',' << 8) | 9
+
+.arg:
+ pop ecx
+ or ecx, ecx
+ je near .init ; no more arguments
+
+ ; ECX contains the pointer to an argument
+ cmp byte [ecx], '-'
+ jne usage
+
+ inc ecx
+ mov ax, [ecx]
+
+.o:
+ cmp al, 'o'
+ jne .i
+
+ ; Make sure we are not asked for the output file twice
+ cmp dword [fd.out], stdout
+ jne usage
+
+ ; Find the path to output file - it is either at [ECX+1],
+ ; i.e., -ofile --
+ ; or in the next argument,
+ ; i.e., -o file
+
+ inc ecx
+ or ah, ah
+ jne .openoutput
+ pop ecx
+ jecxz usage
+
+.openoutput:
+ push dword 420 ; file mode (644 octal)
+ push dword 0200h | 0400h | 01h
+ ; O_CREAT | O_TRUNC | O_WRONLY
+ push ecx
+ sys.open
+ jc near oerr
+
+ add esp, byte 12
+ mov [fd.out], eax
+ jmp short .arg
+
+.i:
+ cmp al, 'i'
+ jne .p
+
+ ; Make sure we are not asked twice
+ cmp dword [fd.in], stdin
+ jne near usage
+
+ ; Find the path to the input file
+ inc ecx
+ or ah, ah
+ jne .openinput
+ pop ecx
+ or ecx, ecx
+ je near usage
+
+.openinput:
+ push dword 0 ; O_RDONLY
+ push ecx
+ sys.open
+ jc near ierr ; open failed
+
+ add esp, byte 8
+ mov [fd.in], eax
+ jmp .arg
+
+.p:
+ cmp al, 'p'
+ jne .t
+ or ah, ah
+ jne near usage
+ or edx, 1 << 31
+ jmp .arg
+
+.t:
+ cmp al, 't' ; redefine output delimiter
+ jne .c
+ or ah, ah
+ je near usage
+ mov dl, ah
+ jmp .arg
+
+.c:
+ cmp al, 'c'
+ jne near usage
+ or ah, ah
+ je near usage
+ mov dh, ah
+ jmp .arg
+
+align 4
+.init:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ mov edi, obuffer
+
+ ; See if we are to preserve the first line
+ or edx, edx
+ js .loop
+
+.firstline:
+ ; get rid of the first line
+ call getchar
+ cmp al, 0Ah
+ jne .firstline
+
+.loop:
+ ; read a byte from stdin
+ call getchar
+
+ ; is it a comma (or whatever the user asked for)?
+ cmp al, dh
+ jne .quote
+
+ ; Replace the comma with a tab (or whatever the user wants)
+ mov al, dl
+
+.put:
+ call putchar
+ jmp short .loop
+
+.quote:
+ cmp al, '"'
+ jne .put
+
+ ; Print everything until you get another quote or EOL. If it
+ ; is a quote, skip it. If it is EOL, print it.
+.qloop:
+ call getchar
+ cmp al, '"'
+ je .loop
+
+ cmp al, 0Ah
+ je .put
+
+ call putchar
+ jmp short .qloop
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ ret
+
+read:
+ jecxz .read
+ call write
+
+.read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword [fd.in]
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .done
+ sub eax, eax
+ ret
+
+align 4
+.done:
+ call write ; flush output buffer
+
+ ; close files
+ push dword [fd.in]
+ sys.close
+
+ push dword [fd.out]
+ sys.close
+
+ ; return success
+ push dword 0
+ sys.exit
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ jecxz .ret ; nothing to write
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword [fd.out]
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+.ret:
+ ret
+....
+
+Большая часть взята из [.filename]#hex.asm# выше. Однако есть одно важное отличие: я больше не вызываю `write` каждый раз при выводе перевода строки. Тем не менее, код можно использовать интерактивно.
+
+Я нашел лучшее решение для интерактивной проблемы с тех пор, как начал писать эту главу. Я хотел убедиться, что каждая строка выводится отдельно только при необходимости. В конце концов, нет необходимости выводить каждую строку при неинтерактивном использовании.
+
+Новое решение, которое я использую сейчас, заключается в вызове `write` каждый раз, когда обнаруживаю, что входной буфер пуст. Таким образом, при работе в интерактивном режиме программа считывает одну строку с клавиатуры пользователя, обрабатывает её и видит, что входной буфер пуст. Она сбрасывает свой вывод и читает следующую строку.
+
+[[x86-buffered-dark-side]]
+==== Темная сторона буферизации
+
+Это изменение предотвращает загадочную блокировку в очень специфическом случае. Я называю это _тёмной стороной буферизации_, в основном потому, что это представляет опасность, которая не совсем очевидна.
+
+Маловероятно, что это произойдет с такой программой, как csv выше, поэтому рассмотрим еще один фильтр: в этом случае мы ожидаем, что наши входные данные будут представлять собой необработанные данные, описывающие значения цветов, такие как интенсивности _красного_, _зеленого_ и _синего_ для пикселя. На выходе мы получим негатив входных данных.
+
+Такой фильтр было бы очень просто написать. Большая его часть выглядела бы так же, как и все другие фильтры, которые мы уже писали, поэтому я покажу только его внутренний цикл:
+
+[.programlisting]
+....
+.loop:
+ call getchar
+ not al ; Create a negative
+ call putchar
+ jmp short .loop
+....
+
+Поскольку этот фильтр работает с необработанными данными, он вряд ли будет использоваться интерактивно.
+
+Но он может вызываться программным обеспечением для обработки изображений. И, если он не вызывает `write` перед каждым вызовом `read`, высока вероятность, что он зависнет.
+
+Вот что может произойти:
+
+[.procedure]
+. Редактор изображений загрузит наш фильтр, используя функцию `popen()` на языке C.
+. Он прочитает первый ряд пикселей из битовой карты или пиксельной карты.
+. Он запишет первую строку пикселей в _канал_, ведущий к `fd.in` нашего фильтра.
+. Наш фильтр будет читать каждый пиксель из входных данных, преобразовывать его в негатив и записывать в выходной буфер.
+. Наш фильтр будет вызывать `getchar` для получения следующего пикселя.
+. `getchar` обнаружит пустой входной буфер, поэтому вызовет `read`.
+. `read` вызовет системный вызов `SYS_read`.
+. _Ядро_ приостановит работу нашего фильтра до тех пор, пока редактор изображений не отправит больше данных в канал.
+. Редактор изображений будет читать из другого канала, подключенного к `fd.out` нашего фильтра, чтобы он мог установить первую строку выходного изображения _до_ того, как отправит нам вторую строку входного.
+. _Ядро_ приостанавливает работу графического редактора до тех пор, пока не получит какие-либо данные от нашего фильтра, чтобы передать их редактору.
+
+На этом этапе наш фильтр ожидает, что редактор изображений отправит ему больше данных для обработки, в то время как редактор изображений ожидает, что наш фильтр отправит ему результат обработки первой строки. Однако результат находится в нашем выходном буфере.
+
+Фильтр и редактор изображений будут продолжать ждать друг друга вечно (или, по крайней мере, пока их не завершат командой kill). Наше программное обеспечение только что вошло в crossref:secure[secure-race-conditions,состояние гонки].
+
+Эта проблема не возникает, если наш фильтр очищает свой выходной буфер _перед_ запросом к _ядру_ для получения дополнительных входных данных.
+
+[[x86-fpu]]
+== Использование FPU
+
+Как ни странно, большая часть литературы по ассемблеру даже не упоминает о существовании FPU, или _блока обработки чисел с плавающей запятой_, не говоря уже о программировании для него.
+
+Тем не менее, язык ассемблера проявляет себя наилучшим образом, когда мы создаем высокооптимизированный код для FPU, выполняя вещи, которые можно сделать _только_ на языке ассемблера.
+
+[[x86-fpu-organization]]
+=== Организация FPU
+
+FPU состоит из 8 80-битных регистров с плавающей запятой. Они организованы в виде стека — вы можете `push` (поместить) значение на TOS (_вершина стека_) и `pop` (извлечь) его.
+
+Как бы то ни было, мнемоники ассемблера — не `push` и `pop`, потому что они уже заняты.
+
+Вы можете `push` (положить) значение на вершину стека (TOS), используя `fld`, `fild` и `fbld`. Несколько других кодов операций позволяют вам `push` (положить) многие распространённые _константы_ — например, _pi_ — на вершину стека (TOS).
+
+Аналогично, вы можете `извлечь` значение с помощью `fst`, `fstp`, `fist`, `fistp` и `fbstp`. На самом деле только коды операций, оканчивающиеся на _p_, буквально `извлекают` значение, остальные же `сохраняют` его в другом месте, не удаляя с вершины стека (TOS).
+
+Мы можем передавать данные между TOS и памятью компьютера либо как 32-битное, 64-битное или 80-битное _вещественное_ число, 16-битное, 32-битное или 64-битное _целое_ число, либо как 80-битное _упакованное десятичное_ число.
+
+80-битный _упакованный десятичный_ формат является особым случаем _двоично-десятичного кодирования_, который очень удобен при преобразовании между ASCII-представлением данных и внутренними данными FPU. Он позволяет использовать до 18 значащих цифр.
+
+Независимо от того, как мы представляем данные в памяти, FPU всегда хранит их в 80-битном формате _real_ в своих регистрах.
+
+Его внутренняя точность составляет не менее 19 десятичных цифр, поэтому даже если мы решим отображать результаты в формате ASCII с полной 18-значной точностью, мы всё равно будем показывать корректные результаты.
+
+Мы можем выполнять математические операции над TOS: вычислять его _синус_, _масштабировать_ (то есть умножать или делить на степень двойки), вычислять его _логарифм_ по основанию 2 и многое другое.
+
+Мы также можем _умножить_ или _разделить_ его, _прибавить_ к нему или _вычесть_ его из любого из регистров FPU (включая его самого).
+
+Официальный код операции Intel для TOS — `st`, а для _регистров_ — `st(0)`-`st(7)`. Таким образом, `st` и `st(0)` ссылаются на один и тот же регистр.
+
+По каким-то причинам оригинальный автор nasm решил использовать другие коды операций, а именно `st0`-`st7`. Другими словами, скобки отсутствуют, а вершина стека всегда `st0`, но никогда просто `st`.
+
+[[x86-fpu-packed-decimal]]
+==== Формат упакованного десятичного числа
+
+Формат _упакованного десятичного числа_ использует 10 байт (80 бит) памяти для представления 18 цифр. Представленное число всегда является _целым_.
+
+[TIP]
+====
+Вы можете использовать это для получения десятичных знаков, предварительно умножив TOS на степень 10.
+====
+
+Старший бит старшего байта (байт 9) является _знаковым битом_: если он установлен, число _отрицательное_, в противном случае — _положительное_. Остальные биты этого байта не используются/игнорируются.
+
+Оставшиеся 9 байт хранят 18 цифр числа: 2 цифры на байт.
+
+_Старший разряд_ хранится в старшем _полубайте_ (4 бита), _младший разряд_ — в младшем _полубайте_.
+
+Как бы то ни было, вы можете подумать, что `-1234567` будет храниться в памяти следующим образом (в шестнадцатеричной записи):
+
+[.programlisting]
+....
+80 00 00 00 00 00 01 23 45 67
+....
+
+Увы, это не так! Как и все остальное, созданное Intel, даже _упакованное десятичное число_ имеет порядок _от младшего к старшему_.
+
+Это означает, что наш `-1234567` хранится следующим образом:
+
+[.programlisting]
+....
+67 45 23 01 00 00 00 00 00 80
+....
+
+Помните об этом, иначе вы будете рвать на себе волосы в отчаянии!
+
+[NOTE]
+====
+Книга, которую стоит прочитать — если сможете её найти — это книга Ричарда Старца http://www.amazon.com/exec/obidos/ASIN/013246604X/whizkidtechnomag[8087/80287/80387 для IBM PC и совместимых]. Хотя в ней, кажется, факт о little-endian хранении _упакованного десятичного числа_ принимается как данность. Я не шучу насчёт отчаяния, которое испытывал, пытаясь понять, что не так с фильтром, который я привожу ниже, _прежде_ чем мне пришло в голову попробовать little-endian порядок даже для этого типа данных.
+====
+
+[[x86-pinhole-photography]]
+=== Экскурсия в фотографию с помощью камеры-обскуры
+
+Чтобы создавать полезное программное обеспечение, мы должны понимать не только наши инструменты программирования, но и область, для которой разрабатываем ПО.
+
+Наш следующий фильтр поможет нам, когда мы захотим создать _камеру-обскуру_, поэтому нам понадобятся некоторые знания о _фотографии с помощью обскуры_, прежде чем мы сможем продолжить.
+
+[[x86-camera]]
+==== Камера
+
+Самый простой способ описать любую когда-либо созданную камеру — это некоторое пустое пространство, заключённое в светонепроницаемый материал, с небольшим отверстием в корпусе.
+
+Корпус обычно прочный (например, коробка), хотя иногда он гибкий (гофрированная часть). Внутри камеры довольно темно. Однако отверстие пропускает световые лучи через одну точку (хотя в некоторых случаях их может быть несколько). Эти световые лучи формируют изображение — представление того, что находится снаружи камеры, перед отверстием.
+
+Если внутрь камеры поместить светочувствительный материал (например, плёнку), он может зафиксировать изображение.
+
+Отверстие часто содержит _линзу_ или сборку линз, которую часто называют _объективом_.
+
+[[x86-the-pinhole]]
+==== Игольное ушко
+
+Но, строго говоря, линза не обязательна: первые камеры использовали не линзу, а _маленькое отверстие_ размером с игольное ушко. Даже сегодня _маленькие отверстия_ применяются как инструмент для изучения принципов работы камер и для создания особого вида изображений.
+
+Изображение, создаваемое _маленьким отверстием_, одинаково резкое. Или _размытое_. Существует идеальный размер для маленького отверстия: если оно больше или меньше, изображение теряет резкость.
+
+[[x86-focal-length]]
+==== Фокусное расстояние
+
+Идеальный диаметр отверстия является функцией квадратного корня из _фокусного расстояния_, которое представляет собой расстояние от отверстия до плёнки.
+
+[.programlisting]
+....
+D = PC * sqrt(FL)
+....
+
+Здесь `D` — идеальный диаметр отверстия, `FL` — фокусное расстояние, а `PC` — константа отверстия. По данным Джейя Бендера, её значение равно `0,04`, тогда как Кеннет Коннорс определил его как `0,037`. Другие исследователи предложили иные значения. Кроме того, это значение справедливо только для дневного света: другие типы освещения потребуют иной константы, значение которой можно определить только экспериментальным путём.
+
+[[x86-f-number]]
+==== Число f (диафрагменное число)
+
+Число f — это очень полезный показатель того, сколько света попадает на плёнку. Экспонометр может определить, что, например, для экспонирования плёнки определённой чувствительности при f5.6 может потребоваться выдержка 1/1000 сек.
+
+Не имеет значения, 35-мм это камера или камера 6x9 см и т.д. Достаточно знать диафрагменное число, чтобы определить правильную экспозицию.
+
+Число f легко вычислить:
+
+[.programlisting]
+....
+F = FL / D
+....
+
+Другими словами, число f равно фокусному расстоянию, деленному на диаметр отверстия. Это также означает, что большее f-число подразумевает либо меньшее отверстие, либо большее фокусное расстояние, либо и то, и другое. В свою очередь, это означает, что чем больше число f, тем дольше должна быть выдержка.
+
+Кроме того, хотя диаметр отверстия и фокусное расстояние являются одномерными величинами, и плёнка, и отверстие — двумерны. Это означает, что если вы измерили экспозицию при диафрагменном числе `A` как `t`, то экспозиция при диафрагменном числе `B` будет:
+
+[.programlisting]
+....
+t * (B / A)²
+....
+
+[[x86-normalized-f-number]]
+==== Нормализованное число f
+
+Хотя многие современные камеры могут изменять диаметр своего отверстия, а следовательно и свое число f, довольно плавно и постепенно, так было не всегда.
+
+Для обеспечения различных значений диафрагмы в камерах обычно использовалась металлическая пластина с несколькими отверстиями разного размера.
+
+Их размеры были выбраны в соответствии с приведённой выше формулой таким образом, чтобы результирующее f-число было одним из стандартных f-чисел, используемых на всех фотоаппаратах. Например, у моего очень старого фотоаппарата Kodak Duaflex IV есть три таких отверстия для чисел f — 8, 11 и 16.
+
+Более современные камеры могут предлагать значения диафрагменного числа 2.8, 4, 5.6, 8, 11, 16, 22 и 32 (а также другие). Эти числа выбраны не произвольно: все они являются степенями квадратного корня из 2, хотя могут быть немного округлены.
+
+[[x86-f-stop]]
+==== Ступени числа f
+
+Типичная камера устроена так, что установка любого из нормализованных чисел f изменяет ощущение от регулятора. Он естественным образом _останавливается_ в этом положении. Из-за этого такие положения регулятора называются f-ступенями.
+
+Поскольку значения диафрагмы на каждой ступени являются степенями квадратного корня из 2, поворот диска на 1 ступень удваивает количество света, необходимое для правильной экспозиции. Поворот на 2 ступени увеличивает требуемую экспозицию вчетверо. Поворот диска на 3 ступени требует увеличения экспозиции в 8 раз и так далее.
+
+[[x86-pinhole-software]]
+=== Проектирование программного обеспечения камеры-обскуры
+
+Мы готовы решить, что именно должно делать наше программное обеспечение для камер-обскур.
+
+[[xpinhole-processing-input]]
+==== Обработка ввода программы
+
+Поскольку основная цель — помочь нам разработать работающую камеру-обскуру, мы будем использовать _фокусное расстояние_ в качестве входных данных для программы. Это можно определить без программного обеспечения: правильное фокусное расстояние зависит от размера плёнки и необходимости съёмки «обычных» изображений, широкоугольных или телефото.
+
+Большинство написанных нами до сих пор программ работали с отдельными символами или байтами в качестве входных данных: программа hex преобразовывала отдельные байты в шестнадцатеричное число, программа csv либо пропускала символ, либо удаляла его, либо заменяла на другой символ и т.д.
+
+Одна программа, `ftuc`, использовала конечный автомат для обработки не более двух входных байтов за раз.
+
+Но наша программа для камеры-обскуры не может работать только с отдельными символами, ей приходится иметь дело с более крупными синтаксическими единицами.
+
+Например, если мы хотим, чтобы программа рассчитала диаметр отверстия (и другие значения, которые мы обсудим позже) для фокусных расстояний `100 мм`, `150 мм` и `210 мм`, мы можем ввести что-то вроде этого:
+
+[source, shell]
+....
+ 100, 150, 210
+....
+
+Наша программа должна учитывать более одного байта входных данных за раз. Когда она видит первую `1`, она должна понимать, что это первая цифра десятичного числа. Когда она видит `0` и другой `0`, она должна знать, что это следующие цифры того же числа.
+
+Когда он встречает первую запятую, он должен понять, что больше не получает цифры первого числа. Он должен уметь преобразовать цифры первого числа в значение `100`. И цифры второго числа в значение `150`. И, конечно же, цифры третьего числа в числовое значение `210`.
+
+Нам нужно определиться с допустимыми разделителями: должны ли входные числа разделяться запятой? Если да, то как обрабатывать два числа, разделённые чем-то другим?
+
+Лично я предпочитаю простоту. Либо что-то является числом — и тогда я его обрабатываю. Либо не является числом — и тогда я это отбрасываю. Мне не нравится, когда компьютер жалуется на лишний символ, если _очевидно_, что он лишний. Да ладно!
+
+Плюс, это позволяет мне разбавить монотонность вычислений и ввести запрос вместо просто числа:
+
+[source, shell]
+....
+What is the best pinhole diameter for the
+ focal length of 150?
+....
+
+Нет причины, чтобы компьютер выводил множество жалоб:
+
+[source, shell]
+....
+Syntax error: What
+Syntax error: is
+Syntax error: the
+Syntax error: best
+....
+
+И так далее, и так далее, и так далее.
+
+Во-вторых, мне нравится символ `+#+` для обозначения начала комментария, который продолжается до конца строки. Это не требует больших усилий для реализации и позволяет мне рассматривать входные файлы для моего программного обеспечения как исполняемые скрипты.
+
+В нашем случае также необходимо определиться с единицами измерения входных данных: мы выбираем _миллиметры_, так как большинство фотографов измеряют фокусное расстояние именно в них.
+
+Наконец, нам нужно решить, разрешать ли использование десятичной точки (в этом случае мы также должны учитывать тот факт, что во многих странах используется десятичная _запятая_).
+
+В нашем случае разрешение десятичной точки/запятой создало бы ложное ощущение точности: разница между фокусными расстояниями `50` и `51` практически незаметна, поэтому разрешать пользователю вводить что-то вроде `50.5` — не лучшая идея. Это моё мнение, конечно, но программу пишу я. В своей программе вы можете сделать другие выбор, разумеется.
+
+[[x86-pinhole-options]]
+==== Передача параметров программе
+
+Самое важное, что нам нужно знать при создании камеры-обскуры — это диаметр отверстия. Поскольку мы хотим получать чёткие изображения, мы будем использовать приведённую выше формулу для расчёта диаметра отверстия от фокусного расстояния. Поскольку эксперты предлагают несколько различных значений для константы `PC`, нам нужно будет иметь выбор.
+
+В традициях программирования в UNIX(R) предусмотрены два основных способа выбора параметров программы, а также значение по умолчанию на случай, если пользователь не сделает выбор.
+
+Почему есть два способа выбора?
+
+Один из способов — это позволить (относительно) _постоянный_ выбор, который применяется автоматически каждый раз при запуске программы, без необходимости каждый раз указывать, что мы хотим, чтобы она сделала.
+
+Постоянные настройки могут быть сохранены в конфигурационном файле, обычно расположенном в домашнем каталоге пользователя. Файл обычно имеет то же имя, что и приложение, но начинается с точки. Часто к имени файла добавляется _"rc"_. Таким образом, наш файл может называться [.filename]#~/.pinhole# или [.filename]#~/.pinholerc#. (Обозначение [.filename]#~/# означает домашний каталог текущего пользователя.)
+
+Файл конфигурации в основном используется программами, у которых много настраиваемых параметров. Те, у которых он один (или несколько), часто используют другой метод: они ожидают найти параметр в _переменной окружения_. В нашем случае, мы можем посмотреть на переменную окружения с именем `PINHOLE`.
+
+Обычно программа использует один из вышеуказанных методов. В противном случае, если в конфигурационном файле указано одно, а в переменной окружения — другое, программа может запутаться (или стать слишком сложной).
+
+Поскольку нам нужно выбрать только _один_ такой параметр, мы воспользуемся вторым методом и поищем в окружении переменную с именем `PINHOLE`.
+
+Другой способ позволяет нам принимать _ad hoc_ решения: _"Хотя обычно я хочу, чтобы ты использовал 0.039, на этот раз мне нужно 0.03872."_ Другими словами, он позволяет нам _переопределить_ постоянный выбор.
+
+Такой выбор обычно осуществляется с помощью параметров командной строки.
+
+Наконец, программе _всегда_ необходим _значение по умолчанию_. Пользователь может не делать никакого выбора. Возможно, он не знает, что выбрать. Возможно, он «просто просматривает». Предпочтительно, чтобы значением по умолчанию было то, что выбрало бы большинство пользователей. Таким образом, им не нужно выбирать. Или, точнее, они могут выбрать значение по умолчанию без дополнительных усилий.
+
+Учитывая эту систему, программа может обнаружить конфликтующие параметры и обработать их следующим образом:
+
+[.procedure]
+. Если она находит _специальный_ выбор (например, параметр командной строки), она должна принять этот выбор. Она должна игнорировать любой постоянный выбор и значения по умолчанию.
+. _В противном случае_, если будет найден постоянный параметр (например, переменная окружения), он должен быть принят, а значение по умолчанию — проигнорировано.
+. _В противном случае_, следует использовать значение по умолчанию.
+
+Нам также необходимо решить, в каком _формате_ должна быть наша опция `PC`.
+
+На первый взгляд кажется очевидным использовать формат `PINHOLE=0.04` для переменной окружения и `-p0.04` для командной строки.
+
+Разрешение этого на самом деле представляет угрозу безопасности. Константа `PC` — это очень маленькое число. Естественно, мы протестируем наше программное обеспечение, используя различные небольшие значения `PC`. Но что произойдёт, если кто-то запустит программу, выбрав огромное значение?
+
+Это может привести к сбою программы, так как мы не разрабатывали её для обработки огромных чисел.
+
+Или мы можем потратить больше времени на программу, чтобы она могла обрабатывать огромные числа. Мы могли бы сделать это, если бы писали коммерческое программное обеспечение для аудитории, не знакомой с компьютерами.
+
+Или можно сказать: _"Пусть терпит! Пользователь сам должен был разобраться."_
+
+Или мы можем просто сделать невозможным ввод пользователем слишком большого числа. Это подход, который мы выберем: мы будем использовать _подразумеваемый префикс 0._.
+
+Другими словами, если пользователь хочет `0.04`, мы ожидаем, что он введёт `-p04` или установит `PINHOLE=04` в своём окружении. Таким образом, если он укажет `-p9999999`, мы интерпретируем это как ``0.9999999`` — всё ещё нелепо, но по крайней мере безопаснее.
+
+Во-вторых, многие пользователи просто захотят использовать либо константу Бендера, либо константу Коннорса. Чтобы облегчить им задачу, мы будем интерпретировать `-b` как идентичное `-p04`, а `-c` как идентичное `-p037`.
+
+[[x86-pinhole-output]]
+==== Вывод результата
+
+Нам нужно решить, что наше программное обеспечение должно отправлять на вывод и в каком формате.
+
+Поскольку наши входные данные допускают неограниченное количество значений фокусного расстояния, имеет смысл использовать традиционный вывод в стиле базы данных, показывая результат вычислений для каждого фокусного расстояния на отдельной строке, разделяя все значения в строке символом табуляции.
+
+Опционально, мы также должны разрешить пользователю указать использование формата CSV, который мы изучили ранее. В этом случае мы выведем строку с разделёнными запятыми названиями, описывающими каждое поле каждой строки, а затем отобразим результаты как прежде, но заменив `табуляцию` на `запятую`.
+
+Нам нужна опция командной строки для формата CSV. Мы не можем использовать `-c`, потому что это уже означает _использовать константу Коннорса_. По какой-то странной причине многие веб-сайты называют CSV-файлы _"электронными таблицами Excel"_ (хотя формат CSV появился раньше Excel). Поэтому мы будем использовать переключатель `-e`, чтобы указать нашему программному обеспечению, что мы хотим получить вывод в формате CSV.
+
+Мы начнем каждую строку вывода с фокусного расстояния. Это может показаться избыточным сначала, особенно в интерактивном режиме: пользователь вводит фокусное расстояние, а мы его повторяем.
+
+Но пользователь может ввести несколько фокусных расстояний в одной строке. Ввод также может поступать из файла или вывода другой программы. В этом случае пользователь вообще не видит вводимые данные.
+
+Таким же образом, вывод может быть направлен в файл, который мы захотим изучить позже, или на принтер, или стать входными данными для другой программы.
+
+Итак, имеет полный смысл начинать каждую строку с фокусного расстояния, введённого пользователем.
+
+Нет, подождите! Не так, как ввел пользователь. Что, если пользователь введет что-то вроде этого:
+
+[source, shell]
+....
+ 00000000150
+....
+
+Очевидно, нам нужно удалить ведущие нули.
+
+Итак, можно рассмотреть вариант чтения пользовательского ввода как есть, преобразования его в бинарный вид внутри FPU и последующего вывода оттуда.
+
+Но...
+
+Что делать, если пользователь введёт что-то вроде этого:
+
+[source, shell]
+....
+ 17459765723452353453534535353530530534563507309676764423
+....
+
+Ха! Упакованный десятичный формат FPU позволяет нам вводить 18-значные числа. Но пользователь ввёл больше 18 цифр. Как нам обработать это?
+
+Хорошо, мы _могли бы_ изменить наш код, чтобы он читал первые 18 цифр, передавал их в FPU, затем читал ещё, умножал уже имеющееся на вершине стека (TOS) на 10 в степени количества дополнительных цифр, а затем выполнял `сложение` с этим значением.
+
+Да, мы могли бы так поступить. Но в _этой_ программе это было бы нелепо (в другой это могло бы быть как раз тем, что нужно): даже длина окружности Земли, выраженная в миллиметрах, занимает всего 11 цифр. Очевидно, мы не можем построить камеру такого размера (по крайней мере, пока).
+
+Итак, если пользователь вводит такое огромное число, он либо скучает, либо проверяет нас, либо пытается взломать систему, либо играет — делает что угодно, кроме проектирования камеры-обскуры.
+
+Что мы будем делать?
+
+Мы ударим его по лицу, образно говоря:
+
+[source, shell]
+....
+17459765723452353453534535353530530534563507309676764423 ??? ??? ??? ??? ???
+....
+
+Для этого мы просто проигнорируем все ведущие нули. Как только мы найдем ненулевую цифру, мы инициализируем счетчик значением `0` и начнем выполнять три шага:
+
+[.procedure]
+. Отправить цифру на выход.
+. Добавить цифру в буфер, который мы позже используем для создания упакованного десятичного числа, которое можно отправить в FPU.
+. Увеличить счетчик.
+
+Теперь, пока мы выполняем эти три шага, нам также необходимо следить за одним из двух условий:
+
+* Если счётчик превышает 18, мы прекращаем добавление в буфер. Мы продолжаем читать цифры и отправлять их на вывод.
+* Если, или скорее _когда_, следующий вводимый символ не является цифрой, мы завершаем ввод на данный момент.
++
+Между прочим, мы можем просто отбросить нецифровой символ, если это не `+#+`, который необходимо вернуть во входной поток. Он начинает комментарий, поэтому мы должны увидеть его после завершения вывода и начала поиска следующего ввода.
+
+Остается одна непокрытая возможность: если пользователь вводит только ноль (или несколько нулей), мы никогда не найдем ненулевое значение для отображения.
+
+Мы можем определить, что это произошло, когда наш счетчик остается на `0`. В этом случае нам нужно отправить `0` на выход и выполнить еще один "удар по лицу":
+
+[source, shell]
+....
+0 ??? ??? ??? ??? ???
+....
+
+Как только мы определили фокусное расстояние и убедились, что оно корректно (больше `0`, но не превышает 18 цифр), можно рассчитать диаметр отверстия.
+
+Не случайно слово _булавочное ушко_ содержит слово _булавка_. Действительно, многие малые отверстия буквально являются _дырками от булавки_ — отверстиями, аккуратно проделанными остриём булавки.
+
+Вот потому что типичное отверстие очень маленькое. Наша формула дает результат в миллиметрах. Мы умножим его на `1000`, чтобы вывести результат в _микронах_.
+
+На этом этапе нас ожидает ещё одна ловушка: _Излишняя точность._
+
+Да, FPU был разработан для вычислений с высокой точностью. Но мы имеем дело не с вычислениями высокой точности. Мы имеем дело с физикой (конкретно, с оптикой).
+
+Предположим, мы хотим превратить грузовик в камеру-обскуру (мы будем не первыми, кто это сделал!). Допустим, его кузов имеет длину `12` метров, значит, фокусное расстояние равно `12000`. Используя константу Бендера, получаем квадратный корень из `12000`, умноженный на `0.04`, что составляет `4.381780460` миллиметра или `4381.780460` микрона.
+
+Как ни посмотри, результат абсурдно точен. Наш грузовик не имеет _точно_ `12000` миллиметров в длину. Мы не измеряли его длину с такой точностью, поэтому утверждение, что нам нужна отверстие диаметром `4,381780460` миллиметра, мягко говоря, вводит в заблуждение. `4,4` миллиметра будет вполне достаточно.
+
+[NOTE]
+====
+Я "всего лишь" использовал десять цифр в приведенном выше примере. Представьте абсурдность попытки использовать все 18!
+====
+
+Нам нужно ограничить количество значащих цифр в нашем результате. Один из способов сделать это — использовать целое число, представляющее микроны. Таким образом, нашему грузовику потребуется отверстие диаметром `4382` микрона. Глядя на это число, мы всё же решаем, что `4400` микрон, или `4.4` миллиметра, достаточно близко.
+
+Кроме того, мы можем решить, что независимо от размера результата, мы хотим отображать только четыре значащих цифры (или любое другое их количество, конечно). Увы, FPU не поддерживает округление до определенного количества цифр (в конце концов, он воспринимает числа не как десятичные, а как двоичные).
+
+Следовательно, мы должны разработать алгоритм для уменьшения количества значащих цифр.
+
+Вот мой (я думаю, он неуклюжий — если у вас есть вариант лучше, _пожалуйста_, дайте мне знать):
+
+[.procedure]
+. Инициализировать счетчик значением `0`.
+. Пока число больше или равно `10000`, делим его на `10` и увеличиваем счётчик.
+. Вывести результат.
+. Пока счетчик больше `0`, выводить `0` и уменьшать счетчик.
+
+[NOTE]
+====
+`10000` подходит только если вам нужно _четыре_ значащих цифры. Для любого другого количества значащих цифр замените `10000` на `10` в степени, равной количеству значащих цифр.
+====
+
+Мы затем выведем диаметр отверстия в микронах, округлённый до четырёх значащих цифр.
+
+На этом этапе нам известны _фокусное расстояние_ и _диаметр отверстия_. Это означает, что у нас достаточно информации для расчёта _диафрагменного числа_.
+
+Мы отобразим число f, округлённое до четырёх значащих цифр. Скорее всего, само число f мало что нам скажет. Чтобы придать ему больше смысла, мы можем найти ближайшее _нормализованное число f_, то есть ближайшую степень квадратного корня из 2.
+
+Мы делаем это, умножая фактическое значение диафрагмы на само себя, что, конечно же, даст нам его `квадрат`. Затем мы вычислим его логарифм по основанию 2, что намного проще, чем вычисление логарифма по основанию квадратного корня из 2! Мы округлим результат до ближайшего целого числа. Далее мы возведём 2 в полученную степень. На самом деле, FPU предоставляет нам удобный способ сделать это: мы можем использовать код операции `fscale` для "масштабирования" 1, что аналогично ``сдвигу`` целого числа влево. Наконец, мы вычисляем квадратный корень из всего этого и получаем ближайшее нормализованное значение диафрагмы.
+
+Если всё это звучит ошеломляюще — или, возможно, слишком сложно — всё может стать гораздо понятнее, если увидеть код. Вместе это занимает всего 9 инструкций процессора:
+
+[.programlisting]
+....
+fmul st0, st0
+ fld1
+ fld st1
+ fyl2x
+ frndint
+ fld1
+ fscale
+ fsqrt
+ fstp st1
+....
+
+Первая строка, `fmul st0, st0`, возводит в квадрат содержимое TOS (вершина стека, то же что `st`, называется `st0` в nasm). Команда `fld1` помещает `1` на вершину стека.
+
+Следующая строка, `fld st1`, помещает квадрат обратно в TOS. На этом этапе квадрат находится и в `st`, и в `st(2)` (скоро станет ясно, зачем мы оставляем вторую копию в стеке). В `st(1)` содержится `1`.
+
+Далее, `fyl2x` вычисляет логарифм по основанию 2 от `st`, умноженный на `st(1)`. Именно поэтому мы ранее поместили `1` в `st(1)`.
+
+На этом этапе `st` содержит логарифм, который мы только что вычислили, а `st(1)` содержит квадрат фактического значения диафрагменного числа, который мы сохранили для последующего использования.
+
+`frndint` округляет TOS до ближайшего целого числа. `fld1` помещает `1` в стек. `fscale` сдвигает `1`, находящееся на TOS, на значение в `st(1)`, фактически возводя 2 в степень `st(1)`.
+
+Наконец, `fsqrt` вычисляет квадратный корень из результата, т.е. ближайшее нормализованное число f.
+
+У нас теперь есть ближайшее нормализованное число f на вершине стека (TOS), округлённый до ближайшего целого двоичный логарифм в `st(1)` и квадрат фактического число f в `st(2)`. Мы сохраняем значение в `st(2)` для последующего использования.
+
+Но нам больше не нужно содержимое `st(1)`. Последняя строка, `fstp st1`, помещает содержимое `st` в `st(1)` и выполняет извлечение. В результате, то, что было `st(1)`, теперь становится `st`, то, что было `st(2)`, теперь становится `st(1)`, и так далее. Новый `st` содержит нормализованное число f. Новый `st(1)` содержит квадрат фактического число f, который мы сохранили для потомков.
+
+На этом этапе мы готовы вывести нормализованное число f. Поскольку оно нормализовано, мы не будем округлять его до четырёх значащих цифр, а отправим его с полной точностью.
+
+Нормализованное диафрагменное число полезно, пока оно достаточно мало и может быть найдено на нашем экспонометре. В противном случае нам нужен другой метод определения правильной экспозиции.
+
+Ранее мы вывели формулу для расчёта правильной экспозиции при произвольной диафрагме на основе измерений, сделанных при другой диафрагме.
+
+Каждый экспонометр, который я когда-либо видел, может определить правильную экспозицию при f5.6. Поэтому мы рассчитаем _"множитель f5.6"_, то есть насколько нужно умножить экспозицию, измеренную при f5.6, чтобы определить правильную экспозицию для нашей камеры-обскуры.
+
+Из приведённой формулы мы знаем, что этот коэффициент можно вычислить, разделив наше число f (фактическое, а не нормализованное) на `5.6` и возведя результат в квадрат.
+
+Математически, деление квадрата нашего числа f на квадрат `5.6` даст нам тот же результат.
+
+С вычислительной точки зрения, нам не нужно возводить в квадрат два числа, когда можно возвести только одно. Таким образом, первое решение на первый взгляд кажется лучше.
+
+Но...
+
+`5.6` — это _константа_. Нам не нужно заставлять наш FPU тратить драгоценные циклы. Мы можем просто указать ему разделить квадрат f-числа на то, чему равно `5.6²`. Или мы можем разделить f-число на `5.6`, а затем возвести результат в квадрат. Теперь оба способа кажутся равнозначными.
+
+Но они не такие!
+
+Изучив принципы фотографии выше, мы помним, что `5.6` — это квадратный корень из 2, возведённый в пятую степень. Это _иррациональное_ число. Квадрат этого числа _ровно_ `32`.
+
+`32` — это не просто целое число, это степень двойки. Нам не нужно делить квадрат числа f на `32`. Достаточно использовать `fscale` для сдвига вправо на пять позиций. В терминологии FPU это означает, что мы применим `fscale` со значением `st(1)` равным `-5`. Это _гораздо быстрее_, чем деление.
+
+Итак, теперь стало ясно, зачем мы сохранили квадрат числа f на вершине стека FPU. Расчёт множителя для f5.6 — это самое простое вычисление во всей программе! Мы выведем его, округлив до четырёх значащих цифр.
+
+Есть ещё одно полезное число, которое мы можем вычислить: количество ступеней, на которые наше значение диафрагмы отличается от f5.6. Это может помочь, если наше значение диафрагмы находится чуть за пределами диапазона нашего экспонометра, но у нас есть затвор, который позволяет устанавливать различные выдержки, и этот затвор использует ступени.
+
+Предположим, наше число диафрагмы на 5 ступеней отличается от f5.6, а экспонометр показывает, что нужно использовать выдержку 1/1000 сек. Тогда мы можем сначала установить выдержку на 1/1000, а затем повернуть диск на 5 ступеней.
+
+Этот расчет также довольно прост. Все, что нам нужно сделать, это вычислить логарифм по основанию 2 от множителя f5.6, который мы только что рассчитали (хотя нам нужно его значение до округления). Затем мы выводим результат, округленный до ближайшего целого числа. Нам не нужно беспокоиться о наличии более четырех значащих цифр в этом случае: скорее всего, результат будет содержать только одну или две цифры.
+
+[[x86-fpu-optimizations]]
+=== Оптимизации FPU
+
+В ассемблерном коде мы можем оптимизировать инструкции FPU способами, невозможными в языках высокого уровня, включая C.
+
+Всякий раз, когда функции на языке C требуется вычислить значение с плавающей запятой, она загружает все необходимые переменные и константы в регистры FPU. Затем выполняются все необходимые вычисления для получения правильного результата. Хорошие компиляторы C могут очень эффективно оптимизировать эту часть кода.
+
+Он "возвращает" значение, оставляя результат на вершине стека (TOS). Однако перед возвратом он выполняет очистку. Все переменные и константы, использованные в вычислениях, теперь удалены из FPU.
+
+Он не может сделать то, что мы только что сделали выше: мы вычислили квадрат числа f и оставили его в стеке для последующего использования другой функцией.
+
+Мы _знали_, что это значение понадобится позже. Мы также знали, что у нас достаточно места в стеке (в котором помещается только 8 чисел), чтобы сохранить его там.
+
+Компилятор C не может знать, что значение, находящееся в стеке, потребуется снова в ближайшем будущем.
+
+Конечно, программист на C может это знать. Но единственное средство, которое у него есть, — это сохранить значение в переменной памяти.
+
+Это означает, что значение будет изменено с 80-битной точности, используемой внутри FPU, на тип _double_ (64 бита) или даже _single_ (32 бита) в C.
+
+Это также означает, что значение должно быть перемещено из TOS в память, а затем обратно. Увы, среди всех операций с FPU, доступ к памяти компьютера является самым медленным.
+
+Итак, при программировании FPU на языке ассемблера ищите способы хранения промежуточных результатов в стеке FPU.
+
+Мы можем развить эту идею еще дальше! В нашей программе мы используем _константу_ (ту, которую назвали `PC`).
+
+Не имеет значения, сколько диаметров отверстий мы рассчитываем: 1, 10, 20, 1000, мы всегда используем одну и ту же константу. Следовательно, мы можем оптимизировать нашу программу, сохраняя константу в стеке всё время.
+
+В начале нашей программы мы вычисляем значение указанной константы. Нам нужно разделить наш вход на `10` для каждой цифры в константе.
+
+Гораздо быстрее умножать, чем делить. Поэтому в начале нашей программы мы делим `1` на `10`, чтобы получить `0.1`, который затем сохраняем в стеке: вместо того чтобы делить ввод на `10` для каждой цифры, мы умножаем его на `0.1`.
+
+Кстати, мы не вводим `0.1` напрямую, хотя могли бы. У нас есть причина для этого: хотя `0.1` можно выразить всего одним десятичным знаком, мы не знаем, сколько _двоичных_ разрядов для этого потребуется. Поэтому мы позволяем FPU вычислить его двоичное значение с собственной высокой точностью.
+
+Мы используем другие константы: умножаем диаметр отверстия на `1000`, чтобы перевести его из миллиметров в микроны. Мы сравниваем числа с `10000`, когда округляем их до четырёх значащих цифр. Таким образом, мы оставляем и `1000`, и `10000` в стеке. И, конечно же, мы повторно используем `0.1` при округлении чисел до четырёх цифр.
+
+И последнее, но не менее важное: мы оставляем `-5` в стеке. Он нам нужен для масштабирования квадрата числа f вместо деления его на `32`. Не случайно мы загружаем эту константу последней. Это делает её вершиной стека, когда в нём находятся только константы. Таким образом, при масштабировании квадрата число f `-5` находится в `st(1)`, именно там, где `fscale` ожидает его увидеть.
+
+Это обычная ситуация, когда некоторые константы создаются с нуля, вместо загрузки их из памяти. Именно это мы делаем с `-5`:
+
+[.programlisting]
+....
+ fld1 ; TOS = 1
+ fadd st0, st0 ; TOS = 2
+ fadd st0, st0 ; TOS = 4
+ fld1 ; TOS = 1
+ faddp st1, st0 ; TOS = 5
+ fchs ; TOS = -5
+....
+
+Мы можем обобщить все эти оптимизации в одном правиле: _Держите повторяющиеся значения в стеке!_
+
+[TIP]
+====
+_PostScript(R)_ — это стековая язык программирования. Существует гораздо больше книг о PostScript(R), чем о языке ассемблера FPU: освоение PostScript(R) поможет вам овладеть FPU.
+====
+
+[[x86-pinhole-the-code]]
+=== Код pinhole
+
+[.programlisting]
+....
+;;;;;;; pinhole.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;
+; Find various parameters of a pinhole camera construction and use
+;
+; Started: 9-Jun-2001
+; Updated: 10-Jun-2001
+;
+; Copyright (c) 2001 G. Adam Stanislav
+; All rights reserved.
+;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+%include 'system.inc'
+
+%define BUFSIZE 2048
+
+section .data
+align 4
+ten dd 10
+thousand dd 1000
+tthou dd 10000
+fd.in dd stdin
+fd.out dd stdout
+envar db 'PINHOLE=' ; Exactly 8 bytes, or 2 dwords long
+pinhole db '04,', ; Bender's constant (0.04)
+connors db '037', 0Ah ; Connors' constant
+usg db 'Usage: pinhole [-b] [-c] [-e] [-p <value>] [-o <outfile>] [-i <infile>]', 0Ah
+usglen equ $-usg
+iemsg db "pinhole: Can't open input file", 0Ah
+iemlen equ $-iemsg
+oemsg db "pinhole: Can't create output file", 0Ah
+oemlen equ $-oemsg
+pinmsg db "pinhole: The PINHOLE constant must not be 0", 0Ah
+pinlen equ $-pinmsg
+toobig db "pinhole: The PINHOLE constant may not exceed 18 decimal places", 0Ah
+biglen equ $-toobig
+huhmsg db 9, '???'
+separ db 9, '???'
+sep2 db 9, '???'
+sep3 db 9, '???'
+sep4 db 9, '???', 0Ah
+huhlen equ $-huhmsg
+header db 'focal length in millimeters,pinhole diameter in microns,'
+ db 'F-number,normalized F-number,F-5.6 multiplier,stops '
+ db 'from F-5.6', 0Ah
+headlen equ $-header
+
+section .bss
+ibuffer resb BUFSIZE
+obuffer resb BUFSIZE
+dbuffer resb 20 ; decimal input buffer
+bbuffer resb 10 ; BCD buffer
+
+section .text
+align 4
+huh:
+ call write
+ push dword huhlen
+ push dword huhmsg
+ push dword [fd.out]
+ sys.write
+ add esp, byte 12
+ ret
+
+align 4
+perr:
+ push dword pinlen
+ push dword pinmsg
+ push dword stderr
+ sys.write
+ push dword 4 ; return failure
+ sys.exit
+
+align 4
+consttoobig:
+ push dword biglen
+ push dword toobig
+ push dword stderr
+ sys.write
+ push dword 5 ; return failure
+ sys.exit
+
+align 4
+ierr:
+ push dword iemlen
+ push dword iemsg
+ push dword stderr
+ sys.write
+ push dword 1 ; return failure
+ sys.exit
+
+align 4
+oerr:
+ push dword oemlen
+ push dword oemsg
+ push dword stderr
+ sys.write
+ push dword 2
+ sys.exit
+
+align 4
+usage:
+ push dword usglen
+ push dword usg
+ push dword stderr
+ sys.write
+ push dword 3
+ sys.exit
+
+align 4
+global _start
+_start:
+ add esp, byte 8 ; discard argc and argv[0]
+ sub esi, esi
+
+.arg:
+ pop ecx
+ or ecx, ecx
+ je near .getenv ; no more arguments
+
+ ; ECX contains the pointer to an argument
+ cmp byte [ecx], '-'
+ jne usage
+
+ inc ecx
+ mov ax, [ecx]
+ inc ecx
+
+.o:
+ cmp al, 'o'
+ jne .i
+
+ ; Make sure we are not asked for the output file twice
+ cmp dword [fd.out], stdout
+ jne usage
+
+ ; Find the path to output file - it is either at [ECX+1],
+ ; i.e., -ofile --
+ ; or in the next argument,
+ ; i.e., -o file
+
+ or ah, ah
+ jne .openoutput
+ pop ecx
+ jecxz usage
+
+.openoutput:
+ push dword 420 ; file mode (644 octal)
+ push dword 0200h | 0400h | 01h
+ ; O_CREAT | O_TRUNC | O_WRONLY
+ push ecx
+ sys.open
+ jc near oerr
+
+ add esp, byte 12
+ mov [fd.out], eax
+ jmp short .arg
+
+.i:
+ cmp al, 'i'
+ jne .p
+
+ ; Make sure we are not asked twice
+ cmp dword [fd.in], stdin
+ jne near usage
+
+ ; Find the path to the input file
+ or ah, ah
+ jne .openinput
+ pop ecx
+ or ecx, ecx
+ je near usage
+
+.openinput:
+ push dword 0 ; O_RDONLY
+ push ecx
+ sys.open
+ jc near ierr ; open failed
+
+ add esp, byte 8
+ mov [fd.in], eax
+ jmp .arg
+
+.p:
+ cmp al, 'p'
+ jne .c
+ or ah, ah
+ jne .pcheck
+
+ pop ecx
+ or ecx, ecx
+ je near usage
+
+ mov ah, [ecx]
+
+.pcheck:
+ cmp ah, '0'
+ jl near usage
+ cmp ah, '9'
+ ja near usage
+ mov esi, ecx
+ jmp .arg
+
+.c:
+ cmp al, 'c'
+ jne .b
+ or ah, ah
+ jne near usage
+ mov esi, connors
+ jmp .arg
+
+.b:
+ cmp al, 'b'
+ jne .e
+ or ah, ah
+ jne near usage
+ mov esi, pinhole
+ jmp .arg
+
+.e:
+ cmp al, 'e'
+ jne near usage
+ or ah, ah
+ jne near usage
+ mov al, ','
+ mov [huhmsg], al
+ mov [separ], al
+ mov [sep2], al
+ mov [sep3], al
+ mov [sep4], al
+ jmp .arg
+
+align 4
+.getenv:
+ ; If ESI = 0, we did not have a -p argument,
+ ; and need to check the environment for "PINHOLE="
+ or esi, esi
+ jne .init
+
+ sub ecx, ecx
+
+.nextenv:
+ pop esi
+ or esi, esi
+ je .default ; no PINHOLE envar found
+
+ ; check if this envar starts with 'PINHOLE='
+ mov edi, envar
+ mov cl, 2 ; 'PINHOLE=' is 2 dwords long
+rep cmpsd
+ jne .nextenv
+
+ ; Check if it is followed by a digit
+ mov al, [esi]
+ cmp al, '0'
+ jl .default
+ cmp al, '9'
+ jbe .init
+ ; fall through
+
+align 4
+.default:
+ ; We got here because we had no -p argument,
+ ; and did not find the PINHOLE envar.
+ mov esi, pinhole
+ ; fall through
+
+align 4
+.init:
+ sub eax, eax
+ sub ebx, ebx
+ sub ecx, ecx
+ sub edx, edx
+ mov edi, dbuffer+1
+ mov byte [dbuffer], '0'
+
+ ; Convert the pinhole constant to real
+.constloop:
+ lodsb
+ cmp al, '9'
+ ja .setconst
+ cmp al, '0'
+ je .processconst
+ jb .setconst
+
+ inc dl
+
+.processconst:
+ inc cl
+ cmp cl, 18
+ ja near consttoobig
+ stosb
+ jmp short .constloop
+
+align 4
+.setconst:
+ or dl, dl
+ je near perr
+
+ finit
+ fild dword [tthou]
+
+ fld1
+ fild dword [ten]
+ fdivp st1, st0
+
+ fild dword [thousand]
+ mov edi, obuffer
+
+ mov ebp, ecx
+ call bcdload
+
+.constdiv:
+ fmul st0, st2
+ loop .constdiv
+
+ fld1
+ fadd st0, st0
+ fadd st0, st0
+ fld1
+ faddp st1, st0
+ fchs
+
+ ; If we are creating a CSV file,
+ ; print header
+ cmp byte [separ], ','
+ jne .bigloop
+
+ push dword headlen
+ push dword header
+ push dword [fd.out]
+ sys.write
+
+.bigloop:
+ call getchar
+ jc near done
+
+ ; Skip to the end of the line if you got '#'
+ cmp al, '#'
+ jne .num
+ call skiptoeol
+ jmp short .bigloop
+
+.num:
+ ; See if you got a number
+ cmp al, '0'
+ jl .bigloop
+ cmp al, '9'
+ ja .bigloop
+
+ ; Yes, we have a number
+ sub ebp, ebp
+ sub edx, edx
+
+.number:
+ cmp al, '0'
+ je .number0
+ mov dl, 1
+
+.number0:
+ or dl, dl ; Skip leading 0's
+ je .nextnumber
+ push eax
+ call putchar
+ pop eax
+ inc ebp
+ cmp ebp, 19
+ jae .nextnumber
+ mov [dbuffer+ebp], al
+
+.nextnumber:
+ call getchar
+ jc .work
+ cmp al, '#'
+ je .ungetc
+ cmp al, '0'
+ jl .work
+ cmp al, '9'
+ ja .work
+ jmp short .number
+
+.ungetc:
+ dec esi
+ inc ebx
+
+.work:
+ ; Now, do all the work
+ or dl, dl
+ je near .work0
+
+ cmp ebp, 19
+ jae near .toobig
+
+ call bcdload
+
+ ; Calculate pinhole diameter
+
+ fld st0 ; save it
+ fsqrt
+ fmul st0, st3
+ fld st0
+ fmul st5
+ sub ebp, ebp
+
+ ; Round off to 4 significant digits
+.diameter:
+ fcom st0, st7
+ fstsw ax
+ sahf
+ jb .printdiameter
+ fmul st0, st6
+ inc ebp
+ jmp short .diameter
+
+.printdiameter:
+ call printnumber ; pinhole diameter
+
+ ; Calculate F-number
+
+ fdivp st1, st0
+ fld st0
+
+ sub ebp, ebp
+
+.fnumber:
+ fcom st0, st6
+ fstsw ax
+ sahf
+ jb .printfnumber
+ fmul st0, st5
+ inc ebp
+ jmp short .fnumber
+
+.printfnumber:
+ call printnumber ; F number
+
+ ; Calculate normalized F-number
+ fmul st0, st0
+ fld1
+ fld st1
+ fyl2x
+ frndint
+ fld1
+ fscale
+ fsqrt
+ fstp st1
+
+ sub ebp, ebp
+ call printnumber
+
+ ; Calculate time multiplier from F-5.6
+
+ fscale
+ fld st0
+
+ ; Round off to 4 significant digits
+.fmul:
+ fcom st0, st6
+ fstsw ax
+ sahf
+
+ jb .printfmul
+ inc ebp
+ fmul st0, st5
+ jmp short .fmul
+
+.printfmul:
+ call printnumber ; F multiplier
+
+ ; Calculate F-stops from 5.6
+
+ fld1
+ fxch st1
+ fyl2x
+
+ sub ebp, ebp
+ call printnumber
+
+ mov al, 0Ah
+ call putchar
+ jmp .bigloop
+
+.work0:
+ mov al, '0'
+ call putchar
+
+align 4
+.toobig:
+ call huh
+ jmp .bigloop
+
+align 4
+done:
+ call write ; flush output buffer
+
+ ; close files
+ push dword [fd.in]
+ sys.close
+
+ push dword [fd.out]
+ sys.close
+
+ finit
+
+ ; return success
+ push dword 0
+ sys.exit
+
+align 4
+skiptoeol:
+ ; Keep reading until you come to cr, lf, or eof
+ call getchar
+ jc done
+ cmp al, 0Ah
+ jne .cr
+ ret
+
+.cr:
+ cmp al, 0Dh
+ jne skiptoeol
+ ret
+
+align 4
+getchar:
+ or ebx, ebx
+ jne .fetch
+
+ call read
+
+.fetch:
+ lodsb
+ dec ebx
+ clc
+ ret
+
+read:
+ jecxz .read
+ call write
+
+.read:
+ push dword BUFSIZE
+ mov esi, ibuffer
+ push esi
+ push dword [fd.in]
+ sys.read
+ add esp, byte 12
+ mov ebx, eax
+ or eax, eax
+ je .empty
+ sub eax, eax
+ ret
+
+align 4
+.empty:
+ add esp, byte 4
+ stc
+ ret
+
+align 4
+putchar:
+ stosb
+ inc ecx
+ cmp ecx, BUFSIZE
+ je write
+ ret
+
+align 4
+write:
+ jecxz .ret ; nothing to write
+ sub edi, ecx ; start of buffer
+ push ecx
+ push edi
+ push dword [fd.out]
+ sys.write
+ add esp, byte 12
+ sub eax, eax
+ sub ecx, ecx ; buffer is empty now
+.ret:
+ ret
+
+align 4
+bcdload:
+ ; EBP contains the number of chars in dbuffer
+ push ecx
+ push esi
+ push edi
+
+ lea ecx, [ebp+1]
+ lea esi, [dbuffer+ebp-1]
+ shr ecx, 1
+
+ std
+
+ mov edi, bbuffer
+ sub eax, eax
+ mov [edi], eax
+ mov [edi+4], eax
+ mov [edi+2], ax
+
+.loop:
+ lodsw
+ sub ax, 3030h
+ shl al, 4
+ or al, ah
+ mov [edi], al
+ inc edi
+ loop .loop
+
+ fbld [bbuffer]
+
+ cld
+ pop edi
+ pop esi
+ pop ecx
+ sub eax, eax
+ ret
+
+align 4
+printnumber:
+ push ebp
+ mov al, [separ]
+ call putchar
+
+ ; Print the integer at the TOS
+ mov ebp, bbuffer+9
+ fbstp [bbuffer]
+
+ ; Check the sign
+ mov al, [ebp]
+ dec ebp
+ or al, al
+ jns .leading
+
+ ; We got a negative number (should never happen)
+ mov al, '-'
+ call putchar
+
+.leading:
+ ; Skip leading zeros
+ mov al, [ebp]
+ dec ebp
+ or al, al
+ jne .first
+ cmp ebp, bbuffer
+ jae .leading
+
+ ; We are here because the result was 0.
+ ; Print '0' and return
+ mov al, '0'
+ jmp putchar
+
+.first:
+ ; We have found the first non-zero.
+ ; But it is still packed
+ test al, 0F0h
+ jz .second
+ push eax
+ shr al, 4
+ add al, '0'
+ call putchar
+ pop eax
+ and al, 0Fh
+
+.second:
+ add al, '0'
+ call putchar
+
+.next:
+ cmp ebp, bbuffer
+ jb .done
+
+ mov al, [ebp]
+ push eax
+ shr al, 4
+ add al, '0'
+ call putchar
+ pop eax
+ and al, 0Fh
+ add al, '0'
+ call putchar
+
+ dec ebp
+ jmp short .next
+
+.done:
+ pop ebp
+ or ebp, ebp
+ je .ret
+
+.zeros:
+ mov al, '0'
+ call putchar
+ dec ebp
+ jne .zeros
+
+.ret:
+ ret
+....
+
+Код следует тому же формату, что и все остальные фильтры, которые мы видели ранее, с одним небольшим исключением:
+
+____
+Мы больше не предполагаем, что конец ввода означает конец задач, как мы привыкли в фильтрах, _ориентированных на символы_.
+
+Этот фильтр не обрабатывает символы. Он обрабатывает _язык_ (хотя и очень простой, состоящий только из чисел).
+
+Когда у нас больше нет входных данных, это может означать одно из двух:
+
+* Мы закончили и можем выйти. Это то же самое, что и раньше.
+* Последний прочитанный символ был цифрой. Мы сохранили его в конце буфера преобразования ASCII в число с плавающей точкой. Теперь нам нужно преобразовать содержимое этого буфера в число и записать последнюю строку нашего вывода.
+
+По этой причине мы изменили наши подпрограммы `getchar` и `read`, чтобы они возвращались с _сброшенным_ флагом `carry`, когда получают очередной символ из ввода, или с _установленным_ флагом `carry`, когда ввода больше нет.
+
+Конечно, мы по-прежнему используем магию ассемблера для этого! Внимательно посмотрите на `getchar`. Он _всегда_ возвращает _очищенный_ `флаг переноса`.
+
+Тем не менее, наш основной код использует `флаг переноса` для определения момента завершения — и это работает.
+
+Волшебство кроется в `read`. Каждый раз, когда он получает больше входных данных от системы, он просто возвращается к `getchar`, который извлекает символ из входного буфера, _сбрасывает_ флаг переноса (`carry flag`) и возвращает управление.
+
+Но когда `read` больше не получает входных данных от системы, он _не_ возвращается к `getchar` вообще. Вместо этого, инструкция `add esp, byte 4` добавляет `4` к `ESP`, _устанавливает_ флаг переноса (`carry flag`) и возвращает управление.
+
+Итак, куда же она возвращается? Каждый раз, когда программа использует операцию `call`, микропроцессор делает ``push`` для адрес возврата, то есть сохраняет его на вершине стека (не стека FPU, а системного стека, который находится в памяти). Когда программа использует операцию `ret`, микропроцессор делает ``pop`` для значения возврата из стека и переходит по адресу, который там был сохранён.
+
+Но поскольку мы добавили `4` к `ESP` (который является регистром указателя стека), мы фактически вызвали у микропроцессора лёгкий случай _амнезии_: он больше не помнит, что именно `getchar` ``вызвал`` `read`.
+
+И поскольку `getchar` не делал ``push`` ни для чего перед вызовом `read`, верхушка стека теперь содержит адрес возврата к тому, что или кто вызывал `getchar`. С точки зрения этого вызывающего, он вызывал `getchar`, который вызвал ``ret`` с установленным `флагом переноса`!
+____
+
+Помимо этого, процедура `bcdload` оказывается втянута в лилипутский конфликт между Биг-Эндианцами и Литл-Эндианцами.
+
+Он преобразует текстовое представление числа в само число: текст хранится в порядке big-endian, но _упакованный десятичный_ формат имеет порядок little-endian.
+
+Для разрешения конфликта мы используем инструкцию процессора `std` в самом начале. Позже мы отменяем его с помощью `cld`: очень важно не вызывать ничего, что может зависеть от стандартного значения _флага направления_, пока активен `std`.
+
+Всё остальное в этом коде должно быть достаточно понятным, при условии, что вы прочитали всю предшествующую главу.
+
+Это классический пример поговорки о том, что программирование требует много размышлений и лишь немного кодирования. Как только мы продумаем каждую мельчайшую деталь, код практически напишется сам.
+
+[[x86-pinhole-using]]
+=== Использование программы pinhole
+
+Поскольку мы решили сделать так, чтобы программа _игнорировала_ любой ввод, кроме чисел (и даже их внутри комментария), мы можем выполнять _текстовые запросы_. Мы не _обязаны_ этого делать, но _можем_.
+
+По моему скромному мнению, формирование текстового запроса вместо необходимости следовать очень строгому синтаксису делает программное обеспечение гораздо более дружелюбным к пользователю.
+
+Предположим, мы хотим построить камеру-обскуру для использования плёнки размером 4x5 дюймов. Стандартное фокусное расстояние для такой плёнки составляет около 150 мм. Мы хотим _точно настроить_ фокусное расстояние, чтобы диаметр отверстия был как можно более круглым числом. Допустим также, что мы хорошо разбираемся в фотоаппаратах, но немного боимся компьютеров. Вместо того чтобы просто вводить кучу цифр, мы хотим _задать_ пару вопросов.
+
+Наша сессия может выглядеть так:
+
+[source, shell]
+....
+% pinhole
+
+Computer,
+
+What size pinhole do I need for the focal length of 150?
+150 490 306 362 2930 12
+Hmmm... How about 160?
+160 506 316 362 3125 12
+Let's make it 155, please.
+155 498 311 362 3027 12
+Ah, let's try 157...
+157 501 313 362 3066 12
+156?
+156 500 312 362 3047 12
+That's it! Perfect! Thank you very much!
+^D
+....
+
+Мы выяснили, что при фокусном расстоянии 150 мм диаметр отверстия должен составлять 490 микрон, или 0,49 мм, но если взять почти идентичное фокусное расстояние 156 мм, можно использовать отверстие диаметром ровно половину миллиметра.
+
+[[x86-pinhole-scripting]]
+=== Скриптинг
+
+Поскольку мы выбрали символ `+#+` для обозначения начала комментария, мы можем рассматривать наше программное обеспечение pinhole как _скриптовый язык_.
+
+Вы, вероятно, видели _сценарии_ оболочки, которые начинаются с:
+
+[.programlisting]
+....
+#! /bin/sh
+....
+
+...или...
+
+[.programlisting]
+....
+#!/bin/sh
+....
+
+...потому что пробел после `#!` необязателен.
+
+Когда UNIX(R) получает запрос на выполнение исполняемого файла, который начинается с `#!`, он предполагает, что это скрипт. Он добавляет команду к остальной части первой строки скрипта и пытается выполнить её.
+
+Предположим, что мы установили pinhole в /usr/local/bin/, теперь мы можем написать скрипт для расчёта различных диаметров отверстий, подходящих для различных фокусных расстояний, обычно используемых с плёнкой 120.
+
+Скрипт может выглядеть примерно так:
+
+[.programlisting]
+....
+#! /usr/local/bin/pinhole -b -i
+# Find the best pinhole diameter
+# for the 120 film
+
+### Standard
+80
+
+### Wide angle
+30, 40, 50, 60, 70
+
+### Telephoto
+100, 120, 140
+....
+
+Поскольку 120 — это плёнка среднего размера, мы можем назвать этот файл `medium`.
+
+Мы можем установить права на выполнение и запустить его, как если бы это была программа:
+
+[source, shell]
+....
+% chmod 755 medium
+% ./medium
+....
+
+UNIX(R) интерпретирует последнюю команду следующим образом:
+
+[source, shell]
+....
+% /usr/local/bin/pinhole -b -i ./medium
+....
+
+Он выполнит эту команду и отобразит:
+
+[source, shell]
+....
+80 358 224 256 1562 11
+30 219 137 128 586 9
+40 253 158 181 781 10
+50 283 177 181 977 10
+60 310 194 181 1172 10
+70 335 209 181 1367 10
+100 400 250 256 1953 11
+120 438 274 256 2344 11
+140 473 296 256 2734 11
+....
+
+Теперь введем:
+
+[source, shell]
+....
+% ./medium -c
+....
+
+UNIX(R) интерпретирует это следующим образом:
+
+[source, shell]
+....
+% /usr/local/bin/pinhole -b -i ./medium -c
+....
+
+Это дает ему два конфликтующих параметра: `-b` и `-c` (Использовать константу Бендера и использовать константу Коннорса). Мы запрограммировали его так, что более поздние параметры переопределяют ранние — наша программа будет вычислять все, используя константу Коннорса:
+
+[source, shell]
+....
+80 331 242 256 1826 11
+30 203 148 128 685 9
+40 234 171 181 913 10
+50 262 191 181 1141 10
+60 287 209 181 1370 10
+70 310 226 256 1598 11
+100 370 270 256 2283 11
+120 405 296 256 2739 11
+140 438 320 362 3196 12
+....
+
+Мы решаем, что всё же выбираем константу Бендера. Мы хотим сохранить её значения в виде файла с разделителями-запятыми:
+
+[source, shell]
+....
+% ./medium -b -e > bender
+% cat bender
+focal length in millimeters,pinhole diameter in microns,F-number,normalized F-number,F-5.6 multiplier,stops from F-5.6
+80,358,224,256,1562,11
+30,219,137,128,586,9
+40,253,158,181,781,10
+50,283,177,181,977,10
+60,310,194,181,1172,10
+70,335,209,181,1367,10
+100,400,250,256,1953,11
+120,438,274,256,2344,11
+140,473,296,256,2734,11
+%
+....
+
+[[x86-caveats]]
+== Предостережения
+
+Программисты на ассемблере, которые "выросли" на MS-DOS(R) и Windows(R), часто склонны искать короткие пути. Чтение скан-кодов клавиатуры и запись напрямую в видеопамять — это два классических примера подходов, которые в MS-DOS(R) не только не порицаются, но и считаются правильными.
+
+Причина? И BIOS ПК, и MS-DOS(R) печально известны своей медленной работой при выполнении этих операций.
+
+Вас может возникнуть соблазн продолжить подобные практики в среде UNIX(R). Например, я видел веб-сайт, который объясняет, как получить доступ к скан-кодам клавиатуры на популярном клоне UNIX(R).
+
+Это, как правило, *очень плохая идея* в среде UNIX(R)! Позвольте объяснить почему.
+
+[[x86-protected]]
+=== UNIX(R) защищен
+
+Прежде всего, это может быть просто невозможно. UNIX(R) работает в защищённом режиме. Только ядро и драйверы устройств имеют прямой доступ к аппаратному обеспечению. Возможно, какой-то конкретный клон UNIX(R) позволит вам читать скан-коды клавиатуры, но скорее всего настоящая операционная система UNIX(R) этого не допустит. И даже если одна версия разрешает это, следующая может запретить, так что ваше тщательно разработанное программное обеспечение может в одночасье устареть.
+
+[[x86-abstraction]]
+=== UNIX(R) — это работа с абстракциями
+
+Но существует гораздо более важная причина не пытаться обращаться к оборудованию напрямую (если, конечно, вы не пишете драйвер устройства), даже в UNIX(R)-подобных системах, которые позволяют это делать:
+
+_UNIX(R) — это работа с абстракциями!_
+
+Существует фундаментальное различие в философии проектирования между MS-DOS(R) и UNIX(R). MS-DOS(R) разрабатывалась как однопользовательская система. Она работает на компьютере, к которому напрямую подключены клавиатура и монитор. Ввод пользователя практически гарантированно поступает с этой клавиатуры. Вывод вашей программы почти всегда отображается на этом экране.
+
+Это НИКОГДА не гарантируется в UNIX(R). Довольно часто пользователь UNIX(R) перенаправляет ввод и вывод программы с помощью конвейеров и перенаправлений:
+
+[source, shell]
+....
+% program1 | program2 | program3 > file1
+....
+
+Если вы написали program2, ваш ввод поступает не с клавиатуры, а из вывода program1. Аналогично, ваш вывод не выводится на экран, а становится вводом для program3, чей вывод, в свою очередь, отправляется в [.filename]#file1#.
+
+Но это еще не все! Даже если вы убедились, что ваш ввод поступает с терминала, а вывод отправляется на терминал, нет гарантии, что терминал является ПК: его видеопамять может находиться не там, где вы ожидаете, а клавиатура может генерировать не PC-совместимые скан-коды. Это может быть Macintosh(R) или любой другой компьютер.
+
+Вот вы, возможно, покачаете головой: мое программное обеспечение написано на языке ассемблера для ПК, как оно может работать на Macintosh(R)? Но я не говорил, что ваше программное обеспечение будет работать на Macintosh(R), а лишь что его терминалом может быть Macintosh(R).
+
+В UNIX(R) терминал не обязательно должен быть напрямую подключён к компьютеру, на котором работает ваше программное обеспечение — он может находиться даже на другом континенте или, например, на другой планете. Вполне возможно, что пользователь Macintosh(R) в Австралии подключается к системе UNIX(R) в Северной Америке (или где-либо ещё) через telnet. Программное обеспечение работает на одном компьютере, а терминал находится на другом: если попытаться считать скан-коды, будут получены неверные данные!
+
+То же самое относится и к любому другому оборудованию: файл, который вы читаете, может находиться на диске, к которому у вас нет прямого доступа. Камера, с которой вы считываете изображения, может находиться на космическом корабле, соединённом с вами через спутники.
+
+Вот почему в UNIX(R) никогда нельзя делать никаких предположений о том, откуда поступают ваши данные и куда они направляются. Всегда позволяйте системе управлять физическим доступом к оборудованию.
+
+[NOTE]
+====
+Это предостережения, а не абсолютные правила. Возможны исключения. Например, если текстовый редактор определил, что работает на локальной машине, он может захотеть читать скан-коды напрямую для улучшенного управления. Я упоминаю эти предостережения не для того, чтобы сказать вам, что делать или чего не делать, а просто чтобы вы осознавали определённые подводные камни, которые ждут вас, если вы только что перешли с MS-DOS(R) на UNIX(R). Конечно, творческие люди часто нарушают правила, и это нормально, пока они осознают, что нарушают их, и понимают почему.
+====
+
+[[x86-acknowledgements]]
+== Благодарности
+
+Это руководство никогда бы не было создано без помощи многих опытных программистов FreeBSD из {freebsd-hackers}, которые терпеливо отвечали на мои вопросы и направляли меня в моих попытках изучить внутренние механизмы программирования в системе UNIX(R) в целом и в FreeBSD в частности.
+
+Томас М. Соммерс открыл дверь для меня. Его https://web.archive.org/web/20090914064615/http://www.codebreakers-journal.com/content/view/262/27[Как написать "Hello, world" на ассемблере в FreeBSD?] веб-страница стала моей первой встречей с примером программирования на ассемблере под FreeBSD.
+
+Джейк Буркхолдер держал дверь открытой, охотно отвечая на все мои вопросы и предоставляя примеры исходного кода на языке ассемблера.
+
+Copyright (R) 2000-2001 G. Adam Stanislav. All rights reserved.
diff --git a/documentation/content/ru/books/developers-handbook/x86/_index.po b/documentation/content/ru/books/developers-handbook/x86/_index.po
new file mode 100644
index 0000000000..325770cdce
--- /dev/null
+++ b/documentation/content/ru/books/developers-handbook/x86/_index.po
@@ -0,0 +1,11160 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-10-12 22:16+0300\n"
+"PO-Revision-Date: 2025-09-26 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksdevelopers-handbookx86_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:15
+#, no-wrap
+msgid "x86 Assembly Language Programming"
+msgstr "Программирование на ассемблере x86"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1
+#, no-wrap
+msgid "Chapter 11. x86 Assembly Language Programming"
+msgstr "Глава 11. Программирование на языке ассемблера для x86"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:53
+msgid "_This chapter was written by {stanislav}._"
+msgstr "_Эта глава была написана {stanislav}._"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:55
+#, no-wrap
+msgid "Synopsis"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:59
+msgid ""
+"Assembly language programming under UNIX(R) is highly undocumented. It is "
+"generally assumed that no one would ever want to use it because various "
+"UNIX(R) systems run on different microprocessors, so everything should be "
+"written in C for portability."
+msgstr ""
+"Программирование на ассемблере в UNIX(R) крайне плохо документировано. "
+"Обычно предполагается, что никто не захочет его использовать, поскольку "
+"различные системы UNIX(R) работают на разных микропроцессорах, и поэтому всё "
+"должно быть написано на C для обеспечения переносимости."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:63
+msgid ""
+"In reality, C portability is quite a myth. Even C programs need to be "
+"modified when ported from one UNIX(R) to another, regardless of what "
+"processor each runs on. Typically, such a program is full of conditional "
+"statements depending on the system it is compiled for."
+msgstr ""
+"В действительности переносимость программ на C — это скорее миф. Даже "
+"программы на C требуют изменений при переносе с одной UNIX(R)-системы на "
+"другую, независимо от процессора, на котором они работают. Обычно такая "
+"программа содержит множество условных операторов, зависящих от системы, для "
+"которой она компилируется."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:65
+msgid ""
+"Even if we believe that all of UNIX(R) software should be written in C, or "
+"some other high-level language, we still need assembly language programmers: "
+"Who else would write the section of C library that accesses the kernel?"
+msgstr ""
+"Даже если мы считаем, что всё программное обеспечение UNIX(R) должно быть "
+"написано на C или другом языке высокого уровня, нам всё равно нужны "
+"программисты на ассемблере: кто же ещё напишет часть библиотеки C, которая "
+"обращается к ядру?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:67
+msgid ""
+"In this chapter I will attempt to show you how you can use assembly language "
+"writing UNIX(R) programs, specifically under FreeBSD."
+msgstr ""
+"В этой главе я попытаюсь показать вам, как можно использовать язык "
+"ассемблера для написания программ под UNIX(R), в частности под FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:72
+msgid ""
+"This chapter does not explain the basics of assembly language. There are "
+"enough resources about that (for a complete online course in assembly "
+"language, see Randall Hyde's http://webster.cs.ucr.edu/[Art of Assembly "
+"Language]; or if you prefer a printed book, take a look at Jeff Duntemann's "
+"Assembly Language Step-by-Step (ISBN: 0471375233). However, once the "
+"chapter is finished, any assembly language programmer will be able to write "
+"programs for FreeBSD quickly and efficiently."
+msgstr ""
+"В этой главе не объясняются основы языка ассемблера. Существует достаточно "
+"ресурсов на эту тему (например, полный онлайн-курс по языку ассемблера можно "
+"найти в http://webster.cs.ucr.edu/[Искусстве языка ассемблера] Рэндалла "
+"Хайда; если вы предпочитаете печатные книги, обратите внимание на «Язык "
+"ассемблера шаг за шагом» Джеффа Дантемана (ISBN: 0471375233)). Однако после "
+"прочтения этой главы любой программист на языке ассемблера сможет писать "
+"программы для FreeBSD быстро и эффективно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:74
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4311
+msgid "Copyright (R) 2000-2001 G. Adam Stanislav. All rights reserved."
+msgstr "Copyright (R) 2000-2001 G. Adam Stanislav. All rights reserved."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:76
+#, no-wrap
+msgid "The Tools"
+msgstr "Инструменты"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:79
+#, no-wrap
+msgid "The Assembler"
+msgstr "Ассемблер"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:82
+msgid ""
+"The most important tool for assembly language programming is the assembler, "
+"the software that converts assembly language code into machine language."
+msgstr ""
+"Важнейшим инструментом для программирования на языке ассемблера является "
+"ассемблер — программа, преобразующая код на языке ассемблера в машинный код."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:85
+msgid ""
+"Three very different assemblers are available for FreeBSD. Both man:llvm-"
+"as[1] (included in package:devel/llvm[]) and man:as[1] (included in "
+"package:devel/binutils[]) use the traditional UNIX(R) assembly language "
+"syntax."
+msgstr ""
+"Три очень разных ассемблера доступны для FreeBSD. И man:llvm-as[1] (включён "
+"в package:devel/llvm[]), и man:as[1] (включён в package:devel/binutils[]) "
+"используют традиционный синтаксис ассемблера UNIX(R)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:88
+msgid ""
+"On the other hand, man:nasm[1] (installed through package:devel/nasm[]) uses "
+"the Intel syntax. Its main advantage is that it can assemble code for many "
+"operating systems."
+msgstr ""
+"С другой стороны, man:nasm[1] (устанавливаемый через package:devel/nasm[]) "
+"использует синтаксис Intel. Его основное преимущество в том, что он может "
+"ассемблировать код для многих операционных систем."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:91
+msgid ""
+"This chapter uses nasm syntax because most assembly language programmers "
+"coming to FreeBSD from other operating systems will find it easier to "
+"understand. And, because, quite frankly, that is what I am used to."
+msgstr ""
+"В этой главе используется синтаксис nasm, потому что большинство "
+"программистов на ассемблере, приходящих в FreeBSD из других операционных "
+"систем, найдут его более понятным. Кроме того, если честно, это то, к чему я "
+"привык."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:93
+#, no-wrap
+msgid "The Linker"
+msgstr "Компоновщик"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:96
+msgid ""
+"The output of the assembler, like that of any compiler, needs to be linked "
+"to form an executable file."
+msgstr ""
+"Результат работы ассемблера, как и любого компилятора, необходимо связать, "
+"чтобы получить исполняемый файл."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:99
+msgid ""
+"The standard man:ld[1] linker comes with FreeBSD. It works with the code "
+"assembled with either assembler."
+msgstr ""
+"Стандартный компоновщик man:ld[1] поставляется с FreeBSD. Он работает с "
+"кодом, собранным любым из ассемблеров."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:101
+#, no-wrap
+msgid "System Calls"
+msgstr "Системные вызовы"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:104
+#, no-wrap
+msgid "Default Calling Convention"
+msgstr "Стандартное соглашение о вызовах"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:108
+msgid ""
+"By default, the FreeBSD kernel uses the C calling convention. Further, "
+"although the kernel is accessed using `int 80h`, it is assumed the program "
+"will call a function that issues `int 80h`, rather than issuing `int 80h` "
+"directly."
+msgstr ""
+"По умолчанию ядро FreeBSD использует соглашение о вызовах C. Кроме того, "
+"хотя доступ к ядру осуществляется с помощью `int 80h`, предполагается, что "
+"программа вызовет функцию, которая выполняет `int 80h`, а не будет выполнять "
+"`int 80h` напрямую."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:111
+msgid ""
+"This convention is very convenient, and quite superior to the Microsoft(R) "
+"convention used by MS-DOS(R). Why? Because the UNIX(R) convention allows "
+"any program written in any language to access the kernel."
+msgstr ""
+"Эта традиция очень удобна и значительно превосходит соглашение Microsoft(R), "
+"используемое в MS-DOS(R). Почему? Потому что соглашение UNIX(R) позволяет "
+"любой программе, написанной на любом языке, обращаться к ядру."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:114
+msgid ""
+"An assembly language program can do that as well. For example, we could "
+"open a file:"
+msgstr ""
+"Программа на ассемблере также может это сделать. Например, мы могли бы "
+"открыть файл:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:120
+#, no-wrap
+msgid ""
+"kernel:\n"
+"\tint\t80h\t; Call kernel\n"
+"\tret\n"
+msgstr ""
+"kernel:\n"
+"\tint\t80h\t; Call kernel\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:129
+#, no-wrap
+msgid ""
+"open:\n"
+"\tpush\tdword mode\n"
+"\tpush\tdword flags\n"
+"\tpush\tdword path\n"
+"\tmov\teax, 5\n"
+"\tcall\tkernel\n"
+"\tadd\tesp, byte 12\n"
+"\tret\n"
+msgstr ""
+"open:\n"
+"\tpush\tdword mode\n"
+"\tpush\tdword flags\n"
+"\tpush\tdword path\n"
+"\tmov\teax, 5\n"
+"\tcall\tkernel\n"
+"\tadd\tesp, byte 12\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:133
+msgid ""
+"This is a very clean and portable way of coding. If you need to port the "
+"code to a UNIX(R) system which uses a different interrupt, or a different "
+"way of passing parameters, all you need to change is the kernel procedure."
+msgstr ""
+"Это очень понятный и переносимый способ написания кода. Если вам нужно "
+"перенести код на UNIX(R)-систему, которая использует другое прерывание или "
+"другой способ передачи параметров, все, что вам нужно изменить, это "
+"процедуру kernel."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:137
+msgid ""
+"But assembly language programmers like to shave off cycles. The above "
+"example requires a `call/ret` combination. We can eliminate it by "
+"``push``ing an extra dword:"
+msgstr ""
+"Но программисты на ассемблере любят экономить такты. Приведённый выше пример "
+"требует комбинации `call/ret`. Мы можем исключить её, сделав ``push`` "
+"дополнительного двойного слова:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:148
+#, no-wrap
+msgid ""
+"open:\n"
+"\tpush\tdword mode\n"
+"\tpush\tdword flags\n"
+"\tpush\tdword path\n"
+"\tmov\teax, 5\n"
+"\tpush\teax\t\t; Or any other dword\n"
+"\tint\t80h\n"
+"\tadd\tesp, byte 16\n"
+msgstr ""
+"open:\n"
+"\tpush\tdword mode\n"
+"\tpush\tdword flags\n"
+"\tpush\tdword path\n"
+"\tmov\teax, 5\n"
+"\tpush\teax\t\t; Or any other dword\n"
+"\tint\t80h\n"
+"\tadd\tesp, byte 16\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:151
+msgid ""
+"The `5` that we have placed in `EAX` identifies the kernel function, in this "
+"case `open`."
+msgstr ""
+"Помещённое в `EAX` значение `5` идентифицирует функцию ядра, в данном случае "
+"`open`."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:153
+#, no-wrap
+msgid "Alternate Calling Convention"
+msgstr "Альтернативное соглашение о вызовах"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:158
+msgid ""
+"FreeBSD is an extremely flexible system. It offers other ways of calling "
+"the kernel. For it to work, however, the system must have Linux emulation "
+"installed."
+msgstr ""
+"FreeBSD — это чрезвычайно гибкая система. Она предлагает другие способы "
+"вызова ядра. Однако для работы необходимо, чтобы в системе была установлена "
+"эмуляция Linux."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:163
+msgid ""
+"Linux is a UNIX(R) like system. However, its kernel uses the same system-"
+"call convention of passing parameters in registers MS-DOS(R) does. As with "
+"the UNIX(R) convention, the function number is placed in `EAX`. The "
+"parameters, however, are not passed on the stack but in `EBX, ECX, EDX, ESI, "
+"EDI, EBP`:"
+msgstr ""
+"Linux — это система, подобная UNIX(R). Однако ее ядро использует то же "
+"соглашение о системных вызовов для передачи параметров в регистрах, что и MS-"
+"DOS(R). Как и в соглашении UNIX(R), номер функции помещается в `EAX`. Однако "
+"параметры передаются не в стеке, а в регистрах `EBX, ECX, EDX, ESI, EDI, "
+"EBP`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:172
+#, no-wrap
+msgid ""
+"open:\n"
+"\tmov\teax, 5\n"
+"\tmov\tebx, path\n"
+"\tmov\tecx, flags\n"
+"\tmov\tedx, mode\n"
+"\tint\t80h\n"
+msgstr ""
+"open:\n"
+"\tmov\teax, 5\n"
+"\tmov\tebx, path\n"
+"\tmov\tecx, flags\n"
+"\tmov\tedx, mode\n"
+"\tint\t80h\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:178
+msgid ""
+"This convention has a great disadvantage over the UNIX(R) way, at least as "
+"far as assembly language programming is concerned: Every time you make a "
+"kernel call you must `push` the registers, then `pop` them later. This "
+"makes your code bulkier and slower. Nevertheless, FreeBSD gives you a "
+"choice."
+msgstr ""
+"Этот подход имеет значительный недостаток по сравнению с UNIX(R), по крайней "
+"мере, в контексте программирования на ассемблере: каждый раз при вызове ядра "
+"необходимо сохранять регистры с помощью `push`, а затем восстанавливать их с "
+"помощью `pop`. Это делает ваш код более громоздким и медленным. Тем не "
+"менее, FreeBSD предоставляет вам выбор."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:181
+msgid ""
+"If you do choose the Linux convention, you must let the system know about "
+"it. After your program is assembled and linked, you need to brand the "
+"executable:"
+msgstr ""
+"Если вы решите использовать соглашение Linux, вы должны сообщить об этом "
+"системе. После того как ваша программа будет ассемблирована и слинкована, "
+"вам нужно пометить исполняемый файл:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:185
+#, no-wrap
+msgid "% brandelf -t Linux filename\n"
+msgstr "% brandelf -t Linux filename\n"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:188
+#, no-wrap
+msgid "Which Convention Should You Use?"
+msgstr "Какое соглашение следует использовать?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:193
+msgid ""
+"If you are coding specifically for FreeBSD, you should always use the "
+"UNIX(R) convention: It is faster, you can store global variables in "
+"registers, you do not have to brand the executable, and you do not impose "
+"the installation of the Linux emulation package on the target system."
+msgstr ""
+"Если вы разрабатываете код специально для FreeBSD, всегда следует "
+"использовать соглашение UNIX(R): это быстрее, вы можете хранить глобальные "
+"переменные в регистрах, вам не нужно маркировать исполняемый файл, и вы не "
+"требуете установки пакета эмуляции Linux на целевой системе."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:196
+msgid ""
+"If you want to create portable code that can also run on Linux, you will "
+"probably still want to give the FreeBSD users as efficient a code as "
+"possible. I will show you how you can accomplish that after I have "
+"explained the basics."
+msgstr ""
+"Хотя вы можете хотеть создать переносимый код, который также работает на "
+"Linux, вам, вероятно, по-прежнему будет нужен максимально эффективный код "
+"для пользователей FreeBSD. Я покажу вам, как этого добиться, после того как "
+"объясню основы."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:198
+#, no-wrap
+msgid "Call Numbers"
+msgstr "Номера вызовов"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:202
+msgid ""
+"To tell the kernel which system service you are calling, place its number in "
+"`EAX`. Of course, you need to know what the number is."
+msgstr ""
+"Чтобы сообщить ядру, какую системную службу вы вызываете, поместите её номер "
+"в `EAX`. Разумеется, вам необходимо знать, что это за номер."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:204
+#, no-wrap
+msgid "The [.filename]#syscalls# File"
+msgstr "Файл [.filename]#syscalls#"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:208
+msgid ""
+"The numbers are listed in [.filename]#syscalls#. `locate syscalls` finds "
+"this file in several different formats, all produced automatically from "
+"[.filename]#syscalls.master#."
+msgstr ""
+"Номера перечислены в [.filename]#syscalls#. Команда `locate syscalls` "
+"находит этот файл в нескольких различных форматах, все они создаются "
+"автоматически из [.filename]#syscalls.master#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:211
+msgid ""
+"You can find the master file for the default UNIX(R) calling convention in "
+"[.filename]#/usr/src/sys/kern/syscalls.master#. If you need to use the "
+"other convention implemented in the Linux emulation mode, read [.filename]#/"
+"usr/src/sys/i386/linux/syscalls.master#."
+msgstr ""
+"Основной файл для стандартного соглашения о вызовах UNIX(R) можно найти в "
+"[.filename]#/usr/src/sys/kern/syscalls.master#. Если вам необходимо "
+"использовать другое соглашение, реализованное в режиме эмуляции Linux, "
+"обратитесь к [.filename]#/usr/src/sys/i386/linux/syscalls.master#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:215
+msgid ""
+"Not only do FreeBSD and Linux use different calling conventions, they "
+"sometimes use different numbers for the same functions."
+msgstr ""
+"Не только FreeBSD и Linux используют разные соглашения о вызовах, но иногда "
+"они используют разные номера для одних и тех же функций."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:218
+msgid "[.filename]#syscalls.master# describes how the call is to be made:"
+msgstr ""
+"[.filename]#syscalls.master# описывает, как должен быть выполнен вызов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:229
+#, no-wrap
+msgid ""
+"0\tSTD\tNOHIDE\t{ int nosys(void); } syscall nosys_args int\n"
+"1\tSTD\tNOHIDE\t{ void exit(int rval); } exit rexit_args void\n"
+"2\tSTD\tPOSIX\t{ int fork(void); }\n"
+"3\tSTD\tPOSIX\t{ ssize_t read(int fd, void *buf, size_t nbyte); }\n"
+"4\tSTD\tPOSIX\t{ ssize_t write(int fd, const void *buf, size_t nbyte); }\n"
+"5\tSTD\tPOSIX\t{ int open(char *path, int flags, int mode); }\n"
+"6\tSTD\tPOSIX\t{ int close(int fd); }\n"
+"etc...\n"
+msgstr ""
+"0\tSTD\tNOHIDE\t{ int nosys(void); } syscall nosys_args int\n"
+"1\tSTD\tNOHIDE\t{ void exit(int rval); } exit rexit_args void\n"
+"2\tSTD\tPOSIX\t{ int fork(void); }\n"
+"3\tSTD\tPOSIX\t{ ssize_t read(int fd, void *buf, size_t nbyte); }\n"
+"4\tSTD\tPOSIX\t{ ssize_t write(int fd, const void *buf, size_t nbyte); }\n"
+"5\tSTD\tPOSIX\t{ int open(char *path, int flags, int mode); }\n"
+"6\tSTD\tPOSIX\t{ int close(int fd); }\n"
+"etc...\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:232
+msgid "It is the leftmost column that tells us the number to place in `EAX`."
+msgstr ""
+"Это крайний левый столбец, который указывает число, которое нужно поместить "
+"в `EAX`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:235
+msgid ""
+"The rightmost column tells us what parameters to `push`. They are "
+"``push``ed _from right to left_."
+msgstr ""
+"Самый правый столбец указывает, какие параметры нужно `втолкнуть` в стек "
+"командой push. Они `вталкиваются` _справа налево_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:237
+msgid ""
+"For example, to `open` a file, we need to `push` the `mode` first, then "
+"`flags`, then the address at which the `path` is stored."
+msgstr ""
+"Например, чтобы `открыть` файл, нам сначала нужно сделать `push` для `mode`, "
+"затем `flags`, а затем адрес, по которому хранится `path`."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:239
+#, no-wrap
+msgid "Return Values"
+msgstr "Возвращаемые значения"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:243
+msgid ""
+"A system call would not be useful most of the time if it did not return some "
+"kind of a value: The file descriptor of an open file, the number of bytes "
+"read to a buffer, the system time, etc."
+msgstr ""
+"От системных вызовов не было бы никакой пользы, если бы они не возвращали "
+"какое-либо значение: дескриптор открытого файла, количество байтов, "
+"прочитанных в буфер, системное время и т.д."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:246
+msgid ""
+"Additionally, the system needs to inform us if an error occurs: A file does "
+"not exist, system resources are exhausted, we passed an invalid parameter, "
+"etc."
+msgstr ""
+"Кроме того, система должна уведомлять нас, если возникает ошибка: файл не "
+"существует, системные ресурсы исчерпаны, передан недопустимый параметр и т. "
+"д."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:248
+#, no-wrap
+msgid "Man Pages"
+msgstr "Страницы справочника"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:252
+msgid ""
+"The traditional place to look for information about various system calls "
+"under UNIX(R) systems are the manual pages. FreeBSD describes its system "
+"calls in section 2, sometimes in section 3."
+msgstr ""
+"Традиционным источником информации о различных системных вызовах в UNIX(R)-"
+"системах являются страницы Справочника. В FreeBSD системные вызовы описаны в "
+"разделе 2, иногда в разделе 3."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:254
+msgid "For example, man:open[2] says:"
+msgstr "Например, man:open[2] говорит:"
+
+#. type: .blockquote
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:258
+msgid ""
+"If successful, `open()` returns a non-negative integer, termed a file "
+"descriptor. It returns `-1` on failure, and sets `errno` to indicate the "
+"error."
+msgstr ""
+"В случае успеха `open()` возвращает неотрицательное целое число, называемое "
+"файловым дескриптором. В случае ошибки возвращается `-1`, а переменной "
+"`errno` присваивается код ошибки."
+
+#. type: .blockquote
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:260
+msgid ""
+"The assembly language programmer new to UNIX(R) and FreeBSD will immediately "
+"ask the puzzling question: Where is `errno` and how do I get to it?"
+msgstr ""
+"Программист на ассемблере, впервые столкнувшийся с UNIX(R) и FreeBSD, сразу "
+"же задастся вопросом: где находится `errno` и как к ней обратиться?"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:265
+msgid ""
+"The information presented in the manual pages applies to C programs. The "
+"assembly language programmer needs additional information."
+msgstr ""
+"Информация, представленная в руководствах, применима к программам на языке "
+"C. Программистам на языке ассемблера требуется дополнительная информация."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:268
+#, no-wrap
+msgid "Where Are the Return Values?"
+msgstr "Где возвращаемые значения?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:273
+msgid ""
+"Unfortunately, it depends... For most system calls it is in `EAX`, but not "
+"for all. A good rule of thumb, when working with a system call for the "
+"first time, is to look for the return value in `EAX`. If it is not there, "
+"you need further research."
+msgstr ""
+"К сожалению, это зависит от ситуации... Для большинства системных вызовов "
+"возвращаемое значение находится в `EAX`, но не для всех. Хорошее правило при "
+"первой работе с системным вызовом — искать возвращаемое значение в `EAX`. "
+"Если его там нет, потребуется дополнительное исследование."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:279
+msgid ""
+"I am aware of one system call that returns the value in `EDX`: `SYS_fork`. "
+"All others I have worked with use `EAX`. But I have not worked with them "
+"all yet."
+msgstr ""
+"Я знаю о одном системном вызове, который возвращает значение в `EDX`: "
+"`SYS_fork`. Все остальные, с которыми я работал, используют `EAX`. Но я еще "
+"не работал со всеми из них."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:284
+msgid ""
+"If you cannot find the answer here or anywhere else, study libc source code "
+"and see how it interfaces with the kernel."
+msgstr ""
+"Если вы не можете найти ответ здесь или где-либо ещё, изучите исходный код "
+"libc и посмотрите, как он взаимодействует с ядром."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:287
+#, no-wrap
+msgid "Where Is `errno`?"
+msgstr "Где находится `errno`?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:290
+msgid "Actually, nowhere..."
+msgstr "Фактически, нигде..."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:293
+msgid ""
+"`errno` is part of the C language, not the UNIX(R) kernel. When accessing "
+"kernel services directly, the error code is returned in `EAX`, the same "
+"register the proper return value generally ends up in."
+msgstr ""
+"`errno` является частью языка C, а не ядра UNIX(R). При прямом доступе к "
+"сервисам ядра код ошибки возвращается в регистре `EAX` — том же регистре, в "
+"котором обычно оказывается корректное возвращаемое значение."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:297
+msgid ""
+"This makes perfect sense. If there is no error, there is no error code. If "
+"there is an error, there is no return value. One register can contain "
+"either."
+msgstr ""
+"Это совершенно логично. Если нет ошибки, то нет и кода ошибки. Если есть "
+"ошибка, то нет возвращаемого значения. Один регистр может содержать либо то, "
+"либо другое."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:299
+#, no-wrap
+msgid "Determining an Error Occurred"
+msgstr "Определение возникновения ошибки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:302
+msgid ""
+"When using the standard FreeBSD calling convention, the `carry flag` is "
+"cleared upon success, set upon failure."
+msgstr ""
+"При использовании стандартного соглашения о вызовах FreeBSD флаг `carry "
+"flag` сбрасывается при успехе и устанавливается при неудаче."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:305
+msgid ""
+"When using the Linux emulation mode, the signed value in `EAX` is non-"
+"negative upon success, and contains the return value. In case of an error, "
+"the value is negative, i.e., `-errno`."
+msgstr ""
+"При использовании режима эмуляции Linux знаковое значение в `EAX` "
+"неотрицательно в случае успеха и содержит возвращаемое значение. В случае "
+"ошибки значение отрицательное, т.е. `-errno`."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:307
+#, no-wrap
+msgid "Creating Portable Code"
+msgstr "Создание переносимого кода"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:312
+msgid ""
+"Portability is generally not one of the strengths of assembly language. "
+"Yet, writing assembly language programs for different platforms is possible, "
+"especially with nasm. I have written assembly language libraries that can "
+"be assembled for such different operating systems as Windows(R) and FreeBSD."
+msgstr ""
+"Портативность обычно не является сильной стороной языка ассемблера. Тем не "
+"менее, написание программ на ассемблере для разных платформ возможно, "
+"особенно с использованием nasm. Я создавал библиотеки на ассемблере, которые "
+"можно было собрать для таких разных операционных систем, как Windows(R) и "
+"FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:314
+msgid ""
+"It is all the more possible when you want your code to run on two platforms "
+"which, while different, are based on similar architectures."
+msgstr ""
+"Это становится еще более возможным, когда вы хотите, чтобы ваш код работал "
+"на двух платформах, которые, хотя и различны, основаны на схожих "
+"архитектурах."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:318
+msgid ""
+"For example, FreeBSD is UNIX(R), Linux is UNIX(R) like. I only mentioned "
+"three differences between them (from an assembly language programmer's "
+"perspective): The calling convention, the function numbers, and the way of "
+"returning values."
+msgstr ""
+"Например, FreeBSD — это UNIX(R), а Linux — UNIX(R)-подобная система. Я "
+"упомянул лишь три различия между ними (с точки зрения программиста на "
+"ассемблере): соглашение о вызовах, номера функций и способ возврата значений."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:320
+#, no-wrap
+msgid "Dealing with Function Numbers"
+msgstr "Работа с номерами функций"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:325
+msgid ""
+"In many cases the function numbers are the same. However, even when they "
+"are not, the problem is easy to deal with: Instead of using numbers in your "
+"code, use constants which you have declared differently depending on the "
+"target architecture:"
+msgstr ""
+"Во многих случаях номера функций совпадают. Однако, даже если это не так, "
+"проблему легко решить: вместо использования чисел в коде применяйте "
+"константы, объявленные по-разному в зависимости от целевой архитектуры:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:333
+#, no-wrap
+msgid ""
+"%ifdef\tLINUX\n"
+"%define\tSYS_execve\t11\n"
+"%else\n"
+"%define\tSYS_execve\t59\n"
+"%endif\n"
+msgstr ""
+"%ifdef\tLINUX\n"
+"%define\tSYS_execve\t11\n"
+"%else\n"
+"%define\tSYS_execve\t59\n"
+"%endif\n"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:336
+#, no-wrap
+msgid "Dealing with Conventions"
+msgstr "Работа с соглашениями"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:339
+msgid ""
+"Both, the calling convention, and the return value (the `errno` problem) can "
+"be resolved with macros:"
+msgstr ""
+"Оба, соглашение о вызовах и возвращаемое значение (проблема `errno`) могут "
+"быть решены с помощью макросов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:343
+#, no-wrap
+msgid "%ifdef\tLINUX\n"
+msgstr "%ifdef\tLINUX\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:347
+#, no-wrap
+msgid ""
+"%macro\tsystem\t0\n"
+"\tcall\tkernel\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsystem\t0\n"
+"\tcall\tkernel\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:356
+#, no-wrap
+msgid ""
+"align 4\n"
+"kernel:\n"
+"\tpush\tebx\n"
+"\tpush\tecx\n"
+"\tpush\tedx\n"
+"\tpush\tesi\n"
+"\tpush\tedi\n"
+"\tpush\tebp\n"
+msgstr ""
+"align 4\n"
+"kernel:\n"
+"\tpush\tebx\n"
+"\tpush\tecx\n"
+"\tpush\tedx\n"
+"\tpush\tesi\n"
+"\tpush\tedi\n"
+"\tpush\tebp\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:363
+#, no-wrap
+msgid ""
+"\tmov\tebx, [esp+32]\n"
+"\tmov\tecx, [esp+36]\n"
+"\tmov\tedx, [esp+40]\n"
+"\tmov\tesi, [esp+44]\n"
+"\tmov\tebp, [esp+48]\n"
+"\tint\t80h\n"
+msgstr ""
+"\tmov\tebx, [esp+32]\n"
+"\tmov\tecx, [esp+36]\n"
+"\tmov\tedx, [esp+40]\n"
+"\tmov\tesi, [esp+44]\n"
+"\tmov\tebp, [esp+48]\n"
+"\tint\t80h\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:370
+#, no-wrap
+msgid ""
+"\tpop\tebp\n"
+"\tpop\tedi\n"
+"\tpop\tesi\n"
+"\tpop\tedx\n"
+"\tpop\tecx\n"
+"\tpop\tebx\n"
+msgstr ""
+"\tpop\tebp\n"
+"\tpop\tedi\n"
+"\tpop\tesi\n"
+"\tpop\tedx\n"
+"\tpop\tecx\n"
+"\tpop\tebx\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:375
+#, no-wrap
+msgid ""
+"\tor\teax, eax\n"
+"\tjs\t.errno\n"
+"\tclc\n"
+"\tret\n"
+msgstr ""
+"\tor\teax, eax\n"
+"\tjs\t.errno\n"
+"\tclc\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:380
+#, no-wrap
+msgid ""
+".errno:\n"
+"\tneg\teax\n"
+"\tstc\n"
+"\tret\n"
+msgstr ""
+".errno:\n"
+"\tneg\teax\n"
+"\tstc\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:382
+#, no-wrap
+msgid "%else\n"
+msgstr "%else\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:386
+#, no-wrap
+msgid ""
+"%macro\tsystem\t0\n"
+"\tint\t80h\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsystem\t0\n"
+"\tint\t80h\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:388
+#, no-wrap
+msgid "%endif\n"
+msgstr "%endif\n"
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:391
+#, no-wrap
+msgid "Dealing with Other Portability Issues"
+msgstr "Устранение прочих проблем с переносимостью"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:395
+msgid ""
+"The above solutions can handle most cases of writing code portable between "
+"FreeBSD and Linux. Nevertheless, with some kernel services the differences "
+"are deeper."
+msgstr ""
+"Приведённые выше решения могут помочь в большинстве случаев написания кода, "
+"переносимого между FreeBSD и Linux. Тем не менее, с некоторыми сервисами "
+"ядра различия более глубокие."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:398
+msgid ""
+"In that case, you need to write two different handlers for those particular "
+"system calls, and use conditional assembly. Luckily, most of your code does "
+"something other than calling the kernel, so usually you will only need a few "
+"such conditional sections in your code."
+msgstr ""
+"В таком случае необходимо написать два разных обработчика для этих "
+"конкретных системных вызовов и использовать условную компиляцию. К счастью, "
+"большая часть вашего кода выполняет действия, отличные от вызовов ядра, "
+"поэтому обычно потребуется лишь несколько таких условных секций в коде."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:400
+#, no-wrap
+msgid "Using a Library"
+msgstr "Использование библиотеки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:404
+msgid ""
+"You can avoid portability issues in your main code altogether by writing a "
+"library of system calls. Create a separate library for FreeBSD, a different "
+"one for Linux, and yet other libraries for more operating systems."
+msgstr ""
+"Вы можете полностью избежать проблем с переносимостью в основном коде, "
+"написав библиотеку системных вызовов. Создайте отдельную библиотеку для "
+"FreeBSD, другую для Linux и ещё другие библиотеки для дополнительных "
+"операционных систем."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:409
+msgid ""
+"In your library, write a separate function (or procedure, if you prefer the "
+"traditional assembly language terminology) for each system call. Use the C "
+"calling convention of passing parameters. But still use `EAX` to pass the "
+"call number in. In that case, your FreeBSD library can be very simple, as "
+"many seemingly different functions can be just labels to the same code:"
+msgstr ""
+"В вашей библиотеке напишите отдельную функцию (или процедуру, если вы "
+"предпочитаете традиционную терминологию ассемблера) для каждого системного "
+"вызова. Используйте соглашение о вызовах C для передачи параметров. Однако "
+"по-прежнему передавайте номер вызова через `EAX`. В таком случае ваша "
+"библиотека FreeBSD может быть очень простой, так как множество внешне "
+"различных функций могут быть просто метками одного и того же кода:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:417
+#, no-wrap
+msgid ""
+"sys.open:\n"
+"sys.close:\n"
+"[etc...]\n"
+"\tint\t80h\n"
+"\tret\n"
+msgstr ""
+"sys.open:\n"
+"sys.close:\n"
+"[etc...]\n"
+"\tint\t80h\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:421
+msgid ""
+"Your Linux library will require more different functions. But even here you "
+"can group system calls using the same number of parameters:"
+msgstr ""
+"Ваша библиотека Linux потребует больше различных функций. Но даже здесь вы "
+"можете группировать системные вызовы, используя одинаковое количество "
+"параметров:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:432
+#, no-wrap
+msgid ""
+"sys.exit:\n"
+"sys.close:\n"
+"[etc... one-parameter functions]\n"
+"\tpush\tebx\n"
+"\tmov\tebx, [esp+12]\n"
+"\tint\t80h\n"
+"\tpop\tebx\n"
+"\tjmp\tsys.return\n"
+msgstr ""
+"sys.exit:\n"
+"sys.close:\n"
+"[etc... one-parameter functions]\n"
+"\tpush\tebx\n"
+"\tmov\tebx, [esp+12]\n"
+"\tint\t80h\n"
+"\tpop\tebx\n"
+"\tjmp\tsys.return\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:434
+#, no-wrap
+msgid "...\n"
+msgstr "...\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:440
+#, no-wrap
+msgid ""
+"sys.return:\n"
+"\tor\teax, eax\n"
+"\tjs\tsys.err\n"
+"\tclc\n"
+"\tret\n"
+msgstr ""
+"sys.return:\n"
+"\tor\teax, eax\n"
+"\tjs\tsys.err\n"
+"\tclc\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:445
+#, no-wrap
+msgid ""
+"sys.err:\n"
+"\tneg\teax\n"
+"\tstc\n"
+"\tret\n"
+msgstr ""
+"sys.err:\n"
+"\tneg\teax\n"
+"\tstc\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:452
+msgid ""
+"The library approach may seem inconvenient at first because it requires you "
+"to produce a separate file your code depends on. But it has many "
+"advantages: For one, you only need to write it once and can use it for all "
+"your programs. You can even let other assembly language programmers use it, "
+"or perhaps use one written by someone else. But perhaps the greatest "
+"advantage of the library is that your code can be ported to other systems, "
+"even by other programmers, by simply writing a new library without any "
+"changes to your code."
+msgstr ""
+"Подход с использованием библиотек может показаться неудобным на первый "
+"взгляд, так как требует создания отдельного файла, от которого зависит ваш "
+"код. Однако у него есть множество преимуществ: во-первых, вам нужно написать "
+"его лишь один раз, и затем вы можете использовать его во всех своих "
+"программах. Вы даже можете позволить другим программистам на ассемблере "
+"использовать его или, возможно, воспользоваться библиотекой, написанной кем-"
+"то другим. Но, пожалуй, самое большое преимущество библиотеки заключается в "
+"том, что ваш код может быть перенесён на другие системы, даже другими "
+"программистами, просто путём написания новой библиотеки без каких-либо "
+"изменений в вашем коде."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:454
+msgid ""
+"If you do not like the idea of having a library, you can at least place all "
+"your system calls in a separate assembly language file and link it with your "
+"main program. Here, again, all porters have to do is create a new object "
+"file to link with your main program."
+msgstr ""
+"Если вам не нравится идея использования библиотеки, вы можете хотя бы "
+"разместить все системные вызовы в отдельном файле на ассемблере и "
+"скомпоновать его с основной программой. Здесь, опять же, все, что нужно "
+"сделать переносчикам, — это создать новый объектный файл для компоновки с "
+"основной программой."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:456
+#, no-wrap
+msgid "Using an Include File"
+msgstr "Использование включаемого файла"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:459
+msgid ""
+"If you are releasing your software as (or with) source code, you can use "
+"macros and place them in a separate file, which you include in your code."
+msgstr ""
+"Если вы выпускаете своё программное обеспечение в виде исходного кода (или "
+"вместе с ним), вы можете использовать макросы и размещать их в отдельном "
+"файле, который включается в ваш код."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:462
+msgid ""
+"Porters of your software will simply write a new include file. No library "
+"or external object file is necessary, yet your code is portable without any "
+"need to edit the code."
+msgstr ""
+"Портеры вашего программного обеспечения просто напишут новый include-файл. "
+"Никакая библиотека или внешний объектный файл не требуются, и ваш код "
+"остается переносимым без необходимости редактирования."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:467
+msgid ""
+"This is the approach we will use throughout this chapter. We will name our "
+"include file [.filename]#system.inc#, and add to it whenever we deal with a "
+"new system call."
+msgstr ""
+"Это подход, который мы будем использовать на протяжении всей главы. Мы "
+"назовем наш включаемый файл [.filename]#system.inc# и будем добавлять в него "
+"новые системные вызовы по мере их рассмотрения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:470
+msgid ""
+"We can start our [.filename]#system.inc# by declaring the standard file "
+"descriptors:"
+msgstr ""
+"Мы можем начать наш [.filename]#system.inc# с объявления стандартных "
+"файловых дескрипторов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:476
+#, no-wrap
+msgid ""
+"%define\tstdin\t0\n"
+"%define\tstdout\t1\n"
+"%define\tstderr\t2\n"
+msgstr ""
+"%define\tstdin\t0\n"
+"%define\tstdout\t1\n"
+"%define\tstderr\t2\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:479
+msgid "Next, we create a symbolic name for each system call:"
+msgstr "Далее мы создаем символическое имя для каждого системного вызова:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:488
+#, no-wrap
+msgid ""
+"%define\tSYS_nosys\t0\n"
+"%define\tSYS_exit\t1\n"
+"%define\tSYS_fork\t2\n"
+"%define\tSYS_read\t3\n"
+"%define\tSYS_write\t4\n"
+"; [etc...]\n"
+msgstr ""
+"%define\tSYS_nosys\t0\n"
+"%define\tSYS_exit\t1\n"
+"%define\tSYS_fork\t2\n"
+"%define\tSYS_read\t3\n"
+"%define\tSYS_write\t4\n"
+"; [etc...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:491
+msgid ""
+"We add a short, non-global procedure with a long name, so we do not "
+"accidentally reuse the name in our code:"
+msgstr ""
+"Добавляем короткую, неглобальную процедуру с длинным именем, чтобы случайно "
+"не использовать это имя в нашем коде:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:499
+#, no-wrap
+msgid ""
+"section\t.text\n"
+"align 4\n"
+"access.the.bsd.kernel:\n"
+"\tint\t80h\n"
+"\tret\n"
+msgstr ""
+"section\t.text\n"
+"align 4\n"
+"access.the.bsd.kernel:\n"
+"\tint\t80h\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:502
+msgid "We create a macro which takes one argument, the syscall number:"
+msgstr ""
+"Мы создаем макрос, который принимает один аргумент — номер системного вызова:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:509
+#, no-wrap
+msgid ""
+"%macro\tsystem\t1\n"
+"\tmov\teax, %1\n"
+"\tcall\taccess.the.bsd.kernel\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsystem\t1\n"
+"\tmov\teax, %1\n"
+"\tcall\taccess.the.bsd.kernel\n"
+"%endmacro\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:513
+msgid ""
+"Finally, we create macros for each syscall. These macros take no arguments."
+msgstr ""
+"Наконец, мы создаем макросы для каждого системного вызова. Эти макросы не "
+"принимают аргументов."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:519
+#, no-wrap
+msgid ""
+"%macro\tsys.exit\t0\n"
+"\tsystem\tSYS_exit\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.exit\t0\n"
+"\tsystem\tSYS_exit\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:523
+#, no-wrap
+msgid ""
+"%macro\tsys.fork\t0\n"
+"\tsystem\tSYS_fork\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.fork\t0\n"
+"\tsystem\tSYS_fork\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:527
+#, no-wrap
+msgid ""
+"%macro\tsys.read\t0\n"
+"\tsystem\tSYS_read\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.read\t0\n"
+"\tsystem\tSYS_read\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:531
+#, no-wrap
+msgid ""
+"%macro\tsys.write\t0\n"
+"\tsystem\tSYS_write\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.write\t0\n"
+"\tsystem\tSYS_write\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:533
+#, no-wrap
+msgid "; [etc...]\n"
+msgstr "; [etc...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:537
+msgid ""
+"Go ahead, enter it into your editor and save it as [.filename]#system.inc#. "
+"We will add more to it as we discuss more syscalls."
+msgstr ""
+"Продолжайте, введите это в ваш редактор и сохраните как "
+"[.filename]#system.inc#. Мы добавим больше по мере обсуждения дополнительных "
+"системных вызовов."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:539
+#, no-wrap
+msgid "Our First Program"
+msgstr "Наша первая программа"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:542
+msgid "We are now ready for our first program, the mandatory Hello, World!"
+msgstr "Мы готовы к нашей первой обязательной программе — Hello, World!"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:546
+#, no-wrap
+msgid "\t%include\t'system.inc'\n"
+msgstr "\t%include\t'system.inc'\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:550
+#, no-wrap
+msgid ""
+"\tsection\t.data\n"
+"\thello\tdb\t'Hello, World!', 0Ah\n"
+"\thbytes\tequ\t$-hello\n"
+msgstr ""
+"\tsection\t.data\n"
+"\thello\tdb\t'Hello, World!', 0Ah\n"
+"\thbytes\tequ\t$-hello\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:558
+#, no-wrap
+msgid ""
+"\tsection\t.text\n"
+"\tglobal\t_start\n"
+"_start:\n"
+"\tpush\tdword hbytes\n"
+"\tpush\tdword hello\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+msgstr ""
+"\tsection\t.text\n"
+"\tglobal\t_start\n"
+"_start:\n"
+"\tpush\tdword hbytes\n"
+"\tpush\tdword hello\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:561
+#, no-wrap
+msgid ""
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+msgstr ""
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:564
+msgid ""
+"Here is what it does: Line 1 includes the defines, the macros, and the code "
+"from [.filename]#system.inc#."
+msgstr ""
+"Вот что он делает: Строка 1 включает определения, макросы и код из файла "
+"[.filename]#system.inc#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:568
+msgid ""
+"Lines 3-5 are the data: Line 3 starts the data section/segment. Line 4 "
+"contains the string \"Hello, World!\" followed by a new line (`0Ah`). Line "
+"5 creates a constant that contains the length of the string from line 4 in "
+"bytes."
+msgstr ""
+"Строки 3-5 содержат данные: строка 3 начинает раздел/сегмент данных. Строка "
+"4 содержит строку \"Hello, World!\", за которой следует новая строка "
+"(`0Ah`). Строка 5 создает константу, содержащую длину строки из строки 4 в "
+"байтах."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:572
+msgid ""
+"Lines 7-16 contain the code. Note that FreeBSD uses the _elf_ file format "
+"for its executables, which requires every program to start at the point "
+"labeled `_start` (or, more precisely, the linker expects that). This label "
+"has to be global."
+msgstr ""
+"Строки 7-16 содержат код. Обратите внимание, что FreeBSD использует формат "
+"файлов _elf_ для исполняемых файлов, который требует, чтобы каждая программа "
+"запускается с адреса, помеченного как `_start` (или, точнее, компоновщик "
+"ожидает этого). Эта метка должна быть глобальной."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:574
+msgid ""
+"Lines 10-13 ask the system to write `hbytes` bytes of the `hello` string to "
+"`stdout`."
+msgstr ""
+"Строки 10-13 указывают системе записать `hbytes` байтов строки `hello` в "
+"`stdout`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:577
+msgid ""
+"Lines 15-16 ask the system to end the program with the return value of `0`. "
+"The `SYS_exit` syscall never returns, so the code ends there."
+msgstr ""
+"Строки 15-16 указывают системе завершить программу с возвращаемым значением "
+"`0`. Системный вызов `SYS_exit` никогда не возвращает управление, поэтому "
+"код завершается в этой точке."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:585
+msgid ""
+"If you have come to UNIX(R) from MS-DOS(R) assembly language background, you "
+"may be used to writing directly to the video hardware. You will never have "
+"to worry about this in FreeBSD, or any other flavor of UNIX(R). As far as "
+"you are concerned, you are writing to a file known as [.filename]#stdout#. "
+"This can be the video screen, or a telnet terminal, or an actual file, or "
+"even the input of another program. Which one it is, is for the system to "
+"figure out."
+msgstr ""
+"Если вы перешли на UNIX(R) с опытом программирования на ассемблере для MS-"
+"DOS(R), вы, возможно, привыкли писать напрямую в видеопамять. В FreeBSD или "
+"любой другой разновидности UNIX(R) вам не придётся об этом беспокоиться. С "
+"вашей точки зрения, вы записываете данные в файл под названием "
+"[.filename]#stdout#. Это может быть экран, терминал telnet, обычный файл или "
+"даже входные данные другой программы. Определять, что именно это будет, — "
+"задача системы."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:588
+#, no-wrap
+msgid "Assembling the Code"
+msgstr "Ассемблирование кода"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:592
+msgid ""
+"Type the code in an editor, and save it in a file named "
+"[.filename]#hello.asm#. You need nasm to assemble it."
+msgstr ""
+"Наберите код в редакторе и сохраните его в файле с именем "
+"[.filename]#hello.asm#. Для сборки вам понадобится nasm."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:594
+#, no-wrap
+msgid "Installing nasm"
+msgstr "Установка nasm"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:597
+msgid "If you do not have nasm, type:"
+msgstr "Если у вас нет nasm, введите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:606
+#, no-wrap
+msgid ""
+"% su\n"
+"Password:your root password\n"
+"# cd /usr/ports/devel/nasm\n"
+"# make install\n"
+"# exit\n"
+"%\n"
+msgstr ""
+"% su\n"
+"Password:your root password\n"
+"# cd /usr/ports/devel/nasm\n"
+"# make install\n"
+"# exit\n"
+"%\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:609
+msgid ""
+"You may type `make install clean` instead of just `make install` if you do "
+"not want to keep nasm source code."
+msgstr ""
+"Вы можете ввести `make install clean` вместо просто `make install`, если не "
+"хотите сохранять исходный код nasm."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:611
+msgid ""
+"Either way, FreeBSD will automatically download nasm from the Internet, "
+"compile it, and install it on your system."
+msgstr ""
+"В любом случае FreeBSD автоматически загрузит nasm из интернета, "
+"скомпилирует его и установит в вашу систему."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:616
+msgid ""
+"If your system is not FreeBSD, you need to get nasm from its https://"
+"sourceforge.net/projects/nasm[home page]. You can still use it to assemble "
+"FreeBSD code."
+msgstr ""
+"Если ваша система не FreeBSD, вам нужно получить nasm с его https://"
+"sourceforge.net/projects/nasm[домашней страницы]. Вы по-прежнему можете "
+"использовать его для ассемблирования кода FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:619
+msgid "Now you can assemble, link, and run the code:"
+msgstr "Теперь вы можете собрать, скомпоновать и запустить код:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:627
+#, no-wrap
+msgid ""
+"% nasm -f elf hello.asm\n"
+"% ld -s -o hello hello.o\n"
+"% ./hello\n"
+"Hello, World!\n"
+"%\n"
+msgstr ""
+"% nasm -f elf hello.asm\n"
+"% ld -s -o hello hello.o\n"
+"% ./hello\n"
+"Hello, World!\n"
+"%\n"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:630
+#, no-wrap
+msgid "Writing UNIX(R) Filters"
+msgstr "Написание фильтров UNIX(R)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:633
+msgid ""
+"A common type of UNIX(R) application is a filter-a program that reads data "
+"from the [.filename]#stdin#, processes it somehow, then writes the result to "
+"[.filename]#stdout#."
+msgstr ""
+"Распространённым типом приложений в UNIX(R) являются фильтры — программы, "
+"которые читают данные из [.filename]#stdin#, обрабатывают их определённым "
+"образом, а затем записывают результат в [.filename]#stdout#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:636
+msgid ""
+"In this chapter, we shall develop a simple filter, and learn how to read "
+"from [.filename]#stdin# and write to [.filename]#stdout#. This filter will "
+"convert each byte of its input into a hexadecimal number followed by a blank "
+"space."
+msgstr ""
+"В этой главе мы разработаем простой фильтр и научимся читать из "
+"[.filename]#stdin# и писать в [.filename]#stdout#. Этот фильтр будет "
+"преобразовывать каждый байт входных данных в шестнадцатеричное число, за "
+"которым следует пробел."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:640
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:734
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:824
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:952
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1219
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2337
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3335
+#, no-wrap
+msgid "%include\t'system.inc'\n"
+msgstr "%include\t'system.inc'\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:644
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:738
+#, no-wrap
+msgid ""
+"section\t.data\n"
+"hex\tdb\t'0123456789ABCDEF'\n"
+"buffer\tdb\t0, 0, ' '\n"
+msgstr ""
+"section\t.data\n"
+"hex\tdb\t'0123456789ABCDEF'\n"
+"buffer\tdb\t0, 0, ' '\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:656
+#, no-wrap
+msgid ""
+"section\t.text\n"
+"global\t_start\n"
+"_start:\n"
+"\t; read a byte from stdin\n"
+"\tpush\tdword 1\n"
+"\tpush\tdword buffer\n"
+"\tpush\tdword stdin\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+msgstr ""
+"section\t.text\n"
+"global\t_start\n"
+"_start:\n"
+"\t; read a byte from stdin\n"
+"\tpush\tdword 1\n"
+"\tpush\tdword buffer\n"
+"\tpush\tdword stdin\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:666
+#, no-wrap
+msgid ""
+"\t; convert it to hex\n"
+"\tmovzx\teax, byte [buffer]\n"
+"\tmov\tedx, eax\n"
+"\tshr\tdl, 4\n"
+"\tmov\tdl, [hex+edx]\n"
+"\tmov\t[buffer], dl\n"
+"\tand\tal, 0Fh\n"
+"\tmov\tal, [hex+eax]\n"
+"\tmov\t[buffer+1], al\n"
+msgstr ""
+"\t; convert it to hex\n"
+"\tmovzx\teax, byte [buffer]\n"
+"\tmov\tedx, eax\n"
+"\tshr\tdl, 4\n"
+"\tmov\tdl, [hex+edx]\n"
+"\tmov\t[buffer], dl\n"
+"\tand\tal, 0Fh\n"
+"\tmov\tal, [hex+eax]\n"
+"\tmov\t[buffer+1], al\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:674
+#, no-wrap
+msgid ""
+"\t; print it\n"
+"\tpush\tdword 3\n"
+"\tpush\tdword buffer\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tjmp\tshort _start\n"
+msgstr ""
+"\t; print it\n"
+"\tpush\tdword 3\n"
+"\tpush\tdword buffer\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tjmp\tshort _start\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:678
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:781
+#, no-wrap
+msgid ""
+".done:\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+msgstr ""
+".done:\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:686
+msgid ""
+"In the data section we create an array called `hex`. It contains the 16 "
+"hexadecimal digits in ascending order. The array is followed by a buffer "
+"which we will use for both input and output. The first two bytes of the "
+"buffer are initially set to `0`. This is where we will write the two "
+"hexadecimal digits (the first byte also is where we will read the input). "
+"The third byte is a space."
+msgstr ""
+"В разделе данных мы создаем массив с именем `hex`. Он содержит 16 "
+"шестнадцатеричных цифр в порядке возрастания. За массивом следует буфер, "
+"который мы будем использовать как для ввода, так и для вывода. Первые два "
+"байта буфера изначально установлены в `0`. Именно сюда мы будем записывать "
+"две шестнадцатеричные цифры (первый байт также является местом, откуда мы "
+"будем считывать ввод). Третий байт — это пробел."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:688
+msgid ""
+"The code section consists of four parts: Reading the byte, converting it to "
+"a hexadecimal number, writing the result, and eventually exiting the program."
+msgstr ""
+"Фрагмент кода состоит из четырех частей: чтение байта, преобразование его в "
+"шестнадцатеричное число, запись результата и завершение программы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:694
+msgid ""
+"To read the byte, we ask the system to read one byte from "
+"[.filename]#stdin#, and store it in the first byte of the `buffer`. The "
+"system returns the number of bytes read in `EAX`. This will be `1` while "
+"data is coming, or `0`, when no more input data is available. Therefore, we "
+"check the value of `EAX`. If it is `0`, we jump to `.done`, otherwise we "
+"continue."
+msgstr ""
+"Для чтения байта мы просим систему прочитать один байт из [.filename]#stdin# "
+"и сохранить его в первом байте `buffer`. Система возвращает количество "
+"прочитанных байтов в `EAX`. Это значение будет `1`, пока поступают данные, "
+"или `0`, если больше нет доступных входных данных. Поэтому мы проверяем "
+"значение `EAX`. Если оно равно `0`, мы переходим к метке `.done`, в "
+"противном случае продолжаем выполнение."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:698
+msgid ""
+"For simplicity sake, we are ignoring the possibility of an error condition "
+"at this time."
+msgstr "Для простоты мы пока игнорируем возможность возникновения ошибки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:703
+msgid ""
+"The hexadecimal conversion reads the byte from the `buffer` into `EAX`, or "
+"actually just `AL`, while clearing the remaining bits of `EAX` to zeros. We "
+"also copy the byte to `EDX` because we need to convert the upper four bits "
+"(nibble) separately from the lower four bits. We store the result in the "
+"first two bytes of the buffer."
+msgstr ""
+"Шестнадцатеричное преобразование считывает байт из `buffer` в `EAX`, а "
+"точнее только в `AL`, обнуляя остальные биты `EAX`. Мы также копируем байт в "
+"`EDX`, потому что нам нужно преобразовать верхние четыре бита (ниббл) "
+"отдельно от нижних четырех битов. Результат сохраняется в первых двух байтах "
+"буфера."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:706
+msgid ""
+"Next, we ask the system to write the three bytes of the buffer, i.e., the "
+"two hexadecimal digits and the blank space, to [.filename]#stdout#. We then "
+"jump back to the beginning of the program and process the next byte."
+msgstr ""
+"Далее мы просим систему записать три байта буфера, то есть две "
+"шестнадцатеричные цифры и пробел, в [.filename]#stdout#. Затем мы "
+"возвращаемся к началу программы и обрабатываем следующий байт."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:708
+msgid ""
+"Once there is no more input left, we ask the system to exit our program, "
+"returning a zero, which is the traditional value meaning the program was "
+"successful."
+msgstr ""
+"Когда ввод больше не остаётся, мы просим систему завершить нашу программу, "
+"возвращая ноль, что традиционно означает успешное выполнение программы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:710
+msgid ""
+"Go ahead, and save the code in a file named [.filename]#hex.asm#, then type "
+"the following (the `^D` means press the control key and type `D` while "
+"holding the control key down):"
+msgstr ""
+"Продолжайте и сохраните код в файле с именем [.filename]#hex.asm#, затем "
+"введите следующее (символ `^D` означает, что нужно нажать клавишу управления "
+"и, удерживая её, ввести `D`):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:719
+#, no-wrap
+msgid ""
+"% nasm -f elf hex.asm\n"
+"% ld -s -o hex hex.o\n"
+"% ./hex\n"
+"Hello, World!\n"
+"48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come!\n"
+"48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D %\n"
+msgstr ""
+"% nasm -f elf hex.asm\n"
+"% ld -s -o hex hex.o\n"
+"% ./hex\n"
+"Hello, World!\n"
+"48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A Here I come!\n"
+"48 65 72 65 20 49 20 63 6F 6D 65 21 0A ^D %\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:725
+msgid ""
+"If you are migrating to UNIX(R) from MS-DOS(R), you may be wondering why "
+"each line ends with `0A` instead of `0D 0A`. This is because UNIX(R) does "
+"not use the cr/lf convention, but a \"new line\" convention, which is `0A` "
+"in hexadecimal."
+msgstr ""
+"Если вы переходите на UNIX(R) с MS-DOS(R), вам может быть интересно, почему "
+"каждая строка заканчивается на `0A` вместо `0D 0A`. Это связано с тем, что "
+"UNIX(R) не использует соглашение cr/lf, а использует соглашение \"новая "
+"строка\", которое в шестнадцатеричном виде представлено как `0A`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:730
+msgid ""
+"Can we improve this? Well, for one, it is a bit confusing because once we "
+"have converted a line of text, our input no longer starts at the beginning "
+"of the line. We can modify it to print a new line instead of a space after "
+"each `0A`:"
+msgstr ""
+"Можем ли мы это улучшить? Что ж, во-первых, это немного запутанно, потому "
+"что после преобразования строки текста наш ввод больше не начинается с "
+"начала строки. Мы можем изменить это, чтобы после каждого `0A` выводилась "
+"новая строка вместо пробела:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:743
+#, no-wrap
+msgid ""
+"section\t.text\n"
+"global\t_start\n"
+"_start:\n"
+"\tmov\tcl, ' '\n"
+msgstr ""
+"section\t.text\n"
+"global\t_start\n"
+"_start:\n"
+"\tmov\tcl, ' '\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:753
+#, no-wrap
+msgid ""
+".loop:\n"
+"\t; read a byte from stdin\n"
+"\tpush\tdword 1\n"
+"\tpush\tdword buffer\n"
+"\tpush\tdword stdin\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+msgstr ""
+".loop:\n"
+"\t; read a byte from stdin\n"
+"\tpush\tdword 1\n"
+"\tpush\tdword buffer\n"
+"\tpush\tdword stdin\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:760
+#, no-wrap
+msgid ""
+"\t; convert it to hex\n"
+"\tmovzx\teax, byte [buffer]\n"
+"\tmov\t[buffer+2], cl\n"
+"\tcmp\tal, 0Ah\n"
+"\tjne\t.hex\n"
+"\tmov\t[buffer+2], al\n"
+msgstr ""
+"\t; convert it to hex\n"
+"\tmovzx\teax, byte [buffer]\n"
+"\tmov\t[buffer+2], cl\n"
+"\tcmp\tal, 0Ah\n"
+"\tjne\t.hex\n"
+"\tmov\t[buffer+2], al\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:769
+#, no-wrap
+msgid ""
+".hex:\n"
+"\tmov\tedx, eax\n"
+"\tshr\tdl, 4\n"
+"\tmov\tdl, [hex+edx]\n"
+"\tmov\t[buffer], dl\n"
+"\tand\tal, 0Fh\n"
+"\tmov\tal, [hex+eax]\n"
+"\tmov\t[buffer+1], al\n"
+msgstr ""
+".hex:\n"
+"\tmov\tedx, eax\n"
+"\tshr\tdl, 4\n"
+"\tmov\tdl, [hex+edx]\n"
+"\tmov\t[buffer], dl\n"
+"\tand\tal, 0Fh\n"
+"\tmov\tal, [hex+eax]\n"
+"\tmov\t[buffer+1], al\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:777
+#, no-wrap
+msgid ""
+"\t; print it\n"
+"\tpush\tdword 3\n"
+"\tpush\tdword buffer\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tjmp\tshort .loop\n"
+msgstr ""
+"\t; print it\n"
+"\tpush\tdword 3\n"
+"\tpush\tdword buffer\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tjmp\tshort .loop\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:785
+msgid ""
+"We have stored the space in the `CL` register. We can do this safely "
+"because, unlike Microsoft(R) Windows(R), UNIX(R) system calls do not modify "
+"the value of any register they do not use to return a value in."
+msgstr ""
+"Мы сохранили пробел в регистре `CL`. Это безопасно, потому что, в отличие от "
+"Microsoft(R) Windows(R), вызовы системы UNIX(R) не изменяют значение "
+"регистров, которые не используются для возврата значения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:789
+msgid ""
+"That means we only need to set `CL` once. We have, therefore, added a new "
+"label `.loop` and jump to it for the next byte instead of jumping at "
+"`_start`. We have also added the `.hex` label so we can either have a blank "
+"space or a new line as the third byte of the `buffer`."
+msgstr ""
+"Это означает, что нам нужно установить `CL` только один раз. Поэтому мы "
+"добавили новую метку `.loop` и переходим к ней для следующего байта вместо "
+"перехода к `_start`. Мы также добавили метку `.hex`, чтобы третий байт "
+"`buffer` мог быть либо пробелом, либо новой строкой."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:791
+msgid ""
+"Once you have changed [.filename]#hex.asm# to reflect these changes, type:"
+msgstr "После внесения изменений в файл [.filename]#hex.asm# введите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:802
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1061
+#, no-wrap
+msgid ""
+"% nasm -f elf hex.asm\n"
+"% ld -s -o hex hex.o\n"
+"% ./hex\n"
+"Hello, World!\n"
+"48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A\n"
+"Here I come!\n"
+"48 65 72 65 20 49 20 63 6F 6D 65 21 0A\n"
+"^D %\n"
+msgstr ""
+"% nasm -f elf hex.asm\n"
+"% ld -s -o hex hex.o\n"
+"% ./hex\n"
+"Hello, World!\n"
+"48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A\n"
+"Here I come!\n"
+"48 65 72 65 20 49 20 63 6F 6D 65 21 0A\n"
+"^D %\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:806
+msgid ""
+"That looks better. But this code is quite inefficient! We are making a "
+"system call for every single byte twice (once to read it, another time to "
+"write the output)."
+msgstr ""
+"Выглядит лучше. Но этот код довольно неэффективен! Мы выполняем системный "
+"вызов для каждого отдельного байта дважды (один раз для чтения и ещё один "
+"для записи вывода)."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:808
+#, no-wrap
+msgid "Buffered Input and Output"
+msgstr "Буферизованный ввод и вывод"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:813
+msgid ""
+"We can improve the efficiency of our code by buffering our input and "
+"output. We create an input buffer and read a whole sequence of bytes at one "
+"time. Then we fetch them one by one from the buffer."
+msgstr ""
+"Мы можем повысить эффективность нашего кода, буферизуя ввод и вывод. Мы "
+"создаём входной буфер и читаем сразу целую последовательность байтов. Затем "
+"мы извлекаем их по одному из буфера."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:816
+msgid ""
+"We also create an output buffer. We store our output in it until it is "
+"full. At that time we ask the kernel to write the contents of the buffer to "
+"[.filename]#stdout#."
+msgstr ""
+"Мы также создаем выходной буфер. Мы сохраняем наш вывод в нем, пока он не "
+"заполнится. В этот момент мы просим ядро записать содержимое буфера в "
+"[.filename]#stdout#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:820
+msgid ""
+"The program ends when there is no more input. But we still need to ask the "
+"kernel to write the contents of our output buffer to [.filename]#stdout# one "
+"last time, otherwise some of our output would make it to the output buffer, "
+"but never be sent out. Do not forget that, or you will be wondering why "
+"some of your output is missing."
+msgstr ""
+"Программа завершается, когда больше нет входных данных. Но нам всё ещё нужно "
+"попросить ядро записать содержимое нашего выходного буфера в "
+"[.filename]#stdout# в последний раз, иначе часть нашего вывода попадёт в "
+"буфер, но так и не будет отправлена. Не забудьте об этом, иначе будете "
+"недоумевать, куда пропала часть вывода."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:826
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:954
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1221
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2339
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3337
+#, no-wrap
+msgid "%define\tBUFSIZE\t2048\n"
+msgstr "%define\tBUFSIZE\t2048\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:829
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:957
+#, no-wrap
+msgid ""
+"section\t.data\n"
+"hex\tdb\t'0123456789ABCDEF'\n"
+msgstr ""
+"section\t.data\n"
+"hex\tdb\t'0123456789ABCDEF'\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:833
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:961
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1230
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2353
+#, no-wrap
+msgid ""
+"section .bss\n"
+"ibuffer\tresb\tBUFSIZE\n"
+"obuffer\tresb\tBUFSIZE\n"
+msgstr ""
+"section .bss\n"
+"ibuffer\tresb\tBUFSIZE\n"
+"obuffer\tresb\tBUFSIZE\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:841
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:969
+#, no-wrap
+msgid ""
+"section\t.text\n"
+"global\t_start\n"
+"_start:\n"
+"\tsub\teax, eax\n"
+"\tsub\tebx, ebx\n"
+"\tsub\tecx, ecx\n"
+"\tmov\tedi, obuffer\n"
+msgstr ""
+"section\t.text\n"
+"global\t_start\n"
+"_start:\n"
+"\tsub\teax, eax\n"
+"\tsub\tebx, ebx\n"
+"\tsub\tecx, ecx\n"
+"\tmov\tedi, obuffer\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:845
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:973
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2501
+#, no-wrap
+msgid ""
+".loop:\n"
+"\t; read a byte from stdin\n"
+"\tcall\tgetchar\n"
+msgstr ""
+".loop:\n"
+"\t; read a byte from stdin\n"
+"\tcall\tgetchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:851
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:979
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1283
+#, no-wrap
+msgid ""
+"\t; convert it to hex\n"
+"\tmov\tdl, al\n"
+"\tshr\tal, 4\n"
+"\tmov\tal, [hex+eax]\n"
+"\tcall\tputchar\n"
+msgstr ""
+"\t; convert it to hex\n"
+"\tmov\tdl, al\n"
+"\tshr\tal, 4\n"
+"\tmov\tal, [hex+eax]\n"
+"\tcall\tputchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:856
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:984
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1288
+#, no-wrap
+msgid ""
+"\tmov\tal, dl\n"
+"\tand\tal, 0Fh\n"
+"\tmov\tal, [hex+eax]\n"
+"\tcall\tputchar\n"
+msgstr ""
+"\tmov\tal, dl\n"
+"\tand\tal, 0Fh\n"
+"\tmov\tal, [hex+eax]\n"
+"\tcall\tputchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:861
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:989
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1293
+#, no-wrap
+msgid ""
+"\tmov\tal, ' '\n"
+"\tcmp\tdl, 0Ah\n"
+"\tjne\t.put\n"
+"\tmov\tal, dl\n"
+msgstr ""
+"\tmov\tal, ' '\n"
+"\tcmp\tdl, 0Ah\n"
+"\tjne\t.put\n"
+"\tmov\tal, dl\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:865
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2512
+#, no-wrap
+msgid ""
+".put:\n"
+"\tcall\tputchar\n"
+"\tjmp\tshort .loop\n"
+msgstr ""
+".put:\n"
+"\tcall\tputchar\n"
+"\tjmp\tshort .loop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:870
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1001
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1305
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2534
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3848
+#, no-wrap
+msgid ""
+"align 4\n"
+"getchar:\n"
+"\tor\tebx, ebx\n"
+"\tjne\t.fetch\n"
+msgstr ""
+"align 4\n"
+"getchar:\n"
+"\tor\tebx, ebx\n"
+"\tjne\t.fetch\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:872
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1003
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1307
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2536
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3850
+#, no-wrap
+msgid "\tcall\tread\n"
+msgstr "\tcall\tread\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:877
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1008
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1312
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2541
+#, no-wrap
+msgid ""
+".fetch:\n"
+"\tlodsb\n"
+"\tdec\tebx\n"
+"\tret\n"
+msgstr ""
+".fetch:\n"
+"\tlodsb\n"
+"\tdec\tebx\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:890
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1021
+#, no-wrap
+msgid ""
+"read:\n"
+"\tpush\tdword BUFSIZE\n"
+"\tmov\tesi, ibuffer\n"
+"\tpush\tesi\n"
+"\tpush\tdword stdin\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tmov\tebx, eax\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+msgstr ""
+"read:\n"
+"\tpush\tdword BUFSIZE\n"
+"\tmov\tesi, ibuffer\n"
+"\tpush\tesi\n"
+"\tpush\tdword stdin\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tmov\tebx, eax\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:896
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1027
+#, no-wrap
+msgid ""
+"align 4\n"
+".done:\n"
+"\tcall\twrite\t\t; flush output buffer\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+msgstr ""
+"align 4\n"
+".done:\n"
+"\tcall\twrite\t\t; flush output buffer\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:904
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1035
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1348
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2581
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3887
+#, no-wrap
+msgid ""
+"align 4\n"
+"putchar:\n"
+"\tstosb\n"
+"\tinc\tecx\n"
+"\tcmp\tecx, BUFSIZE\n"
+"\tje\twrite\n"
+"\tret\n"
+msgstr ""
+"align 4\n"
+"putchar:\n"
+"\tstosb\n"
+"\tinc\tecx\n"
+"\tcmp\tecx, BUFSIZE\n"
+"\tje\twrite\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:916
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1047
+#, no-wrap
+msgid ""
+"align 4\n"
+"write:\n"
+"\tsub\tedi, ecx\t; start of buffer\n"
+"\tpush\tecx\n"
+"\tpush\tedi\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tsub\teax, eax\n"
+"\tsub\tecx, ecx\t; buffer is empty now\n"
+"\tret\n"
+msgstr ""
+"align 4\n"
+"write:\n"
+"\tsub\tedi, ecx\t; start of buffer\n"
+"\tpush\tecx\n"
+"\tpush\tedi\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tsub\teax, eax\n"
+"\tsub\tecx, ecx\t; buffer is empty now\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:922
+msgid ""
+"We now have a third section in the source code, named `.bss`. This section "
+"is not included in our executable file, and, therefore, cannot be "
+"initialized. We use `resb` instead of `db`. It simply reserves the "
+"requested size of uninitialized memory for our use."
+msgstr ""
+"Теперь у нас есть третий раздел в исходном коде с именем `.bss`. Этот раздел "
+"не включается в исполняемый файл и, следовательно, не может быть "
+"инициализирован. Мы используем `resb` вместо `db`. Это просто резервирует "
+"запрошенный размер неинициализированной памяти для нашего использования."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:926
+msgid ""
+"We take advantage of the fact that the system does not modify the registers: "
+"We use registers for what, otherwise, would have to be global variables "
+"stored in the `.data` section. This is also why the UNIX(R) convention of "
+"passing parameters to system calls on the stack is superior to the Microsoft "
+"convention of passing them in the registers: We can keep the registers for "
+"our own use."
+msgstr ""
+"Мы используем тот факт, что система не изменяет регистры: мы используем "
+"регистры для того, что в противном случае пришлось бы хранить в глобальных "
+"переменных в секции `.data`. Именно поэтому соглашение UNIX(R) о передаче "
+"параметров системных вызовов через стек превосходит соглашение Microsoft о "
+"передаче их в регистрах: мы можем оставить регистры для собственного "
+"использования."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:930
+msgid ""
+"We use `EDI` and `ESI` as pointers to the next byte to be read from or "
+"written to. We use `EBX` and `ECX` to keep count of the number of bytes in "
+"the two buffers, so we know when to dump the output to, or read more input "
+"from, the system."
+msgstr ""
+"Мы используем `EDI` и `ESI` как указатели на следующий байт для чтения или "
+"записи. Мы используем `EBX` и `ECX` для отслеживания количества байтов в "
+"двух буферах, чтобы знать, когда нужно вывести данные в систему или считать "
+"новые данные из системы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:932
+msgid "Let us see how it works now:"
+msgstr "Давайте посмотрим, как это работает сейчас:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:943
+#, no-wrap
+msgid ""
+"% nasm -f elf hex.asm\n"
+"% ld -s -o hex hex.o\n"
+"% ./hex\n"
+"Hello, World!\n"
+"Here I come!\n"
+"48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A\n"
+"48 65 72 65 20 49 20 63 6F 6D 65 21 0A\n"
+"^D %\n"
+msgstr ""
+"% nasm -f elf hex.asm\n"
+"% ld -s -o hex hex.o\n"
+"% ./hex\n"
+"Hello, World!\n"
+"Here I come!\n"
+"48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 0A\n"
+"48 65 72 65 20 49 20 63 6F 6D 65 21 0A\n"
+"^D %\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:948
+msgid ""
+"Not what you expected? The program did not print the output until we pressed "
+"`^D`. That is easy to fix by inserting three lines of code to write the "
+"output every time we have converted a new line to `0A`. I have marked the "
+"three lines with > (do not copy the > in your [.filename]#hex.asm#)."
+msgstr ""
+"Не то, что вы ожидали? Программа не выводила результат, пока мы не нажали "
+"`^D`. Это легко исправить, добавив три строки кода для вывода результата "
+"каждый раз, когда мы преобразуем новую строку в `0A`. Я пометил эти три "
+"строки символом > (не копируйте > в ваш [.filename]#hex.asm#)."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:996
+#, no-wrap
+msgid ""
+".put:\n"
+"\tcall\tputchar\n"
+">\tcmp\tal, 0Ah\n"
+">\tjne\t.loop\n"
+">\tcall\twrite\n"
+"\tjmp\tshort .loop\n"
+msgstr ""
+".put:\n"
+"\tcall\tputchar\n"
+">\tcmp\tal, 0Ah\n"
+">\tjne\t.loop\n"
+">\tcall\twrite\n"
+"\tjmp\tshort .loop\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1050
+msgid "Now, let us see how it works:"
+msgstr "Теперь давайте посмотрим, как это работает:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1064
+msgid "Not bad for a 644-byte executable, is it!"
+msgstr "Неплохо для исполняемого файла размером 644 байта, не так ли!"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1069
+msgid ""
+"This approach to buffered input/output still contains a hidden danger. I "
+"will discuss-and fix-it later, when I talk about the crossref:x86[x86-"
+"buffered-dark-side,dark side of buffering]."
+msgstr ""
+"Такой подход к буферизированному вводу/выводу всё ещё содержит скрытую "
+"опасность. Я расскажу об этом и исправлю её позже, когда речь пойдёт о "
+"crossref:x86[x86-buffered-dark-side,тёмной стороне буферизации]."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1072
+#, no-wrap
+msgid "How to Unread a Character"
+msgstr "Как отменить чтение символа"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1078
+msgid ""
+"This may be a somewhat advanced topic, mostly of interest to programmers "
+"familiar with the theory of compilers. If you wish, you may "
+"crossref:x86[x86-command-line,skip to the next section], and perhaps read "
+"this later."
+msgstr ""
+"Это может быть несколько сложной темой, в основном представляющей интерес "
+"для программистов, знакомых с теорией компиляторов. Если хотите, вы можете "
+"crossref:x86[x86-command-line, перейти к следующему разделу], и, возможно, "
+"прочитаете это позже."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1084
+msgid ""
+"While our sample program does not require it, more sophisticated filters "
+"often need to look ahead. In other words, they may need to see what the "
+"next character is (or even several characters). If the next character is of "
+"a certain value, it is part of the token currently being processed. "
+"Otherwise, it is not."
+msgstr ""
+"Хотя наш пример программы не требует этого, более сложные фильтры часто "
+"нуждаются в предварительном просмотре. Другими словами, им может "
+"потребоваться узнать, какой следующий символ (или даже несколько символов). "
+"Если следующий символ имеет определённое значение, он является частью "
+"текущего обрабатываемого токена. В противном случае — нет."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1088
+msgid ""
+"For example, you may be parsing the input stream for a textual string (e.g., "
+"when implementing a language compiler): If a character is followed by "
+"another character, or perhaps a digit, it is part of the token you are "
+"processing. If it is followed by white space, or some other value, then it "
+"is not part of the current token."
+msgstr ""
+"Например, вы можете анализировать входной поток на наличие текстовой строки "
+"(например, при реализации компилятора языка): если символ следует за другим "
+"символом или, возможно, цифрой, он является частью обрабатываемой лексемы. "
+"Если за ним следует пробел или другое значение, то он не является частью "
+"текущей лексемы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1090
+msgid ""
+"This presents an interesting problem: How to return the next character back "
+"to the input stream, so it can be read again later?"
+msgstr ""
+"Это представляет интересную проблему: как вернуть следующий символ обратно "
+"во входной поток, чтобы его можно было прочитать позже?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1094
+msgid ""
+"One possible solution is to store it in a character variable, then set a "
+"flag. We can modify `getchar` to check the flag, and if it is set, fetch "
+"the byte from that variable instead of the input buffer, and reset the "
+"flag. But, of course, that slows us down."
+msgstr ""
+"Одно из возможных решений — сохранить его в символьной переменной, а затем "
+"установить флаг. Мы можем изменить `getchar`, чтобы он проверял флаг, и если "
+"он установлен, извлекал байт из этой переменной вместо буфера ввода, а затем "
+"сбрасывал флаг. Но, конечно, это замедляет работу."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1099
+msgid ""
+"The C language has an `ungetc()` function, just for that purpose. Is there "
+"a quick way to implement it in our code? I would like you to scroll back up "
+"and take a look at the `getchar` procedure and see if you can find a nice "
+"and fast solution before reading the next paragraph. Then come back here "
+"and see my own solution."
+msgstr ""
+"В языке C есть функция `ungetc()`, как раз для этой цели. Есть ли быстрый "
+"способ реализовать её в нашем коде? Я хочу, чтобы вы пролистали назад и "
+"взглянули на процедуру `getchar`, и попробовали найти красивое и быстрое "
+"решение, прежде чем читать следующий абзац. Затем вернитесь сюда и "
+"посмотрите моё собственное решение."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1101
+msgid ""
+"The key to returning a character back to the stream is in how we are getting "
+"the characters to start with:"
+msgstr ""
+"Ключом к возвращению символа обратно в поток является то, как мы получаем "
+"символы изначально:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1104
+msgid ""
+"First we check if the buffer is empty by testing the value of `EBX`. If it "
+"is zero, we call the `read` procedure."
+msgstr ""
+"Сначала проверяем, пуст ли буфер, проверяя значение `EBX`. Если оно равно "
+"нулю, вызываем процедуру `read`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1107
+msgid ""
+"If we do have a character available, we use `lodsb`, then decrease the value "
+"of `EBX`. The `lodsb` instruction is effectively identical to:"
+msgstr ""
+"Если у нас есть доступный символ, мы используем `lodsb`, затем уменьшаем "
+"значение `EBX`. Инструкция `lodsb` фактически идентична:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1112
+#, no-wrap
+msgid ""
+"mov\tal, [esi]\n"
+"\tinc\tesi\n"
+msgstr ""
+"mov\tal, [esi]\n"
+"\tinc\tesi\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1117
+msgid ""
+"The byte we have fetched remains in the buffer until the next time `read` is "
+"called. We do not know when that happens, but we do know it will not happen "
+"until the next call to `getchar`. Hence, to \"return\" the last-read byte "
+"back to the stream, all we have to do is decrease the value of `ESI` and "
+"increase the value of `EBX`:"
+msgstr ""
+"Байт, который мы извлекли, остается в буфере до следующего вызова `read`. Мы "
+"не знаем, когда это произойдет, но знаем, что этого не случится до "
+"следующего вызова `getchar`. Следовательно, чтобы \"вернуть\" последний "
+"прочитанный байт обратно в поток, нам достаточно уменьшить значение `ESI` и "
+"увеличить значение `EBX`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1124
+#, no-wrap
+msgid ""
+"ungetc:\n"
+"\tdec\tesi\n"
+"\tinc\tebx\n"
+"\tret\n"
+msgstr ""
+"ungetc:\n"
+"\tdec\tesi\n"
+"\tinc\tebx\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1128
+msgid ""
+"But, be careful! We are perfectly safe doing this if our look-ahead is at "
+"most one character at a time. If we are examining more than one upcoming "
+"character and call `ungetc` several times in a row, it will work most of the "
+"time, but not all the time (and will be tough to debug). Why?"
+msgstr ""
+"Но будьте осторожны! Мы в полной безопасности, если заглядываем вперед "
+"только на один символ за раз. Если же мы проверяем несколько следующих "
+"символов и вызываем `ungetc` несколько раз подряд, это будет работать в "
+"большинстве случаев, но не всегда (и ошибки будет сложно отладить). Почему?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1131
+msgid ""
+"Because as long as `getchar` does not have to call `read`, all of the pre-"
+"read bytes are still in the buffer, and our `ungetc` works without a "
+"glitch. But the moment `getchar` calls `read`, the contents of the buffer "
+"change."
+msgstr ""
+"Потому что пока `getchar` не вызывает `read`, все предварительно прочитанные "
+"байты остаются в буфере, и наш `ungetc` работает без сбоев. Но как только "
+"`getchar` вызывает `read`, содержимое буфера изменяется."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1133
+msgid ""
+"We can always rely on `ungetc` working properly on the last character we "
+"have read with `getchar`, but not on anything we have read before that."
+msgstr ""
+"Мы всегда можем рассчитывать на корректную работу `ungetc` с последним "
+"символом, прочитанным через `getchar`, но не с любым символом, прочитанным "
+"до этого."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1135
+msgid ""
+"If your program reads more than one byte ahead, you have at least two "
+"choices:"
+msgstr ""
+"Если ваша программа читает более одного байта вперед, у вас есть как минимум "
+"два варианта:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1138
+msgid ""
+"If possible, modify the program so it only reads one byte ahead. This is "
+"the simplest solution."
+msgstr ""
+"Если возможно, измените программу так, чтобы она читала только один байт "
+"вперед. Это самое простое решение."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1142
+msgid ""
+"If that option is not available, first of all determine the maximum number "
+"of characters your program needs to return to the input stream at one time. "
+"Increase that number slightly, just to be sure, preferably to a multiple of "
+"16-so it aligns nicely. Then modify the `.bss` section of your code, and "
+"create a small \"spare\" buffer right before your input buffer, something "
+"like this:"
+msgstr ""
+"Если эта опция недоступна, сначала определите максимальное количество "
+"символов, которое вашей программе может потребоваться вернуть во входной "
+"поток за один раз. Увеличьте это число немного, чтобы быть уверенным, "
+"предпочтительно до кратного 16 — так оно будет лучше выровнено. Затем "
+"измените секцию `.bss` в вашем коде и создайте небольшой \"запасной\" буфер "
+"прямо перед вашим входным буфером, примерно так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1149
+#, no-wrap
+msgid ""
+"section\t.bss\n"
+"\tresb\t16\t; or whatever the value you came up with\n"
+"ibuffer\tresb\tBUFSIZE\n"
+"obuffer\tresb\tBUFSIZE\n"
+msgstr ""
+"section\t.bss\n"
+"\tresb\t16\t; or whatever the value you came up with\n"
+"ibuffer\tresb\tBUFSIZE\n"
+"obuffer\tresb\tBUFSIZE\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1152
+msgid ""
+"You also need to modify your `ungetc` to pass the value of the byte to unget "
+"in `AL`:"
+msgstr ""
+"Вам также необходимо изменить ваш `ungetc`, чтобы передать значение байта "
+"для возврата в `AL`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1160
+#, no-wrap
+msgid ""
+"ungetc:\n"
+"\tdec\tesi\n"
+"\tinc\tebx\n"
+"\tmov\t[esi], al\n"
+"\tret\n"
+msgstr ""
+"ungetc:\n"
+"\tdec\tesi\n"
+"\tinc\tebx\n"
+"\tmov\t[esi], al\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1163
+msgid ""
+"With this modification, you can call `ungetc` up to 17 times in a row safely "
+"(the first call will still be within the buffer, the remaining 16 may be "
+"either within the buffer or within the \"spare\")."
+msgstr ""
+"С этим изменением вы можете безопасно вызывать `ungetc` до 17 раз подряд "
+"(первый вызов всё ещё будет в пределах буфера, остальные 16 могут быть либо "
+"в пределах буфера, либо в пределах \"запасного\" пространства)."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1165
+#, no-wrap
+msgid "Command Line Arguments"
+msgstr "Аргументы командной строки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1169
+msgid ""
+"Our hex program will be more useful if it can read the names of an input and "
+"output file from its command line, i.e., if it can process the command line "
+"arguments. But... Where are they?"
+msgstr ""
+"Наша программа hex будет полезнее, если она сможет читать имена входного и "
+"выходного файлов из командной строки, т.е. если она сможет обрабатывать "
+"аргументы командной строки. Но... Где они?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1173
+msgid ""
+"Before a UNIX(R) system starts a program, it ``push``es some data on the "
+"stack, then jumps at the `_start` label of the program. Yes, I said jumps, "
+"not calls. That means the data can be accessed by reading `[esp+offset]`, "
+"or by simply ``pop``ping it."
+msgstr ""
+"Прежде чем UNIX(R) система запустит программу, она делает ``push`` для "
+"некоторых данных, помещая их в стек, затем переходит к метке `_start` "
+"программы. Да, я сказал \"переходит\", а не \"вызывает\". Это означает, что "
+"данные можно прочитать с помощью `[esp+offset]` или просто сделать ``pop`` "
+"для них."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1176
+msgid ""
+"The value at the top of the stack contains the number of command line "
+"arguments. It is traditionally called `argc`, for \"argument count.\""
+msgstr ""
+"Значение на вершине стека содержит количество аргументов командной строки. "
+"Оно традиционно называется `argc`, что означает \"argument count\"."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1181
+msgid ""
+"Command line arguments follow next, all `argc` of them. These are typically "
+"referred to as `argv`, for \"argument value(s).\" That is, we get `argv[0]`, "
+"`argv[1]`, `...`, `argv[argc-1]`. These are not the actual arguments, but "
+"pointers to arguments, i.e., memory addresses of the actual arguments. The "
+"arguments themselves are NUL-terminated character strings."
+msgstr ""
+"Далее следуют аргументы командной строки, все `argc` штук. Обычно их "
+"называют `argv`, что означает \"значение(я) аргумента\". То есть мы получаем "
+"`argv[0]`, `argv[1]`, `...`, `argv[argc-1]`. Это не сами аргументы, а "
+"указатели на аргументы, то есть адреса памяти, где находятся реальные "
+"аргументы. Сами аргументы представляют собой строки символов, завершающиеся "
+"нулевым символом ('\\0')."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1183
+msgid ""
+"The `argv` list is followed by a NULL pointer, which is simply a `0`. There "
+"is more, but this is enough for our purposes right now."
+msgstr ""
+"Список `argv` завершается указателем NULL, который представляет собой просто "
+"`0`. Есть и другие детали, но пока этого достаточно для наших целей."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1188
+msgid ""
+"If you have come from the MS-DOS(R) programming environment, the main "
+"difference is that each argument is in a separate string. The second "
+"difference is that there is no practical limit on how many arguments there "
+"can be."
+msgstr ""
+"Если вы перешли из среды программирования MS-DOS(R), основное различие "
+"заключается в том, что каждый аргумент находится в отдельной строке. Второе "
+"различие состоит в том, что нет практического ограничения на количество "
+"аргументов."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1192
+msgid ""
+"Armed with this knowledge, we are almost ready for the next version of "
+"[.filename]#hex.asm#. First, however, we need to add a few lines to "
+"[.filename]#system.inc#:"
+msgstr ""
+"Вооружившись этими знаниями, мы почти готовы к следующей версии "
+"[.filename]#hex.asm#. Однако сначала нам нужно добавить несколько строк в "
+"[.filename]#system.inc#:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1194
+msgid ""
+"First, we need to add two new entries to our list of system call numbers:"
+msgstr ""
+"Сначала нам нужно добавить две новые записи в наш список номеров системных "
+"вызовов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1199
+#, no-wrap
+msgid ""
+"%define\tSYS_open\t5\n"
+"%define\tSYS_close\t6\n"
+msgstr ""
+"%define\tSYS_open\t5\n"
+"%define\tSYS_close\t6\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1202
+msgid "Then we add two new macros at the end of the file:"
+msgstr "Затем мы добавляем два новых макроса в конце файла:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1208
+#, no-wrap
+msgid ""
+"%macro\tsys.open\t0\n"
+"\tsystem\tSYS_open\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.open\t0\n"
+"\tsystem\tSYS_open\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1212
+#, no-wrap
+msgid ""
+"%macro\tsys.close\t0\n"
+"\tsystem\tSYS_close\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.close\t0\n"
+"\tsystem\tSYS_close\n"
+"%endmacro\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1215
+msgid "Here, then, is our modified source code:"
+msgstr "Вот наш измененный исходный код:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1226
+#, no-wrap
+msgid ""
+"section\t.data\n"
+"fd.in\tdd\tstdin\n"
+"fd.out\tdd\tstdout\n"
+"hex\tdb\t'0123456789ABCDEF'\n"
+msgstr ""
+"section\t.data\n"
+"fd.in\tdd\tstdin\n"
+"fd.out\tdd\tstdout\n"
+"hex\tdb\t'0123456789ABCDEF'\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1236
+#, no-wrap
+msgid ""
+"section\t.text\n"
+"align 4\n"
+"err:\n"
+"\tpush\tdword 1\t\t; return failure\n"
+"\tsys.exit\n"
+msgstr ""
+"section\t.text\n"
+"align 4\n"
+"err:\n"
+"\tpush\tdword 1\t\t; return failure\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1241
+#, no-wrap
+msgid ""
+"align 4\n"
+"global\t_start\n"
+"_start:\n"
+"\tadd\tesp, byte 8\t; discard argc and argv[0]\n"
+msgstr ""
+"align 4\n"
+"global\t_start\n"
+"_start:\n"
+"\tadd\tesp, byte 8\t; discard argc and argv[0]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1244
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1256
+#, no-wrap
+msgid ""
+"\tpop\tecx\n"
+"\tjecxz\t.init\t\t; no more arguments\n"
+msgstr ""
+"\tpop\tecx\n"
+"\tjecxz\t.init\t\t; no more arguments\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1250
+#, no-wrap
+msgid ""
+"\t; ECX contains the path to input file\n"
+"\tpush\tdword 0\t\t; O_RDONLY\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\terr\t\t; open failed\n"
+msgstr ""
+"\t; ECX contains the path to input file\n"
+"\tpush\tdword 0\t\t; O_RDONLY\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\terr\t\t; open failed\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1253
+#, no-wrap
+msgid ""
+"\tadd\tesp, byte 8\n"
+"\tmov\t[fd.in], eax\n"
+msgstr ""
+"\tadd\tesp, byte 8\n"
+"\tmov\t[fd.in], eax\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1264
+#, no-wrap
+msgid ""
+"\t; ECX contains the path to output file\n"
+"\tpush\tdword 420\t; file mode (644 octal)\n"
+"\tpush\tdword 0200h | 0400h | 01h\n"
+"\t; O_CREAT | O_TRUNC | O_WRONLY\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\terr\n"
+msgstr ""
+"\t; ECX contains the path to output file\n"
+"\tpush\tdword 420\t; file mode (644 octal)\n"
+"\tpush\tdword 0200h | 0400h | 01h\n"
+"\t; O_CREAT | O_TRUNC | O_WRONLY\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\terr\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1267
+#, no-wrap
+msgid ""
+"\tadd\tesp, byte 12\n"
+"\tmov\t[fd.out], eax\n"
+msgstr ""
+"\tadd\tesp, byte 12\n"
+"\tmov\t[fd.out], eax\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1273
+#, no-wrap
+msgid ""
+".init:\n"
+"\tsub\teax, eax\n"
+"\tsub\tebx, ebx\n"
+"\tsub\tecx, ecx\n"
+"\tmov\tedi, obuffer\n"
+msgstr ""
+".init:\n"
+"\tsub\teax, eax\n"
+"\tsub\tebx, ebx\n"
+"\tsub\tecx, ecx\n"
+"\tmov\tedi, obuffer\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1277
+#, no-wrap
+msgid ""
+".loop:\n"
+"\t; read a byte from input file or stdin\n"
+"\tcall\tgetchar\n"
+msgstr ""
+".loop:\n"
+"\t; read a byte from input file or stdin\n"
+"\tcall\tgetchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1300
+#, no-wrap
+msgid ""
+".put:\n"
+"\tcall\tputchar\n"
+"\tcmp\tal, dl\n"
+"\tjne\t.loop\n"
+"\tcall\twrite\n"
+"\tjmp\tshort .loop\n"
+msgstr ""
+".put:\n"
+"\tcall\tputchar\n"
+"\tcmp\tal, dl\n"
+"\tjne\t.loop\n"
+"\tcall\twrite\n"
+"\tjmp\tshort .loop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1325
+#, no-wrap
+msgid ""
+"read:\n"
+"\tpush\tdword BUFSIZE\n"
+"\tmov\tesi, ibuffer\n"
+"\tpush\tesi\n"
+"\tpush\tdword [fd.in]\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tmov\tebx, eax\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+msgstr ""
+"read:\n"
+"\tpush\tdword BUFSIZE\n"
+"\tmov\tesi, ibuffer\n"
+"\tpush\tesi\n"
+"\tpush\tdword [fd.in]\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tmov\tebx, eax\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1329
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2562
+#, no-wrap
+msgid ""
+"align 4\n"
+".done:\n"
+"\tcall\twrite\t\t; flush output buffer\n"
+msgstr ""
+"align 4\n"
+".done:\n"
+"\tcall\twrite\t\t; flush output buffer\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1333
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2566
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3820
+#, no-wrap
+msgid ""
+"\t; close files\n"
+"\tpush\tdword [fd.in]\n"
+"\tsys.close\n"
+msgstr ""
+"\t; close files\n"
+"\tpush\tdword [fd.in]\n"
+"\tsys.close\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1336
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2569
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3823
+#, no-wrap
+msgid ""
+"\tpush\tdword [fd.out]\n"
+"\tsys.close\n"
+msgstr ""
+"\tpush\tdword [fd.out]\n"
+"\tsys.close\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1340
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2573
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3829
+#, no-wrap
+msgid ""
+"\t; return success\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+msgstr ""
+"\t; return success\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1360
+#, no-wrap
+msgid ""
+"align 4\n"
+"write:\n"
+"\tsub\tedi, ecx\t; start of buffer\n"
+"\tpush\tecx\n"
+"\tpush\tedi\n"
+"\tpush\tdword [fd.out]\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tsub\teax, eax\n"
+"\tsub\tecx, ecx\t; buffer is empty now\n"
+"\tret\n"
+msgstr ""
+"align 4\n"
+"write:\n"
+"\tsub\tedi, ecx\t; start of buffer\n"
+"\tpush\tecx\n"
+"\tpush\tedi\n"
+"\tpush\tdword [fd.out]\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tsub\teax, eax\n"
+"\tsub\tecx, ecx\t; buffer is empty now\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1364
+msgid ""
+"In our `.data` section we now have two new variables, `fd.in` and `fd.out`. "
+"We store the input and output file descriptors here."
+msgstr ""
+"В нашем разделе `.data` теперь есть две новые переменные, `fd.in` и "
+"`fd.out`. Здесь мы сохраняем дескрипторы файлов для ввода и вывода."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1366
+msgid ""
+"In the `.text` section we have replaced the references to `stdin` and "
+"`stdout` with `[fd.in]` and `[fd.out]`."
+msgstr ""
+"В разделе `.text` мы заменили ссылки с `stdin` и `stdout` на `[fd.in]` и "
+"`[fd.out]`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1369
+msgid ""
+"The `.text` section now starts with a simple error handler, which does "
+"nothing but exit the program with a return value of `1`. The error handler "
+"is before `_start` so we are within a short distance from where the errors "
+"occur."
+msgstr ""
+"Раздел `.text` теперь начинается с простого обработчика ошибок, который "
+"просто завершает программу с кодом возврата `1`. Обработчик ошибок "
+"расположен перед `_start`, чтобы находиться вблизи от места возникновения "
+"ошибок."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1372
+msgid ""
+"Naturally, the program execution still begins at `_start`. First, we remove "
+"`argc` and `argv[0]` from the stack: They are of no interest to us (in this "
+"program, that is)."
+msgstr ""
+"Естественно, выполнение программы по-прежнему начинается с `_start`. Сначала "
+"мы удаляем `argc` и `argv[0]` из стека: они не представляют для нас интереса "
+"(по крайней мере, в этой программе)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1378
+msgid ""
+"We pop `argv[1]` to `ECX`. This register is particularly suited for "
+"pointers, as we can handle NULL pointers with `jecxz`. If `argv[1]` is not "
+"NULL, we try to open the file named in the first argument. Otherwise, we "
+"continue the program as before: Reading from `stdin`, writing to `stdout`. "
+"If we fail to open the input file (e.g., it does not exist), we jump to the "
+"error handler and quit."
+msgstr ""
+"Мы помещаем `argv[1]` в `ECX`. Этот регистр особенно подходит для "
+"указателей, так как мы можем обрабатывать NULL-указатели с помощью `jecxz`. "
+"Если `argv[1]` не равен NULL, мы пытаемся открыть файл с именем, указанным в "
+"первом аргументе. В противном случае продолжаем программу как раньше: чтение "
+"из `stdin`, запись в `stdout`. Если нам не удаётся открыть входной файл "
+"(например, он не существует), мы переходим к обработчику ошибок и завершаем "
+"работу."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1383
+msgid ""
+"If all went well, we now check for the second argument. If it is there, we "
+"open the output file. Otherwise, we send the output to `stdout`. If we "
+"fail to open the output file (e.g., it exists and we do not have the write "
+"permission), we, again, jump to the error handler."
+msgstr ""
+"Если всё прошло успешно, мы проверяем второй аргумент. Если он присутствует, "
+"мы открываем выходной файл. В противном случае, мы отправляем вывод в "
+"`stdout`. Если нам не удаётся открыть выходной файл (например, он существует "
+"и у нас нет прав на запись), мы снова переходим к обработчику ошибок."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1385
+msgid ""
+"The rest of the code is the same as before, except we close the input and "
+"output files before exiting, and, as mentioned, we use `[fd.in]` and "
+"`[fd.out]`."
+msgstr ""
+"Остальная часть кода остается прежней, за исключением того, что мы закрываем "
+"входной и выходной файлы перед завершением, и, как упоминалось, используем "
+"`[fd.in]` и `[fd.out]`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1387
+msgid "Our executable is now a whopping 768 bytes long."
+msgstr "Наш исполняемый файл теперь имеет внушительный размер в 768 байт."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1390
+msgid ""
+"Can we still improve it? Of course! Every program can be improved. Here are "
+"a few ideas of what we could do:"
+msgstr ""
+"Можем ли мы улучшить его еще? Конечно! Каждую программу можно улучшить. Вот "
+"несколько идей, что мы могли бы сделать:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1392
+msgid "Have our error handler print a message to `stderr`."
+msgstr "Сделать наш обработчик ошибок, выводящий сообщение в `stderr`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1393
+msgid "Add error handlers to the `read` and `write` functions."
+msgstr "Добавить обработчики ошибок в функции `read` и `write`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1394
+msgid ""
+"Close `stdin` when we open an input file, `stdout` when we open an output "
+"file."
+msgstr ""
+"Закрывать `stdin` при открытии входного файла, `stdout` при открытии "
+"выходного файла."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1395
+msgid ""
+"Add command line switches, such as `-i` and `-o`, so we can list the input "
+"and output files in any order, or perhaps read from `stdin` and write to a "
+"file."
+msgstr ""
+"Добавить параметры командной строки, такие как `-i` и `-o`, чтобы можно было "
+"перечислять входные и выходные файлы в любом порядке или, возможно, читать "
+"из `stdin` и записывать в файл."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1396
+msgid "Print a usage message if command line arguments are incorrect."
+msgstr ""
+"Выводить сообщение с подсказкой об использовании программы, если аргументы "
+"командной строки указаны неверно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1398
+msgid ""
+"I shall leave these enhancements as an exercise to the reader: You already "
+"know everything you need to know to implement them."
+msgstr ""
+"Я оставлю эти улучшения в качестве упражнения для читателя: вы уже знаете "
+"всё необходимое для их реализации."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1400
+#, no-wrap
+msgid "UNIX(R) Environment"
+msgstr "Окружение UNIX(R)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1404
+msgid ""
+"An important UNIX(R) concept is the environment, which is defined by "
+"_environment variables_. Some are set by the system, others by you, yet "
+"others by the shell, or any program that loads another program."
+msgstr ""
+"Важным концептом UNIX(R) является окружение, которое определяется "
+"_переменными окружения_. Некоторые из них устанавливаются системой, другие — "
+"пользователем, третьи — оболочкой или любой программой, которая загружает "
+"другую программу."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1406
+#, no-wrap
+msgid "How to Find Environment Variables"
+msgstr "Как найти переменные окружения"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1411
+msgid ""
+"I said earlier that when a program starts executing, the stack contains "
+"`argc` followed by the NULL-terminated `argv` array, followed by something "
+"else. The \"something else\" is the _environment_, or, to be more precise, "
+"a NULL-terminated array of pointers to _environment variables_. This is "
+"often referred to as `env`."
+msgstr ""
+"Я говорил ранее, что когда программа начинает выполняться, в стеке находятся "
+"`argc`, за которым следует массив `argv`, завершающийся NULL, а затем что-то "
+"ещё. Это \"что-то ещё\" — это _окружение_, или, если быть точнее, массив "
+"указателей на _переменные окружения_, завершающийся NULL. Это часто называют "
+"`env`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1414
+msgid ""
+"The structure of `env` is the same as that of `argv`, a list of memory "
+"addresses followed by a NULL (`0`). In this case, there is no `\"envc\"`-we "
+"figure out where the array ends by searching for the final NULL."
+msgstr ""
+"Структура `env` такая же, как у `argv` — список адресов памяти, "
+"заканчивающийся NULL (`0`). В данном случае нет `\"envc\"` — конец массива "
+"определяется поиском последнего NULL."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1417
+msgid ""
+"The variables usually come in the `name=value` format, but sometimes the "
+"`=value` part may be missing. We need to account for that possibility."
+msgstr ""
+"Переменные обычно имеют формат `name=value`, но иногда часть `=value` может "
+"отсутствовать. Необходимо учитывать эту вероятность."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1419
+#, no-wrap
+msgid "webvars"
+msgstr "webvars"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1423
+msgid ""
+"I could just show you some code that prints the environment the same way the "
+"UNIX(R) env command does. But I thought it would be more interesting to "
+"write a simple assembly language CGI utility."
+msgstr ""
+"Я мог бы просто показать вам код, который выводит окружение так же, как "
+"команда UNIX(R) env. Но я подумал, что будет интереснее написать простую CGI-"
+"утилиту на ассемблере."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1425
+#, no-wrap
+msgid "CGI: a Quick Overview"
+msgstr "CGI: краткий обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1428
+msgid ""
+"I have a http://www.whizkidtech.redprince.net/cgi-bin/tutorial[detailed CGI "
+"tutorial] on my web site, but here is a very quick overview of CGI:"
+msgstr ""
+"У меня есть http://www.whizkidtech.redprince.net/cgi-bin/tutorial[подробное "
+"руководство по CGI] на моем веб-сайте, но вот очень краткий обзор CGI:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1430
+msgid ""
+"The web server communicates with the CGI program by setting _environment "
+"variables_."
+msgstr ""
+"Веб-сервер взаимодействует с CGI-программой, устанавливая _переменные "
+"окружения_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1431
+msgid ""
+"The CGI program sends its output to [.filename]#stdout#. The web server "
+"reads it from there."
+msgstr ""
+"Программа CGI отправляет свой вывод в [.filename]#stdout#. Веб-сервер "
+"считывает его оттуда."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1432
+msgid "It must start with an HTTP header followed by two blank lines."
+msgstr ""
+"Он должен начинаться с HTTP-заголовка, за которым следуют две пустые строки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1433
+msgid ""
+"It then prints the HTML code, or whatever other type of data it is producing."
+msgstr ""
+"Затем он выводит HTML-код или любые другие данные, которые он генерирует."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1438
+msgid ""
+"While certain _environment variables_ use standard names, others vary, "
+"depending on the web server. That makes webvars quite a useful diagnostic "
+"tool."
+msgstr ""
+"В то время как некоторые _переменные окружения_ используют стандартные "
+"имена, другие различаются в зависимости от веб-сервера. Это делает программу "
+"webvars весьма полезным инструментом для диагностики."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1441
+#, no-wrap
+msgid "The Code"
+msgstr "Код"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1445
+msgid ""
+"Our webvars program, then, must send out the HTTP header followed by some "
+"HTML mark-up. It then must read the _environment variables_ one by one and "
+"send them out as part of the HTML page."
+msgstr ""
+"Наша программа webvars, таким образом, должна отправить HTTP-заголовок, за "
+"которым следует HTML-разметка. Затем она должна прочитать _переменные "
+"окружения_ одну за другой и отправить их как часть HTML-страницы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1448
+msgid ""
+"The code follows. I placed comments and explanations right inside the code:"
+msgstr "Код приведен ниже. Я разместил комментарии и пояснения прямо в коде:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1485
+#, no-wrap
+msgid ""
+";;;;;;; webvars.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";\n"
+"; Copyright (c) 2000 G. Adam Stanislav\n"
+"; All rights reserved.\n"
+";\n"
+"; Redistribution and use in source and binary forms, with or without\n"
+"; modification, are permitted provided that the following conditions\n"
+"; are met:\n"
+"; 1. Redistributions of source code must retain the above copyright\n"
+"; notice, this list of conditions and the following disclaimer.\n"
+"; 2. Redistributions in binary form must reproduce the above copyright\n"
+"; notice, this list of conditions and the following disclaimer in the\n"
+"; documentation and/or other materials provided with the distribution.\n"
+";\n"
+"; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n"
+"; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n"
+"; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n"
+"; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n"
+"; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n"
+"; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n"
+"; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n"
+"; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n"
+"; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n"
+"; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n"
+"; SUCH DAMAGE.\n"
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";\n"
+"; Version 1.0\n"
+";\n"
+"; Started:\t 8-Dec-2000\n"
+"; Updated:\t 8-Dec-2000\n"
+";\n"
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+"%include\t'system.inc'\n"
+msgstr ""
+";;;;;;; webvars.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";\n"
+"; Copyright (c) 2000 G. Adam Stanislav\n"
+"; All rights reserved.\n"
+";\n"
+"; Redistribution and use in source and binary forms, with or without\n"
+"; modification, are permitted provided that the following conditions\n"
+"; are met:\n"
+"; 1. Redistributions of source code must retain the above copyright\n"
+"; notice, this list of conditions and the following disclaimer.\n"
+"; 2. Redistributions in binary form must reproduce the above copyright\n"
+"; notice, this list of conditions and the following disclaimer in the\n"
+"; documentation and/or other materials provided with the distribution.\n"
+";\n"
+"; THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n"
+"; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n"
+"; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n"
+"; ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n"
+"; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n"
+"; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n"
+"; OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n"
+"; HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n"
+"; LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n"
+"; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n"
+"; SUCH DAMAGE.\n"
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";\n"
+"; Version 1.0\n"
+";\n"
+"; Started:\t 8-Dec-2000\n"
+"; Updated:\t 8-Dec-2000\n"
+";\n"
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+"%include\t'system.inc'\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1522
+#, no-wrap
+msgid ""
+"section\t.data\n"
+"http\tdb\t'Content-type: text/html', 0Ah, 0Ah\n"
+"\tdb\t'<?xml version=\"1.0\" encoding=\"utf-8\"?>', 0Ah\n"
+"\tdb\t'<!DOCTYPE html PUBLIC \"-//W3C/DTD XHTML Strict//EN\" '\n"
+"\tdb\t'\"DTD/xhtml1-strict.dtd\">', 0Ah\n"
+"\tdb\t'<html xmlns=\"http://www.w3.org/1999/xhtml\" '\n"
+"\tdb\t'xml.lang=\"en\" lang=\"en\">', 0Ah\n"
+"\tdb\t'<head>', 0Ah\n"
+"\tdb\t'<title>Web Environment</title>', 0Ah\n"
+"\tdb\t'<meta name=\"author\" content=\"G. Adam Stanislav\" />', 0Ah\n"
+"\tdb\t'</head>', 0Ah, 0Ah\n"
+"\tdb\t'<body bgcolor=\"#ffffff\" text=\"#000000\" link=\"#0000ff\" '\n"
+"\tdb\t'vlink=\"#840084\" alink=\"#0000ff\">', 0Ah\n"
+"\tdb\t'<div class=\"webvars\">', 0Ah\n"
+"\tdb\t'<h1>Web Environment</h1>', 0Ah\n"
+"\tdb\t'<p>The following <b>environment variables</b> are defined '\n"
+"\tdb\t'on this web server:</p>', 0Ah, 0Ah\n"
+"\tdb\t'<table align=\"center\" width=\"80\" border=\"0\" cellpadding=\"10\" '\n"
+"\tdb\t'cellspacing=\"0\" class=\"webvars\">', 0Ah\n"
+"httplen\tequ\t$-http\n"
+"left\tdb\t'<tr>', 0Ah\n"
+"\tdb\t'<td class=\"name\"><tt>'\n"
+"leftlen\tequ\t$-left\n"
+"middle\tdb\t'</tt></td>', 0Ah\n"
+"\tdb\t'<td class=\"value\"><tt><b>'\n"
+"midlen\tequ\t$-middle\n"
+"undef\tdb\t'<i>(undefined)</i>'\n"
+"undeflen\tequ\t$-undef\n"
+"right\tdb\t'</b></tt></td>', 0Ah\n"
+"\tdb\t'</tr>', 0Ah\n"
+"rightlen\tequ\t$-right\n"
+"wrap\tdb\t'</table>', 0Ah\n"
+"\tdb\t'</div>', 0Ah\n"
+"\tdb\t'</body>', 0Ah\n"
+"\tdb\t'</html>', 0Ah, 0Ah\n"
+"wraplen\tequ\t$-wrap\n"
+msgstr ""
+"section\t.data\n"
+"http\tdb\t'Content-type: text/html', 0Ah, 0Ah\n"
+"\tdb\t'<?xml version=\"1.0\" encoding=\"utf-8\"?>', 0Ah\n"
+"\tdb\t'<!DOCTYPE html PUBLIC \"-//W3C/DTD XHTML Strict//EN\" '\n"
+"\tdb\t'\"DTD/xhtml1-strict.dtd\">', 0Ah\n"
+"\tdb\t'<html xmlns=\"http://www.w3.org/1999/xhtml\" '\n"
+"\tdb\t'xml.lang=\"en\" lang=\"en\">', 0Ah\n"
+"\tdb\t'<head>', 0Ah\n"
+"\tdb\t'<title>Web Environment</title>', 0Ah\n"
+"\tdb\t'<meta name=\"author\" content=\"G. Adam Stanislav\" />', 0Ah\n"
+"\tdb\t'</head>', 0Ah, 0Ah\n"
+"\tdb\t'<body bgcolor=\"#ffffff\" text=\"#000000\" link=\"#0000ff\" '\n"
+"\tdb\t'vlink=\"#840084\" alink=\"#0000ff\">', 0Ah\n"
+"\tdb\t'<div class=\"webvars\">', 0Ah\n"
+"\tdb\t'<h1>Web Environment</h1>', 0Ah\n"
+"\tdb\t'<p>The following <b>environment variables</b> are defined '\n"
+"\tdb\t'on this web server:</p>', 0Ah, 0Ah\n"
+"\tdb\t'<table align=\"center\" width=\"80\" border=\"0\" cellpadding=\"10\" '\n"
+"\tdb\t'cellspacing=\"0\" class=\"webvars\">', 0Ah\n"
+"httplen\tequ\t$-http\n"
+"left\tdb\t'<tr>', 0Ah\n"
+"\tdb\t'<td class=\"name\"><tt>'\n"
+"leftlen\tequ\t$-left\n"
+"middle\tdb\t'</tt></td>', 0Ah\n"
+"\tdb\t'<td class=\"value\"><tt><b>'\n"
+"midlen\tequ\t$-middle\n"
+"undef\tdb\t'<i>(undefined)</i>'\n"
+"undeflen\tequ\t$-undef\n"
+"right\tdb\t'</b></tt></td>', 0Ah\n"
+"\tdb\t'</tr>', 0Ah\n"
+"rightlen\tequ\t$-right\n"
+"wrap\tdb\t'</table>', 0Ah\n"
+"\tdb\t'</div>', 0Ah\n"
+"\tdb\t'</body>', 0Ah\n"
+"\tdb\t'</html>', 0Ah, 0Ah\n"
+"wraplen\tequ\t$-wrap\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1532
+#, no-wrap
+msgid ""
+"section\t.text\n"
+"global\t_start\n"
+"_start:\n"
+"\t; First, send out all the http and xhtml stuff that is\n"
+"\t; needed before we start showing the environment\n"
+"\tpush\tdword httplen\n"
+"\tpush\tdword http\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+msgstr ""
+"section\t.text\n"
+"global\t_start\n"
+"_start:\n"
+"\t; First, send out all the http and xhtml stuff that is\n"
+"\t; needed before we start showing the environment\n"
+"\tpush\tdword httplen\n"
+"\tpush\tdword http\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1536
+#, no-wrap
+msgid ""
+"\t; Now find how far on the stack the environment pointers\n"
+"\t; are. We have 12 bytes we have pushed before \"argc\"\n"
+"\tmov\teax, [esp+12]\n"
+msgstr ""
+"\t; Now find how far on the stack the environment pointers\n"
+"\t; are. We have 12 bytes we have pushed before \"argc\"\n"
+"\tmov\teax, [esp+12]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1551
+#, no-wrap
+msgid ""
+"\t; We need to remove the following from the stack:\n"
+"\t;\n"
+"\t;\tThe 12 bytes we pushed for sys.write\n"
+"\t;\tThe 4 bytes of argc\n"
+"\t;\tThe EAX*4 bytes of argv\n"
+"\t;\tThe 4 bytes of the NULL after argv\n"
+"\t;\n"
+"\t; Total:\n"
+"\t;\t20 + eax * 4\n"
+"\t;\n"
+"\t; Because stack grows down, we need to ADD that many bytes\n"
+"\t; to ESP.\n"
+"\tlea\tesp, [esp+20+eax*4]\n"
+"\tcld\t\t; This should already be the case, but let's be sure.\n"
+msgstr ""
+"\t; We need to remove the following from the stack:\n"
+"\t;\n"
+"\t;\tThe 12 bytes we pushed for sys.write\n"
+"\t;\tThe 4 bytes of argc\n"
+"\t;\tThe EAX*4 bytes of argv\n"
+"\t;\tThe 4 bytes of the NULL after argv\n"
+"\t;\n"
+"\t; Total:\n"
+"\t;\t20 + eax * 4\n"
+"\t;\n"
+"\t; Because stack grows down, we need to ADD that many bytes\n"
+"\t; to ESP.\n"
+"\tlea\tesp, [esp+20+eax*4]\n"
+"\tcld\t\t; This should already be the case, but let's be sure.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1557
+#, no-wrap
+msgid ""
+"\t; Loop through the environment, printing it out\n"
+".loop:\n"
+"\tpop\tedi\n"
+"\tor\tedi, edi\t; Done yet?\n"
+"\tje\tnear .wrap\n"
+msgstr ""
+"\t; Loop through the environment, printing it out\n"
+".loop:\n"
+"\tpop\tedi\n"
+"\tor\tedi, edi\t; Done yet?\n"
+"\tje\tnear .wrap\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1563
+#, no-wrap
+msgid ""
+"\t; Print the left part of HTML\n"
+"\tpush\tdword leftlen\n"
+"\tpush\tdword left\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+msgstr ""
+"\t; Print the left part of HTML\n"
+"\tpush\tdword leftlen\n"
+"\tpush\tdword left\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1574
+#, no-wrap
+msgid ""
+"\t; It may be tempting to search for the '=' in the env string next.\n"
+"\t; But it is possible there is no '=', so we search for the\n"
+"\t; terminating NUL first.\n"
+"\tmov\tesi, edi\t; Save start of string\n"
+"\tsub\tecx, ecx\n"
+"\tnot\tecx\t\t; ECX = FFFFFFFF\n"
+"\tsub\teax, eax\n"
+"repne\tscasb\n"
+"\tnot\tecx\t\t; ECX = string length + 1\n"
+"\tmov\tebx, ecx\t; Save it in EBX\n"
+msgstr ""
+"\t; It may be tempting to search for the '=' in the env string next.\n"
+"\t; But it is possible there is no '=', so we search for the\n"
+"\t; terminating NUL first.\n"
+"\tmov\tesi, edi\t; Save start of string\n"
+"\tsub\tecx, ecx\n"
+"\tnot\tecx\t\t; ECX = FFFFFFFF\n"
+"\tsub\teax, eax\n"
+"repne\tscasb\n"
+"\tnot\tecx\t\t; ECX = string length + 1\n"
+"\tmov\tebx, ecx\t; Save it in EBX\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1581
+#, no-wrap
+msgid ""
+"\t; Now is the time to find '='\n"
+"\tmov\tedi, esi\t; Start of string\n"
+"\tmov\tal, '='\n"
+"repne\tscasb\n"
+"\tnot\tecx\n"
+"\tadd\tecx, ebx\t; Length of name\n"
+msgstr ""
+"\t; Now is the time to find '='\n"
+"\tmov\tedi, esi\t; Start of string\n"
+"\tmov\tal, '='\n"
+"repne\tscasb\n"
+"\tnot\tecx\n"
+"\tadd\tecx, ebx\t; Length of name\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1586
+#, no-wrap
+msgid ""
+"\tpush\tecx\n"
+"\tpush\tesi\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+msgstr ""
+"\tpush\tecx\n"
+"\tpush\tesi\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1592
+#, no-wrap
+msgid ""
+"\t; Print the middle part of HTML table code\n"
+"\tpush\tdword midlen\n"
+"\tpush\tdword middle\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+msgstr ""
+"\t; Print the middle part of HTML table code\n"
+"\tpush\tdword midlen\n"
+"\tpush\tdword middle\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1596
+#, no-wrap
+msgid ""
+"\t; Find the length of the value\n"
+"\tnot\tecx\n"
+"\tlea\tebx, [ebx+ecx-1]\n"
+msgstr ""
+"\t; Find the length of the value\n"
+"\tnot\tecx\n"
+"\tlea\tebx, [ebx+ecx-1]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1600
+#, no-wrap
+msgid ""
+"\t; Print \"undefined\" if 0\n"
+"\tor\tebx, ebx\n"
+"\tjne\t.value\n"
+msgstr ""
+"\t; Print \"undefined\" if 0\n"
+"\tor\tebx, ebx\n"
+"\tjne\t.value\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1603
+#, no-wrap
+msgid ""
+"\tmov\tebx, undeflen\n"
+"\tmov\tedi, undef\n"
+msgstr ""
+"\tmov\tebx, undeflen\n"
+"\tmov\tedi, undef\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1609
+#, no-wrap
+msgid ""
+".value:\n"
+"\tpush\tebx\n"
+"\tpush\tedi\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+msgstr ""
+".value:\n"
+"\tpush\tebx\n"
+"\tpush\tedi\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1615
+#, no-wrap
+msgid ""
+"\t; Print the right part of the table row\n"
+"\tpush\tdword rightlen\n"
+"\tpush\tdword right\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+msgstr ""
+"\t; Print the right part of the table row\n"
+"\tpush\tdword rightlen\n"
+"\tpush\tdword right\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1618
+#, no-wrap
+msgid ""
+"\t; Get rid of the 60 bytes we have pushed\n"
+"\tadd\tesp, byte 60\n"
+msgstr ""
+"\t; Get rid of the 60 bytes we have pushed\n"
+"\tadd\tesp, byte 60\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1621
+#, no-wrap
+msgid ""
+"\t; Get the next variable\n"
+"\tjmp\t.loop\n"
+msgstr ""
+"\t; Get the next variable\n"
+"\tjmp\t.loop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1628
+#, no-wrap
+msgid ""
+".wrap:\n"
+"\t; Print the rest of HTML\n"
+"\tpush\tdword wraplen\n"
+"\tpush\tdword wrap\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+msgstr ""
+".wrap:\n"
+"\t; Print the rest of HTML\n"
+"\tpush\tdword wraplen\n"
+"\tpush\tdword wrap\n"
+"\tpush\tdword stdout\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1632
+#, no-wrap
+msgid ""
+"\t; Return success\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+msgstr ""
+"\t; Return success\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1636
+msgid ""
+"This code produces a 1,396-byte executable. Most of it is data, i.e., the "
+"HTML mark-up we need to send out."
+msgstr ""
+"Этот код создает исполняемый файл размером 1 396 байт. Большая его часть — "
+"это данные, а именно HTML-разметка, которую нам нужно отправить."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1638
+msgid "Assemble and link it as usual:"
+msgstr "Запустите ассемблер и слинкуйте как обычно:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1643
+#, no-wrap
+msgid ""
+"% nasm -f elf webvars.asm\n"
+"% ld -s -o webvars webvars.o\n"
+msgstr ""
+"% nasm -f elf webvars.asm\n"
+"% ld -s -o webvars webvars.o\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1647
+msgid ""
+"To use it, you need to upload [.filename]#webvars# to your web server. "
+"Depending on how your web server is set up, you may have to store it in a "
+"special [.filename]#cgi-bin# directory, or perhaps rename it with a "
+"[.filename]#.cgi# extension."
+msgstr ""
+"Для использования необходимо загрузить [.filename]#webvars# на ваш веб-"
+"сервер. В зависимости от настроек веб-сервера, возможно, потребуется "
+"разместить его в специальном каталоге [.filename]#cgi-bin# или переименовать "
+"с расширением [.filename]#.cgi#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1651
+msgid ""
+"Then you need to use your browser to view its output. To see its output on "
+"my web server, please go to http://www.int80h.org/webvars/[http://"
+"www.int80h.org/webvars/]. If curious about the additional environment "
+"variables present in a password protected web directory, go to http://"
+"www.int80h.org/private/[http://www.int80h.org/private/], using the name "
+"`asm` and password `programmer`."
+msgstr ""
+"Затем вам нужно использовать браузер для просмотра вывода. Чтобы увидеть "
+"вывод на моем веб-сервере, перейдите по ссылке http://www.int80h.org/webvars/"
+"[http://www.int80h.org/webvars/]. Если вам интересно узнать о дополнительных "
+"переменных окружения в защищенном паролем веб-каталоге, перейдите по адресу "
+"http://www.int80h.org/private/[http://www.int80h.org/private/], используя "
+"имя `asm` и пароль `programmer`."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1653
+#, no-wrap
+msgid "Working with Files"
+msgstr "Работа с файлами"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1658
+msgid ""
+"We have already done some basic file work: We know how to open and close "
+"them, how to read and write them using buffers. But UNIX(R) offers much "
+"more functionality when it comes to files. We will examine some of it in "
+"this section, and end up with a nice file conversion utility."
+msgstr ""
+"Мы уже выполнили некоторые базовые операции с файлами: мы знаем, как их "
+"открывать и закрывать, как читать и записывать их с использованием буферов. "
+"Однако UNIX(R) предлагает гораздо больше возможностей при работе с файлами. "
+"В этом разделе мы рассмотрим некоторые из них и в итоге создадим удобную "
+"утилиту для преобразования файлов."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1661
+msgid ""
+"Indeed, let us start at the end, that is, with the file conversion utility. "
+"It always makes programming easier when we know from the start what the end "
+"product is supposed to do."
+msgstr ""
+"В самом деле, начнем с конца, то есть с утилиты преобразования файлов. "
+"Всегда легче программировать, когда с самого начала известно, каким должен "
+"быть конечный продукт."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1667
+msgid ""
+"One of the first programs I wrote for UNIX(R) was link:ftp://ftp.int80h.org/"
+"unix/tuc/[tuc], a text-to-UNIX(R) file converter. It converts a text file "
+"from other operating systems to a UNIX(R) text file. In other words, it "
+"changes from different kind of line endings to the newline convention of "
+"UNIX(R). It saves the output in a different file. Optionally, it converts "
+"a UNIX(R) text file to a DOS text file."
+msgstr ""
+"Одной из первых программ, которые я написал для UNIX(R), была link:ftp://"
+"ftp.int80h.org/unix/tuc/[tuc] — конвертер текста в файл UNIX(R). Она "
+"преобразует текстовый файл из других операционных систем в текстовый файл "
+"UNIX(R). Другими словами, она изменяет различные виды окончаний строк на "
+"стандартные для UNIX(R). Результат сохраняется в другом файле. По желанию, "
+"она может преобразовать текстовый файл UNIX(R) в текстовый файл DOS."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1671
+msgid ""
+"I have used tuc extensively, but always only to convert from some other OS "
+"to UNIX(R), never the other way. I have always wished it would just "
+"overwrite the file instead of me having to send the output to a different "
+"file. Most of the time, I end up using it like this:"
+msgstr ""
+"Я широко использовал `tuc`, но всегда только для преобразования из какой-"
+"либо другой ОС в UNIX(R), никогда наоборот. Мне всегда хотелось, чтобы он "
+"просто перезаписывал файл, вместо того чтобы мне приходилось отправлять "
+"вывод в другой файл. В большинстве случаев я в итоге использую его так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1676
+#, no-wrap
+msgid ""
+"% tuc myfile tempfile\n"
+"% mv tempfile myfile\n"
+msgstr ""
+"% tuc myfile tempfile\n"
+"% mv tempfile myfile\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1679
+msgid ""
+"It would be nice to have a ftuc, i.e., _fast tuc_, and use it like this:"
+msgstr ""
+"Было бы здорово иметь ftuc, т.е., _быстрый tuc_, и использовать его вот так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1683
+#, no-wrap
+msgid "% ftuc myfile\n"
+msgstr "% ftuc myfile\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1686
+msgid ""
+"In this chapter, then, we will write ftuc in assembly language (the original "
+"tuc is in C), and study various file-oriented kernel services in the process."
+msgstr ""
+"В этой главе мы напишем ftuc на языке ассемблера (оригинальный tuc написан "
+"на C) и в процессе изучим различные файловые сервисы ядра."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1688
+msgid ""
+"At first sight, such a file conversion is very simple: All you have to do is "
+"strip the carriage returns, right?"
+msgstr ""
+"На первый взгляд, такое преобразование файла кажется очень простым: нужно "
+"всего лишь удалить символы возврата каретки, верно?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1690
+msgid ""
+"If you answered yes, think again: That approach will work most of the time "
+"(at least with MS DOS text files), but will fail occasionally."
+msgstr ""
+"Если вы ответили «да», подумайте ещё раз: такой подход будет работать в "
+"большинстве случаев (по крайней мере, с текстовыми файлами MS DOS), но "
+"иногда он будет давать сбой."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1695
+msgid ""
+"The problem is that not all non UNIX(R) text files end their line with the "
+"carriage return / line feed sequence. Some use carriage returns without "
+"line feeds. Others combine several blank lines into a single carriage "
+"return followed by several line feeds. And so on."
+msgstr ""
+"Проблема в том, что не все текстовые файлы, не относящиеся к UNIX(R), "
+"завершают строки последовательностью возврата каретки / перевода строки. "
+"Некоторые используют возврат каретки без перевода строки. Другие объединяют "
+"несколько пустых строк в один возврат каретки, за которым следует несколько "
+"переводов строки. И так далее."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1697
+msgid ""
+"A text file converter, then, must be able to handle any possible line "
+"endings:"
+msgstr ""
+"Конвертер текстовых файлов, следовательно, должен уметь обрабатывать любые "
+"возможные окончания строк:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1699
+msgid "carriage return / line feed"
+msgstr "возврат каретки (carriage return) / перевод строки (line feed)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1700
+msgid "carriage return"
+msgstr "возврат каретки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1701
+msgid "line feed / carriage return"
+msgstr "перевод строки / возврат каретки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1702
+msgid "line feed"
+msgstr "перевод строки"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1704
+msgid ""
+"It should also handle files that use some kind of a combination of the above "
+"(e.g., carriage return followed by several line feeds)."
+msgstr ""
+"Это также должно обрабатывать файлы, использующие комбинации вышеуказанного "
+"(например, возврат каретки с последующими несколькими переводами строки)."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1706
+#, no-wrap
+msgid "Finite State Machine"
+msgstr "Конечный автомат"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1713
+msgid ""
+"The problem is easily solved by the use of a technique called _finite state "
+"machine_, originally developed by the designers of digital electronic "
+"circuits. A _finite state machine_ is a digital circuit whose output is "
+"dependent not only on its input but on its previous input, i.e., on its "
+"state. The microprocessor is an example of a _finite state machine_: Our "
+"assembly language code is assembled to machine language in which some "
+"assembly language code produces a single byte of machine language, while "
+"others produce several bytes. As the microprocessor fetches the bytes from "
+"the memory one by one, some of them simply change its state rather than "
+"produce some output. When all the bytes of the op code are fetched, the "
+"microprocessor produces some output, or changes the value of a register, etc."
+msgstr ""
+"Проблема легко решается с использованием техники, называемой _конечный "
+"автомат_, изначально разработанной создателями цифровых электронных схем. "
+"_Конечный автомат_ — это цифровая схема, выход которой зависит не только от "
+"входа, но и от предыдущего входа, то есть от её состояния. Микропроцессор "
+"является примером _конечного автомата_: наш код на языке ассемблера "
+"транслируется в машинный язык, где одни инструкции ассемблера превращаются в "
+"один байт машинного кода, а другие — в несколько байтов. Когда "
+"микропроцессор извлекает байты из памяти один за другим, некоторые из них "
+"просто изменяют его состояние, а не производят какой-либо выходной сигнал. "
+"После извлечения всех байтов кода операции микропроцессор выдает выходной "
+"сигнал, изменяет значение регистра и т. д."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1716
+msgid ""
+"Because of that, all software is essentially a sequence of state "
+"instructions for the microprocessor. Nevertheless, the concept of _finite "
+"state machine_ is useful in software design as well."
+msgstr ""
+"Из-за этого всё программное обеспечение по сути представляет собой "
+"последовательность инструкций состояния для микропроцессора. Тем не менее, "
+"концепция _конечного автомата_ также полезна при проектировании программного "
+"обеспечения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1719
+msgid ""
+"Our text file converter can be designer as a _finite state machine_ with "
+"three possible states. We could call them states 0-2, but it will make our "
+"life easier if we give them symbolic names:"
+msgstr ""
+"Наш конвертер текстовых файлов можно представить в виде _конечного автомата_ "
+"с тремя возможными состояниями. Мы могли бы назвать их состояниями 0-2, но "
+"будет проще, если дадим им символические имена:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1721
+msgid "ordinary"
+msgstr "ordinary"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1722
+msgid "cr"
+msgstr "cr"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1723
+msgid "lf"
+msgstr "lf"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1725
+msgid ""
+"Our program will start in the ordinary state. During this state, the program "
+"action depends on its input as follows:"
+msgstr ""
+"Наша программа начнёт работу в обычном состоянии. В этом состоянии действие "
+"программы зависит от её входных данных следующим образом:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1728
+msgid ""
+"If the input is anything other than a carriage return or line feed, the "
+"input is simply passed on to the output. The state remains unchanged."
+msgstr ""
+"Если ввод представляет собой что-либо, кроме возврата каретки или перевода "
+"строки, ввод просто передаётся на вывод. Состояние остаётся неизменным."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1730
+msgid ""
+"If the input is a carriage return, the state is changed to cr. The input is "
+"then discarded, i.e., no output is made."
+msgstr ""
+"Если входной символ — возврат каретки, состояние изменяется на cr. Затем "
+"входной символ отбрасывается, т.е. вывод не производится."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1732
+msgid ""
+"If the input is a line feed, the state is changed to lf. The input is then "
+"discarded."
+msgstr ""
+"Если входной символ является переводом строки, состояние изменяется на lf. "
+"Затем входной символ отбрасывается."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1735
+msgid ""
+"Whenever we are in the cr state, it is because the last input was a carriage "
+"return, which was unprocessed. What our software does in this state again "
+"depends on the current input:"
+msgstr ""
+"Всякий раз, когда мы находимся в состоянии `cr`, это означает, что последним "
+"вводом был символ возврата каретки, который не был обработан. Действия "
+"нашего программного обеспечения в этом состоянии снова зависят от текущего "
+"ввода:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1737
+msgid ""
+"If the input is anything other than a carriage return or line feed, output a "
+"line feed, then output the input, then change the state to ordinary."
+msgstr ""
+"Если ввод отличается от возврата каретки или перевода строки, вывести "
+"перевод строки, затем вывести ввод, а затем изменить состояние на обычное."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1738
+msgid ""
+"If the input is a carriage return, we have received two (or more) carriage "
+"returns in a row. We discard the input, we output a line feed, and leave the "
+"state unchanged."
+msgstr ""
+"Если входной символ — возврат каретки, значит, мы получили два (или более) "
+"возврата каретки подряд. Мы отбрасываем ввод, выводим перевод строки и "
+"оставляем состояние неизменным."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1739
+msgid ""
+"If the input is a line feed, we output the line feed and change the state to "
+"ordinary. Note that this is not the same as the first case above - if we "
+"tried to combine them, we would be outputting two line feeds instead of one."
+msgstr ""
+"Если входной символ — это перевод строки, мы выводим перевод строки и меняем "
+"состояние на обычное. Обратите внимание, что это не то же самое, что в "
+"первом случае выше — если бы мы попытались объединить их, мы бы выводили два "
+"перевода строки вместо одного."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1743
+msgid ""
+"Finally, we are in the lf state after we have received a line feed that was "
+"not preceded by a carriage return. This will happen when our file already "
+"is in UNIX(R) format, or whenever several lines in a row are expressed by a "
+"single carriage return followed by several line feeds, or when line ends "
+"with a line feed / carriage return sequence. Here is how we need to handle "
+"our input in this state:"
+msgstr ""
+"Наконец, мы находимся в состоянии `lf` после получения перевода строки, "
+"которому не предшествовал возврат каретки. Это произойдет, если наш файл уже "
+"в формате UNIX(R), или когда несколько строк подряд выражены одним возвратом "
+"каретки, за которым следуют несколько переводов строк, или когда строка "
+"заканчивается последовательностью перевода строки / возврата каретки. Вот "
+"как нам нужно обрабатывать ввод в этом состоянии:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1745
+msgid ""
+"If the input is anything other than a carriage return or line feed, we "
+"output a line feed, then output the input, then change the state to "
+"ordinary. This is exactly the same action as in the cr state upon receiving "
+"the same kind of input."
+msgstr ""
+"Если ввод отличается от возврата каретки или перевода строки, мы выводим "
+"перевод строки, затем выводим ввод и изменяем состояние на обычное. Это "
+"действие полностью совпадает с действием в состоянии `cr` при получении "
+"аналогичного ввода."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1746
+msgid ""
+"If the input is a carriage return, we discard the input, we output a line "
+"feed, then change the state to ordinary."
+msgstr ""
+"Если ввод представляет собой символ возврата каретки, мы отбрасываем ввод, "
+"выводим символ перевода строки, затем изменяем состояние на обычное."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1747
+msgid ""
+"If the input is a line feed, we output the line feed, and leave the state "
+"unchanged."
+msgstr ""
+"Если входной символ — перевод строки, мы выводим перевод строки и оставляем "
+"состояние неизменным."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1749
+#, no-wrap
+msgid "The Final State"
+msgstr "Конечное состояние"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1754
+msgid ""
+"The above _finite state machine_ works for the entire file, but leaves the "
+"possibility that the final line end will be ignored. That will happen "
+"whenever the file ends with a single carriage return or a single line feed. "
+"I did not think of it when I wrote tuc, just to discover that occasionally "
+"it strips the last line ending."
+msgstr ""
+"Приведённый выше _конечный автомат_ работает для всего файла, но оставляет "
+"возможность, что последний конец строки будет проигнорирован. Это "
+"произойдёт, если файл заканчивается одиночным возвратом каретки или "
+"одиночным переводом строки. Я не подумал об этом, когда писал tuc, и лишь "
+"позже обнаружил, что иногда он удаляет последний конец строки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1757
+msgid ""
+"This problem is easily fixed by checking the state after the entire file was "
+"processed. If the state is not ordinary, we simply need to output one last "
+"line feed."
+msgstr ""
+"Эта проблема легко решается проверкой состояния после обработки всего файла. "
+"Если состояние не является обычным, нам просто нужно вывести последний "
+"перевод строки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1763
+msgid ""
+"Now that we have expressed our algorithm as a _finite state machine_, we "
+"could easily design a dedicated digital electronic circuit (a \"chip\") to "
+"do the conversion for us. Of course, doing so would be considerably more "
+"expensive than writing an assembly language program."
+msgstr ""
+"Теперь, когда мы выразили наш алгоритм в виде _конечного автомата_, мы могли "
+"бы легко разработать специализированную цифровую электронную схему («чип») "
+"для выполнения преобразования. Конечно, это было бы значительно дороже, чем "
+"написание программы на языке ассемблера."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1766
+#, no-wrap
+msgid "The Output Counter"
+msgstr "Счетчик вывода"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1771
+msgid ""
+"Because our file conversion program may be combining two characters into "
+"one, we need to use an output counter. We initialize it to `0`, and "
+"increase it every time we send a character to the output. At the end of the "
+"program, the counter will tell us what size we need to set the file to."
+msgstr ""
+"Поскольку наша программа преобразования файлов может объединять два символа "
+"в один, нам необходимо использовать счётчик вывода. Мы инициализируем его "
+"значением `0` и увеличиваем каждый раз, когда отправляем символ на выход. В "
+"конце программы счётчик укажет, какой размер необходимо установить для файла."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1773
+#, no-wrap
+msgid "Implementing FSM in Software"
+msgstr "Реализация конечного автомата в программном обеспечении"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1777
+msgid ""
+"The hardest part of working with a _finite state machine_ is analyzing the "
+"problem and expressing it as a _finite state machine_. That accomplished, "
+"the software almost writes itself."
+msgstr ""
+"Самая сложная часть работы с _конечным автоматом_ — это анализ задачи и её "
+"представление в виде _конечного автомата_. После этого программное "
+"обеспечение практически пишется само."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1780
+msgid ""
+"In a high-level language, such as C, there are several main approaches. One "
+"is to use a `switch` statement which chooses what function should be run. "
+"For example,"
+msgstr ""
+"На языке высокого уровня, таком как C, существует несколько основных "
+"подходов. Один из них — использование оператора `switch`, который выбирает, "
+"какую функцию следует выполнить. Например,"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1795
+#, no-wrap
+msgid ""
+"switch (state) {\n"
+"\tdefault:\n"
+"\tcase REGULAR:\n"
+"\t\tregular(inputchar);\n"
+"\t\tbreak;\n"
+"\tcase CR:\n"
+"\t\tcr(inputchar);\n"
+"\t\tbreak;\n"
+"\tcase LF:\n"
+"\t\tlf(inputchar);\n"
+"\t\tbreak;\n"
+"\t}\n"
+msgstr ""
+"switch (state) {\n"
+"\tdefault:\n"
+"\tcase REGULAR:\n"
+"\t\tregular(inputchar);\n"
+"\t\tbreak;\n"
+"\tcase CR:\n"
+"\t\tcr(inputchar);\n"
+"\t\tbreak;\n"
+"\tcase LF:\n"
+"\t\tlf(inputchar);\n"
+"\t\tbreak;\n"
+"\t}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1798
+msgid ""
+"Another approach is by using an array of function pointers, something like "
+"this:"
+msgstr ""
+"Еще один подход заключается в использовании массива указателей на функции, "
+"например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1802
+#, no-wrap
+msgid "(output[state])(inputchar);\n"
+msgstr "(output[state])(inputchar);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1805
+msgid ""
+"Yet another is to have `state` be a function pointer, set to point at the "
+"appropriate function:"
+msgstr ""
+"Еще один вариант — сделать `state` указателем на функцию, установив его на "
+"соответствующую функцию:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1809
+#, no-wrap
+msgid "(*state)(inputchar);\n"
+msgstr "(*state)(inputchar);\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1813
+msgid ""
+"This is the approach we will use in our program because it is very easy to "
+"do in assembly language, and very fast, too. We will simply keep the "
+"address of the right procedure in `EBX`, and then just issue:"
+msgstr ""
+"Это подход, который мы будем использовать в нашей программе, потому что его "
+"очень легко реализовать на языке ассемблера, и он также очень быстрый. Мы "
+"просто будем хранить адрес нужной процедуры в `EBX`, а затем выполним:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1817
+#, no-wrap
+msgid "call\tebx\n"
+msgstr "call\tebx\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1821
+msgid ""
+"This is possibly faster than hardcoding the address in the code because the "
+"microprocessor does not have to fetch the address from the memory-it is "
+"already stored in one of its registers. I said _possibly_ because with the "
+"caching modern microprocessors do, either way may be equally fast."
+msgstr ""
+"Это возможно быстрее, чем жестко задавать адрес в коде, потому что "
+"микропроцессору не нужно извлекать адрес из памяти — он уже хранится в одном "
+"из его регистров. Я сказал _возможно_, потому что с учетом кэширования, "
+"которое выполняют современные микропроцессоры, оба варианта могут быть "
+"одинаково быстрыми."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1823
+#, no-wrap
+msgid "Memory Mapped Files"
+msgstr "Отображенные в память файлы"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1827
+msgid ""
+"Because our program works on a single file, we cannot use the approach that "
+"worked for us before, i.e., to read from an input file and to write to an "
+"output file."
+msgstr ""
+"Поскольку наша программа работает с одним файлом, мы не можем использовать "
+"подход, который работал ранее, то есть чтение из входного файла и запись в "
+"выходной файл."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1835
+msgid ""
+"UNIX(R) allows us to map a file, or a section of a file, into memory. To do "
+"that, we first need to open the file with the appropriate read/write flags. "
+"Then we use the `mmap` system call to map it into the memory. One nice "
+"thing about `mmap` is that it automatically works with virtual memory: We "
+"can map more of the file into the memory than we have physical memory "
+"available, yet still access it through regular memory op codes, such as "
+"`mov`, `lods`, and `stos`. Whatever changes we make to the memory image of "
+"the file will be written to the file by the system. We do not even have to "
+"keep the file open: As long as it stays mapped, we can read from it and "
+"write to it."
+msgstr ""
+"UNIX(R) позволяет нам отображать файл или его часть в память. Для этого "
+"сначала необходимо открыть файл с соответствующими флагами чтения/записи. "
+"Затем мы используем системный вызов `mmap`, чтобы отобразить его в память. "
+"Одно из преимуществ `mmap` заключается в том, что он автоматически работает "
+"с виртуальной памятью: мы можем отобразить в память больше файла, чем "
+"имеется физической памяти, и при этом обращаться к нему с помощью обычных "
+"команд работы с памятью, таких как `mov`, `lods` и `stos`. Все изменения, "
+"внесённые в память, отображённую из файла, будут записаны в файл системой. "
+"Нам даже не нужно держать файл открытым: пока он остаётся отображённым, мы "
+"можем читать из него и записывать в него."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1838
+msgid ""
+"The 32-bit Intel microprocessors can access up to four gigabytes of memory - "
+"physical or virtual. The FreeBSD system allows us to use up to a half of it "
+"for file mapping."
+msgstr ""
+"32-разрядные микропроцессоры Intel могут адресовать до четырёх гигабайт "
+"памяти — физической или виртуальной. Система FreeBSD позволяет использовать "
+"до половины этого объёма для отображения файлов."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1842
+msgid ""
+"For simplicity sake, in this tutorial we will only convert files that can be "
+"mapped into the memory in their entirety. There are probably not too many "
+"text files that exceed two gigabytes in size. If our program encounters "
+"one, it will simply display a message suggesting we use the original tuc "
+"instead."
+msgstr ""
+"Для упрощения в этом руководстве мы будем преобразовывать только файлы, "
+"которые могут быть полностью отображены в памяти. Вероятно, не так много "
+"текстовых файлов превышают размер в два гигабайта. Если наша программа "
+"встретит такой файл, она просто выведет сообщение с предложением "
+"использовать оригинальный tuc."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1848
+msgid ""
+"If you examine your copy of [.filename]#syscalls.master#, you will find two "
+"separate syscalls named `mmap`. This is because of evolution of UNIX(R): "
+"There was the traditional BSD `mmap`, syscall 71. That one was superseded "
+"by the POSIX(R) `mmap`, syscall 197. The FreeBSD system supports both "
+"because older programs were written by using the original BSD version. But "
+"new software uses the POSIX(R) version, which is what we will use."
+msgstr ""
+"Если вы изучите свою копию файла [.filename]#syscalls.master#, вы найдёте "
+"два отдельных системных вызова с именем `mmap`. Это связано с эволюцией "
+"UNIX(R): существовал традиционный BSD `mmap`, системный вызов 71. Он был "
+"заменён на POSIX(R) `mmap`, системный вызов 197. Система FreeBSD "
+"поддерживает оба, поскольку старые программы были написаны с использованием "
+"оригинальной BSD-версии. Но новое программное обеспечение использует версию "
+"POSIX(R), которую мы и будем применять."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1850
+msgid "The [.filename]#syscalls.master# lists the POSIX(R) version like this:"
+msgstr ""
+"В [.filename]#syscalls.master# POSIX(R) версия указана следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1855
+#, no-wrap
+msgid ""
+"197\tSTD\tBSD\t{ caddr_t mmap(caddr_t addr, size_t len, int prot, \\\n"
+"\t\t\t int flags, int fd, long pad, off_t pos); }\n"
+msgstr ""
+"197\tSTD\tBSD\t{ caddr_t mmap(caddr_t addr, size_t len, int prot, \\\n"
+"\t\t\t int flags, int fd, long pad, off_t pos); }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1859
+msgid ""
+"This differs slightly from what man:mmap[2] says. That is because "
+"man:mmap[2] describes the C version."
+msgstr ""
+"Это немного отличается от того, что указано в man:mmap[2]. Это связано с "
+"тем, что man:mmap[2] описывает версию на языке C."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1863
+msgid ""
+"The difference is in the `long pad` argument, which is not present in the C "
+"version. However, the FreeBSD syscalls add a 32-bit pad after ``push``ing a "
+"64-bit argument. In this case, `off_t` is a 64-bit value."
+msgstr ""
+"Разница заключается в аргументе `long pad`, который отсутствует в версии на "
+"C. Однако системные вызовы FreeBSD добавляют 32-битный заполнитель после "
+"``push`` 64-битного аргумента. В данном случае `off_t` является 64-битным "
+"значением."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1865
+msgid ""
+"When we are finished working with a memory-mapped file, we unmap it with the "
+"`munmap` syscall:"
+msgstr ""
+"Когда мы завершаем работу с файлом, отображённым в память, мы освобождаем "
+"его с помощью системного вызова `munmap`:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1869
+msgid ""
+"For an in-depth treatment of `mmap`, see W. Richard Stevens' http://"
+"www.int80h.org/cgi-bin/isbn?isbn=0130810819[Unix Network Programming, Volume "
+"2, Chapter 12]."
+msgstr ""
+"Для подробного изучения `mmap` см. http://www.int80h.org/cgi-bin/isbn?"
+"isbn=0130810819[Unix Network Programming, Volume 2, Chapter 12] У. Ричарда "
+"Стивенса."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1872
+#, no-wrap
+msgid "Determining File Size"
+msgstr "Определение размера файла"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1875
+msgid ""
+"Because we need to tell `mmap` how many bytes of the file to map into the "
+"memory, and because we want to map the entire file, we need to determine the "
+"size of the file."
+msgstr ""
+"Поскольку нам нужно указать `mmap`, сколько байт файла отобразить в памяти, "
+"и поскольку мы хотим отобразить весь файл, нам необходимо определить его "
+"размер."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1878
+msgid ""
+"We can use the `fstat` syscall to get all the information about an open file "
+"that the system can give us. That includes the file size."
+msgstr ""
+"Мы можем использовать системный вызов `fstat` для получения всей информации "
+"об открытом файле, которую система может нам предоставить. Это включает в "
+"себя размер файла."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1881
+msgid ""
+"Again, [.filename]#syscalls.master# lists two versions of `fstat`, a "
+"traditional one (syscall 62), and a POSIX(R) one (syscall 189). Naturally, "
+"we will use the POSIX(R) version:"
+msgstr ""
+"Вновь, в [.filename]#syscalls.master# указаны две версии `fstat`: "
+"традиционная (системный вызов 62) и POSIX(R) (системный вызов 189). "
+"Естественно, мы будем использовать версию POSIX(R):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1885
+#, no-wrap
+msgid "189\tSTD\tPOSIX\t{ int fstat(int fd, struct stat *sb); }\n"
+msgstr "189\tSTD\tPOSIX\t{ int fstat(int fd, struct stat *sb); }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1889
+msgid ""
+"This is a very straightforward call: We pass to it the address of a `stat` "
+"structure and the descriptor of an open file. It will fill out the contents "
+"of the `stat` structure."
+msgstr ""
+"Это очень простой вызов: мы передаем ему адрес структуры `stat` и дескриптор "
+"открытого файла. Он заполнит содержимое структуры `stat`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1892
+msgid ""
+"I do, however, have to say that I tried to declare the `stat` structure in "
+"the `.bss` section, and `fstat` did not like it: It set the carry flag "
+"indicating an error. After I changed the code to allocate the structure on "
+"the stack, everything was working fine."
+msgstr ""
+"Однако должен сказать, что я пытался объявить структуру `stat` в секции "
+"`.bss`, и `fstat` это не понравилось: был установлен флаг переноса, "
+"указывающий на ошибку. После того как я изменил код, чтобы разместить "
+"структуру в стеке, всё заработало как надо."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1894
+#, no-wrap
+msgid "Changing the File Size"
+msgstr "Изменение размера файла"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1898
+msgid ""
+"Because our program may combine carriage return / line feed sequences into "
+"straight line feeds, our output may be smaller than our input. However, "
+"since we are placing our output into the same file we read the input from, "
+"we may have to change the size of the file."
+msgstr ""
+"Поскольку наша программа может объединять последовательности возврата "
+"каретки / перевода строки в простые переводы строк, наш вывод может быть "
+"меньше, чем ввод. Однако, так как мы помещаем вывод в тот же файл, из "
+"которого читаем ввод, нам может потребоваться изменить размер файла."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1901
+msgid ""
+"The `ftruncate` system call allows us to do just that. Despite its somewhat "
+"misleading name, the `ftruncate` system call can be used to both truncate "
+"the file (make it smaller) and to grow it."
+msgstr ""
+"Системный вызов `ftruncate` позволяет нам сделать именно это. Несмотря на "
+"название , несколько вводящее в звблуждение, системный вызов `ftruncate` "
+"может использоваться как для усечения файла (уменьшения его размера), так и "
+"для его увеличения."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1904
+msgid ""
+"And yes, we will find two versions of `ftruncate` in "
+"[.filename]#syscalls.master#, an older one (130), and a newer one (201). We "
+"will use the newer one:"
+msgstr ""
+"И да, мы найдем две версии `ftruncate` в [.filename]#syscalls.master#, "
+"старую (130) и новую (201). Мы будем использовать новую:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1908
+#, no-wrap
+msgid "201\tSTD\tBSD\t{ int ftruncate(int fd, int pad, off_t length); }\n"
+msgstr "201\tSTD\tBSD\t{ int ftruncate(int fd, int pad, off_t length); }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1911
+msgid "Please note that this one contains a `int pad` again."
+msgstr "Обратите внимание, что здесь снова присутствует `int pad`."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1913
+#, no-wrap
+msgid "ftuc"
+msgstr "ftuc"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1918
+msgid ""
+"We now know everything we need to write ftuc. We start by adding some new "
+"lines in [.filename]#system.inc#. First, we define some constants and "
+"structures, somewhere at or near the beginning of the file:"
+msgstr ""
+"Теперь мы знаем всё, что нужно для написания ftuc. Начнём с добавления "
+"нескольких новых строк в [.filename]#system.inc#. Сначала определим "
+"некоторые константы и структуры, где-нибудь в начале или около начала файла:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1925
+#, no-wrap
+msgid ""
+";;;;;;; open flags\n"
+"%define\tO_RDONLY\t0\n"
+"%define\tO_WRONLY\t1\n"
+"%define\tO_RDWR\t2\n"
+msgstr ""
+";;;;;;; open flags\n"
+"%define\tO_RDONLY\t0\n"
+"%define\tO_WRONLY\t1\n"
+"%define\tO_RDWR\t2\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1934
+#, no-wrap
+msgid ""
+";;;;;;; mmap flags\n"
+"%define\tPROT_NONE\t0\n"
+"%define\tPROT_READ\t1\n"
+"%define\tPROT_WRITE\t2\n"
+"%define\tPROT_EXEC\t4\n"
+";;\n"
+"%define\tMAP_SHARED\t0001h\n"
+"%define\tMAP_PRIVATE\t0002h\n"
+msgstr ""
+";;;;;;; mmap flags\n"
+"%define\tPROT_NONE\t0\n"
+"%define\tPROT_READ\t1\n"
+"%define\tPROT_WRITE\t2\n"
+"%define\tPROT_EXEC\t4\n"
+";;\n"
+"%define\tMAP_SHARED\t0001h\n"
+"%define\tMAP_PRIVATE\t0002h\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1958
+#, no-wrap
+msgid ""
+";;;;;;; stat structure\n"
+"struc\tstat\n"
+"st_dev\t\tresd\t1\t; = 0\n"
+"st_ino\t\tresd\t1\t; = 4\n"
+"st_mode\t\tresw\t1\t; = 8, size is 16 bits\n"
+"st_nlink\tresw\t1\t; = 10, ditto\n"
+"st_uid\t\tresd\t1\t; = 12\n"
+"st_gid\t\tresd\t1\t; = 16\n"
+"st_rdev\t\tresd\t1\t; = 20\n"
+"st_atime\tresd\t1\t; = 24\n"
+"st_atimensec\tresd\t1\t; = 28\n"
+"st_mtime\tresd\t1\t; = 32\n"
+"st_mtimensec\tresd\t1\t; = 36\n"
+"st_ctime\tresd\t1\t; = 40\n"
+"st_ctimensec\tresd\t1\t; = 44\n"
+"st_size\t\tresd\t2\t; = 48, size is 64 bits\n"
+"st_blocks\tresd\t2\t; = 56, ditto\n"
+"st_blksize\tresd\t1\t; = 64\n"
+"st_flags\tresd\t1\t; = 68\n"
+"st_gen\t\tresd\t1\t; = 72\n"
+"st_lspare\tresd\t1\t; = 76\n"
+"st_qspare\tresd\t4\t; = 80\n"
+"endstruc\n"
+msgstr ""
+";;;;;;; stat structure\n"
+"struc\tstat\n"
+"st_dev\t\tresd\t1\t; = 0\n"
+"st_ino\t\tresd\t1\t; = 4\n"
+"st_mode\t\tresw\t1\t; = 8, size is 16 bits\n"
+"st_nlink\tresw\t1\t; = 10, ditto\n"
+"st_uid\t\tresd\t1\t; = 12\n"
+"st_gid\t\tresd\t1\t; = 16\n"
+"st_rdev\t\tresd\t1\t; = 20\n"
+"st_atime\tresd\t1\t; = 24\n"
+"st_atimensec\tresd\t1\t; = 28\n"
+"st_mtime\tresd\t1\t; = 32\n"
+"st_mtimensec\tresd\t1\t; = 36\n"
+"st_ctime\tresd\t1\t; = 40\n"
+"st_ctimensec\tresd\t1\t; = 44\n"
+"st_size\t\tresd\t2\t; = 48, size is 64 bits\n"
+"st_blocks\tresd\t2\t; = 56, ditto\n"
+"st_blksize\tresd\t1\t; = 64\n"
+"st_flags\tresd\t1\t; = 68\n"
+"st_gen\t\tresd\t1\t; = 72\n"
+"st_lspare\tresd\t1\t; = 76\n"
+"st_qspare\tresd\t4\t; = 80\n"
+"endstruc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1961
+msgid "We define the new syscalls:"
+msgstr "Мы определяем новые системные вызовы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1968
+#, no-wrap
+msgid ""
+"%define\tSYS_mmap\t197\n"
+"%define\tSYS_munmap\t73\n"
+"%define\tSYS_fstat\t189\n"
+"%define\tSYS_ftruncate\t201\n"
+msgstr ""
+"%define\tSYS_mmap\t197\n"
+"%define\tSYS_munmap\t73\n"
+"%define\tSYS_fstat\t189\n"
+"%define\tSYS_ftruncate\t201\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1971
+msgid "We add the macros for their use:"
+msgstr "Добавляем макросы для их использования:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1977
+#, no-wrap
+msgid ""
+"%macro\tsys.mmap\t0\n"
+"\tsystem\tSYS_mmap\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.mmap\t0\n"
+"\tsystem\tSYS_mmap\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1981
+#, no-wrap
+msgid ""
+"%macro\tsys.munmap\t0\n"
+"\tsystem\tSYS_munmap\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.munmap\t0\n"
+"\tsystem\tSYS_munmap\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1985
+#, no-wrap
+msgid ""
+"%macro\tsys.ftruncate\t0\n"
+"\tsystem\tSYS_ftruncate\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.ftruncate\t0\n"
+"\tsystem\tSYS_ftruncate\n"
+"%endmacro\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1989
+#, no-wrap
+msgid ""
+"%macro\tsys.fstat\t0\n"
+"\tsystem\tSYS_fstat\n"
+"%endmacro\n"
+msgstr ""
+"%macro\tsys.fstat\t0\n"
+"\tsystem\tSYS_fstat\n"
+"%endmacro\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:1992
+msgid "And here is our code:"
+msgstr "И вот наш код:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2005
+#, no-wrap
+msgid ""
+";;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";;\n"
+";; Started:\t21-Dec-2000\n"
+";; Updated:\t22-Dec-2000\n"
+";;\n"
+";; Copyright 2000 G. Adam Stanislav.\n"
+";; All rights reserved.\n"
+";;\n"
+";;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+"%include\t'system.inc'\n"
+msgstr ""
+";;;;;;; Fast Text-to-Unix Conversion (ftuc.asm) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";;\n"
+";; Started:\t21-Dec-2000\n"
+";; Updated:\t22-Dec-2000\n"
+";;\n"
+";; Copyright 2000 G. Adam Stanislav.\n"
+";; All rights reserved.\n"
+";;\n"
+";;;;;;; v.1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+"%include\t'system.inc'\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2019
+#, no-wrap
+msgid ""
+"section\t.data\n"
+"\tdb\t'Copyright 2000 G. Adam Stanislav.', 0Ah\n"
+"\tdb\t'All rights reserved.', 0Ah\n"
+"usg\tdb\t'Usage: ftuc filename', 0Ah\n"
+"usglen\tequ\t$-usg\n"
+"co\tdb\t\"ftuc: Can't open file.\", 0Ah\n"
+"colen\tequ\t$-co\n"
+"fae\tdb\t'ftuc: File access error.', 0Ah\n"
+"faelen\tequ\t$-fae\n"
+"ftl\tdb\t'ftuc: File too long, use regular tuc instead.', 0Ah\n"
+"ftllen\tequ\t$-ftl\n"
+"mae\tdb\t'ftuc: Memory allocation error.', 0Ah\n"
+"maelen\tequ\t$-mae\n"
+msgstr ""
+"section\t.data\n"
+"\tdb\t'Copyright 2000 G. Adam Stanislav.', 0Ah\n"
+"\tdb\t'All rights reserved.', 0Ah\n"
+"usg\tdb\t'Usage: ftuc filename', 0Ah\n"
+"usglen\tequ\t$-usg\n"
+"co\tdb\t\"ftuc: Can't open file.\", 0Ah\n"
+"colen\tequ\t$-co\n"
+"fae\tdb\t'ftuc: File access error.', 0Ah\n"
+"faelen\tequ\t$-fae\n"
+"ftl\tdb\t'ftuc: File too long, use regular tuc instead.', 0Ah\n"
+"ftllen\tequ\t$-ftl\n"
+"mae\tdb\t'ftuc: Memory allocation error.', 0Ah\n"
+"maelen\tequ\t$-mae\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2021
+#, no-wrap
+msgid "section\t.text\n"
+msgstr "section\t.text\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2027
+#, no-wrap
+msgid ""
+"align 4\n"
+"memerr:\n"
+"\tpush\tdword maelen\n"
+"\tpush\tdword mae\n"
+"\tjmp\tshort error\n"
+msgstr ""
+"align 4\n"
+"memerr:\n"
+"\tpush\tdword maelen\n"
+"\tpush\tdword mae\n"
+"\tjmp\tshort error\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2033
+#, no-wrap
+msgid ""
+"align 4\n"
+"toolong:\n"
+"\tpush\tdword ftllen\n"
+"\tpush\tdword ftl\n"
+"\tjmp\tshort error\n"
+msgstr ""
+"align 4\n"
+"toolong:\n"
+"\tpush\tdword ftllen\n"
+"\tpush\tdword ftl\n"
+"\tjmp\tshort error\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2039
+#, no-wrap
+msgid ""
+"align 4\n"
+"facerr:\n"
+"\tpush\tdword faelen\n"
+"\tpush\tdword fae\n"
+"\tjmp\tshort error\n"
+msgstr ""
+"align 4\n"
+"facerr:\n"
+"\tpush\tdword faelen\n"
+"\tpush\tdword fae\n"
+"\tjmp\tshort error\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2045
+#, no-wrap
+msgid ""
+"align 4\n"
+"cantopen:\n"
+"\tpush\tdword colen\n"
+"\tpush\tdword co\n"
+"\tjmp\tshort error\n"
+msgstr ""
+"align 4\n"
+"cantopen:\n"
+"\tpush\tdword colen\n"
+"\tpush\tdword co\n"
+"\tjmp\tshort error\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2050
+#, no-wrap
+msgid ""
+"align 4\n"
+"usage:\n"
+"\tpush\tdword usglen\n"
+"\tpush\tdword usg\n"
+msgstr ""
+"align 4\n"
+"usage:\n"
+"\tpush\tdword usglen\n"
+"\tpush\tdword usg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2054
+#, no-wrap
+msgid ""
+"error:\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+msgstr ""
+"error:\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2057
+#, no-wrap
+msgid ""
+"\tpush\tdword 1\n"
+"\tsys.exit\n"
+msgstr ""
+"\tpush\tdword 1\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2065
+#, no-wrap
+msgid ""
+"align 4\n"
+"global\t_start\n"
+"_start:\n"
+"\tpop\teax\t\t; argc\n"
+"\tpop\teax\t\t; program name\n"
+"\tpop\tecx\t\t; file to convert\n"
+"\tjecxz\tusage\n"
+msgstr ""
+"align 4\n"
+"global\t_start\n"
+"_start:\n"
+"\tpop\teax\t\t; argc\n"
+"\tpop\teax\t\t; program name\n"
+"\tpop\tecx\t\t; file to convert\n"
+"\tjecxz\tusage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2069
+#, no-wrap
+msgid ""
+"\tpop\teax\n"
+"\tor\teax, eax\t; Too many arguments?\n"
+"\tjne\tusage\n"
+msgstr ""
+"\tpop\teax\n"
+"\tor\teax, eax\t; Too many arguments?\n"
+"\tjne\tusage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2075
+#, no-wrap
+msgid ""
+"\t; Open the file\n"
+"\tpush\tdword O_RDWR\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\tcantopen\n"
+msgstr ""
+"\t; Open the file\n"
+"\tpush\tdword O_RDWR\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\tcantopen\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2077
+#, no-wrap
+msgid "\tmov\tebp, eax\t; Save fd\n"
+msgstr "\tmov\tebp, eax\t; Save fd\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2080
+#, no-wrap
+msgid ""
+"\tsub\tesp, byte stat_size\n"
+"\tmov\tebx, esp\n"
+msgstr ""
+"\tsub\tesp, byte stat_size\n"
+"\tmov\tebx, esp\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2086
+#, no-wrap
+msgid ""
+"\t; Find file size\n"
+"\tpush\tebx\n"
+"\tpush\tebp\t\t; fd\n"
+"\tsys.fstat\n"
+"\tjc\tfacerr\n"
+msgstr ""
+"\t; Find file size\n"
+"\tpush\tebx\n"
+"\tpush\tebp\t\t; fd\n"
+"\tsys.fstat\n"
+"\tjc\tfacerr\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2088
+#, no-wrap
+msgid "\tmov\tedx, [ebx + st_size + 4]\n"
+msgstr "\tmov\tedx, [ebx + st_size + 4]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2096
+#, no-wrap
+msgid ""
+"\t; File is too long if EDX != 0 ...\n"
+"\tor\tedx, edx\n"
+"\tjne\tnear toolong\n"
+"\tmov\tecx, [ebx + st_size]\n"
+"\t; ... or if it is above 2 GB\n"
+"\tor\tecx, ecx\n"
+"\tjs\tnear toolong\n"
+msgstr ""
+"\t; File is too long if EDX != 0 ...\n"
+"\tor\tedx, edx\n"
+"\tjne\tnear toolong\n"
+"\tmov\tecx, [ebx + st_size]\n"
+"\t; ... or if it is above 2 GB\n"
+"\tor\tecx, ecx\n"
+"\tjs\tnear toolong\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2099
+#, no-wrap
+msgid ""
+"\t; Do nothing if the file is 0 bytes in size\n"
+"\tjecxz\t.quit\n"
+msgstr ""
+"\t; Do nothing if the file is 0 bytes in size\n"
+"\tjecxz\t.quit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2111
+#, no-wrap
+msgid ""
+"\t; Map the entire file in memory\n"
+"\tpush\tedx\n"
+"\tpush\tedx\t\t; starting at offset 0\n"
+"\tpush\tedx\t\t; pad\n"
+"\tpush\tebp\t\t; fd\n"
+"\tpush\tdword MAP_SHARED\n"
+"\tpush\tdword PROT_READ | PROT_WRITE\n"
+"\tpush\tecx\t\t; entire file size\n"
+"\tpush\tedx\t\t; let system decide on the address\n"
+"\tsys.mmap\n"
+"\tjc\tnear memerr\n"
+msgstr ""
+"\t; Map the entire file in memory\n"
+"\tpush\tedx\n"
+"\tpush\tedx\t\t; starting at offset 0\n"
+"\tpush\tedx\t\t; pad\n"
+"\tpush\tebp\t\t; fd\n"
+"\tpush\tdword MAP_SHARED\n"
+"\tpush\tdword PROT_READ | PROT_WRITE\n"
+"\tpush\tecx\t\t; entire file size\n"
+"\tpush\tedx\t\t; let system decide on the address\n"
+"\tsys.mmap\n"
+"\tjc\tnear memerr\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2116
+#, no-wrap
+msgid ""
+"\tmov\tedi, eax\n"
+"\tmov\tesi, eax\n"
+"\tpush\tecx\t\t; for SYS_munmap\n"
+"\tpush\tedi\n"
+msgstr ""
+"\tmov\tedi, eax\n"
+"\tmov\tesi, eax\n"
+"\tpush\tecx\t\t; for SYS_munmap\n"
+"\tpush\tedi\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2121
+#, no-wrap
+msgid ""
+"\t; Use EBX for state machine\n"
+"\tmov\tebx, ordinary\n"
+"\tmov\tah, 0Ah\n"
+"\tcld\n"
+msgstr ""
+"\t; Use EBX for state machine\n"
+"\tmov\tebx, ordinary\n"
+"\tmov\tah, 0Ah\n"
+"\tcld\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2126
+#, no-wrap
+msgid ""
+".loop:\n"
+"\tlodsb\n"
+"\tcall\tebx\n"
+"\tloop\t.loop\n"
+msgstr ""
+".loop:\n"
+"\tlodsb\n"
+"\tcall\tebx\n"
+"\tloop\t.loop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2129
+#, no-wrap
+msgid ""
+"\tcmp\tebx, ordinary\n"
+"\tje\t.filesize\n"
+msgstr ""
+"\tcmp\tebx, ordinary\n"
+"\tje\t.filesize\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2134
+#, no-wrap
+msgid ""
+"\t; Output final lf\n"
+"\tmov\tal, ah\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+msgstr ""
+"\t; Output final lf\n"
+"\tmov\tal, ah\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2142
+#, no-wrap
+msgid ""
+".filesize:\n"
+"\t; truncate file to new size\n"
+"\tpush\tdword 0\t\t; high dword\n"
+"\tpush\tedx\t\t; low dword\n"
+"\tpush\teax\t\t; pad\n"
+"\tpush\tebp\n"
+"\tsys.ftruncate\n"
+msgstr ""
+".filesize:\n"
+"\t; truncate file to new size\n"
+"\tpush\tdword 0\t\t; high dword\n"
+"\tpush\tedx\t\t; low dword\n"
+"\tpush\teax\t\t; pad\n"
+"\tpush\tebp\n"
+"\tsys.ftruncate\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2145
+#, no-wrap
+msgid ""
+"\t; close it (ebp still pushed)\n"
+"\tsys.close\n"
+msgstr ""
+"\t; close it (ebp still pushed)\n"
+"\tsys.close\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2148
+#, no-wrap
+msgid ""
+"\tadd\tesp, byte 16\n"
+"\tsys.munmap\n"
+msgstr ""
+"\tadd\tesp, byte 16\n"
+"\tsys.munmap\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2152
+#, no-wrap
+msgid ""
+".quit:\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+msgstr ""
+".quit:\n"
+"\tpush\tdword 0\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2157
+#, no-wrap
+msgid ""
+"align 4\n"
+"ordinary:\n"
+"\tcmp\tal, 0Dh\n"
+"\tje\t.cr\n"
+msgstr ""
+"align 4\n"
+"ordinary:\n"
+"\tcmp\tal, 0Dh\n"
+"\tje\t.cr\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2160
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2182
+#, no-wrap
+msgid ""
+"\tcmp\tal, ah\n"
+"\tje\t.lf\n"
+msgstr ""
+"\tcmp\tal, ah\n"
+"\tje\t.lf\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2164
+#, no-wrap
+msgid ""
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tret\n"
+msgstr ""
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2169
+#, no-wrap
+msgid ""
+"align 4\n"
+".cr:\n"
+"\tmov\tebx, cr\n"
+"\tret\n"
+msgstr ""
+"align 4\n"
+".cr:\n"
+"\tmov\tebx, cr\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2174
+#, no-wrap
+msgid ""
+"align 4\n"
+".lf:\n"
+"\tmov\tebx, lf\n"
+"\tret\n"
+msgstr ""
+"align 4\n"
+".lf:\n"
+"\tmov\tebx, lf\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2179
+#, no-wrap
+msgid ""
+"align 4\n"
+"cr:\n"
+"\tcmp\tal, 0Dh\n"
+"\tje\t.cr\n"
+msgstr ""
+"align 4\n"
+"cr:\n"
+"\tcmp\tal, 0Dh\n"
+"\tje\t.cr\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2186
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2214
+#, no-wrap
+msgid ""
+"\txchg\tal, ah\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+msgstr ""
+"\txchg\tal, ah\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2189
+#, no-wrap
+msgid ""
+"\txchg\tal, ah\n"
+"\t; fall through\n"
+msgstr ""
+"\txchg\tal, ah\n"
+"\t; fall through\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2195
+#, no-wrap
+msgid ""
+".lf:\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tmov\tebx, ordinary\n"
+"\tret\n"
+msgstr ""
+".lf:\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tmov\tebx, ordinary\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2202
+#, no-wrap
+msgid ""
+"align 4\n"
+".cr:\n"
+"\tmov\tal, ah\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tret\n"
+msgstr ""
+"align 4\n"
+".cr:\n"
+"\tmov\tal, ah\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2207
+#, no-wrap
+msgid ""
+"align 4\n"
+"lf:\n"
+"\tcmp\tal, ah\n"
+"\tje\t.lf\n"
+msgstr ""
+"align 4\n"
+"lf:\n"
+"\tcmp\tal, ah\n"
+"\tje\t.lf\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2210
+#, no-wrap
+msgid ""
+"\tcmp\tal, 0Dh\n"
+"\tje\t.cr\n"
+msgstr ""
+"\tcmp\tal, 0Dh\n"
+"\tje\t.cr\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2220
+#, no-wrap
+msgid ""
+"\txchg\tal, ah\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tmov\tebx, ordinary\n"
+"\tret\n"
+msgstr ""
+"\txchg\tal, ah\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tmov\tebx, ordinary\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2226
+#, no-wrap
+msgid ""
+"align 4\n"
+".cr:\n"
+"\tmov\tebx, ordinary\n"
+"\tmov\tal, ah\n"
+"\t; fall through\n"
+msgstr ""
+"align 4\n"
+".cr:\n"
+"\tmov\tebx, ordinary\n"
+"\tmov\tal, ah\n"
+"\t; fall through\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2231
+#, no-wrap
+msgid ""
+".lf:\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tret\n"
+msgstr ""
+".lf:\n"
+"\tstosb\n"
+"\tinc\tedx\n"
+"\tret\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2238
+msgid ""
+"Do not use this program on files stored on a disk formatted by MS-DOS(R) or "
+"Windows(R). There seems to be a subtle bug in the FreeBSD code when using "
+"`mmap` on these drives mounted under FreeBSD: If the file is over a certain "
+"size, `mmap` will just fill the memory with zeros, and then copy them to the "
+"file overwriting its contents."
+msgstr ""
+"Не используйте эту программу для файлов, хранящихся на диске, "
+"отформатированном в MS-DOS(R) или Windows(R). В коде FreeBSD присутствует "
+"неочевидная ошибка при использовании `mmap` на таких дисках, смонтированных "
+"в FreeBSD: если размер файла превышает определённое значение, `mmap` "
+"заполнит память нулями, а затем запишет их в файл, перезаписав его "
+"содержимое."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2241
+#, no-wrap
+msgid "One-Pointed Mind"
+msgstr "Спокойствие ума"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2244
+msgid ""
+"As a student of Zen, I like the idea of a one-pointed mind: Do one thing at "
+"a time, and do it well."
+msgstr ""
+"Как ученик дзэн, мне нравится идея спокойствия ума (экаггата): делай одно "
+"дело за раз и делай его хорошо."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2247
+msgid ""
+"This, indeed, is very much how UNIX(R) works as well. While a typical "
+"Windows(R) application is attempting to do everything imaginable (and is, "
+"therefore, riddled with bugs), a typical UNIX(R) program does only one "
+"thing, and it does it well."
+msgstr ""
+"Вот именно так, в большинстве случаев, работает и UNIX(R). В то время как "
+"типичное приложение Windows(R) пытается сделать всё, что только можно (и "
+"поэтому кишит ошибками), типичная программа UNIX(R) делает только одну вещь, "
+"но делает её хорошо."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2249
+msgid ""
+"The typical UNIX(R) user then essentially assembles his own applications by "
+"writing a shell script which combines the various existing programs by "
+"piping the output of one program to the input of another."
+msgstr ""
+"Типичный пользователь UNIX(R) по сути собирает свои собственные приложения, "
+"написав shell-скрипт, который объединяет различные существующие программы, "
+"передавая вывод одной программы на вход другой."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2251
+msgid ""
+"When writing your own UNIX(R) software, it is generally a good idea to see "
+"what parts of the problem you need to solve can be handled by existing "
+"programs, and only write your own programs for that part of the problem that "
+"you do not have an existing solution for."
+msgstr ""
+"При написании собственного программного обеспечения для UNIX(R) обычно "
+"рекомендуется определить, какие части решаемой задачи могут быть обработаны "
+"существующими программами, и создавать собственные программы только для той "
+"части задачи, для которой нет готового решения."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2253
+#, no-wrap
+msgid "CSV"
+msgstr "CSV"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2256
+msgid ""
+"I will illustrate this principle with a specific real-life example I was "
+"faced with recently:"
+msgstr ""
+"Я проиллюстрирую этот принцип конкретным примером из реальной жизни, с "
+"которым недавно столкнулся:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2260
+msgid ""
+"I needed to extract the 11th field of each record from a database I "
+"downloaded from a web site. The database was a CSV file, i.e., a list of "
+"_comma-separated values_. That is quite a standard format for sharing data "
+"among people who may be using different database software."
+msgstr ""
+"Мне нужно было извлечь 11-е поле каждой записи из базы данных, которую я "
+"загрузил с веб-сайта. База данных представляла собой CSV-файл, то есть "
+"список _значений, разделённых запятыми_. Это довольно стандартный формат для "
+"обмена данными между людьми, которые могут использовать разное программное "
+"обеспечение для работы с базами данных."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2263
+msgid ""
+"The first line of the file contains the list of various fields separated by "
+"commas. The rest of the file contains the data listed line by line, with "
+"values separated by commas."
+msgstr ""
+"Первая строка файла содержит список различных полей, разделенных запятыми. "
+"Остальная часть файла содержит данные, перечисленные построчно, со "
+"значениями, разделенными запятыми."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2265
+msgid ""
+"I tried awk, using the comma as a separator. But because several lines "
+"contained a quoted comma, awk was extracting the wrong field from those "
+"lines."
+msgstr ""
+"Я попробовал awk, используя запятую в качестве разделителя. Но поскольку "
+"несколько строк содержали запятую в кавычках, awk извлекал неправильное поле "
+"из этих строк."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2268
+msgid ""
+"Therefore, I needed to write my own software to extract the 11th field from "
+"the CSV file. However, going with the UNIX(R) spirit, I only needed to "
+"write a simple filter that would do the following:"
+msgstr ""
+"Следовательно, мне нужно было написать собственное программное обеспечение "
+"для извлечения 11-го поля из CSV-файла. Однако, следуя духу UNIX(R), мне "
+"нужно было лишь создать простой фильтр, выполняющий следующие действия:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2270
+msgid "Remove the first line from the file;"
+msgstr "Удалить первую строку из файла;"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2271
+msgid "Change all unquoted commas to a different character;"
+msgstr "Заменить все не заключённые в кавычки запятые на другой символ;"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2272
+msgid "Remove all quotation marks."
+msgstr "Удалить все кавычки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2274
+msgid ""
+"Strictly speaking, I could use sed to remove the first line from the file, "
+"but doing so in my own program was very easy, so I decided to do it and "
+"reduce the size of the pipeline."
+msgstr ""
+"Строго говоря, я мог бы использовать sed для удаления первой строки из "
+"файла, но сделать это в моей собственной программе было очень просто, "
+"поэтому я решил так поступить и уменьшить размер конвейера."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2278
+msgid ""
+"At any rate, writing a program like this took me about 20 minutes. Writing "
+"a program that extracts the 11th field from the CSV file would take a lot "
+"longer, and I could not reuse it to extract some other field from some other "
+"database."
+msgstr ""
+"В любом случае, написание подобной программы заняло у меня около 20 минут. "
+"Написание программы, которая извлекает 11-е поле из CSV-файла, заняло бы "
+"гораздо больше времени, и я не смог бы повторно использовать её для "
+"извлечения другого поля из другой базы данных."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2280
+msgid ""
+"This time I decided to let it do a little more work than a typical tutorial "
+"program would:"
+msgstr ""
+"На этот раз я решил позволить ей выполнить немного больше работы, чем "
+"обычная учебная программа:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2282
+msgid "It parses its command line for options;"
+msgstr "Она анализирует свою командную строку на наличие опций;"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2283
+msgid "It displays proper usage if it finds wrong arguments;"
+msgstr "Она отображает подсказку, если обнаруживает неверные аргументы;"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2284
+msgid "It produces meaningful error messages."
+msgstr "Она выдает понятные сообщения об ошибках."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2286
+msgid "Here is its usage message:"
+msgstr "Вот какое сообщение она выводит о том, как ее использовать:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2290
+#, no-wrap
+msgid "Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]\n"
+msgstr "Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2293
+msgid "All parameters are optional, and can appear in any order."
+msgstr "Все параметры необязательны и могут располагаться в любом порядке."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2297
+msgid ""
+"The `-t` parameter declares what to replace the commas with. The `tab` is "
+"the default here. For example, `-t;` will replace all unquoted commas with "
+"semicolons."
+msgstr ""
+"Параметр `-t` указывает, на что заменить запятые. По умолчанию используется "
+"`tab`. Например, `-t;` заменит все незакавыченные запятые на точку с запятой."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2301
+msgid ""
+"I did not need the `-c` option, but it may come in handy in the future. It "
+"lets me declare that I want a character other than a comma replaced with "
+"something else. For example, `-c@` will replace all at signs (useful if you "
+"want to split a list of email addresses to their user names and domains)."
+msgstr ""
+"Мне не понадобилась опция `-c`, но в будущем она может пригодиться. Она "
+"позволяет указать, что я хочу заменить символ, отличный от запятой, на что-"
+"то другое. Например, `-c@` заменит все знаки @ (полезно, если нужно "
+"разделить список email-адресов на имена пользователей и домены)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2304
+msgid ""
+"The `-p` option preserves the first line, i.e., it does not delete it. By "
+"default, we delete the first line because in a CSV file it contains the "
+"field names rather than data."
+msgstr ""
+"Опция `-p` сохраняет первую строку, т.е. не удаляет её. По умолчанию мы "
+"удаляем первую строку, потому что в CSV-файле она содержит названия полей, а "
+"не данные."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2307
+msgid ""
+"The `-i` and `-o` options let me specify the input and the output files. "
+"Defaults are [.filename]#stdin# and [.filename]#stdout#, so this is a "
+"regular UNIX(R) filter."
+msgstr ""
+"Опции `-i` и `-o` позволяют указать входной и выходной файлы. По умолчанию "
+"используются [.filename]#stdin# и [.filename]#stdout#, как обычно работает "
+"стандартный фильтр UNIX(R)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2310
+msgid ""
+"I made sure that both `-i filename` and `-ifilename` are accepted. I also "
+"made sure that only one input and one output files may be specified."
+msgstr ""
+"Я убедился, что принимаются как `-i filename`, так и `-ifilename`. Также я "
+"убедился, что может быть указан только один входной и один выходной файл."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2312
+msgid "To get the 11th field of each record, I can now do:"
+msgstr "Чтобы получить 11-е поле каждой записи, теперь я могу сделать:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2316
+#, no-wrap
+msgid "% csv '-t;' data.csv | awk '-F;' '{print $11}'\n"
+msgstr "% csv '-t;' data.csv | awk '-F;' '{print $11}'\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2319
+msgid ""
+"The code stores the options (except for the file descriptors) in `EDX`: The "
+"comma in `DH`, the new separator in `DL`, and the flag for the `-p` option "
+"in the highest bit of `EDX`, so a check for its sign will give us a quick "
+"decision what to do."
+msgstr ""
+"Код сохраняет параметры (за исключением файловых дескрипторов) в `EDX`: "
+"запятая в `DH`, новый разделитель в `DL`, а флаг параметра `-p` в старшем "
+"бите `EDX`, поэтому проверка его знака даст нам быстрое решение о дальнейших "
+"действиях."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2321
+msgid "Here is the code:"
+msgstr "Вот код:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2335
+#, no-wrap
+msgid ""
+";;;;;;; csv.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";\n"
+"; Convert a comma-separated file to a something-else separated file.\n"
+";\n"
+"; Started:\t31-May-2001\n"
+"; Updated:\t 1-Jun-2001\n"
+";\n"
+"; Copyright (c) 2001 G. Adam Stanislav\n"
+"; All rights reserved.\n"
+";\n"
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+msgstr ""
+";;;;;;; csv.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";\n"
+"; Convert a comma-separated file to a something-else separated file.\n"
+";\n"
+"; Started:\t31-May-2001\n"
+"; Updated:\t 1-Jun-2001\n"
+";\n"
+"; Copyright (c) 2001 G. Adam Stanislav\n"
+"; All rights reserved.\n"
+";\n"
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2349
+#, no-wrap
+msgid ""
+"section\t.data\n"
+"fd.in\tdd\tstdin\n"
+"fd.out\tdd\tstdout\n"
+"usg\tdb\t'Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]', 0Ah\n"
+"usglen\tequ\t$-usg\n"
+"iemsg\tdb\t\"csv: Can't open input file\", 0Ah\n"
+"iemlen\tequ\t$-iemsg\n"
+"oemsg\tdb\t\"csv: Can't create output file\", 0Ah\n"
+"oemlen\tequ\t$-oemsg\n"
+msgstr ""
+"section\t.data\n"
+"fd.in\tdd\tstdin\n"
+"fd.out\tdd\tstdout\n"
+"usg\tdb\t'Usage: csv [-t<delim>] [-c<comma>] [-p] [-o <outfile>] [-i <infile>]', 0Ah\n"
+"usglen\tequ\t$-usg\n"
+"iemsg\tdb\t\"csv: Can't open input file\", 0Ah\n"
+"iemlen\tequ\t$-iemsg\n"
+"oemsg\tdb\t\"csv: Can't create output file\", 0Ah\n"
+"oemlen\tequ\t$-oemsg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2363
+#, no-wrap
+msgid ""
+"section\t.text\n"
+"align 4\n"
+"ierr:\n"
+"\tpush\tdword iemlen\n"
+"\tpush\tdword iemsg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 1\t\t; return failure\n"
+"\tsys.exit\n"
+msgstr ""
+"section\t.text\n"
+"align 4\n"
+"ierr:\n"
+"\tpush\tdword iemlen\n"
+"\tpush\tdword iemsg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 1\t\t; return failure\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2372
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3421
+#, no-wrap
+msgid ""
+"align 4\n"
+"oerr:\n"
+"\tpush\tdword oemlen\n"
+"\tpush\tdword oemsg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 2\n"
+"\tsys.exit\n"
+msgstr ""
+"align 4\n"
+"oerr:\n"
+"\tpush\tdword oemlen\n"
+"\tpush\tdword oemsg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 2\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2381
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3430
+#, no-wrap
+msgid ""
+"align 4\n"
+"usage:\n"
+"\tpush\tdword usglen\n"
+"\tpush\tdword usg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 3\n"
+"\tsys.exit\n"
+msgstr ""
+"align 4\n"
+"usage:\n"
+"\tpush\tdword usglen\n"
+"\tpush\tdword usg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 3\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2387
+#, no-wrap
+msgid ""
+"align 4\n"
+"global\t_start\n"
+"_start:\n"
+"\tadd\tesp, byte 8\t; discard argc and argv[0]\n"
+"\tmov\tedx, (',' << 8) | 9\n"
+msgstr ""
+"align 4\n"
+"global\t_start\n"
+"_start:\n"
+"\tadd\tesp, byte 8\t; discard argc and argv[0]\n"
+"\tmov\tedx, (',' << 8) | 9\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2392
+#, no-wrap
+msgid ""
+".arg:\n"
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje\tnear .init\t\t; no more arguments\n"
+msgstr ""
+".arg:\n"
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje\tnear .init\t\t; no more arguments\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2396
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3445
+#, no-wrap
+msgid ""
+"\t; ECX contains the pointer to an argument\n"
+"\tcmp\tbyte [ecx], '-'\n"
+"\tjne\tusage\n"
+msgstr ""
+"\t; ECX contains the pointer to an argument\n"
+"\tcmp\tbyte [ecx], '-'\n"
+"\tjne\tusage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2399
+#, no-wrap
+msgid ""
+"\tinc\tecx\n"
+"\tmov\tax, [ecx]\n"
+msgstr ""
+"\tinc\tecx\n"
+"\tmov\tax, [ecx]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2403
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3453
+#, no-wrap
+msgid ""
+".o:\n"
+"\tcmp\tal, 'o'\n"
+"\tjne\t.i\n"
+msgstr ""
+".o:\n"
+"\tcmp\tal, 'o'\n"
+"\tjne\t.i\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2407
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3457
+#, no-wrap
+msgid ""
+"\t; Make sure we are not asked for the output file twice\n"
+"\tcmp\tdword [fd.out], stdout\n"
+"\tjne\tusage\n"
+msgstr ""
+"\t; Make sure we are not asked for the output file twice\n"
+"\tcmp\tdword [fd.out], stdout\n"
+"\tjne\tusage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2412
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3462
+#, no-wrap
+msgid ""
+"\t; Find the path to output file - it is either at [ECX+1],\n"
+"\t; i.e., -ofile --\n"
+"\t; or in the next argument,\n"
+"\t; i.e., -o file\n"
+msgstr ""
+"\t; Find the path to output file - it is either at [ECX+1],\n"
+"\t; i.e., -ofile --\n"
+"\t; or in the next argument,\n"
+"\t; i.e., -o file\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2418
+#, no-wrap
+msgid ""
+"\tinc\tecx\n"
+"\tor\tah, ah\n"
+"\tjne\t.openoutput\n"
+"\tpop\tecx\n"
+"\tjecxz\tusage\n"
+msgstr ""
+"\tinc\tecx\n"
+"\tor\tah, ah\n"
+"\tjne\t.openoutput\n"
+"\tpop\tecx\n"
+"\tjecxz\tusage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2426
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3475
+#, no-wrap
+msgid ""
+".openoutput:\n"
+"\tpush\tdword 420\t; file mode (644 octal)\n"
+"\tpush\tdword 0200h | 0400h | 01h\n"
+"\t; O_CREAT | O_TRUNC | O_WRONLY\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\tnear oerr\n"
+msgstr ""
+".openoutput:\n"
+"\tpush\tdword 420\t; file mode (644 octal)\n"
+"\tpush\tdword 0200h | 0400h | 01h\n"
+"\t; O_CREAT | O_TRUNC | O_WRONLY\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\tnear oerr\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2430
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3479
+#, no-wrap
+msgid ""
+"\tadd\tesp, byte 12\n"
+"\tmov\t[fd.out], eax\n"
+"\tjmp\tshort .arg\n"
+msgstr ""
+"\tadd\tesp, byte 12\n"
+"\tmov\t[fd.out], eax\n"
+"\tjmp\tshort .arg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2434
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3483
+#, no-wrap
+msgid ""
+".i:\n"
+"\tcmp\tal, 'i'\n"
+"\tjne\t.p\n"
+msgstr ""
+".i:\n"
+"\tcmp\tal, 'i'\n"
+"\tjne\t.p\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2438
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3487
+#, no-wrap
+msgid ""
+"\t; Make sure we are not asked twice\n"
+"\tcmp\tdword [fd.in], stdin\n"
+"\tjne\tnear usage\n"
+msgstr ""
+"\t; Make sure we are not asked twice\n"
+"\tcmp\tdword [fd.in], stdin\n"
+"\tjne\tnear usage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2446
+#, no-wrap
+msgid ""
+"\t; Find the path to the input file\n"
+"\tinc\tecx\n"
+"\tor\tah, ah\n"
+"\tjne\t.openinput\n"
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje near usage\n"
+msgstr ""
+"\t; Find the path to the input file\n"
+"\tinc\tecx\n"
+"\tor\tah, ah\n"
+"\tjne\t.openinput\n"
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje near usage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2452
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3500
+#, no-wrap
+msgid ""
+".openinput:\n"
+"\tpush\tdword 0\t\t; O_RDONLY\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\tnear ierr\t\t; open failed\n"
+msgstr ""
+".openinput:\n"
+"\tpush\tdword 0\t\t; O_RDONLY\n"
+"\tpush\tecx\n"
+"\tsys.open\n"
+"\tjc\tnear ierr\t\t; open failed\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2456
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3504
+#, no-wrap
+msgid ""
+"\tadd\tesp, byte 8\n"
+"\tmov\t[fd.in], eax\n"
+"\tjmp\t.arg\n"
+msgstr ""
+"\tadd\tesp, byte 8\n"
+"\tmov\t[fd.in], eax\n"
+"\tjmp\t.arg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2464
+#, no-wrap
+msgid ""
+".p:\n"
+"\tcmp\tal, 'p'\n"
+"\tjne\t.t\n"
+"\tor\tah, ah\n"
+"\tjne\tnear usage\n"
+"\tor\tedx, 1 << 31\n"
+"\tjmp\t.arg\n"
+msgstr ""
+".p:\n"
+"\tcmp\tal, 'p'\n"
+"\tjne\t.t\n"
+"\tor\tah, ah\n"
+"\tjne\tnear usage\n"
+"\tor\tedx, 1 << 31\n"
+"\tjmp\t.arg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2472
+#, no-wrap
+msgid ""
+".t:\n"
+"\tcmp\tal, 't'\t\t; redefine output delimiter\n"
+"\tjne\t.c\n"
+"\tor\tah, ah\n"
+"\tje\tnear usage\n"
+"\tmov\tdl, ah\n"
+"\tjmp\t.arg\n"
+msgstr ""
+".t:\n"
+"\tcmp\tal, 't'\t\t; redefine output delimiter\n"
+"\tjne\t.c\n"
+"\tor\tah, ah\n"
+"\tje\tnear usage\n"
+"\tmov\tdl, ah\n"
+"\tjmp\t.arg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2480
+#, no-wrap
+msgid ""
+".c:\n"
+"\tcmp\tal, 'c'\n"
+"\tjne\tnear usage\n"
+"\tor\tah, ah\n"
+"\tje\tnear usage\n"
+"\tmov\tdh, ah\n"
+"\tjmp\t.arg\n"
+msgstr ""
+".c:\n"
+"\tcmp\tal, 'c'\n"
+"\tjne\tnear usage\n"
+"\tor\tah, ah\n"
+"\tje\tnear usage\n"
+"\tmov\tdh, ah\n"
+"\tjmp\t.arg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2487
+#, no-wrap
+msgid ""
+"align 4\n"
+".init:\n"
+"\tsub\teax, eax\n"
+"\tsub\tebx, ebx\n"
+"\tsub\tecx, ecx\n"
+"\tmov\tedi, obuffer\n"
+msgstr ""
+"align 4\n"
+".init:\n"
+"\tsub\teax, eax\n"
+"\tsub\tebx, ebx\n"
+"\tsub\tecx, ecx\n"
+"\tmov\tedi, obuffer\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2491
+#, no-wrap
+msgid ""
+"\t; See if we are to preserve the first line\n"
+"\tor\tedx, edx\n"
+"\tjs\t.loop\n"
+msgstr ""
+"\t; See if we are to preserve the first line\n"
+"\tor\tedx, edx\n"
+"\tjs\t.loop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2497
+#, no-wrap
+msgid ""
+".firstline:\n"
+"\t; get rid of the first line\n"
+"\tcall\tgetchar\n"
+"\tcmp\tal, 0Ah\n"
+"\tjne\t.firstline\n"
+msgstr ""
+".firstline:\n"
+"\t; get rid of the first line\n"
+"\tcall\tgetchar\n"
+"\tcmp\tal, 0Ah\n"
+"\tjne\t.firstline\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2505
+#, no-wrap
+msgid ""
+"\t; is it a comma (or whatever the user asked for)?\n"
+"\tcmp\tal, dh\n"
+"\tjne\t.quote\n"
+msgstr ""
+"\t; is it a comma (or whatever the user asked for)?\n"
+"\tcmp\tal, dh\n"
+"\tjne\t.quote\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2508
+#, no-wrap
+msgid ""
+"\t; Replace the comma with a tab (or whatever the user wants)\n"
+"\tmov\tal, dl\n"
+msgstr ""
+"\t; Replace the comma with a tab (or whatever the user wants)\n"
+"\tmov\tal, dl\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2516
+#, no-wrap
+msgid ""
+".quote:\n"
+"\tcmp\tal, '\"'\n"
+"\tjne\t.put\n"
+msgstr ""
+".quote:\n"
+"\tcmp\tal, '\"'\n"
+"\tjne\t.put\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2523
+#, no-wrap
+msgid ""
+"\t; Print everything until you get another quote or EOL. If it\n"
+"\t; is a quote, skip it. If it is EOL, print it.\n"
+".qloop:\n"
+"\tcall\tgetchar\n"
+"\tcmp\tal, '\"'\n"
+"\tje\t.loop\n"
+msgstr ""
+"\t; Print everything until you get another quote or EOL. If it\n"
+"\t; is a quote, skip it. If it is EOL, print it.\n"
+".qloop:\n"
+"\tcall\tgetchar\n"
+"\tcmp\tal, '\"'\n"
+"\tje\t.loop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2526
+#, no-wrap
+msgid ""
+"\tcmp\tal, 0Ah\n"
+"\tje\t.put\n"
+msgstr ""
+"\tcmp\tal, 0Ah\n"
+"\tje\t.put\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2529
+#, no-wrap
+msgid ""
+"\tcall\tputchar\n"
+"\tjmp\tshort .qloop\n"
+msgstr ""
+"\tcall\tputchar\n"
+"\tjmp\tshort .qloop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2545
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3860
+#, no-wrap
+msgid ""
+"read:\n"
+"\tjecxz\t.read\n"
+"\tcall\twrite\n"
+msgstr ""
+"read:\n"
+"\tjecxz\t.read\n"
+"\tcall\twrite\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2558
+#, no-wrap
+msgid ""
+".read:\n"
+"\tpush\tdword BUFSIZE\n"
+"\tmov\tesi, ibuffer\n"
+"\tpush\tesi\n"
+"\tpush\tdword [fd.in]\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tmov\tebx, eax\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+msgstr ""
+".read:\n"
+"\tpush\tdword BUFSIZE\n"
+"\tmov\tesi, ibuffer\n"
+"\tpush\tesi\n"
+"\tpush\tdword [fd.in]\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tmov\tebx, eax\n"
+"\tor\teax, eax\n"
+"\tje\t.done\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2595
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3901
+#, no-wrap
+msgid ""
+"align 4\n"
+"write:\n"
+"\tjecxz\t.ret\t; nothing to write\n"
+"\tsub\tedi, ecx\t; start of buffer\n"
+"\tpush\tecx\n"
+"\tpush\tedi\n"
+"\tpush\tdword [fd.out]\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tsub\teax, eax\n"
+"\tsub\tecx, ecx\t; buffer is empty now\n"
+".ret:\n"
+"\tret\n"
+msgstr ""
+"align 4\n"
+"write:\n"
+"\tjecxz\t.ret\t; nothing to write\n"
+"\tsub\tedi, ecx\t; start of buffer\n"
+"\tpush\tecx\n"
+"\tpush\tedi\n"
+"\tpush\tdword [fd.out]\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tsub\teax, eax\n"
+"\tsub\tecx, ecx\t; buffer is empty now\n"
+".ret:\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2600
+msgid ""
+"Much of it is taken from [.filename]#hex.asm# above. But there is one "
+"important difference: I no longer call `write` whenever I am outputting a "
+"line feed. Yet, the code can be used interactively."
+msgstr ""
+"Большая часть взята из [.filename]#hex.asm# выше. Однако есть одно важное "
+"отличие: я больше не вызываю `write` каждый раз при выводе перевода строки. "
+"Тем не менее, код можно использовать интерактивно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2604
+msgid ""
+"I have found a better solution for the interactive problem since I first "
+"started writing this chapter. I wanted to make sure each line is printed "
+"out separately only when needed. After all, there is no need to flush out "
+"every line when used non-interactively."
+msgstr ""
+"Я нашел лучшее решение для интерактивной проблемы с тех пор, как начал "
+"писать эту главу. Я хотел убедиться, что каждая строка выводится отдельно "
+"только при необходимости. В конце концов, нет необходимости выводить каждую "
+"строку при неинтерактивном использовании."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2608
+msgid ""
+"The new solution I use now is to call `write` every time I find the input "
+"buffer empty. That way, when running in the interactive mode, the program "
+"reads one line from the user's keyboard, processes it, and sees its input "
+"buffer is empty. It flushes its output and reads the next line."
+msgstr ""
+"Новое решение, которое я использую сейчас, заключается в вызове `write` "
+"каждый раз, когда обнаруживаю, что входной буфер пуст. Таким образом, при "
+"работе в интерактивном режиме программа считывает одну строку с клавиатуры "
+"пользователя, обрабатывает её и видит, что входной буфер пуст. Она "
+"сбрасывает свой вывод и читает следующую строку."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2610
+#, no-wrap
+msgid "The Dark Side of Buffering"
+msgstr "Темная сторона буферизации"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2614
+msgid ""
+"This change prevents a mysterious lockup in a very specific case. I refer "
+"to it as the _dark side of buffering_, mostly because it presents a danger "
+"that is not quite obvious."
+msgstr ""
+"Это изменение предотвращает загадочную блокировку в очень специфическом "
+"случае. Я называю это _тёмной стороной буферизации_, в основном потому, что "
+"это представляет опасность, которая не совсем очевидна."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2618
+msgid ""
+"It is unlikely to happen with a program like the csv above, so let us "
+"consider yet another filter: In this case we expect our input to be raw data "
+"representing color values, such as the _red_, _green_, and _blue_ "
+"intensities of a pixel. Our output will be the negative of our input."
+msgstr ""
+"Маловероятно, что это произойдет с такой программой, как csv выше, поэтому "
+"рассмотрим еще один фильтр: в этом случае мы ожидаем, что наши входные "
+"данные будут представлять собой необработанные данные, описывающие значения "
+"цветов, такие как интенсивности _красного_, _зеленого_ и _синего_ для "
+"пикселя. На выходе мы получим негатив входных данных."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2621
+msgid ""
+"Such a filter would be very simple to write. Most of it would look just "
+"like all the other filters we have written so far, so I am only going to "
+"show you its inner loop:"
+msgstr ""
+"Такой фильтр было бы очень просто написать. Большая его часть выглядела бы "
+"так же, как и все другие фильтры, которые мы уже писали, поэтому я покажу "
+"только его внутренний цикл:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2629
+#, no-wrap
+msgid ""
+".loop:\n"
+"\tcall\tgetchar\n"
+"\tnot\tal\t\t; Create a negative\n"
+"\tcall\tputchar\n"
+"\tjmp\tshort .loop\n"
+msgstr ""
+".loop:\n"
+"\tcall\tgetchar\n"
+"\tnot\tal\t\t; Create a negative\n"
+"\tcall\tputchar\n"
+"\tjmp\tshort .loop\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2632
+msgid ""
+"Because this filter works with raw data, it is unlikely to be used "
+"interactively."
+msgstr ""
+"Поскольку этот фильтр работает с необработанными данными, он вряд ли будет "
+"использоваться интерактивно."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2635
+msgid ""
+"But it could be called by image manipulation software. And, unless it calls "
+"`write` before each call to `read`, chances are it will lock up."
+msgstr ""
+"Но он может вызываться программным обеспечением для обработки изображений. "
+"И, если он не вызывает `write` перед каждым вызовом `read`, высока "
+"вероятность, что он зависнет."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2637
+msgid "Here is what might happen:"
+msgstr "Вот что может произойти:"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2640
+msgid "The image editor will load our filter using the C function `popen()`."
+msgstr ""
+"Редактор изображений загрузит наш фильтр, используя функцию `popen()` на "
+"языке C."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2641
+msgid "It will read the first row of pixels from a bitmap or pixmap."
+msgstr ""
+"Он прочитает первый ряд пикселей из битовой карты или пиксельной карты."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2642
+msgid ""
+"It will write the first row of pixels to the _pipe_ leading to the `fd.in` "
+"of our filter."
+msgstr ""
+"Он запишет первую строку пикселей в _канал_, ведущий к `fd.in` нашего "
+"фильтра."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2643
+msgid ""
+"Our filter will read each pixel from its input, turn it to a negative, and "
+"write it to its output buffer."
+msgstr ""
+"Наш фильтр будет читать каждый пиксель из входных данных, преобразовывать "
+"его в негатив и записывать в выходной буфер."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2644
+msgid "Our filter will call `getchar` to fetch the next pixel."
+msgstr "Наш фильтр будет вызывать `getchar` для получения следующего пикселя."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2645
+msgid "`getchar` will find an empty input buffer, so it will call `read`."
+msgstr "`getchar` обнаружит пустой входной буфер, поэтому вызовет `read`."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2646
+msgid "`read` will call the `SYS_read` system call."
+msgstr "`read` вызовет системный вызов `SYS_read`."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2647
+msgid ""
+"The _kernel_ will suspend our filter until the image editor sends more data "
+"to the pipe."
+msgstr ""
+"_Ядро_ приостановит работу нашего фильтра до тех пор, пока редактор "
+"изображений не отправит больше данных в канал."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2648
+msgid ""
+"The image editor will read from the other pipe, connected to the `fd.out` of "
+"our filter so it can set the first row of the output image _before_ it sends "
+"us the second row of the input."
+msgstr ""
+"Редактор изображений будет читать из другого канала, подключенного к "
+"`fd.out` нашего фильтра, чтобы он мог установить первую строку выходного "
+"изображения _до_ того, как отправит нам вторую строку входного."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2649
+msgid ""
+"The _kernel_ suspends the image editor until it receives some output from "
+"our filter, so it can pass it on to the image editor."
+msgstr ""
+"_Ядро_ приостанавливает работу графического редактора до тех пор, пока не "
+"получит какие-либо данные от нашего фильтра, чтобы передать их редактору."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2653
+msgid ""
+"At this point our filter waits for the image editor to send it more data to "
+"process, while the image editor is waiting for our filter to send it the "
+"result of the processing of the first row. But the result sits in our "
+"output buffer."
+msgstr ""
+"На этом этапе наш фильтр ожидает, что редактор изображений отправит ему "
+"больше данных для обработки, в то время как редактор изображений ожидает, "
+"что наш фильтр отправит ему результат обработки первой строки. Однако "
+"результат находится в нашем выходном буфере."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2656
+msgid ""
+"The filter and the image editor will continue waiting for each other forever "
+"(or, at least, until they are killed). Our software has just entered a "
+"crossref:secure[secure-race-conditions,race condition]."
+msgstr ""
+"Фильтр и редактор изображений будут продолжать ждать друг друга вечно (или, "
+"по крайней мере, пока их не завершат командой kill). Наше программное "
+"обеспечение только что вошло в crossref:secure[secure-race-"
+"conditions,состояние гонки]."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2658
+msgid ""
+"This problem does not exist if our filter flushes its output buffer _before_ "
+"asking the _kernel_ for more input data."
+msgstr ""
+"Эта проблема не возникает, если наш фильтр очищает свой выходной буфер "
+"_перед_ запросом к _ядру_ для получения дополнительных входных данных."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2660
+#, no-wrap
+msgid "Using the FPU"
+msgstr "Использование FPU"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2663
+msgid ""
+"Strangely enough, most of assembly language literature does not even mention "
+"the existence of the FPU, or _floating point unit_, let alone discuss "
+"programming it."
+msgstr ""
+"Как ни странно, большая часть литературы по ассемблеру даже не упоминает о "
+"существовании FPU, или _блока обработки чисел с плавающей запятой_, не "
+"говоря уже о программировании для него."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2665
+msgid ""
+"Yet, never does assembly language shine more than when we create highly "
+"optimized FPU code by doing things that can be done _only_ in assembly "
+"language."
+msgstr ""
+"Тем не менее, язык ассемблера проявляет себя наилучшим образом, когда мы "
+"создаем высокооптимизированный код для FPU, выполняя вещи, которые можно "
+"сделать _только_ на языке ассемблера."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2667
+#, no-wrap
+msgid "Organization of the FPU"
+msgstr "Организация FPU"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2671
+msgid ""
+"The FPU consists of 8 80-bit floating-point registers. These are organized "
+"in a stack fashion-you can `push` a value on TOS (_top of stack_) and you "
+"can `pop` it."
+msgstr ""
+"FPU состоит из 8 80-битных регистров с плавающей запятой. Они организованы в "
+"виде стека — вы можете `push` (поместить) значение на TOS (_вершина стека_) "
+"и `pop` (извлечь) его."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2673
+msgid ""
+"That said, the assembly language op codes are not `push` and `pop` because "
+"those are already taken."
+msgstr ""
+"Как бы то ни было, мнемоники ассемблера — не `push` и `pop`, потому что они "
+"уже заняты."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2676
+msgid ""
+"You can `push` a value on TOS by using `fld`, `fild`, and `fbld`. Several "
+"other op codes let you `push` many common _constants_-such as _pi_-on the "
+"TOS."
+msgstr ""
+"Вы можете `push` (положить) значение на вершину стека (TOS), используя "
+"`fld`, `fild` и `fbld`. Несколько других кодов операций позволяют вам `push` "
+"(положить) многие распространённые _константы_ — например, _pi_ — на вершину "
+"стека (TOS)."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2679
+msgid ""
+"Similarly, you can `pop` a value by using `fst`, `fstp`, `fist`, `fistp`, "
+"and `fbstp`. Actually, only the op codes that end with a _p_ will literally "
+"`pop` the value, the rest will `store` it somewhere else without removing it "
+"from the TOS."
+msgstr ""
+"Аналогично, вы можете `извлечь` значение с помощью `fst`, `fstp`, `fist`, "
+"`fistp` и `fbstp`. На самом деле только коды операций, оканчивающиеся на "
+"_p_, буквально `извлекают` значение, остальные же `сохраняют` его в другом "
+"месте, не удаляя с вершины стека (TOS)."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2681
+msgid ""
+"We can transfer the data between the TOS and the computer memory either as a "
+"32-bit, 64-bit, or 80-bit _real_, a 16-bit, 32-bit, or 64-bit _integer_, or "
+"an 80-bit _packed decimal_."
+msgstr ""
+"Мы можем передавать данные между TOS и памятью компьютера либо как 32-"
+"битное, 64-битное или 80-битное _вещественное_ число, 16-битное, 32-битное "
+"или 64-битное _целое_ число, либо как 80-битное _упакованное десятичное_ "
+"число."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2684
+msgid ""
+"The 80-bit _packed decimal_ is a special case of _binary coded decimal_ "
+"which is very convenient when converting between the ASCII representation of "
+"data and the internal data of the FPU. It allows us to use 18 significant "
+"digits."
+msgstr ""
+"80-битный _упакованный десятичный_ формат является особым случаем _двоично-"
+"десятичного кодирования_, который очень удобен при преобразовании между "
+"ASCII-представлением данных и внутренними данными FPU. Он позволяет "
+"использовать до 18 значащих цифр."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2686
+msgid ""
+"No matter how we represent data in the memory, the FPU always stores it in "
+"the 80-bit _real_ format in its registers."
+msgstr ""
+"Независимо от того, как мы представляем данные в памяти, FPU всегда хранит "
+"их в 80-битном формате _real_ в своих регистрах."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2688
+msgid ""
+"Its internal precision is at least 19 decimal digits, so even if we choose "
+"to display results as ASCII in the full 18-digit precision, we are still "
+"showing correct results."
+msgstr ""
+"Его внутренняя точность составляет не менее 19 десятичных цифр, поэтому даже "
+"если мы решим отображать результаты в формате ASCII с полной 18-значной "
+"точностью, мы всё равно будем показывать корректные результаты."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2690
+msgid ""
+"We can perform mathematical operations on the TOS: We can calculate its "
+"_sine_, we can _scale_ it (i.e., we can multiply or divide it by a power of "
+"2), we can calculate its base-2 _logarithm_, and many other things."
+msgstr ""
+"Мы можем выполнять математические операции над TOS: вычислять его _синус_, "
+"_масштабировать_ (то есть умножать или делить на степень двойки), вычислять "
+"его _логарифм_ по основанию 2 и многое другое."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2692
+msgid ""
+"We can also _multiply_ or _divide_ it by, _add_ it to, or _subtract_ it "
+"from, any of the FPU registers (including itself)."
+msgstr ""
+"Мы также можем _умножить_ или _разделить_ его, _прибавить_ к нему или "
+"_вычесть_ его из любого из регистров FPU (включая его самого)."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2695
+msgid ""
+"The official Intel op code for the TOS is `st`, and for the _registers_ "
+"`st(0)`-`st(7)`. `st` and `st(0)`, then, refer to the same register."
+msgstr ""
+"Официальный код операции Intel для TOS — `st`, а для _регистров_ — `st(0)`-"
+"`st(7)`. Таким образом, `st` и `st(0)` ссылаются на один и тот же регистр."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2698
+msgid ""
+"For whatever reasons, the original author of nasm has decided to use "
+"different op codes, namely `st0`-`st7`. In other words, there are no "
+"parentheses, and the TOS is always `st0`, never just `st`."
+msgstr ""
+"По каким-то причинам оригинальный автор nasm решил использовать другие коды "
+"операций, а именно `st0`-`st7`. Другими словами, скобки отсутствуют, а "
+"вершина стека всегда `st0`, но никогда просто `st`."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2700
+#, no-wrap
+msgid "The Packed Decimal Format"
+msgstr "Формат упакованного десятичного числа"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2704
+msgid ""
+"The _packed decimal_ format uses 10 bytes (80 bits) of memory to represent "
+"18 digits. The number represented there is always an _integer_."
+msgstr ""
+"Формат _упакованного десятичного числа_ использует 10 байт (80 бит) памяти "
+"для представления 18 цифр. Представленное число всегда является _целым_."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2708
+msgid ""
+"You can use it to get decimal places by multiplying the TOS by a power of 10 "
+"first."
+msgstr ""
+"Вы можете использовать это для получения десятичных знаков, предварительно "
+"умножив TOS на степень 10."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2712
+msgid ""
+"The highest bit of the highest byte (byte 9) is the _sign bit_: If it is "
+"set, the number is _negative_, otherwise, it is _positive_. The rest of the "
+"bits of this byte are unused/ignored."
+msgstr ""
+"Старший бит старшего байта (байт 9) является _знаковым битом_: если он "
+"установлен, число _отрицательное_, в противном случае — _положительное_. "
+"Остальные биты этого байта не используются/игнорируются."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2714
+msgid ""
+"The remaining 9 bytes store the 18 digits of the number: 2 digits per byte."
+msgstr "Оставшиеся 9 байт хранят 18 цифр числа: 2 цифры на байт."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2716
+msgid ""
+"The _more significant digit_ is stored in the high _nibble_ (4 bits), the "
+"_less significant digit_ in the low _nibble_."
+msgstr ""
+"_Старший разряд_ хранится в старшем _полубайте_ (4 бита), _младший разряд_ — "
+"в младшем _полубайте_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2718
+msgid ""
+"That said, you might think that `-1234567` would be stored in the memory "
+"like this (using hexadecimal notation):"
+msgstr ""
+"Как бы то ни было, вы можете подумать, что `-1234567` будет храниться в "
+"памяти следующим образом (в шестнадцатеричной записи):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2722
+#, no-wrap
+msgid "80 00 00 00 00 00 01 23 45 67\n"
+msgstr "80 00 00 00 00 00 01 23 45 67\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2725
+msgid ""
+"Alas it is not! As with everything else of Intel make, even the _packed "
+"decimal_ is _little-endian_."
+msgstr ""
+"Увы, это не так! Как и все остальное, созданное Intel, даже _упакованное "
+"десятичное число_ имеет порядок _от младшего к старшему_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2727
+msgid "That means our `-1234567` is stored like this:"
+msgstr "Это означает, что наш `-1234567` хранится следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2731
+#, no-wrap
+msgid "67 45 23 01 00 00 00 00 00 80\n"
+msgstr "67 45 23 01 00 00 00 00 00 80\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2734
+msgid "Remember that, or you will be pulling your hair out in desperation!"
+msgstr "Помните об этом, иначе вы будете рвать на себе волосы в отчаянии!"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2740
+msgid ""
+"The book to read-if you can find it-is Richard Startz' http://www.amazon.com/"
+"exec/obidos/ASIN/013246604X/whizkidtechnomag[8087/80287/80387 for the IBM PC "
+"& Compatibles]. Though it does seem to take the fact about the little-"
+"endian storage of the _packed decimal_ for granted. I kid you not about the "
+"desperation of trying to figure out what was wrong with the filter I show "
+"below _before_ it occurred to me I should try the little-endian order even "
+"for this type of data."
+msgstr ""
+"Книга, которую стоит прочитать — если сможете её найти — это книга Ричарда "
+"Старца http://www.amazon.com/exec/obidos/ASIN/013246604X/"
+"whizkidtechnomag[8087/80287/80387 для IBM PC и совместимых]. Хотя в ней, "
+"кажется, факт о little-endian хранении _упакованного десятичного числа_ "
+"принимается как данность. Я не шучу насчёт отчаяния, которое испытывал, "
+"пытаясь понять, что не так с фильтром, который я привожу ниже, _прежде_ чем "
+"мне пришло в голову попробовать little-endian порядок даже для этого типа "
+"данных."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2743
+#, no-wrap
+msgid "Excursion to Pinhole Photography"
+msgstr "Экскурсия в фотографию с помощью камеры-обскуры"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2746
+msgid ""
+"To write meaningful software, we must not only understand our programming "
+"tools, but also the field we are creating software for."
+msgstr ""
+"Чтобы создавать полезное программное обеспечение, мы должны понимать не "
+"только наши инструменты программирования, но и область, для которой "
+"разрабатываем ПО."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2748
+msgid ""
+"Our next filter will help us whenever we want to build a _pinhole camera_, "
+"so, we need some background in _pinhole photography_ before we can continue."
+msgstr ""
+"Наш следующий фильтр поможет нам, когда мы захотим создать _камеру-обскуру_, "
+"поэтому нам понадобятся некоторые знания о _фотографии с помощью обскуры_, "
+"прежде чем мы сможем продолжить."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2750
+#, no-wrap
+msgid "The Camera"
+msgstr "Камера"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2753
+msgid ""
+"The easiest way to describe any camera ever built is as some empty space "
+"enclosed in some lightproof material, with a small hole in the enclosure."
+msgstr ""
+"Самый простой способ описать любую когда-либо созданную камеру — это "
+"некоторое пустое пространство, заключённое в светонепроницаемый материал, с "
+"небольшим отверстием в корпусе."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2758
+msgid ""
+"The enclosure is usually sturdy (e.g., a box), though sometimes it is "
+"flexible (the bellows). It is quite dark inside the camera. However, the "
+"hole lets light rays in through a single point (though in some cases there "
+"may be several). These light rays form an image, a representation of "
+"whatever is outside the camera, in front of the hole."
+msgstr ""
+"Корпус обычно прочный (например, коробка), хотя иногда он гибкий "
+"(гофрированная часть). Внутри камеры довольно темно. Однако отверстие "
+"пропускает световые лучи через одну точку (хотя в некоторых случаях их может "
+"быть несколько). Эти световые лучи формируют изображение — представление "
+"того, что находится снаружи камеры, перед отверстием."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2760
+msgid ""
+"If some light sensitive material (such as film) is placed inside the camera, "
+"it can capture the image."
+msgstr ""
+"Если внутрь камеры поместить светочувствительный материал (например, "
+"плёнку), он может зафиксировать изображение."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2762
+msgid ""
+"The hole often contains a _lens_, or a lens assembly, often called the "
+"_objective_."
+msgstr ""
+"Отверстие часто содержит _линзу_ или сборку линз, которую часто называют "
+"_объективом_."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2764
+#, no-wrap
+msgid "The Pinhole"
+msgstr "Игольное ушко"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2768
+msgid ""
+"But, strictly speaking, the lens is not necessary: The original cameras did "
+"not use a lens but a _pinhole_. Even today, _pinholes_ are used, both as a "
+"tool to study how cameras work, and to achieve a special kind of image."
+msgstr ""
+"Но, строго говоря, линза не обязательна: первые камеры использовали не "
+"линзу, а _маленькое отверстие_ размером с игольное ушко. Даже сегодня "
+"_маленькие отверстия_ применяются как инструмент для изучения принципов "
+"работы камер и для создания особого вида изображений."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2772
+msgid ""
+"The image produced by the _pinhole_ is all equally sharp. Or _blurred_. "
+"There is an ideal size for a pinhole: If it is either larger or smaller, the "
+"image loses its sharpness."
+msgstr ""
+"Изображение, создаваемое _маленьким отверстием_, одинаково резкое. Или "
+"_размытое_. Существует идеальный размер для маленького отверстия: если оно "
+"больше или меньше, изображение теряет резкость."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2774
+#, no-wrap
+msgid "Focal Length"
+msgstr "Фокусное расстояние"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2777
+msgid ""
+"This ideal pinhole diameter is a function of the square root of _focal "
+"length_, which is the distance of the pinhole from the film."
+msgstr ""
+"Идеальный диаметр отверстия является функцией квадратного корня из "
+"_фокусного расстояния_, которое представляет собой расстояние от отверстия "
+"до плёнки."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2781
+#, no-wrap
+msgid "D = PC * sqrt(FL)\n"
+msgstr "D = PC * sqrt(FL)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2787
+msgid ""
+"In here, `D` is the ideal diameter of the pinhole, `FL` is the focal length, "
+"and `PC` is a pinhole constant. According to Jay Bender, its value is "
+"`0.04`, while Kenneth Connors has determined it to be `0.037`. Others have "
+"proposed other values. Plus, this value is for the daylight only: Other "
+"types of light will require a different constant, whose value can only be "
+"determined by experimentation."
+msgstr ""
+"Здесь `D` — идеальный диаметр отверстия, `FL` — фокусное расстояние, а `PC` "
+"— константа отверстия. По данным Джейя Бендера, её значение равно `0,04`, "
+"тогда как Кеннет Коннорс определил его как `0,037`. Другие исследователи "
+"предложили иные значения. Кроме того, это значение справедливо только для "
+"дневного света: другие типы освещения потребуют иной константы, значение "
+"которой можно определить только экспериментальным путём."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2789
+#, no-wrap
+msgid "The F-Number"
+msgstr "Число f (диафрагменное число)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2793
+msgid ""
+"The f-number is a very useful measure of how much light reaches the film. A "
+"light meter can determine that, for example, to expose a film of specific "
+"sensitivity with f5.6 mkay require the exposure to last 1/1000 sec."
+msgstr ""
+"Число f — это очень полезный показатель того, сколько света попадает на "
+"плёнку. Экспонометр может определить, что, например, для экспонирования "
+"плёнки определённой чувствительности при f5.6 может потребоваться выдержка "
+"1/1000 сек."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2796
+msgid ""
+"It does not matter whether it is a 35-mm camera, or a 6x9cm camera, etc. As "
+"long as we know the f-number, we can determine the proper exposure."
+msgstr ""
+"Не имеет значения, 35-мм это камера или камера 6x9 см и т.д. Достаточно "
+"знать диафрагменное число, чтобы определить правильную экспозицию."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2798
+msgid "The f-number is easy to calculate:"
+msgstr "Число f легко вычислить:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2802
+#, no-wrap
+msgid "F = FL / D\n"
+msgstr "F = FL / D\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2807
+msgid ""
+"In other words, the f-number equals the focal length divided by the diameter "
+"of the pinhole. It also means a higher f-number either implies a smaller "
+"pinhole or a larger focal distance, or both. That, in turn, implies, the "
+"higher the f-number, the longer the exposure has to be."
+msgstr ""
+"Другими словами, число f равно фокусному расстоянию, деленному на диаметр "
+"отверстия. Это также означает, что большее f-число подразумевает либо "
+"меньшее отверстие, либо большее фокусное расстояние, либо и то, и другое. В "
+"свою очередь, это означает, что чем больше число f, тем дольше должна быть "
+"выдержка."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2810
+msgid ""
+"Furthermore, while pinhole diameter and focal distance are one-dimensional "
+"measurements, both, the film and the pinhole, are two-dimensional. That "
+"means that if you have measured the exposure at f-number `A` as `t`, then "
+"the exposure at f-number `B` is:"
+msgstr ""
+"Кроме того, хотя диаметр отверстия и фокусное расстояние являются "
+"одномерными величинами, и плёнка, и отверстие — двумерны. Это означает, что "
+"если вы измерили экспозицию при диафрагменном числе `A` как `t`, то "
+"экспозиция при диафрагменном числе `B` будет:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2814
+#, no-wrap
+msgid "t * (B / A)²\n"
+msgstr "t * (B / A)²\n"
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2817
+#, no-wrap
+msgid "Normalized F-Number"
+msgstr "Нормализованное число f"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2820
+msgid ""
+"While many modern cameras can change the diameter of their pinhole, and thus "
+"their f-number, quite smoothly and gradually, such was not always the case."
+msgstr ""
+"Хотя многие современные камеры могут изменять диаметр своего отверстия, а "
+"следовательно и свое число f, довольно плавно и постепенно, так было не "
+"всегда."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2822
+msgid ""
+"To allow for different f-numbers, cameras typically contained a metal plate "
+"with several holes of different sizes drilled to them."
+msgstr ""
+"Для обеспечения различных значений диафрагмы в камерах обычно использовалась "
+"металлическая пластина с несколькими отверстиями разного размера."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2825
+msgid ""
+"Their sizes were chosen according to the above formula in such a way that "
+"the resultant f-number was one of standard f-numbers used on all cameras "
+"everywhere. For example, a very old Kodak Duaflex IV camera in my "
+"possession has three such holes for f-numbers 8, 11, and 16."
+msgstr ""
+"Их размеры были выбраны в соответствии с приведённой выше формулой таким "
+"образом, чтобы результирующее f-число было одним из стандартных f-чисел, "
+"используемых на всех фотоаппаратах. Например, у моего очень старого "
+"фотоаппарата Kodak Duaflex IV есть три таких отверстия для чисел f — 8, 11 и "
+"16."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2828
+msgid ""
+"A more recently made camera may offer f-numbers of 2.8, 4, 5.6, 8, 11, 16, "
+"22, and 32 (as well as others). These numbers were not chosen arbitrarily: "
+"They all are powers of the square root of 2, though they may be rounded "
+"somewha."
+msgstr ""
+"Более современные камеры могут предлагать значения диафрагменного числа 2.8, "
+"4, 5.6, 8, 11, 16, 22 и 32 (а также другие). Эти числа выбраны не "
+"произвольно: все они являются степенями квадратного корня из 2, хотя могут "
+"быть немного округлены."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2830
+#, no-wrap
+msgid "The F-Stop"
+msgstr "Ступени числа f"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2834
+msgid ""
+"A typical camera is designed in such a way that setting any of the "
+"normalized f-numbers changes the feel of the dial. It will naturally _stop_ "
+"in that position. Because of that, these positions of the dial are called f-"
+"stops."
+msgstr ""
+"Типичная камера устроена так, что установка любого из нормализованных чисел "
+"f изменяет ощущение от регулятора. Он естественным образом _останавливается_ "
+"в этом положении. Из-за этого такие положения регулятора называются f-"
+"ступенями."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2838
+msgid ""
+"Since the f-numbers at each stop are powers of the square root of 2, moving "
+"the dial by 1 stop will double the amount of light required for proper "
+"exposure. Moving it by 2 stops will quadruple the required exposure. "
+"Moving the dial by 3 stops will require the increase in exposure 8 times, "
+"etc."
+msgstr ""
+"Поскольку значения диафрагмы на каждой ступени являются степенями "
+"квадратного корня из 2, поворот диска на 1 ступень удваивает количество "
+"света, необходимое для правильной экспозиции. Поворот на 2 ступени "
+"увеличивает требуемую экспозицию вчетверо. Поворот диска на 3 ступени "
+"требует увеличения экспозиции в 8 раз и так далее."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2840
+#, no-wrap
+msgid "Designing the Pinhole Software"
+msgstr "Проектирование программного обеспечения камеры-обскуры"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2843
+msgid ""
+"We are now ready to decide what exactly we want our pinhole software to do."
+msgstr ""
+"Мы готовы решить, что именно должно делать наше программное обеспечение для "
+"камер-обскур."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2845
+#, no-wrap
+msgid "Processing Program Input"
+msgstr "Обработка ввода программы"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2849
+msgid ""
+"Since its main purpose is to help us design a working pinhole camera, we "
+"will use the _focal length_ as the input to the program. This is something "
+"we can determine without software: Proper focal length is determined by the "
+"size of the film and by the need to shoot \"regular\" pictures, wide angle "
+"pictures, or telephoto pictures."
+msgstr ""
+"Поскольку основная цель — помочь нам разработать работающую камеру-обскуру, "
+"мы будем использовать _фокусное расстояние_ в качестве входных данных для "
+"программы. Это можно определить без программного обеспечения: правильное "
+"фокусное расстояние зависит от размера плёнки и необходимости съёмки "
+"«обычных» изображений, широкоугольных или телефото."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2851
+msgid ""
+"Most of the programs we have written so far worked with individual "
+"characters, or bytes, as their input: The hex program converted individual "
+"bytes into a hexadecimal number, the csv program either let a character "
+"through, or deleted it, or changed it to a different character, etc."
+msgstr ""
+"Большинство написанных нами до сих пор программ работали с отдельными "
+"символами или байтами в качестве входных данных: программа hex "
+"преобразовывала отдельные байты в шестнадцатеричное число, программа csv "
+"либо пропускала символ, либо удаляла его, либо заменяла на другой символ и "
+"т.д."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2853
+msgid ""
+"One program, ftuc used the state machine to consider at most two input bytes "
+"at a time."
+msgstr ""
+"Одна программа, `ftuc`, использовала конечный автомат для обработки не более "
+"двух входных байтов за раз."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2855
+msgid ""
+"But our pinhole program cannot just work with individual characters, it has "
+"to deal with larger syntactic units."
+msgstr ""
+"Но наша программа для камеры-обскуры не может работать только с отдельными "
+"символами, ей приходится иметь дело с более крупными синтаксическими "
+"единицами."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2857
+msgid ""
+"For example, if we want the program to calculate the pinhole diameter (and "
+"other values we will discuss later) at the focal lengths of `100 mm`, `150 "
+"mm`, and `210 mm`, we may want to enter something like this:"
+msgstr ""
+"Например, если мы хотим, чтобы программа рассчитала диаметр отверстия (и "
+"другие значения, которые мы обсудим позже) для фокусных расстояний `100 мм`, "
+"`150 мм` и `210 мм`, мы можем ввести что-то вроде этого:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2861
+#, no-wrap
+msgid " 100, 150, 210\n"
+msgstr " 100, 150, 210\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2866
+msgid ""
+"Our program needs to consider more than a single byte of input at a time. "
+"When it sees the first `1`, it must understand it is seeing the first digit "
+"of a decimal number. When it sees the `0` and the other `0`, it must know "
+"it is seeing more digits of the same number."
+msgstr ""
+"Наша программа должна учитывать более одного байта входных данных за раз. "
+"Когда она видит первую `1`, она должна понимать, что это первая цифра "
+"десятичного числа. Когда она видит `0` и другой `0`, она должна знать, что "
+"это следующие цифры того же числа."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2871
+msgid ""
+"When it encounters the first comma, it must know it is no longer receiving "
+"the digits of the first number. It must be able to convert the digits of "
+"the first number into the value of `100`. And the digits of the second "
+"number into the value of `150`. And, of course, the digits of the third "
+"number into the numeric value of `210`."
+msgstr ""
+"Когда он встречает первую запятую, он должен понять, что больше не получает "
+"цифры первого числа. Он должен уметь преобразовать цифры первого числа в "
+"значение `100`. И цифры второго числа в значение `150`. И, конечно же, цифры "
+"третьего числа в числовое значение `210`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2873
+msgid ""
+"We need to decide what delimiters to accept: Do the input numbers have to be "
+"separated by a comma? If so, how do we treat two numbers separated by "
+"something else?"
+msgstr ""
+"Нам нужно определиться с допустимыми разделителями: должны ли входные числа "
+"разделяться запятой? Если да, то как обрабатывать два числа, разделённые чем-"
+"то другим?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2878
+msgid ""
+"Personally, I like to keep it simple. Something either is a number, so I "
+"process it. Or it is not a number, so I discard it. I do not like the "
+"computer complaining about me typing in an extra character when it is "
+"_obvious_ that it is an extra character. Duh!"
+msgstr ""
+"Лично я предпочитаю простоту. Либо что-то является числом — и тогда я его "
+"обрабатываю. Либо не является числом — и тогда я это отбрасываю. Мне не "
+"нравится, когда компьютер жалуется на лишний символ, если _очевидно_, что он "
+"лишний. Да ладно!"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2880
+msgid ""
+"Plus, it allows me to break up the monotony of computing and type in a query "
+"instead of just a number:"
+msgstr ""
+"Плюс, это позволяет мне разбавить монотонность вычислений и ввести запрос "
+"вместо просто числа:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2885
+#, no-wrap
+msgid ""
+"What is the best pinhole diameter for the\n"
+"\t focal length of 150?\n"
+msgstr ""
+"What is the best pinhole diameter for the\n"
+"\t focal length of 150?\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2888
+msgid "There is no reason for the computer to spit out a number of complaints:"
+msgstr "Нет причины, чтобы компьютер выводил множество жалоб:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2895
+#, no-wrap
+msgid ""
+"Syntax error: What\n"
+"Syntax error: is\n"
+"Syntax error: the\n"
+"Syntax error: best\n"
+msgstr ""
+"Syntax error: What\n"
+"Syntax error: is\n"
+"Syntax error: the\n"
+"Syntax error: best\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2898
+msgid "Et cetera, et cetera, et cetera."
+msgstr "И так далее, и так далее, и так далее."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2901
+msgid ""
+"Secondly, I like the `+#+` character to denote the start of a comment which "
+"extends to the end of the line. This does not take too much effort to code, "
+"and lets me treat input files for my software as executable scripts."
+msgstr ""
+"Во-вторых, мне нравится символ `+#+` для обозначения начала комментария, "
+"который продолжается до конца строки. Это не требует больших усилий для "
+"реализации и позволяет мне рассматривать входные файлы для моего "
+"программного обеспечения как исполняемые скрипты."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2903
+msgid ""
+"In our case, we also need to decide what units the input should come in: We "
+"choose _millimeters_ because that is how most photographers measure the "
+"focus length."
+msgstr ""
+"В нашем случае также необходимо определиться с единицами измерения входных "
+"данных: мы выбираем _миллиметры_, так как большинство фотографов измеряют "
+"фокусное расстояние именно в них."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2905
+msgid ""
+"Finally, we need to decide whether to allow the use of the decimal point (in "
+"which case we must also consider the fact that much of the world uses a "
+"decimal _comma_)."
+msgstr ""
+"Наконец, нам нужно решить, разрешать ли использование десятичной точки (в "
+"этом случае мы также должны учитывать тот факт, что во многих странах "
+"используется десятичная _запятая_)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2909
+msgid ""
+"In our case allowing for the decimal point/comma would offer a false sense "
+"of precision: There is little if any noticeable difference between the focus "
+"lengths of `50` and `51`, so allowing the user to input something like "
+"`50.5` is not a good idea. This is my opinion, mind you, but I am the one "
+"writing this program. You can make other choices in yours, of course."
+msgstr ""
+"В нашем случае разрешение десятичной точки/запятой создало бы ложное "
+"ощущение точности: разница между фокусными расстояниями `50` и `51` "
+"практически незаметна, поэтому разрешать пользователю вводить что-то вроде "
+"`50.5` — не лучшая идея. Это моё мнение, конечно, но программу пишу я. В "
+"своей программе вы можете сделать другие выбор, разумеется."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2911
+#, no-wrap
+msgid "Offering Options"
+msgstr "Передача параметров программе"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2916
+msgid ""
+"The most important thing we need to know when building a pinhole camera is "
+"the diameter of the pinhole. Since we want to shoot sharp images, we will "
+"use the above formula to calculate the pinhole diameter from focal length. "
+"As experts are offering several different values for the `PC` constant, we "
+"will need to have the choice."
+msgstr ""
+"Самое важное, что нам нужно знать при создании камеры-обскуры — это диаметр "
+"отверстия. Поскольку мы хотим получать чёткие изображения, мы будем "
+"использовать приведённую выше формулу для расчёта диаметра отверстия от "
+"фокусного расстояния. Поскольку эксперты предлагают несколько различных "
+"значений для константы `PC`, нам нужно будет иметь выбор."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2918
+msgid ""
+"It is traditional in UNIX(R) programming to have two main ways of choosing "
+"program parameters, plus to have a default for the time the user does not "
+"make a choice."
+msgstr ""
+"В традициях программирования в UNIX(R) предусмотрены два основных способа "
+"выбора параметров программы, а также значение по умолчанию на случай, если "
+"пользователь не сделает выбор."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2920
+msgid "Why have two ways of choosing?"
+msgstr "Почему есть два способа выбора?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2922
+msgid ""
+"One is to allow a (relatively) _permanent_ choice that applies automatically "
+"each time the software is run without us having to tell it over and over "
+"what we want it to do."
+msgstr ""
+"Один из способов — это позволить (относительно) _постоянный_ выбор, который "
+"применяется автоматически каждый раз при запуске программы, без "
+"необходимости каждый раз указывать, что мы хотим, чтобы она сделала."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2927
+msgid ""
+"The permanent choices may be stored in a configuration file, typically found "
+"in the user's home directory. The file usually has the same name as the "
+"application but is started with a dot. Often _\"rc\"_ is added to the file "
+"name. So, ours could be [.filename]#~/.pinhole# or "
+"[.filename]#~/.pinholerc#. (The [.filename]#~/# means current user's home "
+"directory.)"
+msgstr ""
+"Постоянные настройки могут быть сохранены в конфигурационном файле, обычно "
+"расположенном в домашнем каталоге пользователя. Файл обычно имеет то же имя, "
+"что и приложение, но начинается с точки. Часто к имени файла добавляется "
+"_\"rc\"_. Таким образом, наш файл может называться [.filename]#~/.pinhole# "
+"или [.filename]#~/.pinholerc#. (Обозначение [.filename]#~/# означает "
+"домашний каталог текущего пользователя.)"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2932
+msgid ""
+"The configuration file is used mostly by programs that have many "
+"configurable parameters. Those that have only one (or a few) often use a "
+"different method: They expect to find the parameter in an _environment "
+"variable_. In our case, we might look at an environment variable named "
+"`PINHOLE`."
+msgstr ""
+"Файл конфигурации в основном используется программами, у которых много "
+"настраиваемых параметров. Те, у которых он один (или несколько), часто "
+"используют другой метод: они ожидают найти параметр в _переменной "
+"окружения_. В нашем случае, мы можем посмотреть на переменную окружения с "
+"именем `PINHOLE`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2935
+msgid ""
+"Usually, a program uses one or the other of the above methods. Otherwise, "
+"if a configuration file said one thing, but an environment variable another, "
+"the program might get confused (or just too complicated)."
+msgstr ""
+"Обычно программа использует один из вышеуказанных методов. В противном "
+"случае, если в конфигурационном файле указано одно, а в переменной окружения "
+"— другое, программа может запутаться (или стать слишком сложной)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2937
+msgid ""
+"Because we only need to choose _one_ such parameter, we will go with the "
+"second method and search the environment for a variable named `PINHOLE`."
+msgstr ""
+"Поскольку нам нужно выбрать только _один_ такой параметр, мы воспользуемся "
+"вторым методом и поищем в окружении переменную с именем `PINHOLE`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2940
+msgid ""
+"The other way allows us to make _ad hoc_ decisions: _\"Though I usually want "
+"you to use 0.039, this time I want 0.03872.\"_ In other words, it allows us "
+"to _override_ the permanent choice."
+msgstr ""
+"Другой способ позволяет нам принимать _ad hoc_ решения: _\"Хотя обычно я "
+"хочу, чтобы ты использовал 0.039, на этот раз мне нужно 0.03872.\"_ Другими "
+"словами, он позволяет нам _переопределить_ постоянный выбор."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2942
+msgid "This type of choice is usually done with command line parameters."
+msgstr ""
+"Такой выбор обычно осуществляется с помощью параметров командной строки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2950
+msgid ""
+"Finally, a program _always_ needs a _default_. The user may not make any "
+"choices. Perhaps he does not know what to choose. Perhaps he is \"just "
+"browsing.\" Preferably, the default will be the value most users would "
+"choose anyway. That way they do not need to choose. Or, rather, they can "
+"choose the default without an additional effort."
+msgstr ""
+"Наконец, программе _всегда_ необходим _значение по умолчанию_. Пользователь "
+"может не делать никакого выбора. Возможно, он не знает, что выбрать. "
+"Возможно, он «просто просматривает». Предпочтительно, чтобы значением по "
+"умолчанию было то, что выбрало бы большинство пользователей. Таким образом, "
+"им не нужно выбирать. Или, точнее, они могут выбрать значение по умолчанию "
+"без дополнительных усилий."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2952
+msgid ""
+"Given this system, the program may find conflicting options, and handle them "
+"this way:"
+msgstr ""
+"Учитывая эту систему, программа может обнаружить конфликтующие параметры и "
+"обработать их следующим образом:"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2955
+msgid ""
+"If it finds an _ad hoc_ choice (e.g., command line parameter), it should "
+"accept that choice. It must ignore any permanent choice and any default."
+msgstr ""
+"Если она находит _специальный_ выбор (например, параметр командной строки), "
+"она должна принять этот выбор. Она должна игнорировать любой постоянный "
+"выбор и значения по умолчанию."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2956
+msgid ""
+"_Otherwise_, if it finds a permanent option (e.g., an environment variable), "
+"it should accept it, and ignore the default."
+msgstr ""
+"_В противном случае_, если будет найден постоянный параметр (например, "
+"переменная окружения), он должен быть принят, а значение по умолчанию — "
+"проигнорировано."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2957
+msgid "_Otherwise_, it should use the default."
+msgstr "_В противном случае_, следует использовать значение по умолчанию."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2959
+msgid "We also need to decide what _format_ our `PC` option should have."
+msgstr ""
+"Нам также необходимо решить, в каком _формате_ должна быть наша опция `PC`."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2961
+msgid ""
+"At first site, it seems obvious to use the `PINHOLE=0.04` format for the "
+"environment variable, and `-p0.04` for the command line."
+msgstr ""
+"На первый взгляд кажется очевидным использовать формат `PINHOLE=0.04` для "
+"переменной окружения и `-p0.04` для командной строки."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2965
+msgid ""
+"Allowing that is actually a security risk. The `PC` constant is a very small "
+"number. Naturally, we will test our software using various small values of "
+"`PC`. But what will happen if someone runs the program choosing a huge "
+"value?"
+msgstr ""
+"Разрешение этого на самом деле представляет угрозу безопасности. Константа "
+"`PC` — это очень маленькое число. Естественно, мы протестируем наше "
+"программное обеспечение, используя различные небольшие значения `PC`. Но что "
+"произойдёт, если кто-то запустит программу, выбрав огромное значение?"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2967
+msgid ""
+"It may crash the program because we have not designed it to handle huge "
+"numbers."
+msgstr ""
+"Это может привести к сбою программы, так как мы не разрабатывали её для "
+"обработки огромных чисел."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2970
+msgid ""
+"Or, we may spend more time on the program so it can handle huge numbers. We "
+"might do that if we were writing commercial software for computer illiterate "
+"audience."
+msgstr ""
+"Или мы можем потратить больше времени на программу, чтобы она могла "
+"обрабатывать огромные числа. Мы могли бы сделать это, если бы писали "
+"коммерческое программное обеспечение для аудитории, не знакомой с "
+"компьютерами."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2972
+msgid "Or, we might say, _\"Tough! The user should know better.\"\"_"
+msgstr ""
+"Или можно сказать: _\"Пусть терпит! Пользователь сам должен был разобраться."
+"\"_"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2975
+msgid ""
+"Or, we just may make it impossible for the user to enter a huge number. "
+"This is the approach we will take: We will use an _implied 0._ prefix."
+msgstr ""
+"Или мы можем просто сделать невозможным ввод пользователем слишком большого "
+"числа. Это подход, который мы выберем: мы будем использовать "
+"_подразумеваемый префикс 0._."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2978
+msgid ""
+"In other words, if the user wants `0.04`, we will expect him to type `-p04`, "
+"or set `PINHOLE=04` in his environment. So, if he says `-p9999999`, we will "
+"interpret it as ``0.9999999``-still ridiculous but at least safer."
+msgstr ""
+"Другими словами, если пользователь хочет `0.04`, мы ожидаем, что он введёт `-"
+"p04` или установит `PINHOLE=04` в своём окружении. Таким образом, если он "
+"укажет `-p9999999`, мы интерпретируем это как ``0.9999999`` — всё ещё "
+"нелепо, но по крайней мере безопаснее."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2981
+msgid ""
+"Secondly, many users will just want to go with either Bender's constant or "
+"Connors' constant. To make it easier on them, we will interpret `-b` as "
+"identical to `-p04`, and `-c` as identical to `-p037`."
+msgstr ""
+"Во-вторых, многие пользователи просто захотят использовать либо константу "
+"Бендера, либо константу Коннорса. Чтобы облегчить им задачу, мы будем "
+"интерпретировать `-b` как идентичное `-p04`, а `-c` как идентичное `-p037`."
+
+#. type: Title ====
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2983
+#, no-wrap
+msgid "The Output"
+msgstr "Вывод результата"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2986
+msgid ""
+"We need to decide what we want our software to send to the output, and in "
+"what format."
+msgstr ""
+"Нам нужно решить, что наше программное обеспечение должно отправлять на "
+"вывод и в каком формате."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2988
+msgid ""
+"Since our input allows for an unspecified number of focal length entries, it "
+"makes sense to use a traditional database-style output of showing the result "
+"of the calculation for each focal length on a separate line, while "
+"separating all values on one line by a `tab` character."
+msgstr ""
+"Поскольку наши входные данные допускают неограниченное количество значений "
+"фокусного расстояния, имеет смысл использовать традиционный вывод в стиле "
+"базы данных, показывая результат вычислений для каждого фокусного расстояния "
+"на отдельной строке, разделяя все значения в строке символом табуляции."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2991
+msgid ""
+"Optionally, we should also allow the user to specify the use of the CSV "
+"format we have studied earlier. In this case, we will print out a line of "
+"comma-separated names describing each field of every line, then show our "
+"results as before, but substituting a `comma` for the `tab`."
+msgstr ""
+"Опционально, мы также должны разрешить пользователю указать использование "
+"формата CSV, который мы изучили ранее. В этом случае мы выведем строку с "
+"разделёнными запятыми названиями, описывающими каждое поле каждой строки, а "
+"затем отобразим результаты как прежде, но заменив `табуляцию` на `запятую`."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:2996
+msgid ""
+"We need a command line option for the CSV format. We cannot use `-c` "
+"because that already means _use Connors' constant_. For some strange "
+"reason, many web sites refer to CSV files as _\"Excel spreadsheet\"_ (though "
+"the CSV format predates Excel). We will, therefore, use the `-e` switch to "
+"inform our software we want the output in the CSV format."
+msgstr ""
+"Нам нужна опция командной строки для формата CSV. Мы не можем использовать `-"
+"c`, потому что это уже означает _использовать константу Коннорса_. По какой-"
+"то странной причине многие веб-сайты называют CSV-файлы _\"электронными "
+"таблицами Excel\"_ (хотя формат CSV появился раньше Excel). Поэтому мы будем "
+"использовать переключатель `-e`, чтобы указать нашему программному "
+"обеспечению, что мы хотим получить вывод в формате CSV."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3000
+msgid ""
+"We will start each line of the output with the focal length. This may sound "
+"repetitious at first, especially in the interactive mode: The user types in "
+"the focal length, and we are repeating it."
+msgstr ""
+"Мы начнем каждую строку вывода с фокусного расстояния. Это может показаться "
+"избыточным сначала, особенно в интерактивном режиме: пользователь вводит "
+"фокусное расстояние, а мы его повторяем."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3004
+msgid ""
+"But the user can type several focal lengths on one line. The input can also "
+"come in from a file or from the output of another program. In that case the "
+"user does not see the input at all."
+msgstr ""
+"Но пользователь может ввести несколько фокусных расстояний в одной строке. "
+"Ввод также может поступать из файла или вывода другой программы. В этом "
+"случае пользователь вообще не видит вводимые данные."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3006
+msgid ""
+"By the same token, the output can go to a file which we will want to examine "
+"later, or it could go to the printer, or become the input of another program."
+msgstr ""
+"Таким же образом, вывод может быть направлен в файл, который мы захотим "
+"изучить позже, или на принтер, или стать входными данными для другой "
+"программы."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3008
+msgid ""
+"So, it makes perfect sense to start each line with the focal length as "
+"entered by the user."
+msgstr ""
+"Итак, имеет полный смысл начинать каждую строку с фокусного расстояния, "
+"введённого пользователем."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3011
+msgid ""
+"No, wait! Not as entered by the user. What if the user types in something "
+"like this:"
+msgstr ""
+"Нет, подождите! Не так, как ввел пользователь. Что, если пользователь "
+"введет что-то вроде этого:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3015
+#, no-wrap
+msgid " 00000000150\n"
+msgstr " 00000000150\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3018
+msgid "Clearly, we need to strip those leading zeros."
+msgstr "Очевидно, нам нужно удалить ведущие нули."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3020
+msgid ""
+"So, we might consider reading the user input as is, converting it to binary "
+"inside the FPU, and printing it out from there."
+msgstr ""
+"Итак, можно рассмотреть вариант чтения пользовательского ввода как есть, "
+"преобразования его в бинарный вид внутри FPU и последующего вывода оттуда."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3022
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3207
+msgid "But..."
+msgstr "Но..."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3024
+msgid "What if the user types something like this:"
+msgstr "Что делать, если пользователь введёт что-то вроде этого:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3028
+#, no-wrap
+msgid " 17459765723452353453534535353530530534563507309676764423\n"
+msgstr " 17459765723452353453534535353530530534563507309676764423\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3033
+msgid ""
+"Ha! The packed decimal FPU format lets us input 18-digit numbers. But the "
+"user has entered more than 18 digits. How do we handle that?"
+msgstr ""
+"Ха! Упакованный десятичный формат FPU позволяет нам вводить 18-значные "
+"числа. Но пользователь ввёл больше 18 цифр. Как нам обработать это?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3035
+msgid ""
+"Well, we _could_ modify our code to read the first 18 digits, enter it to "
+"the FPU, then read more, multiply what we already have on the TOS by 10 "
+"raised to the number of additional digits, then `add` to it."
+msgstr ""
+"Хорошо, мы _могли бы_ изменить наш код, чтобы он читал первые 18 цифр, "
+"передавал их в FPU, затем читал ещё, умножал уже имеющееся на вершине стека "
+"(TOS) на 10 в степени количества дополнительных цифр, а затем выполнял "
+"`сложение` с этим значением."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3039
+msgid ""
+"Yes, we could do that. But in _this_ program it would be ridiculous (in a "
+"different one it may be just the thing to do): Even the circumference of the "
+"Earth expressed in millimeters only takes 11 digits. Clearly, we cannot "
+"build a camera that large (not yet, anyway)."
+msgstr ""
+"Да, мы могли бы так поступить. Но в _этой_ программе это было бы нелепо (в "
+"другой это могло бы быть как раз тем, что нужно): даже длина окружности "
+"Земли, выраженная в миллиметрах, занимает всего 11 цифр. Очевидно, мы не "
+"можем построить камеру такого размера (по крайней мере, пока)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3041
+msgid ""
+"So, if the user enters such a huge number, he is either bored, or testing "
+"us, or trying to break into the system, or playing games-doing anything but "
+"designing a pinhole camera."
+msgstr ""
+"Итак, если пользователь вводит такое огромное число, он либо скучает, либо "
+"проверяет нас, либо пытается взломать систему, либо играет — делает что "
+"угодно, кроме проектирования камеры-обскуры."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3043
+msgid "What will we do?"
+msgstr "Что мы будем делать?"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3045
+msgid "We will slap him in the face, in a manner of speaking:"
+msgstr "Мы ударим его по лицу, образно говоря:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3049
+#, no-wrap
+msgid "17459765723452353453534535353530530534563507309676764423\t???\t???\t???\t???\t???\n"
+msgstr "17459765723452353453534535353530530534563507309676764423\t???\t???\t???\t???\t???\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3053
+msgid ""
+"To achieve that, we will simply ignore any leading zeros. Once we find a "
+"non-zero digit, we will initialize a counter to `0` and start taking three "
+"steps:"
+msgstr ""
+"Для этого мы просто проигнорируем все ведущие нули. Как только мы найдем "
+"ненулевую цифру, мы инициализируем счетчик значением `0` и начнем выполнять "
+"три шага:"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3056
+msgid "Send the digit to the output."
+msgstr "Отправить цифру на выход."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3057
+msgid ""
+"Append the digit to a buffer we will use later to produce the packed decimal "
+"we can send to the FPU."
+msgstr ""
+"Добавить цифру в буфер, который мы позже используем для создания "
+"упакованного десятичного числа, которое можно отправить в FPU."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3058
+msgid "Increase the counter."
+msgstr "Увеличить счетчик."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3060
+msgid ""
+"Now, while we are taking these three steps, we also need to watch out for "
+"one of two conditions:"
+msgstr ""
+"Теперь, пока мы выполняем эти три шага, нам также необходимо следить за "
+"одним из двух условий:"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3062
+msgid ""
+"If the counter grows above 18, we stop appending to the buffer. We continue "
+"reading the digits and sending them to the output."
+msgstr ""
+"Если счётчик превышает 18, мы прекращаем добавление в буфер. Мы продолжаем "
+"читать цифры и отправлять их на вывод."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3063
+msgid ""
+"If, or rather _when_, the next input character is not a digit, we are done "
+"inputting for now."
+msgstr ""
+"Если, или скорее _когда_, следующий вводимый символ не является цифрой, мы "
+"завершаем ввод на данный момент."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3066
+msgid ""
+"Incidentally, we can simply discard the non-digit, unless it is a `+#+`, "
+"which we must return to the input stream. It starts a comment, so we must "
+"see it after we are done producing output and start looking for more input."
+msgstr ""
+"Между прочим, мы можем просто отбросить нецифровой символ, если это не "
+"`+#+`, который необходимо вернуть во входной поток. Он начинает комментарий, "
+"поэтому мы должны увидеть его после завершения вывода и начала поиска "
+"следующего ввода."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3068
+msgid ""
+"That still leaves one possibility uncovered: If all the user enters is a "
+"zero (or several zeros), we will never find a non-zero to display."
+msgstr ""
+"Остается одна непокрытая возможность: если пользователь вводит только ноль "
+"(или несколько нулей), мы никогда не найдем ненулевое значение для "
+"отображения."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3071
+msgid ""
+"We can determine this has happened whenever our counter stays at `0`. In "
+"that case we need to send `0` to the output, and perform another \"slap in "
+"the face\":"
+msgstr ""
+"Мы можем определить, что это произошло, когда наш счетчик остается на `0`. В "
+"этом случае нам нужно отправить `0` на выход и выполнить еще один \"удар по "
+"лицу\":"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3075
+#, no-wrap
+msgid "0\t???\t???\t???\t???\t???\n"
+msgstr "0\t???\t???\t???\t???\t???\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3078
+msgid ""
+"Once we have displayed the focal length and determined it is valid (greater "
+"than `0` but not exceeding 18 digits), we can calculate the pinhole diameter."
+msgstr ""
+"Как только мы определили фокусное расстояние и убедились, что оно корректно "
+"(больше `0`, но не превышает 18 цифр), можно рассчитать диаметр отверстия."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3081
+msgid ""
+"It is not by coincidence that _pinhole_ contains the word _pin_. Indeed, "
+"many a pinhole literally is a _pin hole_, a hole carefully punched with the "
+"tip of a pin."
+msgstr ""
+"Не случайно слово _булавочное ушко_ содержит слово _булавка_. Действительно, "
+"многие малые отверстия буквально являются _дырками от булавки_ — "
+"отверстиями, аккуратно проделанными остриём булавки."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3084
+msgid ""
+"That is because a typical pinhole is very small. Our formula gets the result "
+"in millimeters. We will multiply it by `1000`, so we can output the result "
+"in _microns_."
+msgstr ""
+"Вот потому что типичное отверстие очень маленькое. Наша формула дает "
+"результат в миллиметрах. Мы умножим его на `1000`, чтобы вывести результат в "
+"_микронах_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3086
+msgid "At this point we have yet another trap to face: _Too much precision._"
+msgstr "На этом этапе нас ожидает ещё одна ловушка: _Излишняя точность._"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3090
+msgid ""
+"Yes, the FPU was designed for high precision mathematics. But we are not "
+"dealing with high precision mathematics. We are dealing with physics "
+"(optics, specifically)."
+msgstr ""
+"Да, FPU был разработан для вычислений с высокой точностью. Но мы имеем дело "
+"не с вычислениями высокой точности. Мы имеем дело с физикой (конкретно, с "
+"оптикой)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3094
+msgid ""
+"Suppose we want to convert a truck into a pinhole camera (we would not be "
+"the first ones to do that!). Suppose its box is `12` meters long, so we "
+"have the focal length of `12000`. Well, using Bender's constant, it gives "
+"us square root of `12000` multiplied by `0.04`, which is `4.381780460` "
+"millimeters, or `4381.780460` microns."
+msgstr ""
+"Предположим, мы хотим превратить грузовик в камеру-обскуру (мы будем не "
+"первыми, кто это сделал!). Допустим, его кузов имеет длину `12` метров, "
+"значит, фокусное расстояние равно `12000`. Используя константу Бендера, "
+"получаем квадратный корень из `12000`, умноженный на `0.04`, что составляет "
+"`4.381780460` миллиметра или `4381.780460` микрона."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3099
+msgid ""
+"Put either way, the result is absurdly precise. Our truck is not _exactly_ "
+"`12000` millimeters long. We did not measure its length with such a "
+"precision, so stating we need a pinhole with the diameter of `4.381780460` "
+"millimeters is, well, deceiving. `4.4` millimeters would do just fine."
+msgstr ""
+"Как ни посмотри, результат абсурдно точен. Наш грузовик не имеет _точно_ "
+"`12000` миллиметров в длину. Мы не измеряли его длину с такой точностью, "
+"поэтому утверждение, что нам нужна отверстие диаметром `4,381780460` "
+"миллиметра, мягко говоря, вводит в заблуждение. `4,4` миллиметра будет "
+"вполне достаточно."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3104
+msgid ""
+"I \"only\" used ten digits in the above example. Imagine the absurdity of "
+"going for all 18!"
+msgstr ""
+"Я \"всего лишь\" использовал десять цифр в приведенном выше примере. "
+"Представьте абсурдность попытки использовать все 18!"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3110
+msgid ""
+"We need to limit the number of significant digits of our result. One way of "
+"doing it is by using an integer representing microns. So, our truck would "
+"need a pinhole with the diameter of `4382` microns. Looking at that number, "
+"we still decide that `4400` microns, or `4.4` millimeters is close enough."
+msgstr ""
+"Нам нужно ограничить количество значащих цифр в нашем результате. Один из "
+"способов сделать это — использовать целое число, представляющее микроны. "
+"Таким образом, нашему грузовику потребуется отверстие диаметром `4382` "
+"микрона. Глядя на это число, мы всё же решаем, что `4400` микрон, или `4.4` "
+"миллиметра, достаточно близко."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3113
+msgid ""
+"Additionally, we can decide that no matter how big a result we get, we only "
+"want to display four significant digits (or any other number of them, of "
+"course). Alas, the FPU does not offer rounding to a specific number of "
+"digits (after all, it does not view the numbers as decimal but as binary)."
+msgstr ""
+"Кроме того, мы можем решить, что независимо от размера результата, мы хотим "
+"отображать только четыре значащих цифры (или любое другое их количество, "
+"конечно). Увы, FPU не поддерживает округление до определенного количества "
+"цифр (в конце концов, он воспринимает числа не как десятичные, а как "
+"двоичные)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3115
+msgid ""
+"We, therefore, must devise an algorithm to reduce the number of significant "
+"digits."
+msgstr ""
+"Следовательно, мы должны разработать алгоритм для уменьшения количества "
+"значащих цифр."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3117
+msgid ""
+"Here is mine (I think it is awkward-if you know a better one, _please_, let "
+"me know):"
+msgstr ""
+"Вот мой (я думаю, он неуклюжий — если у вас есть вариант лучше, "
+"_пожалуйста_, дайте мне знать):"
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3120
+msgid "Initialize a counter to `0`."
+msgstr "Инициализировать счетчик значением `0`."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3121
+msgid ""
+"While the number is greater than or equal to `10000`, divide it by `10` and "
+"increase the counter."
+msgstr ""
+"Пока число больше или равно `10000`, делим его на `10` и увеличиваем счётчик."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3122
+msgid "Output the result."
+msgstr "Вывести результат."
+
+#. type: .procedure
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3123
+msgid ""
+"While the counter is greater than `0`, output `0` and decrease the counter."
+msgstr "Пока счетчик больше `0`, выводить `0` и уменьшать счетчик."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3128
+msgid ""
+"The `10000` is only good if you want _four_ significant digits. For any "
+"other number of significant digits, replace `10000` with `10` raised to the "
+"number of significant digits."
+msgstr ""
+"`10000` подходит только если вам нужно _четыре_ значащих цифры. Для любого "
+"другого количества значащих цифр замените `10000` на `10` в степени, равной "
+"количеству значащих цифр."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3131
+msgid ""
+"We will, then, output the pinhole diameter in microns, rounded off to four "
+"significant digits."
+msgstr ""
+"Мы затем выведем диаметр отверстия в микронах, округлённый до четырёх "
+"значащих цифр."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3134
+msgid ""
+"At this point, we know the _focal length_ and the _pinhole diameter_. That "
+"means we have enough information to also calculate the _f-number_."
+msgstr ""
+"На этом этапе нам известны _фокусное расстояние_ и _диаметр отверстия_. Это "
+"означает, что у нас достаточно информации для расчёта _диафрагменного числа_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3138
+msgid ""
+"We will display the f-number, rounded to four significant digits. Chances "
+"are the f-number will tell us very little. To make it more meaningful, we "
+"can find the nearest _normalized f-number_, i.e., the nearest power of the "
+"square root of 2."
+msgstr ""
+"Мы отобразим число f, округлённое до четырёх значащих цифр. Скорее всего, "
+"само число f мало что нам скажет. Чтобы придать ему больше смысла, мы можем "
+"найти ближайшее _нормализованное число f_, то есть ближайшую степень "
+"квадратного корня из 2."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3144
+msgid ""
+"We do that by multiplying the actual f-number by itself, which, of course, "
+"will give us its `square`. We will then calculate its base-2 logarithm, "
+"which is much easier to do than calculating the base-square-root-of-2 "
+"logarithm! We will round the result to the nearest integer. Next, we will "
+"raise 2 to the result. Actually, the FPU gives us a good shortcut to do "
+"that: We can use the `fscale` op code to \"scale\" 1, which is analogous to "
+"``shift``ing an integer left. Finally, we calculate the square root of it "
+"all, and we have the nearest normalized f-number."
+msgstr ""
+"Мы делаем это, умножая фактическое значение диафрагмы на само себя, что, "
+"конечно же, даст нам его `квадрат`. Затем мы вычислим его логарифм по "
+"основанию 2, что намного проще, чем вычисление логарифма по основанию "
+"квадратного корня из 2! Мы округлим результат до ближайшего целого числа. "
+"Далее мы возведём 2 в полученную степень. На самом деле, FPU предоставляет "
+"нам удобный способ сделать это: мы можем использовать код операции `fscale` "
+"для \"масштабирования\" 1, что аналогично ``сдвигу`` целого числа влево. "
+"Наконец, мы вычисляем квадратный корень из всего этого и получаем ближайшее "
+"нормализованное значение диафрагмы."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3147
+msgid ""
+"If all that sounds overwhelming-or too much work, perhaps-it may become much "
+"clearer if you see the code. It takes 9 op codes altogether:"
+msgstr ""
+"Если всё это звучит ошеломляюще — или, возможно, слишком сложно — всё может "
+"стать гораздо понятнее, если увидеть код. Вместе это занимает всего 9 "
+"инструкций процессора:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3159
+#, no-wrap
+msgid ""
+"fmul\tst0, st0\n"
+"\tfld1\n"
+"\tfld\tst1\n"
+"\tfyl2x\n"
+"\tfrndint\n"
+"\tfld1\n"
+"\tfscale\n"
+"\tfsqrt\n"
+"\tfstp\tst1\n"
+msgstr ""
+"fmul\tst0, st0\n"
+"\tfld1\n"
+"\tfld\tst1\n"
+"\tfyl2x\n"
+"\tfrndint\n"
+"\tfld1\n"
+"\tfscale\n"
+"\tfsqrt\n"
+"\tfstp\tst1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3163
+msgid ""
+"The first line, `fmul st0, st0`, squares the contents of the TOS (top of the "
+"stack, same as `st`, called `st0` by nasm). The `fld1` pushes `1` on the "
+"TOS."
+msgstr ""
+"Первая строка, `fmul st0, st0`, возводит в квадрат содержимое TOS (вершина "
+"стека, то же что `st`, называется `st0` в nasm). Команда `fld1` помещает `1` "
+"на вершину стека."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3167
+msgid ""
+"The next line, `fld st1`, pushes the square back to the TOS. At this point "
+"the square is both in `st` and `st(2)` (it will become clear why we leave a "
+"second copy on the stack in a moment). `st(1)` contains `1`."
+msgstr ""
+"Следующая строка, `fld st1`, помещает квадрат обратно в TOS. На этом этапе "
+"квадрат находится и в `st`, и в `st(2)` (скоро станет ясно, зачем мы "
+"оставляем вторую копию в стеке). В `st(1)` содержится `1`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3170
+msgid ""
+"Next, `fyl2x` calculates base-2 logarithm of `st` multiplied by `st(1)`. "
+"That is why we placed `1` on `st(1)` before."
+msgstr ""
+"Далее, `fyl2x` вычисляет логарифм по основанию 2 от `st`, умноженный на "
+"`st(1)`. Именно поэтому мы ранее поместили `1` в `st(1)`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3172
+msgid ""
+"At this point, `st` contains the logarithm we have just calculated, `st(1)` "
+"contains the square of the actual f-number we saved for later."
+msgstr ""
+"На этом этапе `st` содержит логарифм, который мы только что вычислили, а "
+"`st(1)` содержит квадрат фактического значения диафрагменного числа, который "
+"мы сохранили для последующего использования."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3176
+msgid ""
+"`frndint` rounds the TOS to the nearest integer. `fld1` pushes a `1`. "
+"`fscale` shifts the `1` we have on the TOS by the value in `st(1)`, "
+"effectively raising 2 to `st(1)`."
+msgstr ""
+"`frndint` округляет TOS до ближайшего целого числа. `fld1` помещает `1` в "
+"стек. `fscale` сдвигает `1`, находящееся на TOS, на значение в `st(1)`, "
+"фактически возводя 2 в степень `st(1)`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3178
+msgid ""
+"Finally, `fsqrt` calculates the square root of the result, i.e., the nearest "
+"normalized f-number."
+msgstr ""
+"Наконец, `fsqrt` вычисляет квадратный корень из результата, т.е. ближайшее "
+"нормализованное число f."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3181
+msgid ""
+"We now have the nearest normalized f-number on the TOS, the base-2 logarithm "
+"rounded to the nearest integer in `st(1)`, and the square of the actual f-"
+"number in `st(2)`. We are saving the value in `st(2)` for later."
+msgstr ""
+"У нас теперь есть ближайшее нормализованное число f на вершине стека (TOS), "
+"округлённый до ближайшего целого двоичный логарифм в `st(1)` и квадрат "
+"фактического число f в `st(2)`. Мы сохраняем значение в `st(2)` для "
+"последующего использования."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3187
+msgid ""
+"But we do not need the contents of `st(1)` anymore. The last line, `fstp "
+"st1`, places the contents of `st` to `st(1)`, and pops. As a result, what "
+"was `st(1)` is now `st`, what was `st(2)` is now `st(1)`, etc. The new `st` "
+"contains the normalized f-number. The new `st(1)` contains the square of "
+"the actual f-number we have stored there for posterity."
+msgstr ""
+"Но нам больше не нужно содержимое `st(1)`. Последняя строка, `fstp st1`, "
+"помещает содержимое `st` в `st(1)` и выполняет извлечение. В результате, то, "
+"что было `st(1)`, теперь становится `st`, то, что было `st(2)`, теперь "
+"становится `st(1)`, и так далее. Новый `st` содержит нормализованное число "
+"f. Новый `st(1)` содержит квадрат фактического число f, который мы сохранили "
+"для потомков."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3190
+msgid ""
+"At this point, we are ready to output the normalized f-number. Because it "
+"is normalized, we will not round it off to four significant digits, but will "
+"send it out in its full precision."
+msgstr ""
+"На этом этапе мы готовы вывести нормализованное число f. Поскольку оно "
+"нормализовано, мы не будем округлять его до четырёх значащих цифр, а "
+"отправим его с полной точностью."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3193
+msgid ""
+"The normalized f-number is useful as long as it is reasonably small and can "
+"be found on our light meter. Otherwise we need a different method of "
+"determining proper exposure."
+msgstr ""
+"Нормализованное диафрагменное число полезно, пока оно достаточно мало и "
+"может быть найдено на нашем экспонометре. В противном случае нам нужен "
+"другой метод определения правильной экспозиции."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3195
+msgid ""
+"Earlier we have figured out the formula of calculating proper exposure at an "
+"arbitrary f-number from that measured at a different f-number."
+msgstr ""
+"Ранее мы вывели формулу для расчёта правильной экспозиции при произвольной "
+"диафрагме на основе измерений, сделанных при другой диафрагме."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3198
+msgid ""
+"Every light meter I have ever seen can determine proper exposure at f5.6. "
+"We will, therefore, calculate an _\"f5.6 multiplier,\"_ i.e., by how much we "
+"need to multiply the exposure measured at f5.6 to determine the proper "
+"exposure for our pinhole camera."
+msgstr ""
+"Каждый экспонометр, который я когда-либо видел, может определить правильную "
+"экспозицию при f5.6. Поэтому мы рассчитаем _\"множитель f5.6\"_, то есть "
+"насколько нужно умножить экспозицию, измеренную при f5.6, чтобы определить "
+"правильную экспозицию для нашей камеры-обскуры."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3200
+msgid ""
+"From the above formula we know this factor can be calculated by dividing our "
+"f-number (the actual one, not the normalized one) by `5.6`, and squaring the "
+"result."
+msgstr ""
+"Из приведённой формулы мы знаем, что этот коэффициент можно вычислить, "
+"разделив наше число f (фактическое, а не нормализованное) на `5.6` и возведя "
+"результат в квадрат."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3202
+msgid ""
+"Mathematically, dividing the square of our f-number by the square of `5.6` "
+"will give us the same result."
+msgstr ""
+"Математически, деление квадрата нашего числа f на квадрат `5.6` даст нам тот "
+"же результат."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3205
+msgid ""
+"Computationally, we do not want to square two numbers when we can only "
+"square one. So, the first solution seems better at first."
+msgstr ""
+"С вычислительной точки зрения, нам не нужно возводить в квадрат два числа, "
+"когда можно возвести только одно. Таким образом, первое решение на первый "
+"взгляд кажется лучше."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3213
+msgid ""
+"`5.6` is a _constant_. We do not have to have our FPU waste precious "
+"cycles. We can just tell it to divide the square of the f-number by "
+"whatever `5.6²` equals to. Or we can divide the f-number by `5.6`, and then "
+"square the result. The two ways now seem equal."
+msgstr ""
+"`5.6` — это _константа_. Нам не нужно заставлять наш FPU тратить драгоценные "
+"циклы. Мы можем просто указать ему разделить квадрат f-числа на то, чему "
+"равно `5.6²`. Или мы можем разделить f-число на `5.6`, а затем возвести "
+"результат в квадрат. Теперь оба способа кажутся равнозначными."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3215
+msgid "But, they are not!"
+msgstr "Но они не такие!"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3219
+msgid ""
+"Having studied the principles of photography above, we remember that the "
+"`5.6` is actually square root of 2 raised to the fifth power. An "
+"_irrational_ number. The square of this number is _exactly_ `32`."
+msgstr ""
+"Изучив принципы фотографии выше, мы помним, что `5.6` — это квадратный "
+"корень из 2, возведённый в пятую степень. Это _иррациональное_ число. "
+"Квадрат этого числа _ровно_ `32`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3225
+msgid ""
+"Not only is `32` an integer, it is a power of 2. We do not need to divide "
+"the square of the f-number by `32`. We only need to use `fscale` to shift "
+"it right by five positions. In the FPU lingo it means we will `fscale` it "
+"with `st(1)` equal to `-5`. That is _much faster_ than a division."
+msgstr ""
+"`32` — это не просто целое число, это степень двойки. Нам не нужно делить "
+"квадрат числа f на `32`. Достаточно использовать `fscale` для сдвига вправо "
+"на пять позиций. В терминологии FPU это означает, что мы применим `fscale` "
+"со значением `st(1)` равным `-5`. Это _гораздо быстрее_, чем деление."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3228
+msgid ""
+"So, now it has become clear why we have saved the square of the f-number on "
+"the top of the FPU stack. The calculation of the f5.6 multiplier is the "
+"easiest calculation of this entire program! We will output it rounded to "
+"four significant digits."
+msgstr ""
+"Итак, теперь стало ясно, зачем мы сохранили квадрат числа f на вершине стека "
+"FPU. Расчёт множителя для f5.6 — это самое простое вычисление во всей "
+"программе! Мы выведем его, округлив до четырёх значащих цифр."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3231
+msgid ""
+"There is one more useful number we can calculate: The number of stops our f-"
+"number is from f5.6. This may help us if our f-number is just outside the "
+"range of our light meter, but we have a shutter which lets us set various "
+"speeds, and this shutter uses stops."
+msgstr ""
+"Есть ещё одно полезное число, которое мы можем вычислить: количество "
+"ступеней, на которые наше значение диафрагмы отличается от f5.6. Это может "
+"помочь, если наше значение диафрагмы находится чуть за пределами диапазона "
+"нашего экспонометра, но у нас есть затвор, который позволяет устанавливать "
+"различные выдержки, и этот затвор использует ступени."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3234
+msgid ""
+"Say, our f-number is 5 stops from f5.6, and the light meter says we should "
+"use 1/1000 sec. Then we can set our shutter speed to 1/1000 first, then "
+"move the dial by 5 stops."
+msgstr ""
+"Предположим, наше число диафрагмы на 5 ступеней отличается от f5.6, а "
+"экспонометр показывает, что нужно использовать выдержку 1/1000 сек. Тогда мы "
+"можем сначала установить выдержку на 1/1000, а затем повернуть диск на 5 "
+"ступеней."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3239
+msgid ""
+"This calculation is quite easy as well. All we have to do is to calculate "
+"the base-2 logarithm of the f5.6 multiplier we had just calculated (though "
+"we need its value from before we rounded it off). We then output the result "
+"rounded to the nearest integer. We do not need to worry about having more "
+"than four significant digits in this one: The result is most likely to have "
+"only one or two digits anyway."
+msgstr ""
+"Этот расчет также довольно прост. Все, что нам нужно сделать, это вычислить "
+"логарифм по основанию 2 от множителя f5.6, который мы только что рассчитали "
+"(хотя нам нужно его значение до округления). Затем мы выводим результат, "
+"округленный до ближайшего целого числа. Нам не нужно беспокоиться о наличии "
+"более четырех значащих цифр в этом случае: скорее всего, результат будет "
+"содержать только одну или две цифры."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3241
+#, no-wrap
+msgid "FPU Optimizations"
+msgstr "Оптимизации FPU"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3244
+msgid ""
+"In assembly language we can optimize the FPU code in ways impossible in high "
+"languages, including C."
+msgstr ""
+"В ассемблерном коде мы можем оптимизировать инструкции FPU способами, "
+"невозможными в языках высокого уровня, включая C."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3248
+msgid ""
+"Whenever a C function needs to calculate a floating-point value, it loads "
+"all necessary variables and constants into FPU registers. It then does "
+"whatever calculation is required to get the correct result. Good C "
+"compilers can optimize that part of the code really well."
+msgstr ""
+"Всякий раз, когда функции на языке C требуется вычислить значение с "
+"плавающей запятой, она загружает все необходимые переменные и константы в "
+"регистры FPU. Затем выполняются все необходимые вычисления для получения "
+"правильного результата. Хорошие компиляторы C могут очень эффективно "
+"оптимизировать эту часть кода."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3252
+msgid ""
+"It \"returns\" the value by leaving the result on the TOS. However, before "
+"it returns, it cleans up. Any variables and constants it used in its "
+"calculation are now gone from the FPU."
+msgstr ""
+"Он \"возвращает\" значение, оставляя результат на вершине стека (TOS). "
+"Однако перед возвратом он выполняет очистку. Все переменные и константы, "
+"использованные в вычислениях, теперь удалены из FPU."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3254
+msgid ""
+"It cannot do what we just did above: We calculated the square of the f-"
+"number and kept it on the stack for later use by another function."
+msgstr ""
+"Он не может сделать то, что мы только что сделали выше: мы вычислили квадрат "
+"числа f и оставили его в стеке для последующего использования другой "
+"функцией."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3257
+msgid ""
+"We _knew_ we would need that value later on. We also knew we had enough "
+"room on the stack (which only has room for 8 numbers) to store it there."
+msgstr ""
+"Мы _знали_, что это значение понадобится позже. Мы также знали, что у нас "
+"достаточно места в стеке (в котором помещается только 8 чисел), чтобы "
+"сохранить его там."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3259
+msgid ""
+"A C compiler has no way of knowing that a value it has on the stack will be "
+"required again in the very near future."
+msgstr ""
+"Компилятор C не может знать, что значение, находящееся в стеке, потребуется "
+"снова в ближайшем будущем."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3262
+msgid ""
+"Of course, the C programmer may know it. But the only recourse he has is to "
+"store the value in a memory variable."
+msgstr ""
+"Конечно, программист на C может это знать. Но единственное средство, которое "
+"у него есть, — это сохранить значение в переменной памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3264
+msgid ""
+"That means, for one, the value will be changed from the 80-bit precision "
+"used internally by the FPU to a C _double_ (64 bits) or even _single_ (32 "
+"bits)."
+msgstr ""
+"Это означает, что значение будет изменено с 80-битной точности, используемой "
+"внутри FPU, на тип _double_ (64 бита) или даже _single_ (32 бита) в C."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3267
+msgid ""
+"That also means that the value must be moved from the TOS into the memory, "
+"and then back again. Alas, of all FPU operations, the ones that access the "
+"computer memory are the slowest."
+msgstr ""
+"Это также означает, что значение должно быть перемещено из TOS в память, а "
+"затем обратно. Увы, среди всех операций с FPU, доступ к памяти компьютера "
+"является самым медленным."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3269
+msgid ""
+"So, whenever programming the FPU in assembly language, look for the ways of "
+"keeping intermediate results on the FPU stack."
+msgstr ""
+"Итак, при программировании FPU на языке ассемблера ищите способы хранения "
+"промежуточных результатов в стеке FPU."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3271
+msgid ""
+"We can take that idea even further! In our program we are using a _constant_ "
+"(the one we named `PC`)."
+msgstr ""
+"Мы можем развить эту идею еще дальше! В нашей программе мы используем "
+"_константу_ (ту, которую назвали `PC`)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3274
+msgid ""
+"It does not matter how many pinhole diameters we are calculating: 1, 10, 20, "
+"1000, we are always using the same constant. Therefore, we can optimize our "
+"program by keeping the constant on the stack all the time."
+msgstr ""
+"Не имеет значения, сколько диаметров отверстий мы рассчитываем: 1, 10, 20, "
+"1000, мы всегда используем одну и ту же константу. Следовательно, мы можем "
+"оптимизировать нашу программу, сохраняя константу в стеке всё время."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3277
+msgid ""
+"Early on in our program, we are calculating the value of the above "
+"constant. We need to divide our input by `10` for every digit in the "
+"constant."
+msgstr ""
+"В начале нашей программы мы вычисляем значение указанной константы. Нам "
+"нужно разделить наш вход на `10` для каждой цифры в константе."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3280
+msgid ""
+"It is much faster to multiply than to divide. So, at the start of our "
+"program, we divide `10` into `1` to obtain `0.1`, which we then keep on the "
+"stack: Instead of dividing the input by `10` for every digit, we multiply it "
+"by `0.1`."
+msgstr ""
+"Гораздо быстрее умножать, чем делить. Поэтому в начале нашей программы мы "
+"делим `1` на `10`, чтобы получить `0.1`, который затем сохраняем в стеке: "
+"вместо того чтобы делить ввод на `10` для каждой цифры, мы умножаем его на "
+"`0.1`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3284
+msgid ""
+"By the way, we do not input `0.1` directly, even though we could. We have a "
+"reason for that: While `0.1` can be expressed with just one decimal place, "
+"we do not know how many _binary_ places it takes. We, therefore, let the "
+"FPU calculate its binary value to its own high precision."
+msgstr ""
+"Кстати, мы не вводим `0.1` напрямую, хотя могли бы. У нас есть причина для "
+"этого: хотя `0.1` можно выразить всего одним десятичным знаком, мы не знаем, "
+"сколько _двоичных_ разрядов для этого потребуется. Поэтому мы позволяем FPU "
+"вычислить его двоичное значение с собственной высокой точностью."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3289
+msgid ""
+"We are using other constants: We multiply the pinhole diameter by `1000` to "
+"convert it from millimeters to microns. We compare numbers to `10000` when "
+"we are rounding them off to four significant digits. So, we keep both, "
+"`1000` and `10000`, on the stack. And, of course, we reuse the `0.1` when "
+"rounding off numbers to four digits."
+msgstr ""
+"Мы используем другие константы: умножаем диаметр отверстия на `1000`, чтобы "
+"перевести его из миллиметров в микроны. Мы сравниваем числа с `10000`, когда "
+"округляем их до четырёх значащих цифр. Таким образом, мы оставляем и `1000`, "
+"и `10000` в стеке. И, конечно же, мы повторно используем `0.1` при "
+"округлении чисел до четырёх цифр."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3295
+msgid ""
+"Last but not least, we keep `-5` on the stack. We need it to scale the "
+"square of the f-number, instead of dividing it by `32`. It is not by "
+"coincidence we load this constant last. That makes it the top of the stack "
+"when only the constants are on it. So, when the square of the f-number is "
+"being scaled, the `-5` is at `st(1)`, precisely where `fscale` expects it to "
+"be."
+msgstr ""
+"И последнее, но не менее важное: мы оставляем `-5` в стеке. Он нам нужен для "
+"масштабирования квадрата числа f вместо деления его на `32`. Не случайно мы "
+"загружаем эту константу последней. Это делает её вершиной стека, когда в нём "
+"находятся только константы. Таким образом, при масштабировании квадрата "
+"число f `-5` находится в `st(1)`, именно там, где `fscale` ожидает его "
+"увидеть."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3298
+msgid ""
+"It is common to create certain constants from scratch instead of loading "
+"them from the memory. That is what we are doing with `-5`:"
+msgstr ""
+"Это обычная ситуация, когда некоторые константы создаются с нуля, вместо "
+"загрузки их из памяти. Именно это мы делаем с `-5`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3307
+#, no-wrap
+msgid ""
+"\tfld1\t\t\t; TOS = 1\n"
+"\tfadd\tst0, st0\t; TOS = 2\n"
+"\tfadd\tst0, st0\t; TOS = 4\n"
+"\tfld1\t\t\t; TOS = 1\n"
+"\tfaddp\tst1, st0\t; TOS = 5\n"
+"\tfchs\t\t\t; TOS = -5\n"
+msgstr ""
+"\tfld1\t\t\t; TOS = 1\n"
+"\tfadd\tst0, st0\t; TOS = 2\n"
+"\tfadd\tst0, st0\t; TOS = 4\n"
+"\tfld1\t\t\t; TOS = 1\n"
+"\tfaddp\tst1, st0\t; TOS = 5\n"
+"\tfchs\t\t\t; TOS = -5\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3310
+msgid ""
+"We can generalize all these optimizations into one rule: _Keep repeat values "
+"on the stack!_"
+msgstr ""
+"Мы можем обобщить все эти оптимизации в одном правиле: _Держите "
+"повторяющиеся значения в стеке!_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3315
+msgid ""
+"_PostScript(R)_ is a stack-oriented programming language. There are many "
+"more books available about PostScript(R) than about the FPU assembly "
+"language: Mastering PostScript(R) will help you master the FPU."
+msgstr ""
+"_PostScript(R)_ — это стековая язык программирования. Существует гораздо "
+"больше книг о PostScript(R), чем о языке ассемблера FPU: освоение "
+"PostScript(R) поможет вам овладеть FPU."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3318
+#, no-wrap
+msgid "pinhole-The Code"
+msgstr "Код pinhole"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3333
+#, no-wrap
+msgid ""
+";;;;;;; pinhole.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";\n"
+"; Find various parameters of a pinhole camera construction and use\n"
+";\n"
+"; Started:\t 9-Jun-2001\n"
+"; Updated:\t10-Jun-2001\n"
+";\n"
+"; Copyright (c) 2001 G. Adam Stanislav\n"
+"; All rights reserved.\n"
+";\n"
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+msgstr ""
+";;;;;;; pinhole.asm ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+";\n"
+"; Find various parameters of a pinhole camera construction and use\n"
+";\n"
+"; Started:\t 9-Jun-2001\n"
+"; Updated:\t10-Jun-2001\n"
+";\n"
+"; Copyright (c) 2001 G. Adam Stanislav\n"
+"; All rights reserved.\n"
+";\n"
+";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3368
+#, no-wrap
+msgid ""
+"section\t.data\n"
+"align 4\n"
+"ten\tdd\t10\n"
+"thousand\tdd\t1000\n"
+"tthou\tdd\t10000\n"
+"fd.in\tdd\tstdin\n"
+"fd.out\tdd\tstdout\n"
+"envar\tdb\t'PINHOLE='\t; Exactly 8 bytes, or 2 dwords long\n"
+"pinhole\tdb\t'04,', \t\t; Bender's constant (0.04)\n"
+"connors\tdb\t'037', 0Ah\t; Connors' constant\n"
+"usg\tdb\t'Usage: pinhole [-b] [-c] [-e] [-p <value>] [-o <outfile>] [-i <infile>]', 0Ah\n"
+"usglen\tequ\t$-usg\n"
+"iemsg\tdb\t\"pinhole: Can't open input file\", 0Ah\n"
+"iemlen\tequ\t$-iemsg\n"
+"oemsg\tdb\t\"pinhole: Can't create output file\", 0Ah\n"
+"oemlen\tequ\t$-oemsg\n"
+"pinmsg\tdb\t\"pinhole: The PINHOLE constant must not be 0\", 0Ah\n"
+"pinlen\tequ\t$-pinmsg\n"
+"toobig\tdb\t\"pinhole: The PINHOLE constant may not exceed 18 decimal places\", 0Ah\n"
+"biglen\tequ\t$-toobig\n"
+"huhmsg\tdb\t9, '???'\n"
+"separ\tdb\t9, '???'\n"
+"sep2\tdb\t9, '???'\n"
+"sep3\tdb\t9, '???'\n"
+"sep4\tdb\t9, '???', 0Ah\n"
+"huhlen\tequ\t$-huhmsg\n"
+"header\tdb\t'focal length in millimeters,pinhole diameter in microns,'\n"
+"\tdb\t'F-number,normalized F-number,F-5.6 multiplier,stops '\n"
+"\tdb\t'from F-5.6', 0Ah\n"
+"headlen\tequ\t$-header\n"
+msgstr ""
+"section\t.data\n"
+"align 4\n"
+"ten\tdd\t10\n"
+"thousand\tdd\t1000\n"
+"tthou\tdd\t10000\n"
+"fd.in\tdd\tstdin\n"
+"fd.out\tdd\tstdout\n"
+"envar\tdb\t'PINHOLE='\t; Exactly 8 bytes, or 2 dwords long\n"
+"pinhole\tdb\t'04,', \t\t; Bender's constant (0.04)\n"
+"connors\tdb\t'037', 0Ah\t; Connors' constant\n"
+"usg\tdb\t'Usage: pinhole [-b] [-c] [-e] [-p <value>] [-o <outfile>] [-i <infile>]', 0Ah\n"
+"usglen\tequ\t$-usg\n"
+"iemsg\tdb\t\"pinhole: Can't open input file\", 0Ah\n"
+"iemlen\tequ\t$-iemsg\n"
+"oemsg\tdb\t\"pinhole: Can't create output file\", 0Ah\n"
+"oemlen\tequ\t$-oemsg\n"
+"pinmsg\tdb\t\"pinhole: The PINHOLE constant must not be 0\", 0Ah\n"
+"pinlen\tequ\t$-pinmsg\n"
+"toobig\tdb\t\"pinhole: The PINHOLE constant may not exceed 18 decimal places\", 0Ah\n"
+"biglen\tequ\t$-toobig\n"
+"huhmsg\tdb\t9, '???'\n"
+"separ\tdb\t9, '???'\n"
+"sep2\tdb\t9, '???'\n"
+"sep3\tdb\t9, '???'\n"
+"sep4\tdb\t9, '???', 0Ah\n"
+"huhlen\tequ\t$-huhmsg\n"
+"header\tdb\t'focal length in millimeters,pinhole diameter in microns,'\n"
+"\tdb\t'F-number,normalized F-number,F-5.6 multiplier,stops '\n"
+"\tdb\t'from F-5.6', 0Ah\n"
+"headlen\tequ\t$-header\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3374
+#, no-wrap
+msgid ""
+"section .bss\n"
+"ibuffer\tresb\tBUFSIZE\n"
+"obuffer\tresb\tBUFSIZE\n"
+"dbuffer\tresb\t20\t\t; decimal input buffer\n"
+"bbuffer\tresb\t10\t\t; BCD buffer\n"
+msgstr ""
+"section .bss\n"
+"ibuffer\tresb\tBUFSIZE\n"
+"obuffer\tresb\tBUFSIZE\n"
+"dbuffer\tresb\t20\t\t; decimal input buffer\n"
+"bbuffer\tresb\t10\t\t; BCD buffer\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3385
+#, no-wrap
+msgid ""
+"section\t.text\n"
+"align 4\n"
+"huh:\n"
+"\tcall\twrite\n"
+"\tpush\tdword huhlen\n"
+"\tpush\tdword huhmsg\n"
+"\tpush\tdword [fd.out]\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tret\n"
+msgstr ""
+"section\t.text\n"
+"align 4\n"
+"huh:\n"
+"\tcall\twrite\n"
+"\tpush\tdword huhlen\n"
+"\tpush\tdword huhmsg\n"
+"\tpush\tdword [fd.out]\n"
+"\tsys.write\n"
+"\tadd\tesp, byte 12\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3394
+#, no-wrap
+msgid ""
+"align 4\n"
+"perr:\n"
+"\tpush\tdword pinlen\n"
+"\tpush\tdword pinmsg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 4\t\t; return failure\n"
+"\tsys.exit\n"
+msgstr ""
+"align 4\n"
+"perr:\n"
+"\tpush\tdword pinlen\n"
+"\tpush\tdword pinmsg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 4\t\t; return failure\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3403
+#, no-wrap
+msgid ""
+"align 4\n"
+"consttoobig:\n"
+"\tpush\tdword biglen\n"
+"\tpush\tdword toobig\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 5\t\t; return failure\n"
+"\tsys.exit\n"
+msgstr ""
+"align 4\n"
+"consttoobig:\n"
+"\tpush\tdword biglen\n"
+"\tpush\tdword toobig\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 5\t\t; return failure\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3412
+#, no-wrap
+msgid ""
+"align 4\n"
+"ierr:\n"
+"\tpush\tdword iemlen\n"
+"\tpush\tdword iemsg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 1\t\t; return failure\n"
+"\tsys.exit\n"
+msgstr ""
+"align 4\n"
+"ierr:\n"
+"\tpush\tdword iemlen\n"
+"\tpush\tdword iemsg\n"
+"\tpush\tdword stderr\n"
+"\tsys.write\n"
+"\tpush\tdword 1\t\t; return failure\n"
+"\tsys.exit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3436
+#, no-wrap
+msgid ""
+"align 4\n"
+"global\t_start\n"
+"_start:\n"
+"\tadd\tesp, byte 8\t; discard argc and argv[0]\n"
+"\tsub\tesi, esi\n"
+msgstr ""
+"align 4\n"
+"global\t_start\n"
+"_start:\n"
+"\tadd\tesp, byte 8\t; discard argc and argv[0]\n"
+"\tsub\tesi, esi\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3441
+#, no-wrap
+msgid ""
+".arg:\n"
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje\tnear .getenv\t\t; no more arguments\n"
+msgstr ""
+".arg:\n"
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje\tnear .getenv\t\t; no more arguments\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3449
+#, no-wrap
+msgid ""
+"\tinc\tecx\n"
+"\tmov\tax, [ecx]\n"
+"\tinc\tecx\n"
+msgstr ""
+"\tinc\tecx\n"
+"\tmov\tax, [ecx]\n"
+"\tinc\tecx\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3467
+#, no-wrap
+msgid ""
+"\tor\tah, ah\n"
+"\tjne\t.openoutput\n"
+"\tpop\tecx\n"
+"\tjecxz\tusage\n"
+msgstr ""
+"\tor\tah, ah\n"
+"\tjne\t.openoutput\n"
+"\tpop\tecx\n"
+"\tjecxz\tusage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3494
+#, no-wrap
+msgid ""
+"\t; Find the path to the input file\n"
+"\tor\tah, ah\n"
+"\tjne\t.openinput\n"
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje near usage\n"
+msgstr ""
+"\t; Find the path to the input file\n"
+"\tor\tah, ah\n"
+"\tjne\t.openinput\n"
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje near usage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3510
+#, no-wrap
+msgid ""
+".p:\n"
+"\tcmp\tal, 'p'\n"
+"\tjne\t.c\n"
+"\tor\tah, ah\n"
+"\tjne\t.pcheck\n"
+msgstr ""
+".p:\n"
+"\tcmp\tal, 'p'\n"
+"\tjne\t.c\n"
+"\tor\tah, ah\n"
+"\tjne\t.pcheck\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3514
+#, no-wrap
+msgid ""
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje\tnear usage\n"
+msgstr ""
+"\tpop\tecx\n"
+"\tor\tecx, ecx\n"
+"\tje\tnear usage\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3516
+#, no-wrap
+msgid "\tmov\tah, [ecx]\n"
+msgstr "\tmov\tah, [ecx]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3524
+#, no-wrap
+msgid ""
+".pcheck:\n"
+"\tcmp\tah, '0'\n"
+"\tjl\tnear usage\n"
+"\tcmp\tah, '9'\n"
+"\tja\tnear usage\n"
+"\tmov\tesi, ecx\n"
+"\tjmp\t.arg\n"
+msgstr ""
+".pcheck:\n"
+"\tcmp\tah, '0'\n"
+"\tjl\tnear usage\n"
+"\tcmp\tah, '9'\n"
+"\tja\tnear usage\n"
+"\tmov\tesi, ecx\n"
+"\tjmp\t.arg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3532
+#, no-wrap
+msgid ""
+".c:\n"
+"\tcmp\tal, 'c'\n"
+"\tjne\t.b\n"
+"\tor\tah, ah\n"
+"\tjne\tnear usage\n"
+"\tmov\tesi, connors\n"
+"\tjmp\t.arg\n"
+msgstr ""
+".c:\n"
+"\tcmp\tal, 'c'\n"
+"\tjne\t.b\n"
+"\tor\tah, ah\n"
+"\tjne\tnear usage\n"
+"\tmov\tesi, connors\n"
+"\tjmp\t.arg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3540
+#, no-wrap
+msgid ""
+".b:\n"
+"\tcmp\tal, 'b'\n"
+"\tjne\t.e\n"
+"\tor\tah, ah\n"
+"\tjne\tnear usage\n"
+"\tmov\tesi, pinhole\n"
+"\tjmp\t.arg\n"
+msgstr ""
+".b:\n"
+"\tcmp\tal, 'b'\n"
+"\tjne\t.e\n"
+"\tor\tah, ah\n"
+"\tjne\tnear usage\n"
+"\tmov\tesi, pinhole\n"
+"\tjmp\t.arg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3553
+#, no-wrap
+msgid ""
+".e:\n"
+"\tcmp\tal, 'e'\n"
+"\tjne\tnear usage\n"
+"\tor\tah, ah\n"
+"\tjne\tnear usage\n"
+"\tmov\tal, ','\n"
+"\tmov\t[huhmsg], al\n"
+"\tmov\t[separ], al\n"
+"\tmov\t[sep2], al\n"
+"\tmov\t[sep3], al\n"
+"\tmov\t[sep4], al\n"
+"\tjmp\t.arg\n"
+msgstr ""
+".e:\n"
+"\tcmp\tal, 'e'\n"
+"\tjne\tnear usage\n"
+"\tor\tah, ah\n"
+"\tjne\tnear usage\n"
+"\tmov\tal, ','\n"
+"\tmov\t[huhmsg], al\n"
+"\tmov\t[separ], al\n"
+"\tmov\t[sep2], al\n"
+"\tmov\t[sep3], al\n"
+"\tmov\t[sep4], al\n"
+"\tjmp\t.arg\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3560
+#, no-wrap
+msgid ""
+"align 4\n"
+".getenv:\n"
+"\t; If ESI = 0, we did not have a -p argument,\n"
+"\t; and need to check the environment for \"PINHOLE=\"\n"
+"\tor\tesi, esi\n"
+"\tjne\t.init\n"
+msgstr ""
+"align 4\n"
+".getenv:\n"
+"\t; If ESI = 0, we did not have a -p argument,\n"
+"\t; and need to check the environment for \"PINHOLE=\"\n"
+"\tor\tesi, esi\n"
+"\tjne\t.init\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3562
+#, no-wrap
+msgid "\tsub\tecx, ecx\n"
+msgstr "\tsub\tecx, ecx\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3567
+#, no-wrap
+msgid ""
+".nextenv:\n"
+"\tpop\tesi\n"
+"\tor\tesi, esi\n"
+"\tje\t.default\t; no PINHOLE envar found\n"
+msgstr ""
+".nextenv:\n"
+"\tpop\tesi\n"
+"\tor\tesi, esi\n"
+"\tje\t.default\t; no PINHOLE envar found\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3573
+#, no-wrap
+msgid ""
+"\t; check if this envar starts with 'PINHOLE='\n"
+"\tmov\tedi, envar\n"
+"\tmov\tcl, 2\t\t; 'PINHOLE=' is 2 dwords long\n"
+"rep\tcmpsd\n"
+"\tjne\t.nextenv\n"
+msgstr ""
+"\t; check if this envar starts with 'PINHOLE='\n"
+"\tmov\tedi, envar\n"
+"\tmov\tcl, 2\t\t; 'PINHOLE=' is 2 dwords long\n"
+"rep\tcmpsd\n"
+"\tjne\t.nextenv\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3581
+#, no-wrap
+msgid ""
+"\t; Check if it is followed by a digit\n"
+"\tmov\tal, [esi]\n"
+"\tcmp\tal, '0'\n"
+"\tjl\t.default\n"
+"\tcmp\tal, '9'\n"
+"\tjbe\t.init\n"
+"\t; fall through\n"
+msgstr ""
+"\t; Check if it is followed by a digit\n"
+"\tmov\tal, [esi]\n"
+"\tcmp\tal, '0'\n"
+"\tjl\t.default\n"
+"\tcmp\tal, '9'\n"
+"\tjbe\t.init\n"
+"\t; fall through\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3588
+#, no-wrap
+msgid ""
+"align 4\n"
+".default:\n"
+"\t; We got here because we had no -p argument,\n"
+"\t; and did not find the PINHOLE envar.\n"
+"\tmov\tesi, pinhole\n"
+"\t; fall through\n"
+msgstr ""
+"align 4\n"
+".default:\n"
+"\t; We got here because we had no -p argument,\n"
+"\t; and did not find the PINHOLE envar.\n"
+"\tmov\tesi, pinhole\n"
+"\t; fall through\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3597
+#, no-wrap
+msgid ""
+"align 4\n"
+".init:\n"
+"\tsub\teax, eax\n"
+"\tsub\tebx, ebx\n"
+"\tsub\tecx, ecx\n"
+"\tsub\tedx, edx\n"
+"\tmov\tedi, dbuffer+1\n"
+"\tmov\tbyte [dbuffer], '0'\n"
+msgstr ""
+"align 4\n"
+".init:\n"
+"\tsub\teax, eax\n"
+"\tsub\tebx, ebx\n"
+"\tsub\tecx, ecx\n"
+"\tsub\tedx, edx\n"
+"\tmov\tedi, dbuffer+1\n"
+"\tmov\tbyte [dbuffer], '0'\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3606
+#, no-wrap
+msgid ""
+"\t; Convert the pinhole constant to real\n"
+".constloop:\n"
+"\tlodsb\n"
+"\tcmp\tal, '9'\n"
+"\tja\t.setconst\n"
+"\tcmp\tal, '0'\n"
+"\tje\t.processconst\n"
+"\tjb\t.setconst\n"
+msgstr ""
+"\t; Convert the pinhole constant to real\n"
+".constloop:\n"
+"\tlodsb\n"
+"\tcmp\tal, '9'\n"
+"\tja\t.setconst\n"
+"\tcmp\tal, '0'\n"
+"\tje\t.processconst\n"
+"\tjb\t.setconst\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3608
+#, no-wrap
+msgid "\tinc\tdl\n"
+msgstr "\tinc\tdl\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3615
+#, no-wrap
+msgid ""
+".processconst:\n"
+"\tinc\tcl\n"
+"\tcmp\tcl, 18\n"
+"\tja\tnear consttoobig\n"
+"\tstosb\n"
+"\tjmp\tshort .constloop\n"
+msgstr ""
+".processconst:\n"
+"\tinc\tcl\n"
+"\tcmp\tcl, 18\n"
+"\tja\tnear consttoobig\n"
+"\tstosb\n"
+"\tjmp\tshort .constloop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3620
+#, no-wrap
+msgid ""
+"align 4\n"
+".setconst:\n"
+"\tor\tdl, dl\n"
+"\tje\tnear perr\n"
+msgstr ""
+"align 4\n"
+".setconst:\n"
+"\tor\tdl, dl\n"
+"\tje\tnear perr\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3623
+#, no-wrap
+msgid ""
+"\tfinit\n"
+"\tfild\tdword [tthou]\n"
+msgstr ""
+"\tfinit\n"
+"\tfild\tdword [tthou]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3627
+#, no-wrap
+msgid ""
+"\tfld1\n"
+"\tfild\tdword [ten]\n"
+"\tfdivp\tst1, st0\n"
+msgstr ""
+"\tfld1\n"
+"\tfild\tdword [ten]\n"
+"\tfdivp\tst1, st0\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3630
+#, no-wrap
+msgid ""
+"\tfild\tdword [thousand]\n"
+"\tmov\tedi, obuffer\n"
+msgstr ""
+"\tfild\tdword [thousand]\n"
+"\tmov\tedi, obuffer\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3633
+#, no-wrap
+msgid ""
+"\tmov\tebp, ecx\n"
+"\tcall\tbcdload\n"
+msgstr ""
+"\tmov\tebp, ecx\n"
+"\tcall\tbcdload\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3637
+#, no-wrap
+msgid ""
+".constdiv:\n"
+"\tfmul\tst0, st2\n"
+"\tloop\t.constdiv\n"
+msgstr ""
+".constdiv:\n"
+"\tfmul\tst0, st2\n"
+"\tloop\t.constdiv\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3644
+#, no-wrap
+msgid ""
+"\tfld1\n"
+"\tfadd\tst0, st0\n"
+"\tfadd\tst0, st0\n"
+"\tfld1\n"
+"\tfaddp\tst1, st0\n"
+"\tfchs\n"
+msgstr ""
+"\tfld1\n"
+"\tfadd\tst0, st0\n"
+"\tfadd\tst0, st0\n"
+"\tfld1\n"
+"\tfaddp\tst1, st0\n"
+"\tfchs\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3649
+#, no-wrap
+msgid ""
+"\t; If we are creating a CSV file,\n"
+"\t; print header\n"
+"\tcmp\tbyte [separ], ','\n"
+"\tjne\t.bigloop\n"
+msgstr ""
+"\t; If we are creating a CSV file,\n"
+"\t; print header\n"
+"\tcmp\tbyte [separ], ','\n"
+"\tjne\t.bigloop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3654
+#, no-wrap
+msgid ""
+"\tpush\tdword headlen\n"
+"\tpush\tdword header\n"
+"\tpush\tdword [fd.out]\n"
+"\tsys.write\n"
+msgstr ""
+"\tpush\tdword headlen\n"
+"\tpush\tdword header\n"
+"\tpush\tdword [fd.out]\n"
+"\tsys.write\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3658
+#, no-wrap
+msgid ""
+".bigloop:\n"
+"\tcall\tgetchar\n"
+"\tjc\tnear done\n"
+msgstr ""
+".bigloop:\n"
+"\tcall\tgetchar\n"
+"\tjc\tnear done\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3664
+#, no-wrap
+msgid ""
+"\t; Skip to the end of the line if you got '#'\n"
+"\tcmp\tal, '#'\n"
+"\tjne\t.num\n"
+"\tcall\tskiptoeol\n"
+"\tjmp\tshort .bigloop\n"
+msgstr ""
+"\t; Skip to the end of the line if you got '#'\n"
+"\tcmp\tal, '#'\n"
+"\tjne\t.num\n"
+"\tcall\tskiptoeol\n"
+"\tjmp\tshort .bigloop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3671
+#, no-wrap
+msgid ""
+".num:\n"
+"\t; See if you got a number\n"
+"\tcmp\tal, '0'\n"
+"\tjl\t.bigloop\n"
+"\tcmp\tal, '9'\n"
+"\tja\t.bigloop\n"
+msgstr ""
+".num:\n"
+"\t; See if you got a number\n"
+"\tcmp\tal, '0'\n"
+"\tjl\t.bigloop\n"
+"\tcmp\tal, '9'\n"
+"\tja\t.bigloop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3675
+#, no-wrap
+msgid ""
+"\t; Yes, we have a number\n"
+"\tsub\tebp, ebp\n"
+"\tsub\tedx, edx\n"
+msgstr ""
+"\t; Yes, we have a number\n"
+"\tsub\tebp, ebp\n"
+"\tsub\tedx, edx\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3680
+#, no-wrap
+msgid ""
+".number:\n"
+"\tcmp\tal, '0'\n"
+"\tje\t.number0\n"
+"\tmov\tdl, 1\n"
+msgstr ""
+".number:\n"
+"\tcmp\tal, '0'\n"
+"\tje\t.number0\n"
+"\tmov\tdl, 1\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3691
+#, no-wrap
+msgid ""
+".number0:\n"
+"\tor\tdl, dl\t\t; Skip leading 0's\n"
+"\tje\t.nextnumber\n"
+"\tpush\teax\n"
+"\tcall\tputchar\n"
+"\tpop\teax\n"
+"\tinc\tebp\n"
+"\tcmp\tebp, 19\n"
+"\tjae\t.nextnumber\n"
+"\tmov\t[dbuffer+ebp], al\n"
+msgstr ""
+".number0:\n"
+"\tor\tdl, dl\t\t; Skip leading 0's\n"
+"\tje\t.nextnumber\n"
+"\tpush\teax\n"
+"\tcall\tputchar\n"
+"\tpop\teax\n"
+"\tinc\tebp\n"
+"\tcmp\tebp, 19\n"
+"\tjae\t.nextnumber\n"
+"\tmov\t[dbuffer+ebp], al\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3702
+#, no-wrap
+msgid ""
+".nextnumber:\n"
+"\tcall\tgetchar\n"
+"\tjc\t.work\n"
+"\tcmp\tal, '#'\n"
+"\tje\t.ungetc\n"
+"\tcmp\tal, '0'\n"
+"\tjl\t.work\n"
+"\tcmp\tal, '9'\n"
+"\tja\t.work\n"
+"\tjmp\tshort .number\n"
+msgstr ""
+".nextnumber:\n"
+"\tcall\tgetchar\n"
+"\tjc\t.work\n"
+"\tcmp\tal, '#'\n"
+"\tje\t.ungetc\n"
+"\tcmp\tal, '0'\n"
+"\tjl\t.work\n"
+"\tcmp\tal, '9'\n"
+"\tja\t.work\n"
+"\tjmp\tshort .number\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3706
+#, no-wrap
+msgid ""
+".ungetc:\n"
+"\tdec\tesi\n"
+"\tinc\tebx\n"
+msgstr ""
+".ungetc:\n"
+"\tdec\tesi\n"
+"\tinc\tebx\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3711
+#, no-wrap
+msgid ""
+".work:\n"
+"\t; Now, do all the work\n"
+"\tor\tdl, dl\n"
+"\tje\tnear .work0\n"
+msgstr ""
+".work:\n"
+"\t; Now, do all the work\n"
+"\tor\tdl, dl\n"
+"\tje\tnear .work0\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3714
+#, no-wrap
+msgid ""
+"\tcmp\tebp, 19\n"
+"\tjae\tnear .toobig\n"
+msgstr ""
+"\tcmp\tebp, 19\n"
+"\tjae\tnear .toobig\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3716
+#, no-wrap
+msgid "\tcall\tbcdload\n"
+msgstr "\tcall\tbcdload\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3718
+#, no-wrap
+msgid "\t; Calculate pinhole diameter\n"
+msgstr "\t; Calculate pinhole diameter\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3725
+#, no-wrap
+msgid ""
+"\tfld\tst0\t; save it\n"
+"\tfsqrt\n"
+"\tfmul\tst0, st3\n"
+"\tfld\tst0\n"
+"\tfmul\tst5\n"
+"\tsub\tebp, ebp\n"
+msgstr ""
+"\tfld\tst0\t; save it\n"
+"\tfsqrt\n"
+"\tfmul\tst0, st3\n"
+"\tfld\tst0\n"
+"\tfmul\tst5\n"
+"\tsub\tebp, ebp\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3735
+#, no-wrap
+msgid ""
+"\t; Round off to 4 significant digits\n"
+".diameter:\n"
+"\tfcom\tst0, st7\n"
+"\tfstsw\tax\n"
+"\tsahf\n"
+"\tjb\t.printdiameter\n"
+"\tfmul\tst0, st6\n"
+"\tinc\tebp\n"
+"\tjmp\tshort .diameter\n"
+msgstr ""
+"\t; Round off to 4 significant digits\n"
+".diameter:\n"
+"\tfcom\tst0, st7\n"
+"\tfstsw\tax\n"
+"\tsahf\n"
+"\tjb\t.printdiameter\n"
+"\tfmul\tst0, st6\n"
+"\tinc\tebp\n"
+"\tjmp\tshort .diameter\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3738
+#, no-wrap
+msgid ""
+".printdiameter:\n"
+"\tcall\tprintnumber\t; pinhole diameter\n"
+msgstr ""
+".printdiameter:\n"
+"\tcall\tprintnumber\t; pinhole diameter\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3740
+#, no-wrap
+msgid "\t; Calculate F-number\n"
+msgstr "\t; Calculate F-number\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3743
+#, no-wrap
+msgid ""
+"\tfdivp\tst1, st0\n"
+"\tfld\tst0\n"
+msgstr ""
+"\tfdivp\tst1, st0\n"
+"\tfld\tst0\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3745
+#, no-wrap
+msgid "\tsub\tebp, ebp\n"
+msgstr "\tsub\tebp, ebp\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3754
+#, no-wrap
+msgid ""
+".fnumber:\n"
+"\tfcom\tst0, st6\n"
+"\tfstsw\tax\n"
+"\tsahf\n"
+"\tjb\t.printfnumber\n"
+"\tfmul\tst0, st5\n"
+"\tinc\tebp\n"
+"\tjmp\tshort .fnumber\n"
+msgstr ""
+".fnumber:\n"
+"\tfcom\tst0, st6\n"
+"\tfstsw\tax\n"
+"\tsahf\n"
+"\tjb\t.printfnumber\n"
+"\tfmul\tst0, st5\n"
+"\tinc\tebp\n"
+"\tjmp\tshort .fnumber\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3757
+#, no-wrap
+msgid ""
+".printfnumber:\n"
+"\tcall\tprintnumber\t; F number\n"
+msgstr ""
+".printfnumber:\n"
+"\tcall\tprintnumber\t; F number\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3768
+#, no-wrap
+msgid ""
+"\t; Calculate normalized F-number\n"
+"\tfmul\tst0, st0\n"
+"\tfld1\n"
+"\tfld\tst1\n"
+"\tfyl2x\n"
+"\tfrndint\n"
+"\tfld1\n"
+"\tfscale\n"
+"\tfsqrt\n"
+"\tfstp\tst1\n"
+msgstr ""
+"\t; Calculate normalized F-number\n"
+"\tfmul\tst0, st0\n"
+"\tfld1\n"
+"\tfld\tst1\n"
+"\tfyl2x\n"
+"\tfrndint\n"
+"\tfld1\n"
+"\tfscale\n"
+"\tfsqrt\n"
+"\tfstp\tst1\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3771
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3799
+#, no-wrap
+msgid ""
+"\tsub\tebp, ebp\n"
+"\tcall\tprintnumber\n"
+msgstr ""
+"\tsub\tebp, ebp\n"
+"\tcall\tprintnumber\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3773
+#, no-wrap
+msgid "\t; Calculate time multiplier from F-5.6\n"
+msgstr "\t; Calculate time multiplier from F-5.6\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3776
+#, no-wrap
+msgid ""
+"\tfscale\n"
+"\tfld\tst0\n"
+msgstr ""
+"\tfscale\n"
+"\tfld\tst0\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3782
+#, no-wrap
+msgid ""
+"\t; Round off to 4 significant digits\n"
+".fmul:\n"
+"\tfcom\tst0, st6\n"
+"\tfstsw\tax\n"
+"\tsahf\n"
+msgstr ""
+"\t; Round off to 4 significant digits\n"
+".fmul:\n"
+"\tfcom\tst0, st6\n"
+"\tfstsw\tax\n"
+"\tsahf\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3787
+#, no-wrap
+msgid ""
+"\tjb\t.printfmul\n"
+"\tinc\tebp\n"
+"\tfmul\tst0, st5\n"
+"\tjmp\tshort .fmul\n"
+msgstr ""
+"\tjb\t.printfmul\n"
+"\tinc\tebp\n"
+"\tfmul\tst0, st5\n"
+"\tjmp\tshort .fmul\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3790
+#, no-wrap
+msgid ""
+".printfmul:\n"
+"\tcall\tprintnumber\t; F multiplier\n"
+msgstr ""
+".printfmul:\n"
+"\tcall\tprintnumber\t; F multiplier\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3792
+#, no-wrap
+msgid "\t; Calculate F-stops from 5.6\n"
+msgstr "\t; Calculate F-stops from 5.6\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3796
+#, no-wrap
+msgid ""
+"\tfld1\n"
+"\tfxch\tst1\n"
+"\tfyl2x\n"
+msgstr ""
+"\tfld1\n"
+"\tfxch\tst1\n"
+"\tfyl2x\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3803
+#, no-wrap
+msgid ""
+"\tmov\tal, 0Ah\n"
+"\tcall\tputchar\n"
+"\tjmp\t.bigloop\n"
+msgstr ""
+"\tmov\tal, 0Ah\n"
+"\tcall\tputchar\n"
+"\tjmp\t.bigloop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3807
+#, no-wrap
+msgid ""
+".work0:\n"
+"\tmov\tal, '0'\n"
+"\tcall\tputchar\n"
+msgstr ""
+".work0:\n"
+"\tmov\tal, '0'\n"
+"\tcall\tputchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3812
+#, no-wrap
+msgid ""
+"align 4\n"
+".toobig:\n"
+"\tcall\thuh\n"
+"\tjmp\t.bigloop\n"
+msgstr ""
+"align 4\n"
+".toobig:\n"
+"\tcall\thuh\n"
+"\tjmp\t.bigloop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3816
+#, no-wrap
+msgid ""
+"align 4\n"
+"done:\n"
+"\tcall\twrite\t\t; flush output buffer\n"
+msgstr ""
+"align 4\n"
+"done:\n"
+"\tcall\twrite\t\t; flush output buffer\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3825
+#, no-wrap
+msgid "\tfinit\n"
+msgstr "\tfinit\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3838
+#, no-wrap
+msgid ""
+"align 4\n"
+"skiptoeol:\n"
+"\t; Keep reading until you come to cr, lf, or eof\n"
+"\tcall\tgetchar\n"
+"\tjc\tdone\n"
+"\tcmp\tal, 0Ah\n"
+"\tjne\t.cr\n"
+"\tret\n"
+msgstr ""
+"align 4\n"
+"skiptoeol:\n"
+"\t; Keep reading until you come to cr, lf, or eof\n"
+"\tcall\tgetchar\n"
+"\tjc\tdone\n"
+"\tcmp\tal, 0Ah\n"
+"\tjne\t.cr\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3843
+#, no-wrap
+msgid ""
+".cr:\n"
+"\tcmp\tal, 0Dh\n"
+"\tjne\tskiptoeol\n"
+"\tret\n"
+msgstr ""
+".cr:\n"
+"\tcmp\tal, 0Dh\n"
+"\tjne\tskiptoeol\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3856
+#, no-wrap
+msgid ""
+".fetch:\n"
+"\tlodsb\n"
+"\tdec\tebx\n"
+"\tclc\n"
+"\tret\n"
+msgstr ""
+".fetch:\n"
+"\tlodsb\n"
+"\tdec\tebx\n"
+"\tclc\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3873
+#, no-wrap
+msgid ""
+".read:\n"
+"\tpush\tdword BUFSIZE\n"
+"\tmov\tesi, ibuffer\n"
+"\tpush\tesi\n"
+"\tpush\tdword [fd.in]\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tmov\tebx, eax\n"
+"\tor\teax, eax\n"
+"\tje\t.empty\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+msgstr ""
+".read:\n"
+"\tpush\tdword BUFSIZE\n"
+"\tmov\tesi, ibuffer\n"
+"\tpush\tesi\n"
+"\tpush\tdword [fd.in]\n"
+"\tsys.read\n"
+"\tadd\tesp, byte 12\n"
+"\tmov\tebx, eax\n"
+"\tor\teax, eax\n"
+"\tje\t.empty\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3879
+#, no-wrap
+msgid ""
+"align 4\n"
+".empty:\n"
+"\tadd\tesp, byte 4\n"
+"\tstc\n"
+"\tret\n"
+msgstr ""
+"align 4\n"
+".empty:\n"
+"\tadd\tesp, byte 4\n"
+"\tstc\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3908
+#, no-wrap
+msgid ""
+"align 4\n"
+"bcdload:\n"
+"\t; EBP contains the number of chars in dbuffer\n"
+"\tpush\tecx\n"
+"\tpush\tesi\n"
+"\tpush\tedi\n"
+msgstr ""
+"align 4\n"
+"bcdload:\n"
+"\t; EBP contains the number of chars in dbuffer\n"
+"\tpush\tecx\n"
+"\tpush\tesi\n"
+"\tpush\tedi\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3912
+#, no-wrap
+msgid ""
+"\tlea\tecx, [ebp+1]\n"
+"\tlea\tesi, [dbuffer+ebp-1]\n"
+"\tshr\tecx, 1\n"
+msgstr ""
+"\tlea\tecx, [ebp+1]\n"
+"\tlea\tesi, [dbuffer+ebp-1]\n"
+"\tshr\tecx, 1\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3914
+#, no-wrap
+msgid "\tstd\n"
+msgstr "\tstd\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3920
+#, no-wrap
+msgid ""
+"\tmov\tedi, bbuffer\n"
+"\tsub\teax, eax\n"
+"\tmov\t[edi], eax\n"
+"\tmov\t[edi+4], eax\n"
+"\tmov\t[edi+2], ax\n"
+msgstr ""
+"\tmov\tedi, bbuffer\n"
+"\tsub\teax, eax\n"
+"\tmov\t[edi], eax\n"
+"\tmov\t[edi+4], eax\n"
+"\tmov\t[edi+2], ax\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3929
+#, no-wrap
+msgid ""
+".loop:\n"
+"\tlodsw\n"
+"\tsub\tax, 3030h\n"
+"\tshl\tal, 4\n"
+"\tor\tal, ah\n"
+"\tmov\t[edi], al\n"
+"\tinc\tedi\n"
+"\tloop\t.loop\n"
+msgstr ""
+".loop:\n"
+"\tlodsw\n"
+"\tsub\tax, 3030h\n"
+"\tshl\tal, 4\n"
+"\tor\tal, ah\n"
+"\tmov\t[edi], al\n"
+"\tinc\tedi\n"
+"\tloop\t.loop\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3931
+#, no-wrap
+msgid "\tfbld\t[bbuffer]\n"
+msgstr "\tfbld\t[bbuffer]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3938
+#, no-wrap
+msgid ""
+"\tcld\n"
+"\tpop\tedi\n"
+"\tpop\tesi\n"
+"\tpop\tecx\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+msgstr ""
+"\tcld\n"
+"\tpop\tedi\n"
+"\tpop\tesi\n"
+"\tpop\tecx\n"
+"\tsub\teax, eax\n"
+"\tret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3944
+#, no-wrap
+msgid ""
+"align 4\n"
+"printnumber:\n"
+"\tpush\tebp\n"
+"\tmov\tal, [separ]\n"
+"\tcall\tputchar\n"
+msgstr ""
+"align 4\n"
+"printnumber:\n"
+"\tpush\tebp\n"
+"\tmov\tal, [separ]\n"
+"\tcall\tputchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3948
+#, no-wrap
+msgid ""
+"\t; Print the integer at the TOS\n"
+"\tmov\tebp, bbuffer+9\n"
+"\tfbstp\t[bbuffer]\n"
+msgstr ""
+"\t; Print the integer at the TOS\n"
+"\tmov\tebp, bbuffer+9\n"
+"\tfbstp\t[bbuffer]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3954
+#, no-wrap
+msgid ""
+"\t; Check the sign\n"
+"\tmov\tal, [ebp]\n"
+"\tdec\tebp\n"
+"\tor\tal, al\n"
+"\tjns\t.leading\n"
+msgstr ""
+"\t; Check the sign\n"
+"\tmov\tal, [ebp]\n"
+"\tdec\tebp\n"
+"\tor\tal, al\n"
+"\tjns\t.leading\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3958
+#, no-wrap
+msgid ""
+"\t; We got a negative number (should never happen)\n"
+"\tmov\tal, '-'\n"
+"\tcall\tputchar\n"
+msgstr ""
+"\t; We got a negative number (should never happen)\n"
+"\tmov\tal, '-'\n"
+"\tcall\tputchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3967
+#, no-wrap
+msgid ""
+".leading:\n"
+"\t; Skip leading zeros\n"
+"\tmov\tal, [ebp]\n"
+"\tdec\tebp\n"
+"\tor\tal, al\n"
+"\tjne\t.first\n"
+"\tcmp\tebp, bbuffer\n"
+"\tjae\t.leading\n"
+msgstr ""
+".leading:\n"
+"\t; Skip leading zeros\n"
+"\tmov\tal, [ebp]\n"
+"\tdec\tebp\n"
+"\tor\tal, al\n"
+"\tjne\t.first\n"
+"\tcmp\tebp, bbuffer\n"
+"\tjae\t.leading\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3972
+#, no-wrap
+msgid ""
+"\t; We are here because the result was 0.\n"
+"\t; Print '0' and return\n"
+"\tmov\tal, '0'\n"
+"\tjmp\tputchar\n"
+msgstr ""
+"\t; We are here because the result was 0.\n"
+"\t; Print '0' and return\n"
+"\tmov\tal, '0'\n"
+"\tjmp\tputchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3984
+#, no-wrap
+msgid ""
+".first:\n"
+"\t; We have found the first non-zero.\n"
+"\t; But it is still packed\n"
+"\ttest\tal, 0F0h\n"
+"\tjz\t.second\n"
+"\tpush\teax\n"
+"\tshr\tal, 4\n"
+"\tadd\tal, '0'\n"
+"\tcall\tputchar\n"
+"\tpop\teax\n"
+"\tand\tal, 0Fh\n"
+msgstr ""
+".first:\n"
+"\t; We have found the first non-zero.\n"
+"\t; But it is still packed\n"
+"\ttest\tal, 0F0h\n"
+"\tjz\t.second\n"
+"\tpush\teax\n"
+"\tshr\tal, 4\n"
+"\tadd\tal, '0'\n"
+"\tcall\tputchar\n"
+"\tpop\teax\n"
+"\tand\tal, 0Fh\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3988
+#, no-wrap
+msgid ""
+".second:\n"
+"\tadd\tal, '0'\n"
+"\tcall\tputchar\n"
+msgstr ""
+".second:\n"
+"\tadd\tal, '0'\n"
+"\tcall\tputchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:3992
+#, no-wrap
+msgid ""
+".next:\n"
+"\tcmp\tebp, bbuffer\n"
+"\tjb\t.done\n"
+msgstr ""
+".next:\n"
+"\tcmp\tebp, bbuffer\n"
+"\tjb\t.done\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4002
+#, no-wrap
+msgid ""
+"\tmov\tal, [ebp]\n"
+"\tpush\teax\n"
+"\tshr\tal, 4\n"
+"\tadd\tal, '0'\n"
+"\tcall\tputchar\n"
+"\tpop\teax\n"
+"\tand\tal, 0Fh\n"
+"\tadd\tal, '0'\n"
+"\tcall\tputchar\n"
+msgstr ""
+"\tmov\tal, [ebp]\n"
+"\tpush\teax\n"
+"\tshr\tal, 4\n"
+"\tadd\tal, '0'\n"
+"\tcall\tputchar\n"
+"\tpop\teax\n"
+"\tand\tal, 0Fh\n"
+"\tadd\tal, '0'\n"
+"\tcall\tputchar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4005
+#, no-wrap
+msgid ""
+"\tdec\tebp\n"
+"\tjmp\tshort .next\n"
+msgstr ""
+"\tdec\tebp\n"
+"\tjmp\tshort .next\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4010
+#, no-wrap
+msgid ""
+".done:\n"
+"\tpop\tebp\n"
+"\tor\tebp, ebp\n"
+"\tje\t.ret\n"
+msgstr ""
+".done:\n"
+"\tpop\tebp\n"
+"\tor\tebp, ebp\n"
+"\tje\t.ret\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4016
+#, no-wrap
+msgid ""
+".zeros:\n"
+"\tmov\tal, '0'\n"
+"\tcall\tputchar\n"
+"\tdec\tebp\n"
+"\tjne\t.zeros\n"
+msgstr ""
+".zeros:\n"
+"\tmov\tal, '0'\n"
+"\tcall\tputchar\n"
+"\tdec\tebp\n"
+"\tjne\t.zeros\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4019
+#, no-wrap
+msgid ""
+".ret:\n"
+"\tret\n"
+msgstr ""
+".ret:\n"
+"\tret\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4022
+msgid ""
+"The code follows the same format as all the other filters we have seen "
+"before, with one subtle exception:"
+msgstr ""
+"Код следует тому же формату, что и все остальные фильтры, которые мы видели "
+"ранее, с одним небольшим исключением:"
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4025
+msgid ""
+"We are no longer assuming that the end of input implies the end of things to "
+"do, something we took for granted in the _character-oriented_ filters."
+msgstr ""
+"Мы больше не предполагаем, что конец ввода означает конец задач, как мы "
+"привыкли в фильтрах, _ориентированных на символы_."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4027
+msgid ""
+"This filter does not process characters. It processes a _language_ (albeit a "
+"very simple one, consisting only of numbers)."
+msgstr ""
+"Этот фильтр не обрабатывает символы. Он обрабатывает _язык_ (хотя и очень "
+"простой, состоящий только из чисел)."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4029
+msgid "When we have no more input, it can mean one of two things:"
+msgstr ""
+"Когда у нас больше нет входных данных, это может означать одно из двух:"
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4031
+msgid "We are done and can quit. This is the same as before."
+msgstr "Мы закончили и можем выйти. Это то же самое, что и раньше."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4032
+msgid ""
+"The last character we have read was a digit. We have stored it at the end of "
+"our ASCII-to-float conversion buffer. We now need to convert the contents of "
+"that buffer into a number and write the last line of our output."
+msgstr ""
+"Последний прочитанный символ был цифрой. Мы сохранили его в конце буфера "
+"преобразования ASCII в число с плавающей точкой. Теперь нам нужно "
+"преобразовать содержимое этого буфера в число и записать последнюю строку "
+"нашего вывода."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4034
+msgid ""
+"For that reason, we have modified our `getchar` and our `read` routines to "
+"return with the `carry flag` _clear_ whenever we are fetching another "
+"character from the input, or the `carry flag` _set_ whenever there is no "
+"more input."
+msgstr ""
+"По этой причине мы изменили наши подпрограммы `getchar` и `read`, чтобы они "
+"возвращались с _сброшенным_ флагом `carry`, когда получают очередной символ "
+"из ввода, или с _установленным_ флагом `carry`, когда ввода больше нет."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4037
+msgid ""
+"Of course, we are still using assembly language magic to do that! Take a "
+"good look at `getchar`. It _always_ returns with the `carry flag` _clear_."
+msgstr ""
+"Конечно, мы по-прежнему используем магию ассемблера для этого! Внимательно "
+"посмотрите на `getchar`. Он _всегда_ возвращает _очищенный_ `флаг переноса`."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4039
+msgid ""
+"Yet, our main code relies on the `carry flag` to tell it when to quit-and it "
+"works."
+msgstr ""
+"Тем не менее, наш основной код использует `флаг переноса` для определения "
+"момента завершения — и это работает."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4042
+msgid ""
+"The magic is in `read`. Whenever it receives more input from the system, it "
+"just returns to `getchar`, which fetches a character from the input buffer, "
+"_clears_ the `carry flag` and returns."
+msgstr ""
+"Волшебство кроется в `read`. Каждый раз, когда он получает больше входных "
+"данных от системы, он просто возвращается к `getchar`, который извлекает "
+"символ из входного буфера, _сбрасывает_ флаг переноса (`carry flag`) и "
+"возвращает управление."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4045
+msgid ""
+"But when `read` receives no more input from the system, it does _not_ return "
+"to `getchar` at all. Instead, the `add esp, byte 4` op code adds `4` to "
+"`ESP`, _sets_ the `carry flag`, and returns."
+msgstr ""
+"Но когда `read` больше не получает входных данных от системы, он _не_ "
+"возвращается к `getchar` вообще. Вместо этого, инструкция `add esp, byte 4` "
+"добавляет `4` к `ESP`, _устанавливает_ флаг переноса (`carry flag`) и "
+"возвращает управление."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4049
+msgid ""
+"So, where does it return to? Whenever a program uses the `call` op code, the "
+"microprocessor ``push``es the return address, i.e., it stores it on the top "
+"of the stack (not the FPU stack, the system stack, which is in the memory). "
+"When a program uses the `ret` op code, the microprocessor ``pop``s the "
+"return value from the stack, and jumps to the address that was stored there."
+msgstr ""
+"Итак, куда же она возвращается? Каждый раз, когда программа использует "
+"операцию `call`, микропроцессор делает ``push`` для адрес возврата, то есть "
+"сохраняет его на вершине стека (не стека FPU, а системного стека, который "
+"находится в памяти). Когда программа использует операцию `ret`, "
+"микропроцессор делает ``pop`` для значения возврата из стека и переходит по "
+"адресу, который там был сохранён."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4051
+msgid ""
+"But since we added `4` to `ESP` (which is the stack pointer register), we "
+"have effectively given the microprocessor a minor case of _amnesia_: It no "
+"longer remembers it was `getchar` that ``call``ed `read`."
+msgstr ""
+"Но поскольку мы добавили `4` к `ESP` (который является регистром указателя "
+"стека), мы фактически вызвали у микропроцессора лёгкий случай _амнезии_: он "
+"больше не помнит, что именно `getchar` ``вызвал`` `read`."
+
+#. type: delimited block _ 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4053
+msgid ""
+"And since `getchar` never ``push``ed anything before ``call``ing `read`, the "
+"top of the stack now contains the return address to whatever or whoever "
+"``call``ed `getchar`. As far as that caller is concerned, he ``call``ed "
+"`getchar`, which ``ret``urned with the `carry flag` set!"
+msgstr ""
+"И поскольку `getchar` не делал ``push`` ни для чего перед вызовом `read`, "
+"верхушка стека теперь содержит адрес возврата к тому, что или кто вызывал "
+"`getchar`. С точки зрения этого вызывающего, он вызывал `getchar`, который "
+"вызвал ``ret`` с установленным `флагом переноса`!"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4056
+msgid ""
+"Other than that, the `bcdload` routine is caught up in the middle of a "
+"Lilliputian conflict between the Big-Endians and the Little-Endians."
+msgstr ""
+"Помимо этого, процедура `bcdload` оказывается втянута в лилипутский конфликт "
+"между Биг-Эндианцами и Литл-Эндианцами."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4058
+msgid ""
+"It is converting the text representation of a number into that number: The "
+"text is stored in the big-endian order, but the _packed decimal_ is little-"
+"endian."
+msgstr ""
+"Он преобразует текстовое представление числа в само число: текст хранится в "
+"порядке big-endian, но _упакованный десятичный_ формат имеет порядок little-"
+"endian."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4061
+msgid ""
+"To solve the conflict, we use the `std` op code early on. We cancel it with "
+"`cld` later on: It is quite important we do not `call` anything that may "
+"depend on the default setting of the _direction flag_ while `std` is active."
+msgstr ""
+"Для разрешения конфликта мы используем инструкцию процессора `std` в самом "
+"начале. Позже мы отменяем его с помощью `cld`: очень важно не вызывать "
+"ничего, что может зависеть от стандартного значения _флага направления_, "
+"пока активен `std`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4063
+msgid ""
+"Everything else in this code should be quit eclear, providing you have read "
+"the entire chapter that precedes it."
+msgstr ""
+"Всё остальное в этом коде должно быть достаточно понятным, при условии, что "
+"вы прочитали всю предшествующую главу."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4066
+msgid ""
+"It is a classical example of the adage that programming requires a lot of "
+"thought and only a little coding. Once we have thought through every tiny "
+"detail, the code almost writes itself."
+msgstr ""
+"Это классический пример поговорки о том, что программирование требует много "
+"размышлений и лишь немного кодирования. Как только мы продумаем каждую "
+"мельчайшую деталь, код практически напишется сам."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4068
+#, no-wrap
+msgid "Using pinhole"
+msgstr "Использование программы pinhole"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4072
+msgid ""
+"Because we have decided to make the program _ignore_ any input except for "
+"numbers (and even those inside a comment), we can actually perform _textual "
+"queries_. We do not _have to_, but we _can_."
+msgstr ""
+"Поскольку мы решили сделать так, чтобы программа _игнорировала_ любой ввод, "
+"кроме чисел (и даже их внутри комментария), мы можем выполнять _текстовые "
+"запросы_. Мы не _обязаны_ этого делать, но _можем_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4074
+msgid ""
+"In my humble opinion, forming a textual query, instead of having to follow a "
+"very strict syntax, makes software much more user friendly."
+msgstr ""
+"По моему скромному мнению, формирование текстового запроса вместо "
+"необходимости следовать очень строгому синтаксису делает программное "
+"обеспечение гораздо более дружелюбным к пользователю."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4080
+msgid ""
+"Suppose we want to build a pinhole camera to use the 4x5 inch film. The "
+"standard focal length for that film is about 150mm. We want to _fine-tune_ "
+"our focal length so the pinhole diameter is as round a number as possible. "
+"Let us also suppose we are quite comfortable with cameras but somewhat "
+"intimidated by computers. Rather than just have to type in a bunch of "
+"numbers, we want to _ask_ a couple of questions."
+msgstr ""
+"Предположим, мы хотим построить камеру-обскуру для использования плёнки "
+"размером 4x5 дюймов. Стандартное фокусное расстояние для такой плёнки "
+"составляет около 150 мм. Мы хотим _точно настроить_ фокусное расстояние, "
+"чтобы диаметр отверстия был как можно более круглым числом. Допустим также, "
+"что мы хорошо разбираемся в фотоаппаратах, но немного боимся компьютеров. "
+"Вместо того чтобы просто вводить кучу цифр, мы хотим _задать_ пару вопросов."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4082
+msgid "Our session might look like this:"
+msgstr "Наша сессия может выглядеть так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4086
+#, no-wrap
+msgid "% pinhole\n"
+msgstr "% pinhole\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4088
+#, no-wrap
+msgid "Computer,\n"
+msgstr "Computer,\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4101
+#, no-wrap
+msgid ""
+"What size pinhole do I need for the focal length of 150?\n"
+"150\t490\t306\t362\t2930\t12\n"
+"Hmmm... How about 160?\n"
+"160\t506\t316\t362\t3125\t12\n"
+"Let's make it 155, please.\n"
+"155\t498\t311\t362\t3027\t12\n"
+"Ah, let's try 157...\n"
+"157\t501\t313\t362\t3066\t12\n"
+"156?\n"
+"156\t500\t312\t362\t3047\t12\n"
+"That's it! Perfect! Thank you very much!\n"
+"^D\n"
+msgstr ""
+"What size pinhole do I need for the focal length of 150?\n"
+"150\t490\t306\t362\t2930\t12\n"
+"Hmmm... How about 160?\n"
+"160\t506\t316\t362\t3125\t12\n"
+"Let's make it 155, please.\n"
+"155\t498\t311\t362\t3027\t12\n"
+"Ah, let's try 157...\n"
+"157\t501\t313\t362\t3066\t12\n"
+"156?\n"
+"156\t500\t312\t362\t3047\t12\n"
+"That's it! Perfect! Thank you very much!\n"
+"^D\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4104
+msgid ""
+"We have found that while for the focal length of 150, our pinhole diameter "
+"should be 490 microns, or 0.49 mm, if we go with the almost identical focal "
+"length of 156 mm, we can get away with a pinhole diameter of exactly one "
+"half of a millimeter."
+msgstr ""
+"Мы выяснили, что при фокусном расстоянии 150 мм диаметр отверстия должен "
+"составлять 490 микрон, или 0,49 мм, но если взять почти идентичное фокусное "
+"расстояние 156 мм, можно использовать отверстие диаметром ровно половину "
+"миллиметра."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4106
+#, no-wrap
+msgid "Scripting"
+msgstr "Скриптинг"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4109
+msgid ""
+"Because we have chosen the `+#+` character to denote the start of a comment, "
+"we can treat our pinhole software as a _scripting language_."
+msgstr ""
+"Поскольку мы выбрали символ `+#+` для обозначения начала комментария, мы "
+"можем рассматривать наше программное обеспечение pinhole как _скриптовый "
+"язык_."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4111
+msgid "You have probably seen shell _scripts_ that start with:"
+msgstr "Вы, вероятно, видели _сценарии_ оболочки, которые начинаются с:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4115
+#, no-wrap
+msgid "#! /bin/sh\n"
+msgstr "#! /bin/sh\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4118
+msgid "...or..."
+msgstr "...или..."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4122
+#, no-wrap
+msgid "#!/bin/sh\n"
+msgstr "#!/bin/sh\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4125
+msgid "...because the blank space after the `#!` is optional."
+msgstr "...потому что пробел после `#!` необязателен."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4128
+msgid ""
+"Whenever UNIX(R) is asked to run an executable file which starts with the `#!"
+"`, it assumes the file is a script. It adds the command to the rest of the "
+"first line of the script, and tries to execute that."
+msgstr ""
+"Когда UNIX(R) получает запрос на выполнение исполняемого файла, который "
+"начинается с `#!`, он предполагает, что это скрипт. Он добавляет команду к "
+"остальной части первой строки скрипта и пытается выполнить её."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4130
+msgid ""
+"Suppose now that we have installed pinhole in /usr/local/bin/, we can now "
+"write a script to calculate various pinhole diameters suitable for various "
+"focal lengths commonly used with the 120 film."
+msgstr ""
+"Предположим, что мы установили pinhole в /usr/local/bin/, теперь мы можем "
+"написать скрипт для расчёта различных диаметров отверстий, подходящих для "
+"различных фокусных расстояний, обычно используемых с плёнкой 120."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4132
+msgid "The script might look something like this:"
+msgstr "Скрипт может выглядеть примерно так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4138
+#, no-wrap
+msgid ""
+"#! /usr/local/bin/pinhole -b -i\n"
+"# Find the best pinhole diameter\n"
+"# for the 120 film\n"
+msgstr ""
+"#! /usr/local/bin/pinhole -b -i\n"
+"# Find the best pinhole diameter\n"
+"# for the 120 film\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4141
+#, no-wrap
+msgid ""
+"### Standard\n"
+"80\n"
+msgstr ""
+"### Standard\n"
+"80\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4144
+#, no-wrap
+msgid ""
+"### Wide angle\n"
+"30, 40, 50, 60, 70\n"
+msgstr ""
+"### Wide angle\n"
+"30, 40, 50, 60, 70\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4147
+#, no-wrap
+msgid ""
+"### Telephoto\n"
+"100, 120, 140\n"
+msgstr ""
+"### Telephoto\n"
+"100, 120, 140\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4150
+msgid "Because 120 is a medium size film, we may name this file medium."
+msgstr ""
+"Поскольку 120 — это плёнка среднего размера, мы можем назвать этот файл "
+"`medium`."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4152
+msgid ""
+"We can set its permissions to execute, and run it as if it were a program:"
+msgstr ""
+"Мы можем установить права на выполнение и запустить его, как если бы это "
+"была программа:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4157
+#, no-wrap
+msgid ""
+"% chmod 755 medium\n"
+"% ./medium\n"
+msgstr ""
+"% chmod 755 medium\n"
+"% ./medium\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4160
+msgid "UNIX(R) will interpret that last command as:"
+msgstr "UNIX(R) интерпретирует последнюю команду следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4164
+#, no-wrap
+msgid "% /usr/local/bin/pinhole -b -i ./medium\n"
+msgstr "% /usr/local/bin/pinhole -b -i ./medium\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4167
+msgid "It will run that command and display:"
+msgstr "Он выполнит эту команду и отобразит:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4179
+#, no-wrap
+msgid ""
+"80\t358\t224\t256\t1562\t11\n"
+"30\t219\t137\t128\t586\t9\n"
+"40\t253\t158\t181\t781\t10\n"
+"50\t283\t177\t181\t977\t10\n"
+"60\t310\t194\t181\t1172\t10\n"
+"70\t335\t209\t181\t1367\t10\n"
+"100\t400\t250\t256\t1953\t11\n"
+"120\t438\t274\t256\t2344\t11\n"
+"140\t473\t296\t256\t2734\t11\n"
+msgstr ""
+"80\t358\t224\t256\t1562\t11\n"
+"30\t219\t137\t128\t586\t9\n"
+"40\t253\t158\t181\t781\t10\n"
+"50\t283\t177\t181\t977\t10\n"
+"60\t310\t194\t181\t1172\t10\n"
+"70\t335\t209\t181\t1367\t10\n"
+"100\t400\t250\t256\t1953\t11\n"
+"120\t438\t274\t256\t2344\t11\n"
+"140\t473\t296\t256\t2734\t11\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4182
+msgid "Now, let us enter:"
+msgstr "Теперь введем:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4186
+#, no-wrap
+msgid "% ./medium -c\n"
+msgstr "% ./medium -c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4189
+msgid "UNIX(R) will treat that as:"
+msgstr "UNIX(R) интерпретирует это следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4193
+#, no-wrap
+msgid "% /usr/local/bin/pinhole -b -i ./medium -c\n"
+msgstr "% /usr/local/bin/pinhole -b -i ./medium -c\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4197
+msgid ""
+"That gives it two conflicting options: `-b` and `-c` (Use Bender's constant "
+"and use Connors' constant). We have programmed it so later options override "
+"early ones-our program will calculate everything using Connors' constant:"
+msgstr ""
+"Это дает ему два конфликтующих параметра: `-b` и `-c` (Использовать "
+"константу Бендера и использовать константу Коннорса). Мы запрограммировали "
+"его так, что более поздние параметры переопределяют ранние — наша программа "
+"будет вычислять все, используя константу Коннорса:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4209
+#, no-wrap
+msgid ""
+"80\t331\t242\t256\t1826\t11\n"
+"30\t203\t148\t128\t685\t9\n"
+"40\t234\t171\t181\t913\t10\n"
+"50\t262\t191\t181\t1141\t10\n"
+"60\t287\t209\t181\t1370\t10\n"
+"70\t310\t226\t256\t1598\t11\n"
+"100\t370\t270\t256\t2283\t11\n"
+"120\t405\t296\t256\t2739\t11\n"
+"140\t438\t320\t362\t3196\t12\n"
+msgstr ""
+"80\t331\t242\t256\t1826\t11\n"
+"30\t203\t148\t128\t685\t9\n"
+"40\t234\t171\t181\t913\t10\n"
+"50\t262\t191\t181\t1141\t10\n"
+"60\t287\t209\t181\t1370\t10\n"
+"70\t310\t226\t256\t1598\t11\n"
+"100\t370\t270\t256\t2283\t11\n"
+"120\t405\t296\t256\t2739\t11\n"
+"140\t438\t320\t362\t3196\t12\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4213
+msgid ""
+"We decide we want to go with Bender's constant after all. We want to save "
+"its values as a comma-separated file:"
+msgstr ""
+"Мы решаем, что всё же выбираем константу Бендера. Мы хотим сохранить её "
+"значения в виде файла с разделителями-запятыми:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4229
+#, no-wrap
+msgid ""
+"% ./medium -b -e > bender\n"
+"% cat bender\n"
+"focal length in millimeters,pinhole diameter in microns,F-number,normalized F-number,F-5.6 multiplier,stops from F-5.6\n"
+"80,358,224,256,1562,11\n"
+"30,219,137,128,586,9\n"
+"40,253,158,181,781,10\n"
+"50,283,177,181,977,10\n"
+"60,310,194,181,1172,10\n"
+"70,335,209,181,1367,10\n"
+"100,400,250,256,1953,11\n"
+"120,438,274,256,2344,11\n"
+"140,473,296,256,2734,11\n"
+"%\n"
+msgstr ""
+"% ./medium -b -e > bender\n"
+"% cat bender\n"
+"focal length in millimeters,pinhole diameter in microns,F-number,normalized F-number,F-5.6 multiplier,stops from F-5.6\n"
+"80,358,224,256,1562,11\n"
+"30,219,137,128,586,9\n"
+"40,253,158,181,781,10\n"
+"50,283,177,181,977,10\n"
+"60,310,194,181,1172,10\n"
+"70,335,209,181,1367,10\n"
+"100,400,250,256,1953,11\n"
+"120,438,274,256,2344,11\n"
+"140,473,296,256,2734,11\n"
+"%\n"
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4232
+#, no-wrap
+msgid "Caveats"
+msgstr "Предостережения"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4236
+msgid ""
+"Assembly language programmers who \"grew up\" under MS-DOS(R) and Windows(R) "
+"often tend to take shortcuts. Reading the keyboard scan codes and writing "
+"directly to video memory are two classical examples of practices which, "
+"under MS-DOS(R) are not frowned upon but considered the right thing to do."
+msgstr ""
+"Программисты на ассемблере, которые \"выросли\" на MS-DOS(R) и Windows(R), "
+"часто склонны искать короткие пути. Чтение скан-кодов клавиатуры и запись "
+"напрямую в видеопамять — это два классических примера подходов, которые в MS-"
+"DOS(R) не только не порицаются, но и считаются правильными."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4238
+msgid ""
+"The reason? Both the PC BIOS and MS-DOS(R) are notoriously slow when "
+"performing these operations."
+msgstr ""
+"Причина? И BIOS ПК, и MS-DOS(R) печально известны своей медленной работой "
+"при выполнении этих операций."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4241
+msgid ""
+"You may be tempted to continue similar practices in the UNIX(R) "
+"environment. For example, I have seen a web site which explains how to "
+"access the keyboard scan codes on a popular UNIX(R) clone."
+msgstr ""
+"Вас может возникнуть соблазн продолжить подобные практики в среде UNIX(R). "
+"Например, я видел веб-сайт, который объясняет, как получить доступ к скан-"
+"кодам клавиатуры на популярном клоне UNIX(R)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4243
+msgid ""
+"That is generally a _very bad idea_ in UNIX(R) environment! Let me explain "
+"why."
+msgstr ""
+"Это, как правило, *очень плохая идея* в среде UNIX(R)! Позвольте объяснить "
+"почему."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4245
+#, no-wrap
+msgid "UNIX(R) Is Protected"
+msgstr "UNIX(R) защищен"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4252
+msgid ""
+"For one thing, it may simply not be possible. UNIX(R) runs in protected "
+"mode. Only the kernel and device drivers are allowed to access hardware "
+"directly. Perhaps a particular UNIX(R) clone will let you read the keyboard "
+"scan codes, but chances are a real UNIX(R) operating system will not. And "
+"even if one version may let you do it, the next one may not, so your "
+"carefully crafted software may become a dinosaur overnight."
+msgstr ""
+"Прежде всего, это может быть просто невозможно. UNIX(R) работает в "
+"защищённом режиме. Только ядро и драйверы устройств имеют прямой доступ к "
+"аппаратному обеспечению. Возможно, какой-то конкретный клон UNIX(R) позволит "
+"вам читать скан-коды клавиатуры, но скорее всего настоящая операционная "
+"система UNIX(R) этого не допустит. И даже если одна версия разрешает это, "
+"следующая может запретить, так что ваше тщательно разработанное программное "
+"обеспечение может в одночасье устареть."
+
+#. type: Title ===
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4254
+#, no-wrap
+msgid "UNIX(R) Is an Abstraction"
+msgstr "UNIX(R) — это работа с абстракциями"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4257
+msgid ""
+"But there is a much more important reason not to try accessing the hardware "
+"directly (unless, of course, you are writing a device driver), even on the "
+"UNIX(R) like systems that let you do it:"
+msgstr ""
+"Но существует гораздо более важная причина не пытаться обращаться к "
+"оборудованию напрямую (если, конечно, вы не пишете драйвер устройства), даже "
+"в UNIX(R)-подобных системах, которые позволяют это делать:"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4259
+msgid "_UNIX(R) is an abstraction!_"
+msgstr "_UNIX(R) — это работа с абстракциями!_"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4265
+msgid ""
+"There is a major difference in the philosophy of design between MS-DOS(R) "
+"and UNIX(R). MS-DOS(R) was designed as a single-user system. It is run on "
+"a computer with a keyboard and a video screen attached directly to that "
+"computer. User input is almost guaranteed to come from that keyboard. Your "
+"program's output virtually always ends up on that screen."
+msgstr ""
+"Существует фундаментальное различие в философии проектирования между MS-"
+"DOS(R) и UNIX(R). MS-DOS(R) разрабатывалась как однопользовательская "
+"система. Она работает на компьютере, к которому напрямую подключены "
+"клавиатура и монитор. Ввод пользователя практически гарантированно поступает "
+"с этой клавиатуры. Вывод вашей программы почти всегда отображается на этом "
+"экране."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4268
+msgid ""
+"This is NEVER guaranteed under UNIX(R). It is quite common for a UNIX(R) "
+"user to pipe and redirect program input and output:"
+msgstr ""
+"Это НИКОГДА не гарантируется в UNIX(R). Довольно часто пользователь UNIX(R) "
+"перенаправляет ввод и вывод программы с помощью конвейеров и перенаправлений:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4272
+#, no-wrap
+msgid "% program1 | program2 | program3 > file1\n"
+msgstr "% program1 | program2 | program3 > file1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4276
+msgid ""
+"If you have written program2, your input does not come from the keyboard but "
+"from the output of program1. Similarly, your output does not go to the "
+"screen but becomes the input for program3 whose output, in turn, goes to "
+"[.filename]#file1#."
+msgstr ""
+"Если вы написали program2, ваш ввод поступает не с клавиатуры, а из вывода "
+"program1. Аналогично, ваш вывод не выводится на экран, а становится вводом "
+"для program3, чей вывод, в свою очередь, отправляется в [.filename]#file1#."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4279
+msgid ""
+"But there is more! Even if you made sure that your input comes from, and "
+"your output goes to, the terminal, there is no guarantee the terminal is a "
+"PC: It may not have its video memory where you expect it, nor may its "
+"keyboard be producing PC-style scan codes. It may be a Macintosh(R), or any "
+"other computer."
+msgstr ""
+"Но это еще не все! Даже если вы убедились, что ваш ввод поступает с "
+"терминала, а вывод отправляется на терминал, нет гарантии, что терминал "
+"является ПК: его видеопамять может находиться не там, где вы ожидаете, а "
+"клавиатура может генерировать не PC-совместимые скан-коды. Это может быть "
+"Macintosh(R) или любой другой компьютер."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4281
+msgid ""
+"Now you may be shaking your head: My software is in PC assembly language, "
+"how can it run on a Macintosh(R)? But I did not say your software would be "
+"running on a Macintosh(R), only that its terminal may be a Macintosh(R)."
+msgstr ""
+"Вот вы, возможно, покачаете головой: мое программное обеспечение написано на "
+"языке ассемблера для ПК, как оно может работать на Macintosh(R)? Но я не "
+"говорил, что ваше программное обеспечение будет работать на Macintosh(R), а "
+"лишь что его терминалом может быть Macintosh(R)."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4285
+msgid ""
+"Under UNIX(R), the terminal does not have to be directly attached to the "
+"computer that runs your software, it can even be on another continent, or, "
+"for that matter, on another planet. It is perfectly possible that a "
+"Macintosh(R) user in Australia connects to a UNIX(R) system in North America "
+"(or anywhere else) via telnet. The software then runs on one computer, "
+"while the terminal is on a different computer: If you try to read the scan "
+"codes, you will get the wrong input!"
+msgstr ""
+"В UNIX(R) терминал не обязательно должен быть напрямую подключён к "
+"компьютеру, на котором работает ваше программное обеспечение — он может "
+"находиться даже на другом континенте или, например, на другой планете. "
+"Вполне возможно, что пользователь Macintosh(R) в Австралии подключается к "
+"системе UNIX(R) в Северной Америке (или где-либо ещё) через telnet. "
+"Программное обеспечение работает на одном компьютере, а терминал находится "
+"на другом: если попытаться считать скан-коды, будут получены неверные данные!"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4288
+msgid ""
+"Same holds true about any other hardware: A file you are reading may be on a "
+"disk you have no direct access to. A camera you are reading images from may "
+"be on a space shuttle, connected to you via satellites."
+msgstr ""
+"То же самое относится и к любому другому оборудованию: файл, который вы "
+"читаете, может находиться на диске, к которому у вас нет прямого доступа. "
+"Камера, с которой вы считываете изображения, может находиться на космическом "
+"корабле, соединённом с вами через спутники."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4291
+msgid ""
+"That is why under UNIX(R) you must never make any assumptions about where "
+"your data is coming from and going to. Always let the system handle the "
+"physical access to the hardware."
+msgstr ""
+"Вот почему в UNIX(R) никогда нельзя делать никаких предположений о том, "
+"откуда поступают ваши данные и куда они направляются. Всегда позволяйте "
+"системе управлять физическим доступом к оборудованию."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4299
+msgid ""
+"These are caveats, not absolute rules. Exceptions are possible. For "
+"example, if a text editor has determined it is running on a local machine, "
+"it may want to read the scan codes directly for improved control. I am not "
+"mentioning these caveats to tell you what to do or what not to do, just to "
+"make you aware of certain pitfalls that await you if you have just arrived "
+"to UNIX(R) form MS-DOS(R). Of course, creative people often break rules, "
+"and it is OK as long as they know they are breaking them and why."
+msgstr ""
+"Это предостережения, а не абсолютные правила. Возможны исключения. Например, "
+"если текстовый редактор определил, что работает на локальной машине, он "
+"может захотеть читать скан-коды напрямую для улучшенного управления. Я "
+"упоминаю эти предостережения не для того, чтобы сказать вам, что делать или "
+"чего не делать, а просто чтобы вы осознавали определённые подводные камни, "
+"которые ждут вас, если вы только что перешли с MS-DOS(R) на UNIX(R). "
+"Конечно, творческие люди часто нарушают правила, и это нормально, пока они "
+"осознают, что нарушают их, и понимают почему."
+
+#. type: Title ==
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4302
+#, no-wrap
+msgid "Acknowledgements"
+msgstr "Благодарности"
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4305
+msgid ""
+"This tutorial would never have been possible without the help of many "
+"experienced FreeBSD programmers from the {freebsd-hackers}, many of whom "
+"have patiently answered my questions, and pointed me in the right direction "
+"in my attempts to explore the inner workings of UNIX(R) system programming "
+"in general and FreeBSD in particular."
+msgstr ""
+"Это руководство никогда бы не было создано без помощи многих опытных "
+"программистов FreeBSD из {freebsd-hackers}, которые терпеливо отвечали на "
+"мои вопросы и направляли меня в моих попытках изучить внутренние механизмы "
+"программирования в системе UNIX(R) в целом и в FreeBSD в частности."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4308
+msgid ""
+"Thomas M. Sommers opened the door for me . His https://web.archive.org/web/"
+"20090914064615/http://www.codebreakers-journal.com/content/view/262/27[How "
+"do I write \"Hello, world\" in FreeBSD assembler?] web page was my first "
+"encounter with an example of assembly language programming under FreeBSD."
+msgstr ""
+"Томас М. Соммерс открыл дверь для меня. Его https://web.archive.org/web/"
+"20090914064615/http://www.codebreakers-journal.com/content/view/262/27[Как "
+"написать \"Hello, world\" на ассемблере в FreeBSD?] веб-страница стала моей "
+"первой встречей с примером программирования на ассемблере под FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/developers-handbook/x86/_index.adoc:4310
+msgid ""
+"Jake Burkholder has kept the door open by willingly answering all of my "
+"questions and supplying me with example assembly language source code."
+msgstr ""
+"Джейк Буркхолдер держал дверь открытой, охотно отвечая на все мои вопросы и "
+"предоставляя примеры исходного кода на языке ассемблера."
diff --git a/documentation/content/ru/books/faq/_index.adoc b/documentation/content/ru/books/faq/_index.adoc
index 4c7f78082d..d197618947 100644
--- a/documentation/content/ru/books/faq/_index.adoc
+++ b/documentation/content/ru/books/faq/_index.adoc
@@ -1,18 +1,17 @@
---
-title: Часто задаваемые вопросы по FreeBSD 12.X и 13.X
-authors:
- - author: Проект документирования FreeBSD
-copyright: 1995-2023 The FreeBSD Russian Documentation Project
-description: Часто задаваемые вопросы и ответы по FreeBSD 11.X, 12.X и 13.X, касающиеся всех аспектов FreeBSD
-trademarks: ["freebsd", "ibm", "ieee", "adobe", "intel", "linux", "microsoft", "opengroup", "sun", "netbsd", "general"]
+authors:
+ -
+ author: 'The FreeBSD Documentation Project'
bookOrder: 5
-tags: ["FAQ", "FreeBSD FAQ"]
+copyright: '1995-2023 The FreeBSD Documentation Project'
+description: 'Часто задаваемые вопросы по FreeBSD'
layout: single
+tags: ["FAQ", "FreeBSD FAQ"]
+title: 'Часто задаваемые вопросы по FreeBSD'
+trademarks: ["freebsd", "ieee", "linux", "microsoft", "openbsd", "netbsd", "general"]
---
-// Original EN revision (28.08.2023): 7d1e32e5138658ffb86ea5e0fb14e4740830582c
-
-= Часто задаваемые вопросы по FreeBSD {rel2-relx} и {rel-relx}
+= Часто задаваемые вопросы по FreeBSD
:doctype: book
:toc: macro
:toclevels: 1
@@ -23,18 +22,6 @@ layout: single
:source-highlighter: rouge
:experimental:
:images-path: books/faq/
-:rel-numbranch: 3
-:rel-head: 14-CURRENT
-:rel-head-relx: 14.X
-:rel-head-releng: main
-:rel-relx: 13.X
-:rel-stable: 13-STABLE
-:rel-releng: stable/13
-:rel-relengdate: January 2021
-:rel2-relx: 12.X
-:rel2-stable: 12-STABLE
-:rel2-releng: stable/12
-:rel2-relengdate: December 2018
ifdef::env-beastie[]
ifdef::backend-html5[]
@@ -58,2947 +45,403 @@ endif::[]
[.abstract-title]
Аннотация
-Этот документ является так называемым FAQ (Frequently Asked Questions), то есть списком Часто Задаваемых Вопросов по FreeBSD версий {rel-relx} и {rel2-relx}.
-Мы прилагаем все усилия, чтобы сделать этот FAQ максимально информативным; если у вас есть идеи по его усовершенствованию, присылайте их на адрес {freebsd-doc}.
-
-Самая последняя редакция этого документа всегда доступна на extref:{faq}[Web-сайте FreeBSD].
-Его также можно сгрузить в виде одного
-большого файла в формате link:.[HTML] по HTTP или в различных других форматах с
-https://download.freebsd.org/doc/[FTP-сервера FreeBSD].
+Это Часто Задаваемые Вопросы (FAQ) по FreeBSD. Были приложены все усилия, чтобы сделать это руководство максимально информативным.
'''
toc::[]
-== Вступление
-
-=== FreeBSD - что это такое?
-
-FreeBSD - это современная операционная система для настольных компьютеров, ноутбуков, серверов и встраиваемых систем с поддержкой большого количества https://www.FreeBSD.org/ru/platforms/[платформ].
-
-В основе FreeBSD лежит операционная система "4.4BSD-Lite" Калифорнийского Университета (Беркли) с некоторыми усовершенствованиями из "4.4BSD-Lite2".
-Также она косвенно базируется на 386BSD (BSD Net/2, перенесённой на платформу i386(TM) Уильямом Джолитцем (William Jolitz)), хотя от того первоначального кода осталось очень мало.
-
-FreeBSD используется компаниями, Интернет-провайдерами, научными работниками, профессионалами в вычислительной технике, студентами и рядовыми пользователями по всему миру для работы, образования и отдыха.
-
-Для более детального знакомства с FreeBSD обратитесь к extref:{handbook}/[Руководству по FreeBSD].
-
-[[FreeBSD-goals]]
-=== Какова цель FreeBSD?
-
-Цель проекта FreeBSD - предоставить быструю и стабильную операционную систему общего назначения, которую можно использовать в любых целях без каких-либо ограничений.
-
-[[bsd-license-restrictions]]
-=== Есть ли в лицензии FreeBSD какие-то ограничения?
-
-Да.
-Эти ограничения не касаются аспектов использования кода, но главным образом описывают отношение к этому коду со стороны Проекта FreeBSD. Текст лицензионного соглашения доступен https://www.FreeBSD.org/ru/copyright/freebsd-license/[здесь], и вкратце он может быть изложен следующим образом:
-
-* Не говорите, что это написано вами.
-* Не судитесь с нами, если что-то не работает.
-* Не удаляйте и не изменяйте лицензию.
-
-Многие из нас вкладывают в проект значительные усилия и определённо были бы не против получения небольшой финансовой поддержки сейчас и в будущем, но мы на этом не настаиваем.
-Мы надеемся, что наша основная и самая значительная "миссия" - предоставить код всем желающим, для любых целей, так чтобы он нашел самое широкое применение и принёс наибольшую пользу. Это, на наш взгляд, одна из самых фундаментальных целей Free Software, которую мы с энтузиазмом поддерживаем.
+[[introduction]]
+== Введение
-Часть исходного кода нашей системы, подпадающая под действие
-https://www.FreeBSD.org/copyright/COPYING[GNU General Public License (GPL)] или
-https://www.FreeBSD.org/copyright/COPYING.LIB[GNU Library General Public
-License (LGPL)], имеет несколько больше ограничений, хотя и представляет собой
-навязывание доступа к исходным текстам, а не наоборот, как обычно. Из-за
-дополнительных сложностей, которые могут возникнуть в случае коммерческого
-использования программного обеспечения GPL, мы стараемся, где только это
-возможно, заменить подобное программное обеспечение аналогичным, но подпадающим
-под менее строгую https://www.FreeBSD.org/copyright/freebsd-license/[лицензию
-FreeBSD].
-
-[[replace-current-OS]]
-=== Может ли FreeBSD заменить операционную систему, используемую мною сейчас?
+Добро пожаловать в мир FreeBSD! В этом разделе представлен обзор системы FreeBSD: что это такое, её происхождение, цели, варианты использования и сообщество, стоящее за ней.
-Для большинства людей это возможно.
-Но этот вопрос не так уж и однозначен.
+Узнайте причины выбора этого названия, научитесь участвовать в разработке проекта и изучите богатую экосистему FreeBSD в контексте открытых операционных систем.
-Большинство пользователей на самом деле не используют операционную систему. Они работают с приложениями. Именно прикладные программы и используют операционную систему. FreeBSD разработана для того, чтобы дать надежное и полнофункциональное окружение для приложений. Она поддерживает широкий спектр Web-браузеров, офисных пакетов, программ для работы с электронной почтой, графических пакетов, программных сред, сетевых серверов и многое другое. Большинство этих приложений могут
-быть получено из https://www.FreeBSD.org/ports/[Коллекции Портов].
+[[what-is-FreeBSD]]
+=== Что такое FreeBSD?
-Если приложение доступно только для одной операционной системы, то нельзя всего лишь заменить эту операционную систему. Однако есть вероятность, что похожая программа существует для FreeBSD. В качестве сервера для офиса, или сервера Интернет, или надежной рабочей станции FreeBSD практически всегда справится со всем, что вам нужно. Многие пользователи по всему миру, включая как новичков, так и опытных администраторов UNIX(R), используют FreeBSD в качестве своей единственной настольной операционной системы.
+FreeBSD — это универсальная и открытая операционная система, подобная UNIX(R), известная своей исключительной стабильностью, безопасностью и производительностью. Разрабатываемая преданным сообществом добровольцев, она основана на операционной системе Berkeley Software Distribution (BSD) UNIX.
-Пользователям, переходящим на FreeBSD с другого варианта UNIX(R)-подобной
-системы, FreeBSD покажется очень знакомой. Пользователей Windows(R) и Mac
-OS(R), напротив, может привлечь использование одного из трёх дистрибутивов
-https://www.ghostbsd.org/[GhostBSD], https://www.midnightbsd.org/[MidnightBSD]
-или https://www.nomadbsd.org/[NomadBSD], предназначенных для настольных систем
-и построенных на базе FreeBSD. Пользователям, которые не использовали до этого
-UNIX(R), нужно понимать, что понадобится потратить дополнительное время на
-изучение подхода UNIX(R) к организации работы. Этот FAQ и
-extref:{handbook}[Руководство по FreeBSD] являются прекрасными отправными
-точками.</para>
+FreeBSD предоставляет мощную и настраиваемую среду, подходящую для широкого спектра применений — от серверов и встраиваемых систем до настольных компьютеров и сетевого оборудования. Приверженность принципам открытого исходного кода обеспечивает прозрачный и совместный процесс разработки, что делает FreeBSD надежным выбором для тех, кто ищет стабильную и высокоадаптируемую операционную систему.
[[why-called-FreeBSD]]
-=== Почему система называется именно FreeBSD?
-
-* Она может использоваться безо всяческих выплат, даже для извлечения выгоды.
-* Все исходные тексты операционной системы свободно доступны, на её использование в других разработках (как коммерческих, так и некоммерческих) и дальнейшее распространение наложены минимальные ограничения.
-* Любой, у кого есть усовершенствования или исправления, может предоставить свой код и он будет (правда, с парой оговорок) добавлен в исходные тексты системы.
-
-Следует отметить, что слово "free" используется здесь в двух смыслах: один означает "бесплатно", а другой "делать всё, что хотите". За исключением пары вещей, которые вы _не можете_ делать с FreeBSD, например, претендовать на то, что являетесь её разработчиком, на самом деле можно делать с ней всё, что вам заблагорассудится.
-
-[[differences-to-other-bsds]]
-=== В чём заключается разница между FreeBSD и NetBSD, OpenBSD и другими операционными системами с открытым кодом семейства BSD?
+=== Почему система называется FreeBSD?
-Джеймс Ховард (James Howard) создал хорошее описание истории и отличий между разными проектами под названием https://jameshoward.us/archive/bsd-family-tree/[Семейное древо BSD], в котором даётся подробный ответ на этот вопрос.
-Часть информации там устарела, однако историческая часть остаётся точной.
+Название "FreeBSD" происходит от его корней в операционной системе UNIX Berkeley Software Distribution (BSD), известной своим вкладом в мир открытого программного обеспечения. Слово "Free" в FreeBSD подчеркивает приверженность принципам свободного и открытого программного обеспечения, которые предоставляют пользователям свободу изучать, изменять и распространять исходный код.
-Многие из проектов семейства BSD обмениваются изменениями и готовым кодом даже
-сегодня. Все они происходят от общего предка.
+Стоит отметить, что слово «free» здесь используется в двух значениях: одно означает «бесплатно», а другое — «делай что хочешь».
-Цели проекта FreeBSD описаны выше в <<FreeBSD-goals>>. Цели других наиболее
-известных проектов семейства BSD можно кратко описать так:
-
-* OpenBSD ориентируется на то, что превыше всего является безопасность
-операционной системы.
-Команда OpenBSD написала man:ssh[1] и man:pf[4], которые были перенесены во
-FreeBSD.
-* NetBSD ориентируется на простое портирование на другие аппаратные платформы.
-* DragonFly BSD отделилась от FreeBSD 4.8, и с тех пор в ней были разработаны многие интересные собственные функциональные возможности, включая файловую систему HAMMER и поддержку "vkernels" - запуска ядра в пользовательском режиме.
-
-[[latest-version]]
-=== Какова последняя версия FreeBSD?
-
-На любом этапе разработки FreeBSD может существовать несколько параллельных веток. Релизы {rel-relx} выполняются из ветки {rel-stable}, а релизы {rel2-relx} выполняются из {rel2-stable}.
-
-Вплоть до версии 12.0 ветка {rel2-relx} была известна как _-STABLE_.
-Однако к моменту выхода {rel-head-relx} ветка {rel2-relx} получит статус
-"extended support" (расширенная поддержка), и исправления будут вноситься
-только для серьёзных проблем, к примеру, связанных с безопасностью.
-
-Релизы делаются <<release-freq,раз в несколько месяцев>>. Хотя многие стараются отслеживать актуальное состояние исходных текстов FreeBSD (обратите внимание на вопросы о <<current,FreeBSD-CURRENT>> и <<stable,FreeBSD-STABLE>>), делать это не обязательно, так как исходные тексты постоянно меняются.
-
-Более полную информацию о релизах FreeBSD можно получить на странице
-https://www.FreeBSD.org/releng/#release-build[Информации о подготовке релизов]
-и на странице Справочника man:release[7].
-
-[[current]]
-=== Что такое FreeBSD-CURRENT?
-
-extref:{handbook}cutting-edge/[FreeBSD-CURRENT, current] - это версия
-операционной системы, находящаяся в стадии разработки, которая должна потом
-стать новой веткой FreeBSD-STABLE. Таким образом, она представляет реальный
-интерес только для разработчиков системы и её фанатов. Обратитесь к
-extref:{handbook}cutting-edge/[соответствующему разделу, current]
-extref:{handbook}[Руководства] для прояснения деталей работы с _-CURRENT_.
-
-Пользователям, не знакомым с FreeBSD, не следует использовать FreeBSD-CURRENT.
-Эта ветка зачастую меняется очень быстро и иногда из-за ошибок может быть неработоспособной.
-Подразумевается, что те, кто используют FreeBSD-CURRENT, должны быть в состоянии изучить проблему, найти причину и сообщить о этом.
-
-[[stable]]
-=== В чём смысл FreeBSD-STABLE?
-
-_FreeBSD-STABLE_ является веткой разработки, из которой выполняются основные релизы.
-В эту ветку изменения вносятся медленнее, и при этом предполагается, что до этого они были протестированы во FreeBSD-CURRENT.
-Несмотря на это, исходный код FreeBSD-STABLE в любой момент времени может быть пригоден, а может быть и непригоден к широкому использованию, так как может содержать скрытые ошибки и вырожденные случаи, которые ещё не были выявлены во FreeBSD-CURRENT.
-Пользователям, не имеющим возможностей для тестирования, следует работать с самым свежим релизом FreeBSD.
-С другой стороны, _FreeBSD-CURRENT_ продолжает являться единой веткой, не разрываемой с момента выхода версии 2.0.
-
-Для получения более подробной информации о ветках обратитесь к разделу статьи "extref:{releng}[Подготовка релизов FreeBSD: Создание ветки релиза, rel-branch]", а состояние веток и расписание предстоящих релизов можно получить на странице https://www.FreeBSD.org/releng[Информация о подготовке релизов].
-Версия {u-rel123-announce}[{rel123-current}] является самым последним релизом в
-ветке {rel2-stable}; она была выпущена {rel123-current-date}). Версия
-{u-rel131-announce}[{rel131-current}] является самым последним релизом в
-ветке {rel-stable}; она была выпущена {rel131-current-date}).
-
-[[release-freq]]
-=== В какой момент выпускаются новые версии FreeBSD?
+[[FreeBSD-goals]]
+=== Какова цель проекта FreeBSD?
-{re} выпускает новую старшую версию FreeBSD в среднем каждые 18 месяцев и младшие версии каждые 8 месяцев. Даты релизов обычно объявляются заранее, так что те, кто работает над системой, знают, когда их проекты должны быть закончены и протестированы. Период тестирования предшествует выходу каждого релиза, для того, чтобы удостовериться в том, что добавление новых возможностей не повлияло на стабильность работы релиза. Многие пользователи расценивают такую осторожность как одну из приятнейших черт FreeBSD, хотя необходимость дожидаться _-STABLE_ для получения всех этих новых возможностей может несколько разочаровывать.
+Проект FreeBSD преследует ясную и непоколебимую цель: предоставить высококачественную UNIX-подобную операционную систему с открытым исходным кодом, которая отличается высокой производительностью, безопасностью и стабильностью.
-Дополнительная информация о процессе подготовки релиза (в том числе планы выпуска последующих релизов) может быть найдена на страницах Web-сайта FreeBSD, посвящённых https://www.FreeBSD.org/releng/[выпуску релизов].
+Он стремится предоставить универсальную платформу, подходящую для широкого спектра вычислительных задач — от серверов и рабочих станций до встраиваемых систем и не только. FreeBSD разрабатывается с твердой приверженностью принципам открытого исходного кода, создавая среду для сотрудничества, в которой вклад глобального сообщества разработчиков помогает формировать и совершенствовать операционную систему. Эта приверженность качеству, свободе и надежности отличает FreeBSD и способствует её постоянному успеху как проекта с открытым исходным кодом.
-Для тех, кому нужно или хочется, еженедельно выпускаются бинарные снапшоты, как описано выше.
+[[FreeBSD-usecases]]
+=== Для каких задач подходит FreeBSD?
-[[snapshot-freq]]
-=== Когда выпускаются снэпшоты FreeBSD?
-
-link:https://www.FreeBSD.org/snapshots/[Снэпшот]-релизы FreeBSD
-выпускаются исходя из актуального состояния веток _-CURRENT_ и _-STABLE_.
-Цели выпуска каждого такого снэпшот-релиза таковы:
-
-* Протестировать самую последнюю версию программы установки системы.
-* Дать людям, которые хотят работать с ветками _-CURRENT_ или _-STABLE_,
-но не имеют достаточно времени или пропускной способности сети
-для отслеживания ежедневных изменений, простой способ их
-начальной установки.
-* Зафиксировать состояние определённого кода на какой-то
-момент времени на случай, если позже мы что-нибудь очень сильно
-сломаем.
-(Хотя Git, как правило, не позволяет случиться ничему такому ужасному).
-* Обеспечить все новые функции и исправления, которым
-требуется тестирование, как можно большим количеством
-потенциальных тестировщиков.
-
-Не утверждается, что всякий снэпшот _-CURRENT_ с любой точки зрения имеет
-качество "готового продукта". Если нужна стабильно
-работающая и полностью протестированная система, то
-придерживайтесь политики использования полноценных релизов.
-
-Снэпшот-релизы доступны непосредственно
-link:https://www.FreeBSD.org/snapshots/[отсюда].
-
-Официальные снэпшоты регулярно выпускаются для всех активно разрабатываемых
-веток.
+FreeBSD — это универсальная операционная система, которая превосходно подходит для различных сценариев использования. Она особенно хорошо зарекомендовала себя в серверных средах, где её стабильность и производительность делают её популярным выбором для веб-хостинга, баз данных и сетевых приложений. Надёжные механизмы безопасности FreeBSD также делают её отличным вариантом для развёртывания межсетевых экранов и защищённых устройств. Помимо серверов, FreeBSD может быть адаптирована для работы в специализированных средах, включая встраиваемые системы и игровые консоли. Её гибкость, надёжность и открытый исходный код делают FreeBSD привлекательным выбором для широкого спектра вычислительных задач.
[[responsible]]
-=== Кто отвечает за разработку FreeBSD?
-
-Ключевые решения, касающиеся проекта FreeBSD, такие, как общее направление развития проекта или кто может добавлять код к дереву исходных текстов, принимаются link:https://www.FreeBSD.org/administration/#t-core[управляющей командой] разработчиков (Core Team), состоящей из 9 человек.
-Также существует многочисленная группа, состоящая из более чем 350 так называемых extref:{contributors}[коммиттеров, staff-committers] (committers), которые могут вносить изменения прямо в дерево исходных текстов FreeBSD.
-
-Однако большинство нетривиальных изменений широко обсуждается в <<mailing,списках рассылки>>, и не существует никаких ограничений на участие в подобных дискуссиях.
-
-[[where-get]]
-=== Где можно найти FreeBSD?
-
-Все поддерживаемые релизы FreeBSD доступны на странице
-https://www.freebsd.org/where/[поиска релизов FreeBSD]:
-
-* Для получения самого последнего релиза {rel-stable}, {rel132-current}-RELEASE, перейдите по ссылке для выбора link:https://www.freebsd.org/where/#download-rel132[соответствующей архитектуры и режима установки для {rel132-current}-RELEASE].
-* Для получения самого последнего релиза {rel2-stable}, {rel124-current}-RELEASE, перейдите по ссылке для выбора link:https://www.freebsd.org/where/#download-rel124[соответствующей архитектуры и режима установки для {rel124-current}-RELEASE].
-* link:https://www.FreeBSD.org/snapshots/[Снэпшот-релизы] для веток <<current,-CURRENT>> и <<stable,-STABLE>> выпускаются ежемесячно, но они нужны исключительно для разработчиков и тех, кто тестирует самые последние нововведения.
-
-Информация о возможностях получения FreeBSD на CD, DVD и других носителях
-доступна в extref:{handbook}mirrors/[Руководстве, mirrors].
-
-=== Как можно получить доступ к базе сообщений о проблемах (Problem Report)?
-
-База данных всех сообщений пользователей о проблемах может быть запрошена с помощью нашего https://bugs.FreeBSD.org/search/[Web-интерфейса].
-
-Можно использовать link:https://www.FreeBSD.org/support/bugreports/[Web-интерфейс] для отсылки сообщений об ошибках через браузер.
-
-Перед тем, как посылать сообщение об ошибке, прочтите статью extref:{problem-reports}[Составление сообщений о проблеме во FreeBSD] о том, как писать хорошие сообщения об ошибках.
-
-== Документация и поддержка
-
-[[books]]
-=== Есть ли хорошие книги по FreeBSD?
-
-В рамках проекта создаётся обширная документация, которая доступна в онлайне по
-следующей ссылке: https://www.FreeBSD.org/docs/[https://www.FreeBSD.org/docs/].
-
-[[doc-formats]]
-=== Можно ли получить документацию в другом формате, например, в виде PDF?
-
-Да.
-link:https://download.freebsd.org/doc/[Документация доступна к сгрузке также и
-в других форматах] на сайте FreeBSD.
-
-Каталоги с документацией подразделяется на категории в зависимости от:
-
-* Имени документа, например, `faq` или `handbook`.
-* Языка документа на базе наименования региональных настроек, размещаемых в
-каталоге [.filename]#/usr/share/locale# системы FreeBSD, без учёта кодировки,
-так как во всей документации сейчас используется UTF-8.
-На данный момент доступны следующие языки:
-
-+
-[.informaltable]
-[cols="1,1", frame="none", options="header"]
-|===
-| Кодировка
-| Язык
-
-|`en`
-|Английский
-
-|`bn-bd`
-|Бенгальский или Бангла (Бангладеш)
-
-|`da`
-|Датский
-
-|`de`
-|Немецкий
+=== Кто отвечает за FreeBSD?
-|`el`
-|Греческий
+FreeBSD - это проект с открытым исходным кодом, развиваемый сообществом и имеющий децентрализованную структуру. Его разработка и поддержка осуществляются глобальным сообществом преданных добровольцев, разработчиков и организаций, которые совместно работают над улучшением и расширением возможностей операционной системы.
-|`es`
-|Испанский
+Ключевые решения, касающиеся проекта FreeBSD, такие как общее направление развития проекта или право на добавление кода в дерево исходных текстов, принимаются избираемой командой разработчиков (Core Team) из девяти человек.
-|`fr`
-|Французский
+Этот совместный и ориентированный на сообщество подход был основополагающим для успеха и долголетия FreeBSD в качестве надежной и устойчивой UNIX-подобной операционной системы.
-|`hu`
-|Венгерский
-
-|`it`
-|Итальянский
-
-|`ja`
-|Японский
-
-|`ko`
-|Корейский
-
-|`mn`
-|Монгольский
-
-|`nl`
-|Голландский
-
-|`pl`
-|Польский
+[[how-to-contribute]]
+=== Как я могу внести свой вклад в FreeBSD? Чем я могу помочь?
-|`pt-br`
-|Португальский (Бразилия)
+Мы принимаем все виды вкладов: документацию, код и даже произведения искусства. Конкретные рекомендации о том, как это сделать, смотрите в статье extref:{contributing}[Участие в разработке FreeBSD].
-|`ru`
-|Русский
+И спасибо за идеи!
-|`tr`
-|Турецкий
+[[bsd-license-restrictions]]
+=== Есть ли ограничения в лицензии FreeBSD?
-|`zh-cn`
-|Упрощённый китайский (Китай)
+FreeBSD распространяется под лицензией https://www.FreeBSD.org/copyright/freebsd-license/[BSD License], известной своим разрешительным характером.
-|`zh-tw`
-|Традиционный китайский (Тайвань)
-|===
-+
-[NOTE]
-====
-Некоторые документы могут иметься не на всех языках.
-====
+Данная лицензия накладывает очень мало ограничений на использование FreeBSD:
-* Формат документа.
-Мы распространяем документацию в нескольких различных форматах.
-У каждого из форматов имеются свои плюсы и свои минусы.
-Некоторые форматы лучше подходят для чтения в on-line, тогда как другие предназначены для получения эстетично выглядящей бумажной копии.
-Наличие документации во всех этих форматах обеспечивает возможность прочтения нашими пользователями любой её части как с экрана монитора, так и на бумаге после вывода на печать.
-На данный момент доступны следующие форматы;
-+
-[.informaltable]
-[cols="1,1", frame="none", options="header"]
-|===
-| Формат
-| Значение
-
-|`html`
-|В зависимости от документа: Один большой HTML-файл, содержащий документ полностью, или набор небольших связанных HTML-файлов, в обоих случаях содержащих изображения, таблицы стилей и код JavaScript
-
-|`pdf`
-|Adobe's Portable Document Format
-|===
-* Способ сжатия и создания архива.
-.. В случае формата `html`, файлы пакетируются с помощью man:tar[1].
-Получающийся файл [.filename]#.tar# затем сжимается утилитой man:gzip[1].
-.. При использовании формата PDF создаётся один файл. К примеру,
-[.filename]#explaining-bsd_en.pdf#, [.filename]#faq_en.pdf# и так далее.
-
-Выбрав формат, сгрузите файлы, распакуйте их при необходимости, а затем
-скопируйте документацию в соответствующие места.
-
-Например, HTML-версию FAQ можно найти в
-[.filename]#doc/en/books/faq/faq_en.tar.gz#. Для сгрузки и распаковки этого
-файла выполните:
-
-[source,shell]
-....
-% fetch https://download.freebsd.org/doc/en/books/faq/faq_en.tar.gz
-% tar xvf faq_en.tar.gz
-....
+* Не утверждайте, что это написали вы.
+* Не подавайте на нас в суд, если что-то сломается.
+* Не удаляйте и не изменяйте лицензию.
-Если файл сжат, tar автоматически определит подходящий формат и корректно его распакует, в результате чего появится набор файлов.
-Главным является [.filename]#index.html#, и в нём находится всё содержимое документа, начиная с оглавления, ссылающегося на остальные части документа.
+Лицензия означает, что вы можете свободно изменять, распространять и даже продавать FreeBSD, *не будучи обязанным публиковать свои изменения как открытый исходный код*. Однако есть несколько минимальных условий, таких как сохранение оригинального уведомления об авторских правах и отказ от гарантий при распространении FreeBSD. В целом, лицензия BSD предоставляет высокую степень свободы и гибкости, что делает FreeBSD привлекательным выбором для широкого спектра приложений и проектов.
-[[mailing]]
-=== Где найти информацию по спискам рассылки FreeBSD? Какие существуют телеконференции по FreeBSD?
+Код в нашем дереве исходников, подпадающий под действие https://www.FreeBSD.org/copyright/COPYING[GNU General Public License (GPL)] или https://www.FreeBSD.org/copyright/COPYING.LIB[GNU Library General Public License (LGPL)], сопровождается несколько большими ограничениями, по крайней мере, в части обеспечения доступа, в отличие от обычной противоположной ситуации.
-Исчерпывающая информация содержится в extref:{handbook}eresources/[разделе
-Руководства, eresources-mail], который посвящён спискам рассылки, и в
-extref:{handbook}eresources/[разделе Руководства, eresources-news], касающемся
-новостных конференций.
+[[replace-current-OS]]
+=== Может ли FreeBSD заменить мою текущую операционную систему?
-[[irc]]
-=== Существуют ли каналы IRC (Internet Relay Chat) по FreeBSD?
+Для многих пользователей и администраторов — да. Но этот вопрос не настолько однозначен.
-Да, в большинстве крупнейших сетей IRC имеется канал для обсуждения FreeBSD, а
-на wiki-странице FreeBSD размещён актуальный
-https://wiki.freebsd.org/IRC/Channels[список IRC-каналов].
+FreeBSD — это мощная и универсальная операционная система, которая может заменить или сосуществовать с множеством других операционных систем в зависимости от конкретных потребностей пользователей и администраторов. Однако возможность замены вашей текущей операционной системы на FreeBSD зависит от таких факторов, как ваше оборудование, требования к программному обеспечению и уровень знакомства с FreeBSD.
-Все эти каналы разные и не связаны друг к другом. Поскольку их манеры общения
-отличаются, попробуйте каждый, пока не найдёте соответствующий вашему стилю.
+Хотя она предлагает надежную и многофункциональную альтернативу, важно оценить ваши конкретные задачи и требования к совместимости перед переходом.
-[[forums]]
-=== Есть ли какие-нибудь web-форумы для обсуждения FreeBSD?
+Если приложение доступно только в одной операционной системе, эту операционную систему нельзя просто заменить.
-Официальные форумы FreeBSD расположены по адресу https://forums.FreeBSD.org/[https://forums.FreeBSD.org/].
+Пользователи, переходящие на FreeBSD из другой UNIX-подобной среды, найдут FreeBSD похожей. Пользователи, не знакомые с UNIX, например пользователи Windows(R), должны быть готовы потратить дополнительное время на изучение принципов работы UNIX.
-[[training]]
-=== Где можно пройти платные курсы по FreeBSD и получить поддержку?
+[[run-popular-software]]
+=== Может ли FreeBSD запускать популярное открытое программное обеспечение?
-http://www.ixsystems.com[iXsystems, Inc.], дочерней компанией которой является http://www.freebsdmall.com/[FreeBSD Mall], оказывает http://www.ixsystems.com/support[услуги поддержки] программного обеспечения FreeBSD на коммерческой основе, в дополнение к разработкам на платформе FreeBSD и решениям, требующим тонкой настройки.
+Да, FreeBSD хорошо подходит для запуска популярного открытого программного обеспечения. Его совместимость с широким спектром приложений и библиотек делает его предпочтительным выбором для тех, кто хочет развертывать и использовать пакеты открытого ПО. FreeBSD предоставляет надежную и стабильную среду, поддерживающую различные языки программирования, базы данных, веб-серверы и другое ПО, часто используемое в сообществе открытого исходного кода. Система портов и пакетов FreeBSD упрощает установку и управление таким ПО, гарантируя, что пользователи могут легко получить доступ и запускать свои любимые открытые инструменты и приложения на FreeBSD с минимальными трудностями.
-BSD Certification Group, Inc. предоставляет сертификацию системного администрирования DragonFly BSD, FreeBSD, NetBSD и OpenBSD. Для получения дополнительной информации посетите http://www.BSDCertification.org[их сайт].
+[[install-software]]
+=== Как установить программное обеспечение в FreeBSD?
-Чтобы попасть в этот список, другие организации, осуществляющие обучение и поддержку, должны обратиться к нам в Проект.
+FreeBSD предоставляет несколько методов установки программного обеспечения. Один из наиболее распространённых методов — использование встроенного менеджера пакетов man:pkg[8], который упрощает процесс, загружая и устанавливая предварительно собранные бинарные пакеты. Другой подход — компиляция и установка программ из исходного кода с использованием коллекции man:ports[7], что обеспечивает гибкий и настраиваемый способ установки программного обеспечения.
-== Установка
+Документация FreeBSD предоставляет подробные руководства по обоим методам, гарантируя, что пользователи смогут легко расширить возможности своей системы с помощью необходимого программного обеспечения.
-[[which-architecture]]
-=== Какую архитектуру нужно загрузить? У меня есть 64-разрядный процессор Intel(R), но я вижу только amd64.
+[[differences-to-other-bsds]]
+=== Каковы различия между FreeBSD, NetBSD, OpenBSD и другими открытыми BSD-операционными системами?
-amd64 - это термин, применяемый во FreeBSD для обозначения 64-разрядной архитектуры x86 (также известна как "x86-64" или "x64"). На большинстве современных компьютеров следует использовать amd64. Для более старых подойдёт i386. При установке системы на отличную от x86 архитектуру, выберите платформу, наиболее подходящую для оборудования.
+FreeBSD, NetBSD, OpenBSD и DragonFly BSD - все они являются частью семейства BSD с открытым исходным кодом, разделяя общие UNIX-подобные основы, но каждый имеет свою собственную направленность и приоритеты. Эти различия отражают уникальные цели каждого проекта, и хотя они имеют сходства, их конкретные сильные стороны и акценты ориентированы на различные сценарии использования и предпочтения в экосистеме BSD.
-[[floppy-download]]
-=== Какой файл нужно скачать для установки FreeBSD?
+[[freebsd-linux-distribution]]
+=== Является ли FreeBSD дистрибутивом Linux(R)?
-На странице https://www.freebsd.org/ru/where/[Получение FreeBSD] выберите
-`[iso]` с соответствующей оборудованию архитектурой.
+Нет, FreeBSD *не* является дистрибутивом Linux.
-Можно использовать любой из:
+Хотя FreeBSD и Linux являются UNIX-подобными операционными системами и имеют много общего, у них разные ядра. Linux использует ядро Linux, тогда как FreeBSD использует ядро FreeBSD, основанное на операционной системе Berkeley Software Distribution (BSD) UNIX.
-[.informaltable]
-[cols="1,1", frame="none", options="header"]
-|===
-| файл
-| описание
+FreeBSD и Linux имеют свои уникальные сообщества разработчиков, циклы выпуска версий и архитектуры систем, что делает их отдельными и независимыми операционными системами.
-|[.filename]#disc1.iso#
-|Содержит достаточно для установки FreeBSD и минимальный набор пакетов.
+FreeBSD предоставляет свои собственные преимущества, включая отличную модель лицензирования, дизайн системы и пользовательские утилиты по сравнению с дистрибутивами Linux.
-|[.filename]#dvd1.iso#
-|Наподобие [.filename]#disc1.iso#, но с дополнительными пакетами.
+[[run-linux-programs-freebsd]]
+=== Возможно ли запускать Linux-программы в FreeBSD?
-|[.filename]#memstick.img#
-|Образ с автозагрузкой для записи на USB флешку.
+Да, FreeBSD предоставляет слой совместимости, известный как _linuxulator_ (man:linux[4]), который позволяет многим Linux-программам работать в FreeBSD. Эта функция обеспечивает выполнение широкого спектра Linux-бинарников без необходимости в отдельной Linux-среде.
-|[.filename]#bootonly.iso#
-|Минимальный образ, требующий сетевое подключение для завершения установки FreeBSD.
-|===
+Тем не менее, важно отметить, что множество широко используемых программ с открытым исходным кодом *имеют собственные версии для FreeBSD*, доступные через систему портов и пакетов.
-Полные инструкции по этой процедуре, а также более подробную информацию по
-общим вопросам, возникающим при установке, можно найти в
-extref:{handbook}bsdinstall[разделе Руководства об установке FreeBSD].
+[[installing-freebsd]]
+== Установка FreeBSD
-=== Что нужно делать, если установочный образ не запускается?
+Процесс установки FreeBSD — это первый шаг к использованию возможностей этой мощной операционной системы с открытым исходным кодом. В этом разделе представлена важная информация о том, где получить FreeBSD, подробные инструкции по установке, а также объяснение таких концепций, как FreeBSD-CURRENT и FreeBSD-STABLE. Также рассматриваются график выпуска релизов и снимков (snapshots), инструменты настройки после установки, методы поиска пакетов и ответы на часто задаваемые вопросы об обновлении пакетов.
-Это может быть вызвано тем, что образ был загружен по FTP не в режиме _binary_.
+[[where-get]]
+=== Где взять FreeBSD?
-В некоторых клиентских программах FTP по умолчанию используется текстовый (_ascii_) режим передачи, в котором любые последовательности символов "конец строки" заменяются на используемые в системе клиента. В таком случае образ загрузочного диска будет неизбежно испорчен. Проверьте контрольную сумму SHA-256 полученного файла: если он не _точно_ такой же как на FTP-сервере, то ошибка произошла, скорее всего, в процессе передачи.
+FreeBSD доступна для бесплатной загрузки по ссылке: link:https://www.FreeBSD.org/where/[официальный сайт FreeBSD].
-В случае использования командной строки FTP-клиента введите команду _binary_ в командной строке FTP после подключения к серверу, но перед началом передачи файла.
+Кроме того, FreeBSD также может быть доступен через различные зеркальные сайты, что обеспечивает доступность для пользователей по всему миру. Основным и наиболее надежным источником для получения последних выпусков и обновлений FreeBSD является link:https://www.FreeBSD.org/where/[официальный сайт], что делает его идеальной отправной точкой для начала работы с FreeBSD.
[[install-instructions-location]]
=== Где находятся инструкции по установке FreeBSD?
-Инструкции по установке можно найти в extref:{handbook}bsdinstall/[главе
-Руководства], посвящённой установке FreeBSD.
-
-[[custom-boot-floppy]]
-=== Как сделать собственный установочный диск?
-
-Индивидуальный установочный носитель FreeBSD можно создать, запустив процедуру построения индивидуального релиза. Следуйте инструкциям в статье о extref:{releng}[подготовке релизов FreeBSD].
-
-[[windows-coexist]]
-=== Может ли Windows(R) сосуществовать с FreeBSD? (специфично для x86)
-
-Да, если Windows(R) установлена первой. Загрузчик FreeBSD будет управлять процессом выбора загрузки Windows(R) или FreeBSD. Если Windows(R) устанавливается следом, то это приведёт к перезаписи загрузчика. Если такое случится, обратитесь к следующему разделу.
+Инструкции по установке можно найти в главе extref:{handbook}bsdinstall/[Установка FreeBSD Руководства].
-[[bootmanager-restore]]
-=== Другая операционная система уничтожила мой загрузчик операционной системы! Как мне его вернуть? (специфично для x86)
-
-Способ восстановления зависит от используемого загрузчика. Меню выбора загрузки, используемое во FreeBSD, можно переустановить с помощью man:boot0cfg[8]. Пример для восстановления меню загрузки на диске _ada0_:
-
-[source,shell]
-....
-# boot0cfg -B ada0
-....
-
-Неинтерактивный загрузчик MBR можно установить с помощью man:gpart[8]:
-
-[source,shell]
-....
-# gpart bootcode -b /boot/mbr ada0
-....
-
-Более сложные ситуации, включая использование дисков GPT, рассматриваются в man:gpart[8].
-
-[[need-complete-sources]]
-=== Нужно ли устанавливать исходные тексты системы?
-
-В общем случае, нет. Для работы основной системы присутствие исходных текстов не требуется. Некоторые порты наподобие [.filename]#sysutils/lsof# не будут собираться без установленных исходных текстов системы. В частности, если порт собирает модуль ядра или напрямую обращается к структурам ядра, в этом случае исходные тексты должны быть установлены.
-
-[[need-kernel]]
-=== Нужно ли перекомпилировать ядро?
-
-Обычно нет.
-Поставляемое ядро `GENERIC` содержит драйвера, необходимые для типового компьютера.
-Инструмент man:freebsd-update[8] не может использоваться для обновления FreeBSD с собственным ядром, и это является ещё одной причиной для того, чтобы по возможности придерживаться использования ядра `GENERIC`.
-Для компьютеров с очень небольшим объёмом ОЗУ, таких как встраиваемые системы, может потребоваться собственное небольшое ядро, содержащее только необходимые драйверы.
+[[current]]
+=== Что такое концепция FreeBSD-CURRENT?
-[[password-encryption]]
-=== Какой из методов шифрования паролей (DES, Blowfish или MD5) я должен использовать, и как указать, шифрование какого типа применяется пользователями?
+FreeBSD-CURRENT представляет собой ветку разработки операционной системы FreeBSD. Это самая передовая версия FreeBSD, в которой ведётся активная разработка.
-Во FreeBSD по умолчанию используется метод шифрования _SHA512_.
-Пароли, зашифрованные методом DES, остаются доступными для обратной совместимости с операционными системами, в которых всё ещё используется менее защищённый метод шифрования паролей.
-FreeBSD также поддерживает пароли в форматах Blowfish и MD5.
-Управление выбором используемого метода для новых паролей осуществляется через параметр входа `passwd_format` в файле [.filename]#/etc/login.conf#, принимающий значения `des`, `blf` (если они доступны) или `md5`.
-Подробная информация о параметрах входа находится на странице Справочника man:login.conf[5].
+Хотя он включает последние функции, улучшения и экспериментальные изменения, он не всегда может быть таким стабильным, как FreeBSD-STABLE или релизные версии.
-[[ffs-limits]]
-=== Какие существуют ограничения для файловой системы FFS?
+FreeBSD-CURRENT — это платформа для разработчиков и энтузиастов, которые хотят внести свой вклад в будущее FreeBSD и оставаться на переднем крае её разработки, даже несмотря на то, что в ней могут иногда происходить значительные изменения и *она не рекомендуется для производственных систем*.
-Наибольший размер файловой системы FFS ограничен практически количеством памяти, которая требуется для работы man:fsck[8]. man:fsck[8] использует 1 бит на фрагмент, и для стандартного размера фрагмента 4 Кбайт это эквивалентно использованию 32 Мбайт памяти на терабайт дискового пространства. Это означает, что на архитектурах с ограничением размера пользовательского процесса в 2 Гбайт (например, i386(TM)) максимальный размер файловой системы, доступный для man:fsck[8], составляет ~60 Тбайт.
+[[stable]]
+=== Что такое концепция FreeBSD-STABLE?
-Без ограничения на память для man:fsck[8] максимальный размер файловой системы составляет 2 ^ 64 (блоков) * 32 Кбайт => 16 экса * 32 Кбайт => 512 зеттабайт.
+Ветка FreeBSD-STABLE — это более стабильная ветка разработки по сравнению с CURRENT. Она содержит код, который проходит дополнительные тестирование и доработку перед слиянием в ветку RELEASE. STABLE — хороший выбор для тех, кто хочет следить за разработкой FreeBSD, но предпочитает более стабильную среду, чем CURRENT.
-Максимальный размер файла на FFS приблизительно равен 2 петабайт со стандартным размером блока 32 Кбайт. Каждый 32 Кбайтный блок может адресовать до 4096 блоков. С использованием тройной косвенной адресации это составляет 32 Кбайт * 12 + 32 Кбайт * 4096 + 32 Кбайт * 4096^2 + 32 Кбайт * 4096^3. Увеличение размера блока до 64 Кбайт увеличит максимальный размер файла в 16 раз.
+[[release-freq]]
+=== Когда выходят выпуски FreeBSD?
-[[archsw-readin-failed-error]]
-=== Я скомпилировал новое ядро и при загрузке получил сообщение об ошибке readin failed.
+Версия {re} выпускает новую основную версию FreeBSD примерно каждые 18 месяцев и новую промежуточную версию — в среднем каждые 8 месяцев. Даты выпуска объявляются заранее, чтобы разработчики знали, когда их проекты должны быть завершены и протестированы. Перед каждым выпуском проводится период тестирования, чтобы убедиться, что добавление новых функций не нарушает стабильность релиза.
-Ядро и компоненты системы не синхронизированы. Такая конфигурация не поддерживается. Обязательно используйте команды `make buildworld` и `make buildkernel` для обновления ядра.
+[[snapshot-freq]]
+=== Когда создаются снимки состояния FreeBSD?
-Загрузите систему, непосредственно указав ядро на втором этапе загрузки, нажав любую клавишу до запуска загрузчика при появлении символов `|`.
+Снимки FreeBSD обычно создаются с регулярными интервалами для всех активно разрабатываемых веток. Эти снимки фиксируют состояние исходного кода FreeBSD и связанных с ним бинарных пакетов на определённый момент времени. Частота создания снимков может варьироваться, но обычно они делаются еженедельно или раз в две недели. Эти снимки предоставляют пользователям возможность получить доступ к последним изменениям и разработкам в FreeBSD, помогая им оставаться в курсе прогресса проекта.
[[general-configuration-tool]]
-=== Существует ли инструмент для настройки системы после её установки?
-
-Да, bsdconfig предоставляет замечательный интерфейс для пост-установочной настройки FreeBSD.
-
-[[hardware]]
-== Аппаратная совместимость
-
-[[compatibility-general]]
-=== Вопросы общего характера
-
-[[which-hardware-to-get]]
-==== Я хочу приобрести некое оборудование для моей системы FreeBSD. Какая модель/производитель/тип лучше всего?
-
-Это постоянно обсуждается в списках рассылки FreeBSD и является ожидаемым вопросом, так как аппаратура меняется очень быстро. Обратитесь к Hardware Notes для
-FreeBSD link:{u-rel123-hardware}[{rel123-current}] или
-link:{u-rel131-hardware}[{rel131-current}], а также поищите в
-https://www.FreeBSD.org/search/#mailinglists[архивах списков рассылки] перед
-тем, как задавать вопросы о самом последнем и лучшем оборудовании. Весьма
-вероятно, что обсуждение касаемо этого типа оборудования велось как раз на прошлой неделе.
-
-Перед приобретением лэптопа посмотрите архивы {freebsd-questions} или, возможно, более специфичные списки рассылки по данному типу оборудования.
-
-[[memory-upper-limitation]]
-==== Каковы ограничения на оперативную память?
-
-FreeBSD как операционная система в целом поддерживает столько же физической памяти (ОЗУ), сколько аппаратная платформа, на которой она работает.
-Имейте в виду, что различные платформы имеют различные ограничения на память; например, i386(TM) без PAE поддерживает максимум 4 Гбайт памяти (и обычно ещё меньше из-за адресного пространства PCI), а i386(TM) с PAE поддерживает максимум 64 Гбайт.
-Во FreeBSD 10 для платформы AMD64 поддерживается до 4 Тбайт физической памяти.
-
-[[memory-i386-over-4gb]]
-==== Почему FreeBSD видит меньше 4 Гбайт памяти, когда система установлена на машину i386(TM)?
-
-Общее адресное пространство для машин i386(TM) является 32-разрядным; это означает, что адресоваться (т.е. быть получено) может не более 4 Гбайт памяти.
-Более того, некоторые адреса в этом диапазоне зарезервированы для различных целей аппаратным обеспечением, например, для использования и управления устройствами PCI, для доступа к видеопамяти, и так далее.
-Таким образом, общий объем памяти, используемой операционной системой для ядра и приложений, ограничен размером, значительно меньшим, чем 4 Гбайт.
-В такой конфигурации максимально доступная физическая память составляет от 3.2 Гбайт до 3.7 Гбайт.
-
-Для преодоления ограничения в 3.2 Гбайт-3.7 Гбайт установленной памяти (т.е. для получения 4 Гбайт, но также более 4 Гбайт) должен использоваться специальный механизм, именуемый PAE.
-Сокращение PAE означает Physical Address Extension (расширение физического адреса) и предоставляет для 32-разрядных x86 процессоров способ адресовать более 4 Гбайт памяти.
-PAE переназначает память, которая иначе была бы перекрыта адресными резервациями для аппаратных устройств выше диапазона 4 Гбайт, и использует её как дополнительную физическую память (смотрите man:pae[4]).
-Использование PAE имеет свои недостатки; такая модель доступа к памяти является чуть более медленной по сравнению с обычным режимом (без PAE), и также не работают динамически загружаемые модули (смотрите man:kld[4]).
-Это означает, что все драйверы должны присутствовать статически в самом ядре.
-
-Самый распространённым способом включения PAE является сборка нового ядра со специальным уже подготовленным файлом конфигурации ядра, именуемым [.filename]#PAE#, который уже сконфигурирован для сборки безопасного ядра.
-Имейте в виду, что некоторые строки в этом файле конфигурации ядра являются слишком консервативными, и некоторые драйверы, помеченные как неготовые для использования с PAE, на самом деле являются годными.
-На практике, если драйвер работает на 64-разрядной архитектуре (такой как AMD64), он также работает с PAE.
-При создании своего собственного файла конфигурации ядра можно включить PAE, добавив следующую строку:
-
-[.programlisting]
-....
-options PAE
-....
-
-PAE не является широко используемым в настоящее время, поскольку большинство нового x86 аппаратного обеспечения также поддерживает работу в 64-разрядном режиме, также известном как AMD64 или Intel(R) 64. Этот режим имеет большее адресное пространство и не нуждается в таких трюках. FreeBSD поддерживает AMD64, и рекомендуется использование этой версии FreeBSD вместо версии i386(TM), если требуется больше 4 Гбайт памяти.
-
-[[compatibility-processors]]
-=== Аппаратные платформы и процессоры
-
-[[architectures]]
-==== Поддерживает ли FreeBSD аппаратные платформы, отличные от x86?
-
-Полноценно поддерживаются архитектуры первого класса, такие, как
-i386 или amd64. Архитектуры 2 и 3 класса поддерживаются, исходя
-из принципа наибольшего внимания при имеющихся возможностях.
-Полное описание классов доступно в extref:{committers-guide}[Руководстве
-коммиттера, archs].
-
-Полный список поддерживаемых архитектур находится на https://www.FreeBSD.org/ru/platforms/[странице], посвящённой платформам.
+=== Есть ли инструмент для выполнения задач пост-установочной конфигурации?
-[[smp-support]]
-==== Поддерживает ли FreeBSD многопроцессорные системы (SMP)?
+Да. man:bsdconfig[8] предоставляет удобный интерфейс для настройки FreeBSD после установки.
-FreeBSD поддерживает симметричное мультипроцессирование (SMP) на всех невстраиваемых платформах (например, i386, amd64 и так далее). SMP также поддерживается для arm и MIPS, хотя некоторые процессоры могут это не поддерживать. В реализации SMP во FreeBSD используется мелкодисперсная синхронизация, и производительность масштабируется почти линейно с ростом количества процессоров.
+[[search-software-freebsd]]
+=== Как найти программное обеспечение для установки в FreeBSD?
-За подробной информацией обращайтесь к странице Справочника man:smp[4].
+Поиск программного обеспечения для установки в FreeBSD упрощается благодаря менеджеру пакетов man:pkg[8] и команде `pkg search`.
-[[microcode]]
-==== Что такое микрокод? Как установить обновление микрокода для процессоров AMD или Intel?
+Пользователи могут использовать эту команду для поиска доступных пакетов по ключевым словам, названиям пакетов или описаниям. Эта функция помогает быстро найти нужное программное обеспечение в обширной коллекции портов и пакетов FreeBSD, упрощая процесс добавления новых приложений и инструментов в систему FreeBSD.
-Микрокод является программным средством реализации аппаратных инструкций процессора.
-Его использование позволяет исправлять ошибки процессора без замены микросхемы.
+[[latest-packages-freebsd]]
+=== Почему я не получаю последние пакеты в моей системе FreeBSD?
-Установите package:sysutils/cpu-microcode[], а затем добавьте:
+Доступность последних пакетов в FreeBSD может зависеть от различных факторов, включая частоту обновлений репозитория пакетов и используемую версию FreeBSD.
-[.programlisting]
-....
-microcode_update_enable="YES"
-....
-
-в [.filename]#/etc/rc.conf#
-
-[[compatibility-peripherals]]
-=== Периферийные устройства
-
-[[supported-peripherals]]
-==== Какого рода периферийные устройства поддерживает FreeBSD?
-
-За информацией о списке оборудования, о котором известно, что оно
-работоспособно, а также данными о каких бы то ни было ограничечниях, обратитесь
-к Hardware Notes для FreeBSD link:{u-rel123-hardware}
-[{rel123-current}] или link:{u-rel131-hardware}[{rel131-current}].
-
-[[compatibility-kbd-mice]]
-=== Клавиатуры и мыши
-
-[[moused]]
-==== Можно ли использовать мышь вне X Window?
-
-Используемый по умолчанию драйвер консоли man:syscons[4] предоставляет возможность использования указателя мыши в текстовых консолях для выделения и переноса текста. Запустите демон мыши man:moused[8] и включите отображение указателя мыши в виртуальной консоли:
-
-[source,shell]
-....
-# moused -p /dev/xxxx -t yyyy
-# vidcontrol -m on
-....
-
-Здесь _xxxx_ - это имя устройства мыши, а _yyyy_ - тип протокола, используемого мышью. Даемон мыши может автоматически определять тип протокола большинства мышей, за исключением старых, работающих по последовательному интерфейсу. Для выполнения автоматического определения в качестве протокола укажите `auto`. Если автоматическое определение не работает, то обратитесь к справочным страницам по man:moused[8] для получения списка поддерживаемых типов протоколов.
-
-Для мыши типа PS/2 добавьте строчку `moused_enable="YES"` в файл [.filename]#/etc/rc.conf# для запуска даемона мыши во время загрузки системы. Кроме того, для использования даемона мыши во всех виртуальных терминалах, а не только на консоли, добавьте `allscreens_flags="-m on"` в файле [.filename]#/etc/rc.conf#.
-
-После запуска даемона мыши, доступ к мыши должен согласовываться между даемоном мыши и другими программами типа X Window. Обратитесь к вопросу из FAQ<<x-and-moused, Почему моя мышь не работает с X?>> для получения более полной информации по этому вопросу.
-
-[[text-mode-cut-paste]]
-==== Как можно вырезать и копировать текст с помощью мыши в текстовой консоли?
-
-Удалить данные с помощью мыши нельзя.
-Однако их можно скопировать и вставить.
-После запуска даемона мыши, как описано в ответе на <<moused,предыдущий вопрос>>, нажмите кнопку 1 (левую) и двигайте мышь для выделения текста.
-Затем нажмите кнопку 2 (среднюю) для его вставки с позиции текстового курсора.
-Нажатие кнопки 3 (правой) "расширит" выбранную текстовую область.
-
-Если у вашей мыши отсутствует средняя кнопка, её можно сэмулировать либо переназначить кнопки опциями даемона мыши. Обратитесь к справочным страницам по man:moused[8] для получения полной информации.
-
-[[mouse-wheel-buttons]]
-==== У моей мыши есть дополнительные колёсико и кнопочки. Можно ли их использовать во FreeBSD?
-
-Ответ, к сожалению, "в зависимости от обстоятельств". Эти мышки с дополнительными возможностями, как правило, требуют наличия специальных драйверов. До тех пор, пока драйвер мыши или прикладная программа не будут иметь отдельную поддержку такой мыши, она будет работать как стандартная двух- или трёхкнопочная мышь.
-
-Возможные способы использования колёсиков мыши при работе в X Window описаны в <<x-and-wheel,другом разделе>>.
-
-[[keyboard-delete-key]]
-==== Как использовать клавишу delete в sh и csh?
-
-Для Bourne Shell добавьте следующие строки в [.filename]#~/.shrc#. Смотрите man:sh[1] и man:editrc[5].
-
-[.programlisting]
-....
-bind ^[[3~ ed-delete-next-char # for xterm
-....
-
-Для C Shell добавьте следующие строки в [.filename]#~/.cshrc#. Смотрите man:csh[1].
-
-[.programlisting]
-....
-bindkey ^[[3~ delete-char # for xterm
-....
-
-[[compatibility-other]]
-=== Другое оборудование
-
-[[es1370-silent-pcm]]
-==== Есть ли решение проблемы отсутствия звука при использовании звуковых адаптеров man:pcm[4]?
-
-Некоторые звуковые адаптеры при каждой загрузке устанавливают нулевой уровень
-громкости выводимого звука. При работе с FreeBSD 13 и более ранними версиями
-при каждой загрузке машины выполняйте следующую команду:
-
-[source,shell]
-....
-# mixer pcm 100 vol 100 cd 100
-....
-
-Используйте следующую команду при работе с FreeBSD 14 и более поздними
-версиями:
-
-[source,shell]
-....
-# mixer pcm.volume=100 vol.volume=100 cd.volume=100
-....
-
-[[power-management-support]]
-==== Поддерживает ли FreeBSD управление энергосбережением на лэптопах?
-
-FreeBSD поддерживает функции ACPI, реализованные в современном оборудовании. Дополнительная информация находится на странице Справочника man:acpi[4].
-
-[[troubleshoot]]
-== Устранение некоторых проблем
-
-=== Почему FreeBSD определяет неправильное количество памяти на аппаратуре i386(TM)?
-
-Наиболее вероятная причина заключается в различии между адресами физической и виртуальной памяти.
-
-Существующее соглашение для большинства оборудования ПК заключается в использовании пространства памяти, лежащей в диапазоне между 3.5 ГБ и 4 ГБ для специальных нужд (обычно для нужд PCI). Это пространство адресов используется для доступа к PCI оборудованию. Как результат, реальная физическая память не может быть получена в данном адресном пространстве.
-
-Какие действия выполняются с памятью в данном регионе, зависит от оборудования. К сожалению, некоторое оборудование ничего не выполняет и возможность использовать эти 500 МБ ОЗУ полностью потеряна.
-
-К счастью, большинство оборудования перераспределяет память к более верхней позиции, так что она всё ещё может использоваться. Тем не менее, это может вызвать некоторое замешательство при просмотре сообщений, выдаваемых при загрузке.
-
-На 32-битной версии FreeBSD кажется, что эта память потерялась, поскольку она переназначится в диапазон выше 4 ГБ, который не доступен для 32 битного ядра. В данном случае, решение заключается в сборке ядра с PAE. За дополнительной информацией обращайтесь к статье об ограничениях памяти.
-
-На 64nbsp;битной версии FreeBSD или в случае использования ядра с включённым PAE FreeBSD корректно определит и перераспределит память, так, что она станет годной к использованию. Тем не менее, во время загрузки может показаться, что FreeBSD определяет больше памяти, чем реально имеется в системе из-за описанного перераспределения. Это нормально, и информация о доступной памяти будет скорректирована по окончанию процесса загрузки.
-
-[[signal11]]
-=== Программы аварийно завершают работу с ошибкой Signal 11.
-
-Ошибки выполнения, связанные с сигналом 11, происходят, когда процесс пытается обратиться к области памяти, доступ к которой ему не был дан операционной системой. Если что-то подобное происходит в случайные, казалось бы, промежутки времени, следует начать поиск причины.
-
-Эти проблемы могут быть классифицированы следующим образом:
-
-. Если проблема возникает только в определённом самостоятельно разработанном приложении, то скорее всего это ошибка в коде.
-. Если это проблема в части базового комплекта системы FreeBSD, то это тоже может быть ошибка в программном коде, хотя в большинстве случаев такие проблемы обнаруживаются и ошибки исправляются задолго до того, как обычным читателям FAQ доводится использовать этот код (именно для этого предназначена версия -CURRENT).
-
-Вероятно, это не связано с ошибкой во FreeBSD, если проблема проявляется при компиляции программы, и при этом ошибка компилятора каждый раз разная.
-
-Например, если запуск `make buildworld` завершился неудачей при попытке компиляции [.filename]#ls.c# в [.filename]#ls.o# и при повторном запуске компиляция снова прервалась на том же месте, то это ошибка процесса построения. Обновите исходные тексты и попробуйте снова. Если же компиляция прерывается в каком-то другом месте, то причина наиболее вероятно кроется в оборудовании.
-
-В первом случае воспользуйтесь отладчиком, к примеру, man:gdb[1], для нахождения точки программы, в которой делается попытка доступа к неверному адресу, и исправьте эту ошибку.
+Также следует отметить, что для портов FreeBSD существуют две ветки. Наиболее обновляемая называется `latest`, а наиболее стабильная — `quarterly`. Для использования самых свежих пакетов необходимо настроить ветку `latest`. Информацию о настройке веток можно найти в link:{handbook}ports/[главе о портах в Руководстве].
-Во втором случае проверьте, какой компонент вашего оборудования неисправен.
-
-Среди часто приводящих к этому причин:
-
-. Жёсткие диски могут перегреваться. Проверьте работоспособность вентиляторов, так как жёсткие диски и другое оборудование могут перегреваться.
-. Процессор перегревается. Это может произойти при разгоне процессора или при поломке процессорного вентилятора.
-В любом случае убедитесь, что ваше оборудование работает в нормальном режиме,
-как ему и положено, по крайней мере, на момент поиска причин неисправности.
-В противном случае сбросьте частоту на настройки по умолчанию.)
-+
-Что касается разгона, то медленная система обходится дешевле, чем сгоревшая система, требующая замены!
-К тому же проблемы на таких системах не находят понимания общественности.
-. Проблемная память. Если установлены различные микросхемы SIMM/DIMM, вытащите их все и попробуйте по одной до локализации проблемы в проблематичной микросхеме DIMM/SIMM, либо их комбинации.
-. Чересчур оптимистичные настройки материнской платы. Настройки BIOS и перемычки на материнской плате предоставляют возможность задавать различные частоты и задержки.
-Часто бывает достаточно настроек по умолчанию, но иногда установка слишком малых периодов ожидания для ОЗУ или установка параметра "RAM Speed: Turbo" вызывает странное поведение.
-Возможным решением может стать установка параметров BIOS по умолчанию с предварительной записью текущих значений.
-. Неустойчивое или недостаточное электропитание материнской платы.
-Уберите неиспользуемые адаптеры ввода/вывода, жёсткие диски и приводы компакт-дисков или отключите их от кабеля электропитания для проверки, что блок питания может работать с меньшей нагрузкой.
-Или попробуйте воспользоваться другим блоком питания, желательно большей мощности.
-Например, если имеющийся блок питания рассчитан на 250 Ватт, попробуйте другой мощностью 300 Ватт.
-
-Прочитайте раздел про <<signal11,Signal 11>> для дальнейшего объяснения и обсуждения, как аппаратура или программное обеспечение для тестирования памяти могут пропускать сбойную память. Подробная информация по этому вопросу содержится в http://www.bitwizard.nl/sig11/[FAQ по проблеме SIG11].
-
-Наконец, если ничего не помогает, то, возможно, это из-за ошибки во FreeBSD. Следуйте <<access-pr,этим инструкциям>> для отправки сообщения о проблеме.
-
-[[trap-12-panic]]
-=== Моя система аварийно завершает работу с сообщениями Fatal trap 12: page fault in kernel mode либо panic:, и выдаёт много дополнительной информации. Что мне делать?
-
-Разработчики FreeBSD интересуются такими ошибками, но им нужно больше информации, чем просто текст ошибки. Скопируйте весь текст сообщения. Затем обратитесь к разделу FAQ об <<kernel-panic-troubleshooting,аварийных завершениях работы ядра>>, постройте отладочное ядро и получите трассу вызовов. Это может звучать трудной задачей, зато не требует навыков программирования. Просто следуйте указаниям.
-
-[[proc-table-full]]
-=== Что означает сообщение об ошибке maxproc limit exceeded by uid %i, please see tuning(7) and login.conf(5)?
-
-Ядро FreeBSD позволяет одновременно существовать ограниченному числу процессов. Это зависит от значения переменной man:sysctl[8] `kern.maxusers`. `kern.maxusers` также влияет на другие ограничения ядра, такие как буферы работы с сетью. Если система сильно загружена, поднимите `kern.maxusers`. Кроме максимального числа процессов это также увеличит значения других параметров, ограничивающих систему.
-
-Для корректировки значения `kern.maxusers` обратитесь к разделу
-extref:{handbook}config/[Ограничения файлов/процессов, kern-maxfiles]
-Руководства. В нём говорится об открытых файлах, но те же ограничения касаются
-и процессов.
-
-Если система загружена слабо, но в ней запущено слишком много процессов, поправьте параметр `kern.maxproc`, определив его значение в [.filename]#/boot/loader.conf#. Изменение не вступит в силу до перезагрузки системы. За дополнительной информацией, касающейся настройки параметров, обращайтесь к странице Справочника man:loader.conf[5]. Если эти процессы запущены одним и тем же пользователем, поправьте значение `kern.maxprocperuid`, чтобы оно было на единицу меньше, чем новое значение `kern.maxproc`. Оно должно быть меньше по крайней мере на единицу, потому что системная программа man:init[8] должна работать всегда.
-
-[[remote-fullscreen]]
-=== Полноэкранные приложения на удалённой машине работают неправильно!
-
-На удалённой машине тип терминала может отличаться от `xterm`, который требуется для использования консоли FreeBSD. Либо же ядро может иметь неправильные значения ширины и высоты терминала.
-
-Проверьте, чтобы переменная окружения `TERM` имела значение `xterm`. Если удалённая машина его не поддерживает, попробуйте `vt100`.
-
-Запустите `stty -a`, чтобы узнать, какие размеры терминала заданы в ядре.
-Если значения неправильные, их можно поменять командой `stty rows _RR_ cols _CC_`.
-
-Либо же, если на клиентской машине установлен package:x11/xterm[], запуск `resize` позволит узнать у терминала правильные размеры и применить эти значения.
-
-[[connection-delay]]
-=== Почему подключение через ssh или telnet к моему компьютеру занимает так долго времени?
-
-Симптом: между моментом установления TCP-соединения и выдачей клиентским программным обеспечением запроса на ввод пароля (или, в случае использования man:telnet[1], выдачей приглашения на вход) проходит большой промежуток времени.
-
-Проблема: скорее всего, задержка вызвана программным обеспечением на стороне сервера, которое пытается преобразовать IP-адрес клиента в имя хоста.
-Многие серверы, включая Telnet и SSH, поставляемые с FreeBSD, делают это для того, чтобы, кроме всего прочего, записать имя хоста в файле журнала для справки администратора.
-
-Лечение: Если проблема возникает при подключении клиента к любому серверу, то причина в клиенте. Если проблема возникает только при чьей-либо попытке подключиться к серверу, то проблема в сервере.
+[[hardware]]
+== Оборудование
-Если проблема с клиентом, то единственным методом ее решения является исправление DNS, чтобы сервер смог распознать вашу машину. Если это происходит в локальной сети, то предположите, что это проблема с сервером, и продолжайте чтение. Если это происходит в сети Интернет, обратитесь к вашему провайдеру.
+В разделе «Оборудование» рассматривается совместимость FreeBSD с различными аппаратными конфигурациями. Он охватывает широкий круг тем, включая поддерживаемые архитектуры, максимальный объем оперативной памяти, масштабируемость процессоров, совместимость с видеокартами, поддержку Wi-Fi-адаптеров, а также работу с сетевыми картами 10 Gigabit Ethernet. Независимо от того, планируется ли развертывание FreeBSD на серверах, рабочих станциях или специализированном оборудовании, этот раздел дает представление о возможностях и ограничениях FreeBSD, предоставляя информацию о выборе и настройке оборудования.
-Если проблема с сервером в локальной сети, настройте сервер для разрешения запросов на преобразование адреса в имя хоста в диапазоне локальных адресов. Обратитесь к страницам Справочника по man:hosts[5] и man:named[8] для получения более подробной информации. Если это происходит в сети Интернет, то проблема может заключаться в некорректной работе ресолвера локального сервера. Для проверки попробуйте получить адрес другого хоста, такого как `www.yahoo.com`. Если это не работает, то в этом и состоит проблема.
+[[architectures-support]]
+=== Какие архитектуры поддерживает FreeBSD?
-Из-за свежей установки FreeBSD, также возможно, что информация о домене и сервере имён отсутствует в [.filename]#/etc/resolv.conf#. Это часто будет вызывать задержку в работе SSH, так как опция `UseDNS` по умолчанию установлена в значение `yes` в [.filename]#/etc/ssh/sshd_config#. Если именно это является причиной проблемы, то добавьте недостающую информацию в [.filename]#/etc/resolv.conf#, либо в качестве временной меры установите `UseDNS` в `no` в файле [.filename]#sshd_config#.
+FreeBSD поддерживает широкий спектр архитектур, что делает его гибким выбором для различных аппаратных сред. Совместимость распространяется на такие архитектуры, как `amd64`, `arm64`, `riscv` и другие.
-[[file-table-full]]
-=== Почему в man:dmesg[8] регулярно выводятся сообщения file: table is full?
+Полный список поддерживаемых архитектур можно найти на странице link:https://www.FreeBSD.org/platforms/[платформ].
-Такое сообщение об ошибке сигнализирует о том, что в системе закончились
-доступные файловые дескрипторы. Обратитесь к разделу
-extref:{handbook}config/[kern.maxfiles, kern-maxfiles] главы о
-extref:{handbook}config/[настройке ограничений ядра, configtuning-kernel-limits] Руководства для выяснения всех подробностей и поиска решения.
+[[ram-support]]
+=== Сколько оперативной памяти поддерживает FreeBSD?
-[[computer-clock-skew]]
-=== Почему часы на моем компьютере показывают неправильное время?
+FreeBSD как операционная система обычно поддерживает столько же физической памяти (RAM), сколько и платформа, на которой она работает. Следует учитывать, что разные платформы имеют разные ограничения по памяти.
-На компьютере установлено по меньшей мере два таймера, и FreeBSD выбрала не тот.
+Например, платформы `amd64` поддерживают до 4 ТБ физической памяти.
-Запустите man:dmesg[8] и посмотрите строки, содержащие слово `Timecounter`. FreeBSD выбирает таймер с наибольшим значением качества.
+[[cpu-support]]
+=== Сколько процессоров поддерживает FreeBSD?
-[source,shell]
-....
-# dmesg | grep Timecounter
-Timecounter "i8254" frequency 1193182 Hz quality 0
-Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
-Timecounter "TSC" frequency 2998570050 Hz quality 800
-Timecounters tick every 1.000 msec
-....
+Поддержка процессоров в FreeBSD варьируется в зависимости от архитектуры. На системах amd64 и arm64 FreeBSD может эффективно использовать до 1024 процессоров. На системах с архитектурой powerpc FreeBSD поддерживает до 256 процессоров, а на системах risc-v — до 16 процессоров.
-Удостоверьтесь в этом, проверив man:sysctl[3]-переменную `kern.timecounter.hardware`.
+[[graphics-cards-support]]
+=== Какие графические карты поддерживает FreeBSD?
-[source,shell]
-....
-# sysctl kern.timecounter.hardware
-kern.timecounter.hardware: ACPI-fast
-....
+Известные производители графических устройств, такие как Intel(R), AMD(R) или NVIDIA(R), хорошо поддерживаются.
-Это может быть неработающий таймер ACPI. Самым простым решением будет отключить таймер ACPI в [.filename]#/boot/loader.conf#:
+Список поддерживаемых видеокарт от link:https://wiki.freebsd.org/Graphics/Intel-GPU-Matrix[Intel] и link:https://wiki.freebsd.org/Graphics/AMD-GPU-Matrix[AMD] можно найти в FreeBSD Wiki.
-[.programlisting]
-....
-debug.acpi.disabled="timer"
-....
+[[wifi-support]]
+=== Какие Wi-Fi карты поддерживает FreeBSD?
-Либо же BIOS может изменить частоту таймера TSC - возможно, для изменения скорости работы процессора при работе от батареи или переводя в режим пониженного электропитания, но FreeBSD не отслеживает это, и в результате часы начинают спешить или отставать.
+Это область, которая быстро меняется по состоянию на 2025 год, поэтому рекомендуется проверить Список совместимого оборудования для выбранного link:https://www.freebsd.org/releases/[релиза].
-В этом примере имеется также и таймер `i8254`, и он может быть выбран записью его имени в man:sysctl[3]-переменную `kern.timecounter.hardware`.
+Список устройств PCIe Wi-Fi, которые хорошо работают в FreeBSD:
-[source,shell]
-....
-# sysctl kern.timecounter.hardware=i8254
-kern.timecounter.hardware: TSC -> i8254
-....
+* Устройства на чипсетах Intel, поддерживаемые man:iwlwifi[4] (высокоскоростные — начиная с FreeBSD 14.3)
+* Realtek RTL8188CE Mini PCIe
-Теперь компьютер должен аккуратнее следить за временем.
+Список USB Wi-Fi устройств, которые хорошо работают в FreeBSD:
-Чтобы это изменение вступало в силу во время загрузки системы, добавьте в файл [.filename]#/etc/sysctl.conf# такую строчку:
+* USB-адаптеры RT5370 (поддерживают режим hostap)
+* TP-Link TL-WDN3200 (RT5592, man:if_run[4])
+* TP-Link TL-WN725N v2 (RTL8188EU, man:rtwn[4])
+* TP-Link Archer T4U (RTL8812AU, man:rtwn[4])
+* D-Link DWA-131 (RTL8192CU, man:rtwn[4])
+* D-Link DWA-171 rev A1 (RTL8821AU, man:rtwn[4])
+* ASUS USB-N10 NANO (RTL8188CUS, man:rtwn[4])
-[.programlisting]
-....
-kern.timecounter.hardware=i8254
-....
-=== Что означает сообщение swap_pager: indefinite wait buffer:?
+[[gigabit-ethernet-network-support]]
+=== Поддерживает ли FreeBSD сетевые карты 10 Gigabit Ethernet?
-Это значит, что процесс пытается считать страницу памяти с
-диска, но попытки сделать это оканчиваются неудачно в течение
-более 20 секунд. Это может быть вызвано повреждёнными блоками
-на диске, кабелями, подключением или другим оборудованием ввода/вывода. Если диск сам по себе повреждён, вы также увидите ошибки работы с диском в [.filename]#/var/log/messages# и в выводе `dmesg`. В противном случае проверьте кабели и подключения.
+FreeBSD обеспечивает надежную поддержку сетевых карт 10 Gigabit Ethernet, что делает его подходящим выбором для высокоскоростных сетевых сред. Ядро FreeBSD включает драйверы для широкого спектра адаптеров 10 Gigabit Ethernet от различных производителей, гарантируя беспрерывную интеграцию и оптимальную производительность сети.
-[[lock-order-reversal]]
-=== Что такое lock order reversal?
+Дополнительную информацию можно получить по ссылке: link:https://wiki.freebsd.org/Networking/10GbE[FreeBSD Wiki].
-Ядро FreeBSD использует несколько блокировок для арбитража доступа к соответствующим ресурсам.
-Когда несколько потоков в ядре пытаются захватить несколько блокировок подряд, всегда существует возможность появления мёртвой блокировки (deadlock), где два потока захватили по одной блокировке и заблокированы в ожидании освобождения другим потоком второй блокировки.
-Такой проблемы синхронизации можно избежать, если все потоки получают блокировки в одинаковом порядке.
+[[documentation-support]]
+== Документация и Поддержка
-Система диагностирования блокировок man:witness[4], которая по умолчанию включена во FreeBSD-CURRENT и выключена для стабильных веток и релизов, определяет возможность появления мёртвых блокировок из-за ошибок их использования, включая захват нескольких блокировок в различном порядке в разных частях ядра.
-Механизм man:witness[4] пытается обнаруживать эту проблему по мере её появления и сообщает о ней на системную консоль сообщением `lock order reversal` (которое также часто называют LOR).
+В этом разделе представлены полезные ресурсы для тех, кто хочет углубить свои знания о FreeBSD. Здесь рассматриваются различные темы, включая рекомендуемые книги для изучения FreeBSD, варианты коммерческого обучения и поддержки, информацию о понимании внутреннего устройства FreeBSD, а также о том, где можно получить помощь в сообществе FreeBSD.
-В силу консервативности man:witness[4] возможны ложные срабатывания.
-При правильном срабатывании такое сообщение _не_ означает, что система находится в состоянии мёртвой блокировки; его следует рассматривать как предупреждение о том, что в этом месте могла произойти мёртвая блокировка.
-
-[NOTE]
-====
-Плохие LOR обычно быстро исправляют, поэтому перед написанием сообщения в списки рассылки следует проверить архивы {freebsd-current}.
-====
-
-[[called-with-non-sleepable-locks-held]]
-=== Что означают сообщения `Called ... with the following non-sleepable locks held`?
-
-Это означает, что функция, которая может находиться в "спящем" состоянии была вызвана во время использования мьютекс (или другого не "засыпающего") блокирования.
-
-Объяснением того, что это ошибка, является то, что мьютексы не предполагают нахождения в удерживаемом состоянии длительные промежутки времени, и блокируются только на короткие периоды синхронизации.
-Это правило позволяет драйверам устройств использовать мьютексы для синхронизации с остальной частью ядра во время прерываний.
-Прерывания (во FreeBSD) могут находиться не в "спящем состоянии". Следовательно необходимо, чтобы не было подсистем в ядре, которые бы занимались блокировкой длительный период, используя мьютекс.
-
-Для нахождения таких ошибок в ядро могут быть добавлены assertions, которые будут взаимодействовать с подсистемой man:witness[4] для генерирования предупреждения или фатальной ошибки (в зависимости от системной конфигурации) в случаях когда производится потенциально блокирующий вызов с удержанием мьютекса.
+[[books]]
+=== Какие есть хорошие книги о FreeBSD?
-В общем, такие предупреждения не критичны, но тем не менее, с неудачной синхронизацией (timing) они могут вызвать нежелательные эффекты, начиная от незначительной задержки в ответной реакции системы до полной её блокировки.
+Энтузиасты и изучающие FreeBSD могут ознакомиться с разнообразными информативными книгами, посвящёнными этой операционной системе. Эти книги охватывают темы от основ FreeBSD до продвинутого системного администрирования и разработки.
-Дополнительная информация о синхронизации во FreeBSD находится на странице Справочника man:locking[9].
+Некоторые примечательные книги включают *"FreeBSD: Подробное руководство" ("Absolute FreeBSD: The Complete Guide To FreeBSD")* Майкла В. Лукаса и серию *"FreeBSD Mastery"* того же автора, среди прочих. Эти ресурсы предоставляют ценные знания и помогают пользователям любого уровня освоить FreeBSD и раскрыть её потенциал.
-[[touch-not-found]]
-=== Почему процесс buildworld/installworld завершается с сообщением touch: not found?
+Помимо книг, проект FreeBSD создает обширную документацию, доступную онлайн на портале link:https://docs.FreeBSD.org/[Документация].
-Эта ошибка не означает, что не найдена утилита man:touch[1]. Ошибка наверняка появляется из-за того, что даты модификации файлов установлены в будущем. Если CMOS часы установлены на локальное время, отрегулируйте часовой механизм ядра, запустив команду `adjkerntz -i` в однопользовательском режиме.
+[[training]]
+=== Где можно получить коммерческое обучение и поддержку FreeBSD?
-[[applications]]
-== Прикладные программы
+Для тех, кто ищет профессиональное обучение и поддержку по FreeBSD, несколько коммерческих поставщиков предлагают индивидуальные услуги. Проект FreeBSD ведет link:https://www.freebsd.org/commercial/[список компаний], у которых можно запросить поддержку.
-=== Где находятся все прикладные программы?
+[[learn-advanced]]
+=== Как можно узнать больше о внутреннем устройстве FreeBSD?
-Обратитесь на link:https://www.FreeBSD.org/ports/[страницу портов], содержащую
-информацию о программных продуктах, перенесённых во FreeBSD.
+Для более глубокого изучения внутреннего устройства FreeBSD заинтересованные лица могут обратиться к таким ресурсам, как "FreeBSD: Дизайн и архитектура (The Design And Implementation Of The FreeBSD Operating System)". Ещё одним ценным источником информации является extref:{arch-handbook}[Руководство по архитектуре FreeBSD], который предоставляет подробные сведения об архитектуре FreeBSD, организации системы и принципах проектирования
-Большинство портов должно нормально работать во всех поддерживаемых версиях FreeBSD. Неработоспособные порты специально помечаются соответствующим образом. При выходе нового релиза FreeBSD в него в каталог [.filename]#ports/# также включается актуальная на момент выхода Коллекция Портов.
+Кроме того, изучение исходного кода FreeBSD, доступного в репозитории исходных текстов FreeBSD, дает ценное представление об основных компонентах операционной системы.
-FreeBSD умеет работать со сжатыми двоичными пакетами для упрощения установки и удаления портов. Используйте man:pkg[7] для управления процессом установки пакетов.
+[[help-freebsd-system]]
+=== Как получить помощь в системе FreeBSD?
-[[how-do-download-ports-tree]]
-=== Как загрузить дерево Портов? Следует ли использовать Git?
+Получить помощь в системе FreeBSD довольно просто. FreeBSD предоставляет обширную встроенную документацию, доступную через команду man:man[1], которая содержит подробную информацию о различных командах и компонентах системы.
-Обратитесь к разделу
-extref:{handbook}ports/[Установка Коллекции Портов, ports-using-installation-methods].
+Кроме того, extref:{handbook}[Руководство FreeBSD], доступное как онлайн, так и локально в системе, служит ценным ресурсом для получения подробных инструкций.
-[[ports-4x]]
-=== Почему этот порт не компилируется на моей машине с {rel2-relx} - или {rel-relx} -STABLE?
+Если возникают конкретные проблемы, можно обратиться за помощью в сообщество FreeBSD через списки рассылки, форумы или IRC, чтобы получить своевременные решения и советы от опытных пользователей и разработчиков FreeBSD.
-Если установленная версия FreeBSD значительно отстаёт от _-CURRENT_ или
-_-STABLE_, обновите Коллекцию Портов, следуя указаниям раздела
-extref:{handbook}ports/[Использование Коллекции Портов, ports-using]. Если
-система находится в актуальном состоянии, то, возможно, кто-то внёс изменение в
-порт, который работоспособен в _-CURRENT_, но
-не работает в _-STABLE_. https://bugs.FreeBSD.org/submit/[Отправьте]
-сообщение об ошибке, так как предполагается, что Коллекция Портов
-работает как для ветки _-CURRENT_, так и _-STABLE_.
+[[community-questions]]
+== Вопросы о сообществе
-[[make-index]]
-=== Я попытался сформировать файл INDEX командой make index, однако попытка окончилась неудачей. Почему?
+Изучите этот раздел, чтобы узнать о способах взаимодействия с сообществом FreeBSD.
-Первым делом убедитесь, что Коллекция Портов находится в актуальном состоянии. Ошибки, которые отражаются на построении файла [.filename]#INDEX# из актуальной копии Коллекции Портов, бросаются в глаза и поэтому практически всегда исправляются немедленно.
+Узнайте о каналах FreeBSD в IRC для обсуждений в реальном времени, веб-форумах для обмена мнениями, а также о почтовых рассылках и группах новостей FreeBSD для углубленных обсуждений и получения обновлений.
-В редких случаях [.filename]#INDEX# не перестраивается из-за странных
-комбинаций значений переменных `OPTIONS_SET`, заданных в
-файле [.filename]#make.conf#. Если вы подозреваете, что
-дело именно в этом, то, прежде чем сообщать об этом в {freebsd-ports},
-попытайтесь сформировать [.filename]#INDEX# с отключенными значениями этих
-переменных.
+[[irc]]
+=== Есть ли каналы FreeBSD в IRC (Internet Relay Chat)?
-[[ports-update]]
-=== Я обновил исходные тексты. Как теперь обновить установленные порты?
+Да, большинство крупных IRC-сетей имеют канал для обсуждения FreeBSD, а на вики FreeBSD доступен актуальный link:https://wiki.freebsd.org/IRC/Channels[список IRC-каналов].
-С FreeBSD не поставляется инструмент обновления портов, но есть несколько инструментов, немного облегчающих этот процесс. Кроме того, для упрощения работы с портами доступны дополнительные инструменты; смотрите раздел Руководства FreeBSD extref:{handbook}ports/[об обновлении портов, ports-using].
+Каждый из этих каналов уникален и не связан с другими. Поскольку их стили общения различаются, попробуйте каждый, чтобы найти подходящий вам стиль чата.
-[[ports-major-upgrade]]
-=== Нужно ли мне перекомпилировать все порты каждый раз, когда я выполняю мажорное обновление (со сменой старшей версии FreeBSD)?
+[[forums]]
+=== Есть ли веб-форумы для обсуждения FreeBSD?
-Да!
-Хотя на новой системе программное обеспечение, скомпилированное под более старый релиз, будет работать, но только до тех пор, пока вы не начнёте устанавливать другие порты или обновлять существующие.
+Официальные форумы FreeBSD расположены по ссылке: link:https://forums.FreeBSD.org/[Домашняя страница форумов FreeBSD].
-Когда система обновляется, различные совместно используемые библиотеки, загружаемые модули и другие части системы замещаются более новыми версиями. Приложения, скомпонованные с более старыми версиями, могут перестать запускаться либо начнут функционировать неправильно.
+[[mailing]]
+=== Где найти информацию о списках рассылки FreeBSD?
-Для получения дополнительной информации обращайтесь к
-extref:{handbook}cutting-edge/[разделу, посвящённому обновлениям, freebsdupdate-upgrade]
-Руководства по FreeBSD.
+Списки рассылки с открытым доступом можно найти по ссылке: link:https://lists.freebsd.org/[списки рассылки FreeBSD].
-[[ports-minor-upgrade]]
-=== Нужно ли мне перекомпилировать все порты каждый раз, когда я выполняю минорное обновление (без изменения старшей версии FreeBSD)?
+[[misc]]
+== Разные вопросы
-В общем случае этого не требуется.
-Разработчики FreeBSD делают всё возможное для сохранения двоичной совместимости между всеми релизами в пределах одной старшей версии. Любые исключения из этого правила документируются в "Примечаниях к релизу", и там же даются советы, которых следует придерживаться.
+Изучите множество интересных и практичных вопросов о FreeBSD, начиная от выбора оболочки (shell) до особенностей системы и даже имени питомца FreeBSD.
[[minimal-sh]]
-=== Почему возможности /bin/sh так малы? Почему бы во FreeBSD не использовать bash или какой-либо другой командный процессор?
-
-Многим требуется, чтобы разрабатываемые скрипты для командного процессора были переносимы между многими системами. Именно поэтому в POSIX(R) очень подробно описан командный процессор и набор утилит. Большинство скриптов пишутся на языке процессора Bourne shell (man:sh[1]), к тому же некоторые важные программные вызовы (man:make[1], man:system[3], man:popen[3] и их аналоги на языках скриптов высокого уровня, таких как Perl или Tcl) предполагают для интерпретации команд использование именно Bourne shell. Так как Bourne shell используется столь широко и часто, то очень важно, чтобы он стартовал очень быстро, его поведение было строго регламентировано и при этом потребности в оперативной памяти были малы.
-
-В имеющейся реализации мы приложили максимум усилий для воплощения в жизнь всех этих требований одновременно. Для того, чтобы сохранить `/bin/sh` небольшим по размеру, мы не включили многие из обычных возможностей, которые имеются в других командных процессорах. Для этого имеются в наличии командные процессоры, обладающие гораздо большими возможностями, такие как `bash`, `scsh`, man:tcsh[1] и `zsh`. Сравните использование памяти этими оболочками, посмотрев в колонки "VSZ" и "RSS" вывода команды `ps -u`.
+=== Почему /bin/sh такой минималистичный? Почему FreeBSD не использует bash или другую оболочку?
-[[kernelconfig]]
-== Конфигурирование ядра
+Многие люди сталкиваются с необходимостью написания сценариев командной оболочки, которые будут переносимы между различными системами. Именно поэтому POSIX(R) детально определяет стандарты для оболочки и утилит. Большинство сценариев пишутся на Bourne shell (man:sh[1]), так как несколько важных программных интерфейсов требуют использования Bourne shell для интерпретации команд. Поскольку Bourne shell так часто и широко применяется, важно, чтобы он быстро запускался, имел предсказуемое поведение и требовал мало памяти.
-[[make-kernel]]
-=== Я хочу изменить настройки ядра. Это сложно?
+Существующая реализация — это наш наилучший подход к одновременному удовлетворению как можно большего числа этих требований. Чтобы сохранить `/bin/sh` компактным, мы не добавили многие удобные функции, которые есть в других оболочках.
-Вовсе нет!
-Обратитесь к extref:{handbook}kernelconfig/[разделу о настройке ядра]
-Руководства, который посвящён этому вопросу.
+Вот почему доступны другие, более функциональные оболочки, такие как `bash`, `scsh`, man:tcsh[1] и `zsh`.
-[NOTE]
-====
-Новый файл [.filename]#kernel# будет установлен в каталог [.filename]#/boot/kernel# вместе со своими модулями, а старое ядро и его модули будут перемещены в каталог [.filename]#/boot/kernel.old#.
-Если сделана ошибка в конфигурации, просто загрузите предыдущую версию ядра.
-====
-
-[[why-kernel-big]]
-=== Почему моё ядро такое большое?
-
-Ядра `GENERIC`, поставляемые в составе FreeBSD, компилируется в _режиме отладки_.
-Ядра, построенные в таком режиме, содержат отладочную информацию, которая хранится в отдельных файлах, используемых для отладки.
-Файлы для отладки размещаются в [.filename]#/usr/lib/debug/boot/kernel/#.
-Заметьте, что снижения производительности при использовании отладочного ядра нет или оно незначительно, и отладочное ядро полезно иметь под рукой на случай аварийного завершения работы системы.
-
-При нехватке дискового пространства существует несколько вариантов уменьшения размера [.filename]#/boot/kernel/# и [.filename]#/usr/lib/debug/#.
-
-Чтобы не устанавливать файлы с символьной информацией, убедитесь в наличии следующей строки в [.filename]#/etc/src.conf#:
-
-[.programlisting]
-....
-WITHOUT_KERNEL_SYMBOLS=yes
-....
-
-Для получения дополнительной информации смотрите страницу Справочника man:src.conf[5].
-
-Если вы хотите совсем избежать создания файлов для отладки, убедитесь в
-выполнении следующих двух условий:
-
-* В конфигурационном файле ядра нет такой строчки:
-+
-[.programlisting]
-....
-makeoptions DEBUG=-g
-....
-
-* Вы не запускали утилиту man:config[8] с опцией `-g`.
-
-В любой из вышеописанных ситуаций ядро будет построено с отладочным режимом.
-
-Чтобы скомпилировать и установить только нужные модули, укажите их в [.filename]#/etc/make.conf#:
-
-[.programlisting]
-....
-MODULES_OVERRIDE= accf_http ipfw
-....
-
-Замените _accf_httpd ipfw_ на нужный список модулей. Это уменьшит размер
-каталога с ядром, а также время сборки. Для получения дополнительной
-информации почитайте [.filename]#/usr/share/examples/etc/make.conf#.
-
-Для дальнейшего уменьшения размера также можно удалить ненужные устройства из ядра. Для получения дополнительной информации смотрите <<make-kernel>>.
-
-Для вступления любого из этих действий в силу следуйте указаниям по
-extref:{handbook}kernelconfig/[сборке и установке, kernelconfig-building] нового ядра.
-
-К вашему сведению, примерный размер ядра FreeBSD 11 amd64
-([.filename]#/boot/kernel/kernel#) составляет 25 Mбайт.
-
-=== Почему мне не удаётся откомпилировать ни один вариант ядра, даже GENERIC?
-
-Есть несколько причин, приводящих к возникновению этой проблемы:
-
-* Дерево исходных текстов отличается от того, что использовалось для построения
-работающей в данный момент системы.
-Перед обновлением прочитайте файл [.filename]#/usr/src/UPDATING#, обращая
-особое внимание на раздел "COMMON ITEMS" в его конце.
-* Выполнение команды `make buildkernel` не было успешно завершено. Корректное
-исполнение задачи `make buildkernel` зависит от файлов, полученных после
-выполнения `make buildworld`.
-* Даже при построении <<stable,FreeBSD-STABLE>> возможно, что дерево исходных
-текстов было загружено в тот момент, когда оно модифицировалось или было
-неработоспособно.
-Построение гарантируется только для релизов, хотя в большинстве случаев
-<<stable,FreeBSD-STABLE>> строится без проблем.
-Попробуйте сгрузить дерево исходных текстов повторно и посмотрите, решилась
-ли проблема. Если с зеркалирующим сервером есть проблемы, попробуйте
-использовать другое зеркало.
-
-[[scheduler-in-use]]
-=== Какой планировщик используется в работающей системе?
-
-Название используемого планировщика доступно напрямую в виде значения sysctl-параметра `kern.sched.name`:
-
-[source,shell]
-....
-% sysctl kern.sched.name
-kern.sched.name: ULE
-....
-
-=== Что такое kern.sched.quantum?
-
-`kern.sched.quantum` определяет максимальное количество тактов, которое процесс может выполняться, не будучи прерванным.
-
-== Диски, файловые системы и начальные загрузчики
-
-[[adding-disks]]
-=== Как добавить в систему новый диск?
-
-Обратитесь к разделу extref:{handbook}disks/[Добавление дисков, disks-adding] Руководства по FreeBSD.
-
-[[new-huge-disk]]
-=== Как перенести систему на большой новый диск?
-
-Самый лучший способ заключается в переустановке операционной системы на новый диск с последующим переносом пользовательских данных. Это настоятельно рекомендуется при отслеживании ветки _-STABLE_ в течение более одного релиза или при обновлении релиза вместо установки нового. Установите booteasy на оба диска с помощью man:boot0cfg[8] и выполняйте загрузку с любого из них, пока не будете довольны новой конфигурацией. Пропустите следующий абзац, чтобы перейти к вопросу переноса данных после этой операции.
-
-Либо разбейте на разделы и разметьте новый диск с помощью man:sade[8] или man:gpart[8]. Если диски отформатированы в MBR, то booteasy можно установить на оба диска с помощью man:boot0cfg[8] для того, чтобы иметь возможность выполнять загрузку как старой, так и новой системы после выполнения копирования.
-
-После подготовки диска данные нельзя просто так взять и перенести. Используйте для этого инструменты, которые учитывают файлы устройств и системные флаги, например, man:dump[8]. И хотя рекомендуется выполнять перенос данных в однопользовательском режиме, это не является обязательным условием.
-
-Если на дисках стоит UFS, никогда не используйте ничего, кроме man:dump[8] и man:restore[8] для переноса корневой файловой системы. Эти команды также следует использовать при переносе отдельного раздела на другой пустой раздел. Последовательность шагов при использовании `dump` для переноса данных с раздела UFS на новый раздел:
-
-[.procedure]
-====
-. выполните команду `newfs` над новым разделом.
-. командой `mount` смонтируйте его во временный каталог.
-. командой `cd` перейдите в этот каталог.
-. выполните команду `dump` над старым разделом, направив вывод в новый раздел.
-====
-
-Например, чтобы перенести корневую файловую систему на устройство [.filename]#/dev/ada1s1a# с использованием каталога [.filename]#/mnt# в качестве временной точки монтирования, наберите:
-
-[source,shell]
-....
-# newfs /dev/ad1as1a
-# mount /dev/ad1as1a /mnt
-# cd /mnt
-# dump 0af - / | restore rf -
-....
-
-Переразбиение разделов с использованием `dump` требует несколько больше усилий. Для объединения раздела типа [.filename]#/var# с его вышестоящим разделом, создайте новый раздел, достаточно большой для размещения их обоих, переместите вышестоящий раздел так, как это описано выше, а затем переместите нижестоящий раздел в пустой каталог, созданный при первом перемещении:
-
-[source,shell]
-....
-# newfs /dev/ada1s1a
-# mount /dev/ad1as1a /mnt
-# cd /mnt
-# dump 0af - / | restore rf -
-# cd var
-# dump 0af - /var | restore rf -
-....
-
-Для отделения каталога от вышестоящего, скажем, для размещения [.filename]#/var# в собственном разделе, которого не было, создайте оба раздела, затем смонтируйте нижестоящий раздел в подходящий каталог во временную точку монтирования, а затем переместите старый единый раздел:
-
-[source,shell]
-....
-# newfs /dev/ada1s1a
-# newfs /dev/ada1s1d
-# mount /dev/ada1s1a /mnt
-# mkdir /mnt/var
-# mount /dev/ada1s1d /mnt/var
-# cd /mnt
-# dump 0af - / | restore rf -
-....
-
-Для перемещения пользовательских данных также имеются программы man:cpio[1] и man:pax[1]. Известно, что они теряют информацию о флагах файлов, так что используйте их с осторожностью.
-
-[[safe-softupdates]]
-=== На каких разделах можно без опаски использовать механизм Soft Updates? Я слышал, что использование Soft Updates на / могут приводить к проблемам. Что насчёт журналируемых Soft Updates?
-
-Краткий ответ: обычно Soft Updates можно использовать без опаски на всех разделах.
-
-Подробный ответ: Soft Updates имеют две характеристики, которые могут быть нежелательны на некоторых разделах. Во-первых, раздел с Soft Updates имеет небольшой шанс потери данных по время аварийного останова системы. Раздел не будет попорчен, поскольку данные будет просто потеряны. Во-вторых, Soft Updates могут приводить к временной нехватке дискового пространства.
-
-При использовании Soft Updates ядро может задерживать до тридцати секунд запись изменений на физический диск. При удалении большого файла он остается на диске, пока ядро не выполнит фактическое удаление. Это может привести к очень простой гонке. Предположим, удаляется один большой файл и тут же создаётся другой большой файл. Первый файл на самом деле ещё не удалён с диска, поэтому для второго файла на диске может не хватить места. Это приведёт к ошибке о том, что на разделе нет достаточного пространства, несмотря на то, что только что освободилось много места. Через пару секунд создание файла сработает, как и ожидалось.
-
-Если система может аварийно остановиться после того, как ядро примет набор данных для записи на диск, но перед тем, как данные реально запишутся, то данные могут потеряться. Такой риск чрезвычайно мал, но в целом управляем.
-
-Эти проблемы влияют на все разделы, использующие Soft Updates. Итак, что это означает для корневого раздела?
-
-Жизненно важная информация на корневом разделе меняется очень редко. Если в системе произойдет сбой в период тридцатисекундного окна после выполнения такого изменения, возможно, что данные окажутся потерянными. Этот риск незначителен для большинства применений, но его нужно учитывать. Если система не может принять такой риск, не используйте Soft Updates с корневой файловой системой!
-
-[.filename]#/# традиционно является одним из самых маленьких разделов. Если каталог [.filename]#/tmp# размещён в [.filename]#/# и у вас заполнен [.filename]#/tmp#, то могут периодически возникать проблемы с дисковым пространством. Создание символической ссылки [.filename]#/tmp#, указывающей на [.filename]#/var/tmp# решит эту проблему.
-
-В заключение, man:dump[8] не работает в режиме реального времени (-L) с файловой системой, для которой включены журналируемые Soft Updates (SU+J).
-
-=== Можно ли смонтировать другие файловые системы?
-
-FreeBSD поддерживает ряд других файловых систем.
-
-UFS::
-Компакт-диски с файловой системой UFS могут быть смонтированы без всяких проблем.
-Монтирование файловых систем Digital UNIX или других систем, поддерживающих UFS, может быть более сложным, в зависимости от особенностей разбиения диска конкретной операционной системой.
-
-ext2/ext3::
-FreeBSD поддерживает разделы `ext2fs`, `ext3fs` и `ext4fs`. За дополнительной
-информацией обратитесь к странице Справочника man:ext2fs[5].
-
-NTFS::
-Поддержка NTFS, реализованная на базе FUSE, доступна в виде порта
-package:sysutils/fusefs-ntfs[]. Для получения более полной информации
-обратитесь к man:ntfs-3g[8].
-
-FAT::
-Во FreeBSD имеется драйвер для работы с FAT в режиме чтения-записи. Для получения дополнительной информации обратитесь к странице справочника man:mount_msdosfs[8].
-
-ZFS::
-FreeBSD включает в себя портированную из Sun(TM) реализацию файловой системы ZFS. В настоящее время рекомендуется использовать её только на платформе amd64 с достаточным объемом памяти. Для получения более полной информации обратитесь к странице Справочника man:zfs[8].
-
-FreeBSD включает сетевую файловую систему NFS. В Коллекции портов FreeBSD имеется несколько приложений FUSE для поддержки многих других файловых систем.
-
-[[mount-dos]]
-=== Как смонтировать вторичный раздел DOS?
-
-Вторичные разделы DOS находятся после _всех_ первичных разделов.
-Например, если "E" является вторым разделом DOS на втором диске SCSI, то в
-каталоге [.filename]#/dev# будет находиться файл устройства для "слайса 5".
-Чтобы его смонтировать, выполните следующую команду:
-
-[source,shell]
-....
-# mount -t msdosfs /dev/da1s5 /dos/e
-....
-
-[[crypto-file-system]]
-=== Существует ли криптографическая файловая система для FreeBSD?
-
-Да, man:gbde[8] и man:geli[8]. Обратитесь к разделу
-extref:{handbook}disks/[Шифрование дисковых разделов, disks-encrypting]
-Руководства по FreeBSD.
-
-[[grub-loader]]
-=== Как загрузить FreeBSD и Linux(R) с помощью GRUB?
-
-Для загрузки FreeBSD с использованием GRUB добавьте следующие строки в [.filename]#/boot/grub/menu.lst# или [.filename]#/boot/grub/grub.conf#, в зависимости от используемого дистрибутива Linux(R).
-
-[.programlisting]
-....
-title FreeBSD 9.1
-root (hd0,a)
-kernel /boot/loader
-....
-
-Где _hd0,a_ указывает на корневой раздел на первом диске. Чтобы указать номер слайса, напишите что-то вроде _(hd0,2,a)_. По умолчанию, если номер слайса не указан, GRUB ищет первый слайс c разделом `a`.
-
-[[booteasy-loader]]
-=== Как загрузить FreeBSD и Linux(R) с помощью BootEasy?
-
-Установите LILO в начало загрузочного раздела Linux(R), а не в Master Boot
-Record. После этого загрузите LILO из BootEasy.
-
-Это рекомендуется делать при одновременном использовании Windows(R) и Linux(R), чтобы упростить восстановление работоспособности Linux(R) в случае переустановки Windows(R).
-
-[[changing-bootprompt]]
-=== Как сменить приглашение загрузчика с ??? на что-нибудь более значащее?
-
-Этого нельзя сделать со стандартным загрузчиком, не переписав его. В категории [.filename]#sysutils# Коллекции Портов есть ряд других менеджеров загрузки.
-
-[[removable-drives]]
-=== Как использовать устройство для чтения сменных дисков?
-
-Если у вас уже есть файловая система на устройстве, то используйте такую команду:
-
-[source,shell]
-....
-# mount -t msdosfs /dev/da0s1 /mnt
-....
-
-Если это устройство будет использоваться только на системах FreeBSD, то разбейте его на разделы UFS или ZFS. Это обеспечит поддержку длинных имён файлов, увеличение производительности и надёжность. Если устройство будет использоваться с другими операционными системами, то лучше сделать более совместимый выбор, например, msdosfs.
-
-[source,shell]
-....
-# dd if=/dev/zero of=/dev/da0 count=2
-# gpart create -s GPT /dev/da0
-# gpart add -t freebsd-ufs /dev/da0
-....
-
-Наконец, остаётся создать новую файловую систему:
-
-[source,shell]
-....
-# newfs /dev/da0p1
-....
-
-и смонтировать её:
-
-[source,shell]
-....
-# mount /dev/da0s1 /mnt
-....
+[[keyboard-delete-key]]
+=== Как использовать клавишу Delete в sh и csh?
-Хорошо ещё добавить строку в файл [.filename]#/etc/fstab# (прочтите справку по man:fstab[5]), чтобы в будущем можно было просто давать команду `mount /mnt`:
+Для оболочки Bourne Shell добавьте следующие строки в файл [.filename]#~/.shrc#:
[.programlisting]
....
-/dev/da0p1 /mnt ufs rw,noauto 0 0
-....
-
-[[mount-cd-superblock]]
-=== Почему при монтировании компакт-диска выдаётся сообщение Incorrect super block?
-
-Необходимо указать тип монтируемого устройства. Это описано в разделе
-Руководства extref:{handbook}disks/[Использование CD с данными, mounting-cd].
-
-[[cdrom-not-configured]]
-=== При монтировании компакт-диска выдаётся сообщение Device not configured.
-
-Обычно это означает, что в приводе нет компакт-диска либо устройство не
-обнаружено на шине. Обратитесь к разделу extref:{handbook}disks/[Использование
-CD с данными, mounting-cd] в Руководстве, где подробно обсуждается этот вопрос.
-
-[[cdrom-unicode-filenames]]
-=== Почему при монтировании CD-ROM во FreeBSD все неанглийские символы в именах файлов отображаются как вопросительные знаки?
-
-Скорее всего, на компакт-диске для хранения информации о файлах и каталогах используется расширение "Joliet". Это описано в разделе Руководства об
-extref:{handbook}disks/[использовании CD с данными, mounting-cd].
-
-[[burncd-isofs]]
-=== Записанный во FreeBSD CD не читается ни в какой другой операционной системой. Почему?
-
-Это означает, что на CD был записан непосредственно необработанный файл без создания файловой системы ISO 9660. Прочтите раздел Руководства об
-extref:{handbook}disks/[использовании CD с данными].
-
-[[copy-cd]]
-=== Как создать образ CD с данными?
-
-Это описано в разделе Руководства о extref:{handbook}disks/[записи данных на
-файловую систему ISO, mkisofs]. Более полную информацию о работе с
-компакт-дисками можно найти в разделе о extref:{handbook}disks/[создании
-компакт-дисков, creating-cds] в главе Руководства об устройствах хранения
-данных.
-
-[[mount-audio-CD]]
-=== Почему я не могу смонтировать аудио CD?
-
-Попытка смонтировать аудио CD приведёт к сообщению об ошибке вида `cd9660: /dev/acd0c: Invalid argument`. Причина этого заключается в том, что команда `mount` работает только с файловыми системами. На аудио CD файловых систем нет; они содержат только данные. Используйте вместо этого программу, которая умеет читать аудио CD, например, порт package:audio/xmcd[].
-
-[[multi-session-CD]]
-=== Как выполнить mount для многосеансового CD?
-
-По умолчанию man:mount[8] будет пытаться смонтировать последнюю дорожку (сеанс) CD с данными. Для загрузки более раннего сеанса используйте параметр командной строки `-s`. За конкретными примерами обращайтесь к странице Справочника man:mount_cd9660[8].
-
-[[user-floppymount]]
-=== Как разрешить обычным пользователям монтировать компакт-диски, DVD, USB-диски и другие сменные носители?
-
-Как пользователь `root`, установите системную переменную `vfs.usermount` в значение `1`.
-
-[source,shell]
-....
-# sysctl vfs.usermount=1
+bind ^[[3~ ed-delete-next-char # for xterm
....
-Чтобы это срабатывало во время загрузки системы, добавьте строчку `vfs.usermount=1` в файл [.filename]#/etc/sysctl.conf#.
-
-Пользователи могут монтировать только те устройства, к которым у них имеется доступ на чтение. Чтобы разрешить пользователям монтировать устройство, должны быть заданы разрешения в [.filename]#/etc/devfs.conf#.
-
-Например, чтобы разрешить пользователям монтировать первое устройство USB, добавьте такую строчку:
+Для оболочки C Shell добавьте следующие строки в файл [.filename]#~/.cshrc#:
[.programlisting]
....
-# Allow all users to mount a USB drive.
- own /dev/da0 root:operator
- perm /dev/da0 0666
-....
-
-Теперь все пользователи могут монтировать устройства с правами доступа на чтение в собственные каталоги:
-
-[source,shell]
-....
-% mkdir ~/my-mount-point
-% mount -t msdosfs /dev/da0 ~/my-mount-point
+bindkey ^[[3~ delete-char # for xterm
....
-Размонтирование устройства осуществляется просто:
-
-[source,shell]
-....
-% umount ~/my-mount-point
-....
+[[forgot-root-pw]]
+=== Я забыл пароль root! Что делать?
-Использование `vfs.usermount`, однако, имеет некоторые негативные стороны, связанные с вопросами безопасности. Более правильным способом работы с носителями в формате MS-DOS(R) является использование пакета package:emulators/mtools[] из Коллекции Портов.
+Не паникуйте! Перезагрузите систему, введите `boot -s` при появлении запроса `Boot:`, чтобы перейти в однопользовательский режим. На вопрос о выборе оболочки нажмите kbd:[Enter], после чего появится приглашение #. Введите `mount -urw /`, чтобы перемонтировать корневую файловую систему в режиме чтения/записи, затем выполните `mount -a` для перемонтирования всех файловых систем. Выполните `passwd root`, чтобы изменить пароль `root`, а затем введите man:exit[1] для продолжения загрузки.
-[NOTE]
+[TIP]
====
-Имя устройства, использованное в предыдущих примерах, должно быть изменено в соответствии с конфигурацией.
+Если при входе в однопользовательский режим всё ещё запрашивается пароль `root`, это означает, что консоль помечена как `insecure` в [.filename]#/etc/ttys#. В этом случае потребуется загрузиться с установочного диска FreeBSD, выбрать [.guimenuitem]#Live CD# или [.guimenuitem]#Shell# в начале процесса установки и выполнить указанные выше команды. Смонтируйте конкретный раздел в этом случае и затем выполните chroot для него. Например, замените `mount -urw /` на `mount /dev/ada0p1 /mnt; chroot /mnt` для системы на _ada0p1_.
====
-[[du-vs-df]]
-=== Команды du и df показывают разный объём доступного дискового пространства. Что происходит?
-
-Это связано с тем, как эти команды на самом деле работают. `du` проходит по дереву каталогов, подсчитывая, насколько большой объём занимает каждый файл, и выдает общий объем. `df` просто запрашивает файловую систему об оставшемся объеме. Это выглядит как одно и то же, однако файл без записи в каталоге затронет `df`, но не повлияет на `du`.
-
-Когда программа использует файл и этот файл удаляется, то на самом деле он не
-удаляется из файловой системы, пока программа не прекратит его использовать.
-Однако файл тут же удаляется из списка каталога. В качестве примера можно
-представить файл, размер которого достаточен, чтобы повлиять на результаты
-работы команд `du` и `df`. Любой файл, просматриваемый при помощи команды
-`more`, может быть удалён без выдачи сообщений об ошибке. Запись о файле
-просто удаляется из каталога, так что другие программы или пользователи не
-смогут к нему обратиться.
-Тем не менее, `du` покажет, что файл исчез, поскольку она просматривает дерево каталогов, а файла там нет. `df` показывает, что файл всё ещё здесь, так как файловая система знает, что `more` всё ещё использует это пространство. Как только закончится работа с `more`, команды `du` и `df` придут в соответствие.
-
-Такая ситуация часто встречается на Web-серверах.
-Многие устанавливают Web-сервер на FreeBSD и забывают выполнять ротацию файлов
-протоколов.
-Журнал доступа заполняет [.filename]#/var#.
-Новый администратор удаляет файл, но система всё ещё сообщает о том, что раздел
-заполнен.
-Остановка и перезапуск программы Web-сервера освободит файл, позволяя системе
-освободить дисковое пространство.
-Для предотвращения подобной ситуации настройте man:newsyslog[8].
-
-Заметьте, что подсистема отложенных обновлений (Soft Updates) может задерживать освобождение дискового пространства, и может потребоваться до 30 секунд, чтобы изменения стали заметны.
-
-=== Как добавить дополнительную виртуальную память?
-
-В этом разделе extref:{handbook}config/[Руководства, adding-swap-space]
-описывается, как это сделать.
-
-[[manufacturer-disk-size]]
-=== Почему FreeBSD считает, что размер моего диска меньше, чем заявляет его производитель?
-
-Производители дисков считают гигабайт равным миллиарду байт, а FreeBSD приравнивает его к 1073741824 байт. Это объясняет, почему, к примеру, в сообщениях при загрузке FreeBSD указывается, что ёмкость диска, объём которого должен быть равным 80 Гбайт, составляет 76319 Мбайт.
-
-Заметьте также, что FreeBSD будет (по умолчанию) <<disk-more-than-full,резервировать>> 8% ёмкости диска.
-
-[[disk-more-than-full]]
-=== Почему возможно заполнение раздела больше чем на 100%?
-
-Часть каждого раздела UFS (по умолчанию 8%) зарезервировано для использования операционной системой и пользователем `root`. Утилита man:df[1] не учитывает это при подсчёте значения в колонке `Capacity`, так что оно может превышать 100%. Обратите внимание, что колонка `Blocks` всегда больше, чем сумма значений в колонках `Used` и `Avail`, обычно на 8%.
-
-Для получения более подробной информации обратитесь к описанию опции `-m` в справке по man:tunefs[8].
-
-== ZFS
-
-=== Какой минимальный объём ОЗУ требуется для ZFS?
-
-Для комфортного использования требуется 4 Гбайт ОЗУ, но конкретная нагрузка может сильно различаться.
-
-[[what-is-zil]]
-=== Что такое ZIL и когда он используется?
-
-ZIL (ZFS intent log) представляет собой журнал операций записи, используемый
-для реализации логики подтверждения записи на диск в стандарте
-posix, которая работает при сбоях. При нормальной работе отдельные
-операции записи объединяются в группу транзакций и записываются на
-диск при заполнении группы ("Transaction Group Commit"). Однако системные
-вызовы типа man:fsync[2] требуют подтверждения записи данных на надёжное
-устройство перед возвратом управления. ZIL нужен для работы с операциями
-записи, которые были подтверждены как выполненные, но в рамках транзакции
-на диск ещё не записаны. Группы транзакций помечаются меткой
-времени. В случае сбоя выполняется поиск последней корректной
-метки и из ZIL извлекаются недостающие данные.
-
-[[need-ssd-for-zil]]
-=== Нужен ли мне SSD для ZIL?
-
-По умолчанию ZFS хранит ZIL в пуле со всеми данными.
-Если приложение интенсивно выполняет операции записи, то размещение
-ZIL на отдельном устройстве, обладающем высокими показателями
-скорости синхронной последовательной записи, может улучшить общую
-производительность системы. При другом характере нагрузки SSD вряд
-ли сможет что-то сильно улучшить.
-
-[[what-is-l2arc]]
-=== Что такое L2ARC?
-
-L2ARC - это кэш на чтение, хранимый на быстром устройстве, таком как SSD. Этот кэш не сохраняется между перезагрузками. Следует заметить, что ОЗУ выступает
-как кэширующее устройство первого уровня, а L2ARC необходим
-только при нехватке оперативной памяти.
-
-L2ARC требует пространства в ARC для его индексации. Таким образом, рабочий
-набор, который идеально помещается в ARC, не будет там помещаться при
-использовании L2ARC, поскольку часть ARC будет отведена под индекс L2ARC с
-вытеснением части рабочего набора в L2ARC, более медленный, чем ОЗУ.
-
-[[should-enable-dedup]]
-=== Целесообразно ли включение дедупликации?
-
-В общем случае нет.
-
-Дедупликация занимает значительный объём ОЗУ и может увеличить задержки операций ввода/вывода.
-Если только данные не являются сильно дублированными (сильно дублированными являются образы виртуальных машин или резервные копии пользовательских данных), то дедупликация может принести больше вреда, чем пользы.
-Другое соображение касается невозможности отменить статус дедупликации.
-Если данные записаны при включённой дедупликации, её выключение не приведёт к обратной репликации объединённых блоков до момента их модификации.
-
-Дедупликация также может приводить к некоторым неожиданным ситуациям.
-В частности, удаление файлов может сильно замедлиться.
-
-[[zpool-fully-full]]
-=== Я не могу создать или удалить файлы на пуле ZFS. Как я могу это исправить?
-
-Такое может произойти при 100% заполненности пула. ZFS требуется свободное место на диске для записи метаданных транзакций. Для восстановления работоспособного состояния пула обрежьте файл перед его удалением.
-
-[source,shell]
-....
-% truncate -s 0 unimportant-file
-....
-
-Обрезка файла работает по той причине, что новая транзакция при этом не
-запускается, но вместо этого создаются новые свободные блоки.
-
-[NOTE]
+[TIP]
====
-На системах с дополнительными настройками наборов данных ZFS,
-такими, как дедупликация, свободное место может не быть доступно сразу.
+Если корневой раздел не удаётся смонтировать в однопользовательском режиме, возможно, разделы зашифрованы, и их невозможно смонтировать без ключей доступа. Дополнительную информацию см. в разделе о зашифрованных дисках в extref:{handbook}disks/[Handbook, disks-encrypting].
====
-[[zfs-ssd-trim]]
-=== Поддерживается ли TRIM в ZFS для твердотельных накопителей?
-
-ZFS во FreeBSD 12.3 и 12.4: TRIM включен по умолчанию.
-Для отключения TRIM: добавьте строку ниже в файл
-[.filename]#/etc/sysctl.conf#, затем перезапустите систему.
-
-[.programlisting]
-....
-vfs.zfs.trim.enabled=0
-....
-
-OpenZFS во FreeBSD 13.0 и более старших версиях: обратитесь к
-man:zpool-trim[8] и изучите параметр `autotrim` в man:zpoolprops[7].
-
-== Системное администрирование
-
-[[startup-config-files]]
-=== Где расположены файлы конфигурации системы?
-
-Основным конфигурационным файлом является [.filename]#/etc/defaults/rc.conf#, который описан в man:rc.conf[5].
-Этот файл используют скрипты запуска системы, такие как [.filename]#/etc/rc# и [.filename]#/etc/rc.d#, которые описаны в man:rc[8].
-_Не редактируйте этот файл!_
-Вместо изменения параметра в [.filename]#/etc/defaults/rc.conf# скопируйте соответствующую строку в [.filename]#/etc/rc.conf# и поменяйте значение там.
-
-К примеру, для запуска man:sshd[8], поставляемого с системой сервера OpenSSH:
-
-[source,shell]
-....
-# echo 'sshd_enable="YES"' >> /etc/rc.conf
-....
-
-Альтернативным способом является использование man:sysrc[8] для
-корректировки [.filename]#/etc/rc.conf#:
-
-[source,shell]
-....
-# sysrc sshd_enable="YES"
-....
-
-Для запуска локальных сервисов поместите соответствующие скрипты в каталог [.filename]#/usr/local/etc/rc.d#. У этих скриптов должен быть выставлен бит выполнимости, по умолчанию используются права доступа `555`.
-
-[[adding-users]]
-=== Как проще всего добавить пользователя?
-
-Используйте команду man:adduser[8] или man:pw[8] в случае выполнения более сложных операций.
-
-Чтобы удалить пользователя, используйте команду man:rmuser[8] или, если это будет необходимо, man:pw[8].
-
-[[root-not-found-cron-errors]]
-=== Почему после редактирования моего файла crontab я получаю сообщения вида root: not found?
-
-Обычно это случается при редактировании системного файла crontab.
-
-Это неправильный подход, потому что системный crontab имеет формат, отличный от пользовательских crontab. Системный crontab имеет дополнительное поле, указывающее, под каким пользователем запускать команду. man:cron[8] полагает, что имя пользователя является первым словом в команде на выполнение. Поскольку такой команды не существует, отображается это сообщение об ошибке.
-
-Чтобы удалить лишний неправильный crontab:
-
-[source,shell]
-....
-# crontab -r
-....
-
-[[su-wheel-group]]
-=== Команда su выдаёт сообщение you are not in the correct group to su root, когда я пытаюсь сменить привилегии на root.
-
-Это особенность работы системы защиты. Для того, чтобы сменить пользовательский идентификатор с помощью `su` на пользователя `root` или любого другого с привилегиями суперпользователя, учётная запись должна являться членом группы `wheel`. Если бы этого не было, то любой, имеющий доступ к системе и узнавший пароль пользователя `root`, смог бы получить в системе уровень доступа суперпользователя.
-
-Чтобы разрешить кому-либо менять привилегии на `root`, включите его в группу `wheel` с помощью `pw`.
-
-[source,shell]
-....
-# pw groupmod wheel -m lisa
-....
-
-В примере выше пользователь `lisa` будет добавлен в группу `wheel`.
-
[[rcconf-readonly]]
-=== Я сделал ошибку в файле rc.conf или в каком-то другом файле начальной загрузки, и теперь не могу его отредактировать из-за того, что файловая система находится в режиме только для чтения. Что мне делать?
-
-Перезапустите систему, используя в приглашении загрузчика команду `boot -s` для входа в однопользовательский режим. При получении приглашения на ввод полного пути до командного процессора нажмите `Enter`, а затем выполните команду `mount -urw /` для повторного монтирования корневой файловой системы в режиме чтения/записи. Вам может также потребоваться выполнить команду `mount -a -t ufs` для монтирования файловой системы, в которой расположен ваш любимый текстовый редактор.
-Если редактор расположен на сетевой файловой системе, выполните сетевые настройки вручную до монтирования сетевой файловой системы, либо воспользуйтесь редактором, находящимся в локальной файловой системе, таким, как man:ed[1].
-
-Чтобы использовать полноэкранный редактор, такой как man:vi[1] или man:emacs[1], выполните команду `export TERM=xterm`, чтобы эти редакторы смогли получить корректную информацию из базы данных man:termcap[5].
-
-После выполнения этих шагов отредактируйте файл [.filename]#/etc/rc.conf# для исправления ошибки. Сообщение об ошибке, выводимое сразу же после сообщений при загрузке ядра, должно указать на номер строки в файле, которая содержит ошибку.
-
-[[printer-setup]]
-=== Почему у меня возникают проблемы с установкой принтера?
-
-Обратитесь к соответствующему extref:{handbook}printing/[разделу] Руководства, посвящённому печати, за советами по разрешению проблем.
-
-[[keyboard-mappings]]
-=== Как я могу откорректировать раскладку клавиатуры для моей системы?
-
-Обратитесь к разделу Руководства, посвящённому extref:{handbook}l10n/[использованию локализации, using-localization], а именно к части, описывающей extref:{handbook}l10n/[настройку консоли, setting-console].
-
-[[user-quotas]]
-=== Почему не получается заставить работать дисковые квоты?
-
-. Возможно, что ядро не сконфигурировано должным образом для работы с квотами. В этом случае добавьте следующую строчку в конфигурационный файл ядра и пересоберите ядро:
-+
-[.programlisting]
-....
-options QUOTA
-....
-
-+
-Прочтите link:{handbook}disks/[главу Руководства по квотам, quotas] для
-получения полной информации.
-. Не включайте квотирование на разделе [.filename]#/#.
-. Помещайте файл с квотами в ту файловую систему, которую он обслуживает:
-+
-[.informaltable]
-[cols="1,1", frame="none", options="header"]
-|===
-| Файловая система
-| Файл квот
-
-|[.filename]#/usr#
-|[.filename]#/usr/admin/quotas#
-
-|[.filename]#/home#
-|[.filename]#/home/admin/quotas#
-
-|...
-|...
-|===
-
-[[sysv-ipc]]
-=== Поддерживает ли FreeBSD вызовы IPC из System V?
-
-Да, во FreeBSD в ядро [.filename]#GENERIC# включена поддержка IPC в стиле System V, в том числе совместно используемой памяти, сообщений и семафоров.
-В нестандартном ядре поддержка может быть включена посредством загрузки модулей ядра [.filename]#sysvshm.ko#, [.filename]#sysvsem.ko# и [.filename]#sysvmsg.ko# или добавлением в конфигурационный файл ядра следующих строк:
+=== Я допустил ошибку в rc.conf или другом стартовом файле, и теперь не могу его отредактировать, потому что файловая система доступна только для чтения. Что мне делать?
-[.programlisting]
-....
-options SYSVSHM # enable shared memory
-options SYSVSEM # enable for semaphores
-options SYSVMSG # enable for messaging
-....
-
-Перекомпилируйте и переустановите ядро.
-
-[[sendmail-alternative]]
-=== Какое другое программное обеспечение для почтового сервера можно использовать вместо Sendmail?
-
-Сервер http://www.sendmail.org/[Sendmail] является программным обеспечением для работы почтового сервера во FreeBSD, используемым по умолчанию, но его можно заменить другим MTA, установленным из Коллекции Портов. В дереве портов имеется package:mail/exim[], package:mail/postfix[] и package:mail/qmail[]. Проверьте архивы списков рассылки на предмет обсуждения достоинств и недостатков имеющихся MTA.
-
-[[forgot-root-pw]]
-=== Я забыл пароль пользователя root! Что делать?
-
-Без паники!
-Перезапустите систему, наберите `boot -s` в приглашении `Boot:` для входа в
-однопользовательский режим.
-На вопрос об используемой оболочке нажмите kbd:[Enter] для получения # в качестве приглашения.
-Выполните команду `mount -urw /`, чтобы перемонтировать корневую файловую
-систему в режиме чтения/записи, после чего выполните команду `mount -a` для
-монтирования всех файловых систем.
-Запустите команду `passwd root`, чтобы сменить пароль пользователя `root`, а затем man:exit[1] для продолжения процесса загрузки.
-
-[NOTE]
-====
-Если при входе в однопользовательский режим предлагается ввести пароль пользователя `root`, это означает, что консоль была помечена как `insecure` в [.filename]#/etc/ttys#. В этом случае потребуется загрузиться с установочного диска FreeBSD, выбрать [.guimenuitem]#Live CD# или [.guimenuitem]#Shell# в начале процесса установки и выполнить указанные выше команды. В этом случае смонтируйте нужный раздел и выполните туда chroot. Например, замените команду `mount -urw /` на `mount /dev/ada0p1 /mnt; chroot /mnt` для системы, расположенной на _ada0p1_.
-====
-
-[NOTE]
-====
-Если корневой раздел не получается смонтировать в однопользовательском режиме, то возможно, что разделы являются зашифрованными, и смонтировать их без ключей доступа не представляется возможным.
-За дополнительной информацией обратитесь к разделу extref:{handbook}disks/[Руководства, disks-encrypting], посвящённому шифрованию дисков во FreeBSD.
-====
-
-[[CAD-reboot]]
-=== Как запретить перезагрузку по нажатию Control Alt Delete?
+Перезагрузите систему, используя `boot -s` в приглашении загрузчика, чтобы войти в однопользовательский режим. При запросе пути к оболочке нажмите kbd:[Enter] и выполните `mount -urw /`, чтобы перемонтировать корневую файловую систему в режиме чтения/записи. Также может потребоваться выполнить `mount -a -t ufs` для монтирования файловой системы, где находится ваш предпочитаемый редактор. Если этот редактор находится на сетевой файловой системе, либо настройте сеть вручную перед монтированием сетевых файловых систем, либо используйте редактор, расположенный на локальной файловой системе, например, man:ed[1].
-При использовании стандартного драйвера консоли man:vt[4] этого можно добиться,
-задав следующий системный параметр man:sysctl[8]:
+Чтобы использовать полноэкранные редакторы, такие как man:vi[1] или man:emacs[1], выполните команду `export TERM=xterm`, чтобы эти редакторы могли загрузить корректные данные из базы man:termcap[5].
-[source,shell]
-....
-# sysctl kern.vt.kbd_reboot=0
-....
-
-=== Как преобразовать текстовые файлы DOS в формат UNIX(R)?
-
-Воспользуйтесь следующей командой man:perl[1]:
-
-[source,shell]
-....
-% perl -i.bak -npe 's/\r\n/\n/g' file(s)
-....
-
-где _file(s)_ - это один или несколько файлов для обработки. Преобразование делается в том же самом файле, оригинальные файлы сохраняются с расширением [.filename]#.bak#.
-
-Либо используйте man:tr[1]:
-
-[source,shell]
-....
-% tr -d '\r' < dos-text-file > unix-file
-....
-
-где _dos-text-file_ - это имя файла, содержащего текст DOS, а в файл _unix-file_ будет помещён уже преобразованный текст. Этот способ может работать гораздо быстрее, чем при использовании `perl`.
-
-Еще один способ отформатировать тестовые файлы DOS состоит в использовании package:converters/dosunix[] из Коллекции Портов. Для получения дополнительной информации ознакомьтесь с документацией порта.
-
-[[reread-rc]]
-=== Как перечитать содержимое /etc/rc.conf и перестартовать /etc/rc без перезагрузки системы?
-
-Перейдите в однопользовательский режим, а затем возвратитесь обратно в многопользовательский.
-
-[source,shell]
-....
-# shutdown now
-# return
-# exit
-....
-
-[[release-candidate]]
-=== Я пытался обновить мою систему до последней -STABLE, а получил -BETAx, -RC или -PRERELEASE! Что происходит?
-
-Краткий ответ: это же просто название. _RC_ означает "Release Candidate". Это значит, что вскоре произойдет выход релиза. Во FreeBSD появление _-PRERELEASE_, как правило, равнозначно прекращению внесения изменений в код системы перед появлением релиза. (Для некоторых релизом метка _-BETA_ использовалась точно так же, как и _-PRERELEASE_.)
-
-Подробный ответ: во FreeBSD релизы выпускаются из одного из двух мест. Крупные релизы, точка-ноль, такие, как 9.0-RELEASE и 10.0-RELEASE, ответвляются от основного потока разработки, более известного как <<current,-CURRENT>>. Мелкие релизы, такие, как 6.3-RELEASE или 5.2-RELEASE, являлись снэпшотами активной ветки <<stable,-STABLE>>. Начиная с 4.3-RELEASE, каждый релиз также имеет свою ветвь, которой могут следовать те, кому необходим сверхконсервативный метод обновления (как правило, внесение только тех исправлений, которые касаются вопросов обеспечения безопасности).
-
-Когда делается релиз, то ветвь, из которой он выпускается, подвергается некоторой подготовке. Частью этого процесса является замораживание кода. Когда инициируется замораживание кода, то имя ветки изменяется для того, чтобы отразить факт близости релиза. Например, если ветка называлась 6.2-STABLE, то её имя будет изменено на 6.3-PRERELEASE, чтобы обозначить момент прекращения внесения изменений в код системы и период дополнительного тестирования перед выходом релиза. В это время исправления ошибок могут быть внесены в код системы для того, чтобы быть включенными в релиз. Когда исходный код подготовлен к выпуску релиза, имя будет изменено на 6.3-RC для обозначения того, что релиз будет сделан, скорее всего, именно из этого кода. Когда код находится на этапе RC, в нём могут исправляться только самые критичные ошибки. Как только релиз (в нашем примере 6.3-RELEASE) и ветка релиза будут созданы, ветвь будет переименована в 6.3-STABLE.
-
-Для получения дополнительной информации о номерах версий и различных ветках Git обратитесь к статье о extref:{releng}[выпуске релизов].
-
-[[kernel-chflag-failure]]
-=== Я попытался установить новое ядро, однако утилита man:chflags[1] не сработала. Как это обойти?
-
-Краткий ответ: Режим безопасности имеет значение больше нуля. Для установки ядра перезагрузите машину и войдите в однопользовательский режим.
-
-Подробный ответ: FreeBSD запрещает менять системные флаги при работе на уровнях безопасности, превышающих 0. Чтобы проверить текущий уровень безопасности:
-
-[source,shell]
-....
-# sysctl kern.securelevel
-....
-
-Уровень безопасности нельзя понизить в многопользовательском режиме, поэтому для установки ядра загрузитесь в однопользовательский режим, или измените уровень безопасности в [.filename]#/etc/rc.conf#, а затем выполните перезагрузку. Обратитесь к странице Справочника по man:init[8] за подробной информацией о `securelevel` и посмотрите [.filename]#/etc/defaults/rc.conf# и справочную страницу по man:rc.conf[5] для выяснения подробностей о файле [.filename]#rc.conf#.
-
-[[kernel-securelevel-time]]
-=== Не получается изменить системное время больше чем на одну секунду! Как это обойти?
-
-Краткий ответ: Система работает на уровне безопасности со значением выше 1. Для смены даты перезагрузите машину и войдите в однопользовательский режим.
-
-Подробный ответ: FreeBSD запрещает менять системное время больше чем на одну секунду на уровне безопасности выше 1. Чтобы определить уровень безопасности:
-
-[source,shell]
-....
-# sysctl kern.securelevel
-....
-
-Уровень безопасности нельзя понизить в многопользовательском режиме. Для изменения даты перезагрузите систему в однопользовательский режим, либо измените уровень безопасности в [.filename]#/etc/rc.conf#, а затем выполните перезагрузку. Обратитесь к странице Справочника по man:init[8] за подробной информацией о `securelevel` и посмотрите [.filename]#/etc/defaults/rc.conf# и справочную страницу по man:rc.conf[5] для выяснения подробностей о файле [.filename]#rc.conf#.
-
-[[statd-mem-leak]]
-=== Для чего rpc.statd использует 256 Мбайт оперативной памяти?
-
-Нет, это не ошибка утечки памяти и он не использует 256 Мбайт оперативной памяти.
-Для удобства `rpc.statd` отображает большой объём памяти в своё адресное пространство.
-Здесь нет ничего ужасно неправильного с технической точки зрения; просто это сбивает с толку программы вроде man:top[1] и man:ps[1].
-
-man:rpc.statd[8] отображает свой статусный файл ([.filename]#/var/db/statd.status#) в сообственное адресное пространство; для того, чтобы избежать последующих беспокойств о повторном отображении статусного файла в память, когда его размер нужно будет увеличить, под этот файл выделяется щедро заданный объём.
-
-[[unsetting-schg]]
-=== Почему я не могу снять с файла флаг schg?
-
-Система работает на уровне защиты выше нуля. Понизьте уровень защиты и
-попробуйте ещё раз. Для получения более подробной информации обратитесь к
-<<securelevel,разделу FAQ об уровне защиты>> и справочной странице man:init[8].
-
-[[vnlru]]
-=== Что такое vnlru?
-
-`vnlru` сбрасывает и освобождает vnode, когда система достигает ограничения по параметру `kern.maxvnodes`. Этот поток ядра в основном работает вхолостую и активируется только при наличии огромного объема ОЗУ и обращении к десяткам тысяч файлов небольшого размера.
-
-[[top-memory-states]]
-=== Что означают различные состояния памяти, показываемые утилитой top?
-
-* `Active`: по статистике страницы недавно использовались.
-* `Inactive`: по статистике страницы недавно не использовались.
-* `Laundry`: страницы, которые, согласно статистике, давно не использовались,
-но содержат данные, то есть их содержимое необходимо сохранить перед тем, как
-повторно использовать.
-* `Free`: страницы, не содержащие данных, и которые можно повторно использовать
-прямо сейчас.
-* `Wired`: страницы, зафиксированные в памяти, обычно для использования ядром, а также иногда для специального использования процессами.
-
-Страницы чаще всего записываются на диск (типа синхронизации VM), когда они находятся в состоянии Laundry, однако синхронизироваться могут также и страницы в состоянии Active и Inactive.
-Это зависит от возможности отслеживания центральным процессором бита 'модифицированности', и в некоторых ситуациях это может быть лучше для блока синхронизируемых страниц VM, вне зависимости от их принадлежности к той или иной очереди.
-В большинстве встречающихся ситуаций лучше всего представлять очередь Laundry как очередь условно неиспользуемых страниц, которые могут быть, а могут и не быть в процессе записи на диск.
-Очередь Inactive содержит как чистые, так и грязные страницы; чистые страницы ближе к голове очереди потребляются сразу же для восполнения нехватки свободных страниц памяти, а грязные страницы перемещаются в очередь Laundry для последующей обработки.
-
-Есть ещё некоторые другие флаги (например, флаг занятости или счётчик занятости), которые могут влиять на описанные правила.
+После выполнения этих действий отредактируйте файл [.filename]#/etc/rc.conf#, чтобы исправить синтаксическую ошибку. Сообщение об ошибке, отображаемое сразу после сообщений загрузки ядра, должно указывать номер строки в файле, в которой допущена ошибка.
[[free-memory-amount]]
=== Сколько свободной памяти доступно?
-Есть пара определений "свободной памяти".
-В наиболее распространённом случае это объём памяти, доступной к немедленному потреблению без высвобождения уже используемой.
-Этот объём равен объёму очереди свободных страниц вместе с некоторыми другими зарезервированными страницами.
-Этот размер доступен в виде man:sysctl[8]-переменной `vm.stats.vm.v_free_count`, которая показывается, например, утилитой man:top[1].
-Во втором случае "свободная память" обозначает общий объём виртуальной памяти, доступной пользовательским процессам, который зависит от объёма раздела подкачки и доступной к использованию оперативной памяти.
-Другие определения "свободной памяти" также возможны, но они достаточно бесполезны, ведь в любом случае важно сохранять низкий уровень подкачки и избегать исчерпания раздела подкачки.
+Существует несколько видов "свободной памяти". Наиболее распространенный - это объем памяти, который доступен немедленно, без освобождения уже используемой памяти. Это размер очереди свободных страниц плюс некоторые другие зарезервированные страницы. Этот объем отображается через `vm.stats.vm.v_free_count` man:sysctl[8] и, например, выводится man:top[1]. Другой вид "свободной памяти" - это общий объем виртуальной памяти, доступной пользовательским процессам, который зависит от суммы swap-пространства и используемой памяти. Возможны и другие определения "свободной памяти", но их описание относительно бесполезно; гораздо важнее следить за тем, чтобы частота подкачки оставалась низкой, и избегать исчерпания swap-пространства.
-[[var-empty]]
-=== Что такое [.filename]#/var/empty#?
-
-[.filename]#/var/empty# представляет собой каталог, который используется в программе man:sshd[8] при выполнении разделения полномочий. Каталог [.filename]#/var/empty# пуст, его владельцем является `root`, и на нём установлен флаг `schg`. Этот каталог не должен удаляться.
-
-[[newsyslog-expectations]]
-=== Я поменял /etc/newsyslog.conf. Как проверить правильность изменений?
-
-Чтобы посмотреть, что будет делать man:newsyslog[8], используйте следующую команду:
-
-[source,shell]
-....
-% newsyslog -nrvv
-....
-
-=== Как поправить часовой пояс?
+[[timezone]]
+=== Мое время указано неверно, как я могу изменить часовой пояс?
Используйте man:tzsetup[8].
-== X Window System и виртуальные консоли
-
-[[whatis-X]]
-=== Что такое X Window System?
-
-X Window System (обычно `X11`) является наиболее общедоступной оконной системой, которая может работать на UNIX(R) и UNIX(R)-подобных системах, в том числе и во FreeBSD. Разработкой стандартов на используемый http://en.wikipedia.org/wiki/X_Window_System_core_protocol[X-протокол] занимается организация http://www.x.org/wiki/[The X.Org Foundation], с текущей эталонной реализацией version 11 release 7.7, поэтому название часто сокращается до `X11`.
-
-Для разных архитектур и операционных систем существует множество реализаций этой системы. Реализацию кода для серверной части называют `X-сервером`.
-
-[[running-X]]
-=== Я хочу запустить Xorg, как это сделать?
-
-Для установки Xorg выполните одно из действий:
-
-Используйте мета-порт [.filename]#x11/xorg#, который выполняет построение и установку всех компонентов Xorg.
-
-Используйте [.filename]#x11/xorg-minimal#, который выполняет построение и установку только необходимых компонентов Xorg.
-
-Установите Xorg из пакетов FreeBSD.
-
-[source,shell]
-....
-# pkg install xorg
-....
-
-После установки Xorg следуйте указаниям в разделе
-extref:{handbook}x11/[Конфигурация X11, x-config] Руководства по FreeBSD.
-
-[[running-X-securelevels]]
-=== Я попытался запустить X, но получил сообщение 'No devices detected' после ввода команды startx. Что мне теперь делать?
-
-Вероятно, в системе установлен повышенный уровень безопасности (`securelevel`). При повышенном уровне защиты систему X запустить невозможно, потому что X требуются права на операции записи в устройство man:io[4]. Дополнительная информация находится на странице Справочника man:init[8].
-
-Существует два решения проблемы: возвратить нулевое значение `securelevel` или запускать man:xdm[8] (или любой другой менеджер дисплеев) во время загрузки, до того, как будет повышено значение `securelevel`.
-
-Обратитесь к <<xdm-boot>> для получения более полной информации о запуске
-man:xdm[8] во время загрузки.
-
-[[x-and-moused]]
-=== Почему моя мышь не работает с X?
-
-При использовании стандартного драйвера консоли man:vt[4] во FreeBSD можно включить поддержку указателя мыши во всех виртуальных экранах. Во избежание конфликтов с X, драйвер man:vt[4] поддерживает виртуальное устройство [.filename]#/dev/sysmouse#. Все события от реального устройства мыши пишутся в устройство man:sysmouse[4] через man:moused[8]. Чтобы использовать мышь на одной и более виртуальных консолях, и при этом продолжать использовать X, посмотрите <<moused>> и настройте man:moused[8].
-
-Затем отредактируйте [.filename]#/etc/X11/xorg.conf#, чтобы в нём были следующие строки:
-
-[.programlisting]
-....
-Section "InputDevice"
- Option "Protocol" "SysMouse"
- Option "Device" "/dev/sysmouse"
-.....
-....
-
-Начиная с версии Xorg 7.4 раздел `InputDevice` в файле [.filename]#xorg.conf# игнорируется, и вместо него используется механизм автоматически определяемых устройств. Чтобы восстановить прежнее поведение, добавьте в раздел `ServerLayout` или `ServerFlags` такую строку:
-
-[.programlisting]
-....
-Option "AutoAddDevices" "false"
-....
-
-Некоторые предпочитают использовать в X устройство [.filename]#/dev/mouse#. Чтобы оно работало, файл устройства [.filename]#/dev/mouse# должен являться ссылкой на [.filename]#/dev/sysmouse# (посмотрите справку по man:sysmouse[4]). Это можно сделать, добавив следующую строку в [.filename]#/etc/devfs.conf# (посмотрите справку по man:devfs.conf[5]):
-
-[.programlisting]
-....
-link sysmouse mouse
-....
-
-Ссылка может быть создана путем перезапуска man:devfs[5] с использованием следующей команды (из под пользователя `root`):
-
-[source,shell]
-....
-# service devfs restart
-....
-
-[[x-and-wheel]]
-=== У моей мыши есть колёсико. Могу ли я его использовать при работе в X?
-
-Да, если X настроена для использования 5-кнопочной мыши. Для этого добавьте строчки `Buttons 5` и `ZAxisMapping 4 5` в раздел "InputDevice" файла [.filename]#/etc/X11/xorg.conf# как показано в этом примере:
-
-[.programlisting]
-....
-Section "InputDevice"
- Identifier "Mouse1"
- Driver "mouse"
- Option "Protocol" "auto"
- Option "Device" "/dev/sysmouse"
- Option "Buttons" "5"
- Option "ZAxisMapping" "4 5"
-EndSection
-....
-
-Использование мыши может быть активировано в Emacs путём добавления в
-[.filename]#~/.emacs# следующих строк:
-
-[.programlisting]
-....
-;; wheel mouse
-(global-set-key [mouse-4] 'scroll-down)
-(global-set-key [mouse-5] 'scroll-up)
-....
-
-=== Как заставить работать тачпад Synaptics в X?
-
-Для его работы понадобится настроить некоторые вещи.
-
-Чтобы использовать драйвер synaptics из Xorg, для начала удалите строку moused_enable из [.filename]#rc.conf#.
-
-Для включения synaptics добавьте следующую строку в [.filename]#/boot/loader.conf#:
-
-[.programlisting]
-....
-hw.psm.synaptics_support="1"
-....
-
-Добавьте следующее в [.filename]#/etc/X11/xorg.conf#:
-
-[.programlisting]
-....
-Section "InputDevice"
-Identifier "Touchpad0"
-Driver "synaptics"
-Option "Protocol" "psm"
-Option "Device" "/dev/psm0"
-EndSection
-....
-
-Добавьте в раздел "ServerLayout" вот что:
-
-[.programlisting]
-....
-InputDevice "Touchpad0" "SendCoreEvents"
-....
-
-=== Как использовать удалённые X-дисплеи?
-
-Из соображений обеспечения информационной безопасности открывать удалённые окна на машине по умолчанию запрещено.
-
-Для включения этой возможности запустите X с аргументом `-listen_tcp`:
-
-[source,shell]
-....
-% startx -listen_tcp
-....
-
-=== Что такое виртуальные консоли и как изменить их количество?
-
-Виртуальные консоли предоставляют несколько одновременных сеансов работы с той же самой машиной без установки какой бы то ни было сети или запуска X.
-
-При запуске системы после вывода сообщений этапа загрузки на консоль выдаётся приглашение для входа в систему. Введите своё имя и пароль, чтобы начать работу на первой виртуальной консоли.
-
-Чтобы запустить ещё один сеанс, скажем, чтобы заглянуть в документацию по программе или для чтения электронной почты во время ожидания завершения передачи данных по FTP, нажмите kbd:[F2], удерживая kbd:[Alt]. Это отобразит приглашение на второй виртуальной консоли. Чтобы вернуться к первоначальному сеансу, нажмите kbd:[Alt+F1].
-
-По умолчанию во FreeBSD задействованы восемь виртуальных консолей, а комбинации клавиш kbd:[Alt+F1], kbd:[Alt+F2], kbd:[Alt+F3] и далее служат для переключения между ними.
-
-Чтобы увеличить количество виртуальных консолей, отредактируйте [.filename]#/etc/ttys# (смотрите страницу Справочника man:ttys[5]), добавив туда записи для терминалов с именами от [.filename]#ttyv8# до [.filename]#ttyvc# после комментария про "Virtual terminals":
-
-[.programlisting]
-....
-# Edit the existing entry for ttyv8 in /etc/ttys and change
-# "off" to "on".
-ttyv8 "/usr/libexec/getty Pc" xterm on secure
-ttyv9 "/usr/libexec/getty Pc" xterm on secure
-ttyva "/usr/libexec/getty Pc" xterm on secure
-ttyvb "/usr/libexec/getty Pc" xterm on secure
-....
-
-Чем больше виртуальных терминалов, тем больше ресурсов используется. Это может привести к проблемам на системах с 8 Мбайт ОЗУ или меньше. Подумайте о смене статуса консолей с `secure` на `insecure`.
-
-[IMPORTANT]
-====
-Чтобы запустить сервер X, нужно зарезервировать под него хотя бы один виртуальный терминал со значением `off`. Это означает, что под виртуальные консоли можно отвести только одиннадцать функциональных клавиш, и ещё одна остаётся за X-сервером.
-====
-
-Например, чтобы запустить X и 11 виртуальных консолей, нужно настроить двенадцатый виртуальный терминал:
-
-[.programlisting]
-....
-ttyvb "/usr/libexec/getty Pc" xterm off secure
-....
-
-Самым простым способом активировать виртуальные консоли является перезагрузка.
-
-[[vty-from-x]]
-=== Как осуществляется доступ к виртуальным консолям из X?
-
-Используйте комбинацию клавиш kbd:[Ctrl+Alt+Fn] для переключения обратно в виртуальную консоль. Нажмите kbd:[Ctrl+Alt+F1], чтобы вернуться на первую виртуальную консоль.
-
-После того, как вы оказались в текстовой консоли, используйте комбинации kbd:[Alt+Fn] для переключения между ними.
-
-Чтобы вернуться в сеанс работы X, переключитесь в виртуальную консоль, на которой запущена X Window.
-Если X была запущена из командной строки с использованием команды `startx`, то сеанс работы X будет привязан к следующей неиспользуемой виртуальной консоли, а не к той текстовой консоли, с которой она была запущен.
-В случае восьми активных виртуальных терминалов X будет работать на девятом, поэтому используйте комбинацию kbd:[Alt+F9].
-
-[[xdm-boot]]
-=== Как запустить XDM во время загрузки?
-
-Есть две философские школы, проповедующие различные методы запуска man:xdm[8].
-Последователи одного течения запускают `xdm` из [.filename]#/etc/ttys#
-(посмотрите man:ttys[5]), используя приводимый там пример, тогда как другие
-устанавливают значение параметра `xdm_enable=yes` в [.filename]#/etc/rc.conf#.
-Оба метода равноправны, и один из них может работать в ситуациях, с которыми не
-справляется другой, и наоборот. В обоих случаях результат один и тот же: X
-выводит графическое приглашение для входа в систему.
-
-Плюсом метода с использованием man:ttys[5] является документирование того, на каком vty будет запущен X и то, что ответственность за перезапуск X-сервера при завершении сеанса работы лежит на процессе man:init[8]. Метод с использованием man:rc[8] позволяет просто прекратить работу xdm командой `kill xdm`, если при запуске X возникли какие-нибудь проблемы.
-
-При использовании метода с man:rc[8] значение `xdm_tty` (которое по умолчанию
-определено как `ttyv8`) может быть задано в файле [.filename]#/etc/rc.conf#
-для указания виртуального терминала, на котором запускается man:xdm[8].
-
-[[xconsole-failure]]
-=== При запуске xconsole выдаётся сообщение Couldn't open console.
-
-Если X запускается с помощью startx, права на устройство [.filename]#/dev/console#_не_ изменяются, поэтому такие программы как xterm -C и xconsole не будут работать.
-
-Это зависит от прав доступа, установленных для консоли по умолчанию. В многопользовательской системе вовсе не нужно, чтобы любой пользователь мог выводить информацию на системную консоль. Для пользователей, вошедших в систему через VTY, для решения этой проблемы существует файл man:fbtab[5].
-
-В общем, раскомментируйте строчку в файле [.filename]#/etc/fbtab# (посмотрите справку по man:fbtab[5]):
-
-[.programlisting]
-....
-/dev/ttyv0 0600 /dev/console
-....
-
-Этого будет достаточно для того, чтобы всякий, кто вошёл в систему с терминала [.filename]#/dev/ttyv0#, имел доступ к консоли.
-
-[[ps2-x]]
-=== Моя мышь PS/2 в X работает неправильно.
-
-Мышь и драйвер могли рассинхронизироваться. В редких случаях драйвер может ошибочно сообщать о проблемах синхронизации:
-
-[.programlisting]
-....
-psmintr: out of sync (xxxx != yyyy)
-....
-
-Если это случилось, отмените проверку согласования, установив значение флага для драйвера мыши PS/2 в `0x100`. Проще всего это сделать добавлением `hint.psm.0.flags="0x100"` в [.filename]#/boot/loader.conf# с перезагрузкой.
-
-[[mouse-button-reverse]]
-=== Как поменять местами кнопки мыши?
-
-Наберите `xmodmap -e "pointer = 3 2 1"`. Добавьте эту команду в [.filename]#~/.xinitrc# или [.filename]#~/.xsession# для автоматического запуска.
-
-[[install-splash]]
-=== Как установить экранную заставку и где такие заставки можно найти?
-
-Подробный ответ находится в разделе extref:{handbook}[Загрузочные
-экранные заставки, boot-splash] Руководства FreeBSD.
-
-=== Можно ли в X задействовать kbd:[Windows]-клавиши на клавиатуре?
-
-Да.
-Воспользуйтесь man:xmodmap[1] для привязки функций к этим клавишам.
-
-Если все клавиатуры Windows стандартны, то эти три клавиши имеют следующие клавиатурные коды:
-
-* 115 - клавиша kbd:[Windows] между клавишами kbd:[Ctrl] и kbd:[Alt] с левой стороны
-* 116 - клавиша kbd:[Windows] справа от kbd:[AltGr]
-* 117 - клавиша kbd:[Menu], слева от клавиши kbd:[Ctrl], находящейся справа
-
-Чтобы заставить левую клавишу kbd:[Windows] набирать запятую, попробуйте выполнить такую команду:
-
-[source,shell]
-....
-# xmodmap -e "keycode 115 = comma"
-....
-
-Для того, чтобы переопределения клавиш kbd:[Windows] выполнялись автоматически каждый раз при запуске X, поместите команды `xmodmap` в [.filename]#~/.xinitrc# либо, что предпочтительней, создайте файл [.filename]#~/.xmodmaprc# и включите в него параметры `xmodmap` по одному на строку, затем добавьте в [.filename]#~/.xinitrc# такую строку:
-
-[.programlisting]
-....
-xmodmap $HOME/.xmodmaprc
-....
-
-Например, чтобы переопределить эти 3 клавиши так, чтобы они выполняли функции клавиш kbd:[F13], kbd:[F14] и kbd:[F15]. Это позволит легко привязать их к полезным функциям в приложениях или менеджере окон.
-
-Чтобы сделать это, поместите такие строки в файл [.filename]#~/.xmodmaprc#:
-
-[.programlisting]
-....
-keycode 115 = F13
-keycode 116 = F14
-keycode 117 = F15
-....
-
-При использовании менеджера рабочего стола package:x11-wm/fvwm2[] клавиши можно переопределить так, чтобы нажатие kbd:[F13] сворачивало в иконку (и восстанавливало предыдущий размер) того окна, на которое указывает курсор, kbd:[F14] перемещало окно с курсором на передний план или, если оно уже впереди, возвращало обратно, а kbd:[F15] вызывало главное меню Workplace, даже если курсор находится не на рабочем столе, что бывает полезно, когда рабочий стол совсем не виден.
-
-Следующие записи в [.filename]#~/.fvwmrc# позволяют достичь описанных выше функций:
-
-[.programlisting]
-....
-Key F13 FTIWS A Iconify
-Key F14 FTIWS A RaiseLower
-Key F15 A A Menu Workplace Nop
-....
-
-[[x-3d-acceleration]]
-=== Как активировать аппаратное ускорение 3D-графики для OpenGL(R)?
-
-Наличие 3D-ускорения зависит от версии сервера Xorg и типа графического
-адаптера. Для адаптера nVidia используйте предскомпилированный драйвер для
-FreeBSD, установив один из нижеследующих портов:
-
-Последние версии адаптеров nVidia поддерживаются портом
-package:x11/nvidia-driver[].
-
-Более старые драйверы доступны в следующем виде:
-
-* package:x11/nvidia-driver-390[]
-* package:x11/nvidia-driver-340[]
-* package:x11/nvidia-driver-304[]
-
-nVidia предоставляет подробную информацию о том, какие адаптеры поддерживаются тем или иным драйвером, на своём сайте: http://www.nvidia.com/object/IO_32667.html[http://www.nvidia.com/object/IO_32667.html].
-
-Для адаптеров Matrox G200/G400 следует попробовать порт
-package:x11-drivers/xf86-video-mga[].
-
-Для ATI Rage 128 и Radeon посмотрите страницы Справочника man:ati[4], man:r128[4] и man:radeon[4].
-
-== Работа в сети
-
-[[diskless-booting]]
-=== Где можно найти информацию о бездисковой загрузке?
-
-"Бездисковая загрузка" означает, что машина с FreeBSD загружается по сети и
-читает необходимые файлы с сервера, а не со своего диска. Подробное описание
-есть в extref:{handbook}advanced-networking/[соответствующей главе,
-network-diskless] Руководства.
-
-[[router]]
-=== Может ли машина с FreeBSD использоваться как выделенный маршрутизатор?
-
-Да.
-Обратитесь к разделу Руководства, посвящённому
-extref:{handbook}advanced-networking/[сложным вопросам работы в сети, advanced-networking], а
-именно к той части, где рассказывается о extref:{handbook}advanced-networking/[маршрутизации и шлюзах маршрутизации, network-routing].
-
-[[natd]]
-=== Поддерживает ли FreeBSD технологию NAT или Masquerading?
-
-Да.
-Для получения указаний по использованию NAT через подключение PPP
-обратитесь к extref:{handbook}}ppp-and-slip/[разделу Руководства о PPP, userppp].
-Чтобы использовать NAT вместе с другим типом сетевого подключения, взгляните
-на раздел Руководства, посвящённый extref:[natd, network-natd].
-
-[[ethernet-aliases]]
-=== Как настроить алиас в сети Ethernet?
-
-Если алиас находится в той же самой сети, что и уже настроенный на интерфейсе адрес, допишите к этой команде `netmask 0xffffffff`:
-
-[source,shell]
-....
-# ifconfig ed0 alias 192.0.2.2 netmask 0xffffffff
-....
-
-В противном случае укажите сетевой адрес и маску обычным образом:
-
-[source,shell]
-....
-# ifconfig ed0 alias 172.16.141.5 netmask 0xffffff00
-....
-
-Дополнительная информация может быть найдена в extref:{handbook}config/[Руководстве,
-configtuning-virtual-hosts] по FreeBSD.
-
-=== Почему я не могу смонтировать диск Linux(R) по NFS?
-
-Некоторые версии NFS для Linux(R) поддерживают запросы на монтирование только с привилегированного порта; попробуйте выполнить следующую команду:
-
-[source,shell]
-....
-# mount -o -P linuxbox:/blah /mnt
-....
-
-[[exports-errors]]
-=== Почему mountd продолжает выдавать сообщения can't change attributes и bad exports list на моём сервере NFS, работающем под управлением FreeBSD?
-
-В большинстве случаев проблема заключается в недостаточном понимании корректного формата файла [.filename]#/etc/exports#.
-Просмотрите ещё раз справочную информацию по man:exports[5] и раздел об extref:{handbook}network-servers/[NFS, network-nfs] Руководства, особенно в части extref:{handbook}[настройки NFS, configuring-nfs].
-
-[[ip-multicast]]
-=== Как включить поддержку multicast IP?
-
-Установите пакет package:net/mrouted[] и добавьте `mrouted_enable="YES"` в [.filename]#/etc/rc.conf# для запуска этого сервиса во время загрузки.
-
-[[fqdn-hosts]]
-=== Почему я должен использовать FQDN для хостов не в моей сети?
-
-За ответом на этот вопрос обратитесь к extref:{handbook}mail/[Руководству,
-mail-trouble] по FreeBSD.
-
-[[network-permission-denied]]
-=== Почему при выполнении любых сетевых операций выдаётся сообщение Permission denied?
-
-Если ядро скомпилировано с параметром `IPFIREWALL`, имейте в виду, что политикой по умолчанию является запрет прохождения любых пакетов, которые не разрешены явным образом.
-
-Если межсетевой экран был случайно сконфигурирован неверным образом, то для восстановления работоспособности сети наберите такую команду из-под пользователя `root`:
-
-[source,shell]
-....
-# ipfw add 65534 allow all from any to any
-....
-
-Рассмотрите использование `firewall_type='open'` в файле [.filename]#/etc/rc.conf#.
-
-Дополнительная информация о настройке данного межсетевого экрана находится в
-extref:{handbook}firewalls/[соответствующей главе, firewalls-ipfw] Руководства.
-
-[[ipfw-fwd]]
-=== Почему моё правило “fwd” для `ipfw` по перенаправлению сервиса на другую машину не работает?
-
-Возможно, потому что вместо простого перенаправления пакетов нужна трансляция сетевых адресов (NAT). Правило "fwd" только перенаправляет пакеты и данные внутри него не меняет.
-Рассмотрим такое правило:
-
-[source,shell]
-....
-01000 fwd 10.0.0.1 from any to foo 21
-....
-
-Когда пакет с адресом назначения _foo_ достигает машины с этим правилом, пакет перенаправляется на _10.0.0.1_, но в нём остаётся адрес назначения _foo_.
-Адрес назначения пакета не меняется на _10.0.0.1_.
-Большинство машин, скорее всего, отбросят полученный пакет, имеющий адрес назначения, им не соответствующий.
-Таким образом, правило "fwd" часто работает не так, как ожидает пользователь.
-Описанное поведение является особенностью, а не ошибкой.
-
-Обратитесь к <<service-redirect,FAQ о перенаправлении сервисов>>, руководству по man:natd[8] или одной из нескольких утилит для перенаправления портов из link:https://www.FreeBSD.org/ports/[Коллекции Портов] для того, чтобы сделать это правильно.
-
-[[service-redirect]]
-=== Как можно перенаправить запросы сервисов с одной машины на другую?
-
-Запросы FTP и других сервисов можно перенаправить с помощью порта package:sysutils/socket[]. Замените запись для этого сервиса в [.filename]#/etc/inetd.conf# на вызов `socket`, как показано в этом примере для ftpd:
-
-[.programlisting]
-....
-ftp stream tcp nowait nobody /usr/local/bin/socket socket ftp.example.com ftp
-....
-
-где _ftp.example.com_ и _ftp_ являются соответственно хостом и портом для перенаправления.
-
-[[bandwidth-mgr-tool]]
-=== Где можно найти средства управления сетевым трафиком?
-
-Для FreeBSD имеются три средства управления трафиком. man:dummynet[4] интегрирован в систему FreeBSD как составная часть man:ipfw[4]. http://www.sonycsl.co.jp/person/kjc/programs.html[ ALTQ] включен во FreeBSD как составная часть man:pf[4]. Bandwidth Manager компании http://www.etinc.com/[Emerging Technologies] является коммерческим продуктом.
-
-[[bpf-not-configured]]
-=== Почему появляются сообщения /dev/bpf0: device not configured?
-
-Для работы приложения требуется Berkeley Packet Filter (man:bpf[4]), однако это устройство удалено из вашего ядра. Постройте новое ядро с добавлением в его конфигурационный файл следующей строки:
-
-[.programlisting]
-....
-device bpf # Berkeley Packet Filter
-....
-
-[[mount-smb-share]]
-=== Как смонтировать диск Windows(R)-машины в моей локальной сети, как это делает smbmount в Linux(R)?
-
-Используйте пакет SMBFS. В него включён набор изменений в ядре и пользовательские программы. Программы и информация доступны как man:mount_smbfs[8] и входят в состав базовой системы.
-
-[[icmp-response-bw-limit]]
-=== Что значат сообщения Limiting icmp/open port/closed port response в файле журнала?
-
-Данное сообщение ядра означает, что имеет место некоторая активность, приводящая к отправке большого количества ответных пакетов ICMP или сбросов TCP (RST). Ответы ICMP часто генерируются в результате попыток подключения к незанятым портам UDP. Сбросы TCP генерируются в результате попыток подключения к закрытым портам TCP. Помимо всего прочего, такие сообщения могут быть вызваны следующими действиями:
-
-* Лобовая атака типа отказ в обслуживании DoS (в отличие от атак в один пакет, которые используют конкретную брешь в защите).
-* Сканирование портов в попытке осуществить подключение к большому количеству портов (в отличие от проб нескольких известных портов).
-
-Первое число в сообщении показывает количество пакетов, которое ядро отправило
-бы при отсутствии ограничений, а второе число отражает лимит.
-Этот лимит управляется при помощи переменной `net.inet.icmp.icmplim`.
-В этом примере устанавливается лимит на `300` пакетов в секунду:
-
-[source,shell]
-....
-# sysctl net.inet.icmp.icmplim=300
-....
-
-Для выключения подобных сообщений без отключения самого ограничения используйте `net.inet.icmp.icmplim_output`, чтобы подавить вывода:
-
-[source,shell]
-....
-# sysctl net.inet.icmp.icmplim_output=0
-....
-
-И наконец, чтобы полностью выключить это ограничение, сделайте `net.inet.icmp.icmplim` равным `0`. Выключение этого лимита не приветствуется по причинам, изложенным выше.
-
-[[unknown-hw-addr-format]]
-=== Что это за сообщения arp: unknown hardware address format?
-
-Это означает, что какое-то устройство в локальной сети Ethernet использует MAC-адрес в формате, неизвестном FreeBSD. Вероятно, это происходит из-за того, что кто-то в сети экспериментирует с сетевым адаптером. Чаще всего это происходит в сетях с кабельными модемами. Это безобидно и не должно влиять на производительность системы FreeBSD.
-
-[[arp-wrong-iface]]
-=== Почему я постоянно вижу сообщения вида 192.168.0.10 is on fxp1 but got reply from 00:15:17:67:cf:82 on rl0 и как мне их отключить?
-
-Это так, потому что пакет приходит извне сети, чего не должно быть. Чтобы отключить эти сообщения, установите `net.link.ether.inet.log_arp_wrong_iface` в значение `0`.
-
-[[ipv6-only]]
-=== Как скомпилировать ядро, поддерживающее только IPv6?
-
-Выполните конфигурацию ядра со следующими параметрами:
-
-[source,shell]
-....
-include GENERIC
-ident GENERIC-IPV6ONLY
-makeoptions MKMODULESENV+="WITHOUT_INET_SUPPORT="
-nooptions INET
-nodevice gre
-....
-
-== Безопасность
-
-=== Что означает термин sandbox (песочница)?
-
-"Sandbox" - это термин, используемый при обеспечении безопасности. Он имеет два значения:
-
-* Процесс, помещённый внутрь некоторых виртуальных стен, которые предназначены для предотвращения взлома всей системы в результате взлома этого конкретного процесса.
-+
-Процесс может работать только в границах этих стен.
-Поскольку, что бы этот процесс ни делал, он эти стены разрушить не может, особый аудит его кода не нужен для того, чтобы с уверенностью сказать, насколько его работа безопасна для системы.
-+
-Стеной может служить, например, идентификатор пользователя. Вот определение, даваемое на страницах Справочника man:security[7] и man:named[8].
-+
-Рассмотрим, например, службу `ntalk` (смотрите man:inetd[8]).
-Раньше эта служба запускалась с полномочиями пользователя `root`.
-Теперь она запускается с полномочиями пользователя с идентификатором `tty`.
-Пользователь `tty` является песочницей, предназначенной для того, чтобы
-пользователю, которому удалось проникнуть в систему через `ntalk`, было сложнее
-взломать систему и получить полномочия больше, чем обладает этот идентификатор.
-* Процесс, помещённый внутрь симулируемой машины.
-Это означает, что некто, взломавший процесс, может думать, что может сломать и
-систему в целом, однако фактически может сломать только симулятор этой машины
-и не может модифицировать никаких реальных данных.
-+
-Самым распространённым способом достигнуть такого результата является построение имитирующего окружения в каталоге и затем запуск процессов в этом каталоге через chroot (т.е. задав этот каталог в качестве [.filename]#/# для этого процесса, а не реальный [.filename]#/# всей системы).
-+
-Другим часто используемым методом является монтирование низлежащей файловой системы в режиме "только для чтения" и затем создание уровня файловой системы поверх неё, что даёт процессу видимость доступа по записи на ту файловую систему. Процесс будет полагать, что может записывать в те файлы, но это будет единственный процесс, который увидит результат - другие процессы не будут этого делать ни в коем случае.
-+
-Попытка сделать такой тип песочницы настолько прозрачна, что пользователь (или взломщик) даже не поймёт, что он в ней находится.
-
-В UNIX(R) реализованы два типа "песочниц". Один на уровне процесса, и один на уровне идентификаторов пользователей.
-
-Каждый процесс в UNIX(R) полностью защищён от других процессов. Никакой процесс не может модифицировать адресное пространство другого процесса.
-
-В UNIX(R) каждым процессом владеет некоторый идентификатор пользователя. Если этот пользователь не `root`, он ограждает процесс от других, владельцами которых являются другие пользователи. Этот идентификатор используется также для защиты данных на диске.
-
-[[securelevel]]
-=== Что такое уровень безопасности (securelevel)?
-
-`securelevel` является механизмом обеспечения безопасности, который реализован в ядре. Когда уровень защиты больше нуля, ядро ограничивает выполнение некоторых операций; даже суперпользователю `root` запрещается их выполнять. Механизм уровня защиты ограничивает возможности по:
-
-* снятию некоторых флагов с файлов, таких, как `schg` (системный флаг неизменяемости),
-* записи в память ядра через устройства [.filename]#/dev/mem# и [.filename]#/dev/kmem#,
-* загрузке модулей ядра и
-* изменению правил сетевого экрана.
-
-Для выяснения состояния уровня защиты в работающей системе:
-
-[source,shell]
-....
-# sysctl -n kern.securelevel
-....
-
-Результат содержит текущее значение уровня защиты.
-Если оно больше нуля, то по крайней мере некоторые из защит этого механизма включены.
-
-Уровень защиты работающей системы не может быть понижен, поскольку это противоречит назначению этого механизма.
-Если для задачи требуется неположительный уровень защиты, измените значения переменных `kern_securelevel` и `kern_securelevel_enable` в файле [.filename]#/etc/rc.conf#, а затем перезагрузите систему.
-
-Более подробная информация об уровнях защиты и о том, какие специфические действия выполняют все уровни, может быть найдена на справочных страницах о man:init[8].
-
-[WARNING]
-====
-
-Уровень защиты не является панацеей; в нём есть много недостатков. Зачастую он даёт обманчивое чувство безопасности.
-
-Одной из самых больших проблем является то, что для его эффективной работы все файлы, используемые в процессе загрузки, должны быть защищены.
-Если атакующий сможет заставить систему выполнять свой код до установки уровня защиты (что происходит достаточно поздно во время процесса загрузки, так как некоторые вещи, выполняемые системой в это время, не могут быть сделаны при повышенном уровне защиты), то эта защита может быть отключена.
-Хотя такая задача по защите всех файлов, используемых в процессе загрузки, технически вполне осуществима, если это будет сделано, то поддержка системы станет кошмаром, так как для изменения конфигурационного файла придётся останавливать систему, переводя её по крайней мере в однопользовательский режим.
-
-Это обстоятельство, а также ряд других, часто обсуждаются в списках рассылки, в частности, во {freebsd-security}.
-Поищите в link:https://www.FreeBSD.org/search/[архивах] более подробное обсуждение. Предпочтителен более гибкий механизм.
-====
-
-[[toor-account]]
-=== Что это за пользователь toor с UID 0? Я подвергся взлому?
-
-Не волнуйтесь, `toor` является "альтернативной" учётной записью суперпользователя (toor - это root, записанный задом наперёд).
-Его предлагается использовать с нестандартным командным интерпретатором, так чтобы не нужно было менять используемый по умолчанию командный процессор для `root`.
-Это важно, так как оболочки, не являющиеся частью дистрибутива системы, но установленные из портов или пакаджей, размещаются в каталоге [.filename]#/usr/local/bin#, который по умолчанию располагается в другой файловой системе.
-Если командный процессор для пользователя `root` располагается в [.filename]#/usr/local/bin# и файловая система, содержащая [.filename]#/usr/local/bin#, не смонтирована, то пользователь `root` не сможет войти в систему для исправления проблемы и понадобится перезагрузиться в однопользовательском режиме, чтобы указать путь до командного процессора.
-
-Некоторые используют `toor` для выполнения повседневных административных работ с нестандартным командным процессором, оставляя `root` со стандартной оболочкой для работы в однопользовательском режиме или выполнения аварийных работ.
-По умолчанию ни один пользователь не сможет войти в систему как `toor`, потому что для этой учётной записи не указан пароль, поэтому войдите из-под `root` и установите пароль для `toor` до того, как использовать его для входа в систему.
-
-[[serial]]
-== Коммуникационные адаптеры
-
-В этом разделе освещены вопросы о работе последовательных адаптеров во FreeBSD.
-
-[[serial-console-prompt]]
-=== Как сделать так, чтобы приглашение boot: выводилось на консоль на последовательном порту?
-
-Подробная информация находится в extref:{handbook}serialcomms/[этом разделе Руководства, serialconsole-setup].
-
-[[found-serial]]
-=== Как узнать, обнаружила ли FreeBSD последовательные порты или внутренние модемы?
-
-В процессе своей загрузки ядро FreeBSD будет пытаться найти последовательные порты, с поддержкой которых ядро сконфигурировано. Внимательно просмотрите сообщения загрузки либо выполните такую команду после того, как система запустилась и работает:
-
-[source,shell]
-....
-% grep -E '^(sio|uart)[0-9]' < /var/run/dmesg.boot
-uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
-uart0: console (115200,n,8,1)
-uart1: <16550 or compatible> port 0x2f8-2x3ff irq 3 on acpi0
-....
-
-В этом примере присутствуют два последовательных порта. Первый находится на IRQ4, порт ввода/вывода `0x3f8`, и построен на микросхеме UART типа 16550. Второй использует тот же тип микросхемы, но находится на IRQ3 и использует адрес порта ввода/вывода `0x2f8`. Внутренние модемы выглядят точно также, как последовательные порты, за исключением того, что модем к ним подключен всегда.
-
-В ядро [.filename]#GENERIC# встроена поддержка двух последовательных портов, с теми же IRQ и адресами портов ввода/вывода, как указано в примере выше. Если эти настройки не соответствуют системе или имеется больше внутренних модемов или последовательных портов, чем описано в ядре, переконфигурируйте его, следуя инструкциям в разделе <<make-kernel,о построении ядра>>.
-
-[[access-serial-ports]]
-=== Как осуществляется доступ к последовательным портам во FreeBSD? (специфично для x86)
-
-Третий последовательный порт, [.filename]#sio2# или [.filename]#COM3#, обозначается как [.filename]#/dev/cuad2# для устройств, выполняющих исходящие звонки, и [.filename]#/dev/ttyd2# для устройств, принимающих входящие звонки. Какая разница между этими двумя классами устройств?
-
-При открытии [.filename]#/dev/ttydX# в блокирующем режиме процесс будет ожидать неактивности соответствующего устройства [.filename]#cuadX#, а затем появления сигнала о наличии несущей. При открытии устройства [.filename]#cuadX# он проверяет, что последовательный порт не занят устройством [.filename]#ttydX#. Если порт доступен, он похищает его у устройства [.filename]#ttydX#. Также устройство [.filename]#cuadX# не следит за наличием несущей. С такой схемой работы и модемом в режиме автоответа удалённые пользователи могут входить в систему, а локальные пользователи через тот же модем могут по прежнему осуществлять исходящие звонки, а система позаботится о возможных конфликтах.
-
-[[enable-multiport-serial]]
-=== Как включить поддержку многопортовых последовательных адаптеров?
-
-Информация о конфигурировании ядра содержится в соответствующем разделе, посвящённом этому вопросу. Для многопортовых последовательных адаптеров добавьте в файл man:device.hints[5] по строке man:sio[4] на каждый порт. Но IRQ должен быть указан только у одного порта. Все порты на адаптере должны использовать одно и то же значение IRQ. Для обеспечения согласованности используйте для указания IRQ последний последовательный порт. Также укажите следующую опцию в файле конфигурации ядра:
-
-[.programlisting]
-....
-COM_MULTIPORT
-....
-
-В следующем примере указано содержимое [.filename]#/boot/device.hints# для 4-портового последовательного адаптера AST на IRQ 12:
-
-[.programlisting]
-....
-hint.sio.4.at="isa"
-hint.sio.4.port="0x2a0"
-hint.sio.4.flags="0x701"
-hint.sio.5.at="isa"
-hint.sio.5.port="0x2a8"
-hint.sio.5.flags="0x701"
-hint.sio.6.at="isa"
-hint.sio.6.port="0x2b0"
-hint.sio.6.flags="0x701"
-hint.sio.7.at="isa"
-hint.sio.7.port="0x2b8"
-hint.sio.7.flags="0x701"
-hint.sio.7.irq="12"
-....
-
-Флаги указывают, что управляющий порт имеет младший номер устройства `7` (`0x700`), и все порты совместно используют один и тот же номер IRQ (`0x001`).
-
-[[default-serial-params]]
-=== Можно ли настроить для последовательного порта режим работы по умолчанию?
-
-Смотрите раздел Руководства по FreeBSD, посвящённый
-extref:{handbook}serialcomms/[последовательным соединениям, serial-hw-config].
-
-[[cannot-tip]]
-=== Почему не удаётся запустить tip или cu?
-
-Встроенные утилиты man:tip[1] и man:cu[1] могут получить доступ к каталогу [.filename]#/var/spool/lock# только из-под пользователя `uucp` и членов группы `dialer`. Используйте группу `dialer` для управления доступом к модему или удалённым системам посредством добавления в неё пользовательских учётных записей.
-
-Либо же можно разрешить всем запускать man:tip[1] и man:cu[1]:
-
-[source,shell]
-....
-# chmod 4511 /usr/bin/cu
-# chmod 4511 /usr/bin/tip
-....
-
-== Разное
-
[[more-swap]]
-=== Почему FreeBSD использует много места в разделе подкачки даже при большом объёме свободной памяти?
+=== FreeBSD использует много swap-пространства, даже когда в компьютере остаётся свободная память. Почему?
-FreeBSD активно перемещает неиспользуемые страницы памяти, к которым не было обращений, в раздел подкачки, чтобы увеличить объём доступной физической памяти для активного использования. Такое активное использование раздела подкачки компенсируется использованием дополнительной свободной оперативной памяти для кеширования.
+FreeBSD активно перемещает полностью неиспользуемые страницы основной памяти в своп, чтобы освободить больше основной памяти для активного использования. Такое активное использование свопа компенсируется за счет использования дополнительной свободной памяти для кэширования.
-Заметьте, что хотя FreeBSD предпочитает использовать раздел подкачки, страницы не перемещаются произвольно при полностью неактивной системе. По этой причине система не будет находиться целиком в разделе подкачки после ночного простаивания.
+Обратите внимание, что хотя FreeBSD активно работает в этом направлении, она не принимает произвольных решений о выгрузке страниц, когда система действительно простаивает. Таким образом, система не будет полностью выгружена в своп после простоя в течение ночи.
[[top-freemem]]
-=== Почему утилита man:top[1] показывает очень маленький объём свободной памяти, даже когда запущено всего лишь несколько приложений?
-
-Просто дело в том, что под свободной памятью подразумевается никак не
-используемая память. Вся память, которая программам явно не выделялась,
-используется ядром FreeBSD для дискового кэша. Значения, показываемые
-утилитой &man.top.1; с метками `Inact` и `Laundry`, являются кэшированными
-данными разных степеней устаревания. То, что данные находятся в кэше, означает, что система не будет обращаться к медленному диску снова за теми данными, обращение к которым было недавно, повышая таким образом общую производительность. В общем случае маленькие значения в пункте `Free`, показываемые утилитой man:top[1] для свободной памяти - это хорошо, если, конечно они не _очень_ маленькие.
-
-[[chmod-symlinks]]
-=== Почему командой chmod невозможно изменить права на символические ссылки?
-
-Символические ссылки не имеют атрибутов доступа, и по умолчанию утилита man:chmod[1] следует по символической ссылке, чтобы по возможности изменить права доступа на исходный файл. Для файла [.filename]#foo# с символической ссылкой [.filename]#bar# на этот файл эта команда всегда будет выполняться успешно.
+=== Почему top показывает очень мало свободной памяти, даже когда у меня запущено очень мало программ?
-[source,shell]
-....
-% chmod g-w bar
-....
-
-Однако права на файл [.filename]#bar# не изменятся.
-
-Чтобы это работало, используйте опцию `-H` или `-L` вместе с опцией `-R`. Обратитесь к страницам Справочника по команде man:chmod[1] и по man:symlink[7].
+Простой ответ заключается в том, что свободная память — это потраченная впустую память.
-[WARNING]
-====
-
-Опция `-R` выполняет man:chmod[1] _рекурсивно_. Будьте внимательны, задавая каталоги или символические ссылки на каталоги в параметрах man:chmod[1]. Чтобы изменить права на каталог, на который указывает символическая ссылка, используйте man:chmod[1] без опций и следуйте символической ссылке с помощью лидирующего слэша ([.filename]#/#). Например, если [.filename]#foo# является символической ссылкой на каталог [.filename]#bar#, то чтобы изменить права на [.filename]#foo# (на самом деле на [.filename]#bar#), выполните такую команду:
-
-[source,shell]
-....
-% chmod 555 foo/
-....
-
-Если задан ведущий слэш, то man:chmod[1] будет следовать символической ссылке [.filename]#foo#, меняя права на каталог [.filename]#bar#.
-====
-
-[[dos-binaries]]
-=== Могу ли я запускать программы для DOS во FreeBSD?
-
-Да.
-Программа эмуляции DOS, package:emulators/doscmd[], доступна в Коллекции Портов
-FreeBSD.
-
-Если doscmd не достаточно, package:emulators/pcemu[] эмулирует 8088 и набор сервисов BIOS, достаточный для запуска многих приложений текстового режима DOS. Требуется X Window System.
-
-В Коллекции Портов FreeBSD также имеется package:emulators/dosbox[]. Программа в основном предназначена для эмуляции старых игр, написанных под DOS, для хранения файлов которых используется локальная файловая система.
-
-[[translation]]
-=== Что мне нужно сделать, чтобы перевести документацию FreeBSD на мой родной язык?
-
-Ознакомьтесь с extref:{fdp-primer}[FAQ по Переводам, translations] из FreeBSD Documentation Project Primer.
-
-[[freebsd-mail-bounces]]
-=== Почему возвращается моя электронная почта, отправленная на любой из адресов FreeBSD.org?
-
-В почтовой системе `FreeBSD.org` в Postfix применяются некоторые проверки входящей почты, и отвергаются сообщения, которые были неправильно сформированы при пересылке либо как-то иначе похожи на спам. Вот некоторые из требований:
-
-* IP-адрес клиента SMTP должен иметь обратное преобразование в символическое имя.
-* Полное имя хоста, указанное на этапе EHLO/HELO в процессе обмена сообщениями SMTP, должно разрешаться в IP-адрес клиента.
-
-Дополнительные советы по доставке письма:
-
-* Письмо должно быть отправлено в текстовом формате. Сообщение в почтовый список рассылки, как правило, не должно иметь размер больше 200 Кбайт.
-* Избегайте избыточного кросспостинга.
-Выберите _один_ список рассылки, который кажется наиболее подходящим.
-
-Если у вас всё ещё остались трудности при работе с почтовой инфраструктурой `FreeBSD.org`, отправьте сообщение с подробным описанием на адрес mailto:postmaster@freebsd.org[postmaster@freebsd.org]. Укажите в нём временной интервал для проверки логов - и обратите внимание, что мы держим журнал почтовых логов всего за неделю. (Обязательно укажите часовой пояс или разницу в UTC.)
-
-[[free-account]]
-=== Где можно получить бесплатный доступ к FreeBSD?
-
-Хотя FreeBSD не предоставляет бесплатный доступ ни к одному из своих серверов, другие компании предоставляют UNIX(R)-системы с открытым доступом. Стоимость этой услуги различна, также как и ограниченный набор услуг.
-
-http://www.arbornet.org/[Arbornet, Inc], также известный как _M-Net_, предоставляет свободный доступ к UNIX(R)-системам с 1983 года. Начиная на платформе Altos с работающей System III, сайт перешёл на BSD/OS в 1991. В июне 2000 сайт сменил систему снова, теперь на FreeBSD. _M-Net_ может быть доступна через протоколы telnet и SSH и предоставляет доступ к полному набору программного обеспечения FreeBSD. Однако доступ к сети ограничен для членов и спонсоров, которые поддерживают систему, которая работает как неприбыльная организация. _M-Net_ предоставляет также услуги электронной доски объявлений (BBS) и интерактивного чата.
+Любая память, которую программы не используют активно, применяется в ядре FreeBSD в качестве дискового кэша. Значения, отображаемые в man:top[1] с метками `Inact` и `Laundry`, представляют собой кэшированные данные на разных уровнях старения. Эти кэшированные данные позволяют системе не обращаться к медленному диску повторно для данных, к которым она недавно обращалась, тем самым повышая общую производительность. В целом, низкое значение памяти, отображаемое как `Free` в man:top[1], является хорошим признаком, при условии, что оно не _очень_ низкое.
[[daemon-name]]
-=== Как зовут этого маленького симпатичного красного парня?
+=== Как зовут этого милого маленького красного человечка?
-У него нет определённого имени, он называется просто "даемон BSD".
-Если вам непременно нужно имя, называйте его "beastie".
-Заметьте, что "beastie" произносится как "BSD".
+У него нет имени, и его просто называют "демон BSD". Если вам непременно нужно имя, называйте его "биести" (beastie). Обратите внимание, что "биести" произносится как "Би-Эс-Ди".
-Больше о даемоне BSD можно узнать из его http://www.mckusick.com/beastie/index.html[домашней страницы].
+Дополнительная информация о демоне BSD доступна на его http://www.mckusick.com/beastie/index.html[домашней странице].
[[use-beastie]]
-=== Могу ли я использовать изображение даемона BSD?
-
-Вполне может быть.
-Правами на даемона BSD обладает Marshall Kirk McKusick.
-Для выяснения подробностей относительно правил его использования обратитесь к странице автора http://www.mckusick.com/beastie/mainpage/copyright.html[Statement on the Use of the BSD Daemon Figure].
-
-В общем, использовать изображение можно в высокохудожественном стиле и в личных целях, если даются соответствующие отсылки. Перед использованием знака в коммерческих целях обратитесь за разрешением к {mckusick}. Дополнительная информация находится на http://www.mckusick.com/beastie/index.html[домашней странице Даемона BSD].
+=== Могу ли я использовать изображение BSD-демона?
-[[daemon-images]]
-=== Не найдётся ли у вас изображений даемона BSD, которые можно использовать?
+Возможно. Демон BSD защищен авторским правом Маршалла Кирка Маккузика. Ознакомьтесь с его http://www.mckusick.com/beastie/mainpage/copyright.html[Заявлением об использовании изображения демона BSD] для получения подробных условий использования.
-В каталоге [.filename]#/usr/share/examples/BSD_daemon/# есть рисунки в форматах
-eps и Xfig.
-
-[[glossary]]
-=== При просмотре списков рассылки я встретил сокращение или другой термин, который мне не понятен. Где я должен посмотреть, что он значит?
-
-Обратитесь к extref:{handbook}glossary/[Глоссарию FreeBSD].
+В заключение, изображение можно использовать в хорошем вкусе, для личного пользования, при условии указания соответствующей авторской принадлежности. Перед коммерческим использованием логотипа свяжитесь с {mckusick} для получения разрешения. Подробнее можно узнать на http://www.mckusick.com/beastie/index.html[домашней странице BSD Daemon].
[[bikeshed-painting]]
-=== Почему я должен беспокоиться о цвете велосипедных навесов (bikeshed)?
-
-На самом деле, очень краткий ответ на этот вопрос заключается в том, что вы этого делать не должны. Если давать более подробный ответ, то ваше умение делать навесы не должно означать, что вы должны препятствовать другим делать их просто потому, что вам не нравится цвет, в который они собираются их окрашивать. Эта метафора означает, что вам не нужно обсуждать каждую мелочь просто потому, что вы знаете о ней достаточно много. Некоторые люди отмечают, что объём шума, генерируемый при появлении некоторого изменения, находится в обратной зависимости от сложности самого изменения.
-
-Более пространный и полный ответ заключается в том, что после очень долгого обсуждения того, должна ли утилита man:sleep[1] обрабатывать дробное число, заданное в качестве второго аргумента, {phk} опубликовал большое сообщение,
-озаглавленное link:http://www.bikeshed.com[Велосипедный навес (любого цвета) на
-зелёной траве...]. Соответствующие части этого сообщения цитируются ниже.
-
-{phk} on freebsd-hackers, October 2, 1999
-"Что это за история с этим навесом для велосипеда?", кто-то из вас спрашивал меня.
-
-Это долгая история, точнее, это старая история, но на самом деле она коротка.
-В начале 1960-х годов Сирил Норткот Паркинсон (C. Northcote Parkinson) написал книгу "Законы Паркинсона", которая содержит много интересных взглядов на процесс управления.
-
-_[немного выдержек из краткого содержания книги]_
-
-В конкретном примере велосипедный навес сопоставляется с другим важным объектом - атомной электростанцией. Я полагаю, что это иллюстрирует древность книги.
-
-Паркинсон показывает, что вы можете прийти на совещание руководителей и получить добро на строительство многомиллионной или даже многомиллиардной атомной электростанции, но если вы хотите построить навес для велосипеда, то погрязнете в бесконечных обсуждениях.
-
-Паркинсон объясняет это тем, что атомная станция настолько большой, дорогой и сложный объект, что люди не могут его осознать и вместо того, чтобы попробовать это сделать, они полагаются на то, что кто-то уже проверил все мелочи до того, как всё зашло так далеко. В своей книге Ричард П. Фейнманн (Richard P. Feynmann) даёт несколько интересных и очень поучительных примеров, связанных с Лос Аламос.
-
-Велосипедный навес - это противоположный случай. Любой может построить навес за один уикэнд, и у него ещё останется время посмотреть футбол по телевизору. Так что не важно, насколько хорошо вы готовились к обсуждению, насколько убедительны будут ваши аргументы, кто-нибудь воспользуется шансом показать, что он не зря ест свой хлеб, что он обращает внимание, что он _здесь_.
+=== Почему меня должен волновать цвет сарая для велосипедов?
-В Дании это называется “оставить отпечаток своего пальца”.
-Это всё касается личной гордости и престижа, это возможность указать куда-то и сказать: “Вот! Это сделал я”.
-Это сильно выражено в политиках, но присутствует во многих людях, которые получают возможность сделать это.
-Просто вспомните об отпечатках ног во влажном цементе.
+Очень, очень краткий ответ — не должен. Более развёрнутый ответ: просто потому, что вы способны построить сарай для велосипедов, это не значит, что вы должны мешать другим делать то же самое лишь из-за того, что вам не нравится цвет, которым они собираются его покрасить. Это метафора, напоминающая, что не нужно спорить о каждой мелочи только потому, что у вас достаточно знаний для этого. Некоторые люди отмечали, что количество шума, вызванного изменением, обратно пропорционально сложности этого изменения.
-== Юмор от FreeBSD
-
-[[very-very-cool]]
-=== Насколько FreeBSD горяча?
-
-_В._ Кто-нибудь делал замеры температуры при работе FreeBSD?
-Я знаю, что Linux(R) греется меньше, чем DOS, но никогда не видел упоминания FreeBSD.
-Наверное, эта система - горячая штучка.
-
-_О._ Нет, но мы сделали различные вкусовые тесты у добровольцев с завязанными
-глазами, которые до этого приняли по 250 микрограмм LSD-25. 35% участников
-заявили, что FreeBSD имеет вкус апельсина, тогда как вкус Linux(R) был похож на
-фиолетовый туман. Ни одна из групп не отметила значительной разницы в
-температуре. Мы уже собирались опубликовать полные результаты этого опроса,
-когда обнаружили, что слишком много добровольцев покинули помещение во время
-тестов, что несколько смазало результаты. Думаем, что большинство добровольцев
-работают сейчас в Apple над их новым GUI "чеши и нюхай". Это ведь старый
-добрый бизнес!
-
-Если серьёзно, то FreeBSD использует инструкцию HLT (halt), когда система
-простаивает, что уменьшает потребление энергии и, в свою очередь, выделение
-тепла.
-Вдобавок, если у вас настроен ACPI (усовершенствованный интерфейс
-управления конфигурацией и питанием), то FreeBSD может переводить процессор в
-режим пониженного энергопотребления.
-
-[[letmeoutofhere]]
-=== Кто там скребётся в микросхемах памяти??
-
-_В._ Делает ли FreeBSD что-нибудь "эдакое" при компиляции ядра, что вызывает поскрипывание микросхем памяти?
-При компиляции (и в короткий промежуток времени после обнаружения дисковода при старте системы) от, видимо, микросхем памяти исходит странный царапающий звук.
-
-_О._ Да!
-Вы встретите частое упоминание "даемонов" в документации по BSD, но
-не все знают, что речь идёт о настоящих нематериальных существах, которые
-теперь завладели и вашим компьютером. Царапающий звук, издаваемый микросхемами
-памяти - это на самом деле высокочастотное перешёптывание между даемонами,
-когда они решают, как лучше справиться с различными задачами по
-администрированию системы.
-
-Если шум достиг ваших ушей, команда DOS `fdisk /mbr` их спугнёт, но не
-удивляйтесь, если они отреагируют соответствующим образом и попытаются вас
-остановить.
-Фактически, если во время выполнения этой команды вы услышите сатанинский голос
-Билла Гейтса из встроенного динамика, бегите и даже не оглядывайтесь!
-Избавленные от противостояния с даемонами BSD, близнецы-демоны DOS и Windows(R)
-часто могут захватить полный контроль над вашей машиной, чтобы навлечь
-вечное проклятие на вашу душу.
-Теперь, когда вы это знаете, если бы у вас был выбор, думаем, что вы бы
-предпочли привыкнуть к царапающему звуку, не так ли?
-
-=== Сколько требуется разработчиков FreeBSD, чтобы сменить электрическую лампочку?
-
-Необходимо иметь ровно одну тысячу сто шестьдесят девять разработчиков:
-
-Двадцать три сообщат в -CURRENT о том, что не горит свет;
-
-Четыре начнут утверждать, что это проблема конфигурации и такие сообщения нужно посылать в -questions;
-
-Трое оформят PR по этому поводу, причём одно их них будет направлено в doc и будет содержать только строчку "здесь темно";
-
-Один закоммитит неоттестированную лампочку, что сломает построение системы, а затем через пять минут вернёт всё назад;
-
-Восемь поругаются с авторами PR по поводу включения патчей в PR;
-
-Пять сообщат о том, что не проходит компиляция системы;
-
-Тридцать один человек ответит, что у них всё работает и наверное, те обновились в неподходящее время;
-
-Один пошлёт патч для новой лампочки в -hackers;
-
-Один пожалуется, что у него имелись патчики ещё три года назад, но когда он послал их в -CURRENT, они были проигнорированы и он имел неудачный опыт работы с системой PR; кроме того предлагаемая лампочка не имеет отражателя.
-
-Тридцать семь начнут кричать, что лампочки не относятся к базовой системе, что коммиттеры не имеют права делать такие вещи без опроса общественности и ЧТО ВООБЩЕ -CORE ДЕЛАЕТ ПО ЭТОМУ ПОВОДУ?
-
-Две сотни напишут о цвете велосипедного навеса;
-
-Трое скажут, что этот патч не соответствует man:style[9]
-
-Семнадцать возразят, что предлагаемая новая лампа подпадает под лицензию GPL;
-
-Пятьсот восемьдесят шесть раздуют флейм по поводу сравнения лицензий GPL, BSD, MIT, NPL и личных мнений о неизвестных основателей FSF;
-
-Семеро пошлют различные части этих обсуждений в -chat и -advocacy;
-
-Один закоммитит предлагаемую лампу, хотя она светит хуже, чем старая;
-
-Двое откатят эти изменения с ужасной руганью в журнале коммитта о том, что лучше FreeBSD будет сидеть в темноте, чем с тусклой лампой.
-
-Сорок шесть громко воспротивятся этому изменению и потребуют объяснений от -core;
-
-Одиннадцать попросят уменьшить размер лампочки, чтобы она подошла к их Тамагочи на случай, если мы когда-нибудь соберёмся переносить FreeBSD на эту платформу;
-
-Семьдесят три заявят о SNR в -hackers и -chat и в знак протеста отпишутся;
-
-Тринадцать пошлют письма "unsubscribe", "How do I unsubscribe?" или "Please remove me from the list" с обычной подписью;
-
-Один закоммитит работающую лампочку в то время, как все будут слишком заняты руганью, чтобы это заметить;
-
-Тридцать один человек напишет, что новая лампочка будет светить на 0.364% ярче, если её откомпилировать с помощью TenDRA (хотя при этом она приобретёт форму куба) и что FreeBSD должна перейти на компилятор TenDRA, а не на GCC;
-
-Один заметит, что у лампочки отсутствует цоколь;
-
-Девять (включая авторов PR) спросят "что такое MFC?";
-
-Спустя две недели после смены лампочки пятьдесят семь человек сообщат о том, что света всё равно нет.
-
-_{nik} добавил:_
-
-_Я сильно смеялся над всем этим._
-
-_И тогда я подумал, "Постойте-ка, найдётся ли кто-нибудь, чтобы задокументировать это?"_
-
-_И на меня снизошло озарение :-)_
-
-_{tabthorpe}_ говорит: "Нет, _настоящие_ хакеры FreeBSD не боятся темноты!"
-
-[[dev-null]]
-=== Куда направляются данные, записываемые в /dev/null?
-
-Они отправляются в специальную сточную трубу для данных в CPU, где преобразуются в тепло, выдуваемое через охлаждающие вентиляторы. Вот почему охлаждение ЦП становится все более важным; так как люди используют все более быстрые процессоры, они все менее заботятся о данных, все большее их количество оканчивает свой путь в [.filename]#/dev/null#, перегревая ЦП. Если вы удалите [.filename]#/dev/null# (что соответственно отключит трубу данных в ЦП), то ваш процессор может охладиться, но система начнет переполняться излишними данными и начнет работать с ошибками. Если у вас быстрое сетевое подключение, вы можете охладить CPU, читая данные из [.filename]#/dev/random# и посылая их куда-нибудь; однако вы рискуете перегреть ваше сетевое соединение и [.filename]#/# или разозлить вашего провайдера, так как большинство данных преобразуется в тепло на его оборудовании, но, как правило, у него хорошее охлаждение, так что если вы не перестараетесь, все должно быть в порядке.
-
-_Пол Робинсон (Paul Robinson) добавляет:_
-
-Есть и другие методы. Как знает каждый хороший системный администратор, частью хорошей практики является посылка данных на экран интересным образом, чтобы феи, которые образуют картинку, были счастливы. Экранные феи (часто неправильно называемые "пикселами") различаются по цвету головных уборов, которые они носят (красные, зеленые или синие), и прячутся или появляются (показывая, таким образом, цвет своих шляп), когда получают немного пищи. Видеоадаптеры преобразуют данные в еду для фей, а затем посылают ее феям - чем дороже адаптер, тем лучше еда, тем лучше ведут себя феи. Они также нуждаются в постоянной стимуляции - вот зачем нужны хранители экранов.
-
-Продолжив наше предположение, вы можете просто выдавать случайные данные на консоль, таким образом позволяя феям их потреблять. Это вовсе приводит к прекращению выделения тепла, феи постоянно счастливы, а данные быстро исчезают, даже если на вашем экране все выглядит несколько хаотично.
-
-Как бывший администратор крупного провайдера, который имел много проблем при попытке поддерживать постоянную температуру в серверной комнате, я выступаю против того, чтобы люди посылали ненужные им данные в сеть. Волшебников, которые выполняют коммутацию пакетов и маршрутизацию, это также затрудняет.
-
-[[punk-my-friend]]
-=== Мой коллега проводит слишком много времени за компьютером.
-Как я могу отвадить его от этого?
-
-Установите пакет package:games/sl[] и дождитесь момента, когда коллега ошибочно
-введёт `sl` вместо `ls`.
-
-== Сложные темы
-
-[[learn-advanced]]
-=== Как можно узнать больше о внутреннем устройстве FreeBSD?
-
-Обратитесь к extref:{arch-handbook}[Руководству по архитектуре FreeBSD].
-
-Кроме того, большинство общих знаний о UNIX(R) непосредственно применимо к FreeBSD.
-
-[[how-to-contribute]]
-=== Как внести свой вклад в проект FreeBSD? Что можно сделать в качестве помощи?
-
-Мы принимаем помощь в любой форме: документации, кода и даже
-художественной графики. Обратитесь к соответствующей статье
-extref:{contributing}[Участие в проекте FreeBSD], в которой вы найдёте советы
-относительно того, как это сделать.</para>
-
-И спасибо вам за то, что вы об этом подумали!
-
-[[define-snap-release]]
-=== Что такое снапшоты и релизы?
-
-В http://cgit.FreeBSD.org/src/[хранилище Git] сейчас находятся {rel-numbranch} активно/полуактивно развивающихся ветки FreeBSD.
-(Более ранние ветки изменяются очень редко, именно поэтому в разработке только {rel-numbranch} активные ветки):
-
-* {rel2-releng}, также известная как {rel2-stable}
-* {rel-releng}, также известная как {rel-stable}
-* {rel-head-releng}, также известная как _-CURRENT_ и {rel-head}
-
-На данный момент _-CURRENT_ является находящимся в разработке деревом
-{rel-head-relx}; ветка {rel-stable}, {rel-releng}, отделилась от _-CURRENT_
-{rel-relengdate}, а ветка {rel2-stable}, {rel2-releng}, отделилась от
-_-CURRENT_ {rel2-relengdate}.
-
-=== Что делать при аварийном останове системы?
-
-Вот типичная паника ядра:
-
-[.programlisting]
-....
-Fatal trap 12: page fault while in kernel mode
-fault virtual address = 0x40
-fault code = supervisor read, page not present
-instruction pointer = 0x8:0xf014a7e5
-stack pointer = 0x10:0xf4ed6f24
-frame pointer = 0x10:0xf4ed6f28
-code segment = base 0x0, limit 0xfffff, type 0x1b
- = DPL 0, pres 1, def32 1, gran 1
-processor eflags = interrupt enabled, resume, IOPL = 0
-current process = 80 (mount)
-interrupt mask =
-trap number = 12
-panic: page fault
-....
-
-Этого сообщения не достаточно.
-Хотя значение указателя инструкций важно, но оно зависит от конфигурации, поскольку значение меняется для каждого конкретного файла ядра.
-Если это ядро [.filename]#GENERIC# из одного из снэпшотов, то кто-то ещё может отследить функцию, вызвавшую ошибку, но в случае со специально сконфигурированным ядром только вы можете сказать нам, где случилась ошибка.
-
-Чтобы продолжить:
-
-[.procedure]
-====
-. Запишите значение указателя инструкций.
-Заметьте, что часть `0x8:` в этом случае не важна: нам нужна часть `0xf0xxxxxx`.
-. Когда система перезагрузится, сделайте следующее:
-+
-[source,shell]
-....
-% nm -n kernel.that.caused.the.panic | grep f0xxxxxx
-....
-+
-где `f0xxxxxx` - это значение указателя инструкций. Однако неприятность заключается в том, что вы не получите точного соответствия, так как в таблице имен ядра для точек входа в функции даны адреса на начало функций, а указатель инструкций будет указывать куда-то внутрь её тела. Если вы не получили точного соответствия, опустите последнюю цифру в значении указателя инструкций и попробуйте снова:
-+
-[source,shell]
-....
-% nm -n kernel.that.caused.the.panic | grep f0xxxxx
-....
-+
-Если и это не привело ни к каким результатам, отрежьте следующую цифру. Повторяйте, пока не получите хоть что-то. Результатом будет список функций, которые, возможно, привели к аварийному останову. Этот механизм обнаружения ошибочного места довольно неточен, но это всё же лучше, чем ничего.
-====
-
-Тем не менее, лучшим способом выяснить причину, вызвавшую аварийный останов, является получение аварийного дампа системы, а затем использование man:kgdb[1] для получения трассировки вызовов в этом дампе.
-
-В любом случае, метод таков:
-
-[.procedure]
-====
-. Убедитесь в том, что в файле конфигурации ядра имеется следующая строка:
-+
-[.programlisting]
-....
-makeoptions DEBUG=-g # Build kernel with gdb(1) debug symbols
-....
-+
-. Перейдите в каталог [.filename]#/usr/src#:
-+
-[source,shell]
-....
-# cd /usr/src
-....
-+
-. Скомпилируйте ядро:
-+
-[source,shell]
-....
-# make buildkernel KERNCONF=MYKERNEL
-....
-+
-. Дождитесь завершения компиляции.
-+
-[source,shell]
-....
-# make installkernel KERNCONF=MYKERNEL
-....
-+
-. Выполните перезагрузку.
-====
-
-[NOTE]
-====
-Если не указать `KERNCONF`, то будет собрано и установлено ядро [.filename]#GENERIC#.
-====
-
-В процессе выполнения команды man:make[1] будут построены два ядра, [.filename]#/usr/obj/usr/src/sys/MYKERNEL/kernel# и [.filename]#/usr/obj/usr/src/sys/MYKERNEL/kernel.debug#.
-[.filename]#kernel# будет установлен как [.filename]#/boot/kernel/kernel#, тогда как [.filename]#kernel.debug# может быть использован в качестве источника отладочной информации для man:kgdb[1].
-
-Чтобы получать аварийный дамп, отредактируйте файл [.filename]#/etc/rc.conf# так, чтобы устройство `dumpdev` указывало на раздел подкачки или имело значение `AUTO`. В этом случае скрипты man:rc[8] будут вызывать команду man:dumpon[8] для создания аварийных дампов. Эту команду можно также запускать вручную.
-После аварийной остановки аварийный дамп может быть получен с помощью программы man:savecore[8]; если значение переменной `dumpdev` было задано в [.filename]#/etc/rc.conf#, то скрипты man:rc[8] запустят man:savecore[8] автоматически и поместят аварийный дамп в каталог [.filename]#/var/crash#.
-
-[NOTE]
-====
-Аварийные дампы FreeBSD обычно имеют размер, равный объёму оперативной памяти. Поэтому убедитесь в наличии достаточного места для хранения дампа в каталоге [.filename]#/var/crash#. Либо запустите вручную man:savecore[8], чтобы создать аварийный дамп в другом каталоге, где достаточно места. Размер аварийного дампа можно уменьшить, указав в конфигурации ядра `options MAXMEM=N`, где _N_ - значение в Кбайт для объёма памяти, которое будет использоваться ядром. Например, для 1 Гбайт ОЗУ установите ограничение на использование памяти ядром в 128 Мбайт, так чтобы размер аварийного дампа был равен 128 Мбайт, а не 1 Гбайт.
-====
-
-Как только аварийный дамп получен, трассировку вызовов можно получить таким образом:
-
-[source,shell]
-....
-% kgdb /usr/obj/usr/src/sys/MYKERNEL/kernel.debug /var/crash/vmcore.0
-(kgdb) backtrace
-....
-
-Заметьте, что это может дать несколько экранов полезной информации. Лучше всего использовать man:script[1] для перехвата всего вывода. При использовании необработанного файла ядра со всей отладочной информацией может быть найдена конкретная строка исходного текста ядра, при достижении которой случилась аварийная остановка. Для выяснения последовательности событий, приведших к аварийному останову, трассировка стека обычно читается снизу вверх. Также можно использовать man:kgdb[1] для вывода значений различных переменных или структур, чтобы выяснить состояние системы во время аварии.
-
-[TIP]
-====
-
-Если есть второй компьютер, то можно настроить man:kgdb[1] на режим удалённой отладки, включая определение точек останова и пошаговый проход по коду ядра.
-====
-
-[NOTE]
-====
-Если включена поддержка `DDB` и ядро переходит в режим отладки, можно намеренно вызвать аварийный останов и создание аварийного дампа, набрав `panic` в приглашении командной строки `ddb`. Выполнение фазы аварийного останова может снова остановиться с вызовом отладчика. В этом случае наберите `continue`, и процесс будет завершён созданием аварийного дампа.
-====
-
-[[dlsym-failure]]
-=== Перестала работать функция dlsym() для исполняемых файлов ELF!
-
-По умолчанию при работе с форматом ELF символы, определённые в исполняемом файле, не доступны динамическому загрузчику. Поэтому при вызове функции `dlsym()`, которая осуществляет поиск по дескриптору, полученному после вызова `dlopen(NULL, flags)`, желаемый результат достигнут не будет.
-
-Чтобы осуществить поиск символов в исполняемом файле процесса с помощью функции `dlsym()`, выполните компоновку исполняемого файла с параметром `--export-dynamic` компоновщика ELF (man:ld[1]).
-
-[[change-kernel-address-space]]
-=== Как я могу увеличить или уменьшить адресное пространство ядра в архитектуре i386?
-
-По умолчанию размер адресного пространства ядра для i386 равен 1 Гбайт (2 Гбайт для PAE). Для работы сервера с интенсивной сетевой нагрузкой или при использовании ZFS этого может быть недостаточно.
-
-Чтобы увеличить доступное пространство, добавьте следующую строку в файл конфигурации ядра и пересоберите ядро:
-
-[.programlisting]
-....
-options KVA_PAGES=N
-....
-
-Чтобы получить нужное значение для _N_, разделите желаемый размер адресного пространства (в мегабайтах) на четыре (для 2 Гбайт это будет `512`).
+Более длинный и полный ответ заключается в том, что после долгих споров о том, должна ли команда man:sleep[1] принимать аргументы в виде дробных секунд, {phk} опубликовал длинное сообщение под названием link:http://www.bikeshed.com[Велосипедный сарай (любого цвета) на более зелёной траве...].
[[acknowledgments]]
-== Наши благодарности
-
-Этот небольшой скромный документ с ответами на часто задаваемые вопросы создавался, переписывался, редактировался, сокращался, растягивался, уродовался, потрошился, пристально разглядывался, полностью перетряхивался, обдумывался, отвергался, перестраивался, критиковался и снова укреплялся в течение последнего десятилетия силами сотен, если не тысяч, людей.
-Постоянно.
+== Благодарности
-Мы хотим поблагодарить каждого из них и приглашаем вас
-extref:{contributing}[присоединиться к ним], чтобы сделать этот FAQ ещё лучше.
+Этот FAQ претерпел бесчисленные правки и улучшения благодаря разнообразной группе участников на протяжении последних десятилетий.
diff --git a/documentation/content/ru/books/faq/_index.po b/documentation/content/ru/books/faq/_index.po
new file mode 100644
index 0000000000..421abd6349
--- /dev/null
+++ b/documentation/content/ru/books/faq/_index.po
@@ -0,0 +1,1811 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-06-29 21:20+0100\n"
+"PO-Revision-Date: 2025-07-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfaq_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/faq/_index.adoc:1
+#: documentation/content/en/books/faq/_index.adoc:13
+#, no-wrap
+msgid "Frequently Asked Questions for FreeBSD"
+msgstr "Часто задаваемые вопросы по FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:46
+msgid "Abstract"
+msgstr "Аннотация"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:49
+msgid ""
+"This is the Frequently Asked Questions (FAQ) for FreeBSD. Every effort has "
+"been made to make this FAQ as informative as possible."
+msgstr ""
+"Это Часто Задаваемые Вопросы (FAQ) по FreeBSD. Были приложены все усилия, "
+"чтобы сделать это руководство максимально информативным."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:51
+msgid "'''"
+msgstr "'''"
+
+#. type: Title ==
+#: documentation/content/en/books/faq/_index.adoc:55
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:59
+msgid ""
+"Welcome to the world of FreeBSD! In this section, we provide a comprehensive "
+"overview of what FreeBSD is, its origins, goals, use cases, and the "
+"community behind it."
+msgstr ""
+"Добро пожаловать в мир FreeBSD! В этом разделе представлен обзор системы "
+"FreeBSD: что это такое, её происхождение, цели, варианты использования и "
+"сообщество, стоящее за ней."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:61
+msgid ""
+"Discover the reasons behind its name, learn how to contribute to this "
+"project, and explore the rich ecosystem of FreeBSD within the context of "
+"open-source operating systems."
+msgstr ""
+"Узнайте причины выбора этого названия, научитесь участвовать в разработке "
+"проекта и изучите богатую экосистему FreeBSD в контексте открытых "
+"операционных систем."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:63
+#, no-wrap
+msgid "What is FreeBSD?"
+msgstr "Что такое FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:67
+msgid ""
+"FreeBSD is a versatile and open-source UNIX(R)-like operating system known "
+"for its exceptional stability, security, and performance. Developed by a "
+"dedicated community of volunteers, it's based on the Berkeley Software "
+"Distribution (BSD) UNIX operating system."
+msgstr ""
+"FreeBSD — это универсальная и открытая операционная система, подобная "
+"UNIX(R), известная своей исключительной стабильностью, безопасностью и "
+"производительностью. Разрабатываемая преданным сообществом добровольцев, "
+"она основана на операционной системе Berkeley Software Distribution (BSD) "
+"UNIX."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:70
+msgid ""
+"FreeBSD offers a powerful and customizable environment suitable for a wide "
+"range of applications, from servers and embedded systems to desktops and "
+"networking equipment. Its commitment to open source principles ensures a "
+"transparent and collaborative development process, making FreeBSD a trusted "
+"choice for those seeking a reliable and highly adaptable operating system."
+msgstr ""
+"FreeBSD предоставляет мощную и настраиваемую среду, подходящую для широкого "
+"спектра применений — от серверов и встраиваемых систем до настольных "
+"компьютеров и сетевого оборудования. Приверженность принципам открытого "
+"исходного кода обеспечивает прозрачный и совместный процесс разработки, что "
+"делает FreeBSD надежным выбором для тех, кто ищет стабильную и "
+"высокоадаптируемую операционную систему."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:72
+#, no-wrap
+msgid "Why is it called FreeBSD?"
+msgstr "Почему система называется FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:76
+msgid ""
+"The name \"FreeBSD\" stems from its roots in the Berkeley Software "
+"Distribution (BSD) UNIX operating system, renowned for its contributions to "
+"the world of open-source software. The \"Free\" in FreeBSD signifies its "
+"commitment to the principles of free and open-source software, which grant "
+"users the freedom to study, modify, and distribute the code."
+msgstr ""
+"Название \"FreeBSD\" происходит от его корней в операционной системе UNIX "
+"Berkeley Software Distribution (BSD), известной своим вкладом в мир "
+"открытого программного обеспечения. Слово \"Free\" в FreeBSD подчеркивает "
+"приверженность принципам свободного и открытого программного обеспечения, "
+"которые предоставляют пользователям свободу изучать, изменять и "
+"распространять исходный код."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:78
+msgid ""
+"It is worth pointing out that the word \"free\" is being used in two ways "
+"here: one meaning \"at no cost\" and the other meaning \"do whatever you like"
+"\"."
+msgstr ""
+"Стоит отметить, что слово «free» здесь используется в двух значениях: одно "
+"означает «бесплатно», а другое — «делай что хочешь»."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:80
+#, no-wrap
+msgid "What is the goal of the FreeBSD Project?"
+msgstr "Какова цель проекта FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:83
+msgid ""
+"The FreeBSD Project has a clear and unwavering goal: to provide a high-"
+"quality, open-source UNIX-like operating system that excels in terms of "
+"performance, security, and stability."
+msgstr ""
+"Проект FreeBSD преследует ясную и непоколебимую цель: предоставить "
+"высококачественную UNIX-подобную операционную систему с открытым исходным "
+"кодом, которая отличается высокой производительностью, безопасностью и "
+"стабильностью."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:87
+msgid ""
+"It aims to offer a versatile platform suitable for a wide range of computing "
+"needs, from servers and workstations to embedded systems and beyond. "
+"FreeBSD is developed with a strong commitment to open source principles, "
+"fostering a collaborative environment where contributions from a global "
+"community of developers help shape and refine the operating system. This "
+"dedication to quality, freedom, and reliability is what sets FreeBSD apart "
+"and drives its ongoing success as an open-source project."
+msgstr ""
+"Он стремится предоставить универсальную платформу, подходящую для широкого "
+"спектра вычислительных задач — от серверов и рабочих станций до встраиваемых "
+"систем и не только. FreeBSD разрабатывается с твердой приверженностью "
+"принципам открытого исходного кода, создавая среду для сотрудничества, в "
+"которой вклад глобального сообщества разработчиков помогает формировать и "
+"совершенствовать операционную систему. Эта приверженность качеству, свободе "
+"и надежности отличает FreeBSD и способствует её постоянному успеху как "
+"проекта с открытым исходным кодом."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:89
+#, no-wrap
+msgid "What uses cases is FreeBSD good for?"
+msgstr "Для каких задач подходит FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:96
+msgid ""
+"FreeBSD is a versatile operating system that excels in various use cases. "
+"It is particularly well-suited for server environments, where its stability "
+"and performance make it a popular choice for web hosting, databases, and "
+"networking applications. FreeBSD's robust security features also position "
+"it as a strong candidate for firewall and security appliance deployments. "
+"Beyond servers, FreeBSD can be tailored to function in specialized "
+"environments, including embedded systems and game console devices. Its "
+"adaptability, reliability, and open-source nature make FreeBSD a compelling "
+"choice for a wide range of computing needs."
+msgstr ""
+"FreeBSD — это универсальная операционная система, которая превосходно "
+"подходит для различных сценариев использования. Она особенно хорошо "
+"зарекомендовала себя в серверных средах, где её стабильность и "
+"производительность делают её популярным выбором для веб-хостинга, баз данных "
+"и сетевых приложений. Надёжные механизмы безопасности FreeBSD также делают "
+"её отличным вариантом для развёртывания межсетевых экранов и защищённых "
+"устройств. Помимо серверов, FreeBSD может быть адаптирована для работы в "
+"специализированных средах, включая встраиваемые системы и игровые консоли. "
+"Её гибкость, надёжность и открытый исходный код делают FreeBSD "
+"привлекательным выбором для широкого спектра вычислительных задач."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:98
+#, no-wrap
+msgid "Who is responsible for FreeBSD?"
+msgstr "Кто отвечает за FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:102
+msgid ""
+"FreeBSD is a community-driven open-source project with a decentralized "
+"structure. Its development and maintenance are carried out by a global "
+"community of dedicated volunteers, developers, and organizations who "
+"collaborate to enhance and expand the operating system."
+msgstr ""
+"FreeBSD - это проект с открытым исходным кодом, развиваемый сообществом и "
+"имеющий децентрализованную структуру. Его разработка и поддержка "
+"осуществляются глобальным сообществом преданных добровольцев, разработчиков "
+"и организаций, которые совместно работают над улучшением и расширением "
+"возможностей операционной системы."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:104
+msgid ""
+"The key decisions concerning the FreeBSD project, such as the overall "
+"direction of the project or who is allowed to add code to the source tree, "
+"are made by an elected Core Team of nine people."
+msgstr ""
+"Ключевые решения, касающиеся проекта FreeBSD, такие как общее направление "
+"развития проекта или право на добавление кода в дерево исходных текстов, "
+"принимаются избираемой командой разработчиков (Core Team) из девяти человек."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:106
+msgid ""
+"This collaborative and community-driven approach has been fundamental to "
+"FreeBSD's success and longevity as a reliable and robust UNIX-like operating "
+"system."
+msgstr ""
+"Этот совместный и ориентированный на сообщество подход был основополагающим "
+"для успеха и долголетия FreeBSD в качестве надежной и устойчивой UNIX-"
+"подобной операционной системы."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:108
+#, no-wrap
+msgid "How can I contribute to FreeBSD? What can I do to help?"
+msgstr "Как я могу внести свой вклад в FreeBSD? Чем я могу помочь?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:112
+msgid ""
+"We accept all types of contributions: documentation, code, and even art. "
+"See the article on extref:{contributing}[Contributing to FreeBSD] for "
+"specific advice on how to do this."
+msgstr ""
+"Мы принимаем все виды вкладов: документацию, код и даже произведения "
+"искусства. Конкретные рекомендации о том, как это сделать, смотрите в "
+"статье extref:{contributing}[Участие в разработке FreeBSD]."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:114
+msgid "And thanks for the thought!"
+msgstr "И спасибо за идеи!"
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:116
+#, no-wrap
+msgid "Does the FreeBSD license have any restrictions?"
+msgstr "Есть ли ограничения в лицензии FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:119
+msgid ""
+"FreeBSD is distributed under the https://www.FreeBSD.org/copyright/freebsd-"
+"license/[BSD License], which is known for its permissive nature."
+msgstr ""
+"FreeBSD распространяется под лицензией https://www.FreeBSD.org/copyright/"
+"freebsd-license/[BSD License], известной своим разрешительным характером."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:121
+msgid "This license places very few restrictions on how you can use FreeBSD:"
+msgstr ""
+"Данная лицензия накладывает очень мало ограничений на использование FreeBSD:"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:123
+msgid "Do not claim that you wrote this."
+msgstr "Не утверждайте, что это написали вы."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:124
+msgid "Do not sue us if it breaks."
+msgstr "Не подавайте на нас в суд, если что-то сломается."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:125
+msgid "Do not remove or modify the license."
+msgstr "Не удаляйте и не изменяйте лицензию."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:129
+msgid ""
+"The license means you are free to modify, distribute, and even sell FreeBSD "
+"without *being required to release your modifications as open source*. "
+"However, there are some minimal conditions, such as retaining the original "
+"copyright notice and disclaimers when distributing FreeBSD. Overall, the "
+"BSD License provides a high degree of freedom and flexibility, making "
+"FreeBSD an attractive choice for a wide range of applications and projects."
+msgstr ""
+"Лицензия означает, что вы можете свободно изменять, распространять и даже "
+"продавать FreeBSD, *не будучи обязанным публиковать свои изменения как "
+"открытый исходный код*. Однако есть несколько минимальных условий, таких "
+"как сохранение оригинального уведомления об авторских правах и отказ от "
+"гарантий при распространении FreeBSD. В целом, лицензия BSD предоставляет "
+"высокую степень свободы и гибкости, что делает FreeBSD привлекательным "
+"выбором для широкого спектра приложений и проектов."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:131
+msgid ""
+"Code in our source tree which falls under the https://www.FreeBSD.org/"
+"copyright/COPYING[GNU General Public License (GPL)] or https://www.FreeBSD."
+"org/copyright/COPYING.LIB[GNU Library General Public License (LGPL)] comes "
+"with slightly more strings attached though, at least on the side of enforced "
+"access rather than the usual opposite."
+msgstr ""
+"Код в нашем дереве исходников, подпадающий под действие https://www.FreeBSD."
+"org/copyright/COPYING[GNU General Public License (GPL)] или https://www."
+"FreeBSD.org/copyright/COPYING.LIB[GNU Library General Public License "
+"(LGPL)], сопровождается несколько большими ограничениями, по крайней мере, в "
+"части обеспечения доступа, в отличие от обычной противоположной ситуации."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:133
+#, no-wrap
+msgid "Can FreeBSD replace my current operating system?"
+msgstr "Может ли FreeBSD заменить мою текущую операционную систему?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:137
+msgid ""
+"For many users and administrators, yes. But this question is not quite that "
+"cut-and-dried."
+msgstr ""
+"Для многих пользователей и администраторов — да. Но этот вопрос не "
+"настолько однозначен."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:140
+msgid ""
+"FreeBSD is a powerful and versatile operating system that can replace or "
+"coexist with many other operating systems, depending on users and "
+"administrators specific needs. However, whether FreeBSD can replace your "
+"current operating system depends on factors such as your hardware, software "
+"requirements, and familiarity with FreeBSD."
+msgstr ""
+"FreeBSD — это мощная и универсальная операционная система, которая может "
+"заменить или сосуществовать с множеством других операционных систем в "
+"зависимости от конкретных потребностей пользователей и администраторов. "
+"Однако возможность замены вашей текущей операционной системы на FreeBSD "
+"зависит от таких факторов, как ваше оборудование, требования к программному "
+"обеспечению и уровень знакомства с FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:142
+msgid ""
+"While it offers a robust and feature-rich alternative, it's essential to "
+"evaluate your specific use case and compatibility requirements before making "
+"the switch."
+msgstr ""
+"Хотя она предлагает надежную и многофункциональную альтернативу, важно "
+"оценить ваши конкретные задачи и требования к совместимости перед переходом."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:144
+msgid ""
+"If an application is only available on one operating system, that operating "
+"system cannot just be replaced."
+msgstr ""
+"Если приложение доступно только в одной операционной системе, эту "
+"операционную систему нельзя просто заменить."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:147
+msgid ""
+"Users migrating to FreeBSD from another UNIX-like environment will find "
+"FreeBSD to be similar. Non-UNIX users, like Windows(R) users, should expect "
+"to invest some additional time learning the UNIX way of doing things."
+msgstr ""
+"Пользователи, переходящие на FreeBSD из другой UNIX-подобной среды, найдут "
+"FreeBSD похожей. Пользователи, не знакомые с UNIX, например пользователи "
+"Windows(R), должны быть готовы потратить дополнительное время на изучение "
+"принципов работы UNIX."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:149
+#, no-wrap
+msgid "Can FreeBSD run popular open source software?"
+msgstr "Может ли FreeBSD запускать популярное открытое программное обеспечение?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:155
+msgid ""
+"Yes, FreeBSD is well-suited for running popular open source software. Its "
+"compatibility with a wide range of applications and libraries makes it a "
+"favorable choice for those looking to deploy and use open source software "
+"packages. FreeBSD provides a robust and stable environment that supports "
+"various programming languages, databases, web servers, and other software "
+"commonly used in the open source community. Its ports and packages system "
+"simplifies the installation and management of such software, ensuring that "
+"users can easily access and run their favorite open source tools and "
+"applications on FreeBSD with minimal hassle."
+msgstr ""
+"Да, FreeBSD хорошо подходит для запуска популярного открытого программного "
+"обеспечения. Его совместимость с широким спектром приложений и библиотек "
+"делает его предпочтительным выбором для тех, кто хочет развертывать и "
+"использовать пакеты открытого ПО. FreeBSD предоставляет надежную и "
+"стабильную среду, поддерживающую различные языки программирования, базы "
+"данных, веб-серверы и другое ПО, часто используемое в сообществе открытого "
+"исходного кода. Система портов и пакетов FreeBSD упрощает установку и "
+"управление таким ПО, гарантируя, что пользователи могут легко получить "
+"доступ и запускать свои любимые открытые инструменты и приложения на FreeBSD "
+"с минимальными трудностями."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:157
+#, no-wrap
+msgid "How can I install software in FreeBSD?"
+msgstr "Как установить программное обеспечение в FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:162
+msgid ""
+"FreeBSD offers multiple methods for software installation. One of the most "
+"common methods involves using the built-in man:pkg[8] package manager, which "
+"simplifies the process by fetching and installing pre-built binary "
+"packages. Another approach is to compile and install software from source "
+"code using the man:ports[7] collection, providing a flexible and "
+"customizable way to install software."
+msgstr ""
+"FreeBSD предоставляет несколько методов установки программного обеспечения. "
+"Один из наиболее распространённых методов — использование встроенного "
+"менеджера пакетов man:pkg[8], который упрощает процесс, загружая и "
+"устанавливая предварительно собранные бинарные пакеты. Другой подход — "
+"компиляция и установка программ из исходного кода с использованием коллекции "
+"man:ports[7], что обеспечивает гибкий и настраиваемый способ установки "
+"программного обеспечения."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:164
+msgid ""
+"FreeBSD's documentation offer detailed guidance on both methods, ensuring "
+"that users can easily expand their system's capabilities with the software "
+"they need."
+msgstr ""
+"Документация FreeBSD предоставляет подробные руководства по обоим методам, "
+"гарантируя, что пользователи смогут легко расширить возможности своей "
+"системы с помощью необходимого программного обеспечения."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:166
+#, no-wrap
+msgid "What are the differences between FreeBSD, NetBSD, OpenBSD, and other open source BSD operating systems?"
+msgstr "Каковы различия между FreeBSD, NetBSD, OpenBSD и другими открытыми BSD-операционными системами?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:170
+msgid ""
+"FreeBSD, NetBSD, OpenBSD and DragonFly BSD are all part of the open source "
+"BSD family, sharing common UNIX-like foundations, but each has its own "
+"distinct focus and priorities. These differences reflect the unique goals "
+"of each project, and while they share similarities, their specific strengths "
+"and emphases cater to different use cases and preferences within the BSD "
+"ecosystem."
+msgstr ""
+"FreeBSD, NetBSD, OpenBSD и DragonFly BSD - все они являются частью семейства "
+"BSD с открытым исходным кодом, разделяя общие UNIX-подобные основы, но "
+"каждый имеет свою собственную направленность и приоритеты. Эти различия "
+"отражают уникальные цели каждого проекта, и хотя они имеют сходства, их "
+"конкретные сильные стороны и акценты ориентированы на различные сценарии "
+"использования и предпочтения в экосистеме BSD."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:172
+#, no-wrap
+msgid "Is FreeBSD a Linux(R) distribution?"
+msgstr "Является ли FreeBSD дистрибутивом Linux(R)?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:175
+msgid "No, FreeBSD is *not* a Linux distribution."
+msgstr "Нет, FreeBSD *не* является дистрибутивом Linux."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:178
+msgid ""
+"While both FreeBSD and Linux are UNIX-like operating systems and share many "
+"similarities, they have distinct kernels. Linux uses the Linux kernel, "
+"whereas FreeBSD uses the FreeBSD kernel, which is based on the Berkeley "
+"Software Distribution (BSD) UNIX operating system."
+msgstr ""
+"Хотя FreeBSD и Linux являются UNIX-подобными операционными системами и имеют "
+"много общего, у них разные ядра. Linux использует ядро Linux, тогда как "
+"FreeBSD использует ядро FreeBSD, основанное на операционной системе Berkeley "
+"Software Distribution (BSD) UNIX."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:180
+msgid ""
+"FreeBSD and Linux each have their own unique development communities, "
+"release cycles, and system architectures, making them separate and "
+"independent operating systems."
+msgstr ""
+"FreeBSD и Linux имеют свои уникальные сообщества разработчиков, циклы "
+"выпуска версий и архитектуры систем, что делает их отдельными и независимыми "
+"операционными системами."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:182
+msgid ""
+"FreeBSD provides its own set of advantages, including a different licensing "
+"model, system design, and userland utilities compared to Linux distributions."
+msgstr ""
+"FreeBSD предоставляет свои собственные преимущества, включая отличную модель "
+"лицензирования, дизайн системы и пользовательские утилиты по сравнению с "
+"дистрибутивами Linux."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:184
+#, no-wrap
+msgid "Is it possible to run Linux programs on FreeBSD?"
+msgstr "Возможно ли запускать Linux-программы в FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:188
+msgid ""
+"Yes, FreeBSD provides a compatibility layer known as _linuxulator_ (man:"
+"linux[4]), allowing many Linux programs to function on FreeBSD. This "
+"feature facilitates the execution of a broad spectrum of Linux binaries "
+"without the necessity of a dedicated Linux environment."
+msgstr ""
+"Да, FreeBSD предоставляет слой совместимости, известный как _linuxulator_ "
+"(man:linux[4]), который позволяет многим Linux-программам работать в "
+"FreeBSD. Эта функция обеспечивает выполнение широкого спектра Linux-"
+"бинарников без необходимости в отдельной Linux-среде."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:190
+msgid ""
+"Nevertheless, it's important to note that numerous widely used open-source "
+"software *have native FreeBSD versions available* through the ports and "
+"packages system."
+msgstr ""
+"Тем не менее, важно отметить, что множество широко используемых программ с "
+"открытым исходным кодом *имеют собственные версии для FreeBSD*, доступные "
+"через систему портов и пакетов."
+
+#. type: Title ==
+#: documentation/content/en/books/faq/_index.adoc:192
+#, no-wrap
+msgid "Installing FreeBSD"
+msgstr "Установка FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:197
+msgid ""
+"The process of installing FreeBSD is the initial step toward harnessing the "
+"power of this robust open-source operating system. This section provides "
+"essential information on where to obtain FreeBSD, detailed installation "
+"instructions, and insights into concepts like FreeBSD-CURRENT and FreeBSD-"
+"STABLE. It also delves into the release and snapshot schedules, post-"
+"installation configuration tools, package search methods, and addresses "
+"common questions regarding package updates."
+msgstr ""
+"Процесс установки FreeBSD — это первый шаг к использованию возможностей этой "
+"мощной операционной системы с открытым исходным кодом. В этом разделе "
+"представлена важная информация о том, где получить FreeBSD, подробные "
+"инструкции по установке, а также объяснение таких концепций, как FreeBSD-"
+"CURRENT и FreeBSD-STABLE. Также рассматриваются график выпуска релизов и "
+"снимков (snapshots), инструменты настройки после установки, методы поиска "
+"пакетов и ответы на часто задаваемые вопросы об обновлении пакетов."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:199
+#, no-wrap
+msgid "Where can I get FreeBSD?"
+msgstr "Где взять FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:202
+msgid ""
+"FreeBSD is freely available for download from the link:https://www.FreeBSD."
+"org/where/[official FreeBSD website]."
+msgstr ""
+"FreeBSD доступна для бесплатной загрузки по ссылке: link:https://www.FreeBSD."
+"org/where/[официальный сайт FreeBSD]."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:205
+msgid ""
+"Additionally, FreeBSD may also be available through various mirror sites, "
+"ensuring accessibility to users worldwide. The link:https://www.FreeBSD.org/"
+"where/[official website] is the primary and most reliable source for "
+"obtaining the latest FreeBSD releases and updates, making it the ideal "
+"starting point for a FreeBSD journey."
+msgstr ""
+"Кроме того, FreeBSD также может быть доступен через различные зеркальные "
+"сайты, что обеспечивает доступность для пользователей по всему миру. "
+"Основным и наиболее надежным источником для получения последних выпусков и "
+"обновлений FreeBSD является link:https://www.FreeBSD.org/where/[официальный "
+"сайт], что делает его идеальной отправной точкой для начала работы с FreeBSD."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:207
+#, no-wrap
+msgid "Where are the instructions for installing FreeBSD?"
+msgstr "Где находятся инструкции по установке FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:210
+msgid ""
+"Installation instructions can be found at the extref:{handbook}bsdinstall/"
+"[Installing FreeBSD Chapter of the Handbook]."
+msgstr ""
+"Инструкции по установке можно найти в главе extref:{handbook}bsdinstall/"
+"[Установка FreeBSD Руководства]."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:212
+#, no-wrap
+msgid "What is the FreeBSD-CURRENT concept?"
+msgstr "Что такое концепция FreeBSD-CURRENT?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:216
+msgid ""
+"FreeBSD-CURRENT represents the development branch of the FreeBSD operating "
+"system. It is the most cutting-edge version of FreeBSD, where active "
+"development takes place."
+msgstr ""
+"FreeBSD-CURRENT представляет собой ветку разработки операционной системы "
+"FreeBSD. Это самая передовая версия FreeBSD, в которой ведётся активная "
+"разработка."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:218
+msgid ""
+"While it incorporates the latest features, improvements, and experimental "
+"changes, it may not always be as stable as the FreeBSD-STABLE or release "
+"versions."
+msgstr ""
+"Хотя он включает последние функции, улучшения и экспериментальные изменения, "
+"он не всегда может быть таким стабильным, как FreeBSD-STABLE или релизные "
+"версии."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:220
+msgid ""
+"FreeBSD-CURRENT serves as a platform for developers and enthusiasts who want "
+"to contribute to the future of FreeBSD and stay on the leading edge of its "
+"development, even though it may occasionally undergo significant changes and "
+"*is not recommended for production systems*."
+msgstr ""
+"FreeBSD-CURRENT — это платформа для разработчиков и энтузиастов, которые "
+"хотят внести свой вклад в будущее FreeBSD и оставаться на переднем крае её "
+"разработки, даже несмотря на то, что в ней могут иногда происходить "
+"значительные изменения и *она не рекомендуется для производственных систем*."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:222
+#, no-wrap
+msgid "What is the FreeBSD-STABLE concept?"
+msgstr "Что такое концепция FreeBSD-STABLE?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:227
+msgid ""
+"The FreeBSD-STABLE branch is a more stable development branch compared to "
+"CURRENT. It contains code that is undergoing further testing and refinement "
+"before being merged into the RELEASE branch. STABLE is a good choice for "
+"those who want to track FreeBSD's development but prefer a more stable "
+"environment than CURRENT."
+msgstr ""
+"Ветка FreeBSD-STABLE — это более стабильная ветка разработки по сравнению с "
+"CURRENT. Она содержит код, который проходит дополнительные тестирование и "
+"доработку перед слиянием в ветку RELEASE. STABLE — хороший выбор для тех, "
+"кто хочет следить за разработкой FreeBSD, но предпочитает более стабильную "
+"среду, чем CURRENT."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:229
+#, no-wrap
+msgid "When are FreeBSD releases made of?"
+msgstr "Когда выходят выпуски FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:234
+msgid ""
+"The {re} releases a new major version of FreeBSD about every 18 months and a "
+"new minor version about every 8 months, on average. Release dates are "
+"announced well in advance, so that the people working on the system know "
+"when their projects need to be finished and tested. A testing period "
+"precedes each release, to ensure that the addition of new features does not "
+"compromise the stability of the release."
+msgstr ""
+"Версия {re} выпускает новую основную версию FreeBSD примерно каждые 18 "
+"месяцев и новую промежуточную версию — в среднем каждые 8 месяцев. Даты "
+"выпуска объявляются заранее, чтобы разработчики знали, когда их проекты "
+"должны быть завершены и протестированы. Перед каждым выпуском проводится "
+"период тестирования, чтобы убедиться, что добавление новых функций не "
+"нарушает стабильность релиза."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:236
+#, no-wrap
+msgid "When are FreeBSD snapshots made?"
+msgstr "Когда создаются снимки состояния FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:242
+msgid ""
+"FreeBSD snapshots are typically generated at regular intervals for all "
+"actively developed branches. These snapshots capture a moment in time of "
+"the FreeBSD source code and associated binary packages. The frequency of "
+"these snapshots may vary but is often done on a weekly or bi-weekly basis. "
+"These snapshots provide users with an opportunity to access the latest "
+"developments and changes in FreeBSD, helping them stay up-to-date with the "
+"project's progress."
+msgstr ""
+"Снимки FreeBSD обычно создаются с регулярными интервалами для всех активно "
+"разрабатываемых веток. Эти снимки фиксируют состояние исходного кода "
+"FreeBSD и связанных с ним бинарных пакетов на определённый момент времени. "
+"Частота создания снимков может варьироваться, но обычно они делаются "
+"еженедельно или раз в две недели. Эти снимки предоставляют пользователям "
+"возможность получить доступ к последним изменениям и разработкам в FreeBSD, "
+"помогая им оставаться в курсе прогресса проекта."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:244
+#, no-wrap
+msgid "Is there a tool to perform post-installation configuration tasks?"
+msgstr "Есть ли инструмент для выполнения задач пост-установочной конфигурации?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:247
+msgid ""
+"Yes. man:bsdconfig[8] provides a nice interface to configure FreeBSD post-"
+"installation."
+msgstr ""
+"Да. man:bsdconfig[8] предоставляет удобный интерфейс для настройки FreeBSD "
+"после установки."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:249
+#, no-wrap
+msgid "How can I search for software to install in FreeBSD?"
+msgstr "Как найти программное обеспечение для установки в FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:252
+msgid ""
+"Searching for software to install in FreeBSD is made easy through the man:"
+"pkg[8] package manager and the `pkg search` command."
+msgstr ""
+"Поиск программного обеспечения для установки в FreeBSD упрощается благодаря "
+"менеджеру пакетов man:pkg[8] и команде `pkg search`."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:255
+msgid ""
+"Users can utilize this command to search for available packages using "
+"keywords, package names, or descriptions. This feature helps users quickly "
+"locate the software they need within the extensive FreeBSD ports and "
+"packages collection, simplifying the process of adding new applications and "
+"tools to their FreeBSD systems."
+msgstr ""
+"Пользователи могут использовать эту команду для поиска доступных пакетов по "
+"ключевым словам, названиям пакетов или описаниям. Эта функция помогает "
+"быстро найти нужное программное обеспечение в обширной коллекции портов и "
+"пакетов FreeBSD, упрощая процесс добавления новых приложений и инструментов "
+"в систему FreeBSD."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:257
+#, no-wrap
+msgid "Why am I not getting the latest packages in my FreeBSD system?"
+msgstr "Почему я не получаю последние пакеты в моей системе FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:260
+msgid ""
+"The availability of the latest packages in FreeBSD can be influenced by "
+"various factors, including the package repository's update frequency and the "
+"specific version of FreeBSD being used."
+msgstr ""
+"Доступность последних пакетов в FreeBSD может зависеть от различных "
+"факторов, включая частоту обновлений репозитория пакетов и используемую "
+"версию FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:265
+msgid ""
+"It should also be added that there are two branches for the FreeBSD ports. "
+"The most updated is called `latest` and the most stable is called "
+"`quarterly`. To use the latest packages it will be necessary to configure "
+"the `latest` branch. Information on how to configure branches can be found "
+"in the link:{handbook}ports/[Ports chapter of the Handbook]."
+msgstr ""
+"Также следует отметить, что для портов FreeBSD существуют две ветки. "
+"Наиболее обновляемая называется `latest`, а наиболее стабильная — "
+"`quarterly`. Для использования самых свежих пакетов необходимо настроить "
+"ветку `latest`. Информацию о настройке веток можно найти в link:{handbook}"
+"ports/[главе о портах в Руководстве]."
+
+#. type: Title ==
+#: documentation/content/en/books/faq/_index.adoc:267
+#, no-wrap
+msgid "Hardware"
+msgstr "Оборудование"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:272
+msgid ""
+"The Hardware section explores FreeBSD's compatibility with various hardware "
+"configurations. It covers a range of topics, including supported "
+"architectures, maximum RAM capacity, processor scalability, graphics card "
+"compatibility, Wi-Fi card support, and the inclusion of 10 Gigabit Ethernet "
+"network card support. Whether planning to deploy FreeBSD on servers, "
+"workstations, or specialized hardware, this section provides insights into "
+"FreeBSD's capabilities and limitations, offering information about hardware "
+"choices and configurations."
+msgstr ""
+"В разделе «Оборудование» рассматривается совместимость FreeBSD с различными "
+"аппаратными конфигурациями. Он охватывает широкий круг тем, включая "
+"поддерживаемые архитектуры, максимальный объем оперативной памяти, "
+"масштабируемость процессоров, совместимость с видеокартами, поддержку Wi-Fi-"
+"адаптеров, а также работу с сетевыми картами 10 Gigabit Ethernet. "
+"Независимо от того, планируется ли развертывание FreeBSD на серверах, "
+"рабочих станциях или специализированном оборудовании, этот раздел дает "
+"представление о возможностях и ограничениях FreeBSD, предоставляя информацию "
+"о выборе и настройке оборудования."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:274
+#, no-wrap
+msgid "What architectures does FreeBSD support?"
+msgstr "Какие архитектуры поддерживает FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:278
+msgid ""
+"FreeBSD boasts a versatile range of supported architectures, making it a "
+"flexible choice for a variety of hardware environments. Its compatibility "
+"extends to architectures such as `amd64`, `arm64`, `riscv` and more."
+msgstr ""
+"FreeBSD поддерживает широкий спектр архитектур, что делает его гибким "
+"выбором для различных аппаратных сред. Совместимость распространяется на "
+"такие архитектуры, как `amd64`, `arm64`, `riscv` и другие."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:280
+msgid ""
+"A complete list of supported architectures can be found on the link:https://"
+"www.FreeBSD.org/platforms/[platforms page]."
+msgstr ""
+"Полный список поддерживаемых архитектур можно найти на странице link:https://"
+"www.FreeBSD.org/platforms/[платформ]."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:282
+#, no-wrap
+msgid "How much RAM does FreeBSD support?"
+msgstr "Сколько оперативной памяти поддерживает FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:286
+msgid ""
+"FreeBSD as an operating system generally supports as much physical memory "
+"(RAM) as the platform it is running on does. Keep in mind that different "
+"platforms have different limits for memory."
+msgstr ""
+"FreeBSD как операционная система обычно поддерживает столько же физической "
+"памяти (RAM), сколько и платформа, на которой она работает. Следует "
+"учитывать, что разные платформы имеют разные ограничения по памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:288
+msgid "For example, `amd64` platforms support up to 4TB of physical memory."
+msgstr "Например, платформы `amd64` поддерживают до 4 ТБ физической памяти."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:290
+#, no-wrap
+msgid "How many processors does FreeBSD support?"
+msgstr "Сколько процессоров поддерживает FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:295
+msgid ""
+"FreeBSD's processor support varies across different architectures. On amd64 "
+"and arm64 systems, FreeBSD can efficiently harness the power of up to 1024 "
+"processors. For powerpc-based systems, FreeBSD supports up to 256 "
+"processors, while on risc-v systems, it can effectively utilize up to 16 "
+"processors."
+msgstr ""
+"Поддержка процессоров в FreeBSD варьируется в зависимости от архитектуры. "
+"На системах amd64 и arm64 FreeBSD может эффективно использовать до 1024 "
+"процессоров. На системах с архитектурой powerpc FreeBSD поддерживает до 256 "
+"процессоров, а на системах risc-v — до 16 процессоров."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:297
+#, no-wrap
+msgid "What graphics cards does FreeBSD support?"
+msgstr "Какие графические карты поддерживает FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:300
+msgid ""
+"Popular graphics vendors like Intel(R), AMD(R) or NVIDIA(R) are well-"
+"supported."
+msgstr ""
+"Известные производители графических устройств, такие как Intel(R), AMD(R) "
+"или NVIDIA(R), хорошо поддерживаются."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:302
+msgid ""
+"A list of supported graphics cards from link:https://wiki.freebsd.org/"
+"Graphics/Intel-GPU-Matrix[Intel] and link:https://wiki.freebsd.org/Graphics/"
+"AMD-GPU-Matrix[AMD] can be found in the FreeBSD Wiki."
+msgstr ""
+"Список поддерживаемых видеокарт от link:https://wiki.freebsd.org/Graphics/"
+"Intel-GPU-Matrix[Intel] и link:https://wiki.freebsd.org/Graphics/AMD-GPU-"
+"Matrix[AMD] можно найти в FreeBSD Wiki."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:304
+#, no-wrap
+msgid "What Wi-Fi cards does FreeBSD support?"
+msgstr "Какие Wi-Fi карты поддерживает FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:307
+msgid ""
+"This is a rapidly changing area as of 2025, so it's worth checking the "
+"Hardware Compatibility List for your chosen link:https://www.freebsd.org/"
+"releases/[release]."
+msgstr ""
+"Это область, которая быстро меняется по состоянию на 2025 год, поэтому "
+"рекомендуется проверить Список совместимого оборудования для выбранного "
+"link:https://www.freebsd.org/releases/[релиза]."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:309
+msgid "The list of PCIe Wi-Fi devices that are known to work well on FreeBSD:"
+msgstr "Список устройств PCIe Wi-Fi, которые хорошо работают в FreeBSD:"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:311
+msgid ""
+"Intel chipset devices covered by man:iwlwifi[4] (high-speed as of FreeBSD "
+"14.3)"
+msgstr ""
+"Устройства на чипсетах Intel, поддерживаемые man:iwlwifi[4] ("
+"высокоскоростные — начиная с FreeBSD 14.3)"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:312
+msgid "Realtek RTL8188CE Mini PCIe"
+msgstr "Realtek RTL8188CE Mini PCIe"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:314
+msgid "The list of USB Wi-Fi devices that are known to work well on FreeBSD:"
+msgstr "Список USB Wi-Fi устройств, которые хорошо работают в FreeBSD:"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:316
+msgid "RT5370 USB dongles (supports hostap mode)"
+msgstr "USB-адаптеры RT5370 (поддерживают режим hostap)"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:317
+msgid "TP-Link TL-WDN3200 (RT5592, man:if_run[4])"
+msgstr "TP-Link TL-WDN3200 (RT5592, man:if_run[4])"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:318
+msgid "TP-Link TL-WN725N v2 (RTL8188EU, man:rtwn[4])"
+msgstr "TP-Link TL-WN725N v2 (RTL8188EU, man:rtwn[4])"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:319
+msgid "TP-Link Archer T4U (RTL8812AU, man:rtwn[4])"
+msgstr "TP-Link Archer T4U (RTL8812AU, man:rtwn[4])"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:320
+msgid "D-Link DWA-131 (RTL8192CU, man:rtwn[4])"
+msgstr "D-Link DWA-131 (RTL8192CU, man:rtwn[4])"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:321
+msgid "D-Link DWA-171 rev A1 (RTL8821AU, man:rtwn[4])"
+msgstr "D-Link DWA-171 rev A1 (RTL8821AU, man:rtwn[4])"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:322
+msgid "ASUS USB-N10 NANO (RTL8188CUS, man:rtwn[4])"
+msgstr "ASUS USB-N10 NANO (RTL8188CUS, man:rtwn[4])"
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:325
+#, no-wrap
+msgid "Does FreeBSD support 10 Gigabit Ethernet network cards?"
+msgstr "Поддерживает ли FreeBSD сетевые карты 10 Gigabit Ethernet?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:329
+msgid ""
+"FreeBSD provides robust support for 10 Gigabit Ethernet network cards, "
+"making it a viable choice for high-speed networking environments. The "
+"FreeBSD kernel includes drivers for a wide range of 10 Gigabit Ethernet "
+"adapters from various manufacturers, ensuring seamless integration and "
+"optimal network performance."
+msgstr ""
+"FreeBSD обеспечивает надежную поддержку сетевых карт 10 Gigabit Ethernet, "
+"что делает его подходящим выбором для высокоскоростных сетевых сред. Ядро "
+"FreeBSD включает драйверы для широкого спектра адаптеров 10 Gigabit Ethernet "
+"от различных производителей, гарантируя беспрерывную интеграцию и "
+"оптимальную производительность сети."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:331
+msgid ""
+"More information can be obtained at the link:https://wiki.freebsd.org/"
+"Networking/10GbE[FreeBSD Wiki]."
+msgstr ""
+"Дополнительную информацию можно получить по ссылке: link:https://wiki."
+"freebsd.org/Networking/10GbE[FreeBSD Wiki]."
+
+#. type: Title ==
+#: documentation/content/en/books/faq/_index.adoc:333
+#, no-wrap
+msgid "Documentation and Support"
+msgstr "Документация и Поддержка"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:337
+msgid ""
+"This section provides valuable resources for those seeking to deepen their "
+"knowledge of FreeBSD. It covers a range of topics, including recommended "
+"books for learning FreeBSD, avenues for commercial training and support, "
+"insights into understanding FreeBSD's internals, and where to find "
+"assistance within the FreeBSD community."
+msgstr ""
+"В этом разделе представлены полезные ресурсы для тех, кто хочет углубить "
+"свои знания о FreeBSD. Здесь рассматриваются различные темы, включая "
+"рекомендуемые книги для изучения FreeBSD, варианты коммерческого обучения и "
+"поддержки, информацию о понимании внутреннего устройства FreeBSD, а также о "
+"том, где можно получить помощь в сообществе FreeBSD."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:339
+#, no-wrap
+msgid "What good books are there about FreeBSD?"
+msgstr "Какие есть хорошие книги о FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:343
+msgid ""
+"FreeBSD enthusiasts and learners can explore a variety of informative books "
+"dedicated to the operating system. These books cover topics ranging from "
+"FreeBSD basics to advanced system administration and development."
+msgstr ""
+"Энтузиасты и изучающие FreeBSD могут ознакомиться с разнообразными "
+"информативными книгами, посвящёнными этой операционной системе. Эти книги "
+"охватывают темы от основ FreeBSD до продвинутого системного "
+"администрирования и разработки."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:346
+msgid ""
+"Some notable titles include \"Absolute FreeBSD: The Complete Guide To FreeBSD"
+"\" by Michael W. Lucas, and the \"FreeBSD Mastery series\" also by Michael "
+"W. Lucas, among others. These resources offer valuable insights and "
+"knowledge to help users of all levels master FreeBSD and maximize its "
+"potential."
+msgstr ""
+"Некоторые примечательные книги включают *\"FreeBSD: Подробное руководство"
+"\" (\"Absolute FreeBSD: The Complete Guide To FreeBSD\")* Майкла В. Лукаса и "
+"серию *\"FreeBSD Mastery\"* того же автора, среди прочих. Эти ресурсы "
+"предоставляют ценные знания и помогают пользователям любого уровня освоить "
+"FreeBSD и раскрыть её потенциал."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:348
+msgid ""
+"Apart from the books, The FreeBSD Project produces a wide range of "
+"documentation, available online in the link:https://docs.FreeBSD.org/"
+"[Documentation Portal]."
+msgstr ""
+"Помимо книг, проект FreeBSD создает обширную документацию, доступную онлайн "
+"на портале link:https://docs.FreeBSD.org/[Документация]."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:350
+#, no-wrap
+msgid "Where can I get commercial FreeBSD training and support?"
+msgstr "Где можно получить коммерческое обучение и поддержку FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:354
+msgid ""
+"For those seeking professional training and support for FreeBSD, several "
+"commercial providers offer tailored services. The FreeBSD project maintains "
+"a link:https://www.freebsd.org/commercial/[list of companies] from which "
+"support can be requested."
+msgstr ""
+"Для тех, кто ищет профессиональное обучение и поддержку по FreeBSD, "
+"несколько коммерческих поставщиков предлагают индивидуальные услуги. Проект "
+"FreeBSD ведет link:https://www.freebsd.org/commercial/[список компаний], у "
+"которых можно запросить поддержку."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:356
+#, no-wrap
+msgid "How can I learn more about FreeBSD's internals?"
+msgstr "Как можно узнать больше о внутреннем устройстве FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:360
+msgid ""
+"To delve deeper into the inner workings of FreeBSD, interested individuals "
+"can explore resources like \"The Design And Implementation Of The FreeBSD "
+"Operating System\". The extref:{arch-handbook}[FreeBSD Architecture "
+"Handbook]. is another valuable resource that provides detailed information "
+"about FreeBSD's architecture, system organization, and design principles"
+msgstr ""
+"Для более глубокого изучения внутреннего устройства FreeBSD заинтересованные "
+"лица могут обратиться к таким ресурсам, как \"FreeBSD: Дизайн и архитектура "
+"(The Design And Implementation Of The FreeBSD Operating System)\". Ещё "
+"одним ценным источником информации является extref:{arch-handbook}"
+"[Руководство по архитектуре FreeBSD], который предоставляет подробные "
+"сведения об архитектуре FreeBSD, организации системы и принципах "
+"проектирования"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:362
+msgid ""
+"Additionally, reviewing the FreeBSD source code, available through the "
+"FreeBSD source repository, provides valuable insights into the operating "
+"system's core components."
+msgstr ""
+"Кроме того, изучение исходного кода FreeBSD, доступного в репозитории "
+"исходных текстов FreeBSD, дает ценное представление об основных компонентах "
+"операционной системы."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:364
+#, no-wrap
+msgid "How can I get help in a FreeBSD system?"
+msgstr "Как получить помощь в системе FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:369
+msgid ""
+"Getting assistance within a FreeBSD system is straightforward. FreeBSD "
+"offers a wealth of built-in documentation, accessible through the man:man[1] "
+"command, which provides comprehensive information about various commands and "
+"system components."
+msgstr ""
+"Получить помощь в системе FreeBSD довольно просто. FreeBSD предоставляет "
+"обширную встроенную документацию, доступную через команду man:man[1], "
+"которая содержит подробную информацию о различных командах и компонентах "
+"системы."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:371
+msgid ""
+"Additionally, the extref:{handbook}[FreeBSD Handbook], available both online "
+"and locally on the system, serves as a valuable resource for in-depth "
+"guidance."
+msgstr ""
+"Кроме того, extref:{handbook}[Руководство FreeBSD], доступное как онлайн, "
+"так и локально в системе, служит ценным ресурсом для получения подробных "
+"инструкций."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:373
+msgid ""
+"If specific issues arise, seeking help from the FreeBSD community via "
+"mailing lists, forums, or IRC can provide timely solutions and insights from "
+"experienced FreeBSD users and developers."
+msgstr ""
+"Если возникают конкретные проблемы, можно обратиться за помощью в сообщество "
+"FreeBSD через списки рассылки, форумы или IRC, чтобы получить своевременные "
+"решения и советы от опытных пользователей и разработчиков FreeBSD."
+
+#. type: Title ==
+#: documentation/content/en/books/faq/_index.adoc:375
+#, no-wrap
+msgid "Community Questions"
+msgstr "Вопросы о сообществе"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:378
+msgid ""
+"Explore this section to discover ways to engage with the FreeBSD community."
+msgstr ""
+"Изучите этот раздел, чтобы узнать о способах взаимодействия с сообществом "
+"FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:381
+msgid ""
+"Learn about FreeBSD IRC channels for real-time discussions, web-based forums "
+"for sharing insights, and access to FreeBSD mailing lists and news groups "
+"for in-depth discussions and news updates."
+msgstr ""
+"Узнайте о каналах FreeBSD в IRC для обсуждений в реальном времени, веб-"
+"форумах для обмена мнениями, а также о почтовых рассылках и группах новостей "
+"FreeBSD для углубленных обсуждений и получения обновлений."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:383
+#, no-wrap
+msgid "Are there FreeBSD IRC (Internet Relay Chat) channels?"
+msgstr "Есть ли каналы FreeBSD в IRC (Internet Relay Chat)?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:386
+msgid ""
+"Yes, most major IRC networks host a FreeBSD chat channel and the FreeBSD "
+"wiki holds an up to date link:https://wiki.freebsd.org/IRC/Channels[list of "
+"IRC channels]."
+msgstr ""
+"Да, большинство крупных IRC-сетей имеют канал для обсуждения FreeBSD, а на "
+"вики FreeBSD доступен актуальный link:https://wiki.freebsd.org/IRC/"
+"Channels[список IRC-каналов]."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:389
+msgid ""
+"Each of these channels are distinct and are not connected to each other. "
+"Since their chat styles differ, try each to find one suited to your chat "
+"style."
+msgstr ""
+"Каждый из этих каналов уникален и не связан с другими. Поскольку их стили "
+"общения различаются, попробуйте каждый, чтобы найти подходящий вам стиль "
+"чата."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:391
+#, no-wrap
+msgid "Are there any web based forums to discuss FreeBSD?"
+msgstr "Есть ли веб-форумы для обсуждения FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:394
+msgid ""
+"The official FreeBSD forums are located at the link:https://forums.FreeBSD."
+"org/[FreeBSD Forums homepage]."
+msgstr ""
+"Официальные форумы FreeBSD расположены по ссылке: link:https://forums."
+"FreeBSD.org/[Домашняя страница форумов FreeBSD]."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:396
+#, no-wrap
+msgid "Where do I find info on the FreeBSD mailing lists?"
+msgstr "Где найти информацию о списках рассылки FreeBSD?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:399
+msgid ""
+"The public mailing lists can be found at the link:https://lists.freebsd.org/"
+"[FreeBSD mailing lists]."
+msgstr ""
+"Списки рассылки с открытым доступом можно найти по ссылке: link:https://"
+"lists.freebsd.org/[списки рассылки FreeBSD]."
+
+#. type: Title ==
+#: documentation/content/en/books/faq/_index.adoc:401
+#, no-wrap
+msgid "Miscellaneous Questions"
+msgstr "Разные вопросы"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:404
+msgid ""
+"Explore a variety of intriguing and practical queries about FreeBSD, "
+"covering topics from shell choices to system quirks and even the FreeBSD "
+"pet's name."
+msgstr ""
+"Изучите множество интересных и практичных вопросов о FreeBSD, начиная от "
+"выбора оболочки (shell) до особенностей системы и даже имени питомца FreeBSD."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:406
+#, no-wrap
+msgid "Why is /bin/sh so minimal? Why does FreeBSD not use bash or another shell?"
+msgstr "Почему /bin/sh такой минималистичный? Почему FreeBSD не использует bash или другую оболочку?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:412
+msgid ""
+"Many people need to write shell scripts which will be portable across many "
+"systems. That is why POSIX(R) specifies the shell and utility commands in "
+"great detail. Most scripts are written in Bourne shell (man:sh[1]), and "
+"because several important programming interfaces are specified to use the "
+"Bourne shell to interpret commands. As the Bourne shell is so often and "
+"widely used, it is important for it to be quick to start, be deterministic "
+"in its behavior, and have a small memory footprint."
+msgstr ""
+"Многие люди сталкиваются с необходимостью написания сценариев командной "
+"оболочки, которые будут переносимы между различными системами. Именно "
+"поэтому POSIX(R) детально определяет стандарты для оболочки и утилит. "
+"Большинство сценариев пишутся на Bourne shell (man:sh[1]), так как несколько "
+"важных программных интерфейсов требуют использования Bourne shell для "
+"интерпретации команд. Поскольку Bourne shell так часто и широко "
+"применяется, важно, чтобы он быстро запускался, имел предсказуемое поведение "
+"и требовал мало памяти."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:415
+msgid ""
+"The existing implementation is our best effort at meeting as many of these "
+"requirements simultaneously as we can. To keep `/bin/sh` small, we have not "
+"provided many of the convenience features that other shells have."
+msgstr ""
+"Существующая реализация — это наш наилучший подход к одновременному "
+"удовлетворению как можно большего числа этих требований. Чтобы сохранить `/"
+"bin/sh` компактным, мы не добавили многие удобные функции, которые есть в "
+"других оболочках."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:417
+msgid ""
+"That is why other more featureful shells like `bash`, `scsh`, man:tcsh[1], "
+"and `zsh` are available."
+msgstr ""
+"Вот почему доступны другие, более функциональные оболочки, такие как `bash`, "
+"`scsh`, man:tcsh[1] и `zsh`."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:419
+#, no-wrap
+msgid "How do I use my delete key in sh and csh?"
+msgstr "Как использовать клавишу Delete в sh и csh?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:422
+msgid "For the Bourne Shell, add the following lines to [.filename]#~/.shrc#:"
+msgstr ""
+"Для оболочки Bourne Shell добавьте следующие строки в файл [.filename]#~/."
+"shrc#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/faq/_index.adoc:426
+#, no-wrap
+msgid "bind ^[[3~ ed-delete-next-char # for xterm\n"
+msgstr "bind ^[[3~ ed-delete-next-char # for xterm\n"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:429
+msgid "For the C Shell, add the following lines to [.filename]#~/.cshrc#:"
+msgstr ""
+"Для оболочки C Shell добавьте следующие строки в файл [.filename]#~/.cshrc#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/faq/_index.adoc:433
+#, no-wrap
+msgid "bindkey ^[[3~ delete-char # for xterm\n"
+msgstr "bindkey ^[[3~ delete-char # for xterm\n"
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:436
+#, no-wrap
+msgid "I have forgotten the root password! What do I do?"
+msgstr "Я забыл пароль root! Что делать?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:443
+msgid ""
+"Do not panic! Restart the system, type `boot -s` at the `Boot:` prompt to "
+"enter single-user mode. At the question about the shell to use, hit kbd:"
+"[Enter] which will display a # prompt. Enter `mount -urw /` to remount the "
+"root file system read/write, then run `mount -a` to remount all the file "
+"systems. Run `passwd root` to change the `root` password then run man:"
+"exit[1] to continue booting."
+msgstr ""
+"Не паникуйте! Перезагрузите систему, введите `boot -s` при появлении запроса "
+"`Boot:`, чтобы перейти в однопользовательский режим. На вопрос о выборе "
+"оболочки нажмите kbd:[Enter], после чего появится приглашение #. Введите "
+"`mount -urw /`, чтобы перемонтировать корневую файловую систему в режиме "
+"чтения/записи, затем выполните `mount -a` для перемонтирования всех файловых "
+"систем. Выполните `passwd root`, чтобы изменить пароль `root`, а затем "
+"введите man:exit[1] для продолжения загрузки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/faq/_index.adoc:450
+msgid ""
+"If you are still prompted to give the `root` password when entering the "
+"single-user mode, it means that the console has been marked as `insecure` in "
+"[.filename]#/etc/ttys#. In this case, it will be required to boot from a "
+"FreeBSD installation disk, choose the [.guimenuitem]#Live CD# or [."
+"guimenuitem]#Shell# at the beginning of the install process and issue the "
+"commands mentioned above. Mount the specific partition in this case and "
+"then chroot to it. For example, replace `mount -urw /` with `mount /dev/"
+"ada0p1 /mnt; chroot /mnt` for a system on _ada0p1_."
+msgstr ""
+"Если при входе в однопользовательский режим всё ещё запрашивается пароль "
+"`root`, это означает, что консоль помечена как `insecure` в [.filename]#/etc/"
+"ttys#. В этом случае потребуется загрузиться с установочного диска FreeBSD, "
+"выбрать [.guimenuitem]#Live CD# или [.guimenuitem]#Shell# в начале процесса "
+"установки и выполнить указанные выше команды. Смонтируйте конкретный раздел "
+"в этом случае и затем выполните chroot для него. Например, замените `mount -"
+"urw /` на `mount /dev/ada0p1 /mnt; chroot /mnt` для системы на _ada0p1_."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/faq/_index.adoc:456
+msgid ""
+"If the root partition cannot be mounted from single-user mode, it is "
+"possible that the partitions are encrypted and it is impossible to mount "
+"them without the access keys. For more information see the section about "
+"encrypted disks in the FreeBSD extref:{handbook}disks/[Handbook, disks-"
+"encrypting]."
+msgstr ""
+"Если корневой раздел не удаётся смонтировать в однопользовательском режиме, "
+"возможно, разделы зашифрованы, и их невозможно смонтировать без ключей "
+"доступа. Дополнительную информацию см. в разделе о зашифрованных дисках в "
+"extref:{handbook}disks/[Handbook, disks-encrypting]."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:459
+#, no-wrap
+msgid "I made a mistake in rc.conf, or another startup file, and now I cannot edit it because the file system is read-only. What should I do?"
+msgstr "Я допустил ошибку в rc.conf или другом стартовом файле, и теперь не могу его отредактировать, потому что файловая система доступна только для чтения. Что мне делать?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:465
+msgid ""
+"Restart the system using `boot -s` at the loader prompt to enter single-user "
+"mode. When prompted for a shell pathname, press kbd:[Enter] and run `mount -"
+"urw /` to re-mount the root file system in read/write mode. You may also "
+"need to run `mount -a -t ufs` to mount the file system where your favorite "
+"editor is defined. If that editor is on a network file system, either "
+"configure the network manually before mounting the network file systems, or "
+"use an editor which resides on a local file system, such as man:ed[1]."
+msgstr ""
+"Перезагрузите систему, используя `boot -s` в приглашении загрузчика, чтобы "
+"войти в однопользовательский режим. При запросе пути к оболочке нажмите kbd:"
+"[Enter] и выполните `mount -urw /`, чтобы перемонтировать корневую файловую "
+"систему в режиме чтения/записи. Также может потребоваться выполнить `mount -"
+"a -t ufs` для монтирования файловой системы, где находится ваш "
+"предпочитаемый редактор. Если этот редактор находится на сетевой файловой "
+"системе, либо настройте сеть вручную перед монтированием сетевых файловых "
+"систем, либо используйте редактор, расположенный на локальной файловой "
+"системе, например, man:ed[1]."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:467
+msgid ""
+"In order to use a full screen editor such as man:vi[1] or man:emacs[1], run "
+"`export TERM=xterm` so that these editors can load the correct data from the "
+"man:termcap[5] database."
+msgstr ""
+"Чтобы использовать полноэкранные редакторы, такие как man:vi[1] или man:"
+"emacs[1], выполните команду `export TERM=xterm`, чтобы эти редакторы могли "
+"загрузить корректные данные из базы man:termcap[5]."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:470
+msgid ""
+"After performing these steps, edit [.filename]#/etc/rc.conf# to fix the "
+"syntax error. The error message displayed immediately after the kernel boot "
+"messages should indicate the number of the line in the file which is at "
+"fault."
+msgstr ""
+"После выполнения этих действий отредактируйте файл [.filename]#/etc/rc."
+"conf#, чтобы исправить синтаксическую ошибку. Сообщение об ошибке, "
+"отображаемое сразу после сообщений загрузки ядра, должно указывать номер "
+"строки в файле, в которой допущена ошибка."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:472
+#, no-wrap
+msgid "How much free memory is available?"
+msgstr "Сколько свободной памяти доступно?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:480
+msgid ""
+"There are a couple of kinds of \"free memory\". The most common is the "
+"amount of memory immediately available without reclaiming memory already in "
+"use. That is the size of the free pages queue plus some other reserved "
+"pages. This amount is exported by the `vm.stats.vm.v_free_count` man:"
+"sysctl[8], shown, for instance, by man:top[1]. Another kind of \"free memory"
+"\" is the total amount of virtual memory available to userland processes, "
+"which depends on the sum of swap space and usable memory. Other kinds of "
+"\"free memory\" descriptions are also possible, but it is relatively useless "
+"to define these, but rather it is important to make sure that the paging "
+"rate is kept low, and to avoid running out of swap space."
+msgstr ""
+"Существует несколько видов \"свободной памяти\". Наиболее распространенный "
+"- это объем памяти, который доступен немедленно, без освобождения уже "
+"используемой памяти. Это размер очереди свободных страниц плюс некоторые "
+"другие зарезервированные страницы. Этот объем отображается через `vm.stats."
+"vm.v_free_count` man:sysctl[8] и, например, выводится man:top[1]. Другой "
+"вид \"свободной памяти\" - это общий объем виртуальной памяти, доступной "
+"пользовательским процессам, который зависит от суммы swap-пространства и "
+"используемой памяти. Возможны и другие определения \"свободной памяти\", но "
+"их описание относительно бесполезно; гораздо важнее следить за тем, чтобы "
+"частота подкачки оставалась низкой, и избегать исчерпания swap-пространства."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:482
+#, no-wrap
+msgid "My time is wrong, how can I change the timezone?"
+msgstr "Мое время указано неверно, как я могу изменить часовой пояс?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:485
+msgid "Use man:tzsetup[8]."
+msgstr "Используйте man:tzsetup[8]."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:487
+#, no-wrap
+msgid "FreeBSD uses a lot of swap space even when the computer has free memory left. Why?"
+msgstr "FreeBSD использует много swap-пространства, даже когда в компьютере остаётся свободная память. Почему?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:491
+msgid ""
+"FreeBSD will proactively move entirely idle, unused pages of main memory "
+"into swap in order to make more main memory available for active use. This "
+"heavy use of swap is balanced by using the extra free memory for caching."
+msgstr ""
+"FreeBSD активно перемещает полностью неиспользуемые страницы основной памяти "
+"в своп, чтобы освободить больше основной памяти для активного использования. "
+"Такое активное использование свопа компенсируется за счет использования "
+"дополнительной свободной памяти для кэширования."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:494
+msgid ""
+"Note that while FreeBSD is proactive in this regard, it does not arbitrarily "
+"decide to swap pages when the system is truly idle. Thus, the system will "
+"not be all paged out after leaving it idle overnight."
+msgstr ""
+"Обратите внимание, что хотя FreeBSD активно работает в этом направлении, она "
+"не принимает произвольных решений о выгрузке страниц, когда система "
+"действительно простаивает. Таким образом, система не будет полностью "
+"выгружена в своп после простоя в течение ночи."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:496
+#, no-wrap
+msgid "Why does top show very little free memory even when I have very few programs running?"
+msgstr "Почему top показывает очень мало свободной памяти, даже когда у меня запущено очень мало программ?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:499
+msgid "The simple answer is that free memory is wasted memory."
+msgstr ""
+"Простой ответ заключается в том, что свободная память — это потраченная "
+"впустую память."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:504
+msgid ""
+"Any memory that programs do not actively allocate is used within the FreeBSD "
+"kernel as disk cache. The values shown by man:top[1] labeled as `Inact` and "
+"`Laundry` are cached data at different aging levels. This cached data means "
+"the system does not have to access a slow disk again for data it has "
+"accessed recently, thus increasing overall performance. In general, a low "
+"value shown for `Free` memory in man:top[1] is good, provided it is not "
+"_very_ low."
+msgstr ""
+"Любая память, которую программы не используют активно, применяется в ядре "
+"FreeBSD в качестве дискового кэша. Значения, отображаемые в man:top[1] с "
+"метками `Inact` и `Laundry`, представляют собой кэшированные данные на "
+"разных уровнях старения. Эти кэшированные данные позволяют системе не "
+"обращаться к медленному диску повторно для данных, к которым она недавно "
+"обращалась, тем самым повышая общую производительность. В целом, низкое "
+"значение памяти, отображаемое как `Free` в man:top[1], является хорошим "
+"признаком, при условии, что оно не _очень_ низкое."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:506
+#, no-wrap
+msgid "What is the cute little red guy's name?"
+msgstr "Как зовут этого милого маленького красного человечка?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:511
+msgid ""
+"He does not have one, and is just called \"the BSD daemon\". If you insist "
+"upon using a name, call him \"beastie\". Note that \"beastie\" is "
+"pronounced \"BSD\"."
+msgstr ""
+"У него нет имени, и его просто называют \"демон BSD\". Если вам непременно "
+"нужно имя, называйте его \"биести\" (beastie). Обратите внимание, что "
+"\"биести\" произносится как \"Би-Эс-Ди\"."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:513
+msgid ""
+"More about the BSD daemon is available on his http://www.mckusick.com/"
+"beastie/index.html[home page]."
+msgstr ""
+"Дополнительная информация о демоне BSD доступна на его http://www.mckusick."
+"com/beastie/index.html[домашней странице]."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:515
+#, no-wrap
+msgid "Can I use the BSD daemon image?"
+msgstr "Могу ли я использовать изображение BSD-демона?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:520
+msgid ""
+"Perhaps. The BSD daemon is copyrighted by Marshall Kirk McKusick. Check "
+"his http://www.mckusick.com/beastie/mainpage/copyright.html[Statement on the "
+"Use of the BSD Daemon Figure] for detailed usage terms."
+msgstr ""
+"Возможно. Демон BSD защищен авторским правом Маршалла Кирка Маккузика. "
+"Ознакомьтесь с его http://www.mckusick.com/beastie/mainpage/copyright."
+"html[Заявлением об использовании изображения демона BSD] для получения "
+"подробных условий использования."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:524
+msgid ""
+"In summary, the image can be used in a tasteful manner, for personal use, so "
+"long as appropriate credit is given. Before using the logo commercially, "
+"contact {mckusick} for permission. More details are available on the http://"
+"www.mckusick.com/beastie/index.html[BSD Daemon's home page]."
+msgstr ""
+"В заключение, изображение можно использовать в хорошем вкусе, для личного "
+"пользования, при условии указания соответствующей авторской принадлежности. "
+"Перед коммерческим использованием логотипа свяжитесь с {mckusick} для "
+"получения разрешения. Подробнее можно узнать на http://www.mckusick.com/"
+"beastie/index.html[домашней странице BSD Daemon]."
+
+#. type: Title ===
+#: documentation/content/en/books/faq/_index.adoc:526
+#, no-wrap
+msgid "Why should I care what color the bikeshed is?"
+msgstr "Почему меня должен волновать цвет сарая для велосипедов?"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:532
+msgid ""
+"The really, really short answer is that you should not. The somewhat longer "
+"answer is that just because you are capable of building a bikeshed does not "
+"mean you should stop others from building one just because you do not like "
+"the color they plan to paint it. This is a metaphor indicating that you "
+"need not argue about every little feature just because you know enough to do "
+"so. Some people have commented that the amount of noise generated by a "
+"change is inversely proportional to the complexity of the change."
+msgstr ""
+"Очень, очень краткий ответ — не должен. Более развёрнутый ответ: просто "
+"потому, что вы способны построить сарай для велосипедов, это не значит, что "
+"вы должны мешать другим делать то же самое лишь из-за того, что вам не "
+"нравится цвет, которым они собираются его покрасить. Это метафора, "
+"напоминающая, что не нужно спорить о каждой мелочи только потому, что у вас "
+"достаточно знаний для этого. Некоторые люди отмечали, что количество шума, "
+"вызванного изменением, обратно пропорционально сложности этого изменения."
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:534
+msgid ""
+"The longer and complete answer is that after a very long argument about "
+"whether man:sleep[1] should take fractional second arguments, {phk} posted a "
+"long message entitled link:http://www.bikeshed.com[A bike shed (any color "
+"will do) on greener grass...]."
+msgstr ""
+"Более длинный и полный ответ заключается в том, что после долгих споров о "
+"том, должна ли команда man:sleep[1] принимать аргументы в виде дробных "
+"секунд, {phk} опубликовал длинное сообщение под названием link:http://www."
+"bikeshed.com[Велосипедный сарай (любого цвета) на более зелёной траве...]."
+
+#. type: Title ==
+#: documentation/content/en/books/faq/_index.adoc:536
+#, no-wrap
+msgid "Acknowledgments"
+msgstr "Благодарности"
+
+#. type: Plain text
+#: documentation/content/en/books/faq/_index.adoc:538
+msgid ""
+"This FAQ has undergone countless revisions and improvements by a diverse "
+"group of contributors over the past decades."
+msgstr ""
+"Этот FAQ претерпел бесчисленные правки и улучшения благодаря разнообразной "
+"группе участников на протяжении последних десятилетий."
+
+#~ msgid ""
+#~ "Discover FreeBSD's compatibility with various Wi-Fi cards, making it easy "
+#~ "to connect your system to wireless networks."
+#~ msgstr ""
+#~ "Изучите совместимость FreeBSD с различными Wi-Fi адаптерами, что "
+#~ "позволяет легко подключать вашу систему к беспроводным сетям."
+
+#, no-wrap
+#~ msgid "The FreeBSD Funnies"
+#~ msgstr "Юмор от FreeBSD"
+
+#~ msgid ""
+#~ "Take a break from technicalities and dive into the playful side of "
+#~ "FreeBSD."
+#~ msgstr ""
+#~ "Отвлекитесь от технических деталей и окунитесь в игровую сторону FreeBSD."
+
+#, no-wrap
+#~ msgid "How cool is FreeBSD?"
+#~ msgstr "Насколько крута FreeBSD?"
+
+#, no-wrap
+#~ msgid "Has anyone done any temperature testing while running FreeBSD?"
+#~ msgstr "Выполнял ли кто-нибудь тестирование температуры при работе FreeBSD?"
+
+#~ msgid ""
+#~ "No, but we have done numerous taste tests on blindfolded volunteers who "
+#~ "have also had 250 micrograms of LSD-25 administered beforehand. 35% of "
+#~ "the volunteers said that FreeBSD tasted sort of orange, whereas GNU/"
+#~ "Linux(R) tasted like purple haze. Neither group mentioned any "
+#~ "significant variances in temperature."
+#~ msgstr ""
+#~ "Нет, но мы провели множество слепых тестов на добровольцах, которым "
+#~ "предварительно ввели 250 микрограммов LSD-25. 35% добровольцев заявили, "
+#~ "что FreeBSD на вкус отдаёт апельсином, тогда как GNU/Linux(R) напоминает "
+#~ "фиолетовый туман. Ни одна из групп не отметила существенных различий в "
+#~ "температуре."
+
+#~ msgid ""
+#~ "Seriously, FreeBSD uses ACPI (Advanced Configuration and Power "
+#~ "Interface), therefore FreeBSD can put the CPU into low power mode."
+#~ msgstr ""
+#~ "Серьезно, FreeBSD использует ACPI (Advanced Configuration and Power "
+#~ "Interface), поэтому FreeBSD может перевести процессор в режим пониженного "
+#~ "энергопотребления."
+
+#, no-wrap
+#~ msgid "Where does data written to /dev/null go?"
+#~ msgstr "Куда деваются данные, записанные в /dev/null?"
+
+#~ msgid ""
+#~ "It goes into a special data sink in the CPU where it is converted to heat "
+#~ "which is vented through the heatsink / fan assembly. This is why CPU "
+#~ "cooling is increasingly important; as people get used to faster "
+#~ "processors, they become careless with their data and more and more of it "
+#~ "ends up in [.filename]#/dev/null#, overheating their CPUs."
+#~ msgstr ""
+#~ "Он попадает в специальный накопитель данных в процессоре, где "
+#~ "преобразуется в тепло, которое отводится через радиатор и вентилятор. "
+#~ "Именно поэтому охлаждение процессора становится все более важным: по мере "
+#~ "того как пользователи привыкают к более быстрым процессорам, они "
+#~ "становятся менее внимательными к своим данным, и все больше данных "
+#~ "оказывается в [.filename]#/dev/null#, перегревая их процессоры."
+
+#~ msgid ""
+#~ "If you delete [.filename]#/dev/null# (which effectively disables the CPU "
+#~ "data sink) your CPU may run cooler but your system will quickly become "
+#~ "constipated with all that excess data and start to behave erratically."
+#~ msgstr ""
+#~ "Если вы удалите файл [.filename]#/dev/null# (что фактически отключает "
+#~ "\"слив\" данных в процессор), ваш процессор может стать холоднее, но "
+#~ "система быстро \"засорится\" избытком данных и начнёт вести себя "
+#~ "нестабильно."
+
+#~ msgid ""
+#~ "If you have a fast network connection you can cool down your CPU by "
+#~ "reading data out of [.filename]#/dev/random# and sending it off "
+#~ "somewhere; however you run the risk of overheating your network "
+#~ "connection and [.filename]#/# or angering your ISP, as most of the data "
+#~ "will end up getting converted to heat by their equipment, but they "
+#~ "generally have good cooling, so if you do not overdo it you should be OK."
+#~ msgstr ""
+#~ "Если у вас быстрый сетевой канал, вы можете охладить процессор, читая "
+#~ "данные из [.filename]#/dev/random# и отправляя их куда-нибудь; однако вы "
+#~ "рискуете перегреть сетевой канал и [.filename]#/# или разозлить своего "
+#~ "провайдера, так как большая часть данных в конечном итоге будет "
+#~ "преобразована в тепло их оборудованием, но у них обычно хорошее "
+#~ "охлаждение, так что если не переусердствовать, всё будет в порядке."
+
+#, no-wrap
+#~ msgid "My colleague sits at the computer too much, how can I prank them?"
+#~ msgstr "Мой коллега слишком много сидит за компьютером, как я могу разыграть его?"
+
+#~ msgid ""
+#~ "Install package:games/sl[] and wait for they to mistype `sl` for `ls`."
+#~ msgstr ""
+#~ "Установите пакет:games/sl[] и дождитесь, когда он случайно наберет `sl` "
+#~ "вместо `ls`."
diff --git a/documentation/content/ru/books/fdp-primer/_index.adoc b/documentation/content/ru/books/fdp-primer/_index.adoc
new file mode 100644
index 0000000000..945a1bf839
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/_index.adoc
@@ -0,0 +1,59 @@
+---
+add_single_page_link: true
+authors:
+ -
+ author: 'The FreeBSD Documentation Project'
+bookOrder: 50
+copyright: '1998-2023 The FreeBSD Documentation Project'
+description: 'Все, что вам нужно знать, чтобы начать участвовать в проекте документации FreeBSD'
+next: books/fdp-primer/preface
+params:
+ path: /books/fdp-primer/
+showBookMenu: true
+tags: ["FDP", "documentation", "FreeBSD", "Index"]
+title: 'Проект документации FreeBSD: введение для новых участников'
+trademarks: ["freebsd", "general", "git"]
+weight: 10
+---
+
+= Проект документации FreeBSD: введение для новых участников
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[.abstract-title]
+Аннотация
+
+Спасибо, что стали частью проекта документации FreeBSD! Ваш вклад чрезвычайно важен, и мы очень ценим его.
+
+Это руководство содержит информацию, необходимую для начала работы с Проектом документации FreeBSD (FDP), включая инструменты, программное обеспечение и философию, лежащую в основе Проекта документации.
+
+Это работа в процессе. Исправления и дополнения всегда приветствуются.
+
+'''
diff --git a/documentation/content/ru/books/fdp-primer/_index.po b/documentation/content/ru/books/fdp-primer/_index.po
new file mode 100644
index 0000000000..d03b601e86
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/_index.po
@@ -0,0 +1,68 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-07-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primer_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/_index.adoc:1
+#, no-wrap
+msgid "Everything you need to know in order to start contributing to the FreeBSD Documentation Project"
+msgstr "Все, что вам нужно знать, чтобы начать участвовать в проекте документации FreeBSD"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/_index.adoc:1
+#: documentation/content/en/books/fdp-primer/_index.adoc:18
+#, no-wrap
+msgid "FreeBSD Documentation Project Primer for New Contributors"
+msgstr "Проект документации FreeBSD: введение для новых участников"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/_index.adoc:51
+msgid "Abstract"
+msgstr "Аннотация"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/_index.adoc:54
+msgid ""
+"Thank you for becoming a part of the FreeBSD Documentation Project. Your "
+"contribution is extremely valuable, and we appreciate it."
+msgstr ""
+"Спасибо, что стали частью проекта документации FreeBSD! Ваш вклад "
+"чрезвычайно важен, и мы очень ценим его."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/_index.adoc:56
+msgid ""
+"This primer covers details needed to start contributing to the FreeBSD "
+"Documentation Project, or FDP, including tools, software, and the philosophy "
+"behind the Documentation Project."
+msgstr ""
+"Это руководство содержит информацию, необходимую для начала работы с "
+"Проектом документации FreeBSD (FDP), включая инструменты, программное "
+"обеспечение и философию, лежащую в основе Проекта документации."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/_index.adoc:59
+msgid ""
+"This is a work in progress. Corrections and additions are always welcome."
+msgstr "Это работа в процессе. Исправления и дополнения всегда приветствуются."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/_index.adoc:60
+msgid "'''"
+msgstr "'''"
diff --git a/documentation/content/ru/books/fdp-primer/asciidoctor-primer/_index.adoc b/documentation/content/ru/books/fdp-primer/asciidoctor-primer/_index.adoc
new file mode 100644
index 0000000000..4dc39524fe
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/asciidoctor-primer/_index.adoc
@@ -0,0 +1,338 @@
+---
+description: 'Краткое введение в Asciidoctor'
+next: books/fdp-primer/rosetta
+params:
+ path: /books/fdp-primer/asciidoctor-primer/
+prev: books/fdp-primer/doc-build
+showBookMenu: true
+tags: ["AsciiDoc", "Asciidoctor", "Primer", "Introduction", "Guide"]
+title: 'Глава 6. Введение в Asciidoctor'
+weight: 7
+---
+
+[[asciidoctor-primer]]
+= Основы Asciidoctor
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Большая часть документации FDP написана с использованием AsciiDoc. В этой главе объясняется, что это значит, как читать и понимать исходный код документации, а также используемые методы. Для получения полного справочника по возможностям Asciidoctor обратитесь к link:https://docs.asciidoctor.org/home/[документации Asciidoctor]. Некоторые примеры, используемые в этой главе, взяты из link:https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference[краткого справочника по синтаксису AsciiDoc].
+
+[[asciidoctor-primer-overview]]
+== Обзор
+
+В первые дни существования компьютеров электронный текст был простым. Существовало несколько наборов символов, таких как ASCII или EBCDIC, но на этом всё и заканчивалось. Текст был текстом, и вы видели именно то, что получали. Никаких изысков, никакого форматирования, никакого интеллекта.
+
+Неизбежно, этого оказалось недостаточно. Когда текст представлен в формате, пригодном для машинной обработки, ожидается, что машины смогут использовать и обрабатывать его интеллектуально. Авторы хотят указывать, что определённые фразы должны быть выделены, добавлены в глоссарий или преобразованы в гиперссылки. Имена файлов могут отображаться моноширинным шрифтом при просмотре на экране, но курсивом при печати или в любом другом из множества вариантов представления.
+
+Однажды надеялись, что искусственный интеллект (ИИ) сделает это легко. Компьютер прочитает документ и автоматически определит ключевые фразы, имена файлов, текст, который читатель должен ввести, примеры и многое другое. К сожалению, в реальной жизни всё оказалось не так просто, и компьютерам до сих пор требуется помощь, прежде чем они смогут осмысленно обрабатывать текст.
+
+Точнее говоря, им нужна помощь в определении, что есть что. Рассмотрим этот текст:
+
+Для удаления [.filename]#/tmp/foo# используйте man:rm[1].
+
+[source, shell]
+----
+% rm /tmp/foo
+----
+
+Читателю легко понять, какие части являются именами файлов, какие — командами для ввода, какие — ссылками на страницы руководства и так далее. Однако компьютер, обрабатывающий документ, не может надежно определить это. Для этого нам нужна разметка.
+
+Предыдущий пример фактически представлен в этом документе следующим образом:
+
+....
+To remove */tmp/foo*, use man:rm[1].
+
+[source,shell]
+----
+% rm /tmp/foo
+----
+....
+
+[[asciidoctor-headings]]
+== Заголовки
+
+Asciidoctor поддерживает шесть уровней заголовков. Если тип документа `article`, можно использовать только один заголовок уровня 0 (`=`). Если тип документа `book`, то может быть несколько заголовков уровня 0 (`=`).
+
+Вот пример заголовков в `article`.
+
+....
+= Название документа (Уровень 0)
+
+== Уровень 1 Название Раздела
+
+=== Уровень 2 Раздел Заголовок
+
+==== Уровень 3 Раздел Заголовок
+
+===== Уровень 4 Раздел Заголовок
+
+====== Level 5 Section Title
+
+== Другой заголовок раздела первого уровня
+....
+
+[WARNING]
+====
+Уровни разделов нельзя пропускать при вложении разделов.
+
+Следующий синтаксис неверен.
+
+....
+= Заголовок документа
+
+== Уровень 1
+
+==== Уровень 3
+....
+====
+
+[[asciidoctor-paragraphs]]
+== Абзацы
+
+Абзацы не требуют специальной разметки в AsciiDoc. Абзац определяется одной или несколькими последовательными строками текста. Чтобы создать новый абзац, оставьте одну пустую строку.
+
+Например, это заголовок с двумя абзацами.
+
+....
+= Это заголовок
+
+Это первый абзац. Это тоже первый абзац.
+
+А это второй абзац.
+....
+
+[[asciidoctor-lists]]
+== Списки
+
+Asciidoctor поддерживает несколько типов списков, наиболее распространённые — `ordered` и `unordered`. Для получения дополнительной информации о списках см. link:https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/#lists[AsciiDoc Syntax Quick Reference].
+
+[[asciidoctor-ordered-lists]]
+=== Упорядоченные списки
+
+Для создания нумерованного списка используйте символ `.`.
+
+Например, это нумерованный список.
+
+....
+. Первый пункт
+. Второй пункт
+.. Подпункт второго пункта
+. Третий пункт
+....
+
+И это будет отображено как.
+
+. Первый пункт
+. Второй пункт
+.. Подпункт второго пункта
+. Третий пункт
+
+[[asciidoctor-unordered-lists]]
+=== Неупорядоченные списки
+
+Для создания маркированного списка используйте символ `*`.
+
+Например, это ненумерованный список.
+
+....
+* Первый пункт
+* Второй пункт
+** Подпункт второго пункта
+* Третий пункт
+....
+
+И это будет отображено как.
+
+* Первый пункт
+* Второй пункт
+** Подпункт второго пункта
+* Третий пункт
+
+[[asciidoctor-links]]
+== Links
+
+[[asciidoctor-links-external]]
+=== Внешние ссылки
+
+Чтобы указать на другой веб-сайт, следует использовать макрос `link`.
+
+....
+link:https://www.FreeBSD.org[FreeBSD]
+....
+
+[NOTE]
+====
+Как описано в документации Asciidoctor, макрос `link` не требуется, когда цель начинается со схемы URL, такой как `https`. Тем не менее, рекомендуется всё равно использовать его, чтобы гарантировать корректное отображение ссылки в Asciidoctor, особенно в языках с нелатинской письменностью, таких как японский.
+====
+
+[[asciidoctor-links-internal]]
+=== Ссылки на другую книгу или статью
+
+Для указания на другую книгу или статью следует использовать переменные Asciidoctor. Например, если мы находимся в статье `cups` и хотим сослаться на `ipsec-must`, необходимо выполнить следующие шаги.
+
+. Включите файл [.filename]#urls.adoc# из папки [.filename]#~/doc/shared#.
++
+....
+\include::shared/{lang}/urls.adoc[]
+....
++
+. Затем создайте ссылку с использованием переменной Asciidoctor на статью `ipsec-must`.
++
+....
+extref:{ipsec-must}[Статья IPSec-Must]
+....
++
+И это будет отображено как.
++
+extref:{ipsec-must}[Статья IPSec-Must]
+
+[NOTE]
+====
+Макрос `extref` определён как расширение. Он предназначен для корректного отображения ссылки в различных выходных форматах
+====
+
+=== Ссылки на тот же файл или на другой файл в той же книге
+
+Книги структурированы в разных каталогах для поддержания удобной организации. Чтобы создать ссылку из одного подкаталога книги в другой подкаталог той же книги, используйте макрос `crossref`:
+....
+crossref:doc-build[documentation-makefile, Эта ссылка]
+....
+И это будет отображено как
+
+crossref:doc-build[documentation-makefile, Эта ссылка]
+
+[NOTE]
+====
+Макрос `crossref` определен как расширение. Он предназначен для формирования корректной ссылки в различных выходных форматах
+====
+
+[NOTE]
+====
+Используйте макрос `crossref` для внутридокументных ссылок. Хотя указание имени текущего документа может быть неудобным, это гарантирует корректное отображение ссылки в различных выходных форматах
+====
+
+[WARNING]
+====
+Не используйте макрос `xref` или его сокращение `<<` `>>`. Они не работают хорошо во всех выходных форматах.
+====
+
+[[asciidoctor-images-icons]]
+== Изображения и иконки
+
+Изображения и иконки играют ключевую роль в улучшении общего пользовательского опыта. Эти визуальные элементы стратегически интегрированы для передачи информации, пояснения концепций и создания визуально привлекательного интерфейса.
+
+[[asciidoctor-images]]
+=== Изображения
+
+Изображения помогают проиллюстрировать сложные концепции, делая их более понятными для пользователей.
+
+Первым шагом будет добавление изображения в директорию `images` по пути:
+
+* [.filename]#~/website/static/images/# для веб-сайта.
+* [.filename]#~/documentation/static/images/# для документации.
+
+Например, чтобы добавить новое изображение в процесс установки FreeBSD, изображение сохраняется по пути [.filename]#~/documentation/static/images/books/handbook/bsdinstall/new-image3.png#.
+
+Следующим шагом будет настройка атрибутов Asciidoctor `images-path` и `imagesdir`.
+
+В качестве примера мы используем заголовок статьи extref:{freebsd-releng}[Подготовка релизов FreeBSD].
+
+[source, asciidoc]
+....
+= Подготовка релизов FreeBSD
+:doctype: article
+
+[...]
+
+:images-path: articles/freebsd-releng/ <1>
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+
+[...]
+
+:imagesdir: ../../../images/{images-path} <2>
+endif::[]
+endif::[]
+
+[...]
+
+....
+
+<.> Ссылается на путь внутри папки [.filename]#/static/images#.
+<.> Делает ссылку на атрибут Asciidoctor.
+
+Как только изображение окажется в нужном пути и атрибуты Asciidoctor будут настроены в документе, можно использовать макрос `image`.
+
+Вот пример:
+
+....
+image::new-image3.png[New step in the FreeBSD install process]
+....
+
+[TIP]
+====
+Для улучшения доступности обязательно добавлять описательный текст к каждому изображению.
+====
+
+[[asciidoctor-icons]]
+=== Иконки
+
+Значки служат интуитивно понятными символами для быстрого распознавания и навигации.
+
+Первым шагом для использования иконок является добавление свойства `icons` в раздел свойств Asciidoctor в начале каждого документа.
+
+....
+:icons: font
+....
+
+После установки свойства иконки Asciidoctor можно добавить иконку, поддерживаемую link:https://fontawesome.com/v4/icons/[Font Awesome].
+
+Это пример использования иконки `envelope`:
+
+....
+icon:envelope[link=mailto:test@example.com, title="contact"]
+....
+
+[TIP]
+====
+Для повышения доступности веб-сайта атрибут `title` является обязательным.
+====
+
+[[asciidoctor-conclusion]]
+== Заключение
+
+Это заключение введения в Asciidoctor. Из-за ограничений по объёму и сложности некоторые аспекты не были рассмотрены глубоко (или вообще не затронуты).
diff --git a/documentation/content/ru/books/fdp-primer/asciidoctor-primer/_index.po b/documentation/content/ru/books/fdp-primer/asciidoctor-primer/_index.po
new file mode 100644
index 0000000000..9c60728aa5
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/asciidoctor-primer/_index.po
@@ -0,0 +1,795 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-09-07 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerasciidoctor-primer_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:1
+#, no-wrap
+msgid "A brief introduction to Asciidoctor"
+msgstr "Краткое введение в Asciidoctor"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:1
+#, no-wrap
+msgid "Chapter 6. Asciidoctor Primer"
+msgstr "Глава 6. Введение в Asciidoctor"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:14
+#, no-wrap
+msgid "Asciidoctor Primer"
+msgstr "Основы Asciidoctor"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:55
+msgid ""
+"Most FDP documentation is written with AsciiDoc. This chapter explains what "
+"that means, how to read and understand the documentation source, and the "
+"techniques used. To get a complete reference of the Asciidoctor "
+"capabilities please consult the link:https://docs.asciidoctor.org/home/"
+"[Asciidoctor documentation]. Some of the examples used in this chapter have "
+"been taken from the link:https://docs.asciidoctor.org/asciidoc/latest/syntax-"
+"quick-reference[AsciiDoc Syntax Quick Reference]."
+msgstr ""
+"Большая часть документации FDP написана с использованием AsciiDoc. В этой "
+"главе объясняется, что это значит, как читать и понимать исходный код "
+"документации, а также используемые методы. Для получения полного "
+"справочника по возможностям Asciidoctor обратитесь к link:https://"
+"docs.asciidoctor.org/home/[документации Asciidoctor]. Некоторые примеры, "
+"используемые в этой главе, взяты из link:https://docs.asciidoctor.org/"
+"asciidoc/latest/syntax-quick-reference[краткого справочника по синтаксису "
+"AsciiDoc]."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:57
+#, no-wrap
+msgid "Overview"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:63
+msgid ""
+"In the original days of computers, electronic text was simple. There were a "
+"few character sets like ASCII or EBCDIC, but that was about it. Text was "
+"text, and what you saw really was what you got. No frills, no formatting, "
+"no intelligence."
+msgstr ""
+"В первые дни существования компьютеров электронный текст был простым. "
+"Существовало несколько наборов символов, таких как ASCII или EBCDIC, но на "
+"этом всё и заканчивалось. Текст был текстом, и вы видели именно то, что "
+"получали. Никаких изысков, никакого форматирования, никакого интеллекта."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:68
+msgid ""
+"Inevitably, this was not enough. When text is in a machine-usable format, "
+"machines are expected to be able to use and manipulate it intelligently. "
+"Authors want to indicate that certain phrases should be emphasized, or added "
+"to a glossary, or made into hyperlinks. Filenames could be shown in a "
+"“typewriter” style font for viewing on screen, but as “italics” when "
+"printed, or any of a myriad of other options for presentation."
+msgstr ""
+"Неизбежно, этого оказалось недостаточно. Когда текст представлен в формате, "
+"пригодном для машинной обработки, ожидается, что машины смогут использовать "
+"и обрабатывать его интеллектуально. Авторы хотят указывать, что "
+"определённые фразы должны быть выделены, добавлены в глоссарий или "
+"преобразованы в гиперссылки. Имена файлов могут отображаться моноширинным "
+"шрифтом при просмотре на экране, но курсивом при печати или в любом другом "
+"из множества вариантов представления."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:72
+msgid ""
+"It was once hoped that Artificial Intelligence (AI) would make this easy. "
+"The computer would read the document and automatically identify key phrases, "
+"filenames, text that the reader should type in, examples, and more. "
+"Unfortunately, real life has not happened quite like that, and computers "
+"still require assistance before they can meaningfully process text."
+msgstr ""
+"Однажды надеялись, что искусственный интеллект (ИИ) сделает это легко. "
+"Компьютер прочитает документ и автоматически определит ключевые фразы, имена "
+"файлов, текст, который читатель должен ввести, примеры и многое другое. К "
+"сожалению, в реальной жизни всё оказалось не так просто, и компьютерам до "
+"сих пор требуется помощь, прежде чем они смогут осмысленно обрабатывать "
+"текст."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:75
+msgid ""
+"More precisely, they need help identifying what is what. Consider this text:"
+msgstr ""
+"Точнее говоря, им нужна помощь в определении, что есть что. Рассмотрим этот "
+"текст:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:77
+msgid "To remove [.filename]#/tmp/foo#, use man:rm[1]."
+msgstr "Для удаления [.filename]#/tmp/foo# используйте man:rm[1]."
+
+#. type: delimited block - 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:81
+#, no-wrap
+msgid "% rm /tmp/foo\n"
+msgstr "% rm /tmp/foo\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:86
+msgid ""
+"It is easy for the reader to see which parts are filenames, which are "
+"commands to be typed in, which parts are references to manual pages, and so "
+"on. But the computer processing the document cannot reliably determine "
+"this. For this we need markup."
+msgstr ""
+"Читателю легко понять, какие части являются именами файлов, какие — "
+"командами для ввода, какие — ссылками на страницы руководства и так далее. "
+"Однако компьютер, обрабатывающий документ, не может надежно определить это. "
+"Для этого нам нужна разметка."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:88
+msgid ""
+"The previous example is actually represented in this document like this:"
+msgstr ""
+"Предыдущий пример фактически представлен в этом документе следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:91
+#, no-wrap
+msgid "To remove */tmp/foo*, use man:rm[1].\n"
+msgstr "To remove */tmp/foo*, use man:rm[1].\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:96
+#, no-wrap
+msgid ""
+"[source,shell]\n"
+"----\n"
+"% rm /tmp/foo\n"
+"----\n"
+msgstr ""
+"[source,shell]\n"
+"----\n"
+"% rm /tmp/foo\n"
+"----\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:99
+#, no-wrap
+msgid "Headings"
+msgstr "Заголовки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:104
+msgid ""
+"Asciidoctor supports six headings levels. If the document type is `article` "
+"only one level 0 (`=`) can be used. If the document type is `book` then "
+"there can be multiple level 0 (`=`) headings."
+msgstr ""
+"Asciidoctor поддерживает шесть уровней заголовков. Если тип документа "
+"`article`, можно использовать только один заголовок уровня 0 (`=`). Если "
+"тип документа `book`, то может быть несколько заголовков уровня 0 (`=`)."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:106
+msgid "This is an example of headings in an `article`."
+msgstr "Вот пример заголовков в `article`."
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:108
+#, no-wrap
+msgid "Document Title (Level 0)"
+msgstr "Название документа (Уровень 0)"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:110
+#, no-wrap
+msgid "Level 1 Section Title"
+msgstr "Уровень 1 Название Раздела"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:112
+#, no-wrap
+msgid "Level 2 Section Title"
+msgstr "Уровень 2 Раздел Заголовок"
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:114
+#, no-wrap
+msgid "Level 3 Section Title"
+msgstr "Уровень 3 Раздел Заголовок"
+
+#. type: Title =====
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:116
+#, no-wrap
+msgid "Level 4 Section Title"
+msgstr "Уровень 4 Раздел Заголовок"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:119
+msgid "====== Level 5 Section Title"
+msgstr "====== Level 5 Section Title"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:120
+#, no-wrap
+msgid "Another Level 1 Section Title"
+msgstr "Другой заголовок раздела первого уровня"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:126
+msgid "Section levels cannot be skipped when nesting sections."
+msgstr "Уровни разделов нельзя пропускать при вложении разделов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:128
+msgid "The following syntax is not correct."
+msgstr "Следующий синтаксис неверен."
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:130
+#, no-wrap
+msgid "Document Title"
+msgstr "Заголовок документа"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:132
+#, no-wrap
+msgid "Level 1"
+msgstr "Уровень 1"
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:134
+#, no-wrap
+msgid "Level 3"
+msgstr "Уровень 3"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:139
+#, no-wrap
+msgid "Paragraphs"
+msgstr "Абзацы"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:144
+msgid ""
+"Paragraphs don't require special markup in AsciiDoc. A paragraph is defined "
+"by one or more consecutive lines of text. To create a new paragraph leave "
+"one blank line."
+msgstr ""
+"Абзацы не требуют специальной разметки в AsciiDoc. Абзац определяется одной "
+"или несколькими последовательными строками текста. Чтобы создать новый "
+"абзац, оставьте одну пустую строку."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:146
+msgid "For example, this is a heading with two paragraphs."
+msgstr "Например, это заголовок с двумя абзацами."
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:148
+#, no-wrap
+msgid "This is the heading"
+msgstr "Это заголовок"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:152
+msgid "This is the first paragraph. This is also the first paragraph."
+msgstr "Это первый абзац. Это тоже первый абзац."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:154
+msgid "And this is the second paragraph."
+msgstr "А это второй абзац."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:157
+#, no-wrap
+msgid "Lists"
+msgstr "Списки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:161
+msgid ""
+"Asciidoctor supports a few types of lists, the most common are `ordered` and "
+"`unordered`. To get more information about lists, see link:https://"
+"docs.asciidoctor.org/asciidoc/latest/syntax-quick-reference/#lists[AsciiDoc "
+"Syntax Quick Reference]."
+msgstr ""
+"Asciidoctor поддерживает несколько типов списков, наиболее распространённые "
+"— `ordered` и `unordered`. Для получения дополнительной информации о "
+"списках см. link:https://docs.asciidoctor.org/asciidoc/latest/syntax-quick-"
+"reference/#lists[AsciiDoc Syntax Quick Reference]."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:163
+#, no-wrap
+msgid "Ordered lists"
+msgstr "Упорядоченные списки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:166
+msgid "To create an ordered list use the `.` character."
+msgstr "Для создания нумерованного списка используйте символ `.`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:168
+msgid "For example, this is an ordered list."
+msgstr "Например, это нумерованный список."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:174
+#, no-wrap
+msgid ""
+". First item\n"
+". Second item\n"
+".. Subsecond item\n"
+". Third item\n"
+msgstr ""
+". Первый пункт\n"
+". Второй пункт\n"
+".. Подпункт второго пункта\n"
+". Третий пункт\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:177
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:198
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:241
+msgid "And this would be rendered as."
+msgstr "И это будет отображено как."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:179
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:200
+msgid "First item"
+msgstr "Первый пункт"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:180
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:201
+msgid "Second item"
+msgstr "Второй пункт"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:181
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:202
+msgid "Subsecond item"
+msgstr "Подпункт второго пункта"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:182
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:203
+msgid "Third item"
+msgstr "Третий пункт"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:184
+#, no-wrap
+msgid "Unordered lists"
+msgstr "Неупорядоченные списки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:187
+msgid "To create an unordered list use the `*` character."
+msgstr "Для создания маркированного списка используйте символ `*`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:189
+msgid "For example, this is an unordered list."
+msgstr "Например, это ненумерованный список."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:195
+#, no-wrap
+msgid ""
+"* First item\n"
+"* Second item\n"
+"** Subsecond item\n"
+"* Third item\n"
+msgstr ""
+"* Первый пункт\n"
+"* Второй пункт\n"
+"** Подпункт второго пункта\n"
+"* Третий пункт\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:205
+#, no-wrap
+msgid "Links"
+msgstr "Links"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:208
+#, no-wrap
+msgid "External links"
+msgstr "Внешние ссылки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:211
+msgid "To point to another website the `link` macro should be used."
+msgstr "Чтобы указать на другой веб-сайт, следует использовать макрос `link`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:214
+#, no-wrap
+msgid "link:https://www.FreeBSD.org[FreeBSD]\n"
+msgstr "link:https://www.FreeBSD.org[FreeBSD]\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:220
+msgid ""
+"As the Asciidoctor documentation describes, the `link` macro is not required "
+"when the target starts with a URL scheme like `https`. However, it is a "
+"good practice to do this anyway to ensure that Asciidoctor renders the link "
+"correctly, especially in non-latin languages like Japanese."
+msgstr ""
+"Как описано в документации Asciidoctor, макрос `link` не требуется, когда "
+"цель начинается со схемы URL, такой как `https`. Тем не менее, рекомендуется "
+"всё равно использовать его, чтобы гарантировать корректное отображение "
+"ссылки в Asciidoctor, особенно в языках с нелатинской письменностью, таких "
+"как японский."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:223
+#, no-wrap
+msgid "Links to another book or article"
+msgstr "Ссылки на другую книгу или статью"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:227
+msgid ""
+"To point to another book or article the Asciidoctor variables should be "
+"used. For example, if we are in the `cups` article and we want to point to "
+"`ipsec-must` these steps should be used."
+msgstr ""
+"Для указания на другую книгу или статью следует использовать переменные "
+"Asciidoctor. Например, если мы находимся в статье `cups` и хотим сослаться "
+"на `ipsec-must`, необходимо выполнить следующие шаги."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:229
+msgid ""
+"Include the [.filename]#urls.adoc# file from [.filename]#~/doc/shared# "
+"folder."
+msgstr ""
+"Включите файл [.filename]#urls.adoc# из папки [.filename]#~/doc/shared#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:232
+#, no-wrap
+msgid "\\include::shared/{lang}/urls.adoc[]\n"
+msgstr "\\include::shared/{lang}/urls.adoc[]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:235
+msgid ""
+"Then create a link using the Asciidoctor variable to the `ipsec-must` "
+"article."
+msgstr ""
+"Затем создайте ссылку с использованием переменной Asciidoctor на статью "
+"`ipsec-must`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:238
+#, no-wrap
+msgid "extref:{ipsec-must}[IPSec-Must article]\n"
+msgstr "extref:{ipsec-must}[Статья IPSec-Must]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:243
+msgid "extref:{ipsec-must}[IPSec-Must article]"
+msgstr "extref:{ipsec-must}[Статья IPSec-Must]"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:248
+msgid ""
+"The `extref` macro is defined as an extension. It is designed to render the "
+"correct link across the different outputs"
+msgstr ""
+"Макрос `extref` определён как расширение. Он предназначен для корректного "
+"отображения ссылки в различных выходных форматах"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:250
+#, no-wrap
+msgid "Links to the same file or to another file in the same book"
+msgstr "Ссылки на тот же файл или на другой файл в той же книге"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:255
+msgid ""
+"Books are structured in different directories to keep a sane layout. To "
+"create a link from one subdirectory of a book to another subdirectory of the "
+"same book, use the `crossref` macro:"
+msgstr ""
+"Книги структурированы в разных каталогах для поддержания удобной "
+"организации. Чтобы создать ссылку из одного подкаталога книги в другой "
+"подкаталог той же книги, используйте макрос `crossref`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:257
+#, no-wrap
+msgid "crossref:doc-build[documentation-makefile, This link]\n"
+msgstr "crossref:doc-build[documentation-makefile, Эта ссылка]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:259
+msgid "And this would be rendered as"
+msgstr "И это будет отображено как"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:261
+msgid "crossref:doc-build[documentation-makefile, This link]"
+msgstr "crossref:doc-build[documentation-makefile, Эта ссылка]"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:266
+msgid ""
+"The `crossref` macro is defined as an extension. It is designed to render "
+"the correct link across the different outputs"
+msgstr ""
+"Макрос `crossref` определен как расширение. Он предназначен для "
+"формирования корректной ссылки в различных выходных форматах"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:273
+msgid ""
+"Use the `crossref` macro for intra-document links too. Although it might be "
+"inconvenient to write the name of the current document, it ensures the "
+"correct link is rendered across the different outputs"
+msgstr ""
+"Используйте макрос `crossref` для внутридокументных ссылок. Хотя указание "
+"имени текущего документа может быть неудобным, это гарантирует корректное "
+"отображение ссылки в различных выходных форматах"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:279
+msgid ""
+"Do not use either the `xref` macro or its shortcut `<<` `>>`. They do not "
+"work well in all output formats."
+msgstr ""
+"Не используйте макрос `xref` или его сокращение `<<` `>>`. Они не работают "
+"хорошо во всех выходных форматах."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:282
+#, no-wrap
+msgid "Images and Icons"
+msgstr "Изображения и иконки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:286
+msgid ""
+"Images and icons play a crucial role in enhancing the overall user "
+"experience. These visual elements are strategically integrated to convey "
+"information, clarify concepts, and provide a visually engaging interface."
+msgstr ""
+"Изображения и иконки играют ключевую роль в улучшении общего "
+"пользовательского опыта. Эти визуальные элементы стратегически "
+"интегрированы для передачи информации, пояснения концепций и создания "
+"визуально привлекательного интерфейса."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:288
+#, no-wrap
+msgid "Images"
+msgstr "Изображения"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:291
+msgid ""
+"Images help illustrate complex concepts, making them more accessible to "
+"users."
+msgstr ""
+"Изображения помогают проиллюстрировать сложные концепции, делая их более "
+"понятными для пользователей."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:293
+msgid ""
+"The first step will be to add the image in the images directory in the path:"
+msgstr ""
+"Первым шагом будет добавление изображения в директорию `images` по пути:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:295
+msgid "[.filename]#~/website/static/images/# for the website."
+msgstr "[.filename]#~/website/static/images/# для веб-сайта."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:296
+msgid "[.filename]#~/documentation/static/images/# for the documentation."
+msgstr "[.filename]#~/documentation/static/images/# для документации."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:298
+msgid ""
+"For example, to add a new image to the FreeBSD installation process, the "
+"image will be saved to the path [.filename]#~/documentation/static/images/"
+"books/handbook/bsdinstall/new-image3.png#."
+msgstr ""
+"Например, чтобы добавить новое изображение в процесс установки FreeBSD, "
+"изображение сохраняется по пути [.filename]#~/documentation/static/images/"
+"books/handbook/bsdinstall/new-image3.png#."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:300
+msgid ""
+"The next step will be to configure the Asciidoctor attributes `images-path` "
+"and `imagesdir`."
+msgstr ""
+"Следующим шагом будет настройка атрибутов Asciidoctor `images-path` и "
+"`imagesdir`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:302
+msgid ""
+"We are going to use as an example the header of the extref:{freebsd-releng}"
+"[FreeBSD Release Engineering] article."
+msgstr ""
+"В качестве примера мы используем заголовок статьи extref:{freebsd-releng}"
+"[Подготовка релизов FreeBSD]."
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:305
+#, no-wrap
+msgid "FreeBSD Release Engineering"
+msgstr "Подготовка релизов FreeBSD"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:307
+msgid ":doctype: article"
+msgstr ":doctype: article"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:309
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:316
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:321
+msgid "[...]"
+msgstr "[...]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:311
+msgid ":images-path: articles/freebsd-releng/ <1>"
+msgstr ":images-path: articles/freebsd-releng/ <1>"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:314
+msgid "ifdef::env-beastie[] ifdef::backend-html5[]"
+msgstr ""
+"ifdef::env-beastie[]\n"
+"ifdef::backend-html5[]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:319
+msgid ":imagesdir: ../../../images/{images-path} <2> endif::[]"
+msgstr ""
+":imagesdir: ../../../images/{images-path} <2>\n"
+"endif::[]\n"
+"endif::[]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:325
+msgid "Makes reference to the path inside [.filename]#/static/images# folder."
+msgstr "Ссылается на путь внутри папки [.filename]#/static/images#."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:326
+msgid "Makes reference to the Asciidoctor attribute."
+msgstr "Делает ссылку на атрибут Asciidoctor."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:328
+msgid ""
+"Once the image is in the correct path and the Asciidoctor attributes have "
+"been configured in the document, the `image` macro can be used."
+msgstr ""
+"Как только изображение окажется в нужном пути и атрибуты Asciidoctor будут "
+"настроены в документе, можно использовать макрос `image`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:330
+msgid "This is an example:"
+msgstr "Вот пример:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:333
+#, no-wrap
+msgid "image::new-image3.png[New step in the FreeBSD install process]\n"
+msgstr "image::new-image3.png[New step in the FreeBSD install process]\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:338
+msgid ""
+"To improve accessibility, it is mandatory to add descriptive text to each "
+"image."
+msgstr ""
+"Для улучшения доступности обязательно добавлять описательный текст к каждому "
+"изображению."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:341
+#, no-wrap
+msgid "Icons"
+msgstr "Иконки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:344
+msgid "Icons serve as intuitive symbols for quick recognition and navigation."
+msgstr ""
+"Значки служат интуитивно понятными символами для быстрого распознавания и "
+"навигации."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:346
+msgid ""
+"The first step to use icons is to add the `icons` property to the "
+"Asciidoctor properties section, at the top of each document."
+msgstr ""
+"Первым шагом для использования иконок является добавление свойства `icons` в "
+"раздел свойств Asciidoctor в начале каждого документа."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:349
+#, no-wrap
+msgid ":icons: font\n"
+msgstr ":icons: font\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:352
+msgid ""
+"Once the Asciidoctor icon property has been set an icon supported by "
+"link:https://fontawesome.com/v4/icons/[Font Awesome] can be added."
+msgstr ""
+"После установки свойства иконки Asciidoctor можно добавить иконку, "
+"поддерживаемую link:https://fontawesome.com/v4/icons/[Font Awesome]."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:354
+msgid "This is an example about how to use the `envelope` icon:"
+msgstr "Это пример использования иконки `envelope`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:357
+#, no-wrap
+msgid "icon:envelope[link=mailto:test@example.com, title=\"contact\"]\n"
+msgstr "icon:envelope[link=mailto:test@example.com, title=\"contact\"]\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:362
+msgid ""
+"To improve the accessibility of the website, the `title` attribute is "
+"mandatory."
+msgstr ""
+"Для повышения доступности веб-сайта атрибут `title` является обязательным."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:365
+#, no-wrap
+msgid "Conclusion"
+msgstr "Заключение"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/asciidoctor-primer/_index.adoc:368
+msgid ""
+"This is the conclusion of this Asciidoctor primer. For reasons of space and "
+"complexity, several things have not been covered in depth (or at all)."
+msgstr ""
+"Это заключение введения в Asciidoctor. Из-за ограничений по объёму и "
+"сложности некоторые аспекты не были рассмотрены глубоко (или вообще не "
+"затронуты)."
diff --git a/documentation/content/ru/books/fdp-primer/book.adoc b/documentation/content/ru/books/fdp-primer/book.adoc
new file mode 100644
index 0000000000..e1222e61f5
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/book.adoc
@@ -0,0 +1,102 @@
+---
+add_split_page_link: true
+authors:
+ -
+ author: 'The FreeBSD Documentation Project'
+copyright: '1998-2023 The FreeBSD Documentation Project'
+description: 'Все, что вам нужно знать, чтобы начать участвовать в проекте документации FreeBSD'
+tags: ["FDP", "documentation", "FreeBSD", "Index"]
+title: 'Проект документации FreeBSD: введение для новых участников'
+trademarks: ["freebsd", "general", "git"]
+---
+
+= Проект документации FreeBSD: введение для новых участников
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:book: true
+:pdf: false
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+:chapters-path: content/{{% lang %}}/books/fdp-primer/
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+:chapters-path:
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+:chapters-path:
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[.abstract-title]
+Аннотация
+
+Спасибо за то, что стали частью проекта FreeBSD Documentation Project. Ваш вклад чрезвычайно важен, и мы это ценим.
+
+Это руководство содержит информацию, необходимую для начала работы с Проектом документации FreeBSD (FDP), включая инструменты, программное обеспечение и философию, лежащую в основе Проекта документации.
+
+Это работа в процессе. Исправления и дополнения всегда приветствуются.
+
+'''
+
+toc::[]
+
+:sectnums!:
+
+include::{chapters-path}preface/_index.adoc[leveloffset=+1]
+
+:sectnums:
+
+include::{chapters-path}overview/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}tools/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}working-copy/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}structure/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}doc-build/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}asciidoctor-primer/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}rosetta/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}translations/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}po-translations/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}weblate/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}manual-pages/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}writing-style/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}editor-config/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}trademarks/_index.adoc[leveloffset=+1]
+
+include::{chapters-path}see-also/_index.adoc[leveloffset=+1]
+
+:sectnums!:
+
+include::{chapters-path}examples/_index.adoc[leveloffset=+1]
+
+:sectnums:
diff --git a/documentation/content/ru/books/fdp-primer/book.po b/documentation/content/ru/books/fdp-primer/book.po
new file mode 100644
index 0000000000..a525887906
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/book.po
@@ -0,0 +1,68 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-07-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerbook/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/book.adoc:1
+#, no-wrap
+msgid "Everything you need to know in order to start contributing to the FreeBSD Documentation Project"
+msgstr "Все, что вам нужно знать, чтобы начать участвовать в проекте документации FreeBSD"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/book.adoc:1
+#: documentation/content/en/books/fdp-primer/book.adoc:12
+#, no-wrap
+msgid "FreeBSD Documentation Project Primer for New Contributors"
+msgstr "Проект документации FreeBSD: введение для новых участников"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/book.adoc:50
+msgid "Abstract"
+msgstr "Аннотация"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/book.adoc:52
+msgid ""
+"Thank you for becoming a part of the FreeBSD Documentation Project. Your "
+"contribution is extremely valuable, and we appreciate it."
+msgstr ""
+"Спасибо за то, что стали частью проекта FreeBSD Documentation Project. Ваш "
+"вклад чрезвычайно важен, и мы это ценим."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/book.adoc:54
+msgid ""
+"This primer covers details needed to start contributing to the FreeBSD "
+"Documentation Project, or FDP, including tools, software, and the philosophy "
+"behind the Documentation Project."
+msgstr ""
+"Это руководство содержит информацию, необходимую для начала работы с "
+"Проектом документации FreeBSD (FDP), включая инструменты, программное "
+"обеспечение и философию, лежащую в основе Проекта документации."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/book.adoc:56
+msgid ""
+"This is a work in progress. Corrections and additions are always welcome."
+msgstr "Это работа в процессе. Исправления и дополнения всегда приветствуются."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/book.adoc:58
+msgid "'''"
+msgstr "'''"
diff --git a/documentation/content/ru/books/fdp-primer/doc-build/_index.adoc b/documentation/content/ru/books/fdp-primer/doc-build/_index.adoc
new file mode 100644
index 0000000000..ae8a161020
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/doc-build/_index.adoc
@@ -0,0 +1,662 @@
+---
+description: 'Описывает процесс сборки документации FreeBSD'
+next: books/fdp-primer/asciidoctor-primer
+params:
+ path: /books/fdp-primer/doc-build/
+prev: books/fdp-primer/structure
+showBookMenu: true
+tags: ["build", "process", "make"]
+title: 'Глава 5. Процесс сборки документации FreeBSD'
+weight: 6
+---
+
+[[doc-build]]
+= Процесс сборки документации FreeBSD
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 5
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Эта глава описывает организацию процесса сборки документации и использование man:make[1] для управления этим процессом.
+
+[[doc-build-rendering]]
+== Преобразование AsciiDoc в выходные форматы
+
+Из одного исходного файла AsciiDoc можно получить различные типы выходных данных.
+
+[cols="20%,20%,60%", frame="none", options="header"]
+|===
+| Форматы
+| Тип файла
+| Описание
+
+|`html`
+|HTML
+|Глава статьи (`article`) или книги (`book`).
+
+|`pdf`
+|PDF
+|Portable Document Format.
+
+|`epub`
+|EPUB
+|Электронная публикация.
+Формат файла ePub.
+|===
+
+[[doc-build-rendering-html]]
+=== Преобразование в html
+
+Для преобразования документации и веб-сайта в `html` используйте один из следующих примеров.
+
+[[documentation-build-example]]
+.Собрать документацию
+[example]
+====
+[source, shell]
+....
+% cd ~/doc/documentation
+% make
+....
+====
+
+[[website-build-example]]
+.Собрать веб-сайт
+[example]
+====
+[source, shell]
+....
+% cd ~/doc/website
+% make
+....
+====
+
+[[project-build-example]]
+.Собрать весь проект документации
+[example]
+====
+[source, shell]
+....
+% cd ~/doc
+% make -j2
+....
+====
+
+Ниже приведены примеры сложных сборок:
+
+[[documentation-build-example-verbose]]
+.Собрать документацию на английском и испанском языках с подробными и отладочными сообщениями
+[example]
+====
+[source, shell]
+....
+% cd ~/doc/documentation
+% make DOC_LANG="en es" HUGO_ARGS="--verbose --debug"
+....
+====
+
+[[documentation-build-example-server]]
+.Собрать и предоставить контент с помощью внутреннего веб-сервера Hugo
+[example]
+====
+[source, shell]
+....
+% cd ~/doc/documentation
+% make run
+....
+Этот веб-сервер по умолчанию работает на `localhost`, порт `1313`.
+
+Для обслуживания контента с помощью внутреннего веб-сервера Hugo, привязанного к определенному IP-адресу и порту:
+
+[source, shell]
+....
+% make run BIND=192.168.15.10 HUGO_ARGS="-p 8080"
+....
+
+Имя хоста (`hostname`) также может быть установлено в качестве базового URL для внутреннего веб-сервера Hugo:
+
+[source, shell]
+....
+% make run BIND=192.168.15.10 HOSTNAME=example.com
+....
+====
+
+[[documentation-build-example-offline]]
+.Сборка документации в html для использования в автономном режиме
+[example]
+====
+[source, shell]
+....
+% cd ~/doc/documentation
+% make html
+....
+
+Для сжатия вывода в формате html добавьте `DOC_HTML_ARCHIVE=1`:
+
+[source, shell]
+....
+% cd ~/doc/documentation
+% DOC_HTML_ARCHIVE=1 make html
+....
+====
+
+[[doc-build-rendering-pdf]]
+=== Рендеринг в pdf
+
+Для преобразования документации в `pdf` используйте один из следующих примеров.
+
+[[document-pdf-example]]
+.Собрать все документы в pdf
+[example]
+====
+[source, shell]
+....
+% cd ~/doc/documentation
+% make pdf
+....
+====
+
+[[document-pdf-articles-example]]
+.Собрать все статьи в pdf
+[example]
+====
+[source, shell]
+....
+% cd ~/doc/documentation
+% make pdf-articles
+....
+====
+
+[[document-pdf-books-example]]
+.Собрать все книги в формате pdf
+[example]
+====
+[source, shell]
+....
+% cd ~/doc/documentation
+% make pdf-books
+....
+====
+
+[[document-pdf-language-example]]
+.Сборка документов в pdf для определённых языков
+[example]
+====
+[source, shell]
+....
+% cd ~/doc/documentation
+% make DOC_LANG="en" pdf
+....
+Это соберет все документы на английском языке в формате pdf.
+
+[source, shell]
+....
+% cd ~/doc/documentation
+% make DOC_LANG="en fr" pdf-books
+....
+Это соберет все книги на английском и французском языках в формате pdf.
+====
+
+[[doc-build-toolset]]
+== Набор инструментов для сборки документации FreeBSD
+
+Вот инструменты, используемые для сборки и установки документации FDP.
+
+* Основным инструментом сборки является man:make[1], а именно Berkeley Make.
+* Hugo
+* AsciiDoctor
+* Git
+
+[[doc-build-makefile]]
+== Информация о Makefile в дереве документации
+
+В проекте документации есть три файла [.filename]#Makefile# для сборки всей или части документации.
+
+* Файл [.filename]#Makefile# в каталоге [.filename]#documentation# предназначен только для сборки документации.
+* Файл [.filename]#Makefile# в директории [.filename]#website# предназначен только для сборки веб-сайта.
+* [.filename]#Makefile# в корне дерева исходников собирает как документацию, так и веб-сайт.
+
+Файл [.filename]#Makefile# в подкаталогах также поддерживает `make run` для обслуживания собранного содержимого с помощью внутреннего веб-сервера Hugo. По умолчанию этот веб-сервер работает на порту 1313.
+
+[[documentation-makefile]]
+=== Makefile в каталоге documentation
+
+Этот [.filename]#Makefile# имеет следующую форму:
+
+[source, shell]
+....
+# Generate the FreeBSD documentation
+#
+# Copyright (c) 2020-2025, The FreeBSD Documentation Project
+# Copyright (c) 2020-2025, Sergio Carlavilla <carlavilla@FreeBSD.org>
+#
+# Targets intended for use on the command line
+#
+# all (default) - generate the books TOC and compile all the documentation
+# clean - removes generated files
+# run - serves the built documentation site for local browsing
+# pdf - build PDF versions of the articles and books.
+# html - build HTML versions of the articles and books for
+# offline use.
+# If variable DOC_HTML_ARCHIVE is set, all documents will be
+# archived/compressed, and only these files will be kept in the public
+# directory.
+# epub - build EPUB versions of the articles and books (Experimental).
+#
+# The run target uses hugo's built-in webserver to make the documentation site
+# available for local browsing. The documentation should have been built prior
+# to attempting to use the `run` target. By default, hugo will start its
+# webserver on port 1313.
+
+MAINTAINER=carlavilla@FreeBSD.org <.>
+
+# List of languages without book translations
+ARTICLEONLY_LANGS= bn-bd da ko tr
+# List of languages without article translations
+BOOKONLY_LANGS= mn
+
+# List of all languages we have content for
+ALL_LANGUAGES= bn-bd da de el en es fr hu it ja ko mn nl pl pt-br ru tr zh-cn zh-tw <.>
+
+LOCALBASE?= /usr/local
+
+RUBY_CMD = ${LOCALBASE}/bin/ruby <.>
+HUGO_CMD = ${LOCALBASE}/bin/hugo <.>
+HUGO_ARGS?= --verbose --minify
+HUGO_OFFLINE_ARGS?= --environment offline --verbose --minify
+ASCIIDOCTOR_CMD= ${LOCALBASE}/bin/asciidoctor
+ASCIIDOCTORPDF_CMD= ${LOCALBASE}/bin/asciidoctor-pdf
+
+.if defined(DOC_LANG) && !empty(DOC_LANG)
+LANGUAGES= ${DOC_LANG:S/,/ /g}
+.if ${LANGUAGES:Men} == "" && ${.TARGETS:Mpdf*} == "" && ${.TARGETS:Mhtml*} == ""
+.warning "Warning: cannot skip 'en'; adding it back"
+LANGUAGES+= en
+.endif
+.else
+LANGUAGES= ${ALL_LANGUAGES}
+.endif
+
+RUBYLIB = ../shared/lib
+.export RUBYLIB
+
+RUN_DEPENDS= ${HUGO_CMD} \
+ ${LOCALBASE}/bin/asciidoctor \
+ ${LOCALBASE}/bin/rougify
+
+.ifndef HOSTNAME
+. ifdef BIND
+.HOST=$(BIND)
+. else
+.HOST=localhost
+. endif
+.else
+.HOST=$(HOSTNAME)
+.endif
+
+# Strip the languages with only articles from the list of languages we
+# will use to build books.
+BOOK_LANGS= ${LANGUAGES}
+.for a in ${ARTICLEONLY_LANGS}
+BOOK_LANGS:= ${BOOK_LANGS:N${a}}
+.endfor
+
+# Strip the languages with only books from the list of languages we
+# will use to build articles.
+ARTICLE_LANGS= ${LANGUAGES}
+.for a in ${BOOKONLY_LANGS}
+ARTICLE_LANGS:= ${ARTICLE_LANGS:N${a}}
+.endfor
+
+# Take the list of all languages, and take out the ones we have been
+# asked for. We'll feed this to hugo.
+SKIP_LANGS=
+.for a in ${ALL_LANGUAGES}
+.if ${LANGUAGES:M${a}} == ""
+SKIP_LANGS+= ${a}
+.endif
+.endfor
+
+.ORDER: all run <.>
+
+.ORDER: requirements <.>
+.ORDER: starting-message
+.ORDER: starting-message build
+.ORDER: build
+
+all: requirements starting-message generate-pgpkeys-txt build
+run: requirements starting-message generate-pgpkeys-txt run-local
+
+# clean does not call pdf-clean as that is a subset of hugo-clean
+clean: hugo-clean pgp-clean
+
+requirements:
+.for dep in ${RUN_DEPENDS}
+.if !exists(${dep})
+ @(echo ${dep} not found, please run 'pkg install docproj'; exit 1)
+.endif
+.endfor
+
+requirements-pdf:
+.if !exists(${LOCALBASE}/bin/asciidoctor-pdf)
+ @(echo ${LOCALBASE}/bin/asciidoctor-pdf not found, please run 'pkg install rubygem-asciidoctor-pdf'; exit 1)
+.endif
+
+requirements-epub:
+.if !exists(${LOCALBASE}/bin/asciidoctor-epub3)
+ @(echo ${LOCALBASE}/bin/asciidoctor-epub3 not found, please run 'pkg install rubygem-asciidoctor-epub3'; exit 1)
+.endif
+
+starting-message: .PHONY <.>
+ @echo ---------------------------------------------------------------
+ @echo Building the documentation
+ @echo included languages: ${LANGUAGES}
+ @echo excluded languages: ${SKIP_LANGS}
+ @echo ---------------------------------------------------------------
+
+generate-pgpkeys-txt: static/pgpkeys/pgpkeys.txt
+
+static/pgpkeys/pgpkeys.txt: static/pgpkeys/*key
+ ${RUBY_CMD} ./tools/global-pgpkeys-creator.rb
+
+run-local: .PHONY <.>
+ HUGO_DISABLELANGUAGES="${SKIP_LANGS}" ${HUGO_CMD} server \
+ ${HUGO_ARGS} -D $(BIND:D--bind=$(BIND)) --baseURL="http://$(.HOST):1313"
+
+build: .PHONY <.>
+ HUGO_DISABLELANGUAGES="${SKIP_LANGS}" ${HUGO_CMD} ${HUGO_ARGS}
+
+build-offline: .PHONY
+ HUGO_DISABLELANGUAGES="${SKIP_LANGS}" ${HUGO_CMD} ${HUGO_OFFLINE_ARGS}
+
+pgp-clean: .PHONY
+ rm -f static/pgpkeys/pgpkeys.txt
+
+hugo-clean: .PHONY
+ rm -rf resources public
+
+#
+# PDF targets
+# Use DOC_LANG to choose the language, e.g., make DOC_LANG="en fr" pdf-books
+#
+pdf: pdf-articles pdf-books
+
+pdf-books: requirements-pdf
+.for _lang in ${BOOK_LANGS}
+ ./tools/asciidoctor.sh books ${_lang} pdf
+.endfor
+
+pdf-articles: requirements-pdf
+.for _lang in ${ARTICLE_LANGS}
+ ./tools/asciidoctor.sh articles ${_lang} pdf
+.endfor
+
+pdf-clean: pdf-articles-clean pdf-books-clean
+
+pdf-books-clean:
+.for _lang in ${BOOK_LANGS}
+ rm -fr ${.CURDIR}/public/${_lang}/books
+ -rmdir ${.CURDIR}/public/${_lang}
+.endfor
+ -rmdir ${.CURDIR}/public/
+
+pdf-articles-clean:
+.for _lang in ${ARTICLE_LANGS}
+ rm -fr ${.CURDIR}/public/${_lang}/articles
+.if !exists(${.CURDIR}/public/${_lang}/books)
+ rm -fr ${.CURDIR}/public/${_lang}
+.endif
+.endfor
+ -rmdir ${.CURDIR}/public
+
+#
+# HTML targets
+#
+html: build-offline html-clean-global html-clean-articles html-clean-books html-archive html-archive-clean-files
+
+html-clean: hugo-clean
+
+html-clean-global:
+ rm -fr ${.CURDIR}/public/index.html
+ rm -rf pgpkeys js
+
+html-clean-articles:
+.for _lang in ${ARTICLE_LANGS}
+ rm -fr ${.CURDIR}/public/${_lang}/index.html
+ rm -fr ${.CURDIR}/public/${_lang}/articles/index.html
+.endfor
+
+html-clean-books:
+.for _lang in ${BOOK_LANGS}
+ rm -fr ${.CURDIR}/public/${_lang}/books/index.html
+.endfor
+
+html-archive:
+.if defined(DOC_HTML_ARCHIVE)
+.for _lang in ${ARTICLE_LANGS}
+ ./tools/asciidoctor.sh articles ${_lang} archive
+.endfor
+.for _lang in ${BOOK_LANGS}
+ ./tools/asciidoctor.sh books ${_lang} archive
+.endfor
+.endif
+
+html-archive-clean-files:
+.if defined(DOC_HTML_ARCHIVE)
+ find ${.CURDIR}/public/ ! -name '*.pdf' ! -name '*.tar.gz' -type f -delete
+ find ${.CURDIR}/public/ -type d -empty -delete
+.endif
+
+#
+# EPUB targets
+# Use DOC_LANG to choose the language, e.g., make DOC_LANG="en fr" epub-books
+#
+epub: epub-articles epub-books
+
+epub-books: requirements-epub
+ @echo ---------------------------------------------------------------
+ @echo !!! EPUB output is experimental !!!
+ @echo
+ @echo Asciidoctor EPUB3 is currently alpha software. Use accordingly. Although the
+ @echo bulk of AsciiDoc content is converted, there’s still work needed to fill in
+ @echo gaps where conversion is incomplete or unstyled.
+ @echo https://docs.asciidoctor.org/epub3-converter/latest/#project-status
+ @echo ---------------------------------------------------------------
+.for _lang in ${BOOK_LANGS}
+ ./tools/asciidoctor.sh books ${_lang} epub
+.endfor
+
+epub-articles: requirements-epub
+ @echo ---------------------------------------------------------------
+ @echo !!! EPUB output is experimental !!!
+ @echo
+ @echo Asciidoctor EPUB3 is currently alpha software. Use accordingly. Although the
+ @echo bulk of AsciiDoc content is converted, there’s still work needed to fill in
+ @echo gaps where conversion is incomplete or unstyled.
+ @echo https://docs.asciidoctor.org/epub3-converter/latest/#project-status
+ @echo ---------------------------------------------------------------
+.for _lang in ${ARTICLE_LANGS}
+ ./tools/asciidoctor.sh articles ${_lang} epub
+.endfor
+
+epub-clean: epub-articles-clean epub-books-clean
+
+epub-books-clean:
+.for _lang in ${BOOK_LANGS}
+ rm -fr ${.CURDIR}/public/${_lang}/books
+ -rmdir ${.CURDIR}/public/${_lang}
+.endfor
+ -rmdir ${.CURDIR}/public/
+
+epub-articles-clean:
+.for _lang in ${ARTICLE_LANGS}
+ rm -fr ${.CURDIR}/public/${_lang}/articles
+.if !exists(${.CURDIR}/public/${_lang}/books)
+ rm -fr ${.CURDIR}/public/${_lang}
+.endif
+.endfor
+ -rmdir ${.CURDIR}/public
+....
+
+<.> Флаг `MAINTAINER` указывает, кто является сопровождающим данного Makefile.
+<.> Флаг `ALL_LANGUAGES` указывает, на каких языках должно быть сгенерировано оглавление.
+<.> Флаг `RUBY_CMD` указывает расположение бинарного файла Ruby.
+<.> `HUGO_CMD` — флаг, указывающий расположение бинарного файла Hugo.
+<.> Директивы `.ORDER` используются для обеспечения беспроблемного выполнения нескольких заданий make.
+<.> Цель `all` собирает документацию и помещает результат в *~/doc/documentation/public*.
+<.> `starting-message` показывает сообщение в CLI, чтобы уведомить пользователя о том, что процесс выполняется.
+<.> `run-local` запускает веб-сервер hugo на порту 1313 или на случайном свободном порту, если указанный порт уже занят.
+<.> `build` собирает документацию и помещает результат в *~/doc/documentation/public*.
+
+[[website-makefile]]
+=== Makefile в каталоге website
+
+Этот [.filename]#Makefile# имеет следующий вид:
+
+[source, shell]
+....
+# Generate the FreeBSD website
+#
+# Copyright (c) 2020-2025, The FreeBSD Documentation Project
+# Copyright (c) 2020-2025, Sergio Carlavilla <carlavilla@FreeBSD.org>
+#
+# Targets intended for use on the command line
+#
+# all (default) - generate the releases.toml and compile all the website
+# run - serves the built website for local browsing
+#
+# The run target uses hugo's built-in webserver to make the built website
+# available for local browsing. The website should have been built prior
+# to attempting to use the `run` target. By default, hugo will start its
+# webserver on port 1313.
+
+MAINTAINER=carlavilla@FreeBSD.org <.>
+
+# List of all languages we have content for
+ALL_LANGUAGES= de el en es fr hu it ja nl ru tr zh-cn zh-tw
+
+LOCALBASE?= /usr/local
+
+RUBY_CMD = ${LOCALBASE}/bin/ruby <.>
+HUGO_CMD = ${LOCALBASE}/bin/hugo <.>
+HUGO_ARGS?= --verbose
+RUBYLIB = ../shared/lib
+.export RUBYLIB
+
+.ifndef HOSTNAME
+. ifdef BIND
+.HOST=$(BIND)
+. else
+.HOST=localhost
+. endif
+.else
+.HOST=$(HOSTNAME)
+.endif
+
+.if defined(DOC_LANG) && !empty(DOC_LANG)
+LANGUAGES= ${DOC_LANG:S/,/ /g}
+.if ${LANGUAGES:Men} == ""
+.warning "Warning: cannot skip 'en'; adding it back"
+LANGUAGES+= en
+.endif
+.else
+LANGUAGES= ${ALL_LANGUAGES}
+.endif
+
+# Take the list of all languages, and take out the ones we have been
+# asked for via DOC_LANG. We'll feed this to hugo.
+SKIP_LANGS=
+.for a in ${ALL_LANGUAGES}
+.if ${LANGUAGES:M${a}} == ""
+SKIP_LANGS+= ${a}
+.endif
+.endfor
+
+.ORDER: all run <.>
+
+.ORDER: starting-message generate-releases
+.ORDER: starting-message build
+.ORDER: generate-releases build
+.ORDER: build post-build
+.ORDER: post-build end-message
+
+all: starting-message generate-releases build post-build end-message <.>
+run: starting-message generate-releases run-local
+clean: hugo-clean releases-clean
+
+starting-message: .PHONY <.>
+ @echo "---------------------------------------------------------------"
+ @echo "Building the website started on $$(date)"
+ @echo " included languages: ${LANGUAGES}"
+ @echo " excluded languages: ${SKIP_LANGS}"
+ @echo "---------------------------------------------------------------"
+
+end-message: .PHONY
+ @echo "---------------------------------------------------------------"
+ @echo "Building the website completed on $$(date)"
+ @echo "---------------------------------------------------------------"
+
+generate-releases: data/releases.toml <.>
+
+data/releases.toml:
+ ${RUBY_CMD} ./tools/releases-toml.rb
+
+run-local: .PHONY <.>
+ HUGO_DISABLELANGUAGES="${SKIP_LANGS}" ${HUGO_CMD} server \
+ ${HUGO_ARGS} -D $(BIND:D--bind=$(BIND)) --baseURL="http://$(.HOST):1313"
+
+build: .PHONY <.>
+ HUGO_DISABLELANGUAGES="${SKIP_LANGS}" ${HUGO_CMD} ${HUGO_ARGS}
+
+post-build: cgi-permissions
+
+cgi-permissions:
+ @chmod 555 ./public/cgi/*.cgi
+
+hugo-clean:
+ rm -fr public resources
+
+releases-clean:
+ rm -f data/releases.toml
+....
+
+<.> Флаг `MAINTAINER` указывает, кто является сопровождающим данного Makefile.
+<.> Флаг `RUBY_CMD` указывает расположение бинарного файла Ruby.
+<.> `HUGO_CMD` — флаг, указывающий расположение бинарного файла Hugo.
+<.> Директивы `.ORDER` используются для обеспечения беспроблемного выполнения нескольких заданий make.
+<.> Цель `all` собирает веб-сайт и помещает результат в *~/doc/website/public*.
+<.> `starting-message` показывает сообщение в CLI, чтобы уведомить пользователя о том, что процесс выполняется.
+<.> `generate-releases` вызывает скрипт, используемый для преобразования переменных AsciiDoc в переменные TOML. После этого преобразования переменные релизов можно использовать как в AsciiDoc, так и в пользовательских шаблонах Hugo.
+<.> `run-local` запускает веб-сервер hugo на порту 1313 или на случайном свободном порту, если указанный порт уже занят.
+<.> `build` собирает веб-сайт и помещает результат в *~/doc/website/public*.
diff --git a/documentation/content/ru/books/fdp-primer/doc-build/_index.po b/documentation/content/ru/books/fdp-primer/doc-build/_index.po
new file mode 100644
index 0000000000..0d37e7d901
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/doc-build/_index.po
@@ -0,0 +1,1562 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-06-23 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerdoc-build_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:1
+#, no-wrap
+msgid "Describes the FreeBSD Documentation Build Process"
+msgstr "Описывает процесс сборки документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:1
+#, no-wrap
+msgid "Chapter 5. The FreeBSD Documentation Build Process"
+msgstr "Глава 5. Процесс сборки документации FreeBSD"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:14
+#, no-wrap
+msgid "The FreeBSD Documentation Build Process"
+msgstr "Процесс сборки документации FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:52
+msgid ""
+"This chapter covers organization of the documentation build process and how "
+"man:make[1] is used to control it."
+msgstr ""
+"Эта глава описывает организацию процесса сборки документации и использование "
+"man:make[1] для управления этим процессом."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:54
+#, no-wrap
+msgid "Rendering AsciiDoc into Output"
+msgstr "Преобразование AsciiDoc в выходные форматы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:57
+msgid ""
+"Different types of output can be produced from a single AsciiDoc source file."
+msgstr ""
+"Из одного исходного файла AsciiDoc можно получить различные типы выходных "
+"данных."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:61
+#, no-wrap
+msgid "Formats"
+msgstr "Форматы"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:62
+#, no-wrap
+msgid "File Type"
+msgstr "Тип файла"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:64
+#, no-wrap
+msgid "Description"
+msgstr "Описание"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:65
+#, no-wrap
+msgid "`html`"
+msgstr "`html`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:66
+#, no-wrap
+msgid "HTML"
+msgstr "HTML"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:68
+#, no-wrap
+msgid "An `article` or `book` chapter."
+msgstr "Глава статьи (`article`) или книги (`book`)."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:69
+#, no-wrap
+msgid "`pdf`"
+msgstr "`pdf`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:70
+#, no-wrap
+msgid "PDF"
+msgstr "PDF"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:72
+#, no-wrap
+msgid "Portable Document Format."
+msgstr "Portable Document Format."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:73
+#, no-wrap
+msgid "`epub`"
+msgstr "`epub`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:74
+#, no-wrap
+msgid "EPUB"
+msgstr "EPUB"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:76
+#, no-wrap
+msgid ""
+"Electronic Publication.\n"
+"ePub file format."
+msgstr ""
+"Электронная публикация.\n"
+"Формат файла ePub."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:79
+#, no-wrap
+msgid "Rendering to html"
+msgstr "Преобразование в html"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:82
+msgid ""
+"To render the documentation and the website to `html` use one of the "
+"following examples."
+msgstr ""
+"Для преобразования документации и веб-сайта в `html` используйте один из "
+"следующих примеров."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:84
+#, no-wrap
+msgid "Build the documentation"
+msgstr "Собрать документацию"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:91
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:95
+#, no-wrap
+msgid "Build the website"
+msgstr "Собрать веб-сайт"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:102
+#, no-wrap
+msgid ""
+"% cd ~/doc/website\n"
+"% make\n"
+msgstr ""
+"% cd ~/doc/website\n"
+"% make\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:106
+#, no-wrap
+msgid "Build the entire documentation project"
+msgstr "Собрать весь проект документации"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:113
+#, no-wrap
+msgid ""
+"% cd ~/doc\n"
+"% make -j2\n"
+msgstr ""
+"% cd ~/doc\n"
+"% make -j2\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:117
+msgid "Advanced build examples are given below:"
+msgstr "Ниже приведены примеры сложных сборок:"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:119
+#, no-wrap
+msgid "Build English and Spanish documentation with verbose and debug messages"
+msgstr "Собрать документацию на английском и испанском языках с подробными и отладочными сообщениями"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:126
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make DOC_LANG=\"en es\" HUGO_ARGS=\"--verbose --debug\"\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make DOC_LANG=\"en es\" HUGO_ARGS=\"--verbose --debug\"\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:130
+#, no-wrap
+msgid "Build and serve the content with Hugo’s internal webserver"
+msgstr "Собрать и предоставить контент с помощью внутреннего веб-сервера Hugo"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:137
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make run\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make run\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:139
+msgid "This webserver runs on `localhost`, port `1313` by default."
+msgstr "Этот веб-сервер по умолчанию работает на `localhost`, порт `1313`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:141
+msgid ""
+"To serve the content with Hugo’s internal webserver binding a specific IP "
+"address and port:"
+msgstr ""
+"Для обслуживания контента с помощью внутреннего веб-сервера Hugo, "
+"привязанного к определенному IP-адресу и порту:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:145
+#, no-wrap
+msgid "% make run BIND=192.168.15.10 HUGO_ARGS=\"-p 8080\"\n"
+msgstr "% make run BIND=192.168.15.10 HUGO_ARGS=\"-p 8080\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:148
+msgid "A `hostname` can also be set as base url to Hugo’s internal webserver:"
+msgstr ""
+"Имя хоста (`hostname`) также может быть установлено в качестве базового URL "
+"для внутреннего веб-сервера Hugo:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:152
+#, no-wrap
+msgid "% make run BIND=192.168.15.10 HOSTNAME=example.com\n"
+msgstr "% make run BIND=192.168.15.10 HOSTNAME=example.com\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:156
+#, no-wrap
+msgid "Build documentation in html for offline usage"
+msgstr "Сборка документации в html для использования в автономном режиме"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:163
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make html\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make html\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:166
+msgid "To compress the html output, add `DOC_HTML_ARCHIVE=1`:"
+msgstr "Для сжатия вывода в формате html добавьте `DOC_HTML_ARCHIVE=1`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:171
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% DOC_HTML_ARCHIVE=1 make html\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% DOC_HTML_ARCHIVE=1 make html\n"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:175
+#, no-wrap
+msgid "Rendering to pdf"
+msgstr "Рендеринг в pdf"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:178
+msgid ""
+"To render the documentation to `pdf`, use one of the following examples."
+msgstr ""
+"Для преобразования документации в `pdf` используйте один из следующих "
+"примеров."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:180
+#, no-wrap
+msgid "Build all documents in pdf"
+msgstr "Собрать все документы в pdf"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:187
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make pdf\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make pdf\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:191
+#, no-wrap
+msgid "Build all articles in pdf"
+msgstr "Собрать все статьи в pdf"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:198
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make pdf-articles\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make pdf-articles\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:202
+#, no-wrap
+msgid "Build all books in pdf"
+msgstr "Собрать все книги в формате pdf"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:209
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make pdf-books\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make pdf-books\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:213
+#, no-wrap
+msgid "Build documents in pdf for specific languages"
+msgstr "Сборка документов в pdf для определённых языков"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:220
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make DOC_LANG=\"en\" pdf\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make DOC_LANG=\"en\" pdf\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:222
+msgid "This will build all English documents in pdf."
+msgstr "Это соберет все документы на английском языке в формате pdf."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:227
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make DOC_LANG=\"en fr\" pdf-books\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make DOC_LANG=\"en fr\" pdf-books\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:229
+msgid "This will build all English and French books in pdf."
+msgstr ""
+"Это соберет все книги на английском и французском языках в формате pdf."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:232
+#, no-wrap
+msgid "The FreeBSD Documentation Build Toolset"
+msgstr "Набор инструментов для сборки документации FreeBSD"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:235
+msgid "These are the tools used to build and install the FDP documentation."
+msgstr "Вот инструменты, используемые для сборки и установки документации FDP."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:237
+msgid "The primary build tool is man:make[1], specifically Berkeley Make."
+msgstr ""
+"Основным инструментом сборки является man:make[1], а именно Berkeley Make."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:238
+msgid "Hugo"
+msgstr "Hugo"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:239
+msgid "AsciiDoctor"
+msgstr "AsciiDoctor"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:240
+msgid "Git"
+msgstr "Git"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:242
+#, no-wrap
+msgid "Understanding the Makefile in the Documentation Tree"
+msgstr "Информация о Makefile в дереве документации"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:245
+msgid ""
+"There are three [.filename]#Makefile# files for building some or all of the "
+"documentation project."
+msgstr ""
+"В проекте документации есть три файла [.filename]#Makefile# для сборки всей "
+"или части документации."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:247
+msgid ""
+"The [.filename]#Makefile# in the [.filename]#documentation# directory will "
+"build only the documentation."
+msgstr ""
+"Файл [.filename]#Makefile# в каталоге [.filename]#documentation# "
+"предназначен только для сборки документации."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:248
+msgid ""
+"The [.filename]#Makefile# in the [.filename]#website# directory will build "
+"only the website."
+msgstr ""
+"Файл [.filename]#Makefile# в директории [.filename]#website# предназначен "
+"только для сборки веб-сайта."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:249
+msgid ""
+"The [.filename]#Makefile# at the top of the tree will build both the "
+"documentation and the website."
+msgstr ""
+"[.filename]#Makefile# в корне дерева исходников собирает как документацию, "
+"так и веб-сайт."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:252
+msgid ""
+"The [.filename]#Makefile# appearing in subdirectories also support `make "
+"run` to serve built content with Hugo's internal webserver. This webserver "
+"runs on port 1313 by default."
+msgstr ""
+"Файл [.filename]#Makefile# в подкаталогах также поддерживает `make run` для "
+"обслуживания собранного содержимого с помощью внутреннего веб-сервера Hugo. "
+"По умолчанию этот веб-сервер работает на порту 1313."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:254
+#, no-wrap
+msgid "Documentation Makefile"
+msgstr "Makefile в каталоге documentation"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:257
+msgid "This [.filename]#Makefile# takes the following form:"
+msgstr "Этот [.filename]#Makefile# имеет следующую форму:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:282
+#, no-wrap
+msgid ""
+"# Generate the FreeBSD documentation\n"
+"#\n"
+"# Copyright (c) 2020-2025, The FreeBSD Documentation Project\n"
+"# Copyright (c) 2020-2025, Sergio Carlavilla <carlavilla@FreeBSD.org>\n"
+"#\n"
+"# Targets intended for use on the command line\n"
+"#\n"
+"# all (default)\t-\tgenerate the books TOC and compile all the documentation\n"
+"# clean\t\t- \tremoves generated files\n"
+"# run\t\t-\tserves the built documentation site for local browsing\n"
+"# pdf\t\t-\tbuild PDF versions of the articles and books.\n"
+"# html\t\t-\tbuild HTML versions of the articles and books for\n"
+"#\t\t\toffline use.\n"
+"#\t\t\tIf variable DOC_HTML_ARCHIVE is set, all documents will be\n"
+"#\t\t\tarchived/compressed, and only these files will be kept in the public\n"
+"#\t\t\tdirectory.\n"
+"# epub\t\t-\tbuild EPUB versions of the articles and books (Experimental).\n"
+"#\n"
+"# The run target uses hugo's built-in webserver to make the documentation site\n"
+"# available for local browsing. The documentation should have been built prior\n"
+"# to attempting to use the `run` target. By default, hugo will start its\n"
+"# webserver on port 1313.\n"
+msgstr ""
+"# Generate the FreeBSD documentation\n"
+"#\n"
+"# Copyright (c) 2020-2025, The FreeBSD Documentation Project\n"
+"# Copyright (c) 2020-2025, Sergio Carlavilla <carlavilla@FreeBSD.org>\n"
+"#\n"
+"# Targets intended for use on the command line\n"
+"#\n"
+"# all (default)\t-\tgenerate the books TOC and compile all the documentation\n"
+"# clean\t\t- \tremoves generated files\n"
+"# run\t\t-\tserves the built documentation site for local browsing\n"
+"# pdf\t\t-\tbuild PDF versions of the articles and books.\n"
+"# html\t\t-\tbuild HTML versions of the articles and books for\n"
+"#\t\t\toffline use.\n"
+"#\t\t\tIf variable DOC_HTML_ARCHIVE is set, all documents will be\n"
+"#\t\t\tarchived/compressed, and only these files will be kept in the public\n"
+"#\t\t\tdirectory.\n"
+"# epub\t\t-\tbuild EPUB versions of the articles and books (Experimental).\n"
+"#\n"
+"# The run target uses hugo's built-in webserver to make the documentation site\n"
+"# available for local browsing. The documentation should have been built prior\n"
+"# to attempting to use the `run` target. By default, hugo will start its\n"
+"# webserver on port 1313.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:284
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:566
+#, no-wrap
+msgid "MAINTAINER=carlavilla@FreeBSD.org <.>\n"
+msgstr "MAINTAINER=carlavilla@FreeBSD.org <.>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:289
+#, no-wrap
+msgid ""
+"# List of languages without book translations\n"
+"ARTICLEONLY_LANGS=\tbn-bd da ko tr\n"
+"# List of languages without article translations\n"
+"BOOKONLY_LANGS=\t\tmn\n"
+msgstr ""
+"# List of languages without book translations\n"
+"ARTICLEONLY_LANGS=\tbn-bd da ko tr\n"
+"# List of languages without article translations\n"
+"BOOKONLY_LANGS=\t\tmn\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:292
+#, no-wrap
+msgid ""
+"# List of all languages we have content for\n"
+"ALL_LANGUAGES=\tbn-bd da de el en es fr hu it ja ko mn nl pl pt-br ru tr zh-cn zh-tw <.>\n"
+msgstr ""
+"# List of all languages we have content for\n"
+"ALL_LANGUAGES=\tbn-bd da de el en es fr hu it ja ko mn nl pl pt-br ru tr zh-cn zh-tw <.>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:294
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:571
+#, no-wrap
+msgid "LOCALBASE?=\t/usr/local\n"
+msgstr "LOCALBASE?=\t/usr/local\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:301
+#, no-wrap
+msgid ""
+"RUBY_CMD =\t${LOCALBASE}/bin/ruby <.>\n"
+"HUGO_CMD =\t${LOCALBASE}/bin/hugo <.>\n"
+"HUGO_ARGS?=\t--verbose --minify\n"
+"HUGO_OFFLINE_ARGS?= \t--environment offline --verbose --minify\n"
+"ASCIIDOCTOR_CMD=\t${LOCALBASE}/bin/asciidoctor\n"
+"ASCIIDOCTORPDF_CMD=\t${LOCALBASE}/bin/asciidoctor-pdf\n"
+msgstr ""
+"RUBY_CMD =\t${LOCALBASE}/bin/ruby <.>\n"
+"HUGO_CMD =\t${LOCALBASE}/bin/hugo <.>\n"
+"HUGO_ARGS?=\t--verbose --minify\n"
+"HUGO_OFFLINE_ARGS?= \t--environment offline --verbose --minify\n"
+"ASCIIDOCTOR_CMD=\t${LOCALBASE}/bin/asciidoctor\n"
+"ASCIIDOCTORPDF_CMD=\t${LOCALBASE}/bin/asciidoctor-pdf\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:311
+#, no-wrap
+msgid ""
+".if defined(DOC_LANG) && !empty(DOC_LANG)\n"
+"LANGUAGES=\t${DOC_LANG:S/,/ /g}\n"
+".if ${LANGUAGES:Men} == \"\" && ${.TARGETS:Mpdf*} == \"\" && ${.TARGETS:Mhtml*} == \"\"\n"
+".warning \"Warning: cannot skip 'en'; adding it back\"\n"
+"LANGUAGES+=\ten\n"
+".endif\n"
+".else\n"
+"LANGUAGES=\t${ALL_LANGUAGES}\n"
+".endif\n"
+msgstr ""
+".if defined(DOC_LANG) && !empty(DOC_LANG)\n"
+"LANGUAGES=\t${DOC_LANG:S/,/ /g}\n"
+".if ${LANGUAGES:Men} == \"\" && ${.TARGETS:Mpdf*} == \"\" && ${.TARGETS:Mhtml*} == \"\"\n"
+".warning \"Warning: cannot skip 'en'; adding it back\"\n"
+"LANGUAGES+=\ten\n"
+".endif\n"
+".else\n"
+"LANGUAGES=\t${ALL_LANGUAGES}\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:314
+#, no-wrap
+msgid ""
+"RUBYLIB =\t../shared/lib\n"
+".export\tRUBYLIB\n"
+msgstr ""
+"RUBYLIB =\t../shared/lib\n"
+".export\tRUBYLIB\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:318
+#, no-wrap
+msgid ""
+"RUN_DEPENDS=\t${HUGO_CMD} \\\n"
+"\t\t${LOCALBASE}/bin/asciidoctor \\\n"
+"\t\t${LOCALBASE}/bin/rougify\n"
+msgstr ""
+"RUN_DEPENDS=\t${HUGO_CMD} \\\n"
+"\t\t${LOCALBASE}/bin/asciidoctor \\\n"
+"\t\t${LOCALBASE}/bin/rougify\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:328
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:587
+#, no-wrap
+msgid ""
+".ifndef HOSTNAME\n"
+". ifdef BIND\n"
+".HOST=$(BIND)\n"
+". else\n"
+".HOST=localhost\n"
+". endif\n"
+".else\n"
+".HOST=$(HOSTNAME)\n"
+".endif\n"
+msgstr ""
+".ifndef HOSTNAME\n"
+". ifdef BIND\n"
+".HOST=$(BIND)\n"
+". else\n"
+".HOST=localhost\n"
+". endif\n"
+".else\n"
+".HOST=$(HOSTNAME)\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:335
+#, no-wrap
+msgid ""
+"# Strip the languages with only articles from the list of languages we\n"
+"# will use to build books.\n"
+"BOOK_LANGS= ${LANGUAGES}\n"
+".for a in ${ARTICLEONLY_LANGS}\n"
+"BOOK_LANGS:=\t${BOOK_LANGS:N${a}}\n"
+".endfor\n"
+msgstr ""
+"# Strip the languages with only articles from the list of languages we\n"
+"# will use to build books.\n"
+"BOOK_LANGS= ${LANGUAGES}\n"
+".for a in ${ARTICLEONLY_LANGS}\n"
+"BOOK_LANGS:=\t${BOOK_LANGS:N${a}}\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:342
+#, no-wrap
+msgid ""
+"# Strip the languages with only books from the list of languages we\n"
+"# will use to build articles.\n"
+"ARTICLE_LANGS= ${LANGUAGES}\n"
+".for a in ${BOOKONLY_LANGS}\n"
+"ARTICLE_LANGS:=\t${ARTICLE_LANGS:N${a}}\n"
+".endfor\n"
+msgstr ""
+"# Strip the languages with only books from the list of languages we\n"
+"# will use to build articles.\n"
+"ARTICLE_LANGS= ${LANGUAGES}\n"
+".for a in ${BOOKONLY_LANGS}\n"
+"ARTICLE_LANGS:=\t${ARTICLE_LANGS:N${a}}\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:351
+#, no-wrap
+msgid ""
+"# Take the list of all languages, and take out the ones we have been\n"
+"# asked for. We'll feed this to hugo.\n"
+"SKIP_LANGS=\n"
+".for a in ${ALL_LANGUAGES}\n"
+".if ${LANGUAGES:M${a}} == \"\"\n"
+"SKIP_LANGS+= ${a}\n"
+".endif\n"
+".endfor\n"
+msgstr ""
+"# Take the list of all languages, and take out the ones we have been\n"
+"# asked for. We'll feed this to hugo.\n"
+"SKIP_LANGS=\n"
+".for a in ${ALL_LANGUAGES}\n"
+".if ${LANGUAGES:M${a}} == \"\"\n"
+"SKIP_LANGS+= ${a}\n"
+".endif\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:353
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:608
+#, no-wrap
+msgid ".ORDER: all run <.>\n"
+msgstr ".ORDER: all run <.>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:358
+#, no-wrap
+msgid ""
+".ORDER: requirements <.>\n"
+".ORDER: starting-message\n"
+".ORDER: starting-message build\n"
+".ORDER: build\n"
+msgstr ""
+".ORDER: requirements <.>\n"
+".ORDER: starting-message\n"
+".ORDER: starting-message build\n"
+".ORDER: build\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:361
+#, no-wrap
+msgid ""
+"all: requirements starting-message generate-pgpkeys-txt build\n"
+"run: requirements starting-message generate-pgpkeys-txt run-local\n"
+msgstr ""
+"all: requirements starting-message generate-pgpkeys-txt build\n"
+"run: requirements starting-message generate-pgpkeys-txt run-local\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:364
+#, no-wrap
+msgid ""
+"# clean does not call pdf-clean as that is a subset of hugo-clean\n"
+"clean: hugo-clean pgp-clean\n"
+msgstr ""
+"# clean does not call pdf-clean as that is a subset of hugo-clean\n"
+"clean: hugo-clean pgp-clean\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:371
+#, no-wrap
+msgid ""
+"requirements:\n"
+".for dep in ${RUN_DEPENDS}\n"
+".if !exists(${dep})\n"
+"\t@(echo ${dep} not found, please run 'pkg install docproj'; exit 1)\n"
+".endif\n"
+".endfor\n"
+msgstr ""
+"requirements:\n"
+".for dep in ${RUN_DEPENDS}\n"
+".if !exists(${dep})\n"
+"\t@(echo ${dep} not found, please run 'pkg install docproj'; exit 1)\n"
+".endif\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:376
+#, no-wrap
+msgid ""
+"requirements-pdf:\n"
+".if !exists(${LOCALBASE}/bin/asciidoctor-pdf)\n"
+"\t@(echo ${LOCALBASE}/bin/asciidoctor-pdf not found, please run 'pkg install rubygem-asciidoctor-pdf'; exit 1)\n"
+".endif\n"
+msgstr ""
+"requirements-pdf:\n"
+".if !exists(${LOCALBASE}/bin/asciidoctor-pdf)\n"
+"\t@(echo ${LOCALBASE}/bin/asciidoctor-pdf not found, please run 'pkg install rubygem-asciidoctor-pdf'; exit 1)\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:381
+#, no-wrap
+msgid ""
+"requirements-epub:\n"
+".if !exists(${LOCALBASE}/bin/asciidoctor-epub3)\n"
+"\t@(echo ${LOCALBASE}/bin/asciidoctor-epub3 not found, please run 'pkg install rubygem-asciidoctor-epub3'; exit 1)\n"
+".endif\n"
+msgstr ""
+"requirements-epub:\n"
+".if !exists(${LOCALBASE}/bin/asciidoctor-epub3)\n"
+"\t@(echo ${LOCALBASE}/bin/asciidoctor-epub3 not found, please run 'pkg install rubygem-asciidoctor-epub3'; exit 1)\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:388
+#, no-wrap
+msgid ""
+"starting-message: .PHONY <.>\n"
+"\t@echo ---------------------------------------------------------------\n"
+"\t@echo Building the documentation\n"
+"\t@echo included languages: ${LANGUAGES}\n"
+"\t@echo excluded languages: ${SKIP_LANGS}\n"
+"\t@echo ---------------------------------------------------------------\n"
+msgstr ""
+"starting-message: .PHONY <.>\n"
+"\t@echo ---------------------------------------------------------------\n"
+"\t@echo Building the documentation\n"
+"\t@echo included languages: ${LANGUAGES}\n"
+"\t@echo excluded languages: ${SKIP_LANGS}\n"
+"\t@echo ---------------------------------------------------------------\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:390
+#, no-wrap
+msgid "generate-pgpkeys-txt: static/pgpkeys/pgpkeys.txt\n"
+msgstr "generate-pgpkeys-txt: static/pgpkeys/pgpkeys.txt\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:393
+#, no-wrap
+msgid ""
+"static/pgpkeys/pgpkeys.txt: static/pgpkeys/*key\n"
+"\t${RUBY_CMD} ./tools/global-pgpkeys-creator.rb\n"
+msgstr ""
+"static/pgpkeys/pgpkeys.txt: static/pgpkeys/*key\n"
+"\t${RUBY_CMD} ./tools/global-pgpkeys-creator.rb\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:397
+#, no-wrap
+msgid ""
+"run-local: .PHONY <.>\n"
+"\tHUGO_DISABLELANGUAGES=\"${SKIP_LANGS}\" ${HUGO_CMD} server \\\n"
+"\t\t${HUGO_ARGS} -D $(BIND:D--bind=$(BIND)) --baseURL=\"http://$(.HOST):1313\"\n"
+msgstr ""
+"run-local: .PHONY <.>\n"
+"\tHUGO_DISABLELANGUAGES=\"${SKIP_LANGS}\" ${HUGO_CMD} server \\\n"
+"\t\t${HUGO_ARGS} -D $(BIND:D--bind=$(BIND)) --baseURL=\"http://$(.HOST):1313\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:400
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:642
+#, no-wrap
+msgid ""
+"build: .PHONY <.>\n"
+"\tHUGO_DISABLELANGUAGES=\"${SKIP_LANGS}\" ${HUGO_CMD} ${HUGO_ARGS}\n"
+msgstr ""
+"build: .PHONY <.>\n"
+"\tHUGO_DISABLELANGUAGES=\"${SKIP_LANGS}\" ${HUGO_CMD} ${HUGO_ARGS}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:403
+#, no-wrap
+msgid ""
+"build-offline: .PHONY\n"
+"\tHUGO_DISABLELANGUAGES=\"${SKIP_LANGS}\" ${HUGO_CMD} ${HUGO_OFFLINE_ARGS}\n"
+msgstr ""
+"build-offline: .PHONY\n"
+"\tHUGO_DISABLELANGUAGES=\"${SKIP_LANGS}\" ${HUGO_CMD} ${HUGO_OFFLINE_ARGS}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:406
+#, no-wrap
+msgid ""
+"pgp-clean: .PHONY\n"
+"\trm -f static/pgpkeys/pgpkeys.txt\n"
+msgstr ""
+"pgp-clean: .PHONY\n"
+"\trm -f static/pgpkeys/pgpkeys.txt\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:409
+#, no-wrap
+msgid ""
+"hugo-clean: .PHONY\n"
+"\trm -rf resources public\n"
+msgstr ""
+"hugo-clean: .PHONY\n"
+"\trm -rf resources public\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:415
+#, no-wrap
+msgid ""
+"#\n"
+"# PDF targets\n"
+"# Use DOC_LANG to choose the language, e.g., make DOC_LANG=\"en fr\" pdf-books\n"
+"#\n"
+"pdf: pdf-articles pdf-books\n"
+msgstr ""
+"#\n"
+"# PDF targets\n"
+"# Use DOC_LANG to choose the language, e.g., make DOC_LANG=\"en fr\" pdf-books\n"
+"#\n"
+"pdf: pdf-articles pdf-books\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:420
+#, no-wrap
+msgid ""
+"pdf-books: requirements-pdf\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\t./tools/asciidoctor.sh books ${_lang} pdf\n"
+".endfor\n"
+msgstr ""
+"pdf-books: requirements-pdf\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\t./tools/asciidoctor.sh books ${_lang} pdf\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:425
+#, no-wrap
+msgid ""
+"pdf-articles: requirements-pdf\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\t./tools/asciidoctor.sh articles ${_lang} pdf\n"
+".endfor\n"
+msgstr ""
+"pdf-articles: requirements-pdf\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\t./tools/asciidoctor.sh articles ${_lang} pdf\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:427
+#, no-wrap
+msgid "pdf-clean: pdf-articles-clean pdf-books-clean\n"
+msgstr "pdf-clean: pdf-articles-clean pdf-books-clean\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:434
+#, no-wrap
+msgid ""
+"pdf-books-clean:\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/books\n"
+"\t-rmdir ${.CURDIR}/public/${_lang}\n"
+".endfor\n"
+"\t-rmdir ${.CURDIR}/public/\n"
+msgstr ""
+"pdf-books-clean:\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/books\n"
+"\t-rmdir ${.CURDIR}/public/${_lang}\n"
+".endfor\n"
+"\t-rmdir ${.CURDIR}/public/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:443
+#, no-wrap
+msgid ""
+"pdf-articles-clean:\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/articles\n"
+".if !exists(${.CURDIR}/public/${_lang}/books)\n"
+"\trm -fr ${.CURDIR}/public/${_lang}\n"
+".endif\n"
+".endfor\n"
+"\t-rmdir ${.CURDIR}/public\n"
+msgstr ""
+"pdf-articles-clean:\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/articles\n"
+".if !exists(${.CURDIR}/public/${_lang}/books)\n"
+"\trm -fr ${.CURDIR}/public/${_lang}\n"
+".endif\n"
+".endfor\n"
+"\t-rmdir ${.CURDIR}/public\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:448
+#, no-wrap
+msgid ""
+"#\n"
+"# HTML targets\n"
+"#\n"
+"html: build-offline html-clean-global html-clean-articles html-clean-books html-archive html-archive-clean-files\n"
+msgstr ""
+"#\n"
+"# HTML targets\n"
+"#\n"
+"html: build-offline html-clean-global html-clean-articles html-clean-books html-archive html-archive-clean-files\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:450
+#, no-wrap
+msgid "html-clean: hugo-clean\n"
+msgstr "html-clean: hugo-clean\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:454
+#, no-wrap
+msgid ""
+"html-clean-global:\n"
+"\trm -fr ${.CURDIR}/public/index.html\n"
+"\trm -rf pgpkeys js\n"
+msgstr ""
+"html-clean-global:\n"
+"\trm -fr ${.CURDIR}/public/index.html\n"
+"\trm -rf pgpkeys js\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:460
+#, no-wrap
+msgid ""
+"html-clean-articles:\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/index.html\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/articles/index.html\n"
+".endfor\n"
+msgstr ""
+"html-clean-articles:\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/index.html\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/articles/index.html\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:465
+#, no-wrap
+msgid ""
+"html-clean-books:\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/books/index.html\n"
+".endfor\n"
+msgstr ""
+"html-clean-books:\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/books/index.html\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:475
+#, no-wrap
+msgid ""
+"html-archive:\n"
+".if defined(DOC_HTML_ARCHIVE)\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\t./tools/asciidoctor.sh articles ${_lang} archive\n"
+".endfor\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\t./tools/asciidoctor.sh books ${_lang} archive\n"
+".endfor\n"
+".endif\n"
+msgstr ""
+"html-archive:\n"
+".if defined(DOC_HTML_ARCHIVE)\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\t./tools/asciidoctor.sh articles ${_lang} archive\n"
+".endfor\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\t./tools/asciidoctor.sh books ${_lang} archive\n"
+".endfor\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:481
+#, no-wrap
+msgid ""
+"html-archive-clean-files:\n"
+".if defined(DOC_HTML_ARCHIVE)\n"
+"\tfind ${.CURDIR}/public/ ! -name '*.pdf' ! -name '*.tar.gz' -type f -delete\n"
+"\tfind ${.CURDIR}/public/ -type d -empty -delete\n"
+".endif\n"
+msgstr ""
+"html-archive-clean-files:\n"
+".if defined(DOC_HTML_ARCHIVE)\n"
+"\tfind ${.CURDIR}/public/ ! -name '*.pdf' ! -name '*.tar.gz' -type f -delete\n"
+"\tfind ${.CURDIR}/public/ -type d -empty -delete\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:487
+#, no-wrap
+msgid ""
+"#\n"
+"# EPUB targets\n"
+"# Use DOC_LANG to choose the language, e.g., make DOC_LANG=\"en fr\" epub-books\n"
+"#\n"
+"epub: epub-articles epub-books\n"
+msgstr ""
+"#\n"
+"# EPUB targets\n"
+"# Use DOC_LANG to choose the language, e.g., make DOC_LANG=\"en fr\" epub-books\n"
+"#\n"
+"epub: epub-articles epub-books\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:500
+#, no-wrap
+msgid ""
+"epub-books: requirements-epub\n"
+"\t@echo ---------------------------------------------------------------\n"
+"\t@echo !!! EPUB output is experimental !!!\n"
+"\t@echo\n"
+"\t@echo Asciidoctor EPUB3 is currently alpha software. Use accordingly. Although the\n"
+"\t@echo bulk of AsciiDoc content is converted, there’s still work needed to fill in\n"
+"\t@echo gaps where conversion is incomplete or unstyled.\n"
+"\t@echo https://docs.asciidoctor.org/epub3-converter/latest/#project-status\n"
+"\t@echo ---------------------------------------------------------------\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\t./tools/asciidoctor.sh books ${_lang} epub\n"
+".endfor\n"
+msgstr ""
+"epub-books: requirements-epub\n"
+"\t@echo ---------------------------------------------------------------\n"
+"\t@echo !!! EPUB output is experimental !!!\n"
+"\t@echo\n"
+"\t@echo Asciidoctor EPUB3 is currently alpha software. Use accordingly. Although the\n"
+"\t@echo bulk of AsciiDoc content is converted, there’s still work needed to fill in\n"
+"\t@echo gaps where conversion is incomplete or unstyled.\n"
+"\t@echo https://docs.asciidoctor.org/epub3-converter/latest/#project-status\n"
+"\t@echo ---------------------------------------------------------------\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\t./tools/asciidoctor.sh books ${_lang} epub\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:513
+#, no-wrap
+msgid ""
+"epub-articles: requirements-epub\n"
+"\t@echo ---------------------------------------------------------------\n"
+"\t@echo !!! EPUB output is experimental !!!\n"
+"\t@echo\n"
+"\t@echo Asciidoctor EPUB3 is currently alpha software. Use accordingly. Although the\n"
+"\t@echo bulk of AsciiDoc content is converted, there’s still work needed to fill in\n"
+"\t@echo gaps where conversion is incomplete or unstyled.\n"
+"\t@echo https://docs.asciidoctor.org/epub3-converter/latest/#project-status\n"
+"\t@echo ---------------------------------------------------------------\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\t./tools/asciidoctor.sh articles ${_lang} epub\n"
+".endfor\n"
+msgstr ""
+"epub-articles: requirements-epub\n"
+"\t@echo ---------------------------------------------------------------\n"
+"\t@echo !!! EPUB output is experimental !!!\n"
+"\t@echo\n"
+"\t@echo Asciidoctor EPUB3 is currently alpha software. Use accordingly. Although the\n"
+"\t@echo bulk of AsciiDoc content is converted, there’s still work needed to fill in\n"
+"\t@echo gaps where conversion is incomplete or unstyled.\n"
+"\t@echo https://docs.asciidoctor.org/epub3-converter/latest/#project-status\n"
+"\t@echo ---------------------------------------------------------------\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\t./tools/asciidoctor.sh articles ${_lang} epub\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:515
+#, no-wrap
+msgid "epub-clean: epub-articles-clean epub-books-clean\n"
+msgstr "epub-clean: epub-articles-clean epub-books-clean\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:522
+#, no-wrap
+msgid ""
+"epub-books-clean:\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/books\n"
+"\t-rmdir ${.CURDIR}/public/${_lang}\n"
+".endfor\n"
+"\t-rmdir ${.CURDIR}/public/\n"
+msgstr ""
+"epub-books-clean:\n"
+".for _lang in ${BOOK_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/books\n"
+"\t-rmdir ${.CURDIR}/public/${_lang}\n"
+".endfor\n"
+"\t-rmdir ${.CURDIR}/public/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:531
+#, no-wrap
+msgid ""
+"epub-articles-clean:\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/articles\n"
+".if !exists(${.CURDIR}/public/${_lang}/books)\n"
+"\trm -fr ${.CURDIR}/public/${_lang}\n"
+".endif\n"
+".endfor\n"
+"\t-rmdir ${.CURDIR}/public\n"
+msgstr ""
+"epub-articles-clean:\n"
+".for _lang in ${ARTICLE_LANGS}\n"
+"\trm -fr ${.CURDIR}/public/${_lang}/articles\n"
+".if !exists(${.CURDIR}/public/${_lang}/books)\n"
+"\trm -fr ${.CURDIR}/public/${_lang}\n"
+".endif\n"
+".endfor\n"
+"\t-rmdir ${.CURDIR}/public\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:534
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:656
+msgid "The `MAINTAINER` flag specifies who is the maintainer of this Makefile."
+msgstr ""
+"Флаг `MAINTAINER` указывает, кто является сопровождающим данного Makefile."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:535
+msgid ""
+"`ALL_LANGUAGES` flag specifies in which languages the table of contents has "
+"to be generated."
+msgstr ""
+"Флаг `ALL_LANGUAGES` указывает, на каких языках должно быть сгенерировано "
+"оглавление."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:536
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:657
+msgid "`RUBY_CMD` flag specifies the location of the Ruby binary."
+msgstr "Флаг `RUBY_CMD` указывает расположение бинарного файла Ruby."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:537
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:658
+msgid "`HUGO_CMD` flag specifies the location of the Hugo binary."
+msgstr "`HUGO_CMD` — флаг, указывающий расположение бинарного файла Hugo."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:538
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:659
+msgid ""
+"`.ORDER` directives are used to ensure multiple make jobs may run without "
+"problem."
+msgstr ""
+"Директивы `.ORDER` используются для обеспечения беспроблемного выполнения "
+"нескольких заданий make."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:539
+msgid ""
+"`all` target builds the documentation and puts the result in *~/doc/"
+"documentation/public*."
+msgstr ""
+"Цель `all` собирает документацию и помещает результат в *~/doc/documentation/"
+"public*."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:540
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:661
+msgid ""
+"`starting-message` shows a message in the CLI to show the user that the "
+"process is running."
+msgstr ""
+"`starting-message` показывает сообщение в CLI, чтобы уведомить пользователя "
+"о том, что процесс выполняется."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:541
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:664
+msgid ""
+"`run-local` runs hugo webserver on port 1313, or a random free port if that "
+"is already in use."
+msgstr ""
+"`run-local` запускает веб-сервер hugo на порту 1313 или на случайном "
+"свободном порту, если указанный порт уже занят."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:542
+msgid ""
+"`build` builds the documentation and puts the result in the *~/doc/"
+"documentation/public*."
+msgstr ""
+"`build` собирает документацию и помещает результат в *~/doc/documentation/"
+"public*."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:544
+#, no-wrap
+msgid "Website Makefile"
+msgstr "Makefile в каталоге website"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:547
+msgid "This [.filename]#Makefile# takes the form of:"
+msgstr "Этот [.filename]#Makefile# имеет следующий вид:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:564
+#, no-wrap
+msgid ""
+"# Generate the FreeBSD website\n"
+"#\n"
+"# Copyright (c) 2020-2025, The FreeBSD Documentation Project\n"
+"# Copyright (c) 2020-2025, Sergio Carlavilla <carlavilla@FreeBSD.org>\n"
+"#\n"
+"# Targets intended for use on the command line\n"
+"#\n"
+"# all (default)\t-\tgenerate the releases.toml and compile all the website\n"
+"# run\t-\t\t\tserves the built website for local browsing\n"
+"#\n"
+"# The run target uses hugo's built-in webserver to make the built website\n"
+"# available for local browsing. The website should have been built prior\n"
+"# to attempting to use the `run` target. By default, hugo will start its\n"
+"# webserver on port 1313.\n"
+msgstr ""
+"# Generate the FreeBSD website\n"
+"#\n"
+"# Copyright (c) 2020-2025, The FreeBSD Documentation Project\n"
+"# Copyright (c) 2020-2025, Sergio Carlavilla <carlavilla@FreeBSD.org>\n"
+"#\n"
+"# Targets intended for use on the command line\n"
+"#\n"
+"# all (default)\t-\tgenerate the releases.toml and compile all the website\n"
+"# run\t-\t\t\tserves the built website for local browsing\n"
+"#\n"
+"# The run target uses hugo's built-in webserver to make the built website\n"
+"# available for local browsing. The website should have been built prior\n"
+"# to attempting to use the `run` target. By default, hugo will start its\n"
+"# webserver on port 1313.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:569
+#, no-wrap
+msgid ""
+"# List of all languages we have content for\n"
+"ALL_LANGUAGES=\tde el en es fr hu it ja nl ru tr zh-cn zh-tw\n"
+msgstr ""
+"# List of all languages we have content for\n"
+"ALL_LANGUAGES=\tde el en es fr hu it ja nl ru tr zh-cn zh-tw\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:577
+#, no-wrap
+msgid ""
+"RUBY_CMD =\t${LOCALBASE}/bin/ruby <.>\n"
+"HUGO_CMD =\t${LOCALBASE}/bin/hugo <.>\n"
+"HUGO_ARGS?=\t--verbose\n"
+"RUBYLIB =\t../shared/lib\n"
+".export\tRUBYLIB\n"
+msgstr ""
+"RUBY_CMD =\t${LOCALBASE}/bin/ruby <.>\n"
+"HUGO_CMD =\t${LOCALBASE}/bin/hugo <.>\n"
+"HUGO_ARGS?=\t--verbose\n"
+"RUBYLIB =\t../shared/lib\n"
+".export\tRUBYLIB\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:597
+#, no-wrap
+msgid ""
+".if defined(DOC_LANG) && !empty(DOC_LANG)\n"
+"LANGUAGES= ${DOC_LANG:S/,/ /g}\n"
+".if ${LANGUAGES:Men} == \"\"\n"
+".warning \"Warning: cannot skip 'en'; adding it back\"\n"
+"LANGUAGES+=\ten\n"
+".endif\n"
+".else\n"
+"LANGUAGES=\t${ALL_LANGUAGES}\n"
+".endif\n"
+msgstr ""
+".if defined(DOC_LANG) && !empty(DOC_LANG)\n"
+"LANGUAGES= ${DOC_LANG:S/,/ /g}\n"
+".if ${LANGUAGES:Men} == \"\"\n"
+".warning \"Warning: cannot skip 'en'; adding it back\"\n"
+"LANGUAGES+=\ten\n"
+".endif\n"
+".else\n"
+"LANGUAGES=\t${ALL_LANGUAGES}\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:606
+#, no-wrap
+msgid ""
+"# Take the list of all languages, and take out the ones we have been\n"
+"# asked for via DOC_LANG. We'll feed this to hugo.\n"
+"SKIP_LANGS=\n"
+".for a in ${ALL_LANGUAGES}\n"
+".if ${LANGUAGES:M${a}} == \"\"\n"
+"SKIP_LANGS+=\t${a}\n"
+".endif\n"
+".endfor\n"
+msgstr ""
+"# Take the list of all languages, and take out the ones we have been\n"
+"# asked for via DOC_LANG. We'll feed this to hugo.\n"
+"SKIP_LANGS=\n"
+".for a in ${ALL_LANGUAGES}\n"
+".if ${LANGUAGES:M${a}} == \"\"\n"
+"SKIP_LANGS+=\t${a}\n"
+".endif\n"
+".endfor\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:614
+#, no-wrap
+msgid ""
+".ORDER: starting-message generate-releases\n"
+".ORDER: starting-message build\n"
+".ORDER: generate-releases build\n"
+".ORDER: build post-build\n"
+".ORDER: post-build end-message\n"
+msgstr ""
+".ORDER: starting-message generate-releases\n"
+".ORDER: starting-message build\n"
+".ORDER: generate-releases build\n"
+".ORDER: build post-build\n"
+".ORDER: post-build end-message\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:618
+#, no-wrap
+msgid ""
+"all: starting-message generate-releases build post-build end-message <.>\n"
+"run: starting-message generate-releases run-local\n"
+"clean: hugo-clean releases-clean\n"
+msgstr ""
+"all: starting-message generate-releases build post-build end-message <.>\n"
+"run: starting-message generate-releases run-local\n"
+"clean: hugo-clean releases-clean\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:625
+#, no-wrap
+msgid ""
+"starting-message: .PHONY <.>\n"
+"\t@echo \"---------------------------------------------------------------\"\n"
+"\t@echo \"Building the website started on $$(date)\"\n"
+"\t@echo \" included languages: ${LANGUAGES}\"\n"
+"\t@echo \" excluded languages: ${SKIP_LANGS}\"\n"
+"\t@echo \"---------------------------------------------------------------\"\n"
+msgstr ""
+"starting-message: .PHONY <.>\n"
+"\t@echo \"---------------------------------------------------------------\"\n"
+"\t@echo \"Building the website started on $$(date)\"\n"
+"\t@echo \" included languages: ${LANGUAGES}\"\n"
+"\t@echo \" excluded languages: ${SKIP_LANGS}\"\n"
+"\t@echo \"---------------------------------------------------------------\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:630
+#, no-wrap
+msgid ""
+"end-message: .PHONY\n"
+"\t@echo \"---------------------------------------------------------------\"\n"
+"\t@echo \"Building the website completed on $$(date)\"\n"
+"\t@echo \"---------------------------------------------------------------\"\n"
+msgstr ""
+"end-message: .PHONY\n"
+"\t@echo \"---------------------------------------------------------------\"\n"
+"\t@echo \"Building the website completed on $$(date)\"\n"
+"\t@echo \"---------------------------------------------------------------\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:632
+#, no-wrap
+msgid "generate-releases: data/releases.toml <.>\n"
+msgstr "generate-releases: data/releases.toml <.>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:635
+#, no-wrap
+msgid ""
+"data/releases.toml:\n"
+"\t${RUBY_CMD} ./tools/releases-toml.rb\n"
+msgstr ""
+"data/releases.toml:\n"
+"\t${RUBY_CMD} ./tools/releases-toml.rb\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:639
+#, no-wrap
+msgid ""
+"run-local: .PHONY <.>\n"
+"\tHUGO_DISABLELANGUAGES=\"${SKIP_LANGS}\" ${HUGO_CMD} server \\\n"
+"\t ${HUGO_ARGS} -D $(BIND:D--bind=$(BIND)) --baseURL=\"http://$(.HOST):1313\"\n"
+msgstr ""
+"run-local: .PHONY <.>\n"
+"\tHUGO_DISABLELANGUAGES=\"${SKIP_LANGS}\" ${HUGO_CMD} server \\\n"
+"\t ${HUGO_ARGS} -D $(BIND:D--bind=$(BIND)) --baseURL=\"http://$(.HOST):1313\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:644
+#, no-wrap
+msgid "post-build: cgi-permissions\n"
+msgstr "post-build: cgi-permissions\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:647
+#, no-wrap
+msgid ""
+"cgi-permissions:\n"
+"\t@chmod 555 ./public/cgi/*.cgi\n"
+msgstr ""
+"cgi-permissions:\n"
+"\t@chmod 555 ./public/cgi/*.cgi\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:650
+#, no-wrap
+msgid ""
+"hugo-clean:\n"
+"\trm -fr public resources\n"
+msgstr ""
+"hugo-clean:\n"
+"\trm -fr public resources\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:653
+#, no-wrap
+msgid ""
+"releases-clean:\n"
+"\trm -f data/releases.toml\n"
+msgstr ""
+"releases-clean:\n"
+"\trm -f data/releases.toml\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:660
+msgid ""
+"`all` target builds the website and puts the result in *~/doc/website/"
+"public*."
+msgstr ""
+"Цель `all` собирает веб-сайт и помещает результат в *~/doc/website/public*."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:663
+msgid ""
+"`generate-releases` calls the script used to convert from AsciiDoc variables "
+"to TOML variables. With this conversion, the releases variables can be used "
+"in AsciiDoc and in the Hugo custom templates."
+msgstr ""
+"`generate-releases` вызывает скрипт, используемый для преобразования "
+"переменных AsciiDoc в переменные TOML. После этого преобразования переменные "
+"релизов можно использовать как в AsciiDoc, так и в пользовательских шаблонах "
+"Hugo."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/doc-build/_index.adoc:664
+msgid ""
+"`build` builds the website and puts the result in the *~/doc/website/public*."
+msgstr ""
+"`build` собирает веб-сайт и помещает результат в *~/doc/website/public*."
diff --git a/documentation/content/ru/books/fdp-primer/editor-config/_index.adoc b/documentation/content/ru/books/fdp-primer/editor-config/_index.adoc
new file mode 100644
index 0000000000..7c95bf0bee
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/editor-config/_index.adoc
@@ -0,0 +1,323 @@
+---
+description: 'Конфигурация, используемая в текстовых редакторах в проекте документации FreeBSD'
+next: books/fdp-primer/trademarks
+params:
+ path: /books/fdp-primer/editor-config/
+prev: books/fdp-primer/writing-style
+showBookMenu: true
+tags: ["editor", "configuration", "vim", "emacs", "FreeBSD"]
+title: 'Глава 13. Настройка редактора'
+weight: 13
+---
+
+[[editor-config]]
+= Настройка редактора
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 13
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Настройка конфигурации текстового редактора может ускорить и упростить работу с документами, а также помочь им соответствовать рекомендациям FDP.
+
+[[editor-config-vim]]
+== Vim
+
+Установите из package:editors/vim[], затем следуйте инструкциям по настройке в разделе crossref:editor-config[editor-config-vim-config,Конфигурация]. Более опытные пользователи могут использовать полноценный линтер, например link:https://github.com/dense-analysis/ale[Ale], который также может работать как клиент link:https://langserver.org/[Language Server Protocol] для Vim.
+
+[[editor-config-vim-use]]
+=== Использование
+
+Создатели страниц Справочника могут использовать следующие сочетания клавиш для переформатирования:
+
+* Нажмите kbd:[P], чтобы переформатировать абзацы или выделенный текст в режиме Visual.
+* Нажмите kbd:[T], чтобы заменить группы из восьми пробелов на табуляцию.
+
+В документацию добавлен линтер link:https://vale.sh[Vale] для проверки грамматических и стилистических ошибок. Vale поддерживает различные редакторы и IDE.
+
+Vale может быть уже установлен как зависимость мета-порта package:textproc/docproj[]. Если нет, установите package:textproc/vale[] с помощью:
+
+[source, console]
+....
+$ pkg install vale
+....
+
+Установите link:https://github.com/dense-analysis/ale[Ale] для интеграции в package:editors/vim[], чтобы использовать package:textproc/vale[].
+
+[source, console?prompt=%]
+....
+% mkdir -p ~/.vim/pack/vendor/start
+% git clone --depth 1 https://github.com/dense-analysis/ale.git ~/.vim/pack/vendor/start/ale
+....
+
+Пользователи, использующие менеджеры плагинов для package:editors/vim[], не нуждаются в вышеописанном и должны следовать инструкциям своего менеджера плагинов для установки link:https://github.com/dense-analysis/ale[Ale].
+
+В данный момент из-за ошибки в link:https://vale.sh[Vale] необходимо скопировать конфигурацию link:https://vale.sh[Vale] в домашний каталог. Учитывая, что репозиторий был склонирован в [.filename]#~/doc#, скопируйте следующим образом:
+
+[source, console?prompt=%]
+....
+% cp -R ~/doc/.vale* ~/
+....
+
+[[editor-config-vim-config]]
+=== Конфигурация
+
+Отредактируйте файл [.filename]#~/.vimrc#, добавив следующие строки в конец файла:
+
+[source.programlisting, viml]
+.`~/.vimrc`
+....
+if has("autocmd")
+ au BufNewFile,BufRead *.adoc call Set_ADOC()
+ au BufNewFile,BufRead *.[1-9] call Set_MAN()
+endif " has(autocmd)
+
+function Set_Highlights()
+ "match ExtraWhitespace /^\s* \s*\|\s\+$/
+ return 0
+endfunction " Set_Highlights_Adoc()
+
+function Set_Highlights_MAN()
+ highlight default link OverLength ErrorMsg
+ match OverLength /\%71v.\+/
+ return 0
+endfunction " Set_Highlights_MAN()
+
+function ShowSpecial()
+ setlocal list listchars=tab:>>,trail:*,eol:$
+ hi def link nontext ErrorMsg
+ return 0
+endfunction " ShowSpecial()
+
+function Set_COMMON()
+ setlocal number
+ setlocal shiftwidth=2
+ setlocal tabstop=8
+ setlocal softtabstop=2
+ setlocal formatprg="fmt -p"
+ setlocal autoindent
+ setlocal smartindent
+ call ShowSpecial()
+ call Set_Highlights()
+ return 0
+endfunction " Set_COMMON()
+
+function Set_ADOC()
+ setlocal syntax=asciidoc
+ setlocal filetype=asciidoc
+ call Set_COMMON()
+ return 0
+endfunction " Set_ADOC()
+
+function Set_MAN()
+ setlocal syntax=man
+ setlocal filetype=man
+ setlocal textwidth=70
+ " Rewrap paragraphs
+ noremap P gqj
+ " Replace spaces with tabs
+ noremap T :s/ /\t/<CR>
+ call Set_COMMON()
+ call Set_Highlights_MAN()
+ return 0
+endfunction " Set_Man()
+
+let g:ale_fixers = {
+\ '*': ['remove_trailing_lines', 'trim_whitespace'],
+\}
+let g:ale_linters = {
+\ 'asciidoc': ['vale'],
+\}
+let g:ale_fix_on_save = 1
+....
+
+[IMPORTANT]
+======
+Приведённая выше конфигурация автоматически удалит конечную строку, конечные пробелы и множественные пробелы, которые могут отображать дополнительные нежелательные изменения в выводе `git diff`. В таких случаях обязательно укажите это в сообщении коммита.
+======
+
+[[editor-config-emacs]]
+== Emacs
+
+Установка из package:editors/emacs[] или package:editors/emacs-devel[].
+
+[[editor-config-emacs-igor]]
+=== Автоматизированная проверка правописания с Flycheck и Igor
+
+Пакет link:https://www.flycheck.org/[Flycheck] доступен из link:https://melpa.org/[Milkypostman's Emacs Lisp Package Archive] (MELPA). Если MELPA ещё не добавлен в packages-archives Emacs, его можно добавить, выполнив
+
+[source, emacs-lisp]
+....
+(add-to-list 'package-archives '("melpa" . "http://stable.melpa.org/packages/") t)
+....
+
+Добавьте строку в файл инициализации Emacs (один из [.filename]#~/.emacs#, [.filename]#~/.emacs.el# или [.filename]#~/.emacs.d/init.el#), чтобы сделать это изменение постоянным.
+
+Для установки Flycheck выполните
+
+[source, emacs-lisp]
+....
+(package-install 'flycheck)
+....
+
+Создайте проверяющий модуль Flycheck для package:textproc/igor[] с помощью выполнения
+
+[source, emacs-lisp]
+....
+(flycheck-define-checker igor
+ "FreeBSD Documentation Project sanity checker.
+
+See URLs https://www.freebsd.org/docproj/ and
+http://www.freshports.org/textproc/igor/."
+ :command ("igor" "-X" source-inplace)
+ :error-parser flycheck-parse-checkstyle
+ :modes (nxml-mode)
+ :standard-input t)
+
+ (add-to-list 'flycheck-checkers 'igor 'append)
+....
+
+Еще раз, добавьте эти строки в файл инициализации Emacs, чтобы изменения стали постоянными.
+
+[[editor-config-emacs-specifc]]
+=== Специфичные настройки документации FreeBSD
+
+Чтобы применить настройки, специфичные для проекта документации FreeBSD, создайте файл [.filename]#.dir-locals.el# в корневом каталоге репозитория документации и добавьте в него следующие строки:
+
+[source, emacs-lisp]
+....
+;;; Directory Local Variables
+;;; For more information see (info "(emacs) Directory Variables")
+
+((nxml-mode
+ (eval . (turn-on-auto-fill))
+ (fill-column . 70)
+ (eval . (require 'flycheck))
+ (eval . (flycheck-mode 1))
+ (flycheck-checker . igor)
+ (eval . (add-to-list 'rng-schema-locating-files "~/.emacs.d/schema/schemas.xml"))))
+....
+
+[[editor-config-nano]]
+== nano
+
+Установка из package:editors/nano[].
+
+[[editor-config-nano-config]]
+=== Конфигурация
+
+В текущей версии nano нет файла подсветки синтаксиса для adoc/asciidoc. Поэтому создадим его с нуля, используя текстовый редактор для создания нового файла или добавления строк в [.filename]#~/.nanorc# со следующим содержимым:
+
+[source]
+.`~/.nanorc`
+....
+syntax "asciidoc" "\.(adoc|asc|asciidoc)$"
+# main header
+color red "^====+$"
+# h1
+color red "^==[[:space:]].*$"
+color red "^----+$"
+# h2
+color magenta "^===[[:space:]].*$"
+color magenta "^~~~~+$"
+# h4
+color green "^====[[:space:]].*$"
+color green "^\^\^\^\^+$"
+# h5
+color brightblue "^=====[[:space:]].*$"
+color brightblue "^\+\+\+\++$"
+# attributes
+color brightgreen ":.*:"
+color brightred "\{[a-z0-9]*\}"
+color red "\\\{[a-z0-9]*\}"
+color red "\+\+\+\{[a-z0-9]*\}\+\+\+"
+# Paragraph Title
+color yellow "^\..*$"
+# source
+color magenta "^\[(source,.+|NOTE|TIP|IMPORTANT|WARNING|CAUTION)\]"
+# Other markup
+color yellow ".*[[:space:]]\+$"
+color yellow "_[^_]+_"
+color yellow "\*[^\*]+\*"
+color yellow "\+[^\+]+\+"
+color yellow "`[^`]+`"
+color yellow "\^[^\^]+\^"
+color yellow "~[^~]+~"
+color yellow "'[^']+'"
+color cyan "`{1,2}[^']+'{1,2}"
+# bullets
+color brightmagenta "^[[:space:]]*[\*\.-]{1,5}[[:space:]]"
+# anchors
+color brightwhite "\[\[.*\]\]"
+color brightwhite "<<.*>>"
+# trailing whitespace
+color ,blue "[[:space:]]+$"
+# multiples of eight spaces at the start a line
+# (after zero or more tabs) should be a tab
+color ,blue "^([TAB]*[ ]{8})+"
+# tabs after spaces
+color ,yellow "( )+TAB"
+# highlight indents that have an odd number of spaces
+color ,red "^(([ ]{2})+|(TAB+))*[ ]{1}[^ ]{1}"
+....
+
+Обработать файл для создания встроенных табуляций:
+
+[source, console?prompt=%]
+....
+% perl -i'' -pe 's/TAB/\t/g' ~/.nanorc
+....
+
+[[editor-config-nano-use]]
+=== Использование
+
+Укажите дополнительные полезные опции при запуске редактора:
+
+[source, console?prompt=%]
+....
+% nano -AKipwz -T8 _index.adoc
+....
+
+Пользователи man:csh[1] могут определить алиас в [.filename]#~/.cshrc#, чтобы автоматизировать эти параметры:
+
+[source, shell]
+....
+alias nano "nano -AKipwz -r 70 -T8"
+....
+
+После определения псевдонима параметры будут добавлены автоматически:
+
+[source, console?prompt=%]
+....
+% nano _index.adoc
+....
diff --git a/documentation/content/ru/books/fdp-primer/editor-config/_index.po b/documentation/content/ru/books/fdp-primer/editor-config/_index.po
new file mode 100644
index 0000000000..3d65adbf1e
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/editor-config/_index.po
@@ -0,0 +1,697 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-08-19 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primereditor-config_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:1
+#, no-wrap
+msgid "Configuration used in the texts editors in the FreeBSD Documentation Project"
+msgstr "Конфигурация, используемая в текстовых редакторах в проекте документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:1
+#, no-wrap
+msgid "Chapter 13. Editor Configuration"
+msgstr "Глава 13. Настройка редактора"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:14
+#, no-wrap
+msgid "Editor Configuration"
+msgstr "Настройка редактора"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:52
+msgid ""
+"Adjusting your text editor configuration can make working on document files "
+"quicker and easier, and help documents conform to FDP guidelines."
+msgstr ""
+"Настройка конфигурации текстового редактора может ускорить и упростить "
+"работу с документами, а также помочь им соответствовать рекомендациям FDP."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:54
+#, no-wrap
+msgid "Vim"
+msgstr "Vim"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:58
+msgid ""
+"Install from package:editors/vim[], then follow the configuration "
+"instructions in crossref:editor-config[editor-config-vim-config, "
+"Configuration]. More advanced users can use a proper linter like "
+"link:https://github.com/dense-analysis/ale[Ale] which can also act as a Vim "
+"link:https://langserver.org/[Language Server Protocol] client."
+msgstr ""
+"Установите из package:editors/vim[], затем следуйте инструкциям по настройке "
+"в разделе crossref:editor-config[editor-config-vim-config,Конфигурация]. "
+"Более опытные пользователи могут использовать полноценный линтер, например "
+"link:https://github.com/dense-analysis/ale[Ale], который также может "
+"работать как клиент link:https://langserver.org/[Language Server Protocol] "
+"для Vim."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:60
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:309
+#, no-wrap
+msgid "Use"
+msgstr "Использование"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:63
+msgid ""
+"Manual page writers can use the following keyboard shortcuts to reformat:"
+msgstr ""
+"Создатели страниц Справочника могут использовать следующие сочетания клавиш "
+"для переформатирования:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:65
+msgid ""
+"Press kbd:[P] to reformat paragraphs or text that has been selected in "
+"Visual mode."
+msgstr ""
+"Нажмите kbd:[P], чтобы переформатировать абзацы или выделенный текст в "
+"режиме Visual."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:66
+msgid "Press kbd:[T] to replace groups of eight spaces with a tab."
+msgstr ""
+"Нажмите kbd:[T], чтобы заменить группы из восьми пробелов на табуляцию."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:69
+msgid ""
+"A linter named link:https://vale.sh[Vale] has been introduced to check "
+"grammatical and cosmetic errors on the documents. Vale has support for "
+"various editors and IDEs."
+msgstr ""
+"В документацию добавлен линтер link:https://vale.sh[Vale] для проверки "
+"грамматических и стилистических ошибок. Vale поддерживает различные "
+"редакторы и IDE."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:72
+msgid ""
+"Vale may already be installed as a dependency of the package:textproc/"
+"docproj[] meta-port. If not, install package:textproc/vale[] with:"
+msgstr ""
+"Vale может быть уже установлен как зависимость мета-порта package:textproc/"
+"docproj[]. Если нет, установите package:textproc/vale[] с помощью:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:76
+#, no-wrap
+msgid "$ pkg install vale\n"
+msgstr "$ pkg install vale\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:79
+msgid ""
+"Install link:https://github.com/dense-analysis/ale[Ale] to integrate into "
+"package:editors/vim[], for using package:textproc/vale[]."
+msgstr ""
+"Установите link:https://github.com/dense-analysis/ale[Ale] для интеграции в "
+"package:editors/vim[], чтобы использовать package:textproc/vale[]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:84
+#, no-wrap
+msgid ""
+"% mkdir -p ~/.vim/pack/vendor/start\n"
+"% git clone --depth 1 https://github.com/dense-analysis/ale.git ~/.vim/pack/vendor/start/ale\n"
+msgstr ""
+"% mkdir -p ~/.vim/pack/vendor/start\n"
+"% git clone --depth 1 https://github.com/dense-analysis/ale.git ~/.vim/pack/vendor/start/ale\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:87
+msgid ""
+"Users who are using plugin managers for package:editors/vim[] do not need "
+"the above and should follow the instructions of that plugin manager to "
+"install link:https://github.com/dense-analysis/ale[Ale]."
+msgstr ""
+"Пользователи, использующие менеджеры плагинов для package:editors/vim[], не "
+"нуждаются в вышеописанном и должны следовать инструкциям своего менеджера "
+"плагинов для установки link:https://github.com/dense-analysis/ale[Ale]."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:90
+msgid ""
+"At this moment due to a bug in link:https://vale.sh[Vale] it is necessary to "
+"copy the link:https://vale.sh[Vale] configuration to the home directory. "
+"Considering the repository was cloned into [.filename]#~/doc# copy as "
+"following:"
+msgstr ""
+"В данный момент из-за ошибки в link:https://vale.sh[Vale] необходимо "
+"скопировать конфигурацию link:https://vale.sh[Vale] в домашний каталог. "
+"Учитывая, что репозиторий был склонирован в [.filename]#~/doc#, скопируйте "
+"следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:94
+#, no-wrap
+msgid "% cp -R ~/doc/.vale* ~/\n"
+msgstr "% cp -R ~/doc/.vale* ~/\n"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:97
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:243
+#, no-wrap
+msgid "Configuration"
+msgstr "Конфигурация"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:100
+msgid "Edit [.filename]#~/.vimrc#, adding these lines to the end of the file:"
+msgstr ""
+"Отредактируйте файл [.filename]#~/.vimrc#, добавив следующие строки в конец "
+"файла:"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:102
+#, no-wrap
+msgid "`~/.vimrc`"
+msgstr "`~/.vimrc`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:108
+#, no-wrap
+msgid ""
+"if has(\"autocmd\")\n"
+" au BufNewFile,BufRead *.adoc call Set_ADOC()\n"
+" au BufNewFile,BufRead *.[1-9] call Set_MAN()\n"
+"endif \" has(autocmd)\n"
+msgstr ""
+"if has(\"autocmd\")\n"
+" au BufNewFile,BufRead *.adoc call Set_ADOC()\n"
+" au BufNewFile,BufRead *.[1-9] call Set_MAN()\n"
+"endif \" has(autocmd)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:113
+#, no-wrap
+msgid ""
+"function Set_Highlights()\n"
+" \"match ExtraWhitespace /^\\s* \\s*\\|\\s\\+$/\n"
+" return 0\n"
+"endfunction \" Set_Highlights_Adoc()\n"
+msgstr ""
+"function Set_Highlights()\n"
+" \"match ExtraWhitespace /^\\s* \\s*\\|\\s\\+$/\n"
+" return 0\n"
+"endfunction \" Set_Highlights_Adoc()\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:119
+#, no-wrap
+msgid ""
+"function Set_Highlights_MAN()\n"
+" highlight default link OverLength ErrorMsg\n"
+" match OverLength /\\%71v.\\+/\n"
+" return 0\n"
+"endfunction \" Set_Highlights_MAN()\n"
+msgstr ""
+"function Set_Highlights_MAN()\n"
+" highlight default link OverLength ErrorMsg\n"
+" match OverLength /\\%71v.\\+/\n"
+" return 0\n"
+"endfunction \" Set_Highlights_MAN()\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:125
+#, no-wrap
+msgid ""
+"function ShowSpecial()\n"
+" setlocal list listchars=tab:>>,trail:*,eol:$\n"
+" hi def link nontext ErrorMsg\n"
+" return 0\n"
+"endfunction \" ShowSpecial()\n"
+msgstr ""
+"function ShowSpecial()\n"
+" setlocal list listchars=tab:>>,trail:*,eol:$\n"
+" hi def link nontext ErrorMsg\n"
+" return 0\n"
+"endfunction \" ShowSpecial()\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:138
+#, no-wrap
+msgid ""
+"function Set_COMMON()\n"
+" setlocal number\n"
+" setlocal shiftwidth=2\n"
+" setlocal tabstop=8\n"
+" setlocal softtabstop=2\n"
+" setlocal formatprg=\"fmt -p\"\n"
+" setlocal autoindent\n"
+" setlocal smartindent\n"
+" call ShowSpecial()\n"
+" call Set_Highlights()\n"
+" return 0\n"
+"endfunction \" Set_COMMON()\n"
+msgstr ""
+"function Set_COMMON()\n"
+" setlocal number\n"
+" setlocal shiftwidth=2\n"
+" setlocal tabstop=8\n"
+" setlocal softtabstop=2\n"
+" setlocal formatprg=\"fmt -p\"\n"
+" setlocal autoindent\n"
+" setlocal smartindent\n"
+" call ShowSpecial()\n"
+" call Set_Highlights()\n"
+" return 0\n"
+"endfunction \" Set_COMMON()\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:145
+#, no-wrap
+msgid ""
+"function Set_ADOC()\n"
+" setlocal syntax=asciidoc\n"
+" setlocal filetype=asciidoc\n"
+" call Set_COMMON()\n"
+" return 0\n"
+"endfunction \" Set_ADOC()\n"
+msgstr ""
+"function Set_ADOC()\n"
+" setlocal syntax=asciidoc\n"
+" setlocal filetype=asciidoc\n"
+" call Set_COMMON()\n"
+" return 0\n"
+"endfunction \" Set_ADOC()\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:158
+#, no-wrap
+msgid ""
+"function Set_MAN()\n"
+" setlocal syntax=man\n"
+" setlocal filetype=man\n"
+" setlocal textwidth=70\n"
+" \" Rewrap paragraphs\n"
+" noremap P gqj\n"
+" \" Replace spaces with tabs\n"
+" noremap T :s/ /\\t/<CR>\n"
+" call Set_COMMON()\n"
+" call Set_Highlights_MAN()\n"
+" return 0\n"
+"endfunction \" Set_Man()\n"
+msgstr ""
+"function Set_MAN()\n"
+" setlocal syntax=man\n"
+" setlocal filetype=man\n"
+" setlocal textwidth=70\n"
+" \" Rewrap paragraphs\n"
+" noremap P gqj\n"
+" \" Replace spaces with tabs\n"
+" noremap T :s/ /\\t/<CR>\n"
+" call Set_COMMON()\n"
+" call Set_Highlights_MAN()\n"
+" return 0\n"
+"endfunction \" Set_Man()\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:166
+#, no-wrap
+msgid ""
+"let g:ale_fixers = {\n"
+"\\ '*': ['remove_trailing_lines', 'trim_whitespace'],\n"
+"\\}\n"
+"let g:ale_linters = {\n"
+"\\ 'asciidoc': ['vale'],\n"
+"\\}\n"
+"let g:ale_fix_on_save = 1\n"
+msgstr ""
+"let g:ale_fixers = {\n"
+"\\ '*': ['remove_trailing_lines', 'trim_whitespace'],\n"
+"\\}\n"
+"let g:ale_linters = {\n"
+"\\ 'asciidoc': ['vale'],\n"
+"\\}\n"
+"let g:ale_fix_on_save = 1\n"
+
+#. type: delimited block = 6
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:172
+msgid ""
+"Above configuration will automatically remove trailing line, trailing space "
+"and multiple spaces which might display additional unwanted changes in `git "
+"diff` output. In such cases properly mention that in the commit log."
+msgstr ""
+"Приведённая выше конфигурация автоматически удалит конечную строку, конечные "
+"пробелы и множественные пробелы, которые могут отображать дополнительные "
+"нежелательные изменения в выводе `git diff`. В таких случаях обязательно "
+"укажите это в сообщении коммита."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:175
+#, no-wrap
+msgid "Emacs"
+msgstr "Emacs"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:178
+msgid "Install from package:editors/emacs[] or package:editors/emacs-devel[]."
+msgstr ""
+"Установка из package:editors/emacs[] или package:editors/emacs-devel[]."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:180
+#, no-wrap
+msgid "Automated Proofreading with Flycheck and Igor"
+msgstr "Автоматизированная проверка правописания с Flycheck и Igor"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:184
+msgid ""
+"The link:https://www.flycheck.org/[Flycheck] package is available from "
+"link:https://melpa.org/[Milkypostman's Emacs Lisp Package Archive] (MELPA). "
+"If MELPA is not already in Emacs's packages-archives, it can be added by "
+"evaluating"
+msgstr ""
+"Пакет link:https://www.flycheck.org/[Flycheck] доступен из link:https://"
+"melpa.org/[Milkypostman's Emacs Lisp Package Archive] (MELPA). Если MELPA "
+"ещё не добавлен в packages-archives Emacs, его можно добавить, выполнив"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:188
+#, no-wrap
+msgid "(add-to-list 'package-archives '(\"melpa\" . \"http://stable.melpa.org/packages/\") t)\n"
+msgstr "(add-to-list 'package-archives '(\"melpa\" . \"http://stable.melpa.org/packages/\") t)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:191
+msgid ""
+"Add the line to Emacs's initialization file (one of [.filename]#~/.emacs#, "
+"[.filename]#~/.emacs.el#, or [.filename]#~.emacs.d/init.el#) to make this "
+"change permanent."
+msgstr ""
+"Добавьте строку в файл инициализации Emacs (один из [.filename]#~/.emacs#, "
+"[.filename]#~/.emacs.el# или [.filename]#~/.emacs.d/init.el#), чтобы сделать "
+"это изменение постоянным."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:193
+msgid "To install Flycheck, evaluate"
+msgstr "Для установки Flycheck выполните"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:197
+#, no-wrap
+msgid "(package-install 'flycheck)\n"
+msgstr "(package-install 'flycheck)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:200
+msgid "Create a Flycheck checker for package:textproc/igor[] by evaluating"
+msgstr ""
+"Создайте проверяющий модуль Flycheck для package:textproc/igor[] с помощью "
+"выполнения"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:205
+#, no-wrap
+msgid ""
+"(flycheck-define-checker igor\n"
+" \"FreeBSD Documentation Project sanity checker.\n"
+msgstr ""
+"(flycheck-define-checker igor\n"
+" \"FreeBSD Documentation Project sanity checker.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:212
+#, no-wrap
+msgid ""
+"See URLs https://www.freebsd.org/docproj/ and\n"
+"http://www.freshports.org/textproc/igor/.\"\n"
+" :command (\"igor\" \"-X\" source-inplace)\n"
+" :error-parser flycheck-parse-checkstyle\n"
+" :modes (nxml-mode)\n"
+" :standard-input t)\n"
+msgstr ""
+"See URLs https://www.freebsd.org/docproj/ and\n"
+"http://www.freshports.org/textproc/igor/.\"\n"
+" :command (\"igor\" \"-X\" source-inplace)\n"
+" :error-parser flycheck-parse-checkstyle\n"
+" :modes (nxml-mode)\n"
+" :standard-input t)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:214
+#, no-wrap
+msgid " (add-to-list 'flycheck-checkers 'igor 'append)\n"
+msgstr " (add-to-list 'flycheck-checkers 'igor 'append)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:217
+msgid ""
+"Again, add these lines to Emacs's initialization file to make the changes "
+"permanent."
+msgstr ""
+"Еще раз, добавьте эти строки в файл инициализации Emacs, чтобы изменения "
+"стали постоянными."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:219
+#, no-wrap
+msgid "FreeBSD Documentation Specific Settings"
+msgstr "Специфичные настройки документации FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:222
+msgid ""
+"To apply settings specific to the FreeBSD documentation project, create "
+"[.filename]#.dir-locals.el# in the root directory of the documentation "
+"repository and add these lines to the file:"
+msgstr ""
+"Чтобы применить настройки, специфичные для проекта документации FreeBSD, "
+"создайте файл [.filename]#.dir-locals.el# в корневом каталоге репозитория "
+"документации и добавьте в него следующие строки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:227
+#, no-wrap
+msgid ""
+";;; Directory Local Variables\n"
+";;; For more information see (info \"(emacs) Directory Variables\")\n"
+msgstr ""
+";;; Directory Local Variables\n"
+";;; For more information see (info \"(emacs) Directory Variables\")\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:235
+#, no-wrap
+msgid ""
+"((nxml-mode\n"
+" (eval . (turn-on-auto-fill))\n"
+" (fill-column . 70)\n"
+" (eval . (require 'flycheck))\n"
+" (eval . (flycheck-mode 1))\n"
+" (flycheck-checker . igor)\n"
+" (eval . (add-to-list 'rng-schema-locating-files \"~/.emacs.d/schema/schemas.xml\"))))\n"
+msgstr ""
+"((nxml-mode\n"
+" (eval . (turn-on-auto-fill))\n"
+" (fill-column . 70)\n"
+" (eval . (require 'flycheck))\n"
+" (eval . (flycheck-mode 1))\n"
+" (flycheck-checker . igor)\n"
+" (eval . (add-to-list 'rng-schema-locating-files \"~/.emacs.d/schema/schemas.xml\"))))\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:238
+#, no-wrap
+msgid "nano"
+msgstr "nano"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:241
+msgid "Install from package:editors/nano[]."
+msgstr "Установка из package:editors/nano[]."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:247
+msgid ""
+"Currently there is no adoc/asciidoc syntax highlight file with nano "
+"distribution. So let's create one from scratch and use an editor to create "
+"new file or add lines in the [.filename]#~/.nanorc# with these contents:"
+msgstr ""
+"В текущей версии nano нет файла подсветки синтаксиса для adoc/asciidoc. "
+"Поэтому создадим его с нуля, используя текстовый редактор для создания "
+"нового файла или добавления строк в [.filename]#~/.nanorc# со следующим "
+"содержимым:"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:249
+#, no-wrap
+msgid "`~/.nanorc`"
+msgstr "`~/.nanorc`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:299
+#, no-wrap
+msgid ""
+"syntax \"asciidoc\" \"\\.(adoc|asc|asciidoc)$\"\n"
+"# main header\n"
+"color red \"^====+$\"\n"
+"# h1\n"
+"color red \"^==[[:space:]].*$\"\n"
+"color red \"^----+$\"\n"
+"# h2\n"
+"color magenta \"^===[[:space:]].*$\"\n"
+"color magenta \"^~~~~+$\"\n"
+"# h4\n"
+"color green \"^====[[:space:]].*$\"\n"
+"color green \"^\\^\\^\\^\\^+$\"\n"
+"# h5\n"
+"color brightblue \"^=====[[:space:]].*$\"\n"
+"color brightblue \"^\\+\\+\\+\\++$\"\n"
+"# attributes\n"
+"color brightgreen \":.*:\"\n"
+"color brightred \"\\{[a-z0-9]*\\}\"\n"
+"color red \"\\\\\\{[a-z0-9]*\\}\"\n"
+"color red \"\\+\\+\\+\\{[a-z0-9]*\\}\\+\\+\\+\"\n"
+"# Paragraph Title\n"
+"color yellow \"^\\..*$\"\n"
+"# source\n"
+"color magenta \"^\\[(source,.+|NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\"\n"
+"# Other markup\n"
+"color yellow \".*[[:space:]]\\+$\"\n"
+"color yellow \"_[^_]+_\"\n"
+"color yellow \"\\*[^\\*]+\\*\"\n"
+"color yellow \"\\+[^\\+]+\\+\"\n"
+"color yellow \"`[^`]+`\"\n"
+"color yellow \"\\^[^\\^]+\\^\"\n"
+"color yellow \"~[^~]+~\"\n"
+"color yellow \"'[^']+'\"\n"
+"color cyan \"`{1,2}[^']+'{1,2}\"\n"
+"# bullets\n"
+"color brightmagenta \"^[[:space:]]*[\\*\\.-]{1,5}[[:space:]]\"\n"
+"# anchors\n"
+"color brightwhite \"\\[\\[.*\\]\\]\"\n"
+"color brightwhite \"<<.*>>\"\n"
+"# trailing whitespace\n"
+"color ,blue \"[[:space:]]+$\"\n"
+"# multiples of eight spaces at the start a line\n"
+"# (after zero or more tabs) should be a tab\n"
+"color ,blue \"^([TAB]*[ ]{8})+\"\n"
+"# tabs after spaces\n"
+"color ,yellow \"( )+TAB\"\n"
+"# highlight indents that have an odd number of spaces\n"
+"color ,red \"^(([ ]{2})+|(TAB+))*[ ]{1}[^ ]{1}\"\n"
+msgstr ""
+"syntax \"asciidoc\" \"\\.(adoc|asc|asciidoc)$\"\n"
+"# main header\n"
+"color red \"^====+$\"\n"
+"# h1\n"
+"color red \"^==[[:space:]].*$\"\n"
+"color red \"^----+$\"\n"
+"# h2\n"
+"color magenta \"^===[[:space:]].*$\"\n"
+"color magenta \"^~~~~+$\"\n"
+"# h4\n"
+"color green \"^====[[:space:]].*$\"\n"
+"color green \"^\\^\\^\\^\\^+$\"\n"
+"# h5\n"
+"color brightblue \"^=====[[:space:]].*$\"\n"
+"color brightblue \"^\\+\\+\\+\\++$\"\n"
+"# attributes\n"
+"color brightgreen \":.*:\"\n"
+"color brightred \"\\{[a-z0-9]*\\}\"\n"
+"color red \"\\\\\\{[a-z0-9]*\\}\"\n"
+"color red \"\\+\\+\\+\\{[a-z0-9]*\\}\\+\\+\\+\"\n"
+"# Paragraph Title\n"
+"color yellow \"^\\..*$\"\n"
+"# source\n"
+"color magenta \"^\\[(source,.+|NOTE|TIP|IMPORTANT|WARNING|CAUTION)\\]\"\n"
+"# Other markup\n"
+"color yellow \".*[[:space:]]\\+$\"\n"
+"color yellow \"_[^_]+_\"\n"
+"color yellow \"\\*[^\\*]+\\*\"\n"
+"color yellow \"\\+[^\\+]+\\+\"\n"
+"color yellow \"`[^`]+`\"\n"
+"color yellow \"\\^[^\\^]+\\^\"\n"
+"color yellow \"~[^~]+~\"\n"
+"color yellow \"'[^']+'\"\n"
+"color cyan \"`{1,2}[^']+'{1,2}\"\n"
+"# bullets\n"
+"color brightmagenta \"^[[:space:]]*[\\*\\.-]{1,5}[[:space:]]\"\n"
+"# anchors\n"
+"color brightwhite \"\\[\\[.*\\]\\]\"\n"
+"color brightwhite \"<<.*>>\"\n"
+"# trailing whitespace\n"
+"color ,blue \"[[:space:]]+$\"\n"
+"# multiples of eight spaces at the start a line\n"
+"# (after zero or more tabs) should be a tab\n"
+"color ,blue \"^([TAB]*[ ]{8})+\"\n"
+"# tabs after spaces\n"
+"color ,yellow \"( )+TAB\"\n"
+"# highlight indents that have an odd number of spaces\n"
+"color ,red \"^(([ ]{2})+|(TAB+))*[ ]{1}[^ ]{1}\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:302
+msgid "Process the file to create embedded tabs:"
+msgstr "Обработать файл для создания встроенных табуляций:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:306
+#, no-wrap
+msgid "% perl -i'' -pe 's/TAB/\\t/g' ~/.nanorc\n"
+msgstr "% perl -i'' -pe 's/TAB/\\t/g' ~/.nanorc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:312
+msgid "Specify additional helpful options when running the editor:"
+msgstr "Укажите дополнительные полезные опции при запуске редактора:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:316
+#, no-wrap
+msgid "% nano -AKipwz -T8 _index.adoc\n"
+msgstr "% nano -AKipwz -T8 _index.adoc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:319
+msgid ""
+"Users of man:csh[1] can define an alias in [.filename]#~/.cshrc# to automate "
+"these options:"
+msgstr ""
+"Пользователи man:csh[1] могут определить алиас в [.filename]#~/.cshrc#, "
+"чтобы автоматизировать эти параметры:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:323
+#, no-wrap
+msgid "alias nano \"nano -AKipwz -r 70 -T8\"\n"
+msgstr "alias nano \"nano -AKipwz -r 70 -T8\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:326
+msgid "After the alias is defined, the options will be added automatically:"
+msgstr "После определения псевдонима параметры будут добавлены автоматически:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/editor-config/_index.adoc:330
+#, no-wrap
+msgid "% nano _index.adoc\n"
+msgstr "% nano _index.adoc\n"
diff --git a/documentation/content/ru/books/fdp-primer/examples/_index.adoc b/documentation/content/ru/books/fdp-primer/examples/_index.adoc
new file mode 100644
index 0000000000..239beff506
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/examples/_index.adoc
@@ -0,0 +1,139 @@
+---
+description: 'Пример статьи и книги, используемых в проекте документации FreeBSD'
+params:
+ path: /books/fdp-primer/examples/
+prev: books/fdp-primer/see-also/
+showBookMenu: true
+tags: ["examples", "tutorial", "AsciiDoctor", "Book", "Article"]
+title: 'Приложение A. Примеры'
+weight: 16
+---
+
+[appendix]
+[[examples]]
+= Примеры
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: A
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Эти примеры не являются исчерпывающими — они не содержат всех элементов, которые может быть желательно использовать, особенно в преамбуле документа. Для дополнительных примеров использования AsciiDoctor изучите исходный AsciiDoc код для этого и других документов, доступных в Git-репозитории *doc* или онлайн, начиная с link:https://cgit.freebsd.org/doc/[https://cgit.freebsd.org/doc/].
+
+[[examples-asciidoctor-book]]
+== *Книга* AsciiDoctor
+
+.*Книга* AsciiDoctor
+[example]
+====
+[.programlisting]
+....
+---
+title: An Example Book
+authors:
+ - author: The FreeBSD Documentation Project
+copyright: 1995-2021 The FreeBSD Documentation Project
+releaseinfo: ""
+trademarks: ["general"]
+---
+
+= Пример книги
+:doctype: book :toc: macro :toclevels: 2 :icons: font :xrefstyle: basic :relfileprefix: ../ :outfilesuffix: :sectnums: :sectnumlevels: 6 :partnums: :chapter-signifier: Chapter :part-signifier: Part :source-highlighter: rouge :experimental: :skip-front-matter: :book: true :pdf: false
+
+ifeval::["{backend}" == "html5"]
+:chapters-path: content/ru/books/bookname/
+endif::[]
+
+ifeval::["{backend}" == "pdf"]
+:chapters-path:
+endif::[]
+
+ifeval::["{backend}" == "epub3"]
+:chapters-path:
+endif::[]
+
+[abstract] Аннотация
+
+Раздел аннотации
+
+'''
+
+toc::[]
+
+:sectnums!:
+
+\include::{chapters-path}preface/_index.adoc[leveloffset=+1]
+
+:sectnums:
+
+\include::{chapters-path}parti.adoc[lines=7..18]
+
+\include::{chapters-path}chapter-name/_index.adoc[leveloffset=+1]
+....
+
+====
+
+[[examples-asciidoctor-article]]
+== *Статья* AsciiDoctor
+
+.*Статья* AsciiDoctor
+[example]
+====
+[.programlisting]
+....
+---
+title: An Example Article
+authors:
+ - author: Your name and surname
+ email: foo@example.com
+trademarks: ["general"]
+---
+
+= Пример статьи
+:doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental:
+
+'''
+
+toc::[]
+
+== Мой первый раздел
+
+Это первый раздел в моей статье.
+
+=== Мой первый подраздел
+
+Это первый подраздел в моей статье.
+
+....
+
+====
diff --git a/documentation/content/ru/books/fdp-primer/examples/_index.po b/documentation/content/ru/books/fdp-primer/examples/_index.po
new file mode 100644
index 0000000000..7cc6adac70
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/examples/_index.po
@@ -0,0 +1,261 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-07-03 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerexamples_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:1
+#, no-wrap
+msgid "Example of an article and a book used in the FreeBSD Documentation Project"
+msgstr "Пример статьи и книги, используемых в проекте документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:1
+#, no-wrap
+msgid "Appendix A. Examples"
+msgstr "Приложение A. Примеры"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:14
+#, no-wrap
+msgid "Examples"
+msgstr "Примеры"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:53
+msgid ""
+"These examples are not exhaustive - they do not contain all the elements "
+"that might be desirable to use, particularly in a document's front matter. "
+"For more examples of AsciiDoctor, examine the AsciiDoc source for this and "
+"other documents available in the Git *doc* repository, or available online "
+"starting at link:https://cgit.freebsd.org/doc/[https://cgit.freebsd.org/"
+"doc/]."
+msgstr ""
+"Эти примеры не являются исчерпывающими — они не содержат всех элементов, "
+"которые может быть желательно использовать, особенно в преамбуле документа. "
+"Для дополнительных примеров использования AsciiDoctor изучите исходный "
+"AsciiDoc код для этого и других документов, доступных в Git-репозитории "
+"*doc* или онлайн, начиная с link:https://cgit.freebsd.org/doc/[https://"
+"cgit.freebsd.org/doc/]."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:55
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:57
+#, no-wrap
+msgid "AsciiDoctor *book*"
+msgstr "*Книга* AsciiDoctor"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:62
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:132
+#, no-wrap
+msgid "---\n"
+msgstr "---\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:69
+#, no-wrap
+msgid ""
+"title: An Example Book\n"
+"authors:\n"
+" - author: The FreeBSD Documentation Project\n"
+"copyright: 1995-2021 The FreeBSD Documentation Project\n"
+"releaseinfo: \"\" \n"
+"trademarks: [\"general\"] \n"
+"---\n"
+msgstr ""
+"title: An Example Book\n"
+"authors:\n"
+" - author: The FreeBSD Documentation Project\n"
+"copyright: 1995-2021 The FreeBSD Documentation Project\n"
+"releaseinfo: \"\" \n"
+"trademarks: [\"general\"] \n"
+"---\n"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:71
+#, no-wrap
+msgid "An Example Book"
+msgstr "Пример книги"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:89
+msgid ""
+":doctype: book :toc: macro :toclevels: 2 :icons: font :xrefstyle: "
+"basic :relfileprefix: ../ :outfilesuffix: :sectnums: :sectnumlevels: "
+"6 :partnums: :chapter-signifier: Chapter :part-signifier: Part :source-"
+"highlighter: rouge :experimental: :skip-front-matter: :book: true :pdf: false"
+msgstr ""
+":doctype: book\n"
+":toc: macro\n"
+":toclevels: 2\n"
+":icons: font\n"
+":xrefstyle: basic\n"
+":relfileprefix: ../\n"
+":outfilesuffix:\n"
+":sectnums:\n"
+":sectnumlevels: 6\n"
+":partnums:\n"
+":chapter-signifier: Chapter\n"
+":part-signifier: Part\n"
+":source-highlighter: rouge\n"
+":experimental:\n"
+":skip-front-matter:\n"
+":book: true\n"
+":pdf: false"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:93
+msgid ""
+"ifeval::[\"{backend}\" == \"html5\"] :chapters-path: content/en/books/"
+"bookname/ endif::[]"
+msgstr ""
+"ifeval::[\"{backend}\" == \"html5\"]\n"
+":chapters-path: content/en/books/bookname/\n"
+"endif::[]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:97
+msgid "ifeval::[\"{backend}\" == \"pdf\"] :chapters-path: endif::[]"
+msgstr ""
+"ifeval::[\"{backend}\" == \"pdf\"]\n"
+":chapters-path:\n"
+"endif::[]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:101
+msgid "ifeval::[\"{backend}\" == \"epub3\"] :chapters-path: endif::[]"
+msgstr ""
+"ifeval::[\"{backend}\" == \"epub3\"]\n"
+":chapters-path:\n"
+"endif::[]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:104
+msgid "[abstract] Abstract"
+msgstr "[abstract] Аннотация"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:106
+msgid "Abstract section"
+msgstr "Раздел аннотации"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:108
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:151
+msgid "'''"
+msgstr "'''"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:110
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:153
+msgid "toc::[]"
+msgstr "toc::[]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:112
+msgid ":sectnums!:"
+msgstr ":sectnums!:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:114
+msgid "\\include::{chapters-path}preface/_index.adoc[leveloffset=+1]"
+msgstr "\\include::{chapters-path}preface/_index.adoc[leveloffset=+1]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:116
+msgid ":sectnums:"
+msgstr ":sectnums:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:118
+msgid "\\include::{chapters-path}parti.adoc[lines=7..18]"
+msgstr "\\include::{chapters-path}parti.adoc[lines=7..18]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:120
+msgid "\\include::{chapters-path}chapter-name/_index.adoc[leveloffset=+1]"
+msgstr "\\include::{chapters-path}chapter-name/_index.adoc[leveloffset=+1]"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:125
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:127
+#, no-wrap
+msgid "AsciiDoctor *article*"
+msgstr "*Статья* AsciiDoctor"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:138
+#, no-wrap
+msgid ""
+"title: An Example Article\n"
+"authors:\n"
+" - author: Your name and surname\n"
+" email: foo@example.com\n"
+"trademarks: [\"general\"]\n"
+"---\n"
+msgstr ""
+"title: An Example Article\n"
+"authors:\n"
+" - author: Your name and surname\n"
+" email: foo@example.com\n"
+"trademarks: [\"general\"]\n"
+"---\n"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:140
+#, no-wrap
+msgid "An Example Article"
+msgstr "Пример статьи"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:149
+msgid ""
+":doctype: article :toc: macro :toclevels: 1 :icons: "
+"font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental:"
+msgstr ""
+":doctype: article\n"
+":toc: macro\n"
+":toclevels: 1\n"
+":icons: font\n"
+":sectnums:\n"
+":sectnumlevels: 6\n"
+":source-highlighter: rouge\n"
+":experimental:"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:154
+#, no-wrap
+msgid "My First Section"
+msgstr "Мой первый раздел"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:157
+msgid "This is the first section in my article."
+msgstr "Это первый раздел в моей статье."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:158
+#, no-wrap
+msgid "My First Sub-Section"
+msgstr "Мой первый подраздел"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/examples/_index.adoc:161
+msgid "This is the first sub-section in my article."
+msgstr "Это первый подраздел в моей статье."
diff --git a/documentation/content/ru/books/fdp-primer/manual-pages/_index.adoc b/documentation/content/ru/books/fdp-primer/manual-pages/_index.adoc
new file mode 100644
index 0000000000..806d04fc45
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/manual-pages/_index.adoc
@@ -0,0 +1,531 @@
+---
+description: 'Как работать со Cправочником FreeBSD'
+next: books/fdp-primer/writing-style
+params:
+ path: /books/fdp-primer/manual-pages/
+prev: books/fdp-primer/weblate
+showBookMenu: true
+tags: ["manual pages", "introduction", "guide", "reference"]
+title: 'Глава 11. Справочник'
+weight: 11
+---
+
+[[manual-pages]]
+= Справочник
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 11
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[manual-pages-introduction]]
+== Введение
+
+_Справочник_, часто сокращаемый до _man-страниц_, изначально задумывались как легкодоступные напоминания о синтаксисе команд, деталях драйверов устройств или форматах конфигурационных файлов. Со временем они стали крайне полезным справочным материалом для быстрого ознакомления прямо из командной строки для пользователей, системных администраторов и программистов.
+
+Хотя они предназначены скорее как справочные материалы, а не учебные руководства, разделы EXAMPLES в manual pages часто содержат подробные примеры использования.
+
+Страницы Справочника обычно отображаются интерактивно с помощью команды man:man[1]. Когда пользователь вводит `man ls`, выполняется поиск страницы Справочника, соответствующей `ls`. Первый найденный результат отображается.
+
+[[manual-pages-sections]]
+== Разделы
+
+Страницы справочника (man-страницы) сгруппированы по _разделам_. Каждый раздел содержит man-страницы для определённой категории документации:
+
+[.informaltable]
+[cols="1,8", options="header"]
+|===
+| Номер раздела
+| Категория
+
+
+|1
+|Общие команды
+
+|2
+|Системные вызовы
+
+|3
+|Функции библиотек
+
+|4
+|Интерфейсы ядра
+
+|5
+|Форматы файлов
+
+|6
+|Игры
+
+|7
+|Разное
+
+|8
+|Системный администратор
+
+|9
+|Разработчик ядра
+|===
+
+[[manual-pages-markup]]
+== Язык разметки
+
+Для man-страниц использовались различные формы разметки и программы отображения. FreeBSD использовала man:groff[7] и более новую man:mandoc[1]. Большинство существующих man-страниц FreeBSD, а также все новые, используют разметку в формате man:mdoc[7]. Это простая построчная разметка, обладающая достаточной выразительностью. В основном она семантическая: части текста помечаются по их назначению, а не по тому, как они должны выглядеть при отображении. Существует некоторая разметка, основанная на внешнем виде, которую обычно лучше избегать.
+
+Исходный код страницы справочника обычно интерпретируется и отображается на экране в интерактивном режиме. Исходные файлы могут быть обычными текстовыми файлами или сжатыми с помощью man:gzip[1] для экономии места.
+
+Страницы справочника также могут быть преобразованы в другие форматы, включая PostScript для печати или генерации PDF. См. man:man[1].
+
+[[manual-pages-markup-sections]]
+=== Разделы Справочника
+
+Страницы справочника состоят из нескольких стандартных разделов. Каждый раздел имеет заголовок в верхнем регистре, а разделы для определённого типа man-страниц следуют в строго определённом порядке. Для man-страниц категории 1 (Общие команды) разделы идут в следующем порядке:
+
+[.informaltable]
+[cols="2,4", options="header"]
+|===
+| Название Раздела
+| Описание
+
+
+|NAME (ИМЯ)
+|Название команды
+
+|SYNOPSIS (СИНТАКСИС)
+|Формат опций и аргументов
+
+|DESCRIPTION (ОПИСАНИЕ)
+|Описание назначения и использования
+
+|ENVIRONMENT (ОКРУЖЕНИЕ)
+|Настройки окружения, влияющие на работу
+
+|EXIT STATUS (СТАТУС ВЫХОДА)
+|Коды ошибок, возвращаемые при завершении
+
+|EXAMPLES (ПРИМЕРЫ)
+|Примеры использования
+
+|COMPATIBILITY (СОВМЕСТИМОСТЬ)
+|Совместимость с другими реализациями
+
+|SEE ALSO (СМ. ТАКЖЕ)
+|Перекрестная ссылка на связанные страницы руководства
+
+|STANDARDS (СТАНДАРТЫ)
+|Совместимость со стандартами, такими как POSIX
+
+|HISTORY (ИСТОРИЯ)
+|История реализации
+
+|BUGS (ИЗВЕСТНЫЕ ОШИБКИ)
+|Известные ошибки
+
+|AUTHORS (АВТОРЫ)
+|Люди, которые создали команду или написали справочную страницу.
+|===
+
+Некоторые разделы являются необязательными, и сочетание разделов для конкретного типа справочной страницы может различаться. Примеры наиболее распространённых типов приведены далее в этой главе.
+
+[[manual-pages-markup-macros]]
+=== Макросы
+
+Разметка man:mdoc[7] основана на _макросах_. Строки, начинающиеся с точки, содержат макрокоманды, каждая длиной в две или три буквы. Например, рассмотрим эту часть man-страницы man:ls[1]:
+
+[.programlisting]
+....
+.Dd December 1, 2015 <.>
+.Dt LS 1
+.Sh NAME <.>
+.Nm ls
+.Nd list directory contents
+.Sh SYNOPSIS <.>
+.Nm <.>
+.Op Fl -libxo <.>
+.Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, <.>
+.Op Fl D Ar format <.>
+.Op Ar <.>
+.Sh DESCRIPTION <.>
+For each operand that names a
+.Ar file
+of a type other than
+directory,
+.Nm
+displays its name as well as any requested,
+associated information.
+For each operand that names a
+.Ar file
+of type directory,
+.Nm
+displays the names of files contained
+within that directory, as well as any requested, associated
+information.
+....
+
+<.> Определены _Дата документа_ (.Dd) и _Название документа_ (.Dt).
+<.> Для раздела NAME определяется _Заголовок раздела_ (.Sh). Затем определяется _Имя_ (.Nm) команды и _Описание имени_ (.Nd) в одну строку.
+<.> Начинается раздел SYNOPSIS (.Sh). В этом разделе описываются параметры командной строки и аргументы, которые принимаются.
+<.> _Имя_ (`.Nm`) уже определено, и его повторение здесь просто отображает заданное значение в тексте.
+<.> Отображается _необязательный_ _флаг_ (.Op Fl) `-libxo`. Макрос `Fl` добавляет тире в начало флагов, поэтому в руководстве он отображается как `--libxo`.
+<.> Отображается длинный список необязательных флагов, состоящих из одного символа.
+<.> Определён необязательный флаг `-D`. Если указан флаг `-D`, за ним должен следовать _аргумент_. Аргумент представляет собой _формат_ — строку, которая указывает man:ls[1], что и как отображать. Подробности о строке формата приведены далее на странице руководства.
+<.> Определен последний необязательный аргумент. Поскольку для аргумента не указано имя, используется значение по умолчанию `file ...`.
+<.> _Заголовок раздела_ (.Sh) для раздела DESCRIPTION определен.
+
+При отображении с помощью команды `man ls` результат выводится на экран следующим образом:
+
+[.programlisting]
+....
+LS(1) FreeBSD General Commands Manual LS(1)
+
+NAME
+ ls - list directory contents
+
+SYNOPSIS
+ ls [--libxo] [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]
+ [file ...]
+
+DESCRIPTION
+ For each operand that names a file of a type other than directory, ls
+ displays its name as well as any requested, associated information. For
+ each operand that names a file of type directory, ls displays the names
+ of files contained within that directory, as well as any requested,
+ associated information.
+....
+
+Необязательные значения указаны в квадратных скобках.
+
+[[manual-pages-markup-guidelines]]
+=== Руководство по разметке
+
+Язык разметки man:mdoc[7] не является очень строгим. Для ясности и согласованности проект FreeBSD Documentation добавляет некоторые дополнительные рекомендации по стилю:
+
+Только первая буква макросов пишется с заглавной буквы::
+Всегда используйте заглавную букву для первого символа макроса и строчные буквы для остальных символов.
+
+Начинайте новые предложения с новых строк::
+Начинайте новое предложение с новой строки, не начинайте его на той же строке, что и существующее предложение.
+
+Обновите `.Dd` при внесении значительных изменений в справочную страницу::
+_Дата документа_ сообщает читателю, когда страница руководства была последний раз обновлена. Важно обновлять её при внесении значительных изменений в страницы руководства. Незначительные правки, такие как исправления орфографии или пунктуации, которые не влияют на использование, могут быть сделаны без обновления `.Dd`.
+
+Приведите примеры::
+Показывайте читателю примеры, когда это возможно. Даже простые примеры ценны, потому что то, что тривиально для автора, не обязательно тривиально для читателя. Хорошей целью являются три примера. Простой пример демонстрирует минимальные требования, серьезный пример показывает реальное использование, а углубленный пример демонстрирует неочевидную или нестандартную функциональность.
+
+Включить лицензию BSD::
+Включите лицензию BSD в новые руководства. Предпочтительная лицензия доступна в extref:{committers-guide}[Руководстве коммиттера].
+
+[[manual-pages-markup-tricks]]
+=== Приемы Разметки
+
+Добавьте пробел перед пунктуацией на строке с макросами. Пример:
+
+[.programlisting]
+....
+.Sh SEE ALSO
+.Xr geom 4 ,
+.Xr boot0cfg 8 ,
+.Xr geom 8 ,
+.Xr gptboot 8
+....
+
+Обратите внимание, как запятые в конце строк `.Xr` размещены после пробела. Макрос `.Xr` ожидает два параметра: имя внешней страницы руководства и номер раздела. Пробел отделяет пунктуацию от номера раздела. Без пробела внешние ссылки будут некорректно указывать на разделы `4,` или `8,`.
+
+[[manual-pages-markup-important-macros]]
+=== Важные макросы
+
+Здесь будут показаны некоторые очень распространённые макросы. Для большего количества примеров использования см. man:mdoc[7], man:groff_mdoc[7] или выполните поиск реальных примеров в каталогах [.filename]#/usr/share/man/man*#. Например, чтобы найти примеры макроса `.Bd` (_Begin display_):
+
+[source, shell]
+....
+% find /usr/share/man/man* | xargs zgrep '.Bd'
+....
+
+[[manual-pages-markup-important-macros-organizational]]
+==== Организационные Макросы
+
+Некоторые макросы используются для определения логических блоков страницы руководства.
+
+[.informaltable]
+[cols="1,8", options="header"]
+|===
+| Организационные Макро
+| Используйте
+
+
+|`.Sh`
+|Заголовок раздела.
+За ним следует название раздела, традиционно записанное в верхнем регистре.
+Можно рассматривать их как названия глав.
+
+|`.Ss`
+|Подзаголовок раздела.
+За ним следует название подраздела.
+Используется для разделения раздела `.Sh` на подразделы.
+
+|`.Bl`
+|Начало списка (Begin list). Начать перечень элементов.
+
+|`.El`
+|Конец списка (End List).
+
+|`.Bd`
+|Начало отображения (Begin display).
+Начать специальную область текста, например, область с отступом.
+
+|`.Ed`
+|Завершить отображение (End display).
+|===
+
+[[manual-pages-markup-important-macros-inline]]
+==== Встроенные макросы
+
+Многие макросы используются для разметки текста внутри строк.
+
+[.informaltable]
+[cols="1,8", options="header"]
+|===
+| Встроенный макрос
+| Используйте
+
+
+|`.Nm`
+|Имя (Name).
+При первом использовании вызывается с именем в качестве параметра, затем используется без параметра для отображения уже определенного имени.
+
+|`.Pa`
+|Путь к файлу (Path to a file).
+Используется для обозначения имен файлов и путей к каталогам.
+|===
+
+[[manual-pages-sample-structures]]
+== Пример структуры страницы руководства
+
+Этот раздел демонстрирует минимально желаемое содержание man-страниц для нескольких распространённых категорий руководств.
+
+[[manual-pages-sample-structures-section-1-8]]
+=== Раздел 1 или 8 — Команда
+
+Предпочтительная базовая структура для раздела 1 или 8 — Команда:
+
+[.programlisting]
+....
+.Dd August 25, 2017
+.Dt EXAMPLECMD 8
+.Os
+.Sh NAME
+.Nm examplecmd
+.Nd "command to demonstrate section 1 and 8 man pages"
+.Sh SYNOPSIS
+.Nm
+.Op Fl v
+.Sh DESCRIPTION
+The
+.Nm
+utility does nothing except demonstrate a trivial but complete
+manual page for a section 1 or 8 command.
+.Sh SEE ALSO
+.Xr exampleconf 5
+.Sh AUTHORS
+.An Firstname Lastname Aq Mt flastname@example.com
+....
+
+[[manual-pages-sample-structures-section-4]]
+=== Раздел 4 — Драйверы устройств
+
+Предпочтительная базовая структура для раздела 4 — драйверы устройств:
+
+[.programlisting]
+....
+.Dd August 25, 2017
+.Dt EXAMPLEDRIVER 4
+.Os
+.Sh NAME
+.Nm exampledriver
+.Nd "driver to demonstrate section 4 man pages"
+.Sh SYNOPSIS
+To compile this driver into the kernel, add this line to the
+kernel configuration file:
+.Bd -ragged -offset indent
+.Cd "device exampledriver"
+.Ed
+.Pp
+To load the driver as a module at boot, add this line to
+.Xr loader.conf 5 :
+.Bd -literal -offset indent
+exampledriver_load="YES"
+.Ed
+.Sh DESCRIPTION
+The
+.Nm
+driver provides an opportunity to show a skeleton or template
+file for section 4 manual pages.
+.Sh HARDWARE
+The
+.Nm
+driver supports these cards from the aptly-named Nonexistent
+Technologies:
+.Pp
+.Bl -bullet -compact
+.It
+NT X149.2 (single and dual port)
+.It
+NT X149.8 (single port)
+.El
+.Sh DIAGNOSTICS
+.Bl -diag
+.It "flashing green light"
+Something bad happened.
+.It "flashing red light"
+Something really bad happened.
+.It "solid black light"
+Power cord is unplugged.
+.El
+.Sh SEE ALSO
+.Xr example 8
+.Sh HISTORY
+The
+.Nm
+device driver first appeared in
+.Fx 49.2 .
+.Sh AUTHORS
+.An Firstname Lastname Aq Mt flastname@example.com
+....
+
+[[manual-pages-sample-structures-section-5]]
+=== Раздел 5 — Файл конфигурации
+
+Предпочтительная базовая структура для раздела 5 — файл конфигурации:
+
+[.programlisting]
+....
+.Dd August 25, 2017
+.Dt EXAMPLECONF 5
+.Os
+.Sh NAME
+.Nm example.conf
+.Nd "config file to demonstrate section 5 man pages"
+.Sh DESCRIPTION
+.Nm
+is an example configuration file.
+.Sh SEE ALSO
+.Xr example 8
+.Sh AUTHORS
+.An Firstname Lastname Aq Mt flastname@example.com
+....
+
+[[manual-pages-testing]]
+== Тестирование
+
+Проверка новой страницы руководства может быть непростой задачей. К счастью, существуют инструменты, которые могут помочь в этом. Некоторые из них, например man:man[1], не ищут в текущем каталоге. Хорошей практикой является добавление префикса `./` к имени файла, если новая страница руководства находится в текущем каталоге. Также можно использовать абсолютный путь.
+
+Используйте линтер man:mandoc[1] для проверки на ошибки парсинга:
+
+[source, shell]
+....
+% mandoc -T lint ./mynewmanpage.8
+....
+
+Используйте package:textproc/igor[] для проверки страниц Справочника:
+
+[source, shell]
+....
+% igor ./mynewmanpage.8
+....
+
+Еще один полезный инструмент — package:textproc/vale[]. Он не поддерживает синтаксис man:mdoc[7], но обработанную страницу руководства можно прочитать из стандартного ввода:
+
+[source, shell]
+....
+% man ls | vale
+....
+
+package:textproc/vale[] обладает высокой степенью настраиваемости. Рекомендуется ознакомиться с его документацией.
+
+Используйте man:man[1] для проверки конечного результата ваших изменений:
+
+[source, shell]
+....
+% man ./mynewmanpage.8
+....
+
+Вы можете использовать man:col[1] для фильтрации вывода man:man[1] и удаления backspace-символов перед загрузкой результата в ваш любимый редактор для проверки орфографии:
+
+[source, shell]
+....
+% man ./mynewmanpage.8 | col -b | vim -R -
+....
+
+Проверка орфографии с использованием полнофункциональных словарей рекомендуется и может быть выполнена с помощью package:textproc/hunspell[] или package:textproc/aspell[] в сочетании с package:textproc/en-hunspell[] или package:textproc/en-aspell[] соответственно. Например:
+
+[source, shell]
+....
+% aspell check --lang=en --mode=nroff ./mynewmanpage.8
+....
+
+[[manual-pages-examples-as-templates]]
+== Примеры страниц Справочника для использования в качестве шаблонов
+
+Некоторые страницы Справочника могут служить подробными примерами.
+
+[.informaltable]
+[cols="1,4", options="header"]
+|===
+| Страница Справочника
+| Путь к расположению исходного кода
+
+
+|man:cp[1]
+|[.filename]#/usr/src/bin/cp/cp.1#
+
+|man:vt[4]
+|[.filename]#/usr/src/share/man/man4/vt.4#
+
+|man:crontab[5]
+|[.filename]#/usr/src/usr.sbin/cron/crontab/crontab.5#
+
+|man:gpart[8]
+|[.filename]#/usr/src/sbin/geom/class/part/gpart.8#
+|===
+
+[[manual-pages-resources]]
+== Ресурсы
+
+Ресурсы для авторов справочных страниц:
+
+* man:man[1]
+* man:mandoc[1]
+* man:style.mdoc[5]
+* man:groff_mdoc[7]
+* http://manpages.bsd.lv/mdoc.html[Практические руководства UNIX: mdoc]
+* http://manpages.bsd.lv/history.html[История man-страниц UNIX]
diff --git a/documentation/content/ru/books/fdp-primer/manual-pages/_index.po b/documentation/content/ru/books/fdp-primer/manual-pages/_index.po
new file mode 100644
index 0000000000..cd9d2510ed
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/manual-pages/_index.po
@@ -0,0 +1,1454 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primermanual-pages_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:1
+#, no-wrap
+msgid "How to work with the FreeBSD Manual Pages"
+msgstr "Как работать со Cправочником FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:1
+#, no-wrap
+msgid "Chapter 11. Manual Pages"
+msgstr "Глава 11. Справочник"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:14
+#, no-wrap
+msgid "Manual Pages"
+msgstr "Справочник"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:52
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:56
+msgid ""
+"_Manual pages_, commonly shortened to _man pages_, were conceived as readily-"
+"available reminders for command syntax, device driver details, or "
+"configuration file formats. They have become an extremely valuable quick-"
+"reference from the command line for users, system administrators, and "
+"programmers."
+msgstr ""
+"_Справочник_, часто сокращаемый до _man-страниц_, изначально задумывались "
+"как легкодоступные напоминания о синтаксисе команд, деталях драйверов "
+"устройств или форматах конфигурационных файлов. Со временем они стали крайне "
+"полезным справочным материалом для быстрого ознакомления прямо из командной "
+"строки для пользователей, системных администраторов и программистов."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:58
+msgid ""
+"Although intended as reference material rather than tutorials, the EXAMPLES "
+"sections of manual pages often provide detailed use case."
+msgstr ""
+"Хотя они предназначены скорее как справочные материалы, а не учебные "
+"руководства, разделы EXAMPLES в manual pages часто содержат подробные "
+"примеры использования."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:62
+msgid ""
+"Manual pages are generally shown interactively by the man:man[1] command. "
+"When the user types `man ls`, a search is performed for a manual page "
+"matching `ls`. The first matching result is displayed."
+msgstr ""
+"Страницы Справочника обычно отображаются интерактивно с помощью команды "
+"man:man[1]. Когда пользователь вводит `man ls`, выполняется поиск страницы "
+"Справочника, соответствующей `ls`. Первый найденный результат отображается."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:64
+#, no-wrap
+msgid "Sections"
+msgstr "Разделы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:68
+msgid ""
+"Manual pages are grouped into _sections_. Each section contains manual "
+"pages for a specific category of documentation:"
+msgstr ""
+"Страницы справочника (man-страницы) сгруппированы по _разделам_. Каждый "
+"раздел содержит man-страницы для определённой категории документации:"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:73
+#, no-wrap
+msgid "Section Number"
+msgstr "Номер раздела"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:76
+#, no-wrap
+msgid "Category"
+msgstr "Категория"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:77
+#, no-wrap
+msgid "1"
+msgstr "1"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:79
+#, no-wrap
+msgid "General Commands"
+msgstr "Общие команды"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:80
+#, no-wrap
+msgid "2"
+msgstr "2"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:82
+#, no-wrap
+msgid "System Calls"
+msgstr "Системные вызовы"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:83
+#, no-wrap
+msgid "3"
+msgstr "3"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:85
+#, no-wrap
+msgid "Library Functions"
+msgstr "Функции библиотек"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:86
+#, no-wrap
+msgid "4"
+msgstr "4"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:88
+#, no-wrap
+msgid "Kernel Interfaces"
+msgstr "Интерфейсы ядра"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:89
+#, no-wrap
+msgid "5"
+msgstr "5"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:91
+#, no-wrap
+msgid "File Formats"
+msgstr "Форматы файлов"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:92
+#, no-wrap
+msgid "6"
+msgstr "6"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:94
+#, no-wrap
+msgid "Games"
+msgstr "Игры"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:95
+#, no-wrap
+msgid "7"
+msgstr "7"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:97
+#, no-wrap
+msgid "Miscellaneous"
+msgstr "Разное"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:98
+#, no-wrap
+msgid "8"
+msgstr "8"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:100
+#, no-wrap
+msgid "System Manager"
+msgstr "Системный администратор"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:101
+#, no-wrap
+msgid "9"
+msgstr "9"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:102
+#, no-wrap
+msgid "Kernel Developer"
+msgstr "Разработчик ядра"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:105
+#, no-wrap
+msgid "Markup"
+msgstr "Язык разметки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:113
+msgid ""
+"Various markup forms and rendering programs have been used for manual "
+"pages. FreeBSD has used man:groff[7] and the newer man:mandoc[1]. Most "
+"existing FreeBSD manual pages, and all new ones, use the man:mdoc[7] form of "
+"markup. This is a simple line-based markup that is reasonably expressive. "
+"It is mostly semantic: parts of text are marked up for what they are, rather "
+"than for how they should appear when rendered. There is some appearance-"
+"based markup which is usually best avoided."
+msgstr ""
+"Для man-страниц использовались различные формы разметки и программы "
+"отображения. FreeBSD использовала man:groff[7] и более новую "
+"man:mandoc[1]. Большинство существующих man-страниц FreeBSD, а также все "
+"новые, используют разметку в формате man:mdoc[7]. Это простая построчная "
+"разметка, обладающая достаточной выразительностью. В основном она "
+"семантическая: части текста помечаются по их назначению, а не по тому, как "
+"они должны выглядеть при отображении. Существует некоторая разметка, "
+"основанная на внешнем виде, которую обычно лучше избегать."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:116
+msgid ""
+"Manual page source is usually interpreted and displayed to the screen "
+"interactively. The source files can be ordinary text files or compressed "
+"with man:gzip[1] to save space."
+msgstr ""
+"Исходный код страницы справочника обычно интерпретируется и отображается на "
+"экране в интерактивном режиме. Исходные файлы могут быть обычными "
+"текстовыми файлами или сжатыми с помощью man:gzip[1] для экономии места."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:119
+msgid ""
+"Manual pages can also be rendered to other formats, including PostScript for "
+"printing or PDF generation. See man:man[1]."
+msgstr ""
+"Страницы справочника также могут быть преобразованы в другие форматы, "
+"включая PostScript для печати или генерации PDF. См. man:man[1]."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:121
+#, no-wrap
+msgid "Manual Page Sections"
+msgstr "Разделы Справочника"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:126
+msgid ""
+"Manual pages are composed of several standard sections. Each section has a "
+"title in upper case, and the sections for a particular type of manual page "
+"appear in a specific order. For a category 1 General Command manual page, "
+"the sections are:"
+msgstr ""
+"Страницы справочника состоят из нескольких стандартных разделов. Каждый "
+"раздел имеет заголовок в верхнем регистре, а разделы для определённого типа "
+"man-страниц следуют в строго определённом порядке. Для man-страниц "
+"категории 1 (Общие команды) разделы идут в следующем порядке:"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:131
+#, no-wrap
+msgid "Section Name"
+msgstr "Название Раздела"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:134
+#, no-wrap
+msgid "Description"
+msgstr "Описание"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:135
+#, no-wrap
+msgid "NAME"
+msgstr "NAME (ИМЯ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:137
+#, no-wrap
+msgid "Name of the command"
+msgstr "Название команды"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:138
+#, no-wrap
+msgid "SYNOPSIS"
+msgstr "SYNOPSIS (СИНТАКСИС)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:140
+#, no-wrap
+msgid "Format of options and arguments"
+msgstr "Формат опций и аргументов"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:141
+#, no-wrap
+msgid "DESCRIPTION"
+msgstr "DESCRIPTION (ОПИСАНИЕ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:143
+#, no-wrap
+msgid "Description of purpose and usage"
+msgstr "Описание назначения и использования"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:144
+#, no-wrap
+msgid "ENVIRONMENT"
+msgstr "ENVIRONMENT (ОКРУЖЕНИЕ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:146
+#, no-wrap
+msgid "Environment settings that affect operation"
+msgstr "Настройки окружения, влияющие на работу"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:147
+#, no-wrap
+msgid "EXIT STATUS"
+msgstr "EXIT STATUS (СТАТУС ВЫХОДА)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:149
+#, no-wrap
+msgid "Error codes returned on exit"
+msgstr "Коды ошибок, возвращаемые при завершении"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:150
+#, no-wrap
+msgid "EXAMPLES"
+msgstr "EXAMPLES (ПРИМЕРЫ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:152
+#, no-wrap
+msgid "Examples of usage"
+msgstr "Примеры использования"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:153
+#, no-wrap
+msgid "COMPATIBILITY"
+msgstr "COMPATIBILITY (СОВМЕСТИМОСТЬ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:155
+#, no-wrap
+msgid "Compatibility with other implementations"
+msgstr "Совместимость с другими реализациями"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:156
+#, no-wrap
+msgid "SEE ALSO"
+msgstr "SEE ALSO (СМ. ТАКЖЕ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:158
+#, no-wrap
+msgid "Cross-reference to related manual pages"
+msgstr "Перекрестная ссылка на связанные страницы руководства"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:159
+#, no-wrap
+msgid "STANDARDS"
+msgstr "STANDARDS (СТАНДАРТЫ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:161
+#, no-wrap
+msgid "Compatibility with standards like POSIX"
+msgstr "Совместимость со стандартами, такими как POSIX"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:162
+#, no-wrap
+msgid "HISTORY"
+msgstr "HISTORY (ИСТОРИЯ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:164
+#, no-wrap
+msgid "History of implementation"
+msgstr "История реализации"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:165
+#, no-wrap
+msgid "BUGS"
+msgstr "BUGS (ИЗВЕСТНЫЕ ОШИБКИ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:167
+#, no-wrap
+msgid "Known bugs"
+msgstr "Известные ошибки"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:168
+#, no-wrap
+msgid "AUTHORS"
+msgstr "AUTHORS (АВТОРЫ)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:169
+#, no-wrap
+msgid "People who created the command or wrote the manual page."
+msgstr "Люди, которые создали команду или написали справочную страницу."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:173
+msgid ""
+"Some sections are optional, and the combination of sections for a specific "
+"type of manual page vary. Examples of the most common types are shown later "
+"in this chapter."
+msgstr ""
+"Некоторые разделы являются необязательными, и сочетание разделов для "
+"конкретного типа справочной страницы может различаться. Примеры наиболее "
+"распространённых типов приведены далее в этой главе."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:175
+#, no-wrap
+msgid "Macros"
+msgstr "Макросы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:180
+msgid ""
+"man:mdoc[7] markup is based on _macros_. Lines that begin with a dot "
+"contain macro commands, each two or three letters long. For example, "
+"consider this portion of the man:ls[1] manual page:"
+msgstr ""
+"Разметка man:mdoc[7] основана на _макросах_. Строки, начинающиеся с точки, "
+"содержат макрокоманды, каждая длиной в две или три буквы. Например, "
+"рассмотрим эту часть man-страницы man:ls[1]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:209
+#, no-wrap
+msgid ""
+".Dd December 1, 2015 <.>\n"
+".Dt LS 1\n"
+".Sh NAME <.>\n"
+".Nm ls\n"
+".Nd list directory contents\n"
+".Sh SYNOPSIS <.>\n"
+".Nm <.>\n"
+".Op Fl -libxo <.>\n"
+".Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, <.>\n"
+".Op Fl D Ar format <.>\n"
+".Op Ar <.>\n"
+".Sh DESCRIPTION <.>\n"
+"For each operand that names a\n"
+".Ar file\n"
+"of a type other than\n"
+"directory,\n"
+".Nm\n"
+"displays its name as well as any requested,\n"
+"associated information.\n"
+"For each operand that names a\n"
+".Ar file\n"
+"of type directory,\n"
+".Nm\n"
+"displays the names of files contained\n"
+"within that directory, as well as any requested, associated\n"
+"information.\n"
+msgstr ""
+".Dd December 1, 2015 <.>\n"
+".Dt LS 1\n"
+".Sh NAME <.>\n"
+".Nm ls\n"
+".Nd list directory contents\n"
+".Sh SYNOPSIS <.>\n"
+".Nm <.>\n"
+".Op Fl -libxo <.>\n"
+".Op Fl ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1, <.>\n"
+".Op Fl D Ar format <.>\n"
+".Op Ar <.>\n"
+".Sh DESCRIPTION <.>\n"
+"For each operand that names a\n"
+".Ar file\n"
+"of a type other than\n"
+"directory,\n"
+".Nm\n"
+"displays its name as well as any requested,\n"
+"associated information.\n"
+"For each operand that names a\n"
+".Ar file\n"
+"of type directory,\n"
+".Nm\n"
+"displays the names of files contained\n"
+"within that directory, as well as any requested, associated\n"
+"information.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:212
+msgid "A _Document date_ and _Document title_ are defined."
+msgstr "Определены _Дата документа_ (.Dd) и _Название документа_ (.Dt)."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:214
+msgid ""
+"A _Section header_ for the NAME section is defined. Then the _Name_ of the "
+"command and a one-line _Name description_ are defined."
+msgstr ""
+"Для раздела NAME определяется _Заголовок раздела_ (.Sh). Затем определяется "
+"_Имя_ (.Nm) команды и _Описание имени_ (.Nd) в одну строку."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:216
+msgid ""
+"The SYNOPSIS section begins. This section describes the command-line "
+"options and arguments accepted."
+msgstr ""
+"Начинается раздел SYNOPSIS (.Sh). В этом разделе описываются параметры "
+"командной строки и аргументы, которые принимаются."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:217
+msgid ""
+"_Name_ (`.Nm`) has already been defined, and repeating it here just displays "
+"the defined value in the text."
+msgstr ""
+"_Имя_ (`.Nm`) уже определено, и его повторение здесь просто отображает "
+"заданное значение в тексте."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:219
+msgid ""
+"An _Optional_ _Flag_ called `-libxo` is shown. The `Fl` macro adds a dash "
+"to the beginning of flags, so this appears in the manual page as `--libxo`."
+msgstr ""
+"Отображается _необязательный_ _флаг_ (.Op Fl) `-libxo`. Макрос `Fl` "
+"добавляет тире в начало флагов, поэтому в руководстве он отображается как `--"
+"libxo`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:220
+msgid "A long list of optional single-character flags are shown."
+msgstr ""
+"Отображается длинный список необязательных флагов, состоящих из одного "
+"символа."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:224
+msgid ""
+"An optional `-D` flag is defined. If the `-D` flag is given, it must be "
+"followed by an _Argument_. The argument is a _format_, a string that tells "
+"man:ls[1] what to display and how to display it. Details on the format "
+"string are given later in the manual page."
+msgstr ""
+"Определён необязательный флаг `-D`. Если указан флаг `-D`, за ним должен "
+"следовать _аргумент_. Аргумент представляет собой _формат_ — строку, "
+"которая указывает man:ls[1], что и как отображать. Подробности о строке "
+"формата приведены далее на странице руководства."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:226
+msgid ""
+"A final optional argument is defined. Since no name is specified for the "
+"argument, the default of `file ...` is used."
+msgstr ""
+"Определен последний необязательный аргумент. Поскольку для аргумента не "
+"указано имя, используется значение по умолчанию `file ...`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:227
+msgid "The _Section header_ for the DESCRIPTION section is defined."
+msgstr "_Заголовок раздела_ (.Sh) для раздела DESCRIPTION определен."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:229
+msgid ""
+"When rendered with the command `man ls`, the result displayed on the screen "
+"looks like this:"
+msgstr ""
+"При отображении с помощью команды `man ls` результат выводится на экран "
+"следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:233
+#, no-wrap
+msgid "LS(1) FreeBSD General Commands Manual LS(1)\n"
+msgstr "LS(1) FreeBSD General Commands Manual LS(1)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:236
+#, no-wrap
+msgid ""
+"NAME\n"
+" ls - list directory contents\n"
+msgstr ""
+"NAME\n"
+" ls - list directory contents\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:240
+#, no-wrap
+msgid ""
+"SYNOPSIS\n"
+" ls [--libxo] [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]\n"
+" [file ...]\n"
+msgstr ""
+"SYNOPSIS\n"
+" ls [--libxo] [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]\n"
+" [file ...]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:247
+#, no-wrap
+msgid ""
+"DESCRIPTION\n"
+" For each operand that names a file of a type other than directory, ls\n"
+" displays its name as well as any requested, associated information. For\n"
+" each operand that names a file of type directory, ls displays the names\n"
+" of files contained within that directory, as well as any requested,\n"
+" associated information.\n"
+msgstr ""
+"DESCRIPTION\n"
+" For each operand that names a file of a type other than directory, ls\n"
+" displays its name as well as any requested, associated information. For\n"
+" each operand that names a file of type directory, ls displays the names\n"
+" of files contained within that directory, as well as any requested,\n"
+" associated information.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:250
+msgid "Optional values are shown inside square brackets."
+msgstr "Необязательные значения указаны в квадратных скобках."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:252
+#, no-wrap
+msgid "Markup Guidelines"
+msgstr "Руководство по разметке"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:256
+msgid ""
+"The man:mdoc[7] markup language is not very strict. For clarity and "
+"consistency, the FreeBSD Documentation project adds some additional style "
+"guidelines:"
+msgstr ""
+"Язык разметки man:mdoc[7] не является очень строгим. Для ясности и "
+"согласованности проект FreeBSD Documentation добавляет некоторые "
+"дополнительные рекомендации по стилю:"
+
+#. type: Labeled list
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:257
+#, no-wrap
+msgid "Only the first letter of macros is upper case"
+msgstr "Только первая буква макросов пишется с заглавной буквы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:259
+msgid ""
+"Always use upper case for the first letter of a macro and lower case for the "
+"remaining letters."
+msgstr ""
+"Всегда используйте заглавную букву для первого символа макроса и строчные "
+"буквы для остальных символов."
+
+#. type: Labeled list
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:260
+#, no-wrap
+msgid "Begin new sentences on new lines"
+msgstr "Начинайте новые предложения с новых строк"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:262
+msgid ""
+"Start a new sentence on a new line, do not begin it on the same line as an "
+"existing sentence."
+msgstr ""
+"Начинайте новое предложение с новой строки, не начинайте его на той же "
+"строке, что и существующее предложение."
+
+#. type: Labeled list
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:263
+#, no-wrap
+msgid "Update `.Dd` when making non-trivial changes to a manual page"
+msgstr "Обновите `.Dd` при внесении значительных изменений в справочную страницу"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:267
+msgid ""
+"The _Document date_ informs the reader about the last time the manual page "
+"was updated. It is important to update whenever non-trivial changes are "
+"made to the manual pages. Trivial changes like spelling or punctuation "
+"fixes that do not affect usage can be made without updating `.Dd`."
+msgstr ""
+"_Дата документа_ сообщает читателю, когда страница руководства была "
+"последний раз обновлена. Важно обновлять её при внесении значительных "
+"изменений в страницы руководства. Незначительные правки, такие как "
+"исправления орфографии или пунктуации, которые не влияют на использование, "
+"могут быть сделаны без обновления `.Dd`."
+
+#. type: Labeled list
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:268
+#, no-wrap
+msgid "Give examples"
+msgstr "Приведите примеры"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:273
+msgid ""
+"Show the reader examples when possible. Even trivial examples are valuable, "
+"because what is trivial to the writer is not necessarily trivial to the "
+"reader. Three examples are a good goal. A trivial example shows the "
+"minimal requirements, a serious example shows actual use, and an in-depth "
+"example demonstrates unusual or non-obvious functionality."
+msgstr ""
+"Показывайте читателю примеры, когда это возможно. Даже простые примеры "
+"ценны, потому что то, что тривиально для автора, не обязательно тривиально "
+"для читателя. Хорошей целью являются три примера. Простой пример "
+"демонстрирует минимальные требования, серьезный пример показывает реальное "
+"использование, а углубленный пример демонстрирует неочевидную или "
+"нестандартную функциональность."
+
+#. type: Labeled list
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:274
+#, no-wrap
+msgid "Include the BSD license"
+msgstr "Включить лицензию BSD"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:277
+msgid ""
+"Include the BSD license on new manual pages. The preferred license is "
+"available from the extref:{committers-guide}[Committer's Guide]."
+msgstr ""
+"Включите лицензию BSD в новые руководства. Предпочтительная лицензия "
+"доступна в extref:{committers-guide}[Руководстве коммиттера]."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:279
+#, no-wrap
+msgid "Markup Tricks"
+msgstr "Приемы Разметки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:282
+msgid "Add a space before punctuation on a line with macros. Example:"
+msgstr "Добавьте пробел перед пунктуацией на строке с макросами. Пример:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:290
+#, no-wrap
+msgid ""
+".Sh SEE ALSO\n"
+".Xr geom 4 ,\n"
+".Xr boot0cfg 8 ,\n"
+".Xr geom 8 ,\n"
+".Xr gptboot 8\n"
+msgstr ""
+".Sh SEE ALSO\n"
+".Xr geom 4 ,\n"
+".Xr boot0cfg 8 ,\n"
+".Xr geom 8 ,\n"
+".Xr gptboot 8\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:296
+msgid ""
+"Note how the commas at the end of the `.Xr` lines have been placed after a "
+"space. The `.Xr` macro expects two parameters to follow it, the name of an "
+"external manual page, and a section number. The space separates the "
+"punctuation from the section number. Without the space, the external links "
+"would incorrectly point to section `4,` or `8,`."
+msgstr ""
+"Обратите внимание, как запятые в конце строк `.Xr` размещены после пробела. "
+"Макрос `.Xr` ожидает два параметра: имя внешней страницы руководства и номер "
+"раздела. Пробел отделяет пунктуацию от номера раздела. Без пробела внешние "
+"ссылки будут некорректно указывать на разделы `4,` или `8,`."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:298
+#, no-wrap
+msgid "Important Macros"
+msgstr "Важные макросы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:303
+msgid ""
+"Some very common macros will be shown here. For more usage examples, see "
+"man:mdoc[7], man:groff_mdoc[7], or search for actual use in [.filename]#/usr/"
+"share/man/man*# directories. For example, to search for examples of the "
+"`.Bd` _Begin display_ macro:"
+msgstr ""
+"Здесь будут показаны некоторые очень распространённые макросы. Для большего "
+"количества примеров использования см. man:mdoc[7], man:groff_mdoc[7] или "
+"выполните поиск реальных примеров в каталогах [.filename]#/usr/share/man/"
+"man*#. Например, чтобы найти примеры макроса `.Bd` (_Begin display_):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:307
+#, no-wrap
+msgid "% find /usr/share/man/man* | xargs zgrep '.Bd'\n"
+msgstr "% find /usr/share/man/man* | xargs zgrep '.Bd'\n"
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:310
+#, no-wrap
+msgid "Organizational Macros"
+msgstr "Организационные Макросы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:313
+msgid "Some macros are used to define logical blocks of a manual page."
+msgstr ""
+"Некоторые макросы используются для определения логических блоков страницы "
+"руководства."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:318
+#, no-wrap
+msgid "Organizational Macro"
+msgstr "Организационные Макро"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:321
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:357
+#, no-wrap
+msgid "Use"
+msgstr "Используйте"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:322
+#, no-wrap
+msgid "`.Sh`"
+msgstr "`.Sh`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:326
+#, no-wrap
+msgid ""
+"Section header.\n"
+"Followed by the name of the section, traditionally all upper case.\n"
+"Think of these as chapter titles."
+msgstr ""
+"Заголовок раздела.\n"
+"За ним следует название раздела, традиционно записанное в верхнем регистре.\n"
+"Можно рассматривать их как названия глав."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:327
+#, no-wrap
+msgid "`.Ss`"
+msgstr "`.Ss`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:331
+#, no-wrap
+msgid ""
+"Subsection header.\n"
+"Followed by the name of the subsection.\n"
+"Used to divide a `.Sh` section into subsections."
+msgstr ""
+"Подзаголовок раздела.\n"
+"За ним следует название подраздела.\n"
+"Используется для разделения раздела `.Sh` на подразделы."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:332
+#, no-wrap
+msgid "`.Bl`"
+msgstr "`.Bl`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:334
+#, no-wrap
+msgid "Begin list. Start a list of items."
+msgstr "Начало списка (Begin list). Начать перечень элементов."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:335
+#, no-wrap
+msgid "`.El`"
+msgstr "`.El`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:337
+#, no-wrap
+msgid "End a list."
+msgstr "Конец списка (End List)."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:338
+#, no-wrap
+msgid "`.Bd`"
+msgstr "`.Bd`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:341
+#, no-wrap
+msgid ""
+"Begin display.\n"
+"Begin a special area of text, like an indented area."
+msgstr ""
+"Начало отображения (Begin display).\n"
+"Начать специальную область текста, например, область с отступом."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:342
+#, no-wrap
+msgid "`.Ed`"
+msgstr "`.Ed`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:343
+#, no-wrap
+msgid "End display."
+msgstr "Завершить отображение (End display)."
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:346
+#, no-wrap
+msgid "Inline Macros"
+msgstr "Встроенные макросы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:349
+msgid "Many macros are used to mark up inline text."
+msgstr "Многие макросы используются для разметки текста внутри строк."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:354
+#, no-wrap
+msgid "Inline Macro"
+msgstr "Встроенный макрос"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:358
+#, no-wrap
+msgid "`.Nm`"
+msgstr "`.Nm`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:361
+#, no-wrap
+msgid ""
+"Name.\n"
+"Called with a name as a parameter on the first use, then used later without the parameter to display the name that has already been defined."
+msgstr ""
+"Имя (Name).\n"
+"При первом использовании вызывается с именем в качестве параметра, затем используется без параметра для отображения уже определенного имени."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:362
+#, no-wrap
+msgid "`.Pa`"
+msgstr "`.Pa`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:364
+#, no-wrap
+msgid ""
+"Path to a file.\n"
+"Used to mark up filenames and directory paths."
+msgstr ""
+"Путь к файлу (Path to a file).\n"
+"Используется для обозначения имен файлов и путей к каталогам."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:367
+#, no-wrap
+msgid "Sample Manual Page Structures"
+msgstr "Пример структуры страницы руководства"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:370
+msgid ""
+"This section shows minimal desired man page contents for several common "
+"categories of manual pages."
+msgstr ""
+"Этот раздел демонстрирует минимально желаемое содержание man-страниц для "
+"нескольких распространённых категорий руководств."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:372
+#, no-wrap
+msgid "Section 1 or 8 Command"
+msgstr "Раздел 1 или 8 — Команда"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:375
+msgid "The preferred basic structure for a section 1 or 8 command:"
+msgstr "Предпочтительная базовая структура для раздела 1 или 8 — Команда:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:396
+#, no-wrap
+msgid ""
+".Dd August 25, 2017\n"
+".Dt EXAMPLECMD 8\n"
+".Os\n"
+".Sh NAME\n"
+".Nm examplecmd\n"
+".Nd \"command to demonstrate section 1 and 8 man pages\"\n"
+".Sh SYNOPSIS\n"
+".Nm\n"
+".Op Fl v\n"
+".Sh DESCRIPTION\n"
+"The\n"
+".Nm\n"
+"utility does nothing except demonstrate a trivial but complete\n"
+"manual page for a section 1 or 8 command.\n"
+".Sh SEE ALSO\n"
+".Xr exampleconf 5\n"
+".Sh AUTHORS\n"
+".An Firstname Lastname Aq Mt flastname@example.com\n"
+msgstr ""
+".Dd August 25, 2017\n"
+".Dt EXAMPLECMD 8\n"
+".Os\n"
+".Sh NAME\n"
+".Nm examplecmd\n"
+".Nd \"command to demonstrate section 1 and 8 man pages\"\n"
+".Sh SYNOPSIS\n"
+".Nm\n"
+".Op Fl v\n"
+".Sh DESCRIPTION\n"
+"The\n"
+".Nm\n"
+"utility does nothing except demonstrate a trivial but complete\n"
+"manual page for a section 1 or 8 command.\n"
+".Sh SEE ALSO\n"
+".Xr exampleconf 5\n"
+".Sh AUTHORS\n"
+".An Firstname Lastname Aq Mt flastname@example.com\n"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:399
+#, no-wrap
+msgid "Section 4 Device Driver"
+msgstr "Раздел 4 — Драйверы устройств"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:402
+msgid "The preferred basic structure for a section 4 device driver:"
+msgstr "Предпочтительная базовая структура для раздела 4 — драйверы устройств:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:458
+#, no-wrap
+msgid ""
+".Dd August 25, 2017\n"
+".Dt EXAMPLEDRIVER 4\n"
+".Os\n"
+".Sh NAME\n"
+".Nm exampledriver\n"
+".Nd \"driver to demonstrate section 4 man pages\"\n"
+".Sh SYNOPSIS\n"
+"To compile this driver into the kernel, add this line to the\n"
+"kernel configuration file:\n"
+".Bd -ragged -offset indent\n"
+".Cd \"device exampledriver\"\n"
+".Ed\n"
+".Pp\n"
+"To load the driver as a module at boot, add this line to\n"
+".Xr loader.conf 5 :\n"
+".Bd -literal -offset indent\n"
+"exampledriver_load=\"YES\"\n"
+".Ed\n"
+".Sh DESCRIPTION\n"
+"The\n"
+".Nm\n"
+"driver provides an opportunity to show a skeleton or template\n"
+"file for section 4 manual pages.\n"
+".Sh HARDWARE\n"
+"The\n"
+".Nm\n"
+"driver supports these cards from the aptly-named Nonexistent\n"
+"Technologies:\n"
+".Pp\n"
+".Bl -bullet -compact\n"
+".It\n"
+"NT X149.2 (single and dual port)\n"
+".It\n"
+"NT X149.8 (single port)\n"
+".El\n"
+".Sh DIAGNOSTICS\n"
+".Bl -diag\n"
+".It \"flashing green light\"\n"
+"Something bad happened.\n"
+".It \"flashing red light\"\n"
+"Something really bad happened.\n"
+".It \"solid black light\"\n"
+"Power cord is unplugged.\n"
+".El\n"
+".Sh SEE ALSO\n"
+".Xr example 8\n"
+".Sh HISTORY\n"
+"The\n"
+".Nm\n"
+"device driver first appeared in\n"
+".Fx 49.2 .\n"
+".Sh AUTHORS\n"
+".An Firstname Lastname Aq Mt flastname@example.com\n"
+msgstr ""
+".Dd August 25, 2017\n"
+".Dt EXAMPLEDRIVER 4\n"
+".Os\n"
+".Sh NAME\n"
+".Nm exampledriver\n"
+".Nd \"driver to demonstrate section 4 man pages\"\n"
+".Sh SYNOPSIS\n"
+"To compile this driver into the kernel, add this line to the\n"
+"kernel configuration file:\n"
+".Bd -ragged -offset indent\n"
+".Cd \"device exampledriver\"\n"
+".Ed\n"
+".Pp\n"
+"To load the driver as a module at boot, add this line to\n"
+".Xr loader.conf 5 :\n"
+".Bd -literal -offset indent\n"
+"exampledriver_load=\"YES\"\n"
+".Ed\n"
+".Sh DESCRIPTION\n"
+"The\n"
+".Nm\n"
+"driver provides an opportunity to show a skeleton or template\n"
+"file for section 4 manual pages.\n"
+".Sh HARDWARE\n"
+"The\n"
+".Nm\n"
+"driver supports these cards from the aptly-named Nonexistent\n"
+"Technologies:\n"
+".Pp\n"
+".Bl -bullet -compact\n"
+".It\n"
+"NT X149.2 (single and dual port)\n"
+".It\n"
+"NT X149.8 (single port)\n"
+".El\n"
+".Sh DIAGNOSTICS\n"
+".Bl -diag\n"
+".It \"flashing green light\"\n"
+"Something bad happened.\n"
+".It \"flashing red light\"\n"
+"Something really bad happened.\n"
+".It \"solid black light\"\n"
+"Power cord is unplugged.\n"
+".El\n"
+".Sh SEE ALSO\n"
+".Xr example 8\n"
+".Sh HISTORY\n"
+"The\n"
+".Nm\n"
+"device driver first appeared in\n"
+".Fx 49.2 .\n"
+".Sh AUTHORS\n"
+".An Firstname Lastname Aq Mt flastname@example.com\n"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:461
+#, no-wrap
+msgid "Section 5 Configuration File"
+msgstr "Раздел 5 — Файл конфигурации"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:464
+msgid "The preferred basic structure for a section 5 configuration file:"
+msgstr "Предпочтительная базовая структура для раздела 5 — файл конфигурации:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:480
+#, no-wrap
+msgid ""
+".Dd August 25, 2017\n"
+".Dt EXAMPLECONF 5\n"
+".Os\n"
+".Sh NAME\n"
+".Nm example.conf\n"
+".Nd \"config file to demonstrate section 5 man pages\"\n"
+".Sh DESCRIPTION\n"
+".Nm\n"
+"is an example configuration file.\n"
+".Sh SEE ALSO\n"
+".Xr example 8\n"
+".Sh AUTHORS\n"
+".An Firstname Lastname Aq Mt flastname@example.com\n"
+msgstr ""
+".Dd August 25, 2017\n"
+".Dt EXAMPLECONF 5\n"
+".Os\n"
+".Sh NAME\n"
+".Nm example.conf\n"
+".Nd \"config file to demonstrate section 5 man pages\"\n"
+".Sh DESCRIPTION\n"
+".Nm\n"
+"is an example configuration file.\n"
+".Sh SEE ALSO\n"
+".Xr example 8\n"
+".Sh AUTHORS\n"
+".An Firstname Lastname Aq Mt flastname@example.com\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:483
+#, no-wrap
+msgid "Testing"
+msgstr "Тестирование"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:490
+msgid ""
+"Testing a new manual page can be challenging. Fortunately there are some "
+"tools that can assist in the task. Some of them, like man:man[1], do not "
+"look in the current directory. It is a good idea to prefix the filename "
+"with `./` if the new manual page is in the current directory. An absolute "
+"path can also be used."
+msgstr ""
+"Проверка новой страницы руководства может быть непростой задачей. К "
+"счастью, существуют инструменты, которые могут помочь в этом. Некоторые из "
+"них, например man:man[1], не ищут в текущем каталоге. Хорошей практикой "
+"является добавление префикса `./` к имени файла, если новая страница "
+"руководства находится в текущем каталоге. Также можно использовать "
+"абсолютный путь."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:492
+msgid "Use man:mandoc[1]'s linter to check for parsing errors:"
+msgstr "Используйте линтер man:mandoc[1] для проверки на ошибки парсинга:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:496
+#, no-wrap
+msgid "% mandoc -T lint ./mynewmanpage.8\n"
+msgstr "% mandoc -T lint ./mynewmanpage.8\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:499
+msgid "Use package:textproc/igor[] to proofread the manual page:"
+msgstr "Используйте package:textproc/igor[] для проверки страниц Справочника:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:503
+#, no-wrap
+msgid "% igor ./mynewmanpage.8\n"
+msgstr "% igor ./mynewmanpage.8\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:508
+msgid ""
+"Another useful tool is package:textproc/vale[]. It does not support the "
+"man:mdoc[7] syntax but the rendered manual page can be read from standard "
+"input:"
+msgstr ""
+"Еще один полезный инструмент — package:textproc/vale[]. Он не поддерживает "
+"синтаксис man:mdoc[7], но обработанную страницу руководства можно прочитать "
+"из стандартного ввода:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:512
+#, no-wrap
+msgid "% man ls | vale\n"
+msgstr "% man ls | vale\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:516
+msgid ""
+"package:textproc/vale[] is highly configurable. It is advised to read its "
+"documentation."
+msgstr ""
+"package:textproc/vale[] обладает высокой степенью настраиваемости. "
+"Рекомендуется ознакомиться с его документацией."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:518
+msgid "Use man:man[1] to check the final result of your changes:"
+msgstr ""
+"Используйте man:man[1] для проверки конечного результата ваших изменений:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:522
+#, no-wrap
+msgid "% man ./mynewmanpage.8\n"
+msgstr "% man ./mynewmanpage.8\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:525
+msgid ""
+"You can use man:col[1] to filter the output of man:man[1] and get rid of the "
+"backspace characters before loading the result in your favorite editor for "
+"spell checking:"
+msgstr ""
+"Вы можете использовать man:col[1] для фильтрации вывода man:man[1] и "
+"удаления backspace-символов перед загрузкой результата в ваш любимый "
+"редактор для проверки орфографии:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:529
+#, no-wrap
+msgid "% man ./mynewmanpage.8 | col -b | vim -R -\n"
+msgstr "% man ./mynewmanpage.8 | col -b | vim -R -\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:534
+msgid ""
+"Spell-checking with fully-featured dictionaries is encouraged, and can be "
+"accomplished by using package:textproc/hunspell[] or package:textproc/"
+"aspell[] combined with package:textproc/en-hunspell[] or package:textproc/en-"
+"aspell[], respectively. For instance:"
+msgstr ""
+"Проверка орфографии с использованием полнофункциональных словарей "
+"рекомендуется и может быть выполнена с помощью package:textproc/hunspell[] "
+"или package:textproc/aspell[] в сочетании с package:textproc/en-hunspell[] "
+"или package:textproc/en-aspell[] соответственно. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:538
+#, no-wrap
+msgid "% aspell check --lang=en --mode=nroff ./mynewmanpage.8\n"
+msgstr "% aspell check --lang=en --mode=nroff ./mynewmanpage.8\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:541
+#, no-wrap
+msgid "Example Manual Pages to Use as Templates"
+msgstr "Примеры страниц Справочника для использования в качестве шаблонов"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:544
+msgid "Some manual pages are suitable as in-depth examples."
+msgstr "Некоторые страницы Справочника могут служить подробными примерами."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:549
+#, no-wrap
+msgid "Manual Page"
+msgstr "Страница Справочника"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:552
+#, no-wrap
+msgid "Path to Source Location"
+msgstr "Путь к расположению исходного кода"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:553
+#, no-wrap
+msgid "man:cp[1]"
+msgstr "man:cp[1]"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:555
+#, no-wrap
+msgid "[.filename]#/usr/src/bin/cp/cp.1#"
+msgstr "[.filename]#/usr/src/bin/cp/cp.1#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:556
+#, no-wrap
+msgid "man:vt[4]"
+msgstr "man:vt[4]"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:558
+#, no-wrap
+msgid "[.filename]#/usr/src/share/man/man4/vt.4#"
+msgstr "[.filename]#/usr/src/share/man/man4/vt.4#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:559
+#, no-wrap
+msgid "man:crontab[5]"
+msgstr "man:crontab[5]"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:561
+#, no-wrap
+msgid "[.filename]#/usr/src/usr.sbin/cron/crontab/crontab.5#"
+msgstr "[.filename]#/usr/src/usr.sbin/cron/crontab/crontab.5#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:562
+#, no-wrap
+msgid "man:gpart[8]"
+msgstr "man:gpart[8]"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:563
+#, no-wrap
+msgid "[.filename]#/usr/src/sbin/geom/class/part/gpart.8#"
+msgstr "[.filename]#/usr/src/sbin/geom/class/part/gpart.8#"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:566
+#, no-wrap
+msgid "Resources"
+msgstr "Ресурсы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:569
+msgid "Resources for manual page writers:"
+msgstr "Ресурсы для авторов справочных страниц:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:571
+msgid "man:man[1]"
+msgstr "man:man[1]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:572
+msgid "man:mandoc[1]"
+msgstr "man:mandoc[1]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:573
+msgid "man:style.mdoc[5]"
+msgstr "man:style.mdoc[5]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:574
+msgid "man:groff_mdoc[7]"
+msgstr "man:groff_mdoc[7]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:575
+msgid "http://manpages.bsd.lv/mdoc.html[Practical UNIX Manuals: mdoc]"
+msgstr "http://manpages.bsd.lv/mdoc.html[Практические руководства UNIX: mdoc]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/manual-pages/_index.adoc:575
+msgid "http://manpages.bsd.lv/history.html[History of UNIX Manpages]"
+msgstr "http://manpages.bsd.lv/history.html[История man-страниц UNIX]"
diff --git a/documentation/content/ru/books/fdp-primer/overview/_index.adoc b/documentation/content/ru/books/fdp-primer/overview/_index.adoc
new file mode 100644
index 0000000000..040a5a239a
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/overview/_index.adoc
@@ -0,0 +1,321 @@
+---
+description: 'Обзор процесса создания документации FreeBSD'
+next: books/fdp-primer/tools
+params:
+ path: /books/fdp-primer/overview/
+prev: books/fdp-primer/preface
+showBookMenu: true
+tags: ["overview", "FreeBSD Documentation Project", "quick start"]
+title: 'Глава 1. Обзор'
+weight: 2
+---
+
+[[overview]]
+= Обзор
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 1
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Добро пожаловать в Проект документации FreeBSD (FDP). Качественная документация крайне важна для успеха FreeBSD, и мы очень высоко ценим ваш вклад.
+
+Этот документ описывает организацию FDP, как писать и отправлять документацию, а также как эффективно использовать доступные инструменты.
+
+Все желающие могут внести свой вклад в FDP. Готовность помочь — единственное требование для участия.
+
+Это руководство показывает, как:
+
+* Понять роль документации и её место в экосистеме.
+* Определите, какие части FreeBSD поддерживаются FDP.
+* Установить необходимые инструменты и файлы документации.
+* Внести изменения в документацию.
+* Представить изменения для проверки и включения в документацию FreeBSD.
+
+[[overview-documentation-ecosystem]]
+== Документация в экосистеме FreeBSD
+
+Все документы создаются для пользы читателей, а не их авторов или сопровождающих. Они должны адаптироваться к читателю, а не ожидать, что читатель адаптируется к ним.
+
+Никогда не вините читателя за:
+
+* невозможность легко или вообще использовать документ
+* если документ показался ему непонятным
+* непонимание документа или того, как его применить
+* если он не нашел явный ответ или шаги, чтобы логически прийти к нему
+
+Вместо этого подтвердите, что документ:
+
+* недоступный
+* запутанный
+* трудно понимаемый или применимый
+* неполный
+
+Затем создайте документ:
+
+* более доступный
+* менее запутанный
+* более ясный
+* более полный
+
+Используйте следующие методы:
+
+* Примените link:https://webaim.org/intro/#principles[лучшие практики доступности], чтобы исправить выявленную проблему и любые подобные, которые обнаружите
+* переработайте или уточните запутанную структуру или язык
+* добавьте соответствующие примеры к части, которая трудна для понимания или применения
+* заполните пробелы или добавьте недостающие промежуточные этапы
+
+[[overview-quick-start]]
+== Быстрый старт
+
+Некоторые подготовительные шаги необходимо выполнить перед редактированием документации FreeBSD. Сначала подпишитесь на рассылку {freebsd-doc}. Некоторые участники команды также общаются в IRC-канале `#bsddocs` на http://www.efnet.org/[EFnet]. Эти люди могут помочь с вопросами или проблемами, связанными с документацией.
+
+[[freebsd-installation-process]]
+=== Процесс установки FreeBSD
+
+[.procedure]
+====
+. Установите эти пакеты. _Мета-порт_ `docproj` устанавливает все приложения, необходимые для работы с документацией FreeBSD.
++
+[source, shell]
+....
+# pkg install docproj
+....
++
+. Установите локальную рабочую копию документации из репозитория FreeBSD в [.filename]#~/doc# (см. crossref:working-copy[working-copy,Рабочая копия]).
++
+[source, shell]
+....
+% git clone https://git.FreeBSD.org/doc.git ~/doc
+....
++
+. Отредактируйте файлы документации, которые требуют изменений. Если файлу нужны значительные изменения, обратитесь за советом в список рассылки.
++
+Просмотрите вывод и отредактируйте файл, чтобы исправить указанные проблемы, затем повторно запустите команду для поиска оставшихся проблем. Повторяйте, пока все ошибки не будут устранены.
++
+. *_Always_* build and review the changes before submitting them. Running `make` in the `documentation` or `website` subdirectories will generate the documentation in HTML format.
++
+[source, shell]
+....
+% make
+....
++
+Для сокращения времени компиляции может быть скомпилирован только один язык:
++
+[source, shell]
+....
+% make DOC_LANG=en
+....
++
+Результаты сборки сохраняются в [.filename]#~/doc/documentation/public/en/articles/# и [.filename]#~/doc/documentation/public/en/books/#.
++
+. Просмотрите вывод сборки и убедитесь, что правки не содержат опечаток, проблем с версткой или ошибок. Если в процессе сборки обнаружены ошибки, отредактируйте проблемные файлы, чтобы исправить все возникшие проблемы, затем снова запустите команду сборки, пока все ошибки не будут устранены.
++
+. Добавьте все файлы с помощью `git add .`, затем просмотрите изменения с помощью `git diff`. Например:
++
+[source, shell]
+....
+% git add .
+% git diff --staged
+....
++
+Убедитесь, что все необходимые файлы включены, затем зафиксируйте изменение в вашей локальной ветке и создайте патч с помощью `git format-patch`
++
+[source, shell]
+....
+% git commit
+% git format-patch origin/main
+....
++
+Патч, созданный с помощью `git format-patch`, будет содержать идентификатор автора и адреса электронной почты, что упрощает применение разработчиками (с помощью `git am`) и правильное указание авторства.
++
+[IMPORTANT]
+======
+Чтобы упростить применение патча коммиттерами в их рабочей копии дерева документации, пожалуйста, сгенерируйте файл [.filename]#.diff# из корня вашего дерева документации.
+======
++
+В приведенном выше примере были внесены изменения в раздел *bsdinstall* Руководства.
++
+. Отправьте патч или diff-файл с помощью веб-системы https://bugs.FreeBSD.org/bugzilla/enter_bug.cgi?product=Documentation[Problem Report]. При использовании веб-формы укажите в поле Summary _[patch] краткое описание проблемы_. Выберите Component `Documentation`. В поле Description введите краткое описание изменений и любые важные детали о них. Используйте кнопку btn:[Add an attachment], чтобы прикрепить патч или diff-файл. Наконец, нажмите кнопку btn:[Submit Bug], чтобы отправить ваш diff в систему отчетов об ошибках.
+====
+
+[[gnu-linux-installation-process]]
+=== Процесс установки GNU/Linux
+
+[.procedure]
+====
+. Установите эти пакеты в системах на основе apt, таких как Debian или Ubuntu. В других дистрибутивах GNU/Linux названия пакетов могут отличаться. В случае сомнений обратитесь к менеджеру пакетов вашего дистрибутива.
++
+[source, shell]
+....
+# apt install hugo ruby-asciidoctor ruby-asciidoctor-pdf ruby-rouge git bmake
+....
++
+. Установите локальную рабочую копию документации из репозитория FreeBSD в [.filename]#~/doc# (см. crossref:working-copy[working-copy,Рабочая копия]).
++
+[source, shell]
+....
+% git clone https://git.FreeBSD.org/doc.git ~/doc
+....
++
+. Отредактируйте файлы документации, которые требуют изменений. Если файлу нужны значительные изменения, обратитесь за советом в список рассылки.
++
+Просмотрите вывод и отредактируйте файлы, чтобы исправить обнаруженные проблемы, затем снова запустите команду, чтобы найти оставшиеся проблемы. Повторяйте, пока все ошибки не будут устранены.
++
+. Всегда собирайте и тестируйте изменения перед их отправкой. Запуск `bmake` в подкаталогах `documentation` или `website` сгенерирует документацию в формате HTML.
++
+[source, shell]
+....
+% bmake run LOCALBASE=/usr
+....
++
+. Добавьте все файлы с помощью `git add .`, затем просмотрите изменения с помощью `git diff`. Например:
++
+[source, shell]
+....
+% git add .
+% git diff --staged
+....
++
+Убедитесь, что все необходимые файлы включены, затем зафиксируйте изменение в вашей локальной ветке и создайте патч с помощью `git format-patch`
++
+[source, shell]
+....
+% git commit
+% git format-patch origin/main
+....
++
+Патч, созданный с помощью `git format-patch`, будет содержать идентификатор автора и адреса электронной почты, что упрощает применение разработчиками (с помощью `git am`) и правильное указание авторства.
++
+[IMPORTANT]
+======
+Чтобы упростить применение патча коммиттерами в их рабочей копии дерева документации, пожалуйста, сгенерируйте файл [.filename]#.diff# из корня вашего дерева документации.
+======
++
+. Отправьте патч или diff-файл с помощью веб-системы https://bugs.FreeBSD.org/bugzilla/enter_bug.cgi?product=Documentation[Problem Report]. При использовании веб-формы укажите в поле _Summary_ краткое описание проблемы. Выберите компонент `Documentation`. В поле _Description_ введите краткое описание проблемы из поля _Summary_ и добавьте _patch_ в поле _Keywords_. Используйте кнопку btn:[Add an attachment], чтобы прикрепить патч или diff-файл. Наконец, нажмите кнопку btn:[Submit Bug], чтобы отправить ваш diff в систему отчетов об ошибках.
+====
+
+[[mac-os-installation-process]]
+=== Процесс установки macOS(R)
+
+[.procedure]
+====
+
+. Установите эти пакеты с помощью link:https://brew.sh/[Homebrew] и link:https://rubygems.org/[RubyGem].
++
+[source, shell]
+....
+$ brew install hugo ruby git bmake
+....
++
+. Добавьте Ruby в Path.
++
+[source, shell]
+....
+$ echo 'export PATH="$(brew --prefix ruby)/bin:$PATH"' >> ~/.zshrc
+$ echo 'export PATH="$(brew --prefix hugo)/bin:$PATH"' >> ~/.zshrc
+$ echo 'export GEM_PATH="$(gem environment gemdir)"' >> ~/.zshrc
+$ echo 'export PATH="${GEM_PATH}/bin:$PATH"' >> ~/.zshrc
+$ source ~/.zshrc
+....
+. Установите пакет rouge с помощью RubyGem.
++
+[source, shell]
+....
+$ sudo gem install rouge asciidoctor asciidoctor-pdf asciidoctor-epub3
+....
++
+. Установите локальную рабочую копию документации из репозитория FreeBSD в [.filename]#~/doc# (см. crossref:working-copy[working-copy,Рабочая копия]).
++
+[source, shell]
+....
+$ git clone https://git.FreeBSD.org/doc.git ~/doc
+....
++
+. Отредактируйте файлы документации, которые требуют изменений. Если файлу нужны значительные изменения, обратитесь за советом в список рассылки.
++
+Просмотрите вывод и отредактируйте файлы, чтобы исправить обнаруженные проблемы, затем снова запустите команду, чтобы найти оставшиеся проблемы. Повторяйте, пока все ошибки не будут устранены.
++
+. Всегда собирайте и тестируйте изменения перед их отправкой. Запуск `bmake` в подкаталогах `documentation` или `website` сгенерирует документацию в формате HTML.
++
+[source, shell]
+....
+$ bmake run USE_RUBYGEMS=YES RUBY_CMD=$(brew --prefix ruby)/bin/ruby
+....
+. Добавьте все файлы с помощью `git add .`, затем просмотрите изменения с помощью `git diff`. Например:
++
+[source, shell]
+....
+% git add .
+% git diff --staged
+....
++
+Убедитесь, что все необходимые файлы включены, затем зафиксируйте изменение в вашей локальной ветке и создайте патч с помощью `git format-patch`
++
+[source, shell]
+....
+% git commit
+% git format-patch origin/main
+....
++
+Патч, созданный с помощью `git format-patch`, будет содержать идентификатор автора и адреса электронной почты, что упрощает применение разработчиками (с помощью `git am`) и правильное указание авторства.
++
+[IMPORTANT]
+======
+Чтобы упростить применение патча коммиттерами в их рабочей копии дерева документации, пожалуйста, сгенерируйте файл [.filename]#.diff# из корня вашего дерева документации.
+======
++
+. Отправьте патч или diff-файл с помощью веб-системы https://bugs.FreeBSD.org/bugzilla/enter_bug.cgi?product=Documentation[Problem Report]. При использовании веб-формы укажите в поле _Summary_ краткое описание проблемы. Выберите компонент `Documentation`. В поле _Description_ введите краткое описание проблемы из поля _Summary_ и добавьте _patch_ в поле _Keywords_. Используйте кнопку btn:[Add an attachment], чтобы прикрепить патч или diff-файл. Наконец, нажмите кнопку btn:[Submit Bug], чтобы отправить ваш diff в систему отчетов об ошибках.
+====
+
+[[overview-doc]]
+== Набор документации FreeBSD
+
+FDP отвечает за четыре категории документации FreeBSD.
+
+* _Руководство_: Руководство представляет собой всеобъемлющий онлайн-ресурс и справочник для пользователей FreeBSD.
+* _FAQ_: В разделе Часто задаваемых вопросов (FAQ) используется формат коротких вопросов и ответов для решения вопросов, часто задаваемых в различных почтовых рассылках и форумах, посвящённых FreeBSD. Такой формат не подразумевает длинных и развёрнутых ответов.
+* _Справочник_: Страницы Справочника (man-страницы) системы на английском языке обычно не создаются FDP, так как они являются частью базовой системы. Однако FDP может перефразировать части существующих руководств, чтобы сделать их понятнее или исправить неточности.
+* _Веб-сайт_: Это основное представительство FreeBSD в интернете, доступное по адресу https://www.freebsd.org/[https://www.FreeBSD.org/] и на множестве зеркал по всему миру. Веб-сайт обычно становится первым знакомством нового пользователя с FreeBSD.
+
+Команды переводчиков отвечают за перевод Руководства и веб-сайта на разные языки. На данный момент руководства (man-страницы) не переводятся.
+
+Исходные тексты документации для веб-сайта FreeBSD, Handbook и FAQ доступны в репозитории документации по адресу `https://cgit.freebsd.org/doc/`.
+
+Исходный код страниц справочника доступен в отдельном репозитории, расположенном по адресу `https://cgit.freebsd.org/src/`.
+
+Документация сообщений о фиксациях доступна с помощью `git log`. Сообщения о фиксациях также архивируются по ссылке:link:{dev-commits-doc-all}.
+
+Веб-интерфейсы для обоих репозиториев доступны по адресам https://cgit.freebsd.org/doc/[] и https://cgit.freebsd.org/src/[].
+
+Большое количество авторов участвовало в написании руководств или инструкций по FreeBSD. Некоторые из этих документов хранятся в рамках файлов FDP. В других случаях авторы предпочли лпубликовать документацию отдельно. FDP стремится предоставить ссылки на как можно большее количество такой внешней документации.
diff --git a/documentation/content/ru/books/fdp-primer/overview/_index.po b/documentation/content/ru/books/fdp-primer/overview/_index.po
new file mode 100644
index 0000000000..2779c0823d
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/overview/_index.po
@@ -0,0 +1,721 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primeroverview_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:1
+#, no-wrap
+msgid "Overview about the FreeBSD Documentation Process"
+msgstr "Обзор процесса создания документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:1
+#, no-wrap
+msgid "Chapter 1. Overview"
+msgstr "Глава 1. Обзор"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:14
+#, no-wrap
+msgid "Overview"
+msgstr "Обзор"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:53
+msgid ""
+"Welcome to the FreeBSD Documentation Project (FDP). Quality documentation "
+"is crucial to the success of FreeBSD, and we value your contributions very "
+"highly."
+msgstr ""
+"Добро пожаловать в Проект документации FreeBSD (FDP). Качественная "
+"документация крайне важна для успеха FreeBSD, и мы очень высоко ценим ваш "
+"вклад."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:55
+msgid ""
+"This document describes how the FDP is organized, how to write and submit "
+"documentation, and how to effectively use the available tools."
+msgstr ""
+"Этот документ описывает организацию FDP, как писать и отправлять "
+"документацию, а также как эффективно использовать доступные инструменты."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:58
+msgid ""
+"Everyone is welcome to contribute to the FDP. Willingness to contribute is "
+"the only membership requirement."
+msgstr ""
+"Все желающие могут внести свой вклад в FDP. Готовность помочь — единственное "
+"требование для участия."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:60
+msgid "This primer shows how to:"
+msgstr "Это руководство показывает, как:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:62
+msgid "Understand the role of documentation and its place in the ecosystem."
+msgstr "Понять роль документации и её место в экосистеме."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:63
+msgid "Identify which parts of FreeBSD are maintained by the FDP."
+msgstr "Определите, какие части FreeBSD поддерживаются FDP."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:64
+msgid "Install the required documentation tools and files."
+msgstr "Установить необходимые инструменты и файлы документации."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:65
+msgid "Make changes to the documentation."
+msgstr "Внести изменения в документацию."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:66
+msgid ""
+"Submit changes back for review and inclusion in the FreeBSD documentation."
+msgstr "Представить изменения для проверки и включения в документацию FreeBSD."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:68
+#, no-wrap
+msgid "Documentation in the FreeBSD Ecosystem"
+msgstr "Документация в экосистеме FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:72
+msgid ""
+"All documents are for the benefit of their readers, not their writers or "
+"caretakers. They should adapt to the reader and not expect the reader to "
+"adapt to them."
+msgstr ""
+"Все документы создаются для пользы читателей, а не их авторов или "
+"сопровождающих. Они должны адаптироваться к читателю, а не ожидать, что "
+"читатель адаптируется к ним."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:74
+msgid "Never blame the reader for:"
+msgstr "Никогда не вините читателя за:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:76
+msgid "being unable to make use of a document easily or at all"
+msgstr "невозможность легко или вообще использовать документ"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:77
+msgid "finding a document confusing"
+msgstr "если документ показался ему непонятным"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:78
+msgid "not understanding a document or how to apply it"
+msgstr "непонимание документа или того, как его применить"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:79
+msgid ""
+"not finding an explicit answer or successfully bridging gaps (or connecting "
+"dots) to reason their way to one"
+msgstr "если он не нашел явный ответ или шаги, чтобы логически прийти к нему"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:81
+msgid "Instead, acknowledge that the document is:"
+msgstr "Вместо этого подтвердите, что документ:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:83
+msgid "inaccessible"
+msgstr "недоступный"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:84
+msgid "confusing"
+msgstr "запутанный"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:85
+msgid "hard to understand or apply"
+msgstr "трудно понимаемый или применимый"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:86
+msgid "incomplete"
+msgstr "неполный"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:88
+msgid "Then, make the document:"
+msgstr "Затем создайте документ:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:90
+msgid "more accessible"
+msgstr "более доступный"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:91
+msgid "less confusing"
+msgstr "менее запутанный"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:92
+msgid "clearer"
+msgstr "более ясный"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:93
+msgid "more complete"
+msgstr "более полный"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:95
+msgid "Use the following methods:"
+msgstr "Используйте следующие методы:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:97
+msgid ""
+"apply link:https://webaim.org/intro/#principles[accessibility best "
+"practices] to correct the problem reported and any similar ones you find"
+msgstr ""
+"Примените link:https://webaim.org/intro/#principles[лучшие практики "
+"доступности], чтобы исправить выявленную проблему и любые подобные, которые "
+"обнаружите"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:98
+msgid "rework or clarify the confusing structure or language"
+msgstr "переработайте или уточните запутанную структуру или язык"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:99
+msgid "add relevant examples to the part that is hard to understand or apply"
+msgstr ""
+"добавьте соответствующие примеры к части, которая трудна для понимания или "
+"применения"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:100
+msgid "fill in the gaps or add the missing stepping stones"
+msgstr "заполните пробелы или добавьте недостающие промежуточные этапы"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:102
+#, no-wrap
+msgid "Quick Start"
+msgstr "Быстрый старт"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:108
+msgid ""
+"Some preparatory steps must be taken before editing the FreeBSD "
+"documentation. First, subscribe to the {freebsd-doc}. Some team members "
+"also interact on the `#bsddocs` IRC channel on http://www.efnet.org/"
+"[EFnet]. These people can help with questions or problems involving the "
+"documentation."
+msgstr ""
+"Некоторые подготовительные шаги необходимо выполнить перед редактированием "
+"документации FreeBSD. Сначала подпишитесь на рассылку {freebsd-doc}. "
+"Некоторые участники команды также общаются в IRC-канале `#bsddocs` на http://"
+"www.efnet.org/[EFnet]. Эти люди могут помочь с вопросами или проблемами, "
+"связанными с документацией."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:110
+#, no-wrap
+msgid "FreeBSD installation process"
+msgstr "Процесс установки FreeBSD"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:115
+msgid ""
+"Install these packages. The `docproj` _meta-port_ installs all the "
+"applications required to do useful work with the FreeBSD documentation."
+msgstr ""
+"Установите эти пакеты. _Мета-порт_ `docproj` устанавливает все приложения, "
+"необходимые для работы с документацией FreeBSD."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:119
+#, no-wrap
+msgid "# pkg install docproj\n"
+msgstr "# pkg install docproj\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:122
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:196
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:278
+msgid ""
+"Install a local working copy of the documentation from the FreeBSD "
+"repository in [.filename]#~/doc# (see crossref:working-copy[working-copy,The "
+"Working Copy])."
+msgstr ""
+"Установите локальную рабочую копию документации из репозитория FreeBSD в "
+"[.filename]#~/doc# (см. crossref:working-copy[working-copy,Рабочая копия])."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:126
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:200
+#, no-wrap
+msgid "% git clone https://git.FreeBSD.org/doc.git ~/doc\n"
+msgstr "% git clone https://git.FreeBSD.org/doc.git ~/doc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:129
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:203
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:285
+msgid ""
+"Edit the documentation files that require changes. If a file needs major "
+"changes, consult the mailing list for input."
+msgstr ""
+"Отредактируйте файлы документации, которые требуют изменений. Если файлу "
+"нужны значительные изменения, обратитесь за советом в список рассылки."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:132
+msgid ""
+"Review the output and edit the file to fix any problems shown, then rerun "
+"the command to find any remaining problems. Repeat until all of the errors "
+"are resolved."
+msgstr ""
+"Просмотрите вывод и отредактируйте файл, чтобы исправить указанные проблемы, "
+"затем повторно запустите команду для поиска оставшихся проблем. Повторяйте, "
+"пока все ошибки не будут устранены."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:134
+#, fuzzy
+#| msgid ""
+#| "*_Always_* build and review the changes before submitting them. Running "
+#| "`make` in the `documentation` or `website` subdirectories will generate "
+#| "the documentation in HTML format.\n"
+msgid ""
+"*_Always_* build and review the changes before submitting them. Running "
+"`make` in the `documentation` or `website` subdirectories will generate the "
+"documentation in HTML format."
+msgstr ""
+"*_Всегда_* собирайте и проверяйте изменения перед отправкой. Запуск команды "
+"`make` в подкаталогах `documentation` или `website` сгенерирует документацию "
+"в формате HTML.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:138
+#, no-wrap
+msgid "% make\n"
+msgstr "% make\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:141
+msgid "To reduce compile time, only one language can be compiled:"
+msgstr ""
+"Для сокращения времени компиляции может быть скомпилирован только один язык:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:145
+#, no-wrap
+msgid "% make DOC_LANG=en\n"
+msgstr "% make DOC_LANG=en\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:148
+msgid ""
+"The build output is stored in [.filename]#~/doc/documentation/public/en/"
+"articles/# and [.filename]#~/doc/documentation/public/en/books/#."
+msgstr ""
+"Результаты сборки сохраняются в [.filename]#~/doc/documentation/public/en/"
+"articles/# и [.filename]#~/doc/documentation/public/en/books/#."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:150
+msgid ""
+"Review the build output and ensure the edits are free from typos, layout "
+"problems, or errors. If any errors are found during the build process, edit "
+"the problematic files to fix any issues that show up, then run the build "
+"command again until all errors are resolved."
+msgstr ""
+"Просмотрите вывод сборки и убедитесь, что правки не содержат опечаток, "
+"проблем с версткой или ошибок. Если в процессе сборки обнаружены ошибки, "
+"отредактируйте проблемные файлы, чтобы исправить все возникшие проблемы, "
+"затем снова запустите команду сборки, пока все ошибки не будут устранены."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:152
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:215
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:296
+msgid ""
+"Add all the files with `git add .`, then review the diff with `git diff`. "
+"For example:"
+msgstr ""
+"Добавьте все файлы с помощью `git add .`, затем просмотрите изменения с "
+"помощью `git diff`. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:157
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:220
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:301
+#, no-wrap
+msgid ""
+"% git add .\n"
+"% git diff --staged\n"
+msgstr ""
+"% git add .\n"
+"% git diff --staged\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:160
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:223
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:304
+msgid ""
+"Make sure that all required files are included, then commit the change to "
+"your local branch and generate a patch with `git format-patch`"
+msgstr ""
+"Убедитесь, что все необходимые файлы включены, затем зафиксируйте изменение "
+"в вашей локальной ветке и создайте патч с помощью `git format-patch`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:165
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:228
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:309
+#, no-wrap
+msgid ""
+"% git commit\n"
+"% git format-patch origin/main\n"
+msgstr ""
+"% git commit\n"
+"% git format-patch origin/main\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:169
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:232
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:313
+msgid ""
+"Patch generated with `git format-patch` will include author identity and "
+"email addresses, making it easier for developers to apply (with `git am`) "
+"and give proper credit."
+msgstr ""
+"Патч, созданный с помощью `git format-patch`, будет содержать идентификатор "
+"автора и адреса электронной почты, что упрощает применение разработчиками (с "
+"помощью `git am`) и правильное указание авторства."
+
+#. type: delimited block = 6
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:174
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:237
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:318
+msgid ""
+"To make it easier for committers to apply the patch on their working copy of "
+"the documentation tree, please generate the [.filename]#.diff# from the base "
+"of your documentation tree."
+msgstr ""
+"Чтобы упростить применение патча коммиттерами в их рабочей копии дерева "
+"документации, пожалуйста, сгенерируйте файл [.filename]#.diff# из корня "
+"вашего дерева документации."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:177
+msgid ""
+"In the example above, changes have been made to the *bsdinstall* portion of "
+"the Handbook."
+msgstr ""
+"В приведенном выше примере были внесены изменения в раздел *bsdinstall* "
+"Руководства."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:179
+msgid ""
+"Submit the patch or diff file using the web-based https://bugs.FreeBSD.org/"
+"bugzilla/enter_bug.cgi?product=Documentation[Problem Report] system. If "
+"using the web form, enter a Summary of _[patch] short description of "
+"problem_. Select the Component `Documentation`. In the Description field, "
+"enter a short description of the changes and any important details about "
+"them. Use the btn:[Add an attachment] button to attach the patch or diff "
+"file. Finally, use the btn:[Submit Bug] button to submit your diff to the "
+"problem report system."
+msgstr ""
+"Отправьте патч или diff-файл с помощью веб-системы https://bugs.FreeBSD.org/"
+"bugzilla/enter_bug.cgi?product=Documentation[Problem Report]. При "
+"использовании веб-формы укажите в поле Summary _[patch] краткое описание "
+"проблемы_. Выберите Component `Documentation`. В поле Description введите "
+"краткое описание изменений и любые важные детали о них. Используйте кнопку "
+"btn:[Add an attachment], чтобы прикрепить патч или diff-файл. Наконец, "
+"нажмите кнопку btn:[Submit Bug], чтобы отправить ваш diff в систему отчетов "
+"об ошибках."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:182
+#, no-wrap
+msgid "GNU/Linux installation process"
+msgstr "Процесс установки GNU/Linux"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:189
+msgid ""
+"Install these packages in apt-based systems like Debian or Ubuntu. On other "
+"GNU/Linux distributions the package names may change. Consult your "
+"distribution's package manager if in doubt."
+msgstr ""
+"Установите эти пакеты в системах на основе apt, таких как Debian или "
+"Ubuntu. В других дистрибутивах GNU/Linux названия пакетов могут "
+"отличаться. В случае сомнений обратитесь к менеджеру пакетов вашего "
+"дистрибутива."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:193
+#, no-wrap
+msgid "# apt install hugo ruby-asciidoctor ruby-asciidoctor-pdf ruby-rouge git bmake\n"
+msgstr "# apt install hugo ruby-asciidoctor ruby-asciidoctor-pdf ruby-rouge git bmake\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:206
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:288
+msgid ""
+"Review the output and edit the files to fix any problems shown, then rerun "
+"the command to find any remaining problems. Repeat until all of the errors "
+"are resolved."
+msgstr ""
+"Просмотрите вывод и отредактируйте файлы, чтобы исправить обнаруженные "
+"проблемы, затем снова запустите команду, чтобы найти оставшиеся проблемы. "
+"Повторяйте, пока все ошибки не будут устранены."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:208
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:290
+msgid ""
+"Always build and test the changes before submitting them. Running `bmake` in "
+"the `documentation` or `website` subdirectories will generate the "
+"documentation in HTML format."
+msgstr ""
+"Всегда собирайте и тестируйте изменения перед их отправкой. Запуск `bmake` в "
+"подкаталогах `documentation` или `website` сгенерирует документацию в "
+"формате HTML."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:212
+#, no-wrap
+msgid "% bmake run LOCALBASE=/usr\n"
+msgstr "% bmake run LOCALBASE=/usr\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:245
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:326
+msgid ""
+"Submit the patch or diff file using the web-based https://bugs.FreeBSD.org/"
+"bugzilla/enter_bug.cgi?product=Documentation[Problem Report] system. If "
+"using the web form, enter a Summary of _short description of problem_. "
+"Select the Component `Documentation`. In the Description field, enter a "
+"short description of the problem in the _Summary_ field and add _patch_ to "
+"the _Keywords_ field. Use the btn:[Add an attachment] button to attach the "
+"patch or diff file. Finally, use the btn:[Submit Bug] button to submit your "
+"diff to the problem report system."
+msgstr ""
+"Отправьте патч или diff-файл с помощью веб-системы https://bugs.FreeBSD.org/"
+"bugzilla/enter_bug.cgi?product=Documentation[Problem Report]. При "
+"использовании веб-формы укажите в поле _Summary_ краткое описание проблемы. "
+"Выберите компонент `Documentation`. В поле _Description_ введите краткое "
+"описание проблемы из поля _Summary_ и добавьте _patch_ в поле _Keywords_. "
+"Используйте кнопку btn:[Add an attachment], чтобы прикрепить патч или diff-"
+"файл. Наконец, нажмите кнопку btn:[Submit Bug], чтобы отправить ваш diff в "
+"систему отчетов об ошибках."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:248
+#, no-wrap
+msgid "macOS(R) installation process"
+msgstr "Процесс установки macOS(R)"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:254
+msgid ""
+"Install these packages using link:https://brew.sh/[Homebrew] and "
+"link:https://rubygems.org/[RubyGem]."
+msgstr ""
+"Установите эти пакеты с помощью link:https://brew.sh/[Homebrew] и "
+"link:https://rubygems.org/[RubyGem]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:258
+#, no-wrap
+msgid "$ brew install hugo ruby git bmake\n"
+msgstr "$ brew install hugo ruby git bmake\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:261
+msgid "Add Ruby to the Path."
+msgstr "Добавьте Ruby в Path."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:269
+#, no-wrap
+msgid ""
+"$ echo 'export PATH=\"$(brew --prefix ruby)/bin:$PATH\"' >> ~/.zshrc\n"
+"$ echo 'export PATH=\"$(brew --prefix hugo)/bin:$PATH\"' >> ~/.zshrc\n"
+"$ echo 'export GEM_PATH=\"$(gem environment gemdir)\"' >> ~/.zshrc\n"
+"$ echo 'export PATH=\"${GEM_PATH}/bin:$PATH\"' >> ~/.zshrc\n"
+"$ source ~/.zshrc\n"
+msgstr ""
+"$ echo 'export PATH=\"$(brew --prefix ruby)/bin:$PATH\"' >> ~/.zshrc\n"
+"$ echo 'export PATH=\"$(brew --prefix hugo)/bin:$PATH\"' >> ~/.zshrc\n"
+"$ echo 'export GEM_PATH=\"$(gem environment gemdir)\"' >> ~/.zshrc\n"
+"$ echo 'export PATH=\"${GEM_PATH}/bin:$PATH\"' >> ~/.zshrc\n"
+"$ source ~/.zshrc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:271
+msgid "Install the rouge package using RubyGem."
+msgstr "Установите пакет rouge с помощью RubyGem."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:275
+#, no-wrap
+msgid "$ sudo gem install rouge asciidoctor asciidoctor-pdf asciidoctor-epub3\n"
+msgstr "$ sudo gem install rouge asciidoctor asciidoctor-pdf asciidoctor-epub3\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:282
+#, no-wrap
+msgid "$ git clone https://git.FreeBSD.org/doc.git ~/doc\n"
+msgstr "$ git clone https://git.FreeBSD.org/doc.git ~/doc\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:294
+#, no-wrap
+msgid "$ bmake run USE_RUBYGEMS=YES RUBY_CMD=$(brew --prefix ruby)/bin/ruby\n"
+msgstr "$ bmake run USE_RUBYGEMS=YES RUBY_CMD=$(brew --prefix ruby)/bin/ruby\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:329
+#, no-wrap
+msgid "The FreeBSD Documentation Set"
+msgstr "Набор документации FreeBSD"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:332
+msgid "The FDP is responsible for four categories of FreeBSD documentation."
+msgstr "FDP отвечает за четыре категории документации FreeBSD."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:334
+msgid ""
+"_Handbook_: The Handbook is the comprehensive online resource and reference "
+"for FreeBSD users."
+msgstr ""
+"_Руководство_: Руководство представляет собой всеобъемлющий онлайн-ресурс и "
+"справочник для пользователей FreeBSD."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:335
+msgid ""
+"_FAQ_: The FAQ uses a short question and answer format to address questions "
+"that are frequently asked on the various mailing lists and forums devoted to "
+"FreeBSD. This format does not permit long and comprehensive answers."
+msgstr ""
+"_FAQ_: В разделе Часто задаваемых вопросов (FAQ) используется формат "
+"коротких вопросов и ответов для решения вопросов, часто задаваемых в "
+"различных почтовых рассылках и форумах, посвящённых FreeBSD. Такой формат не "
+"подразумевает длинных и развёрнутых ответов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:336
+msgid ""
+"_Manual pages_: The English language system manual pages are usually not "
+"written by the FDP, as they are part of the base system. However, the FDP "
+"can reword parts of existing manual pages to make them clearer or to correct "
+"inaccuracies."
+msgstr ""
+"_Справочник_: Страницы Справочника (man-страницы) системы на английском "
+"языке обычно не создаются FDP, так как они являются частью базовой системы. "
+"Однако FDP может перефразировать части существующих руководств, чтобы "
+"сделать их понятнее или исправить неточности."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:337
+msgid ""
+"_Web site_: This is the main FreeBSD presence on the web, visible at https://"
+"www.freebsd.org/[https://www.FreeBSD.org/] and many mirrors around the "
+"world. The web site is typically a new user's first exposure to FreeBSD."
+msgstr ""
+"_Веб-сайт_: Это основное представительство FreeBSD в интернете, доступное по "
+"адресу https://www.freebsd.org/[https://www.FreeBSD.org/] и на множестве "
+"зеркал по всему миру. Веб-сайт обычно становится первым знакомством нового "
+"пользователя с FreeBSD."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:340
+msgid ""
+"Translation teams are responsible for translating the Handbook and web site "
+"into different languages. Manual pages are not translated at present."
+msgstr ""
+"Команды переводчиков отвечают за перевод Руководства и веб-сайта на разные "
+"языки. На данный момент руководства (man-страницы) не переводятся."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:342
+msgid ""
+"Documentation source for the FreeBSD web site, Handbook, and FAQ is "
+"available in the documentation repository at `https://cgit.freebsd.org/doc/`."
+msgstr ""
+"Исходные тексты документации для веб-сайта FreeBSD, Handbook и FAQ доступны "
+"в репозитории документации по адресу `https://cgit.freebsd.org/doc/`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:344
+msgid ""
+"Source for manual pages is available in a separate source repository located "
+"at `https://cgit.freebsd.org/src/`."
+msgstr ""
+"Исходный код страниц справочника доступен в отдельном репозитории, "
+"расположенном по адресу `https://cgit.freebsd.org/src/`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:347
+msgid ""
+"Documentation commit messages are visible with `git log`. Commit messages "
+"are also archived at link:{dev-commits-doc-all}."
+msgstr ""
+"Документация сообщений о фиксациях доступна с помощью `git log`. Сообщения "
+"о фиксациях также архивируются по ссылке:link:{dev-commits-doc-all}."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:349
+msgid ""
+"Web frontends to both of these repositories are available at https://"
+"cgit.freebsd.org/doc/[] and https://cgit.freebsd.org/src/[]."
+msgstr ""
+"Веб-интерфейсы для обоих репозиториев доступны по адресам https://"
+"cgit.freebsd.org/doc/[] и https://cgit.freebsd.org/src/[]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/overview/_index.adoc:353
+msgid ""
+"Many people have written tutorials or how-to articles about FreeBSD. Some "
+"are stored as part of the FDP files. In other cases, the author has decided "
+"to keep the documentation separate. The FDP endeavors to provide links to "
+"as much of this external documentation as possible."
+msgstr ""
+"Большое количество авторов участвовало в написании руководств или инструкций "
+"по FreeBSD. Некоторые из этих документов хранятся в рамках файлов FDP. В "
+"других случаях авторы предпочли лпубликовать документацию отдельно. FDP "
+"стремится предоставить ссылки на как можно большее количество такой внешней "
+"документации."
diff --git a/documentation/content/ru/books/fdp-primer/po-translations/_index.adoc b/documentation/content/ru/books/fdp-primer/po-translations/_index.adoc
new file mode 100644
index 0000000000..53cee084bf
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/po-translations/_index.adoc
@@ -0,0 +1,365 @@
+---
+description: 'Как работать с переводом PO в проекте документации FreeBSD'
+next: books/fdp-primer/weblate
+params:
+ path: /books/fdp-primer/po-translations/
+prev: books/fdp-primer/translations
+showBookMenu: true
+tags: ["po", "translations", "tutorial", "quick start"]
+title: 'Глава 9. Переводы PO'
+weight: 9
+---
+
+[[po-translations]]
+= Переводы PO
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 9
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[po-translations-introduction]]
+== Введение
+
+Система http://www.gnu.org/software/gettext/[GNU gettext] предоставляет переводчикам удобный способ создания и поддержки переводов документов. Переводимые строки извлекаются из исходного документа в файл PO (Portable Object). Переводы строк добавляются с помощью отдельного редактора. Эти строки могут использоваться напрямую или собираться в полную переведённую версию исходного документа.
+
+[[po-translations-quick-start]]
+== Быстрый старт
+
+Предполагается, что процедура, описанная в crossref:overview[overview-quick-start,Быстрый старт], уже выполнена. Опция `TRANSLATOR` необходима и уже включена по умолчанию в порте package:textproc/docproj[].
+
+Этот пример демонстрирует создание испанского перевода краткой статьи extref:{leap-seconds}[Високосные секунды].
+
+[[po-translations-quick-start-install-po-editor]]
+
+[.procedure]
+====
+.Процедура: Установка PO-редактора
+. Редактор PO необходим для редактирования файлов переводов. В этом примере используется package:editors/poedit[].
++
+[source, shell]
+....
+# pkg install poedit
+....
+====
+
+[[po-translations-quick-start-initial-setup]]
+[.procedure]
+====
+.Процедура: Начальная настройка
+
+Когда создаётся новый перевод, структура каталогов должна быть создана или скопирована из оригинальной английской версии:
+
+. Создайте каталог для нового перевода. Исходный текст статьи на английском находится в [.filename]#~/doc/documentation/content/en/articles/leap-seconds/#. Испанский перевод будет расположен в [.filename]#~/doc/documentation/content/es/articles/leap-seconds/#. Путь идентичен, за исключением названия языкового каталога. Исходный текст статьи на английском находится в [.filename]#~/doc/en/articles/leap-seconds/#. Испанский перевод будет расположен в [.filename]#~/doc/es/articles/leap-seconds/#. Путь идентичен, за исключением названия языкового каталога.
++
+[source, shell]
+....
+% mkdir ~/doc/documentation/content/es/articles/leap-seconds
+....
+
+. Скопируйте [.filename]#_index.po# из исходного документа в директорию перевода:
++
+[source, shell]
+....
+% cp ~/doc/documentation/content/en/articles/leap-seconds/_index.po \
+ ~/doc/documentation/content/es/articles/leap-seconds/
+....
+
+Предположим, что документ или язык также переводится через Weblate. В таком случае рекомендуется взять файл `.po` оттуда и загрузить переведённый документ обратно в платформу, чтобы централизовать усилия по переводу через Weblate и избежать повторной работы.
+
+См. как загрузить файлы `.po` в главе crossref:weblate[weblate-translating-offline,Перевод офлайн в Weblate].
+====
+
+[[po-translations-quick-start-translation]]
+[.procedure]
+====
+.Процедура: Перевод
+
+Используйте PO-редактор для ввода переводов в PO-файл. Доступно несколько различных редакторов. Здесь показан [.filename]#poedit# из пакета:editors/poedit[].
+
+[source, shell]
+....
+% poedit documentation/content/es/articles/leap-seconds/_index.po
+....
+====
+
+[[po-translations-quick-generating-a-translated-document]]
+[.procedure]
+====
+.Процедура: Создание переведенного документа
+. Сгенерируйте переведенный документ:
++
+[source, shell]
+....
+% cd ~/doc
+% ./tools/translate.sh documentation es articles/leap-seconds
+....
++
+Имя сгенерированного документа соответствует имени оригинала на английском языке, обычно `[.filename]#_index.adoc#`.
++
+. Проверьте сгенерированный файл, преобразовав его в HTML и просмотрев в веб-браузере:
++
+[source, shell]
+....
+% cd ~/doc/documentation
+% make
+....
+====
+
+[[po-translations-creating]]
+== Создание новых переводов
+
+Первым шагом в создании нового переведённого документа является поиск или создание каталога для его размещения. FreeBSD размещает переведённые документы в подкаталоге с названием, соответствующим языку и региону, в формате [.filename]#lang#. Здесь _lang_ — это двухбуквенный код в нижнем регистре.
+
+[[po-translations-language-names]]
+.Названия языков
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Язык
+| Регион
+| Имя каталога с переводами
+
+|Английский
+|Соединённые Штаты
+|[.filename]#en#
+
+|Бенгальский
+|Бангладеш
+|[.filename]#bn-bd#
+
+|Датский
+|Дания
+|[.filename]#da#
+
+|Немецкий
+|Германия
+|[.filename]#de#
+
+|Греческий
+|Греция
+|[.filename]#el#
+
+|Испанский
+|Испания
+|[.filename]#es#
+
+|Французский
+|Франция
+|[.filename]#fr#
+
+|Венгерский
+|Венгрия
+|[.filename]#hu#
+
+|Итальянский
+|Италия
+|[.filename]#it#
+
+|Японский
+|Япония
+|[.filename]#ja#
+
+|Корейский
+|Корея
+|[.filename]#ko#
+
+|Монгольский
+|Монголия
+|[.filename]#mn#
+
+|Голландский
+|Нидерланды
+|[.filename]#nl#
+
+|Польский
+|Польша
+|[.filename]#pl#
+
+|Португальский
+|Бразилия
+|[.filename]#pt-br#
+
+|Русский
+|Россия
+|[.filename]#ru#
+
+|Турецкий
+|Турция
+|[.filename]#tr#
+
+|Китайский
+|Китай
+|[.filename]#zh-cn#
+
+|Китайский
+|Тайвань
+|[.filename]#zh-tw#
+|===
+
+Переводы находятся в поддиректориях основной директории документации, которая в данном случае предполагается как [.filename]#~/doc/documentation/#, как показано в crossref:overview[overview-quick-start, Быстрый старт]. Например, немецкие переводы расположены в [.filename]#~/doc/documentation/content/de/#, а французские — в [.filename]#~/doc/documentation/content/fr/#.
+
+Каждый языковой каталог содержит отдельные подкаталоги с названиями по типу документов, обычно [.filename]#articles/# и [.filename]#books/#.
+
+Объединение этих имен каталогов дает полный путь к статье или книге. Например, французский перевод статьи NanoBSD находится в [.filename]#~/doc/documentation/content/fr/articles/nanobsd/#, а монгольский перевод Руководства — в [.filename]#~/doc/documentation/content/mn/books/handbook/#.
+
+При переводе документа на новый язык необходимо создать новый языковой каталог. Если языковой каталог уже существует, достаточно создать подкаталог в директории [.filename]#articles/# или [.filename]#books/#.
+
+[[po-translations-creating-example]]
+.Создание испанского перевода Руководства портировщика
+[example]
+====
+Создайте новый перевод на испанский язык extref:{porters-handbook}[Руководства портировщика]. Оригинал находится в книге [.filename]#~/doc/documentation/content/en/books/porters-handbook/#.
+
+[.procedure]
+======
+
+. Каталог для книг на испанском языке [.filename]#~/doc/documentation/content/es/books/# уже существует, поэтому требуется только создать подкаталог для Руководства портировщика:
++
+[source, shell]
+....
+% cd ~/doc/documentation/content/es/books
+% mkdir porters-handbook
+....
+
+. Скопируйте содержимое из переводимой книги:
++
+[source, shell]
+....
+% cd porters-handbook
+% cp -R ~/doc/documentation/content/en/books/porters-handbook/* .
+....
++
+Теперь структура документа готова для начала перевода с помощью команды `po4a`.
+======
+====
+
+[[po-translations-translating]]
+== Перевод
+
+Система gettext значительно сокращает количество элементов, за которыми нужно следить переводчику. Строки, подлежащие переводу, извлекаются из исходного документа в файл PO. Затем с помощью редактора PO вводятся переведённые версии каждой строки.
+
+Система перевода FreeBSD PO не перезаписывает PO-файлы, поэтому этап извлечения можно выполнять в любое время для обновления PO-файла.
+
+Редактор PO используется для редактирования файла. В этих примерах показан package:editors/poedit[], так как он прост и имеет минимальные требования. Другие редакторы PO предоставляют функции, облегчающие процесс перевода. В Коллекции портов доступно несколько таких редакторов, включая package:devel/gtranslator[].
+
+Важно сохранить PO-файл. Он содержит всю работу, проделанную переводчиками.
+
+[IMPORTANT]
+====
+Перевод документов онлайн оказывается наиболее простым способом перевода документации в FreeBSD, так как позволяет нескольким пользователям совместно работать над одним файлом, эффективно распределяя нагрузку. Для получения дополнительной информации обратитесь к следующей главе: crossref:weblate[weblate-introduction,Переводы в Weblate].
+====
+
+[[po-translations-tips]]
+== Советы переводчикам
+
+[[po-translations-tips-xmltags]]
+=== Сохранение AsciiDoc макросов
+
+Сохраните макросы AsciiDoc, которые указаны на английском языке.
+
+.Сохранение AsciiDoc макросов
+[example]
+====
+Оригинал на английском:
+
+[.programlisting]
+....
+msgid ""
+"This example shows the creation of a Spanish translation of the short "
+"extref:{leap-seconds}[Leap Seconds] article."
+....
+
+Испанский перевод:
+
+[.programlisting]
+....
+msgid ""
+"Este ejemplo muestra la creación de un artículo con poco contenido como el artículo "
+"extref:{leap-seconds}[Leap Seconds]."
+....
+
+====
+
+[[po-translations-tips-spaces]]
+=== Сохранение пробелов
+
+Сохраняйте существующие пробелы в начале и конце строк, которые нужно перевести. В переведённой версии эти пробелы также должны присутствовать.
+
+[[po-translations-tips-verbatim]]
+=== Дословные теги
+
+Содержимое некоторых тегов должно быть скопировано дословно, без перевода:
+
+* `man:man[1]`
+* `package:package[]`
+* `link`
+* `image`
+* `include`
+* `Admonitions`
+* `id's`
+* `Heading tags`
+* `source`
+
+[[po-translations-building]]
+== Сборка переведенного документа
+
+Переведённую версию оригинального документа можно создать в любое время. При этом все непереведённые части документа будут включены в итоговый документ на английском языке. Большинство PO-редакторов имеют индикатор, показывающий, какая часть перевода завершена. Это позволяет переводчику легко увидеть, когда переведено достаточно строк, чтобы сборка итогового документа имела смысл.
+
+Глава о Weblate есть полный пример того, как crossref:weblate[weblate-building,Собрать переведённый документ].
+
+[[po-translations-submitting]]
+== Отправка новой переведённой версии
+
+Подготовьте новые файлы перевода для отправки. Это включает добавление файлов в систему контроля версий, установку дополнительных свойств для них, а затем создание diff-файла для отправки.
+
+Файлы различий, созданные в этих примерах, можно прикрепить к https://bugs.freebsd.org/bugzilla/enter_bug.cgi?product=Documentation[отчету об ошибке в документации] или https://reviews.freebsd.org/[обзору кода].
+
+[[po-translations-submitting-spanish]]
+.Перевод статьи NanoBSD на испанский язык
+[example]
+====
+[.procedure]
+======
+
+. Создайте diff новых файлов из базового каталога [.filename]#~/doc/# так, чтобы полный путь отображался вместе с именами файлов. Это помогает коммиттерам определить целевой языковой каталог.
++
+[source, shell]
+....
+% cd ~/doc
+% git diff documentation/content/es/articles/nanobsd/ > /tmp/es_nanobsd.diff
+....
+======
+
+Глава о Weblate содержит полный пример того, как crossref:weblate[weblate-submitting-translations, отправить новый перевод].
+
+====
diff --git a/documentation/content/ru/books/fdp-primer/po-translations/_index.po b/documentation/content/ru/books/fdp-primer/po-translations/_index.po
new file mode 100644
index 0000000000..b9a59eea47
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/po-translations/_index.po
@@ -0,0 +1,1041 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-06-23 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerpo-translations_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:1
+#, no-wrap
+msgid "How to work with PO translation in the FreeBSD Documentation Project"
+msgstr "Как работать с переводом PO в проекте документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:1
+#, no-wrap
+msgid "Chapter 9. PO Translations"
+msgstr "Глава 9. Переводы PO"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:14
+#, no-wrap
+msgid "PO Translations"
+msgstr "Переводы PO"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:52
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:58
+msgid ""
+"The http://www.gnu.org/software/gettext/[GNU gettext] system offers "
+"translators an easy way to create and maintain translations of documents. "
+"Translatable strings are extracted from the original document into a PO "
+"(Portable Object) file. Translated versions of the strings are entered with "
+"a separate editor. The strings can be used directly or built into a "
+"complete translated version of the original document."
+msgstr ""
+"Система http://www.gnu.org/software/gettext/[GNU gettext] предоставляет "
+"переводчикам удобный способ создания и поддержки переводов документов. "
+"Переводимые строки извлекаются из исходного документа в файл PO (Portable "
+"Object). Переводы строк добавляются с помощью отдельного редактора. Эти "
+"строки могут использоваться напрямую или собираться в полную переведённую "
+"версию исходного документа."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:60
+#, no-wrap
+msgid "Quick Start"
+msgstr "Быстрый старт"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:64
+msgid ""
+"The procedure shown in crossref:overview[overview-quick-start,Quick Start] "
+"is assumed to have already been performed. The `TRANSLATOR` option is "
+"required and already enabled by default in the package:textproc/docproj[] "
+"port."
+msgstr ""
+"Предполагается, что процедура, описанная в crossref:overview[overview-quick-"
+"start,Быстрый старт], уже выполнена. Опция `TRANSLATOR` необходима и уже "
+"включена по умолчанию в порте package:textproc/docproj[]."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:66
+msgid ""
+"This example shows the creation of a Spanish translation of the short extref:"
+"{leap-seconds}[Leap Seconds] article."
+msgstr ""
+"Этот пример демонстрирует создание испанского перевода краткой статьи extref:"
+"{leap-seconds}[Високосные секунды]."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:71
+#, no-wrap
+msgid "Procedure: Install a PO Editor"
+msgstr "Процедура: Установка PO-редактора"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:73
+msgid ""
+"A PO editor is needed to edit translation files. This example uses "
+"package:editors/poedit[]."
+msgstr ""
+"Редактор PO необходим для редактирования файлов переводов. В этом примере "
+"используется package:editors/poedit[]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:77
+#, no-wrap
+msgid "# pkg install poedit\n"
+msgstr "# pkg install poedit\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:83
+#, no-wrap
+msgid "Procedure: Initial Setup"
+msgstr "Процедура: Начальная настройка"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:86
+msgid ""
+"When a new translation is first created, the directory structure must be "
+"created or copied from the English original:"
+msgstr ""
+"Когда создаётся новый перевод, структура каталогов должна быть создана или "
+"скопирована из оригинальной английской версии:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:91
+msgid ""
+"Create a directory for the new translation. The English article source is in "
+"[.filename]#~/doc/documentation/content/en/articles/leap-seconds/#. The "
+"Spanish translation will go in [.filename]#~/doc/documentation/content/es/"
+"articles/leap-seconds/#. The path is the same except for the name of the "
+"language directory. The English article source is in [.filename]#~/doc/en/"
+"articles/leap-seconds/#. The Spanish translation will go in [.filename]#~/"
+"doc/es/articles/leap-seconds/#. The path is the same except for the name of "
+"the language directory."
+msgstr ""
+"Создайте каталог для нового перевода. Исходный текст статьи на английском "
+"находится в [.filename]#~/doc/documentation/content/en/articles/leap-seconds/"
+"#. Испанский перевод будет расположен в [.filename]#~/doc/documentation/"
+"content/es/articles/leap-seconds/#. Путь идентичен, за исключением названия "
+"языкового каталога. Исходный текст статьи на английском находится в "
+"[.filename]#~/doc/en/articles/leap-seconds/#. Испанский перевод будет "
+"расположен в [.filename]#~/doc/es/articles/leap-seconds/#. Путь идентичен, "
+"за исключением названия языкового каталога."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:95
+#, no-wrap
+msgid "% mkdir ~/doc/documentation/content/es/articles/leap-seconds\n"
+msgstr "% mkdir ~/doc/documentation/content/es/articles/leap-seconds\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:98
+msgid ""
+"Copy the [.filename]#_index.po# from the original document into the "
+"translation directory:"
+msgstr ""
+"Скопируйте [.filename]#_index.po# из исходного документа в директорию "
+"перевода:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:103
+#, no-wrap
+msgid ""
+"% cp ~/doc/documentation/content/en/articles/leap-seconds/_index.po \\\n"
+" ~/doc/documentation/content/es/articles/leap-seconds/\n"
+msgstr ""
+"% cp ~/doc/documentation/content/en/articles/leap-seconds/_index.po \\\n"
+" ~/doc/documentation/content/es/articles/leap-seconds/\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:107
+msgid ""
+"Suppose the document or language is also being translated via Weblate. In "
+"that case, it is good to get the `.po` file from there and upload the "
+"translation document back into the platform, centralizing the translating "
+"efforts via Weblate to avoid rework."
+msgstr ""
+"Предположим, что документ или язык также переводится через Weblate. В таком "
+"случае рекомендуется взять файл `.po` оттуда и загрузить переведённый "
+"документ обратно в платформу, чтобы централизовать усилия по переводу через "
+"Weblate и избежать повторной работы."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:109
+msgid ""
+"See how to download the `.po` files in the crossref:weblate[weblate-"
+"translating-offline,Translating Offline on Weblate] chapter."
+msgstr ""
+"См. как загрузить файлы `.po` в главе crossref:weblate[weblate-translating-"
+"offline,Перевод офлайн в Weblate]."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:114
+#, no-wrap
+msgid "Procedure: Translation"
+msgstr "Процедура: Перевод"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:118
+msgid ""
+"Use a PO editor to enter translations in the PO file. There are several "
+"different editors available. [.filename]#poedit# from package:editors/"
+"poedit[] is shown here."
+msgstr ""
+"Используйте PO-редактор для ввода переводов в PO-файл. Доступно несколько "
+"различных редакторов. Здесь показан [.filename]#poedit# из пакета:editors/"
+"poedit[]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:122
+#, no-wrap
+msgid "% poedit documentation/content/es/articles/leap-seconds/_index.po\n"
+msgstr "% poedit documentation/content/es/articles/leap-seconds/_index.po\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:128
+#, no-wrap
+msgid "Procedure: Generating a Translated Document"
+msgstr "Процедура: Создание переведенного документа"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:130
+msgid "Generate the translated document:"
+msgstr "Сгенерируйте переведенный документ:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:135
+#, no-wrap
+msgid ""
+"% cd ~/doc\n"
+"% ./tools/translate.sh documentation es articles/leap-seconds\n"
+msgstr ""
+"% cd ~/doc\n"
+"% ./tools/translate.sh documentation es articles/leap-seconds\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:138
+msgid ""
+"The name of the generated document matches the name of the English original, "
+"usually [.filename]#_index.adoc#."
+msgstr ""
+"Имя сгенерированного документа соответствует имени оригинала на английском "
+"языке, обычно `[.filename]#_index.adoc#`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:140
+msgid ""
+"Check the generated file by rendering it to HTML and viewing it with a web "
+"browser:"
+msgstr ""
+"Проверьте сгенерированный файл, преобразовав его в HTML и просмотрев в веб-"
+"браузере:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:145
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation\n"
+"% make\n"
+msgstr ""
+"% cd ~/doc/documentation\n"
+"% make\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:149
+#, no-wrap
+msgid "Creating New Translations"
+msgstr "Создание новых переводов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:154
+msgid ""
+"The first step to creating a new translated document is locating or creating "
+"a directory to hold it. FreeBSD puts translated documents in a subdirectory "
+"named for their language and region in the format [.filename]#lang#. _lang_ "
+"is a two-character lowercase code."
+msgstr ""
+"Первым шагом в создании нового переведённого документа является поиск или "
+"создание каталога для его размещения. FreeBSD размещает переведённые "
+"документы в подкаталоге с названием, соответствующим языку и региону, в "
+"формате [.filename]#lang#. Здесь _lang_ — это двухбуквенный код в нижнем "
+"регистре."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:156
+#, no-wrap
+msgid "Language Names"
+msgstr "Названия языков"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:160
+#, no-wrap
+msgid "Language"
+msgstr "Язык"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:161
+#, no-wrap
+msgid "Region"
+msgstr "Регион"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:163
+#, no-wrap
+msgid "Translated Directory Name"
+msgstr "Имя каталога с переводами"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:164
+#, no-wrap
+msgid "English"
+msgstr "Английский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:165
+#, no-wrap
+msgid "United States"
+msgstr "Соединённые Штаты"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:167
+#, no-wrap
+msgid "[.filename]#en#"
+msgstr "[.filename]#en#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:168
+#, no-wrap
+msgid "Bengali"
+msgstr "Бенгальский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:169
+#, no-wrap
+msgid "Bangladesh"
+msgstr "Бангладеш"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:171
+#, no-wrap
+msgid "[.filename]#bn-bd#"
+msgstr "[.filename]#bn-bd#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:172
+#, no-wrap
+msgid "Danish"
+msgstr "Датский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:173
+#, no-wrap
+msgid "Denmark"
+msgstr "Дания"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:175
+#, no-wrap
+msgid "[.filename]#da#"
+msgstr "[.filename]#da#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:176
+#, no-wrap
+msgid "German"
+msgstr "Немецкий"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:177
+#, no-wrap
+msgid "Germany"
+msgstr "Германия"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:179
+#, no-wrap
+msgid "[.filename]#de#"
+msgstr "[.filename]#de#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:180
+#, no-wrap
+msgid "Greek"
+msgstr "Греческий"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:181
+#, no-wrap
+msgid "Greece"
+msgstr "Греция"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:183
+#, no-wrap
+msgid "[.filename]#el#"
+msgstr "[.filename]#el#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:184
+#, no-wrap
+msgid "Spanish"
+msgstr "Испанский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:185
+#, no-wrap
+msgid "Spain"
+msgstr "Испания"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:187
+#, no-wrap
+msgid "[.filename]#es#"
+msgstr "[.filename]#es#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:188
+#, no-wrap
+msgid "French"
+msgstr "Французский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:189
+#, no-wrap
+msgid "France"
+msgstr "Франция"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:191
+#, no-wrap
+msgid "[.filename]#fr#"
+msgstr "[.filename]#fr#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:192
+#, no-wrap
+msgid "Hungarian"
+msgstr "Венгерский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:193
+#, no-wrap
+msgid "Hungary"
+msgstr "Венгрия"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:195
+#, no-wrap
+msgid "[.filename]#hu#"
+msgstr "[.filename]#hu#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:196
+#, no-wrap
+msgid "Italian"
+msgstr "Итальянский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:197
+#, no-wrap
+msgid "Italy"
+msgstr "Италия"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:199
+#, no-wrap
+msgid "[.filename]#it#"
+msgstr "[.filename]#it#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:200
+#, no-wrap
+msgid "Japanese"
+msgstr "Японский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:201
+#, no-wrap
+msgid "Japan"
+msgstr "Япония"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:203
+#, no-wrap
+msgid "[.filename]#ja#"
+msgstr "[.filename]#ja#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:204
+#, no-wrap
+msgid "Korean"
+msgstr "Корейский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:205
+#, no-wrap
+msgid "Korea"
+msgstr "Корея"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:207
+#, no-wrap
+msgid "[.filename]#ko#"
+msgstr "[.filename]#ko#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:208
+#, no-wrap
+msgid "Mongolian"
+msgstr "Монгольский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:209
+#, no-wrap
+msgid "Mongolia"
+msgstr "Монголия"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:211
+#, no-wrap
+msgid "[.filename]#mn#"
+msgstr "[.filename]#mn#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:212
+#, no-wrap
+msgid "Dutch"
+msgstr "Голландский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:213
+#, no-wrap
+msgid "Netherlands"
+msgstr "Нидерланды"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:215
+#, no-wrap
+msgid "[.filename]#nl#"
+msgstr "[.filename]#nl#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:216
+#, no-wrap
+msgid "Polish"
+msgstr "Польский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:217
+#, no-wrap
+msgid "Poland"
+msgstr "Польша"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:219
+#, no-wrap
+msgid "[.filename]#pl#"
+msgstr "[.filename]#pl#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:220
+#, no-wrap
+msgid "Portuguese"
+msgstr "Португальский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:221
+#, no-wrap
+msgid "Brazil"
+msgstr "Бразилия"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:223
+#, no-wrap
+msgid "[.filename]#pt-br#"
+msgstr "[.filename]#pt-br#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:224
+#, no-wrap
+msgid "Russian"
+msgstr "Русский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:225
+#, no-wrap
+msgid "Russia"
+msgstr "Россия"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:227
+#, no-wrap
+msgid "[.filename]#ru#"
+msgstr "[.filename]#ru#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:228
+#, no-wrap
+msgid "Turkish"
+msgstr "Турецкий"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:229
+#, no-wrap
+msgid "Turkey"
+msgstr "Турция"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:231
+#, no-wrap
+msgid "[.filename]#tr#"
+msgstr "[.filename]#tr#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:232
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:236
+#, no-wrap
+msgid "Chinese"
+msgstr "Китайский"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:233
+#, no-wrap
+msgid "China"
+msgstr "Китай"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:235
+#, no-wrap
+msgid "[.filename]#zh-cn#"
+msgstr "[.filename]#zh-cn#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:237
+#, no-wrap
+msgid "Taiwan"
+msgstr "Тайвань"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:238
+#, no-wrap
+msgid "[.filename]#zh-tw#"
+msgstr "[.filename]#zh-tw#"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:244
+msgid ""
+"The translations are in subdirectories of the main documentation directory, "
+"here assumed to be [.filename]#~/doc/documentation/# as shown in "
+"crossref:overview[overview-quick-start, Quick Start]. For example, German "
+"translations are located in [.filename]#~/doc/documentation/content/de/#, "
+"and French translations are in [.filename]#~/doc/documentation/content/fr/#."
+msgstr ""
+"Переводы находятся в поддиректориях основной директории документации, "
+"которая в данном случае предполагается как [.filename]#~/doc/documentation/"
+"#, как показано в crossref:overview[overview-quick-start, Быстрый старт]. "
+"Например, немецкие переводы расположены в [.filename]#~/doc/documentation/"
+"content/de/#, а французские — в [.filename]#~/doc/documentation/content/fr/#."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:246
+msgid ""
+"Each language directory contains separate subdirectories named for the type "
+"of documents, usually [.filename]#articles/# and [.filename]#books/#."
+msgstr ""
+"Каждый языковой каталог содержит отдельные подкаталоги с названиями по типу "
+"документов, обычно [.filename]#articles/# и [.filename]#books/#."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:250
+msgid ""
+"Combining these directory names gives the complete path to an article or "
+"book. For example, the French translation of the NanoBSD article is in "
+"[.filename]#~/doc/documentation/content/fr/articles/nanobsd/#, and the "
+"Mongolian translation of the Handbook is in [.filename]#~/doc/documentation/"
+"content/mn/books/handbook/#."
+msgstr ""
+"Объединение этих имен каталогов дает полный путь к статье или книге. "
+"Например, французский перевод статьи NanoBSD находится в [.filename]#~/doc/"
+"documentation/content/fr/articles/nanobsd/#, а монгольский перевод "
+"Руководства — в [.filename]#~/doc/documentation/content/mn/books/handbook/#."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:253
+msgid ""
+"A new language directory must be created when translating a document to a "
+"new language. If the language directory already exists, only a subdirectory "
+"in the [.filename]#articles/# or [.filename]#books/# directory is needed."
+msgstr ""
+"При переводе документа на новый язык необходимо создать новый языковой "
+"каталог. Если языковой каталог уже существует, достаточно создать подкаталог "
+"в директории [.filename]#articles/# или [.filename]#books/#."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:255
+#, no-wrap
+msgid "Creating a Spanish Translation of the Porter's Handbook"
+msgstr "Создание испанского перевода Руководства портировщика"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:260
+msgid ""
+"Create a new Spanish translation of the extref:{porters-handbook}[Porter's "
+"Handbook]. The original is a book in [.filename]#~/doc/documentation/"
+"content/en/books/porters-handbook/#."
+msgstr ""
+"Создайте новый перевод на испанский язык extref:{porters-handbook}"
+"[Руководства портировщика]. Оригинал находится в книге [.filename]#~/doc/"
+"documentation/content/en/books/porters-handbook/#."
+
+#. type: delimited block = 6
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:265
+msgid ""
+"The Spanish language books directory [.filename]#~/doc/documentation/content/"
+"es/books/# already exists, so only a new subdirectory for the Porter's "
+"Handbook is needed:"
+msgstr ""
+"Каталог для книг на испанском языке [.filename]#~/doc/documentation/content/"
+"es/books/# уже существует, поэтому требуется только создать подкаталог для "
+"Руководства портировщика:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:270
+#, no-wrap
+msgid ""
+"% cd ~/doc/documentation/content/es/books\n"
+"% mkdir porters-handbook\n"
+msgstr ""
+"% cd ~/doc/documentation/content/es/books\n"
+"% mkdir porters-handbook\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:273
+msgid "Copy the content from the original book:"
+msgstr "Скопируйте содержимое из переводимой книги:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:278
+#, no-wrap
+msgid ""
+"% cd porters-handbook\n"
+"% cp -R ~/doc/documentation/content/en/books/porters-handbook/* .\n"
+msgstr ""
+"% cd porters-handbook\n"
+"% cp -R ~/doc/documentation/content/en/books/porters-handbook/* .\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:281
+msgid ""
+"Now the document structure is ready for the translator to begin translating "
+"with `po4a` command."
+msgstr ""
+"Теперь структура документа готова для начала перевода с помощью команды "
+"`po4a`."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:285
+#, no-wrap
+msgid "Translating"
+msgstr "Перевод"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:290
+msgid ""
+"The gettext system greatly reduces the number of things that must be tracked "
+"by a translator. Strings to be translated are extracted from the original "
+"document into a PO file. Then a PO editor is used to enter the translated "
+"versions of each string."
+msgstr ""
+"Система gettext значительно сокращает количество элементов, за которыми "
+"нужно следить переводчику. Строки, подлежащие переводу, извлекаются из "
+"исходного документа в файл PO. Затем с помощью редактора PO вводятся "
+"переведённые версии каждой строки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:292
+msgid ""
+"The FreeBSD PO translation system does not overwrite PO files, so the "
+"extraction step can be run at any time to update the PO file."
+msgstr ""
+"Система перевода FreeBSD PO не перезаписывает PO-файлы, поэтому этап "
+"извлечения можно выполнять в любое время для обновления PO-файла."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:297
+msgid ""
+"A PO editor is used to edit the file. package:editors/poedit[] is shown in "
+"these examples because it is simple and has minimal requirements. Other PO "
+"editors offer features to make the job of translating easier. The Ports "
+"Collection offers several of these editors, including package:devel/"
+"gtranslator[]."
+msgstr ""
+"Редактор PO используется для редактирования файла. В этих примерах показан "
+"package:editors/poedit[], так как он прост и имеет минимальные требования. "
+"Другие редакторы PO предоставляют функции, облегчающие процесс перевода. В "
+"Коллекции портов доступно несколько таких редакторов, включая package:devel/"
+"gtranslator[]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:300
+msgid ""
+"It is important to preserve the PO file. It contains all of the work that "
+"translators have done."
+msgstr ""
+"Важно сохранить PO-файл. Он содержит всю работу, проделанную переводчиками."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:305
+msgid ""
+"Translating documents online proves to be the easiest method for document "
+"translation on FreeBSD, as it allows multiple users to collaborate on the "
+"same file, distributing the workload effectively. For more details, please "
+"refer to the next chapter, crossref:weblate[weblate-introduction,Weblate "
+"Translations]."
+msgstr ""
+"Перевод документов онлайн оказывается наиболее простым способом перевода "
+"документации в FreeBSD, так как позволяет нескольким пользователям совместно "
+"работать над одним файлом, эффективно распределяя нагрузку. Для получения "
+"дополнительной информации обратитесь к следующей главе: "
+"crossref:weblate[weblate-introduction,Переводы в Weblate]."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:308
+#, no-wrap
+msgid "Tips for Translators"
+msgstr "Советы переводчикам"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:311
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:315
+#, no-wrap
+msgid "Preserving AsciiDoc macros"
+msgstr "Сохранение AsciiDoc макросов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:314
+msgid "Preserve AsciiDoc macros that are shown in the English original."
+msgstr "Сохраните макросы AsciiDoc, которые указаны на английском языке."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:319
+msgid "English original:"
+msgstr "Оригинал на английском:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:325
+#, no-wrap
+msgid ""
+"msgid \"\"\n"
+"\"This example shows the creation of a Spanish translation of the short \"\n"
+"\"extref:{leap-seconds}[Leap Seconds] article.\"\n"
+msgstr ""
+"msgid \"\"\n"
+"\"This example shows the creation of a Spanish translation of the short \"\n"
+"\"extref:{leap-seconds}[Leap Seconds] article.\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:328
+msgid "Spanish translation:"
+msgstr "Испанский перевод:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:334
+#, no-wrap
+msgid ""
+"msgid \"\"\n"
+"\"Este ejemplo muestra la creación de un artículo con poco contenido como el artículo \"\n"
+"\"extref:{leap-seconds}[Leap Seconds].\"\n"
+msgstr ""
+"msgid \"\"\n"
+"\"Este ejemplo muestra la creación de un artículo con poco contenido como el artículo \"\n"
+"\"extref:{leap-seconds}[Leap Seconds].\"\n"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:339
+#, no-wrap
+msgid "Preserving Spaces"
+msgstr "Сохранение пробелов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:343
+msgid ""
+"Preserve existing spaces at the beginning and end of strings to be "
+"translated. The translated version must have these spaces also."
+msgstr ""
+"Сохраняйте существующие пробелы в начале и конце строк, которые нужно "
+"перевести. В переведённой версии эти пробелы также должны присутствовать."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:345
+#, no-wrap
+msgid "Verbatim Tags"
+msgstr "Дословные теги"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:348
+msgid "The contents of some tags should be copied verbatim, not translated:"
+msgstr ""
+"Содержимое некоторых тегов должно быть скопировано дословно, без перевода:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:350
+msgid "`man:man[1]`"
+msgstr "`man:man[1]`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:351
+msgid "`package:package[]`"
+msgstr "`package:package[]`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:352
+msgid "`link`"
+msgstr "`link`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:353
+msgid "`image`"
+msgstr "`image`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:354
+msgid "`include`"
+msgstr "`include`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:355
+msgid "`Admonitions`"
+msgstr "`Admonitions`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:356
+msgid "`id's`"
+msgstr "`id's`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:357
+msgid "`Heading tags`"
+msgstr "`Heading tags`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:358
+msgid "`source`"
+msgstr "`source`"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:360
+#, no-wrap
+msgid "Building a Translated Document"
+msgstr "Сборка переведенного документа"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:366
+msgid ""
+"A translated version of the original document can be created at any time. "
+"Any untranslated portions of the original will be included in English in the "
+"resulting document. Most PO editors have an indicator that shows how much "
+"of the translation has been completed. This makes it easy for the "
+"translator to see when enough strings have been translated to make building "
+"the final document worthwhile."
+msgstr ""
+"Переведённую версию оригинального документа можно создать в любое время. "
+"При этом все непереведённые части документа будут включены в итоговый "
+"документ на английском языке. Большинство PO-редакторов имеют индикатор, "
+"показывающий, какая часть перевода завершена. Это позволяет переводчику "
+"легко увидеть, когда переведено достаточно строк, чтобы сборка итогового "
+"документа имела смысл."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:368
+msgid ""
+"The Weblate chapter provides a complete example of how to "
+"crossref:weblate[weblate-building,Build the Translated Document]."
+msgstr ""
+"Глава о Weblate есть полный пример того, как crossref:weblate[weblate-"
+"building,Собрать переведённый документ]."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:370
+#, no-wrap
+msgid "Submitting the New Translation"
+msgstr "Отправка новой переведённой версии"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:374
+msgid ""
+"Prepare the new translation files for submission. This includes adding the "
+"files to the version control system, setting additional properties on them, "
+"then creating a diff for submission."
+msgstr ""
+"Подготовьте новые файлы перевода для отправки. Это включает добавление "
+"файлов в систему контроля версий, установку дополнительных свойств для них, "
+"а затем создание diff-файла для отправки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:376
+msgid ""
+"The diff files created by these examples can be attached to a https://"
+"bugs.freebsd.org/bugzilla/enter_bug.cgi?product=Documentation[documentation "
+"bug report] or https://reviews.freebsd.org/[code review]."
+msgstr ""
+"Файлы различий, созданные в этих примерах, можно прикрепить к https://"
+"bugs.freebsd.org/bugzilla/enter_bug.cgi?product=Documentation[отчету об "
+"ошибке в документации] или https://reviews.freebsd.org/[обзору кода]."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:378
+#, no-wrap
+msgid "Spanish Translation of the NanoBSD Article"
+msgstr "Перевод статьи NanoBSD на испанский язык"
+
+#. type: delimited block = 6
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:385
+msgid ""
+"Create a diff of the new files from the [.filename]#~/doc/# base directory "
+"so the full path is shown with the filenames. This helps committers identify "
+"the target language directory."
+msgstr ""
+"Создайте diff новых файлов из базового каталога [.filename]#~/doc/# так, "
+"чтобы полный путь отображался вместе с именами файлов. Это помогает "
+"коммиттерам определить целевой языковой каталог."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:390
+#, no-wrap
+msgid ""
+"% cd ~/doc\n"
+"% git diff documentation/content/es/articles/nanobsd/ > /tmp/es_nanobsd.diff\n"
+msgstr ""
+"% cd ~/doc\n"
+"% git diff documentation/content/es/articles/nanobsd/ > /tmp/es_nanobsd.diff\n"
+
+#. type: delimited block = 6
+#: documentation/content/en/books/fdp-primer/po-translations/_index.adoc:394
+msgid ""
+"The Weblate chapter provides a complete example of how to "
+"crossref:weblate[weblate-submitting-translations,Submit the New Translation]."
+msgstr ""
+"Глава о Weblate содержит полный пример того, как crossref:weblate[weblate-"
+"submitting-translations, отправить новый перевод]."
diff --git a/documentation/content/ru/books/fdp-primer/preface/_index.adoc b/documentation/content/ru/books/fdp-primer/preface/_index.adoc
new file mode 100644
index 0000000000..6cc88df8af
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/preface/_index.adoc
@@ -0,0 +1,155 @@
+---
+description: 'Предисловие о проекте документации FreeBSD'
+next: books/fdp-primer/overview
+params:
+ path: /books/fdp-primer/preface/
+prev: books/fdp-primer
+showBookMenu: true
+tags: ["preface", "prompts", "conventions"]
+title: Предисловие
+weight: 1
+---
+
+[preface]
+[[preface]]
+= Предисловие
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[preface-prompts]]
+== Приглашения командной оболочки
+
+В этой таблице показаны приглашения системы по умолчанию и приглашение суперпользователя. В примерах используются эти приглашения, чтобы указать, от какого типа пользователя выполняется пример.
+
+[.informaltable]
+[cols="1,2", frame="none", options="header"]
+|===
+| Пользователь
+| Приглашение
+
+
+|Обычный пользователь
+|%
+
+|`root`
+|#
+|===
+
+[[preface-conventions]]
+== Типографические соглашения
+
+Эта таблица описывает типографские соглашения, используемые в этой книге.
+
+[.informaltable]
+[cols="1,2", frame="none", options="header"]
+|===
+| Значение
+| Примеры
+
+
+|Имена команд.
+|Используйте `ls -l` для вывода списка всех файлов.
+
+|Имена файлов.
+|Измените файл [.filename]#.login#.
+
+|Вывод компьютера на экран.
+a|
+
+[source,shell]
+....
+У вас есть почта.
+....
+
+
+|Что вводит пользователь, в отличие от выводимого компьютером на экран.
+a|
+
+[source,shell]
+....
+% date +"Время: %H:%M"
+Время: 09:18
+....
+
+|Ссылки на руководства.
+|Используйте man:su[1] для смены пользователя.
+
+|Имена пользователей и групп.
+|Только `root` может это сделать.
+
+|Выделение текста.
+|Пользователь _обязан_ сделать это.
+
+|Текст, который пользователь должен заменить на фактический текст.
+|Для поиска ключевого слова в руководствах введите `man -k _ключевое_слово_`
+
+|Переменные окружения.
+|`$HOME` устанавливается в домашний каталог пользователя.
+|===
+
+[[preface-notes]]
+== Примечания, Советы, Важная информация, Предупреждения и Примеры
+
+Заметки, предупреждения и примеры выделены в тексте.
+
+[NOTE]
+====
+Заметки представлены следующим образом и содержат информацию, на которую следует обратить внимание, так как она может повлиять на действия пользователя.
+====
+
+[TIP]
+====
+
+Советы представлены таким образом и содержат полезную для пользователя информацию, например, показывая более простой способ выполнения чего-либо.
+====
+
+[IMPORTANT]
+====
+Важная информация представлена таким образом. Обычно это дополнительные шаги, которые может потребоваться выполнить пользователю.
+====
+
+[WARNING]
+====
+
+Предупреждения выглядят так и содержат информацию о возможном ущербе, если инструкции не будут соблюдены. Этот ущерб может быть физическим — для оборудования или пользователя — или нефизическим, например, случайным удалением важных файлов.
+====
+
+.Пример примера
+[example]
+====
+Примеры представлены следующим образом и обычно содержат пошаговые инструкции или результаты выполнения определённых действий.
+====
+
+[[preface-acknowledgements]]
+== Благодарности
+
+Моя благодарность Сью Блейк, Патрику Дурусо, Джону Гамильтону, Питеру Флинну и Кристоферу Мэдену, которые нашли время прочитать ранние черновики этого документа и предоставили множество ценных замечаний и критики.
diff --git a/documentation/content/ru/books/fdp-primer/preface/_index.po b/documentation/content/ru/books/fdp-primer/preface/_index.po
new file mode 100644
index 0000000000..40f807197d
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/preface/_index.po
@@ -0,0 +1,319 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-06-01 06:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerpreface_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:1
+#, no-wrap
+msgid "Preface about the FreeBSD Documentation Project"
+msgstr "Предисловие о проекте документации FreeBSD"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:1
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:15
+#, no-wrap
+msgid "Preface"
+msgstr "Предисловие"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:49
+#, no-wrap
+msgid "Shell Prompts"
+msgstr "Приглашения командной оболочки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:53
+msgid ""
+"This table shows the default system prompt and superuser prompt. The "
+"examples use these prompts to indicate which type of user is running the "
+"example."
+msgstr ""
+"В этой таблице показаны приглашения системы по умолчанию и приглашение "
+"суперпользователя. В примерах используются эти приглашения, чтобы указать, "
+"от какого типа пользователя выполняется пример."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:58
+#, no-wrap
+msgid "User"
+msgstr "Пользователь"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:61
+#, no-wrap
+msgid "Prompt"
+msgstr "Приглашение"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:62
+#, no-wrap
+msgid "Normal user"
+msgstr "Обычный пользователь"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:64
+#, no-wrap
+msgid "%"
+msgstr "%"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:65
+#, no-wrap
+msgid "`root`"
+msgstr "`root`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:66
+#, no-wrap
+msgid "#"
+msgstr "#"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:69
+#, no-wrap
+msgid "Typographic Conventions"
+msgstr "Типографические соглашения"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:72
+msgid "This table describes the typographic conventions used in this book."
+msgstr ""
+"Эта таблица описывает типографские соглашения, используемые в этой книге."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:77
+#, no-wrap
+msgid "Meaning"
+msgstr "Значение"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:80
+#, no-wrap
+msgid "Examples"
+msgstr "Примеры"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:81
+#, no-wrap
+msgid "The names of commands."
+msgstr "Имена команд."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:83
+#, no-wrap
+msgid "Use `ls -l` to list all files."
+msgstr "Используйте `ls -l` для вывода списка всех файлов."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:84
+#, no-wrap
+msgid "The names of files."
+msgstr "Имена файлов."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:86
+#, no-wrap
+msgid "Edit [.filename]#.login#."
+msgstr "Измените файл [.filename]#.login#."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:87
+#, no-wrap
+msgid "On-screen computer output."
+msgstr "Вывод компьютера на экран."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:95
+#, no-wrap
+msgid ""
+"[source,shell]\n"
+"....\n"
+"You have mail.\n"
+"...."
+msgstr ""
+"[source,shell]\n"
+"....\n"
+"У вас есть почта.\n"
+"...."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:96
+#, no-wrap
+msgid "What the user types, contrasted with on-screen computer output."
+msgstr "Что вводит пользователь, в отличие от выводимого компьютером на экран."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:104
+#, no-wrap
+msgid ""
+"[source,shell]\n"
+"....\n"
+"% date +\"The time is %H:%M\"\n"
+"The time is 09:18\n"
+"...."
+msgstr ""
+"[source,shell]\n"
+"....\n"
+"% date +\"Время: %H:%M\"\n"
+"Время: 09:18\n"
+"...."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:105
+#, no-wrap
+msgid "Manual page references."
+msgstr "Ссылки на руководства."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:107
+#, no-wrap
+msgid "Use man:su[1] to change user identity."
+msgstr "Используйте man:su[1] для смены пользователя."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:108
+#, no-wrap
+msgid "User and group names."
+msgstr "Имена пользователей и групп."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:110
+#, no-wrap
+msgid "Only `root` can do this."
+msgstr "Только `root` может это сделать."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:111
+#, no-wrap
+msgid "Emphasis."
+msgstr "Выделение текста."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:113
+#, no-wrap
+msgid "The user _must_ do this."
+msgstr "Пользователь _обязан_ сделать это."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:114
+#, no-wrap
+msgid "Text that the user is expected to replace with the actual text."
+msgstr "Текст, который пользователь должен заменить на фактический текст."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:116
+#, no-wrap
+msgid "To search for a keyword in the manual pages, type `man -k _keyword_`"
+msgstr "Для поиска ключевого слова в руководствах введите `man -k _ключевое_слово_`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:117
+#, no-wrap
+msgid "Environment variables."
+msgstr "Переменные окружения."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:118
+#, no-wrap
+msgid "`$HOME` is set to the user's home directory."
+msgstr "`$HOME` устанавливается в домашний каталог пользователя."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:121
+#, no-wrap
+msgid "Notes, Tips, Important Information, Warnings, and Examples"
+msgstr "Примечания, Советы, Важная информация, Предупреждения и Примеры"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:124
+msgid "Notes, warnings, and examples appear within the text."
+msgstr "Заметки, предупреждения и примеры выделены в тексте."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:128
+msgid ""
+"Notes are represented like this, and contain information to take note of, as "
+"it may affect what the user does."
+msgstr ""
+"Заметки представлены следующим образом и содержат информацию, на которую "
+"следует обратить внимание, так как она может повлиять на действия "
+"пользователя."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:134
+msgid ""
+"Tips are represented like this, and contain information helpful to the user, "
+"such as showing an easier way to do something."
+msgstr ""
+"Советы представлены таким образом и содержат полезную для пользователя "
+"информацию, например, показывая более простой способ выполнения чего-либо."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:140
+msgid ""
+"Important information is represented like this. Typically, these show extra "
+"steps the user may need to take."
+msgstr ""
+"Важная информация представлена таким образом. Обычно это дополнительные "
+"шаги, которые может потребоваться выполнить пользователю."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:147
+msgid ""
+"Warnings are represented like this, and contain information warning about "
+"possible damage if the instructions are not followed. This damage may be "
+"physical, to the hardware or the user, or it may be non-physical, such as "
+"the inadvertent deletion of important files."
+msgstr ""
+"Предупреждения выглядят так и содержат информацию о возможном ущербе, если "
+"инструкции не будут соблюдены. Этот ущерб может быть физическим — для "
+"оборудования или пользователя — или нефизическим, например, случайным "
+"удалением важных файлов."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:149
+#, no-wrap
+msgid "A Sample Example"
+msgstr "Пример примера"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:153
+msgid ""
+"Examples are represented like this, and typically contain examples showing a "
+"walkthrough, or the results of a particular action."
+msgstr ""
+"Примеры представлены следующим образом и обычно содержат пошаговые "
+"инструкции или результаты выполнения определённых действий."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:156
+#, no-wrap
+msgid "Acknowledgments"
+msgstr "Благодарности"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/preface/_index.adoc:158
+msgid ""
+"My thanks to Sue Blake, Patrick Durusau, Jon Hamilton, Peter Flynn, and "
+"Christopher Maden, who took the time to read early drafts of this document "
+"and offer many valuable comments and criticisms."
+msgstr ""
+"Моя благодарность Сью Блейк, Патрику Дурусо, Джону Гамильтону, Питеру Флинну "
+"и Кристоферу Мэдену, которые нашли время прочитать ранние черновики этого "
+"документа и предоставили множество ценных замечаний и критики."
diff --git a/documentation/content/ru/books/fdp-primer/rosetta/_index.adoc b/documentation/content/ru/books/fdp-primer/rosetta/_index.adoc
new file mode 100644
index 0000000000..624f885531
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/rosetta/_index.adoc
@@ -0,0 +1,321 @@
+---
+description: 'Розеттский камень с различиями между Docbook и AsciiDoc'
+next: books/fdp-primer/translations
+params:
+ path: /books/fdp-primer/rosetta/
+prev: books/fdp-primer/asciidoctor-primer
+showBookMenu: true
+tags: ["rosetta", "docbook", "asciidoc", "comparison"]
+title: 'Глава 7. Розеттский камень'
+weight: 8
+---
+
+[[rosetta]]
+= Розеттский камень
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 7
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[docbook-vs-asciidoc]]
+== Сравнение Docbook и AsciiDoc
+
+Эта шпаргалка пытается показать различия между Docbook и AsciiDoc.
+
+.Сравнение Docbook и AsciiDoc
+[cols="1,4,4"]
+|===
+|Языковая функция |Docbook | AsciiDoc
+
+|*Жирный*
+|<strong>жирный</strong>
+|\*жирный*
+
+|*Курсив*
+|<emphasis>Курсив</emphasis>
+|\_Курсив_
+
+|*Моноширинный*
+|<literal>Моноширинный</literal>
+|\`Моноширинный`
+
+|*Абзац*
+|<para>Это абзац</para>
+|Это абзац
+
+|*Клавиша*
+|<keycap>F11</keycap>
+|\kbd:[F11]
+
+|*Ссылки*
+a|
+[source,xml]
+----
+<link xlink:href="https://www.freebsd.org/where/">
+Загрузить FreeBSD</link>
+----
+a|
+[source]
+----
+link:https://www.freebsd.org/where/[Загрузить FreeBSD]
+----
+
+|*Разделы*
+a|
+[source,xml]
+----
+ <sect1 xml:id="id">
+ <title>Раздел 1</title>
+ </sect1>
+----
+a|
+[source]
+----
+ [[id]]
+ = Раздел 1
+----
+
+|*Неупорядоченный список*
+a|
+[source,xml]
+----
+<itemizedlist>
+ <listitem>
+ <para>Когда следует собирать собственное ядро.</para>
+ </listitem>
+
+ <listitem>
+ <para>Как выполнить инвентаризацию оборудования.</para>
+ </listitem>
+</itemizedlist>
+----
+a|
+[source]
+----
+* Когда необходимо собрать собственное ядро.
+* Как выполнить инвентаризацию оборудования.
+----
+
+|*Упорядоченный список*
+a|
+[source,xml]
+----
+<orderedlist>
+ <listitem>
+ <para>Один</para>
+ </listitem>
+ <listitem>
+ <para>Два</para>
+ </listitem>
+ <listitem>
+ <para>Три</para>
+ </listitem>
+ <listitem>
+ <para>Четыре</para>
+ </listitem>
+</orderedlist>
+----
+a|
+[source]
+----
+. Один
+. Два
+. Три
+. Четыре
+----
+
+|*Словарный список (Variable list)*
+a|
+[source,xml]
+----
+<variablelist>
+ <varlistentry>
+ <term>amd64</term>
+ <listitem>
+ <para>Это наиболее распространённая десктопная...</para>
+ </listitem>
+ </varlistentry>
+</variablelist>
+----
+a|
+[source]
+----
+amd64::
+Это наиболее распространённая десктопная...
+----
+
+|*Исходный код*
+a|
+[source,xml]
+----
+<screen>
+ &prompt.root; <userinput>mkdir -p /var/spool/lpd/lp</userinput>
+</screen>
+----
+a|
+[source]
+....
+[source,shell]
+----
+# mkdir -p /var/spool/lpd/lp
+----
+....
+
+|*Неформатируемый блок*
+a|
+[source,xml]
+----
+<programlisting>
+include GENERIC
+ident MYKERNEL
+
+options IPFIREWALL
+options DUMMYNET
+options IPFIREWALL_DEFAULT_TO_ACCEPT
+options IPDIVERT
+</programlisting>
+----
+a|
+[source]
+----
+....
+include GENERIC
+ident MYKERNEL
+
+options IPFIREWALL
+options DUMMYNET
+options IPFIREWALL_DEFAULT_TO_ACCEPT
+options IPDIVERT
+....
+----
+
+|*Изображения*
+a|
+[source,xml]
+----
+<figure xml:id="bsdinstall-newboot-loader-menu">
+ <title>Меню загрузчика FreeBSD</title>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="bsdinstall/bsdinstall-newboot-loader-menu"/>
+ </imageobject>
+ <textobject>
+ </literallayout>
+ Поддержка ASCII-графики более не предоставляется.
+ </literallayout>
+ </textobject>
+ <textobject>
+ <phrase>Меню загрузчика FreeBSD с вариантами 1-6 для загрузки
+ в многопользовательском режиме, однопользовательском
+ режиме, перехода в командную строку загрузчика, перезагрузки,
+ выбора ядра для загрузки и параметров загрузки</phrase>
+ </textobject>
+ </mediaobject>
+</figure>
+----
+a|
+[source]
+----
+[[bsdinstall-newboot-loader-menu]]
+.Меню загрузчика FreeBSD
+image::bsdinstall/bsdinstall-newboot-loader-menu[Меню загрузчика FreeBSD с вариантами 1-6: загрузка многопользовательского режима, загрузка однопользовательского режима, переход в командную строку загрузчика, перезагрузка, выбор ядра для загрузки и параметров загрузки]
+----
+
+|*Включение файла*
+|не доступно
+a|
+[source]
+----
+\include::chapter.adoc[]
+----
+
+|*Таблицы*
+a|
+[source,xml]
+----
+<table xml:id="partition-schemes" frame="none" rowsep="1" pgwide="1">
+ <title>Схемы разделов</title>
+
+ <tgroup cols="2" align="left">
+ <thead>
+ <row>
+ <entry align="left">Сокращение</entry>
+ <entry align="left">Описание</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>APM</entry>
+ <entry>Карта разделов Apple, используется в PowerPC(R).</entry>
+ </row>
+ </tbody>
+ </tgroup>
+</table>
+----
+a|
+[source]
+----
+[[partition-schemes]]
+.Схемы разделов
+[cols="1,1", frame="none", options="header"]
+\|===
+\| Сокращение
+\| Описание
+
+\|APM
+\|Apple Partition Map, используется на PowerPC(R).
+
+\|===
+----
+
+|*Блоки-уведомления*
+a|
+[source,xml]
+----
+<tip>
+ <para>Это подсказка</para>
+</tip>
+----
+a|
+[source]
+----
+[ПОДСКАЗКА]
+====
+Это подсказка
+====
+----
+
+|===
diff --git a/documentation/content/ru/books/fdp-primer/rosetta/_index.po b/documentation/content/ru/books/fdp-primer/rosetta/_index.po
new file mode 100644
index 0000000000..e454294a2c
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/rosetta/_index.po
@@ -0,0 +1,793 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-06-23 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerrosetta_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:1
+#, no-wrap
+msgid "Rosetta Stone with the differences between Docbook and AsciiDoc"
+msgstr "Розеттский камень с различиями между Docbook и AsciiDoc"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:1
+#, no-wrap
+msgid "Chapter 7. Rosetta Stone"
+msgstr "Глава 7. Розеттский камень"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:14
+#, no-wrap
+msgid "Rosetta Stone"
+msgstr "Розеттский камень"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:52
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:56
+#, no-wrap
+msgid "Comparison between Docbook and AsciiDoc"
+msgstr "Сравнение Docbook и AsciiDoc"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:55
+msgid ""
+"This rosetta stone tries to show the differences between Docbook and "
+"AsciiDoc."
+msgstr "Эта шпаргалка пытается показать различия между Docbook и AsciiDoc."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:59
+#, no-wrap
+msgid "Language Feature"
+msgstr "Языковая функция"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:59
+#, no-wrap
+msgid "Docbook"
+msgstr "Docbook"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:61
+#, no-wrap
+msgid "AsciiDoc"
+msgstr "AsciiDoc"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:62
+#, no-wrap
+msgid "*Bold*"
+msgstr "*Жирный*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:63
+#, no-wrap
+msgid "<strong>bold</strong>"
+msgstr "<strong>жирный</strong>"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:65
+#, no-wrap
+msgid "\\*bold*"
+msgstr "\\*жирный*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:66
+#, no-wrap
+msgid "*Italic*"
+msgstr "*Курсив*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:67
+#, no-wrap
+msgid "<emphasis>Italic</emphasis>"
+msgstr "<emphasis>Курсив</emphasis>"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:69
+#, no-wrap
+msgid "\\_Italic_"
+msgstr "\\_Курсив_"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:70
+#, no-wrap
+msgid "*Monospace*"
+msgstr "*Моноширинный*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:71
+#, no-wrap
+msgid "<literal>Monospace</literal>"
+msgstr "<literal>Моноширинный</literal>"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:73
+#, no-wrap
+msgid "\\`Monospace`"
+msgstr "\\`Моноширинный`"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:74
+#, no-wrap
+msgid "*Paragraph*"
+msgstr "*Абзац*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:75
+#, no-wrap
+msgid "<para>This is a paragraph</para>"
+msgstr "<para>Это абзац</para>"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:77
+#, no-wrap
+msgid "This is a paragraph"
+msgstr "Это абзац"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:78
+#, no-wrap
+msgid "*Keycap*"
+msgstr "*Клавиша*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:79
+#, no-wrap
+msgid "<keycap>F11</keycap>"
+msgstr "<keycap>F11</keycap>"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:81
+#, no-wrap
+msgid "\\kbd:[F11]"
+msgstr "\\kbd:[F11]"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:82
+#, no-wrap
+msgid "*Links*"
+msgstr "*Ссылки*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:87
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+"<link xlink:href=\"https://www.freebsd.org/where/\">Download FreeBSD</link>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+"<link xlink:href=\"https://www.freebsd.org/where/\">\n"
+"Загрузить FreeBSD</link>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:93
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+"link:https://www.freebsd.org/where/[Download FreeBSD]\n"
+"----"
+msgstr ""
+"[source]\n"
+"----\n"
+"link:https://www.freebsd.org/where/[Загрузить FreeBSD]\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:94
+#, no-wrap
+msgid "*Sections*"
+msgstr "*Разделы*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:101
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+" <sect1 xml:id=\"id\">\n"
+" <title>Section 1</title>\n"
+" </sect1>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+" <sect1 xml:id=\"id\">\n"
+" <title>Раздел 1</title>\n"
+" </sect1>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:108
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+" [[id]]\n"
+" = Section 1\n"
+"----"
+msgstr ""
+"[source]\n"
+"----\n"
+" [[id]]\n"
+" = Раздел 1\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:109
+#, no-wrap
+msgid "*Unordered list*"
+msgstr "*Неупорядоченный список*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:122
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+"<itemizedlist>\n"
+" <listitem>\n"
+" <para>When to build a custom kernel.</para>\n"
+" </listitem>\n"
+"\n"
+" <listitem>\n"
+" <para>How to take a hardware inventory.</para>\n"
+" </listitem>\n"
+"</itemizedlist>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+"<itemizedlist>\n"
+" <listitem>\n"
+" <para>Когда следует собирать собственное ядро.</para>\n"
+" </listitem>\n"
+"\n"
+" <listitem>\n"
+" <para>Как выполнить инвентаризацию оборудования.</para>\n"
+" </listitem>\n"
+"</itemizedlist>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:129
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+"* When to build a custom kernel.\n"
+"* How to take a hardware inventory.\n"
+"----"
+msgstr ""
+"[source]\n"
+"----\n"
+"* Когда необходимо собрать собственное ядро.\n"
+"* Как выполнить инвентаризацию оборудования.\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:130
+#, no-wrap
+msgid "*Ordered list*"
+msgstr "*Упорядоченный список*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:148
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+"<orderedlist>\n"
+" <listitem>\n"
+" <para>One</para>\n"
+" </listitem>\n"
+" <listitem>\n"
+" <para>Two</para>\n"
+" </listitem>\n"
+" <listitem>\n"
+" <para>Three</para>\n"
+" </listitem>\n"
+" <listitem>\n"
+" <para>Four</para>\n"
+" </listitem>\n"
+"</orderedlist>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+"<orderedlist>\n"
+" <listitem>\n"
+" <para>Один</para>\n"
+" </listitem>\n"
+" <listitem>\n"
+" <para>Два</para>\n"
+" </listitem>\n"
+" <listitem>\n"
+" <para>Три</para>\n"
+" </listitem>\n"
+" <listitem>\n"
+" <para>Четыре</para>\n"
+" </listitem>\n"
+"</orderedlist>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:157
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+". One\n"
+". Two\n"
+". Three\n"
+". Four\n"
+"----"
+msgstr ""
+"[source]\n"
+"----\n"
+". Один\n"
+". Два\n"
+". Три\n"
+". Четыре\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:158
+#, no-wrap
+msgid "*Variable list*"
+msgstr "*Словарный список (Variable list)*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:170
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+"<variablelist>\n"
+" <varlistentry>\n"
+" <term>amd64</term>\n"
+" <listitem>\n"
+" <para>This is the most common desktop...</para>\n"
+" </listitem>\n"
+" </varlistentry>\n"
+"</variablelist>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+"<variablelist>\n"
+" <varlistentry>\n"
+" <term>amd64</term>\n"
+" <listitem>\n"
+" <para>Это наиболее распространённая десктопная...</para>\n"
+" </listitem>\n"
+" </varlistentry>\n"
+"</variablelist>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:177
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+"amd64::\n"
+"This is the most common desktop...\n"
+"----"
+msgstr ""
+"[source]\n"
+"----\n"
+"amd64::\n"
+"Это наиболее распространённая десктопная...\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:178
+#, no-wrap
+msgid "*Source code*"
+msgstr "*Исходный код*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:185
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+"<screen>\n"
+" &prompt.root; <userinput>mkdir -p /var/spool/lpd/lp</userinput>\n"
+"</screen>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+"<screen>\n"
+" &prompt.root; <userinput>mkdir -p /var/spool/lpd/lp</userinput>\n"
+"</screen>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:194
+#, no-wrap
+msgid ""
+"[source]\n"
+"....\n"
+"[source,shell]\n"
+"----\n"
+"# mkdir -p /var/spool/lpd/lp\n"
+"----\n"
+"...."
+msgstr ""
+"[source]\n"
+"....\n"
+"[source,shell]\n"
+"----\n"
+"# mkdir -p /var/spool/lpd/lp\n"
+"----\n"
+"...."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:195
+#, no-wrap
+msgid "*Literal block*"
+msgstr "*Неформатируемый блок*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:208
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+"<programlisting>\n"
+"include GENERIC\n"
+"ident MYKERNEL\n"
+"\n"
+"options IPFIREWALL\n"
+"options DUMMYNET\n"
+"options IPFIREWALL_DEFAULT_TO_ACCEPT\n"
+"options IPDIVERT\n"
+"</programlisting>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+"<programlisting>\n"
+"include GENERIC\n"
+"ident MYKERNEL\n"
+"\n"
+"options IPFIREWALL\n"
+"options DUMMYNET\n"
+"options IPFIREWALL_DEFAULT_TO_ACCEPT\n"
+"options IPDIVERT\n"
+"</programlisting>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:222
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+"....\n"
+"include GENERIC\n"
+"ident MYKERNEL\n"
+"\n"
+"options IPFIREWALL\n"
+"options DUMMYNET\n"
+"options IPFIREWALL_DEFAULT_TO_ACCEPT\n"
+"options IPDIVERT\n"
+"....\n"
+"----"
+msgstr ""
+"[source]\n"
+"----\n"
+"....\n"
+"include GENERIC\n"
+"ident MYKERNEL\n"
+"\n"
+"options IPFIREWALL\n"
+"options DUMMYNET\n"
+"options IPFIREWALL_DEFAULT_TO_ACCEPT\n"
+"options IPDIVERT\n"
+"....\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:223
+#, no-wrap
+msgid "*Images*"
+msgstr "*Изображения*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:244
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+"<figure xml:id=\"bsdinstall-newboot-loader-menu\">\n"
+" <title>FreeBSD Boot Loader Menu</title>\n"
+"\n"
+" <mediaobject>\n"
+" <imageobject>\n"
+" <imagedata fileref=\"bsdinstall/bsdinstall-newboot-loader-menu\"/>\n"
+" </imageobject>\n"
+" <textobject>\n"
+" </literallayout>ASCII art replacement is no longer supported.</literallayout>\n"
+" </textobject>\n"
+" <textobject>\n"
+" <phrase>The FreeBSD loader menu, with options 1-6 to boot\n"
+" multi-user, boot single user, escape to loader prompt, reboot,\n"
+" select a kernel to load, and select boot options</phrase>\n"
+" </textobject>\n"
+" </mediaobject>\n"
+"</figure>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+"<figure xml:id=\"bsdinstall-newboot-loader-menu\">\n"
+" <title>Меню загрузчика FreeBSD</title>\n"
+"\n"
+" <mediaobject>\n"
+" <imageobject>\n"
+" <imagedata fileref=\"bsdinstall/bsdinstall-newboot-loader-menu\"/>\n"
+" </imageobject>\n"
+" <textobject>\n"
+" </literallayout>\n"
+" Поддержка ASCII-графики более не предоставляется.\n"
+" </literallayout>\n"
+" </textobject>\n"
+" <textobject>\n"
+" <phrase>Меню загрузчика FreeBSD с вариантами 1-6 для загрузки\n"
+" в многопользовательском режиме, однопользовательском\n"
+" режиме, перехода в командную строку загрузчика, перезагрузки,\n"
+" выбора ядра для загрузки и параметров загрузки</phrase>\n"
+" </textobject>\n"
+" </mediaobject>\n"
+"</figure>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:252
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+"[[bsdinstall-newboot-loader-menu]]\n"
+".FreeBSD Boot Loader Menu\n"
+"image::bsdinstall/bsdinstall-newboot-loader-menu[The FreeBSD loader menu, with options 1-6 to boot multi-user, boot single user, escape to loader prompt, reboot, select a kernel to load, and select boot options]\n"
+"----"
+msgstr ""
+"[source]\n"
+"----\n"
+"[[bsdinstall-newboot-loader-menu]]\n"
+".Меню загрузчика FreeBSD\n"
+"image::bsdinstall/bsdinstall-newboot-loader-menu[Меню загрузчика FreeBSD с вариантами 1-6: загрузка многопользовательского режима, загрузка однопользовательского режима, переход в командную строку загрузчика, перезагрузка, выбор ядра для загрузки и параметров загрузки]\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:253
+#, no-wrap
+msgid "*Includes*"
+msgstr "*Включение файла*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:254
+#, no-wrap
+msgid "n/a"
+msgstr "не доступно"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:260
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+"\\include::chapter.adoc[]\n"
+"----"
+msgstr ""
+"[source]\n"
+"----\n"
+"\\include::chapter.adoc[]\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:261
+#, no-wrap
+msgid "*Tables*"
+msgstr "*Таблицы*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:284
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+"<table xml:id=\"partition-schemes\" frame=\"none\" rowsep=\"1\" pgwide=\"1\">\n"
+" <title>Partitioning Schemes</title>\n"
+"\n"
+" <tgroup cols=\"2\" align=\"left\">\n"
+" <thead>\n"
+" <row>\n"
+" <entry align=\"left\">Abbreviation</entry>\n"
+" <entry align=\"left\">Description</entry>\n"
+" </row>\n"
+" </thead>\n"
+"\n"
+" <tbody>\n"
+" <row>\n"
+" <entry>APM</entry>\n"
+" <entry>Apple Partition Map, used by PowerPC(R).</entry>\n"
+" </row>\n"
+" </tbody>\n"
+" </tgroup>\n"
+"</table>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+"<table xml:id=\"partition-schemes\" frame=\"none\" rowsep=\"1\" pgwide=\"1\">\n"
+" <title>Схемы разделов</title>\n"
+"\n"
+" <tgroup cols=\"2\" align=\"left\">\n"
+" <thead>\n"
+" <row>\n"
+" <entry align=\"left\">Сокращение</entry>\n"
+" <entry align=\"left\">Описание</entry>\n"
+" </row>\n"
+" </thead>\n"
+"\n"
+" <tbody>\n"
+" <row>\n"
+" <entry>APM</entry>\n"
+" <entry>Карта разделов Apple, используется в PowerPC(R).</entry>\n"
+" </row>\n"
+" </tbody>\n"
+" </tgroup>\n"
+"</table>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:290
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+"[[partition-schemes]]\n"
+".Partitioning Schemes\n"
+"[cols=\"1,1\", frame=\"none\", options=\"header\"]\n"
+"\\"
+msgstr ""
+"[source]\n"
+"----\n"
+"[[partition-schemes]]\n"
+".Схемы разделов\n"
+"[cols=\"1,1\", frame=\"none\", options=\"header\"]\n"
+"\\"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:291
+#, no-wrap
+msgid ""
+"===\n"
+"\\"
+msgstr ""
+"===\n"
+"\\"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:292
+#, no-wrap
+msgid ""
+"Abbreviation\n"
+"\\"
+msgstr ""
+"Сокращение\n"
+"\\"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:294
+#, no-wrap
+msgid ""
+"Description\n"
+"\n"
+"\\"
+msgstr ""
+"Описание\n"
+"\n"
+"\\"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:295
+#, no-wrap
+msgid ""
+"APM\n"
+"\\"
+msgstr ""
+"APM\n"
+"\\"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:297
+#, no-wrap
+msgid ""
+"Apple Partition Map, used by PowerPC(R).\n"
+"\n"
+"\\"
+msgstr ""
+"Apple Partition Map, используется на PowerPC(R).\n"
+"\n"
+"\\"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:300
+#, no-wrap
+msgid ""
+"===\n"
+"----"
+msgstr ""
+"===\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:301
+#, no-wrap
+msgid "*Admonitions*"
+msgstr "*Блоки-уведомления*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:308
+#, no-wrap
+msgid ""
+"[source,xml]\n"
+"----\n"
+"<tip>\n"
+" <para>This is a tip</para>\n"
+"</tip>\n"
+"----"
+msgstr ""
+"[source,xml]\n"
+"----\n"
+"<tip>\n"
+" <para>Это подсказка</para>\n"
+"</tip>\n"
+"----"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/rosetta/_index.adoc:317
+#, no-wrap
+msgid ""
+"[source]\n"
+"----\n"
+"[TIP]\n"
+"====\n"
+"This is a tip\n"
+"====\n"
+"----"
+msgstr ""
+"[source]\n"
+"----\n"
+"[ПОДСКАЗКА]\n"
+"====\n"
+"Это подсказка\n"
+"====\n"
+"----"
diff --git a/documentation/content/ru/books/fdp-primer/see-also/_index.adoc b/documentation/content/ru/books/fdp-primer/see-also/_index.adoc
new file mode 100644
index 0000000000..b3a4f8dc1a
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/see-also/_index.adoc
@@ -0,0 +1,77 @@
+---
+description: 'Дополнительная информация о проекте документации FreeBSD'
+next: books/fdp-primer/examples
+params:
+ path: /books/fdp-primer/see-also/
+prev: books/fdp-primer/trademarks/
+showBookMenu: true
+tags: ["additional information", "AsciiDoctor", "HTML"]
+title: 'Глава 15. Смотрите также'
+weight: 15
+---
+
+[[see-also]]
+= Смотрите также
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 15
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Этот документ намеренно не является исчерпывающим обсуждением AsciiDoc и проекта документации FreeBSD. Для получения дополнительной информации о них рекомендуется посетить следующие веб-сайты.
+
+[[see-also-fdp]]
+== Проект документации FreeBSD
+
+* link:https://www.FreeBSD.org/docproj/[Веб-страницы проекта документации FreeBSD]
+* extref:{handbook}[Руководство по FreeBSD]
+
+[[see-also-hugo]]
+== Hugo
+
+* link:https://gohugo.io/[Hugo]
+* link:https://gohugo.io/documentation/[Документация Hugo]
+
+[[see-also-asciidoc]]
+== AsciiDoctor
+
+* link:https://asciidoctor.org/[AsciiDoctor]
+* link:https://docs.asciidoctor.org/[Документационный портал AsciiDoctor]
+
+[[see-also-html]]
+== HTML
+
+* link:http://www.w3.org/[Консорциум Всемирной паутины]
+* link:https://dev.w3.org/html5/spec-LC/[Спецификация HTML 5]
+* link:https://www.w3.org/Style/CSS/specs.en.html[Спецификация CSS]
+* link:https://sass-lang.com/[Sass]
diff --git a/documentation/content/ru/books/fdp-primer/see-also/_index.po b/documentation/content/ru/books/fdp-primer/see-also/_index.po
new file mode 100644
index 0000000000..9e208201ad
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/see-also/_index.po
@@ -0,0 +1,127 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-06-01 18:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primersee-also_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:1
+#, no-wrap
+msgid "More information about the FreeBSD Documentation Project"
+msgstr "Дополнительная информация о проекте документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:1
+#, no-wrap
+msgid "Chapter 15. See Also"
+msgstr "Глава 15. Смотрите также"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:14
+#, no-wrap
+msgid "See Also"
+msgstr "Смотрите также"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:53
+msgid ""
+"This document is deliberately not an exhaustive discussion of AsciiDoc and "
+"the FreeBSD Documentation Project. For more information about these, you "
+"are encouraged to see the following web sites."
+msgstr ""
+"Этот документ намеренно не является исчерпывающим обсуждением AsciiDoc и "
+"проекта документации FreeBSD. Для получения дополнительной информации о них "
+"рекомендуется посетить следующие веб-сайты."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:55
+#, no-wrap
+msgid "The FreeBSD Documentation Project"
+msgstr "Проект документации FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:58
+msgid ""
+"link:https://www.FreeBSD.org/docproj/[The FreeBSD Documentation Project web "
+"pages]"
+msgstr ""
+"link:https://www.FreeBSD.org/docproj/[Веб-страницы проекта документации "
+"FreeBSD]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:59
+msgid "extref:{handbook}[The FreeBSD Handbook]"
+msgstr "extref:{handbook}[Руководство по FreeBSD]"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:61
+#, no-wrap
+msgid "Hugo"
+msgstr "Hugo"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:64
+msgid "link:https://gohugo.io/[Hugo]"
+msgstr "link:https://gohugo.io/[Hugo]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:65
+msgid "link:https://gohugo.io/documentation/[Hugo documentation]"
+msgstr "link:https://gohugo.io/documentation/[Документация Hugo]"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:67
+#, no-wrap
+msgid "AsciiDoctor"
+msgstr "AsciiDoctor"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:70
+msgid "link:https://asciidoctor.org/[AsciiDoctor]"
+msgstr "link:https://asciidoctor.org/[AsciiDoctor]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:71
+msgid "link:https://docs.asciidoctor.org/[AsciiDoctor Documentation Portal]"
+msgstr ""
+"link:https://docs.asciidoctor.org/[Документационный портал AsciiDoctor]"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:73
+#, no-wrap
+msgid "HTML"
+msgstr "HTML"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:76
+msgid "link:http://www.w3.org/[The World Wide Web Consortium]"
+msgstr "link:http://www.w3.org/[Консорциум Всемирной паутины]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:77
+msgid "link:https://dev.w3.org/html5/spec-LC/[The HTML 5 specification]"
+msgstr "link:https://dev.w3.org/html5/spec-LC/[Спецификация HTML 5]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:78
+msgid "link:https://www.w3.org/Style/CSS/specs.en.html[CSS specification]"
+msgstr "link:https://www.w3.org/Style/CSS/specs.en.html[Спецификация CSS]"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/see-also/_index.adoc:78
+msgid "link:https://sass-lang.com/[Sass]"
+msgstr "link:https://sass-lang.com/[Sass]"
diff --git a/documentation/content/ru/books/fdp-primer/structure/_index.adoc b/documentation/content/ru/books/fdp-primer/structure/_index.adoc
new file mode 100644
index 0000000000..a89d627650
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/structure/_index.adoc
@@ -0,0 +1,386 @@
+---
+description: 'Структура каталогов документации, используемая в проекте документации FreeBSD'
+next: books/fdp-primer/doc-build
+params:
+ path: /books/fdp-primer/structure/
+prev: books/fdp-primer/working-copy
+showBookMenu: true
+tags: ["directory structure", "organization"]
+title: 'Глава 4. Структура каталогов документации'
+weight: 5
+---
+
+[[structure]]
+= Структура каталогов документации
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 4
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Файлы и каталоги в дереве *doc/* следуют структуре, преследующей цели:
+
+. Сделать удобным автоматическое преобразование документа в другие форматы.
+. Способствовать согласованности между различными организациями, занимающимися документацией, чтобы упростить переход между работой над разными документами.
+. Сделать удобным выбор места в дереве для размещения новой документации.
+
+В дополнение, дерево документации должно поддерживать документы на многих разных языках. Важно, чтобы структура дерева документации не навязывала каких-либо конкретных настроек по умолчанию или культурных предпочтений.
+
+[[structure-top]]
+== Верхний уровень, doc/
+
+В разделе *doc/* есть три подраздела, документация и веб-сайт имеют одинаковую структуру.
+
+[cols="20%,80%", frame="none", options="header"]
+|===
+| Каталог
+| Использование
+
+| *documentation*
+| Содержит все статьи и книги в формате AsciiDoc.
+Содержит подкаталоги для дальнейшей категоризации информации по языкам.
+
+| *tools*
+| Содержит набор инструментов для перевода документации и веб-сайта с использованием link:https://weblate.org/en/[Weblate].
+Экземпляр Weblate доступен link:https://translate-dev.freebsd.org[здесь].
+
+| *shared*
+| Содержит файлы, не относящиеся к различным переводам документации.
+Включает подкаталоги для дальнейшей категоризации информации по языкам, а также три файла для хранения данных об авторах, выпусках и зеркалах.
+Этот каталог является общим для `documentation` и `website`.
+
+| * website*
+| Содержит ссылку link:https://www.FreeBSD.org[FreeBSD website] в формате AsciiDoc.
+Содержит подкаталоги для дальнейшей категоризации информации по языкам.
+|===
+
+[[structure-locale]]
+== Каталоги
+
+Эти каталоги содержат документацию и веб-сайт. Документация организована в подкаталоги ниже этого уровня, следуя структуре каталогов link:https://gohugo.io/getting-started/directory-structure/[Hugo].
+
+[cols="20%,80%", frame="none", options="header"]
+|===
+| Каталог
+| Использование
+
+
+| * archetypes*
+| Содержит шаблоны для создания новых статей, книг и веб-страниц.
+Дополнительную информацию смотрите link:https://gohugo.io/content-management/archetypes/[здесь].
+
+| *config*
+| Содержат файлы конфигурации Hugo.
+Один основной файл и по одному файлу для каждого языка.
+Для получения дополнительной информации смотрите link:https://gohugo.io/getting-started/configuration/[здесь].
+
+| *content*
+| Содержат книги, статьи и веб-страницы.
+Для каждого доступного перевода документации существует отдельный каталог, например `en` и `zh-tw`.
+
+| *data*
+| Содержит пользовательские данные для сборки веб-сайта в формате link:https://en.wikipedia.org/wiki/TOML[TOML].
+Этот каталог используется для хранения событий, новостей, пресс-релизов и т.д.
+Для получения дополнительной информации ознакомьтесь link:https://gohugo.io/templates/data-templates/[здесь].
+
+| *static*
+| Содержат статические ресурсы.
+Изображения, бюллетени безопасности, pgpkeys и т.д.
+Подробнее смотрите link:https://gohugo.io/content-management/static-files/[здесь].
+
+| * themes*
+| Содержите шаблоны в виде файлов `.html`, которые определяют внешний вид веб-сайта.
+Для получения дополнительной информации посмотрите link:https://gohugo.io/templates/[здесь].
+
+| *tools*
+| Содержит инструменты, используемые для улучшения сборки документации.
+Например, для генерации оглавления книг и т.д.
+
+| *beastie.png*
+| Это изображение не нуждается в представлении ;)
+
+| *LICENSE*
+| Лицензия документации, общих материалов и веб-сайта. Лицензия BSD с 2 пунктами.
+
+| *Makefile*
+| Файл *Makefile* определяет процесс сборки документации и веб-сайта.
+|===
+
+[[structure-document]]
+== Информация, относящаяся к документу
+
+Этот раздел содержит особые примечания о конкретных документах, которыми управляет FDP.
+
+[[structure-document-books]]
+== Книги: books/
+
+Книги написаны в AsciiDoc.
+
+Для каждой книги FreeBSD тип документа AsciiDoc (также известный как doctype) — это `book` (книга). Книги содержат ``part`` (части), каждая из которых включает несколько ``chapter`` (глав).
+
+Когда документ преобразуется в HTML 5 (с использованием встроенного бэкенда `html5`):
+
+* Уровень раздела AsciiDoc 0 (`=`) в начале `главы` `книги` будет `<h1>`
+* Уровень секции AsciiDoc 1 (`==`) должен использоваться для первого логического раздела главы и будет преобразован в `<h2>`
+* Уровень раздела AsciiDoc 2 (`===`) должен использоваться для первого логического подраздела и будет преобразован в `<h3>`
+
+– и так далее. Ссылка: link:https://docs.asciidoctor.org/asciidoc/latest/sections/titles-and-levels/[Заголовки и уровни разделов | Документация Asciidoctor].
+
+[[structure-document-books-physical]]
+=== Физическая организация
+
+В каталоге books находится множество файлов и директорий, все с одинаковой структурой.
+
+[[structure-document-books-physical-index]]
+==== _index.adoc
+
+Файл *_index.adoc* определяет некоторые переменные AsciiDoc, которые влияют на преобразование исходного кода AsciiDoc в другие форматы, а также содержит оглавление, список примеров, список рисунков, список таблиц и раздел с аннотацией.
+
+[[structure-document-books-physical-book]]
+==== book.adoc
+
+Файл *book.adoc* определяет некоторые переменные AsciiDoc, которые влияют на преобразование исходного кода AsciiDoc в другие форматы, а также включает оглавление, список примеров, список рисунков, список таблиц, раздел с аннотацией и все главы. Этот файл используется для генерации PDF с помощью `asciidoctor-pdf` и для создания книги в виде одной страницы `html`.
+
+[[structure-document-books-physical-part]]
+==== part*.adoc
+Файлы **part*.adoc** содержат краткое введение к одной части книги.
+
+[[structure-document-handbook-physical-chapters]]
+==== directory/_index.adoc
+
+Каждая глава Руководства хранится в файле с именем *_index.adoc* в отдельном каталоге от других глав.
+
+Например, вот пример заголовка одной главы:
+
+[source.programlisting, asciidoc]
+....
+---
+title: Chapter 8. Configuring the FreeBSD Kernel
+part: Part II. Common Tasks
+prev: books/handbook/multimedia
+next: books/handbook/printing
+---
+
+[[kernelconfig]]
+= Настройка ядра FreeBSD
+...
+....
+
+При создании HTML5-версии Handbook это приведёт к формированию файла *kernelconfig/index.html*.
+
+Быстрый взгляд покажет, что существует множество каталогов с отдельными файлами *_index.adoc*, включая *basics/_index.adoc*, *introduction/_index.adoc* и *printing/_index.adoc*.
+
+[IMPORTANT]
+====
+Не называйте главы или каталоги в соответствии с их порядком в Руководстве. Этот порядок может измениться при реорганизации содержания Руководства. Реорганизация должна быть возможной без переименования файлов, за исключением случаев, когда целые главы перемещаются вверх или вниз по иерархии.
+====
+
+[[structure-document-articles]]
+== Статьи: articles/
+
+Статьи написаны в AsciiDoc.
+
+Статьи организованы как документ AsciiDoc `article`. Статьи разделены на разделы (`=`), подразделы (`==`, `===`) и так далее.
+
+[[structure-document-articles-physical]]
+=== Физическая организация
+
+На каждый статью приходится один файл *_index.adoc*.
+
+[[structure-document-articles-physical-index]]
+==== _index.adoc
+
+Файл *_index.adoc* содержит все переменные AsciiDoc и контент.
+
+Например, это образец одной статьи, структура довольно похожа на главу книги:
+
+[source.programlisting, asciidoc]
+....
+---
+title: Why you should use a BSD style license for your Open Source Project
+authors:
+ - author: Bruce Montague
+ email: brucem@alumni.cse.ucsc.edu
+trademarks: ["freebsd", "intel", "general"]
+---
+
+= Почему вы должны использовать лицензию в стиле BSD для вашего Open Source проекта
+:doctype: article :toc: macro :toclevels: 1 :icons: font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental:
+
+'''
+
+toc::[]
+
+[[intro]]
+== Введение
+....
+
+== Управление списками участников
+
+Проект FreeBSD отмечает вклад участников в нескольких различных списках в документации и печатных материалах. В этом разделе описано, как команда документации управляет изменениями в этих списках.
+
+=== Списки отношений наставника и нового коммиттера
+
+Начиная с FreeBSD 7.0, FreeBSD поддерживает link:https://cgit.freebsd.org/src/tree/share/misc[три списка отношений наставник/подопечный] — один для исходного кода, один для портов и один для документации. Эти файлы имеют формат *«.dot»* и предназначены для использования с популярным пакетом для построения графиков graphics/graphviz[], доступным как пакет или порт FreeBSD.
+
+[NOTE]
+====
+man:dot[1] устанавливается как часть пакета или порта: graphics/graphviz[]. Программа [.filename]#dot# читает файлы в формате *".dot"* и создает графическое изображение направленного графа.
+====
+
+Три файла часто служат учебным опытом для новых коммиттеров всех трёх команд, которым поручается добавить себя и своего наставника в соответствующий файл в качестве их первого коммита. Каждый файл содержит раздел «current» для новых коммиттеров, раздел «alumni» для случаев возврата прав на коммит и раздел «mentor / mentee», отображающий взаимоотношения. Формат каждой записи поясняется в начале файла.
+
+=== Общий список участников
+
+extref:{contributors}[Участники] проекта FreeBSD поддерживаются в формате статьи. Исходный файл для управления статьёй *Участники* находится по адресу:
+
+[subs=+quotes]
+----
+doc
+ /documentation
+ /content
+ /{language}
+ /articles
+ /contributors
+ [.filename]#_index.adoc# – Contains a list of include files that apply to each section.
+ [.filename]#_index.po# – Translation page
+ [.filename]#contrib-develinmemoriam.adoc# - content of “In Memoriam” section
+ [.filename]#contrib-develinmemoriam.po# – Translation page
+----
+
+Копии этого каталога contributors могут существовать в других каталогах с контентом на различных языках.
+
+Обратите внимание, что файл [.filename]#contrib-develinmemoriam.adoc# также находится в этом каталоге. Дополнительную информацию смотрите ниже.
+
+Файл [.filename]#contributors/_index.adoc# представляет собой набор включаемых файлов. Включаемые файлы перечислены в разделе, специфичном для Hugo, в исходном файле. Раздел разделён на несколько частей с помощью операторов "ifdef::". Существует подраздел для вывода на веб-сайт и подраздел для вывода вне веб-сайта (включая PDF).
+
+Текст каждого раздела страницы *Участники* содержит оператор "include::". Например, запись для "Экс-участники менеджера портов" выглядит как `include::{include-contrib-portmgralumni}[]`. Это подключает текст об экс-участниках менеджера портов в итоговый вывод.
+
+Чтобы внести изменения, отредактируйте соответствующий include-файл:
+
+[subs=+quotes]
+----
+include-contrib-committers: [.filename]#~/doc/shared/contrib-committers.adoc#
+include-contrib-corealumni: [.filename]#~/doc/shared/contrib-corealumni.adoc#
+include-contrib-develalumni: [.filename]#~/doc/shared/contrib-develalumni.adoc#
+include-contrib-portmgralumni: [.filename]#~/doc/shared/contrib-portmgralumni.adoc#
+include-contrib-additional: [.filename]#~/doc/shared/contrib-additional.adoc#
+include-contrib-386bsd: [.filename]#~/doc/shared/contrib-386bsd.adoc#
+
+Также отредактируйте файл [.filename]#authors.adoc#: [.filename]#~/doc/shared/authors.adoc#
+и все связанные с ним переводы.
+
+----
+
+В общем случае, если добавляется новый человек, требуется лишь одно изменение — его можно добавить в соответствующий включаемый файл. Если человек переводится из статуса «текущий» в «бывший», необходимо два изменения: одно для удаления и одно для добавления в соответствующие файлы. Порядок записей для всех файлов указан в таблице ниже.
+
+[cols="25%,25%,25%,25%", frame="none", options="header"]
+|===
+| Назначение | Якорь раздела | Файл в ~/doc/shared/ | Спецификация порядка
+| *Разработчики FreeBSD* | include-contrib-committers | [.filename]#contrib-committers.adoc# | упорядочено по алфавиту по фамилии
+| *Бывшие члены основной команды* | include-contrib-corealumni | [.filename]#contrib-corealumni.adoc# | приблизительно в обратном хронологическом порядке
+| *Бывшие члены команды разработчиков* | include-contrib-develalumni | [.filename]#contrib-develalumni.adoc# | приблизительно в обратном хронологическом порядке
+| *Бывшие члены команды управления портами* | include::contrib-portmgralumni | [.filename]#contrib-portmgralumni.adoc# | приблизительно в обратном хронологическом порядке
+| *Дополнительные участники проекта FreeBSD* | include-contrib-additional | [.filename]#contrib-additional.adoc# | упорядочено по алфавиту по имени
+| *Участники, предоставившие патчи для 386BSD Patch Kit* | include-contrib-386bsd | [.filename]#contrib-386bsd.adoc# | упорядочено по алфавиту по имени
+| *Участники проекта центрального сервера* | Файл include не используется | [.filename]#contributors/_index.adoc# | неупорядоченное
+| *Прямое финансирование* | Файл include не используется | [.filename]#contributors/_index.adoc# | неупорядоченное
+| *Участники, предоставившие оборудование* | Файл include не используется | [.filename]#contributors/_index.adoc# | неупорядоченное
+| *Особые участники* | Файл include не используется | [.filename]#contributors/_index.adoc# | неупорядоченное
+|===
+
+=== Раздел "Памяти"
+
+Когда уведомляют сообщество BSD о смерти члена сообщества, следует использовать следующую процедуру:
+
+. Используйте файл [.filename]#~/doc/shared/authors.adoc# для поиска имени человека и ссылки на атрибут, например `{foobsd}`.
+. Если они являются текущим членом одной или нескольких команд проекта FreeBSD в [.filename]#~/doc/website/content/en/administration.adoc#, удалите все упоминания их атрибута. Также выполните следующие правки:
++
+* [.filename]#~/doc/shared/contrib-committers.adoc# - Удалите ссылку на атрибут.
+* [.filename]#~/doc/shared/contrib-corealumni.adoc# - Если они являются _действующим_ членом основной команды, создайте запись с указанием дат начала и окончания.
+* [.filename]#~/doc/shared/contrib-develalumni.adoc# - Добавьте ссылку на атрибут и даты активности в качестве коммиттера.
+* [.filename]#~/doc/shared/contrib-portmgralumni.adoc# - Добавьте ссылку на атрибут при необходимости.
+* [.filename]#~/doc/shared/contrib-additional.adoc# — Удалите запись.
+* [.filename]#~/doc/shared/contrib-386bsd.adoc# - Это исключительно исторический документ. Изменения не требуются.
++
+. В файле [.filename]#~/doc/shared/authors.adoc# закомментируйте (используя одну обратную косую черту '\') адрес электронной почты, чтобы избежать создания ссылки "mailto:". См. пример для `itojun` ниже:
++
+[source.programlisting, asciidoc]
+....
+[shared/authors.adoc]
+
+[..]
+
+:itojun-name: Jun-ichiro Itoh
+:itojun-email: \itojun@FreeBSD.org
+:itojun: {itojun-name} <{itojun-email}>
+
+[..]
+....
++
+. Поскольку участник скончался (что следует перепроверить), добавьте его в файл [.filename]#contrib-develinmemoriam.adoc# "Памяти ушедших".
++
+Постарайтесь найти информацию, подкрепленную фактами, о его вкладе в FreeBSD за прошедшие годы и добавьте её к записи в файле. Для этого может потребоваться запрос в списках рассылки разработчиков, обращение к коллегам, связь с FreeBSD Foundation или поиск в журналах коммитов.
++
+Чтобы узнать дату их первого коммита, используйте:
++
+[source.programlisting, asciidoc]
+....
+% cd ~/src
+% git log --reverse --author=foobsd # search for first commit of foobsd
+....
++
+Это выведет их коммиты в обратном порядке. Дата первого коммита будет вверху.
++
+Убедитесь, что формат дат соответствует другим записям:
++
+[source.programlisting, asciidoc]
+....
+(год начала предоставления права коммита - год окончания предоставления права коммита; RIP год ухода)
+
+Например:
+
+* Foo BSD (2007 - 2010; RIP 2016)
+....
++
+Проверьте порядок записей в файле.
++
+[cols="25%,25%,25%,25%", frame="none", options="header"]
+|===
+| Назначение | Якорь раздела | Файл в ~/doc/documentation/content/{язык}/articles/contributors/ | Спецификация порядка
+| *Команда разработчиков: Памяти ушедших* | [.filename]#contrib-develinmemoriam.adoc# | [.filename]#contrib-develinmemoriam.adoc# | приблизительно в обратном хронологическом порядке
+|===
++
+Смотрите файл "In Memoriam" для похожих записей.
++
+. Наконец, если применимо, переместите запись участника с правами коммиттера из раздела «current» в раздел «alumni» соответствующего link:https://cgit.freebsd.org/src/tree/share/misc[списка отношений наставник / подопечный] с указанием соответствующей даты. Изменять отношения наставник / подопечный не требуется.
diff --git a/documentation/content/ru/books/fdp-primer/structure/_index.po b/documentation/content/ru/books/fdp-primer/structure/_index.po
new file mode 100644
index 0000000000..15fc73b69b
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/structure/_index.po
@@ -0,0 +1,1340 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerstructure_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:1
+#, no-wrap
+msgid "Documentation Directory Structure explanation used in the FreeBSD Documentation Project"
+msgstr "Структура каталогов документации, используемая в проекте документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:1
+#, no-wrap
+msgid "Chapter 4. Documentation Directory Structure"
+msgstr "Глава 4. Структура каталогов документации"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:14
+#, no-wrap
+msgid "Documentation Directory Structure"
+msgstr "Структура каталогов документации"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:52
+msgid "Files and directories in the *doc/* tree follow a structure meant to:"
+msgstr "Файлы и каталоги в дереве *doc/* следуют структуре, преследующей цели:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:54
+msgid "Make it easy to automate converting the document to other formats."
+msgstr ""
+"Сделать удобным автоматическое преобразование документа в другие форматы."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:55
+msgid ""
+"Promote consistency between the different documentation organizations, to "
+"make it easier to switch between working on different documents."
+msgstr ""
+"Способствовать согласованности между различными организациями, занимающимися "
+"документацией, чтобы упростить переход между работой над разными документами."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:56
+msgid ""
+"Make it easy to decide where in the tree new documentation should be placed."
+msgstr ""
+"Сделать удобным выбор места в дереве для размещения новой документации."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:59
+msgid ""
+"In addition, the documentation tree must accommodate documents in many "
+"different languages. It is important that the documentation tree structure "
+"does not enforce any particular defaults or cultural preferences."
+msgstr ""
+"В дополнение, дерево документации должно поддерживать документы на многих "
+"разных языках. Важно, чтобы структура дерева документации не навязывала "
+"каких-либо конкретных настроек по умолчанию или культурных предпочтений."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:61
+#, no-wrap
+msgid "The Top Level, doc/"
+msgstr "Верхний уровень, doc/"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:64
+msgid ""
+"There are three sections under *doc/*, documentation and website share the "
+"same structure."
+msgstr ""
+"В разделе *doc/* есть три подраздела, документация и веб-сайт имеют "
+"одинаковую структуру."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:68
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:97
+#, no-wrap
+msgid "Directory"
+msgstr "Каталог"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:70
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:100
+#, no-wrap
+msgid "Usage"
+msgstr "Использование"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:71
+#, no-wrap
+msgid "*documentation*"
+msgstr "*documentation*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:74
+#, no-wrap
+msgid ""
+"Contains all the articles and books in AsciiDoc format.\n"
+"Contains subdirectories to further categorize the information by languages."
+msgstr ""
+"Содержит все статьи и книги в формате AsciiDoc.\n"
+"Содержит подкаталоги для дальнейшей категоризации информации по языкам."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:75
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:128
+#, no-wrap
+msgid "*tools*"
+msgstr "*tools*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:78
+#, no-wrap
+msgid ""
+"Contains a set of tools used to translate the documentation and the website using link:https://weblate.org/en/[Weblate].\n"
+"The Weblate instance can be found link:https://translate-dev.freebsd.org[here]."
+msgstr ""
+"Содержит набор инструментов для перевода документации и веб-сайта с использованием link:https://weblate.org/en/[Weblate].\n"
+"Экземпляр Weblate доступен link:https://translate-dev.freebsd.org[здесь]."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:79
+#, no-wrap
+msgid "*shared*"
+msgstr "*shared*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:83
+#, no-wrap
+msgid ""
+"Contains files that are not specific to the various translations of the documentation.\n"
+"Contains subdirectories to further categorize the information by languages and three files to store the authors, releases and mirrors information.\n"
+"This directory is shared between `documentation` and the `website`."
+msgstr ""
+"Содержит файлы, не относящиеся к различным переводам документации.\n"
+"Включает подкаталоги для дальнейшей категоризации информации по языкам, а также три файла для хранения данных об авторах, выпусках и зеркалах.\n"
+"Этот каталог является общим для `documentation` и `website`."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:84
+#, no-wrap
+msgid "*website*"
+msgstr "* website*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:86
+#, no-wrap
+msgid ""
+"Contains the link:https://www.FreeBSD.org[FreeBSD website] in AsciiDoc format.\n"
+"Contains subdirectories to further categorize the information by languages."
+msgstr ""
+"Содержит ссылку link:https://www.FreeBSD.org[FreeBSD website] в формате AsciiDoc.\n"
+"Содержит подкаталоги для дальнейшей категоризации информации по языкам."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:89
+#, no-wrap
+msgid "The Directories"
+msgstr "Каталоги"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:93
+msgid ""
+"These directories contain the documentation and the website. The "
+"documentation is organized into subdirectories below this level, following "
+"the link:https://gohugo.io/getting-started/directory-structure/[Hugo "
+"directory structure]."
+msgstr ""
+"Эти каталоги содержат документацию и веб-сайт. Документация организована в "
+"подкаталоги ниже этого уровня, следуя структуре каталогов link:https://"
+"gohugo.io/getting-started/directory-structure/[Hugo]."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:101
+#, no-wrap
+msgid "*archetypes*"
+msgstr "* archetypes*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:104
+#, no-wrap
+msgid ""
+"Contain templates to create new articles, books and webpages.\n"
+"For more information take a look link:https://gohugo.io/content-management/archetypes/[here]."
+msgstr ""
+"Содержит шаблоны для создания новых статей, книг и веб-страниц.\n"
+"Дополнительную информацию смотрите link:https://gohugo.io/content-management/archetypes/[здесь]."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:105
+#, no-wrap
+msgid "*config*"
+msgstr "*config*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:109
+#, no-wrap
+msgid ""
+"Contain the Hugo configuration files.\n"
+"One main file and one file per language.\n"
+"For more information take a look link:https://gohugo.io/getting-started/configuration/[here]."
+msgstr ""
+"Содержат файлы конфигурации Hugo.\n"
+"Один основной файл и по одному файлу для каждого языка.\n"
+"Для получения дополнительной информации смотрите link:https://gohugo.io/getting-started/configuration/[здесь]."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:110
+#, no-wrap
+msgid "*content*"
+msgstr "*content*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:113
+#, no-wrap
+msgid ""
+"Contain the books, articles and webpages.\n"
+"One directory exists for each available translation of the documentation, for example `en` and `zh-tw`."
+msgstr ""
+"Содержат книги, статьи и веб-страницы.\n"
+"Для каждого доступного перевода документации существует отдельный каталог, например `en` и `zh-tw`."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:114
+#, no-wrap
+msgid "*data*"
+msgstr "*data*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:118
+#, no-wrap
+msgid ""
+"Contain custom data for build the website in link:https://en.wikipedia.org/wiki/TOML[TOML] format.\n"
+"This directory is used to store the events, news, press, etc.\n"
+"For more information take a look link:https://gohugo.io/templates/data-templates/[here]."
+msgstr ""
+"Содержит пользовательские данные для сборки веб-сайта в формате link:https://en.wikipedia.org/wiki/TOML[TOML].\n"
+"Этот каталог используется для хранения событий, новостей, пресс-релизов и т.д.\n"
+"Для получения дополнительной информации ознакомьтесь link:https://gohugo.io/templates/data-templates/[здесь]."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:119
+#, no-wrap
+msgid "*static*"
+msgstr "*static*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:123
+#, no-wrap
+msgid ""
+"Contain static assets.\n"
+"Images, security advisories, the pgpkeys, etc.\n"
+"For more information take a look link:https://gohugo.io/content-management/static-files/[here]."
+msgstr ""
+"Содержат статические ресурсы.\n"
+"Изображения, бюллетени безопасности, pgpkeys и т.д.\n"
+"Подробнее смотрите link:https://gohugo.io/content-management/static-files/[здесь]."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:124
+#, no-wrap
+msgid "*themes*"
+msgstr "* themes*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:127
+#, no-wrap
+msgid ""
+"Contain the templates in the form of `.html` files that specify how the website looks.\n"
+"For more information take a look link:https://gohugo.io/templates/[here]."
+msgstr ""
+"Содержите шаблоны в виде файлов `.html`, которые определяют внешний вид веб-сайта.\n"
+"Для получения дополнительной информации посмотрите link:https://gohugo.io/templates/[здесь]."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:131
+#, no-wrap
+msgid ""
+"Contain tools used to enhance the documentation build.\n"
+"For example to generate the Table of Contents of the books, etc."
+msgstr ""
+"Содержит инструменты, используемые для улучшения сборки документации.\n"
+"Например, для генерации оглавления книг и т.д."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:132
+#, no-wrap
+msgid "*beastie.png*"
+msgstr "*beastie.png*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:134
+#, no-wrap
+msgid "This image does not need an introduction ;)"
+msgstr "Это изображение не нуждается в представлении ;)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:135
+#, no-wrap
+msgid "*LICENSE*"
+msgstr "*LICENSE*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:137
+#, no-wrap
+msgid "License of the documentation, shared and website. BSD 2-Clause License."
+msgstr "Лицензия документации, общих материалов и веб-сайта. Лицензия BSD с 2 пунктами."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:138
+#, no-wrap
+msgid "*Makefile*"
+msgstr "*Makefile*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:139
+#, no-wrap
+msgid "The *Makefile* defines the build process of the documentation and the website."
+msgstr "Файл *Makefile* определяет процесс сборки документации и веб-сайта."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:142
+#, no-wrap
+msgid "Document-Specific Information"
+msgstr "Информация, относящаяся к документу"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:145
+msgid ""
+"This section contains specific notes about particular documents managed by "
+"the FDP."
+msgstr ""
+"Этот раздел содержит особые примечания о конкретных документах, которыми "
+"управляет FDP."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:147
+#, no-wrap
+msgid "The Books: books/"
+msgstr "Книги: books/"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:150
+msgid "The books are written in AsciiDoc."
+msgstr "Книги написаны в AsciiDoc."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:153
+msgid ""
+"For each FreeBSD book, the AsciiDoc document type (aka doctype) is `book`. "
+"Books have ``part``s, each of which contains several ``chapter``s."
+msgstr ""
+"Для каждой книги FreeBSD тип документа AsciiDoc (также известный как "
+"doctype) — это `book` (книга). Книги содержат ``part`` (части), каждая из "
+"которых включает несколько ``chapter`` (глав)."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:155
+msgid ""
+"When the document is converted to HTML 5 (using the built-in `html5` "
+"backend):"
+msgstr ""
+"Когда документ преобразуется в HTML 5 (с использованием встроенного бэкенда "
+"`html5`):"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:157
+msgid ""
+"AsciiDoc section level 0 (`=`) at the beginning of a ``chapter`` of a `book` "
+"will be `<h1>`"
+msgstr "Уровень раздела AsciiDoc 0 (`=`) в начале `главы` `книги` будет `<h1>`"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:158
+msgid ""
+"AsciiDoc section level 1 (`==`) must be used for the first logical section "
+"of a chapter, and will be `<h2>`"
+msgstr ""
+"Уровень секции AsciiDoc 1 (`==`) должен использоваться для первого "
+"логического раздела главы и будет преобразован в `<h2>`"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:159
+msgid ""
+"AsciiDoc section level 2 (`===`) must be used for the first logical "
+"subsection, and will be `<h3>`"
+msgstr ""
+"Уровень раздела AsciiDoc 2 (`===`) должен использоваться для первого "
+"логического подраздела и будет преобразован в `<h3>`"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:161
+msgid ""
+"– and so on. Reference: link:https://docs.asciidoctor.org/asciidoc/latest/"
+"sections/titles-and-levels/[Section Titles and Levels | Asciidoctor Docs]."
+msgstr ""
+"– и так далее. Ссылка: link:https://docs.asciidoctor.org/asciidoc/latest/"
+"sections/titles-and-levels/[Заголовки и уровни разделов | Документация "
+"Asciidoctor]."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:163
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:223
+#, no-wrap
+msgid "Physical Organization"
+msgstr "Физическая организация"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:166
+msgid ""
+"There are a number of files and directories within the books directory, all "
+"with the same structure."
+msgstr ""
+"В каталоге books находится множество файлов и директорий, все с одинаковой "
+"структурой."
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:168
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:228
+#, no-wrap
+msgid "_index.adoc"
+msgstr "_index.adoc"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:171
+msgid ""
+"The *_index.adoc* file defines some AsciiDoc variables that affect how the "
+"AsciiDoc source is converted to other formats and list the Table of "
+"Contents, Table of Examples, Table of Figures, Table of Tables and the "
+"abstract section."
+msgstr ""
+"Файл *_index.adoc* определяет некоторые переменные AsciiDoc, которые влияют "
+"на преобразование исходного кода AsciiDoc в другие форматы, а также содержит "
+"оглавление, список примеров, список рисунков, список таблиц и раздел с "
+"аннотацией."
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:173
+#, no-wrap
+msgid "book.adoc"
+msgstr "book.adoc"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:177
+msgid ""
+"The *book.adoc* file defines some AsciiDoc variables that affect how the "
+"AsciiDoc source is converted to other formats and list the Table of "
+"Contents, Table of Examples, Table of Figures, Table of Tables, the abstract "
+"section and all the chapters. This file is used to generate the PDF with "
+"`asciidoctor-pdf` and to generate the book in one `html` page."
+msgstr ""
+"Файл *book.adoc* определяет некоторые переменные AsciiDoc, которые влияют на "
+"преобразование исходного кода AsciiDoc в другие форматы, а также включает "
+"оглавление, список примеров, список рисунков, список таблиц, раздел с "
+"аннотацией и все главы. Этот файл используется для генерации PDF с помощью "
+"`asciidoctor-pdf` и для создания книги в виде одной страницы `html`."
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:179
+#, no-wrap
+msgid "part*.adoc"
+msgstr "part*.adoc"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:181
+msgid ""
+"The **part*.adoc** files store a brief introduction of one part of the book."
+msgstr "Файлы **part*.adoc** содержат краткое введение к одной части книги."
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:183
+#, no-wrap
+msgid "directory/_index.adoc"
+msgstr "directory/_index.adoc"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:186
+msgid ""
+"Each chapter in the Handbook is stored in a file called *_index.adoc* in a "
+"separate directory from the other chapters."
+msgstr ""
+"Каждая глава Руководства хранится в файле с именем *_index.adoc* в отдельном "
+"каталоге от других глав."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:188
+msgid "For example, this is an example of the header of one chapter:"
+msgstr "Например, вот пример заголовка одной главы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:191
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:236
+#, no-wrap
+msgid "---\n"
+msgstr "---\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:196
+#, no-wrap
+msgid ""
+"title: Chapter 8. Configuring the FreeBSD Kernel\n"
+"part: Part II. Common Tasks\n"
+"prev: books/handbook/multimedia\n"
+"next: books/handbook/printing\n"
+"---\n"
+msgstr ""
+"title: Chapter 8. Configuring the FreeBSD Kernel\n"
+"part: Part II. Common Tasks\n"
+"prev: books/handbook/multimedia\n"
+"next: books/handbook/printing\n"
+"---\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:199
+msgid "[[kernelconfig]]"
+msgstr "[[kernelconfig]]"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:199
+#, no-wrap
+msgid "Configuring the FreeBSD Kernel"
+msgstr "Настройка ядра FreeBSD"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:201
+msgid "..."
+msgstr "..."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:204
+msgid ""
+"When the HTML5 version of the Handbook is produced, this will yield "
+"*kernelconfig/index.html*."
+msgstr ""
+"При создании HTML5-версии Handbook это приведёт к формированию файла "
+"*kernelconfig/index.html*."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:206
+msgid ""
+"A brief look will show that there are many directories with individual "
+"*_index.adoc* files, including *basics/_index.adoc*, *introduction/"
+"_index.adoc*, and *printing/_index.adoc*."
+msgstr ""
+"Быстрый взгляд покажет, что существует множество каталогов с отдельными "
+"файлами *_index.adoc*, включая *basics/_index.adoc*, *introduction/"
+"_index.adoc* и *printing/_index.adoc*."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:212
+msgid ""
+"Do not name chapters or directories after their ordering within the "
+"Handbook. This ordering can change as the content within the Handbook is "
+"reorganized. Reorganization should be possible without renaming files, "
+"unless entire chapters are being promoted or demoted within the hierarchy."
+msgstr ""
+"Не называйте главы или каталоги в соответствии с их порядком в Руководстве. "
+"Этот порядок может измениться при реорганизации содержания Руководства. "
+"Реорганизация должна быть возможной без переименования файлов, за "
+"исключением случаев, когда целые главы перемещаются вверх или вниз по "
+"иерархии."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:215
+#, no-wrap
+msgid "The Articles: articles/"
+msgstr "Статьи: articles/"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:218
+msgid "The articles are written in AsciiDoc."
+msgstr "Статьи написаны в AsciiDoc."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:221
+msgid ""
+"The articles are organized as an AsciiDoc `article`. The articles are "
+"divided into sections (`=`) and subsections (`==`, `===`) and so on."
+msgstr ""
+"Статьи организованы как документ AsciiDoc `article`. Статьи разделены на "
+"разделы (`=`), подразделы (`==`, `===`) и так далее."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:226
+msgid "There is one *_index.adoc* file per article."
+msgstr "На каждый статью приходится один файл *_index.adoc*."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:231
+msgid ""
+"The *_index.adoc* file contains all the AsciiDoc variables and the content."
+msgstr "Файл *_index.adoc* содержит все переменные AsciiDoc и контент."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:233
+msgid ""
+"For example, this is an example of one article, the structure is pretty "
+"similar to one book chapter:"
+msgstr ""
+"Например, это образец одной статьи, структура довольно похожа на главу книги:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:242
+#, no-wrap
+msgid ""
+"title: Why you should use a BSD style license for your Open Source Project\n"
+"authors:\n"
+" - author: Bruce Montague\n"
+" email: brucem@alumni.cse.ucsc.edu\n"
+"trademarks: [\"freebsd\", \"intel\", \"general\"]\n"
+"---\n"
+msgstr ""
+"title: Why you should use a BSD style license for your Open Source Project\n"
+"authors:\n"
+" - author: Bruce Montague\n"
+" email: brucem@alumni.cse.ucsc.edu\n"
+"trademarks: [\"freebsd\", \"intel\", \"general\"]\n"
+"---\n"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:244
+#, no-wrap
+msgid "Why you should use a BSD style license for your Open Source Project"
+msgstr "Почему вы должны использовать лицензию в стиле BSD для вашего Open Source проекта"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:253
+msgid ""
+":doctype: article :toc: macro :toclevels: 1 :icons: "
+"font :sectnums: :sectnumlevels: 6 :source-highlighter: rouge :experimental:"
+msgstr ""
+":doctype: article\n"
+":toc: macro\n"
+":toclevels: 1\n"
+":icons: font\n"
+":sectnums:\n"
+":sectnumlevels: 6\n"
+":source-highlighter: rouge\n"
+":experimental:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:255
+msgid "'''"
+msgstr "'''"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:257
+msgid "toc::[]"
+msgstr "toc::[]"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:259
+msgid "[[intro]]"
+msgstr "[[intro]]"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:259
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:262
+#, no-wrap
+msgid "Managing Contributor Lists"
+msgstr "Управление списками участников"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:266
+msgid ""
+"The FreeBSD project recognizes contributors in several different lists in "
+"the documentation and in printed materials. This section describes how the "
+"documentation team manages changes to these lists."
+msgstr ""
+"Проект FreeBSD отмечает вклад участников в нескольких различных списках в "
+"документации и печатных материалах. В этом разделе описано, как команда "
+"документации управляет изменениями в этих списках."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:267
+#, no-wrap
+msgid "Mentor and New Committer Relationship Lists"
+msgstr "Списки отношений наставника и нового коммиттера"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:271
+msgid ""
+"Since FreeBSD 7.0, FreeBSD has maintained link:https://cgit.freebsd.org/src/"
+"tree/share/misc[three lists of contributor mentor / mentee relationships] - "
+"one for source code, one for ports and one for documentation. These files "
+"are in *\".dot\"* format, intended for use with the popular graphing toolkit "
+"package:graphics/graphviz[] available as a FreeBSD package or port."
+msgstr ""
+"Начиная с FreeBSD 7.0, FreeBSD поддерживает link:https://cgit.freebsd.org/"
+"src/tree/share/misc[три списка отношений наставник/подопечный] — один для "
+"исходного кода, один для портов и один для документации. Эти файлы имеют "
+"формат *«.dot»* и предназначены для использования с популярным пакетом для "
+"построения графиков graphics/graphviz[], доступным как пакет или порт "
+"FreeBSD."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:276
+msgid ""
+"man:dot[1] is installed as part of the package:graphics/graphviz[] package "
+"or port. The [.filename]#dot# program reads files in *\".dot\"* format and "
+"creates a graphical image of the directed graph."
+msgstr ""
+"man:dot[1] устанавливается как часть пакета или порта: graphics/graphviz[]. "
+"Программа [.filename]#dot# читает файлы в формате *\".dot\"* и создает "
+"графическое изображение направленного графа."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:281
+msgid ""
+"The three files often serve as a learning experience for new committers of "
+"all three teams who are instructed to add themselves, and their mentor, to "
+"the appropriate file as their first commit. Each file has a \"current\" "
+"section for new committers, an \"alumni\" section for when the commit bit is "
+"returned, and a \"mentor / mentee\" section showing the relationships. The "
+"format for each type of entry is explained at the top of the file."
+msgstr ""
+"Три файла часто служат учебным опытом для новых коммиттеров всех трёх "
+"команд, которым поручается добавить себя и своего наставника в "
+"соответствующий файл в качестве их первого коммита. Каждый файл содержит "
+"раздел «current» для новых коммиттеров, раздел «alumni» для случаев возврата "
+"прав на коммит и раздел «mentor / mentee», отображающий взаимоотношения. "
+"Формат каждой записи поясняется в начале файла."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:282
+#, no-wrap
+msgid "General Contributor Lists"
+msgstr "Общий список участников"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:286
+msgid ""
+"extref:{contributors}[Contributors] to FreeBSD are maintained in article "
+"format. The source file for managing the *Contributors* article file is "
+"located at:"
+msgstr ""
+"extref:{contributors}[Участники] проекта FreeBSD поддерживаются в формате "
+"статьи. Исходный файл для управления статьёй *Участники* находится по адресу:"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:299
+#, no-wrap
+msgid ""
+"doc\n"
+" /documentation\n"
+" /content\n"
+" /{language}\n"
+" /articles\n"
+" /contributors\n"
+" [.filename]#_index.adoc# – Contains a list of include files that apply to each section.\n"
+" [.filename]#_index.po# – Translation page\n"
+" [.filename]#contrib-develinmemoriam.adoc# - content of “In Memoriam” section\n"
+" [.filename]#contrib-develinmemoriam.po# – Translation page\n"
+msgstr ""
+"doc\n"
+" /documentation\n"
+" /content\n"
+" /{language}\n"
+" /articles\n"
+" /contributors\n"
+" [.filename]#_index.adoc# – Contains a list of include files that apply to each section.\n"
+" [.filename]#_index.po# – Translation page\n"
+" [.filename]#contrib-develinmemoriam.adoc# - content of “In Memoriam” section\n"
+" [.filename]#contrib-develinmemoriam.po# – Translation page\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:302
+msgid ""
+"Copies of this contributors directory may exist in other content language "
+"directories."
+msgstr ""
+"Копии этого каталога contributors могут существовать в других каталогах с "
+"контентом на различных языках."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:305
+msgid ""
+"Note that the file [.filename]#contrib-develinmemoriam.adoc# is also found "
+"in this directory. See below for additional information."
+msgstr ""
+"Обратите внимание, что файл [.filename]#contrib-develinmemoriam.adoc# также "
+"находится в этом каталоге. Дополнительную информацию смотрите ниже."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:310
+msgid ""
+"The [.filename]#contributors/_index.adoc# file is designed as a collection "
+"of include files. The include files are listed in the Hugo specific section "
+"of the source file. The section is divided into several parts with \"ifdef::"
+"\" statements. There is a sub-section for website output and one for non-"
+"website (including PDF) output."
+msgstr ""
+"Файл [.filename]#contributors/_index.adoc# представляет собой набор "
+"включаемых файлов. Включаемые файлы перечислены в разделе, специфичном для "
+"Hugo, в исходном файле. Раздел разделён на несколько частей с помощью "
+"операторов \"ifdef::\". Существует подраздел для вывода на веб-сайт и "
+"подраздел для вывода вне веб-сайта (включая PDF)."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:314
+msgid ""
+"The text for each section of the *Contributors* page contains an \"include::"
+"\" statement. For example, the entry for \"Port Manager Alumni\" is "
+"`include::{include-contrib-portmgralumni}[]`. This pulls in the text for "
+"port manager alumni into the rendered output."
+msgstr ""
+"Текст каждого раздела страницы *Участники* содержит оператор \"include::\". "
+"Например, запись для \"Экс-участники менеджера портов\" выглядит как "
+"`include::{include-contrib-portmgralumni}[]`. Это подключает текст об экс-"
+"участниках менеджера портов в итоговый вывод."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:316
+msgid "To make a change, edit the appropriate include file:"
+msgstr "Чтобы внести изменения, отредактируйте соответствующий include-файл:"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:325
+#, no-wrap
+msgid ""
+"include-contrib-committers: [.filename]#~/doc/shared/contrib-committers.adoc#\n"
+"include-contrib-corealumni: [.filename]#~/doc/shared/contrib-corealumni.adoc#\n"
+"include-contrib-develalumni: [.filename]#~/doc/shared/contrib-develalumni.adoc#\n"
+"include-contrib-portmgralumni: [.filename]#~/doc/shared/contrib-portmgralumni.adoc#\n"
+"include-contrib-additional: [.filename]#~/doc/shared/contrib-additional.adoc#\n"
+"include-contrib-386bsd: [.filename]#~/doc/shared/contrib-386bsd.adoc#\n"
+msgstr ""
+"include-contrib-committers: [.filename]#~/doc/shared/contrib-committers.adoc#\n"
+"include-contrib-corealumni: [.filename]#~/doc/shared/contrib-corealumni.adoc#\n"
+"include-contrib-develalumni: [.filename]#~/doc/shared/contrib-develalumni.adoc#\n"
+"include-contrib-portmgralumni: [.filename]#~/doc/shared/contrib-portmgralumni.adoc#\n"
+"include-contrib-additional: [.filename]#~/doc/shared/contrib-additional.adoc#\n"
+"include-contrib-386bsd: [.filename]#~/doc/shared/contrib-386bsd.adoc#\n"
+
+#. type: delimited block - 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:328
+#, no-wrap
+msgid ""
+"Also, edit the [.filename]#authors.adoc# file: [.filename]#~/doc/shared/authors.adoc#\n"
+"and any related translations.\n"
+msgstr ""
+"Также отредактируйте файл [.filename]#authors.adoc#: [.filename]#~/doc/shared/authors.adoc#\n"
+"и все связанные с ним переводы.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:334
+msgid ""
+"In general, if a person is being added, there is only one edit necessary, "
+"and they can be added to the appropriate include file. If a person is being "
+"moved from \"current\" to \"alumni\" status, two edits are required - one to "
+"remove and one to insert for the appropriate files. The order of entries "
+"for all files is found in the table below."
+msgstr ""
+"В общем случае, если добавляется новый человек, требуется лишь одно "
+"изменение — его можно добавить в соответствующий включаемый файл. Если "
+"человек переводится из статуса «текущий» в «бывший», необходимо два "
+"изменения: одно для удаления и одно для добавления в соответствующие файлы. "
+"Порядок записей для всех файлов указан в таблице ниже."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:337
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:413
+#, no-wrap
+msgid "Purpose"
+msgstr "Назначение"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:337
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:413
+#, no-wrap
+msgid "Section Anchor"
+msgstr "Якорь раздела"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:337
+#, no-wrap
+msgid "File in ~/doc/shared/"
+msgstr "Файл в ~/doc/shared/"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:338
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:414
+#, no-wrap
+msgid "Order Specification"
+msgstr "Спецификация порядка"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:338
+#, no-wrap
+msgid "*FreeBSD Developers*"
+msgstr "*Разработчики FreeBSD*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:338
+#, no-wrap
+msgid "include-contrib-committers"
+msgstr "include-contrib-committers"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:338
+#, no-wrap
+msgid "[.filename]#contrib-committers.adoc#"
+msgstr "[.filename]#contrib-committers.adoc#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:339
+#, no-wrap
+msgid "alphabetical order by last name"
+msgstr "упорядочено по алфавиту по фамилии"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:339
+#, no-wrap
+msgid "*Core Team Alumni*"
+msgstr "*Бывшие члены основной команды*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:339
+#, no-wrap
+msgid "include-contrib-corealumni"
+msgstr "include-contrib-corealumni"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:339
+#, no-wrap
+msgid "[.filename]#contrib-corealumni.adoc#"
+msgstr "[.filename]#contrib-corealumni.adoc#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:340
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:341
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:342
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:415
+#, no-wrap
+msgid "rough reverse chronological order"
+msgstr "приблизительно в обратном хронологическом порядке"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:340
+#, no-wrap
+msgid "*Development Team Alumni*"
+msgstr "*Бывшие члены команды разработчиков*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:340
+#, no-wrap
+msgid "include-contrib-develalumni"
+msgstr "include-contrib-develalumni"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:340
+#, no-wrap
+msgid "[.filename]#contrib-develalumni.adoc#"
+msgstr "[.filename]#contrib-develalumni.adoc#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:341
+#, no-wrap
+msgid "*Ports Management Team Alumni*"
+msgstr "*Бывшие члены команды управления портами*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:341
+#, no-wrap
+msgid "include-contrib-portmgralumni"
+msgstr "include::contrib-portmgralumni"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:341
+#, no-wrap
+msgid "[.filename]#contrib-portmgralumni.adoc#"
+msgstr "[.filename]#contrib-portmgralumni.adoc#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:342
+#, no-wrap
+msgid "*Additional FreeBSD Contributors*"
+msgstr "*Дополнительные участники проекта FreeBSD*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:342
+#, no-wrap
+msgid "include-contrib-additional"
+msgstr "include-contrib-additional"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:342
+#, no-wrap
+msgid "[.filename]#contrib-additional.adoc#"
+msgstr "[.filename]#contrib-additional.adoc#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:343
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:344
+#, no-wrap
+msgid "alphabetical order by first name"
+msgstr "упорядочено по алфавиту по имени"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:343
+#, no-wrap
+msgid "*386BSD Patch Kit Patch Contributors*"
+msgstr "*Участники, предоставившие патчи для 386BSD Patch Kit*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:343
+#, no-wrap
+msgid "include-contrib-386bsd"
+msgstr "include-contrib-386bsd"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:343
+#, no-wrap
+msgid "[.filename]#contrib-386bsd.adoc#"
+msgstr "[.filename]#contrib-386bsd.adoc#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:344
+#, no-wrap
+msgid "*Contributors to the central server project*"
+msgstr "*Участники проекта центрального сервера*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:344
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:345
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:346
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:347
+#, no-wrap
+msgid "No include file used"
+msgstr "Файл include не используется"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:344
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:345
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:346
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:347
+#, no-wrap
+msgid "[.filename]#contributors/_index.adoc#"
+msgstr "[.filename]#contributors/_index.adoc#"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:345
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:346
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:347
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:348
+#, no-wrap
+msgid "unordered"
+msgstr "неупорядоченное"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:345
+#, no-wrap
+msgid "*Direct funding*"
+msgstr "*Прямое финансирование*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:346
+#, no-wrap
+msgid "*Hardware contributors*"
+msgstr "*Участники, предоставившие оборудование*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:347
+#, no-wrap
+msgid "*Special contributors*"
+msgstr "*Особые участники*"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:350
+#, no-wrap
+msgid "\"In Memoriam\" Section"
+msgstr "Раздел \"Памяти\""
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:353
+msgid ""
+"When notifying the BSD community of the death of a community member, the "
+"following procedure should be used:"
+msgstr ""
+"Когда уведомляют сообщество BSD о смерти члена сообщества, следует "
+"использовать следующую процедуру:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:355
+msgid ""
+"Use the file [.filename]#~/doc/shared/authors.adoc# to look up the person's "
+"name and attribute reference, such as `{foobsd}`."
+msgstr ""
+"Используйте файл [.filename]#~/doc/shared/authors.adoc# для поиска имени "
+"человека и ссылки на атрибут, например `{foobsd}`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:357
+msgid ""
+"If they are a current member of one or more FreeBSD project teams in "
+"[.filename]#~/doc/website/content/en/administration.adoc#, remove all "
+"instances of their attribute reference. Also, complete the following edits:"
+msgstr ""
+"Если они являются текущим членом одной или нескольких команд проекта FreeBSD "
+"в [.filename]#~/doc/website/content/en/administration.adoc#, удалите все "
+"упоминания их атрибута. Также выполните следующие правки:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:359
+msgid ""
+"[.filename]#~/doc/shared/contrib-committers.adoc# - Remove the attribute "
+"reference."
+msgstr ""
+"[.filename]#~/doc/shared/contrib-committers.adoc# - Удалите ссылку на "
+"атрибут."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:360
+msgid ""
+"[.filename]#~/doc/shared/contrib-corealumni.adoc# - If they are a _current_ "
+"member of the core team, create an entry showing start and end dates."
+msgstr ""
+"[.filename]#~/doc/shared/contrib-corealumni.adoc# - Если они являются "
+"_действующим_ членом основной команды, создайте запись с указанием дат "
+"начала и окончания."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:361
+msgid ""
+"[.filename]#~/doc/shared/contrib-develalumni.adoc# - Add the attribute "
+"reference and dates of activity as a committer."
+msgstr ""
+"[.filename]#~/doc/shared/contrib-develalumni.adoc# - Добавьте ссылку на "
+"атрибут и даты активности в качестве коммиттера."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:362
+msgid ""
+"[.filename]#~/doc/shared/contrib-portmgralumni.adoc# - Add the attribute "
+"reference if necessary."
+msgstr ""
+"[.filename]#~/doc/shared/contrib-portmgralumni.adoc# - Добавьте ссылку на "
+"атрибут при необходимости."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:363
+msgid "[.filename]#~/doc/shared/contrib-additional.adoc# - Remove the entry."
+msgstr "[.filename]#~/doc/shared/contrib-additional.adoc# — Удалите запись."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:365
+msgid ""
+"[.filename]#~/doc/shared/contrib-386bsd.adoc# - This is a historical "
+"document only. No changes are needed."
+msgstr ""
+"[.filename]#~/doc/shared/contrib-386bsd.adoc# - Это исключительно "
+"исторический документ. Изменения не требуются."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:368
+msgid ""
+"In the [.filename]#~/doc/shared/authors.adoc# file, comment out (using one "
+"backslash '\\') the email address to avoid creating the email link \"mailto:"
+"\" See the example for `itojun` below:"
+msgstr ""
+"В файле [.filename]#~/doc/shared/authors.adoc# закомментируйте (используя "
+"одну обратную косую черту '\\') адрес электронной почты, чтобы избежать "
+"создания ссылки \"mailto:\". См. пример для `itojun` ниже:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:372
+#, no-wrap
+msgid "[shared/authors.adoc]\n"
+msgstr "[shared/authors.adoc]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:374
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:380
+#, no-wrap
+msgid "[..]\n"
+msgstr "[..]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:378
+#, no-wrap
+msgid ""
+":itojun-name: Jun-ichiro Itoh\n"
+":itojun-email: \\itojun@FreeBSD.org\n"
+":itojun: {itojun-name} <{itojun-email}>\n"
+msgstr ""
+":itojun-name: Jun-ichiro Itoh\n"
+":itojun-email: \\itojun@FreeBSD.org\n"
+":itojun: {itojun-name} <{itojun-email}>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:383
+msgid ""
+"Since the member is deceased (which should be double checked), add them to "
+"the \"In Memoriam\" file [.filename]#contrib-develinmemoriam.adoc#."
+msgstr ""
+"Поскольку участник скончался (что следует перепроверить), добавьте его в "
+"файл [.filename]#contrib-develinmemoriam.adoc# \"Памяти ушедших\"."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:386
+msgid ""
+"Try to find some factual information about their contributions to FreeBSD "
+"over the years and add it with their entry in the file. This may require "
+"asking in the development mailing lists, contacting colleagues, contacting "
+"the FreeBSD Foundation, or searching through the commit logs."
+msgstr ""
+"Постарайтесь найти информацию, подкрепленную фактами, о его вкладе в FreeBSD "
+"за прошедшие годы и добавьте её к записи в файле. Для этого может "
+"потребоваться запрос в списках рассылки разработчиков, обращение к коллегам, "
+"связь с FreeBSD Foundation или поиск в журналах коммитов."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:388
+msgid "To find the date of their first commit, use:"
+msgstr "Чтобы узнать дату их первого коммита, используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:393
+#, no-wrap
+msgid ""
+"% cd ~/src\n"
+"% git log --reverse --author=foobsd # search for first commit of foobsd\n"
+msgstr ""
+"% cd ~/src\n"
+"% git log --reverse --author=foobsd # search for first commit of foobsd\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:397
+msgid ""
+"This will print out their commits in reverse order. The date of the first "
+"commit will be at the top."
+msgstr ""
+"Это выведет их коммиты в обратном порядке. Дата первого коммита будет вверху."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:399
+msgid "Ensure that the format of the dates match other entries:"
+msgstr "Убедитесь, что формат дат соответствует другим записям:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:403
+#, no-wrap
+msgid "(year of commit bit start - year of commit bit end; RIP year deceased)\n"
+msgstr "(год начала предоставления права коммита - год окончания предоставления права коммита; RIP год ухода)\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:405
+#, no-wrap
+msgid "For example:\n"
+msgstr "Например:\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:407
+#, no-wrap
+msgid "* Foo BSD (2007 - 2010; RIP 2016)\n"
+msgstr "* Foo BSD (2007 - 2010; RIP 2016)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:410
+msgid "Check the ordering of the entries in the file."
+msgstr "Проверьте порядок записей в файле."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:413
+#, no-wrap
+msgid "File in ~/doc/documentation/content/{language}/articles/contributors/"
+msgstr "Файл в ~/doc/documentation/content/{язык}/articles/contributors/"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:414
+#, no-wrap
+msgid "*Development Team: In Memoriam*"
+msgstr "*Команда разработчиков: Памяти ушедших*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:414
+#, no-wrap
+msgid "[.filename]#contrib-develinmemoriam.adoc#"
+msgstr "[.filename]#contrib-develinmemoriam.adoc#"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:418
+msgid "See the \"In Memoriam\" file for similar entries."
+msgstr "Смотрите файл \"In Memoriam\" для похожих записей."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/structure/_index.adoc:420
+msgid ""
+"Finally, if applicable, move the committer member entry from the \"current\" "
+"section to the \"alumni\" section of the appropriate link:https://"
+"cgit.freebsd.org/src/tree/share/misc[list of contributor mentor / mentee "
+"relationships] along with an appropriate date. It is not necessary to "
+"change the mentor / mentee relationship."
+msgstr ""
+"Наконец, если применимо, переместите запись участника с правами коммиттера "
+"из раздела «current» в раздел «alumni» соответствующего link:https://"
+"cgit.freebsd.org/src/tree/share/misc[списка отношений наставник / "
+"подопечный] с указанием соответствующей даты. Изменять отношения наставник / "
+"подопечный не требуется."
+
+#, no-wrap
+#~ msgid "Finding the Correct Files"
+#~ msgstr "Поиск нужных файлов"
+
+#~ msgid ""
+#~ "Search the files above for the name, email address, and nickname (such as "
+#~ "`foobsd`)."
+#~ msgstr ""
+#~ "Поищите в указанных файлах имя, адрес электронной почты и псевдоним "
+#~ "(например, `foobsd`)."
+
+#~ msgid ""
+#~ "Where an email address is found with a name, remove the email address, "
+#~ "but leave the name."
+#~ msgstr ""
+#~ "Где встречается адрес электронной почты вместе с именем, удалите адрес "
+#~ "электронной почты, но оставьте имя."
diff --git a/documentation/content/ru/books/fdp-primer/tools/_index.adoc b/documentation/content/ru/books/fdp-primer/tools/_index.adoc
new file mode 100644
index 0000000000..10c5251367
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/tools/_index.adoc
@@ -0,0 +1,70 @@
+---
+description: 'Инструменты, используемые в проекте документации FreeBSD'
+next: books/fdp-primer/working-copy
+params:
+ path: /books/fdp-primer/tools/
+prev: books/fdp-primer/overview
+showBookMenu: true
+tags: ["tools", "required tools", "optional tools"]
+title: 'Глава 2. Инструменты'
+weight: 3
+---
+
+[[tools]]
+= Инструменты
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 2
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Для управления документацией FreeBSD и её преобразования в различные выходные форматы используется несколько программных инструментов. Некоторые из них обязательны и должны быть установлены перед работой с примерами из следующих глав. Другие являются опциональными, расширяя возможности или упрощая процесс создания документации.
+
+[[tools-required]]
+== Необходимые инструменты
+
+Установите `docproj` _мета-порт_, как показано в crossref:overview[overview,обзорной главе] из Коллекции портов. Эти приложения необходимы для работы с документацией FreeBSD. Далее приведены дополнительные заметки об отдельных компонентах.
+
+[[tools-optional]]
+== Необязательные инструменты
+
+Эти приложения не обязательны, но могут упростить работу с документацией или расширить её возможности.
+
+[[tools-optional-software]]
+=== Программное обеспечение
+
+Vim (package:editors/vim[]) — популярный редактор для работы с Asciidoctor.
+
+Emacs (package:editors/emacs[]).
+
+Оба инструмента включают специальный режим, который сокращает количество необходимых нажатий клавиш и помогает снизить количество ошибок.
diff --git a/documentation/content/ru/books/fdp-primer/tools/_index.po b/documentation/content/ru/books/fdp-primer/tools/_index.po
new file mode 100644
index 0000000000..85365159eb
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/tools/_index.po
@@ -0,0 +1,113 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-06-01 09:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primertools_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:1
+#, no-wrap
+msgid "Tools used in the FreeBSD Documentation Project"
+msgstr "Инструменты, используемые в проекте документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:1
+#, no-wrap
+msgid "Chapter 2. Tools"
+msgstr "Глава 2. Инструменты"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:14
+#, no-wrap
+msgid "Tools"
+msgstr "Инструменты"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:54
+msgid ""
+"Several software tools are used to manage the FreeBSD documentation and "
+"render it to different output formats. Some of these tools are required and "
+"must be installed before working through the examples in the following "
+"chapters. Some are optional, adding capabilities or making the job of "
+"creating documentation less demanding."
+msgstr ""
+"Для управления документацией FreeBSD и её преобразования в различные "
+"выходные форматы используется несколько программных инструментов. Некоторые "
+"из них обязательны и должны быть установлены перед работой с примерами из "
+"следующих глав. Другие являются опциональными, расширяя возможности или "
+"упрощая процесс создания документации."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:56
+#, no-wrap
+msgid "Required Tools"
+msgstr "Необходимые инструменты"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:61
+msgid ""
+"Install `docproj` _meta-port_ as shown in crossref:overview[overview,the "
+"overview chapter] from the Ports Collection. These applications are "
+"required to do useful work with the FreeBSD documentation. Some further "
+"notes on particular components are given below."
+msgstr ""
+"Установите `docproj` _мета-порт_, как показано в "
+"crossref:overview[overview,обзорной главе] из Коллекции портов. Эти "
+"приложения необходимы для работы с документацией FreeBSD. Далее приведены "
+"дополнительные заметки об отдельных компонентах."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:63
+#, no-wrap
+msgid "Optional Tools"
+msgstr "Необязательные инструменты"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:66
+msgid ""
+"These applications are not required, but can make working on the "
+"documentation easier or add capabilities."
+msgstr ""
+"Эти приложения не обязательны, но могут упростить работу с документацией или "
+"расширить её возможности."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:68
+#, no-wrap
+msgid "Software"
+msgstr "Программное обеспечение"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:71
+msgid ""
+"Vim (package:editors/vim[]) -- a popular editor for working with Asciidoctor."
+msgstr ""
+"Vim (package:editors/vim[]) — популярный редактор для работы с Asciidoctor."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:73
+msgid "Emacs (package:editors/emacs[])."
+msgstr "Emacs (package:editors/emacs[])."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/tools/_index.adoc:74
+msgid ""
+"Both tools include a special mode that reduces the amount of typing needed, "
+"and helps to reduce errors."
+msgstr ""
+"Оба инструмента включают специальный режим, который сокращает количество "
+"необходимых нажатий клавиш и помогает снизить количество ошибок."
diff --git a/documentation/content/ru/books/fdp-primer/trademarks/_index.adoc b/documentation/content/ru/books/fdp-primer/trademarks/_index.adoc
new file mode 100644
index 0000000000..756825928f
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/trademarks/_index.adoc
@@ -0,0 +1,95 @@
+---
+description: 'Руководство по использованию товарных знаков в Документационном проекте FreeBSD'
+next: books/fdp-primer/see-also
+params:
+ path: /books/fdp-primer/trademarks/
+prev: books/fdp-primer/editor-config/
+showBookMenu: true
+tags: ["trademarks", "AsciiDoctor", "HTML"]
+title: 'Глава 14. Товарные знаки'
+weight: 14
+---
+
+[[trademarks]]
+= Товарные знаки
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 14
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Для всех документов в рамках проекта FreeBSD Documentation Project необходимо указывать зарегистрированные товарные знаки, а также принято указывать другие товарные знаки, и это является требованием для каждого автора и участника.
+
+[[trademark-symbols]]
+== Символы товарных знаков
+
+Добавьте символ товарного знака ((TM), (R) или другой) к первому упоминанию зарегистрированного названия и всегда при использовании логотипов. Используйте extref:{fdp-primer}/writing-style/#writing-style-special-characters[эквивалентную ASCII-последовательность], которая будет отображаться как соответствующий символ Юникода. Также пишите зарегистрированное название в соответствии с его правилами использования товарного знака.
+
+Если сомневаетесь, изучите сайт владельца товарного знака, сайт продукта и/или сайт link:https://www.uspto.gov/trademarks[Ведомства по патентам и товарным знакам США для поиска товарных знаков].
+
+[[trademark-citing]]
+== Цитирование товарных знаков
+
+Проект документации FreeBSD предоставляет шаблон для указания товарных знаков, что также позволяет избежать их дублирования в документах.
+
+Сначала найдите товарный знак в разделе link:https://cgit.freebsd.org/doc/tree/documentation/themes/beastie/i18n/en.toml#n328[Copyright в шаблоне проекта], затем добавьте его в тег `trademarks` в разделе `Front Matter` документа, который расположен в начале каждого документа.
+
+Вот пример `Front Matter` из статьи extref:{contributing}[Вклад в FreeBSD]:
+
+....
+---
+title: Contributing to FreeBSD
+authors:
+ - author: Jordan Hubbard
+ - author: Sam Lawrance
+ - author: Mark Linimon
+description: How to contribute to the FreeBSD Project
+trademarks: ["freebsd", "ieee", "general"]
+weight: 15
+tags: ["Contributing", "FreeBSD", "Non-Programmer Tasks", "Programmer Tasks"]
+---
+....
+
+Товарные знаки `freebsd`, `ieee` и `general` будут автоматически отображаться при сборке документа следующим образом:
+
+....
+FreeBSD is a registered trademark of the FreeBSD Foundation.
+
+IEEE, POSIX, and 802 are registered trademarks of Institute of Electrical and Electronics Engineers, Inc. in the United States.
+
+Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this document, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the “™” or the “®” symbol.
+....
+
+Если товарный знак отсутствует в шаблоне проекта, его необходимо предоставить. Любой разработчик или участник может обновлять товарные знаки.
+
+Теги товарных знаков `freebsd` и `general` обычно присутствуют во всех документах.
diff --git a/documentation/content/ru/books/fdp-primer/trademarks/_index.po b/documentation/content/ru/books/fdp-primer/trademarks/_index.po
new file mode 100644
index 0000000000..c581ca7f10
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/trademarks/_index.po
@@ -0,0 +1,197 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-06-01 18:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primertrademarks_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:1
+#, no-wrap
+msgid "Guidelines for trademarks in the FreeBSD Documentation Project"
+msgstr "Руководство по использованию товарных знаков в Документационном проекте FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:1
+#, no-wrap
+msgid "Chapter 14. Trademarks"
+msgstr "Глава 14. Товарные знаки"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:14
+#, no-wrap
+msgid "Trademarks"
+msgstr "Товарные знаки"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:52
+msgid ""
+"For all documents on the FreeBSD Documentation Project, citing registered "
+"trademarks is necessary and other trademarks is customary, and that is a "
+"requirement for every writer and contributor."
+msgstr ""
+"Для всех документов в рамках проекта FreeBSD Documentation Project "
+"необходимо указывать зарегистрированные товарные знаки, а также принято "
+"указывать другие товарные знаки, и это является требованием для каждого "
+"автора и участника."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:54
+#, no-wrap
+msgid "Trademark Symbols"
+msgstr "Символы товарных знаков"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:59
+msgid ""
+"Append a trademark symbol ((TM), (R), or other) to the first occurrence of "
+"the trademarked name, and always when using logos. Use the extref:{fdp-"
+"primer}/writing-style/#writing-style-special-characters[equivalent ASCII "
+"sequence], which will be rendered as the actual Unicode character. Also, "
+"write the trademarked name following its trademark guidelines."
+msgstr ""
+"Добавьте символ товарного знака ((TM), (R) или другой) к первому упоминанию "
+"зарегистрированного названия и всегда при использовании логотипов. "
+"Используйте extref:{fdp-primer}/writing-style/#writing-style-special-"
+"characters[эквивалентную ASCII-последовательность], которая будет "
+"отображаться как соответствующий символ Юникода. Также пишите "
+"зарегистрированное название в соответствии с его правилами использования "
+"товарного знака."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:61
+msgid ""
+"When in doubt, research the trademark owner's website, the product's "
+"website, and or the link:https://www.uspto.gov/trademarks[United States "
+"Patent and Trademark Office trademark search website]."
+msgstr ""
+"Если сомневаетесь, изучите сайт владельца товарного знака, сайт продукта и/"
+"или сайт link:https://www.uspto.gov/trademarks[Ведомства по патентам и "
+"товарным знакам США для поиска товарных знаков]."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:63
+#, no-wrap
+msgid "Trademark Citing"
+msgstr "Цитирование товарных знаков"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:66
+msgid ""
+"The FreeBSD Documentation Project provides a template for citing trademarks, "
+"which also avoids duplicating trademarks in the documents."
+msgstr ""
+"Проект документации FreeBSD предоставляет шаблон для указания товарных "
+"знаков, что также позволяет избежать их дублирования в документах."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:68
+msgid ""
+"First, look for the trademark in the link:https://cgit.freebsd.org/doc/tree/"
+"documentation/themes/beastie/i18n/en.toml#n328[Copyright section in the "
+"project's template], then add it to the trademarks tag on the `Front Matter` "
+"section of the document, located at the beginning of each document."
+msgstr ""
+"Сначала найдите товарный знак в разделе link:https://cgit.freebsd.org/doc/"
+"tree/documentation/themes/beastie/i18n/en.toml#n328[Copyright в шаблоне "
+"проекта], затем добавьте его в тег `trademarks` в разделе `Front Matter` "
+"документа, который расположен в начале каждого документа."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:70
+msgid ""
+"The following is an example of the `Front Matter` of the extref:"
+"{contributing}[Contributing to FreeBSD] article:"
+msgstr ""
+"Вот пример `Front Matter` из статьи extref:{contributing}[Вклад в FreeBSD]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:72
+#, no-wrap
+msgid "---\n"
+msgstr "---\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:82
+#, no-wrap
+msgid ""
+"title: Contributing to FreeBSD\n"
+"authors:\n"
+" - author: Jordan Hubbard\n"
+" - author: Sam Lawrance\n"
+" - author: Mark Linimon\n"
+"description: How to contribute to the FreeBSD Project\n"
+"trademarks: [\"freebsd\", \"ieee\", \"general\"]\n"
+"weight: 15\n"
+"tags: [\"Contributing\", \"FreeBSD\", \"Non-Programmer Tasks\", \"Programmer Tasks\"]\n"
+"---\n"
+msgstr ""
+"title: Contributing to FreeBSD\n"
+"authors:\n"
+" - author: Jordan Hubbard\n"
+" - author: Sam Lawrance\n"
+" - author: Mark Linimon\n"
+"description: How to contribute to the FreeBSD Project\n"
+"trademarks: [\"freebsd\", \"ieee\", \"general\"]\n"
+"weight: 15\n"
+"tags: [\"Contributing\", \"FreeBSD\", \"Non-Programmer Tasks\", \"Programmer Tasks\"]\n"
+"---\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:86
+msgid ""
+"The trademark tags `freebsd`, `ieee`, and `general` will be automatically "
+"rendered when building the document like this:"
+msgstr ""
+"Товарные знаки `freebsd`, `ieee` и `general` будут автоматически "
+"отображаться при сборке документа следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:89
+#, no-wrap
+msgid "FreeBSD is a registered trademark of the FreeBSD Foundation.\n"
+msgstr "FreeBSD is a registered trademark of the FreeBSD Foundation.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:91
+#, no-wrap
+msgid "IEEE, POSIX, and 802 are registered trademarks of Institute of Electrical and Electronics Engineers, Inc. in the United States.\n"
+msgstr "IEEE, POSIX, and 802 are registered trademarks of Institute of Electrical and Electronics Engineers, Inc. in the United States.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:93
+#, no-wrap
+msgid "Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this document, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the “™” or the “®” symbol.\n"
+msgstr "Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this document, and the FreeBSD Project was aware of the trademark claim, the designations have been followed by the “™” or the “®” symbol.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:97
+msgid ""
+"If a trademark is not present in the project's template, it must be "
+"submitted. Any developer or contributor can update the trademarks."
+msgstr ""
+"Если товарный знак отсутствует в шаблоне проекта, его необходимо "
+"предоставить. Любой разработчик или участник может обновлять товарные знаки."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/trademarks/_index.adoc:98
+msgid ""
+"The `freebsd` and `general` trademark tags are usually present in all "
+"documents."
+msgstr ""
+"Теги товарных знаков `freebsd` и `general` обычно присутствуют во всех "
+"документах."
diff --git a/documentation/content/ru/books/fdp-primer/translations/_index.adoc b/documentation/content/ru/books/fdp-primer/translations/_index.adoc
new file mode 100644
index 0000000000..d0e3e5ec88
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/translations/_index.adoc
@@ -0,0 +1,227 @@
+---
+description: 'Часто задаваемые вопросы о процессе перевода в проекте документации FreeBSD'
+next: books/fdp-primer/po-translations
+params:
+ path: /books/fdp-primer/translations/
+prev: books/fdp-primer/rosetta
+showBookMenu: true
+tags: ["FAQ", "i18n", "i10n", "translation"]
+title: 'Глава 8. Переводы'
+weight: 9
+---
+
+[[translations]]
+= Переводы
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 8
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Это FAQ для людей, занимающихся переводом документации FreeBSD (FAQ, Руководство, учебные пособия, man-страницы и другие) на различные языки.
+
+Он _очень_ сильно основан на FAQ по переводу из Немецкого проекта документации FreeBSD, изначально написанном Франком Грюндером mailto:elwood@mc5sys.in-berlin.de[elwood@mc5sys.in-berlin.de] и переведённом обратно на английский Берндом Варкеном mailto:bwarken@mayn.de[bwarken@mayn.de].
+
+== Что означают i18n и l10n?
+
+i18n означает интернационализацию, а l10n — локализацию. Это просто удобные сокращения.
+
+i18n можно прочитать как «i», за которым следует 18 букв, а затем «n». Аналогично, l10n — это «l», за которым следует 10 букв, а затем «n».
+
+== Существует ли рассылка для переводчиков?
+
+Да. Различные группы переводчиков имеют свои собственные списки рассылки. В https://www.freebsd.org/docproj/translations[списке проектов перевода] есть дополнительная информация о списках рассылки и веб-сайтах, которые поддерживаются каждым проектом перевода. Кроме того, существует mailto:freebsd-translators@freebsd.org[freebsd-translators@freebsd.org] для общих обсуждений, связанных с переводом.
+
+== Нужны дополнительные переводчики?
+
+Да. Чем больше людей работает над переводом, тем быстрее он будет завершен, и тем быстрее изменения в англоязычной документации отразятся в переведенных документах.
+
+Вам не нужно быть профессиональным переводчиком, чтобы помочь.
+
+== Какие языки мне нужно знать?
+
+В идеале вы должны хорошо знать письменный английский и, разумеется, свободно владеть языком, на который переводите.
+
+Английский язык не является строго обязательным. Например, можно сделать венгерский перевод FAQ из испанского перевода.
+
+== Какой софт нужно знать?
+
+Настоятельно рекомендуется поддерживать локальную копию репозитория FreeBSD Git (по крайней мере, документации). Это можно сделать, выполнив:
+
+[source, shell]
+....
+% git clone https://git.FreeBSD.org/doc.git ~/doc
+....
+
+https://git.FreeBSD.org/[git.FreeBSD.org] — это публичный `git` сервер.
+
+[NOTE]
+====
+Для этого потребуется установка пакета package:git-lite[] package.
+====
+
+Вы должны уверенно пользоваться git. Это позволит вам видеть, какие изменения были внесены между разными версиями файлов, из которых состоит документация.
+
+Например, чтобы посмотреть различия между ревизиями `abff932fe8` и `2191c44469` файла [.filename]#documentation/content/en/articles/committers-guide/_index.adoc#, выполните:
+
+[source, shell]
+....
+% git diff abff932fe8 2191c44469 documentation/content/en/articles/committers-guide/_index.adoc
+....
+
+Пожалуйста, ознакомьтесь с полным объяснением использования Git в FreeBSD в extref:{handbook}mirrors[Руководстве FreeBSD, git].
+
+== Как узнать, кто ещё, может быть, переводит на тот же язык?
+
+https://www.FreeBSD.org/docproj/translations/[Страница переводов проекта документации] содержит список известных на данный момент переводческих инициатив. Если кто-то уже работает над переводом документации на ваш язык, пожалуйста, не дублируйте их усилия. Вместо этого свяжитесь с ними, чтобы узнать, как вы можете помочь.
+
+Если на этой странице не указан переводчик для вашего языка, отправьте сообщение в список рассылки {freebsd-doc}, возможно, кто-то уже планирует сделать перевод, но еще не объявил об этом.
+
+== Никто не переводит на мой язык. Что мне делать?
+
+Поздравляем, вы только что запустили "Проект перевода документации FreeBSD на ваш язык". Добро пожаловать на борт.
+
+Сначала решите, есть ли у вас свободное время. Поскольку сейчас вы единственный, кто работает над вашим языком, вам придется взять на себя ответственность за рекламу своей работы и координацию добровольцев, которые, возможно, захотят вам помочь.
+
+Напишите письмо в рассылку проекта документации, объявив о том, что вы собираетесь переводить документацию, чтобы страница переводов проекта документации могла быть актуальной.
+
+Если в вашей стране уже есть кто-то, предоставляющий услуги зеркалирования FreeBSD, вам следует связаться с ними и спросить, можете ли вы получить место для вашего проекта на их веб-сервере, а также, возможно, электронный адрес или услуги рассылки.
+
+Затем выберите документ и начните перевод. Лучше всего начать с чего-то относительно небольшого — например, с FAQ или одного из руководств.
+
+== Я перевел часть документации, куда мне ее отправить?
+
+Это зависит от обстоятельств. Если вы уже работаете с командой переводчиков (например, с японской или немецкой командой), то у них есть свои процедуры обработки представленной документации, которые описаны на их веб-страницах.
+
+Если вы единственный, кто работает над конкретным языком (или вы отвечаете за проект перевода и хотите отправить свои изменения обратно в проект FreeBSD), то вам следует отправить свой перевод в проект FreeBSD (см. следующий вопрос).
+
+== Я единственный, кто работает над переводом на этот язык, как мне отправить свой перевод?
+
+Во-первых, убедитесь, что ваш перевод правильно организован. Это означает, что он должен встраиваться в существующую структуру документации и сразу же собираться.
+
+Каталоги ниже этого уровня именуются в соответствии с языковыми кодами, на которых они написаны, как определено в ISO639 ([.filename]#/usr/share/misc/iso639# в версии FreeBSD новее 20 января 1999 года).
+
+[WARNING]
+====
+Hugo требует коды языков в нижнем регистре. Например, вместо `pt_BR` Hugo использует `pt-br`.
+====
+
+В настоящее время документация FreeBSD хранится в корневом каталоге с названием [.filename]#documentation/#. Каталоги ниже него именуются согласно языковым кодам, на которых они написаны, как определено в ISO639 ([.filename]#/usr/share/misc/iso639# в версии FreeBSD новее 20 января 1999 года).
+
+Если ваш язык может быть закодирован различными способами (например, китайский), то ниже должны находиться каталоги для каждого из предоставленных форматов кодировки.
+
+Наконец, у вас должны быть каталоги для каждого документа.
+
+Например, гипотетический перевод на шведский язык может выглядеть так:
+
+[.programlisting]
+....
+documentation/
+ content/
+ sv/
+ books/
+ faq/
+ _index.adoc
+....
+
+`sv` — это название перевода в форме [.filename]#lang#. Обратите внимание на два Makefile, которые будут использоваться для сборки документации.
+
+Используйте команду `git diff` для создания diff и отправьте его в систему link:https://reviews.freebsd.org/[рецензирования].
+
+[source, shell]
+....
+% git diff > sv-faq.diff
+....
+
+Вы должны использовать Bugzilla, чтобы link:https://bugs.freebsd.org/bugzilla/enter_bug.cgi[отправить отчёт], указав, что вы предоставили документацию. Было бы очень полезно, если бы другие люди проверили ваш перевод перед отправкой, так как маловероятно, что человек, который будет его применять, свободно владеет языком.
+
+Кто-то (скорее всего, руководитель проекта документации, в настоящее время {doceng}) проверит ваш перевод и убедится, что он собирается. В частности, будут проверены следующие моменты:
+
+. Работает ли `make` в директории [.filename]#root# корректно?
+
+Если возникнут проблемы, тот, кто будет рассматривать вашу заявку, свяжется с вами для их решения.
+
+Если проблем не возникнет, ваш перевод будет включён как можно скорее.
+
+== Можно ли включать в перевод текст, специфичный для языка или страны?
+
+Мы бы предпочли, чтобы вы этого не делали.
+
+Например, предположим, что вы переводите Handbook на корейский язык и хотите добавить раздел о розничных продавцах в Корее в ваш Handbook.
+
+Нет никаких реальных причин, по которым эта информация не должна быть в английской (или немецкой, или испанской, или японской, или...) версиях также. Вполне возможно, что англоговорящий человек в Корее попытается приобрести копию FreeBSD, находясь там. Это также помогает усилить воспринимаемое присутствие FreeBSD по всему миру, что не так уж и плохо.
+
+Если у вас есть информация, специфичная для вашей страны, пожалуйста, отправьте её в виде изменения в англоязычное Руководство (через Bugzilla), а затем переведите это изменение обратно на ваш язык в локализованной версии Руководства.
+
+Спасибо.
+
+=== Обращение к читателю
+
+В английских документах читатель обращается на «you», здесь нет различия между формальным и неформальным обращением, как в некоторых языках.
+
+Если вы переводите на язык, где такое различие существует, используйте ту форму, которая обычно применяется в другой технической документации на вашем языке. Если сомневаетесь, используйте умеренно вежливую форму.
+
+=== Нужно ли включать какую-либо дополнительную информацию в мои переводы?
+
+Да.
+
+Заголовок английской версии каждого документа будет выглядеть примерно так:
+
+[.programlisting]
+....
+ ---
+ title: Why you should use a BSD style license for your Open Source Project
+ releaseinfo: "$FreeBSD: head/en_US.ISO8859-1/articles/bsdl-gpl/article.xml 53942 2020-03-01 12:23:40Z carlavilla $"
+ trademarks: ["freebsd", "intel", "general"]
+ ---
+
+ = Why you should use a BSD style license for your Open Source Project
+....
+
+Точный шаблон может меняться, но он всегда будет включать строку `$FreeBSD$` и фразу `The FreeBSD Documentation Project`. Обратите внимание, что часть `$FreeBSD$` автоматически раскрывается Git, поэтому для новых файлов она должна быть пустой (просто `$FreeBSD$`).
+
+Документы, переведённые вами, должны включать собственную строку FreeBSD, а также изменять строку `FreeBSD Documentation Project` на `The FreeBSD_язык_Documentation Project`.
+
+В дополнение, вы должны добавить третью строку, указывающую, на какую версию английского текста опирается перевод.
+
+Итак, испанская версия этого файла может начинаться с:
+
+[.programlisting]
+....
+ ---
+ title: Soporte para segundos intercalares en FreeBSD
+ releaseinfo: "$FreeBSD: head/es_ES.ISO8859-1/articles/leap-seconds/article.xml 53090 2019-06-01 17:52:59Z carlavilla $"
+ ---
+
+ = Soporte para segundos intercalares en FreeBSD
+....
diff --git a/documentation/content/ru/books/fdp-primer/translations/_index.po b/documentation/content/ru/books/fdp-primer/translations/_index.po
new file mode 100644
index 0000000000..6e0bf59db9
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/translations/_index.po
@@ -0,0 +1,683 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-08-19 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primertranslations_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:1
+#, no-wrap
+msgid "FAQ about the translation process in the FreeBSD Documentation Project"
+msgstr "Часто задаваемые вопросы о процессе перевода в проекте документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:1
+#, no-wrap
+msgid "Chapter 8. Translations"
+msgstr "Глава 8. Переводы"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:14
+#, no-wrap
+msgid "Translations"
+msgstr "Переводы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:52
+msgid ""
+"This is the FAQ for people translating the FreeBSD documentation (FAQ, "
+"Handbook, tutorials, manual pages, and others) to different languages."
+msgstr ""
+"Это FAQ для людей, занимающихся переводом документации FreeBSD (FAQ, "
+"Руководство, учебные пособия, man-страницы и другие) на различные языки."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:56
+msgid ""
+"It is _very_ heavily based on the translation FAQ from the FreeBSD German "
+"Documentation Project, originally written by Frank Gründer "
+"mailto:elwood@mc5sys.in-berlin.de[elwood@mc5sys.in-berlin.de] and translated "
+"back to English by Bernd Warken mailto:bwarken@mayn.de[bwarken@mayn.de]."
+msgstr ""
+"Он _очень_ сильно основан на FAQ по переводу из Немецкого проекта "
+"документации FreeBSD, изначально написанном Франком Грюндером "
+"mailto:elwood@mc5sys.in-berlin.de[elwood@mc5sys.in-berlin.de] и переведённом "
+"обратно на английский Берндом Варкеном "
+"mailto:bwarken@mayn.de[bwarken@mayn.de]."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:57
+#, no-wrap
+msgid "What do i18n and l10n mean?"
+msgstr "Что означают i18n и l10n?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:61
+msgid ""
+"i18n means internationalization and l10n means localization. They are just "
+"a convenient shorthand."
+msgstr ""
+"i18n означает интернационализацию, а l10n — локализацию. Это просто удобные "
+"сокращения."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:64
+msgid ""
+"i18n can be read as \"i\" followed by 18 letters, followed by \"n\". "
+"Similarly, l10n is \"l\" followed by 10 letters, followed by \"n\"."
+msgstr ""
+"i18n можно прочитать как «i», за которым следует 18 букв, а затем «n». "
+"Аналогично, l10n — это «l», за которым следует 10 букв, а затем «n»."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:65
+#, no-wrap
+msgid "Is there a mailing list for translators?"
+msgstr "Существует ли рассылка для переводчиков?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:70
+msgid ""
+"Yes. Different translation groups have their own mailing lists. The https://"
+"www.freebsd.org/docproj/translations[list of translation projects] has more "
+"information about the mailing lists and web sites run by each translation "
+"project. In addition there is mailto:freebsd-"
+"translators@freebsd.org[freebsd-translators@freebsd.org] for general "
+"translation discussion."
+msgstr ""
+"Да. Различные группы переводчиков имеют свои собственные списки рассылки. В "
+"https://www.freebsd.org/docproj/translations[списке проектов перевода] есть "
+"дополнительная информация о списках рассылки и веб-сайтах, которые "
+"поддерживаются каждым проектом перевода. Кроме того, существует "
+"mailto:freebsd-translators@freebsd.org[freebsd-translators@freebsd.org] для "
+"общих обсуждений, связанных с переводом."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:71
+#, no-wrap
+msgid "Are more translators needed?"
+msgstr "Нужны дополнительные переводчики?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:74
+msgid ""
+"Yes. The more people that work on translation the faster it gets done, and "
+"the faster changes to the English documentation are mirrored in the "
+"translated documents."
+msgstr ""
+"Да. Чем больше людей работает над переводом, тем быстрее он будет завершен, "
+"и тем быстрее изменения в англоязычной документации отразятся в переведенных "
+"документах."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:76
+msgid "You do not have to be a professional translator to be able to help."
+msgstr "Вам не нужно быть профессиональным переводчиком, чтобы помочь."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:77
+#, no-wrap
+msgid "What languages do I need to know?"
+msgstr "Какие языки мне нужно знать?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:80
+msgid ""
+"Ideally, you will have a good knowledge of written English, and obviously "
+"you will need to be fluent in the language you are translating to."
+msgstr ""
+"В идеале вы должны хорошо знать письменный английский и, разумеется, "
+"свободно владеть языком, на который переводите."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:83
+msgid ""
+"English is not strictly necessary. For example, you could do a Hungarian "
+"translation of the FAQ from the Spanish translation."
+msgstr ""
+"Английский язык не является строго обязательным. Например, можно сделать "
+"венгерский перевод FAQ из испанского перевода."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:84
+#, no-wrap
+msgid "What software do I need to know?"
+msgstr "Какой софт нужно знать?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:88
+msgid ""
+"It is strongly recommended that you maintain a local copy of the FreeBSD Git "
+"repository (at least the documentation part). This can be done by running:"
+msgstr ""
+"Настоятельно рекомендуется поддерживать локальную копию репозитория FreeBSD "
+"Git (по крайней мере, документации). Это можно сделать, выполнив:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:92
+#, no-wrap
+msgid "% git clone https://git.FreeBSD.org/doc.git ~/doc\n"
+msgstr "% git clone https://git.FreeBSD.org/doc.git ~/doc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:95
+msgid "https://git.FreeBSD.org/[git.FreeBSD.org] is a public `git` server."
+msgstr ""
+"https://git.FreeBSD.org/[git.FreeBSD.org] — это публичный `git` сервер."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:99
+msgid "This will require the package:git-lite[] package to be installed."
+msgstr "Для этого потребуется установка пакета package:git-lite[] package."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:103
+msgid ""
+"You should be comfortable using git. This will allow you to see what has "
+"changed between different versions of the files that make up the "
+"documentation."
+msgstr ""
+"Вы должны уверенно пользоваться git. Это позволит вам видеть, какие "
+"изменения были внесены между разными версиями файлов, из которых состоит "
+"документация."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:105
+msgid ""
+"For example, to view the differences between revisions `abff932fe8` and "
+"`2191c44469` of [.filename]#documentation/content/en/articles/committers-"
+"guide/_index.adoc#, run:"
+msgstr ""
+"Например, чтобы посмотреть различия между ревизиями `abff932fe8` и "
+"`2191c44469` файла [.filename]#documentation/content/en/articles/committers-"
+"guide/_index.adoc#, выполните:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:109
+#, no-wrap
+msgid "% git diff abff932fe8 2191c44469 documentation/content/en/articles/committers-guide/_index.adoc\n"
+msgstr "% git diff abff932fe8 2191c44469 documentation/content/en/articles/committers-guide/_index.adoc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:112
+msgid ""
+"Please see the complete explanation of using Git in FreeBSD in the extref:"
+"{handbook}mirrors[FreeBSD Handbook, git]."
+msgstr ""
+"Пожалуйста, ознакомьтесь с полным объяснением использования Git в FreeBSD в "
+"extref:{handbook}mirrors[Руководстве FreeBSD, git]."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:113
+#, no-wrap
+msgid "How do I find out who else might be translating to the same language?"
+msgstr "Как узнать, кто ещё, может быть, переводит на тот же язык?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:118
+msgid ""
+"The https://www.FreeBSD.org/docproj/translations/[Documentation Project "
+"translations page] lists the translation efforts that are currently known "
+"about. If others are already working on translating documentation to your "
+"language, please do not duplicate their efforts. Instead, contact them to "
+"see how you can help."
+msgstr ""
+"https://www.FreeBSD.org/docproj/translations/[Страница переводов проекта "
+"документации] содержит список известных на данный момент переводческих "
+"инициатив. Если кто-то уже работает над переводом документации на ваш язык, "
+"пожалуйста, не дублируйте их усилия. Вместо этого свяжитесь с ними, чтобы "
+"узнать, как вы можете помочь."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:120
+msgid ""
+"If no one is listed on that page as translating for your language, then send "
+"a message to the {freebsd-doc} in case someone else is thinking of doing a "
+"translation, but has not announced it yet."
+msgstr ""
+"Если на этой странице не указан переводчик для вашего языка, отправьте "
+"сообщение в список рассылки {freebsd-doc}, возможно, кто-то уже планирует "
+"сделать перевод, но еще не объявил об этом."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:121
+#, no-wrap
+msgid "No one else is translating to my language. What do I do?"
+msgstr "Никто не переводит на мой язык. Что мне делать?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:125
+msgid ""
+"Congratulations, you have just started the \"FreeBSD _your-language-here_ "
+"Documentation Translation Project\". Welcome aboard."
+msgstr ""
+"Поздравляем, вы только что запустили \"Проект перевода документации FreeBSD "
+"на ваш язык\". Добро пожаловать на борт."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:128
+msgid ""
+"First, decide whether or not you have got the time to spare. Since you are "
+"the only person working on your language at the moment it is going to be "
+"your responsibility to publicize your work and coordinate any volunteers "
+"that might want to help you."
+msgstr ""
+"Сначала решите, есть ли у вас свободное время. Поскольку сейчас вы "
+"единственный, кто работает над вашим языком, вам придется взять на себя "
+"ответственность за рекламу своей работы и координацию добровольцев, которые, "
+"возможно, захотят вам помочь."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:130
+msgid ""
+"Write an email to the Documentation Project mailing list, announcing that "
+"you are going to translate the documentation, so the Documentation Project "
+"translations page can be maintained."
+msgstr ""
+"Напишите письмо в рассылку проекта документации, объявив о том, что вы "
+"собираетесь переводить документацию, чтобы страница переводов проекта "
+"документации могла быть актуальной."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:132
+msgid ""
+"If there is already someone in your country providing FreeBSD mirroring "
+"services you should contact them and ask if you can have some webspace for "
+"your project, and possibly an email address or mailing list services."
+msgstr ""
+"Если в вашей стране уже есть кто-то, предоставляющий услуги зеркалирования "
+"FreeBSD, вам следует связаться с ними и спросить, можете ли вы получить "
+"место для вашего проекта на их веб-сервере, а также, возможно, электронный "
+"адрес или услуги рассылки."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:135
+msgid ""
+"Then pick a document and start translating. It is best to start with "
+"something fairly small - either the FAQ, or one of the tutorials."
+msgstr ""
+"Затем выберите документ и начните перевод. Лучше всего начать с чего-то "
+"относительно небольшого — например, с FAQ или одного из руководств."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:136
+#, no-wrap
+msgid "I have translated some documentation, where do I send it?"
+msgstr "Я перевел часть документации, куда мне ее отправить?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:140
+msgid ""
+"That depends. If you are already working with a translation team (such as "
+"the Japanese team, or the German team) then they will have their own "
+"procedures for handling submitted documentation, and these will be outlined "
+"on their web pages."
+msgstr ""
+"Это зависит от обстоятельств. Если вы уже работаете с командой переводчиков "
+"(например, с японской или немецкой командой), то у них есть свои процедуры "
+"обработки представленной документации, которые описаны на их веб-страницах."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:142
+msgid ""
+"If you are the only person working on a particular language (or you are "
+"responsible for a translation project and want to submit your changes back "
+"to the FreeBSD project) then you should send your translation to the FreeBSD "
+"project (see the next question)."
+msgstr ""
+"Если вы единственный, кто работает над конкретным языком (или вы отвечаете "
+"за проект перевода и хотите отправить свои изменения обратно в проект "
+"FreeBSD), то вам следует отправить свой перевод в проект FreeBSD (см. "
+"следующий вопрос)."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:143
+#, no-wrap
+msgid "I am the only person working on translating to this language, how do I submit my translation?"
+msgstr "Я единственный, кто работает над переводом на этот язык, как мне отправить свой перевод?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:147
+msgid ""
+"First, make sure your translation is organized properly. This means that it "
+"should drop into the existing documentation tree and build straight away."
+msgstr ""
+"Во-первых, убедитесь, что ваш перевод правильно организован. Это означает, "
+"что он должен встраиваться в существующую структуру документации и сразу же "
+"собираться."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:150
+msgid ""
+"Directories below this are named according to the language code they are "
+"written in, as defined in ISO639 ([.filename]#/usr/share/misc/iso639# on a "
+"version of FreeBSD newer than 20th January 1999)."
+msgstr ""
+"Каталоги ниже этого уровня именуются в соответствии с языковыми кодами, на "
+"которых они написаны, как определено в ISO639 ([.filename]#/usr/share/misc/"
+"iso639# в версии FreeBSD новее 20 января 1999 года)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:155
+msgid ""
+"Hugo needs the language codes in lowercase. For example, instead of `pt_BR` "
+"Hugo uses `pt-br`."
+msgstr ""
+"Hugo требует коды языков в нижнем регистре. Например, вместо `pt_BR` Hugo "
+"использует `pt-br`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:159
+msgid ""
+"Currently, the FreeBSD documentation is stored in a top level directory "
+"called [.filename]#documentation/#. Directories below this are named "
+"according to the language code they are written in, as defined in ISO639 "
+"([.filename]#/usr/share/misc/iso639# on a version of FreeBSD newer than 20th "
+"January 1999)."
+msgstr ""
+"В настоящее время документация FreeBSD хранится в корневом каталоге с "
+"названием [.filename]#documentation/#. Каталоги ниже него именуются согласно "
+"языковым кодам, на которых они написаны, как определено в ISO639 "
+"([.filename]#/usr/share/misc/iso639# в версии FreeBSD новее 20 января 1999 "
+"года)."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:161
+msgid ""
+"If your language can be encoded in different ways (for example, Chinese) "
+"then there should be directories below this, one for each encoding format "
+"you have provided."
+msgstr ""
+"Если ваш язык может быть закодирован различными способами (например, "
+"китайский), то ниже должны находиться каталоги для каждого из "
+"предоставленных форматов кодировки."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:163
+msgid "Finally, you should have directories for each document."
+msgstr "Наконец, у вас должны быть каталоги для каждого документа."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:165
+msgid "For example, a hypothetical Swedish translation might look like:"
+msgstr "Например, гипотетический перевод на шведский язык может выглядеть так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:174
+#, no-wrap
+msgid ""
+"documentation/\n"
+" content/\n"
+" sv/\n"
+" books/\n"
+" faq/\n"
+" _index.adoc\n"
+msgstr ""
+"documentation/\n"
+" content/\n"
+" sv/\n"
+" books/\n"
+" faq/\n"
+" _index.adoc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:178
+msgid ""
+"`sv` is the name of the translation, in [.filename]#lang# form. Note the "
+"two Makefiles, which will be used to build the documentation."
+msgstr ""
+"`sv` — это название перевода в форме [.filename]#lang#. Обратите внимание "
+"на два Makefile, которые будут использоваться для сборки документации."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:180
+msgid ""
+"Use git diff command to generate a diff and send it to the link:https://"
+"reviews.freebsd.org/[reviews system]."
+msgstr ""
+"Используйте команду `git diff` для создания diff и отправьте его в систему "
+"link:https://reviews.freebsd.org/[рецензирования]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:184
+#, no-wrap
+msgid "% git diff > sv-faq.diff\n"
+msgstr "% git diff > sv-faq.diff\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:188
+msgid ""
+"You should use Bugzilla to link:https://bugs.freebsd.org/bugzilla/"
+"enter_bug.cgi[submit a report] indicating that you have submitted the "
+"documentation. It would be very helpful if you could get other people to "
+"look over your translation and double check it first, since it is unlikely "
+"that the person committing it will be fluent in the language."
+msgstr ""
+"Вы должны использовать Bugzilla, чтобы link:https://bugs.freebsd.org/"
+"bugzilla/enter_bug.cgi[отправить отчёт], указав, что вы предоставили "
+"документацию. Было бы очень полезно, если бы другие люди проверили ваш "
+"перевод перед отправкой, так как маловероятно, что человек, который будет "
+"его применять, свободно владеет языком."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:191
+msgid ""
+"Someone (probably the Documentation Project Manager, currently {doceng}) "
+"will then take your translation and confirm that it builds. In particular, "
+"the following things will be looked at:"
+msgstr ""
+"Кто-то (скорее всего, руководитель проекта документации, в настоящее время "
+"{doceng}) проверит ваш перевод и убедится, что он собирается. В частности, "
+"будут проверены следующие моменты:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:193
+msgid "Does `make` in the [.filename]#root# directory work correctly?"
+msgstr "Работает ли `make` в директории [.filename]#root# корректно?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:195
+msgid ""
+"If there are any problems then whoever is looking at the submission will get "
+"back to you to work them out."
+msgstr ""
+"Если возникнут проблемы, тот, кто будет рассматривать вашу заявку, свяжется "
+"с вами для их решения."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:197
+msgid ""
+"If there are no problems your translation will be committed as soon as "
+"possible."
+msgstr "Если проблем не возникнет, ваш перевод будет включён как можно скорее."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:198
+#, no-wrap
+msgid "Can I include language or country specific text in my translation?"
+msgstr "Можно ли включать в перевод текст, специфичный для языка или страны?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:201
+msgid "We would prefer that you did not."
+msgstr "Мы бы предпочли, чтобы вы этого не делали."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:203
+msgid ""
+"For example, suppose that you are translating the Handbook to Korean, and "
+"want to include a section about retailers in Korea in your Handbook."
+msgstr ""
+"Например, предположим, что вы переводите Handbook на корейский язык и хотите "
+"добавить раздел о розничных продавцах в Корее в ваш Handbook."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:207
+msgid ""
+"There is no real reason why that information should not be in the English "
+"(or German, or Spanish, or Japanese, or ...) versions as well. It is "
+"feasible that an English speaker in Korea might try to pick up a copy of "
+"FreeBSD whilst over there. It also helps increase FreeBSD's perceived "
+"presence around the globe, which is not a bad thing."
+msgstr ""
+"Нет никаких реальных причин, по которым эта информация не должна быть в "
+"английской (или немецкой, или испанской, или японской, или...) версиях "
+"также. Вполне возможно, что англоговорящий человек в Корее попытается "
+"приобрести копию FreeBSD, находясь там. Это также помогает усилить "
+"воспринимаемое присутствие FreeBSD по всему миру, что не так уж и плохо."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:209
+msgid ""
+"If you have country specific information, please submit it as a change to "
+"the English Handbook (using Bugzilla) and then translate the change back to "
+"your language in the translated Handbook."
+msgstr ""
+"Если у вас есть информация, специфичная для вашей страны, пожалуйста, "
+"отправьте её в виде изменения в англоязычное Руководство (через Bugzilla), а "
+"затем переведите это изменение обратно на ваш язык в локализованной версии "
+"Руководства."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:211
+msgid "Thanks."
+msgstr "Спасибо."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:212
+#, no-wrap
+msgid "Addressing the reader"
+msgstr "Обращение к читателю"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:215
+msgid ""
+"In the English documents, the reader is addressed as \"you\", there is no "
+"formal/informal distinction as there is in some languages."
+msgstr ""
+"В английских документах читатель обращается на «you», здесь нет различия "
+"между формальным и неформальным обращением, как в некоторых языках."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:218
+msgid ""
+"If you are translating to a language which does distinguish, use whichever "
+"form is typically used in other technical documentation in your language. "
+"If in doubt, use a mildly polite form."
+msgstr ""
+"Если вы переводите на язык, где такое различие существует, используйте ту "
+"форму, которая обычно применяется в другой технической документации на вашем "
+"языке. Если сомневаетесь, используйте умеренно вежливую форму."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:219
+#, no-wrap
+msgid "Do I need to include any additional information in my translations?"
+msgstr "Нужно ли включать какую-либо дополнительную информацию в мои переводы?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:222
+msgid "Yes."
+msgstr "Да."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:224
+msgid ""
+"The header of the English version of each document will look something like "
+"this:"
+msgstr ""
+"Заголовок английской версии каждого документа будет выглядеть примерно так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:232
+#, no-wrap
+msgid ""
+" ---\n"
+" title: Why you should use a BSD style license for your Open Source Project\n"
+" releaseinfo: \"$FreeBSD: head/en_US.ISO8859-1/articles/bsdl-gpl/article.xml 53942 2020-03-01 12:23:40Z carlavilla $\"\n"
+" trademarks: [\"freebsd\", \"intel\", \"general\"]\n"
+" ---\n"
+msgstr ""
+" ---\n"
+" title: Why you should use a BSD style license for your Open Source Project\n"
+" releaseinfo: \"$FreeBSD: head/en_US.ISO8859-1/articles/bsdl-gpl/article.xml 53942 2020-03-01 12:23:40Z carlavilla $\"\n"
+" trademarks: [\"freebsd\", \"intel\", \"general\"]\n"
+" ---\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:234
+#, no-wrap
+msgid " = Why you should use a BSD style license for your Open Source Project\n"
+msgstr " = Why you should use a BSD style license for your Open Source Project\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:238
+msgid ""
+"The exact boilerplate may change, but it will always include a $FreeBSD$ "
+"line and the phrase `The FreeBSD Documentation Project`. Note that the "
+"$FreeBSD$ part is expanded automatically by Git, so it should be empty (just "
+"`$FreeBSD$`) for new files."
+msgstr ""
+"Точный шаблон может меняться, но он всегда будет включать строку `$FreeBSD$` "
+"и фразу `The FreeBSD Documentation Project`. Обратите внимание, что часть "
+"`$FreeBSD$` автоматически раскрывается Git, поэтому для новых файлов она "
+"должна быть пустой (просто `$FreeBSD$`)."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:240
+msgid ""
+"Your translated documents should include their own FreeBSD line, and change "
+"the `FreeBSD Documentation Project` line to `The FreeBSD _language_ "
+"Documentation Project`."
+msgstr ""
+"Документы, переведённые вами, должны включать собственную строку FreeBSD, а "
+"также изменять строку `FreeBSD Documentation Project` на `The "
+"FreeBSD_язык_Documentation Project`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:242
+msgid ""
+"In addition, you should add a third line which indicates which revision of "
+"the English text this is based on."
+msgstr ""
+"В дополнение, вы должны добавить третью строку, указывающую, на какую версию "
+"английского текста опирается перевод."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:244
+msgid "So, the Spanish version of this file might start:"
+msgstr "Итак, испанская версия этого файла может начинаться с:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:251
+#, no-wrap
+msgid ""
+" ---\n"
+" title: Soporte para segundos intercalares en FreeBSD\n"
+" releaseinfo: \"$FreeBSD: head/es_ES.ISO8859-1/articles/leap-seconds/article.xml 53090 2019-06-01 17:52:59Z carlavilla $\"\n"
+" ---\n"
+msgstr ""
+" ---\n"
+" title: Soporte para segundos intercalares en FreeBSD\n"
+" releaseinfo: \"$FreeBSD: head/es_ES.ISO8859-1/articles/leap-seconds/article.xml 53090 2019-06-01 17:52:59Z carlavilla $\"\n"
+" ---\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/translations/_index.adoc:253
+#, no-wrap
+msgid " = Soporte para segundos intercalares en FreeBSD\n"
+msgstr " = Soporte para segundos intercalares en FreeBSD\n"
diff --git a/documentation/content/ru/books/fdp-primer/weblate/_index.adoc b/documentation/content/ru/books/fdp-primer/weblate/_index.adoc
new file mode 100644
index 0000000000..b3d2bc2392
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/weblate/_index.adoc
@@ -0,0 +1,456 @@
+---
+description: 'Как присоединиться к команде переводчиков FreeBSD и переводить онлайн в Weblate'
+next: books/fdp-primer/manual-pages
+params:
+ path: /books/fdp-primer/weblate/
+prev: books/fdp-primer/po-translations
+showBookMenu: true
+tags: ["weblate", "po", "translations", "tutorial", "quick start"]
+title: 'Глава 10. Переводы в Weblate'
+weight: 10
+---
+
+[[weblate-translations]]
+= Переводы в Weblate
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 10
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[weblate-introduction]]
+== Введение
+
+Эта глава описывает основные шаги для присоединения к команде переводчиков FreeBSD, перевода онлайн в Weblate или офлайн, а также содержит простые рекомендации по переводу, вычитке и тестированию. Основное внимание уделено части, связанной с переводом.
+
+Исходные документы (статьи и книги) находятся на {main-site}[портале документации].
+
+https://weblate.org/en/[Weblate] — это веб-ориентированное программное обеспечение с открытым исходным кодом, специализирующееся на локализации. Проект FreeBSD поддерживает собственный экземпляр.
+
+[[weblate-become-translator]]
+== Как стать переводчиком FreeBSD
+
+Вот простые шаги для начала перевода статей и книг проекта документации FreeBSD.
+
+. Создайте учетную запись на https://translate-dev.freebsd.org/[FreeBSD Weblate] с помощью электронной почты или вашего аккаунта GitHub.
+. Подписаться на список рассылки {freebsd-translators}.
+. Представьтесь и попросите присоединиться к языковой команде. Если языковая команда не существует, попросите создать её. Самопредставление обязательно. Оно увеличивает шансы на одобрение доступа на запись.
+. Войдите в https://translate-dev.freebsd.org/[Weblate] с новым аккаунтом.
+. Найдите языковую команду и выберите первый документ для перевода.
+. Создайте учетную запись в Bugzilla, чтобы отправлять переводы после завершения работы над документом. Проект документации также принимает Pull Requests на GitHub с переводами.
+
+[WARNING]
+====
+Все файлы переводов и документы должны соответствовать https://www.freebsd.org/copyright/freebsd-doc-license/[Лицензии документации FreeBSD]; если это неприемлемо, пожалуйста, не регистрируйтесь и не присылайте никаких исправлений или переводов.
+====
+
+[[weblate-introduce-yourself]]
+== Представьтесь
+
+Предоставьте краткое самопредставление в рассылке {freebsd-translators}, чтобы начать процесс предоставления доступа. Это позволит координатору языка или администратору выдать необходимые права новому пользователю Weblate для начала перевода.
+
+Ниже приведен пример того, как может выглядеть такое письмо.
+
+[.programlisting]
+....
+Subject: Self-Introduction: Name and language
+
+Name: Name (use preferred name)
+Location: City, country (optional)
+Login: username or email (essential)
+Language: Language to translate (essential)
+Profession or student status: (optional)
+About You: (free format -- info which you feel comfortable sharing with
+ others: company, school, other affiliation, historical qualifications, other
+ projects you have worked on, level and type of computer skills, other relevant skills,
+ etc.)
+You and the FreeBSD Project: (free format: other FreeBSD projects of
+ interest, comments, etc.)
+....
+
+[[weblate-login]]
+== Вход в Weblate
+
+Откройте https://translate-dev.freebsd.org/[] и `Войдите` (Sign in).
+
+image::weblate-login.png["Логин в Webleate", 800]
+
+Используйте имя пользователя, адрес электронной почты или учетную запись GitHub для входа.
+
+Профиль пользователя содержит ваши предпочтения, имя и адрес электронной почты. Имя и адрес будут использоваться в коммитах; сохраняйте эту информацию актуальной.
+
+На экземпляре Weblate FreeBSD все переводы будут зафиксированы в https://github.com/freebsd/freebsd-doc-translate[freebsd-doc-translate] (промежуточном репозитории на GitHub), а не напрямую в https://github.com/freebsd/freebsd-doc[freebsd-doc]. Переводчики должны брать файлы PO gettext (`.po`), преобразовывать их в `.adoc` и отправлять через https://bugs.freebsd.org/bugzilla/[Bugzilla] или https://github.com/freebsd/freebsd-doc/pulls[GitHub], чтобы переведённый документ был опубликован или обновлён в портале документации. Подробнее см. в следующих разделах.
+
+Weblate будет фиксировать изменения ежедневно, как минимум в `freebsd-doc-translate`, если есть новые переведённые строки.
+
+[[weblate-find-language-team]]
+== Найти команду локализации для участия
+
+Нажмите `Проекты`, выберите `Документация`, затем нажмите `Языки` и увидите все доступные языки.
+
+image::weblate-languages.png["Языки в Weblate", 500]
+
+Обратите внимание, что некоторые языки и переведённые документы уже доступны в портале документации и репозиториях.
+
+Если желаемый язык для перевода недоступен в Weblate, пожалуйста, свяжитесь с https://www.freebsd.org/docproj/translations/[координаторами по языкам], прежде чем запрашивать создание нового языка. Если ответа не последует, обратитесь по адресу: {doceng}.
+
+[[weblate-translating-online]]
+== Перевод онлайн на Weblate
+
+Перевод документов онлайн оказывается наиболее простым способом перевода документации в FreeBSD, так как позволяет пользователям совместно работать над одним файлом, распределяя нагрузку.
+
+После того как координатор или администратор предоставит пользователю доступ к определённому языку, кнопка сохранения станет активной, и пользователь сможет начать перевод.
+
+image::weblate-documents.png["Weblate Документы", 800]
+image::weblate-translate.png["Weblate Translate", 800]
+
+В Weblate есть набор ссылок, ведущих к непосредственному переводу. Перевод далее разделён на отдельные проверки, такие как `Не переведено` или `Требует проверки`. Если весь документ переведён без ошибок, ссылка `Все переводы` всё равно доступна на случай, если потребуется проверка. Также можно воспользоваться полем поиска, чтобы найти конкретную строку или термин.
+
+В https://docs.weblate.org/en/latest/user/translating.html#translation-projects[документации Weblate] содержится дополнительная информация о переводах, например, сочетания клавиш и другие советы по работе с инструментом перевода.
+
+[[weblate-translating-offline]]
+== Перевод в автономном режиме
+
+Weblate на FreeBSD использует файлы перевода PO gettext. Пользователи, знакомые с файлами PO gettext, которые хотят переводить офлайн, могут загружать и выгружать переводы на странице документа в Weblate, выбрав пункт в меню `Files`.
+
+image::weblate-offline.png["Weblate Offline", 800]
+
+[[weblate-automatic-suggestions]]
+== Перевод на основе автоматических предложений
+
+Языки, использующие Weblate до миграции на Hugo/Asciidoctor, могут использовать эту функцию в Weblate для экономии времени.
+
+Эта функция Weblate использует память переводов, созданную другими компонентами и проектами на том же сервере. Для этого прежние переводы Weblate сохранены на том же сервере в режиме только для чтения.
+
+Строки, совпадающие с `100/100` по степени схожести, могут быть скопированы и сохранены напрямую. Остальным строкам потребуется как минимум незначительная корректировка.
+
+Некоторые примеры:
+
+image::weblate_automatic_suggestion_01.png["Weblate Автоматические предложения 01", 800]
+
+С переходом на Hugo/Asciidoctor документы используют UTF-8. Некоторые HTML-сущности следует заменить. Некоторые строки, такие как ссылки, требуют изменений в разметке.
+
+image::weblate_automatic_suggestion_02.png["Weblate Автоматические предложения 02", 800]
+
+Ссылки:
+
+image::weblate_automatic_suggestion_03.png["Weblate Автоматические предложения 03", 800]
+
+[[weblate-proofreading-qa]]
+== Вычитка и проверка качества в Weblate
+
+Панель документа `Project/Language/Document` отображает статус перевода и состояние строк для этого документа. Эта страница удобна для вычитки и проверки качества.
+
+image::weblate-revision1.png["Weblate Ревизия 01", 800]
+
+В этом примере две строки пропустили точку; переход по этой ссылке покажет только те строки, которые нужно пересмотреть/перевести.
+
+image::weblate-revision2.png["Weblate Ревизия 02", 800]
+
+Переводчики и рецензенты часто ценят возможность видеть переведённые строки в контексте.
+
+[[weblate-building]]
+== Сборка переведенного документа
+
+Проект не использует непрерывную интеграцию и непрерывную поставку для сборки переводов. Ведутся исследования по внедрению этой возможности.
+
+[NOTE]
+====
+Следующий пример использует GitHub, так как Weblate также находится на GitHub . Обратите внимание, что этот репозиторий доступен только для чтения, но Pull Requests принимаются.
+====
+
+Для локальной сборки перевода выполните следующие шаги:
+
+[[weblate-clone-repositories]]
+
+[.procedure]
+====
+.Процедура: Клонирование необходимых репозиториев
+. Клонирование репозитория `freebsd-doc`:
++
+[source, console?prompt=%]
+....
+% git clone https://github.com/freebsd/freebsd-doc.git ~/freebsd-doc
+....
+
+. Клонирование репозитория `freebsd-doc-translate`:
++
+[source, console?prompt=%]
+....
+% git clone https://github.com/freebsd/freebsd-doc-translate.git ~/freebsd-doc-translate
+....
+====
+
+[[weblate-copy-translation]]
+
+[.procedure]
+====
+.Процедура: Копирование файла перевода в `freebsd-doc`
+
+Имея оба репозитория, скопируйте перевод из `freebsd-doc-translate` в `freebsd-doc`. Пример перевода статьи Руководства для коммиттеров на испанском языке.
+
+[source, console?prompt=%]
+....
+% cp ~/freebsd-doc-translate/documentation/content/es/articles/committers-guide/_index.po \
+~/freebsd-doc/documentation/content/es/articles/committers-guide/
+....
+====
+
+[[weblate-translate]]
+
+[.procedure]
+====
+.Процедура: Преобразование файла перевода (`.po`) в `.adoc`
+
+Перейдите в корень `freebsd-doc`.
+
+[source, console?prompt=%]
+....
+% cd ~/freebsd-doc
+....
+
+Преобразовать файл `.po` в `.adoc`
+
+[source, console?prompt=%]
+....
+% ./tools/translate.sh documentation es articles/committers-guide
+....
+
+По умолчанию: только файлы с более чем восьмидесятью процентами переведённых строк будут преобразованы в `.adoc`.
+
+Чтобы игнорировать это ограничение:
+
+[source, console?prompt=%]
+....
+% KEEP_ENV=0 ./tools/translate.sh documentation es articles/committers-guide
+....
+
+====
+
+Некоторые документы, такие как книги, содержат множество PO-файлов gettext. Всегда копируйте их все при переводе и сборке. Файлы, которые не были переведены, будут преобразованы с исходными (английскими) строками.
+
+[WARNING]
+====
+Структура каталогов является основополагающей. Всегда следуйте структуре каталогов английского документа.
+====
+
+[[weblate-build]]
+
+[.procedure]
+====
+.Процедура: Сборка переведенного документа
+
+Наконец, часть сборки.
+
+Перейдите в каталог документации, так как сборка веб-сайта FreeBSD не требуется.
+
+[source, console?prompt=%]
+....
+% cd documentation
+....
+
+И соберите документацию. Обратите внимание, что `en` всегда добавляется по умолчанию при сборке любого другого языка.
+
+[source, console?prompt=%]
+....
+% DOC_LANG=es make
+....
+
+Эта команда соберет только английскую и испанскую документацию портала FreeBSD. Результат будет сохранен в каталоге [.filename]#public#; откройте его в браузере. Обратите внимание, что некоторые индексные файлы могут перенаправлять браузер на онлайн-страницу.
+
+Еще один хороший вариант — собрать и предоставить контент с помощью встроенного веб-сервера Hugo:
+
+[source, console?prompt=%]
+....
+% DOC_LANG=es make run
+....
+
+По умолчанию веб-сервер прослушивает `localhost`; чтобы изменить это поведение, укажите нужный IP-адрес в значении параметра `BIND`.
+
+[source, console?prompt=%]
+....
+% DOC_LANG=es make run BIND=192.168.15.10
+....
+
+Это собирает и предоставляет содержимое с помощью встроенного веб-сервера Hugo, оставляя его открытым, и при любых изменениях файлов автоматически пересобирает их.
+====
+
+Чтобы внести необходимые изменения в перевод, выполните следующие шаги для повторной синхронизации всех компонентов:
+
+- Исправьте строку перевода на https://translate-dev.freebsd.org/[Weblate].
+- Заставьте Weblate зафиксировать изменения в разделе `Document/Manage/Commit`.
+- Синхронизируйте локальный репозиторий Weblate `freebsd-doc-translate` с помощью команды `git pull origin main`.
+- Скопируйте перевод снова в `freebsd-doc`.
+- Преобразуйте перевод в .adoc с помощью скрипта `./tools/translate.sh`.
+- Hugo пересоберет файл и не будет собирать весь набор, если использовалась команда `make run`, или повторно выполнит `make`.
+
+[IMPORTANT]
+====
+Повторяйте предыдущие шаги столько раз, сколько необходимо, пока документ не будет готов к публикации.
+====
+
+Глава crossref:doc-build[doc-build-rendering,Процесс сборки документации] содержит информацию о преобразовании в HTML и PDF.
+
+[[weblate-submitting-translations]]
+== Отправка переводов
+
+Пример отправки обновления для статьи на бразильском португальском Committer's Guide.
+
+
+[[weblate-git-repo-status]]
+
+[.procedure]
+====
+.Проверка репозитория
+
+После выполнения шагов из раздела crossref:weblate[weblate-building,Сборка переведенного документа], перейдите в корневую директорию `freebsd-doc` и просмотрите, что будет включено в коммит. Для просмотра списка изменяемых файлов и различий в их содержимом:
+
+[source, console?prompt=%]
+....
+% git status
+% git diff
+....
+
+Просмотрите вывод, и если какие-либо файлы, не связанные с обновлением перевода Руководства коммиттера, были изменены или добавлены, выполните соответствующее действие по их откату или удалению соответственно, прежде чем продолжить.
+
+Всегда включайте файл PO gettext (`.po`) и переведенный документ в Hugo/Asciidoctor (`.adoc`).
+====
+
+[[weblate-git-new-branch]]
+
+[.procedure]
+====
+.Создать новую ветку и зафиксировать изменения
+
+Создайте еще одну ветку для разделения работы, что поможет при будущих обновлениях в локальном репозитории.
+
+[source, console?prompt=%]
+....
+% git checkout -b committers-guide_pt-br
+....
+
+Зарегистрировать локальный коммит.
+
+[source, console?prompt=%]
+....
+% git add .
+% git commit
+....
+
+Пример сообщений коммитов для переводов:
+
+[.programlisting]
+....
+pt-br/committers-guide: Sync with en XXXXXXX
+....
+
+Где `XXXXXXX` — это ревизия man:git[1], хранящаяся в репозитории Weblate в файле [.filename]#~/freebsd-doc-translate/revision.txt#.
+
+Если это первый перевод статьи:
+
+[.programlisting]
+....
+Add Korean translation of Leap Seconds article
+....
+
+После выполнения коммита будет отображено сообщение, если man:git[1] ранее не был настроен. Следуйте инструкциям и укажите имя и адрес электронной почты, используемые в Weblate. Этот шаг важен для правильного учета вклада участников.
+
+Затем проверьте весь коммит, просмотрите изменения, а также имя автора и адрес электронной почты.
+
+[source, console?prompt=%]
+....
+% git show
+....
+====
+
+[[weblate-git-patch-submit]]
+
+[.procedure]
+====
+.Сгенерировать патч
+
+Далее создайте файл man:git-format-patch[1].
+
+[source, console?prompt=%]
+....
+% git format-patch main
+0001-pt-br-committers-guide-Sync-with-en-XXXXXXX.patch
+....
+====
+
+Прикрепите патч [.filename]#0001-pt-br-committers-guide-Sync-with-en-XXXXXXX.patch# к отчёту об ошибке в https://bugs.freebsd.org/bugzilla/[FreeBSD Bugzilla].
+
+Включите следующую информацию в отчёт:
+
+[[weblate-bugzilla-fields]]
+.Поля Bugzilla
+[cols="1,1", frame="none", options="header"]
+|===
+| Поле
+| Значение
+
+| *продукт (product)*
+| Documentation
+
+| *Компонент (Component)*
+| Books & Articles
+
+| *Сводка (Summary)*
+| Тот же текст, что и в локальном коммите
+
+| *Описание (Description)*
+| Укажите, что инструкции в этом руководстве были выполнены, включая вычитку и другие необходимые шаги.
+Включите сведения, которые могут помочь с анализом и продвижением отчёта.
+
+
+| *СС* (Необязательно)
+| Если в языке есть координаторы, укажите их адреса электронной почты в поле CC.
+|===
+
+Для тех, кто знаком с man:git[1] и GitHub: вместо отправки исправления через https://bugs.freebsd.org/bugzilla/[Bugzilla], можно использовать https://github.com/freebsd/freebsd-doc/pulls[запрос на включение изменений (pull request) в GitHub] (укажите имя и адрес, которые вы используете в Weblate).
+
+https://github.com/freebsd/freebsd-doc/ является вторичным зеркалом. Изменения в дереве `doc` могут вносить только люди, имеющие права на коммит (`doc commit bit`).
+
+Когда переводчики продолжают присылать качественные исправления, другие коммиттеры могут выдвинуть их для получения прав на запись (extref:{committers-guide}[бит коммита для документации, committer.types] для переводов), учётной записи FreeBSD и сопутствующих привилегий.
+
+Список extref:{contributors}[дополнительных участников FreeBSD, contrib-additional] включает некоммиттеров, чьи изменения были закоммичены в дерево `doc`.
+
+Если вы сомневаетесь в каком-либо действии, напишите в {freebsd-translators}.
+
+[[weblate-faq]]
+== FAQ (Часто задаваемые Вопросы)
+
+[[weblate-copyrights]]
+=== Нужно ли переводить все сообщения об авторских правах?
+
+Каждая языковая команда решает этот вопрос для своего языка; в команде `pt-br` (бразильский португальский) было решено не переводить эти сообщения.
diff --git a/documentation/content/ru/books/fdp-primer/weblate/_index.po b/documentation/content/ru/books/fdp-primer/weblate/_index.po
new file mode 100644
index 0000000000..89906a544e
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/weblate/_index.po
@@ -0,0 +1,1259 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerweblate_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:1
+#, no-wrap
+msgid "How to join the FreeBSD translators team and translate online on Weblate"
+msgstr "Как присоединиться к команде переводчиков FreeBSD и переводить онлайн в Weblate"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:1
+#, no-wrap
+msgid "Chapter 10. Weblate Translations"
+msgstr "Глава 10. Переводы в Weblate"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:14
+#, no-wrap
+msgid "Weblate Translations"
+msgstr "Переводы в Weblate"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:52
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:56
+msgid ""
+"This chapter describes some basic steps for joining the FreeBSD translators "
+"team, translating online on Weblate or offline, and some simple suggestions "
+"on translating, proofreading, and testing. It's focused on the translation "
+"part."
+msgstr ""
+"Эта глава описывает основные шаги для присоединения к команде переводчиков "
+"FreeBSD, перевода онлайн в Weblate или офлайн, а также содержит простые "
+"рекомендации по переводу, вычитке и тестированию. Основное внимание уделено "
+"части, связанной с переводом."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:58
+msgid ""
+"The original documents (articles and books) are in the {main-site}"
+"[documentation portal]."
+msgstr ""
+"Исходные документы (статьи и книги) находятся на {main-site}[портале "
+"документации]."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:60
+msgid ""
+"https://weblate.org/en/[Weblate] is web-based open-source software focused "
+"on localization; the FreeBSD project runs a local instance."
+msgstr ""
+"https://weblate.org/en/[Weblate] — это веб-ориентированное программное "
+"обеспечение с открытым исходным кодом, специализирующееся на локализации. "
+"Проект FreeBSD поддерживает собственный экземпляр."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:62
+#, no-wrap
+msgid "How to Become a FreeBSD Translator"
+msgstr "Как стать переводчиком FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:65
+msgid ""
+"Following are simple steps to start translating articles and books of the "
+"FreeBSD Documentation Project."
+msgstr ""
+"Вот простые шаги для начала перевода статей и книг проекта документации "
+"FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:67
+msgid ""
+"Create an account on the https://translate-dev.freebsd.org/[FreeBSD Weblate "
+"instance] with an email address or your GitHub account."
+msgstr ""
+"Создайте учетную запись на https://translate-dev.freebsd.org/[FreeBSD "
+"Weblate] с помощью электронной почты или вашего аккаунта GitHub."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:68
+msgid "Subscribe to the {freebsd-translators}."
+msgstr "Подписаться на список рассылки {freebsd-translators}."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:72
+msgid ""
+"Introduce yourself and ask to join a language team. If the language team "
+"does not exist, ask to create it. The self-introduction is essential. It "
+"raises your chances of being approved for write access."
+msgstr ""
+"Представьтесь и попросите присоединиться к языковой команде. Если языковая "
+"команда не существует, попросите создать её. Самопредставление "
+"обязательно. Оно увеличивает шансы на одобрение доступа на запись."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:73
+msgid ""
+"Login to https://translate-dev.freebsd.org/[Weblate] with the new account."
+msgstr ""
+"Войдите в https://translate-dev.freebsd.org/[Weblate] с новым аккаунтом."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:74
+msgid "Find the language team and choose an initial document to translate."
+msgstr "Найдите языковую команду и выберите первый документ для перевода."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:76
+msgid ""
+"Create a Bugzilla account to submit the translations after finishing a "
+"document. The Documentation project is also accepting GitHub Pull Requests "
+"with translation submissions."
+msgstr ""
+"Создайте учетную запись в Bugzilla, чтобы отправлять переводы после "
+"завершения работы над документом. Проект документации также принимает Pull "
+"Requests на GitHub с переводами."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:80
+msgid ""
+"All translation files and documents must follow https://www.freebsd.org/"
+"copyright/freebsd-doc-license/[The FreeBSD Documentation License]; if this "
+"is unacceptable, please do not sign up or send any patches or translations."
+msgstr ""
+"Все файлы переводов и документы должны соответствовать https://"
+"www.freebsd.org/copyright/freebsd-doc-license/[Лицензии документации "
+"FreeBSD]; если это неприемлемо, пожалуйста, не регистрируйтесь и не "
+"присылайте никаких исправлений или переводов."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:83
+#, no-wrap
+msgid "Introduce Yourself"
+msgstr "Представьтесь"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:87
+msgid ""
+"Please provide a brief self-introduction on the {freebsd-translators} to "
+"initiate the process of granting access. This will enable a language "
+"coordinator or administrator to provide the necessary permissions for the "
+"new user of Weblate to start translating."
+msgstr ""
+"Предоставьте краткое самопредставление в рассылке {freebsd-translators}, "
+"чтобы начать процесс предоставления доступа. Это позволит координатору "
+"языка или администратору выдать необходимые права новому пользователю "
+"Weblate для начала перевода."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:89
+msgid "Following is an example of how such an email could look."
+msgstr "Ниже приведен пример того, как может выглядеть такое письмо."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:93
+#, no-wrap
+msgid "Subject: Self-Introduction: Name and language\n"
+msgstr "Subject: Self-Introduction: Name and language\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:105
+#, no-wrap
+msgid ""
+"Name: Name (use preferred name)\n"
+"Location: City, country (optional)\n"
+"Login: username or email (essential)\n"
+"Language: Language to translate (essential)\n"
+"Profession or student status: (optional)\n"
+"About You: (free format -- info which you feel comfortable sharing with\n"
+" others: company, school, other affiliation, historical qualifications, other\n"
+" projects you have worked on, level and type of computer skills, other relevant skills,\n"
+" etc.)\n"
+"You and the FreeBSD Project: (free format: other FreeBSD projects of\n"
+" interest, comments, etc.)\n"
+msgstr ""
+"Name: Name (use preferred name)\n"
+"Location: City, country (optional)\n"
+"Login: username or email (essential)\n"
+"Language: Language to translate (essential)\n"
+"Profession or student status: (optional)\n"
+"About You: (free format -- info which you feel comfortable sharing with\n"
+" others: company, school, other affiliation, historical qualifications, other\n"
+" projects you have worked on, level and type of computer skills, other relevant skills,\n"
+" etc.)\n"
+"You and the FreeBSD Project: (free format: other FreeBSD projects of\n"
+" interest, comments, etc.)\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:108
+#, no-wrap
+msgid "Login to Weblate"
+msgstr "Вход в Weblate"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:111
+msgid "Open https://translate-dev.freebsd.org/[] and `Sign in`."
+msgstr "Откройте https://translate-dev.freebsd.org/[] и `Войдите` (Sign in)."
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:112
+#, no-wrap
+msgid "Weblate Login"
+msgstr "Логин в Webleate"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:112
+#, no-wrap
+msgid "weblate-login.png"
+msgstr "weblate-login.png"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:115
+msgid "Use a username, email address, or GitHub account to log in."
+msgstr ""
+"Используйте имя пользователя, адрес электронной почты или учетную запись "
+"GitHub для входа."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:118
+msgid ""
+"The user profile contains your preferences, name, and email address. The "
+"name and address will be used in commits; keep this information accurate."
+msgstr ""
+"Профиль пользователя содержит ваши предпочтения, имя и адрес электронной "
+"почты. Имя и адрес будут использоваться в коммитах; сохраняйте эту "
+"информацию актуальной."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:122
+msgid ""
+"On the FreeBSD Weblate instance, all translations will be committed to "
+"https://github.com/freebsd/freebsd-doc-translate[freebsd-doc-translate] (an "
+"intermediate repository on GitHub), not directly to https://github.com/"
+"freebsd/freebsd-doc[freebsd-doc]. Translators must take the PO gettext "
+"files (`.po`), converting them to `.adoc` and submit it via https://"
+"bugs.freebsd.org/bugzilla/[Bugzilla] or https://github.com/freebsd/freebsd-"
+"doc/pulls[GitHub] to get the translated document published or updated in the "
+"documentation portal. See more in the following sections."
+msgstr ""
+"На экземпляре Weblate FreeBSD все переводы будут зафиксированы в https://"
+"github.com/freebsd/freebsd-doc-translate[freebsd-doc-translate] "
+"(промежуточном репозитории на GitHub), а не напрямую в https://github.com/"
+"freebsd/freebsd-doc[freebsd-doc]. Переводчики должны брать файлы PO gettext "
+"(`.po`), преобразовывать их в `.adoc` и отправлять через https://"
+"bugs.freebsd.org/bugzilla/[Bugzilla] или https://github.com/freebsd/freebsd-"
+"doc/pulls[GitHub], чтобы переведённый документ был опубликован или обновлён "
+"в портале документации. Подробнее см. в следующих разделах."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:124
+msgid ""
+"Weblate will commit daily, at least to `freebsd-doc-translate`, if any new "
+"strings are translated."
+msgstr ""
+"Weblate будет фиксировать изменения ежедневно, как минимум в `freebsd-doc-"
+"translate`, если есть новые переведённые строки."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:126
+#, no-wrap
+msgid "Find a Language Team to Join In"
+msgstr "Найти команду локализации для участия"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:129
+msgid ""
+"Click `Projects`, choose `Documentation`, then click `Languages`, and see "
+"all the available languages."
+msgstr ""
+"Нажмите `Проекты`, выберите `Документация`, затем нажмите `Языки` и увидите "
+"все доступные языки."
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:130
+#, no-wrap
+msgid "Weblate Languages"
+msgstr "Языки в Weblate"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:130
+#, no-wrap
+msgid "weblate-languages.png"
+msgstr "weblate-languages.png"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:133
+msgid ""
+"Note that some languages and translated documents already exist in the "
+"documentation portal and repositories."
+msgstr ""
+"Обратите внимание, что некоторые языки и переведённые документы уже доступны "
+"в портале документации и репозиториях."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:136
+msgid ""
+"If the desired language for translation is not available in Weblate, please "
+"contact the https://www.freebsd.org/docproj/translations/[language "
+"coordinators] before asking to create a new language. If there is no "
+"answer, then write to the {doceng}."
+msgstr ""
+"Если желаемый язык для перевода недоступен в Weblate, пожалуйста, свяжитесь "
+"с https://www.freebsd.org/docproj/translations/[координаторами по языкам], "
+"прежде чем запрашивать создание нового языка. Если ответа не последует, "
+"обратитесь по адресу: {doceng}."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:138
+#, no-wrap
+msgid "Translating Online on Weblate"
+msgstr "Перевод онлайн на Weblate"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:141
+msgid ""
+"Translating documents online proves to be the easiest method for document "
+"translation on FreeBSD, as it allows users to collaborate on the same file, "
+"distributing the workload."
+msgstr ""
+"Перевод документов онлайн оказывается наиболее простым способом перевода "
+"документации в FreeBSD, так как позволяет пользователям совместно работать "
+"над одним файлом, распределяя нагрузку."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:143
+msgid ""
+"Once a coordinator or administrator grants access to a specific language for "
+"a username, the save button will be enabled, so that this user can start "
+"translating."
+msgstr ""
+"После того как координатор или администратор предоставит пользователю доступ "
+"к определённому языку, кнопка сохранения станет активной, и пользователь "
+"сможет начать перевод."
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:144
+#, no-wrap
+msgid "Weblate Documents"
+msgstr "Weblate Документы"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:144
+#, no-wrap
+msgid "weblate-documents.png"
+msgstr "weblate-documents.png"
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:145
+#, no-wrap
+msgid "Weblate Translate"
+msgstr "Weblate Translate"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:145
+#, no-wrap
+msgid "weblate-translate.png"
+msgstr "weblate-translate.png"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:151
+msgid ""
+"Weblate has a set of links that lead to actual translation. The translation "
+"is further divided into individual checks, like `Untranslated` or `Needing "
+"review`. If the whole document is translated without any error, `All "
+"translations` link is still available in case a review is necessary. "
+"Alternatively, the search field can be used to find a specific string or "
+"term."
+msgstr ""
+"В Weblate есть набор ссылок, ведущих к непосредственному переводу. Перевод "
+"далее разделён на отдельные проверки, такие как `Не переведено` или `Требует "
+"проверки`. Если весь документ переведён без ошибок, ссылка `Все переводы` "
+"всё равно доступна на случай, если потребуется проверка. Также можно "
+"воспользоваться полем поиска, чтобы найти конкретную строку или термин."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:153
+msgid ""
+"In the https://docs.weblate.org/en/latest/user/translating.html#translation-"
+"projects[Weblate documentation], there is more info about translations, like "
+"keyboard shortcuts and other tips about the translation tool."
+msgstr ""
+"В https://docs.weblate.org/en/latest/user/translating.html#translation-"
+"projects[документации Weblate] содержится дополнительная информация о "
+"переводах, например, сочетания клавиш и другие советы по работе с "
+"инструментом перевода."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:155
+#, no-wrap
+msgid "Translating Offline"
+msgstr "Перевод в автономном режиме"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:159
+msgid ""
+"Weblate on FreeBSD uses PO gettext files for translations. Users familiar "
+"with PO gettext files that want to translate offline can download and upload "
+"the translations through the document page on Weblate by clicking in the "
+"`Files` section."
+msgstr ""
+"Weblate на FreeBSD использует файлы перевода PO gettext. Пользователи, "
+"знакомые с файлами PO gettext, которые хотят переводить офлайн, могут "
+"загружать и выгружать переводы на странице документа в Weblate, выбрав пункт "
+"в меню `Files`."
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:160
+#, no-wrap
+msgid "Weblate Offline"
+msgstr "Weblate Offline"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:160
+#, no-wrap
+msgid "weblate-offline.png"
+msgstr "weblate-offline.png"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:163
+#, no-wrap
+msgid "Translation based on Automatic Suggestions"
+msgstr "Перевод на основе автоматических предложений"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:166
+msgid ""
+"Languages using Weblate before the migration to Hugo/Asciidoctor can use "
+"this feature from Weblate to save time."
+msgstr ""
+"Языки, использующие Weblate до миграции на Hugo/Asciidoctor, могут "
+"использовать эту функцию в Weblate для экономии времени."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:169
+msgid ""
+"This feature from Weblate uses the Translation Memory generated by the other "
+"components and projects on the same server. The former Weblate translations "
+"are hosted on the same server as read-only for that."
+msgstr ""
+"Эта функция Weblate использует память переводов, созданную другими "
+"компонентами и проектами на том же сервере. Для этого прежние переводы "
+"Weblate сохранены на том же сервере в режиме только для чтения."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:172
+msgid ""
+"Strings that match `100/100` in similarity can be copied and saved "
+"directly. Other strings will need at least minor adjustment."
+msgstr ""
+"Строки, совпадающие с `100/100` по степени схожести, могут быть скопированы "
+"и сохранены напрямую. Остальным строкам потребуется как минимум "
+"незначительная корректировка."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:174
+msgid "Some examples:"
+msgstr "Некоторые примеры:"
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:175
+#, no-wrap
+msgid "Weblate Automatic Suggestions 01"
+msgstr "Weblate Автоматические предложения 01"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:175
+#, no-wrap
+msgid "weblate_automatic_suggestion_01.png"
+msgstr "weblate_automatic_suggestion_01.png"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:180
+msgid ""
+"With the migration to Hugo/Asciidoctor, documents use UTF-8. Some HTML "
+"entities should be replaced. Some strings, such as links, require changes "
+"to markup."
+msgstr ""
+"С переходом на Hugo/Asciidoctor документы используют UTF-8. Некоторые HTML-"
+"сущности следует заменить. Некоторые строки, такие как ссылки, требуют "
+"изменений в разметке."
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:181
+#, no-wrap
+msgid "Weblate Automatic Suggestions 02"
+msgstr "Weblate Автоматические предложения 02"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:181
+#, no-wrap
+msgid "weblate_automatic_suggestion_02.png"
+msgstr "weblate_automatic_suggestion_02.png"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:184
+msgid "Links:"
+msgstr "Ссылки:"
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:185
+#, no-wrap
+msgid "Weblate Automatic Suggestions 03"
+msgstr "Weblate Автоматические предложения 03"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:185
+#, no-wrap
+msgid "weblate_automatic_suggestion_03.png"
+msgstr "weblate_automatic_suggestion_03.png"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:188
+#, no-wrap
+msgid "Proofreading and Weblate Quality Checks"
+msgstr "Вычитка и проверка качества в Weblate"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:192
+msgid ""
+"The document dashboard `Project/Language/Document` shows the translation "
+"status and string status for that document. This page is handy for "
+"proofreading and quality checks."
+msgstr ""
+"Панель документа `Project/Language/Document` отображает статус перевода и "
+"состояние строк для этого документа. Эта страница удобна для вычитки и "
+"проверки качества."
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:193
+#, no-wrap
+msgid "Weblate Revision 01"
+msgstr "Weblate Ревизия 01"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:193
+#, no-wrap
+msgid "weblate-revision1.png"
+msgstr "weblate-revision1.png"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:196
+msgid ""
+"In this example, two strings are missing the full stop; following that link "
+"will show only those strings to be revised/translated."
+msgstr ""
+"В этом примере две строки пропустили точку; переход по этой ссылке покажет "
+"только те строки, которые нужно пересмотреть/перевести."
+
+#. type: Positional ($1) AttributeList argument for macro 'image'
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:197
+#, no-wrap
+msgid "Weblate Revision 02"
+msgstr "Weblate Ревизия 02"
+
+#. type: Target for macro image
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:197
+#, no-wrap
+msgid "weblate-revision2.png"
+msgstr "weblate-revision2.png"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:200
+msgid ""
+"Translators and reviewers often value observing translated strings in "
+"context."
+msgstr ""
+"Переводчики и рецензенты часто ценят возможность видеть переведённые строки "
+"в контексте."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:202
+#, no-wrap
+msgid "Building the Translated Document"
+msgstr "Сборка переведенного документа"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:206
+msgid ""
+"The project does not use continuous integration and continuous delivery to "
+"build translations. There are studies to make it available."
+msgstr ""
+"Проект не использует непрерывную интеграцию и непрерывную поставку для "
+"сборки переводов. Ведутся исследования по внедрению этой возможности."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:211
+msgid ""
+"The following example uses GitHub, as Weblate is also on GitHub. Note that "
+"this repository is a read-only mirror, but Pull Requests are accepted."
+msgstr ""
+"Следующий пример использует GitHub, так как Weblate также находится на "
+"GitHub . Обратите внимание, что этот репозиторий доступен только для чтения, "
+"но Pull Requests принимаются."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:214
+msgid "To build the translation locally, follow these steps:"
+msgstr "Для локальной сборки перевода выполните следующие шаги:"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:219
+#, no-wrap
+msgid "Procedure: Clone the necessary repositories"
+msgstr "Процедура: Клонирование необходимых репозиториев"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:221
+msgid "Clone the `freebsd-doc` repository:"
+msgstr "Клонирование репозитория `freebsd-doc`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:225
+#, no-wrap
+msgid "% git clone https://github.com/freebsd/freebsd-doc.git ~/freebsd-doc\n"
+msgstr "% git clone https://github.com/freebsd/freebsd-doc.git ~/freebsd-doc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:228
+msgid "Clone the `freebsd-doc-translate` repository:"
+msgstr "Клонирование репозитория `freebsd-doc-translate`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:232
+#, no-wrap
+msgid "% git clone https://github.com/freebsd/freebsd-doc-translate.git ~/freebsd-doc-translate\n"
+msgstr "% git clone https://github.com/freebsd/freebsd-doc-translate.git ~/freebsd-doc-translate\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:239
+#, no-wrap
+msgid "Procedure: Copy a translation file to `freebsd-doc`"
+msgstr "Процедура: Копирование файла перевода в `freebsd-doc`"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:243
+msgid ""
+"With both repositories in place, copy the translation from `freebsd-doc-"
+"translate` to `freebsd-doc`. Example of the Committer's Guide article "
+"translation in Spanish."
+msgstr ""
+"Имея оба репозитория, скопируйте перевод из `freebsd-doc-translate` в "
+"`freebsd-doc`. Пример перевода статьи Руководства для коммиттеров на "
+"испанском языке."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:248
+#, no-wrap
+msgid ""
+"% cp ~/freebsd-doc-translate/documentation/content/es/articles/committers-guide/_index.po \\\n"
+"~/freebsd-doc/documentation/content/es/articles/committers-guide/\n"
+msgstr ""
+"% cp ~/freebsd-doc-translate/documentation/content/es/articles/committers-guide/_index.po \\\n"
+"~/freebsd-doc/documentation/content/es/articles/committers-guide/\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:255
+#, no-wrap
+msgid "Procedure: Convert a translation file (`.po`) to `.adoc`"
+msgstr "Процедура: Преобразование файла перевода (`.po`) в `.adoc`"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:258
+msgid "Go to the root of `freebsd-doc`."
+msgstr "Перейдите в корень `freebsd-doc`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:262
+#, no-wrap
+msgid "% cd ~/freebsd-doc\n"
+msgstr "% cd ~/freebsd-doc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:265
+msgid "Translate (convert) the `.po` file to `.adoc`"
+msgstr "Преобразовать файл `.po` в `.adoc`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:269
+#, no-wrap
+msgid "% ./tools/translate.sh documentation es articles/committers-guide\n"
+msgstr "% ./tools/translate.sh documentation es articles/committers-guide\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:272
+msgid ""
+"By default: only files with more than eighty percent of strings translated "
+"will be converted to `.adoc`."
+msgstr ""
+"По умолчанию: только файлы с более чем восьмидесятью процентами переведённых "
+"строк будут преобразованы в `.adoc`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:274
+msgid "To ignore that limit:"
+msgstr "Чтобы игнорировать это ограничение:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:278
+#, no-wrap
+msgid "% KEEP_ENV=0 ./tools/translate.sh documentation es articles/committers-guide\n"
+msgstr "% KEEP_ENV=0 ./tools/translate.sh documentation es articles/committers-guide\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:285
+msgid ""
+"Some documents, like books, have many PO gettext files. Always copy all of "
+"them when translating and building. Files that weren't translated will be "
+"converted with the source (English) strings."
+msgstr ""
+"Некоторые документы, такие как книги, содержат множество PO-файлов gettext. "
+"Всегда копируйте их все при переводе и сборке. Файлы, которые не были "
+"переведены, будут преобразованы с исходными (английскими) строками."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:290
+msgid ""
+"The directory structure is fundamental. Always follow the English document "
+"directory structure."
+msgstr ""
+"Структура каталогов является основополагающей. Всегда следуйте структуре "
+"каталогов английского документа."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:296
+#, no-wrap
+msgid "Procedure: Build the translated document"
+msgstr "Процедура: Сборка переведенного документа"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:299
+msgid "Last, the building part."
+msgstr "Наконец, часть сборки."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:301
+msgid ""
+"Enter the documentation directory because there is no need to build the "
+"FreeBSD website."
+msgstr ""
+"Перейдите в каталог документации, так как сборка веб-сайта FreeBSD не "
+"требуется."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:305
+#, no-wrap
+msgid "% cd documentation\n"
+msgstr "% cd documentation\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:309
+msgid ""
+"And build the documentation. Note that `en` is always added by default when "
+"building any other language."
+msgstr ""
+"И соберите документацию. Обратите внимание, что `en` всегда добавляется по "
+"умолчанию при сборке любого другого языка."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:313
+#, no-wrap
+msgid "% DOC_LANG=es make\n"
+msgstr "% DOC_LANG=es make\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:318
+msgid ""
+"This command will build only the English and Spanish documents of the "
+"FreeBSD documentation portal. The output will be in the [.filename]#public# "
+"directory; open that in a browser. Note that some index files can redirect "
+"the browser to the online page."
+msgstr ""
+"Эта команда соберет только английскую и испанскую документацию портала "
+"FreeBSD. Результат будет сохранен в каталоге [.filename]#public#; откройте "
+"его в браузере. Обратите внимание, что некоторые индексные файлы могут "
+"перенаправлять браузер на онлайн-страницу."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:320
+msgid ""
+"Another good option is to build and serve the content with Hugo's internal "
+"webserver:"
+msgstr ""
+"Еще один хороший вариант — собрать и предоставить контент с помощью "
+"встроенного веб-сервера Hugo:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:324
+#, no-wrap
+msgid "% DOC_LANG=es make run\n"
+msgstr "% DOC_LANG=es make run\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:327
+msgid ""
+"By default, the webserver listens on `localhost`; To override this behavior, "
+"specify the desired IP address in the `BIND` parameter value."
+msgstr ""
+"По умолчанию веб-сервер прослушивает `localhost`; чтобы изменить это "
+"поведение, укажите нужный IP-адрес в значении параметра `BIND`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:331
+#, no-wrap
+msgid "% DOC_LANG=es make run BIND=192.168.15.10\n"
+msgstr "% DOC_LANG=es make run BIND=192.168.15.10\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:334
+msgid ""
+"This builds and serves the content with Hugo's internal webserver and lets "
+"it open, and if any file changes, it rebuilds them automatically."
+msgstr ""
+"Это собирает и предоставляет содержимое с помощью встроенного веб-сервера "
+"Hugo, оставляя его открытым, и при любых изменениях файлов автоматически "
+"пересобирает их."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:337
+msgid ""
+"To make any necessary adjustments in the translation, follow the steps below "
+"to re-sync all components:"
+msgstr ""
+"Чтобы внести необходимые изменения в перевод, выполните следующие шаги для "
+"повторной синхронизации всех компонентов:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:339
+msgid ""
+"Fix the translation string on https://translate-dev.freebsd.org/[Weblate]."
+msgstr ""
+"Исправьте строку перевода на https://translate-dev.freebsd.org/[Weblate]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:340
+msgid ""
+"Force Weblate to commit the changes on `Document/Manage/Commit` section."
+msgstr ""
+"Заставьте Weblate зафиксировать изменения в разделе `Document/Manage/Commit`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:341
+msgid ""
+"Sync the local Weblate repository `freebsd-doc-translate` with a `git pull "
+"origin main` command."
+msgstr ""
+"Синхронизируйте локальный репозиторий Weblate `freebsd-doc-translate` с "
+"помощью команды `git pull origin main`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:342
+msgid "Copy the translation again to `freebsd-doc`."
+msgstr "Скопируйте перевод снова в `freebsd-doc`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:343
+msgid ""
+"Convert the translation to .adoc with the `./tools/translate.sh` script."
+msgstr "Преобразуйте перевод в .adoc с помощью скрипта `./tools/translate.sh`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:344
+msgid ""
+"Hugo will rebuild the file and not build the entire set if `make run` was "
+"used; or re-execute `make`."
+msgstr ""
+"Hugo пересоберет файл и не будет собирать весь набор, если использовалась "
+"команда `make run`, или повторно выполнит `make`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:348
+msgid ""
+"Follow the previous steps as many times as is necessary until the document "
+"is ready to be published."
+msgstr ""
+"Повторяйте предыдущие шаги столько раз, сколько необходимо, пока документ не "
+"будет готов к публикации."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:351
+msgid ""
+"The crossref:doc-build[doc-build-rendering,Documentation Build Process] "
+"chapter includes information about rendering to HTML and PDF."
+msgstr ""
+"Глава crossref:doc-build[doc-build-rendering,Процесс сборки документации] "
+"содержит информацию о преобразовании в HTML и PDF."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:353
+#, no-wrap
+msgid "Submitting Translations"
+msgstr "Отправка переводов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:356
+msgid ""
+"Example of submitting an update to the Brazilian Portuguese article "
+"Committer's Guide."
+msgstr ""
+"Пример отправки обновления для статьи на бразильском португальском "
+"Committer's Guide."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:362
+#, no-wrap
+msgid "Check the repository"
+msgstr "Проверка репозитория"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:366
+msgid ""
+"After following the steps in crossref:weblate[weblate-building,Building the "
+"Translated Document], go to the root of `freebsd-doc` and preview what's to "
+"be committed. For an overview of files to be changed, and differences in "
+"file content:"
+msgstr ""
+"После выполнения шагов из раздела crossref:weblate[weblate-building,Сборка "
+"переведенного документа], перейдите в корневую директорию `freebsd-doc` и "
+"просмотрите, что будет включено в коммит. Для просмотра списка изменяемых "
+"файлов и различий в их содержимом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:371
+#, no-wrap
+msgid ""
+"% git status\n"
+"% git diff\n"
+msgstr ""
+"% git status\n"
+"% git diff\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:374
+msgid ""
+"Review the output, and if any files unrelated to the Committer's Guide "
+"translation update were changed or added, take the appropriate action of "
+"reverting or removing them, respectively, before proceeding further."
+msgstr ""
+"Просмотрите вывод, и если какие-либо файлы, не связанные с обновлением "
+"перевода Руководства коммиттера, были изменены или добавлены, выполните "
+"соответствующее действие по их откату или удалению соответственно, прежде "
+"чем продолжить."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:376
+msgid ""
+"Always include the PO gettext file (`.po`) and the translated document in "
+"Hugo/Asciidoctor (`.adoc`)."
+msgstr ""
+"Всегда включайте файл PO gettext (`.po`) и переведенный документ в Hugo/"
+"Asciidoctor (`.adoc`)."
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:382
+#, no-wrap
+msgid "Create a new branch and commit"
+msgstr "Создать новую ветку и зафиксировать изменения"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:385
+msgid ""
+"Create another branch to separate the work, which will help with future "
+"updates in the local repository."
+msgstr ""
+"Создайте еще одну ветку для разделения работы, что поможет при будущих "
+"обновлениях в локальном репозитории."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:389
+#, no-wrap
+msgid "% git checkout -b committers-guide_pt-br\n"
+msgstr "% git checkout -b committers-guide_pt-br\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:392
+msgid "Register the local commit."
+msgstr "Зарегистрировать локальный коммит."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:397
+#, no-wrap
+msgid ""
+"% git add .\n"
+"% git commit\n"
+msgstr ""
+"% git add .\n"
+"% git commit\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:400
+msgid "Example of commit messages for translations:"
+msgstr "Пример сообщений коммитов для переводов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:404
+#, no-wrap
+msgid "pt-br/committers-guide: Sync with en XXXXXXX\n"
+msgstr "pt-br/committers-guide: Sync with en XXXXXXX\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:407
+msgid ""
+"Where `XXXXXXX` is the man:git[1] revision stored in the Weblate repository "
+"[.filename]#~/freebsd-doc-translate/revision.txt#."
+msgstr ""
+"Где `XXXXXXX` — это ревизия man:git[1], хранящаяся в репозитории Weblate в "
+"файле [.filename]#~/freebsd-doc-translate/revision.txt#."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:409
+msgid "If it is the first translation of an article:"
+msgstr "Если это первый перевод статьи:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:413
+#, no-wrap
+msgid "Add Korean translation of Leap Seconds article\n"
+msgstr "Add Korean translation of Leap Seconds article\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:418
+msgid ""
+"A message will be displayed after the commit if man:git[1] has not been "
+"configured previously. Please follow the instructions and provide the name "
+"and email address used on Weblate. This step is crucial to proper crediting "
+"of contributors."
+msgstr ""
+"После выполнения коммита будет отображено сообщение, если man:git[1] ранее "
+"не был настроен. Следуйте инструкциям и укажите имя и адрес электронной "
+"почты, используемые в Weblate. Этот шаг важен для правильного учета вклада "
+"участников."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:420
+msgid ""
+"Then check the entire commit, review changes, and author name and email."
+msgstr ""
+"Затем проверьте весь коммит, просмотрите изменения, а также имя автора и "
+"адрес электронной почты."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:424
+#, no-wrap
+msgid "% git show\n"
+msgstr "% git show\n"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:431
+#, no-wrap
+msgid "Generate a patch"
+msgstr "Сгенерировать патч"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:434
+msgid "Next, generate a man:git-format-patch[1] file."
+msgstr "Далее создайте файл man:git-format-patch[1]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:439
+#, no-wrap
+msgid ""
+"% git format-patch main\n"
+"0001-pt-br-committers-guide-Sync-with-en-XXXXXXX.patch\n"
+msgstr ""
+"% git format-patch main\n"
+"0001-pt-br-committers-guide-Sync-with-en-XXXXXXX.patch\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:443
+msgid ""
+"Attach the patch [.filename]#0001-pt-br-committers-guide-Sync-with-en-"
+"XXXXXXX.patch# to a problem report in https://bugs.freebsd.org/bugzilla/"
+"[FreeBSD Bugzilla]."
+msgstr ""
+"Прикрепите патч [.filename]#0001-pt-br-committers-guide-Sync-with-en-"
+"XXXXXXX.patch# к отчёту об ошибке в https://bugs.freebsd.org/bugzilla/"
+"[FreeBSD Bugzilla]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:445
+msgid "Include the following information in the report:"
+msgstr "Включите следующую информацию в отчёт:"
+
+#. type: Block title
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:447
+#, no-wrap
+msgid "Bugzilla Fields"
+msgstr "Поля Bugzilla"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:451
+#, no-wrap
+msgid "Field"
+msgstr "Поле"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:453
+#, no-wrap
+msgid "Value"
+msgstr "Значение"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:454
+#, no-wrap
+msgid "*product*"
+msgstr "*продукт (product)*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:456
+#, no-wrap
+msgid "Documentation"
+msgstr "Documentation"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:457
+#, no-wrap
+msgid "*Component*"
+msgstr "*Компонент (Component)*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:459
+#, no-wrap
+msgid "Books & Articles"
+msgstr "Books & Articles"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:460
+#, no-wrap
+msgid "*Summary*"
+msgstr "*Сводка (Summary)*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:462
+#, no-wrap
+msgid "Same as the local commit"
+msgstr "Тот же текст, что и в локальном коммите"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:463
+#, no-wrap
+msgid "*Description*"
+msgstr "*Описание (Description)*"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:467
+#, no-wrap
+msgid ""
+"State that instructions in this guide were followed, including proofreading and other necessary steps.\n"
+"Include things that may help with triage and progression of the report."
+msgstr ""
+"Укажите, что инструкции в этом руководстве были выполнены, включая вычитку и другие необходимые шаги.\n"
+"Включите сведения, которые могут помочь с анализом и продвижением отчёта."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:468
+#, no-wrap
+msgid "*CC* (Optional)"
+msgstr "*СС* (Необязательно)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:469
+#, no-wrap
+msgid "If the language has coordinators, include their email addresses in the CC field."
+msgstr "Если в языке есть координаторы, укажите их адреса электронной почты в поле CC."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:472
+msgid ""
+"For people familiar with man:git[1] and GitHub: instead of submitting the "
+"patch through https://bugs.freebsd.org/bugzilla/[Bugzilla], a https://"
+"github.com/freebsd/freebsd-doc/pulls[GitHub pull request] can be used (use "
+"the name and address that you use with Weblate)."
+msgstr ""
+"Для тех, кто знаком с man:git[1] и GitHub: вместо отправки исправления через "
+"https://bugs.freebsd.org/bugzilla/[Bugzilla], можно использовать https://"
+"github.com/freebsd/freebsd-doc/pulls[запрос на включение изменений (pull "
+"request) в GitHub] (укажите имя и адрес, которые вы используете в Weblate)."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:475
+msgid ""
+"https://github.com/freebsd/freebsd-doc/ is a secondary mirror. Changes to "
+"the `doc` tree can be made only by people who have a `doc` commit bit."
+msgstr ""
+"https://github.com/freebsd/freebsd-doc/ является вторичным зеркалом. "
+"Изменения в дереве `doc` могут вносить только люди, имеющие права на коммит "
+"(`doc commit bit`)."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:477
+msgid ""
+"When translators keep sending good-quality patches, they can be nominated by "
+"other committers to receive write-access (a extref:{committers-guide}[doc "
+"commit bit, committer.types] for translations), a FreeBSD account, and "
+"associated perks."
+msgstr ""
+"Когда переводчики продолжают присылать качественные исправления, другие "
+"коммиттеры могут выдвинуть их для получения прав на запись (extref:"
+"{committers-guide}[бит коммита для документации, committer.types] для "
+"переводов), учётной записи FreeBSD и сопутствующих привилегий."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:479
+msgid ""
+"The list of extref:{contributors}[Additional FreeBSD Contributors, contrib-"
+"additional] includes non-committers whose contributions are committed to the "
+"`doc` tree."
+msgstr ""
+"Список extref:{contributors}[дополнительных участников FreeBSD, contrib-"
+"additional] включает некоммиттеров, чьи изменения были закоммичены в дерево "
+"`doc`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:481
+msgid "If in doubt about any procedure, write to the {freebsd-translators}."
+msgstr ""
+"Если вы сомневаетесь в каком-либо действии, напишите в {freebsd-translators}."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:483
+#, no-wrap
+msgid "FAQ (Frequently Asked Questions)"
+msgstr "FAQ (Часто задаваемые Вопросы)"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:486
+#, no-wrap
+msgid "Is it necessary to translate all the Copyright messages?"
+msgstr "Нужно ли переводить все сообщения об авторских правах?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/weblate/_index.adoc:488
+msgid ""
+"Every language team decides this for their language; in `pt-br` (Brazilian "
+"Portuguese) team, it was decided not to translate those messages."
+msgstr ""
+"Каждая языковая команда решает этот вопрос для своего языка; в команде `pt-"
+"br` (бразильский португальский) было решено не переводить эти сообщения."
diff --git a/documentation/content/ru/books/fdp-primer/working-copy/_index.adoc b/documentation/content/ru/books/fdp-primer/working-copy/_index.adoc
new file mode 100644
index 0000000000..cd3c04e167
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/working-copy/_index.adoc
@@ -0,0 +1,140 @@
+---
+description: 'Как получить рабочую копию проекта документации FreeBSD'
+next: books/fdp-primer/structure
+params:
+ path: /books/fdp-primer/working-copy/
+prev: books/fdp-primer/tools
+showBookMenu: true
+tags: ["working copy", "documentation", "manual pages", "git"]
+title: 'Глава 3. Рабочая копия'
+weight: 4
+---
+
+[[working-copy]]
+= Рабочая копия
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 3
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+_Рабочая копия_ — это копия дерева документации репозитория FreeBSD, загруженная на локальный компьютер. Изменения вносятся в локальную рабочую копию, тестируются, а затем отправляются в виде патчей для включения в основной репозиторий.
+
+Полная копия дерева документации может занимать 550 мегабайт дискового пространства. Рекомендуется выделить не менее гигабайта, чтобы было место для временных файлов и тестовых версий в различных выходных форматах.
+
+link:https://git-scm.com/[Git] используется для управления файлами документации FreeBSD. Он устанавливается через package:devel/git[], который также имеет облегчённую версию под названием git-lite:
+
+[source, shell]
+....
+# pkg install git-lite
+....
+
+[[working-copy-doc-and-src]]
+== Документация и Справочник
+
+Документация FreeBSD — это не только книги и статьи. Справочник (man) для всех команд и конфигурационных файлов также являются частью документации и входят в сферу ответственности FDP. Используются два репозитория: `doc` для книг и статей и `src` для операционной системы и справочника. Для редактирования справочника необходимо отдельно получить репозиторий `src`.
+
+Репозитории могут содержать несколько версий документации и исходного кода. Новые изменения почти всегда вносятся только в последнюю версию, называемую `main`.
+
+[[working-copy-choosing-directory]]
+== Выбор каталога
+
+Документация FreeBSD традиционно хранится в [.filename]#/usr/doc/#, а исходный код системы с руководствами — в [.filename]#/usr/src/#. Эти деревья каталогов могут быть перемещены, и пользователи могут разместить рабочие копии в других местах, чтобы избежать конфликтов с существующей информацией в основных каталогах. В следующих примерах используются [.filename]#~/doc# и [.filename]#~/src# — подкаталоги домашнего каталога пользователя.
+
+[[working-copy-checking-out]]
+== Извлечение копии
+
+Загрузка рабочей копии из репозитория называется _клоном_ и выполняется командой `git clone`. В этом примере клонируется последняя версия (`main`) основного дерева документации:
+
+[source, shell]
+....
+% git clone https://git.FreeBSD.org/doc.git ~/doc
+....
+
+Получение исходного кода для работы со справочником (man) выполняется аналогично:
+
+[source, shell]
+....
+% git clone https://git.FreeBSD.org/src.git ~/src
+....
+
+[[working-copy-updating]]
+== Обновление рабочей копии
+
+Документы и файлы в репозитории FreeBSD изменяются ежедневно. Пользователи вносят изменения в файлы и фиксируют их довольно часто. Даже спустя короткое время после первоначального получения копии репозитория, между локальной рабочей копией и основным репозиторием FreeBSD уже могут появиться различия. Чтобы обновить локальную версию с учетом изменений, внесённых в основной репозиторий, используйте команду `git pull` в каталоге с локальной рабочей копией:
+
+[source, shell]
+....
+% cd ~/doc
+% git pull --ff-only
+....
+
+Приучите себя к полезной привычке использовать `git pull` перед редактированием файлов документации. Кто-то другой мог недавно изменить этот файл, и ваша локальная рабочая копия не будет содержать последних изменений, пока вы не обновите её. Редактировать самую свежую версию файла гораздо проще, чем пытаться объединить более старую, отредактированную локальную версию с новой версией из репозитория.
+
+[[working-copy-revert]]
+== Отмена изменений
+
+Иногда оказывается, что изменения были не нужны, или автор просто хочет начать заново. Файлы можно «сбросить» к их исходному состоянию с помощью `git restore`. Например, чтобы отменить правки, сделанные в [.filename]#_index.adoc#, и вернуть его в исходное состояние:
+
+[source, shell]
+....
+% git restore _index.adoc
+....
+
+[[working-copy-making-diff]]
+== Создание Diff
+
+После завершения редактирования файла или группы файлов, различия между локальной рабочей копией и версией в репозитории FreeBSD должны быть собраны в один файл для отправки. Эти _diff_-файлы создаются путём перенаправления вывода команды `git diff` в файл:
+
+[source, shell]
+....
+% cd ~/doc
+% git diff > doc-fix-spelling.diff
+....
+
+Присвойте файлу осмысленное имя, отражающее его содержимое. В приведенном примере указаны исправления орфографии для всего дерева документации.
+
+Если файл с различиями должен быть отправлен через веб-интерфейс "link:https://bugs.FreeBSD.org/bugzilla/enter_bug.cgi[Сообщить о проблеме в FreeBSD]", добавьте расширение [.filename]#.txt#, чтобы дать простой и прямолинейной веб-форме понять, что содержимое представляет собой обычный текст.
+
+Будьте осторожны: `git diff` включает все изменения в текущем каталоге и его подкаталогах. Если в рабочей копии есть файлы с правками, которые ещё не готовы к отправке, укажите список только тех файлов, которые нужно включить:
+
+[source, shell]
+....
+% cd ~/doc
+% git diff disks/_index.adoc printers/_index.adoc > disks-printers.diff
+....
+
+[[working-copy-git-references]]
+== Ссылки Git
+
+Эти примеры демонстрируют базовое использование Git. Более подробная информация доступна в https://git-scm.com/book/en/v2[Книге по Git] и https://git-scm.com/doc[документации Git].
diff --git a/documentation/content/ru/books/fdp-primer/working-copy/_index.po b/documentation/content/ru/books/fdp-primer/working-copy/_index.po
new file mode 100644
index 0000000000..378a61e4c0
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/working-copy/_index.po
@@ -0,0 +1,336 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-06-01 10:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerworking-copy_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:1
+#, no-wrap
+msgid "How to get a working copy of the FreeBSD Documentation Project"
+msgstr "Как получить рабочую копию проекта документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:1
+#, no-wrap
+msgid "Chapter 3. The Working Copy"
+msgstr "Глава 3. Рабочая копия"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:14
+#, no-wrap
+msgid "The Working Copy"
+msgstr "Рабочая копия"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:53
+msgid ""
+"The _working copy_ is a copy of the FreeBSD repository documentation tree "
+"downloaded onto the local computer. Changes are made to the local working "
+"copy, tested, and then submitted as patches to be committed to the main "
+"repository."
+msgstr ""
+"_Рабочая копия_ — это копия дерева документации репозитория FreeBSD, "
+"загруженная на локальный компьютер. Изменения вносятся в локальную рабочую "
+"копию, тестируются, а затем отправляются в виде патчей для включения в "
+"основной репозиторий."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:56
+msgid ""
+"A full copy of the documentation tree can occupy 550 megabytes of disk "
+"space. Allow for a full gigabyte of space to have room for temporary files "
+"and test versions of various output formats."
+msgstr ""
+"Полная копия дерева документации может занимать 550 мегабайт дискового "
+"пространства. Рекомендуется выделить не менее гигабайта, чтобы было место "
+"для временных файлов и тестовых версий в различных выходных форматах."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:59
+msgid ""
+"link:https://git-scm.com/[Git] is used to manage the FreeBSD documentation "
+"files. It is obtained by installing the package:devel/git[] package, which "
+"also has a lighter flavor called git-lite:"
+msgstr ""
+"link:https://git-scm.com/[Git] используется для управления файлами "
+"документации FreeBSD. Он устанавливается через package:devel/git[], который "
+"также имеет облегчённую версию под названием git-lite:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:63
+#, no-wrap
+msgid "# pkg install git-lite\n"
+msgstr "# pkg install git-lite\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:66
+#, no-wrap
+msgid "Documentation and Manual Pages"
+msgstr "Документация и Справочник"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:72
+msgid ""
+"FreeBSD documentation is not just books and articles. Manual pages for all "
+"the commands and configuration files are also part of the documentation, and "
+"part of the FDP's territory. Two repositories are involved: `doc` for the "
+"books and articles, and `src` for the operating system and manual pages. To "
+"edit manual pages, the `src` repository must be checked out separately."
+msgstr ""
+"Документация FreeBSD — это не только книги и статьи. Справочник (man) для "
+"всех команд и конфигурационных файлов также являются частью документации и "
+"входят в сферу ответственности FDP. Используются два репозитория: `doc` для "
+"книг и статей и `src` для операционной системы и справочника. Для "
+"редактирования справочника необходимо отдельно получить репозиторий `src`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:75
+msgid ""
+"Repositories may contain multiple versions of documentation and source "
+"code. New modifications are almost always made only to the latest version, "
+"called `main`."
+msgstr ""
+"Репозитории могут содержать несколько версий документации и исходного кода. "
+"Новые изменения почти всегда вносятся только в последнюю версию, называемую "
+"`main`."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:77
+#, no-wrap
+msgid "Choosing a Directory"
+msgstr "Выбор каталога"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:82
+msgid ""
+"FreeBSD documentation is traditionally stored in [.filename]#/usr/doc/#, and "
+"system source code with manual pages in [.filename]#/usr/src/#. These "
+"directory trees are relocatable, and users may want to put the working "
+"copies in other locations to avoid interfering with existing information in "
+"the main directories. The examples that follow use [.filename]#~/doc# and "
+"[.filename]#~/src#, both subdirectories of the user's home directory."
+msgstr ""
+"Документация FreeBSD традиционно хранится в [.filename]#/usr/doc/#, а "
+"исходный код системы с руководствами — в [.filename]#/usr/src/#. Эти "
+"деревья каталогов могут быть перемещены, и пользователи могут разместить "
+"рабочие копии в других местах, чтобы избежать конфликтов с существующей "
+"информацией в основных каталогах. В следующих примерах используются "
+"[.filename]#~/doc# и [.filename]#~/src# — подкаталоги домашнего каталога "
+"пользователя."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:84
+#, no-wrap
+msgid "Checking Out a Copy"
+msgstr "Извлечение копии"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:88
+msgid ""
+"A download of a working copy from the repository is called a _clone_, and "
+"done with `git clone`. This example clones a copy of the latest version "
+"(`main`) of the main documentation tree:"
+msgstr ""
+"Загрузка рабочей копии из репозитория называется _клоном_ и выполняется "
+"командой `git clone`. В этом примере клонируется последняя версия (`main`) "
+"основного дерева документации:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:92
+#, no-wrap
+msgid "% git clone https://git.FreeBSD.org/doc.git ~/doc\n"
+msgstr "% git clone https://git.FreeBSD.org/doc.git ~/doc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:95
+msgid "A checkout of the source code to work on manual pages is very similar:"
+msgstr ""
+"Получение исходного кода для работы со справочником (man) выполняется "
+"аналогично:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:99
+#, no-wrap
+msgid "% git clone https://git.FreeBSD.org/src.git ~/src\n"
+msgstr "% git clone https://git.FreeBSD.org/src.git ~/src\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:102
+#, no-wrap
+msgid "Updating a Working Copy"
+msgstr "Обновление рабочей копии"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:108
+msgid ""
+"The documents and files in the FreeBSD repository change daily. People "
+"modify files and commit changes frequently. Even a short time after an "
+"initial checkout, there will already be differences between the local "
+"working copy and the main FreeBSD repository. To update the local version "
+"with the changes that have been made to the main repository, use `git pull` "
+"on the directory containing the local working copy:"
+msgstr ""
+"Документы и файлы в репозитории FreeBSD изменяются ежедневно. Пользователи "
+"вносят изменения в файлы и фиксируют их довольно часто. Даже спустя короткое "
+"время после первоначального получения копии репозитория, между локальной "
+"рабочей копией и основным репозиторием FreeBSD уже могут появиться "
+"различия. Чтобы обновить локальную версию с учетом изменений, внесённых в "
+"основной репозиторий, используйте команду `git pull` в каталоге с локальной "
+"рабочей копией:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:113
+#, no-wrap
+msgid ""
+"% cd ~/doc\n"
+"% git pull --ff-only\n"
+msgstr ""
+"% cd ~/doc\n"
+"% git pull --ff-only\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:118
+msgid ""
+"Get in the protective habit of using `git pull` before editing document "
+"files. Someone else may have edited that file very recently, and the local "
+"working copy will not include the latest changes until it has been updated. "
+"Editing the newest version of a file is much easier than trying to combine "
+"an older, edited local file with the newer version from the repository."
+msgstr ""
+"Приучите себя к полезной привычке использовать `git pull` перед "
+"редактированием файлов документации. Кто-то другой мог недавно изменить этот "
+"файл, и ваша локальная рабочая копия не будет содержать последних изменений, "
+"пока вы не обновите её. Редактировать самую свежую версию файла гораздо "
+"проще, чем пытаться объединить более старую, отредактированную локальную "
+"версию с новой версией из репозитория."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:120
+#, no-wrap
+msgid "Reverting Changes"
+msgstr "Отмена изменений"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:125
+msgid ""
+"Sometimes it turns out that changes were not necessary after all, or the "
+"writer just wants to start over. Files can be \"reset\" to their unchanged "
+"form with `git restore`. For example, to erase the edits made to "
+"[.filename]#_index.adoc# and reset it to unmodified form:"
+msgstr ""
+"Иногда оказывается, что изменения были не нужны, или автор просто хочет "
+"начать заново. Файлы можно «сбросить» к их исходному состоянию с помощью "
+"`git restore`. Например, чтобы отменить правки, сделанные в "
+"[.filename]#_index.adoc#, и вернуть его в исходное состояние:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:129
+#, no-wrap
+msgid "% git restore _index.adoc\n"
+msgstr "% git restore _index.adoc\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:132
+#, no-wrap
+msgid "Making a Diff"
+msgstr "Создание Diff"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:136
+msgid ""
+"After edits to a file or group of files are completed, the differences "
+"between the local working copy and the version on the FreeBSD repository "
+"must be collected into a single file for submission. These _diff_ files are "
+"produced by redirecting the output of `git diff` into a file:"
+msgstr ""
+"После завершения редактирования файла или группы файлов, различия между "
+"локальной рабочей копией и версией в репозитории FreeBSD должны быть собраны "
+"в один файл для отправки. Эти _diff_-файлы создаются путём перенаправления "
+"вывода команды `git diff` в файл:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:141
+#, no-wrap
+msgid ""
+"% cd ~/doc\n"
+"% git diff > doc-fix-spelling.diff\n"
+msgstr ""
+"% cd ~/doc\n"
+"% git diff > doc-fix-spelling.diff\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:145
+msgid ""
+"Give the file a meaningful name that identifies the contents. The example "
+"above is for spelling fixes to the whole documentation tree."
+msgstr ""
+"Присвойте файлу осмысленное имя, отражающее его содержимое. В приведенном "
+"примере указаны исправления орфографии для всего дерева документации."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:147
+msgid ""
+"If the diff file is to be submitted with the web \"link:https://"
+"bugs.FreeBSD.org/bugzilla/enter_bug.cgi[Submit a FreeBSD problem report]\" "
+"interface, add a [.filename]#.txt# extension to give the earnest and simple-"
+"minded web form a clue that the contents are plain text."
+msgstr ""
+"Если файл с различиями должен быть отправлен через веб-интерфейс "
+"\"link:https://bugs.FreeBSD.org/bugzilla/enter_bug.cgi[Сообщить о проблеме в "
+"FreeBSD]\", добавьте расширение [.filename]#.txt#, чтобы дать простой и "
+"прямолинейной веб-форме понять, что содержимое представляет собой обычный "
+"текст."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:150
+msgid ""
+"Be careful: `git diff` includes all changes made in the current directory "
+"and any subdirectories. If there are files in the working copy with edits "
+"that are not ready to be submitted yet, provide a list of only the files "
+"that are to be included:"
+msgstr ""
+"Будьте осторожны: `git diff` включает все изменения в текущем каталоге и его "
+"подкаталогах. Если в рабочей копии есть файлы с правками, которые ещё не "
+"готовы к отправке, укажите список только тех файлов, которые нужно включить:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:155
+#, no-wrap
+msgid ""
+"% cd ~/doc\n"
+"% git diff disks/_index.adoc printers/_index.adoc > disks-printers.diff\n"
+msgstr ""
+"% cd ~/doc\n"
+"% git diff disks/_index.adoc printers/_index.adoc > disks-printers.diff\n"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:158
+#, no-wrap
+msgid "Git References"
+msgstr "Ссылки Git"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/working-copy/_index.adoc:161
+msgid ""
+"These examples show very basic usage of Git. More detail is available in "
+"the https://git-scm.com/book/en/v2[Git Book] and the https://git-scm.com/"
+"doc[Git documentation]."
+msgstr ""
+"Эти примеры демонстрируют базовое использование Git. Более подробная "
+"информация доступна в https://git-scm.com/book/en/v2[Книге по Git] и https://"
+"git-scm.com/doc[документации Git]."
diff --git a/documentation/content/ru/books/fdp-primer/writing-style/_index.adoc b/documentation/content/ru/books/fdp-primer/writing-style/_index.adoc
new file mode 100644
index 0000000000..51cc579684
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/writing-style/_index.adoc
@@ -0,0 +1,326 @@
+---
+description: 'Стиль написания и некоторые соглашения, используемые в проекте документации FreeBSD'
+next: books/fdp-primer/editor-config
+params:
+ path: /books/fdp-primer/writing-style/
+prev: books/fdp-primer/manual-pages
+showBookMenu: true
+tags: ["writing", "style", "typos", "one sentence per line"]
+title: 'Глава 12. Стиль написания'
+weight: 12
+---
+
+[[writing-style]]
+= Стиль написания
+:doctype: book
+:toc: macro
+:toclevels: 2
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 12
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/fdp-primer/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[writing-style-tips]]
+== Советы
+
+Техническая документация может быть улучшена за счёт последовательного применения нескольких принципов. Большинство из них можно разделить на три цели: _быть понятным_, _быть полным_ и _быть кратким_. Эти цели могут противоречить друг другу. Хорошее изложение заключается в нахождении баланса между ними.
+
+[[writing-style-be-clear]]
+=== Будьте понятны
+
+Ясность чрезвычайно важна. Читатель может быть новичком или изучать документ на неродном языке. Стремитесь к простому, понятному тексту, который чётко объясняет концепции.
+
+Избегайте витиеватой или украшенной речи, шуток или разговорных выражений. Пишите как можно проще и яснее. Простой текст легче понять и перевести.
+
+Делайте объяснения как можно короче, проще и понятнее. Избегайте пустых фраз вроде "для того чтобы", которые обычно можно заменить на "чтобы". Не используйте снисходительные слова вроде "по сути". Избегайте латинских терминов, таких как "i.e." или "cf.", которые могут быть непонятны за пределами академических или научных кругов.
+
+Следует писать в формальном стиле. Необходимо избегать прямого обращения к читателю. Например, следует использовать формулировку "скопировать файл в [.filename]#/tmp#", а не "вы можете скопировать файл в [.filename]#/tmp#".
+
+Приводите понятные, корректные и _проверенные_ примеры. Простой пример лучше, чем отсутствие примера. Хороший пример ещё лучше. Не приводите плохих примеров, которые можно распознать по извинениям или фразам вроде «но на самом деле так делать не стоит». Плохие примеры хуже, чем их отсутствие. Приводите хорошие примеры, потому что _даже если предупредить читателя, чтобы он не использовал пример в таком виде_, он всё равно, скорее всего, воспользуется им как есть.
+
+Избегайте _неопределённых выражений_, таких как «должен», «может», «попытаться» или «смог бы». Эти слова создают впечатление, что автор не уверен в фактах, и вызывают сомнения у читателя.
+
+Аналогично, давайте инструкции в виде повелительных команд: не "вам следует сделать это", а просто "сделайте это".
+
+[[writing-style-be-complete]]
+=== Будьте полными
+
+Не делайте предположений о способностях или уровне навыков читателя. Сообщите им то, что им необходимо знать. Давайте ссылки на другие документы, чтобы предоставить справочную информацию без необходимости её повторного изложения. Поставьте себя на место читателя, предугадайте вопросы, которые у него возникнут, и ответьте на них.
+
+[[writing-style-be-concise]]
+=== Будьте краткими
+
+Хотя функции должны быть описаны полностью, иногда информации так много, что читателю сложно найти нужную деталь. Баланс между полнотой и лаконичностью — это непростая задача. Один из подходов — включить введение, затем раздел «быстрый старт» с описанием наиболее распространённого сценария, а после него — подробный справочный раздел.
+
+[[writing-style-guidelines]]
+== Рекомендации
+
+Для обеспечения единообразия среди множества авторов документации FreeBSD были разработаны рекомендации, которым следует придерживаться при написании.
+
+Используйте американское написание английских слов::
+Существует несколько вариантов английского языка с разным написанием одних и тех же слов. Если варианты написания отличаются, используйте американский английский. Например, «color», а не «colour», «rationalize», а не «rationalise», и так далее.
++
+[NOTE]
+====
+Использование британского варианта английского языка может быть допустимо в случае предоставленной статьи, однако орфография должна быть единообразной во всем документе. Остальные документы, такие как книги, веб-сайты, справочные страницы и т. д., должны использовать американский вариант английского языка.
+====
+
+Не используйте сокращения::
+Не используйте сокращения. Всегда пишите фразу полностью. "Don't use contractions" является неправильным вариантом.
++
+Избегание сокращений способствует более формальному тону, повышает точность и немного облегчает работу переводчиков.
+
+Используйте серийную запятую::
+В списке элементов внутри абзаца разделяйте каждый элемент запятой. Последний элемент отделяйте от остальных запятой и словом "and".
++
+Например:
++
+This is a list of one, two and three items (Вот список из одного, двух и трёх элементов).
++
+Это список из трех элементов: "one", "two" и "three" или список из двух элементов: "one" и "two and three"?
++
+Лучше быть точным и включать серийную запятую:
++
+This is a list of one, two, and three items (Вот список из одного, двух и трёх элементов).
+Избегайте избыточных фраз::
+Избегайте избыточных фраз. В частности, "команда", "файл" и "man команда" часто избыточны.
++
+Например, команды:
++
+Неверно: Используйте команду `git` для обновления исходного кода.
++
+Правильно: Используйте `git` для обновления исходников.
++
+Имена файлов:
++
+Неверно: ... в имени файла [.filename]#/etc/rc.local#...
++
+Правильно: ... в [.filename]#/etc/rc.local#...
++
+Ссылки на страницы Справочника (во втором примере используется `man:[]` с сущностью man:csh[1]):
++
+Неправильно: Дополнительную информацию смотрите в `man csh`.
++
+Правильно: См. man:csh[1].
+
+Для получения дополнительной информации о стиле написания текстов см. http://www.bartleby.com/141/[«Элементы стиля»] Уильяма Странка.
+
+[[writing-style-guide]]
+== Руководство по стилю
+
+Чтобы сохранить единообразие исходного кода документации при редактировании множеством разных людей, пожалуйста, следуйте этим стилевым соглашениям.
+
+[[one-sentence-per-line]]
+=== Одно предложение на строку
+
+Используйте семантические разрывы строк в документации, метод, называемый "одно предложение на строку". Идея этого метода заключается в том, чтобы помочь пользователям писать и читать документацию. Для получения дополнительной информации об этом методе прочитайте страницу https://sembr.org/[Semantic Line Breaks].
+
+Это пример, который не использует "одно предложение на строку".
+
+....
+All human beings are born free and equal in dignity and rights. They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.
+....
+
+И вот пример, использующий этот метод.
+
+....
+All human beings are born free and equal in dignity and rights.
+They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.
+....
+
+[[writing-style-acronyms]]
+=== Аббревиатуры
+
+Акроним должен быть определён при первом упоминании в документе, например: «Network Time Protocol (NTP)». После того как акроним определён, используйте только акроним, если контекст не требует полного термина. Обычно акроним определяется один раз в главе или документе.
+
+Все аббревиатуры должны быть заключены в символ `.
+
+[[writing-style-special-characters]]
+== Список специальных символов
+
+Этот список специальных символов показывает правильный синтаксис и результат их использования в документации FreeBSD. Если нужного символа нет в списке, задайте вопрос на {freebsd-doc}.
+
+[.informaltable]
+[cols="1,1,1", frame="none", options="header"]
+|===
+| Имя
+| Синтаксис
+| Выводится
+
+
+| Авторское право (copyright)
+| +(C)+
+| (С)
+
+| Зарегистрировано
+| +(R)+
+| (R)
+
+| Товарный знак
+| +(TM)+
+| (TM)
+
+| Тире
+| +--+
+| --
+
+| Многоточия
+| +...+
+| ...
+
+| Одиночная стрелка вправо
+| +->+
+| ->
+
+| Двойная правая стрелка
+| +=>+
+| =>
+
+| Одиночная стрелка влево
+| +<-+
+| <-
+
+| Двойная левая стрелка
+| +<=+
+| <=
+
+|===
+
+[[writing-style-linting-vale]]
+== Проверка стиля с помощью Vale
+
+Для обеспечения ясности и единообразия во всей документации и на страницах веб-сайта в дерево документации были добавлены стили link:https://vale.sh[Vale]. link:https://vale.sh[Vale] — это мощный линтер для создания пользовательских правил написания текста, который можно использовать в различных сценариях. В настоящее время link:https://vale.sh[Vale] можно применять как инструмент командной строки, в CI/CD-процессах и интегрировать в предпочитаемый редактор.
+
+Следующая таблица описывает текущие названия правил и их соответствующую степень серьёзности.
+
+[.informaltable]
+[cols="1,1", frame="none", options="header"]
+|===
+| Имя
+| Степень серьезности
+
+| FreeBSD.BrandTerms
+| ошибка
+
+| FreeBSD.ConsciousLanguage
+| warning
+
+| FreeBSD.Contractions
+| предложение
+
+| FreeBSD.EOLSpacing
+| warning
+
+| FreeBSD.Hang
+| warning
+
+| FreeBSD.Hyphens
+| warning
+
+| FreeBSD.Spacing
+| ошибка
+
+| FreeBSD.SuperfluousOptArgInLinks
+| предложение
+
+| Vale.Avoid
+| ошибка
+
+| Vale.Repetition
+| ошибка
+
+| Vale.Spelling
+| ошибка
+
+| Vale.Terms
+| ошибка
+
+|===
+
+[[writing-style-linting-vale-rules]]
+=== Текущие правила Vale
+
+. FreeBSD.BrandTerms: В соответствии с правилами авторского права The FreeBSD Foundation, *freebsd* следует писать как *FreeBSD*. Аналогично, у каждого крупного поставщика и компании есть свои правила написания их торговых марок и брендов. Следует проявлять уважение к брендам других и уделять время правильному написанию PostgreSQL, Node.js, Let's Encrypt и т. д. Отсутствующие названия брендов следует добавлять в файл [.filename]#.vale/styles/FreeBSD/BrandTerms.yml# в репозитории `doc`.
+
+. FreeBSD.ConsciousLanguage: Это правило предлагает использовать осознанный язык, чтобы по возможности избегать чувствительных слов, указывающих на цвет кожи, возраст, расу или сексуальную ориентацию людей.
+
+. FreeBSD.Сокращения: Не следует использовать сокращенные слова. Это правило исключает все сокращения и рекомендует использовать полные слова.
+
+. FreeBSD.EOLSpacing: В большинстве документов присутствуют пробелы в конце строк, что не является желательной ситуацией.
+
+. FreeBSD.Hang: Термин `Hang` часто используется для обозначения ситуации, когда приложение перестает отвечать. Это правило предлагает более подходящую формулировку.
+
+. FreeBSD.Дефисы: Часто наречия, оканчивающиеся на 'ly', добавляются с дефисом, что является ошибкой.
+
+. FreeBSD.Расстояние: Часто двойные пробелы трудно заметить невооруженным глазом, и здесь это решается.
+
+. FreeBSD.SuperfluousOptArgInLinks: Рекомендуется оставлять квадратные скобки пустыми в макросах `link:`, если отображаемый текст совпадает с URL.
+
+. Vale.Avoid: Запрещает использование терминов из списка *НЕ ИСПОЛЬЗОВАТЬ* в документации The FreeBSD Project. Если обнаружено слово, которое не должно присутствовать в документации, его следует добавить в файл [.filename]#.vale/styles/Vocab/Terms/reject.txt# в репозитории `doc`. На данный момент список пуст.
+
+. Vale.Repetition: Одни и те же слова часто набираются дважды при отходе от клавиатуры и возвращении к работе. Это правило находит повторяющиеся слова и предупреждает пользователей.
+
+. Vale.Spelling: В настоящее время в документации и на веб-сайте используется смесь написания en_US и en_GB. Vale поставляется со встроенным словарем, который использует строго en_US и не принимает варианты написания en_GB для любых слов.
+
+. Vale.Terms: Обеспечивает соблюдение *ПРЕДПОЧТИТЕЛЬНЫХ* терминов для проекта FreeBSD. В настоящее время список терминов пуст, и специфичные для FreeBSD термины будут добавляться постепенно. Если какое-либо слово считается правильным, но отсутствует в словаре, его следует добавить в файл [.filename]#.vale/styles/Vocab/Terms/accept.txt# в репозитории `doc`.
+
+Дополнительные правила будут введены в будущем по мере необходимости.
+
+[[writing-style-using-vale]]
+=== Использование Vale
+
+link:https://vale.sh[Vale] можно использовать из командной строки, а также из редактора или IDE. Установить package:textproc/vale[] можно следующим образом:
+
+[source, shell]
+....
+$ pkg install vale
+....
+
+[[writing-style-using-vale-commandline]]
+==== Использование Vale в командной строке
+
+Предполагая, что репозиторий `doc` был склонирован в [.filename]#~/doc#, для запуска потребуются следующие команды:
+
+[source, shell]
+....
+% cd ~/doc
+% vale .
+....
+
+[NOTE]
+======
+link:https://vale.sh[Vale] — это программа с высокой нагрузкой на процессор и память из-за специфики приложения, и она может долго не выводить результаты на экран. Лучше запускать её для конкретных папок или файлов, а не для всего репозитория `doc`, так как это уже выполняется в CI-пайплайне.
+======
+
+[[writing-style-using-vale-editors]]
+==== Использование Vale в редакторах
+
+link:https://vale.sh[Vale] работает с основными популярными редакторами, такими как package:editors/vim[], package:editors/emacs[], package:editors/vscode[]. В настоящее время необходимая конфигурация для package:editors/vim[] описана в crossref:editor-config[editor-config-vim, Vim]. Конфигурация для package:editors/emacs[] находится в разработке.
diff --git a/documentation/content/ru/books/fdp-primer/writing-style/_index.po b/documentation/content/ru/books/fdp-primer/writing-style/_index.po
new file mode 100644
index 0000000000..2f20da91ff
--- /dev/null
+++ b/documentation/content/ru/books/fdp-primer/writing-style/_index.po
@@ -0,0 +1,1035 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-20 14:02+0300\n"
+"PO-Revision-Date: 2025-09-09 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksfdp-primerwriting-style_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:1
+#, no-wrap
+msgid "Writing Style and some conventions used in the FreeBSD Documentation Project"
+msgstr "Стиль написания и некоторые соглашения, используемые в проекте документации FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:1
+#, no-wrap
+msgid "Chapter 12. Writing Style"
+msgstr "Глава 12. Стиль написания"
+
+#. type: Title =
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:14
+#, no-wrap
+msgid "Writing Style"
+msgstr "Стиль написания"
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:52
+#, no-wrap
+msgid "Tips"
+msgstr "Советы"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:58
+msgid ""
+"Technical documentation can be improved by consistent use of several "
+"principles. Most of these can be classified into three goals: _be clear_, "
+"_be complete_, and _be concise_. These goals can conflict with each other. "
+"Good writing consists of a balance between them."
+msgstr ""
+"Техническая документация может быть улучшена за счёт последовательного "
+"применения нескольких принципов. Большинство из них можно разделить на три "
+"цели: _быть понятным_, _быть полным_ и _быть кратким_. Эти цели могут "
+"противоречить друг другу. Хорошее изложение заключается в нахождении баланса "
+"между ними."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:60
+#, no-wrap
+msgid "Be Clear"
+msgstr "Будьте понятны"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:65
+msgid ""
+"Clarity is extremely important. The reader may be a novice, or reading the "
+"document in a second language. Strive for simple, uncomplicated text that "
+"clearly explains the concepts."
+msgstr ""
+"Ясность чрезвычайно важна. Читатель может быть новичком или изучать "
+"документ на неродном языке. Стремитесь к простому, понятному тексту, "
+"который чётко объясняет концепции."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:69
+msgid ""
+"Avoid flowery or embellished speech, jokes, or colloquial expressions. "
+"Write as simply and clearly as possible. Simple text is easier to "
+"understand and translate."
+msgstr ""
+"Избегайте витиеватой или украшенной речи, шуток или разговорных выражений. "
+"Пишите как можно проще и яснее. Простой текст легче понять и перевести."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:74
+msgid ""
+"Keep explanations as short, simple, and clear as possible. Avoid empty "
+"phrases like \"in order to\", which usually just means \"to\". Avoid "
+"potentially patronizing words like \"basically\". Avoid Latin terms like "
+"\"i.e.,\" or \"cf.\", which may be unknown outside of academic or scientific "
+"groups."
+msgstr ""
+"Делайте объяснения как можно короче, проще и понятнее. Избегайте пустых "
+"фраз вроде \"для того чтобы\", которые обычно можно заменить на \"чтобы\". "
+"Не используйте снисходительные слова вроде \"по сути\". Избегайте латинских "
+"терминов, таких как \"i.e.\" или \"cf.\", которые могут быть непонятны за "
+"пределами академических или научных кругов."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:78
+msgid ""
+"Write in a formal style. Avoid addressing the reader as \"you\". For "
+"example, say \"copy the file to [.filename]#/tmp#\" rather than \"you can "
+"copy the file to [.filename]#/tmp#\"."
+msgstr ""
+"Следует писать в формальном стиле. Необходимо избегать прямого обращения к "
+"читателю. Например, следует использовать формулировку \"скопировать файл в "
+"[.filename]#/tmp#\", а не \"вы можете скопировать файл в [.filename]#/tmp#\"."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:85
+msgid ""
+"Give clear, correct, _tested_ examples. A trivial example is better than no "
+"example. A good example is better yet. Do not give bad examples, "
+"identifiable by apologies or sentences like \"but really it should never be "
+"done that way\". Bad examples are worse than no examples. Give good "
+"examples, because _even when warned not to use the example as shown_, the "
+"reader will usually just use the example as shown."
+msgstr ""
+"Приводите понятные, корректные и _проверенные_ примеры. Простой пример "
+"лучше, чем отсутствие примера. Хороший пример ещё лучше. Не приводите "
+"плохих примеров, которые можно распознать по извинениям или фразам вроде «но "
+"на самом деле так делать не стоит». Плохие примеры хуже, чем их "
+"отсутствие. Приводите хорошие примеры, потому что _даже если предупредить "
+"читателя, чтобы он не использовал пример в таком виде_, он всё равно, скорее "
+"всего, воспользуется им как есть."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:88
+msgid ""
+"Avoid _weasel words_ like \"should\", \"might\", \"try\", or \"could\". "
+"These words imply that the speaker is unsure of the facts, and create doubt "
+"in the reader."
+msgstr ""
+"Избегайте _неопределённых выражений_, таких как «должен», «может», "
+"«попытаться» или «смог бы». Эти слова создают впечатление, что автор не "
+"уверен в фактах, и вызывают сомнения у читателя."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:90
+msgid ""
+"Similarly, give instructions as imperative commands: not \"you should do "
+"this\", but merely \"do this\"."
+msgstr ""
+"Аналогично, давайте инструкции в виде повелительных команд: не \"вам следует "
+"сделать это\", а просто \"сделайте это\"."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:92
+#, no-wrap
+msgid "Be Complete"
+msgstr "Будьте полными"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:98
+msgid ""
+"Do not make assumptions about the reader's abilities or skill level. Tell "
+"them what they need to know. Give links to other documents to provide "
+"background information without having to recreate it. Put yourself in the "
+"reader's place, anticipate the questions they will ask, and answer them."
+msgstr ""
+"Не делайте предположений о способностях или уровне навыков читателя. "
+"Сообщите им то, что им необходимо знать. Давайте ссылки на другие "
+"документы, чтобы предоставить справочную информацию без необходимости её "
+"повторного изложения. Поставьте себя на место читателя, предугадайте "
+"вопросы, которые у него возникнут, и ответьте на них."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:100
+#, no-wrap
+msgid "Be Concise"
+msgstr "Будьте краткими"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:105
+msgid ""
+"While features should be documented completely, sometimes there is so much "
+"information that the reader cannot easily find the specific detail needed. "
+"The balance between being complete and being concise is a challenge. One "
+"approach is to have an introduction, then a \"quick start\" section that "
+"describes the most common situation, followed by an in-depth reference "
+"section."
+msgstr ""
+"Хотя функции должны быть описаны полностью, иногда информации так много, что "
+"читателю сложно найти нужную деталь. Баланс между полнотой и лаконичностью "
+"— это непростая задача. Один из подходов — включить введение, затем раздел "
+"«быстрый старт» с описанием наиболее распространённого сценария, а после "
+"него — подробный справочный раздел."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:107
+#, no-wrap
+msgid "Guidelines"
+msgstr "Рекомендации"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:110
+msgid ""
+"To promote consistency between the myriad authors of the FreeBSD "
+"documentation, some guidelines have been drawn up for authors to follow."
+msgstr ""
+"Для обеспечения единообразия среди множества авторов документации FreeBSD "
+"были разработаны рекомендации, которым следует придерживаться при написании."
+
+#. type: Labeled list
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:111
+#, no-wrap
+msgid "Use American English Spelling"
+msgstr "Используйте американское написание английских слов"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:115
+msgid ""
+"There are several variants of English, with different spellings for the same "
+"word. Where spellings differ, use the American English variant. \"color\", "
+"not \"colour\", \"rationalize\", not \"rationalise\", and so on."
+msgstr ""
+"Существует несколько вариантов английского языка с разным написанием одних и "
+"тех же слов. Если варианты написания отличаются, используйте американский "
+"английский. Например, «color», а не «colour», «rationalize», а не "
+"«rationalise», и так далее."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:120
+msgid ""
+"The use of British English may be accepted in the case of a contributed "
+"article, however the spelling must be consistent within the whole document. "
+"The other documents such as books, web site, manual pages, etc. must use "
+"American English."
+msgstr ""
+"Использование британского варианта английского языка может быть допустимо в "
+"случае предоставленной статьи, однако орфография должна быть единообразной "
+"во всем документе. Остальные документы, такие как книги, веб-сайты, "
+"справочные страницы и т. д., должны использовать американский вариант "
+"английского языка."
+
+#. type: Labeled list
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:122
+#, no-wrap
+msgid "Do not use contractions"
+msgstr "Не используйте сокращения"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:126
+msgid ""
+"Do not use contractions. Always spell the phrase out in full. \"Don't use "
+"contractions\" is wrong."
+msgstr ""
+"Не используйте сокращения. Всегда пишите фразу полностью. \"Don't use "
+"contractions\" является неправильным вариантом."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:128
+msgid ""
+"Avoiding contractions makes for a more formal tone, is more precise, and is "
+"slightly easier for translators."
+msgstr ""
+"Избегание сокращений способствует более формальному тону, повышает точность "
+"и немного облегчает работу переводчиков."
+
+#. type: Labeled list
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:129
+#, no-wrap
+msgid "Use the serial comma"
+msgstr "Используйте серийную запятую"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:132
+msgid ""
+"In a list of items within a paragraph, separate each item from the others "
+"with a comma. Separate the last item from the others with a comma and the "
+"word \"and\"."
+msgstr ""
+"В списке элементов внутри абзаца разделяйте каждый элемент запятой. "
+"Последний элемент отделяйте от остальных запятой и словом \"and\"."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:134
+msgid "For example:"
+msgstr "Например:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:136
+msgid "This is a list of one, two and three items."
+msgstr ""
+"This is a list of one, two and three items (Вот список из одного, двух и "
+"трёх элементов)."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:138
+msgid ""
+"Is this a list of three items, \"one\", \"two\", and \"three\", or a list of "
+"two items, \"one\" and \"two and three\"?"
+msgstr ""
+"Это список из трех элементов: \"one\", \"two\" и \"three\" или список из "
+"двух элементов: \"one\" и \"two and three\"?"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:140
+msgid "It is better to be explicit and include a serial comma:"
+msgstr "Лучше быть точным и включать серийную запятую:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:142
+msgid "This is a list of one, two, and three items."
+msgstr ""
+"This is a list of one, two, and three items (Вот список из одного, двух и "
+"трёх элементов)."
+
+#. type: Labeled list
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:142
+#, no-wrap
+msgid "Avoid redundant phrases"
+msgstr "Избегайте избыточных фраз"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:145
+msgid ""
+"Do not use redundant phrases. In particular, \"the command\", \"the file\", "
+"and \"man command\" are often redundant."
+msgstr ""
+"Избегайте избыточных фраз. В частности, \"команда\", \"файл\" и \"man "
+"команда\" часто избыточны."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:147
+msgid "For example, commands:"
+msgstr "Например, команды:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:149
+msgid "Wrong: Use the `git` command to update sources."
+msgstr "Неверно: Используйте команду `git` для обновления исходного кода."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:151
+msgid "Right: Use `git` to update sources."
+msgstr "Правильно: Используйте `git` для обновления исходников."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:153
+msgid "Filenames:"
+msgstr "Имена файлов:"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:155
+msgid "Wrong: ... in the filename [.filename]#/etc/rc.local#..."
+msgstr "Неверно: ... в имени файла [.filename]#/etc/rc.local#..."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:157
+msgid "Right: ... in [.filename]#/etc/rc.local#..."
+msgstr "Правильно: ... в [.filename]#/etc/rc.local#..."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:159
+msgid ""
+"Manual page references (the second example uses `man:[]` with the man:csh[1] "
+"entity):"
+msgstr ""
+"Ссылки на страницы Справочника (во втором примере используется `man:[]` с "
+"сущностью man:csh[1]):"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:161
+msgid "Wrong: See `man csh` for more information."
+msgstr "Неправильно: Дополнительную информацию смотрите в `man csh`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:163
+msgid "Right: See man:csh[1]."
+msgstr "Правильно: См. man:csh[1]."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:165
+msgid ""
+"For more information about writing style, see http://www.bartleby.com/141/"
+"[Elements of Style] by William Strunk."
+msgstr ""
+"Для получения дополнительной информации о стиле написания текстов см. http://"
+"www.bartleby.com/141/[«Элементы стиля»] Уильяма Странка."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:167
+#, no-wrap
+msgid "Style Guide"
+msgstr "Руководство по стилю"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:170
+msgid ""
+"To keep the source for the documentation consistent when many different "
+"people are editing it, please follow these style conventions."
+msgstr ""
+"Чтобы сохранить единообразие исходного кода документации при редактировании "
+"множеством разных людей, пожалуйста, следуйте этим стилевым соглашениям."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:172
+#, no-wrap
+msgid "One sentence per line"
+msgstr "Одно предложение на строку"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:177
+msgid ""
+"Use Semantic Line Breaks in the documentation, a technique called \"one "
+"sentence per line\". The idea of this technique is to help the users to "
+"write and read documentation. To get more information about this technique "
+"read the link:https://sembr.org/[Semantic Line Breaks] page."
+msgstr ""
+"Используйте семантические разрывы строк в документации, метод, называемый "
+"\"одно предложение на строку\". Идея этого метода заключается в том, "
+"чтобы помочь пользователям писать и читать документацию. Для получения "
+"дополнительной информации об этом методе прочитайте страницу https://"
+"sembr.org/[Semantic Line Breaks]."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:179
+msgid "This is an example which does not use \"one sentence per line\"."
+msgstr "Это пример, который не использует \"одно предложение на строку\"."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:182
+#, no-wrap
+msgid "All human beings are born free and equal in dignity and rights. They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.\n"
+msgstr "All human beings are born free and equal in dignity and rights. They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:185
+msgid "And this is an example which uses the technique."
+msgstr "И вот пример, использующий этот метод."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:189
+#, no-wrap
+msgid ""
+"All human beings are born free and equal in dignity and rights.\n"
+"They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.\n"
+msgstr ""
+"All human beings are born free and equal in dignity and rights.\n"
+"They are endowed with reason and conscience and should act towards one another in a spirit of brotherhood.\n"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:192
+#, no-wrap
+msgid "Acronyms"
+msgstr "Аббревиатуры"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:197
+msgid ""
+"Acronyms should be defined the first time they appear in a document, as in: "
+"\"Network Time Protocol (NTP)\". After the acronym has been defined, use "
+"the acronym alone unless it makes more sense contextually to use the whole "
+"term. Acronyms are usually defined only once per chapter or per document."
+msgstr ""
+"Акроним должен быть определён при первом упоминании в документе, например: "
+"«Network Time Protocol (NTP)». После того как акроним определён, используйте "
+"только акроним, если контекст не требует полного термина. Обычно акроним "
+"определяется один раз в главе или документе."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:199
+msgid "All acronyms should be enclosed using the ` character."
+msgstr "Все аббревиатуры должны быть заключены в символ `."
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:201
+#, no-wrap
+msgid "Special Character List"
+msgstr "Список специальных символов"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:205
+msgid ""
+"This list of special characters shows the correct syntax and the output when "
+"used in FreeBSD documentation. If a character is not on this list, ask "
+"about it on the {freebsd-doc}."
+msgstr ""
+"Этот список специальных символов показывает правильный синтаксис и результат "
+"их использования в документации FreeBSD. Если нужного символа нет в списке, "
+"задайте вопрос на {freebsd-doc}."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:210
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:265
+#, no-wrap
+msgid "Name"
+msgstr "Имя"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:211
+#, no-wrap
+msgid "Syntax"
+msgstr "Синтаксис"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:214
+#, no-wrap
+msgid "Rendered"
+msgstr "Выводится"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:215
+#, no-wrap
+msgid "Copyright"
+msgstr "Авторское право (copyright)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:216
+#, no-wrap
+msgid "+(C)+"
+msgstr "+(C)+"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:218
+#, no-wrap
+msgid "(C)"
+msgstr "(С)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:219
+#, no-wrap
+msgid "Registered"
+msgstr "Зарегистрировано"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:220
+#, no-wrap
+msgid "+(R)+"
+msgstr "+(R)+"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:222
+#, no-wrap
+msgid "(R)"
+msgstr "(R)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:223
+#, no-wrap
+msgid "Trademark"
+msgstr "Товарный знак"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:224
+#, no-wrap
+msgid "+(TM)+"
+msgstr "+(TM)+"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:226
+#, no-wrap
+msgid "(TM)"
+msgstr "(TM)"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:227
+#, no-wrap
+msgid "Em dash"
+msgstr "Тире"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:228
+#, no-wrap
+msgid "+--+"
+msgstr "+--+"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:230
+#, no-wrap
+msgid "--"
+msgstr "--"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:231
+#, no-wrap
+msgid "Ellipses"
+msgstr "Многоточия"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:232
+#, no-wrap
+msgid "+...+"
+msgstr "+...+"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:234
+#, no-wrap
+msgid "..."
+msgstr "..."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:235
+#, no-wrap
+msgid "Single right arrow"
+msgstr "Одиночная стрелка вправо"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:236
+#, no-wrap
+msgid "+->+"
+msgstr "+->+"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:238
+#, no-wrap
+msgid "->"
+msgstr "->"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:239
+#, no-wrap
+msgid "Double right arrow"
+msgstr "Двойная правая стрелка"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:240
+#, no-wrap
+msgid "+=>+"
+msgstr "+=>+"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:242
+#, no-wrap
+msgid "=>"
+msgstr "=>"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:243
+#, no-wrap
+msgid "Single left arrow"
+msgstr "Одиночная стрелка влево"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:244
+#, no-wrap
+msgid "+<-+"
+msgstr "+<-+"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:246
+#, no-wrap
+msgid "<-"
+msgstr "<-"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:247
+#, no-wrap
+msgid "Double left arrow"
+msgstr "Двойная левая стрелка"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:248
+#, no-wrap
+msgid "+<=+"
+msgstr "+<=+"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:250
+#, no-wrap
+msgid "<="
+msgstr "<="
+
+#. type: Title ==
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:253
+#, no-wrap
+msgid "Linting with Vale"
+msgstr "Проверка стиля с помощью Vale"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:258
+msgid ""
+"To maintain clarity and consistency across all documentation and website "
+"pages, link:https://vale.sh[Vale] styles have been introduced in the "
+"documentation tree. link:https://vale.sh[Vale] is a powerful linter for "
+"writing customized rules and can be used in multiple scenarios. Currently "
+"link:https://vale.sh[Vale] can be used as a command line tool, for CI/CD "
+"pipelines, and integrated into an editor of choice."
+msgstr ""
+"Для обеспечения ясности и единообразия во всей документации и на страницах "
+"веб-сайта в дерево документации были добавлены стили link:https://"
+"vale.sh[Vale]. link:https://vale.sh[Vale] — это мощный линтер для создания "
+"пользовательских правил написания текста, который можно использовать в "
+"различных сценариях. В настоящее время link:https://vale.sh[Vale] можно "
+"применять как инструмент командной строки, в CI/CD-процессах и интегрировать "
+"в предпочитаемый редактор."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:260
+msgid ""
+"The following table describes the current rule names and their respective "
+"severity."
+msgstr ""
+"Следующая таблица описывает текущие названия правил и их соответствующую "
+"степень серьёзности."
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:267
+#, no-wrap
+msgid "Severity"
+msgstr "Степень серьезности"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:268
+#, no-wrap
+msgid "FreeBSD.BrandTerms"
+msgstr "FreeBSD.BrandTerms"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:270
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:288
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:294
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:297
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:300
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:303
+#, no-wrap
+msgid "error"
+msgstr "ошибка"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:271
+#, no-wrap
+msgid "FreeBSD.ConsciousLanguage"
+msgstr "FreeBSD.ConsciousLanguage"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:273
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:279
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:282
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:285
+#, no-wrap
+msgid "warning"
+msgstr "warning"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:274
+#, no-wrap
+msgid "FreeBSD.Contractions"
+msgstr "FreeBSD.Contractions"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:276
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:291
+#, no-wrap
+msgid "suggestion"
+msgstr "предложение"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:277
+#, no-wrap
+msgid "FreeBSD.EOLSpacing"
+msgstr "FreeBSD.EOLSpacing"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:280
+#, no-wrap
+msgid "FreeBSD.Hang"
+msgstr "FreeBSD.Hang"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:283
+#, no-wrap
+msgid "FreeBSD.Hyphens"
+msgstr "FreeBSD.Hyphens"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:286
+#, no-wrap
+msgid "FreeBSD.Spacing"
+msgstr "FreeBSD.Spacing"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:289
+#, no-wrap
+msgid "FreeBSD.SuperfluousOptArgInLinks"
+msgstr "FreeBSD.SuperfluousOptArgInLinks"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:292
+#, no-wrap
+msgid "Vale.Avoid"
+msgstr "Vale.Avoid"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:295
+#, no-wrap
+msgid "Vale.Repetition"
+msgstr "Vale.Repetition"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:298
+#, no-wrap
+msgid "Vale.Spelling"
+msgstr "Vale.Spelling"
+
+#. type: Table
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:301
+#, no-wrap
+msgid "Vale.Terms"
+msgstr "Vale.Terms"
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:306
+#, no-wrap
+msgid "Current Vale Rules"
+msgstr "Текущие правила Vale"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:312
+msgid ""
+"FreeBSD.BrandTerms: According to the copyright rules of The FreeBSD "
+"Foundation, *freebsd* should be written as *FreeBSD*. Similarly, every "
+"major vendor and company has specific rules on writing their brand names and "
+"trademarks. Care should be taken to be respectful to the brand value of "
+"others and to take time to write PostgreSQL, Node.js, Let's Encrypt etc. "
+"Missing brand names should be added to the [.filename]#.vale/styles/FreeBSD/"
+"BrandTerms.yml# in the `doc` repository."
+msgstr ""
+"FreeBSD.BrandTerms: В соответствии с правилами авторского права The FreeBSD "
+"Foundation, *freebsd* следует писать как *FreeBSD*. Аналогично, у каждого "
+"крупного поставщика и компании есть свои правила написания их торговых марок "
+"и брендов. Следует проявлять уважение к брендам других и уделять время "
+"правильному написанию PostgreSQL, Node.js, Let's Encrypt и т. д. "
+"Отсутствующие названия брендов следует добавлять в файл [.filename]#.vale/"
+"styles/FreeBSD/BrandTerms.yml# в репозитории `doc`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:314
+msgid ""
+"FreeBSD.ConsciousLanguage: This rule proposes use of conscious language so "
+"that sensitive words pointing to the color, age, race, or sexual orientation "
+"of people are avoided where possible."
+msgstr ""
+"FreeBSD.ConsciousLanguage: Это правило предлагает использовать осознанный "
+"язык, чтобы по возможности избегать чувствительных слов, указывающих на цвет "
+"кожи, возраст, расу или сексуальную ориентацию людей."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:317
+msgid ""
+"FreeBSD.Contractions: Contracted words should not be used. This rule avoids "
+"all contractions and suggests full words."
+msgstr ""
+"FreeBSD.Сокращения: Не следует использовать сокращенные слова. Это правило "
+"исключает все сокращения и рекомендует использовать полные слова."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:319
+msgid ""
+"FreeBSD.EOLSpacing: In most of the documents EOL spacing is present which is "
+"not the desirable situation."
+msgstr ""
+"FreeBSD.EOLSpacing: В большинстве документов присутствуют пробелы в конце "
+"строк, что не является желательной ситуацией."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:322
+msgid ""
+"FreeBSD.Hang: `Hang` is often used to mean that the application has stopped "
+"responding. This rule proposes better wording."
+msgstr ""
+"FreeBSD.Hang: Термин `Hang` часто используется для обозначения ситуации, "
+"когда приложение перестает отвечать. Это правило предлагает более "
+"подходящую формулировку."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:324
+msgid ""
+"FreeBSD.Hyphens: Often adverbs ending with 'ly' are added with a hyphen "
+"which is wrong."
+msgstr ""
+"FreeBSD.Дефисы: Часто наречия, оканчивающиеся на 'ly', добавляются с "
+"дефисом, что является ошибкой."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:326
+msgid ""
+"FreeBSD.Spacing: Often double spaces are hard to catch with the naked eye "
+"and this is addressed here."
+msgstr ""
+"FreeBSD.Расстояние: Часто двойные пробелы трудно заметить невооруженным "
+"глазом, и здесь это решается."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:328
+msgid ""
+"FreeBSD.SuperfluousOptArgInLinks: Suggest to empty square brackets in "
+"`link:` macros when the displayed text coincides with the URL."
+msgstr ""
+"FreeBSD.SuperfluousOptArgInLinks: Рекомендуется оставлять квадратные скобки "
+"пустыми в макросах `link:`, если отображаемый текст совпадает с URL."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:332
+msgid ""
+"Vale.Avoid: Enforces the *DO NOT USE* vocabulary terms for The FreeBSD "
+"Project. If any word is found that should not be in the documentation, the "
+"word should be added to [.filename]#.vale/styles/Vocab/Terms/reject.txt# in "
+"the `doc` repository. The list is empty at the moment."
+msgstr ""
+"Vale.Avoid: Запрещает использование терминов из списка *НЕ ИСПОЛЬЗОВАТЬ* в "
+"документации The FreeBSD Project. Если обнаружено слово, которое не должно "
+"присутствовать в документации, его следует добавить в файл [.filename]#.vale/"
+"styles/Vocab/Terms/reject.txt# в репозитории `doc`. На данный момент список "
+"пуст."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:335
+msgid ""
+"Vale.Repetition: Same words are often typed twice when leaving the keyboard "
+"and rejoining the work again. This rule finds repeated words and warns the "
+"users."
+msgstr ""
+"Vale.Repetition: Одни и те же слова часто набираются дважды при отходе от "
+"клавиатуры и возвращении к работе. Это правило находит повторяющиеся слова и "
+"предупреждает пользователей."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:338
+msgid ""
+"Vale.Spelling: At the moment there is a mix of en_US and en_GB spellings in "
+"the documentation and website. Vale comes with an in built dictionary from "
+"which uses strictly en_US and do not accept the en_GB variant of any words."
+msgstr ""
+"Vale.Spelling: В настоящее время в документации и на веб-сайте используется "
+"смесь написания en_US и en_GB. Vale поставляется со встроенным словарем, "
+"который использует строго en_US и не принимает варианты написания en_GB для "
+"любых слов."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:342
+msgid ""
+"Vale.Terms: Enforces the *PREFERRED* vocabulary terms for The FreeBSD "
+"Project. At the moment the list of terms is empty and the FreeBSD specific "
+"terms will be added gradually. If any word is found to be correct and not "
+"available in the dictionary the word should be added to the "
+"[.filename]#.vale/styles/Vocab/Terms/accept.txt# in the `doc` repository."
+msgstr ""
+"Vale.Terms: Обеспечивает соблюдение *ПРЕДПОЧТИТЕЛЬНЫХ* терминов для проекта "
+"FreeBSD. В настоящее время список терминов пуст, и специфичные для FreeBSD "
+"термины будут добавляться постепенно. Если какое-либо слово считается "
+"правильным, но отсутствует в словаре, его следует добавить в файл "
+"[.filename]#.vale/styles/Vocab/Terms/accept.txt# в репозитории `doc`."
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:344
+msgid ""
+"More rules will be introduced in the upcoming days when and where required."
+msgstr "Дополнительные правила будут введены в будущем по мере необходимости."
+
+#. type: Title ===
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:346
+#, no-wrap
+msgid "Using Vale"
+msgstr "Использование Vale"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:350
+msgid ""
+"link:https://vale.sh[Vale] can be used from the command line and from within "
+"an editor or IDE. package:textproc/vale[] can be installed as following:"
+msgstr ""
+"link:https://vale.sh[Vale] можно использовать из командной строки, а также "
+"из редактора или IDE. Установить package:textproc/vale[] можно следующим "
+"образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:354
+#, no-wrap
+msgid "$ pkg install vale\n"
+msgstr "$ pkg install vale\n"
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:357
+#, no-wrap
+msgid "Using Vale on the command line"
+msgstr "Использование Vale в командной строке"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:360
+msgid ""
+"Assuming that the `doc` repository was cloned into [.filename]#~/doc# the "
+"following commands are required to run:"
+msgstr ""
+"Предполагая, что репозиторий `doc` был склонирован в [.filename]#~/doc#, для "
+"запуска потребуются следующие команды:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:365
+#, no-wrap
+msgid ""
+"% cd ~/doc\n"
+"% vale .\n"
+msgstr ""
+"% cd ~/doc\n"
+"% vale .\n"
+
+#. type: delimited block = 6
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:371
+msgid ""
+"link:https://vale.sh[Vale] is a CPU and memory intensive program due to the "
+"nature of the application and can take a while to show any output on the "
+"screen. A better way to run the application is on specific folders or files "
+"rather than the entire `doc` repository as that is already done in the CI "
+"pipeline."
+msgstr ""
+"link:https://vale.sh[Vale] — это программа с высокой нагрузкой на процессор "
+"и память из-за специфики приложения, и она может долго не выводить "
+"результаты на экран. Лучше запускать её для конкретных папок или файлов, а "
+"не для всего репозитория `doc`, так как это уже выполняется в CI-пайплайне."
+
+#. type: Title ====
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:374
+#, no-wrap
+msgid "Using Vale in editors"
+msgstr "Использование Vale в редакторах"
+
+#. type: Plain text
+#: documentation/content/en/books/fdp-primer/writing-style/_index.adoc:378
+msgid ""
+"link:https://vale.sh[Vale] works with major mainstream editors like "
+"package:editors/vim[], package:editors/emacs[], package:editors/vscode[]. "
+"At the moment the necessary configuration for package:editors/vim[] is "
+"described in crossref:editor-config[editor-config-vim, Vim]. A "
+"configuration for package:editors/emacs[] is being worked on."
+msgstr ""
+"link:https://vale.sh[Vale] работает с основными популярными редакторами, "
+"такими как package:editors/vim[], package:editors/emacs[], package:editors/"
+"vscode[]. В настоящее время необходимая конфигурация для package:editors/"
+"vim[] описана в crossref:editor-config[editor-config-vim, Vim]. Конфигурация "
+"для package:editors/emacs[] находится в разработке."
diff --git a/documentation/content/ru/books/porters-handbook/_index.adoc b/documentation/content/ru/books/porters-handbook/_index.adoc
index 5b066cb5b0..0446d79b28 100644
--- a/documentation/content/ru/books/porters-handbook/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/_index.adoc
@@ -1,15 +1,19 @@
---
-title: Руководство FreeBSD по созданию портов
-authors:
- - author: The FreeBSD Documentation Project
-copyright: 2000-2020 The FreeBSD Documentation Project
-trademarks: ["freebsd", "sun", "unix", "general"]
-next: books/porters-handbook/porting-why
add_single_page_link: true
+authors:
+ -
+ author: 'The FreeBSD Documentation Project'
+bookOrder: 15
+copyright: '2000-2023 The FreeBSD Documentation Project'
+description: 'Обязательно к прочтению, если вы планируете портировать стороннее программное обеспечение'
+next: books/porters-handbook/porting-why
+params:
+ path: /books/porters-handbook/
showBookMenu: true
+tags: "[\"FreeBSD Porter's Handbook\", \"Porting\", \"FreeBSD Ports Collection\"]"
+title: 'Руководство FreeBSD по созданию портов'
+trademarks: ["freebsd", "sun", "unix", "general"]
weight: 0
-params:
- path: "/books/porters-handbook/"
---
= Руководство FreeBSD по созданию портов
diff --git a/documentation/content/ru/books/porters-handbook/_index.po b/documentation/content/ru/books/porters-handbook/_index.po
new file mode 100644
index 0000000000..1aa07698c1
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/_index.po
@@ -0,0 +1,37 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-12 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbook_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/_index.adoc:1
+#, no-wrap
+msgid "Essential reading if you plan on providing a port of a third party piece of software"
+msgstr "Обязательно к прочтению, если вы планируете портировать стороннее программное обеспечение"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/_index.adoc:1
+#: documentation/content/en/books/porters-handbook/_index.adoc:18
+#, no-wrap
+msgid "FreeBSD Porter's Handbook"
+msgstr "Руководство FreeBSD по созданию портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/_index.adoc:49
+msgid "'''"
+msgstr "'''"
diff --git a/documentation/content/ru/books/porters-handbook/book.adoc b/documentation/content/ru/books/porters-handbook/book.adoc
index 73c6b67672..84bedca43a 100644
--- a/documentation/content/ru/books/porters-handbook/book.adoc
+++ b/documentation/content/ru/books/porters-handbook/book.adoc
@@ -1,13 +1,16 @@
---
-title: Руководство FreeBSD по созданию портов
-authors:
- - author: The FreeBSD Documentation Project
-copyright: 2000-2020 The FreeBSD Documentation Project
-trademarks: ["freebsd", "sun", "unix", "general"]
add_split_page_link: true
+authors:
+ -
+ author: 'The FreeBSD Documentation Project'
+copyright: '2000-2023 The FreeBSD Documentation Project'
+description: 'Обязательно к прочтению, если вы планируете портировать стороннее программное обеспечение'
+tags: "[\"FreeBSD Porter's Handbook\", \"Porting\", \"FreeBSD Ports Collection\"]"
+title: 'Руководство FreeBSD по созданию портов'
+trademarks: ["freebsd", "sun", "unix", "general"]
---
-= FreeBSD Porter's Handbook
+= Руководство FreeBSD по созданию портов
:doctype: book
:toc: macro
:toclevels: 2
@@ -52,6 +55,7 @@ include::{chapters-path}quick-porting/_index.adoc[leveloffset=+1]
include::{chapters-path}slow-porting/_index.adoc[leveloffset=+1]
include::{chapters-path}makefiles/_index.adoc[leveloffset=+1]
include::{chapters-path}special/_index.adoc[leveloffset=+1]
+include::{chapters-path}flavors/_index.adoc[leveloffset=+1]
include::{chapters-path}plist/_index.adoc[leveloffset=+1]
include::{chapters-path}pkg-files/_index.adoc[leveloffset=+1]
include::{chapters-path}testing/_index.adoc[leveloffset=+1]
@@ -59,6 +63,7 @@ include::{chapters-path}upgrading/_index.adoc[leveloffset=+1]
include::{chapters-path}security/_index.adoc[leveloffset=+1]
include::{chapters-path}porting-dads/_index.adoc[leveloffset=+1]
include::{chapters-path}porting-samplem/_index.adoc[leveloffset=+1]
+include::{chapters-path}order/_index.adoc[leveloffset=+1]
include::{chapters-path}keeping-up/_index.adoc[leveloffset=+1]
include::{chapters-path}uses/_index.adoc[leveloffset=+1]
include::{chapters-path}versions/_index.adoc[leveloffset=+1]
diff --git a/documentation/content/ru/books/porters-handbook/book.po b/documentation/content/ru/books/porters-handbook/book.po
new file mode 100644
index 0000000000..2994c7daaa
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/book.po
@@ -0,0 +1,37 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-12 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookbook/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/book.adoc:1
+#, no-wrap
+msgid "Essential reading if you plan on providing a port of a third party piece of software"
+msgstr "Обязательно к прочтению, если вы планируете портировать стороннее программное обеспечение"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/book.adoc:1
+#: documentation/content/en/books/porters-handbook/book.adoc:12
+#, no-wrap
+msgid "FreeBSD Porter's Handbook"
+msgstr "Руководство FreeBSD по созданию портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/book.adoc:48
+msgid "'''"
+msgstr "'''"
diff --git a/documentation/content/ru/books/porters-handbook/flavors/_index.adoc b/documentation/content/ru/books/porters-handbook/flavors/_index.adoc
new file mode 100644
index 0000000000..f69bf3938d
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/flavors/_index.adoc
@@ -0,0 +1,359 @@
+---
+description: 'Флейворы — это способ создания нескольких вариаций порта'
+next: books/porters-handbook/plist
+params:
+ path: /books/porters-handbook/flavors/
+prev: books/porters-handbook/special
+showBookMenu: true
+tags: ["Ports", "Flavors", "introduction", "how-to", "guide"]
+title: 'Глава 7. Флейворы'
+weight: 7
+---
+
+[[flavors]]
+= Флейворы
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 7
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/porters-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+[[flavors-intro]]
+== Введение в флейворы (Flavors)
+
+Флейворы (Flavors) — это способ создания нескольких вариаций порта. Порт собирается несколько раз с различными вариациями.
+
+Например, порт может иметь обычную версию с множеством функций и значительным количеством зависимостей, а также облегчённую "lite"-версию только с базовыми функциями и минимальными зависимостями.
+
+Еще одним примером может быть порт с вариантом GTK и вариантом QT, в зависимости от используемого набора инструментов.
+
+[[flavors-using]]
+== Использование FLAVORS
+
+Чтобы объявить порт с несколькими флейворами, добавьте `FLAVORS` в его [.filename]#Makefile#. Первый вариант в `FLAVORS` является вариантом по умолчанию.
+
+[TIP]
+====
+Это может помочь упростить логику [.filename]#Makefile#, также определив `FLAVOR` как:
+
+[.programlisting]
+....
+FLAVOR?= ${FLAVORS:[1]}
+....
+====
+
+[IMPORTANT]
+====
+Чтобы отличать флейворы от опций, которые всегда обозначаются заглавными буквами, названия флейворов могут содержать _только_ строчные буквы, цифры и символ подчёркивания `_`.
+====
+
+[[flavors-using-ex1]]
+.Основы использования флейворов
+[example]
+====
+Если порт имеет "облегченный" подчиненный порт (lite slave port), подчиненный порт можно удалить, а порт преобразовать во флейворы с помощью:
+
+[.programlisting]
+....
+FLAVORS= default lite
+lite_PKGNAMESUFFIX= -lite
+[...]
+.if ${FLAVOR:U} != lite
+[enable non lite features]
+.endif
+....
+
+====
+
+[[flavors-using-ex2]]
+.Еще один пример базового использования флейворов
+[example]
+====
+Если порт имеет подчиненный порт `-nox11`, подчиненный порт можно удалить, а порт преобразовать в флейворы с помощью:
+
+[.programlisting]
+....
+FLAVORS= x11 nox11
+FLAVOR?= ${FLAVORS:[1]}
+nox11_PKGNAMESUFFIX= -nox11
+[...]
+.if ${FLAVOR} == x11
+[enable x11 features]
+.endif
+....
+
+====
+
+[[flavors-using-ex3]]
+.Использование флейворов в более сложных примерах
+[example]
+====
+Вот слегка отредактированный отрывок из того, что присутствует в пакете package:devel/libpeas[], порте, который использует crossref:flavors[flavors-auto-python,флейворы Python]. При стандартных версиях Python 2 и 3, а именно 2.7 и 3.6, он автоматически получит `FLAVORS=py27 py36`
+
+[.programlisting]
+....
+USES= gnome python
+USE_PYTHON= flavors
+
+.if ${FLAVOR:Upy27:Mpy2*}
+USE_GNOME= pygobject3
+
+CONFIGURE_ARGS+= --enable-python2 --disable-python3
+
+BUILD_WRKSRC= ${WRKSRC}/loaders/python
+INSTALL_WRKSRC= ${WRKSRC}/loaders/python
+.else # py3*
+USE_GNOME+= py3gobject3
+
+CONFIGURE_ARGS+= --disable-python2 --enable-python3 \
+ ac_cv_path_PYTHON3_CONFIG=${LOCALBASE}/bin/python${PYTHON_VER}-config
+
+BUILD_WRKSRC= ${WRKSRC}/loaders/python3
+INSTALL_WRKSRC= ${WRKSRC}/loaders/python3
+.endif
+
+py34_PLIST= ${.CURDIR}/pkg-plist-py3
+py35_PLIST= ${.CURDIR}/pkg-plist-py3
+py36_PLIST= ${.CURDIR}/pkg-plist-py3
+....
+
+Этот порт не использует `USE_PYTHON=distutils`, но всё равно требует флейворы Python. Чтобы избежать ошибки в man:make[1] из-за пустого значения `FLAVOR`, используйте `${FLAVOR:U}` в сравнениях строк вместо `${FLAVOR}`. Привязки Gnome Python gobject3 имеют два разных названия: pygobject3 для Python 2 и py3gobject3 для Python 3. Скрипт `configure` должен выполняться в [.filename]#${WRKSRC}#, но нас интересует только сборка и установка частей программного обеспечения для Python 2 или Python 3, поэтому установите базовые каталоги сборки и установки соответствующим образом. Подсказка о правильном пути к конфигурационному скрипту Python 3. Список упаковки отличается при сборке с Python 3. Поскольку есть три возможные версии Python 3, установите `PLIST` для всех трёх с помощью crossref:flavors[flavors-using-helpers, вспомогательные инструменты флейворов].
+====
+
+[[flavors-using-helpers]]
+=== Вспомогательные инструменты для флейворов (Flavors Helpers)
+
+Чтобы упростить написание [.filename]#Makefile#, существуют несколько вспомогательных инструментов (помощников) флейворов.
+
+Этот список помощников установит их переменную:
+
+* `__flavor___PKGNAMEPREFIX`
+* `__flavor___PKGNAMESUFFIX`
+* `__flavor___PLIST`
+* `__flavor___DESCR`
+
+Этот список помощников будет добавлен к их переменной:
+
+* `__flavor___CONFLICTS`
+* `__flavor___CONFLICTS_BUILD`
+* `__flavor___CONFLICTS_INSTALL`
+* `__flavor___PKG_DEPENDS`
+* `__flavor___EXTRACT_DEPENDS`
+* `__flavor___PATCH_DEPENDS`
+* `__flavor___FETCH_DEPENDS`
+* `__flavor___BUILD_DEPENDS`
+* `__flavor___LIB_DEPENDS`
+* `__flavor___RUN_DEPENDS`
+* `__flavor___TEST_DEPENDS`
+
+[[flavors-helpers-ex1]]
+.Специфичный для флейвора `PKGNAME`
+[example]
+====
+Поскольку все пакеты должны иметь уникальные имена, флейворы должны изменять их, используя `__flavor___PKGNAMEPREFIX` и `__flavor___PKGNAMESUFFIX`, что упрощает задачу:
+
+[.programlisting]
+....
+FLAVORS= normal lite
+lite_PKGNAMESUFFIX= -lite
+....
+
+====
+
+[[flavors-auto-php]]
+== `USES=php` и флейворы
+
+При использовании crossref:uses[uses-php,`php`] с одним из этих аргументов: `phpize`, `ext`, `zend` или `pecl`, порт автоматически получит заполненный параметр `FLAVORS` с версиями PHP, которые он поддерживает.
+
+[[flavors-auto-php-ex1]]
+.Простое расширение `USES=php`
+[example]
+====
+Это создаст пакет для всех поддерживаемых версий:
+
+[.programlisting]
+....
+PORTNAME= some-ext
+PORTVERSION= 0.0.1
+PKGNAMEPREFIX= ${PHP_PKGNAMEPREFIX}
+
+USES= php:ext
+....
+
+Это создаст пакет для всех поддерживаемых версий, кроме 7.2:
+
+[.programlisting]
+....
+PORTNAME= some-ext
+PORTVERSION= 0.0.1
+PKGNAMEPREFIX= ${PHP_PKGNAMEPREFIX}
+
+USES= php:ext
+IGNORE_WITH_PHP= 72
+....
+
+====
+
+[[flavors-auto-php-app]]
+=== Версии PHP с приложениями PHP
+
+Приложения PHP также могут быть созданы с использованием флейворов.
+
+Это позволяет создавать пакеты для всех версий PHP, чтобы пользователи могли использовать их с любой необходимой версией на своих серверах.
+
+[IMPORTANT]
+====
+Приложения PHP, которые используют флейворы, _обязаны_ добавлять `PHP_PKGNAMESUFFIX` к именам своих пакетов.
+====
+
+[[flavors-auto-php-app-ex1]]
+.Добавление флейворов в PHP-приложения
+[example]
+====
+Добавление поддержки флейворов в PHP-приложение просто:
+
+[.programlisting]
+....
+PKGNAMESUFFIX= ${PHP_PKGNAMESUFFIX}
+
+USES= php:flavors
+....
+
+====
+
+[TIP]
+====
+При добавлении зависимости к порту с вариантом PHP используйте `@${PHP_FLAVOR}`. _Никогда_ не используйте `FLAVOR` напрямую.
+====
+
+[[flavors-auto-python]]
+== `USES=python` и флейворы
+
+При использовании crossref:uses[uses-python,`python`] и `USE_PYTHON=distutils` порт автоматически получит заполненные `FLAVORS` с версиями Python, которые он поддерживает.
+
+[[flavors-auto-python-ex1]]
+.Простой `USES=python`
+[example]
+====
+Предполагая, что поддерживаемые версии Python — 2.7, 3.4, 3.5 и 3.6, а версии Python 2 и 3 по умолчанию — 2.7 и 3.6, порт с параметрами:
+
+[.programlisting]
+....
+USES= python
+USE_PYTHON= distutils
+....
+
+получит следующие флейворы: `py27` и `py36`.
+
+[.programlisting]
+....
+USES= python
+USE_PYTHON= distutils allflavors
+....
+
+получит следующие флейворы: `py27`, `py34`, `py35` и `py36`.
+====
+
+[[flavors-auto-python-ex2]]
+.`USES=python` с требованиями к версии
+[example]
+====
+Предполагая, что поддерживаемые версии Python — 2.7, 3.4, 3.5 и 3.6, а версии Python 2 и 3 по умолчанию — 2.7 и 3.6, порт с параметрами:
+
+[.programlisting]
+....
+USES= python:-3.5
+USE_PYTHON= distutils
+....
+
+получит следующие флейвор: `py27`.
+
+[.programlisting]
+....
+USES= python:-3.5
+USE_PYTHON= distutils allflavors
+....
+
+получит следующие флейворы: `py27`, `py34` и `py35`.
+
+[.programlisting]
+....
+USES= python:3.4+
+USE_PYTHON= distutils
+....
+
+получит следующий флейвор: `py36`.
+
+[.programlisting]
+....
+USES= python:3.4+
+USE_PYTHON= distutils allflavors
+....
+
+получит следующие флейворы: `py34`, `py35` и `py36`.
+====
+
+`PY_FLAVOR` доступен для указания правильной версии модулей Python. Все зависимости от вариантов портов Python должны использовать `PY_FLAVOR`, а не `FLAVOR` напрямую.
+
+[[flavors-auto-python-ex3]]
+.Для порта, не использующего `distutils`
+[example]
+====
+Если версия Python 3 по умолчанию — 3.6, следующая команда установит `PY_FLAVOR` в значение `py36`:
+
+[.programlisting]
+....
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR}
+
+USES= python:3.5+
+....
+
+====
+
+[[flavors-auto-lua]]
+== `USES=lua` и флейворы
+
+При использовании crossref:uses[uses-lua,`lua:module`] или crossref:uses[uses-lua,`lua:flavors`] порт автоматически получит заполненный параметр `FLAVORS` с версиями Lua, которые он поддерживает. Однако предполагается, что обычные приложения (а не модули Lua) не должны использовать эту возможность; большинству приложений, которые встраивают или иным образом используют Lua, следует просто указывать `USES=lua`.
+
+`LUA_FLAVOR` доступен (и должен использоваться) для зависимости от правильной версии зависимостей, независимо от того, использовал ли порт параметры `flavors` или `module`.
+
+См. crossref:special[using-lua,Использование Lua] для получения дополнительной информации.
+
+[[flavors-auto-guile]]
+== `USES=guile` и флейворы
+
+При использовании crossref:uses[uses-guile,`guile:flavors`] порт автоматически получит заполненное поле `FLAVORS` с версиями Guile, которые он поддерживает. Однако не предполагается, что обычные приложения должны использовать эту возможность; она в первую очередь предназначена для библиотек и расширений, таких как `guile-lib` или `guile-cairo`.
+
+`GUILE_FLAVOR` доступен (и должен использоваться) для зависимости от правильной версии зависимостей с флейворами, независимо от того, использовал ли порт параметр `flavors` или нет.
+
+См. crossref:special[using-guile,Использование Guile] для получения дополнительной информации.
diff --git a/documentation/content/ru/books/porters-handbook/flavors/_index.po b/documentation/content/ru/books/porters-handbook/flavors/_index.po
new file mode 100644
index 0000000000..9e9ed2fcb6
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/flavors/_index.po
@@ -0,0 +1,801 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-13 19:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookflavors_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:1
+#, no-wrap
+msgid "Flavors are a way to have multiple variations of a port"
+msgstr "Флейворы — это способ создания нескольких вариаций порта"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:1
+#, no-wrap
+msgid "Chapter 7. Flavors"
+msgstr "Глава 7. Флейворы"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:14
+#, no-wrap
+msgid "Flavors"
+msgstr "Флейворы"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:52
+#, no-wrap
+msgid "An Introduction to Flavors"
+msgstr "Введение в флейворы (Flavors)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:56
+msgid ""
+"Flavors are a way to have multiple variations of a port. The port is built "
+"multiple times, with variations."
+msgstr ""
+"Флейворы (Flavors) — это способ создания нескольких вариаций порта. Порт "
+"собирается несколько раз с различными вариациями."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:58
+msgid ""
+"For example, a port can have a normal version with many features and quite a "
+"few dependencies, and a light \"lite\" version with only basic features and "
+"minimal dependencies."
+msgstr ""
+"Например, порт может иметь обычную версию с множеством функций и "
+"значительным количеством зависимостей, а также облегчённую \"lite\"-версию "
+"только с базовыми функциями и минимальными зависимостями."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:60
+msgid ""
+"Another example could be, a port can have a GTK flavor and a QT flavor, "
+"depending on which toolkit it uses."
+msgstr ""
+"Еще одним примером может быть порт с вариантом GTK и вариантом QT, в "
+"зависимости от используемого набора инструментов."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:62
+#, no-wrap
+msgid "Using FLAVORS"
+msgstr "Использование FLAVORS"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:66
+msgid ""
+"To declare a port having multiple flavors, add `FLAVORS` to its "
+"[.filename]#Makefile#. The first flavor in `FLAVORS` is the default flavor."
+msgstr ""
+"Чтобы объявить порт с несколькими флейворами, добавьте `FLAVORS` в его "
+"[.filename]#Makefile#. Первый вариант в `FLAVORS` является вариантом по "
+"умолчанию."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:70
+msgid ""
+"It can help simplify the logic of the [.filename]#Makefile# to also define "
+"`FLAVOR` as:"
+msgstr ""
+"Это может помочь упростить логику [.filename]#Makefile#, также определив "
+"`FLAVOR` как:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:74
+#, no-wrap
+msgid "FLAVOR?=\t${FLAVORS:[1]}\n"
+msgstr "FLAVOR?=\t${FLAVORS:[1]}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:80
+msgid ""
+"To distinguish flavors from options, which are always uppercase letters, "
+"flavor names can _only_ contain lowercase letters, numbers, and the "
+"underscore `_`."
+msgstr ""
+"Чтобы отличать флейворы от опций, которые всегда обозначаются заглавными "
+"буквами, названия флейворов могут содержать _только_ строчные буквы, цифры и "
+"символ подчёркивания `_`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:83
+#, no-wrap
+msgid "Basic Flavors Usage"
+msgstr "Основы использования флейворов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:87
+msgid ""
+"If a port has a \"lite\" slave port, the slave port can be removed, and the "
+"port can be converted to flavors with:"
+msgstr ""
+"Если порт имеет \"облегченный\" подчиненный порт (lite slave port), "
+"подчиненный порт можно удалить, а порт преобразовать во флейворы с помощью:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:96
+#, no-wrap
+msgid ""
+"FLAVORS=\tdefault lite\n"
+"lite_PKGNAMESUFFIX=\t-lite\n"
+"[...]\n"
+".if ${FLAVOR:U} != lite\n"
+"[enable non lite features]\n"
+".endif\n"
+msgstr ""
+"FLAVORS=\tdefault lite\n"
+"lite_PKGNAMESUFFIX=\t-lite\n"
+"[...]\n"
+".if ${FLAVOR:U} != lite\n"
+"[enable non lite features]\n"
+".endif\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:101
+#, no-wrap
+msgid "Another Basic Flavors Usage"
+msgstr "Еще один пример базового использования флейворов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:105
+msgid ""
+"If a port has a `-nox11` slave port, the slave port can be removed, and the "
+"port can be converted to flavors with:"
+msgstr ""
+"Если порт имеет подчиненный порт `-nox11`, подчиненный порт можно удалить, а "
+"порт преобразовать в флейворы с помощью:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:115
+#, no-wrap
+msgid ""
+"FLAVORS=\tx11 nox11\n"
+"FLAVOR?=\t${FLAVORS:[1]}\n"
+"nox11_PKGNAMESUFFIX=\t-nox11\n"
+"[...]\n"
+".if ${FLAVOR} == x11\n"
+"[enable x11 features]\n"
+".endif\n"
+msgstr ""
+"FLAVORS=\tx11 nox11\n"
+"FLAVOR?=\t${FLAVORS:[1]}\n"
+"nox11_PKGNAMESUFFIX=\t-nox11\n"
+"[...]\n"
+".if ${FLAVOR} == x11\n"
+"[enable x11 features]\n"
+".endif\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:120
+#, no-wrap
+msgid "More Complex Flavors Usage"
+msgstr "Использование флейворов в более сложных примерах"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:126
+msgid ""
+"Here is a slightly edited excerpt of what is present in package:devel/"
+"libpeas[], a port that uses the crossref:flavors[flavors-auto-python,Python "
+"flavors]. With the default Python 2 and 3 versions being 2.7 and 3.6, it "
+"will automatically get `FLAVORS=py27 py36`"
+msgstr ""
+"Вот слегка отредактированный отрывок из того, что присутствует в пакете "
+"package:devel/libpeas[], порте, который использует crossref:flavors[flavors-"
+"auto-python,флейворы Python]. При стандартных версиях Python 2 и 3, а именно "
+"2.7 и 3.6, он автоматически получит `FLAVORS=py27 py36`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:131
+#, no-wrap
+msgid ""
+"USES=\t\tgnome python\n"
+"USE_PYTHON=\tflavors \n"
+msgstr ""
+"USES=\t\tgnome python\n"
+"USE_PYTHON=\tflavors \n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:134
+#, no-wrap
+msgid ""
+".if ${FLAVOR:Upy27:Mpy2*} \n"
+"USE_GNOME=\tpygobject3 \n"
+msgstr ""
+".if ${FLAVOR:Upy27:Mpy2*} \n"
+"USE_GNOME=\tpygobject3 \n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:136
+#, no-wrap
+msgid "CONFIGURE_ARGS+=\t--enable-python2 --disable-python3\n"
+msgstr "CONFIGURE_ARGS+=\t--enable-python2 --disable-python3\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:141
+#, no-wrap
+msgid ""
+"BUILD_WRKSRC=\t${WRKSRC}/loaders/python \n"
+"INSTALL_WRKSRC=\t${WRKSRC}/loaders/python \n"
+".else # py3*\n"
+"USE_GNOME+=\tpy3gobject3 \n"
+msgstr ""
+"BUILD_WRKSRC=\t${WRKSRC}/loaders/python \n"
+"INSTALL_WRKSRC=\t${WRKSRC}/loaders/python \n"
+".else # py3*\n"
+"USE_GNOME+=\tpy3gobject3 \n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:144
+#, no-wrap
+msgid ""
+"CONFIGURE_ARGS+=\t--disable-python2 --enable-python3 \\\n"
+"\t\t\tac_cv_path_PYTHON3_CONFIG=${LOCALBASE}/bin/python${PYTHON_VER}-config \n"
+msgstr ""
+"CONFIGURE_ARGS+=\t--disable-python2 --enable-python3 \\\n"
+"\t\t\tac_cv_path_PYTHON3_CONFIG=${LOCALBASE}/bin/python${PYTHON_VER}-config \n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:148
+#, no-wrap
+msgid ""
+"BUILD_WRKSRC=\t${WRKSRC}/loaders/python3 \n"
+"INSTALL_WRKSRC=\t${WRKSRC}/loaders/python3 \n"
+".endif\n"
+msgstr ""
+"BUILD_WRKSRC=\t${WRKSRC}/loaders/python3 \n"
+"INSTALL_WRKSRC=\t${WRKSRC}/loaders/python3 \n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:152
+#, no-wrap
+msgid ""
+"py34_PLIST=\t${.CURDIR}/pkg-plist-py3 \n"
+"py35_PLIST=\t${.CURDIR}/pkg-plist-py3 \n"
+"py36_PLIST=\t${.CURDIR}/pkg-plist-py3\n"
+msgstr ""
+"py34_PLIST=\t${.CURDIR}/pkg-plist-py3 \n"
+"py35_PLIST=\t${.CURDIR}/pkg-plist-py3 \n"
+"py36_PLIST=\t${.CURDIR}/pkg-plist-py3\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:162
+msgid ""
+"This port does not use `USE_PYTHON=distutils` but needs Python flavors "
+"anyway. To guard against `FLAVOR` being empty, which would cause a "
+"man:make[1] error, use `${FLAVOR:U}` in string comparisons instead of `$"
+"{FLAVOR}`. The Gnome Python gobject3 bindings have two different names, one "
+"for Python 2, pygobject3 and one for Python 3, py3gobject3. The `configure` "
+"script has to run in [.filename]#${WRKSRC}#, but we are only interested in "
+"building and installing the Python 2 or Python 3 parts of the software, so "
+"set the build and install base directories appropriately. Hint about the "
+"correct Python 3 config script path name. The packing list is different "
+"when the built with Python 3. As there are three possible Python 3 versions, "
+"set `PLIST` for all three using the crossref:flavors[flavors-using-"
+"helpers,helper]."
+msgstr ""
+"Этот порт не использует `USE_PYTHON=distutils`, но всё равно требует "
+"флейворы Python. Чтобы избежать ошибки в man:make[1] из-за пустого значения "
+"`FLAVOR`, используйте `${FLAVOR:U}` в сравнениях строк вместо `${FLAVOR}`. "
+"Привязки Gnome Python gobject3 имеют два разных названия: pygobject3 для "
+"Python 2 и py3gobject3 для Python 3. Скрипт `configure` должен выполняться в "
+"[.filename]#${WRKSRC}#, но нас интересует только сборка и установка частей "
+"программного обеспечения для Python 2 или Python 3, поэтому установите "
+"базовые каталоги сборки и установки соответствующим образом. Подсказка о "
+"правильном пути к конфигурационному скрипту Python 3. Список упаковки "
+"отличается при сборке с Python 3. Поскольку есть три возможные версии Python "
+"3, установите `PLIST` для всех трёх с помощью crossref:flavors[flavors-using-"
+"helpers, вспомогательные инструменты флейворов]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:165
+#, no-wrap
+msgid "Flavors Helpers"
+msgstr "Вспомогательные инструменты для флейворов (Flavors Helpers)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:168
+msgid ""
+"To make the [.filename]#Makefile# easier to write, a few flavors helpers "
+"exist."
+msgstr ""
+"Чтобы упростить написание [.filename]#Makefile#, существуют несколько "
+"вспомогательных инструментов (помощников) флейворов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:170
+msgid "This list of helpers will set their variable:"
+msgstr "Этот список помощников установит их переменную:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:172
+msgid "`__flavor___PKGNAMEPREFIX`"
+msgstr "`__flavor___PKGNAMEPREFIX`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:173
+msgid "`__flavor___PKGNAMESUFFIX`"
+msgstr "`__flavor___PKGNAMESUFFIX`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:174
+msgid "`__flavor___PLIST`"
+msgstr "`__flavor___PLIST`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:175
+msgid "`__flavor___DESCR`"
+msgstr "`__flavor___DESCR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:177
+msgid "This list of helpers will append to their variable:"
+msgstr "Этот список помощников будет добавлен к их переменной:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:179
+msgid "`__flavor___CONFLICTS`"
+msgstr "`__flavor___CONFLICTS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:180
+msgid "`__flavor___CONFLICTS_BUILD`"
+msgstr "`__flavor___CONFLICTS_BUILD`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:181
+msgid "`__flavor___CONFLICTS_INSTALL`"
+msgstr "`__flavor___CONFLICTS_INSTALL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:182
+msgid "`__flavor___PKG_DEPENDS`"
+msgstr "`__flavor___PKG_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:183
+msgid "`__flavor___EXTRACT_DEPENDS`"
+msgstr "`__flavor___EXTRACT_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:184
+msgid "`__flavor___PATCH_DEPENDS`"
+msgstr "`__flavor___PATCH_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:185
+msgid "`__flavor___FETCH_DEPENDS`"
+msgstr "`__flavor___FETCH_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:186
+msgid "`__flavor___BUILD_DEPENDS`"
+msgstr "`__flavor___BUILD_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:187
+msgid "`__flavor___LIB_DEPENDS`"
+msgstr "`__flavor___LIB_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:188
+msgid "`__flavor___RUN_DEPENDS`"
+msgstr "`__flavor___RUN_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:189
+msgid "`__flavor___TEST_DEPENDS`"
+msgstr "`__flavor___TEST_DEPENDS`"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:191
+#, no-wrap
+msgid "Flavor Specific `PKGNAME`"
+msgstr "Специфичный для флейвора `PKGNAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:195
+msgid ""
+"As all packages must have a different package name, flavors must change "
+"theirs, using `__flavor___PKGNAMEPREFIX` and `__flavor___PKGNAMESUFFIX` "
+"makes this easy:"
+msgstr ""
+"Поскольку все пакеты должны иметь уникальные имена, флейворы должны изменять "
+"их, используя `__flavor___PKGNAMEPREFIX` и `__flavor___PKGNAMESUFFIX`, что "
+"упрощает задачу:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:200
+#, no-wrap
+msgid ""
+"FLAVORS=\tnormal lite\n"
+"lite_PKGNAMESUFFIX=\t-lite\n"
+msgstr ""
+"FLAVORS=\tnormal lite\n"
+"lite_PKGNAMESUFFIX=\t-lite\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:205
+#, no-wrap
+msgid "`USES=php` and Flavors"
+msgstr "`USES=php` и флейворы"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:209
+msgid ""
+"When using crossref:uses[uses-php,`php`] with one of these arguments, "
+"`phpize`, `ext`, `zend`, or `pecl`, the port will automatically have "
+"`FLAVORS` filled in with the PHP versions it supports."
+msgstr ""
+"При использовании crossref:uses[uses-php,`php`] с одним из этих аргументов: "
+"`phpize`, `ext`, `zend` или `pecl`, порт автоматически получит заполненный "
+"параметр `FLAVORS` с версиями PHP, которые он поддерживает."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:211
+#, no-wrap
+msgid "Simple `USES=php` Extension"
+msgstr "Простое расширение `USES=php`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:215
+msgid "This will generate package for all the supported versions:"
+msgstr "Это создаст пакет для всех поддерживаемых версий:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:221
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:232
+#, no-wrap
+msgid ""
+"PORTNAME=\tsome-ext\n"
+"PORTVERSION=\t0.0.1\n"
+"PKGNAMEPREFIX=\t${PHP_PKGNAMEPREFIX}\n"
+msgstr ""
+"PORTNAME=\tsome-ext\n"
+"PORTVERSION=\t0.0.1\n"
+"PKGNAMEPREFIX=\t${PHP_PKGNAMEPREFIX}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:223
+#, no-wrap
+msgid "USES=\t\tphp:ext\n"
+msgstr "USES=\t\tphp:ext\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:226
+msgid "This will generate package for all the supported versions but 7.2:"
+msgstr "Это создаст пакет для всех поддерживаемых версий, кроме 7.2:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:235
+#, no-wrap
+msgid ""
+"USES=\t\tphp:ext\n"
+"IGNORE_WITH_PHP=\t72\n"
+msgstr ""
+"USES=\t\tphp:ext\n"
+"IGNORE_WITH_PHP=\t72\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:240
+#, no-wrap
+msgid "PHP Flavors with PHP Applications"
+msgstr "Версии PHP с приложениями PHP"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:243
+msgid "PHP applications can also be flavorized."
+msgstr "Приложения PHP также могут быть созданы с использованием флейворов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:245
+msgid ""
+"This allows generating packages for all PHP versions, so that users can use "
+"them with whatever version they need on their servers."
+msgstr ""
+"Это позволяет создавать пакеты для всех версий PHP, чтобы пользователи могли "
+"использовать их с любой необходимой версией на своих серверах."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:249
+msgid ""
+"PHP applications that are flavorized _must_ append `PHP_PKGNAMESUFFIX` to "
+"their package names."
+msgstr ""
+"Приложения PHP, которые используют флейворы, _обязаны_ добавлять "
+"`PHP_PKGNAMESUFFIX` к именам своих пакетов."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:252
+#, no-wrap
+msgid "Flavorizing a PHP Application"
+msgstr "Добавление флейворов в PHP-приложения"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:256
+msgid "Adding Flavors support to a PHP application is straightforward:"
+msgstr "Добавление поддержки флейворов в PHP-приложение просто:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:260
+#, no-wrap
+msgid "PKGNAMESUFFIX=\t${PHP_PKGNAMESUFFIX}\n"
+msgstr "PKGNAMESUFFIX=\t${PHP_PKGNAMESUFFIX}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:262
+#, no-wrap
+msgid "USES=\tphp:flavors\n"
+msgstr "USES=\tphp:flavors\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:270
+msgid ""
+"When adding a dependency on a PHP flavored port, use `@${PHP_FLAVOR}`. "
+"_Never_ use `FLAVOR` directly."
+msgstr ""
+"При добавлении зависимости к порту с вариантом PHP используйте `@$"
+"{PHP_FLAVOR}`. _Никогда_ не используйте `FLAVOR` напрямую."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:273
+#, no-wrap
+msgid "`USES=python` and Flavors"
+msgstr "`USES=python` и флейворы"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:277
+msgid ""
+"When using crossref:uses[uses-python,`python`] and `USE_PYTHON=distutils`, "
+"the port will automatically have `FLAVORS` filled in with the Python "
+"versions it supports."
+msgstr ""
+"При использовании crossref:uses[uses-python,`python`] и "
+"`USE_PYTHON=distutils` порт автоматически получит заполненные `FLAVORS` с "
+"версиями Python, которые он поддерживает."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:279
+#, no-wrap
+msgid "Simple `USES=python`"
+msgstr "Простой `USES=python`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:283
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:306
+msgid ""
+"Supposing the current Python supported versions are 2.7, 3.4, 3.5, and 3.6, "
+"and the default Python 2 and 3 versions are 2.7 and 3.6, a port with:"
+msgstr ""
+"Предполагая, что поддерживаемые версии Python — 2.7, 3.4, 3.5 и 3.6, а "
+"версии Python 2 и 3 по умолчанию — 2.7 и 3.6, порт с параметрами:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:288
+#, no-wrap
+msgid ""
+"USES=\tpython\n"
+"USE_PYTHON=\tdistutils\n"
+msgstr ""
+"USES=\tpython\n"
+"USE_PYTHON=\tdistutils\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:291
+msgid "Will get these flavors: `py27`, and `py36`."
+msgstr "получит следующие флейворы: `py27` и `py36`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:296
+#, no-wrap
+msgid ""
+"USES=\tpython\n"
+"USE_PYTHON=\tdistutils allflavors\n"
+msgstr ""
+"USES=\tpython\n"
+"USE_PYTHON=\tdistutils allflavors\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:299
+msgid "Will get these flavors: `py27`, `py34`, `py35` and `py36`."
+msgstr "получит следующие флейворы: `py27`, `py34`, `py35` и `py36`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:302
+#, no-wrap
+msgid "`USES=python` with Version Requirements"
+msgstr "`USES=python` с требованиями к версии"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:311
+#, no-wrap
+msgid ""
+"USES=\tpython:-3.5\n"
+"USE_PYTHON=\tdistutils\n"
+msgstr ""
+"USES=\tpython:-3.5\n"
+"USE_PYTHON=\tdistutils\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:314
+msgid "Will get this flavor: `py27`."
+msgstr "получит следующие флейвор: `py27`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:319
+#, no-wrap
+msgid ""
+"USES=\tpython:-3.5\n"
+"USE_PYTHON=\tdistutils allflavors\n"
+msgstr ""
+"USES=\tpython:-3.5\n"
+"USE_PYTHON=\tdistutils allflavors\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:322
+msgid "Will get these flavors: `py27`, `py34`, and `py35`."
+msgstr "получит следующие флейворы: `py27`, `py34` и `py35`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:327
+#, no-wrap
+msgid ""
+"USES=\tpython:3.4+\n"
+"USE_PYTHON=\tdistutils\n"
+msgstr ""
+"USES=\tpython:3.4+\n"
+"USE_PYTHON=\tdistutils\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:330
+msgid "Will get this flavor: `py36`."
+msgstr "получит следующий флейвор: `py36`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:335
+#, no-wrap
+msgid ""
+"USES=\tpython:3.4+\n"
+"USE_PYTHON=\tdistutils allflavors\n"
+msgstr ""
+"USES=\tpython:3.4+\n"
+"USE_PYTHON=\tdistutils allflavors\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:338
+msgid "Will get these flavors: `py34`, `py35`, and `py36`."
+msgstr "получит следующие флейворы: `py34`, `py35` и `py36`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:342
+msgid ""
+"`PY_FLAVOR` is available to depend on the correct version of Python "
+"modules. All dependencies on flavored Python ports should use `PY_FLAVOR`, "
+"and not `FLAVOR` directly.."
+msgstr ""
+"`PY_FLAVOR` доступен для указания правильной версии модулей Python. Все "
+"зависимости от вариантов портов Python должны использовать `PY_FLAVOR`, а не "
+"`FLAVOR` напрямую."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:344
+#, no-wrap
+msgid "For a Port Not Using `distutils`"
+msgstr "Для порта, не использующего `distutils`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:348
+msgid ""
+"If the default Python 3 version is 3.6, the following will set `PY_FLAVOR` "
+"to `py36`:"
+msgstr ""
+"Если версия Python 3 по умолчанию — 3.6, следующая команда установит "
+"`PY_FLAVOR` в значение `py36`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:352
+#, no-wrap
+msgid "RUN_DEPENDS=\t${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR}\n"
+msgstr "RUN_DEPENDS=\t${PYTHON_PKGNAMEPREFIX}mutagen>0:audio/py-mutagen@${PY_FLAVOR}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:354
+#, no-wrap
+msgid "USES=\tpython:3.5+\n"
+msgstr "USES=\tpython:3.5+\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:359
+#, no-wrap
+msgid "`USES=lua` and Flavors"
+msgstr "`USES=lua` и флейворы"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:365
+msgid ""
+"When using crossref:uses[uses-lua,`lua:module`] or crossref:uses[uses-"
+"lua,`lua:flavors`], the port will automatically have `FLAVORS` filled in "
+"with the Lua versions it supports. However, it is not expected that "
+"ordinary applications (rather than Lua modules) should use this feature; "
+"most applications that embed or otherwise use Lua should simply use "
+"`USES=lua`."
+msgstr ""
+"При использовании crossref:uses[uses-lua,`lua:module`] или "
+"crossref:uses[uses-lua,`lua:flavors`] порт автоматически получит заполненный "
+"параметр `FLAVORS` с версиями Lua, которые он поддерживает. Однако "
+"предполагается, что обычные приложения (а не модули Lua) не должны "
+"использовать эту возможность; большинству приложений, которые встраивают или "
+"иным образом используют Lua, следует просто указывать `USES=lua`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:367
+msgid ""
+"`LUA_FLAVOR` is available (and must be used) to depend on the correct "
+"version of dependencies regardless of whether the port used the `flavors` or "
+"`module` parameters."
+msgstr ""
+"`LUA_FLAVOR` доступен (и должен использоваться) для зависимости от "
+"правильной версии зависимостей, независимо от того, использовал ли порт "
+"параметры `flavors` или `module`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:369
+msgid "See crossref:special[using-lua,Using Lua] for further information."
+msgstr ""
+"См. crossref:special[using-lua,Использование Lua] для получения "
+"дополнительной информации."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:371
+#, no-wrap
+msgid "`USES=guile` and Flavors"
+msgstr "`USES=guile` и флейворы"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:378
+msgid ""
+"When using crossref:uses[uses-guile,`guile:flavors`], the port will "
+"automatically have `FLAVORS` filled in with the Guile versions it supports. "
+"However, it is not expected that ordinary applications should use this "
+"feature; it is primarily intended for use by libraries and extensions, such "
+"as `guile-lib` or `guile-cairo`."
+msgstr ""
+"При использовании crossref:uses[uses-guile,`guile:flavors`] порт "
+"автоматически получит заполненное поле `FLAVORS` с версиями Guile, которые "
+"он поддерживает. Однако не предполагается, что обычные приложения должны "
+"использовать эту возможность; она в первую очередь предназначена для "
+"библиотек и расширений, таких как `guile-lib` или `guile-cairo`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:380
+msgid ""
+"`GUILE_FLAVOR` is available (and must be used) to depend on the correct "
+"version of flavored dependencies regardless of whether the port used the "
+"`flavors` parameter or not."
+msgstr ""
+"`GUILE_FLAVOR` доступен (и должен использоваться) для зависимости от "
+"правильной версии зависимостей с флейворами, независимо от того, использовал "
+"ли порт параметр `flavors` или нет."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/flavors/_index.adoc:381
+msgid "See crossref:special[using-guile,Using Guile] for further information."
+msgstr ""
+"См. crossref:special[using-guile,Использование Guile] для получения "
+"дополнительной информации."
diff --git a/documentation/content/ru/books/porters-handbook/keeping-up/_index.adoc b/documentation/content/ru/books/porters-handbook/keeping-up/_index.adoc
index af916f13c6..fcce8ff89b 100644
--- a/documentation/content/ru/books/porters-handbook/keeping-up/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/keeping-up/_index.adoc
@@ -1,11 +1,13 @@
---
-title: Глава 14. Актуализация
-prev: books/porters-handbook/porting-samplem
+description: 'Как поддерживать актуальность коллекции портов FreeBSD'
next: books/porters-handbook/uses
-showBookMenu: true
-weight: 14
params:
- path: "/books/porters-handbook/keeping-up/"
+ path: /books/porters-handbook/keeping-up/
+prev: books/porters-handbook/order
+showBookMenu: true
+tags: ["keeping up", "ports", "updating", "FreshPorts"]
+title: 'Глава 16. Актуализация'
+weight: 16
---
[[keeping-up]]
@@ -16,7 +18,7 @@ params:
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 14
+:sectnumoffset: 16
:partnums:
:source-highlighter: rouge
:experimental:
@@ -51,23 +53,23 @@ endif::[]
[[freshports]]
== FreshPorts
-Самым простым способом отслеживать уже произошедшие обновления является подписка на http://www.FreshPorts.org/[FreshPorts]. Для мониторинга вы можете выбрать несколько портов. Мейнтейнерам настоятельно рекомендуется подписаться здесь, потому что они будут получать уведомления не только о собственных изменениях, но и об изменениях, сделанных любым другим коммиттером FreeBSD. (Это часто необходимо для синхронизации с изменениями на более низком технологическом уровне-хотя более корректным было бы получение предупреждений от тех, кто вносит подобные изменения, иногда этот этап пропускается или он просто непрактичен. Кроме того, в некоторых случаях изменения по своей природе весьма незначительны. Мы полагаем, что любой разработчик в таких ситуациях будет руководствоваться здравым смыслом).
+Самым простым способом отслеживать уже произошедшие обновления является подписка на https://www.FreshPorts.org/[FreshPorts]. Для мониторинга вы можете выбрать несколько портов. Сопровождающим порта настоятельно рекомендуется подписаться здесь, потому что они будут получать уведомления не только о собственных изменениях, но и об изменениях, сделанных любым другим коммиттером FreeBSD. (Это часто необходимо для синхронизации с изменениями на более низком технологическом уровне, хотя более корректным было бы получение предупреждений от тех, кто вносит подобные изменения, иногда этот этап пропускается или он просто непрактичен. Кроме того, в некоторых случаях изменения по своей природе весьма незначительны. Мы полагаем, что любой разработчик в таких ситуациях будет руководствоваться здравым смыслом).
Если вы хотите использовать FreshPorts, то вам нужна только учётная запись. Если регистрационный адрес вашей электронной почты будет иметь вид `@FreeBSD.org`, то справа на Web-страницах вы увидите дополнительную ссылку. Для тех из вас, кто уже получил учётную запись FreshPorts, но не использовал собственный адрес электронной почты `@FreeBSD.org`, достаточно сменить адрес на `@FreeBSD.org`, подписаться, а затем сменить его обратно.
Во FreshPorts имеется также функция проверки правильности, которая автоматически проверяет каждое изменение, внесённое в дерево портов FreeBSD. Если вы подпишетесь на эту услугу, то будете оповещаться обо всех ошибках, обнаруженных FreshPorts при проверке внесённых вами изменений.
-[[svnweb]]
+[[cgit]]
== Web-интерфейс к хранилищу исходных текстов
-Файлы в хранилище исходных текстов можно просматривать при помощи Web-интерфейса. Изменения, которые касаются в целом всей системы портов, теперь документируются в файле http://svnweb.FreeBSD.org/ports/head/CHANGES[CHANGES]. Изменения, касающиеся отдельных портов, отражаются теперь в файле http://svnweb.FreeBSD.org/ports/head/UPDATING[UPDATING]. Однако однозначный ответ на любой вопрос можно найти, только прочитав исходных код http://svnweb.FreeBSD.org/ports/head/Mk/bsd.port.mk[bsd.port.mk] и связанных с ним файлов.
+Файлы в хранилище исходных текстов можно просматривать при помощи Web-интерфейса. Изменения, которые касаются в целом всей системы портов, теперь документируются в файле https://cgit.FreeBSD.org/ports/tree/CHANGES[CHANGES]. Изменения, касающиеся отдельных портов, отражаются теперь в файле https://cgit.FreeBSD.org/ports/tree/UPDATING[UPDATING]. Однако однозначный ответ на любой вопрос можно найти, только прочитав исходных код https://cgit.FreeBSD.org/ports/tree/Mk/bsd.port.mk[bsd.port.mk] и связанных с ним файлов.
[[ports-mailing-list]]
== Список рассылки FreeBSD, посвящённый портам
Если вы поддерживаете порты, то должны следить за {freebsd-ports}. О важных изменениях, отражающихся на работе портов, будет сообщаться здесь, а затем они переносятся в [.filename]#CHANGES#.
-Если данный список рассылки слишком загружен сообщениями, вы можете отслеживать link:{freebsd-ports-announce-url}[freebsd-ports-announce], который модерируется и не является местом для дискуссий.
+Если данный список рассылки слишком загружен сообщениями, вы можете отслеживать {freebsd-ports-announce}, который модерируется и не является местом для дискуссий.
[[build-cluster]]
== Кластер построения портов FreeBSD
@@ -79,19 +81,12 @@ endif::[]
[[distfile-survey]]
== Portscout: сканер дистрибутивных файлов портов FreeBSD
-Кластер построения выделен для выполнения самого последнего релиза каждого из портов, дистрибутивные файлы которых уже были сгружены. Однако из-за постоянных изменений в Internet дистрибутивные файлы могут быстро исчезать. http://portscout.FreeBSD.org[Portscout], средство сканирования дистрибутивных файлов FreeBSD пытается опросить каждый из сайтов, доступных для сгрузки каждого из портов, для определения того, доступны ли ещё дистрибутивные файлы. Portscout может готовить отчёты в HTML и рассылать электронные письма об имеющихся обновлениях для портов тем, кто это запрашивает. Мейнтейнеры периодически запрашивают наличие изменений, либо вручную, либо используя ленту RSS.
-
-Главная страница Portscout отображает email мейнтейнера порта, количество портов, за которые ответственен мейнтейнер, количество портов с новыми дистрибутивными файлами и процент устаревших портов. Функция поиска выполняет поиск мейнтейнера по адресу электронной почты и позволяет выбирать между всеми портами или только устаревшими.
-
-При щелчке по адресу электронной почты мейнтейнера отображается список всех его портов, разделённых по категориям, вместе с текущим номером версии, информацией о наличии новой версии, временем последнего обновления порта и временем его последней проверки. Функция поиска на этой странице позволяет пользователю выполнять поиск конкретного порта.
-
-По щелчку на название порта в списке отображается информация о порте http://freshports.org[FreshPorts].
+Кластер построения выделен для выполнения самого последнего релиза каждого из портов, дистрибутивные файлы которых уже были сгружены. Однако из-за постоянных изменений в Internet дистрибутивные файлы могут быстро исчезать. https://portscout.FreeBSD.org[Portscout], средство сканирования дистрибутивных файлов FreeBSD пытается опросить каждый из сайтов, доступных для сгрузки каждого из портов, для определения того, доступны ли ещё дистрибутивные файлы. Portscout может готовить отчёты в HTML и рассылать электронные письма об имеющихся обновлениях для портов тем, кто это запрашивает. Сопровождающие периодически запрашивают наличие изменений либо вручную, либо используя ленту RSS.
-[[portsmon]]
-== Система мониторинга портов FreeBSD
+Главная страница Portscout отображает email сопровождающего порта, количество портов, за которые ответственен сопровождающий, количество портов с новыми дистрибутивными файлами и процент устаревших портов. Функция поиска выполняет поиск сопровождающего по адресу электронной почты и позволяет выбирать между всеми портами или только устаревшими.
-Другим полезным ресурсом является http://portsmon.FreeBSD.org[Система мониторинга портов FreeBSD] (известная также как `portsmon`). Система представляет собой базу данных, обрабатывающую информацию из нескольких источников и позволяющую просматривать их при помощи Web-интерфейса. На данный момент задействованы база сообщений об ошибках (PR), протоколы ошибок кластера построения и отдельные файлы из коллекции портов. В будущем в этот список будет добавлена система проверки дистрибутивных файлов и другие ресурсы.
+При щелчке по адресу электронной почты сопровождающего отображается список всех его портов, разделённых по категориям, вместе с текущим номером версии, информацией о наличии новой версии, временем последнего обновления порта и временем его последней проверки. Функция поиска на этой странице позволяет пользователю выполнять поиск конкретного порта.
-Для начала вы можете просмотреть всю информацию о некотором порте при помощи средства http://portsmon.FreeBSD.org/portoverview.py[Обзор отдельного порта].
+По щелчку на название порта в списке отображается информация о порте https://freshports.org[FreshPorts].
-На момент написания это единственный доступный ресурс, который для имени порта ставит в соответствие записи PR GNATS. (Отправители PR не всегда добавляют в название имя порта, хотя мы предпочитаем, чтобы они это делали.) Таким образом, `portsmon` это хорошее место для начала, если вы хотите найти присланные PR и/или ошибки построения для существующего порта; либо поискать, был ли уже прислан новый порт, который вы подумывали создать сами.
+Другим полезным ресурсом является https://github.com/freebsd/portscout/[репозиторий Portscout].
diff --git a/documentation/content/ru/books/porters-handbook/keeping-up/_index.po b/documentation/content/ru/books/porters-handbook/keeping-up/_index.po
new file mode 100644
index 0000000000..b5bd194cf5
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/keeping-up/_index.po
@@ -0,0 +1,270 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-15 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookkeeping-up_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:1
+#, no-wrap
+msgid "How to keep up the FreeBSD Ports Collection"
+msgstr "Как поддерживать актуальность коллекции портов FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:1
+#, no-wrap
+msgid "Chapter 16. Keeping Up"
+msgstr "Глава 16. Актуализация"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:14
+#, no-wrap
+msgid "Keeping Up"
+msgstr "Актуализация"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:53
+msgid ""
+"The FreeBSD Ports Collection is constantly changing. Here is some "
+"information on how to keep up."
+msgstr ""
+"Коллекция Портов FreeBSD постоянно изменяется. Здесь находится некоторая "
+"информация о том, как поддерживать её в актуальном состоянии."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:55
+#, no-wrap
+msgid "FreshPorts"
+msgstr "FreshPorts"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:63
+msgid ""
+"One of the easiest ways to learn about updates that have already been "
+"committed is by subscribing to https://www.FreshPorts.org/[FreshPorts]. "
+"Multiple ports can be monitored. Maintainers are strongly encouraged to "
+"subscribe, because they will receive notification of not only their own "
+"changes, but also any changes that any other FreeBSD committer has made. "
+"(These are often necessary to keep up with changes in the underlying ports "
+"framework-although it would be most polite to receive an advance heads-up "
+"from those committing such changes, sometimes this is overlooked or "
+"impractical. Also, in some cases, the changes are very minor in nature. We "
+"expect everyone to use their best judgement in these cases.)"
+msgstr ""
+"Самым простым способом отслеживать уже произошедшие обновления является "
+"подписка на https://www.FreshPorts.org/[FreshPorts]. Для мониторинга вы "
+"можете выбрать несколько портов. Сопровождающим порта настоятельно "
+"рекомендуется подписаться здесь, потому что они будут получать уведомления "
+"не только о собственных изменениях, но и об изменениях, сделанных любым "
+"другим коммиттером FreeBSD. (Это часто необходимо для синхронизации с "
+"изменениями на более низком технологическом уровне, хотя более корректным "
+"было бы получение предупреждений от тех, кто вносит подобные изменения, "
+"иногда этот этап пропускается или он просто непрактичен. Кроме того, в "
+"некоторых случаях изменения по своей природе весьма незначительны. Мы "
+"полагаем, что любой разработчик в таких ситуациях будет руководствоваться "
+"здравым смыслом)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:67
+msgid ""
+"To use FreshPorts, an account is required. Those with registered email "
+"addresses at `@FreeBSD.org` will see the opt-in link on the right-hand side "
+"of the web pages. Those who already have a FreshPorts account but are not "
+"using a `@FreeBSD.org` email address can change the email to `@FreeBSD.org`, "
+"subscribe, then change it back again."
+msgstr ""
+"Если вы хотите использовать FreshPorts, то вам нужна только учётная запись. "
+"Если регистрационный адрес вашей электронной почты будет иметь вид "
+"`@FreeBSD.org`, то справа на Web-страницах вы увидите дополнительную ссылку. "
+"Для тех из вас, кто уже получил учётную запись FreshPorts, но не использовал "
+"собственный адрес электронной почты `@FreeBSD.org`, достаточно сменить адрес "
+"на `@FreeBSD.org`, подписаться, а затем сменить его обратно."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:70
+msgid ""
+"FreshPorts also has a sanity test feature which automatically tests each "
+"commit to the FreeBSD ports tree. If subscribed to this service, a "
+"committer will receive notifications of any errors which FreshPorts detects "
+"during sanity testing of their commits."
+msgstr ""
+"Во FreshPorts имеется также функция проверки правильности, которая "
+"автоматически проверяет каждое изменение, внесённое в дерево портов FreeBSD. "
+"Если вы подпишетесь на эту услугу, то будете оповещаться обо всех ошибках, "
+"обнаруженных FreshPorts при проверке внесённых вами изменений."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:72
+#, no-wrap
+msgid "The Web Interface to the Source Repository"
+msgstr "Web-интерфейс к хранилищу исходных текстов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:78
+msgid ""
+"It is possible to browse the files in the source repository by using a web "
+"interface. Changes that affect the entire port system are now documented in "
+"the https://cgit.FreeBSD.org/ports/tree/CHANGES[CHANGES] file. Changes that "
+"affect individual ports are now documented in the https://cgit.FreeBSD.org/"
+"ports/tree/UPDATING[UPDATING] file. However, the definitive answer to any "
+"question is undoubtedly to read the source code of https://cgit.FreeBSD.org/"
+"ports/tree/Mk/bsd.port.mk[bsd.port.mk], and associated files."
+msgstr ""
+"Файлы в хранилище исходных текстов можно просматривать при помощи Web-"
+"интерфейса. Изменения, которые касаются в целом всей системы портов, теперь "
+"документируются в файле https://cgit.FreeBSD.org/ports/tree/"
+"CHANGES[CHANGES]. Изменения, касающиеся отдельных портов, отражаются теперь "
+"в файле https://cgit.FreeBSD.org/ports/tree/UPDATING[UPDATING]. Однако "
+"однозначный ответ на любой вопрос можно найти, только прочитав исходных код "
+"https://cgit.FreeBSD.org/ports/tree/Mk/bsd.port.mk[bsd.port.mk] и связанных "
+"с ним файлов."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:80
+#, no-wrap
+msgid "The FreeBSD Ports Mailing List"
+msgstr "Список рассылки FreeBSD, посвящённый портам"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:84
+msgid ""
+"As a ports maintainer, consider subscribing to {freebsd-ports}. Important "
+"changes to the way ports work will be announced there, and then committed to "
+"[.filename]#CHANGES#."
+msgstr ""
+"Если вы поддерживаете порты, то должны следить за {freebsd-ports}. О важных "
+"изменениях, отражающихся на работе портов, будет сообщаться здесь, а затем "
+"они переносятся в [.filename]#CHANGES#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:86
+msgid ""
+"If the volume of messages on this mailing list is too high, consider "
+"following {freebsd-ports-announce} which contains only announcements."
+msgstr ""
+"Если данный список рассылки слишком загружен сообщениями, вы можете "
+"отслеживать {freebsd-ports-announce}, который модерируется и не является "
+"местом для дискуссий."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:88
+#, no-wrap
+msgid "The FreeBSD Port Building Cluster"
+msgstr "Кластер построения портов FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:91
+msgid ""
+"One of the least-publicized strengths of FreeBSD is that an entire cluster "
+"of machines is dedicated to continually building the Ports Collection, for "
+"each of the major OS releases and for each Tier-1 architecture."
+msgstr ""
+"Одной из наименее известных сильных сторон FreeBSD является тот факт, что "
+"для непрерывного построения Коллекции Портов для каждого из основных релизов "
+"ОС для каждой архитектуры уровня поддержки Tier-1 выделен целый кластер "
+"машин."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:95
+msgid ""
+"Individual ports are built unless they are specifically marked with "
+"`IGNORE`. Ports that are marked with `BROKEN` will still be attempted, to "
+"see if the underlying problem has been resolved. (This is done by passing "
+"`TRYBROKEN` to the port's [.filename]#Makefile#.)"
+msgstr ""
+"Отдельные порты собираются, если они специально не помечены как `IGNORE`. "
+"Для портов, помеченных как `BROKEN`, попытки будут продолжены для того, "
+"чтобы увидеть, если основная проблема была решена. (Это сделано через "
+"использование переменной `TRYBROKEN` для [.filename]#Makefile# порта.)"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:97
+#, no-wrap
+msgid "Portscout: the FreeBSD Ports Distfile Scanner"
+msgstr "Portscout: сканер дистрибутивных файлов портов FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:104
+msgid ""
+"The build cluster is dedicated to building the latest release of each port "
+"with distfiles that have already been fetched. However, as the Internet "
+"continually changes, distfiles can quickly go missing. https://"
+"portscout.FreeBSD.org/[Portscout], the FreeBSD Ports distfile scanner, "
+"attempts to query every download site for every port to find out if each "
+"distfile is still available. Portscout can generate HTML reports and send "
+"emails about newly available ports to those who request them. Unless not "
+"otherwise subscribed, maintainers are asked to check periodically for "
+"changes, either by hand or using the RSS feed."
+msgstr ""
+"Кластер построения выделен для выполнения самого последнего релиза каждого "
+"из портов, дистрибутивные файлы которых уже были сгружены. Однако из-за "
+"постоянных изменений в Internet дистрибутивные файлы могут быстро исчезать. "
+"https://portscout.FreeBSD.org[Portscout], средство сканирования "
+"дистрибутивных файлов FreeBSD пытается опросить каждый из сайтов, доступных "
+"для сгрузки каждого из портов, для определения того, доступны ли ещё "
+"дистрибутивные файлы. Portscout может готовить отчёты в HTML и рассылать "
+"электронные письма об имеющихся обновлениях для портов тем, кто это "
+"запрашивает. Сопровождающие периодически запрашивают наличие изменений либо "
+"вручную, либо используя ленту RSS."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:107
+msgid ""
+"Portscout's first page gives the email address of the port maintainer, the "
+"number of ports the maintainer is responsible for, the number of those ports "
+"with new distfiles, and the percentage of those ports that are out-of-date. "
+"The search function allows for searching by email address for a specific "
+"maintainer, and for selecting whether only out-of-date ports are shown."
+msgstr ""
+"Главная страница Portscout отображает email сопровождающего порта, "
+"количество портов, за которые ответственен сопровождающий, количество портов "
+"с новыми дистрибутивными файлами и процент устаревших портов. Функция поиска "
+"выполняет поиск сопровождающего по адресу электронной почты и позволяет "
+"выбирать между всеми портами или только устаревшими."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:110
+msgid ""
+"Upon clicking on a maintainer's email address, a list of all of their ports "
+"is displayed, along with port category, current version number, whether or "
+"not there is a new version, when the port was last updated, and finally when "
+"it was last checked. A search function on this page allows the user to "
+"search for a specific port."
+msgstr ""
+"При щелчке по адресу электронной почты сопровождающего отображается список "
+"всех его портов, разделённых по категориям, вместе с текущим номером версии, "
+"информацией о наличии новой версии, временем последнего обновления порта и "
+"временем его последней проверки. Функция поиска на этой странице позволяет "
+"пользователю выполнять поиск конкретного порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:112
+msgid ""
+"Clicking on a port name in the list displays the https://freshports.org/"
+"[FreshPorts] port information."
+msgstr ""
+"По щелчку на название порта в списке отображается информация о порте https://"
+"freshports.org[FreshPorts]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/keeping-up/_index.adoc:113
+msgid ""
+"Additional documentation is available in the https://github.com/freebsd/"
+"portscout/[Portscout repository]."
+msgstr ""
+"Другим полезным ресурсом является https://github.com/freebsd/portscout/"
+"[репозиторий Portscout]."
diff --git a/documentation/content/ru/books/porters-handbook/makefiles/_index.adoc b/documentation/content/ru/books/porters-handbook/makefiles/_index.adoc
index f831873e56..51a032507e 100644
--- a/documentation/content/ru/books/porters-handbook/makefiles/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/makefiles/_index.adoc
@@ -1,15 +1,17 @@
---
-title: Глава 5. Настройка файла Makefile
-prev: books/porters-handbook/slow-porting
+description: 'Настройка Makefile для портов FreeBSD'
next: books/porters-handbook/special
+params:
+ path: /books/porters-handbook/makefiles/
+prev: books/porters-handbook/slow-porting
showBookMenu: true
+tags: ["makefiles", "configuring", "naming", "versions"]
+title: 'Глава 5. Настройка Makefile'
weight: 5
-params:
- path: "/books/porters-handbook/makefiles/"
---
[[makefiles]]
-= Настройка файла Makefile
+= Настройка Makefile
:doctype: book
:toc: macro
:toclevels: 1
@@ -20,7 +22,7 @@ params:
:partnums:
:source-highlighter: rouge
:experimental:
-:gcc-plus-plus: g++
+:g-plus-plus: g++
:images-path: books/porters-handbook/
ifdef::env-beastie[]
@@ -47,118 +49,325 @@ toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
-Настройка файла [.filename]#Makefile# достаточно проста, и мы снова предполагаем, что перед тем, как начать, вы посмотрите на существующие примеры. К тому же в этом руководстве имеется <<porting-samplem,примерный Makefile>>, так что взгляните на него и, пожалуйста, следуйте порядку переменных и разделов в этом образце, чтобы облегчить чтение вашего порта другими людьми.
+Настройка [.filename]#Makefile# довольно проста, и мы снова рекомендуем изучить существующие примеры перед началом. Также в этом руководстве есть crossref:porting-samplem[porting-samplem,пример Makefile], поэтому ознакомьтесь с ним и, пожалуйста, соблюдайте порядок переменных и разделов в этом шаблоне, чтобы порт был удобнее для чтения другими.
-Итак, расположим решаемые задачи в порядке их возникновения при создании вашего нового файла [.filename]#Makefile#:
+Рассмотрите эти проблемы последовательно при разработке нового [.filename]#Makefile#:
[[makefile-source]]
-== Оригинальные исходный код
+== Оригинальный исходный код
-Находится ли он в каталоге `DISTDIR` в виде стандартного упакованного архиватором `gzip` tar-архива с именем типа [.filename]#foozolix-1.2.tar.gz#? Если это так, можно перейти к следующему шагу. Если нет, то вы должны попытаться переопределить некоторые из переменных `DISTVERSION`, `DISTNAME`, `EXTRACT_CMD`, `EXTRACT_BEFORE_ARGS`, `EXTRACT_AFTER_ARGS`, `EXTRACT_SUFX` или `DISTFILES` в зависимости от того, насколько необычен формат дистрибутивного файла.
+Находится ли он в `DISTDIR` в виде стандартного архива ``gzip`` с именем вроде [.filename]#foozolix-1.2.tar.gz#? Если да, переходите к следующему шагу. Если нет, возможно, для формата имени файла дистрибутива потребуется переопределить одну или несколько переменных: `DISTVERSION`, `DISTNAME`, `EXTRACT_CMD`, `EXTRACT_BEFORE_ARGS`, `EXTRACT_AFTER_ARGS`, `EXTRACT_SUFX` или `DISTFILES`.
-В худшем случае вы можете просто определить свою собственную цель `do-extract` для переопределения действий по умолчанию, хотя к этому нужно будет прибегать в очень редких случаях, если вообще придётся.
+В худшем случае создайте пользовательскую цель `do-extract`, чтобы переопределить стандартную. Это редко, если вообще когда-либо, необходимо.
[[makefile-naming]]
== Именование
-В первой части [.filename]#Makefile# порта ему даётся название, указывается его номер версии и принадлежность к правильной категории.
+Первая часть [.filename]#Makefile# порта указывает его название, описывает номер версии и помещает его в соответствующую категорию.
+
+[[makefile-portname]]
+=== `PORTNAME`
+
+Установите `PORTNAME` как базовое имя программы. Оно используется в качестве основы для пакета FreeBSD и для crossref:makefiles[makefile-distname,`DISTNAME`].
+
+[IMPORTANT]
+====
+Название пакета должно быть уникальным во всём дереве портов. Убедитесь, что `PORTNAME` ещё не используется существующим портом и что никакой другой порт уже не имеет такой же `PKGBASE`. Если имя уже занято, добавьте либо crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMEPREFIX`, либо `PKGNAMESUFFIX`].
+====
+
+[[makefile-versions]]
+=== Версии, `DISTVERSION` _или_ `PORTVERSION`
-=== `PORTNAME` и `PORTVERSION`
+Установите `DISTVERSION` в номер версии программы.
+
+`PORTVERSION` — это версия, используемая для пакета FreeBSD. Она будет автоматически вычислена из `DISTVERSION` в соответствии со схемой версионирования пакетов FreeBSD. Если версия содержит _буквы_, может потребоваться задать `PORTVERSION` вместо `DISTVERSION`.
+
+[IMPORTANT]
+====
+Только одна из переменных `PORTVERSION` и `DISTVERSION` может быть установлена одновременно.
+====
+
+Время от времени некоторые программы используют схему версионирования, которая несовместима с тем, как `DISTVERSION` преобразуется в `PORTVERSION`.
+
+[TIP]
+====
+При обновлении порта можно использовать аргумент `-t` утилиты man:pkg-version[8], чтобы проверить, является ли новая версия больше или меньше предыдущей. Смотрите ниже, как использовать man:pkg-version[8] для сравнения версий.
+====
-В переменной `PORTNAME` вы должны указать основную часть имени вашего порта, а в переменной `PORTVERSION` - номер версии.
+[[makefile-versions-ex-pkg-version]]
+.Использование man:pkg-version[8] для сравнения версий
+[example]
+====
+`pkg version -t` принимает две версии в качестве аргументов и возвращает `<`, `=` или `>`, если первая версия меньше, равна или больше второй версии соответственно.
+
+[source, shell]
+....
+% pkg version -t 1.2 1.3
+< <.>
+% pkg version -t 1.2 1.2
+= <.>
+% pkg version -t 1.2 1.2.0
+= <.>
+% pkg version -t 1.2 1.2.p1
+> <.>
+% pkg version -t 1.2.a1 1.2.b1
+< <.>
+% pkg version -t 1.2 1.2p1
+< <.>
+....
+
+<.> `1.2` идёт перед `1.3`.
+<.> `1.2` и `1.2` равны, так как имеют одинаковую версию.
+<.> `1.2` и `1.2.0` равны, так как ноль ничего не значит.
+<.> `1.2` идёт после `1.2.p1`, так как `.p1` означает «pre-release 1» (предрелизная версия 1).
+<.> `1.2.a1` предшествует `1.2.b1`, представьте "alpha" и "beta", где `a` идёт перед `b`.
+<.> `1.2` находится перед `1.2p1`, так же как `2p1` (читается как "2, уровень исправления 1") — это версия, следующая после любой `2.X`, но перед `3`.
+
+[NOTE]
+****
+Здесь `a`, `b` и `p` используются так, как если бы они означали "альфа", "бета" или "пре-релиз" и "уровень патча", но на самом деле это просто буквы, которые сортируются в алфавитном порядке, поэтому можно использовать любую букву, и они будут отсортированы соответствующим образом.
+****
+
+====
+
+.Примеры `DISTVERSION` и производной `PORTVERSION`
+[cols="10%,90%", frame="none", options="header"]
+|===
+| DISTVERSION
+| .PORTVERSION
+
+|0.7.1d
+|0.7.1.d
+
+|10Alpha3
+|10.a3
+
+|3Beta7-pre2
+|3.b7.p2
+
+|8:f_17
+|8f.17
+|===
+
+[[makefile-versions-ex1]]
+.Использование `DISTVERSION`
+[example]
+====
+Если версия содержит только числа, разделённые точками, тире или подчёркиваниями, используйте `DISTVERSION`.
+
+[.programlisting]
+....
+PORTNAME= nekoto
+DISTVERSION= 1.2-4
+....
+
+Это сгенерирует `PORTVERSION` равный `1.2.4`.
+====
+
+[[makefile-versions-ex2]]
+.Использование `DISTVERSION` когда версия начинается с буквы или префикса
+[example]
+====
+Когда версия начинается или заканчивается буквой, или префиксом, или суффиксом, которые не являются частью версии, используйте `DISTVERSIONPREFIX`, `DISTVERSION` и `DISTVERSIONSUFFIX`.
+
+Если версия `v1.2-4`:
+
+[.programlisting]
+....
+PORTNAME= nekoto
+DISTVERSIONPREFIX= v
+DISTVERSION= 1_2_4
+....
+
+Некоторые проекты, использующие GitHub, могут включать своё название в версии. Например, версия может выглядеть как `nekoto-1.2-4`:
+
+[.programlisting]
+....
+PORTNAME= nekoto
+DISTVERSIONPREFIX= nekoto-
+DISTVERSION= 1.2_4
+....
+
+Эти проекты также иногда используют строку в конце версии, например, `1.2-4_RELEASE`:
+
+[.programlisting]
+....
+PORTNAME= nekoto
+DISTVERSION= 1.2-4
+DISTVERSIONSUFFIX= _RELEASE
+....
+
+Или они делают и то, и другое, например, `nekoto-1.2-4_RELEASE`:
+
+[.programlisting]
+....
+PORTNAME= nekoto
+DISTVERSIONPREFIX= nekoto-
+DISTVERSION= 1.2-4
+DISTVERSIONSUFFIX= _RELEASE
+....
+
+`DISTVERSIONPREFIX` и `DISTVERSIONSUFFIX` не будут использоваться при формировании `PORTVERSION`, а только в `DISTNAME`.
+
+Все сгенерируют `PORTVERSION` равный `1.2.4`.
+====
+
+[[makefile-versions-ex3]]
+.Использование `DISTVERSION`, когда версия содержит буквы, означающие "alpha", "beta" или "pre-release"
+[example]
+====
+Если версия содержит числа, разделённые точками, тире или подчёркиваниями, а буквы используются для обозначения "альфа", "бета" или "предварительной версии" (то есть до версии без букв), используйте `DISTVERSION`.
+
+[.programlisting]
+....
+PORTNAME= nekoto
+DISTVERSION= 1.2-pre4
+....
+
+[.programlisting]
+....
+PORTNAME= nekoto
+DISTVERSION= 1.2p4
+....
+
+Оба варианта создадут `PORTVERSION` равную `1.2.p4`, что предшествует версии 1.2. Для проверки этого факта можно использовать man:pkg-version[8]:
+
+[source, shell]
+....
+% pkg version -t 1.2.p4 1.2
+<
+....
+
+====
+
+[[makefile-versions-ex4]]
+.Не использовать `DISTVERSION`, если версия содержит буквы, означающие "уровень патча"
+[example]
+====
+Если версия содержит буквы, которые не означают "alpha", "beta" или "pre", а скорее указывают на "уровень исправления" и следуют после версии без букв, используйте `PORTVERSION`.
+
+[.programlisting]
+....
+PORTNAME= nekoto
+PORTVERSION= 1.2p4
+....
+
+В данном случае использование `DISTVERSION` невозможно, так как это приведёт к генерации версии `1.2.p4`, которая будет считаться более ранней, чем `1.2`, а не более поздней. man:pkg-version[8] подтвердит это:
+
+[source, shell]
+....
+% pkg version -t 1.2 1.2.p4
+> <.>
+% pkg version -t 1.2 1.2p4
+< <.>
+....
+
+<.> `1.2` идёт после `1.2.p4`, что в данном случае _неверно_.
+<.> `1.2` находится перед `1.2p4`, что и требовалось.
+====
+
+Для более сложных примеров настройки `PORTVERSION`, когда версия программного обеспечения действительно несовместима с FreeBSD, или `DISTNAME`, когда файл дистрибутива не содержит саму версию, см. crossref:makefiles[makefile-distname, `DISTNAME`].
[[makefile-naming-revepoch]]
=== `PORTREVISION` и `PORTEPOCH`
+[[makefile-portrevision]]
==== `PORTREVISION`
-Переменная `PORTREVISION` представляет собой монотонно увеличивающееся число, которое обнуляется при каждом увеличении значения переменной `PORTVERSION` (то есть каждый раз, когда создателями выпускается новый официальный релиз), и добавляется к имени пакета, если оно не равно нулю. Изменения в `PORTREVISION` используются автоматизированными инструментами (например, `pkg version`, см. man:pkg-version[8]) для определения факта появления нового пакета.
+`PORTREVISION` — это монотонно возрастающее значение, которое сбрасывается в 0 при каждом увеличении `DISTVERSION`, обычно при каждом новом официальном выпуске от поставщика. Если `PORTREVISION` не равен нулю, его значение добавляется к имени пакета. Изменения `PORTREVISION` используются автоматизированными инструментами, такими как man:pkg-version[8], для определения доступности нового пакета.
-Значение `PORTREVISION` должно увеличиваться каждый раз, когда в порте FreeBSD делаются изменения, которые как-либо меняют получаемый пакет. Сюда относятся только изменения, затрагивающие построение пакета с <<makefile-options,параметрами>> по умолчанию.
+`PORTREVISION` должен быть увеличен каждый раз, когда в порт вносятся изменения, которые так или иначе влияют на сгенерированный пакет. Это включает изменения, затрагивающие только пакеты, собранные с нестандартными crossref:makefiles[makefile-options,опциями].
-Примеры случаев, когда значение `PORTREVISION` должно быть увеличено:
+Примеры случаев, когда необходимо увеличить `PORTREVISION`:
-* Добавление патчей для исправления уязвимостей, ошибок, или добавления новой функциональности в порт.
-* Изменения в файле [.filename]#Makefile# порта для включения и выключения параметров, определяемых при компиляции пакета.
-* Изменения в списке упаковки или в поведении пакета во время его установки (например, изменение скрипта, генерирующего начальные данные для пакета, такие, как ssh-ключи для хоста).
-* Увеличение версии динамической библиотеки, от которой зависит порт (в этом случае тот, кто попытается установить старый пакет после установки более новой версии библиотеки, не сможет этого сделать, потому что при этом будет делаться поиск старой библиотеки libfoo.x, а не libfoo.(x+1)).
-* Большие функциональные изменения в дистрибутивном файле порта, происходящие без объявлений, и приводящие к большим изменениям, то есть изменения в дистрибутиве требуют корректировки файла [.filename]#distinfo# без соответствующего изменения `PORTVERSION`, когда как команда `diff -ru` между новой и старой версиями показывает нетривиальные изменения в коде.
+* Добавление исправлений для устранения уязвимостей безопасности, ошибок или для добавления новой функциональности в порт.
+* Изменения в [.filename]#Makefile# порта для включения или отключения параметров сборки в пакете.
+* Изменения в списке файлов пакета или в поведении во время установки. Например, изменение скрипта, который генерирует начальные данные для пакета, такие как ключи хоста man:ssh[1].
+* Увеличение версии зависимости порта от общей библиотеки (в данном случае, попытка установить старый пакет после установки более новой версии зависимости завершится неудачей, так как будет искаться старая версия libfoo.x вместо libfoo.(x+1)).
+* Тихие изменения в дистрибутивном файле порта, которые имеют значительные функциональные отличия. Например, изменения в дистрибутивном файле, требующие корректировки файла [.filename]#distinfo# без соответствующего изменения `DISTVERSION`, когда сравнение `diff -ru` старой и новой версий показывает нетривиальные изменения в коде.
+* Изменения в `MAINTAINER`.
-Примеры изменений, которые не требуют увеличения переменной `PORTREVISION`:
+Примеры изменений, которые не требуют увеличения `PORTREVISION`:
-* Изменения стиля в скелете порта без функциональных изменений в пакете.
-* Изменения в переменной `MASTER_SITES` или другие функциональные изменения порта, которые не затрагивают получающегося пакета.
-* Тривиальные патчи к дистрибутивному файлу, такие, как исправления опечаток, которые не так уж важны, что пользователи пакета должны озаботиться обновлением.
-* Исправления, касающиеся этапа построения, которые делают возможным построение пакета, если ранее это было невозможно сделать (пока изменения не приводят к изменению работы на любых других платформах, на которых порт ранее строился). Так как `PORTREVISION` отражает содержимое пакета, то, если ранее пакет не строился, то нет нужды увеличивать `PORTREVISION` для отметки изменения.
+* Стилевые изменения в каркасе портов без функциональных изменений в итоговом пакете.
+* Изменения в `MASTER_SITES` или другие функциональные изменения порта, которые не влияют на итоговый пакет.
+* Тривиальные исправления в дистрибутивном файле, такие как исправление опечаток, которые не настолько важны, чтобы пользователи пакета были вынуждены тратить время на обновление.
+* Исправления сборки, которые позволяют пакету компилироваться там, где ранее это не удавалось. При условии, что изменения не вносят функциональных изменений на других платформах, где порт ранее собирался. Поскольку `PORTREVISION` отражает содержимое пакета, если пакет ранее не мог быть собран, то нет необходимости увеличивать `PORTREVISION` для обозначения изменений.
-Правило, которому нужно приблизительно следовать, заключается в том, что нужно спрашивать себя, является ли вносимое в порт изменение таким, что от него выиграют все (в виде усовершенствования, исправления или благодаря тому, что новый пакет будет вообще работоспособным), и примите во внимание тот факт, что при этом все, кто регулярно обновляют своё дерево портов, будут обязаны это сделать. Если это так, то переменная `PORTREVISION` должна быть увеличена.
+Эмпирическое правило заключается в том, чтобы решить, является ли изменение, внесённое в порт, чем-то, что принесёт пользу _некоторым_ пользователям. Будь то улучшение, исправление или просто факт, что новый пакет вообще будет работать. Затем необходимо сопоставить это с тем, что всем, кто регулярно обновляет своё дерево портов, придётся выполнить обновление. Если ответ положительный, необходимо увеличить `PORTREVISION`.
+
+[NOTE]
+====
+Пользователи бинарных пакетов _никогда_ не увидят обновления, если `PORTREVISION` не увеличен. Без увеличения `PORTREVISION` сборщики пакетов не могут обнаружить изменение и, следовательно, не пересоберут пакет.
+====
+[[makefile-portepoch]]
==== `PORTEPOCH`
-Время от времени разработчик программного обеспечения или создатель порта FreeBSD делают что-то не так и выпускают версию программы, номер которой меньше предыдущей версии. Примером этого является порт, название которого меняется с foo-20000801 на foo-1.0 (изначально это не считалось бы более новой версией, так как 20000801 численно больше, чем 1).
+Время от времени разработчики программного обеспечения или сопровождающие портов FreeBSD совершают ошибку и выпускают версию своего ПО, которая фактически имеет меньший номер по сравнению с предыдущей. Примером может служить переход с foo-20000801 на foo-1.0 (первая версия будет ошибочно считаться более новой, поскольку число 20000801 больше, чем 1.0).
[TIP]
====
+Результаты сравнения номеров версий не всегда очевидны. Команда `pkg version` (см. man:pkg-version[8]) может быть использована для проверки сравнения двух строк с номерами версий. Например:
-Результат сравнения номера версии не всегда очевиден. Для выполнения сравнения двух строк с номером версии можно использовать `pkg version` (см. man:pkg-version[8]). Например:
-
-[source,shell]
+[source, shell]
....
% pkg version -t 0.031 0.29
>
....
-Строка `>` в выводе команды означает, что версия 0.031 считается выше, чем версия 0.29, что может быть не очевидно для того, кто выполняет портирование.
+Символ `>` в выводе указывает, что версия 0.031 считается больше, чем версия 0.29, что могло быть неочевидно для сопровождающего.
====
-В ситуациях, подобных этой, должно быть увеличено значение `PORTEPOCH`. Если значение `PORTEPOCH` не равно нулю, то оно добавляется к имени пакета, как описано в разделе выше. Значение `PORTEPOCH` никогда не должно уменьшаться или сбрасываться в ноль, потому что это приведёт к ошибке сравнения с пакетом с меньшим номером эпохи (то есть то, что пакет устарел, обнаружено не будет): номер новой версии (например, `1.0,1` в примере выше) останется меньше, чем номер предыдущей версии (20000801), однако суффикс `,1` интерпретируется различными автоматизированными утилитами особым образом, и окажется больше, чем предполагаемый суффикс `,0` более раннего пакета).
+В таких ситуациях необходимо увеличить `PORTEPOCH`. Если `PORTEPOCH` не равен нулю, он добавляется к имени пакета, как описано в разделе 0 выше. `PORTEPOCH` никогда не должен уменьшаться или сбрасываться до нуля, потому что это приведёт к ошибке при сравнении с пакетом из более ранней эпохи. Например, пакет не будет обнаружен как устаревший. Новый номер версии, `1.0,1` в приведённом выше примере, всё ещё численно меньше предыдущей версии, 20000801, но суффикс `,1` обрабатывается автоматизированными инструментами особым образом и считается большим, чем подразумеваемый суффикс `,0` у предыдущего пакета.
-Некорректное уменьшение или сброс `PORTEPOCH` приводит к печальным последствиям; если вы не поняли, о чём шла речь ранее, пожалуйста, всё же разберитесь с этим, либо спросите в списках рассылки.
+Неправильное удаление или сброс `PORTEPOCH` приводит к бесконечным проблемам. Если приведённое выше объяснение недостаточно ясно, обратитесь к {freebsd-ports}.
-Предполагается, что в большинстве портов переменная `PORTEPOCH` использоваться не будет, но при корректном использовании `PORTVERSION` может появиться необходимость её иметь, если в будущих релизах программное обеспечение должно изменить структуру номера версии. Однако создателям портов для FreeBSD нужно быть внимательными, когда разработчик выпускает релиз без официального номера версии - эдакие "промежуточные" релизы. Имеется соблазн пометить релиз датой его выхода, что может вызвать проблемы, как и в примере выше, когда будет выпущен новый "официальный" релиз.
+Ожидается, что `PORTEPOCH` не будет использоваться для большинства портов, и что разумное использование `DISTVERSION` или аккуратное применение `PORTVERSION` часто может предотвратить необходимость его использования, если будущий выпуск программного обеспечения изменит структуру версий. Однако разработчикам портов FreeBSD следует быть осторожными, когда вендор выпускает релиз без официального номера версии — например, релиз в виде "снимка" кода. Возникает соблазн обозначить такой релиз датой выпуска, что вызовет проблемы, как в примере выше, когда будет сделан новый "официальный" релиз.
-Например, если промежуточный релиз помечен датой 20000917, а предыдущая версия программного обеспечения имела номер 1.2, то промежуточному релизу должно быть поставлено в соответствие значение `PORTVERSION`, равное 1.2.20000917 или что-то похожее, но не 20000917, так как последующий релиз, скажем, 1.3, должен иметь численно большее значение.
+Например, если снимок выпущен на дату `20000917`, а предыдущая версия программного обеспечения была `1.2`, не следует использовать `20000917` для `DISTVERSION`. Правильным будет указать `DISTVERSION` как `1.2.20000917` или подобное, чтобы следующая версия, например `1.3`, оставалась численно большей.
-==== Пример использования переменных `PORTREVISION` и `PORTEPOCH`
+[[makefile-portrevision-example]]
+==== Пример использования `PORTREVISION` и `PORTEPOCH`
-Выполнен коммит порта `gtkmumble`, версии `0.10`, в коллекцию портов.
+Порт `gtkmumble` версии `0.10` добавлен в коллекцию портов:
[.programlisting]
....
PORTNAME= gtkmumble
-PORTVERSION= 0.10
+DISTVERSION= 0.10
....
-Значение `PKGNAME` станет равным `gtkmumble-0.10`.
+`PKGNAME` становится `gtkmumble-0.10`.
-Обнаружена брешь в безопасности, исправление которой потребовало создания локального патча для FreeBSD. Соответственно было увеличено значение переменной `PORTREVISION`.
+Обнаружена уязвимость в безопасности, требующая локального исправления FreeBSD. `PORTREVISION` соответствующим образом увеличивается.
[.programlisting]
....
PORTNAME= gtkmumble
-PORTVERSION= 0.10
+DISTVERSION= 0.10
PORTREVISION= 1
....
`PKGNAME` принимает значение `gtkmumble-0.10_1`
-Разработчиком выпущена новая версия с номером `0.2` (оказалось, что под номером `0.10` автор имел в виду `0.1.0`, а не "то, что будет выпущено после версии 0.9" - извините, теперь уже поздно). Так как новый младший номер версии `2` по значению меньше, чем номер предыдущей версии `10`, то должно быть увеличено значение `PORTEPOCH` для того, чтобы заставить распознавать вновь создаваемый пакет как "более новый". Так как это новый релиз программы, то `PORTREVISION` обнуляется (или удаляется из файла [.filename]#Makefile#).
+Выпущена новая версия от поставщика под номером `0.2` (оказывается, автор изначально подразумевал, что `0.10` на самом деле означает `0.1.0`, а не "то, что идет после 0.9" — увы, теперь уже поздно). Поскольку новая минорная версия `2` численно меньше предыдущей версии `10`, необходимо увеличить `PORTEPOCH`, чтобы вручную заставить систему распознавать новый пакет как "более новый". Так как это новый релиз кода от поставщика, `PORTREVISION` сбрасывается до 0 (или удаляется из [.filename]#Makefile#).
[.programlisting]
....
PORTNAME= gtkmumble
-PORTVERSION= 0.2
+DISTVERSION= 0.2
PORTEPOCH= 1
....
-`PKGNAME` принимает значение `gtkmumble-0.2,1`
+`PKGNAME` становится `gtkmumble-0.2,1`
-Следующий релиз имеет номер версии 0.3. Так как значение переменной `PORTEPOCH` никогда не уменьшается, что переменные, определяющие версии, теперь выглядят так:
+Следующий выпуск — 0.3. Поскольку `PORTEPOCH` никогда не уменьшается, переменные версий теперь выглядят так:
[.programlisting]
....
PORTNAME= gtkmumble
-PORTVERSION= 0.3
+DISTVERSION= 0.3
PORTEPOCH= 1
....
@@ -166,152 +375,196 @@ PORTEPOCH= 1
[NOTE]
====
-Если значение `PORTEPOCH` этим обновлением было бы сброшено в `0`, то кто-нибудь, имеющий установленный пакет `gtkmumble-0.10_1`, не смог бы опознать пакет `gtkmumble-0.3` как более новый, так как `3` было бы меньше, чем `10`. Помните, что в первую очередь это касается `PORTEPOCH`.
+Если бы `PORTEPOCH` был сброшен в `0` при этом обновлении, пользователь, установивший пакет `gtkmumble-0.10_1`, не увидел бы пакет `gtkmumble-0.3` как более новый, поскольку `3` всё ещё численно меньше, чем `10`. Помните, в этом и заключается вся суть `PORTEPOCH` изначально.
====
-=== Переменные `PKGNAMEPREFIX` и `PKGNAMESUFFIX`
+[[porting-pkgnameprefix-suffix]]
+=== `PKGNAMEPREFIX` и `PKGNAMESUFFIX`
-Две необязательные переменные, `PKGNAMEPREFIX` и `PKGNAMESUFFIX`, объединяются со значениями `PORTNAME` и `PORTVERSION` для формирования `PKGNAME` в форме `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`. Добейтесь того, чтобы это соответствовало нашим <<porting-pkgname,рекомендациям по правильному выбору названий для пакетов>>. В частности, в переменной `PORTVERSION` _не разрешается_ использование дефиса (`-`). Кроме того, если в имени пакета присутствует часть _language-_ или _-compiled.specifics_ (смотрите ниже), то используйте переменные `PKGNAMEPREFIX` и `PKGNAMESUFFIX`, соответственно. Не делайте их частью значения переменной `PORTNAME`.
+Две необязательные переменные, `PKGNAMEPREFIX` и `PKGNAMESUFFIX`, объединяются с `PORTNAME` и `PORTVERSION` для формирования `PKGNAME` в виде `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`. Убедитесь, что это соответствует нашим crossref:makefiles[porting-pkgname,рекомендациям по именованию пакетов]. В частности, использование дефиса (`-`) в `PORTVERSION` _не_ допускается. Кроме того, если имя пакета содержит часть _language-_ или _-compiled.specifics_ (см. ниже), используйте `PKGNAMEPREFIX` и `PKGNAMESUFFIX` соответственно. Не включайте их в `PORTNAME`.
[[porting-pkgname]]
-=== Соглашения по именованию пакетов
+=== Соглашения о наименовании пакетов
-Далее описаны некоторые соглашения, которым вы должны следовать в именовании ваших пакетов. Они были разработаны для облегчения просмотра каталога, так как имеется уже тысячи пакетов, а пользователи отвернутся от нас, если список не понравится их взору!
+Вот соглашения, которым следует придерживаться при наименовании пакетов. Это сделано для того, чтобы каталог пакетов было легко просматривать, поскольку там уже тысячи пакетов, и пользователи могут отказаться от их использования, если это будет напрягать их глаза!
-Имя пакета должно иметь вид [.filename]#language_region-name-compiled.specifics-version.numbers#.
+Имена пакетов имеют формат [.filename]#language_region-name-compiled.specifics-version.numbers#.
-Имя пакета определяется как `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`. Вы должны задавать значения переменных в соответствии с этим форматом.
+Имя пакета определяется как `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`. Убедитесь, что переменные заданы в соответствии с этим форматом.
+
+[[porting-pkgname-language]]
+[.filename]#language_region-#::
+FreeBSD стремится поддерживать родной язык своих пользователей. Часть _language-_ представляет собой двухбуквенное сокращение естественного языка, определённое стандартом ISO-639, когда порт относится к определённому языку. Примерами являются `ja` для японского, `ru` для русского, `vi` для вьетнамского, `zh` для китайского, `ko` для корейского и `de` для немецкого.
++
+Если порт относится к определённому региону в языковой зоне, добавьте также двухбуквенный код страны. Например, `en_US` для американского английского и `fr_CH` для швейцарского французского.
++
+Часть _language-_ задается в `PKGNAMEPREFIX`.
-. FreeBSD пытается поддерживать языки, на которых разговаривают её пользователи. Часть _language-_ должна быть двухсимвольным сокращением от названия языка по стандарту ISO-639, если порт специфичен для конкретного языка. Примерами являются `ja` для японского, `ru` для русского, `vi` для вьетнамского, `zh` для китайского, `ko` для корейского и `de` для немецкого языков.
-+
-Если ваш порт специфичен для конкретного региона внутри области использования языка, добавьте также двухсимвольный код страны. Примерами являются `en_US` для US English и `fr_CH` для Swiss French.
-+
-Часть _language-_ должна задаваться в переменной `PKGNAMEPREFIX`.
-. Первая буква части [.filename]#name# должна быть в нижнем регистре. (Оставшаяся часть названия может содержать буквы в верхнем регистре, так что принимайте решение сами, когда преобразуете имя программного пакета, содержащего в имени некоторое количество заглавных букв.) Существует традиция именовать модули для `Perl 5`, добавляя впереди `p5-` и преобразуя пару двоеточий в дефис; например, модуль `Data::Dumper` будет именоваться `p5-Data-Dumper`.
-. Убедитесь, что имя порта и версия четко отделены и размещаются в переменных `PORTNAME` и `PORTVERSION`. Единственная причина, по которой `PORTNAME` содержит версионную часть, это если полученный дистрибутив сам назван таким образом, как это сделано для портов [.filename]#textproc/libxml2# или [.filename]#japanese/kinput2-freewnn#. В противном случае `PORTNAME` не должен содержать никакой информации, указывающей на версию. То, что некоторые порты имеют одинаковый `PORTNAME`, является вполне нормальным, как для портов [.filename]#www/apache*#; в этом случае различные версии (и различные записи в индексе) отличаются по значениям `PKGNAMEPREFIX` и `PKGNAMESUFFIX`.
-. Если порт может быть построен с различными <<makefile-masterdir,статически заданными значениями по умолчанию>> (обычно это часть имени каталога в семействе портов), то часть _-compiled.specifics_ должна определять вкомпилированные значения по умолчанию (дефис не обязателен). Примерами являются размеры бумаги и шрифтов.
-+
-Часть _-compiled.specifics_ должна задаваться в переменной `PKGNAMESUFFIX`.
-. Строка с номером версии должна следовать за дефисом (`-`) и являться списком разделенных двоеточием чисел и букв в нижнем регистре. В частности, не разрешается иметь еще один дефис внутри строки с обозначением номера версии. Единственным исключением является строчка `pl` (означающая "patchlevel"), которая может использоваться _только_ тогда, когда у программного обеспечения нет старшего и младшего номера версии. Если в номер версии программного обеспечения включена строчка типа "alpha", "beta", "rc" или "pre", возьмите из неё первую букву и поставьте её непосредственно после точки. Если после таких строк номер версии ещё продолжается, то после буквы должно следовать число без дополнительной разделяющей точки.
-+
-Смысл такого формата заключается в удобстве сортировки портов по номеру версии. В частности, следите за тем, чтобы компоненты номера версии разделялись точкой, и если там присутствует дата, то используйте формат `0.0.yyyy.mm.dd`, но не `dd.mm.yyyy` или не совместимый с проблемой Y2K `yy.mm.dd`. Добавление к версии префикса `0.0.` является важным, в случае если выпущен релиз с присвоением настоящей версии, которая в числовом представлении, конечно же, будет ниже, чем `yyyy`.
+[[porting-pkgname-name]]
+[.filename]#name#::
+Убедитесь, что название порта и его версия четко разделены и указаны в `PORTNAME` и `DISTVERSION`. Единственная причина, по которой `PORTNAME` может содержать часть версии, — это если вышестоящее распространяемое ПО действительно так названо, как в портах package:textproc/libxml2[] или package:japanese/kinput2-freewnn[]. В противном случае `PORTNAME` не может содержать информацию о версии. Довольно нормально, когда несколько портов имеют одинаковый `PORTNAME`, как это делают порты package:www/apache*[]; в таком случае разные версии (и разные записи в индексе) различаются значениями `PKGNAMEPREFIX` и `PKGNAMESUFFIX`.
++
+Существует традиция называть модули `Perl 5`, добавляя префикс `p5-` и заменя разделитель в виде двойного двоеточия на дефис. Например, модуль `Data::Dumper` становится `p5-Data-Dumper`.
+[[porting-pkgname-compiled-specifics]]
+[.filename]#-compiled.specifics#::
+Если порт может быть собран с различными crossref:makefiles[makefile-masterdir,жестко заданными значениями по умолчанию] (обычно это часть имени каталога в семействе портов), часть _-compiled.specifics_ указывает скомпилированные значения по умолчанию. Дефис является необязательным. Примерами могут служить размер бумаги и единицы измерения шрифтов.
++
+Часть _-compiled.specifics_ задаётся в `PKGNAMESUFFIX`.
-Вот несколько (реальных) примеров того, как преобразовать имя из оригинального, придуманного авторами, к подходящему для имени пакета:
+[[porting-pkgname-version-numbers]]
+[.filename]#-version.numbers#::
+Строка версии следует после тире (`-`) и представляет собой разделённый точками список целых чисел и строчных букв латинского алфавита. В частности, не допускается использование дополнительных тире внутри строки версии. Единственное исключение — строка `pl` (означающая "уровень исправления"), которую можно использовать _только_ в случае отсутствия у программного обеспечения номеров основной и дополнительной версий. Если в версии программного обеспечения встречаются строки типа "alpha", "beta", "rc" или "pre", следует взять первую букву и поместить её сразу после точки. Если после таких названий строка версии продолжается, числа следуют за буквой без дополнительной точки между ними (например, `1.0b2`).
++
+Идея заключается в упрощении сортировки портов за счёт анализа строки версии. В частности, необходимо убедиться, что компоненты номера версии всегда разделены точкой, а если дата является частью строки, использовать формат `d__yyyy.mm.dd__`, а не `_dd.mm.yyyy_` или не соответствующий стандарту Y2K формат `_yy.mm.dd_`. Важно добавлять перед версией букву, в данном случае `d` (от слова "дата"), на случай, если будет выпущена версия с фактическим номером, который численно окажется меньше `_yyyy_`.
-[.informaltable]
-[cols="1,1,1,1,1,1", frame="none", options="header"]
+[IMPORTANT]
+====
+Название пакета должно быть уникальным среди всех портов в дереве. Убедитесь, что порт с таким же `PORTNAME` ещё не существует, и если он есть, добавьте один из crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMEPREFIX` или `PKGNAMESUFFIX`].
+====
+
+Вот несколько (реальных) примеров преобразования названия, указанного авторами программного обеспечения, в подходящее имя пакета. В каждой строке указана только одна из переменных `DISTVERSION` или `PORTVERSION`, в зависимости от того, какая используется в [.filename]#Makefile# порта:
+
+.Примеры наименования пакетов
+[cols="1,1,1,1,1,1,1", frame="none", options="header"]
|===
| Имя дистрибутива
| PKGNAMEPREFIX
| PORTNAME
| PKGNAMESUFFIX
-| PORTVERSION
-| Обоснование
+| DISTVERSION
+| .PORTVERSION
+| Причина или комментарий
|mule-2.2.2
|(пусто)
|mule
|(пусто)
|2.2.2
-|Изменений не потребовалось
+|
+|Никаких изменений не требуется
+
+|mule-1.0.1
+|(пусто)
+|mule
+|1
+|1.0.1
+|
+|Это версия 1 mule, а версия 2 уже существует
|EmiClock-1.0.2
|(пусто)
|emiclock
|(пусто)
|1.0.2
-|Для отдельных программ имена с заглавными буквами запрещены
+|
+|Нет имен в верхнем регистре для отдельных программ
|rdist-1.3alpha
|(пусто)
|rdist
|(пусто)
-|1.3.a
-|Строчки типа `alpha` запрещены
+|1.3alpha
+|
+|Версия будет `1.3.a`
|es-0.9-beta1
|(пусто)
|es
|(пусто)
-|0.9.b1
-|Строчки типа `beta` запрещены
+|0.9-beta1
+|
+|Версия будет `0.9.b1`
|mailman-2.0rc3
|(пусто)
|mailman
|(пусто)
-|2.0.r3
-|Строчки типа `rc` запрещены
+|2.0rc3
+|
+|Версия будет `2.0.r3`
|v3.3beta021.src
|(пусто)
|tiff
|(пусто)
+|
|3.3
-|Что это такое было вообще?
+|Что это вообще было?
|tvtwm
|(пусто)
|tvtwm
|(пусто)
-|pl11
-|Всегда требуется указание номера версии
+|
+|p11
+|Нет версии в имени файла, используйте то, что указано в исходном коде
|piewm
|(пусто)
|piewm
|(пусто)
|1.0
-|Всегда требуется указание номера версии
+|
+|Нет версии в имени файла, используйте то, что указано в исходном коде
|xvgr-2.10pl1
|(пусто)
|xvgr
|(пусто)
-|2.10.1
-|`pl` разрешено только при отсутствии старшего/младшего номера версии
+|
+|2.10.pl1
+|В таком случае, `pl1` означает уровень патча, поэтому использование DISTVERSION невозможно.
|gawk-2.15.6
|ja-
|gawk
|(пусто)
|2.15.6
-|Версия на японском языке
+|
+|Японская языковая версия
|psutils-1.13
|(пусто)
|psutils
|-letter
|1.13
-|Размер бумаги задается статически во время построения пакета
+|
+|Размер бумаги жестко задан во время сборки пакета
|pkfonts
|(пусто)
|pkfonts
|300
|1.0
-|пакет для шрифтов 300dpi
+|
+|Пакет для шрифтов с разрешением 300dpi
|===
-Если в исходном коде абсолютно нет информации о номере версии и не похоже, что автор собирается выпускать другую версию, то в качестве номера версии задайте просто `1.0` (как в примере с `piewm` выше). В противном случае спросите автора программы или используйте дату (`0.0.yyyy.mm.dd`) в качестве номера версии.
+Если в исходном источнике полностью отсутствует информация о версии и маловероятно, что автор когда-либо выпустит новую версию, просто укажите строку версии как `1.0` (как в примере с `piewm` выше). В противном случае, спросите автора или используйте дату выпуска исходного файла в формате `d__yyyy.mm.dd__` или `d__yyyymmdd__` в качестве версии.
+
+[TIP]
+====
+Используйте любую букву. Здесь `d` означает дату, если источник — это репозиторий Git, часто используется `g` с последующей датой коммита, также распространено использование `s` для снимка.
+====
[[makefile-categories]]
-== Разделение по категориям
+== Категоризация
+[[makefile-categories-definition]]
=== `CATEGORIES`
-В процессе создания пакета он помещается в каталог [.filename]#/usr/ports/packages/All#, а в одном или более подкаталогов из [.filename]#/usr/ports/packages# создаются на него ссылки. Имена этих подкаталогов определяются переменной `CATEGORIES`. Такая схема нужна для облегчения жизни пользователя, когда он сталкивается с массой пакетов на FTP-сервере или компакт-диске. Пожалуйста, посмотрите на <<porting-categories,текущий список категорий>> и выберите те из них, которые более всего подходят к вашему порту.
+При создании пакета он помещается в [.filename]#/usr/ports/packages/All#, и ссылки на него создаются в одной или нескольких поддиректориях [.filename]#/usr/ports/packages#. Имена этих поддиректорий задаются переменной `CATEGORIES`. Это предназначено для облегчения поиска пакетов пользователем при просмотре большого количества пакетов на FTP-сайте или CDROM. Пожалуйста, ознакомьтесь с crossref:makefiles[porting-categories,текущим списком категорий] и выберите подходящие для данного порта.
-Этот список также определяет, куда в дереве портов будет помещен порт. Если вы укажете здесь более одной категории, то предполагается, что файлы порта будут помещены в подкаталог с именем первой категории. Посмотрите <<choosing-categories,ниже>> для получения подробной информации о том, как правильно выбрать категории.
+Этот список также определяет, где в дереве портов будет размещён порт. Если здесь указано несколько категорий, файлы порта должны быть помещены в подкаталог с названием первой категории. Дополнительные сведения о выборе подходящих категорий см. в crossref:makefiles[choosing-categories,ниже].
[[porting-categories]]
=== Текущий список категорий
-Вот текущий список категорий. Те, которые отмечены звёздочкой (`*`), являются _виртуальными_ категориями-они не имеют собственного подкаталога в дереве портов. Они используются только в качестве вторичных категорий, и только для поиска.
+Вот текущий список категорий портов. Категории, помеченные звёздочкой (`*`), являются _виртуальными_ — они не имеют соответствующего подкаталога в дереве портов. Они используются только как вторичные категории и исключительно для целей поиска.
[NOTE]
====
-Для невиртуальных категорий имеется однострочное описание в `COMMENT` в [.filename]#Makefile# соответствующего подкаталога.
+Для невиртуальных категорий в `COMMENT` в [.filename]#Makefile# соответствующего подкаталога содержится однострочное описание.
====
[.informaltable]
@@ -319,462 +572,596 @@ PORTEPOCH= 1
|===
| Категория
| Описание
-| Примечания
+| Заметки
|[.filename]#accessibility#
|Порты для помощи пользователям с ограниченными возможностями.
-|
+|
-|[.filename]#afterstep*#
-|Порты, поддерживающие менеджер окон http://www.afterstep.org[AfterStep].
-|
+|[.filename]#afterstep#`*`
+|Порты для поддержки оконного менеджера http://www.afterstep.org/[AfterStep].
+|
|[.filename]#arabic#
|Поддержка арабского языка.
-|
+|
|[.filename]#archivers#
-|Инструменты для работы с архивами.
-|
+|Инструменты для архивирования.
+|
|[.filename]#astro#
-|Приложения, связанные с астрономией.
-|
+|Астрономические порты.
+|
|[.filename]#audio#
-|Поддержка работы со звуком.
-|
+|Поддержка звука.
+|
|[.filename]#benchmarks#
-|Утилиты для измерения производительности системы.
-|
+|Утилиты для тестирования производительности.
+|
|[.filename]#biology#
|Программное обеспечение, связанное с биологией.
-|
+|
|[.filename]#cad#
-|Инструменты Систем Автоматизированного Проектирования.
-|
+|Компьютерные средства автоматизированного проектирования.
+|
|[.filename]#chinese#
|Поддержка китайского языка.
-|
+|
|[.filename]#comms#
-|Коммуникационное программное обеспечение.
-|В основном программы для работы с последовательным портом.
+|Программное обеспечение для связи.
+|В основном программное обеспечение для работы с последовательным портом.
|[.filename]#converters#
-|Утилиты для преобразования символьных форматов.
-|
+|Преобразователи символьных кодировок.
+|
|[.filename]#databases#
|Базы данных.
-|
+|
|[.filename]#deskutils#
-|То, что было на столе до изобретения компьютеров.
-|
+|Вещи, которые раньше находились на рабочем столе до изобретения компьютеров.
+|
|[.filename]#devel#
-|Утилиты для разработки программного обеспечения.
-|Не помещайте сюда библиотеки просто потому, что это библиотеки-если они подпадают под какую-то другую категорию, то их быть здесь не должно.
+|Средства разработки.
+|Не размещайте библиотеки здесь только потому, что они являются библиотеками. Они _не_ должны быть в этой категории, если только они действительно не подходят никуда больше.
|[.filename]#dns#
-|Программное обеспечение для работы DNS.
-|
+|Программное обеспечение, связанное с DNS.
+|
-|[.filename]#docs*#
+|[.filename]#docs#`*`
|Мета-порты для документации FreeBSD.
-|
+|
|[.filename]#editors#
-|Редакторы общего назначения.
-|Специализированные редакторы относят к разделу для соответствующих инструментов (например, редактор математических формул попадает в категорию [.filename]#math#).
+|Общие редакторы.
+|Специализированные редакторы помещаются в раздел соответствующих инструментов. Например, редактор математических формул будет помещён в [.filename]#math#, а [.filename]#editors# будет для него второй категорией.
-|[.filename]#elisp*#
-|Порты для Emacs lisp.
-|
+|[.filename]#education#`*`
+|Программное обеспечение для образования.
+|Это включает приложения, утилиты или игры, разработанные в первую очередь или в значительной степени для помощи пользователю в изучении конкретной темы или обучении в целом. Также сюда входят приложения для создания курсов, приложения для предоставления курсов и приложения для управления классом или школой
+
+|[.filename]#elisp#`*`
+|Порты Emacs-lisp.
+|
|[.filename]#emulators#
|Эмуляторы других операционных систем.
-|Эмуляторы терминалов сюда _не_ относятся-те, которые разработаны для X, должны быть в категории [.filename]#x11#, а текстовые в [.filename]#comms# или [.filename]#misc#, в зависимости от конкретного их предназначения.
+|Терминальные эмуляторы _не_ относятся сюда. Основанные на X идут в [.filename]#x11#, а текстовые — либо в [.filename]#comms#, либо в [.filename]#misc#, в зависимости от конкретной функциональности.
+
+|[.filename]#enlightenment#`*`
+|Порты, связанные с оконным менеджером Enlightenment.
+|
+
+|[.filename]#filesystems#
+|Файловые системы и связанные утилиты.
+|
|[.filename]#finance#
-|Приложения для работы с деньгами, финансами и всем, что с этим связано.
-|
+|Монетарные, финансовые и связанные с ними приложения.
+|
|[.filename]#french#
|Поддержка французского языка.
-|
+|
|[.filename]#ftp#
-|Клиенты и серверы FTP.
-|Если ваш порт понимает как FTP, так и HTTP, поместите его в категорию [.filename]#ftp# и укажите вторичную категорию [.filename]#www#.
+|Клиентские и серверные утилиты FTP.
+|Если порт поддерживает как FTP, так и HTTP, поместите его в [.filename]#ftp# с дополнительной категорией [.filename]#www#.
|[.filename]#games#
|Игры.
-|
+|
-|[.filename]#geography*#
+|[.filename]#география#`*`
|Программное обеспечение, связанное с географией.
-|
+|
|[.filename]#german#
|Поддержка немецкого языка.
-|
+|
-|[.filename]#gnome*#
-|Порты Проекта http://www.gnome.org[GNOME].
-|
+|[.filename]#gnome#`*`
+|Порты из проекта https://www.gnome.org/[GNOME].
+|
-|[.filename]#gnustep*#
-|Программное обеспечение для окружения рабочего стола GNUstep.
-|
+|[.filename]#gnustep#`*`
+|Программное обеспечение, связанное со средой рабочего стола GNUstep.
+|
|[.filename]#graphics#
|Графические утилиты.
-|
+|
-|[.filename]#hamradio*#
-|Программное обеспечение для любительского радио
-|
+|[.filename]#hamradio#`*`
+|Программное обеспечение для радиолюбителей.
+|
-|[.filename]#haskell*#
+|[.filename]#haskell#`*`
|Программное обеспечение, связанное с языком Haskell.
-|
+|
|[.filename]#hebrew#
|Поддержка иврита.
-|
+|
|[.filename]#hungarian#
-|Поддержка венгерского языка.
-|
-
-|[.filename]#ipv6*#
-|Программное обеспечение, связанное с IPv6.
-|
+|Венгерская языковая поддержка.
+|
|[.filename]#irc#
-|Утилиты для Internet Relay Chat.
-|
+|Утилиты Internet Relay Chat.
+|
|[.filename]#japanese#
|Поддержка японского языка.
-|
+|
|[.filename]#java#
|Программное обеспечение, связанное с языком Java(TM).
-|Категория [.filename]#java# ни в коем случае не должна быть единственной для порта. Оставьте для портов, непосредственно имеющих отношение к языку Java, портерам также рекомендуется не использовать [.filename]#java# как основную категорию порта.
+|Категория [.filename]#java# не должна быть единственной для порта. За исключением портов, непосредственно связанных с языком Java, разработчикам также рекомендуется не использовать [.filename]#java# в качестве основной категории для порта.
+
+|[.filename]#kde#`*`
+|Порты проекта https://www.kde.org/[KDE] (общие).
+|
+
+|[.filename]#kde-приложения#`*`
+|Приложения от проекта https://www.kde.org/[KDE].
+|
+
+|[.filename]#kde-frameworks#`*`
+|Дополнительные библиотеки от проекта https://www.kde.org/[KDE] для программирования с использованием Qt.
+|
-|[.filename]#kde*#
-|Порты проекта http://www.kde.org[KDE].
-|
+|[.filename]#kde-plasma#`*`
+|Рабочий стол от проекта https://www.kde.org/[KDE].
+|
-|[.filename]#kld*#
+|[.filename]#kld#`*`
|Загружаемые модули ядра.
-|
+|
|[.filename]#korean#
|Поддержка корейского языка.
-|
+|
|[.filename]#lang#
|Языки программирования.
-|
+|
-|[.filename]#linux*#
-|Linux приложения и утилиты.
-|
+|[.filename]#linux#`*`
+|Приложения и вспомогательные утилиты Linux.
+|
-|[.filename]#lisp*#
+|[.filename]#lisp#`*`
|Программное обеспечение, связанное с языком Lisp.
-|
+|
|[.filename]#mail#
-|Программы для работы с почтой.
-|
+|Почтовое программное обеспечение.
+|
+
+|[.filename]#mate#`*`
+|Порты, связанные с окружением рабочего стола MATE, форком GNOME 2.
+|
|[.filename]#math#
-|Программное обеспечение для численных вычислений и другие утилиты, связанные с математикой.
-|
+|Численные расчеты и другие математические утилиты.
+|
-|[.filename]#mbone*#
-|Приложения для MBone.
-|
+|[.filename]#mbone#`*`
+|Приложения MBone.
+|
|[.filename]#misc#
|Различные утилиты
-|В общем, то, что не попадает в другие категории. Если это возможно, попробуйте найти более подходящую, чем `misc`, категорию для вашего порта, так как здесь порты теряются.
+|Вещи, которые не подходят никуда больше. По возможности, попытайтесь найти для порта категорию лучше, чем `misc`, так как порты здесь часто остаются без внимания.
|[.filename]#multimedia#
-|Программное обеспечение для работы с мультимедиа.
-|
+|Мультимедийное программное обеспечение.
+|
|[.filename]#net#
|Различное сетевое программное обеспечение.
-|
+|
|[.filename]#net-im#
-|Программы мгновенного обмена сообщениями.
-|
+|Программное обеспечение для обмена мгновенными сообщениями.
+|
|[.filename]#net-mgmt#
-|Программное обеспечение для сетевого управления.
-|
+|Программное обеспечение для управления сетями.
+|
|[.filename]#net-p2p#
-|Приложения для пиринговых сетей.
-|
+|Одноранговые сетевые приложения.
+|
-|[.filename]#news#
-|Программное обеспечение для работы с конференциями USENET.
-|
+|[.filename]#сеть-vpn#`*`
+|Виртуальные частные сети.
+|
-|[.filename]#palm#
-|Программная поддержка http://www.palm.com/[Palm(TM)].
-|
+|[.filename]#news#
+|Программное обеспечение для USENET-новостей.
+|
-|[.filename]#parallel*#
-|Приложения, связанные с параллельными вычислениями.
-|
+|[.filename]#parallel#`*`
+|Приложения, работающие с параллелизмом в вычислениях.
+|
-|[.filename]#pear*#
-|Порты, относящиеся к технологии Pear PHP.
-|
+|[.filename]#pear#`*`
+|Порты, связанные с PHP-фреймворком Pear.
+|
-|[.filename]#perl5*#
-|Порты, которым для работы требуется Perl версии 5.
-|
+|[.filename]#perl5#`*`
+|Порты, требующие Perl версии 5 для работы.
+|
-|[.filename]#plan9*#
-|Различные программы из http://www.cs.bell-labs.com/plan9dist/[Plan9].
-|
+|[.filename]#plan9#`*`
+|Различные программы с https://9p.io/wiki/plan9/Download/index.html[Plan9].
+|
|[.filename]#polish#
|Поддержка польского языка.
-|
+|
|[.filename]#ports-mgmt#
|Порты для управления, установки и разработки портов и пакетов FreeBSD.
-|
+|
|[.filename]#portuguese#
|Поддержка португальского языка.
-|
+|
|[.filename]#print#
|Программное обеспечение для печати.
-|Инструменты для вёрстки (просмотрщики и тому подобное) тоже относятся сюда.
+|Инструменты для настольных издательских систем (превьюеры и т. д.) также относятся сюда.
-|[.filename]#python*#
-|Программное обеспечение, связанное с языком http://www.python.org/[Python].
-|
+|[.filename]#python#`*`
+|Программное обеспечение, связанное с языком https://www.python.org/[Python].
+|
-|[.filename]#ruby*#
-|Программное обеспечение, связанное с языком http://www.ruby-lang.org/[Ruby].
-|
+|[.filename]#ruby#`*`
+|Программное обеспечение, связанное с языком https://www.ruby-lang.org/[Ruby].
+|
-|[.filename]#rubygems*#
-|Порты для пакетов http://www.rubygems.org/[RubyGems].
-|
+|[.filename]#rubygems#`*`
+|Порты пакетов https://www.rubygems.org/[RubyGems].
+|
|[.filename]#russian#
|Поддержка русского языка.
-|
+|
-|[.filename]#scheme*#
+|[.filename]#scheme#`*`
|Программное обеспечение, связанное с языком Scheme.
-|
+|
|[.filename]#science#
-|Научные программы, которые не подпадают под другие категории, скажем, [.filename]#astro#, [.filename]#biology# или [.filename]#math#.
-|
+|Научные порты, которые не входят в другие категории, такие как [.filename]#astro#, [.filename]#biology# и [.filename]#math#.
+|
|[.filename]#security#
-|Программы, обеспечивающие безопасность системы.
-|
+|Средства обеспечения безопасности.
+|
|[.filename]#shells#
-|Различные командные процессоры.
-|
+|Командные оболочки.
+|
+
+|[.filename]#spanish#`*`
+|Поддержка испанского языка.
+|
|[.filename]#sysutils#
|Системные утилиты.
-|
+|
-|[.filename]#spanish*#
-|Поддержка испанского языка.
-|
-
-|[.filename]#tcl*#
-|Порты, для работы которых нужен Tcl.
-|
+|[.filename]#tcl#`*`
+|Порты, использующие Tcl для запуска.
+|
|[.filename]#textproc#
-|Утилиты для обработки текстов.
-|Инструменты для вёрстки помещаются в категорию [.filename]#print#, а не сюда.
+|Средства обработки текста.
+|Он не включает инструменты для настольных издательских систем, которые помещаются в [.filename]#print#.
-|[.filename]#tk*#
-|Порты, для работы которых нужен Tk.
-|
+|[.filename]#tk#`*`
+|Порты, использующие Tk для работы.
+|
|[.filename]#ukrainian#
|Поддержка украинского языка.
-|
+|
|[.filename]#vietnamese#
|Поддержка вьетнамского языка.
-|
+|
+
+|[.filename]#wayland#`*`
+|Порты для поддержки сервера дисплея Wayland.
+|
-|[.filename]#windowmaker*#
-|Порты для поддержки менеджера окон WindowMaker.
-|
+|[.filename]#windowmaker#`*`
+|Порты для поддержки оконного менеджера Window Maker.
+|
|[.filename]#www#
-|Программное обеспечение, связанное со всемирной паутиной.
-|Поддержка языка HTML относится сюда же.
+|Программное обеспечение, связанное с Всемирной паутиной.
+|Поддержка языка HTML также относится сюда.
|[.filename]#x11#
-|X Window System и иже с ними.
-|Эта категория предназначена только для программного обеспечения, которое поддерживает саму оконную систему. Не помещайте сюда обычные приложения для X: большинство из них должны быть перенесены в другие категории [.filename]#x11-*# (смотрите ниже).
+|Система X Window и связанные компоненты.
+|Эта категория предназначена только для программного обеспечения, которое напрямую поддерживает оконную систему. Не помещайте сюда обычные X-приложения. Большинство из них относятся к другим категориям [.filename]#x11-*# (см. ниже).
|[.filename]#x11-clocks#
-|Часы для X11.
-|
+|Часы X11.
+|
|[.filename]#x11-drivers#
|Драйверы X11.
-|
+|
|[.filename]#x11-fm#
-|Менеджеры файлов для X11.
-|
+|Менеджеры файлов X11.
+|
|[.filename]#x11-fonts#
-|Шрифты для X11 и утилиты для работы с ними.
-|
+|Шрифты и утилиты для работы со шрифтами в X11.
+|
|[.filename]#x11-servers#
-|Серверы для X11.
-|
+|Серверы X11.
+|
|[.filename]#x11-themes#
-|Темы для X11.
-|
+|Темы X11.
+|
|[.filename]#x11-toolkits#
-|Пакеты разработчика для X11.
-|
+|Инструментарии X11.
+|
|[.filename]#x11-wm#
-|Оконные менеджеры для X11.
-|
+|Оконные менеджеры X11.
+|
-|[.filename]#xfce*#
-|Порты, связанные с окружением рабочего стола http://www.xfce.org/[Xfce].
-|
+|[.filename]#xfce#`*`
+|Порты, связанные с окружением рабочего стола https://www.xfce.org/[Xfce].
+|
-|[.filename]#zope*#
-|Поддержка http://www.zope.org/[Zope].
-|
+|[.filename]#zope#`*`
+|https://www.zope.org/[Zope] поддержка.
+|
|===
[[choosing-categories]]
-=== Выбор правильной категории
+=== Выбор подходящей категории
-Так как многие категории перекрываются, вам часто необходимо будет выбирать, какая их них должна быть основной для вашего порта. Есть несколько правил, по которым можно решить этот вопрос. Вот список приоритетов, в уменьшающейся степени предпочтения:
+Поскольку многие категории пересекаются, выбор основной категории для порта может быть утомительным. Существует несколько правил, регулирующих этот вопрос. Вот список приоритетов в порядке убывания важности:
-* Первая категория должна быть физической категорий (смотрите <<porting-categories,выше>>). Это необходимо для создания пакетов. После этого виртуальные и физические категории могут смешиваться.
-* Сначала всегда идут категории, специфичные для языков. Например, если ваш порт устанавливает японские шрифты для X11, то строчка `CATEGORIES` должна иметь вид [.filename]#japanese x11-fonts#.
-* Более конкретные категории идут первыми перед более общими. В частности, редактор HTML должен быть описан как [.filename]#www editors#, а не наоборот. Кроме того, вы не должны указывать категорию [.filename]#net#, если порт относится к одной из категорий [.filename]#irc#, [.filename]#mail#, [.filename]#news#, [.filename]#security# или [.filename]#www#, так как [.filename]#net# включается автоматически.
-* [.filename]#x11# используется как вторичная категория только в случае, если в качестве основной категории указан естественный язык. В частности, вам не нужно указывать [.filename]#x11# в качестве категории для приложений X.
-* Режимы для редактора Emacs должны помещаться в ту же категорию, что и приложение, которое поддерживается этим режимом, а не в [.filename]#editors#. Например, режим Emacs для редактирования исходного кода некоторого языка программирования должен быть помещен в категорию [.filename]#lang#.
-* Порты, устанавливающие загружаемые модули ядра, должны содержать виртуальную категорию [.filename]#kld# в строке `CATEGORIES`. Это одно из действий, выполняемых автоматически с добавлением `kmod` в строке `USES`.
-* [.filename]#misc# не должна указываться вместе с любой другой невиртуальной категорией. Если вы указываете `misc` вместе с чем-то ещё в строке `CATEGORIES`, это значит, что вы можете спокойно удалить `misc` и просто поместить порт в этот другой подкаталог!
-* Если ваш порт решительным образом не подпадает ни под какую категорию, поместите его в [.filename]#misc#.
+* Первая категория должна быть физической (см. crossref:makefiles[porting-categories,выше]). Это необходимо для работы упаковки. Виртуальные категории и физические категории могут чередоваться после этого.
+* Языковые категории всегда указываются первыми. Например, если порт устанавливает японские шрифты для X11, то строка `CATEGORIES` будет выглядеть так: [.filename]#japanese x11-fonts#.
+* Конкретные категории перечислены перед менее специфичными. Например, HTML-редактор указывается как [.filename]#www editors#, а не наоборот. Также не следует указывать [.filename]#net#, если порт принадлежит к любой из категорий [.filename]#irc#, [.filename]#mail#, [.filename]#news#, [.filename]#security# или [.filename]#www#, так как [.filename]#net# подразумевается автоматически.
+* [.filename]#x11# используется как вторичная категория только в случае, когда основной категорией указан естественный язык. В частности, не указывайте [.filename]#x11# в строке категории для X-приложений.
+* Режимы Emacs размещаются в той же категории портов, что и приложение, поддерживаемое данным режимом, а не в [.filename]#editors#. Например, режим Emacs для редактирования исходных файлов какого-либо языка программирования попадает в [.filename]#lang#.
+* Порты, устанавливающие загружаемые модули ядра, также имеют виртуальную категорию [.filename]#kld# в строке `CATEGORIES`. Это одна из вещей, автоматически обрабатываемых при добавлении `USES=kmod`.
+* [.filename]#misc# не встречается вместе с другими невиртуальными категориями. Если `misc` указан вместе с чем-то еще в `CATEGORIES`, это означает, что `misc` можно безопасно удалить, а порт разместить только в другом подкаталоге.
+* Если порт действительно не подходит никуда больше, поместите его в [.filename]#misc#.
-Если вы не уверены в правильности выбора категории, пожалуйста, отметьте это в вашем сообщении man:send-pr[1], чтобы мы могли обсудить это до того, как включить порт в Коллекцию. Если вы являетесь коммиттером, пошлите замечание на адрес {freebsd-ports}, чтобы мы могли обсудить это. Зачастую новые порты помещаются не в ту категорию только для того, чтобы их оттуда сразу же удалили. Это приводит к излишнему и ненужному росту основного хранилища исходных текстов.
+Если категория не определена четко, пожалуйста, укажите это в комментарии при https://bugs.freebsd.org/submit/[отправке порта] в баг-трекере, чтобы мы могли обсудить её перед импортом. Как коммиттер, отправьте сообщение в рассылку {freebsd-ports}, чтобы мы сначала обсудили это. Слишком часто новые порты импортируются в неправильную категорию, после чего их сразу же приходится перемещать.
[[proposing-categories]]
=== Предложение новой категории
-Поскольку со временем Коллекция Портов увеличилась, то в связи с этим были добавлены различные новые категории. Новые категории могут быть или _виртуальными_ категориями-которые не имеют соответствующего подкаталога в дереве портов-или _физическими_ категориями-у которых он есть. Следующий текст содержит обсуждение вопросов, возникающих при создании новой физической категории, чтобы вы могли понимать их, когда предложите новую категорию.
+По мере роста Коллекции портов со временем были введены различные новые категории. Новые категории могут быть _виртуальными_ — те, у которых нет соответствующего подкаталога в дереве портов, или _физическими_ — те, у которых он есть. В этом разделе обсуждаются вопросы, связанные с созданием новой физической категории. Внимательно ознакомьтесь с ним, прежде чем предлагать новую.
-В соответствие с существующей практикой мы избегаем создания новой физической категории, пока достаточно большое число портов логически ей не принадлежит или же порты, которые могли бы ей принадлежать, не являются логически обособленной группой, представляющей для всех ограниченный интерес (в частности, категории, относящиеся к естественным языкам); предпочтительно выполнение обоих условий.
+Наша текущая практика заключается в том, чтобы избегать создания новой физической категории, если только либо большое количество портов логически принадлежит к ней, либо порты, которые к ней относятся, представляют собой логически обособленную группу, представляющую ограниченный общий интерес (например, категории, связанные с разговорными человеческими языками), или, желательно, оба условия одновременно.
-Основной причиной для этого является то, что такое изменение создает extref:{committers-guide}[изрядное количество работы, ports] и для коммиттеров, и для всех тех пользователей, которые отслеживают изменения в Коллекции Портов. В дополнение, предложенная категория создает естественное разногласие. (Пожалуй, потому что не существует четкого соглашения, является ли категория "слишком большой", или должны ли категории предоставлять себя для просмотра (и, таким образом, какое количество категорий было бы идеальным значением), и так далее.)
+Обоснование этого заключается в том, что такое изменение создает extref:{committers-guide}[значительный объем работы, ports] как для коммиттеров, так и для всех пользователей, которые отслеживают изменения в Коллекции портов. Кроме того, предлагаемые изменения категорий, как правило, вызывают споры. (Возможно, это связано с отсутствием четкого консенсуса относительно того, когда категория становится «слишком большой», а также относительно того, должны ли категории способствовать удобству просмотра (и, следовательно, какое количество категорий было бы идеальным), и так далее.)
-Процедура:
+Вот процедура:
[.procedure]
-====
-. Предложите новую категорию на {freebsd-ports}. Вам следует включить для новой категории детальное обоснование, в том числе почему вы считаете, что существующие категории не являются достаточными, и список существующих портов, предложенных для перемещения. (Если есть новые порты, ожидающие в GNATS и попадающие в эту категорию, то укажите их тоже.) Если вы являетесь сопровождающим и/или отправителем, то укажите это соответственно, так как это может помочь вам в вашем деле.
-. Принимайте участие в обсуждении.
-. Если кажется, что для вашей идеи появилась поддержка, отправьте PR, который будет включать обоснование и список существующих портов, которые надо переместить. В идеале этот PR должен также включать патчи для следующего:
+. Предложите новую категорию на {freebsd-ports}. Включите подробное обоснование для новой категории, объясните, почему существующие категории недостаточны, и укажите список существующих портов, предлагаемых к перемещению. (Если в Bugzilla есть ожидающие рассмотрения новые порты, которые подходят под эту категорию, также перечислите их.) Если вы являетесь сопровождающим и/или подающим предложение, укажите это, так как это может помочь в рассмотрении.
+. Участвуйте в обсуждении.
+. Если кажется, что идея находит поддержку, оформите PR, включающий как обоснование, так и список существующих портов, которые необходимо переместить. В идеале, этот PR также должен содержать следующие исправления:
-** [.filename]#Makefile#'ы для новых портов в результате репозиторного копирования
-** [.filename]#Makefile# для категорий старых портов
-** [.filename]#Makefile#'ы для портов, зависящих от старых портов
-** (в дополнение, вы можете включить другие файлы, требующие изменений, согласно процедуре из Руководства Коммиттера.)
+** [.filename]##Makefile## для новых портов после копирования их репозитория
+** [.filename]#Makefile# для новой категории
+** [.filename]#Makefile# для старых категорий портов
+** [.filename]##Makefile## для портов, зависящих от старых портов
+** (для дополнительной оценки включите другие файлы, которые необходимо изменить, в соответствии с процедурой, описанной в Руководстве коммиттера.)
-. Поскольку это затрагивает инфраструктуру портов и охватывает не только выполнение репозиторного копирования, но также, возможно, и выполнение регрессивных тестов на кластере построения, то PR должна назначать себе {portmgr}.
-. Если этот PR одобрен, то коммиттеру нужно продолжить остальную часть процедуры, которая extref:{committers-guide}[изложена в Руководстве Коммиттера, ports].
-====
+. Поскольку это затрагивает инфраструктуру портов и включает перемещение и исправление многих портов, а также, возможно, проведение регрессионных тестов на сборочном кластере, назначьте PR для {portmgr}.
+. Если этот PR будет одобрен, коммиттер должен будет выполнить оставшуюся часть процедуры, extref:{committers-guide}[описанной в Руководстве коммиттера,ports].
-Предложение новой виртуальной категории должно быть схожим с вышеизложенным, но при этом затрагивать намного меньше, поскольку ни один из портов не будет перемещен в действительности. В этом случае единственными патчами, включенными в PR, будут те, что добавляют новую категорию в `CATEGORIES` каждого из затрагиваемых портов.
+Предложение новой виртуальной категории аналогично описанному выше, но гораздо менее трудоёмко, так как фактически не потребуется перемещать порты. В этом случае единственные патчи, которые нужно включить в PR, — это добавление новой категории в `CATEGORIES` затронутых портов.
[[proposing-reorg]]
-=== Предложение реорганизации всех категорий
+=== Предложение о реорганизации всех категорий
-Время от времени кто-нибудь предлагает произвести реорганизацию категорий либо до двухуровневой, либо другого типа на основе ключевых слов. На данный момент из этих предложений ничего не получилось, потому что, хотя они просты в реализации, но предполагаемая переделка всей коллекции портов по меньшей мере приводит в уныние. Пожалуйста, прочтите историю этих предложений в архивах рассылок перед тем, как присылать свои соображения; более того, вы должны быть готовы представить работающий прототип.
+Изредка кто-то предлагает реорганизовать категории, используя либо двухуровневую структуру, либо какую-либо другую структуру ключевых слов. На сегодняшний день ни одно из этих предложений не было реализовано, потому что, хотя их очень легко выдвинуть, усилия, необходимые для переработки всей существующей коллекции портов в рамках любой реорганизации, пугают, мягко говоря. Пожалуйста, ознакомьтесь с историей этих предложений в архивах списка рассылки, прежде чем публиковать эту идею. Более того, будьте готовы к тому, что вас попросят предоставить рабочий прототип.
[[makefile-distfiles]]
-== Дистрибутивные файлы
+== Файлы дистрибутива
-Во второй части [.filename]#Makefile# задаётся, какие файлы и откуда должны быть сгружены для того, чтобы построить порт.
+Вторая часть [.filename]#Makefile# описывает файлы, которые необходимо загрузить для сборки порта, и места, откуда их можно скачать.
-=== `DISTVERSION/DISTNAME`
+[[makefile-distname]]
+=== `DISTNAME`
-В переменной `DISTNAME` указывается имя порта так, как назвали его создатели программного обеспечения. Значение `DISTNAME` по умолчанию совпадает с `${PORTNAME}-${PORTVERSION}`, так что переопределяете её значение только в случае необходимости. `DISTNAME` используется только в двух местах. Во-первых, список дистрибутивных файлов (`DISTFILES`) по умолчанию состоит из `${DISTNAME}${EXTRACT_SUFX}`. И во-вторых, предполагается, что дистрибутивный файл будет распакован в подкаталог с именем `WRKSRC`, значение которого по умолчанию есть не что иное, как [.filename]#work/${DISTNAME}#.
+`DISTNAME` — это имя порта, используемое авторами программного обеспечения. По умолчанию `DISTNAME` имеет значение `${PORTNAME}-${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX}`, а если не задано, `DISTVERSION` по умолчанию принимает значение `${PORTVERSION}`, поэтому переопределяйте `DISTNAME` только при необходимости. `DISTNAME` используется только в двух случаях. Во-первых, список файлов дистрибутива (`DISTFILES`) по умолчанию имеет значение `${DISTNAME}${EXTRACT_SUFX}`. Во-вторых, ожидается, что файл дистрибутива распакуется в подкаталог с именем `WRKSRC`, который по умолчанию равен [.filename]#work/${DISTNAME}#.
-Названия некоторых дистрибутивов, которые не укладываются в `${PORTNAME}-${PORTVERSION}`-схему, могут быть автоматически обработаны посредством установки переменной `DISTVERSION`. `PORTVERSION` и `DISTNAME` будут унаследованы автоматически, но конечно же могут быть переопределены. Следующая таблица демонстрирует некоторые примеры:
+Некоторые названия дистрибутивов от поставщиков, которые не соответствуют схеме `${PORTNAME}-${PORTVERSION}`, могут обрабатываться автоматически путем установки `DISTVERSIONPREFIX`, `DISTVERSION` и `DISTVERSIONSUFFIX`. `PORTVERSION` будет автоматически вычисляться из `DISTVERSION`.
-[.informaltable]
-[cols="1,1", frame="none", options="header"]
-|===
-| DISTVERSION
-| PORTVERSION
+[IMPORTANT]
+====
+Только одна из переменных `PORTVERSION` и `DISTVERSION` может быть установлена одновременно. Если `DISTVERSION` не определяет корректную `PORTVERSION`, не используйте `DISTVERSION`.
+====
-|0.7.1d
-|0.7.1.d
+Если схема версий исходного проекта может быть преобразована в схему, совместимую с портами, установите некоторую переменную в версию исходного проекта, _не используйте_ имя переменной `DISTVERSION`. Установите `PORTVERSION` в вычисленную версию на основе созданной вами переменной и задайте `DISTNAME` соответствующим образом.
-|10Alpha3
-|10.a3
+Если схема версионирования вышестоящего проекта не может быть легко преобразована в значение, совместимое с портами, установите `PORTVERSION` в разумное значение и задайте `DISTNAME` как `PORTNAME` с дословной версией вышестоящего проекта.
-|3Beta7-pre2
-|3.b7.p2
+[[makefile-distname-ex1]]
+.Получение `PORTVERSION` вручную
+[example]
+====
+BIND9 использует схему версионирования, несовместимую с версиями портов (в версиях используется `-`), и её нельзя получить с помощью `DISTVERSION`, так как после выпуска 9.9.9 выходят «уровни исправлений» в формате `9.9.9-P1`. `DISTVERSION` преобразует это в `9.9.9.p1`, что в схеме версионирования портов означает 9.9.9 pre-release 1, то есть версию, предшествующую 9.9.9, а не следующую за ней. Поэтому `PORTVERSION` вручную формируется из переменной `ISCVERSION`, чтобы получить `9.9.9p1`.
-|8:f_17
-|8f.17
-|===
+Порядок, в котором система портов и pkg будут сортировать версии, проверяется с помощью аргумента `-t` из man:pkg-version[8]:
+
+[source, shell]
+....
+% pkg version -t 9.9.9 9.9.9.p1
+> <.>
+% pkg version -t 9.9.9 9.9.9p1
+< <.>
+....
+
+<.> Знак `>` означает, что первый аргумент, переданный в `-t`, больше второго аргумента. `9.9.9` находится после `9.9.9.p1`.
+<.> Знак `<` означает, что первый аргумент, переданный в `-t`, меньше второго аргумента. `9.9.9` находится перед `9.9.9p1`.
+
+В файле [.filename]#Makefile# порта, например package:dns/bind99[], это достигается с помощью:
+
+[.programlisting]
+....
+PORTNAME= bind
+PORTVERSION= ${ISCVERSION:S/-P/P/:S/b/.b/:S/a/.a/:S/rc/.rc/}
+CATEGORIES= dns net
+MASTER_SITES= ISC/bind9/${ISCVERSION}
+PKGNAMESUFFIX= 99
+DISTNAME= ${PORTNAME}-${ISCVERSION}
+
+MAINTAINER= mat@FreeBSD.org
+COMMENT= BIND DNS suite with updated DNSSEC and DNS64
+WWW= https://www.isc.org/bind/
+
+LICENSE= ISCL
+
+# ISC releases things like 9.8.0-P1 or 9.8.1rc1, which our versioning does not like
+ISCVERSION= 9.9.9-P6
+....
+
+Определите версию вышестоящего пакета в `ISCVERSION`, с комментарием, объясняющим, _почему_ это необходимо. Используйте `ISCVERSION` для получения совместимого с портами `PORTVERSION`. Используйте `ISCVERSION` напрямую для получения правильного URL для загрузки файла дистрибутива. Используйте `ISCVERSION` напрямую для именования дистрибутивного файла.
+====
+
+[[makefile-distname-ex2]]
+.Получить `DISTNAME` из `PORTVERSION`
+[example]
+====
+Время от времени имя файла дистрибутива имеет мало отношения или вообще никакого отношения к версии программного обеспечения.
+
+В пакете package:comms/kermit[], в файле дистрибутива присутствует только последний элемент версии:
+
+[.programlisting]
+....
+PORTNAME= kermit
+PORTVERSION= 9.0.304
+CATEGORIES= comms ftp net
+MASTER_SITES= ftp://ftp.kermitproject.org/kermit/test/tar/
+DISTNAME= cku${PORTVERSION:E}-dev20
+....
+
+Модификатор `:E` man:make[1] возвращает суффикс переменной, в данном случае `304`. Файл дистрибутива корректно создаётся как `cku304-dev20.tar.gz`.
+====
+
+[[makefile-distname-ex3]]
+.Экзотический случай 1
+[example]
+====
+Иногда нет связи между названием программы, её версией и файлом дистрибутива, в котором она распространяется.
+
+Из пакета package:audio/libworkman[]:
+
+[.programlisting]
+....
+PORTNAME= libworkman
+PORTVERSION= 1.4
+CATEGORIES= audio
+MASTER_SITES= LOCAL/jim
+DISTNAME= ${PORTNAME}-1999-06-20
+....
+
+====
+
+[[makefile-distname-ex4]]
+.Экзотический случай 2
+[example]
+====
+В пакете package:comms/librs232[] файл дистрибутива не имеет версии, поэтому необходимо использовать crossref:makefiles[makefile-dist_subdir,`DIST_SUBDIR`]:
+
+[.programlisting]
+....
+PORTNAME= librs232
+PORTVERSION= 20160710
+CATEGORIES= comms
+MASTER_SITES= http://www.teuniz.net/RS-232/
+DISTNAME= RS-232
+DIST_SUBDIR= ${PORTNAME}-${PORTVERSION}
+....
+
+====
[NOTE]
====
-Значения переменных `PKGNAMEPREFIX` и `PKGNAMESUFFIX` не влияют на значение `DISTNAME`. Заметьте также, что если значение `WRKSRC` равно [.filename]#work/${PORTNAME}-${PORTVERSION}#, и в случае, когда оригинальный архив называется по имени, отличном от `${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}`, скорее всего, вы должны оставить `DISTNAME` как есть- лучше переопределить `DISTFILES`, чем задавать значения как `DISTNAME`, так и `WRKSRC` (и, возможно, ещё и `EXTRACT_SUFX`).
+`PKGNAMEPREFIX` и `PKGNAMESUFFIX` не влияют на `DISTNAME`. Также обратите внимание, что если `WRKSRC` равно [.filename]#${WRKDIR}/${DISTNAME}#, а исходный архив с исходным кодом называется иначе, чем `${PORTNAME}-${PORTVERSION}${EXTRACT_SUFX}`, оставьте `DISTNAME` без изменений — определение только `DISTFILES` проще, чем определение и `DISTNAME`, и `WRKSRC` (а возможно, и `EXTRACT_SUFX`).
====
+[[makefile-master_sites]]
=== `MASTER_SITES`
-Содержит часть с каталогом FTP/HTTP-URL, которая указывает на оригинальный архив на сервере `MASTER_SITES`. Не забудьте лидирующий слэш ([.filename]#/#)!
+Запишите именем каталога из FTP/HTTP-URL, указывающего на исходный tarball, в `MASTER_SITES`. Не забудьте завершающий слэш ([.filename]#/#)!
+
+Макросы `make` будут пытаться использовать эту спецификацию для загрузки файла дистрибутива с помощью `FETCH`, если не смогут найти его уже в системе.
+
+Рекомендуется включать в этот список несколько сайтов, желательно с разных континентов. Это обеспечит защиту от проблем в глобальной сети.
+
+[IMPORTANT]
+====
+`MASTER_SITES` не должен быть пустым. Он должен указывать на реальный сайт, где размещены файлы дистрибутива. Он не может указывать на веб-архивы или кэшированные сайты с файлами дистрибутива FreeBSD. Единственное исключение из этого правила — порты, у которых нет файлов дистрибутива. Например, мета-порты не имеют файлов дистрибутива, поэтому `MASTER_SITES` не нужно задавать.
+====
+
+[[makefile-master_sites-shorthand]]
+==== Использование переменных `MASTER_SITE_*`
-Макрос команды `make` будет пытаться воспользоваться этой переменной для получения дистрибутивного файла с помощью программы `FETCH`, если он не будет найден в системе.
+Для популярных архивов, таких как SourceForge (`SOURCEFORGE`), GNU (`GNU`) или Perl CPAN (`PERL_CPAN`), доступны сокращённые обозначения. `MASTER_SITES` может использовать их напрямую:
-Рекомендуется помещать в список много сайтов, предпочтительно с разных континентов. Это поможет при наличии проблем с мировой сетью. Мы даже планируем добавить поддержку автоматического определения ближайшего сайта и сгрузки файлов оттуда; наличие нескольких сайтов будет способствовать этому начинанию.
+[.programlisting]
+....
+MASTER_SITES= GNU/make
+....
-Если оригинальный архив находится на одном из таких популярных серверов, как SourceForge, GNU или Perl CPAN, то указывайте эти сайты в простой форме при помощи `MASTER_SITE_*` (к примеру, `MASTER_SITE_SOURCEFORGE`, `MASTER_SITE_GNU` или `MASTER_SITE_PERL_CPAN`. Просто укажите в переменной `MASTER_SITES` одно из этих значений, а в переменной `MASTER_SITE_SUBDIR` задайте путь к архиву. Вот пример:
+Старый расширенный формат по-прежнему работает, но все порты были преобразованы в компактный формат. Расширенный формат выглядит следующим образом:
[.programlisting]
....
@@ -782,30 +1169,78 @@ MASTER_SITES= ${MASTER_SITE_GNU}
MASTER_SITE_SUBDIR= make
....
-Или можно использовать сокращенный формат:
+Эти значения и переменные определены в https://cgit.freebsd.org/ports/tree/Mk/bsd.sites.mk[Mk/bsd.sites.mk]. Новые записи добавляются часто, поэтому обязательно проверяйте последнюю версию этого файла перед отправкой порта.
+
+[TIP]
+====
+Для любой переменной `MASTER_SITE_FOO` можно использовать сокращение `_FOO_`. Например, используйте:
[.programlisting]
....
-MASTER_SITES= GNU/make
+MASTER_SITES= FOO
+....
+
+Если требуется `MASTER_SITE_SUBDIR`, используйте следующее:
+
+[.programlisting]
....
+MASTER_SITES= FOO/bar
+....
+
+====
+
+[NOTE]
+====
+Некоторые имена `MASTER_SITE_*` довольно длинные, и для удобства использования были определены сокращения:
+
+[[makefile-master_sites-shortcut]]
+.Сокращения для макросов `MASTER_SITE_*`
+[cols="1,1", frame="none", options="header"]
+|===
+| Макрос
+| Сокращение
-Эти переменные определены в файле [.filename]#/usr/ports/Mk/bsd.sites.mk#. Всё время добавляются новые записи, так что обращайтесь к последней версии этого файла перед тем, как послать нам свой порт.
+|`PERL_CPAN`
+|`CPAN`
+
+|`GITHUB`
+|`GH`
+
+|`GITHUB_CLOUD`
+|`GHC`
+
+|`LIBREOFFICE_DEV`
+|`LODEV`
+
+|`NETLIB`
+|`NL`
+
+|`RUBYGEMS`
+|`RG`
+
+|`SOURCEFORGE`
+|`SF`
+|===
+====
-Для популярных сайтов существует несколько _магических_ макросов с заранее известной структурой каталогов. Используйте для них сокращения, и система попытается угадать для вас правильный подкаталог.
+[[makefile-master_sites-magic]]
+==== Волшебные макросы MASTER_SITES
+
+Существует несколько "волшебных" макросов для популярных сайтов с предсказуемой структурой каталогов. Для них достаточно использовать сокращение, и система автоматически выберет подкаталог. Например, для порта с именем `Stardict`, версии `1.2.3`, размещенного на SourceForge, добавьте следующую строку:
[.programlisting]
....
MASTER_SITES= SF
....
-Если попытка угадать не удалась, то это может быть переписано следующим образом.
+подразумевает подкаталог с именем `/project/stardict/stardict/1.2.3`. Если подразумеваемый каталог указан неверно, его можно переопределить:
[.programlisting]
....
MASTER_SITES= SF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}
....
-Что также можно записать в таком виде:
+Это также можно записать как
[.programlisting]
....
@@ -813,87 +1248,697 @@ MASTER_SITES= SF
MASTER_SITE_SUBDIR= stardict/WyabdcRealPeopleTTS/${PORTVERSION}
....
-.Популярные магические макросы для `MASTER_SITES`
+[[makefile-master_sites-popular]]
+.Волшебные макросы `MASTER_SITES`
[cols="1,1", frame="none", options="header"]
|===
| Макрос
-| Предполагаемый подкаталог
+| Предполагаемая поддиректория
+
+|`APACHE_COMMONS_BINARIES`
+|`${PORTNAME:S,commons-,,}`
+
+|`APACHE_COMMONS_SOURCE`
+|`${PORTNAME:S,commons-,,}`
|`APACHE_JAKARTA`
-|`/dist/jakarta/${PORTNAME:S,-,,/,}/source`
+|`${PORTNAME:S,-,/,}/source`
|`BERLIOS`
-|`/${PORTNAME:L}`
+|`${PORTNAME:tl}.berlios`
|`CHEESESHOP`
-|`/packages/source/source/${DISTNAME:C/(.).\*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}`
+|`source/${DISTNAME:C/(.).\*/\1/}/${DISTNAME:C/(.*)-[0-9].*/\1/}`
+
+|`CPAN`
+|`${PORTNAME:C/-.*//}`
|`DEBIAN`
-|`/debian/pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}`
+|`pool/main/${PORTNAME:C/^((lib)?.).*$/\1/}/${PORTNAME}`
+
+|`FARSIGHT`
+|`${PORTNAME}`
+
+|`FESTIVAL`
+|`${PORTREVISION}`
|`GCC`
-|`/pub/gcc/releases/${DISTNAME}`
+|`releases/${DISTNAME}`
+
+|`GENTOO`
+|`distfiles`
+
+|`GIMP`
+|`${PORTNAME}/${PORTVERSION:R}/`
+
+|`GH`
+|`${GH_ACCOUNT}/${GH_PROJECT}/tar.gz/${GH_TAGNAME}?dummy=/`
+
+|`GHC`
+|`${GH_ACCOUNT}/${GH_PROJECT}/`
|`GNOME`
-|`/pub/GNOME/sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}`
+|`sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}`
|`GNU`
-|`/gnu/${PORTNAME}`
+|`${PORTNAME}`
+
+|`GNUPG`
+|`${PORTNAME}`
+
+|`GNU_ALPHA`
+|`${PORTNAME}`
+
+|`HORDE`
+|`${PORTNAME}`
+
+|`LODEV`
+|`${PORTNAME}`
+
+|`MATE`
+|`${PORTVERSION:C/^([0-9]+\.[0-9]+).*/\1/}`
|`MOZDEV`
-|`/pub/mozdev/${PORTNAME:L}`
+|`${PORTNAME:tl}`
-|`PERL_CPAN`
-|`/pub/CPAN/modules/by-module/${PORTNAME:C/-.*//}`
+|`NL`
+|`${PORTNAME}`
-|`PYTHON`
-|`/ftp/python/${PYTHON_PORTVERSION:C/rc[0-9]//}`
+|`QT`
+|`archive/qt/${PORTVERSION:R}`
-|`RUBYFORGE`
-|`/${PORTNAME:L}`
+|`SAMBA`
+|`${PORTNAME}`
|`SAVANNAH`
-|`/${PORTNAME:L}`
+|`${PORTNAME:tl}`
|`SF`
-|`/project/${PORTNAME:L}/${PORTNAME:L}/${PORTVERSION}`
+|`${PORTNAME:tl}/${PORTNAME:tl}/${PORTVERSION}`
+|===
+
+[[makefile-master_sites-github]]
+=== `USE_GITHUB`
+
+Если файл дистрибутива получен из определённого коммита или тега на https://github.com/[GitHub], для которого нет официально выпущенного файла, существует простой способ автоматически установить правильные значения `DISTNAME` и `MASTER_SITES`.
+
+[WARNING]
+====
+По состоянию на 2023-02-21 link:https://github.blog/2023-02-21-update-on-the-future-stability-of-source-code-archives-and-hashes/[GitHub] объявили, что загрузки исходного кода будут стабильными в течение года. Пожалуйста, переключитесь на ресурсы выпусков (release assets), а если они недоступны, запросите их создание у вышестоящих разработчиков.
+====
+
+Доступны следующие переменные:
+
+[[makefile-master_sites-github-description]]
+.`USE_GITHUB` Описание
+[cols="1,1,1", options="header"]
+|===
+| Переменная
+| Описание
+| По умолчанию
+
+|`GH_ACCOUNT`
+|Имя учётной записи пользователя GitHub, который размещает проект
+|`${PORTNAME}`
+
+|`GH_PROJECT`
+|Название проекта на GitHub
+|`${PORTNAME}`
+
+|`GH_TAGNAME`
+|Имя тега для загрузки (2.0.1, хэш, ...) Использование имени ветки здесь некорректно. Также можно использовать хэш идентификатора коммита для создания снимка состояния.
+|`${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX}`
+
+|`GH_SUBDIR`
+|Когда программному обеспечению требуется дополнительный файл дистрибутива для извлечения в
+`${WRKSRC}`, можно использовать эту переменную. Примеры можно найти в
+crossref:makefiles[makefile-master_sites-github-multiple, Загрузка нескольких файлов из GitHub] для получения дополнительной информации.
+|(отсутствует)
+
+|`GH_TUPLE`
+|`GH_TUPLE` позволяет объединить `GH_ACCOUNT`, `GH_PROJECT`, `GH_TAGNAME` и `GH_SUBDIR` в одну переменную. Формат следующий: _account_`:`_project_`:`_tagname_`:`_group_`/`_subdir_. Часть `/`_subdir_ является необязательной. Это полезно, когда требуется получить несколько проектов с GitHub.
+|
+|===
+
+[IMPORTANT]
+====
+Не используйте `GH_TUPLE` для файла дистрибутива по умолчанию, так как у него нет значения по умолчанию.
+====
+
+[[makefile-master_sites-github-ex1]]
+.Простое использование `USE_GITHUB`
+[example]
+====
+
+При попытке создать порт для версии `1.2.7` pkg от пользователя FreeBSD на github, по адресу https://github.com/freebsd/pkg/[], файл [.filename]#Makefile# в итоге будет выглядеть следующим образом (незначительно сокращено для примера):
+
+[.programlisting]
+....
+PORTNAME= pkg
+DISTVERSION= 1.2.7
+
+USE_GITHUB= yes
+GH_ACCOUNT= freebsd
+....
+
+Он автоматически получит `MASTER_SITES` установленным в `GH` и `WRKSRC` в `${WRKDIR}/pkg-1.2.7`.
+====
+
+[[makefile-master_sites-github-ex2]]
+.Более полное использование `USE_GITHUB`
+[example]
+====
+При попытке создать порт для самой последней версии pkg от пользователя FreeBSD на github, по адресу https://github.com/freebsd/pkg/[], файл [.filename]#Makefile# в итоге выглядит следующим образом (незначительно сокращено для примера):
+
+[.programlisting]
+....
+PORTNAME= pkg-devel
+DISTVERSION= 1.3.0.a.20140411
+
+USE_GITHUB= yes
+GH_ACCOUNT= freebsd
+GH_PROJECT= pkg
+GH_TAGNAME= 6dbb17b
+....
+
+Он автоматически получит `MASTER_SITES` со значением `GH` и `WRKSRC` со значением `${WRKDIR}/pkg-6dbb17b`.
+
+[TIP]
+****
+`20140411` — это дата коммита, указанного в `GH_TAGNAME`, а не дата редактирования файла [.filename]#Makefile# или дата создания коммита.
+****
+
+====
+
+[[makefile-master_sites-github-ex3]]
+.Использование `USE_GITHUB` с `DISTVERSIONPREFIX`
+[example]
+====
+Время от времени `GH_TAGNAME` немного отличается от `DISTVERSION`. Например, если версия `1.0.2`, то тег будет `v1.0.2`. В таких случаях можно использовать `DISTVERSIONPREFIX` или `DISTVERSIONSUFFIX`:
+
+[.programlisting]
+....
+PORTNAME= foo
+DISTVERSIONPREFIX= v
+DISTVERSION= 1.0.2
+
+USE_GITHUB= yes
+....
+
+Он автоматически установит `GH_TAGNAME` в `v1.0.2`, в то время как `WRKSRC` останется `${WRKDIR}/foo-1.0.2`.
+====
+
+[[makefile-master_sites-github-ex4]]
+.Использование `USE_GITHUB` при отсутствии версий у исходного проекта
+[example]
+====
+Если никогда не было версии вышестоящего репозитория, не изобретайте её, например `0.1` или `1.0`. Создайте порт с `DISTVERSION` в формате `g__YYYYMMDD__`, где `g` означает Git, а `_YYYYMMDD_` представляет дату коммита, указанного в `GH_TAGNAME`.
+
+[.programlisting]
+....
+PORTNAME= bar
+DISTVERSION= g20140411
+
+USE_GITHUB= yes
+GH_TAGNAME= c472d66b
+....
+
+Это создаёт схему версионирования, которая увеличивается со временем и всё ещё находится до версии `0`. Подробности об использовании man:pkg-version[8] для сравнения версий смотрите в crossref:makefiles[makefile-versions-ex-pkg-version, этой секции]:
+
+[source, shell]
+....
+% pkg version -t g20140411 0
+<
+....
+
+Что означает, что использование `PORTEPOCH` не потребуется, если вышестоящий проект решит сократить версии в будущем.
+====
+
+[[makefile-master_sites-github-ex5]]
+.Использование `USE_GITHUB` для доступа к коммиту между двумя версиями
+[example]
+====
+Если текущая версия программного обеспечения использует тег Git, и порт необходимо обновить до более новой промежуточной версии без тега, используйте man:git-describe[1], чтобы определить версию для использования:
+
+[source, shell]
+....
+% git describe --tags f0038b1
+v0.7.3-14-gf0038b1
+....
+
+`v0.7.3-14-gf0038b1` можно разделить на три части:
+
+`v0.7.3`::
+Это последний тег Git, который появляется в истории коммитов перед запрошенным коммитом.
+
+`-14`::
+Это означает, что запрошенный коммит `f0038b1` является 14-м коммитом после тега `v0.7.3`.
+
+`-gf0038b1`::
+`-g` означает "Git", а `f0038b1` — это хеш коммита, на который указывает данная ссылка.
+
+[.programlisting]
+....
+PORTNAME= bar
+DISTVERSIONPREFIX= v
+DISTVERSION= 0.7.3-14
+DISTVERSIONSUFFIX= -gf0038b1
+
+USE_GITHUB= yes
+....
+
+Это создаёт схему версионирования, которая увеличивается со временем (точнее, с коммитами) и не конфликтует с созданием версии `0.7.4`. Подробности об использовании man:pkg-version[8] для сравнения версий смотрите в crossref:makefiles[makefile-versions-ex-pkg-version, этой секции] :
+
+[source, shell]
+....
+% pkg version -t 0.7.3 0.7.3.14
+<
+% pkg version -t 0.7.3.14 0.7.4
+<
+....
+
+[NOTE]
+****
+Если запрошенный коммит совпадает с тегом, по умолчанию отображается более короткое описание. Полная версия эквивалентна:
+
+[source, shell]
+....
+% git describe --tags c66c71d
+v0.7.3
+
+% git describe --tags --long c66c71d
+v0.7.3-0-gc66c71d
+....
+
+****
+
+====
+
+[[makefile-master_sites-github-multiple]]
+==== Извлечение нескольких файлов из GitHub
+
+Фреймворк `USE_GITHUB` также поддерживает загрузку нескольких файлов дистрибутива из разных мест в GitHub. Он работает очень похоже на crossref:makefiles[porting-master-sites-n, Файлы дистрибуции или патчей из нескольких мест].
+
+В `GH_ACCOUNT`, `GH_PROJECT` и `GH_TAGNAME` добавляются несколько значений. Каждому различному значению присваивается группа. Основное значение может не иметь группы или принадлежать группе `:DEFAULT`. Значение может быть опущено, если оно совпадает со значением по умолчанию, указанным в crossref:makefiles[makefile-master_sites-github-description,описании `USE_GITHUB`].
+
+`GH_TUPLE` также можно использовать, когда имеется множество файлов дистрибутива. Это помогает сохранять учётные данные, проект, имя тега и информацию о группе в одном месте.
+
+Для каждой группы создаётся вспомогательная переменная `${WRKSRC_group}`, содержащая каталог, в который был извлечён файл. Переменные `${WRKSRC_group}` могут использоваться для перемещения каталогов во время `post-extract`, добавления в `CONFIGURE_ARGS` или любых других действий, необходимых для корректной сборки программного обеспечения.
+
+[CAUTION]
+====
+Часть `:__group__` _должна_ использоваться _только для одного_ файла дистрибутива. Она служит уникальным ключом, и её повторное использование приведёт к перезаписи предыдущих значений.
+====
+
+[NOTE]
+====
+Поскольку это всего лишь синтаксический сахар над `DISTFILES` и `MASTER_SITES`, имена групп должны соответствовать ограничениям на имена групп, описанным в crossref:makefiles[porting-master-sites-n, Файлы дистрибутивов или патчей из нескольких источников]
+====
+
+При получении нескольких файлов из GitHub иногда файл дистрибутива по умолчанию не загружается из GitHub. Чтобы отключить загрузку файла дистрибутива по умолчанию, установите:
+
+[.programlisting]
+....
+USE_GITHUB= nodefault
+....
+
+[IMPORTANT]
+====
+При использовании `USE_GITHUB=nodefault` в [.filename]#Makefile# необходимо указать `DISTFILES` в его crossref:porting-order[porting-order-portname,верхнем блоке]. Определение должно быть следующим:
+
+[.programlisting]
+....
+DISTFILES= ${DISTNAME}${EXTRACT_SUFX}
+....
+
+====
+
+[[makefile-master_sites-github-multi]]
+.Использование `USE_GITHUB` с несколькими файлами дистрибутива
+[example]
+====
+Время от времени возникает необходимость загрузить более одного файла дистрибутива. Например, когда вышестоящий репозиторий git использует подмодули. Это можно легко сделать с помощью групп в переменных `GH_*`:
+
+[.programlisting]
+....
+PORTNAME= foo
+DISTVERSION= 1.0.2
+
+USE_GITHUB= yes
+GH_ACCOUNT= bar:icons,contrib
+GH_PROJECT= foo-icons:icons foo-contrib:contrib
+GH_TAGNAME= 1.0:icons fa579bc:contrib
+GH_SUBDIR= ext/icons:icons
+
+CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}
+....
+
+Это загрузит три файла дистрибутива с github. Стандартный берется из [.filename]#foo/foo# и имеет версию `1.0.2`. Второй, с группой `icons`, берется из [.filename]#bar/foo-icons# и имеет версию `1.0`. Третий берется из [.filename]#bar/foo-contrib# и использует Git-коммит `fa579bc`. Файлы дистрибутива называются [.filename]#foo-foo-1.0.2_GH0.tar.gz#, [.filename]#bar-foo-icons-1.0_GH0.tar.gz# и [.filename]#bar-foo-contrib-fa579bc_GH0.tar.gz#.
+
+Все файлы дистрибутива извлекаются в `${WRKDIR}` в соответствующих подкаталогах. Основной файл по-прежнему извлекается в `${WRKSRC}`, в данном случае, [.filename]#${WRKDIR}/foo-1.0.2#. Каждый дополнительный файл дистрибутива извлекается в `${WRKSRC_group}`. Здесь, для группы `icons`, он называется `${WRKSRC_icons}` и содержит [.filename]#${WRKDIR}/foo-icons-1.0#. Файл с группой `contrib` называется `${WRKSRC_contrib}` и содержит `${WRKDIR}/foo-contrib-fa579bc`.
+
+Система сборки программы ожидает найти иконки в подкаталоге [.filename]#ext/icons# в её исходниках, поэтому используется `GH_SUBDIR`. `GH_SUBDIR` гарантирует, что [.filename]#ext# существует, но [.filename]#ext/icons# ещё не существует. Затем он выполняет следующее:
+
+[.programlisting]
+....
+post-extract:
+ @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons
+....
+
+====
+
+[[makefile-master_sites-github-multi2]]
+.Использование `USE_GITHUB` с несколькими файлами дистрибутива с помощью `GH_TUPLE`
+[example]
+====
+
+Это функционально эквивалентно crossref:makefiles[makefile-master_sites-github-multi,Использованию `USE_GITHUB` с несколькими файлами дистрибутива], но с использованием `GH_TUPLE`:
+
+[.programlisting]
+....
+PORTNAME= foo
+DISTVERSION= 1.0.2
+
+USE_GITHUB= yes
+GH_TUPLE= bar:foo-icons:1.0:icons/ext/icons \
+ bar:foo-contrib:fa579bc:contrib
+
+CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}
+....
+
+В предыдущем примере использовалась группировка с `bar:icons,contrib`. В `GH_TUPLE` присутствует избыточная информация, так как группировка невозможна.
+====
+
+[[makefile-master_sites-github-submodules]]
+.Как использовать `USE_GITHUB` с подмодулями Git?
+[example]
+====
+Порты, использующие GitHub в качестве вышестоящего репозитория, иногда применяют подмодули. Подробнее см. man:git-submodule[1].
+
+Проблема с подмодулями заключается в том, что каждый из них является отдельным репозиторием. Таким образом, каждый из них должен быть загружен отдельно.
+
+В качестве примера используем пакет package:finance/moneymanagerex[], его репозиторий на GitHub находится по адресу https://github.com/moneymanagerex/moneymanagerex/[]. В корне репозитория есть файл https://github.com/moneymanagerex/moneymanagerex/blob/master/.gitmodules[.gitmodules]. Этот файл описывает все подмодули, используемые в данном репозитории, и перечисляет дополнительные необходимые репозитории. Этот файл покажет, какие дополнительные репозитории требуются:
+
+[.programlisting]
+....
+[submodule "lib/wxsqlite3"]
+ path = lib/wxsqlite3
+ url = https://github.com/utelle/wxsqlite3.git
+[submodule "3rd/mongoose"]
+ path = 3rd/mongoose
+ url = https://github.com/cesanta/mongoose.git
+[submodule "3rd/LuaGlue"]
+ path = 3rd/LuaGlue
+ url = https://github.com/moneymanagerex/LuaGlue.git
+[submodule "3rd/cgitemplate"]
+ path = 3rd/cgitemplate
+ url = https://github.com/moneymanagerex/html-template.git
+[...]
+....
+
+Единственная информация, отсутствующая в этом файле, — это хэш коммита или тег, который следует использовать в качестве версии. Эта информация находится после клонирования репозитория:
+
+[source, shell]
+....
+% git clone --recurse-submodules https://github.com/moneymanagerex/moneymanagerex.git
+Cloning into 'moneymanagerex'...
+remote: Counting objects: 32387, done.
+[...]
+Submodule '3rd/LuaGlue' (https://github.com/moneymanagerex/LuaGlue.git) registered for path '3rd/LuaGlue'
+Submodule '3rd/cgitemplate' (https://github.com/moneymanagerex/html-template.git) registered for path '3rd/cgitemplate'
+Submodule '3rd/mongoose' (https://github.com/cesanta/mongoose.git) registered for path '3rd/mongoose'
+Submodule 'lib/wxsqlite3' (https://github.com/utelle/wxsqlite3.git) registered for path 'lib/wxsqlite3'
+[...]
+Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/LuaGlue'...
+Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/cgitemplate'...
+Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/mongoose'...
+Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/lib/wxsqlite3'...
+[...]
+Submodule path '3rd/LuaGlue': checked out 'c51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b'
+Submodule path '3rd/cgitemplate': checked out 'cd434eeeb35904ebcd3d718ba29c281a649b192c'
+Submodule path '3rd/mongoose': checked out '2140e5992ab9a3a9a34ce9a281abf57f00f95cda'
+Submodule path 'lib/wxsqlite3': checked out 'fb66eb230d8aed21dec273b38c7c054dcb7d6b51'
+[...]
+% cd moneymanagerex
+% git submodule status
+ c51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b 3rd/LuaGlue (heads/master)
+ cd434eeeb35904ebcd3d718ba29c281a649b192c 3rd/cgitemplate (cd434ee)
+ 2140e5992ab9a3a9a34ce9a281abf57f00f95cda 3rd/mongoose (6.2-138-g2140e59)
+ fb66eb230d8aed21dec273b38c7c054dcb7d6b51 lib/wxsqlite3 (v3.4.0)
+[...]
+....
+
+Это также можно найти на GitHub. Каждый подкаталог, который является подмодулем, отображается как `_директория @ хэш_`, например, `mongoose @ 2140e59`.
+
+[NOTE]
+****
+Хотя получение информации из GitHub кажется более простым, данные, полученные с помощью `git submodule status`, будут более информативными. Например, здесь хеш коммита ``lib/wxsqlite3`` `fb66eb2` соответствует `v3.4.0`. Оба варианта можно использовать взаимозаменяемо, но если доступен тег, предпочтительнее использовать его.
+****
+
+Теперь, когда вся необходимая информация собрана, можно написать [.filename]#Makefile# (показаны только строки, связанные с GitHub):
+
+[.programlisting]
+....
+PORTNAME= moneymanagerex
+DISTVERSIONPREFIX= v
+DISTVERSION= 1.3.0
+
+USE_GITHUB= yes
+GH_TUPLE= utelle:wxsqlite3:v3.4.0:wxsqlite3/lib/wxsqlite3 \
+ moneymanagerex:LuaGlue:c51d11a:lua_glue/3rd/LuaGlue \
+ moneymanagerex:html-template:cd434ee:html_template/3rd/cgitemplate \
+ cesanta:mongoose:2140e59:mongoose/3rd/mongoose \
+ [...]
+....
+
+====
+
+[[makefile-master_sites-gitlab]]
+=== `USE_GITLAB`
+
+Подобно GitHub, если файл дистрибутива поставляется с https://gitlab.com/[gitlab.com] или использует программное обеспечение GitLab, эти переменные доступны для использования и могут потребовать установки.
+
+[[makefile-master_sites-gitlab-description]]
+.Описание `USE_GITLAB`
+[cols="1,1,1", options="header"]
+|===
+| Переменная
+| Описание
+| По умолчанию
+
+|`GL_SITE`
+|Название сайта, на котором размещен проект GitLab
+|https://gitlab.com/
+
+|`GL_ACCOUNT`
+|Имя учётной записи пользователя GitLab, размещающего проект
+|`${PORTNAME}`
+
+|`GL_PROJECT`
+|Название проекта на GitLab
+|`${PORTNAME}`
+
+|`GL_COMMIT`
+|Хэш коммита для загрузки. Должен быть полным 160-битным, 40-символьным шестнадцатеричным хэшем sha1. Это обязательная переменная для GitLab.
+|`(нет)`
+
+|`GL_SUBDIR`
+|Когда программному обеспечению требуется дополнительный файл дистрибутива для извлечения в
+`${WRKSRC}`, можно использовать эту переменную. Примеры можно найти в
+ crossref:makefiles[makefile-master_sites-gitlab-multiple, Загрузка нескольких файлов из GitLab] для получения дополнительной информации.
+|(отсутствует)
+
+|`GL_TUPLE`
+|`GL_TUPLE` позволяет объединить `GL_SITE`, `GL_ACCOUNT`, `GL_PROJECT`, `GL_COMMIT` и `GL_SUBDIR` в одну переменную. Формат записи: _сайт_`:`_учётная запись_`:`_проект_`:`_коммит_`:`_группа_`/`_поддиректория_. Части _сайт_`:` и `/`_поддиректория_ являются необязательными. Это полезно, когда требуется загрузить данные из нескольких проектов GitLab.
+|
|===
+[[makefile-master_sites-gitlab-ex1]]
+.Простое использование `USE_GITLAB`
+[example]
+====
+Пытаясь создать порт для версии `1.14` библиотеки libsignon-glib от пользователя accounts-sso на gitlab.com, по адресу https://gitlab.com/accounts-sso/libsignon-glib/[], файл [.filename]#Makefile# будет выглядеть следующим образом для загрузки дистрибутивных файлов:
+
+[.programlisting]
+....
+PORTNAME= libsignon-glib
+DISTVERSION= 1.14
+
+USE_GITLAB= yes
+GL_ACCOUNT= accounts-sso
+GL_COMMIT= e90302e342bfd27bc8c9132ab9d0ea3d8723fd03
+....
+
+Он автоматически получит `MASTER_SITES`, установленный на https://gitlab.com/[gitlab.com], и `WRKSRC` на `${WRKDIR}/libsignon-glib-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03-e90302e342bfd27bc8c9132ab9d0ea3d8723fd03`.
+====
+
+[[makefile-master_sites-gitlab-ex2]]
+.Более полное использование `USE_GITLAB`
+[example]
+====
+
+Более полный пример использования вышеописанного, если порт не имеет версионирования и foobar принадлежит пользователю foo в проекте bar на самостоятельно размещенном сайте GitLab `https://gitlab.example.com/`, тогда [.filename]#Makefile# будет выглядеть следующим образом для загрузки дистрибутивных файлов:
+
+[.programlisting]
+....
+PORTNAME= foobar
+DISTVERSION= g20170906
+
+USE_GITLAB= yes
+GL_SITE= https://gitlab.example.com
+GL_ACCOUNT= foo
+GL_PROJECT= bar
+GL_COMMIT= 9c1669ce60c3f4f5eb43df874d7314483fb3f8a6
+....
+
+В нем будет установлено `MASTER_SITES` в `"https://gitlab.example.com"` и `WRKSRC` в `${WRKDIR}/bar-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6`.
+
+[TIP]
+======
+`20170906` — это дата коммита, указанного в `GL_COMMIT`, а не дата редактирования файла [.filename]#Makefile# или дата коммита в дерево портов FreeBSD.
+======
+
+[NOTE]
+======
+Протокол, порт и корневая директория веб-сервера ``GL_SITE`` могут быть изменены в той же переменной.
+======
+
+====
+
+[[makefile-master_sites-gitlab-multiple]]
+==== Извлечение нескольких файлов из GitLab
+
+Фреймворк `USE_GITLAB` также поддерживает загрузку нескольких файлов дистрибутивов из различных мест GitLab и сайтов, размещённых на GitLab. Он работает очень похоже на crossref:makefiles[porting-master-sites-n, Несколько файлов дистрибутивов или патчей из разных местоположений] и crossref:makefiles[makefile-master_sites-gitlab-multiple, Загрузка нескольких файлов из GitLab].
+
+В `GL_SITE`, `GL_ACCOUNT`, `GL_PROJECT` и `GL_COMMIT` добавляются множественные значения. Каждое уникальное значение назначается группе. crossref:makefiles[makefile-master_sites-gitlab-description,Описание `USE_GITLAB`].
+
+`GL_TUPLE` также может использоваться, когда имеется множество файлов дистрибутива. Это помогает хранить информацию о сайте, учётной записи, проекте, коммите и группе в одном месте.
+
+Для каждой группы создаётся вспомогательная переменная `${WRKSRC_group}`, содержащая каталог, в который был извлечён файл. Переменные `${WRKSRC_group}` могут использоваться для перемещения каталогов во время `post-extract`, добавления в `CONFIGURE_ARGS` или любых других действий, необходимых для корректной сборки программного обеспечения.
+
+[CAUTION]
+====
+Часть `:__group__` _должна_ использоваться _только для одного_ файла дистрибутива. Она служит уникальным ключом, и её повторное использование приведёт к перезаписи предыдущих значений.
+====
+
+[NOTE]
+====
+Поскольку это всего лишь синтаксический сахар над `DISTFILES` и `MASTER_SITES`, имена групп должны соответствовать ограничениям на имена групп, описанным в crossref:makefiles[porting-master-sites-n, Файлы дистрибутивов или патчей из нескольких источников]
+====
+
+При получении нескольких файлов с использованием GitLab иногда файл дистрибутива по умолчанию не загружается с сайта GitLab. Чтобы отключить загрузку файла дистрибутива по умолчанию, установите:
+
+[.programlisting]
+....
+USE_GITLAB= nodefault
+....
+
+[IMPORTANT]
+====
+При использовании `USE_GITLAB=nodefault`, [.filename]#Makefile# должен устанавливать `DISTFILES` в своем crossref:makefiles[porting-order-portname,верхнем блоке]. Определение должно быть следующим:
+
+[.programlisting]
+....
+DISTFILES= ${DISTNAME}${EXTRACT_SUFX}
+....
+
+====
+
+[[makefile-master_sites-gitlab-multi]]
+.Использование `USE_GITLAB` с несколькими файлами дистрибутива
+[example]
+====
+Время от времени возникает необходимость загрузить более одного файла дистрибутива. Например, когда вышестоящий git-репозиторий использует подмодули. Это можно легко сделать с помощью групп в переменных `GL_*`:
+
+[.programlisting]
+....
+PORTNAME= foo
+DISTVERSION= 1.0.2
+
+USE_GITLAB= yes
+GL_SITE= https://gitlab.example.com:9434/gitlab:icons
+GL_ACCOUNT= bar:icons,contrib
+GL_PROJECT= foo-icons:icons foo-contrib:contrib
+GL_COMMIT= c189207a55da45305c884fe2b50e086fcad4724b ae7368cab1ca7ca754b38d49da064df87968ffe4:icons 9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib
+GL_SUBDIR= ext/icons:icons
+
+CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}
+....
+
+Это загрузит два файла дистрибутива с gitlab.com и один с `gitlab.example.com`, где размещается GitLab. По умолчанию файл берется из [.filename]#https://gitlab.com/foo/foo#, а коммит — `c189207a55da45305c884fe2b50e086fcad4724b`. Второй файл, из группы `icons`, берется из [.filename]#https://gitlab.example.com:9434/gitlab/bar/foo-icons#, а коммит — `ae7368cab1ca7ca754b38d49da064df87968ffe4`. Третий файл берется из [.filename]#https://gitlab.com/bar/foo-contrib#, а коммит — `9e4dd76ad9b38f33fdb417a4c01935958d5acd2a`. Файлы дистрибутива называются [.filename]#foo-foo-c189207a55da45305c884fe2b50e086fcad4724b_GL0.tar.gz#, [.filename]#bar-foo-icons-ae7368cab1ca7ca754b38d49da064df87968ffe4_GL0.tar.gz# и [.filename]#bar-foo-contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a_GL0.tar.gz#.
+
+Все файлы дистрибутива извлекаются в `${WRKDIR}` в соответствующих подкаталогах. Основной файл по-прежнему извлекается в `${WRKSRC}`, в данном случае это [.filename]#${WRKDIR}/foo-c189207a55da45305c884fe2b50e086fcad4724b-c189207a55da45305c884fe2b50e086fcad4724b#. Каждый дополнительный файл дистрибутива извлекается в `${WRKSRC_group}`. Здесь для группы `icons` он называется `${WRKSRC_icons}` и содержит [.filename]#${WRKDIR}/foo-icons-ae7368cab1ca7ca754b38d49da064df87968ffe4-ae7368cab1ca7ca754b38d49da064df87968ffe4#. Файл группы `contrib` называется `${WRKSRC_contrib}` и содержит `${WRKDIR}/foo-contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a`.
+
+Система сборки программного обеспечения ожидает найти иконки в подкаталоге [.filename]#ext/icons# в своих исходниках, поэтому используется `GL_SUBDIR`. `GL_SUBDIR` гарантирует, что [.filename]#ext# существует, но [.filename]#ext/icons# ещё не существует. Затем она выполняет следующее:
+
+[.programlisting]
+....
+post-extract:
+ @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons
+....
+
+====
+
+[[makefile-master_sites-gitlab-multi2]]
+.Использование `USE_GITLAB` с несколькими файлами дистрибуции с помощью `GL_TUPLE`
+[example]
+====
+Это функционально эквивалентно crossref:makefiles[makefile-master_sites-gitlab-multi,Использование `USE_GITLAB` с несколькими файлами дистрибуции], но с использованием `GL_TUPLE`:
+
+[.programlisting]
+....
+PORTNAME= foo
+DISTVERSION= 1.0.2
+
+USE_GITLAB= yes
+GL_COMMIT= c189207a55da45305c884fe2b50e086fcad4724b
+GL_TUPLE= https://gitlab.example.com:9434/gitlab:bar:foo-icons:ae7368cab1ca7ca754b38d49da064df87968ffe4:icons/ext/icons \
+ bar:foo-contrib:9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib
+
+CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}
+....
+
+В предыдущем примере использовалась группировка с `bar:icons,contrib`. Некоторую избыточную информацию приходится указывать с `GL_TUPLE`, так как группировка невозможна.
+====
+
+[[makefile-extract_sufx]]
=== `EXTRACT_SUFX`
-Если у вас имеется один дистрибутивный файл, и в его имени используется странное окончание для указания типа сжатия, задайте переменную `EXTRACT_SUFX`.
+Если имеется один файл дистрибутива, и он использует нестандартное суффикс для указания механизма сжатия, установите `EXTRACT_SUFX`.
-К примеру, если дистрибутивный файл носит имя [.filename]#foo.tgz#, а не более привычное [.filename]#foo.tar.gz#, вы должны написать:
+Например, если файл дистрибутива был назван [.filename]#foo.tar.gzip# вместо более привычного [.filename]#foo.tar.gz#, напишите:
[.programlisting]
....
DISTNAME= foo
-EXTRACT_SUFX= .tgz
+EXTRACT_SUFX= .tar.gzip
....
-Переменные `USE_BZIP2`, `USE_XZ` и `USE_ZIP` при необходимости автоматически устанавливают значение `EXTRACT_SUFX` в `.tar.bz2`, `.tar.xz` или `.zip`. Если ни одна из этих переменных не задана, то значение `EXTRACT_SUFX` по умолчанию устанавливается в `.tar.gz`.
+`USES=tar[:__xxx__]`, `USES=lha` или `USES=zip` автоматически устанавливают `EXTRACT_SUFX` в наиболее распространённые расширения архивов при необходимости, подробнее см. crossref:uses[uses,Использование макросов `USES`]. Если ни один из них не задан, `EXTRACT_SUFX` по умолчанию принимает значение `.tar.gz`.
[NOTE]
====
-Вам не нужно задавать значения `EXTRACT_SUFX` и `DISTFILES` одновременно.
+Как `EXTRACT_SUFX` используется только в `DISTFILES`, следует задавать только один из них.
====
+[[makefile-distfiles-definition]]
=== `DISTFILES`
-Иногда имена сгружаемых файлов не соответствуют имени порта. К примеру, файл может называться [.filename]#source.tar.gz# или подобным образом. В других случаях исходный код приложения может располагаться в нескольких отличающихся архивах, и все они должны быть сгружены.
+Иногда названия файлов для загрузки не имеют ничего общего с именем порта. Например, файл может называться [.filename]#source.tar.gz# или подобным образом. В других случаях исходный код приложения может быть разбит на несколько различных архивов, все из которых необходимо загрузить.
-Если это ваш случай, то задайте в переменной `DISTFILES` список разделённых пробелами имён файлов, которые нужно сгрузить.
+Если это так, установите `DISTFILES` как список разделённых пробелами файлов, которые необходимо загрузить.
[.programlisting]
....
DISTFILES= source1.tar.gz source2.tar.gz
....
-Если переменная `DISTFILES` не задана явно, то её значением по умолчанию будет `${DISTNAME}${EXTRACT_SUFX}`.
+Если явно не задано, `DISTFILES` по умолчанию равно `${DISTNAME}${EXTRACT_SUFX}`.
+[[makefile-extract_only]]
=== `EXTRACT_ONLY`
-Если только некоторые из `DISTFILES` должны быть распакованы-к примеру, часть из них является исходным кодом, а другие представляют собой неупакованную документацию-перечислите имена файлов, которые должны быть распакованы, в `EXTRACT_ONLY`.
+Если необходимо извлечь только некоторые из `DISTFILES` — например, один из них является исходным кодом, а другой — несжатым документом — укажите имена файлов, которые нужно извлечь, в `EXTRACT_ONLY`.
[.programlisting]
....
@@ -901,7 +1946,7 @@ DISTFILES= source.tar.gz manual.html
EXTRACT_ONLY= source.tar.gz
....
-Если _ни один_ из `DISTFILES` не должен распаковываться, то установите пустое значение переменной `EXTRACT_ONLY`.
+Если ни один из `DISTFILES` не требует распаковки, установите `EXTRACT_ONLY` в пустую строку.
[.programlisting]
....
@@ -911,77 +1956,103 @@ EXTRACT_ONLY=
[[porting-patchfiles]]
=== `PATCHFILES`
-Если вашему порту требуются некоторых дополнительные патчи, которые доступны по FTP или HTTP, задайте имена этих файлов в переменной `PATCHFILES`, а в переменной `PATCH_SITES` укажите URL того каталога, в котором они содержатся (формат такой же, как для `MASTER_SITES`).
+Если порт требует дополнительных исправлений, доступных через FTP или HTTP, установите `PATCHFILES` в имена файлов, а `PATCH_SITES` — в URL каталога, содержащего их (формат такой же, как у `MASTER_SITES`).
+
+Если патч не относится к корню исходного дерева (то есть к `WRKSRC`), потому что содержит дополнительные пути, установите `PATCH_DIST_STRIP` соответствующим образом. Например, если все пути в патче имеют дополнительный префикс `foozolix-1.0/` перед именами файлов, задайте `PATCH_DIST_STRIP=-p1`.
+
+Не беспокойтесь, если патчи сжаты; они будут автоматически распакованы, если их имена заканчиваются на [.filename]#.Z#, [.filename]#.gz#, [.filename]#.bz2# или [.filename]#.xz#.
+
+Если патч распространяется вместе с другими файлами, такими как документация, в сжатом tarball, использование `PATCHFILES` невозможно. В таком случае добавьте имя и расположение tarball с патчами в `DISTFILES` и `MASTER_SITES`. Затем используйте `EXTRA_PATCHES`, чтобы указать на эти файлы, и [.filename]#bsd.port.mk# автоматически применит их. В частности, _не_ копируйте файлы патчей в [.filename]#${PATCHDIR}#. Этот каталог может быть недоступен для записи.
+
+[TIP]
+====
+Если есть несколько патчей и для них требуются разные значения параметра strip, его можно добавить рядом с именем патча в `PATCHFILES`, например:
+
+[.programlisting]
+....
+PATCHFILES= patch1 patch2:-p1
+....
-Если патч не относится к самому верху дерева исходных текстов (то есть `WRKSRC`), потому что он содержит некоторые дополнительные пути, установите соответственно значение переменной `PATCH_DIST_STRIP`. В частности, если все имена путей в патче имеют дополнительный путь `foozolix-1.0/` перед именем файла, то задайте `PATCH_DIST_STRIP=-p1`.
+Это не конфликтует с crossref:makefiles[porting-master-sites-n,функцией группировки мастер-сайтов], добавление группы также работает:
-Не волнуйтесь, если патчи упакованы; они будут распакованы автоматически, если имена файлов оканчиваются на [.filename]#.gz# или [.filename]#.Z#.
+[.programlisting]
+....
+PATCHFILES= patch2:-p1:source2
+....
-Если патч распространяется вместе с какими-то другими файлами, такими, как документация, в виде tar-архива `gzip`, вы не можете просто использовать `PATCHFILES`. Если это ваш случай, добавьте имя и местоположение архива с патчем к `DISTFILES` и `MASTER_SITES`. Затем воспользуйтесь переменной `EXTRA_PATCHES` для указания этих файлов, и [.filename]#bsd.port.mk# автоматически применит эти патчи. В частности, _не копируйте_ файлы с патчами в каталог `PATCHDIR`-этот каталог может быть недоступным для записи.
+====
[NOTE]
====
-Архив будет распакован вне исходного кода, как обычно, и к тому же его не нужно явно распаковывать, если это обычный архив `gzip` или `compress`. Если вы сделаете последнее, приложите дополнительные усилия для того, чтобы не перезаписать что-либо, уже существующее в этом каталоге. Также не забудьте добавить команду для удаления скопированного патча в цели `pre-clean`.
+Tarball уже будет распакован вместе с обычными исходными кодами, поэтому нет необходимости явно его распаковывать, если это обычный сжатый tarball. Будьте особенно осторожны, чтобы не перезаписать существующие файлы в этом каталоге при ручной распаковке. Также не забудьте добавить команду для удаления скопированного патча в цель `pre-clean`.
====
[[porting-master-sites-n]]
-=== Несколько дистрибутивных файлов или патчей с различных серверов и подкаталогов (`MASTER_SITES:n`)
+=== Несколько файлов дистрибутивов или исправлений из нескольких местоположений
-(Этот раздел можно считать немного "повышенной трудности"; те, кто впервые знакомятся с этим текстом, могут пропустить этот раздел).
+(Считайте, что это несколько «продвинутая тема»; тем, кто впервые читает этот документ, возможно, стоит сначала пропустить этот раздел).
-В этом разделе находится информация о механизме сгрузки, известном как `MASTER_SITES:n` и `MASTER_SITES_NN`. Далее мы будем называть этот механизм `MASTER_SITES:n`.
+Этот раздел содержит информацию о механизме загрузки, известном как `MASTER_SITES:n` и `MASTER_SITES_NN`. Мы будем называть этот механизм `MASTER_SITES:n`.
-Сначала немного общей информации. В OpenBSD имеется полезная возможность, используемая в переменных `DISTFILES` и `PATCHFILES`, которая позволяет закреплять после имен файлов и патчей идентификаторы типа `:n`. Здесь `n` может быть из диапазона `[0-9]` и обозначать закреплённую группу. К примеру:
+Небольшая предыстория. В OpenBSD есть удобная функция внутри `DISTFILES` и `PATCHFILES`, которая позволяет добавлять постфикс `:n` к файлам и патчам. Здесь `n` может быть любым словом, содержащим `[0-9a-zA-Z_]`, и обозначать группу. Например:
[.programlisting]
....
DISTFILES= alpha:0 beta:1
....
-В OpenBSD дистрибутивный файл [.filename]#alpha# будет связан с переменной `MASTER_SITES0`, но не с нашей общей переменной `MASTER_SITES`, а файл [.filename]#beta# с переменной `MASTER_SITES1`.
+В OpenBSD файл дистрибутива [.filename]#alpha# будет связан с переменной `MASTER_SITES0`, а не с нашей общей `MASTER_SITES`, а [.filename]#beta# — с `MASTER_SITES1`.
+
+Это очень интересная функция, которая может сократить бесконечные поиски нужного сайта для загрузки.
-Этот очень интересная возможность, которая может уменьшить этот бесконечный поиск работающего сайта для сгрузки.
+Представьте 2 файла в `DISTFILES` и 20 сайтов в `MASTER_SITES`, причём сайты медленные как черепаха, где [.filename]#beta# есть на всех сайтах из `MASTER_SITES`, а [.filename]#alpha# можно найти только на 20-м сайте. Было бы так обидно проверять их все, если бы сопровождающий знал это заранее, не так ли? Не самое лучшее начало для чудесных выходных!
-Просто представьте себе 2 файла в `DISTFILES` и 20 сайтов в `MASTER_SITES`; сайты очень медленные, причём [.filename]#beta# находится на всех сайтах из `MASTER_SITES`, а [.filename]#alpha# может быть найден только на 20-м сайте. Будет неправильно проверять их все, если создатель знает об этом, не правда ли? Неподходящее начало для таких прекрасных выходных!
+Теперь, когда вы поняли идею, представьте больше `DISTFILES` и больше `MASTER_SITES`. Безусловно, наш "мастер по исследованию distfiles" оценил бы снижение нагрузки на сеть, которое это принесло бы.
-Теперь, когда вы получили общее представление, просто представьте ещё большее количество `DISTFILES` и `MASTER_SITES`. Конечно, наш "магистр доступности дистрибутивов" представляет масштабы нагрузки на сеть, которую это даёт.
+В следующих разделах будет приведена информация о реализации этой идеи в FreeBSD. Мы немного улучшили концепцию OpenBSD.
-В последующих разделах информация будет даваться вместе с реализацией этой идеи во FreeBSD. Мы несколько улучшили концепцию OpenBSD.
+[IMPORTANT]
+====
+Имена групп не могут содержать дефисы (`-`), более того, они не могут содержать любые символы вне диапазона `[a-zA-Z0-9_]`. Это связано с тем, что, хотя man:make[1] допускает использование имён переменных с дефисами, man:sh[1] — нет.
+====
-==== Упрощённая информация
+[[porting-master-sites-n-simplified]]
+==== Упрощенная информация
-В этом разделе рассказывается, как быстро подготовить точную сгрузку нескольких дистрибутивных файлов и патчей с разных сайтов и каталогов. Мы описываем здесь случай упрощённого использования `MASTER_SITES:n`. Для большинства сценариев этого будет достаточно. Однако, если вам нужна дополнительная информация, обратитесь к следующему разделу.
+В этом разделе объясняется, как быстро настроить детализированное получение нескольких файлов дистрибутивов и патчей с разных сайтов и подкаталогов. Здесь описывается случай упрощённого использования `MASTER_SITES:n`. Этого будет достаточно для большинства сценариев. Более подробная информация доступна в crossref:makefiles[ports-master-sites-n-detailed, Подробная Информация].
-Некоторые приложения состоят из многих дистрибутивных файлов, которые должны быть сгружены с нескольких различных сайтов. К примеру, Ghostscript состоит из основной программы и большого числа файлов драйверов, которые используются в зависимости от принтера пользователя. Некоторые из этих файлов драйверов поставляются с основной программой, но при этом многие другие должны быть сгружены с множества различных сайтов.
+Некоторые приложения состоят из нескольких распространяемых файлов, которые необходимо загрузить с различных сайтов. Например, Ghostscript включает основную часть программы и множество драйверов, используемых в зависимости от принтера пользователя. Некоторые из этих драйверов поставляются вместе с основной частью, но многие другие необходимо загружать с различных сайтов.
-Чтобы это поддерживать, за каждой записью в `DISTFILES` может следовать символ двоеточия и "имя метки". За каждым сайтом, перечисленным в `MASTER_SITES`, тоже следует двоеточие и метка, которая указывает, какие файлы дистрибутива должны быть сгружены с этого сайта.
+Для поддержки этого, каждая запись в `DISTFILES` может сопровождаться двоеточием и "именем группы". Затем каждый сайт, указанный в `MASTER_SITES`, сопровождается двоеточием и группой, которая указывает, какие файлы дистрибутива загружаются с данного сайта.
-Например, рассмотрим приложение, исходный код которого разделён на две части, [.filename]#source1.tar.gz# и [.filename]#source2.tar.gz#, которые должны быть сгружены с двух различных источников. Файл [.filename]#Makefile# порта будет содержать строчки типа <<ports-master-sites-n-example-simple-use-one-file-per-site>>.
+Например, рассмотрим приложение, исходный код которого разделён на две части: [.filename]#source1.tar.gz# и [.filename]#source2.tar.gz#, которые необходимо загрузить с двух разных сайтов. В [.filename]#Makefile# порта будут присутствовать строки, подобные crossref:makefiles[ports-master-sites-n-example-simple-use-one-file-per-site,Упрощённое использование `MASTER_SITES:n` с одним файлом на сайт].
[[ports-master-sites-n-example-simple-use-one-file-per-site]]
-.Упрощённое использование `MASTER_SITES:n` с 1 файлом на каждом сайте
+.Упрощённое использование `MASTER_SITES:n` с одним файлом на сайт
[example]
====
+
[.programlisting]
....
-MASTER_SITES= ftp://ftp.example1.com/:source1 \
- ftp://ftp.example2.com/:source2
+MASTER_SITES= ftp://ftp1.example.com/:source1 \
+ http://www.example.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2
....
====
-Несколько дистрибутивных файлов могут иметь одну и ту же метку. Продолжая предыдущий пример, положим, что имеется и третий дистрибутивный файл, [.filename]#source3.tar.gz#, который должен быть сгружен с `ftp.example2.com`. Тогда файл [.filename]#Makefile# будет написан как <<ports-master-sites-n-example-simple-use-more-than-one-file-per-site>>.
+Несколько файлов дистрибутивов могут принадлежать одной группе. Продолжая предыдущий пример, предположим, что существует третий файл дистрибутива [.filename]#source3.tar.gz#, который загружается с `ftp.example2.com`. Тогда [.filename]#Makefile# будет записан, как показано в crossref:makefiles[ports-master-sites-n-example-simple-use-more-than-one-file-per-site,Упрощённое использование `MASTER_SITES:n` с несколькими файлами на один сайт].
[[ports-master-sites-n-example-simple-use-more-than-one-file-per-site]]
-.Упрощённое использование `MASTER_SITES:n` с более чем 1 файлом на каждом сервере
+.Упрощённое использование `MASTER_SITES:n` с несколькими файлами на одном сайте
[example]
====
+
[.programlisting]
....
-MASTER_SITES= ftp://ftp.example1.com/:source1 \
- ftp://ftp.example2.com/:source2
+MASTER_SITES= ftp://ftp.example.com/:source1 \
+ http://www.example.com/:source2
DISTFILES= source1.tar.gz:source1 \
source2.tar.gz:source2 \
source3.tar.gz:source2
@@ -989,86 +2060,88 @@ DISTFILES= source1.tar.gz:source1 \
====
+[[ports-master-sites-n-detailed]]
==== Подробная информация
-Прекрасно, но пример из предыдущего раздела не показал вам всё, что вам нужно? В этом разделе мы подробно опишем, как работает механизм `MASTER_SITES:n` точной сгрузки и как вы можете изменить ваши порты, чтобы это использовать.
+Хорошо, значит, предыдущий пример не отражал потребности нового порта? В этом разделе мы подробно объясним, как работает механизм детализированного получения `MASTER_SITES:n` и как его можно использовать.
-. За элементами могут следовать символы `:n`, где _n_ это `[^:,]+`, то есть _n_ может теоретически быть любой алфавитно-цифровой строкой, но пока мы будем ограничивать их `[a-zA-Z_][0-9a-zA-Z_]+`.
-+
-Более того, совпадение строк чувствительно к регистру; другими словами, `n` отличается от `N`.
-+
-Однако следующие слова не могут использоваться для этих нужд, так как они имеют особое значение: `default`, `all` и `ALL` (они используются для своих нужд в <<porting-master-sites-n-what-changes-in-port-targets,ii>>). Кроме того, `DEFAULT` является специальным ключевым словом (посмотрите <<porting-master-sites-n-DEFAULT-group,3>>).
-. Элементы, за которыми следуют `:n`, принадлежат группе `n`, `:m` относится к группе `m` и так далее.
+. Элементы могут иметь постфикс `:__n__`, где _n_ — это `[^:,]+`, то есть _n_ концептуально может быть любой буквенно-цифровой строкой, но пока мы ограничим её `[a-zA-Z_][0-9a-zA-Z_]+`.
++
+Более того, сравнение строк чувствительно к регистру; то есть, `n` отличается от `N`.
++
+Однако эти слова не могут использоваться для постфиксных целей, так как имеют специальное значение: `default`, `all` и `ALL` (они используются внутри системы, см. crossref:makefiles[porting-master-sites-n-what-changes-in-port-targets, ii]). Кроме того, `DEFAULT` является словом специального назначения (проверьте пункт crossref:makefiles[porting-master-sites-n-DEFAULT-group,3]).
+. Элементы с постфиксом `:n` принадлежат группе `n`, `:m` — группе `m` и так далее.
++
[[porting-master-sites-n-DEFAULT-group]]
-. Элементы без таких суффиксов не относятся ни к какой группе, то есть они принадлежат к особой группе `DEFAULT`. Если вы укажете суффиксом любого элемента `DEFAULT`, вы просто выполните излишнюю работу, если только вы не хотите отнесения элемента как к группе `DEFAULT`, так и какой-то другой в одно и то же время (посмотрите на пункт <<porting-master-sites-n-comma-operator,5>>).
-+
-Следующие примеры равнозначны, но первый более предпочтителен:
+. Элементы без постфикса не принадлежат к группам, все они относятся к специальной группе `DEFAULT`. Элементы с постфиксом `DEFAULT` избыточны, за исключением случаев, когда элемент одновременно принадлежит и к `DEFAULT`, и к другим группам (см. пункт crossref:makefiles[porting-master-sites-n-comma-operator,5]).
++
+Эти примеры эквивалентны, но первый предпочтительнее:
+
[.programlisting]
....
MASTER_SITES= alpha
....
-
+
[.programlisting]
....
MASTER_SITES= alpha:DEFAULT
....
-. Группы не являются эксклюзивными, элемент может принадлежать к нескольким отличающимся группам одновременно, а группа может либо иметь несколько различных элементов, либо не иметь их вовсе. Повторяющиеся элементы в одной и той же группе будут являться просто повторяющимися элементами.
+. Группы не являются исключительными, элемент может принадлежать нескольким разным группам одновременно, а группа может содержать несколько разных элементов или не содержать их вовсе.
++
[[porting-master-sites-n-comma-operator]]
-. Если в хотите, чтобы элемент принадлежал к нескольким группам одновременно, вы можете использовать запятую (`,`).
-+
-Вместо того, чтобы повторять их несколько раз, каждый раз с разным постфиксом, мы можем перечислить несколько групп за раз в одном постфиксе. Например, `:m,n,o` определяет элемент, принадлежащий группам `m`, `n` и `o`.
-+
-Все следующие примеры имеют один смысл, но последний является предпочтительным:
+. Когда элемент принадлежит нескольким группам одновременно, используйте оператор запятую (`,`).
++
+Вместо повторения несколько раз, каждый раз с разным постфиксом, мы можем перечислить несколько групп сразу в одном постфиксе. Например, `:m,n,o` обозначает элемент, принадлежащий группам `m`, `n` и `o`.
++
+Все эти примеры эквивалентны, но последний является предпочтительным:
+
[.programlisting]
....
MASTER_SITES= alpha alpha:SOME_SITE
....
-
+
[.programlisting]
....
MASTER_SITES= alpha:DEFAULT alpha:SOME_SITE
....
-
+
[.programlisting]
....
MASTER_SITES= alpha:SOME_SITE,DEFAULT
....
-
+
[.programlisting]
....
MASTER_SITES= alpha:DEFAULT,SOME_SITE
....
-. Все серверы внутри определённой группы сортируются в соответствии с `MASTER_SORT_AWK`. Все группы в `MASTER_SITES` и `PATCH_SITES` тоже сортируются.
+. Все сайты в заданной группе сортируются согласно `MASTER_SORT_AWK`. Все группы в `MASTER_SITES` и `PATCH_SITES` также сортируются.
++
[[porting-master-sites-n-group-semantics]]
-. Семантика групп может использоваться в любой из следующих переменных `MASTER_SITES`, `PATCH_SITES`, `MASTER_SITE_SUBDIR`, `PATCH_SITE_SUBDIR`, `DISTFILES` и `PATCHFILES` в соответствии со следующим синтаксисом:
-.. Все элементы `MASTER_SITES`, `PATCH_SITES`, `MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR` должны заканчиваться символом прямого слэша `/`. Если какие-то элементы принадлежат каким-то группам, постфикс группы `:n` должен следовать сразу после завершающего символа `/`. Механизм `MASTER_SITES:n` опирается на наличие завершающего символа `/` во избежание совпадающих элементов, где `:n` является корректной частью элемента с вхождениями, где `:n` обозначает группу `n`. Для целей совместимости, так как завершающий символ `/` ранее не требовался в элементах `MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR`, если символ, сразу предшествующий постфиксу, не является символом `/`, то `:n` будет считаться корректной частью элемента, а не постфиксом группы, даже если за элементом следует `:n`. Посмотрите <<ports-master-sites-n-example-detailed-use-master-site-subdir>> и <<ports-master-sites-n-example-detailed-use-complete-example-master-sites>>.
+. Семантика групп может использоваться в любых переменных `MASTER_SITES`, `PATCH_SITES`, `MASTER_SITE_SUBDIR`, `PATCH_SITE_SUBDIR`, `DISTFILES` и `PATCHFILES` согласно следующему синтаксису:
+.. Все элементы `MASTER_SITES`, `PATCH_SITES`, `MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR` должны заканчиваться символом дробной черты `/`. Если элементы принадлежат к какой-либо группе, постфикс группы `:__n__` должен следовать сразу после завершающего символа `/`. Механизм `MASTER_SITES:n` полагается на наличие завершающего символа `/`, чтобы избежать путаницы между элементами, где `:n` является допустимой частью элемента, и случаями, где `:n` обозначает группу `n`. В целях совместимости, поскольку ранее завершающий символ `/` не требовался в элементах `MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR`, если символ, непосредственно предшествующий постфиксу, не является `/`, то `:n` будет считаться допустимой частью элемента, а не постфиксом группы, даже если элемент оканчивается на `:n`. См. оба раздела crossref:makefiles[ports-master-sites-n-example-detailed-use-master-site-subdir,Подробное использование `MASTER_SITES:n` в `MASTER_SITE_SUBDIR`] и crossref:makefiles[ports-master-sites-n-example-detailed-use-complete-example-master-sites,Подробное использование `MASTER_SITES:n` с оператором запятая, несколькими файлами, несколькими сайтами и несколькими подкаталогами].
+
[[ports-master-sites-n-example-detailed-use-master-site-subdir]]
.Подробное использование `MASTER_SITES:n` в `MASTER_SITE_SUBDIR`
[example]
====
+
[.programlisting]
....
MASTER_SITE_SUBDIR= old:n new/:NEW
....
-*** Каталоги внутри группы `DEFAULT` -> old:n
-*** Каталоги внутри группы `NEW` -> new
+*** Каталоги в группе `DEFAULT` -> old:n
+*** Каталоги в группе `NEW` -> new
====
+
[[ports-master-sites-n-example-detailed-use-complete-example-master-sites]]
-.Подробное использование `MASTER_SITES:n` с запятыми, несколькими файлами, несколькими серверами и несколькими подкаталогами
+.Подробное использование `MASTER_SITES:n` с оператором запятая, несколькими файлами, сайтами и подкаталогами
[example]
====
+
[.programlisting]
....
MASTER_SITES= http://site1/%SUBDIR%/ http://site2/:DEFAULT \
@@ -1081,13 +2154,13 @@ DISTFILES= file1 file2:DEFAULT file3:group3 \
file4:group4,group5,group6 file5:grouping \
file6:group7
MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
- directory-one/:group6,DEFAULT \
- directory
+ directory-one/:group6,DEFAULT \
+ directory
....
-Предыдущий пример приводит к следующей точной сгрузке. Серверы перечислены в точном порядке их использования.
+Предыдущий пример приводит к такой детализированной загрузке файлов. Сайты перечислены в точном порядке их использования.
-*** [.filename]#file1# будет сгружаться с
+*** [.filename]#file1# будет загружен из
**** `MASTER_SITE_OVERRIDE`
**** http://site1/directory-trial:1/
@@ -1097,7 +2170,7 @@ MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
**** http://site7/
**** `MASTER_SITE_BACKUP`
-*** [.filename]#file2# будет сгружаться точно также, как [.filename]#file1#, так как они оба относятся к одной и той же группе
+*** [.filename]#file2# будет загружен точно так же, как [.filename]#file1#, поскольку они оба принадлежат к одной и той же группе
**** `MASTER_SITE_OVERRIDE`
**** http://site1/directory-trial:1/
@@ -1107,13 +2180,13 @@ MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
**** http://site7/
**** `MASTER_SITE_BACKUP`
-*** [.filename]#file3# будет сгружен с
+*** [.filename]#file3# будет загружен из
**** `MASTER_SITE_OVERRIDE`
**** http://site3/
**** `MASTER_SITE_BACKUP`
-*** [.filename]#file4# будет сгружаться с
+*** [.filename]#file4# будет загружен из
**** `MASTER_SITE_OVERRIDE`
**** http://site4/
@@ -1123,12 +2196,12 @@ MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
**** http://site8/directory-one/
**** `MASTER_SITE_BACKUP`
-*** [.filename]#file5# будет сгружен с
+*** [.filename]#file5# будет загружен из
**** `MASTER_SITE_OVERRIDE`
**** `MASTER_SITE_BACKUP`
-*** [.filename]#file6# будет сгружаться с
+*** [.filename]#file6# будет получен из
**** `MASTER_SITE_OVERRIDE`
**** http://site8/
@@ -1136,31 +2209,32 @@ MASTER_SITE_SUBDIR= directory-trial:1 directory-n/:groupn \
====
-. Как мне группировать одну из специальных переменных из [.filename]#bsd.sites.mk#, например, `MASTER_SITE_SOURCEFORGE`?
-+
-Посмотрите <<ports-master-sites-n-example-detailed-use-master-site-sourceforge>>.
+. Как сгруппировать один из специальных макросов из [.filename]#bsd.sites.mk#, например, SourceForge (`SF`)?
++
+Это максимально упрощено. См. crossref:makefiles[ports-master-sites-n-example-detailed-use-master-site-sourceforge,Подробное использование `MASTER_SITES:n` с SourceForge (`SF`)].
+
[[ports-master-sites-n-example-detailed-use-master-site-sourceforge]]
-.Подробное использование `MASTER_SITES:n` с `MASTER_SITE_SOURCEFORGE`
+.Подробное использование `MASTER_SITES:n` с SourceForge (`SF`)
[example]
====
+
[.programlisting]
....
-MASTER_SITES= http://site1/ ${MASTER_SITE_SOURCEFORGE:S/$/:sourceforge,TEST/}
+MASTER_SITES= http://site1/ SF/something/1.0:sourceforge,TEST
DISTFILES= something.tar.gz:sourceforge
....
+[.filename]#something.tar.gz# будет загружен со всех сайтов в пределах SourceForge.
====
-+
-[.filename]#something.tar.gz# будет сгружаться со всех сайтов из `MASTER_SITE_SOURCEFORGE`.
-. Как мне использовать это с переменными `PATCH*`?
-+
-Все примеры выполнялись с переменными `MASTER*`, и они работают точно так же и для `PATCH*`, как это можно видеть в <<ports-master-sites-n-example-detailed-use-patch-sites>>.
+. Как использовать это с `PATCH*`?
++
+Все примеры были выполнены с `MASTER*`, но они работают точно так же для `PATCH*`, как можно увидеть в crossref:makefiles[ports-master-sites-n-example-detailed-use-patch-sites,Упрощённое использование `MASTER_SITES:n` с `PATCH_SITES`].
+
[[ports-master-sites-n-example-detailed-use-patch-sites]]
-.Упрощённое использование `MASTER_SITES:n` с `PATCH_SITES`.
+.Упрощённое использование `MASTER_SITES:n` с `PATCH_SITES`
[example]
====
+
[.programlisting]
....
PATCH_SITES= http://site1/ http://site2/:test
@@ -1169,162 +2243,966 @@ PATCHFILES= patch1:test
====
-==== Что изменится для портов? А что не изменится?
+[[port-master-sites-n-what-changed]]
+==== Что меняется для портов? Что остается неизменным?
[lowerroman]
-. Все имеющиеся порты остаются без изменений. Код для механизма `MASTER_SITES:n` активируется, если только есть элементы, которые заканчиваются на `:n`, как и элементы в соответствии с вышеописанным синтаксисом, особенно как это показано в пункте <<porting-master-sites-n-group-semantics,7>>.
+. Все текущие порты остаются без изменений. Функция `MASTER_SITES:n` активируется только при наличии элементов с постфиксом `:__n__`, соответствующих указанным выше синтаксическим правилам, в частности, как показано в пункте crossref:makefiles[porting-master-sites-n-group-semantics, 7].
++
[[porting-master-sites-n-what-changes-in-port-targets]]
-. Цели порт остаются теми же самыми: `checksum`, `makesum`, `patch`, `configure`, `build` и так далее. С обычными исключениями для `do-fetch`, `fetch-list`, `master-sites` и `patch-sites`.
+. Порты сохраняют те же цели: `checksum`, `makesum`, `patch`, `configure`, `build` и т.д., за исключением очевидных случаев: `do-fetch`, `fetch-list`, `master-sites` и `patch-sites`.
-** `do-fetch`: использует новую группировку с постфиксами в `DISTFILES` и `PATCHFILES` с соответствующими элементами групп в `MASTER_SITES` и `PATCH_SITES`, которые используют группы из `MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR`. Посмотрите <<ports-master-sites-n-example-detailed-use-complete-example-master-sites>>.
-** `fetch-list`: работает так же, как старая цель `fetch-list` с тем исключением, что она группирует, как и `do-fetch`.
-** `master-sites` и `patch-sites`: (несовместимы со старыми версиями) только возвращают элементы группы `DEFAULT`; на самом деле они выполняют цели `master-sites-default` и `patch-sites-default` соответственно.
-+
-Более того, использование целей `master-sites-all` или `patch-sites-all` предпочтительно для непосредственной проверки `MASTER_SITES` или `PATCH_SITES`. Также работа прямой проверки в последующих версиях не гарантируется. Посмотрите <<porting-master-sites-n-new-port-targets-master-sites-all, B>> для получения более дополнительной информации об этих новых целях.
+** `do-fetch`: развертывает новую группировку с постфиксом `DISTFILES` и `PATCHFILES` с соответствующими групповыми элементами в `MASTER_SITES` и `PATCH_SITES`, которые используют соответствующие групповые элементы в `MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR`. Проверьте crossref:makefiles[ports-master-sites-n-example-detailed-use-complete-example-master-sites,Подробное использование `MASTER_SITES:n` с оператором запятой, множественными файлами, множественными сайтами и множественными подкаталогами].
+** `fetch-list`: работает как старый `fetch-list`, за исключением того, что группировка происходит так же, как в `do-fetch`.
+** `master-sites` и `patch-sites`: (несовместимо с более старыми версиями) возвращают только элементы группы `DEFAULT`; фактически они выполняют цели `master-sites-default` и `patch-sites-default` соответственно.
++
+Кроме того, предпочтительнее использовать цель `master-sites-all` или `patch-sites-all`, чем напрямую проверять `MASTER_SITES` или `PATCH_SITES`. Кроме того, прямая проверка не гарантирует работу в будущих версиях. Для получения дополнительной информации об этих новых целях портов см. пункт crossref:makefiles[porting-master-sites-n-new-port-targets-master-sites-all, B].
-. Новые цели построения портов
-.. Имеются цели `master-sites-_n_` и `patch-sites-_n_`, которые будут перечислять элементы соответствующей группы _n_ из `MASTER_SITES` и `PATCH_SITES` соответственно. К примеру, `master-sites-DEFAULT` и `patch-sites-DEFAULT` обе будут возвращать элементы группы `DEFAULT`, `master-sites-test` и `patch-sites-test` группы `test` и так далее.
+. Новые цели портов
+.. Существуют цели `master-sites-_n_` и `patch-sites-_n_`, которые будут выводить элементы соответствующей группы _n_ в `MASTER_SITES` и `PATCH_SITES` соответственно. Например, и `master-sites-DEFAULT`, и `patch-sites-DEFAULT` вернут элементы группы `DEFAULT`, `master-sites-test` и `patch-sites-test` — группы `test`, и так далее.
++
[[porting-master-sites-n-new-port-targets-master-sites-all]]
-.. Имеются новые цели `master-sites-all` и `patch-sites-all`, которые выполняют работу старых `master-sites` и `patch-sites`. Они возвращают элементы всех групп, как если бы они все принадлежали одной и той же группе с тем, что она перечисляет ровно столько `MASTER_SITE_BACKUP` и `MASTER_SITE_OVERRIDE`, как и группы, определённые в `DISTFILES` или `PATCHFILES`; соответственно для `master-sites-all` и `patch-sites-all`.
+.. Существуют новые цели `master-sites-all` и `patch-sites-all`, которые выполняют работу старых `master-sites` и `patch-sites`. Они возвращают элементы всех групп, как если бы они все принадлежали одной группе, с оговоркой, что перечисляется столько же `MASTER_SITE_BACKUP` и `MASTER_SITE_OVERRIDE`, сколько определено групп в `DISTFILES` или `PATCHFILES`; соответственно для `master-sites-all` и `patch-sites-all`.
+[[makefile-dist_subdir]]
=== `DIST_SUBDIR`
-Не позволяйте вашему порту засорять [.filename]#/usr/ports/distfiles#. Если вашему порту требуется сгрузить много файлов, или он содержит имя файла, могущее вызвать конфликты с другими портами (например, [.filename]#Makefile#), то укажите в переменной `DIST_SUBDIR` имя порта (должны подойти `${PORTNAME}` или `${PKGNAMEPREFIX}${PORTNAME}`). Это изменит значение переменной `DISTDIR` со значения по умолчанию [.filename]#/usr/ports/distfiles# к значению [.filename]#/usr/ports/distfiles/DIST_SUBDIR#, и в результате всё, что требуется для порта, будет помещено в этот подкаталог.
+Не допускайте захламления портом каталога [.filename]#/usr/ports/distfiles#. Если порт требует загрузки большого количества файлов или содержит файл с именем, которое может конфликтовать с другими портами (например, [.filename]#Makefile#), установите `DIST_SUBDIR` в имя порта (подойдут `${PORTNAME}` или `${PKGNAMEPREFIX}${PORTNAME}`). Это изменит `DISTDIR` со значения по умолчанию [.filename]#/usr/ports/distfiles# на [.filename]#/usr/ports/distfiles/${DIST_SUBDIR}#, фактически помещая все необходимые для порта файлы в этот подкаталог.
+
+Также будет проверяться подкаталог с тем же именем на основном резервном сайте по адресу http://distcache.FreeBSD.org[http://distcache.FreeBSD.org] (Явное указание `DISTDIR` в [.filename]#Makefile# не решит эту задачу, поэтому используйте `DIST_SUBDIR`.)
+
+[NOTE]
+====
+Это не влияет на сайты в `MASTER_SITES`, определённые в [.filename]#Makefile#.
+====
+
+[[makefile-maintainer]]
+== `MAINTAINER`
+
+Установите здесь свой адрес электронной почты. Пожалуйста. _:-)_
-Он заглянет также в подкаталог с тем же именем на основном резервном сервере [.filename]#ftp.FreeBSD.org#. (Явное задание переменной `DISTDIR` в вашем файле `Makefile` этого не сделает, так что, пожалуйста, воспользуйтесь `DIST_SUBDIR`.)
+Только один адрес без комментария допускается в качестве значения `MAINTAINER`. Используемый формат: `user@hostname.domain`. Пожалуйста, не включайте в эту запись описательный текст, например, настоящее имя. Это только вносит путаницу в инфраструктуру Ports и большинство инструментов, которые её используют.
+
+Ответственный за поддержку порта обязан поддерживать порт в актуальном состоянии и обеспечивать его корректную работу. Подробное описание обязанностей ответственного за поддержку порта приведено в разделе extref:{contributing}[Задача для сопровождающих портов,maintain-port].
[NOTE]
====
-Это не коснётся тех сайтов `MASTER_SITES`, которые вы указали в вашем файле [.filename]#Makefile#.
+Сопровождающий добровольно поддерживает порт в рабочем состоянии. Сопровождающие несут основную ответственность за свои порты, но не имеют исключительных прав на них. Порты существуют для пользы сообщества и, по сути, принадлежат сообществу. Это означает, что люди, не являющиеся сопровождающими, также могут вносить изменения в порт. Крупные изменения в коллекции портов могут потребовать правок во многих портах. Команда управления портами FreeBSD или члены других команд могут изменять порты для исправления проблем с зависимостями или других проблем, таких как обновление версии динамической библиотеки.
+
+Некоторые типы исправлений имеют "автоматическое согласование" от {portmgr}, что позволяет любому коммиттеру исправлять эти категории проблем в любом порте. Такие исправления не требуют одобрения от сопровождающего.
+
+Автоматическое согласование для большинства портов применяется к исправлениям, таким как изменения инфраструктуры, или тривиальным и _проверенным_ исправлениям сборки и выполнения. Текущий список доступен в extref:{committers-guide}[разделе Портов Руководства коммиттера, ports-qa-misc-blanket-approval].
====
-=== `ALWAYS_KEEP_DISTFILES`
+Другие изменения в порте будут отправлены сопровождающему на проверку и утверждение перед внесением. Если сопровождающий не отвечает на запрос об обновлении в течение двух недель (за исключением основных государственных праздников), это считается превышением времени ожидания сопровождающего, и обновление может быть внесено без его явного одобрения. Если сопровождающий не отвечает в течение трех месяцев или если произошло три последовательных превышения времени ожидания, то сопровождающий считается отсутствующим без уведомления, и все его порты могут быть возвращены в общий пул. Исключениями являются порты, сопровождаемые {portmgr} или {security-officer}. Никакие несанкционированные изменения не могут быть внесены в порты, сопровождаемые этими группами.
+
+Мы оставляем за собой право изменять представленные сопровождающим материалы, чтобы лучше соответствовать существующим политикам и стилю Коллекции портов, без явного одобрения отправителя или сопровождающего. Кроме того, масштабные инфраструктурные изменения могут привести к модификации порта без согласия сопровождающего. Подобные изменения никогда не повлияют на функциональность порта.
+
+{portmgr} оставляет за собой право отозвать или изменить права сопровождающего по любой причине, а {security-officer} оставляет за собой право отозвать или изменить права сопровождающего по соображениям безопасности.
+
+[[makefile-comment]]
+== `COMMENT`
+
+Комментарий — это однострочное описание порта, отображаемое командой `pkg info`. При составлении придерживайтесь следующих правил:
+
+. Строка COMMENT должна быть не длиннее 70 символов.
+. Не включайте название пакета или номер версии программного обеспечения.
+. Комментарий должен начинаться с заглавной буквы и заканчиваться без точки.
+. Не начинайте с неопределённого артикля (то есть A или An).
+. Пишите названия с заглавной буквы, например: Apache, JavaScript или Perl.
+. Используйте запятую для списков слов: "green, red, and blue."
+. Проверяйте на наличие орфографических ошибок.
+
+Вот пример:
+
+[.programlisting]
+....
+COMMENT= Cat chasing a mouse all over the screen
+....
+
+Переменная COMMENT следует сразу за переменной MAINTAINER в файле [.filename]#Makefile#.
+
+[[makefile-www]]
+== Веб-сайт проекта
+
+Каждый порт должен указывать на веб-сайт, предоставляющий дополнительную информацию о программном обеспечении.
+
+Везде, где это возможно, следует использовать официальный сайт проекта, поддерживаемый разработчиками программного обеспечения.
+
+[.programlisting]
+....
+WWW= https://ffmpeg.org/
+....
+
+Но это также может быть каталог или ресурс в репозитории исходного кода:
+
+[.programlisting]
+....
+WWW= https://sourceforge.net/projects/mpd/
+....
+
+Переменная WWW следует сразу за переменной COMMENT в файле [.filename]#Makefile#.
+
+Если один и тот же контент доступен по HTTP и HTTPS, следует использовать URL, начинающийся с `https://`. Если URI является корнем веб-сайта или директории, он должен заканчиваться косой чертой.
+
+Эта информация ранее размещалась в последней строке файла [.filename]#pkg-descr#. Она была перенесена в Makefile для удобства обслуживания и обработки. Наличие строки `WWW:` в конце файла [.filename]#pkg-descr# считается устаревшим.
+
+[[licenses]]
+== Лицензии
+
+Каждый порт должен содержать документацию о лицензии, под которой он распространяется. Если лицензия не одобрена OSI, необходимо также указать любые ограничения на распространение.
-Если ваш порт использует двоичные дистрибутивные файлы и обладает лицензией, требующей, чтобы исходный код предоставлялся вместе с пакетами, распространяемыми в двоичной форме, например GPL, то `ALWAYS_KEEP_DISTFILES` даст кластеру построения FreeBSD указание сохранять копию файлов, указанных в `DISTFILES`. Пользователям таких портов эти файлы в основном не нужны, поэтому хорошей идеей является добавление в `DISTFILES` исходных дистрибутивных файлов, только когда определена переменная `PACKAGE_BUILDING`.
+[[licenses-license]]
+=== `LICENSE`
-[[ports-master-sites-n-example-always-keep-distfiles]]
-.Использование `ALWAYS_KEEP_DISTFILES`.
+Краткое название лицензии или лицензий, если применяется более одной лицензии.
+
+Если это одна из лицензий, перечисленных в crossref:makefiles[licenses-license-list,Предопределенный список лицензий], можно задать только переменные `LICENSE_FILE` и `LICENSE_DISTFILES`.
+
+Если это лицензия, которая не определена в рамках портов (см. crossref:makefiles[licenses-license-list,Список предопределённых лицензий]), необходимо задать `LICENSE_PERMS` и `LICENSE_NAME`, а также `LICENSE_FILE` или `LICENSE_TEXT`. Также можно задать `LICENSE_DISTFILES` и `LICENSE_GROUPS`, но это не обязательно.
+
+Предопределенные лицензии показаны в crossref:makefiles[licenses-license-list,Список предопределенных лицензий]. Текущий список всегда доступен в [.filename]#Mk/bsd.licenses.db.mk#.
+
+[[licenses-license-ex1]]
+.Простейшее использование, предопределённые лицензии
[example]
====
+
+Когда в файле [.filename]#README# какого-либо программного обеспечения указано: «Данное программное обеспечение распространяется на условиях GNU Lesser General Public License, опубликованной Free Software Foundation; либо версии 2.1 Лицензии, либо (по вашему выбору) любой более поздней версии», но сам файл лицензии не предоставлен, используйте следующее:
+
[.programlisting]
....
-.if defined(PACKAGE_BUILDING)
-DISTFILES+= foo.tar.gz
-ALWAYS_KEEP_DISTFILES= yes
-.endif
+LICENSE= LGPL21+
+....
+
+Когда программное обеспечение предоставляет файл лицензии, используйте это:
+
+[.programlisting]
+....
+LICENSE= LGPL21+
+LICENSE_FILE= ${WRKSRC}/COPYING
....
====
-При добавлении дополнительных файлов в `DISTFILES` убедитесь, что вы их также добавляете в [.filename]#distinfo#. Кроме того, дополнительные файлы обычно распаковываются также в `WRKDIR`, что для некоторых портов может вызывать нежелательные подобные эффекты и требовать особую обработку.
+Для предопределённых лицензий права по умолчанию: `dist-mirror dist-sell pkg-mirror pkg-sell auto-accept`.
-[[makefile-maintainer]]
-== `MAINTAINER`
+[[licenses-license-list]]
+.Предопределенный список лицензий
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Короткое имя
+| Имя
+| Группа
+| Разрешения
+
+|`AGPLv3`
+|Универсальная общественная лицензия GNU Affero версии 3
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`AGPLv3+`
+|Универсальная общественная лицензия GNU Affero версии 3 (или позднее)
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`APACHE10`
+|Apache License 1.0
+|`FSF`
+|(по умолчанию)
+
+|`APACHE11`
+|Apache License 1.1
+|`FSF OSI`
+|(по умолчанию)
+
+|`APACHE20`
+|Apache License 2.0
+|`FSF OSI`
+|(по умолчанию)
+
+|`ART10`
+|Художественная лицензия версия 1.0
+|`OSI`
+|(по умолчанию)
+
+|`ART20`
+|Художественная лицензия версии 2.0
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`ARTPERL10`
+|Художественная лицензия (perl) версия 1.0
+|`OSI`
+|(по умолчанию)
+
+|`BSD`
+|Лицензия BSD, общая версия (устарела)
+|`FSF OSI COPYFREE`
+|(по умолчанию)
+
+|`BSD2CLAUSE`
+|BSD 2-пунктная лицензия "Упрощенная"
+|`FSF OSI COPYFREE`
+|(по умолчанию)
+
+|`BSD3CLAUSE`
+|BSD 3-пунктная лицензия "Новая" или "Пересмотренная"
+|`FSF OSI COPYFREE`
+|(по умолчанию)
+
+|`BSD4CLAUSE`
+|BSD 4-пунктная лицензия "Оригинальная" или "Старая"
+|`FSF`
+|(по умолчанию)
+
+|`BSL`
+|Лицензия программного обеспечения Boost
+|`FSF OSI COPYFREE`
+|(по умолчанию)
+
+|`CC-BY-1.0`
+|Creative Commons с указанием авторства 1.0
+|
+|(по умолчанию)
+
+|`CC-BY-2.0`
+|Creative Commons с указанием авторства 2.0
+|
+|(по умолчанию)
+
+|`CC-BY-2.5`
+|Creative Commons с указанием авторства 2.5
+|
+|(по умолчанию)
+
+|`CC-BY-3.0`
+|Creative Commons с указанием авторства 3.0
+|
+|(по умолчанию)
+
+|`CC-BY-4.0`
+|Creative Commons с указанием авторства 4.0
+|
+|(по умолчанию)
+
+|`CC-BY-NC-1.0`
+|Creative Commons с указанием авторства – некоммерческая 1.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-2.0`
+|Creative Commons с указанием авторства – некоммерческая 2.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-2.5`
+|Creative Commons с указанием авторства – некоммерческая 2.5
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-3.0`
+|Creative Commons с указанием авторства – некоммерческая 3.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-4.0`
+|Creative Commons с указанием авторства – некоммерческая 4.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-ND-1.0`
+|Creative Commons с указанием авторства – некоммерческая – без производных 1.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-ND-2.0`
+|Creative Commons с указанием авторства – некоммерческая – без производных 2.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-ND-2.5`
+|Creative Commons с указанием авторства – некоммерческая – без производных 2.5
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-ND-3.0`
+|Creative Commons с указанием авторства – некоммерческая – без производных 3.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-ND-4.0`
+|Creative Commons с указанием авторства – некоммерческая – без производных 4.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-SA-1.0`
+|Creative Commons с указанием авторства – некоммерческая – на тех же условиях 1.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-SA-2.0`
+|Creative Commons с указанием авторства – некоммерческая – на тех же условиях 2.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-SA-2.5`
+|Creative Commons с указанием авторства – некоммерческая – на тех же условиях 2.5
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-SA-3.0`
+|Creative Commons с указанием авторства – некоммерческая – на тех же условиях 3.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-NC-SA-4.0`
+|Creative Commons с указанием авторства – некоммерческая – на тех же условиях 4.0
+|
+|`dist-mirror``pkg-mirror``auto-accept`
+
+|`CC-BY-ND-1.0`
+|Creative Commons с указанием авторства – без производных 1.0
+|
+|(по умолчанию)
+
+|`CC-BY-ND-2.0`
+|Creative Commons с указанием авторства – без производных 2.0
+|
+|(по умолчанию)
+
+|`CC-BY-ND-2.5`
+|Creative Commons с указанием авторства – без производных 2.5
+|
+|(по умолчанию)
+
+|`CC-BY-ND-3.0`
+|Creative Commons с указанием авторства – без производных 3.0
+|
+|(по умолчанию)
+
+|`CC-BY-ND-4.0`
+|Creative Commons с указанием авторства – без производных 4.0
+|
+|(по умолчанию)
+
+|`CC-BY-SA-1.0`
+|Creative Commons с указанием авторства – на тех же условиях 1.0
+|
+|(по умолчанию)
+
+|`CC-BY-SA-2.0`
+|Creative Commons с указанием авторства – на тех же условиях 2.0
+|
+|(по умолчанию)
+
+|`CC-BY-SA-2.5`
+|Creative Commons с указанием авторства – на тех же условиях 2.5
+|
+|(по умолчанию)
+
+|`CC-BY-SA-3.0`
+|Creative Commons с указанием авторства – на тех же условиях 3.0
+|
+|(по умолчанию)
+
+|`CC-BY-SA-4.0`
+|Creative Commons с указанием авторства – на тех же условиях 4.0
+|
+|(по умолчанию)
+
+|`CC0-1.0`
+|Creative Commons Zero v1.0 Universal (Отказ от прав 1.0 Универсальная)
+|`FSF GPL COPYFREE`
+|(по умолчанию)
+
+|`CDDL`
+|Лицензия на совместную разработку и распространение
+|`FSF OSI`
+|(по умолчанию)
+
+|`CPAL-1.0`
+|Публичная лицензия общего распространения с указанием авторства
+|`FSF OSI`
+|(по умолчанию)
+
+|`ClArtistic`
+|Уточнённая художественная лицензия
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`EPL`
+|Публичная лицензия Eclipse
+|`FSF OSI`
+|(по умолчанию)
+
+|`GFDL`
+|GNU Свободная лицензия на документацию
+|`FSF`
+|(по умолчанию)
+
+|`GMGPL`
+|Модифицированная Общедоступная лицензия GNAT
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`GPLv1`
+|Универсальная общественная лицензия GNU версии 1
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`GPLv1+`
+|Универсальная общественная лицензия GNU версии 1 (или более поздняя)
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`GPLv2`
+|Универсальная общественная лицензия GNU версии 2
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`GPLv2+`
+|Универсальная общественная лицензия GNU версии 2 (или более поздняя)
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`GPLv3`
+|Универсальная общественная лицензия GNU версии 3
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`GPLv3+`
+|Универсальная общественная лицензия GNU версии 3 (или более поздняя)
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`GPLv3RLE`
+|Исключение для библиотеки времени выполнения GNU GPL версии 3
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`GPLv3RLE+`
+|Исключение для библиотеки времени выполнения GNU GPL версии 3 (или более поздняя)
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`ISCL`
+|Лицензия Internet Systems Consortium
+|`FSF GPL OSI COPYFREE`
+|(по умолчанию)
+
+|`LGPL20`
+|Общедоступная лицензия GNU для библиотек, версия 2.0
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`LGPL20+`
+|Общедоступная лицензия GNU для библиотек, версия 2.0 (или более поздняя)
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`LGPL21`
+|Универсальная общественная лицензия GNU ограниченного применения, версия 2.1
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`LGPL21+`
+|Универсальная общественная лицензия GNU ограниченного применения, версия 2.1 (или более поздняя)
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`LGPL3`
+|Универсальная общественная лицензия GNU ограниченного применения, версия 3
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`LGPL3+`
+|Универсальная общественная лицензия GNU ограниченного применения, версия 3 (или более поздней)
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`LPPL10`
+|Публичная лицензия проекта LaTeX, версия 1.0
+|`FSF OSI`
+|`dist-mirror dist-sell`
+
+|`LPPL11`
+|Публичная лицензия проекта LaTeX, версия 1.1
+|`FSF OSI`
+|`dist-mirror dist-sell`
+
+|`LPPL12`
+|Публичная лицензия проекта LaTeX, версия 1.2
+|`FSF OSI`
+|`dist-mirror dist-sell`
+
+|`LPPL13`
+|Публичная лицензия проекта LaTeX, версия 1.3
+|`FSF OSI`
+|`dist-mirror dist-sell`
+
+|`LPPL13a`
+|Публичная лицензия проекта LaTeX, версия 1.3a
+|`FSF OSI`
+|`dist-mirror dist-sell`
+
+|`LPPL13b`
+|Публичная лицензия проекта LaTeX, версия 1.3b
+|`FSF OSI`
+|`dist-mirror dist-sell`
+
+|`LPPL13c`
+|Публичная лицензия проекта LaTeX, версия 1.3c
+|`FSF OSI`
+|`dist-mirror dist-sell`
+
+|`MIT`
+|Лицензия MIT / Лицензия X11
+|`COPYFREE FSF GPL OSI`
+|(по умолчанию)
+
+|`MPL10`
+|Публичная лицензия Mozilla, версия 1.0
+|`FSF OSI`
+|(по умолчанию)
+
+|`MPL11`
+|Публичная лицензия Mozilla, версия 1.1
+|`FSF OSI`
+|(по умолчанию)
+
+|`MPL20`
+|Публичная лицензия Mozilla, версия 2.0
+|`FSF OSI`
+|(по умолчанию)
+
+|`NCSA`
+|Открытая лицензия Университета Иллинойса/NCSA
+|`COPYFREE FSF GPL OSI`
+|(по умолчанию)
+
+|`NONE`
+|Лицензия не указана
+|
+|`none`
+
+|`OFL10`
+|Лицензия SIL Open Font версия 1.0 (https://scripts.sil.org/OFL/)
+|`FONTS`
+|(по умолчанию)
+
+|`OFL11`
+|Лицензия SIL Open Font версия 1.1 (https://scripts.sil.org/OFL/)
+|`FONTS`
+|(по умолчанию)
+
+|`OWL`
+|Лицензия Открытых Произведений (owl.apotheon.org)
+|`COPYFREE`
+|(по умолчанию)
+
+|`OpenSSL`
+|Лицензия OpenSSL
+|`FSF`
+|(по умолчанию)
+
+|`PD`
+|Общественное достояние
+|`GPL COPYFREE`
+|(по умолчанию)
+
+|`PHP202`
+|Лицензия PHP версии 2.02
+|`FSF OSI`
+|(по умолчанию)
+
+|`PHP30`
+|Лицензия PHP версии 3.0
+|`FSF OSI`
+|(по умолчанию)
+
+|`PHP301`
+|Лицензия PHP версии 3.01
+|`FSF OSI`
+|(по умолчанию)
+
+|`PSFL`
+|Лицензия Python Software Foundation
+|`FSF GPL OSI`
+|(по умолчанию)
+
+|`PostgreSQL`
+|Лицензия PostgreSQL
+|`FSF GPL OSI COPYFREE`
+|(по умолчанию)
+
+|`RUBY`
+|Лицензия Ruby
+|`FSF`
+|(по умолчанию)
+
+|`UNLICENSE`
+|Отказ от лицензии (The Unlicense)
+|`COPYFREE FSF GPL`
+|(по умолчанию)
+
+|`WTFPL`
+|Публичная лицензия "Делай что хочешь" версия 2
+|`GPL FSF COPYFREE`
+|(по умолчанию)
+
+|`WTFPL1`
+|Публичная лицензия "Делай что хочешь" версия 1
+|`GPL FSF COPYFREE`
+|(по умолчанию)
+
+|`ZLIB`
+|Лицензия zlib
+|`GPL FSF OSI`
+|(по умолчанию)
+
+|`ZPL21`
+|Публичная лицензия Zope версия 2.1
+|`GPL OSI`
+|(по умолчанию)
+|===
-Укажите здесь ваш адрес электронной почты. Пожалуйста. _:-)_
+[[licenses-license_perms]]
+=== `LICENSE_PERMS` и `LICENSE_PERMS_NAME_`
-Заметьте, что в качестве значения для `MAINTAINER` допустимо использование только одного адреса без поля комментария. Должен использоваться формат `user@hostname.domain`. Пожалуйста, не включайте никакого описательного текста, например, вашего настоящего имени в эту строку-это несколько сбивает с толку [.filename]#bsd.port.mk#.
+Разрешения. Используйте `none`, если пусто.
-Сопровождающий ответственен за поддержание порта в актуальном состоянии и обеспечение правильной работы порта. За подробным описанием обязанностей сопровождающего порт обращайтесь к главе extref:{contributing}[The challenge for port maintainers, maintain-port].
+.Список разрешений лицензии
+[[licenses-license_perms-dist-mirror]]
+`dist-mirror`::
+Разрешается распространение дистрибутивных файлов. Дистрибутивные файлы будут добавлены в CDN `MASTER_SITE_BACKUP` FreeBSD.
-Перед фиксацией в репозитории изменения в порте будут отправлены сопровождающему для просмотра и одобрения. Если сопровождающий порта не ответил на запрос пользователя об обновлении в течение двух недель (исключая большие праздники), то это можно считать тайм-аутом сопровождающего, и обновление может быть выполнено без явного подтверждения от сопровождающего. Если сопровождающий не отвечает в течение трёх месяцев, то считается, что он отсутствует, и как сопровождающий порта, о котором идёт речь, может быть заменён. Исключениями из этого правила является всё, что сопровождает {portmgr} или {security-officer}. Запрещено делать любые несанкционированные изменения в портах, которые ведут эти группы.
+[[licenses-license_perms-no-dist-mirror]]
+`no-dist-mirror`::
+Распространение дистрибутивных файлов запрещено. Это эквивалентно установке crossref:special[porting-restrictions-restricted,`RESTRICTED`]. Дистрибутивные файлы _не_ будут добавлены в CDN `MASTER_SITE_BACKUP` FreeBSD.
-Мы оставляем за собой право изменять сообщение сопровождающего для лучшего соответствия существующим политикам и стилю Коллекции Портов без явного одобрения со стороны отправителя. Также, крупные изменения в инфраструктуре могут повлечь изменения в порте без согласия сопровождающего. Такой вид изменений никогда не будет затрагивать функциональность порта.
+[[licenses-license_perms-dist-sell]]
+`dist-sell`::
+Продажа файлов дистрибутива разрешена. Файлы дистрибутива будут присутствовать на образах установщика.
-За {portmgr} оставляется право снять или назначить кого-либо сопровождающим по любой причине, а за {security-officer} оставляется право лишать или назначать права на сопровождение порта по соображениям информационной безопасности.
+[[licenses-license_perms-no-dist-sell]]
+`no-dist-sell`::
+Продажа файлов дистрибутива запрещена. Это эквивалентно установке crossref:special[porting-restrictions-no_cdrom,`NO_CDROM`].
-[[makefile-comment]]
-== `COMMENT`
+[[licenses-license_perms-pkg-mirror]]
+`pkg-mirror`::
+Свободное распространение пакета разрешено. Пакет будет распространяться через CDN пакетов FreeBSD https://pkg.freebsd.org/[https://pkg.freebsd.org/].
-Содержит однострочное описание порта. Пожалуйста, соблюдайте следующие правила:
+[[licenses-license_perms-no-pkg-mirror]]
+`no-pkg-mirror`::
+Свободное распространение пакета запрещено. Эквивалентно установке crossref:special[porting-restrictions-no_package,`NO_PACKAGE`]. Пакет _не_ будет распространяться через FreeBSD CDN для пакетов https://pkg.freebsd.org/[https://pkg.freebsd.org/].
-. Старайтесь делать строку COMMENT длиной не больше, чем 70 символов, так как эта строка будет использована командой `pkg info` (см. man:pkg-info[8]) для отображения однострочного описания порта;
-. _Не_ включайте сюда название пакета (или номер версии программного обеспечения);
-. Комментарий должен начинаться с заглавной буквы и не заканчиваться точкой;
-. Не начинайте комментарий с неопределённого артикля (A или An);
-. Имена пишутся с заглавной буквы (например, Apache, JavaScript, Perl);
-. Для перечислений используйте английскую Оксфордскую запятую (англ. Oxford comma) (например, green, red, and blue);
-. Используйте программу проверки орфографии.
+[[licenses-license_perms-pkg-sell]]
+`pkg-sell`::
+Продажа пакета разрешена. Пакет будет присутствовать на образах установщика.
-Вот пример:
+[[licenses-license_perms-no-pkg-sell]]
+`no-pkg-sell`::
+Продажа пакета запрещена. Это эквивалентно установке crossref:special[porting-restrictions-no_cdrom,`NO_CDROM`]. Пакет _не_ будет присутствовать на образах установщика.
+
+[[licenses-license_perms-auto-accept]]
+`auto-accept`::
+Лицензия принимается по умолчанию. Запросы на принятие лицензии не отображаются, если пользователь не определил `LICENSES_ASK`. Используйте это, если в лицензии не указано, что пользователь должен принять условия лицензии.
+
+[[licenses-license_perms-no-auto-accept]]
+`no-auto-accept`::
+Лицензия не принимается по умолчанию. Пользователь всегда будет запрошен на подтверждение принятия данной лицензии. Это должно использоваться, если лицензия требует, чтобы пользователь принял её условия.
+
+Когда присутствуют и `_permission_`, и `no-_permission_`, то `no-_permission_` отменяет `_permission_`.
+
+Когда `_permission_` отсутствует, это считается как `no-_permission_`.
+
+[WARNING]
+====
+Некоторые отсутствующие разрешения могут сделать порт (и все зависящие от него порты) непригодными для использования пользователями пакетов:
+
+Порт без разрешения `auto-accept` никогда не будет собран, и все зависящие от него порты будут проигнорированы.
+
+Порт без разрешения `pkg-mirror`, а также любые порты, зависящие от него, будут удалены после сборки, что гарантирует их отсутствие в дистрибуции.
+====
+
+[[licenses-license_perms-ex1]]
+.Нестандартная лицензия
+[example]
+====
+Прочитайте условия лицензии и переведите их, используя доступные разрешения.
[.programlisting]
....
-COMMENT= Cat chasing a mouse all over the screen
+LICENSE= UNKNOWN
+LICENSE_NAME= unknown
+LICENSE_TEXT= This program is NOT in public domain.\
+ It can be freely distributed for non-commercial purposes only.
+LICENSE_PERMS= dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept
+....
+
+====
+
+[[licenses-license_perms-ex2]]
+.Стандартные и нестандартные лицензии
+[example]
+====
+
+Прочитайте условия лицензии и укажите их, используя доступные разрешения. В случае сомнений обратитесь за разъяснениями на {freebsd-ports}.
+
+[.programlisting]
+....
+LICENSE= WARSOW GPLv2
+LICENSE_COMB= multi
+LICENSE_NAME_WARSOW= Warsow Content License
+LICENSE_FILE_WARSOW= ${WRKSRC}/docs/license.txt
+LICENSE_PERMS_WARSOW= dist-mirror pkg-mirror auto-accept
+....
+
+Когда разрешения лицензий GPLv2 и UNKNOWN смешиваются, порт получает `dist-mirror dist-sell pkg-mirror pkg-sell auto-accept dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept`. Опции `no-_разрешения_` отменяют соответствующие _разрешения_. Итоговый список разрешений: _dist-mirror pkg-mirror auto-accept_. Файлы дистрибутива и пакеты не будут доступны в образах установщика.
+====
+
+[[licenses-license_groups]]
+=== `LICENSE_GROUPS` и `LICENSE_GROUPS_NAME`
+
+Группы, к которым принадлежит лицензия.
+
+.Список предопределенных групп лицензий
+[[licenses-license_groups-FSF]]
+`FSF`::
+Одобрено Free Software Foundation, см. https://www.fsf.org/licensing/[Команда по лицензированию и соответствию FSF].
+
+[[licenses-license_groups-GPL]]
+`GPL`::
+Совместимые с GPL
+
+[[licenses-license_groups-OSI]]
+`OSI`::
+Одобрено OSI, см. страницу https://opensource.org/licenses/[Открытых лицензий].
+
+[[licenses-license_groups-COPYFREE]]
+`COPYFREE`::
+Соответствует определению стандарта Copyfree, см. страницу https://copyfree.org/standard/licenses/[лицензий Copyfree].
+
+[[licenses-license_groups-FONTS]]
+`FONTS`::
+Лицензии на шрифты
+
+[[licenses-license_name]]
+=== `LICENSE_NAME` и `LICENSE_NAME_NAME`
+
+Полное название лицензии.
+
+[[licenses-license_name-ex1]]
+.`LICENSE_NAME`
+[example]
+====
+
+[.programlisting]
+....
+LICENSE= UNRAR
+LICENSE_NAME= UnRAR License
+LICENSE_FILE= ${WRKSRC}/license.txt
+LICENSE_PERMS= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept
....
-В файле [.filename]#Makefile# переменная COMMENT должна следовать сразу за переменной MAINTAINER.
+====
+
+[[licenses-license_file]]
+=== `LICENSE_FILE` и `LICENSE_FILE_NAME`
+
+Полный путь к файлу, содержащему текст лицензии, обычно [.filename]#${WRKSRC}/some/file#. Если файл отсутствует в дистрибутиве, а его содержимое слишком длинное для размещения в crossref:makefiles[licenses-license_text,`LICENSE_TEXT`], поместите его в новый файл в [.filename]#${FILESDIR}#.
+
+[[licenses-license_file-ex1]]
+.`LICENSE_FILE`
+[example]
+====
+
+[.programlisting]
+....
+LICENSE= GPLv3+
+LICENSE_FILE= ${WRKSRC}/COPYING
+....
+
+====
+
+[[licenses-license_text]]
+=== `LICENSE_TEXT` и `LICENSE_TEXT_NAME`
+
+Текст для использования в качестве лицензии. Полезно, когда лицензия отсутствует в файлах дистрибутива и её текст краток.
+
+[[licenses-license_text-ex1]]
+.`LICENSE_TEXT`
+[example]
+====
+[.programlisting]
+....
+LICENSE= UNKNOWN
+LICENSE_NAME= unknown
+LICENSE_TEXT= This program is NOT in public domain.\
+ It can be freely distributed for non-commercial purposes only,\
+ and THERE IS NO WARRANTY FOR THIS PROGRAM.
+LICENSE_PERMS= dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept
+....
+
+====
+
+[[licenses-license_distfiles]]
+=== `LICENSE_DISTFILES` и `LICENSE_DISTFILES_NAME`
+
+Файлы дистрибутива, к которым применяются лицензии. По умолчанию — все файлы дистрибутива.
+
+[[licenses-license_distfiles-ex1]]
+.`LICENSE_DISTFILES`
+[example]
+====
+Используется, когда файлы дистрибутива имеют разные лицензии. Например, один файл имеет лицензию на код, а другой содержит некоторые произведения искусства, которые нельзя распространять:
+
+[.programlisting]
+....
+MASTER_SITES= SF/some-game
+DISTFILES= ${DISTNAME}${EXTRACT_SUFX} artwork.zip
+
+LICENSE= BSD3CLAUSE ARTWORK
+LICENSE_COMB= dual
+LICENSE_NAME_ARTWORK= The game artwork license
+LICENSE_TEXT_ARTWORK= The README says that the files cannot be redistributed
+LICENSE_PERMS_ARTWORK= pkg-mirror pkg-sell auto-accept
+LICENSE_DISTFILES_BSD3CLAUSE= ${DISTNAME}${EXTRACT_SUFX}
+LICENSE_DISTFILES_ARTWORK= artwork.zip
+....
+
+====
+
+[[licenses-license_comb]]
+=== `LICENSE_COMB`
+
+Установите значение `multi`, если применяются все лицензии. Установите значение `dual`, если применяется любая из лицензий. По умолчанию используется значение `single`.
+
+[[licenses-license_comb-ex1]]
+.Двойные лицензии
+[example]
+====
+
+Когда порт содержит указание «Это программное обеспечение может распространяться под GNU General Public License или Artistic License», это означает, что можно использовать любую из этих лицензий. Используйте следующее:
+
+[.programlisting]
+....
+LICENSE= ART10 GPLv1
+LICENSE_COMB= dual
+....
+
+Если предоставлены файлы лицензий, используйте это:
+
+[.programlisting]
+....
+LICENSE= ART10 GPLv1
+LICENSE_COMB= dual
+LICENSE_FILE_ART10= ${WRKSRC}/Artistic
+LICENSE_FILE_GPLv1= ${WRKSRC}/Copying
+....
+
+====
+
+[[licenses-license_comb-ex2]]
+.Множественные лицензии
+[example]
+====
+
+Если часть порта имеет одну лицензию, а другая часть — другую, используйте `multi`:
+
+[.programlisting]
+....
+LICENSE= GPLv2 LGPL21+
+LICENSE_COMB= multi
+....
+
+====
[[makefile-portscout]]
== `PORTSCOUT`
-Portscout являет собой автоматизированное средство проверки доступности дистрибутивных файлов для Коллекции Портов FreeBSD, подробное описание которого предоставляет crossref:keeping-up[distfile-survey, Portscout: сканер дистрибутивных файлов портов FreeBSD].
+Portscout — это автоматизированная утилита проверки distfile для Коллекции портов FreeBSD, подробно описанная в crossref:keeping-up[distfile-survey,Portscout: сканирование distfile портов FreeBSD].
+
+`PORTSCOUT` определяет специальные условия, в рамках которых работа сканера дистрибутивных файлов Portscout ограничена.
-Переменная `PORTSCOUT` задаёт специальные условия, ограничивающие работу Portscout - сканера дистрибутивных файлов.
+Ситуации, когда установлена переменная `PORTSCOUT`, включают:
-Ситуации, при которых следует указывать переменную `PORTSCOUT`:
+* Когда необходимо игнорировать distfiles для определённых версий. Например, чтобы исключить версию _8.2_ и версию _8.3_ из проверок версий distfiles, так как известно, что они неработоспособны, добавьте:
++
+[.programlisting]
+....
+PORTSCOUT= skipv:8.2,8.3
+....
-* Когда должны игнорироваться дистрибутивные файлы для конкретных версий или младших ревизий. Например, чтобы исключить из проверок новых версий дистрибутивных файлов версию _8.2_ по причине того, что она является поломанной, добавьте следующее:
+* Когда проверки версий distfile необходимо полностью отключить. Например, если порт больше не будет обновляться, добавьте:
+
[.programlisting]
....
-PORTSCOUT= ignore:8.2
+PORTSCOUT= ignore:1
....
-* Когда должны проверяться конкретные версии или старшие и младшие ревизии дистрибутивных файлов. Например, если следует ограничиться проверкой версии _0.6.4_, потому что более новые версии имеют проблемы совместимости с FreeBSD, добавьте:
+* Когда необходимо проверять конкретные версии или определенные мажорные и минорные редакции distfile. Например, если нужно отслеживать только версию _0.6.4_, потому что более новые версии имеют проблемы совместимости с FreeBSD, добавьте:
+
[.programlisting]
....
PORTSCOUT= limit:^0\.6\.4
....
-* Когда URL, в которых указаны доступные версии, отличаются от URL их загрузки. Например, чтобы привязать проверку новых версий дистрибутивных файлов к странице загрузки для порта package:databases/pgtune[], добавьте:
+* Когда URL-адреса, перечисляющие доступные версии, отличаются от URL-адресов загрузки. Например, чтобы ограничить проверку версий distfile страницей загрузки для пакета: package:databases/pgtune[] добавьте:
+
[.programlisting]
....
-PORTSCOUT= site:http://pgfoundry.org/frs/?group_id=1000416
+PORTSCOUT= site:http://www.renpy.org/dl/release/
....
[[makefile-depend]]
== Зависимости
-Многие порты зависят от других портов. Это очень удобная замечательная особенность большинства Unix-подобных операционных систем, включая FreeBSD. Множество портов могут использовать общую зависимость совместно, а не включать её в состав каждого порта или пакета, который в ней нуждается. Имеется семь переменных, которые вы можете использовать для обеспечения того, что всё требуемое находится на машине пользователя. Имеется также несколько предопределённых переменных, отражающих зависимости для общих случаев, плюс ещё несколько для управления поведением зависимостей.
+Многие порты зависят от других портов. Это очень удобная особенность большинства Unix-подобных операционных систем, включая FreeBSD. Несколько портов могут использовать общую зависимость вместо того, чтобы включать эту зависимость в каждый порт или пакет, который в ней нуждается. Существует семь переменных, которые можно использовать для обеспечения наличия всех необходимых компонентов на машине пользователя. Также есть предопределенные переменные зависимостей для распространенных случаев и несколько дополнительных для управления поведением зависимостей.
+
+[IMPORTANT]
+====
+Когда у программного обеспечения есть дополнительные зависимости, предоставляющие дополнительные возможности, основные зависимости, перечисленные в `*_DEPENDS`, должны включать те дополнительные зависимости, которые будут полезны большинству пользователей. Основные зависимости никогда не должны быть "минимальным" набором зависимостей. Цель состоит не в том, чтобы включить все возможные зависимости. Включайте только те, которые будут полезны большинству людей.
+====
+[[makefile-lib_depends]]
=== `LIB_DEPENDS`
-Эта переменная указывает, от каких совместно используемых библиотек зависит порт. Это список пар lib:dir, где _lib_ - это имя библиотеки, _dir_ - это каталог, в котором можно ее найти в случае, если ее нет на машине. Например,
+Эта переменная определяет разделяемые библиотеки, от которых зависит данный порт. Это список кортежей вида `_lib:dir_`, где `_lib_` — имя разделяемой библиотеки, а `_dir_` — директория, в которой её следует искать, если она недоступна. Например,
[.programlisting]
....
-LIB_DEPENDS= libjpeg.so:${PORTSDIR}/graphics/jpeg
+LIB_DEPENDS= libjpeg.so:graphics/jpeg
....
-проверит наличие библиотеки jpeg с любым номером версии и перейдет в подкаталог [.filename]#graphics/jpeg# вашего дерева портов для ее построения и установки, если библиотека отсутствует.
+проверит наличие общей библиотеки jpeg с любой версией и перейдет в подкаталог [.filename]#graphics/jpeg# дерева портов, чтобы собрать и установить её, если она не найдена.
-Зависимость проверяется дважды, один раз внутри цели `build`, а затем из цели `install`. Кроме того, имя зависимости помещается в пакет, так что `pkg install` (см. man:pkg-install[8]) будет автоматически её устанавливать, если её нет на пользовательской системе.
+Зависимость проверяется дважды: один раз внутри цели `build` и затем внутри цели `install`. Также имя зависимости добавляется в пакет, чтобы `pkg install` (см. man:pkg-install[8]) автоматически установил её, если её нет в системе пользователя.
+[[makefile-run_depends]]
=== `RUN_DEPENDS`
-В этой переменной перечисляются выполнимые файлы или файлы, от которых зависит работа порта. Это список пар вида path:dir:target, где _path_ - это имя программы или файла, а _dir_ - каталог, в котором можно найти порт в случае, если его нет в системе, и _target_ - это цель, которую нужно вызвать в этом каталоге. Если _path_ начинается со слэша (`/`), он воспринимается как файл и его существование проверяется командой `test -e`; в противном случае предполагается, что это выполнимый файл, и для определения того, имеется ли программа в пути поиска, используется команда `which -s`.
+Эта переменная определяет исполняемые файлы или файлы, от которых зависит порт во время выполнения. Это список кортежей ``_path:dir_``[:``_target_``], где `_path_` — это имя исполняемого файла или файла, _dir_ — директория, в которой его следует искать, если он недоступен, а _target_ — цель, которую нужно вызвать в этой директории. Если _path_ начинается с косой черты (`/`), он считается файлом, и его существование проверяется с помощью `test -e`; в противном случае предполагается, что это исполняемый файл, и `which -s` используется для проверки наличия программы в пути поиска.
Например,
[.programlisting]
....
-RUN_DEPENDS= ${LOCALBASE}/news/bin/innd:${PORTSDIR}/news/inn \
- xmlcatmgr:${PORTSDIR}/textproc/xmlcatmgr
+RUN_DEPENDS= ${LOCALBASE}/news/bin/innd:news/inn \
+ xmlcatmgr:textproc/xmlcatmgr
....
-проверит существование файла или каталога [.filename]#/usr/local/news/bin/innd#, и если ничего не будет найдено, то построит и установит порт из подкаталога [.filename]#news/inn# дерева портов. Также будет выполнена проверка, присутствует ли в пути поиска исполняемый файл с именем `xmlcatmgr`, и перейдет в подкаталог [.filename]#textproc/xmlcatmgr# вашего дерева портов для его построения и установки, если он не будет найден.
+проверит, существует ли файл или каталог [.filename]#/usr/local/news/bin/innd#, и соберет и установит его из подкаталога [.filename]#news/inn# дерева портов, если он не найден. Также будет проверено, находится ли исполняемый файл `xmlcatmgr` в пути поиска, и если он не найден, будет выполнен переход в [.filename]#textproc/xmlcatmgr# для сборки и установки.
[NOTE]
====
-В приведенном примере `innd` является выполнимым файлом; если выполнимый файл находится в месте, которое отсутствует в списке путей файлов, то вы должны указать полный путь к файлу.
+В этом случае `innd` является исполняемым файлом; если исполняемый файл находится в месте, которое не ожидается в пути поиска, используйте полный путь.
====
[NOTE]
====
-Официальным значением переменной поиска `PATH`, используемым в кластере построения портов является
+Официальный путь поиска `PATH`, используемый в кластере сборки портов
[.programlisting]
....
@@ -1333,361 +3211,333 @@ RUN_DEPENDS= ${LOCALBASE}/news/bin/innd:${PORTSDIR}/news/inn \
====
-Зависимость проверяется внутри цели `install`. Кроме того, имя зависимости помещается в пакет, так что `pkg install` (см. man:pkg-install[8]) будет автоматически его устанавливать, если он не будет найден в пользовательской системе. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+Зависимость проверяется внутри цели `install`. Также имя зависимости добавляется в пакет, чтобы команда `pkg install` (см. man:pkg-install[8]) автоматически установила её, если она отсутствует в системе пользователя. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
-Довольно распространенной является ситуация, когда `RUN_DEPENDS` буквально такая же как `BUILD_DEPENDS`, особенно если переносимое программное обеспечение написано на языке сценариев, или если оно требует такое же окружение для исполнения, как и используемое во время построения. В этом случае, очень заманчивым или довольно естественным является присвоение одного другому:
+Довольно распространённая ситуация, когда `RUN_DEPENDS` буквально совпадает с `BUILD_DEPENDS`, особенно если портируемое программное обеспечение написано на скриптовом языке или требует одинаковой среды для сборки и выполнения. В этом случае возникает соблазн и интуитивное желание напрямую присвоить одно другому:
[.programlisting]
....
RUN_DEPENDS= ${BUILD_DEPENDS}
....
-Тем не менее, подобные присвоения могут загрязнять зависимости времени исполнения содержимым, не заданным в `BUILD_DEPENDS` исходного порта. Такое случается из-за ленивого вычисления в man:make[1] присваиваемых переменных. Представьте [.filename]#Makefile# с переменными `USE_*`, которые обрабатываются в [.filename]#ports/Mk/bsd.*.mk# для пополнения первоначальных зависимостей построения. Например, `USES= gmake` добавляет package:devel/gmake[] в `BUILD_DEPENDS`. Для предотвращения загрязнения `RUN_DEPENDS` подобными дополнительными зависимостями проявляйте осторожность с присвоением с раскрытием, т.е. с раскрытием значения перед его присвоением переменной:
+Однако такое присваивание может загрязнить зависимости во время выполнения записями, не определёнными в оригинальном `BUILD_DEPENDS` порта. Это происходит из-за ленивого вычисления присваивания переменных в man:make[1]. Рассмотрим [.filename]#Makefile# с `USE_*`, которые обрабатываются [.filename]#ports/Mk/bsd.*.mk# для добавления начальных зависимостей сборки. Например, `USES= gmake` добавляет package:devel/gmake[] в `BUILD_DEPENDS`. Чтобы предотвратить попадание таких дополнительных зависимостей в `RUN_DEPENDS`, создайте другую переменную с текущим содержимым `BUILD_DEPENDS` и присвойте её как `BUILD_DEPENDS`, так и `RUN_DEPENDS`:
[.programlisting]
....
-RUN_DEPENDS:= ${BUILD_DEPENDS}
+MY_DEPENDS= some:devel/some \
+ other:lang/other
+BUILD_DEPENDS= ${MY_DEPENDS}
+RUN_DEPENDS= ${MY_DEPENDS}
....
+[IMPORTANT]
+====
+_Не используйте_ `:=` для присваивания `BUILD_DEPENDS` в `RUN_DEPENDS` или наоборот. Все переменные раскрываются немедленно, что является совершенно неправильным и почти всегда приводит к ошибке.
+====
+
+[[makefile-build_depends]]
=== `BUILD_DEPENDS`
-В этой переменной перечисляются выполнимые или обычные файлы, которые требуются порту для его построения. Как и `RUN_DEPENDS`, это список пар path:dir:target. Например,
+Эта переменная указывает исполняемые файлы или файлы, необходимые для сборки данного порта. Как и `RUN_DEPENDS`, это список кортежей ``_path:dir_``[:``_target_``]. Например,
[.programlisting]
....
-BUILD_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
+BUILD_DEPENDS= unzip:archivers/unzip
....
-будет проверять наличие выполнимого фала с именем `unzip` и перейдет в подкаталог [.filename]#archivers/unzip# вашего дерева портов для его построения и установки, если последний не будет найден.
+проверит наличие исполняемого файла с именем `unzip` и перейдет в подкаталог [.filename]#archivers/unzip# дерева портов, чтобы собрать и установить его, если он не будет найден.
[NOTE]
====
-Под "построением" здесь понимается всё, от распаковки до компиляции. Зависимость проверяется из цели `extract`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+"build" здесь означает все процессы от извлечения до компиляции. Зависимость проверяется внутри цели `extract`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`
====
+[[makefile-fetch_depends]]
=== `FETCH_DEPENDS`
-В этой переменной перечисляются выполняемые файлы или просто файлы, которые требуются порту для сгрузки. Как и предыдущие две переменные, это список пар path:dir:target. Например,
+Эта переменная определяет исполняемые файлы или файлы, необходимые для загрузки этого порта. Как и предыдущие две, это список кортежей ``_path:dir_``[:``_target_``]. Например,
[.programlisting]
....
-FETCH_DEPENDS= ncftp2:${PORTSDIR}/net/ncftp2
+FETCH_DEPENDS= ncftp2:net/ncftp2
....
-будет проверять наличие выполняемого файла с именем `ncftp2` и перейдет в каталог [.filename]#net/ncftp2# вашего дерева портов для его построения и установки, если тот не будет найден.
+проверит наличие исполняемого файла с именем `ncftp2` и перейдет в подкаталог [.filename]#net/ncftp2# дерева портов для сборки и установки, если файл не будет найден.
-Зависимость проверяется при выполнении цели `fetch`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+Зависимость проверяется внутри цели `fetch`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+[[makefile-extract_depends]]
=== `EXTRACT_DEPENDS`
-В этой переменной указываются программы или файлы, которые требуются для распаковки порта. Как и в предыдущих случаях, это список пар вида path:dir:target. Например,
+Эта переменная указывает исполняемые файлы или файлы, которые требуются для извлечения данного порта. Как и предыдущая, это список кортежей ``_path:dir_``[:``_target_``]. Например,
[.programlisting]
....
-EXTRACT_DEPENDS= unzip:${PORTSDIR}/archivers/unzip
+EXTRACT_DEPENDS= unzip:archivers/unzip
....
-будет проверять наличие программы с именем `unzip`, и перейдёт в подкаталог [.filename]#archivers/unzip# вашего дерева портов для её построения и установки, если такой программы не будет найдено.
+проверит наличие исполняемого файла с именем `unzip` и перейдет в подкаталог [.filename]#archivers/unzip# дерева портов, чтобы собрать и установить его, если он не будет найден.
Зависимость проверяется внутри цели `extract`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
[NOTE]
====
-Используйте эту переменную, только если распаковка не работает (по умолчанию предполагается использование `gzip`) и это не исправляется при помощи `USE_ZIP` или `USE_BZIP2`, которые описаны в <<use-vars>>.
+Используйте эту переменную только если извлечение уже не работает (по умолчанию предполагается `tar`) и не может быть исправлено с помощью `USES=tar`, `USES=lha` или `USES=zip`, как описано в crossref:uses[uses,Использование макросов `USES`].
====
+[[makefile-patch_depends]]
=== `PATCH_DEPENDS`
-Эта переменная указывает на программы или файлы, которые нужны порту для применения патчей. Как и в предыдущих случаях, это список пар вида path:dir:target. Например,
+Эта переменная указывает исполняемые файлы или файлы, которые требуются этому порту для применения патчей. Как и предыдущая, это список кортежей ``_path:dir_``[:``_target_``]. Например,
[.programlisting]
....
-PATCH_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/java/jfc:extract
+PATCH_DEPENDS= ${NONEXISTENT}:java/jfc:extract
....
-будет переходить в подкаталог [.filename]#java/jfc# вашего дерева портов для распаковки.
+будет спускаться в подкаталог [.filename]#java/jfc# дерева портов для его извлечения.
-Зависимость проверяется внутри цели `patch`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
+Зависимость проверяется в рамках цели `patch`. Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`.
-[[uses-makefiles]]
+[[makefile-uses]]
=== `USES`
-Могут быть добавлены параметры для определения различных характерных особенностей и зависимостей, которыми обладает данный порт. Они указываются путём добавления в [.filename]#Makefile# этой строки:
+Параметры могут быть добавлены для определения различных функций и зависимостей, используемых портом. Они указываются путем добавления этой строки в [.filename]#Makefile#:
[.programlisting]
....
USES= feature[:arguments]
....
-Для получения полного списка значений смотрите <<uses-makefiles>>.
+Для полного списка значений обратитесь к crossref:uses[uses,Использование макросов `USES`].
[WARNING]
====
-
-Значение `USES` нельзя присваивать после подключения [.filename]#bsd.port.pre.mk#.
+`USES` нельзя назначать после включения [.filename]#bsd.port.pre.mk#.
====
-[[use-vars]]
+[[makefile-use-vars]]
=== `USE_*`
-Для определения общих зависимостей, совместно используемых многими портами, предназначено несколько переменных. Их использование является необязательным, но помогает упростить избыточность файлов [.filename]#Makefile# порта. Каждый из них оформляется как `USE_*`. Эти переменные можно использовать только в [.filename]#Makefile# порта и [.filename]#ports/Mk/bsd.*.mk#. Они не предназначены для установки пользователями параметров - используйте для этих целей `PORT_OPTIONS`.
+Существует несколько переменных для определения общих зависимостей, используемых многими портами. Их использование необязательно, но помогает сократить многословность [.filename]##Makefile## портов. Каждая из них оформлена как `USE_*`. Эти переменные могут использоваться только в [.filename]##Makefile## портов и [.filename]#ports/Mk/bsd.*.mk#. Они не предназначены для настраиваемых пользователем опций — для этой цели используйте `PORT_OPTIONS`.
[NOTE]
====
-Установка любых `USE_*` в [.filename]#/etc/make.conf# _всегда_ является ошибочным действием. В частности, установка
+Всегда неправильно устанавливать любые `USE_*` в [.filename]#/etc/make.conf#. Например, установка
[.programlisting]
....
USE_GCC=X.Y
....
-(где X.Y соответствует версии) добавит зависимость от gccXY к каждому порту, включая и сам `lang/gccXY`!
+(где X.Y — номер версии) добавит зависимость от gccXY для каждого порта, включая сам `lang/gccXY`!
====
-.Переменные `USE_*`
+[[makefile-use-vars-table]]
+.`USE_*`
[cols="1,1", frame="none", options="header"]
|===
| Переменная
| Значение
-|`USE_BZIP2`
-|tar-архивы порта упакованы при помощи `bzip2`.
+|`USE_GCC`
+a|
-|`USE_ZIP`
-|tar-архивы порта упакованы при помощи `zip`.
+Порт требует GCC (`gcc` или `{g-plus-plus}`) для сборки.
+Некоторые порты нуждаются в определённой, старой версии GCC, другие требуют современных, актуальных версий.
+Обычно устанавливается в `yes` (означает всегда использовать стабильную, современную версию GCC из портов, согласно `GCC_DEFAULT` в [.filename]#Mk/bsd.default-versions.mk#).
+Это также значение по умолчанию.
+Точная версия также может быть указана, например, значением `10`.
+GCC из базовой системы используется, если он удовлетворяет запрашиваемой версии, в противном случае подходящий компилятор собирается из портов, а `CC` и `CXX` корректируются соответствующим образом.
+Аргумент `:build`, следующий за указанием версии, добавляет только зависимость во время сборки порта.
+
+Например:
+[example]
+====
+[.programlisting]
+....
+USE_GCC=yes # порт требует текущей версии GCC
+USE_GCC=11:build # порт требует GCC 11 только во время сборки
+....
+====
+
+[NOTE]
+====
+`USE_GCC=any` устарел и не должен использоваться в новых портах
+====
-|`USE_GCC`
-|Для сборки порта требуется GCC (gcc или {gcc-plus-plus}). Некоторым портам подходит любая версия, для других требуются последние современные версии. Обычно используется со значением `any` (в этом случае используется встроенный GCC в тех версиях FreeBSD, в состав которых он всё ещё входит, или устанавливается порт `lang/gcc`, когда Clang является компилятором C/C++ по умолчанию) или `yes` (всегда используется стабильная современная версия GCC из порта `lang/gcc`). Также в значении переменной можно указать точную версию, например `4.7`. Минимально допустимую версию можно указать как `4.6+`. GCC из основной системы используется в случае, если его версия удовлетворяет запрошенной, иначе собирается подходящая версии компилятора из порта с соответствующей коррекцией переменных `CC` и `CXX`.
|===
-Переменные, относящиеся к gmake и сценарию [.filename]#configure#, описаны в crossref:special[building, Механизмы построения], а autoconf, automake и libtool описаны в crossref:special[using-autotools, Использование GNU Autotools]. Переменные, связанные с Perl, описаны в crossref:special[using-perl, Использование Perl]. Переменные X11 перечислены в crossref:special[using-x11, Использование X11]. crossref:special[using-gnome, Использование GNOME] работает с переменными GNOME и crossref:special[using-kde, Использование KDE] с KDE. crossref:special[using-java, Использование Java] описывает переменные Java, а crossref:special[using-php, Веб-приложения, Apache и PHP] содержит информацию об Apache, PHP и модулях PEAR. Python обсуждается в crossref:special[using-python, Использование Python], а Ruby в crossref:special[using-ruby, Использование Ruby]. crossref:special[using-sdl, Использование SDL] предоставляет переменные, используемые для приложений SDL, и, наконец, crossref:special[using-xfce, Использование Xfce] содержит информацию о приложении Xfce.
+Переменные, связанные с gmake и [.filename]#configure#, описаны в crossref:special[building,Механизмы сборки], тогда как autoconf, automake и libtool описаны в crossref:special[using-autotools,Использование GNU Autotools]. Переменные, связанные с Perl, описаны в crossref:special[using-perl,Использование Perl]. Переменные X11 перечислены в crossref:special[using-x11,Использование X11]. crossref:special[using-gnome,Использование GNOME] посвящено GNOME, а crossref:special[using-kde,Использование KDE] — переменным, связанным с KDE. crossref:special[using-java,Использование Java] документирует переменные Java, тогда как crossref:special[using-php,Веб-приложения, Apache и PHP] содержит информацию о модулях Apache, PHP и PEAR. Python обсуждается в crossref:special[using-python,Использование Python], а Ruby — в crossref:special[using-ruby,Использование Ruby]. crossref:special[using-sdl,Использование SDL] предоставляет переменные, используемые для приложений SDL, и, наконец, crossref:special[using-xfce,Использование Xfce] содержит информацию о Xfce.
-=== Минимальная версия зависимости
+[[makefile-version-dependency]]
+=== Минимальная версия зависимого пакета
-Минимальная версия зависимости может быть указана в любой переменной `*_DEPENDS`, за исключением `LIB_DEPENDS`, с использованием следующего синтаксиса:
+Минимальная версия зависимого пакета может быть указана в любом `*_DEPENDS`, кроме `LIB_DEPENDS`, используя следующий синтаксис:
[.programlisting]
....
-p5-Spiffy>=0.26:${PORTSDIR}/devel/p5-Spiffy
+p5-Spiffy>=0.26:devel/p5-Spiffy
....
-Первое поле содержит название зависимого пакета, которое обязано совпадать с записью в базе данные пакетов, знак сравнения и версию пакета. Зависимость удовлетворяется, если на машине установлен p5-Spiffy-0.26 или новее.
+Первое поле содержит имя зависимого пакета, которое должно соответствовать записи в базе данных пакетов, знак сравнения и версию пакета. Зависимость считается удовлетворённой, если на машине установлен p5-Spiffy-0.26 или новее.
-=== Замечания касательно зависимостей
+[[makefile-note-on-dependencies]]
+=== Заметки о зависимостях
-Как уже отмечено выше, целью, которая вызывается по умолчанию в случае, когда это требует зависимость, является `DEPENDS_TARGET`. Она по умолчанию есть `install`. Это пользовательская переменная; она нигде не определена в файле [.filename]#Makefile# порта. Если вашему порту требуется особый метод обработки зависимости, воспользуйтесь частью `:target` переменной `*_DEPENDS` вместо того, чтобы переопределять `DEPENDS_TARGET`.
+Как упомянуто выше, цель по умолчанию, вызываемая при необходимости зависимости, — это `DEPENDS_TARGET`. По умолчанию она установлена в `install`. Это пользовательская переменная; она никогда не определяется в [.filename]#Makefile# порта. Если порту требуется особый способ обработки зависимости, используйте часть `:target` в `*_DEPENDS` вместо переопределения `DEPENDS_TARGET`.
-Когда вы набираете команду `make clean`, эта операция также выполняется и над зависимостями этого порта. Если вы не хотите, чтобы это случилось, определите переменную `NOCLEANDEPENDS` в вашем окружении. Это может быть особенно нужным, если порт имеет нечто, что занимает много времени на построение, в своём списке зависимостей, например, KDE, GNOME или Mozilla.
+При выполнении `make clean` зависимости портов также автоматически очищаются. Если это нежелательно, определите переменную `NOCLEANDEPENDS` в окружении. Это может быть особенно полезно, если среди зависимостей порта есть что-то, что требует много времени для пересборки, например KDE, GNOME или Mozilla.
-Чтобы безусловно зависеть от другого порта, укажите переменную `${NONEXISTENT}` в качестве первого поля переменной `BUILD_DEPENDS` или `RUN_DEPENDS`. Пользуйтесь этим, только когда вам нужно иметь исходный код другого порта. Вы можете сэкономить время на компиляции, указав также и цель. Например,
+Для безусловной зависимости от другого порта используйте переменную `${NONEXISTENT}` в качестве первого поля `BUILD_DEPENDS` или `RUN_DEPENDS`. Используйте это только в случае, когда необходим исходный код другого порта. Время компиляции можно сократить, указав также цель. Например
[.programlisting]
....
-BUILD_DEPENDS= ${NONEXISTENT}:${PORTSDIR}/graphics/jpeg:extract
+BUILD_DEPENDS= ${NONEXISTENT}:graphics/jpeg:extract
....
-всегда будет переходить в каталог с портом `jpeg` и распаковывать его.
+всегда будет переходить к порту `jpeg` и извлекать его.
-=== Зацикленные зависимости фатальны
+[[makefile-circular-dependencies]]
+=== Циклические зависимости фатальны
[IMPORTANT]
====
-Не помещайте зацикливающиеся зависимости в дерево портов!
+Не создавайте циклических зависимостей в дереве портов!
====
-Технология построения портов не защищена от зацикленных зависимостей. Если вы создадите такую, то у кого-нибудь и где-нибудь установка FreeBSD будет немедленно сломана, а у остальных сломается несколько позже. Это на самом деле очень трудно распознать; если вы сомневаетесь, то перед внесением изменений проверьте, что выполнили следующее: `cd /usr/ports; make index`. Этот процесс может быть достаточно медленным на старых машинах, хотя вы сможете спасти большое количество людей-включая себя-от грядущих бед.
+Технология сборки портов не допускает циклических зависимостей. Если такая зависимость будет добавлена, у кого-то в мире почти сразу окажется сломанной установка FreeBSD, а за этим последуют многие другие. Подобные проблемы бывает очень сложно обнаружить. Если есть сомнения, перед внесением изменений обязательно выполните: `cd /usr/ports; make index`. Этот процесс может быть довольно медленным на старых машинах, но он способен избавить множество людей, включая вас, от серьёзных проблем.
-=== Автоматические зависимости и проблемы, которые они вызывают
+[[makefile-automatic-dependencies]]
+=== Проблемы, вызванные автоматическими зависимостями
-Зависимости должны быть указаны либо явно, либо с использованием <<makefile-options,фреймворка OPTIONS>>. Использование прочих методов, таких как автоматическое обнаружение зависимостей, усложняет индексирование, что вызывает проблемы в управлении портами и пакетами.
+Зависимости должны быть объявлены явно или с использованием crossref:makefiles[makefile-options,OPTIONS framework]. Использование других методов, таких как автоматическое обнаружение, усложняет индексацию, что вызывает проблемы для управления портами и пакетами.
-.Некорректное объявление необязательной зависимости
+[[makefile-automatic-dependencies-bad]]
+.Неправильное объявление необязательной зависимости
[example]
====
+
[.programlisting]
....
.include <bsd.port.pre.mk>
.if exists(${LOCALBASE}/bin/foo)
-LIB_DEPENDS= libbar.so:${PORTSDIR}/foo/bar
+LIB_DEPENDS= libbar.so:foo/bar
.endif
....
====
-Проблема автоматического добавления зависимостей заключается в том, что файлы и настройки за пределами порта могут произвольно меняться. Пример: после построения индекса устанавливается набор портов. При этом один из них устанавливает проверяемый файл. На этом этапе индекс будет неправильным, потому что установленный порт неожиданно получит новую зависимость. Индекс может быть по прежнему неправильным даже после его перестроения, в случае если другие порты также определят дополнительные зависимости, основываясь на существовании других файлов.
+Проблема с попыткой автоматического добавления зависимостей заключается в том, что файлы и настройки за пределами отдельного порта могут измениться в любой момент. Например: индекс строится, затем устанавливается группа портов. Но один из портов устанавливает проверяемый файл. Теперь индекс неверен, потому что у установленного порта неожиданно появилась новая зависимость. Индекс может оставаться неверным даже после пересборки, если другие порты также определяют свою потребность в зависимостях на основе существования других файлов.
-.Корректное объявление необязательной зависимости
+[[makefile-automatic-dependencies-good]]
+.Правильное объявление необязательной зависимости
[example]
====
+
[.programlisting]
....
OPTIONS_DEFINE= BAR
-BAR_DESC= Bar support
+BAR_DESC= Calling cellphones via bar
-.include <bsd.port.options.mk>
-
-.if ${PORT_OPTIONS:MBAR}
-LIB_DEPENDS= libbar.so:${PORTSDIR}/foo/bar
-.endif
+BAR_LIB_DEPENDS= libbar.so:foo/bar
....
====
-Правильным способом является проверка переменных параметров. Этот способ не приводит к несоответствиям в индексе набора портов, поскольку параметры определены до построения индекса. При этом можно использовать простые скрипты для автоматизации построения, установки и обновления этих портов и соответствующих им пакетов.
-
-[[use-want]]
-=== `USE_` и `WANT_`
-
-Переменные `USE_` задаются мейнтейнером порта для определения программного обеспечения, от которого этот порт зависит. Порт, для которого нужен Firefox, укажет
-
-[.programlisting]
-....
-USE_FIREFOX= yes
-....
-
-Некоторые переменные `USE_` могут принимать номера версий или другие параметры. Например, порт, который требует Apache 2.2, укажет
+Проверка переменных опций является правильным методом. Это не вызовет несоответствий в индексе группы портов, при условии что опции были определены до сборки индекса. Затем можно использовать простые скрипты для автоматизации сборки, установки и обновления этих портов и их пакетов.
-[.programlisting]
-....
-USE_APACHE= 22
-....
-
-В некоторых случаях для большего контроля над зависимостями используются переменные `WANT_`, которые позволяют указывать требования в более точной форме. Например, взгляните на порт package:mail/squirrelmail[]. Этому порту нужны несколько модулей PHP, которые перечислены в переменной `USE_PHP`:
+[[makefile-masterdir]]
+== Подчиненные порты и `MASTERDIR`
-[.programlisting]
-....
-USE_PHP= session mhash gettext mbstring pcre openssl xml
-....
+Если порту необходимо собирать немного разные версии пакетов, используя переменную (например, разрешение или размер бумаги) с разными значениями, создайте по одному подкаталогу для каждого пакета, чтобы пользователям было проще понять, что делать, но старайтесь максимально использовать общие файлы между портами. Обычно, при грамотном использовании переменных, во всех каталогах, кроме одного, требуется лишь очень короткий [.filename]#Makefile#. В единственном [.filename]#Makefile# укажите директорию с остальными файлами с помощью `MASTERDIR`. Также используйте переменную как часть crossref:makefiles[porting-pkgname,`PKGNAMESUFFIX`], чтобы пакеты имели разные имена.
-Эти модули доступны в версиях CLI и web, поэтому версия web выбрана с переменной `WANT_`:
+Это лучше всего продемонстрировать на примере. Это часть файла [.filename]#print/pkfonts300/Makefile#;
[.programlisting]
....
-WANT_PHP_WEB= yes
-....
-
-Имеющиеся переменные `USE_` и `WANT_` определены в файлах в [.filename]#/usr/ports/Mk#.
-
-[[makefile-masterdir]]
-== `MASTERDIR`
-
-Если вашему порту требуется построение довольно различающихся версий пакетов через переменную (задающую, например, разрешение, или размер бумаги), которая принимает различные значения, создайте для каждого пакета отдельный подкаталог, чтобы пользователям было легче определить, каким пакетом воспользоваться, но попробуйте использовать совместно между портами как можно больше файлов. В типичном случае вам потребуются только очень короткие файлы [.filename]#Makefile# во всех каталогах, кроме одного, если вы будете использовать переменные с умом. В отдельных файлах [.filename]#Makefile# вы можете использовать переменную `MASTERDIR` для указания каталога, в котором находятся все остальные файлы. Также используйте переменную как часть <<porting-pkgname,`PKGNAMESUFFIX`>>, чтобы пакеты имели разные имена.
+PORTNAME= pkfonts${RESOLUTION}
+PORTVERSION= 1.0
+DISTFILES= pk${RESOLUTION}.tar.gz
-Продемонстрируем это на примере. Вот часть файла [.filename]#japanese/xdvi300/Makefile#:
+PLIST= ${PKGDIR}/pkg-plist.${RESOLUTION}
-[.programlisting]
-....
-PORTNAME= xdvi
-PORTVERSION= 17
-PKGNAMEPREFIX= ja-
-PKGNAMESUFFIX= ${RESOLUTION}
- :
-# default
-RESOLUTION?= 300
+.if !defined(RESOLUTION)
+RESOLUTION= 300
+.else
.if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \
- ${RESOLUTION} != 300 && ${RESOLUTION} != 400
+ ${RESOLUTION} != 300 && ${RESOLUTION} != 360 && \
+ ${RESOLUTION} != 400 && ${RESOLUTION} != 600
+.BEGIN:
@${ECHO_MSG} "Error: invalid value for RESOLUTION: \"${RESOLUTION}\""
- @${ECHO_MSG} "Possible values are: 118, 240, 300 (default) and 400."
+ @${ECHO_MSG} "Possible values are: 118, 240, 300, 360, 400 and 600."
@${FALSE}
.endif
+.endif
....
-Порт package:japanese/xdvi300[] содержит также все обычные патчи, файлы для пакета и так далее. Если вы введете здесь команду `make`, она возьмет в качестве разрешения значение по умолчанию (300) и построит порт обычным образом.
+Пакет `package:print/pkfonts300[]` также содержит все обычные исправления, файлы пакетов и т.д. При запуске `make` в этом месте будет взято значение разрешения по умолчанию (300), и порт будет собран в обычном режиме.
-Для другого разрешения приведем _полный_[.filename]#xdvi118/Makefile#:
+Что касается других разрешений, это _полный_ [.filename]#print/pkfonts360/Makefile#:
[.programlisting]
....
-RESOLUTION= 118
-MASTERDIR= ${.CURDIR}/../xdvi300
+RESOLUTION= 360
+MASTERDIR= ${.CURDIR}/../pkfonts300
-.include "${MASTERDIR}/Makefile"
+.include "${MASTERDIR}/Makefile"
....
-([.filename]#xdvi240/Makefile# и [.filename]#xdvi400/Makefile# похожи). Задание `MASTERDIR` говорит [.filename]#bsd.port.mk#, что обычный набор подкаталогов типа `FILESDIR` и `SCRIPTDIR` находится в каталоге [.filename]#xdvi300#. Строчка `RESOLUTION=118` переопределят строку `RESOLUTION=300` в файле [.filename]#xdvi300/Makefile# и порт будет построен с разрешением 118.
+([.filename]#print/pkfonts118/Makefile#, [.filename]#print/pkfonts600/Makefile# и все остальные аналогичны). Определение `MASTERDIR` указывает [.filename]#bsd.port.mk#, что стандартный набор подкаталогов, таких как `FILESDIR` и `SCRIPTDIR`, следует искать в [.filename]#pkfonts300#. Строка `RESOLUTION=360` переопределит строку `RESOLUTION=300` в [.filename]#pkfonts300/Makefile#, и порт будет собран с разрешением, установленным на 360.
[[makefile-manpages]]
-== Страницы Справочника
+== Страницы Cправочника
-Если ваш порт определяет корнем для файлов Справочника каталог, отличный от `PREFIX`, вы можете использовать переменную `MANDIRS`, чтобы указать эти каталоги. Обратите внимание, что файлы страниц справочника следует размещать в [.filename]#pkg-plist# наряду с остальными файлами. `MANDIRS` предназначена для автоматического сжатия страниц справочника, так чтобы имена файлов оканчивались на [.filename]#.gz#.
+Если порт размещает дерево man в другом месте, отличном от `PREFIX`, используйте `MANDIRS` для указания этих каталогов. Обратите внимание, что файлы, соответствующие страницам руководства, должны быть добавлены в [.filename]#pkg-plist# вместе с остальными файлами. Назначение `MANDIRS` — обеспечить автоматическое сжатие страниц руководства, поэтому имена файлов имеют суффикс [.filename]#.gz#.
[[makefile-info]]
-== Файлы в формате info
+== Файлы информации
-Если в вашем пакете нужна установка файлов GNU info, они должны быть перечислены в переменной `INFO` (без окончания `.info`), по записи на документ. Предполагается, что эти файлы устанавливаются в [.filename]#PREFIX/INFO_PATH#. Вы можете изменить `INFO_PATH`, если ваш пакет использует другое место для размещения. Однако, это не рекомендуется делать. Эти записи всего лишь содержат путь относительно [.filename]#PREFIX/INFO_PATH#. Например, package:lang/gcc34[] устанавливает файлы info в [.filename]#PREFIX/INFO_PATH/gcc34#, и в `INFO` будет что-то вроде этого:
+Если пакету требуется установить файлы GNU info, перечислите их в `INFO` (без завершающего `.info`), по одному документу на строку. Предполагается, что эти файлы будут установлены в [.filename]#PREFIX/INFO_PATH#. Измените `INFO_PATH`, если пакет использует другое расположение. Однако это не рекомендуется. Эти записи содержат только путь относительно [.filename]#PREFIX/INFO_PATH#. Например, пакет package:lang/gcc34[] устанавливает файлы info в [.filename]#PREFIX/INFO_PATH/gcc34#, и `INFO` будет выглядеть примерно так:
[.programlisting]
....
INFO= gcc34/cpp gcc34/cppinternals gcc34/g77 ...
....
-Перед регистрацией пакета соответствующий код установки/удаления будет автоматически добавлен во временный [.filename]#pkg-plist#.
+Соответствующий код установки/удаления будет автоматически добавлен во временный файл [.filename]#pkg-plist# перед регистрацией пакета.
[[makefile-options]]
-== Опции для Makefile
-
-Многие приложения могут быть построены в различных конфигурациях и с дополнительной функциональностью. Например, выбор естественного (человеческого) языка, GUI против командной строки или типа используемой базы данных. Пользователи могут нуждаться в различных конфигурациях, отличных от используемой по умолчанию, поэтому в системе портов предусмотрен механизм, позволяющий автору порта управлять сборкой того или иного варианта конфигурации. Правильная поддержка этих необязательных параметров облегчает пользователям жизнь и даёт два или более порта по цене одного.
-
-=== Knobs
+== Параметры Makefile
-==== `WITH__*_` и `WITHOUT__*_`
-
-Эти переменные предназначены для установки системным администратором. Многие из них стандартизованы в файле http://svnweb.FreeBSD.org/ports/head/KNOBS?view=markup[ports/KNOBS].
-
-При создании порта не давайте имя для knob, специфичное для данного приложения. На примере порта Avahi, используйте `WITHOUT_MDNS` вместо `WITHOUT_AVAHI_MDNS`.
-
-[NOTE]
-====
-Не стоит рассчитывать, что `WITH__*_` обязательно имеет соответствующую переменную `WITHOUT__*_`, и наоборот. В общем случае, предполагается значение по умолчанию.
-====
-
-[NOTE]
-====
-Если обратное не указано, то проверяется только факт установки самих переменных, но не их конкретное значение типа `YES` или `NO`.
-====
-
-.Основные переменные `WITH__*_` и `WITHOUT__*_`
-[cols="1,1", frame="none", options="header"]
-|===
-| Переменная
-| Значение
-
-|`WITH_OPENSSL_BASE`
-|Использовать версию OpenSSL из базовой системы.
-
-|`WITH_OPENSSL_PORT`
-|Устанавливает версию OpenSSL из package:security/openssl[], даже если в базовой системе последняя версия.
-|===
-
-==== Наименование KNOBS
-
-Портеры должны использовать так называемые knobs для помощи конечным пользователям и для поддержания количества наименований knobs в небольшом количестве. Список популярных названий knobs можно найти в файле http://svnweb.FreeBSD.org/ports/head/KNOBS?view=markup[KNOBS]
-
-Названия knobs должны отражать, что это такое и что выполняет. Если у порта имеется библиотечный префикс в `PORTNAME`, то он должен присутствовать в названии knobs.
+Многие приложения могут быть собраны с дополнительными или различными конфигурациями. Примеры включают выбор естественного (человеческого) языка, графический интерфейс или командная строка, тип поддерживаемой базы данных. Пользователям может потребоваться конфигурация, отличная от стандартной, поэтому система портов предоставляет хуки, которые автор порта может использовать для управления вариантом сборки. Правильная поддержка этих опций сделает пользователей счастливыми и эффективно предоставит два или более порта по цене одного.
+[[makefile-options-options]]
=== `OPTIONS`
-==== Описание
+[[makefile-options-background]]
+==== Пояснения
-При установке порта переменные `OPTIONS_*` предоставляют пользователю окно диалога с отображением доступных параметров, с записью выбранных параметров в файл [.filename]#/var/db/ports/${UNIQUENAME}/options#. Эти опции повторно используются при следующем построении порта.
+`OPTIONS_*` предоставляют пользователю, устанавливающему порт, диалоговое окно с доступными опциями, после чего сохраняют выбранные опции в [.filename]#${PORT_DBDIR}/${OPTIONS_NAME}/options#. При следующей сборке порта эти опции будут использованы повторно. `PORT_DBDIR` по умолчанию имеет значение [.filename]#/var/db/ports#. `OPTIONS_NAME` соответствует имени порта (origin) с заменой разделителя на подчёркивания, например, для package:dns/bind99[] это будет `dns_bind99`.
-Когда пользователь запускает `make config` (или запускает впервые `make build`), инфраструктура выполняет проверку существования файла [.filename]#/var/db/ports/${UNIQUENAME}/options#. Если этот файл не существует, то используются значения `OPTIONS_*` и отображается диалоговое окно, в котором эти параметры можно включить или выключить. Затем сохраняется файл опций [.filename]#options#, и выбранные переменные используются при построении порта.
+Когда пользователь запускает `make config` (или впервые запускает `make build`), система проверяет наличие файла [.filename]#${PORT_DBDIR}/${OPTIONS_NAME}/options#. Если этот файл не существует, используются значения `OPTIONS_*`, и отображается диалоговое окно, где можно включить или отключить опции. Затем файл [.filename]#options# сохраняется, а настроенные переменные используются при сборке порта.
-Если новая версия порта добавляет новые значения `OPTIONS`, то пользователю будет представлено окно диалога с сохраненными заполненными значениями старых `OPTIONS.`
+Если новая версия порта добавляет новые `OPTIONS`, пользователю будет показан диалог с сохранёнными значениями старых `OPTIONS`, заполненными заранее.
-`make showconfig` отображает сохраненную конфигурацию. Для удаления сохраненной конфигурации используйте `make rmconfig`.
+`make showconfig` показывает сохранённую конфигурацию. Используйте `make rmconfig` для удаления сохранённой конфигурации.
+[[makefile-options-syntax]]
==== Синтаксис
-`OPTIONS_DEFINE` содержит список используемых `OPTIONS`. Они независимы друг от друга и не сгруппированы:
+`OPTIONS_DEFINE` содержит список `OPTIONS`, которые будут использоваться. Они независимы друг от друга и не сгруппированы:
[.programlisting]
....
OPTIONS_DEFINE= OPT1 OPT2
....
-Далее после определения следует описание `OPTIONS` (не является обязательным, но настоятельно рекомендуется):
+После определения `OPTIONS` описываются (необязательно, но настоятельно рекомендуется):
[.programlisting]
....
@@ -1699,19 +3549,19 @@ OPT5_DESC= Describe OPT5
OPT6_DESC= Describe OPT6
....
+[.filename]#ports/Mk/bsd.options.desc.mk# содержит описания для многих распространённых `OPTIONS`. Хотя они часто полезны, переопределите их, если описание недостаточно для порта.
+
[TIP]
====
-
-[.filename]#ports/Mk/bsd.options.desc.mk# содержит описание множества наиболее используемых `OPTIONS`; переопределять их, как правило, не нужно.
+При описании параметров рассматривайте их с точки зрения пользователя: «Какую функциональность это изменяет?» и «Зачем мне включать этот параметр?» Не просто повторяйте название. Например, описание параметра `NLS` как «включить поддержку NLS» не помогает пользователю, который уже видит название параметра, но может не знать, что оно означает. Описание вроде «Поддержка родного языка с помощью утилиты gettext» гораздо полезнее.
====
-[TIP]
+[IMPORTANT]
====
-
-При описании параметров старайтесь представить себя на месте пользователя: "Что это делает?" и "Для чего бы я захотел включить это?" Не делайте простое повторение названия. Например, описание параметра `NLS` как "include NLS support" ("включить поддержку NLS") не поможет пользователю, который уже видит название параметра, но может не знать, что это означает. Описав его как "Native Language Support via gettext utilities" ("Поддержка национального языка через утилиты gettext"), вы поможете пользователю гораздо больше.
+Названия параметров всегда пишутся в верхнем регистре. Они не могут использовать смешанный регистр или нижний регистр.
====
-`OPTIONS` можно группировать в виде переключателей, для которых разрешен выбор единственного варианта в каждой группе:
+`OPTIONS` могут быть сгруппированы как переключаемые варианты, где допускается только один выбор из каждой группы:
[.programlisting]
....
@@ -1719,7 +3569,12 @@ OPTIONS_SINGLE= SG1
OPTIONS_SINGLE_SG1= OPT3 OPT4
....
-`OPTIONS` можно группировать в виде переключателей, для которых разрешен выбор единственного варианта (или ни одного) в каждой группе:
+[WARNING]
+====
+В каждый момент времени _должна_ быть выбрана одна опция из каждой группы `OPTIONS_SINGLE`, чтобы параметры были действительными. Один вариант из каждой группы _должен_ быть добавлен в `OPTIONS_DEFAULT`.
+====
+
+`OPTIONS` могут быть сгруппированы как переключаемые варианты, где ни один или только один вариант из каждой группы разрешён:
[.programlisting]
....
@@ -1727,7 +3582,7 @@ OPTIONS_RADIO= RG1
OPTIONS_RADIO_RG1= OPT7 OPT8
....
-`OPTIONS` также можно группировать в виде списков со множественным выбором, для которых обязан быть включен _по крайней мере один_ из параметров:
+`OPTIONS` также могут быть сгруппированы в виде списков "множественного выбора", где _хотя бы одна_ опция должна быть включена:
[.programlisting]
....
@@ -1735,7 +3590,7 @@ OPTIONS_MULTI= MG1
OPTIONS_MULTI_MG1= OPT5 OPT6
....
-`OPTIONS` также можно группировать в виде списков со множественным выбором, для которых могут быть включены любые параметры, включая отсутствие выбора:
+`OPTIONS` также могут быть сгруппированы в виде списков "множественного выбора", где ни одна или любые опции могут быть включены:
[.programlisting]
....
@@ -1743,36 +3598,31 @@ OPTIONS_GROUP= GG1
OPTIONS_GROUP_GG1= OPT9 OPT10
....
-По умолчанию `OPTIONS` находится в выключенном положении, если при этом оно также отсутствует в списке `OPTIONS_DEFAULT`:
+`OPTIONS` по умолчанию не установлены, если они не перечислены в `OPTIONS_DEFAULT`:
[.programlisting]
....
OPTIONS_DEFAULT= OPT1 OPT3 OPT6
....
-Определения `OPTIONS` обязаны быть до подключения [.filename]#bsd.port.options.mk#. Переменные `PORT_OPTIONS` могут быть проверены только после подключения [.filename]#bsd.port.options.mk#. Вместо этого также можно использовать подключение [.filename]#bsd.port.pre.mk#, что все еще широко используется в портах, написанных до появления [.filename]#bsd.port.options.mk#. Но имейте в виду, что некоторые переменные, обычно, это некоторые флаги `USE_*`, после подключения [.filename]#bsd.port.pre.mk# будут работать не так, как этого от них ожидают.
+Определения `OPTIONS` должны быть указаны до включения файла [.filename]#bsd.port.options.mk#. Значения `PORT_OPTIONS` можно проверять только после включения [.filename]#bsd.port.options.mk#. Включение [.filename]#bsd.port.pre.mk# также может использоваться и до сих пор широко применяется в портах, написанных до введения [.filename]#bsd.port.options.mk#. Однако следует учитывать, что некоторые переменные не будут работать как ожидается после включения [.filename]#bsd.port.pre.mk#, обычно это некоторые флаги `USE_*`.
[[ports-options-simple-use]]
.Простое использование `OPTIONS`
[example]
====
+
[.programlisting]
....
OPTIONS_DEFINE= FOO BAR
-FOO_DESC= Enable option foo
-BAR_DESC= Support feature bar
-
-.include <bsd.port.options.mk>
+OPTIONS_DEFAULT=FOO
-.if ${PORT_OPTIONS:MFOO}
-CONFIGURE_ARGS+=--with-foo
-.else
-CONFIGURE_ARGS+=--without-foo
-.endif
+FOO_DESC= Option foo support
+BAR_DESC= Feature bar support
-.if ${PORT_OPTIONS:MBAR}
-RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar
-.endif
+# Will add --with-foo / --without-foo
+FOO_CONFIGURE_WITH= foo
+BAR_RUN_DEPENDS= bar:bar/bar
.include <bsd.port.mk>
....
@@ -1780,9 +3630,10 @@ RUN_DEPENDS+= bar:${PORTSDIR}/bar/bar
====
[[ports-options-check-unset]]
-.Проверка незаданных значений `OPTIONS`
+.Проверка неустановленных `OPTIONS` порта
[example]
====
+
[.programlisting]
....
.if ! ${PORT_OPTIONS:MEXAMPLES}
@@ -1790,15 +3641,25 @@ CONFIGURE_ARGS+=--without-examples
.endif
....
+Приведённая выше форма не рекомендуется. Предпочтительный метод — использование параметра configure для фактического включения и отключения функции в соответствии с опцией:
+
+[.programlisting]
+....
+# Will add --with-examples / --without-examples
+EXAMPLES_CONFIGURE_WITH= examples
+....
+
====
[[ports-options-practical-use]]
.Пример реального использования `OPTIONS`
[example]
====
+
[.programlisting]
....
OPTIONS_DEFINE= EXAMPLES
+OPTIONS_DEFAULT= PGSQL LDAP SSL
OPTIONS_SINGLE= BACKEND
OPTIONS_SINGLE_BACKEND= MYSQL PGSQL BDB
@@ -1814,100 +3675,150 @@ LDAP_DESC= Build with LDAP authentication support
PAM_DESC= Build with PAM support
SSL_DESC= Build with OpenSSL support
-OPTIONS_DEFAULT= PGSQL LDAP SSL
-
-.include <bsd.port.options.mk>
-
-.if ${PORT_OPTIONS:MPGSQL}
-USE_PGSQL= yes
-CONFIGURE_ARGS+= --with-postgres
-.else
-CONFIGURE_ARGS+= --without-postgres
-.endif
+# Will add USE_PGSQL=yes
+PGSQL_USE= pgsql=yes
+# Will add --enable-postgres / --disable-postgres
+PGSQL_CONFIGURE_ENABLE= postgres
-.if ${PORT_OPTIONS:MICU}
-LIB_DEPENDS+= libicuuc.so:${PORTSDIR}/devel/icu
-.endif
+ICU_LIB_DEPENDS= libicuuc.so:devel/icu
-.if ! ${PORT_OPTIONS:MEXAMPLES}
-CONFIGURE_ARGS+= --without-examples
-.endif
+# Will add --with-examples / --without-examples
+EXAMPLES_CONFIGURE_WITH= examples
-# Проверка других параметров OPTIONS
+# Check other OPTIONS
.include <bsd.port.mk>
....
====
-==== Параметры по умолчанию
+[[makefile-options-default]]
+==== Опции по умолчанию
-Следующие параметры по умолчанию всегда включены.
+Эти опции всегда включены по умолчанию.
-* `DOCS` - построение и установка документации.
-* `NLS` - интернационализация.
-* `EXAMPLES` - построение и установка примеров использования.
-* `IPV6` - поддержка протокола IPv6.
+* `DOCS` — сборка и установка документации.
+* `NLS` — Поддержка родного языка.
+* `EXAMPLES` — сборка и установка примеров.
+* `IPV6` — Поддержка протокола IPv6.
[NOTE]
====
-Нет необходимости добавлять эти параметры в `OPTIONS_DEFAULT`. Тем не менее, чтобы отобразить их в окне диалога выбора параметров, они должны быть добавлены в `OPTIONS_DEFINE`.
+Нет необходимости добавлять их в `OPTIONS_DEFAULT`. Однако, чтобы они были активны и отображались в диалоге выбора опций, их необходимо добавить в `OPTIONS_DEFINE`.
====
-=== Функция автоматической активации
+[[makefile-options-auto-activation]]
+=== Автоматическая активация функций
-При использовании сценария GNU configure, следите за тем, какие необязательные функции задействуются посредством автоматической активации. Отключайте явным образом те необязательные функции, которые вы не хотели бы использовать, через передачу соответствующих `--without-xxx` или `--disable-xxx` в переменной `CONFIGURE_ARGS`.
+При использовании скрипта GNU configure следите за тем, какие дополнительные функции активируются автоматическим определением. Явно отключите ненужные дополнительные функции, добавив `--without-xxx` или `--disable-xxx` в `CONFIGURE_ARGS`.
-.Неправильное управление опцией
+[[makefile-options-auto-activation-bad]]
+.Неправильная обработка опции
[example]
====
+
[.programlisting]
....
.if ${PORT_OPTIONS:MFOO}
-LIB_DEPENDS+= libfoo.so:${PORTSDIR}/devel/foo
+LIB_DEPENDS+= libfoo.so:devel/foo
CONFIGURE_ARGS+= --enable-foo
.endif
....
====
-В приведенном выше примере представьте себе библиотеку libfoo, установленную в системе. Пользователь не желает, чтобы приложение использовало libfoo, и поэтому он выключает соответствующую опцию в диалоге `make config`. Но сценарий configure приложения определяет наличие библиотеки в системе и включает ее поддержку в итоговый исполняемый файл. Теперь, когда пользователь решит удалить libfoo из системы, система портов позволит это сделать (т.к. зависимость от libfoo не была записана), но приложение перестанет работать.
+В приведённом выше примере представьте, что библиотека libfoo установлена в системе. Пользователь не хочет, чтобы это приложение использовало libfoo, поэтому он отключил соответствующую опцию в диалоге `make config`. Однако скрипт configure приложения обнаруживает библиотеку в системе и включает её поддержку в итоговом исполняемом файле. Теперь, когда пользователь решает удалить libfoo из системы, система портов не протестует (зависимость от libfoo не была записана), но приложение перестаёт работать.
-.Правильное управление опцией
+[[makefile-options-auto-activation-good]]
+.Правильная обработка опции
[example]
====
+
[.programlisting]
....
-.if ${PORT_OPTIONS:MFOO}
-LIB_DEPENDS+= libfoo.so:${PORTSDIR}/devel/foo
-CONFIGURE_ARGS+= --enable-foo
-.else
-CONFIGURE_ARGS+= --disable-foo
-.endif
+FOO_LIB_DEPENDS= libfoo.so:devel/foo
+# Will add --enable-foo / --disable-foo
+FOO_CONFIGURE_ENABLE= foo
....
====
-Во втором примере библиотека libfoo отключена явным образом. Сценарий configure не включает соответствующие функции в приложении, несмотря на присутствие библиотеки в системе.
-
[NOTE]
====
-При определенных условиях сокращенный синтаксис записи условий может вызывать проблемы со сложными конструкциями. Если вы получаете ошибки, такие как `Malformed conditional`, то может быть использован альтернативный синтаксис.
+В некоторых случаях сокращенный синтаксис условных выражений может вызывать проблемы со сложными конструкциями. Ошибки обычно имеют вид `Malformed conditional`, тогда можно использовать альтернативный синтаксис.
[.programlisting]
....
.if !empty(VARIABLE:MVALUE)
-# as an alternative to
+....
+
+в качестве альтернативы
+
+[.programlisting]
+....
.if ${VARIABLE:MVALUE}
....
====
-=== Вспомогательные макросы
+[[options-helpers]]
+=== Помощники параметров
+
+Существуют макросы, которые помогают упростить условные значения, различающиеся в зависимости от установленных опций. Для удобства приведён полный список:
+
+`PLIST_SUB`, `SUB_LIST`::
+Для автоматической генерации `%%_OPT_%%` и `%%NO__OPT__%%` см. crossref:makefiles[options_sub, `OPTIONS_SUB`].
++
+Для более сложных случаев использования см. crossref:makefiles[options-variables, Замена общих переменных, `OPT_VARIABLE` и `OPT_VARIABLE_OFF`].
+
+`CONFIGURE_ARGS`::
+Для информации о `--enable-_x_` и `--disable-_x_` см. crossref:makefiles[options-configure_enable, `OPT_CONFIGURE_ENABLE`].
++
+О `--with-_x_` и `--without-_x_` см. crossref:makefiles[options-configure_with, `OPT_CONFIGURE_WITH`].
++
+Во всех остальных случаях см. crossref:makefiles[options-configure_on, `OPT_CONFIGURE_ON` и `OPT_CONFIGURE_OFF`].
+
+`CMAKE_ARGS`::
+Для аргументов, которые являются булевыми значениями (`on`, `off`, `true`, `false`, `0`, `1`), см. crossref:makefiles[options-cmake_bool, `OPT_CMAKE_BOOL` и `OPT_CMAKE_BOOL_OFF`].
++
+Для всех остальных случаев см. crossref:makefiles[options-cmake_on, `OPT_CMAKE_ON` и `OPT_CMAKE_OFF`].
+
+`MESON_ARGS`::
+Для аргументов, принимающих `true` или `false`, см. crossref:makefiles[options-meson_true, `OPT_MESON_TRUE` и `OPT_MESON_FALSE`].
++
+Для аргументов, принимающих `yes` или `no`, используйте crossref:makefiles[options-meson_yes, `OPT_MESON_YES` и `OPT_MESON_NO`].
++
+Для аргументов, принимающих `enabled` или `disabled`, см. crossref:makefiles[options-meson_enabled, `OPT_MESON_ENABLED` и `OPT_MESON_DISABLED`].
++
+Во всех остальных случаях используйте crossref:makefiles[options-meson_on, `OPT_MESON_ON` и `OPT_MESON_OFF`].
+
+`QMAKE_ARGS`::
+См. crossref:makefiles[options-qmake_on, `OPT_QMAKE_ON` и `OPT_QMAKE_OFF`].
+
+`USE_*`::
+См. crossref:makefiles[options-use, `OPT_USE` и `OPT_USE_OFF`].
-Существует несколько макросов, упрощающих запись условных значений, которые отличаются в зависимости от набора параметров.
+`*_DEPENDS`::
+См. crossref:makefiles[options-dependencies, Зависимости, `OPT_DEPTYPE` и `OPT_DEPTYPE_OFF`].
-Если переменная `OPTIONS_SUB` имеет значение `yes`, то каждый из указанных в `OPTIONS_DEFINE` параметров будет добавлен в `PLIST_SUB`. Следующая запись:
+`*` (Любая переменная)::
+Наиболее используемые переменные имеют своих помощников, см. crossref:makefiles[options-variables, Замена Общих Переменных, `OPT_VARIABLE` и `OPT_VARIABLE_OFF`].
++
+Для любой переменной без специального помощника см. crossref:makefiles[options-vars, `OPT_VARS` и `OPT_VARS_OFF`].
+
+Зависимости параметров::
+Когда для работы опции требуется другая опция, см. crossref:makefiles[options-implies, `OPT_IMPLIES`].
+
+Конфликты опций::
+Когда опция не может работать, если включена другая, см. crossref:makefiles[options-prevents, `OPT_PREVENTS` и `OPT_PREVENTS_MSG`].
+
+Цели сборки::
+Когда для опции требуется дополнительная обработка, см. crossref:makefiles[options-targets, Дополнительные цели сборки, `_target_-_OPT_-on` и `_target_-_OPT_-off`].
+
+[[options_sub]]
+==== `OPTIONS_SUB`
+
+Если `OPTIONS_SUB` установлен в `yes`, то каждая из опций, добавленных в `OPTIONS_DEFINE`, будет добавлена в `PLIST_SUB` и `SUB_LIST`, например:
[.programlisting]
....
@@ -1915,7 +3826,7 @@ OPTIONS_DEFINE= OPT1
OPTIONS_SUB= yes
....
-соответствует:
+эквивалентно:
[.programlisting]
....
@@ -1924,21 +3835,33 @@ OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
-PLIST_SUB+= OPT1=""
+PLIST_SUB+= OPT1="" NO_OPT1="@comment "
+SUB_LIST+= OPT1="" NO_OPT1="@comment "
.else
-PLIST_SUB+= OPT1="@comment "
+PLIST_SUB+= OPT1="@comment " NO_OPT1=""
+SUB_LIST+= OPT1="@comment " NO_OPT1=""
.endif
....
-`X_CONFIGURE_ENABLE` дописывает в `CONFIGURE_ARGS` строку `--enable-${X_CONFIGURE_ENABLE}` или `--disable-${X_CONFIGURE_ENABLE}` в соответствии с состоянием `X`. Следующая запись:
+[NOTE]
+====
+Значение `OPTIONS_SUB` игнорируется. Установка любого значения добавит записи `PLIST_SUB` и `SUB_LIST` для _всех_ опций.
+====
+
+[[options-use]]
+==== `OPT_USE` и `OPT_USE_OFF`
+
+Когда выбрана опция _OPT_, для каждой пары `_ключ=значение_` в ``OPT_USE``, _значение_ добавляется к соответствующему `USE_KEY`. Если _значение_ содержит пробелы, замените их запятыми, и они будут преобразованы обратно в пробелы во время обработки. `OPT_USE_OFF` работает аналогично, но когда `OPT` _не_ выбрана. Например:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
-OPT1_CONFIGURE_ENABLE= test
+OPT1_USES= xorg
+OPT1_USE= mysql=yes xorg=x11,xextproto,xext,xrandr
+OPT1_USE_OFF= openssl=yes
....
-соответствует:
+эквивалентно:
[.programlisting]
....
@@ -1947,21 +3870,30 @@ OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
-CONFIGURE_ARGS+= --enable-test
+USE_MYSQL= yes
+USES+= xorg
+USE_XORG= x11 xextproto xext xrandr
.else
-CONFIGURE_ARGS+= --disable-test
+USE_OPENSSL= yes
.endif
....
-`X_CONFIGURE_WITH` дописывает в `CONFIGURE_ARGS` строку `--with-${X_CONFIGURE_WITH}` или `--without-${X_CONFIGURE_WITH}` в соответствии с состоянием `X`. Следующая запись:
+[[options-configure-helpers]]
+==== Помощники `CONFIGURE_ARGS`
+
+[[options-configure_enable]]
+===== `OPT_CONFIGURE_ENABLE`
+
+Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_CONFIGURE_ENABLE` к `CONFIGURE_ARGS` добавляется `--enable-_элемент_`. Если опция _OPT_ _не_ выбрана, к `CONFIGURE_ARGS` добавляется `--disable-_элемент_`. Необязательный аргумент может быть указан с помощью символа `=`. Этот аргумент добавляется только к опции конфигурации `--enable-_элемент_`. Например:
[.programlisting]
....
-OPTIONS_DEFINE= OPT1
-OPT1_CONFIGURE_WITH= test
+OPTIONS_DEFINE= OPT1 OPT2
+OPT1_CONFIGURE_ENABLE= test1 test2
+OPT2_CONFIGURE_ENABLE= test2=exhaustive
....
-соответствует:
+эквивалентно:
[.programlisting]
....
@@ -1970,21 +3902,64 @@ OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
-CONFIGURE_ARGS+= --with-test
+CONFIGURE_ARGS+= --enable-test1 --enable-test2
+.else
+CONFIGURE_ARGS+= --disable-test1 --disable-test2
+.endif
+
+.if ${PORT_OPTIONS:MOPT2}
+CONFIGURE_ARGS+= --enable-test2=exhaustive
+.else
+CONFIGURE_ARGS+= --disable-test2
+.endif
+....
+
+[[options-configure_with]]
+===== `OPT_CONFIGURE_WITH`
+
+Когда выбрана опция _OPT_, для каждого _элемента_ в `_OPT_CONFIGURE_WITH` к `CONFIGURE_ARGS` добавляется `--with-_элемент_`. Если опция _OPT_ _не_ выбрана, к `CONFIGURE_ARGS` добавляется `--without-_элемент_`. Необязательный аргумент можно указать с помощью символа `=`. Этот аргумент добавляется только к опции конфигурации `--with-_элемент_`. Например:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1 OPT2
+OPT1_CONFIGURE_WITH= test1
+OPT2_CONFIGURE_WITH= test2=exhaustive
+....
+
+эквивалентно:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1 OPT2
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+CONFIGURE_ARGS+= --with-test1
+.else
+CONFIGURE_ARGS+= --without-test1
+.endif
+
+.if ${PORT_OPTIONS:MOPT2}
+CONFIGURE_ARGS+= --with-test2=exhaustive
.else
-CONFIGURE_ARGS+= --without-test
+CONFIGURE_ARGS+= --without-test2
.endif
....
-Значение переменной `X_CONFIGURE_ON` будет дописано в `CONFIGURE_ARGS` в соответствии с состоянием `X`. Следующая запись:
+[[options-configure_on]]
+===== `OPT_CONFIGURE_ON` и `OPT_CONFIGURE_OFF`
+
+Когда выбрана опция _OPT_, значение `OPT_CONFIGURE_ON`, если оно определено, добавляется к `CONFIGURE_ARGS`. `OPT_CONFIGURE_OFF` работает аналогично, но когда `OPT` _не_ выбрана. Например:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
OPT1_CONFIGURE_ON= --add-test
+OPT1_CONFIGURE_OFF= --no-test
....
-соответствует:
+эквивалентно:
[.programlisting]
....
@@ -1994,37 +3969,65 @@ OPTIONS_DEFINE= OPT1
.if ${PORT_OPTIONS:MOPT1}
CONFIGURE_ARGS+= --add-test
+.else
+CONFIGURE_ARGS+= --no-test
.endif
....
-Значение переменной `X_CONFIGURE_OFF` будет дописано в `CONFIGURE_ARGS` в соответствии с состоянием `X`. Следующая запись:
+[TIP]
+====
+В большинстве случаев помощники crossref:makefiles[options-configure_enable, `OPT_CONFIGURE_ENABLE`] и crossref:makefiles[options-configure_with, `OPT_CONFIGURE_WITH`] предоставляют более короткий и понятный функционал.
+====
+
+[[options-cmake-helpers]]
+==== Помощники `CMAKE_ARGS`
+
+[[options-cmake_on]]
+===== `OPT_CMAKE_ON` и `OPT_CMAKE_OFF`
+
+Когда выбрана опция _OPT_, значение `OPT_CMAKE_ON`, если оно определено, добавляется к `CMAKE_ARGS`. `OPT_CMAKE_OFF` работает аналогично, но когда `OPT` _не_ выбрана. Например:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
-OPT1_CONFIGURE_OFF= --no-test
+OPT1_CMAKE_ON= -DTEST:BOOL=true -DDEBUG:BOOL=true
+OPT1_CMAKE_OFF= -DOPTIMIZE:BOOL=true
....
-соответствует:
+эквивалентно:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
+
.include <bsd.port.options.mk>
-.if ! ${PORT_OPTIONS:MOPT1}
-CONFIGURE_ARGS+= --no-test
+
+.if ${PORT_OPTIONS:MOPT1}
+CMAKE_ARGS+= -DTEST:BOOL=true -DDEBUG:BOOL=true
+.else
+CMAKE_ARGS+= -DOPTIMIZE:BOOL=true
.endif
....
-Значение переменной `X_CMAKE_ON` будет дописано в `CMAKE_ARGS` в соответствии с состоянием `X`. Следующая запись:
+[TIP]
+====
+
+См. crossref:makefiles[options-cmake_bool, `OPT_CMAKE_BOOL` и `OPT_CMAKE_BOOL_OFF`] для более краткой записи, когда значение является булевым.
+====
+
+[[options-cmake_bool]]
+===== `OPT_CMAKE_BOOL` и `OPT_CMAKE_BOOL_OFF`
+
+Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_CMAKE_BOOL` добавляется `-D_элемент_:BOOL=true` к `CMAKE_ARGS`. Если опция _OPT_ _не_ выбрана, `-D_элемент_:BOOL=false` добавляется к `CONFIGURE_ARGS`. `OPT_CMAKE_BOOL_OFF` работает наоборот: `-D_элемент_:BOOL=false` добавляется к `CMAKE_ARGS`, когда опция выбрана, и `-D_элемент_:BOOL=true`, когда опция _не_ выбрана. Например:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
-OPT1_CMAKE_ON= -DTEST:BOOL=true
+OPT1_CMAKE_BOOL= TEST DEBUG
+OPT1_CMAKE_BOOL_OFF= OPTIMIZE
....
-соответствует:
+эквивалентно:
[.programlisting]
....
@@ -2033,19 +4036,30 @@ OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
-CMAKE_ARGS+= -DTEST:BOOL=true
+CMAKE_ARGS+= -DTEST:BOOL=true -DDEBUG:BOOL=true \
+ -DOPTIMIZE:BOOL=false
+.else
+CMAKE_ARGS+= -DTEST:BOOL=false -DDEBUG:BOOL=false \
+ -DOPTIMIZE:BOOL=true
.endif
....
-Значение переменной `X_CMAKE_OFF` будет дописано в `CMAKE_ARGS` в соответствии с состоянием `X`. Следующая запись:
+[[options-meson-helpers]]
+==== Помощники `MESON_ARGS`
+
+[[options-meson_on]]
+===== `OPT_MESON_ON` и `OPT_MESON_OFF`
+
+Когда выбрана опция _OPT_, значение `OPT_MESON_ON`, если оно определено, добавляется к `MESON_ARGS`. `OPT_MESON_OFF` работает аналогичным образом, но когда `OPT` _не_ выбрана. Например:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
-OPT1_CMAKE_OFF= -DTEST:BOOL=false
+OPT1_MESON_ON= -Dopt=1
+OPT1_MESON_OFF= -Dopt=2
....
-соответствует:
+эквивалентно:
[.programlisting]
....
@@ -2053,42 +4067,55 @@ OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
-.if ! ${PORT_OPTIONS:MOPT1}
-CMAKE_ARGS+= -DTEST:BOOL=false
+.if ${PORT_OPTIONS:MOPT1}
+MESON_ARGS+= -Dopt=1
+.else
+MESON_ARGS+= -Dopt=2
.endif
....
-Для любой из следующих переменных:
+[[options-meson_true]]
+===== `OPT_MESON_TRUE` и `OPT_MESON_FALSE`
-* `ALL_TARGET`
-* `CATEGORIES`
-* `CFLAGS`
-* `CPPFLAGS`
-* `CXXFLAGS`
-* `CONFIGURE_ENV`
-* `DISTFILES`
-* `EXTRA_PATCHES`
-* `INSTALL_TARGET`
-* `LDFLAGS`
-* `MAKE_ARGS`
-* `MAKE_ENV`
-* `PATCH_SITES`
-* `PATCHFILES`
-* `PLIST_FILES`
-* `PLIST_DIRS`
-* `PLIST_DIRSTRY`
-* `USES`
+Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_MESON_TRUE` добавляется `-D_элемент_=true` в `MESON_ARGS`. Если опция _OPT_ _не_ выбрана, добавляется `-D_элемент_=false` в `MESON_ARGS`. `OPT_MESON_FALSE` работает противоположным образом: `-D_элемент_=false` добавляется в `MESON_ARGS`, когда опция выбрана, и `-D_элемент_=true`, когда опция _не_ выбрана. Например:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_MESON_TRUE= test debug
+OPT1_MESON_FALSE= optimize
+....
-Значение переменной `X_ABOVEVARIABLE` будет дописано в `ABOVEVARIABLE` в соответствии с состоянием `X`. Следующая запись:
+эквивалентно:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
-OPT1_USES= gmake
-OPT1_CFLAGS= -DTEST
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+MESON_ARGS+= -Dtest=true -Ddebug=true \
+ -Doptimize=false
+.else
+MESON_ARGS+= -Dtest=false -Ddebug=false \
+ -Doptimize=true
+.endif
+....
+
+[[options-meson_yes]]
+===== `OPT_MESON_YES` и `OPT_MESON_NO`
+
+Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_MESON_YES` добавляется `-D_элемент_=yes` к `MESON_ARGS`. Если опция _OPT_ _не_ выбрана, добавляется `-D_элемент_=no` к `MESON_ARGS`. `OPT_MESON_NO` работает противоположным образом: `-D_элемент_=no` добавляется к `MESON_ARGS`, когда опция выбрана, и `-D_элемент_=yes`, когда опция _не_ выбрана. Например:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_MESON_YES= test debug
+OPT1_MESON_NO= optimize
....
-соответствует:
+эквивалентно:
[.programlisting]
....
@@ -2097,20 +4124,54 @@ OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
-USES+= gmake
-CFLAGS+= -DTEST
+MESON_ARGS+= -Dtest=yes -Ddebug=yes \
+ -Doptimize=no
+.else
+MESON_ARGS+= -Dtest=no -Ddebug=no \
+ -Doptimize=yes
+.endif
+....
+
+[[options-meson_enabled]]
+===== `OPT_MESON_ENABLED` и `OPT_MESON_DISABLED`
+
+Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_MESON_ENABLED` добавляется `-D_элемент_=enabled` к `MESON_ARGS`. Когда опция _OPT_ _не_ выбрана, добавляется `-D_элемент_=disabled` к `MESON_ARGS`. `OPT_MESON_DISABLED` работает противоположным образом: `-D_элемент_=disabled` добавляется к `MESON_ARGS`, когда опция выбрана, и `-D_элемент_=enabled`, когда опция _не_ выбрана. Например:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_MESON_ENABLED= test
+OPT1_MESON_DISABLED= debug
+....
+
+эквивалентно:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+MESON_ARGS+= -Dtest=enabled -Ddebug=disabled
+.else
+MESON_ARGS+= -Dtest=disabled -Ddebug=enabled
.endif
....
-Если установлена `X_ABOVEVARIABLE_OFF`, то флаг `ABOVEVARIABLE` будет автоматически выставлен при выключенном параметре `X`. Например:
+[[options-qmake_on]]
+==== `OPT_QMAKE_ON` и `OPT_QMAKE_OFF`
+
+Когда выбрана опция _OPT_, значение `OPT_QMAKE_ON`, если оно определено, добавляется к `QMAKE_ARGS`. `OPT_QMAKE_OFF` работает аналогичным образом, но когда `OPT` _не_ выбрана. Например:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
-OPT1_USES_OFF=gmake
+OPT1_QMAKE_ON= -DTEST:BOOL=true
+OPT1_QMAKE_OFF= -DPRODUCTION:BOOL=true
....
-соответствует:
+эквивалентно:
[.programlisting]
....
@@ -2118,12 +4179,193 @@ OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
-.if ! ${PORT_OPTIONS:MOPT1}
-USES+= gmake
+.if ${PORT_OPTIONS:MOPT1}
+QMAKE_ARGS+= -DTEST:BOOL=true
+.else
+QMAKE_ARGS+= -DPRODUCTION:BOOL=true
+.endif
+....
+
+[[options-implies]]
+==== `OPT_IMPLIES`
+
+Предоставляет способ добавления зависимостей между опциями.
+
+При выборе _OPT_ все перечисленные в этой переменной опции также будут выбраны. В качестве примера можно использовать описанный ранее crossref:makefiles[options-configure_enable,`OPT_CONFIGURE_ENABLE`]:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1 OPT2
+OPT1_IMPLIES= OPT2
+
+OPT1_CONFIGURE_ENABLE= opt1
+OPT2_CONFIGURE_ENABLE= opt2
+....
+
+Эквивалентно:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1 OPT2
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+CONFIGURE_ARGS+= --enable-opt1
+.else
+CONFIGURE_ARGS+= --disable-opt1
+.endif
+
+.if ${PORT_OPTIONS:MOPT2} || ${PORT_OPTIONS:MOPT1}
+CONFIGURE_ARGS+= --enable-opt2
+.else
+CONFIGURE_ARGS+= --disable-opt2
+.endif
+....
+
+[[options-implies-ex1]]
+.Простое использование `OPT_IMPLIES`
+[example]
+====
+
+Этот порт имеет опцию `X11` и опцию `GNOME`, для сборки которой необходимо выбрать опцию `X11`.
+
+[.programlisting]
+....
+OPTIONS_DEFINE= X11 GNOME
+OPTIONS_DEFAULT= X11
+
+X11_USES= xorg
+X11_USE= xorg=xi,xextproto
+GNOME_USE= gnome=gtk30
+GNOME_IMPLIES= X11
+....
+
+====
+
+[[options-prevents]]
+==== `OPT_PREVENTS` и `OPT_PREVENTS_MSG`
+
+Предоставляет способ добавления конфликтов между опциями.
+
+Когда выбрана _OPT_, все опции, перечисленные в `OPT_PREVENTS`, должны быть сняты. Если задано `OPT_PREVENTS_MSG` и возникает конфликт, его содержимое будет показано с объяснением причины конфликта. Например:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1 OPT2
+OPT1_PREVENTS= OPT2
+OPT1_PREVENTS_MSG= OPT1 and OPT2 enable conflicting options
+....
+
+Примерно эквивалентно:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1 OPT2
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT2} && ${PORT_OPTIONS:MOPT1}
+BROKEN= Option OPT1 conflicts with OPT2 (select only one)
+.endif
+....
+
+Единственное отличие заключается в том, что первый вариант выведет ошибку после выполнения `make config`, предлагая изменить выбранные настройки.
+
+[[options-prevents-ex1]]
+.Простое использование `OPT_PREVENTS`
+[example]
+====
+
+Этот порт имеет опции `X509` и `SCTP`. Обе опции добавляют патчи, но патчи конфликтуют друг с другом, поэтому их нельзя выбрать одновременно.
+
+[.programlisting]
+....
+OPTIONS_DEFINE= X509 SCTP
+
+SCTP_PATCHFILES= ${PORTNAME}-6.8p1-sctp-2573.patch.gz:-p1
+SCTP_CONFIGURE_WITH= sctp
+
+X509_PATCH_SITES= http://www.roumenpetrov.info/openssh/x509/:x509
+X509_PATCHFILES= ${PORTNAME}-7.0p1+x509-8.5.diff.gz:-p1:x509
+X509_PREVENTS= SCTP
+X509_PREVENTS_MSG= X509 and SCTP patches conflict
+....
+
+====
+
+[[options-vars]]
+==== `OPT_VARS` и `OPT_VARS_OFF`
+
+Предоставляет универсальный способ установки и добавления значений переменным.
+
+[WARNING]
+====
+Перед использованием `OPT_VARS` и `OPT_VARS_OFF` проверьте, доступен ли более специфичный вспомогательный инструмент в crossref:makefiles[options-variables, Универсальная замена переменных, `OPT_VARIABLE` и `OPT_VARIABLE_OFF`].
+====
+
+Когда выбрана опция _OPT_ и определены `OPT_VARS`, пары `_key_=_value_` и `_key_+=_value_` обрабатываются из `OPT_VARS`. Оператор `=` приводит к перезаписи существующего значения `KEY`, а `+=` добавляет к значению. `OPT_VARS_OFF` работает аналогично, но когда `OPT` _не_ выбрана.
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1 OPT2 OPT3
+OPT1_VARS= also_build+=bin1
+OPT2_VARS= also_build+=bin2
+OPT3_VARS= bin3_build=yes
+OPT3_VARS_OFF= bin3_build=no
+
+MAKE_ARGS= ALSO_BUILD="${ALSO_BUILD}" BIN3_BUILD="${BIN3_BUILD}"
+....
+
+эквивалентно:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1 OPT2
+
+MAKE_ARGS= ALSO_BUILD="${ALSO_BUILD}" BIN3_BUILD="${BIN3_BUILD}"
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+ALSO_BUILD+= bin1
+.endif
+
+.if ${PORT_OPTIONS:MOPT2}
+ALSO_BUILD+= bin2
.endif
+
+.if ${PORT_OPTIONS:MOPT2}
+BIN3_BUILD= yes
+.else
+BIN3_BUILD= no
+.endif
+....
+
+[IMPORTANT]
+====
+Значения, содержащие пробелы, должны быть заключены в кавычки:
+
+[.programlisting]
+....
+OPT_VARS= foo="bar baz"
....
-Для любого из следующих типов зависимости:
+Это связано с тем, как man:make[1] обрабатывает пробелы при раскрытии переменных. Когда `OPT_VARS= foo=bar baz` раскрывается, переменная в итоге содержит две строки: `foo=bar` и `baz`. Однако отправитель, вероятно, предполагал, что должна быть только одна строка — `foo=bar baz`. Заключение значения в кавычки предотвращает использование пробела в качестве разделителя.
+
+Также _не_ добавляйте лишние пробелы после знака `_var_=` и перед значением, это также разобьёт строку на две части. _Это не сработает_:
+
+[.programlisting]
+....
+OPT_VARS= foo= bar
+....
+
+====
+
+[[options-dependencies]]
+==== Зависимости, `OPT_DEPTYPE` и `OPT_DEPTYPE_OFF`
+
+Для любого из этих типов зависимостей:
* `PKG_DEPENDS`
* `EXTRACT_DEPENDS`
@@ -2133,15 +4375,91 @@ USES+= gmake
* `LIB_DEPENDS`
* `RUN_DEPENDS`
-Значение переменной `X_ABOVEVARIABLE` будет дописано в `ABOVEVARIABLE` в соответствии с состоянием `X`. Следующая запись:
+Когда выбрана опция _OPT_, значение `OPT_DEPTYPE`, если оно определено, добавляется к `DEPTYPE`. `OPT_DEPTYPE_OFF` работает аналогично, но когда _не_ выбрана `OPT`. Например:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+OPT1_LIB_DEPENDS= liba.so:devel/a
+OPT1_LIB_DEPENDS_OFF= libb.so:devel/b
+....
+
+эквивалентно:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= OPT1
+
+.include <bsd.port.options.mk>
+
+.if ${PORT_OPTIONS:MOPT1}
+LIB_DEPENDS+= liba.so:devel/a
+.else
+LIB_DEPENDS+= libb.so:devel/b
+.endif
+....
+
+[[options-variables]]
+==== Универсальная замена переменных, `OPT_VARIABLE` и `OPT_VARIABLE_OFF`
+
+Для любой из этих переменных:
+
+* `ALL_TARGET`
+* `BINARY_ALIAS`
+* `BROKEN`
+* `CATEGORIES`
+* `CFLAGS`
+* `CONFIGURE_ENV`
+* `CONFLICTS`
+* `CONFLICTS_BUILD`
+* `CONFLICTS_INSTALL`
+* `CPPFLAGS`
+* `CXXFLAGS`
+* `DESKTOP_ENTRIES`
+* `DISTFILES`
+* `EXTRACT_ONLY`
+* `EXTRA_PATCHES`
+* `GH_ACCOUNT`
+* `GH_PROJECT`
+* `GH_SUBDIR`
+* `GH_TAGNAME`
+* `GH_TUPLE`
+* `GL_ACCOUNT`
+* `GL_COMMIT`
+* `GL_PROJECT`
+* `GL_SITE`
+* `GL_SUBDIR`
+* `GL_TUPLE`
+* `IGNORE`
+* `INFO`
+* `INSTALL_TARGET`
+* `LDFLAGS`
+* `LIBS`
+* `MAKE_ARGS`
+* `MAKE_ENV`
+* `MASTER_SITES`
+* `PATCHFILES`
+* `PATCH_SITES`
+* `PLIST_DIRS`
+* `PLIST_FILES`
+* `PLIST_SUB`
+* `PORTDOCS`
+* `PORTEXAMPLES`
+* `SUB_FILES`
+* `SUB_LIST`
+* `TEST_TARGET`
+* `USES`
+
+Когда выбрана опция _OPT_, значение `OPT_ABOVEVARIABLE`, если оно определено, добавляется к `_ABOVEVARIABLE_`. `OPT_ABOVEVARIABLE_OFF` работает аналогично, но когда `OPT` _не_ выбрана. Например:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
-OPT1_LIB_DEPENDS= liba.so:${PORTSDIR}/devel/a
+OPT1_USES= gmake
+OPT1_CFLAGS_OFF= -DTEST
....
-соответствует:
+эквивалентно:
[.programlisting]
....
@@ -2150,118 +4468,290 @@ OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
.if ${PORT_OPTIONS:MOPT1}
-LIB_DEPENDS+= liba.so:${PORTSDIR}/devel/a
+USES+= gmake
+.else
+CFLAGS+= -DTEST
.endif
....
-Если установлена `X_ABOVEVARIABLE_OFF`, то зависимость типа `ABOVEVARIABLE` будет добавлена при выключенном параметре `X`. Например:
+[NOTE]
+====
+Некоторые переменные отсутствуют в этом списке, в частности `PKGNAMEPREFIX` и `PKGNAMESUFFIX`. Это сделано намеренно. Порт _не должен_ изменять своё имя при изменении набора опций.
+====
+
+[WARNING]
+====
+Некоторые из этих переменных, по крайней мере `ALL_TARGET`, `DISTFILES` и `INSTALL_TARGET`, получают свои значения по умолчанию _после_ обработки опций.
+
+С такими строками в [.filename]#Makefile#:
+
+[.programlisting]
+....
+ALL_TARGET= all
+
+DOCS_ALL_TARGET= doc
+....
+
+Если опция `DOCS` включена, `ALL_TARGET` будет иметь конечное значение `all doc`; если опция отключена, значение будет `all`.
+
+Только со строкой помощника опций в [.filename]#Makefile#:
+
+[.programlisting]
+....
+DOCS_ALL_TARGET= doc
+....
+
+Если опция `DOCS` включена, `ALL_TARGET` будет иметь окончательное значение `doc`; если опция отключена, значение будет `all`.
+====
+
+[[options-targets]]
+==== Дополнительные цели сборки, `_target_-_OPT_-on` и `_target_-_OPT_-off`
+
+Эти цели в [.filename]#Makefile# могут принимать дополнительные опциональные цели сборки:
+
+* `pre-fetch`
+* `do-fetch`
+* `post-fetch`
+* `pre-extract`
+* `do-extract`
+* `post-extract`
+* `pre-patch`
+* `do-patch`
+* `post-patch`
+* `pre-configure`
+* `do-configure`
+* `post-configure`
+* `pre-build`
+* `do-build`
+* `post-build`
+* `pre-install`
+* `do-install`
+* `post-install`
+* `post-stage`
+* `pre-package`
+* `do-package`
+* `post-package`
+
+Когда выбрана опция _OPT_, цель `_TARGET_-_OPT_-on`, если она определена, выполняется после `_TARGET_`. `_TARGET_-_OPT_-off` работает аналогично, но когда `OPT` _не_ выбрана. Например:
[.programlisting]
....
OPTIONS_DEFINE= OPT1
-OPT1_LIB_DEPENDS_OFF= liba.so:${PORTSDIR}/devel/a
+
+post-patch-OPT1-on:
+ @${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile
+
+post-patch-OPT1-off:
+ @${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile
....
-соответствует:
+эквивалентно:
[.programlisting]
....
-OPTIONS_DEFINE= OPT1
+OPTIONS_DEFINE= OPT1
.include <bsd.port.options.mk>
-. if ! ${PORT_OPTIONS:MOPT1}
-LIB_DEPENDS+= liba.so:${PORTSDIR}/devel/a
+post-patch:
+.if ${PORT_OPTIONS:MOPT1}
+ @${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile
+.else
+ @${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile
.endif
....
[[makefile-wrkdir]]
-== Задание рабочего каталога
+== Указание рабочего каталога
-Каждый порт распаковывается в рабочий каталог, который должен быть доступным для записи. В системе портов по умолчанию `DISTFILES` распаковываются в каталог с именем `${DISTNAME}`. Другими словами, если вы задали:
+Каждый порт извлекается в рабочий каталог, который должен быть доступен для записи. Система портов по умолчанию распаковывает `DISTFILES` в каталог с именем `${DISTNAME}`. Другими словами, если в [.filename]#Makefile# указано:
[.programlisting]
....
PORTNAME= foo
-PORTVERSION= 1.0
+DISTVERSION= 1.0
....
-то дистрибутивные файлы порта содержат каталог верхнего уровня, [.filename]#foo-1.0#, и все файлы расположены в этом каталоге.
+то файлы дистрибутива порта содержат каталог верхнего уровня [.filename]#foo-1.0#, и остальные файлы находятся в этом каталоге.
-Если это не ваш случай, то имеется несколько переменных, которые вы можете переопределить.
+Если нужно расположение файлов в других каталогах, можно переопределить ряд переменных.
+[[makefile-wrksrc]]
=== `WRKSRC`
-Эта переменная задаёт имя каталога, который создаётся при распаковке исходных файлов приложения. В нашем предыдущем примере если бы распаковка происходила в каталог с именем [.filename]#foo# (а не [.filename]#foo-1.0#), то вы должны написать:
+Переменная указывает имя каталога, который создается при распаковке distfiles приложения. Чтобы в нашем предыдущем примере распаковка происходила в каталог с именем [.filename]#foo# (а не [.filename]#foo-1.0#), напишите:
[.programlisting]
....
WRKSRC= ${WRKDIR}/foo
....
-или, как вариант
+или можно
[.programlisting]
....
WRKSRC= ${WRKDIR}/${PORTNAME}
....
+[[makefile-wrksrc_subdir]]
+=== `WRKSRC_SUBDIR`
+
+Если исходные файлы, необходимые для порта, находятся в подкаталоге распакованного дистрибутива, присвойте `WRKSRC_SUBDIR` имя этого каталога.
+
+[.programlisting]
+....
+WRKSRC_SUBDIR= src
+....
+
+[[makefile-no_wrksubdir]]
=== `NO_WRKSUBDIR`
-Если порт вообще не распаковывается ни в какой каталог, то вы должны задать для этого переменную `NO_WRKSUBDIR`.
+Если порт не распаковывается в подкаталог вообще, установите `NO_WRKSUBDIR`, чтобы указать это.
[.programlisting]
....
NO_WRKSUBDIR= yes
....
+[NOTE]
+====
+Поскольку `WRKDIR` является единственной директорией, которая должна быть доступна для записи во время сборки, и используется для хранения многих файлов, фиксирующих состояние сборки, извлечение порта будет принудительно выполнено в поддиректорию.
+====
+
[[conflicts]]
-== Разрешение конфликтов
+== Обработка конфликтов
-Для регистрации конфликта между пакетами и портами используются три различные переменные: `CONFLICTS`, `CONFLICTS_INSTALL` и `CONFLICTS_BUILD`.
+Существует три различные переменные для регистрации конфликтов между пакетами и портами: `CONFLICTS`, `CONFLICTS_INSTALL` и `CONFLICTS_BUILD`.
[NOTE]
====
-Переменные регистрации конфликта автоматически определяют переменную `IGNORE`, которая более подробно описана в crossref:porting-dads[dads-noinstall, "Пометка неустанавливаемого порта как `BROKEN`, `FORBIDDEN` или `IGNORE` "].
+Эти переменные автоматически устанавливают переменную `IGNORE`, более подробно описанную в crossref:porting-dads[dads-noinstall,Пометка порта как неустанавливаемого с помощью `BROKEN`, `FORBIDDEN` или `IGNORE`].
+====
+
+При удалении одного из нескольких конфликтующих портов рекомендуется оставлять `CONFLICTS` в тех других портах на несколько месяцев, чтобы учесть пользователей, которые обновляются лишь время от времени.
+
+[[conclicts-conflicts_install]]
+`CONFLICTS_INSTALL`::
+Если пакет не может сосуществовать с другими пакетами (из-за конфликтов файлов, несовместимости во время выполнения и т.д.). Проверка `CONFLICTS_INSTALL` выполняется после этапа сборки и перед этапом установки.
+
+[[conclicts-conflicts_build]]
+`CONFLICTS_BUILD`::
+Если порт не может быть собран, когда уже установлены другие определённые порты. Конфликты сборки не фиксируются в результирующем пакете.
+
+[[conclicts-conflicts]]
+`CONFLICTS`::
+Если порт не может быть собран, когда определённый порт уже установлен и итоговый пакет не может сосуществовать с другим пакетом. Проверка `CONFLICTS` выполняется до этапа сборки и до этапа установки.
+
+Каждый элемент, разделённый пробелами, в значениях переменных `CONFLICTS*` сопоставляется с пакетами(кроме того, который собирается) с использованием правил раскрытия шаблонов имен файлов в оболочке shell. Это позволяет перечислить все варианты порта в списке конфликтов вместо необходимости исключать собираемый вариант из этого списка. Например, если установлен git-lite, `CONFLICTS_INSTALL=git git-lite` позволит выполнить:
+[source, shell]
+....
+% make -C devel/git FLAVOR=lite all deinstall install
+....
+
+Но следующая команда сообщит о конфликте, так как установленное имя базового пакета — `git-lite`, а `git` будет собран, но не может быть установлен вместе с `git-lite`:
+[source, shell]
+....
+% make -C devel/git FLAVOR=default all deinstall install
+....
+
+Без этой функции Makefile потребовал бы по одному `_flavor__CONFLICTS_INSTALL` для каждого варианта, перечисляя все остальные варианты.
+
+Наиболее распространённым содержимым одной из этих переменных является база пакета другого порта. База пакета — это имя пакета без указания версии, её можно получить, выполнив команду `make -V PKGBASE`.
+
+[[conflicts-ex1]]
+.Простой пример использования `CONFLICTS*`
+[example]
+====
+
+Пакет package:dns/bind99[] не может быть установлен, если присутствует пакет package:dns/bind910[], так как они устанавливают одинаковые файлы. Сначала соберите базовый пакет для использования:
+
+[source, shell]
+....
+% make -C dns/bind99 -V PKGBASE
+bind99
+% make -C dns/bind910 -V PKGBASE
+bind910
+....
+
+Затем добавьте в [.filename]#Makefile# пакета package:dns/bind99[]:
+
+[.programlisting]
+....
+CONFLICTS_INSTALL= bind910
+....
+
+И добавьте в [.filename]#Makefile# пакета package:dns/bind910[]:
+
+[.programlisting]
+....
+CONFLICTS_INSTALL= bind99
+....
+
+====
+
+Иногда только определенные версии другого порта несовместимы. В этом случае используйте полное имя пакета, включая версию. При необходимости используйте подстановочные символы шаблонов имён файлов оболочки, такие как `*` и `?`, чтобы охватить все необходимые версии.
+
+[[conflicts-ex2]]
+.Использование `CONFLICTS*` с шаблонами имён файлов.
+[example]
====
-При удалении одного из конфликтующих портов целесообразно сохранить записи `CONFLICTS` в тех других портах в течении нескольких месяцев, чтобы позаботиться о тех пользователей, которые обновляются от случая к случаю.
+В версиях с 2.0 по 2.4.1_2 пакет package:deskutils/gnotime[] устанавливал встроенную версию пакета package:databases/qof[].
-=== `CONFLICTS_INSTALL`
+Чтобы отразить это прошлое, [.filename]#Makefile# пакета package:databases/qof[] содержит:
-Если ваш пакет не может существовать вместе с другими (из-за конфликта файлов, несовместимости времени выполнения и так далее), перечислите имена остальных пакетов в переменной `CONFLICTS_INSTALL`. Здесь вы можете использовать шаблоны командного интерпретатора, такие как `*` и `?`. Имена пакетов должны выглядеть так же, как в [.filename]#/var/db/pkg#. Пожалуйста, убедитесь, что `CONFLICTS_INSTALL` не содержит пакет самого этого порта. В противном случае не будет работать установка с использованием переменной `FORCE_PKG_REGISTER`. Проверка CONFLICTS_INSTALL выполняется после процесса сборки и до процесса установки.
+[.programlisting]
+....
+CONFLICTS_INSTALL= gnotime-2.[0-3]* \
+ gnotime-2.4.0* gnotime-2.4.1 \
+ gnotime-2.4.1_[12]
+....
-=== `CONFLICTS_BUILD`
+Первый элемент соответствует версиям `2.0`–`2.3`, второй — всем редакциям `2.4.0`, третий — точно версии `2.4.1`, а последний — первой и второй редакциям версии `2.4.1`.
-Если ваш порт не может быть собран, когда уже установлен другой, перечислите имена остальных портов в переменной `CONFLICTS_BUILD`. Здесь вы можете использовать шаблоны командного интерпретатора, такие как `*` и `?`. Имена пакетов должны выглядеть так же, как в [.filename]#/var/db/pkg#. Проверка CONFLICTS_BUILD выполняется до процесса сборки. Конфликты сборки в получаемом пакете не записываются.
+package:deskutils/gnotime[] не имеет строки конфликтов, потому что его текущая версия не конфликтует ни с чем другим.
+====
-=== `CONFLICTS`
+Переменная `DISABLE_CONFLICTS` может быть временно установлена при выполнении целей, на которые не влияют конфликты. Эту переменную не следует устанавливать в Makefiles портов.
-Если ваш порт не может быть собран, когда уже установлен другой, а получаемый пакет не может существовать вместе с другими, перечислите имена остальных пакетов в переменной `CONFLICTS`. Здесь вы можете использовать шаблоны командного интерпретатора, такие как `*` и `?`. Имена пакетов должны выглядеть так же, как в [.filename]#/var/db/pkg#. Пожалуйста, убедитесь, что `CONFLICTS` не содержит пакет самого этого порта. В противном случае не будет работать установка с использованием переменной `FORCE_PKG_REGISTER`. Проверка CONFLICTS выполняется до процессов сборки и установки.
+[source, shell]
+....
+% make -DDISABLE_CONFLICTS patch
+....
[[install]]
== Установка файлов
+[IMPORTANT]
+====
+Фаза `install` очень важна для конечного пользователя, так как она добавляет файлы в его систему. Все дополнительные команды, выполняемые в целях `*-install` [.filename]#Makefile# порта, должны выводиться на экран. _Не_ заглушайте эти команды с помощью `@` или `.SILENT`.
+====
+
[[install-macros]]
=== Макросы `INSTALL_*`
-Используйте макросы, которые есть в файле [.filename]#bsd.port.mk# для обеспечения правильных прав доступа файлов в целях `*-install` порта. Устанавливайте права владения напрямую в [.filename]#pkg-plist# через соответствующие записи `@owner owner` и `@group group`. Эти операторы работают до момента их переопределения или до конца [.filename]#pkg-plist#, поэтому не забывайте их сбрасывать, когда они больше не нужны. По умолчанию владение устанавливается для `root:wheel`.
+Используйте макросы, предоставленные в [.filename]#bsd.port.mk#, чтобы обеспечить корректные режимы файлов в целях `*-install` порта. Устанавливайте владельца напрямую в [.filename]#pkg-plist# в соответствующих записях, таких как `@(_владелец_,_группа_,)`, `@owner _владелец_` и `@group _группа_`. Эти операторы действуют до переопределения или до конца [.filename]#pkg-plist#, поэтому не забудьте сбросить их, когда они больше не нужны. Владелец по умолчанию — `root:wheel`. Дополнительную информацию см. в crossref:plist[plist-keywords-base,Базовые Ключевые Слова].
-* `INSTALL_PROGRAM` - это команда для установки бинарных выполнимых файлов.
-* `INSTALL_SCRIPT` - это команда для установки выполнимых скриптов.
-* `INSTALL_LIB` - это команда для установки динамических библиотек.
-* `INSTALL_KLD` - это команда для установки загружаемых модулей ядра. Некоторые архитектуры предпочитают, чтобы для модулей сохранялись отладочные сведения, по этой причине используйте эту команду вместо `INSTALL_PROGRAM`.
-* `INSTALL_DATA` - это команда для установки совместно используемых файлов данных.
-* `INSTALL_MAN` - это команда для установки страниц Справочника и другой документации (никаких файлов она не сжимает).
+* `INSTALL_PROGRAM` — команда для установки бинарных исполняемых файлов.
+* `INSTALL_SCRIPT` — команда для установки исполняемых скриптов.
+* `INSTALL_LIB` — это команда для установки общих библиотек (но не статических библиотек).
+* `INSTALL_KLD` — это команда для установки загружаемых модулей ядра. Некоторые архитектуры не поддерживают удаление символов из модулей, поэтому используйте эту команду вместо `INSTALL_PROGRAM`.
+* `INSTALL_DATA` — это команда для установки общих данных, включая статические библиотеки.
+* `INSTALL_MAN` — это команда для установки man-страниц и другой документации (она ничего не сжимает).
-В основе работы этих макросов лежит команда `install` со всеми соответствующими флагами. Смотрите пример их использования ниже.
+Эти переменные передаются команде man:install[1] с соответствующими флагами для каждой ситуации.
+
+[IMPORTANT]
+====
+Не используйте `INSTALL_LIB` для установки статических библиотек, так как их удаление делает их бесполезными. Вместо этого используйте `INSTALL_DATA`.
+====
[[install-strip]]
-=== Удаление отладочной информации в бинарных файлах и динамических библиотеках
+=== Удаление символов из бинарных файлов и разделяемых библиотек
-Не удаляйте отладочную информацию из бинарных файлов вручную, если вы это делали. Во всех двоичных файлах отладочная информация должна быть удалена, и макрос `INSTALL_PROGRAM` выполнит установку и удаление отладочной информации одновременно (обратитесь к следующему разделу). Макрос `INSTALL_LIB` делает то же самое для динамических библиотек.
+Установленные бинарные файлы должны быть очищены от отладочной информации. Не очищайте бинарные файлы вручную, если это не является абсолютно необходимым. Макрос `INSTALL_PROGRAM` устанавливает и очищает бинарный файл одновременно. Макрос `INSTALL_LIB` делает то же самое с разделяемыми библиотеками.
-Если вам нужно удалить отладочную информацию из файла без использования макросов `INSTALL_PROGRAM` и `INSTALL_LIB`, то это можно сделать при помощи `${STRIP_CMD}`. Обычно это делается внутри цели `post-install`. К примеру:
+Когда файл необходимо очистить, но ни макросы `INSTALL_PROGRAM`, ни `INSTALL_LIB` не подходят, `${STRIP_CMD}` очищает программу или разделяемую библиотеку. Обычно это делается в цели `post-install`. Например:
[.programlisting]
....
@@ -2269,24 +4759,33 @@ post-install:
${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xdl
....
-Удаление отладочной информации из нескольких файлов:
+Когда необходимо удалить отладочную информацию из нескольких файлов:
[.programlisting]
....
post-install:
- .for l in geometry media body track world
+.for l in geometry media body track world
${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0
- .endfor
+.endfor
....
-Для проверки того, удалена ли отладочная информация из файла, используйте man:file[1]. Для двоичных файлов man:file[1] печатает `stripped` или `not stripped`. Кроме того, man:strip[1] определяет, была ли уже удалена из программы отладочная информация, и в этом случае просто завершает свою работу.
+Используйте man:file[1] для файла, чтобы определить, был ли он подвергнут удалению символов. man:file[1] сообщает, что бинарные файлы либо `stripped` (удалены символы), либо `not stripped` (символы не удалены). Кроме того, man:strip[1] обнаружит программы, которые уже были подвергнуты удалению символов, и завершит работу без ошибок.
+
+[IMPORTANT]
+====
+Когда определён `WITH_DEBUG`, elf-файлы _не должны_ быть очищены.
+
+Переменные (`STRIP_CMD`, `INSTALL_PROGRAM`, `INSTALL_LIB`, ...) и crossref:uses[uses,`USES`], предоставляемые фреймворком, обрабатывают это автоматически.
+
+Некоторое программное обеспечение добавляет `-s` к своим `LDFLAGS`. В этом случае либо удалите `-s`, если установлен `WITH_DEBUG`, либо удалите его безусловно и используйте `STRIP_CMD` в `post-install`.
+====
[[install-copytree]]
=== Установка целого дерева файлов
-Иногда должно быть установлено большое количество файлов с сохранением их иерархической организации. Например, копирование дерева каталогов целиком из `WRKSRC` в целевой каталог внутри `PREFIX`. Обратите внимание, что `PREFIX`, `EXAMPLESDIR`, `DATADIR` и другие переменные пути всегда должны предваряться `STAGEDIR`, чтобы не ломать staging (смотрите <<staging>>).
+Иногда необходимо установить большое количество файлов с сохранением их иерархической структуры. Например, копирование всего дерева каталогов из `WRKSRC` в целевой каталог под `PREFIX`. Обратите внимание, что `PREFIX`, `EXAMPLESDIR`, `DATADIR` и другие переменные путей всегда должны предваряться `STAGEDIR` для соблюдения процедуры промежуточной установки (см. crossref:special[staging,Промежуточная установка]).
-Для этой ситуации существует два макроса. Преимущество от использования этих макросов вместо команды `cp` в том, что они гарантируют установку правильного владельца и прав на конечные файлы. Первый макрос, `COPYTREE_BIN`, делает все устанавливаемые файлы исполняемыми, что подходит для установки в [.filename]#PREFIX/bin#. Второй макрос, `COPYTREE_SHARE`, не устанавливает на файлы права исполнения, и, таким образом, подходит для установки файлов внутри каталога [.filename]#PREFIX/share#.
+Для этой ситуации существуют два макроса. Преимущество использования этих макросов вместо `cp` заключается в том, что они гарантируют целевым файлам правильные значения владельца и разрешений. Первый макрос, `COPYTREE_BIN`, устанавливает все установленные файлы как исполняемые, что делает его подходящим для установки в [.filename]#PREFIX/bin#. Второй макрос, `COPYTREE_SHARE#, не устанавливает исполняемые разрешения для файлов и, следовательно, подходит для установки файлов в [.filename]#PREFIX/share#.
[.programlisting]
....
@@ -2295,7 +4794,7 @@ post-install:
(cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})
....
-В этом примере устанавливается содержимое каталога [.filename]#examples# из установочных файлов производителя в надлежащее место для примеров вашего порта.
+Этот пример установит содержимое каталога [.filename]#examples# из дистрибутива вендора в соответствующее расположение примеров порта.
[.programlisting]
....
@@ -2304,9 +4803,9 @@ post-install:
(cd ${WRKSRC}/temperatures && ${COPYTREE_SHARE} "June July August" ${STAGEDIR}${DATADIR}/summer)
....
-А в этом примере будут установлены данные летних месяцев в подкаталог [.filename]#summer# каталога [.filename]#DATADIR#.
+И этот пример установит данные летних месяцев в подкаталог [.filename]#summer# каталога [.filename]#DATADIR#.
-В качестве третьего параметра в макросе `COPYTREE_*` можно передать дополнительные параметры `find`. Например, чтобы в первом примере установить все файлы кроме файлов Makefile, можно использовать следующую команду.
+Дополнительные аргументы `find` могут быть переданы через третий аргумент макросов `COPYTREE_*`. Например, чтобы установить все файлы из первого примера, кроме Makefiles, можно использовать следующие команды.
[.programlisting]
....
@@ -2316,50 +4815,51 @@ post-install:
${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR} "! -name Makefile")
....
-Эти макросы не производят добавление устанавливаемых файлов в [.filename]#pkg-plist#. Они должны быть добавлены туда вручную. Необязательные файлы документации (`PORTDOCS`, смотрите <<install-documentation>>) и примеров (`PORTEXAMPLES`) всегда должны предваряться в [.filename]#pkg-plist# префиксами `%%PORTDOCS%%` или `%%PORTEXAMPLES%%`.
+Эти макросы не добавляют установленные файлы в [.filename]#pkg-plist#. Их необходимо добавлять вручную. Для дополнительной документации (`PORTDOCS`, см. crossref:makefiles[install-documentation, Установка дополнительной документации]) и примеров (`PORTEXAMPLES`), префиксы `%%PORTDOCS%%` или `%%PORTEXAMPLES%%` должны быть добавлены в [.filename]#pkg-plist#.
[[install-documentation]]
=== Установка дополнительной документации
-Если с вашим программным обеспечением поставляется некоторая документация, отличающаяся от стандартных страниц Справочника и файлов info, которая, как вы думаете, будет полезна пользователям, установите ее в каталог [.filename]#PREFIX/shared/doc#. Это может быть сделано, как и в предыдущем разделе, в цели `post-install`.
+Если у программного обеспечения есть документация, помимо стандартных страниц man и info, которая может быть полезна пользователю, установите её в `DOCSDIR`. Это можно сделать, как и в предыдущем пункте, в цели `post-install`.
-Создайте для вашего порта новый каталог. Имя каталога должно соответствовать тому, что представляет из себя порт. Обычно это означает `PORTNAME`. Однако, если вы думаете, что пользователь захочет иметь разные версии порта, установленные одновременно, то вы можете использовать полное имя `PKGNAME`.
+Создайте новый каталог для порта. Имя каталога — `DOCSDIR`. Обычно оно равно `PORTNAME`. Однако, если пользователю может потребоваться установка разных версий порта одновременно, можно использовать полное имя `PKGNAME`.
-Поскольку устанавливаются только файлы, перечисленные в [.filename]#pkg-plist#, безопасным способом будет устанавливать документацию в `STAGEDIR` всегда (смотрите crossref:special[staging, Staging]). Следовательно, блоки `.if` нужны только для файлов достаточно большого размера, установка которых влечёт значительные накладные расходы на операции ввода/вывода.
+Поскольку устанавливаются только файлы, перечисленные в [.filename]#pkg-plist#, можно безопасно всегда устанавливать документацию в `STAGEDIR` (см. crossref:special[staging,Staging]). Поэтому блоки `.if` требуются только в тех случаях, когда устанавливаемые файлы достаточно велики, чтобы вызвать значительные накладные расходы на ввод-вывод.
[.programlisting]
....
post-install:
${MKDIR} ${STAGEDIR}${DOCSDIR}
- ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}
+ ${INSTALL_DATA} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}
....
-Вот несколько полезных переменных и то, как они преобразуются по умолчанию при использовании в [.filename]#Makefile#:
+С другой стороны, если в порте есть опция DOCS, установите документацию в цели `post-install-DOCS-on`. Эти цели описаны в crossref:makefiles[options-targets, Дополнительные цели сборки, `_target_-_OPT_-on` и `_target_-_OPT_-off`].
-* `DATADIR` преобразуется в [.filename]#PREFIX/shared/PORTNAME#.
-* `DATADIR_REL` преобразуется в [.filename]#share/PORTNAME#.
-* `DOCSDIR` преобразуется в [.filename]#PREFIX/shared/doc/PORTNAME#.
-* `DOCSDIR_REL` преобразуется в [.filename]#share/doc/PORTNAME#.
-* `EXAMPLESDIR` преобразуется в [.filename]#PREFIX/shared/examples/PORTNAME#.
-* `EXAMPLESDIR_REL` преобразуется в [.filename]#share/examples/PORTNAME#.
+Вот несколько полезных переменных и их стандартное раскрытие при использовании в [.filename]#Makefile#:
+
+* `DATADIR` раскрывается в [.filename]#PREFIX/share/PORTNAME#.
+* `DATADIR_REL` раскрывается в [.filename]#share/PORTNAME#.
+* `DOCSDIR` раскрывается в [.filename]#PREFIX/share/doc/PORTNAME#.
+* `DOCSDIR_REL` раскрывается в [.filename]#share/doc/PORTNAME#.
+* `EXAMPLESDIR` раскрывается в [.filename]#PREFIX/share/examples/PORTNAME#.
+* `EXAMPLESDIR_REL` раскрывается в [.filename]#share/examples/PORTNAME#.
[NOTE]
====
-Параметр `DOCS` управляет установкой дополнительной документации в `DOCSDIR`. Это не относится к стандартным страницам справочника и страницам info. Все, что устанавливается в `DATADIR` и `EXAMPLESDIR`, соответственно управляется через параметры `DATA` и `EXAMPLES`.
+Опция `DOCS` управляет только дополнительной документацией, устанавливаемой в `DOCSDIR`. Она не применяется к стандартным man-страницам и info-страницам. Содержимое, устанавливаемое в `EXAMPLESDIR`, контролируется опцией `EXAMPLES`.
====
-Эти переменные экспортируются в `PLIST_SUB`. Их значения появятся там в виде имён путей относительно [.filename]#PREFIX#, если это возможно. То есть [.filename]#share/doc/PORTNAME# в списке сборки по умолчанию будет заменен на `%%DOCSDIR%%`, и так далее. (Дополнительную информацию о подстановке в [.filename]#pkg-plist# можно найти <<plist-sub,здесь>>.)
+Эти переменные экспортируются в `PLIST_SUB`. Их значения будут представлены там в виде путей относительно [.filename]#PREFIX#, если это возможно. То есть, [.filename]#share/doc/PORTNAME# будет заменено на `%%DOCSDIR%%` в списке упаковки по умолчанию и так далее. (Подробнее о подстановках в [.filename]#pkg-plist# см. crossref:plist[plist-sub,здесь].)
-Все условно устанавливаемые файлы и каталоги с документацией должны быть перечислены в файле [.filename]#pkg-plist# с префиксом `%%PORTDOCS%%`, например:
+Все условно устанавливаемые файлы и каталоги документации включаются в [.filename]#pkg-plist# с префиксом `%%PORTDOCS%%`, например:
[.programlisting]
....
%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/CONTACT
-%%PORTDOCS%%@dirrm %%DOCSDIR%%
....
-В качестве альтернативы перечислению файлов документации в файле [.filename]#pkg-plist#, порт может указать в переменной `PORTDOCS` список имён файлов и глобальных шаблонов командного процессора для добавления в окончательный список сборки. Имена будут задаваться относительно `DOCSDIR`. Таким образом, порт, использующий `PORTDOCS` и нестандартное местоположение документации, должен задавать соответствующим образом и `DOCSDIR`. Если каталог указан в `PORTDOCS` или соответствует шаблону для этой переменной, то полное поддерево с входящими в него файлами и каталогами будет регистрироваться в окончательном списке сборки. Если параметр `DOCS` не задан, то файлы и каталоги, перечисленные в `PORTDOCS`, не будут установлены и добавлены в список сборки порта. Установка документации в `PORTDOCS`, как это показано выше, остаётся за самим портом. Типичный пример использования `PORTDOCS` выглядит следующим образом:
+В качестве альтернативы перечислению файлов документации в [.filename]#pkg-plist#, порт может установить переменную `PORTDOCS` в список имён файлов и шаблонов имен файлов shell для добавления в итоговый список упаковки. Имена будут относительны к `DOCSDIR`. Поэтому порт, использующий `PORTDOCS` и нестандартное расположение документации, должен соответствующим образом установить `DOCSDIR`. Если в `PORTDOCS` указан каталог или он соответствует шаблону из этой переменной, всё поддерево содержащихся файлов и каталогов будет зарегистрировано в итоговом списке упаковки. Если опция `DOCS` отключена, файлы и каталоги, перечисленные в `PORTDOCS`, не будут установлены или добавлены в список упаковки порта. Установка документации в `PORTDOCS`, как показано выше, остаётся на усмотрение самого порта. Типичный пример использования `PORTDOCS`:
[.programlisting]
....
@@ -2368,12 +4868,57 @@ PORTDOCS= README.* ChangeLog docs/*
[NOTE]
====
-Эквивалентами `PORTDOCS` для файлов, устанавливаемых в `DATADIR` и `EXAMPLESDIR` являются `PORTDATA` и `PORTEXAMPLES` соответственно.
+Эквивалентами `PORTDOCS` для файлов, установленных в `DATADIR` и `EXAMPLESDIR`, являются `PORTDATA` и `PORTEXAMPLES` соответственно.
-Во время установки выводится содержимое [.filename]#pkg-message#. За подробной информацией обратитесь к <<porting-message,разделу об использовании [.filename]#pkg-message#>>. Файл [.filename]#pkg-message# не нужно добавлять в [.filename]#pkg-plist#.
+Содержимое файла [.filename]#pkg-message# отображается при установке. Подробности см. в разделе crossref:pkg-files[porting-message,использование файла [.filename]#pkg-message#]. Файл [.filename]#pkg-message# не нужно добавлять в [.filename]#pkg-plist#.
====
[[install-subdirs]]
-=== Подкаталоги внутри PREFIX
+=== Подкаталоги в `PREFIX`
+
+Попробуйте сделать так, чтобы порт размещал файлы в правильных подкаталогах `PREFIX`. Некоторые порты собирают всё в кучу и помещают в подкаталог с именем порта, что неверно. Также многие порты размещают все файлы, кроме бинарников, заголовочных файлов и страниц руководства, в подкаталоге [.filename]#lib#, что плохо согласуется с парадигмой BSD. Многие из этих файлов должны быть перемещены в один из следующих каталогов: [.filename]#etc# (файлы настройки/конфигурации), [.filename]#libexec# (исполняемые файлы для внутреннего использования), [.filename]#sbin# (исполняемые файлы для суперпользователей/администраторов), [.filename]#info# (документация для браузера info) или [.filename]#share# (архитектурно-независимые файлы). Подробности см. в man:hier[7]; правила, действующие для [.filename]#/usr#, в основном применимы и к [.filename]#/usr/local#. Исключение составляют порты, связанные с USENET "news". Они могут использовать [.filename]#PREFIX/news# в качестве места назначения для своих файлов.
+
+[[binary-alias]]
+== Используйте `BINARY_ALIAS` для переименования команд вместо исправления сборки
+
+Когда определена переменная `BINARY_ALIAS`, будут созданы символьные ссылки на указанные команды в каталоге, который будет добавлен в начало переменной `PATH`.
+
+Используйте это для замены жёстко заданных команд, от которых зависит этап сборки, без необходимости исправлять какие-либо файлы сборки.
+
+[[binary-alias-ex1]]
+.Использование `BINARY_ALIAS` для предоставления `gsed` в качестве `sed`
+[example]
+====
+Некоторые порты ожидают, что `sed` будет вести себя как GNU sed и используют возможности, которые man:sed[1] не предоставляет. GNU sed доступен в пакете package:textproc/gsed[] на FreeBSD.
+
+Используйте `BINARY_ALIAS` для замены `sed` на `gsed` на время сборки:
+
+[.programlisting]
+....
+BUILD_DEPENDS= gsed:textproc/gsed
+...
+BINARY_ALIAS= sed=gsed
+....
+
+====
+
+[[binary-alias-ex2]]
+.Использование `BINARY_ALIAS` для создания псевдонимов жестко заданных команд `python3`
+[example]
+====
+Порт, в котором есть жёсткая ссылка на `python3` в скриптах сборки, требует его наличия в `PATH` во время сборки. Используйте `BINARY_ALIAS` для создания псевдонима, указывающего на нужный бинарный файл Python 3:
+
+[.programlisting]
+....
+USES= python:3.4+,build
+...
+BINARY_ALIAS= python3=${PYTHON_CMD}
+....
-Попробуйте поместить все файлы порта в правильных подкаталогах каталога `PREFIX`. Некоторые порты игнорируют все установки и помещают все в подкаталог с именем порта, что неправильно. Также многие порты помещают все, кроме бинарных файлов, файлов заголовков и страниц Справочника, в подкаталог каталога [.filename]#lib#, что не очень хорошо работает с подходом BSD. Многие файлы должны быть перемещены в одно из следующих местоположений: [.filename]#etc# (настроечные/конфигурационные файлы), [.filename]#libexec# (выполнимые файлы, запускаемые из других программ), [.filename]#sbin# (исполнимые файлы для администраторов/менеджеров системы), [.filename]#info# (документация в формате info для просмотрщика info) или [.filename]#share# (независимые от архитектуры файлы). Обратитесь к man:hier[7] для прояснения деталей; правила, покрывающие [.filename]#/usr#, достаточно хорошо подходят также и к [.filename]#/usr/local#. Исключением являются порты, имеющие дело с "новостями" USENET. Они могут использовать каталог [.filename]#PREFIX/news# для установки своих файлов.
+См. crossref:special[using-python,Использование Python] для получения дополнительной информации о `USES=python`.
+====
+
+[NOTE]
+====
+Бинарные псевдонимы создаются после обработки зависимостей, указанных через `BUILD_DEPENDS` и `LIB_DEPENDS`, но до цели `configure`. Это приводит к различным ограничениям. Например, программы, установленные через `TEST_DEPENDS`, нельзя использовать для создания бинарного псевдонима, так как тестовые зависимости, указанные таким образом, обрабатываются после создания бинарных псевдонимов.
+====
diff --git a/documentation/content/ru/books/porters-handbook/makefiles/_index.po b/documentation/content/ru/books/porters-handbook/makefiles/_index.po
new file mode 100644
index 0000000000..359d99d977
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/makefiles/_index.po
@@ -0,0 +1,14066 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookmakefiles_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1
+#, no-wrap
+msgid "Configuring the Makefile for FreeBSD Ports"
+msgstr "Настройка Makefile для портов FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1
+#, no-wrap
+msgid "Chapter 5. Configuring the Makefile"
+msgstr "Глава 5. Настройка Makefile"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:14
+#, no-wrap
+msgid "Configuring the Makefile"
+msgstr "Настройка Makefile"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:55
+msgid ""
+"Configuring the [.filename]#Makefile# is pretty simple, and again we suggest "
+"looking at existing examples before starting. Also, there is a "
+"crossref:porting-samplem[porting-samplem,sample Makefile] in this handbook, "
+"so take a look and please follow the ordering of variables and sections in "
+"that template to make the port easier for others to read."
+msgstr ""
+"Настройка [.filename]#Makefile# довольно проста, и мы снова рекомендуем "
+"изучить существующие примеры перед началом. Также в этом руководстве есть "
+"crossref:porting-samplem[porting-samplem,пример Makefile], поэтому "
+"ознакомьтесь с ним и, пожалуйста, соблюдайте порядок переменных и разделов в "
+"этом шаблоне, чтобы порт был удобнее для чтения другими."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:57
+msgid ""
+"Consider these problems in sequence during the design of the new "
+"[.filename]#Makefile#:"
+msgstr ""
+"Рассмотрите эти проблемы последовательно при разработке нового "
+"[.filename]#Makefile#:"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:59
+#, no-wrap
+msgid "The Original Source"
+msgstr "Оригинальный исходный код"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:63
+msgid ""
+"Does it live in `DISTDIR` as a standard ``gzip``ped tarball named something "
+"like [.filename]#foozolix-1.2.tar.gz#? If so, go on to the next step. If "
+"not, the distribution file format might require overriding one or more of "
+"`DISTVERSION`, `DISTNAME`, `EXTRACT_CMD`, `EXTRACT_BEFORE_ARGS`, "
+"`EXTRACT_AFTER_ARGS`, `EXTRACT_SUFX`, or `DISTFILES`."
+msgstr ""
+"Находится ли он в `DISTDIR` в виде стандартного архива ``gzip`` с именем "
+"вроде [.filename]#foozolix-1.2.tar.gz#? Если да, переходите к следующему "
+"шагу. Если нет, возможно, для формата имени файла дистрибутива потребуется "
+"переопределить одну или несколько переменных: `DISTVERSION`, `DISTNAME`, "
+"`EXTRACT_CMD`, `EXTRACT_BEFORE_ARGS`, `EXTRACT_AFTER_ARGS`, `EXTRACT_SUFX` "
+"или `DISTFILES`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:66
+msgid ""
+"In the worst case, create a custom `do-extract` target to override the "
+"default. This is rarely, if ever, necessary."
+msgstr ""
+"В худшем случае создайте пользовательскую цель `do-extract`, чтобы "
+"переопределить стандартную. Это редко, если вообще когда-либо, необходимо."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:68
+#, no-wrap
+msgid "Naming"
+msgstr "Именование"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:71
+msgid ""
+"The first part of the port's [.filename]#Makefile# names the port, describes "
+"its version number, and lists it in the correct category."
+msgstr ""
+"Первая часть [.filename]#Makefile# порта указывает его название, описывает "
+"номер версии и помещает его в соответствующую категорию."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:73
+#, no-wrap
+msgid "`PORTNAME`"
+msgstr "`PORTNAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:77
+msgid ""
+"Set `PORTNAME` to the base name of the software. It is used as the base for "
+"the FreeBSD package, and for crossref:makefiles[makefile-"
+"distname,`DISTNAME`]."
+msgstr ""
+"Установите `PORTNAME` как базовое имя программы. Оно используется в качестве "
+"основы для пакета FreeBSD и для crossref:makefiles[makefile-"
+"distname,`DISTNAME`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:84
+msgid ""
+"The package name must be unique across the entire ports tree. Make sure "
+"that the `PORTNAME` is not already in use by an existing port, and that no "
+"other port already has the same `PKGBASE`. If the name has already been "
+"used, add either crossref:makefiles[porting-pkgnameprefix-"
+"suffix,`PKGNAMEPREFIX` or `PKGNAMESUFFIX`]."
+msgstr ""
+"Название пакета должно быть уникальным во всём дереве портов. Убедитесь, что "
+"`PORTNAME` ещё не используется существующим портом и что никакой другой порт "
+"уже не имеет такой же `PKGBASE`. Если имя уже занято, добавьте либо "
+"crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMEPREFIX`, либо "
+"`PKGNAMESUFFIX`]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:87
+#, no-wrap
+msgid "Versions, `DISTVERSION` _or_ `PORTVERSION`"
+msgstr "Версии, `DISTVERSION` _или_ `PORTVERSION`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:90
+msgid "Set `DISTVERSION` to the version number of the software."
+msgstr "Установите `DISTVERSION` в номер версии программы."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:94
+msgid ""
+"`PORTVERSION` is the version used for the FreeBSD package. It will be "
+"automatically derived from `DISTVERSION` to be compatible with FreeBSD's "
+"package versioning scheme. If the version contains _letters_, it might be "
+"needed to set `PORTVERSION` and not `DISTVERSION`."
+msgstr ""
+"`PORTVERSION` — это версия, используемая для пакета FreeBSD. Она будет "
+"автоматически вычислена из `DISTVERSION` в соответствии со схемой "
+"версионирования пакетов FreeBSD. Если версия содержит _буквы_, может "
+"потребоваться задать `PORTVERSION` вместо `DISTVERSION`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:98
+msgid "Only one of `PORTVERSION` and `DISTVERSION` can be set at a time."
+msgstr ""
+"Только одна из переменных `PORTVERSION` и `DISTVERSION` может быть "
+"установлена одновременно."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:101
+msgid ""
+"From time to time, some software will use a version scheme that is not "
+"compatible with how `DISTVERSION` translates in `PORTVERSION`."
+msgstr ""
+"Время от времени некоторые программы используют схему версионирования, "
+"которая несовместима с тем, как `DISTVERSION` преобразуется в `PORTVERSION`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:106
+msgid ""
+"When updating a port, it is possible to use the `-t` argument of man:pkg-"
+"version[8] to check if the new version is greater or lesser than before. "
+"See below on how to use man:pkg-version[8] to compare versions."
+msgstr ""
+"При обновлении порта можно использовать аргумент `-t` утилиты man:pkg-"
+"version[8], чтобы проверить, является ли новая версия больше или меньше "
+"предыдущей. Смотрите ниже, как использовать man:pkg-version[8] для сравнения "
+"версий."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:109
+#, no-wrap
+msgid "Using man:pkg-version[8] to Compare Versions"
+msgstr "Использование man:pkg-version[8] для сравнения версий"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:113
+msgid ""
+"`pkg version -t` takes two versions as arguments, it will respond with `<`, "
+"`=` or `>` if the first version is less, equal, or more than the second "
+"version, respectively."
+msgstr ""
+"`pkg version -t` принимает две версии в качестве аргументов и возвращает "
+"`<`, `=` или `>`, если первая версия меньше, равна или больше второй версии "
+"соответственно."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:119
+#, no-wrap
+msgid ""
+"% pkg version -t 1.2 1.3\n"
+"< <.>\n"
+"% pkg version -t 1.2 1.2\n"
+msgstr ""
+"% pkg version -t 1.2 1.3\n"
+"< <.>\n"
+"% pkg version -t 1.2 1.2\n"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:119
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:121
+#, no-wrap
+msgid "<.>"
+msgstr "<.>"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:121
+msgid "% pkg version -t 1.2 1.2.0"
+msgstr "% pkg version -t 1.2 1.2.0"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:128
+msgid ""
+"% pkg version -t 1.2 1.2.p1 > <.> % pkg version -t 1.2.a1 1.2.b1 < <.> % pkg "
+"version -t 1.2 1.2p1 < <.>"
+msgstr ""
+"% pkg version -t 1.2 1.2.p1\n"
+"> <.>\n"
+"% pkg version -t 1.2.a1 1.2.b1\n"
+"< <.>\n"
+"% pkg version -t 1.2 1.2p1\n"
+"< <.>"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:131
+msgid "`1.2` is before `1.3`."
+msgstr "`1.2` идёт перед `1.3`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:132
+msgid "`1.2` and `1.2` are equal as they have the same version."
+msgstr "`1.2` и `1.2` равны, так как имеют одинаковую версию."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:133
+msgid "`1.2` and `1.2.0` are equal as nothing equals zero."
+msgstr "`1.2` и `1.2.0` равны, так как ноль ничего не значит."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:134
+msgid "`1.2` is after `1.2.p1` as `.p1`, think \"pre-release 1\"."
+msgstr ""
+"`1.2` идёт после `1.2.p1`, так как `.p1` означает «pre-release 1» "
+"(предрелизная версия 1)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:135
+msgid ""
+"`1.2.a1` is before `1.2.b1`, think \"alpha\" and \"beta\", and `a` is before "
+"`b`."
+msgstr ""
+"`1.2.a1` предшествует `1.2.b1`, представьте \"alpha\" и \"beta\", где `a` "
+"идёт перед `b`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:136
+msgid ""
+"`1.2` is before `1.2p1` as `2p1`, think \"2, patch level 1\" which is a "
+"version after any `2.X` but before `3`."
+msgstr ""
+"`1.2` находится перед `1.2p1`, так же как `2p1` (читается как \"2, уровень "
+"исправления 1\") — это версия, следующая после любой `2.X`, но перед `3`."
+
+#. type: delimited block * 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:141
+msgid ""
+"In here, the `a`, `b`, and `p` are used as if meaning \"alpha\", \"beta\" or "
+"\"pre-release\" and \"patch level\", but they are only letters and are "
+"sorted alphabetically, so any letter can be used, and they will be sorted "
+"appropriately."
+msgstr ""
+"Здесь `a`, `b` и `p` используются так, как если бы они означали \"альфа\", "
+"\"бета\" или \"пре-релиз\" и \"уровень патча\", но на самом деле это просто "
+"буквы, которые сортируются в алфавитном порядке, поэтому можно использовать "
+"любую букву, и они будут отсортированы соответствующим образом."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:145
+#, no-wrap
+msgid "Examples of `DISTVERSION` and the Derived `PORTVERSION`"
+msgstr "Примеры `DISTVERSION` и производной `PORTVERSION`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:149
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:499
+#, no-wrap
+msgid "DISTVERSION"
+msgstr "DISTVERSION"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:151
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:500
+#, no-wrap
+msgid "PORTVERSION"
+msgstr ".PORTVERSION"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:152
+#, no-wrap
+msgid "0.7.1d"
+msgstr "0.7.1d"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:154
+#, no-wrap
+msgid "0.7.1.d"
+msgstr "0.7.1.d"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:155
+#, no-wrap
+msgid "10Alpha3"
+msgstr "10Alpha3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:157
+#, no-wrap
+msgid "10.a3"
+msgstr "10.a3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:158
+#, no-wrap
+msgid "3Beta7-pre2"
+msgstr "3Beta7-pre2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:160
+#, no-wrap
+msgid "3.b7.p2"
+msgstr "3.b7.p2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:161
+#, no-wrap
+msgid "8:f_17"
+msgstr "8:f_17"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:162
+#, no-wrap
+msgid "8f.17"
+msgstr "8f.17"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:165
+#, no-wrap
+msgid "Using `DISTVERSION`"
+msgstr "Использование `DISTVERSION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:169
+msgid ""
+"When the version only contains numbers separated by dots, dashes or "
+"underscores, use `DISTVERSION`."
+msgstr ""
+"Если версия содержит только числа, разделённые точками, тире или "
+"подчёркиваниями, используйте `DISTVERSION`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:174
+#, no-wrap
+msgid ""
+"PORTNAME= nekoto\n"
+"DISTVERSION=\t1.2-4\n"
+msgstr ""
+"PORTNAME= nekoto\n"
+"DISTVERSION=\t1.2-4\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:177
+msgid "It will generate a `PORTVERSION` of `1.2.4`."
+msgstr "Это сгенерирует `PORTVERSION` равный `1.2.4`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:180
+#, no-wrap
+msgid "Using `DISTVERSION` When the Version Starts with a Letter or a Prefix"
+msgstr "Использование `DISTVERSION` когда версия начинается с буквы или префикса"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:184
+msgid ""
+"When the version starts or ends with a letter, or a prefix or a suffix that "
+"is not part of the version, use `DISTVERSIONPREFIX`, `DISTVERSION`, and "
+"`DISTVERSIONSUFFIX`."
+msgstr ""
+"Когда версия начинается или заканчивается буквой, или префиксом, или "
+"суффиксом, которые не являются частью версии, используйте "
+"`DISTVERSIONPREFIX`, `DISTVERSION` и `DISTVERSIONSUFFIX`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:186
+msgid "If the version is `v1.2-4`:"
+msgstr "Если версия `v1.2-4`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:192
+#, no-wrap
+msgid ""
+"PORTNAME= nekoto\n"
+"DISTVERSIONPREFIX= v\n"
+"DISTVERSION=\t1_2_4\n"
+msgstr ""
+"PORTNAME= nekoto\n"
+"DISTVERSIONPREFIX= v\n"
+"DISTVERSION=\t1_2_4\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:196
+msgid ""
+"Some of the time, projects using GitHub will use their name in their "
+"versions. For example, the version could be `nekoto-1.2-4`:"
+msgstr ""
+"Некоторые проекты, использующие GitHub, могут включать своё название в "
+"версии. Например, версия может выглядеть как `nekoto-1.2-4`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:202
+#, no-wrap
+msgid ""
+"PORTNAME= nekoto\n"
+"DISTVERSIONPREFIX= nekoto-\n"
+"DISTVERSION=\t1.2_4\n"
+msgstr ""
+"PORTNAME= nekoto\n"
+"DISTVERSIONPREFIX= nekoto-\n"
+"DISTVERSION=\t1.2_4\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:205
+msgid ""
+"Those projects also sometimes use some string at the end of the version, for "
+"example, `1.2-4_RELEASE`:"
+msgstr ""
+"Эти проекты также иногда используют строку в конце версии, например, "
+"`1.2-4_RELEASE`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:211
+#, no-wrap
+msgid ""
+"PORTNAME= nekoto\n"
+"DISTVERSION=\t1.2-4\n"
+"DISTVERSIONSUFFIX= _RELEASE\n"
+msgstr ""
+"PORTNAME= nekoto\n"
+"DISTVERSION=\t1.2-4\n"
+"DISTVERSIONSUFFIX= _RELEASE\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:214
+msgid "Or they do both, for example, `nekoto-1.2-4_RELEASE`:"
+msgstr "Или они делают и то, и другое, например, `nekoto-1.2-4_RELEASE`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:221
+#, no-wrap
+msgid ""
+"PORTNAME= nekoto\n"
+"DISTVERSIONPREFIX= nekoto-\n"
+"DISTVERSION=\t1.2-4\n"
+"DISTVERSIONSUFFIX= _RELEASE\n"
+msgstr ""
+"PORTNAME= nekoto\n"
+"DISTVERSIONPREFIX= nekoto-\n"
+"DISTVERSION=\t1.2-4\n"
+"DISTVERSIONSUFFIX= _RELEASE\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:224
+msgid ""
+"`DISTVERSIONPREFIX` and `DISTVERSIONSUFFIX` will not be used while "
+"constructing `PORTVERSION`, but only used in `DISTNAME`."
+msgstr ""
+"`DISTVERSIONPREFIX` и `DISTVERSIONSUFFIX` не будут использоваться при "
+"формировании `PORTVERSION`, а только в `DISTNAME`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:226
+msgid "All will generate a `PORTVERSION` of `1.2.4`."
+msgstr "Все сгенерируют `PORTVERSION` равный `1.2.4`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:229
+#, no-wrap
+msgid "Using `DISTVERSION` When the Version Contains Letters Meaning \"alpha\", \"beta\", or \"pre-release\""
+msgstr "Использование `DISTVERSION`, когда версия содержит буквы, означающие \"alpha\", \"beta\" или \"pre-release\""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:233
+msgid ""
+"When the version contains numbers separated by dots, dashes or underscores, "
+"and letters are used to mean \"alpha\", \"beta\" or \"pre-release\", which "
+"is, before the version without the letters, use `DISTVERSION`."
+msgstr ""
+"Если версия содержит числа, разделённые точками, тире или подчёркиваниями, а "
+"буквы используются для обозначения \"альфа\", \"бета\" или \"предварительной "
+"версии\" (то есть до версии без букв), используйте `DISTVERSION`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:238
+#, no-wrap
+msgid ""
+"PORTNAME= nekoto\n"
+"DISTVERSION=\t1.2-pre4\n"
+msgstr ""
+"PORTNAME= nekoto\n"
+"DISTVERSION=\t1.2-pre4\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:244
+#, no-wrap
+msgid ""
+"PORTNAME= nekoto\n"
+"DISTVERSION=\t1.2p4\n"
+msgstr ""
+"PORTNAME= nekoto\n"
+"DISTVERSION=\t1.2p4\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:247
+msgid ""
+"Both will generate a `PORTVERSION` of `1.2.p4` which is before than 1.2. "
+"man:pkg-version[8] can be used to check that fact:"
+msgstr ""
+"Оба варианта создадут `PORTVERSION` равную `1.2.p4`, что предшествует версии "
+"1.2. Для проверки этого факта можно использовать man:pkg-version[8]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:252
+#, no-wrap
+msgid ""
+"% pkg version -t 1.2.p4 1.2\n"
+"<\n"
+msgstr ""
+"% pkg version -t 1.2.p4 1.2\n"
+"<\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:257
+#, no-wrap
+msgid "Not Using `DISTVERSION` When the Version Contains Letters Meaning \"Patch Level\""
+msgstr "Не использовать `DISTVERSION`, если версия содержит буквы, означающие \"уровень патча\""
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:261
+msgid ""
+"When the version contains letters that are not meant as \"alpha\", \"beta\", "
+"or \"pre\", but more in a \"patch level\", and meaning after the version "
+"without the letters, use `PORTVERSION`."
+msgstr ""
+"Если версия содержит буквы, которые не означают \"alpha\", \"beta\" или "
+"\"pre\", а скорее указывают на \"уровень исправления\" и следуют после "
+"версии без букв, используйте `PORTVERSION`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:266
+#, no-wrap
+msgid ""
+"PORTNAME= nekoto\n"
+"PORTVERSION=\t1.2p4\n"
+msgstr ""
+"PORTNAME= nekoto\n"
+"PORTVERSION=\t1.2p4\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:270
+msgid ""
+"In this case, using `DISTVERSION` is not possible because it would generate "
+"a version of `1.2.p4` which would be before `1.2` and not after. man:pkg-"
+"version[8] will verify this:"
+msgstr ""
+"В данном случае использование `DISTVERSION` невозможно, так как это приведёт "
+"к генерации версии `1.2.p4`, которая будет считаться более ранней, чем "
+"`1.2`, а не более поздней. man:pkg-version[8] подтвердит это:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:277
+#, no-wrap
+msgid ""
+"% pkg version -t 1.2 1.2.p4\n"
+"> <.>\n"
+"% pkg version -t 1.2 1.2p4\n"
+"< <.>\n"
+msgstr ""
+"% pkg version -t 1.2 1.2.p4\n"
+"> <.>\n"
+"% pkg version -t 1.2 1.2p4\n"
+"< <.>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:280
+msgid "`1.2` is after `1.2.p4`, which is _wrong_ in this case."
+msgstr "`1.2` идёт после `1.2.p4`, что в данном случае _неверно_."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:281
+msgid "`1.2` is before `1.2p4`, which is what was needed."
+msgstr "`1.2` находится перед `1.2p4`, что и требовалось."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:287
+msgid ""
+"For some more advanced examples of setting `PORTVERSION`, when the "
+"software's versioning is really not compatible with FreeBSD's, or `DISTNAME` "
+"when the distribution file does not contain the version itself, see "
+"crossref:makefiles[makefile-distname, `DISTNAME`]."
+msgstr ""
+"Для более сложных примеров настройки `PORTVERSION`, когда версия "
+"программного обеспечения действительно несовместима с FreeBSD, или "
+"`DISTNAME`, когда файл дистрибутива не содержит саму версию, см. "
+"crossref:makefiles[makefile-distname, `DISTNAME`]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:289
+#, no-wrap
+msgid "`PORTREVISION` and `PORTEPOCH`"
+msgstr "`PORTREVISION` и `PORTEPOCH`"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:292
+#, no-wrap
+msgid "`PORTREVISION`"
+msgstr "`PORTREVISION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:296
+msgid ""
+"`PORTREVISION` is a monotonically increasing value which is reset to 0 with "
+"every increase of `DISTVERSION`, typically every time there is a new "
+"official vendor release. If `PORTREVISION` is non-zero, the value is "
+"appended to the package name. Changes to `PORTREVISION` are used by "
+"automated tools like man:pkg-version[8] to determine that a new package is "
+"available."
+msgstr ""
+"`PORTREVISION` — это монотонно возрастающее значение, которое сбрасывается в "
+"0 при каждом увеличении `DISTVERSION`, обычно при каждом новом официальном "
+"выпуске от поставщика. Если `PORTREVISION` не равен нулю, его значение "
+"добавляется к имени пакета. Изменения `PORTREVISION` используются "
+"автоматизированными инструментами, такими как man:pkg-version[8], для "
+"определения доступности нового пакета."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:300
+msgid ""
+"`PORTREVISION` must be increased each time a change is made to the port that "
+"changes the generated package in any way. That includes changes that only "
+"affect a package built with non-default crossref:makefiles[makefile-"
+"options,options]."
+msgstr ""
+"`PORTREVISION` должен быть увеличен каждый раз, когда в порт вносятся "
+"изменения, которые так или иначе влияют на сгенерированный пакет. Это "
+"включает изменения, затрагивающие только пакеты, собранные с нестандартными "
+"crossref:makefiles[makefile-options,опциями]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:302
+msgid "Examples of when `PORTREVISION` must be bumped:"
+msgstr "Примеры случаев, когда необходимо увеличить `PORTREVISION`:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:304
+msgid ""
+"Addition of patches to correct security vulnerabilities, bugs, or to add new "
+"functionality to the port."
+msgstr ""
+"Добавление исправлений для устранения уязвимостей безопасности, ошибок или "
+"для добавления новой функциональности в порт."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:305
+msgid ""
+"Changes to the port [.filename]#Makefile# to enable or disable compile-time "
+"options in the package."
+msgstr ""
+"Изменения в [.filename]#Makefile# порта для включения или отключения "
+"параметров сборки в пакете."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:306
+msgid ""
+"Changes in the packing list or the install-time behavior of the package. For "
+"example, a change to a script which generates initial data for the package, "
+"like man:ssh[1] host keys."
+msgstr ""
+"Изменения в списке файлов пакета или в поведении во время установки. "
+"Например, изменение скрипта, который генерирует начальные данные для пакета, "
+"такие как ключи хоста man:ssh[1]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:307
+msgid ""
+"Version bump of a port's shared library dependency (in this case, someone "
+"trying to install the old package after installing a newer version of the "
+"dependency will fail since it will look for the old libfoo.x instead of "
+"libfoo.(x+1))."
+msgstr ""
+"Увеличение версии зависимости порта от общей библиотеки (в данном случае, "
+"попытка установить старый пакет после установки более новой версии "
+"зависимости завершится неудачей, так как будет искаться старая версия "
+"libfoo.x вместо libfoo.(x+1))."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:308
+msgid ""
+"Silent changes to the port distfile which have significant functional "
+"differences. For example, changes to the distfile requiring a correction to "
+"[.filename]#distinfo# with no corresponding change to `DISTVERSION`, where a "
+"`diff -ru` of the old and new versions shows non-trivial changes to the code."
+msgstr ""
+"Тихие изменения в дистрибутивном файле порта, которые имеют значительные "
+"функциональные отличия. Например, изменения в дистрибутивном файле, "
+"требующие корректировки файла [.filename]#distinfo# без соответствующего "
+"изменения `DISTVERSION`, когда сравнение `diff -ru` старой и новой версий "
+"показывает нетривиальные изменения в коде."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:309
+msgid "Changes to `MAINTAINER`."
+msgstr "Изменения в `MAINTAINER`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:311
+msgid "Examples of changes which do not require a `PORTREVISION` bump:"
+msgstr "Примеры изменений, которые не требуют увеличения `PORTREVISION`:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:313
+msgid ""
+"Style changes to the port skeleton with no functional change to what appears "
+"in the resulting package."
+msgstr ""
+"Стилевые изменения в каркасе портов без функциональных изменений в итоговом "
+"пакете."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:314
+msgid ""
+"Changes to `MASTER_SITES` or other functional changes to the port which do "
+"not affect the resulting package."
+msgstr ""
+"Изменения в `MASTER_SITES` или другие функциональные изменения порта, "
+"которые не влияют на итоговый пакет."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:315
+msgid ""
+"Trivial patches to the distfile such as correction of typos, which are not "
+"important enough that users of the package have to go to the trouble of "
+"upgrading."
+msgstr ""
+"Тривиальные исправления в дистрибутивном файле, такие как исправление "
+"опечаток, которые не настолько важны, чтобы пользователи пакета были "
+"вынуждены тратить время на обновление."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:316
+msgid ""
+"Build fixes which cause a package to become compilable where it was "
+"previously failing. As long as the changes do not introduce any functional "
+"change on any other platforms on which the port did previously build. Since "
+"`PORTREVISION` reflects the content of the package, if the package was not "
+"previously buildable then there is no need to increase `PORTREVISION` to "
+"mark a change."
+msgstr ""
+"Исправления сборки, которые позволяют пакету компилироваться там, где ранее "
+"это не удавалось. При условии, что изменения не вносят функциональных "
+"изменений на других платформах, где порт ранее собирался. Поскольку "
+"`PORTREVISION` отражает содержимое пакета, если пакет ранее не мог быть "
+"собран, то нет необходимости увеличивать `PORTREVISION` для обозначения "
+"изменений."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:321
+msgid ""
+"A rule of thumb is to decide whether a change committed to a port is "
+"something which _some_ people would benefit from having. Either because of "
+"an enhancement, fix, or by virtue that the new package will actually work at "
+"all. Then weigh that against that fact that it will cause everyone who "
+"regularly updates their ports tree to be compelled to update. If yes, "
+"`PORTREVISION` must be bumped."
+msgstr ""
+"Эмпирическое правило заключается в том, чтобы решить, является ли изменение, "
+"внесённое в порт, чем-то, что принесёт пользу _некоторым_ пользователям. "
+"Будь то улучшение, исправление или просто факт, что новый пакет вообще будет "
+"работать. Затем необходимо сопоставить это с тем, что всем, кто регулярно "
+"обновляет своё дерево портов, придётся выполнить обновление. Если ответ "
+"положительный, необходимо увеличить `PORTREVISION`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:326
+msgid ""
+"People using binary packages will _never_ see the update if `PORTREVISION` "
+"is not bumped. Without increasing `PORTREVISION`, the package builders have "
+"no way to detect the change and thus, will not rebuild the package."
+msgstr ""
+"Пользователи бинарных пакетов _никогда_ не увидят обновления, если "
+"`PORTREVISION` не увеличен. Без увеличения `PORTREVISION` сборщики пакетов "
+"не могут обнаружить изменение и, следовательно, не пересоберут пакет."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:329
+#, no-wrap
+msgid "`PORTEPOCH`"
+msgstr "`PORTEPOCH`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:333
+msgid ""
+"From time to time a software vendor or FreeBSD porter will do something "
+"silly and release a version of their software which is actually numerically "
+"less than the previous version. An example of this is a port which goes "
+"from foo-20000801 to foo-1.0 (the former will be incorrectly treated as a "
+"newer version since 20000801 is a numerically greater value than 1)."
+msgstr ""
+"Время от времени разработчики программного обеспечения или сопровождающие "
+"портов FreeBSD совершают ошибку и выпускают версию своего ПО, которая "
+"фактически имеет меньший номер по сравнению с предыдущей. Примером может "
+"служить переход с foo-20000801 на foo-1.0 (первая версия будет ошибочно "
+"считаться более новой, поскольку число 20000801 больше, чем 1.0)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:339
+msgid ""
+"The results of version number comparisons are not always obvious. `pkg "
+"version` (see man:pkg-version[8]) can be used to test the comparison of two "
+"version number strings. For example:"
+msgstr ""
+"Результаты сравнения номеров версий не всегда очевидны. Команда `pkg "
+"version` (см. man:pkg-version[8]) может быть использована для проверки "
+"сравнения двух строк с номерами версий. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:344
+#, no-wrap
+msgid ""
+"% pkg version -t 0.031 0.29\n"
+">\n"
+msgstr ""
+"% pkg version -t 0.031 0.29\n"
+">\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:347
+msgid ""
+"The `>` output indicates that version 0.031 is considered greater than "
+"version 0.29, which may not have been obvious to the porter."
+msgstr ""
+"Символ `>` в выводе указывает, что версия 0.031 считается больше, чем версия "
+"0.29, что могло быть неочевидно для сопровождающего."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:354
+msgid ""
+"In situations such as this, `PORTEPOCH` must be increased. If `PORTEPOCH` "
+"is nonzero it is appended to the package name as described in section 0 "
+"above. `PORTEPOCH` must never be decreased or reset to zero, because that "
+"would cause comparison to a package from an earlier epoch to fail. For "
+"example, the package would not be detected as out of date. The new version "
+"number, `1.0,1` in the above example, is still numerically less than the "
+"previous version, 20000801, but the `,1` suffix is treated specially by "
+"automated tools and found to be greater than the implied suffix `,0` on the "
+"earlier package."
+msgstr ""
+"В таких ситуациях необходимо увеличить `PORTEPOCH`. Если `PORTEPOCH` не "
+"равен нулю, он добавляется к имени пакета, как описано в разделе 0 выше. "
+"`PORTEPOCH` никогда не должен уменьшаться или сбрасываться до нуля, потому "
+"что это приведёт к ошибке при сравнении с пакетом из более ранней эпохи. "
+"Например, пакет не будет обнаружен как устаревший. Новый номер версии, "
+"`1.0,1` в приведённом выше примере, всё ещё численно меньше предыдущей "
+"версии, 20000801, но суффикс `,1` обрабатывается автоматизированными "
+"инструментами особым образом и считается большим, чем подразумеваемый "
+"суффикс `,0` у предыдущего пакета."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:357
+msgid ""
+"Dropping or resetting `PORTEPOCH` incorrectly leads to no end of grief. If "
+"the discussion above was not clear enough, please consult the {freebsd-"
+"ports}."
+msgstr ""
+"Неправильное удаление или сброс `PORTEPOCH` приводит к бесконечным "
+"проблемам. Если приведённое выше объяснение недостаточно ясно, обратитесь к "
+"{freebsd-ports}."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:361
+msgid ""
+"It is expected that `PORTEPOCH` will not be used for the majority of ports, "
+"and that sensible use of `DISTVERSION`, or that use `PORTVERSION` carefully, "
+"can often preempt it becoming necessary if a future release of the software "
+"changes the version structure. However, care is needed by FreeBSD porters "
+"when a vendor release is made without an official version number - such as a "
+"code \"snapshot\" release. The temptation is to label the release with the "
+"release date, which will cause problems as in the example above when a new "
+"\"official\" release is made."
+msgstr ""
+"Ожидается, что `PORTEPOCH` не будет использоваться для большинства портов, и "
+"что разумное использование `DISTVERSION` или аккуратное применение "
+"`PORTVERSION` часто может предотвратить необходимость его использования, "
+"если будущий выпуск программного обеспечения изменит структуру версий. "
+"Однако разработчикам портов FreeBSD следует быть осторожными, когда вендор "
+"выпускает релиз без официального номера версии — например, релиз в виде "
+"\"снимка\" кода. Возникает соблазн обозначить такой релиз датой выпуска, что "
+"вызовет проблемы, как в примере выше, когда будет сделан новый "
+"\"официальный\" релиз."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:364
+msgid ""
+"For example, if a snapshot release is made on the date `20000917`, and the "
+"previous version of the software was version `1.2`, do not use `20000917` "
+"for `DISTVERSION`. The correct way is a `DISTVERSION` of `1.2.20000917`, or "
+"similar, so that the succeeding release, say `1.3`, is still a numerically "
+"greater value."
+msgstr ""
+"Например, если снимок выпущен на дату `20000917`, а предыдущая версия "
+"программного обеспечения была `1.2`, не следует использовать `20000917` для "
+"`DISTVERSION`. Правильным будет указать `DISTVERSION` как `1.2.20000917` или "
+"подобное, чтобы следующая версия, например `1.3`, оставалась численно "
+"большей."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:366
+#, no-wrap
+msgid "Example of `PORTREVISION` and `PORTEPOCH` Usage"
+msgstr "Пример использования `PORTREVISION` и `PORTEPOCH`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:369
+msgid ""
+"The `gtkmumble` port, version `0.10`, is committed to the ports collection:"
+msgstr "Порт `gtkmumble` версии `0.10` добавлен в коллекцию портов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:374
+#, no-wrap
+msgid ""
+"PORTNAME=\tgtkmumble\n"
+"DISTVERSION=\t0.10\n"
+msgstr ""
+"PORTNAME=\tgtkmumble\n"
+"DISTVERSION=\t0.10\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:377
+msgid "`PKGNAME` becomes `gtkmumble-0.10`."
+msgstr "`PKGNAME` становится `gtkmumble-0.10`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:380
+msgid ""
+"A security hole is discovered which requires a local FreeBSD patch. "
+"`PORTREVISION` is bumped accordingly."
+msgstr ""
+"Обнаружена уязвимость в безопасности, требующая локального исправления "
+"FreeBSD. `PORTREVISION` соответствующим образом увеличивается."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:386
+#, no-wrap
+msgid ""
+"PORTNAME=\tgtkmumble\n"
+"DISTVERSION=\t0.10\n"
+"PORTREVISION=\t1\n"
+msgstr ""
+"PORTNAME=\tgtkmumble\n"
+"DISTVERSION=\t0.10\n"
+"PORTREVISION=\t1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:389
+msgid "`PKGNAME` becomes `gtkmumble-0.10_1`"
+msgstr "`PKGNAME` принимает значение `gtkmumble-0.10_1`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:393
+msgid ""
+"A new version is released by the vendor, numbered `0.2` (it turns out the "
+"author actually intended `0.10` to actually mean `0.1.0`, not \"what comes "
+"after 0.9\" - oops, too late now). Since the new minor version `2` is "
+"numerically less than the previous version `10`, `PORTEPOCH` must be bumped "
+"to manually force the new package to be detected as \"newer\". Since it is "
+"a new vendor release of the code, `PORTREVISION` is reset to 0 (or removed "
+"from the [.filename]#Makefile#)."
+msgstr ""
+"Выпущена новая версия от поставщика под номером `0.2` (оказывается, автор "
+"изначально подразумевал, что `0.10` на самом деле означает `0.1.0`, а не "
+"\"то, что идет после 0.9\" — увы, теперь уже поздно). Поскольку новая "
+"минорная версия `2` численно меньше предыдущей версии `10`, необходимо "
+"увеличить `PORTEPOCH`, чтобы вручную заставить систему распознавать новый "
+"пакет как \"более новый\". Так как это новый релиз кода от поставщика, "
+"`PORTREVISION` сбрасывается до 0 (или удаляется из [.filename]#Makefile#)."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:399
+#, no-wrap
+msgid ""
+"PORTNAME=\tgtkmumble\n"
+"DISTVERSION=\t0.2\n"
+"PORTEPOCH=\t1\n"
+msgstr ""
+"PORTNAME=\tgtkmumble\n"
+"DISTVERSION=\t0.2\n"
+"PORTEPOCH=\t1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:402
+msgid "`PKGNAME` becomes `gtkmumble-0.2,1`"
+msgstr "`PKGNAME` становится `gtkmumble-0.2,1`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:405
+msgid ""
+"The next release is 0.3. Since `PORTEPOCH` never decreases, the version "
+"variables are now:"
+msgstr ""
+"Следующий выпуск — 0.3. Поскольку `PORTEPOCH` никогда не уменьшается, "
+"переменные версий теперь выглядят так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:411
+#, no-wrap
+msgid ""
+"PORTNAME=\tgtkmumble\n"
+"DISTVERSION=\t0.3\n"
+"PORTEPOCH=\t1\n"
+msgstr ""
+"PORTNAME=\tgtkmumble\n"
+"DISTVERSION=\t0.3\n"
+"PORTEPOCH=\t1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:414
+msgid "`PKGNAME` becomes `gtkmumble-0.3,1`"
+msgstr "`PKGNAME` принимает значение `gtkmumble-0.3,1`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:419
+msgid ""
+"If `PORTEPOCH` were reset to `0` with this upgrade, someone who had "
+"installed the `gtkmumble-0.10_1` package would not detect the "
+"`gtkmumble-0.3` package as newer, since `3` is still numerically less than "
+"`10`. Remember, this is the whole point of `PORTEPOCH` in the first place."
+msgstr ""
+"Если бы `PORTEPOCH` был сброшен в `0` при этом обновлении, пользователь, "
+"установивший пакет `gtkmumble-0.10_1`, не увидел бы пакет `gtkmumble-0.3` "
+"как более новый, поскольку `3` всё ещё численно меньше, чем `10`. Помните, в "
+"этом и заключается вся суть `PORTEPOCH` изначально."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:422
+#, no-wrap
+msgid "`PKGNAMEPREFIX` and `PKGNAMESUFFIX`"
+msgstr "`PKGNAMEPREFIX` и `PKGNAMESUFFIX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:429
+msgid ""
+"Two optional variables, `PKGNAMEPREFIX` and `PKGNAMESUFFIX`, are combined "
+"with `PORTNAME` and `PORTVERSION` to form `PKGNAME` as `${PKGNAMEPREFIX}$"
+"{PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`. Make sure this conforms to our "
+"crossref:makefiles[porting-pkgname,guidelines for a good package name]. In "
+"particular, the use of a hyphen (`-`) in `PORTVERSION` is _not_ allowed. "
+"Also, if the package name has the _language-_ or the _-compiled.specifics_ "
+"part (see below), use `PKGNAMEPREFIX` and `PKGNAMESUFFIX`, respectively. Do "
+"not make them part of `PORTNAME`."
+msgstr ""
+"Две необязательные переменные, `PKGNAMEPREFIX` и `PKGNAMESUFFIX`, "
+"объединяются с `PORTNAME` и `PORTVERSION` для формирования `PKGNAME` в виде "
+"`${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-${PORTVERSION}`. Убедитесь, что "
+"это соответствует нашим crossref:makefiles[porting-pkgname,рекомендациям по "
+"именованию пакетов]. В частности, использование дефиса (`-`) в `PORTVERSION` "
+"_не_ допускается. Кроме того, если имя пакета содержит часть _language-_ или "
+"_-compiled.specifics_ (см. ниже), используйте `PKGNAMEPREFIX` и "
+"`PKGNAMESUFFIX` соответственно. Не включайте их в `PORTNAME`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:431
+#, no-wrap
+msgid "Package Naming Conventions"
+msgstr "Соглашения о наименовании пакетов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:435
+msgid ""
+"These are the conventions to follow when naming packages. This is to make "
+"the package directory easy to scan, as there are already thousands of "
+"packages and users are going to turn away if they hurt their eyes!"
+msgstr ""
+"Вот соглашения, которым следует придерживаться при наименовании пакетов. Это "
+"сделано для того, чтобы каталог пакетов было легко просматривать, поскольку "
+"там уже тысячи пакетов, и пользователи могут отказаться от их использования, "
+"если это будет напрягать их глаза!"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:437
+msgid ""
+"Package names take the form of [.filename]#language_region-name-"
+"compiled.specifics-version.numbers#."
+msgstr ""
+"Имена пакетов имеют формат [.filename]#language_region-name-"
+"compiled.specifics-version.numbers#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:440
+msgid ""
+"The package name is defined as `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-$"
+"{PORTVERSION}`. Make sure to set the variables to conform to that format."
+msgstr ""
+"Имя пакета определяется как `${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX}-$"
+"{PORTVERSION}`. Убедитесь, что переменные заданы в соответствии с этим "
+"форматом."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:442
+#, no-wrap
+msgid "[.filename]#language_region-#"
+msgstr "[.filename]#language_region-#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:446
+msgid ""
+"FreeBSD strives to support the native language of its users. The _language-"
+"_ part is a two letter abbreviation of the natural language defined by "
+"ISO-639 when the port is specific to a certain language. Examples are `ja` "
+"for Japanese, `ru` for Russian, `vi` for Vietnamese, `zh` for Chinese, `ko` "
+"for Korean and `de` for German."
+msgstr ""
+"FreeBSD стремится поддерживать родной язык своих пользователей. Часть "
+"_language-_ представляет собой двухбуквенное сокращение естественного языка, "
+"определённое стандартом ISO-639, когда порт относится к определённому "
+"языку. Примерами являются `ja` для японского, `ru` для русского, `vi` для "
+"вьетнамского, `zh` для китайского, `ko` для корейского и `de` для немецкого."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:449
+msgid ""
+"If the port is specific to a certain region within the language area, add "
+"the two letter country code as well. Examples are `en_US` for US English "
+"and `fr_CH` for Swiss French."
+msgstr ""
+"Если порт относится к определённому региону в языковой зоне, добавьте также "
+"двухбуквенный код страны. Например, `en_US` для американского английского и "
+"`fr_CH` для швейцарского французского."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:451
+msgid "The _language-_ part is set in `PKGNAMEPREFIX`."
+msgstr "Часть _language-_ задается в `PKGNAMEPREFIX`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:453
+#, no-wrap
+msgid "[.filename]#name#"
+msgstr "[.filename]#name#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:458
+msgid ""
+"Make sure that the port's name and version are clearly separated and placed "
+"into `PORTNAME` and `DISTVERSION`. The only reason for `PORTNAME` to "
+"contain a version part is if the upstream distribution is really named that "
+"way, as in the package:textproc/libxml2[] or package:japanese/kinput2-"
+"freewnn[] ports. Otherwise, `PORTNAME` cannot contain any version-specific "
+"information. It is quite normal for several ports to have the same "
+"`PORTNAME`, as the package:www/apache*[] ports do; in that case, different "
+"versions (and different index entries) are distinguished by `PKGNAMEPREFIX` "
+"and `PKGNAMESUFFIX` values."
+msgstr ""
+"Убедитесь, что название порта и его версия четко разделены и указаны в "
+"`PORTNAME` и `DISTVERSION`. Единственная причина, по которой `PORTNAME` "
+"может содержать часть версии, — это если вышестоящее распространяемое ПО "
+"действительно так названо, как в портах package:textproc/libxml2[] или "
+"package:japanese/kinput2-freewnn[]. В противном случае `PORTNAME` не может "
+"содержать информацию о версии. Довольно нормально, когда несколько портов "
+"имеют одинаковый `PORTNAME`, как это делают порты package:www/apache*[]; в "
+"таком случае разные версии (и разные записи в индексе) различаются "
+"значениями `PKGNAMEPREFIX` и `PKGNAMESUFFIX`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:461
+msgid ""
+"There is a tradition of naming `Perl 5` modules by prepending `p5-` and "
+"converting the double-colon separator to a hyphen. For example, the "
+"`Data::Dumper` module becomes `p5-Data-Dumper`."
+msgstr ""
+"Существует традиция называть модули `Perl 5`, добавляя префикс `p5-` и "
+"заменя разделитель в виде двойного двоеточия на дефис. Например, модуль "
+"`Data::Dumper` становится `p5-Data-Dumper`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:462
+#, no-wrap
+msgid "[.filename]#-compiled.specifics#"
+msgstr "[.filename]#-compiled.specifics#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:467
+msgid ""
+"If the port can be built with different crossref:makefiles[makefile-"
+"masterdir,hardcoded defaults] (usually part of the directory name in a "
+"family of ports), the _-compiled.specifics_ part states the compiled-in "
+"defaults. The hyphen is optional. Examples are paper size and font units."
+msgstr ""
+"Если порт может быть собран с различными crossref:makefiles[makefile-"
+"masterdir,жестко заданными значениями по умолчанию] (обычно это часть имени "
+"каталога в семействе портов), часть _-compiled.specifics_ указывает "
+"скомпилированные значения по умолчанию. Дефис является необязательным. "
+"Примерами могут служить размер бумаги и единицы измерения шрифтов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:469
+msgid "The _-compiled.specifics_ part is set in `PKGNAMESUFFIX`."
+msgstr "Часть _-compiled.specifics_ задаётся в `PKGNAMESUFFIX`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:471
+#, no-wrap
+msgid "[.filename]#-version.numbers#"
+msgstr "[.filename]#-version.numbers#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:477
+msgid ""
+"The version string follows a dash (`-`) and is a period-separated list of "
+"integers and single lowercase alphabetics. In particular, it is not "
+"permissible to have another dash inside the version string. The only "
+"exception is the string `pl` (meaning \"patchlevel\"), which can be used "
+"_only_ when there are no major and minor version numbers in the software. "
+"If the software version has strings like \"alpha\", \"beta\", \"rc\", or "
+"\"pre\", take the first letter and put it immediately after a period. If "
+"the version string continues after those names, the numbers follow the "
+"single alphabet without an extra period between them (for example, `1.0b2`)."
+msgstr ""
+"Строка версии следует после тире (`-`) и представляет собой разделённый "
+"точками список целых чисел и строчных букв латинского алфавита. В частности, "
+"не допускается использование дополнительных тире внутри строки версии. "
+"Единственное исключение — строка `pl` (означающая \"уровень исправления\"), "
+"которую можно использовать _только_ в случае отсутствия у программного "
+"обеспечения номеров основной и дополнительной версий. Если в версии "
+"программного обеспечения встречаются строки типа \"alpha\", \"beta\", \"rc\" "
+"или \"pre\", следует взять первую букву и поместить её сразу после точки. "
+"Если после таких названий строка версии продолжается, числа следуют за "
+"буквой без дополнительной точки между ними (например, `1.0b2`)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:481
+msgid ""
+"The idea is to make it easier to sort ports by looking at the version "
+"string. In particular, make sure version number components are always "
+"delimited by a period, and if the date is part of the string, use the "
+"`d__yyyy.mm.dd__` format, not `_dd.mm.yyyy_` or the non-Y2K compliant "
+"`_yy.mm.dd_` format. It is important to prefix the version with a letter, "
+"here `d` (for date), in case a release with an actual version number is "
+"made, which would be numerically less than `_yyyy_`."
+msgstr ""
+"Идея заключается в упрощении сортировки портов за счёт анализа строки "
+"версии. В частности, необходимо убедиться, что компоненты номера версии "
+"всегда разделены точкой, а если дата является частью строки, использовать "
+"формат `d__yyyy.mm.dd__`, а не `_dd.mm.yyyy_` или не соответствующий "
+"стандарту Y2K формат `_yy.mm.dd_`. Важно добавлять перед версией букву, в "
+"данном случае `d` (от слова \"дата\"), на случай, если будет выпущена версия "
+"с фактическим номером, который численно окажется меньше `_yyyy_`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:487
+msgid ""
+"Package name must be unique among all of the ports tree, check that there is "
+"not already a port with the same `PORTNAME` and if there is add one of "
+"crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMEPREFIX` or "
+"`PKGNAMESUFFIX`]."
+msgstr ""
+"Название пакета должно быть уникальным среди всех портов в дереве. "
+"Убедитесь, что порт с таким же `PORTNAME` ещё не существует, и если он есть, "
+"добавьте один из crossref:makefiles[porting-pkgnameprefix-"
+"suffix,`PKGNAMEPREFIX` или `PKGNAMESUFFIX`]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:490
+msgid ""
+"Here are some (real) examples on how to convert the name as called by the "
+"software authors to a suitable package name, for each line, only one of "
+"`DISTVERSION` or `PORTVERSION` is set in, depending on which would be used "
+"in the port's [.filename]#Makefile#:"
+msgstr ""
+"Вот несколько (реальных) примеров преобразования названия, указанного "
+"авторами программного обеспечения, в подходящее имя пакета. В каждой строке "
+"указана только одна из переменных `DISTVERSION` или `PORTVERSION`, в "
+"зависимости от того, какая используется в [.filename]#Makefile# порта:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:491
+#, no-wrap
+msgid "Package Naming Examples"
+msgstr "Примеры наименования пакетов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:495
+#, no-wrap
+msgid "Distribution Name"
+msgstr "Имя дистрибутива"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:496
+#, no-wrap
+msgid "PKGNAMEPREFIX"
+msgstr "PKGNAMEPREFIX"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:497
+#, no-wrap
+msgid "PORTNAME"
+msgstr "PORTNAME"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:498
+#, no-wrap
+msgid "PKGNAMESUFFIX"
+msgstr "PKGNAMESUFFIX"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:502
+#, no-wrap
+msgid "Reason or comment"
+msgstr "Причина или комментарий"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:503
+#, no-wrap
+msgid "mule-2.2.2"
+msgstr "mule-2.2.2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:504
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:506
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:512
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:520
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:522
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:528
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:530
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:536
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:538
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:544
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:546
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:552
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:554
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:560
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:562
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:568
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:570
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:576
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:578
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:586
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:592
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:600
+#, no-wrap
+msgid "(empty)"
+msgstr "(пусто)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:505
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:513
+#, no-wrap
+msgid "mule"
+msgstr "mule"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:507
+#, no-wrap
+msgid "2.2.2"
+msgstr "2.2.2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:510
+#, no-wrap
+msgid "No changes required"
+msgstr "Никаких изменений не требуется"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:511
+#, no-wrap
+msgid "mule-1.0.1"
+msgstr "mule-1.0.1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:514
+#, no-wrap
+msgid "1"
+msgstr "1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:515
+#, no-wrap
+msgid "1.0.1"
+msgstr "1.0.1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:518
+#, no-wrap
+msgid "This is version 1 of mule, and version 2 already exists"
+msgstr "Это версия 1 mule, а версия 2 уже существует"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:519
+#, no-wrap
+msgid "EmiClock-1.0.2"
+msgstr "EmiClock-1.0.2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:521
+#, no-wrap
+msgid "emiclock"
+msgstr "emiclock"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:523
+#, no-wrap
+msgid "1.0.2"
+msgstr "1.0.2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:526
+#, no-wrap
+msgid "No uppercase names for single programs"
+msgstr "Нет имен в верхнем регистре для отдельных программ"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:527
+#, no-wrap
+msgid "rdist-1.3alpha"
+msgstr "rdist-1.3alpha"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:529
+#, no-wrap
+msgid "rdist"
+msgstr "rdist"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:531
+#, no-wrap
+msgid "1.3alpha"
+msgstr "1.3alpha"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:534
+#, no-wrap
+msgid "Version will be `1.3.a`"
+msgstr "Версия будет `1.3.a`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:535
+#, no-wrap
+msgid "es-0.9-beta1"
+msgstr "es-0.9-beta1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:537
+#, no-wrap
+msgid "es"
+msgstr "es"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:539
+#, no-wrap
+msgid "0.9-beta1"
+msgstr "0.9-beta1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:542
+#, no-wrap
+msgid "Version will be `0.9.b1`"
+msgstr "Версия будет `0.9.b1`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:543
+#, no-wrap
+msgid "mailman-2.0rc3"
+msgstr "mailman-2.0rc3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:545
+#, no-wrap
+msgid "mailman"
+msgstr "mailman"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:547
+#, no-wrap
+msgid "2.0rc3"
+msgstr "2.0rc3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:550
+#, no-wrap
+msgid "Version will be `2.0.r3`"
+msgstr "Версия будет `2.0.r3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:551
+#, no-wrap
+msgid "v3.3beta021.src"
+msgstr "v3.3beta021.src"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:553
+#, no-wrap
+msgid "tiff"
+msgstr "tiff"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:556
+#, no-wrap
+msgid "3.3"
+msgstr "3.3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:558
+#, no-wrap
+msgid "What the heck was that anyway?"
+msgstr "Что это вообще было?"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:559
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:561
+#, no-wrap
+msgid "tvtwm"
+msgstr "tvtwm"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:564
+#, no-wrap
+msgid "p11"
+msgstr "p11"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:566
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:574
+#, no-wrap
+msgid "No version in the filename, use what upstream says it is"
+msgstr "Нет версии в имени файла, используйте то, что указано в исходном коде"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:567
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:569
+#, no-wrap
+msgid "piewm"
+msgstr "piewm"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:571
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:603
+#, no-wrap
+msgid "1.0"
+msgstr "1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:575
+#, no-wrap
+msgid "xvgr-2.10pl1"
+msgstr "xvgr-2.10pl1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:577
+#, no-wrap
+msgid "xvgr"
+msgstr "xvgr"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:580
+#, no-wrap
+msgid "2.10.pl1"
+msgstr "2.10.pl1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:582
+#, no-wrap
+msgid "In that case, `pl1` means patch level, so using DISTVERSION is not possible."
+msgstr "В таком случае, `pl1` означает уровень патча, поэтому использование DISTVERSION невозможно."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:583
+#, no-wrap
+msgid "gawk-2.15.6"
+msgstr "gawk-2.15.6"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:584
+#, no-wrap
+msgid "ja-"
+msgstr "ja-"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:585
+#, no-wrap
+msgid "gawk"
+msgstr "gawk"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:587
+#, no-wrap
+msgid "2.15.6"
+msgstr "2.15.6"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:590
+#, no-wrap
+msgid "Japanese language version"
+msgstr "Японская языковая версия"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:591
+#, no-wrap
+msgid "psutils-1.13"
+msgstr "psutils-1.13"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:593
+#, no-wrap
+msgid "psutils"
+msgstr "psutils"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:594
+#, no-wrap
+msgid "-letter"
+msgstr "-letter"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:595
+#, no-wrap
+msgid "1.13"
+msgstr "1.13"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:598
+#, no-wrap
+msgid "Paper size hardcoded at package build time"
+msgstr "Размер бумаги жестко задан во время сборки пакета"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:599
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:601
+#, no-wrap
+msgid "pkfonts"
+msgstr "pkfonts"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:602
+#, no-wrap
+msgid "300"
+msgstr "300"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:605
+#, no-wrap
+msgid "Package for 300dpi fonts"
+msgstr "Пакет для шрифтов с разрешением 300dpi"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:609
+msgid ""
+"If there is absolutely no trace of version information in the original "
+"source and it is unlikely that the original author will ever release another "
+"version, just set the version string to `1.0` (like the `piewm` example "
+"above). Otherwise, ask the original author or use the date string the "
+"source file was released on (`d__yyyy.mm.dd__`, or `d__yyyymmdd__`) as the "
+"version."
+msgstr ""
+"Если в исходном источнике полностью отсутствует информация о версии и "
+"маловероятно, что автор когда-либо выпустит новую версию, просто укажите "
+"строку версии как `1.0` (как в примере с `piewm` выше). В противном случае, "
+"спросите автора или используйте дату выпуска исходного файла в формате "
+"`d__yyyy.mm.dd__` или `d__yyyymmdd__` в качестве версии."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:614
+msgid ""
+"Use any letter. Here, `d` here stands for date, if the source is a Git "
+"repository, `g` followed by the commit date is commonly used, using `s` for "
+"snapshot is also common."
+msgstr ""
+"Используйте любую букву. Здесь `d` означает дату, если источник — это "
+"репозиторий Git, часто используется `g` с последующей датой коммита, также "
+"распространено использование `s` для снимка."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:617
+#, no-wrap
+msgid "Categorization"
+msgstr "Категоризация"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:620
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4867
+#, no-wrap
+msgid "`CATEGORIES`"
+msgstr "`CATEGORIES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:626
+msgid ""
+"When a package is created, it is put under [.filename]#/usr/ports/packages/"
+"All# and links are made from one or more subdirectories of [.filename]#/usr/"
+"ports/packages#. The names of these subdirectories are specified by the "
+"variable `CATEGORIES`. It is intended to make life easier for the user when "
+"he is wading through the pile of packages on the FTP site or the CDROM. "
+"Please take a look at the crossref:makefiles[porting-categories,current list "
+"of categories] and pick the ones that are suitable for the port."
+msgstr ""
+"При создании пакета он помещается в [.filename]#/usr/ports/packages/All#, и "
+"ссылки на него создаются в одной или нескольких поддиректориях [.filename]#/"
+"usr/ports/packages#. Имена этих поддиректорий задаются переменной "
+"`CATEGORIES`. Это предназначено для облегчения поиска пакетов пользователем "
+"при просмотре большого количества пакетов на FTP-сайте или CDROM. "
+"Пожалуйста, ознакомьтесь с crossref:makefiles[porting-categories,текущим "
+"списком категорий] и выберите подходящие для данного порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:630
+msgid ""
+"This list also determines where in the ports tree the port is imported. If "
+"there is more than one category here, the port files must be put in the "
+"subdirectory with the name of the first category. See "
+"crossref:makefiles[choosing-categories,below] for more discussion about how "
+"to pick the right categories."
+msgstr ""
+"Этот список также определяет, где в дереве портов будет размещён порт. Если "
+"здесь указано несколько категорий, файлы порта должны быть помещены в "
+"подкаталог с названием первой категории. Дополнительные сведения о выборе "
+"подходящих категорий см. в crossref:makefiles[choosing-categories,ниже]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:632
+#, no-wrap
+msgid "Current List of Categories"
+msgstr "Текущий список категорий"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:637
+msgid ""
+"Here is the current list of port categories. Those marked with an asterisk "
+"(`*`) are _virtual_ categories-those that do not have a corresponding "
+"subdirectory in the ports tree. They are only used as secondary categories, "
+"and only for search purposes."
+msgstr ""
+"Вот текущий список категорий портов. Категории, помеченные звёздочкой (`*`), "
+"являются _виртуальными_ — они не имеют соответствующего подкаталога в дереве "
+"портов. Они используются только как вторичные категории и исключительно для "
+"целей поиска."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:641
+msgid ""
+"For non-virtual categories, there is a one-line description in `COMMENT` in "
+"that subdirectory's [.filename]#Makefile#."
+msgstr ""
+"Для невиртуальных категорий в `COMMENT` в [.filename]#Makefile# "
+"соответствующего подкаталога содержится однострочное описание."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:647
+#, no-wrap
+msgid "Category"
+msgstr "Категория"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:648
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1473
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1882
+#, no-wrap
+msgid "Description"
+msgstr "Описание"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:650
+#, no-wrap
+msgid "Notes"
+msgstr "Заметки"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:651
+#, no-wrap
+msgid "[.filename]#accessibility#"
+msgstr "[.filename]#accessibility#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:652
+#, no-wrap
+msgid "Ports to help disabled users."
+msgstr "Порты для помощи пользователям с ограниченными возможностями."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:655
+#, no-wrap
+msgid "[.filename]#afterstep#`*`"
+msgstr "[.filename]#afterstep#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:656
+#, no-wrap
+msgid "Ports to support the http://www.afterstep.org/[AfterStep] window manager."
+msgstr "Порты для поддержки оконного менеджера http://www.afterstep.org/[AfterStep]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:659
+#, no-wrap
+msgid "[.filename]#arabic#"
+msgstr "[.filename]#arabic#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:660
+#, no-wrap
+msgid "Arabic language support."
+msgstr "Поддержка арабского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:663
+#, no-wrap
+msgid "[.filename]#archivers#"
+msgstr "[.filename]#archivers#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:664
+#, no-wrap
+msgid "Archiving tools."
+msgstr "Инструменты для архивирования."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:667
+#, no-wrap
+msgid "[.filename]#astro#"
+msgstr "[.filename]#astro#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:668
+#, no-wrap
+msgid "Astronomical ports."
+msgstr "Астрономические порты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:671
+#, no-wrap
+msgid "[.filename]#audio#"
+msgstr "[.filename]#audio#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:672
+#, no-wrap
+msgid "Sound support."
+msgstr "Поддержка звука."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:675
+#, no-wrap
+msgid "[.filename]#benchmarks#"
+msgstr "[.filename]#benchmarks#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:676
+#, no-wrap
+msgid "Benchmarking utilities."
+msgstr "Утилиты для тестирования производительности."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:679
+#, no-wrap
+msgid "[.filename]#biology#"
+msgstr "[.filename]#biology#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:680
+#, no-wrap
+msgid "Biology-related software."
+msgstr "Программное обеспечение, связанное с биологией."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:683
+#, no-wrap
+msgid "[.filename]#cad#"
+msgstr "[.filename]#cad#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:684
+#, no-wrap
+msgid "Computer aided design tools."
+msgstr "Компьютерные средства автоматизированного проектирования."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:687
+#, no-wrap
+msgid "[.filename]#chinese#"
+msgstr "[.filename]#chinese#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:688
+#, no-wrap
+msgid "Chinese language support."
+msgstr "Поддержка китайского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:691
+#, no-wrap
+msgid "[.filename]#comms#"
+msgstr "[.filename]#comms#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:692
+#, no-wrap
+msgid "Communication software."
+msgstr "Программное обеспечение для связи."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:694
+#, no-wrap
+msgid "Mostly software to talk to the serial port."
+msgstr "В основном программное обеспечение для работы с последовательным портом."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:695
+#, no-wrap
+msgid "[.filename]#converters#"
+msgstr "[.filename]#converters#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:696
+#, no-wrap
+msgid "Character code converters."
+msgstr "Преобразователи символьных кодировок."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:699
+#, no-wrap
+msgid "[.filename]#databases#"
+msgstr "[.filename]#databases#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:700
+#, no-wrap
+msgid "Databases."
+msgstr "Базы данных."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:703
+#, no-wrap
+msgid "[.filename]#deskutils#"
+msgstr "[.filename]#deskutils#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:704
+#, no-wrap
+msgid "Things that used to be on the desktop before computers were invented."
+msgstr "Вещи, которые раньше находились на рабочем столе до изобретения компьютеров."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:707
+#, no-wrap
+msgid "[.filename]#devel#"
+msgstr "[.filename]#devel#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:708
+#, no-wrap
+msgid "Development utilities."
+msgstr "Средства разработки."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:710
+#, no-wrap
+msgid "Do not put libraries here just because they are libraries. They should _not_ be in this category unless they truly do not belong anywhere else."
+msgstr "Не размещайте библиотеки здесь только потому, что они являются библиотеками. Они _не_ должны быть в этой категории, если только они действительно не подходят никуда больше."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:711
+#, no-wrap
+msgid "[.filename]#dns#"
+msgstr "[.filename]#dns#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:712
+#, no-wrap
+msgid "DNS-related software."
+msgstr "Программное обеспечение, связанное с DNS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:715
+#, no-wrap
+msgid "[.filename]#docs#`*`"
+msgstr "[.filename]#docs#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:716
+#, no-wrap
+msgid "Meta-ports for FreeBSD documentation."
+msgstr "Мета-порты для документации FreeBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:719
+#, no-wrap
+msgid "[.filename]#editors#"
+msgstr "[.filename]#editors#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:720
+#, no-wrap
+msgid "General editors."
+msgstr "Общие редакторы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:722
+#, no-wrap
+msgid "Specialized editors go in the section for those tools. For example, a mathematical-formula editor will go in [.filename]#math#, and have [.filename]#editors# as a second category."
+msgstr "Специализированные редакторы помещаются в раздел соответствующих инструментов. Например, редактор математических формул будет помещён в [.filename]#math#, а [.filename]#editors# будет для него второй категорией."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:723
+#, no-wrap
+msgid "[.filename]#education#`*`"
+msgstr "[.filename]#education#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:724
+#, no-wrap
+msgid "Education-related software."
+msgstr "Программное обеспечение для образования."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:726
+#, no-wrap
+msgid "This includes applications, utilities, or games primarily or substantially designed to help the user learn a specific topic or study in general. It also includes course-writing applications, course-delivery applications, and classroom or school management applications"
+msgstr "Это включает приложения, утилиты или игры, разработанные в первую очередь или в значительной степени для помощи пользователю в изучении конкретной темы или обучении в целом. Также сюда входят приложения для создания курсов, приложения для предоставления курсов и приложения для управления классом или школой"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:727
+#, no-wrap
+msgid "[.filename]#elisp#`*`"
+msgstr "[.filename]#elisp#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:728
+#, no-wrap
+msgid "Emacs-lisp ports."
+msgstr "Порты Emacs-lisp."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:731
+#, no-wrap
+msgid "[.filename]#emulators#"
+msgstr "[.filename]#emulators#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:732
+#, no-wrap
+msgid "Emulators for other operating systems."
+msgstr "Эмуляторы других операционных систем."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:734
+#, no-wrap
+msgid "Terminal emulators do _not_ belong here. X-based ones go to [.filename]#x11# and text-based ones to either [.filename]#comms# or [.filename]#misc#, depending on the exact functionality."
+msgstr "Терминальные эмуляторы _не_ относятся сюда. Основанные на X идут в [.filename]#x11#, а текстовые — либо в [.filename]#comms#, либо в [.filename]#misc#, в зависимости от конкретной функциональности."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:735
+#, no-wrap
+msgid "[.filename]#enlightenment#`*`"
+msgstr "[.filename]#enlightenment#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:736
+#, no-wrap
+msgid "Ports related to the Enlightenment window manager."
+msgstr "Порты, связанные с оконным менеджером Enlightenment."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:739
+#, no-wrap
+msgid "[.filename]#filesystems#"
+msgstr "[.filename]#filesystems#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:740
+#, no-wrap
+msgid "File systems and related utilities."
+msgstr "Файловые системы и связанные утилиты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:743
+#, no-wrap
+msgid "[.filename]#finance#"
+msgstr "[.filename]#finance#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:744
+#, no-wrap
+msgid "Monetary, financial and related applications."
+msgstr "Монетарные, финансовые и связанные с ними приложения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:747
+#, no-wrap
+msgid "[.filename]#french#"
+msgstr "[.filename]#french#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:748
+#, no-wrap
+msgid "French language support."
+msgstr "Поддержка французского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:751
+#, no-wrap
+msgid "[.filename]#ftp#"
+msgstr "[.filename]#ftp#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:752
+#, no-wrap
+msgid "FTP client and server utilities."
+msgstr "Клиентские и серверные утилиты FTP."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:754
+#, no-wrap
+msgid "If the port speaks both FTP and HTTP, put it in [.filename]#ftp# with a secondary category of [.filename]#www#."
+msgstr "Если порт поддерживает как FTP, так и HTTP, поместите его в [.filename]#ftp# с дополнительной категорией [.filename]#www#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:755
+#, no-wrap
+msgid "[.filename]#games#"
+msgstr "[.filename]#games#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:756
+#, no-wrap
+msgid "Games."
+msgstr "Игры."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:759
+#, no-wrap
+msgid "[.filename]#geography#`*`"
+msgstr "[.filename]#география#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:760
+#, no-wrap
+msgid "Geography-related software."
+msgstr "Программное обеспечение, связанное с географией."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:763
+#, no-wrap
+msgid "[.filename]#german#"
+msgstr "[.filename]#german#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:764
+#, no-wrap
+msgid "German language support."
+msgstr "Поддержка немецкого языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:767
+#, no-wrap
+msgid "[.filename]#gnome#`*`"
+msgstr "[.filename]#gnome#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:768
+#, no-wrap
+msgid "Ports from the https://www.gnome.org/[GNOME] Project."
+msgstr "Порты из проекта https://www.gnome.org/[GNOME]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:771
+#, no-wrap
+msgid "[.filename]#gnustep#`*`"
+msgstr "[.filename]#gnustep#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:772
+#, no-wrap
+msgid "Software related to the GNUstep desktop environment."
+msgstr "Программное обеспечение, связанное со средой рабочего стола GNUstep."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:775
+#, no-wrap
+msgid "[.filename]#graphics#"
+msgstr "[.filename]#graphics#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:776
+#, no-wrap
+msgid "Graphics utilities."
+msgstr "Графические утилиты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:779
+#, no-wrap
+msgid "[.filename]#hamradio#`*`"
+msgstr "[.filename]#hamradio#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:780
+#, no-wrap
+msgid "Software for amateur radio."
+msgstr "Программное обеспечение для радиолюбителей."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:783
+#, no-wrap
+msgid "[.filename]#haskell#`*`"
+msgstr "[.filename]#haskell#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:784
+#, no-wrap
+msgid "Software related to the Haskell language."
+msgstr "Программное обеспечение, связанное с языком Haskell."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:787
+#, no-wrap
+msgid "[.filename]#hebrew#"
+msgstr "[.filename]#hebrew#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:788
+#, no-wrap
+msgid "Hebrew language support."
+msgstr "Поддержка иврита."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:791
+#, no-wrap
+msgid "[.filename]#hungarian#"
+msgstr "[.filename]#hungarian#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:792
+#, no-wrap
+msgid "Hungarian language support."
+msgstr "Венгерская языковая поддержка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:795
+#, no-wrap
+msgid "[.filename]#irc#"
+msgstr "[.filename]#irc#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:796
+#, no-wrap
+msgid "Internet Relay Chat utilities."
+msgstr "Утилиты Internet Relay Chat."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:799
+#, no-wrap
+msgid "[.filename]#japanese#"
+msgstr "[.filename]#japanese#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:800
+#, no-wrap
+msgid "Japanese language support."
+msgstr "Поддержка японского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:803
+#, no-wrap
+msgid "[.filename]#java#"
+msgstr "[.filename]#java#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:804
+#, no-wrap
+msgid "Software related to the Java(TM) language."
+msgstr "Программное обеспечение, связанное с языком Java(TM)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:806
+#, no-wrap
+msgid "The [.filename]#java# category must not be the only one for a port. Save for ports directly related to the Java language, porters are also encouraged not to use [.filename]#java# as the main category of a port."
+msgstr "Категория [.filename]#java# не должна быть единственной для порта. За исключением портов, непосредственно связанных с языком Java, разработчикам также рекомендуется не использовать [.filename]#java# в качестве основной категории для порта."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:807
+#, no-wrap
+msgid "[.filename]#kde#`*`"
+msgstr "[.filename]#kde#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:808
+#, no-wrap
+msgid "Ports from the https://www.kde.org/[KDE] Project (generic)."
+msgstr "Порты проекта https://www.kde.org/[KDE] (общие)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:811
+#, no-wrap
+msgid "[.filename]#kde-applications#`*`"
+msgstr "[.filename]#kde-приложения#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:812
+#, no-wrap
+msgid "Applications from the https://www.kde.org/[KDE] Project."
+msgstr "Приложения от проекта https://www.kde.org/[KDE]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:815
+#, no-wrap
+msgid "[.filename]#kde-frameworks#`*`"
+msgstr "[.filename]#kde-frameworks#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:816
+#, no-wrap
+msgid "Add-on libraries from the https://www.kde.org/[KDE] Project for programming with Qt."
+msgstr "Дополнительные библиотеки от проекта https://www.kde.org/[KDE] для программирования с использованием Qt."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:819
+#, no-wrap
+msgid "[.filename]#kde-plasma#`*`"
+msgstr "[.filename]#kde-plasma#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:820
+#, no-wrap
+msgid "Desktop from the https://www.kde.org/[KDE] Project."
+msgstr "Рабочий стол от проекта https://www.kde.org/[KDE]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:823
+#, no-wrap
+msgid "[.filename]#kld#`*`"
+msgstr "[.filename]#kld#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:824
+#, no-wrap
+msgid "Kernel loadable modules."
+msgstr "Загружаемые модули ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:827
+#, no-wrap
+msgid "[.filename]#korean#"
+msgstr "[.filename]#korean#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:828
+#, no-wrap
+msgid "Korean language support."
+msgstr "Поддержка корейского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:831
+#, no-wrap
+msgid "[.filename]#lang#"
+msgstr "[.filename]#lang#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:832
+#, no-wrap
+msgid "Programming languages."
+msgstr "Языки программирования."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:835
+#, no-wrap
+msgid "[.filename]#linux#`*`"
+msgstr "[.filename]#linux#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:836
+#, no-wrap
+msgid "Linux applications and support utilities."
+msgstr "Приложения и вспомогательные утилиты Linux."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:839
+#, no-wrap
+msgid "[.filename]#lisp#`*`"
+msgstr "[.filename]#lisp#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:840
+#, no-wrap
+msgid "Software related to the Lisp language."
+msgstr "Программное обеспечение, связанное с языком Lisp."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:843
+#, no-wrap
+msgid "[.filename]#mail#"
+msgstr "[.filename]#mail#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:844
+#, no-wrap
+msgid "Mail software."
+msgstr "Почтовое программное обеспечение."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:847
+#, no-wrap
+msgid "[.filename]#mate#`*`"
+msgstr "[.filename]#mate#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:848
+#, no-wrap
+msgid "Ports related to the MATE desktop environment, a fork of GNOME 2."
+msgstr "Порты, связанные с окружением рабочего стола MATE, форком GNOME 2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:851
+#, no-wrap
+msgid "[.filename]#math#"
+msgstr "[.filename]#math#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:852
+#, no-wrap
+msgid "Numerical computation software and other utilities for mathematics."
+msgstr "Численные расчеты и другие математические утилиты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:855
+#, no-wrap
+msgid "[.filename]#mbone#`*`"
+msgstr "[.filename]#mbone#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:856
+#, no-wrap
+msgid "MBone applications."
+msgstr "Приложения MBone."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:859
+#, no-wrap
+msgid "[.filename]#misc#"
+msgstr "[.filename]#misc#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:860
+#, no-wrap
+msgid "Miscellaneous utilities"
+msgstr "Различные утилиты"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:862
+#, no-wrap
+msgid "Things that do not belong anywhere else. If at all possible, try to find a better category for the port than `misc`, as ports tend to be overlooked in here."
+msgstr "Вещи, которые не подходят никуда больше. По возможности, попытайтесь найти для порта категорию лучше, чем `misc`, так как порты здесь часто остаются без внимания."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:863
+#, no-wrap
+msgid "[.filename]#multimedia#"
+msgstr "[.filename]#multimedia#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:864
+#, no-wrap
+msgid "Multimedia software."
+msgstr "Мультимедийное программное обеспечение."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:867
+#, no-wrap
+msgid "[.filename]#net#"
+msgstr "[.filename]#net#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:868
+#, no-wrap
+msgid "Miscellaneous networking software."
+msgstr "Различное сетевое программное обеспечение."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:871
+#, no-wrap
+msgid "[.filename]#net-im#"
+msgstr "[.filename]#net-im#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:872
+#, no-wrap
+msgid "Instant messaging software."
+msgstr "Программное обеспечение для обмена мгновенными сообщениями."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:875
+#, no-wrap
+msgid "[.filename]#net-mgmt#"
+msgstr "[.filename]#net-mgmt#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:876
+#, no-wrap
+msgid "Networking management software."
+msgstr "Программное обеспечение для управления сетями."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:879
+#, no-wrap
+msgid "[.filename]#net-p2p#"
+msgstr "[.filename]#net-p2p#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:880
+#, no-wrap
+msgid "Peer to peer network applications."
+msgstr "Одноранговые сетевые приложения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:883
+#, no-wrap
+msgid "[.filename]#net-vpn#`*`"
+msgstr "[.filename]#сеть-vpn#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:884
+#, no-wrap
+msgid "Virtual Private Network applications."
+msgstr "Виртуальные частные сети."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:887
+#, no-wrap
+msgid "[.filename]#news#"
+msgstr "[.filename]#news#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:888
+#, no-wrap
+msgid "USENET news software."
+msgstr "Программное обеспечение для USENET-новостей."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:891
+#, no-wrap
+msgid "[.filename]#parallel#`*`"
+msgstr "[.filename]#parallel#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:892
+#, no-wrap
+msgid "Applications dealing with parallelism in computing."
+msgstr "Приложения, работающие с параллелизмом в вычислениях."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:895
+#, no-wrap
+msgid "[.filename]#pear#`*`"
+msgstr "[.filename]#pear#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:896
+#, no-wrap
+msgid "Ports related to the Pear PHP framework."
+msgstr "Порты, связанные с PHP-фреймворком Pear."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:899
+#, no-wrap
+msgid "[.filename]#perl5#`*`"
+msgstr "[.filename]#perl5#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:900
+#, no-wrap
+msgid "Ports that require Perl version 5 to run."
+msgstr "Порты, требующие Perl версии 5 для работы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:903
+#, no-wrap
+msgid "[.filename]#plan9#`*`"
+msgstr "[.filename]#plan9#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:904
+#, no-wrap
+msgid "Various programs from https://9p.io/wiki/plan9/Download/index.html[Plan9]."
+msgstr "Различные программы с https://9p.io/wiki/plan9/Download/index.html[Plan9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:907
+#, no-wrap
+msgid "[.filename]#polish#"
+msgstr "[.filename]#polish#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:908
+#, no-wrap
+msgid "Polish language support."
+msgstr "Поддержка польского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:911
+#, no-wrap
+msgid "[.filename]#ports-mgmt#"
+msgstr "[.filename]#ports-mgmt#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:912
+#, no-wrap
+msgid "Ports for managing, installing and developing FreeBSD ports and packages."
+msgstr "Порты для управления, установки и разработки портов и пакетов FreeBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:915
+#, no-wrap
+msgid "[.filename]#portuguese#"
+msgstr "[.filename]#portuguese#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:916
+#, no-wrap
+msgid "Portuguese language support."
+msgstr "Поддержка португальского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:919
+#, no-wrap
+msgid "[.filename]#print#"
+msgstr "[.filename]#print#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:920
+#, no-wrap
+msgid "Printing software."
+msgstr "Программное обеспечение для печати."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:922
+#, no-wrap
+msgid "Desktop publishing tools (previewers, etc.) belong here too."
+msgstr "Инструменты для настольных издательских систем (превьюеры и т. д.) также относятся сюда."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:923
+#, no-wrap
+msgid "[.filename]#python#`*`"
+msgstr "[.filename]#python#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:924
+#, no-wrap
+msgid "Software related to the https://www.python.org/[Python] language."
+msgstr "Программное обеспечение, связанное с языком https://www.python.org/[Python]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:927
+#, no-wrap
+msgid "[.filename]#ruby#`*`"
+msgstr "[.filename]#ruby#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:928
+#, no-wrap
+msgid "Software related to the https://www.ruby-lang.org/[Ruby] language."
+msgstr "Программное обеспечение, связанное с языком https://www.ruby-lang.org/[Ruby]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:931
+#, no-wrap
+msgid "[.filename]#rubygems#`*`"
+msgstr "[.filename]#rubygems#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:932
+#, no-wrap
+msgid "Ports of https://www.rubygems.org/[RubyGems] packages."
+msgstr "Порты пакетов https://www.rubygems.org/[RubyGems]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:935
+#, no-wrap
+msgid "[.filename]#russian#"
+msgstr "[.filename]#russian#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:936
+#, no-wrap
+msgid "Russian language support."
+msgstr "Поддержка русского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:939
+#, no-wrap
+msgid "[.filename]#scheme#`*`"
+msgstr "[.filename]#scheme#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:940
+#, no-wrap
+msgid "Software related to the Scheme language."
+msgstr "Программное обеспечение, связанное с языком Scheme."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:943
+#, no-wrap
+msgid "[.filename]#science#"
+msgstr "[.filename]#science#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:944
+#, no-wrap
+msgid "Scientific ports that do not fit into other categories such as [.filename]#astro#, [.filename]#biology# and [.filename]#math#."
+msgstr "Научные порты, которые не входят в другие категории, такие как [.filename]#astro#, [.filename]#biology# и [.filename]#math#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:947
+#, no-wrap
+msgid "[.filename]#security#"
+msgstr "[.filename]#security#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:948
+#, no-wrap
+msgid "Security utilities."
+msgstr "Средства обеспечения безопасности."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:951
+#, no-wrap
+msgid "[.filename]#shells#"
+msgstr "[.filename]#shells#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:952
+#, no-wrap
+msgid "Command line shells."
+msgstr "Командные оболочки."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:955
+#, no-wrap
+msgid "[.filename]#spanish#`*`"
+msgstr "[.filename]#spanish#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:956
+#, no-wrap
+msgid "Spanish language support."
+msgstr "Поддержка испанского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:959
+#, no-wrap
+msgid "[.filename]#sysutils#"
+msgstr "[.filename]#sysutils#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:960
+#, no-wrap
+msgid "System utilities."
+msgstr "Системные утилиты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:963
+#, no-wrap
+msgid "[.filename]#tcl#`*`"
+msgstr "[.filename]#tcl#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:964
+#, no-wrap
+msgid "Ports that use Tcl to run."
+msgstr "Порты, использующие Tcl для запуска."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:967
+#, no-wrap
+msgid "[.filename]#textproc#"
+msgstr "[.filename]#textproc#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:968
+#, no-wrap
+msgid "Text processing utilities."
+msgstr "Средства обработки текста."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:970
+#, no-wrap
+msgid "It does not include desktop publishing tools, which go to [.filename]#print#."
+msgstr "Он не включает инструменты для настольных издательских систем, которые помещаются в [.filename]#print#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:971
+#, no-wrap
+msgid "[.filename]#tk#`*`"
+msgstr "[.filename]#tk#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:972
+#, no-wrap
+msgid "Ports that use Tk to run."
+msgstr "Порты, использующие Tk для работы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:975
+#, no-wrap
+msgid "[.filename]#ukrainian#"
+msgstr "[.filename]#ukrainian#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:976
+#, no-wrap
+msgid "Ukrainian language support."
+msgstr "Поддержка украинского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:979
+#, no-wrap
+msgid "[.filename]#vietnamese#"
+msgstr "[.filename]#vietnamese#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:980
+#, no-wrap
+msgid "Vietnamese language support."
+msgstr "Поддержка вьетнамского языка."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:983
+#, no-wrap
+msgid "[.filename]#wayland#`*`"
+msgstr "[.filename]#wayland#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:984
+#, no-wrap
+msgid "Ports to support the Wayland display server."
+msgstr "Порты для поддержки сервера дисплея Wayland."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:987
+#, no-wrap
+msgid "[.filename]#windowmaker#`*`"
+msgstr "[.filename]#windowmaker#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:988
+#, no-wrap
+msgid "Ports to support the Window Maker window manager."
+msgstr "Порты для поддержки оконного менеджера Window Maker."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:991
+#, no-wrap
+msgid "[.filename]#www#"
+msgstr "[.filename]#www#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:992
+#, no-wrap
+msgid "Software related to the World Wide Web."
+msgstr "Программное обеспечение, связанное с Всемирной паутиной."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:994
+#, no-wrap
+msgid "HTML language support belongs here too."
+msgstr "Поддержка языка HTML также относится сюда."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:995
+#, no-wrap
+msgid "[.filename]#x11#"
+msgstr "[.filename]#x11#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:996
+#, no-wrap
+msgid "The X Window System and friends."
+msgstr "Система X Window и связанные компоненты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:998
+#, no-wrap
+msgid "This category is only for software that directly supports the window system. Do not put regular X applications here. Most of them go into other [.filename]#x11-*# categories (see below)."
+msgstr "Эта категория предназначена только для программного обеспечения, которое напрямую поддерживает оконную систему. Не помещайте сюда обычные X-приложения. Большинство из них относятся к другим категориям [.filename]#x11-*# (см. ниже)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:999
+#, no-wrap
+msgid "[.filename]#x11-clocks#"
+msgstr "[.filename]#x11-clocks#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1000
+#, no-wrap
+msgid "X11 clocks."
+msgstr "Часы X11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1003
+#, no-wrap
+msgid "[.filename]#x11-drivers#"
+msgstr "[.filename]#x11-drivers#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1004
+#, no-wrap
+msgid "X11 drivers."
+msgstr "Драйверы X11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1007
+#, no-wrap
+msgid "[.filename]#x11-fm#"
+msgstr "[.filename]#x11-fm#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1008
+#, no-wrap
+msgid "X11 file managers."
+msgstr "Менеджеры файлов X11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1011
+#, no-wrap
+msgid "[.filename]#x11-fonts#"
+msgstr "[.filename]#x11-fonts#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1012
+#, no-wrap
+msgid "X11 fonts and font utilities."
+msgstr "Шрифты и утилиты для работы со шрифтами в X11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1015
+#, no-wrap
+msgid "[.filename]#x11-servers#"
+msgstr "[.filename]#x11-servers#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1016
+#, no-wrap
+msgid "X11 servers."
+msgstr "Серверы X11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1019
+#, no-wrap
+msgid "[.filename]#x11-themes#"
+msgstr "[.filename]#x11-themes#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1020
+#, no-wrap
+msgid "X11 themes."
+msgstr "Темы X11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1023
+#, no-wrap
+msgid "[.filename]#x11-toolkits#"
+msgstr "[.filename]#x11-toolkits#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1024
+#, no-wrap
+msgid "X11 toolkits."
+msgstr "Инструментарии X11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1027
+#, no-wrap
+msgid "[.filename]#x11-wm#"
+msgstr "[.filename]#x11-wm#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1028
+#, no-wrap
+msgid "X11 window managers."
+msgstr "Оконные менеджеры X11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1031
+#, no-wrap
+msgid "[.filename]#xfce#`*`"
+msgstr "[.filename]#xfce#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1032
+#, no-wrap
+msgid "Ports related to the https://www.xfce.org/[Xfce] desktop environment."
+msgstr "Порты, связанные с окружением рабочего стола https://www.xfce.org/[Xfce]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1035
+#, no-wrap
+msgid "[.filename]#zope#`*`"
+msgstr "[.filename]#zope#`*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1036
+#, no-wrap
+msgid "https://www.zope.org/[Zope] support."
+msgstr "https://www.zope.org/[Zope] поддержка."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1040
+#, no-wrap
+msgid "Choosing the Right Category"
+msgstr "Выбор подходящей категории"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1045
+msgid ""
+"As many of the categories overlap, choosing which of the categories will be "
+"the primary category of the port can be tedious. There are several rules "
+"that govern this issue. Here is the list of priorities, in decreasing order "
+"of precedence:"
+msgstr ""
+"Поскольку многие категории пересекаются, выбор основной категории для порта "
+"может быть утомительным. Существует несколько правил, регулирующих этот "
+"вопрос. Вот список приоритетов в порядке убывания важности:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1048
+msgid ""
+"The first category must be a physical category (see "
+"crossref:makefiles[porting-categories,above]). This is necessary to make the "
+"packaging work. Virtual categories and physical categories may be intermixed "
+"after that."
+msgstr ""
+"Первая категория должна быть физической (см. crossref:makefiles[porting-"
+"categories,выше]). Это необходимо для работы упаковки. Виртуальные категории "
+"и физические категории могут чередоваться после этого."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1049
+msgid ""
+"Language specific categories always come first. For example, if the port "
+"installs Japanese X11 fonts, then the `CATEGORIES` line would read "
+"[.filename]#japanese x11-fonts#."
+msgstr ""
+"Языковые категории всегда указываются первыми. Например, если порт "
+"устанавливает японские шрифты для X11, то строка `CATEGORIES` будет "
+"выглядеть так: [.filename]#japanese x11-fonts#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1050
+msgid ""
+"Specific categories are listed before less-specific ones. For instance, an "
+"HTML editor is listed as [.filename]#www editors#, not the other way around. "
+"Also, do not list [.filename]#net# when the port belongs to any of "
+"[.filename]#irc#, [.filename]#mail#, [.filename]#news#, "
+"[.filename]#security#, or [.filename]#www#, as [.filename]#net# is included "
+"implicitly."
+msgstr ""
+"Конкретные категории перечислены перед менее специфичными. Например, HTML-"
+"редактор указывается как [.filename]#www editors#, а не наоборот. Также не "
+"следует указывать [.filename]#net#, если порт принадлежит к любой из "
+"категорий [.filename]#irc#, [.filename]#mail#, [.filename]#news#, "
+"[.filename]#security# или [.filename]#www#, так как [.filename]#net# "
+"подразумевается автоматически."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1051
+msgid ""
+"[.filename]#x11# is used as a secondary category only when the primary "
+"category is a natural language. In particular, do not put [.filename]#x11# "
+"in the category line for X applications."
+msgstr ""
+"[.filename]#x11# используется как вторичная категория только в случае, когда "
+"основной категорией указан естественный язык. В частности, не указывайте "
+"[.filename]#x11# в строке категории для X-приложений."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1052
+msgid ""
+"Emacs modes are placed in the same ports category as the application "
+"supported by the mode, not in [.filename]#editors#. For example, an Emacs "
+"mode to edit source files of some programming language goes into "
+"[.filename]#lang#."
+msgstr ""
+"Режимы Emacs размещаются в той же категории портов, что и приложение, "
+"поддерживаемое данным режимом, а не в [.filename]#editors#. Например, режим "
+"Emacs для редактирования исходных файлов какого-либо языка программирования "
+"попадает в [.filename]#lang#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1053
+msgid ""
+"Ports installing loadable kernel modules also have the virtual category "
+"[.filename]#kld# in their `CATEGORIES` line. This is one of the things "
+"handled automatically by adding `USES=kmod`."
+msgstr ""
+"Порты, устанавливающие загружаемые модули ядра, также имеют виртуальную "
+"категорию [.filename]#kld# в строке `CATEGORIES`. Это одна из вещей, "
+"автоматически обрабатываемых при добавлении `USES=kmod`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1054
+msgid ""
+"[.filename]#misc# does not appear with any other non-virtual category. If "
+"there is `misc` with something else in `CATEGORIES`, that means `misc` can "
+"safely be deleted and the port placed only in the other subdirectory."
+msgstr ""
+"[.filename]#misc# не встречается вместе с другими невиртуальными "
+"категориями. Если `misc` указан вместе с чем-то еще в `CATEGORIES`, это "
+"означает, что `misc` можно безопасно удалить, а порт разместить только в "
+"другом подкаталоге."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1055
+msgid ""
+"If the port truly does not belong anywhere else, put it in [.filename]#misc#."
+msgstr ""
+"Если порт действительно не подходит никуда больше, поместите его в "
+"[.filename]#misc#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1059
+msgid ""
+"If the category is not clearly defined, please put a comment to that effect "
+"in the https://bugs.freebsd.org/submit/[port submission] in the bug database "
+"so we can discuss it before we import it. As a committer, send a note to "
+"the {freebsd-ports} so we can discuss it first. Too often, new ports are "
+"imported to the wrong category only to be moved right away."
+msgstr ""
+"Если категория не определена четко, пожалуйста, укажите это в комментарии "
+"при https://bugs.freebsd.org/submit/[отправке порта] в баг-трекере, чтобы мы "
+"могли обсудить её перед импортом. Как коммиттер, отправьте сообщение в "
+"рассылку {freebsd-ports}, чтобы мы сначала обсудили это. Слишком часто новые "
+"порты импортируются в неправильную категорию, после чего их сразу же "
+"приходится перемещать."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1061
+#, no-wrap
+msgid "Proposing a New Category"
+msgstr "Предложение новой категории"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1066
+msgid ""
+"As the Ports Collection has grown over time, various new categories have "
+"been introduced. New categories can either be _virtual_ categories-those "
+"that do not have a corresponding subdirectory in the ports tree- or "
+"_physical_ categories-those that do. This section discusses the issues "
+"involved in creating a new physical category. Read it thoroughly before "
+"proposing a new one."
+msgstr ""
+"По мере роста Коллекции портов со временем были введены различные новые "
+"категории. Новые категории могут быть _виртуальными_ — те, у которых нет "
+"соответствующего подкаталога в дереве портов, или _физическими_ — те, у "
+"которых он есть. В этом разделе обсуждаются вопросы, связанные с созданием "
+"новой физической категории. Внимательно ознакомьтесь с ним, прежде чем "
+"предлагать новую."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1068
+msgid ""
+"Our existing practice has been to avoid creating a new physical category "
+"unless either a large number of ports would logically belong to it, or the "
+"ports that would belong to it are a logically distinct group that is of "
+"limited general interest (for instance, categories related to spoken human "
+"languages), or preferably both."
+msgstr ""
+"Наша текущая практика заключается в том, чтобы избегать создания новой "
+"физической категории, если только либо большое количество портов логически "
+"принадлежит к ней, либо порты, которые к ней относятся, представляют собой "
+"логически обособленную группу, представляющую ограниченный общий интерес "
+"(например, категории, связанные с разговорными человеческими языками), или, "
+"желательно, оба условия одновременно."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1072
+msgid ""
+"The rationale for this is that such a change creates a extref:{committers-"
+"guide}[fair amount of work, ports] for both the committers and also for all "
+"users who track changes to the Ports Collection. In addition, proposed "
+"category changes just naturally seem to attract controversy. (Perhaps this "
+"is because there is no clear consensus on when a category is \"too big\", "
+"nor whether categories should lend themselves to browsing (and thus what "
+"number of categories would be an ideal number), and so forth.)"
+msgstr ""
+"Обоснование этого заключается в том, что такое изменение создает extref:"
+"{committers-guide}[значительный объем работы, ports] как для коммиттеров, "
+"так и для всех пользователей, которые отслеживают изменения в Коллекции "
+"портов. Кроме того, предлагаемые изменения категорий, как правило, вызывают "
+"споры. (Возможно, это связано с отсутствием четкого консенсуса относительно "
+"того, когда категория становится «слишком большой», а также относительно "
+"того, должны ли категории способствовать удобству просмотра (и, "
+"следовательно, какое количество категорий было бы идеальным), и так далее.)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1074
+msgid "Here is the procedure:"
+msgstr "Вот процедура:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1077
+msgid ""
+"Propose the new category on {freebsd-ports}. Include a detailed rationale "
+"for the new category, including why the existing categories are not "
+"sufficient, and the list of existing ports proposed to move. (If there are "
+"new ports pending in Bugzilla that would fit this category, list them too.) "
+"If you are the maintainer and/or submitter, respectively, mention that as it "
+"may help the case."
+msgstr ""
+"Предложите новую категорию на {freebsd-ports}. Включите подробное "
+"обоснование для новой категории, объясните, почему существующие категории "
+"недостаточны, и укажите список существующих портов, предлагаемых к "
+"перемещению. (Если в Bugzilla есть ожидающие рассмотрения новые порты, "
+"которые подходят под эту категорию, также перечислите их.) Если вы являетесь "
+"сопровождающим и/или подающим предложение, укажите это, так как это может "
+"помочь в рассмотрении."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1078
+msgid "Participate in the discussion."
+msgstr "Участвуйте в обсуждении."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1079
+msgid ""
+"If it seems that there is support for the idea, file a PR which includes "
+"both the rationale and the list of existing ports that need to be moved. "
+"Ideally, this PR would also include these patches:"
+msgstr ""
+"Если кажется, что идея находит поддержку, оформите PR, включающий как "
+"обоснование, так и список существующих портов, которые необходимо "
+"переместить. В идеале, этот PR также должен содержать следующие исправления:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1081
+msgid "[.filename]##Makefile##s for the new ports once they are repocopied"
+msgstr ""
+"[.filename]##Makefile## для новых портов после копирования их репозитория"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1082
+msgid "[.filename]#Makefile# for the new category"
+msgstr "[.filename]#Makefile# для новой категории"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1083
+msgid "[.filename]#Makefile# for the old ports' categories"
+msgstr "[.filename]#Makefile# для старых категорий портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1084
+msgid "[.filename]##Makefile##s for ports that depend on the old ports"
+msgstr "[.filename]##Makefile## для портов, зависящих от старых портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1085
+msgid ""
+"(for extra credit, include the other files that have to change, as per the "
+"procedure in the Committer's Guide.)"
+msgstr ""
+"(для дополнительной оценки включите другие файлы, которые необходимо "
+"изменить, в соответствии с процедурой, описанной в Руководстве коммиттера.)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1087
+msgid ""
+"Since it affects the ports infrastructure and involves moving and patching "
+"many ports but also possibly running regression tests on the build cluster, "
+"assign the PR to the {portmgr}."
+msgstr ""
+"Поскольку это затрагивает инфраструктуру портов и включает перемещение и "
+"исправление многих портов, а также, возможно, проведение регрессионных "
+"тестов на сборочном кластере, назначьте PR для {portmgr}."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1088
+msgid ""
+"If that PR is approved, a committer will need to follow the rest of the "
+"procedure that is extref:{committers-guide}[outlined in the Committer's "
+"Guide, ports]."
+msgstr ""
+"Если этот PR будет одобрен, коммиттер должен будет выполнить оставшуюся "
+"часть процедуры, extref:{committers-guide}[описанной в Руководстве "
+"коммиттера,ports]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1091
+msgid ""
+"Proposing a new virtual category is similar to the above but much less "
+"involved, since no ports will actually have to move. In this case, the only "
+"patches to include in the PR would be those to add the new category to "
+"`CATEGORIES` of the affected ports."
+msgstr ""
+"Предложение новой виртуальной категории аналогично описанному выше, но "
+"гораздо менее трудоёмко, так как фактически не потребуется перемещать порты. "
+"В этом случае единственные патчи, которые нужно включить в PR, — это "
+"добавление новой категории в `CATEGORIES` затронутых портов."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1093
+#, no-wrap
+msgid "Proposing Reorganizing All the Categories"
+msgstr "Предложение о реорганизации всех категорий"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1099
+msgid ""
+"Occasionally someone proposes reorganizing the categories with either a 2-"
+"level structure, or some other kind of keyword structure. To date, nothing "
+"has come of any of these proposals because, while they are very easy to "
+"make, the effort involved to retrofit the entire existing ports collection "
+"with any kind of reorganization is daunting to say the very least. Please "
+"read the history of these proposals in the mailing list archives before "
+"posting this idea. Furthermore, be prepared to be challenged to offer a "
+"working prototype."
+msgstr ""
+"Изредка кто-то предлагает реорганизовать категории, используя либо "
+"двухуровневую структуру, либо какую-либо другую структуру ключевых слов. На "
+"сегодняшний день ни одно из этих предложений не было реализовано, потому "
+"что, хотя их очень легко выдвинуть, усилия, необходимые для переработки всей "
+"существующей коллекции портов в рамках любой реорганизации, пугают, мягко "
+"говоря. Пожалуйста, ознакомьтесь с историей этих предложений в архивах "
+"списка рассылки, прежде чем публиковать эту идею. Более того, будьте готовы "
+"к тому, что вас попросят предоставить рабочий прототип."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1101
+#, no-wrap
+msgid "The Distribution Files"
+msgstr "Файлы дистрибутива"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1104
+msgid ""
+"The second part of the [.filename]#Makefile# describes the files that must "
+"be downloaded to build the port, and where they can be downloaded."
+msgstr ""
+"Вторая часть [.filename]#Makefile# описывает файлы, которые необходимо "
+"загрузить для сборки порта, и места, откуда их можно скачать."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1106
+#, no-wrap
+msgid "`DISTNAME`"
+msgstr "`DISTNAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1113
+msgid ""
+"`DISTNAME` is the name of the port as called by the authors of the "
+"software. `DISTNAME` defaults to `${PORTNAME}-${DISTVERSIONPREFIX}$"
+"{DISTVERSION}${DISTVERSIONSUFFIX}`, and if not set, `DISTVERSION` defaults "
+"to `${PORTVERSION}` so override `DISTNAME` only if necessary. `DISTNAME` is "
+"only used in two places. First, the distribution file list (`DISTFILES`) "
+"defaults to `${DISTNAME}${EXTRACT_SUFX}`. Second, the distribution file is "
+"expected to extract into a subdirectory named `WRKSRC`, which defaults to "
+"[.filename]#work/${DISTNAME}#."
+msgstr ""
+"`DISTNAME` — это имя порта, используемое авторами программного обеспечения. "
+"По умолчанию `DISTNAME` имеет значение `${PORTNAME}-${DISTVERSIONPREFIX}$"
+"{DISTVERSION}${DISTVERSIONSUFFIX}`, а если не задано, `DISTVERSION` по "
+"умолчанию принимает значение `${PORTVERSION}`, поэтому переопределяйте "
+"`DISTNAME` только при необходимости. `DISTNAME` используется только в двух "
+"случаях. Во-первых, список файлов дистрибутива (`DISTFILES`) по умолчанию "
+"имеет значение `${DISTNAME}${EXTRACT_SUFX}`. Во-вторых, ожидается, что файл "
+"дистрибутива распакуется в подкаталог с именем `WRKSRC`, который по "
+"умолчанию равен [.filename]#work/${DISTNAME}#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1116
+msgid ""
+"Some vendor's distribution names which do not fit into the `${PORTNAME}-$"
+"{PORTVERSION}`-scheme can be handled automatically by setting "
+"`DISTVERSIONPREFIX`, `DISTVERSION`, and `DISTVERSIONSUFFIX`. `PORTVERSION` "
+"will be derived from `DISTVERSION` automatically."
+msgstr ""
+"Некоторые названия дистрибутивов от поставщиков, которые не соответствуют "
+"схеме `${PORTNAME}-${PORTVERSION}`, могут обрабатываться автоматически путем "
+"установки `DISTVERSIONPREFIX`, `DISTVERSION` и `DISTVERSIONSUFFIX`. "
+"`PORTVERSION` будет автоматически вычисляться из `DISTVERSION`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1121
+msgid ""
+"Only one of `PORTVERSION` and `DISTVERSION` can be set at a time. If "
+"`DISTVERSION` does not derive a correct `PORTVERSION`, do not use "
+"`DISTVERSION`."
+msgstr ""
+"Только одна из переменных `PORTVERSION` и `DISTVERSION` может быть "
+"установлена одновременно. Если `DISTVERSION` не определяет корректную "
+"`PORTVERSION`, не используйте `DISTVERSION`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1125
+msgid ""
+"If the upstream version scheme can be derived into a ports-compatible "
+"version scheme, set some variable to the upstream version, _do not_ use "
+"`DISTVERSION` as the variable name. Set `PORTVERSION` to the computed "
+"version based on the variable you created, and set `DISTNAME` accordingly."
+msgstr ""
+"Если схема версий исходного проекта может быть преобразована в схему, "
+"совместимую с портами, установите некоторую переменную в версию исходного "
+"проекта, _не используйте_ имя переменной `DISTVERSION`. Установите "
+"`PORTVERSION` в вычисленную версию на основе созданной вами переменной и "
+"задайте `DISTNAME` соответствующим образом."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1127
+msgid ""
+"If the upstream version scheme cannot easily be coerced into a ports-"
+"compatible value, set `PORTVERSION` to a sensible value, and set `DISTNAME` "
+"with `PORTNAME` with the verbatim upstream version."
+msgstr ""
+"Если схема версионирования вышестоящего проекта не может быть легко "
+"преобразована в значение, совместимое с портами, установите `PORTVERSION` в "
+"разумное значение и задайте `DISTNAME` как `PORTNAME` с дословной версией "
+"вышестоящего проекта."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1129
+#, no-wrap
+msgid "Deriving `PORTVERSION` Manually"
+msgstr "Получение `PORTVERSION` вручную"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1135
+msgid ""
+"BIND9 uses a version scheme that is not compatible with the ports versions "
+"(it has `-` in its versions) and cannot be derived using `DISTVERSION` "
+"because after the 9.9.9 release, it will release a \"patchlevels\" in the "
+"form of `9.9.9-P1`. DISTVERSION would translate that into `9.9.9.p1`, "
+"which, in the ports versioning scheme means 9.9.9 pre-release 1, which is "
+"before 9.9.9 and not after. So `PORTVERSION` is manually derived from an "
+"`ISCVERSION` variable to output `9.9.9p1`."
+msgstr ""
+"BIND9 использует схему версионирования, несовместимую с версиями портов (в "
+"версиях используется `-`), и её нельзя получить с помощью `DISTVERSION`, так "
+"как после выпуска 9.9.9 выходят «уровни исправлений» в формате `9.9.9-P1`. "
+"`DISTVERSION` преобразует это в `9.9.9.p1`, что в схеме версионирования "
+"портов означает 9.9.9 pre-release 1, то есть версию, предшествующую 9.9.9, а "
+"не следующую за ней. Поэтому `PORTVERSION` вручную формируется из переменной "
+"`ISCVERSION`, чтобы получить `9.9.9p1`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1137
+msgid ""
+"The order into which the ports framework, and pkg, will sort versions is "
+"checked using the `-t` argument of man:pkg-version[8]:"
+msgstr ""
+"Порядок, в котором система портов и pkg будут сортировать версии, "
+"проверяется с помощью аргумента `-t` из man:pkg-version[8]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1144
+#, no-wrap
+msgid ""
+"% pkg version -t 9.9.9 9.9.9.p1\n"
+"> <.>\n"
+"% pkg version -t 9.9.9 9.9.9p1\n"
+"< <.>\n"
+msgstr ""
+"% pkg version -t 9.9.9 9.9.9.p1\n"
+"> <.>\n"
+"% pkg version -t 9.9.9 9.9.9p1\n"
+"< <.>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1147
+msgid ""
+"The `>` sign means that the first argument passed to `-t` is greater than "
+"the second argument. `9.9.9` is after `9.9.9.p1`."
+msgstr ""
+"Знак `>` означает, что первый аргумент, переданный в `-t`, больше второго "
+"аргумента. `9.9.9` находится после `9.9.9.p1`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1148
+msgid ""
+"The `<` sign means that the first argument passed to `-t` is less than the "
+"second argument. `9.9.9` is before `9.9.9p1`."
+msgstr ""
+"Знак `<` означает, что первый аргумент, переданный в `-t`, меньше второго "
+"аргумента. `9.9.9` находится перед `9.9.9p1`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1150
+msgid ""
+"In the port [.filename]#Makefile#, for example package:dns/bind99[], it is "
+"achieved by:"
+msgstr ""
+"В файле [.filename]#Makefile# порта, например package:dns/bind99[], это "
+"достигается с помощью:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1159
+#, no-wrap
+msgid ""
+"PORTNAME=\tbind\n"
+"PORTVERSION=\t${ISCVERSION:S/-P/P/:S/b/.b/:S/a/.a/:S/rc/.rc/}\n"
+"CATEGORIES=\tdns net\n"
+"MASTER_SITES=\tISC/bind9/${ISCVERSION}\n"
+"PKGNAMESUFFIX=\t99\n"
+"DISTNAME=\t${PORTNAME}-${ISCVERSION}\n"
+msgstr ""
+"PORTNAME=\tbind\n"
+"PORTVERSION=\t${ISCVERSION:S/-P/P/:S/b/.b/:S/a/.a/:S/rc/.rc/}\n"
+"CATEGORIES=\tdns net\n"
+"MASTER_SITES=\tISC/bind9/${ISCVERSION}\n"
+"PKGNAMESUFFIX=\t99\n"
+"DISTNAME=\t${PORTNAME}-${ISCVERSION}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1163
+#, no-wrap
+msgid ""
+"MAINTAINER=\tmat@FreeBSD.org\n"
+"COMMENT=\tBIND DNS suite with updated DNSSEC and DNS64\n"
+"WWW=\t\thttps://www.isc.org/bind/\n"
+msgstr ""
+"MAINTAINER=\tmat@FreeBSD.org\n"
+"COMMENT=\tBIND DNS suite with updated DNSSEC and DNS64\n"
+"WWW=\t\thttps://www.isc.org/bind/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1165
+#, no-wrap
+msgid "LICENSE=\tISCL\n"
+msgstr "LICENSE=\tISCL\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1168
+#, no-wrap
+msgid ""
+"# ISC releases things like 9.8.0-P1 or 9.8.1rc1, which our versioning does not like\n"
+"ISCVERSION=\t9.9.9-P6\n"
+msgstr ""
+"# ISC releases things like 9.8.0-P1 or 9.8.1rc1, which our versioning does not like\n"
+"ISCVERSION=\t9.9.9-P6\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1174
+msgid ""
+"Define upstream version in `ISCVERSION`, with a comment saying _why_ it is "
+"needed. Use `ISCVERSION` to get a ports-compatible `PORTVERSION`. Use "
+"`ISCVERSION` directly to get the correct URL for fetching the distribution "
+"file. Use `ISCVERSION` directly to name the distribution file."
+msgstr ""
+"Определите версию вышестоящего пакета в `ISCVERSION`, с комментарием, "
+"объясняющим, _почему_ это необходимо. Используйте `ISCVERSION` для получения "
+"совместимого с портами `PORTVERSION`. Используйте `ISCVERSION` напрямую для "
+"получения правильного URL для загрузки файла дистрибутива. Используйте "
+"`ISCVERSION` напрямую для именования дистрибутивного файла."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1177
+#, no-wrap
+msgid "Derive `DISTNAME` from `PORTVERSION`"
+msgstr "Получить `DISTNAME` из `PORTVERSION`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1181
+msgid ""
+"From time to time, the distribution file name has little or no relation to "
+"the version of the software."
+msgstr ""
+"Время от времени имя файла дистрибутива имеет мало отношения или вообще "
+"никакого отношения к версии программного обеспечения."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1183
+msgid ""
+"In package:comms/kermit[], only the last element of the version is present "
+"in the distribution file:"
+msgstr ""
+"В пакете package:comms/kermit[], в файле дистрибутива присутствует только "
+"последний элемент версии:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1191
+#, no-wrap
+msgid ""
+"PORTNAME=\tkermit\n"
+"PORTVERSION=\t9.0.304\n"
+"CATEGORIES=\tcomms ftp net\n"
+"MASTER_SITES=\tftp://ftp.kermitproject.org/kermit/test/tar/\n"
+"DISTNAME=\tcku${PORTVERSION:E}-dev20\n"
+msgstr ""
+"PORTNAME=\tkermit\n"
+"PORTVERSION=\t9.0.304\n"
+"CATEGORIES=\tcomms ftp net\n"
+"MASTER_SITES=\tftp://ftp.kermitproject.org/kermit/test/tar/\n"
+"DISTNAME=\tcku${PORTVERSION:E}-dev20\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1195
+msgid ""
+"The `:E` man:make[1] modifier returns the suffix of the variable, in this "
+"case, `304`. The distribution file is correctly generated as `cku304-"
+"dev20.tar.gz`."
+msgstr ""
+"Модификатор `:E` man:make[1] возвращает суффикс переменной, в данном случае "
+"`304`. Файл дистрибутива корректно создаётся как `cku304-dev20.tar.gz`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1198
+#, no-wrap
+msgid "Exotic Case 1"
+msgstr "Экзотический случай 1"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1202
+msgid ""
+"Sometimes, there is no relation between the software name, its version, and "
+"the distribution file it is distributed in."
+msgstr ""
+"Иногда нет связи между названием программы, её версией и файлом "
+"дистрибутива, в котором она распространяется."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1204
+msgid "From package:audio/libworkman[]:"
+msgstr "Из пакета package:audio/libworkman[]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1212
+#, no-wrap
+msgid ""
+"PORTNAME= libworkman\n"
+"PORTVERSION= 1.4\n"
+"CATEGORIES= audio\n"
+"MASTER_SITES= LOCAL/jim\n"
+"DISTNAME= ${PORTNAME}-1999-06-20\n"
+msgstr ""
+"PORTNAME= libworkman\n"
+"PORTVERSION= 1.4\n"
+"CATEGORIES= audio\n"
+"MASTER_SITES= LOCAL/jim\n"
+"DISTNAME= ${PORTNAME}-1999-06-20\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1217
+#, no-wrap
+msgid "Exotic Case 2"
+msgstr "Экзотический случай 2"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1222
+msgid ""
+"In package:comms/librs232[], the distribution file is not versioned, so "
+"using crossref:makefiles[makefile-dist_subdir,`DIST_SUBDIR`] is needed:"
+msgstr ""
+"В пакете package:comms/librs232[] файл дистрибутива не имеет версии, поэтому "
+"необходимо использовать crossref:makefiles[makefile-"
+"dist_subdir,`DIST_SUBDIR`]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1231
+#, no-wrap
+msgid ""
+"PORTNAME= librs232\n"
+"PORTVERSION= 20160710\n"
+"CATEGORIES= comms\n"
+"MASTER_SITES= http://www.teuniz.net/RS-232/\n"
+"DISTNAME= RS-232\n"
+"DIST_SUBDIR=\t${PORTNAME}-${PORTVERSION}\n"
+msgstr ""
+"PORTNAME= librs232\n"
+"PORTVERSION= 20160710\n"
+"CATEGORIES= comms\n"
+"MASTER_SITES= http://www.teuniz.net/RS-232/\n"
+"DISTNAME= RS-232\n"
+"DIST_SUBDIR=\t${PORTNAME}-${PORTVERSION}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1239
+msgid ""
+"`PKGNAMEPREFIX` and `PKGNAMESUFFIX` do not affect `DISTNAME`. Also note "
+"that if `WRKSRC` is equal to [.filename]#${WRKDIR}/${DISTNAME}# while the "
+"original source archive is named something other than `${PORTNAME}-$"
+"{PORTVERSION}${EXTRACT_SUFX}`, leave `DISTNAME` alone- defining only "
+"`DISTFILES` is easier than both `DISTNAME` and `WRKSRC` (and possibly "
+"`EXTRACT_SUFX`)."
+msgstr ""
+"`PKGNAMEPREFIX` и `PKGNAMESUFFIX` не влияют на `DISTNAME`. Также обратите "
+"внимание, что если `WRKSRC` равно [.filename]#${WRKDIR}/${DISTNAME}#, а "
+"исходный архив с исходным кодом называется иначе, чем `${PORTNAME}-$"
+"{PORTVERSION}${EXTRACT_SUFX}`, оставьте `DISTNAME` без изменений — "
+"определение только `DISTFILES` проще, чем определение и `DISTNAME`, и "
+"`WRKSRC` (а возможно, и `EXTRACT_SUFX`)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1242
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4897
+#, no-wrap
+msgid "`MASTER_SITES`"
+msgstr "`MASTER_SITES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1246
+msgid ""
+"Record the directory part of the FTP/HTTP-URL pointing at the original "
+"tarball in `MASTER_SITES`. Do not forget the trailing slash ([.filename]#/"
+"#)!"
+msgstr ""
+"Запишите именем каталога из FTP/HTTP-URL, указывающего на исходный tarball, "
+"в `MASTER_SITES`. Не забудьте завершающий слэш ([.filename]#/#)!"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1248
+msgid ""
+"The `make` macros will try to use this specification for grabbing the "
+"distribution file with `FETCH` if they cannot find it already on the system."
+msgstr ""
+"Макросы `make` будут пытаться использовать эту спецификацию для загрузки "
+"файла дистрибутива с помощью `FETCH`, если не смогут найти его уже в системе."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1251
+msgid ""
+"It is recommended that multiple sites are included on this list, preferably "
+"from different continents. This will safeguard against wide-area network "
+"problems."
+msgstr ""
+"Рекомендуется включать в этот список несколько сайтов, желательно с разных "
+"континентов. Это обеспечит защиту от проблем в глобальной сети."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1259
+msgid ""
+"`MASTER_SITES` must not be blank. It must point to the actual site hosting "
+"the distribution files. It cannot point to web archives, or the FreeBSD "
+"distribution files cache sites. The only exception to this rule is ports "
+"that do not have any distribution files. For example, meta-ports do not "
+"have any distribution files, so `MASTER_SITES` does not need to be set."
+msgstr ""
+"`MASTER_SITES` не должен быть пустым. Он должен указывать на реальный сайт, "
+"где размещены файлы дистрибутива. Он не может указывать на веб-архивы или "
+"кэшированные сайты с файлами дистрибутива FreeBSD. Единственное исключение "
+"из этого правила — порты, у которых нет файлов дистрибутива. Например, мета-"
+"порты не имеют файлов дистрибутива, поэтому `MASTER_SITES` не нужно задавать."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1262
+#, no-wrap
+msgid "Using `MASTER_SITE_*` Variables"
+msgstr "Использование переменных `MASTER_SITE_*`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1265
+msgid ""
+"Shortcut abbreviations are available for popular archives like SourceForge "
+"(`SOURCEFORGE`), GNU (`GNU`), or Perl CPAN (`PERL_CPAN`). `MASTER_SITES` can "
+"use them directly:"
+msgstr ""
+"Для популярных архивов, таких как SourceForge (`SOURCEFORGE`), GNU (`GNU`) "
+"или Perl CPAN (`PERL_CPAN`), доступны сокращённые обозначения. "
+"`MASTER_SITES` может использовать их напрямую:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1269
+#, no-wrap
+msgid "MASTER_SITES=\tGNU/make\n"
+msgstr "MASTER_SITES=\tGNU/make\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1273
+msgid ""
+"The older expanded format still works, but all ports have been converted to "
+"the compact format. The expanded format looks like this:"
+msgstr ""
+"Старый расширенный формат по-прежнему работает, но все порты были "
+"преобразованы в компактный формат. Расширенный формат выглядит следующим "
+"образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1278
+#, no-wrap
+msgid ""
+"MASTER_SITES=\t\t${MASTER_SITE_GNU}\n"
+"MASTER_SITE_SUBDIR=\tmake\n"
+msgstr ""
+"MASTER_SITES=\t\t${MASTER_SITE_GNU}\n"
+"MASTER_SITE_SUBDIR=\tmake\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1282
+msgid ""
+"These values and variables are defined in https://cgit.freebsd.org/ports/"
+"tree/Mk/bsd.sites.mk[Mk/bsd.sites.mk]. New entries are added often, so make "
+"sure to check the latest version of this file before submitting a port."
+msgstr ""
+"Эти значения и переменные определены в https://cgit.freebsd.org/ports/tree/"
+"Mk/bsd.sites.mk[Mk/bsd.sites.mk]. Новые записи добавляются часто, поэтому "
+"обязательно проверяйте последнюю версию этого файла перед отправкой порта."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1287
+msgid ""
+"For any `MASTER_SITE_FOO` variable, the shorthand `_FOO_` can be used. For "
+"example, use:"
+msgstr ""
+"Для любой переменной `MASTER_SITE_FOO` можно использовать сокращение "
+"`_FOO_`. Например, используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1291
+#, no-wrap
+msgid "MASTER_SITES=\tFOO\n"
+msgstr "MASTER_SITES=\tFOO\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1294
+msgid "If `MASTER_SITE_SUBDIR` is needed, use this:"
+msgstr "Если требуется `MASTER_SITE_SUBDIR`, используйте следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1298
+#, no-wrap
+msgid "MASTER_SITES=\tFOO/bar\n"
+msgstr "MASTER_SITES=\tFOO/bar\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1305
+msgid ""
+"Some `MASTER_SITE_*` names are quite long, and for ease of use, shortcuts "
+"have been defined:"
+msgstr ""
+"Некоторые имена `MASTER_SITE_*` довольно длинные, и для удобства "
+"использования были определены сокращения:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1307
+#, no-wrap
+msgid "Shortcuts for `MASTER_SITE_*` Macros"
+msgstr "Сокращения для макросов `MASTER_SITE_*`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1311
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1369
+#, no-wrap
+msgid "Macro"
+msgstr "Макрос"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1313
+#, no-wrap
+msgid "Shortcut"
+msgstr "Сокращение"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1314
+#, no-wrap
+msgid "`PERL_CPAN`"
+msgstr "`PERL_CPAN`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1316
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1387
+#, no-wrap
+msgid "`CPAN`"
+msgstr "`CPAN`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1317
+#, no-wrap
+msgid "`GITHUB`"
+msgstr "`GITHUB`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1319
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1408
+#, no-wrap
+msgid "`GH`"
+msgstr "`GH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1320
+#, no-wrap
+msgid "`GITHUB_CLOUD`"
+msgstr "`GITHUB_CLOUD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1322
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1411
+#, no-wrap
+msgid "`GHC`"
+msgstr "`GHC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1323
+#, no-wrap
+msgid "`LIBREOFFICE_DEV`"
+msgstr "`LIBREOFFICE_DEV`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1325
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1429
+#, no-wrap
+msgid "`LODEV`"
+msgstr "`LODEV`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1326
+#, no-wrap
+msgid "`NETLIB`"
+msgstr "`NETLIB`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1328
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1438
+#, no-wrap
+msgid "`NL`"
+msgstr "`NL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1329
+#, no-wrap
+msgid "`RUBYGEMS`"
+msgstr "`RUBYGEMS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1331
+#, no-wrap
+msgid "`RG`"
+msgstr "`RG`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1332
+#, no-wrap
+msgid "`SOURCEFORGE`"
+msgstr "`SOURCEFORGE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1333
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1450
+#, no-wrap
+msgid "`SF`"
+msgstr "`SF`"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1337
+#, no-wrap
+msgid "Magic MASTER_SITES Macros"
+msgstr "Волшебные макросы MASTER_SITES"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1342
+msgid ""
+"Several \"magic\" macros exist for popular sites with a predictable "
+"directory structure. For these, just use the abbreviation and the system "
+"will choose a subdirectory automatically. For a port named `Stardict`, of "
+"version `1.2.3`, and hosted on SourceForge, adding this line:"
+msgstr ""
+"Существует несколько \"волшебных\" макросов для популярных сайтов с "
+"предсказуемой структурой каталогов. Для них достаточно использовать "
+"сокращение, и система автоматически выберет подкаталог. Например, для порта "
+"с именем `Stardict`, версии `1.2.3`, размещенного на SourceForge, добавьте "
+"следующую строку:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1346
+#, no-wrap
+msgid "MASTER_SITES=\tSF\n"
+msgstr "MASTER_SITES=\tSF\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1350
+msgid ""
+"infers a subdirectory named `/project/stardict/stardict/1.2.3`. If the "
+"inferred directory is incorrect, it can be overridden:"
+msgstr ""
+"подразумевает подкаталог с именем `/project/stardict/stardict/1.2.3`. Если "
+"подразумеваемый каталог указан неверно, его можно переопределить:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1354
+#, no-wrap
+msgid "MASTER_SITES=\tSF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}\n"
+msgstr "MASTER_SITES=\tSF/stardict/WyabdcRealPeopleTTS/${PORTVERSION}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1357
+msgid "This can also be written as"
+msgstr "Это также можно записать как"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1362
+#, no-wrap
+msgid ""
+"MASTER_SITES=\tSF\n"
+"MASTER_SITE_SUBDIR=\tstardict/WyabdcRealPeopleTTS/${PORTVERSION}\n"
+msgstr ""
+"MASTER_SITES=\tSF\n"
+"MASTER_SITE_SUBDIR=\tstardict/WyabdcRealPeopleTTS/${PORTVERSION}\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1365
+#, no-wrap
+msgid "Magic `MASTER_SITES` Macros"
+msgstr "Волшебные макросы `MASTER_SITES`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1371
+#, no-wrap
+msgid "Assumed subdirectory"
+msgstr "Предполагаемая поддиректория"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1372
+#, no-wrap
+msgid "`APACHE_COMMONS_BINARIES`"
+msgstr "`APACHE_COMMONS_BINARIES`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1374
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1377
+#, no-wrap
+msgid "`${PORTNAME:S,commons-,,}`"
+msgstr "`${PORTNAME:S,commons-,,}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1375
+#, no-wrap
+msgid "`APACHE_COMMONS_SOURCE`"
+msgstr "`APACHE_COMMONS_SOURCE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1378
+#, no-wrap
+msgid "`APACHE_JAKARTA`"
+msgstr "`APACHE_JAKARTA`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1380
+#, no-wrap
+msgid "`${PORTNAME:S,-,/,}/source`"
+msgstr "`${PORTNAME:S,-,/,}/source`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1381
+#, no-wrap
+msgid "`BERLIOS`"
+msgstr "`BERLIOS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1383
+#, no-wrap
+msgid "`${PORTNAME:tl}.berlios`"
+msgstr "`${PORTNAME:tl}.berlios`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1384
+#, no-wrap
+msgid "`CHEESESHOP`"
+msgstr "`CHEESESHOP`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1386
+#, no-wrap
+msgid "`source/${DISTNAME:C/(.).\\*/\\1/}/${DISTNAME:C/(.*)-[0-9].*/\\1/}`"
+msgstr "`source/${DISTNAME:C/(.).\\*/\\1/}/${DISTNAME:C/(.*)-[0-9].*/\\1/}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1389
+#, no-wrap
+msgid "`${PORTNAME:C/-.*//}`"
+msgstr "`${PORTNAME:C/-.*//}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1390
+#, no-wrap
+msgid "`DEBIAN`"
+msgstr "`DEBIAN`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1392
+#, no-wrap
+msgid "`pool/main/${PORTNAME:C/^((lib)?.).*$/\\1/}/${PORTNAME}`"
+msgstr "`pool/main/${PORTNAME:C/^((lib)?.).*$/\\1/}/${PORTNAME}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1393
+#, no-wrap
+msgid "`FARSIGHT`"
+msgstr "`FARSIGHT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1395
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1419
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1422
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1425
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1428
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1431
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1440
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1446
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1479
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1483
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1892
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1896
+#, no-wrap
+msgid "`${PORTNAME}`"
+msgstr "`${PORTNAME}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1396
+#, no-wrap
+msgid "`FESTIVAL`"
+msgstr "`FESTIVAL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1398
+#, no-wrap
+msgid "`${PORTREVISION}`"
+msgstr "`${PORTREVISION}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1399
+#, no-wrap
+msgid "`GCC`"
+msgstr "`GCC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1401
+#, no-wrap
+msgid "`releases/${DISTNAME}`"
+msgstr "`releases/${DISTNAME}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1402
+#, no-wrap
+msgid "`GENTOO`"
+msgstr "`GENTOO`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1404
+#, no-wrap
+msgid "`distfiles`"
+msgstr "`distfiles`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1405
+#, no-wrap
+msgid "`GIMP`"
+msgstr "`GIMP`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1407
+#, no-wrap
+msgid "`${PORTNAME}/${PORTVERSION:R}/`"
+msgstr "`${PORTNAME}/${PORTVERSION:R}/`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1410
+#, no-wrap
+msgid "`${GH_ACCOUNT}/${GH_PROJECT}/tar.gz/${GH_TAGNAME}?dummy=/`"
+msgstr "`${GH_ACCOUNT}/${GH_PROJECT}/tar.gz/${GH_TAGNAME}?dummy=/`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1413
+#, no-wrap
+msgid "`${GH_ACCOUNT}/${GH_PROJECT}/`"
+msgstr "`${GH_ACCOUNT}/${GH_PROJECT}/`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1414
+#, no-wrap
+msgid "`GNOME`"
+msgstr "`GNOME`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1416
+#, no-wrap
+msgid "`sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\\.[0-9]+).*/\\1/}`"
+msgstr "`sources/${PORTNAME}/${PORTVERSION:C/^([0-9]+\\.[0-9]+).*/\\1/}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1417
+#, no-wrap
+msgid "`GNU`"
+msgstr "`GNU`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1420
+#, no-wrap
+msgid "`GNUPG`"
+msgstr "`GNUPG`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1423
+#, no-wrap
+msgid "`GNU_ALPHA`"
+msgstr "`GNU_ALPHA`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1426
+#, no-wrap
+msgid "`HORDE`"
+msgstr "`HORDE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1432
+#, no-wrap
+msgid "`MATE`"
+msgstr "`MATE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1434
+#, no-wrap
+msgid "`${PORTVERSION:C/^([0-9]+\\.[0-9]+).*/\\1/}`"
+msgstr "`${PORTVERSION:C/^([0-9]+\\.[0-9]+).*/\\1/}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1435
+#, no-wrap
+msgid "`MOZDEV`"
+msgstr "`MOZDEV`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1437
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1449
+#, no-wrap
+msgid "`${PORTNAME:tl}`"
+msgstr "`${PORTNAME:tl}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1441
+#, no-wrap
+msgid "`QT`"
+msgstr "`QT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1443
+#, no-wrap
+msgid "`archive/qt/${PORTVERSION:R}`"
+msgstr "`archive/qt/${PORTVERSION:R}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1444
+#, no-wrap
+msgid "`SAMBA`"
+msgstr "`SAMBA`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1447
+#, no-wrap
+msgid "`SAVANNAH`"
+msgstr "`SAVANNAH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1451
+#, no-wrap
+msgid "`${PORTNAME:tl}/${PORTNAME:tl}/${PORTVERSION}`"
+msgstr "`${PORTNAME:tl}/${PORTNAME:tl}/${PORTVERSION}`"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1454
+#, no-wrap
+msgid "`USE_GITHUB`"
+msgstr "`USE_GITHUB`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1458
+msgid ""
+"If the distribution file comes from a specific commit or tag on https://"
+"github.com/[GitHub] for which there is no officially released file, there is "
+"an easy way to set the right `DISTNAME` and `MASTER_SITES` automatically."
+msgstr ""
+"Если файл дистрибутива получен из определённого коммита или тега на https://"
+"github.com/[GitHub], для которого нет официально выпущенного файла, "
+"существует простой способ автоматически установить правильные значения "
+"`DISTNAME` и `MASTER_SITES`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1463
+msgid ""
+"As of 2023-02-21 link:https://github.blog/2023-02-21-update-on-the-future-"
+"stability-of-source-code-archives-and-hashes/[GitHub] have announced that "
+"source downloads will be stable for a year. Please switch to release assets "
+"and if not available ask upstream to generate ones."
+msgstr ""
+"По состоянию на 2023-02-21 link:https://github.blog/2023-02-21-update-on-the-"
+"future-stability-of-source-code-archives-and-hashes/[GitHub] объявили, что "
+"загрузки исходного кода будут стабильными в течение года. Пожалуйста, "
+"переключитесь на ресурсы выпусков (release assets), а если они недоступны, "
+"запросите их создание у вышестоящих разработчиков."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1466
+msgid "These variables are available:"
+msgstr "Доступны следующие переменные:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1468
+#, no-wrap
+msgid "`USE_GITHUB` Description"
+msgstr "`USE_GITHUB` Описание"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1472
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1881
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3681
+#, no-wrap
+msgid "Variable"
+msgstr "Переменная"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1475
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1884
+#, no-wrap
+msgid "Default"
+msgstr "По умолчанию"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1476
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4879
+#, no-wrap
+msgid "`GH_ACCOUNT`"
+msgstr "`GH_ACCOUNT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1477
+#, no-wrap
+msgid "Account name of the GitHub user hosting the project"
+msgstr "Имя учётной записи пользователя GitHub, который размещает проект"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1480
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4880
+#, no-wrap
+msgid "`GH_PROJECT`"
+msgstr "`GH_PROJECT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1481
+#, no-wrap
+msgid "Name of the project on GitHub"
+msgstr "Название проекта на GitHub"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1484
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4882
+#, no-wrap
+msgid "`GH_TAGNAME`"
+msgstr "`GH_TAGNAME`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1485
+#, no-wrap
+msgid "Name of the tag to download (2.0.1, hash, ...) Using the name of a branch here is incorrect. It is also possible to use the hash of a commit id to do a snapshot."
+msgstr "Имя тега для загрузки (2.0.1, хэш, ...) Использование имени ветки здесь некорректно. Также можно использовать хэш идентификатора коммита для создания снимка состояния."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1487
+#, no-wrap
+msgid "`${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX}`"
+msgstr "`${DISTVERSIONPREFIX}${DISTVERSION}${DISTVERSIONSUFFIX}`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1488
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4881
+#, no-wrap
+msgid "`GH_SUBDIR`"
+msgstr "`GH_SUBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1491
+#, no-wrap
+msgid ""
+"When the software needs an additional distribution file to be extracted within\n"
+"`${WRKSRC}`, this variable can be used. See the examples in\n"
+"crossref:makefiles[makefile-master_sites-github-multiple, Fetching Multiple Files from GitHub] for more information."
+msgstr ""
+"Когда программному обеспечению требуется дополнительный файл дистрибутива для извлечения в\n"
+"`${WRKSRC}`, можно использовать эту переменную. Примеры можно найти в\n"
+"crossref:makefiles[makefile-master_sites-github-multiple, Загрузка нескольких файлов из GitHub] для получения дополнительной информации."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1493
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1906
+#, no-wrap
+msgid "(none)"
+msgstr "(отсутствует)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1494
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4883
+#, no-wrap
+msgid "`GH_TUPLE`"
+msgstr "`GH_TUPLE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1495
+#, no-wrap
+msgid "`GH_TUPLE` allows putting `GH_ACCOUNT`, `GH_PROJECT`, `GH_TAGNAME`, and `GH_SUBDIR` into a single variable. The format is _account_`:`_project_`:`_tagname_`:`_group_`/`_subdir_. The `/`_subdir_ part is optional. It is helpful when there is more than one GitHub project from which to fetch."
+msgstr "`GH_TUPLE` позволяет объединить `GH_ACCOUNT`, `GH_PROJECT`, `GH_TAGNAME` и `GH_SUBDIR` в одну переменную. Формат следующий: _account_`:`_project_`:`_tagname_`:`_group_`/`_subdir_. Часть `/`_subdir_ является необязательной. Это полезно, когда требуется получить несколько проектов с GitHub."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1501
+msgid ""
+"Do not use `GH_TUPLE` for the default distribution file, as it has no "
+"default."
+msgstr ""
+"Не используйте `GH_TUPLE` для файла дистрибутива по умолчанию, так как у "
+"него нет значения по умолчанию."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1504
+#, no-wrap
+msgid "Simple Use of `USE_GITHUB`"
+msgstr "Простое использование `USE_GITHUB`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1509
+msgid ""
+"While trying to make a port for version `1.2.7` of pkg from the FreeBSD user "
+"on github, at https://github.com/freebsd/pkg/[], The [.filename]#Makefile# "
+"would end up looking like this (slightly stripped for the example):"
+msgstr ""
+"При попытке создать порт для версии `1.2.7` pkg от пользователя FreeBSD на "
+"github, по адресу https://github.com/freebsd/pkg/[], файл "
+"[.filename]#Makefile# в итоге будет выглядеть следующим образом "
+"(незначительно сокращено для примера):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1514
+#, no-wrap
+msgid ""
+"PORTNAME=\tpkg\n"
+"DISTVERSION=\t1.2.7\n"
+msgstr ""
+"PORTNAME=\tpkg\n"
+"DISTVERSION=\t1.2.7\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1517
+#, no-wrap
+msgid ""
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tfreebsd\n"
+msgstr ""
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tfreebsd\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1520
+msgid ""
+"It will automatically have `MASTER_SITES` set to `GH` and `WRKSRC` to `$"
+"{WRKDIR}/pkg-1.2.7`."
+msgstr ""
+"Он автоматически получит `MASTER_SITES` установленным в `GH` и `WRKSRC` в `$"
+"{WRKDIR}/pkg-1.2.7`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1523
+#, no-wrap
+msgid "More Complete Use of `USE_GITHUB`"
+msgstr "Более полное использование `USE_GITHUB`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1527
+msgid ""
+"While trying to make a port for the bleeding edge version of pkg from the "
+"FreeBSD user on github, at https://github.com/freebsd/pkg/[], the "
+"[.filename]#Makefile# ends up looking like this (slightly stripped for the "
+"example):"
+msgstr ""
+"При попытке создать порт для самой последней версии pkg от пользователя "
+"FreeBSD на github, по адресу https://github.com/freebsd/pkg/[], файл "
+"[.filename]#Makefile# в итоге выглядит следующим образом (незначительно "
+"сокращено для примера):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1532
+#, no-wrap
+msgid ""
+"PORTNAME=\tpkg-devel\n"
+"DISTVERSION=\t1.3.0.a.20140411\n"
+msgstr ""
+"PORTNAME=\tpkg-devel\n"
+"DISTVERSION=\t1.3.0.a.20140411\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1537
+#, no-wrap
+msgid ""
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tfreebsd\n"
+"GH_PROJECT=\tpkg\n"
+"GH_TAGNAME=\t6dbb17b\n"
+msgstr ""
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tfreebsd\n"
+"GH_PROJECT=\tpkg\n"
+"GH_TAGNAME=\t6dbb17b\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1540
+msgid ""
+"It will automatically have `MASTER_SITES` set to `GH` and `WRKSRC` to `$"
+"{WRKDIR}/pkg-6dbb17b`."
+msgstr ""
+"Он автоматически получит `MASTER_SITES` со значением `GH` и `WRKSRC` со "
+"значением `${WRKDIR}/pkg-6dbb17b`."
+
+#. type: delimited block * 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1544
+msgid ""
+"`20140411` is the date of the commit referenced in `GH_TAGNAME`, not the "
+"date the [.filename]#Makefile# is edited, or the date the commit is made."
+msgstr ""
+"`20140411` — это дата коммита, указанного в `GH_TAGNAME`, а не дата "
+"редактирования файла [.filename]#Makefile# или дата создания коммита."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1549
+#, no-wrap
+msgid "Use of `USE_GITHUB` with `DISTVERSIONPREFIX`"
+msgstr "Использование `USE_GITHUB` с `DISTVERSIONPREFIX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1555
+msgid ""
+"From time to time, `GH_TAGNAME` is a slight variation from `DISTVERSION`. "
+"For example, if the version is `1.0.2`, the tag is `v1.0.2`. In those "
+"cases, it is possible to use `DISTVERSIONPREFIX` or `DISTVERSIONSUFFIX`:"
+msgstr ""
+"Время от времени `GH_TAGNAME` немного отличается от `DISTVERSION`. Например, "
+"если версия `1.0.2`, то тег будет `v1.0.2`. В таких случаях можно "
+"использовать `DISTVERSIONPREFIX` или `DISTVERSIONSUFFIX`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1561
+#, no-wrap
+msgid ""
+"PORTNAME=\tfoo\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION=\t1.0.2\n"
+msgstr ""
+"PORTNAME=\tfoo\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION=\t1.0.2\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1563
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1627
+#, no-wrap
+msgid "USE_GITHUB=\tyes\n"
+msgstr "USE_GITHUB=\tyes\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1566
+msgid ""
+"It will automatically set `GH_TAGNAME` to `v1.0.2`, while `WRKSRC` will be "
+"kept to `${WRKDIR}/foo-1.0.2`."
+msgstr ""
+"Он автоматически установит `GH_TAGNAME` в `v1.0.2`, в то время как `WRKSRC` "
+"останется `${WRKDIR}/foo-1.0.2`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1569
+#, no-wrap
+msgid "Using `USE_GITHUB` When Upstream Does Not Use Versions"
+msgstr "Использование `USE_GITHUB` при отсутствии версий у исходного проекта"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1574
+msgid ""
+"If there never was a version upstream, do not invent one like `0.1` or "
+"`1.0`. Create the port with a `DISTVERSION` of `g__YYYYMMDD__`, where `g` "
+"is for Git, and `_YYYYMMDD_` represents the date the commit referenced in "
+"`GH_TAGNAME`."
+msgstr ""
+"Если никогда не было версии вышестоящего репозитория, не изобретайте её, "
+"например `0.1` или `1.0`. Создайте порт с `DISTVERSION` в формате "
+"`g__YYYYMMDD__`, где `g` означает Git, а `_YYYYMMDD_` представляет дату "
+"коммита, указанного в `GH_TAGNAME`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1579
+#, no-wrap
+msgid ""
+"PORTNAME=\tbar\n"
+"DISTVERSION=\tg20140411\n"
+msgstr ""
+"PORTNAME=\tbar\n"
+"DISTVERSION=\tg20140411\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1582
+#, no-wrap
+msgid ""
+"USE_GITHUB=\tyes\n"
+"GH_TAGNAME=\tc472d66b\n"
+msgstr ""
+"USE_GITHUB=\tyes\n"
+"GH_TAGNAME=\tc472d66b\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1586
+msgid ""
+"This creates a versioning scheme that increases over time, and that is still "
+"before version `0`. See crossref:makefiles[makefile-versions-ex-pkg-"
+"version, this secion on how to compare versions] using man:pkg-version[8]):"
+msgstr ""
+"Это создаёт схему версионирования, которая увеличивается со временем и всё "
+"ещё находится до версии `0`. Подробности об использовании man:pkg-version[8] "
+"для сравнения версий смотрите в crossref:makefiles[makefile-versions-ex-pkg-"
+"version, этой секции]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1591
+#, no-wrap
+msgid ""
+"% pkg version -t g20140411 0\n"
+"<\n"
+msgstr ""
+"% pkg version -t g20140411 0\n"
+"<\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1594
+msgid ""
+"Which means using `PORTEPOCH` will not be needed in case upstream decides to "
+"cut versions in the future."
+msgstr ""
+"Что означает, что использование `PORTEPOCH` не потребуется, если вышестоящий "
+"проект решит сократить версии в будущем."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1597
+#, no-wrap
+msgid "Using `USE_GITHUB` to Access a Commit Between Two Versions"
+msgstr "Использование `USE_GITHUB` для доступа к коммиту между двумя версиями"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1601
+msgid ""
+"If the current version of the software uses a Git tag, and the port needs to "
+"be updated to a newer, intermediate version, without a tag, use man:git-"
+"describe[1] to find out the version to use:"
+msgstr ""
+"Если текущая версия программного обеспечения использует тег Git, и порт "
+"необходимо обновить до более новой промежуточной версии без тега, "
+"используйте man:git-describe[1], чтобы определить версию для использования:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1606
+#, no-wrap
+msgid ""
+"% git describe --tags f0038b1\n"
+"v0.7.3-14-gf0038b1\n"
+msgstr ""
+"% git describe --tags f0038b1\n"
+"v0.7.3-14-gf0038b1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1609
+msgid "`v0.7.3-14-gf0038b1` can be split into three parts:"
+msgstr "`v0.7.3-14-gf0038b1` можно разделить на три части:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1610
+#, no-wrap
+msgid "`v0.7.3`"
+msgstr "`v0.7.3`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1612
+msgid ""
+"This is the last Git tag that appears in the commit history before the "
+"requested commit."
+msgstr ""
+"Это последний тег Git, который появляется в истории коммитов перед "
+"запрошенным коммитом."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1613
+#, no-wrap
+msgid "`-14`"
+msgstr "`-14`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1615
+msgid ""
+"This means that the requested commit, `f0038b1`, is the 14th commit after "
+"the `v0.7.3` tag."
+msgstr ""
+"Это означает, что запрошенный коммит `f0038b1` является 14-м коммитом после "
+"тега `v0.7.3`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1616
+#, no-wrap
+msgid "`-gf0038b1`"
+msgstr "`-gf0038b1`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1618
+msgid ""
+"The `-g` means \"Git\", and the `f0038b1` is the commit hash that this "
+"reference points to."
+msgstr ""
+"`-g` означает \"Git\", а `f0038b1` — это хеш коммита, на который указывает "
+"данная ссылка."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1625
+#, no-wrap
+msgid ""
+"PORTNAME=\tbar\n"
+"DISTVERSIONPREFIX= v\n"
+"DISTVERSION=\t0.7.3-14\n"
+"DISTVERSIONSUFFIX= -gf0038b1\n"
+msgstr ""
+"PORTNAME=\tbar\n"
+"DISTVERSIONPREFIX= v\n"
+"DISTVERSION=\t0.7.3-14\n"
+"DISTVERSIONSUFFIX= -gf0038b1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1631
+msgid ""
+"This creates a versioning scheme that increases over time (well, over "
+"commits), and does not conflict with the creation of a `0.7.4` version. See "
+"crossref:makefiles[makefile-versions-ex-pkg-version, this section for how to "
+"compare versions] using man:pkg-version[8]):"
+msgstr ""
+"Это создаёт схему версионирования, которая увеличивается со временем "
+"(точнее, с коммитами) и не конфликтует с созданием версии `0.7.4`. "
+"Подробности об использовании man:pkg-version[8] для сравнения версий "
+"смотрите в crossref:makefiles[makefile-versions-ex-pkg-version, этой "
+"секции] :"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1638
+#, no-wrap
+msgid ""
+"% pkg version -t 0.7.3 0.7.3.14\n"
+"<\n"
+"% pkg version -t 0.7.3.14 0.7.4\n"
+"<\n"
+msgstr ""
+"% pkg version -t 0.7.3 0.7.3.14\n"
+"<\n"
+"% pkg version -t 0.7.3.14 0.7.4\n"
+"<\n"
+
+#. type: delimited block * 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1644
+msgid ""
+"If the requested commit is the same as a tag, a shorter description is shown "
+"by default. The longer version is equivalent:"
+msgstr ""
+"Если запрошенный коммит совпадает с тегом, по умолчанию отображается более "
+"короткое описание. Полная версия эквивалентна:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1649
+#, no-wrap
+msgid ""
+"% git describe --tags c66c71d\n"
+"v0.7.3\n"
+msgstr ""
+"% git describe --tags c66c71d\n"
+"v0.7.3\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1652
+#, no-wrap
+msgid ""
+"% git describe --tags --long c66c71d\n"
+"v0.7.3-0-gc66c71d\n"
+msgstr ""
+"% git describe --tags --long c66c71d\n"
+"v0.7.3-0-gc66c71d\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1659
+#, no-wrap
+msgid "Fetching Multiple Files from GitHub"
+msgstr "Извлечение нескольких файлов из GitHub"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1663
+msgid ""
+"The `USE_GITHUB` framework also supports fetching multiple distribution "
+"files from different places in GitHub. It works in a way very similar to "
+"crossref:makefiles[porting-master-sites-n, Multiple Distribution or Patches "
+"Files from Multiple Locations]."
+msgstr ""
+"Фреймворк `USE_GITHUB` также поддерживает загрузку нескольких файлов "
+"дистрибутива из разных мест в GitHub. Он работает очень похоже на "
+"crossref:makefiles[porting-master-sites-n, Файлы дистрибуции или патчей из "
+"нескольких мест]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1669
+msgid ""
+"Multiple values are added to `GH_ACCOUNT`, `GH_PROJECT`, and `GH_TAGNAME`. "
+"Each different value is assigned a group. The main value can either have no "
+"group, or the `:DEFAULT` group. A value can be omitted if it is the same as "
+"the default as listed in crossref:makefiles[makefile-master_sites-github-"
+"description,`USE_GITHUB` Description]."
+msgstr ""
+"В `GH_ACCOUNT`, `GH_PROJECT` и `GH_TAGNAME` добавляются несколько значений. "
+"Каждому различному значению присваивается группа. Основное значение может не "
+"иметь группы или принадлежать группе `:DEFAULT`. Значение может быть "
+"опущено, если оно совпадает со значением по умолчанию, указанным в "
+"crossref:makefiles[makefile-master_sites-github-description,описании "
+"`USE_GITHUB`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1672
+msgid ""
+"`GH_TUPLE` can also be used when there are a lot of distribution files. It "
+"helps keep the account, project, tagname, and group information at the same "
+"place."
+msgstr ""
+"`GH_TUPLE` также можно использовать, когда имеется множество файлов "
+"дистрибутива. Это помогает сохранять учётные данные, проект, имя тега и "
+"информацию о группе в одном месте."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1675
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1979
+msgid ""
+"For each group, a `${WRKSRC_group}` helper variable is created, containing "
+"the directory into which the file has been extracted. The `${WRKSRC_group}` "
+"variables can be used to move directories around during `post-extract`, or "
+"add to `CONFIGURE_ARGS`, or whatever is needed so that the software builds "
+"correctly."
+msgstr ""
+"Для каждой группы создаётся вспомогательная переменная `${WRKSRC_group}`, "
+"содержащая каталог, в который был извлечён файл. Переменные `${WRKSRC_group}"
+"` могут использоваться для перемещения каталогов во время `post-extract`, "
+"добавления в `CONFIGURE_ARGS` или любых других действий, необходимых для "
+"корректной сборки программного обеспечения."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1680
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1984
+msgid ""
+"The `:__group__` part _must_ be used for _only one_ distribution file. It "
+"is used as a unique key and using it more than once will overwrite the "
+"previous values."
+msgstr ""
+"Часть `:__group__` _должна_ использоваться _только для одного_ файла "
+"дистрибутива. Она служит уникальным ключом, и её повторное использование "
+"приведёт к перезаписи предыдущих значений."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1687
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1991
+msgid ""
+"As this is only syntactic sugar above `DISTFILES` and `MASTER_SITES`, the "
+"group names must adhere to the restrictions on group names outlined in "
+"crossref:makefiles[porting-master-sites-n, Multiple Distribution or Patches "
+"Files from Multiple Locations]"
+msgstr ""
+"Поскольку это всего лишь синтаксический сахар над `DISTFILES` и "
+"`MASTER_SITES`, имена групп должны соответствовать ограничениям на имена "
+"групп, описанным в crossref:makefiles[porting-master-sites-n, Файлы "
+"дистрибутивов или патчей из нескольких источников]"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1691
+msgid ""
+"When fetching multiple files from GitHub, sometimes the default distribution "
+"file is not fetched from GitHub. To disable fetching the default "
+"distribution, set:"
+msgstr ""
+"При получении нескольких файлов из GitHub иногда файл дистрибутива по "
+"умолчанию не загружается из GitHub. Чтобы отключить загрузку файла "
+"дистрибутива по умолчанию, установите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1695
+#, no-wrap
+msgid "USE_GITHUB=\tnodefault\n"
+msgstr "USE_GITHUB=\tnodefault\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1700
+msgid ""
+"When using `USE_GITHUB=nodefault`, the [.filename]#Makefile# must set "
+"`DISTFILES` in its crossref:porting-order[porting-order-portname,top block]. "
+"The definition should be:"
+msgstr ""
+"При использовании `USE_GITHUB=nodefault` в [.filename]#Makefile# необходимо "
+"указать `DISTFILES` в его crossref:porting-order[porting-order-"
+"portname,верхнем блоке]. Определение должно быть следующим:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1704
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2010
+#, no-wrap
+msgid "DISTFILES= ${DISTNAME}${EXTRACT_SUFX}\n"
+msgstr "DISTFILES= ${DISTNAME}${EXTRACT_SUFX}\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1709
+#, no-wrap
+msgid "Use of `USE_GITHUB` with Multiple Distribution Files"
+msgstr "Использование `USE_GITHUB` с несколькими файлами дистрибутива"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1715
+msgid ""
+"From time to time, there is a need to fetch more than one distribution "
+"file. For example, when the upstream git repository uses submodules. This "
+"can be done easily using groups in the `GH_*` variables:"
+msgstr ""
+"Время от времени возникает необходимость загрузить более одного файла "
+"дистрибутива. Например, когда вышестоящий репозиторий git использует "
+"подмодули. Это можно легко сделать с помощью групп в переменных `GH_*`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1720
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1766
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2026
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2072
+#, no-wrap
+msgid ""
+"PORTNAME=\tfoo\n"
+"DISTVERSION=\t1.0.2\n"
+msgstr ""
+"PORTNAME=\tfoo\n"
+"DISTVERSION=\t1.0.2\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1726
+#, no-wrap
+msgid ""
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tbar:icons,contrib\n"
+"GH_PROJECT=\tfoo-icons:icons foo-contrib:contrib\n"
+"GH_TAGNAME=\t1.0:icons fa579bc:contrib\n"
+"GH_SUBDIR=\text/icons:icons\n"
+msgstr ""
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tbar:icons,contrib\n"
+"GH_PROJECT=\tfoo-icons:icons foo-contrib:contrib\n"
+"GH_TAGNAME=\t1.0:icons fa579bc:contrib\n"
+"GH_SUBDIR=\text/icons:icons\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1728
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1772
+#, no-wrap
+msgid "CONFIGURE_ARGS=\t--with-contrib=${WRKSRC_contrib}\n"
+msgstr "CONFIGURE_ARGS=\t--with-contrib=${WRKSRC_contrib}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1735
+msgid ""
+"This will fetch three distribution files from github. The default one comes "
+"from [.filename]#foo/foo# and is version `1.0.2`. The second one, with the "
+"`icons` group, comes from [.filename]#bar/foo-icons# and is in version "
+"`1.0`. The third one comes from [.filename]#bar/foo-contrib# and uses the "
+"Git commit `fa579bc`. The distribution files are named [.filename]#foo-"
+"foo-1.0.2_GH0.tar.gz#, [.filename]#bar-foo-icons-1.0_GH0.tar.gz#, and "
+"[.filename]#bar-foo-contrib-fa579bc_GH0.tar.gz#."
+msgstr ""
+"Это загрузит три файла дистрибутива с github. Стандартный берется из "
+"[.filename]#foo/foo# и имеет версию `1.0.2`. Второй, с группой `icons`, "
+"берется из [.filename]#bar/foo-icons# и имеет версию `1.0`. Третий берется "
+"из [.filename]#bar/foo-contrib# и использует Git-коммит `fa579bc`. Файлы "
+"дистрибутива называются [.filename]#foo-foo-1.0.2_GH0.tar.gz#, "
+"[.filename]#bar-foo-icons-1.0_GH0.tar.gz# и [.filename]#bar-foo-contrib-"
+"fa579bc_GH0.tar.gz#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1741
+msgid ""
+"All the distribution files are extracted in `${WRKDIR}` in their respective "
+"subdirectories. The default file is still extracted in `${WRKSRC}`, in this "
+"case, [.filename]#${WRKDIR}/foo-1.0.2#. Each additional distribution file "
+"is extracted in `${WRKSRC_group}`. Here, for the `icons` group, it is "
+"called `${WRKSRC_icons}` and it contains [.filename]#${WRKDIR}/foo-"
+"icons-1.0#. The file with the `contrib` group is called `${WRKSRC_contrib}` "
+"and contains `${WRKDIR}/foo-contrib-fa579bc`."
+msgstr ""
+"Все файлы дистрибутива извлекаются в `${WRKDIR}` в соответствующих "
+"подкаталогах. Основной файл по-прежнему извлекается в `${WRKSRC}`, в данном "
+"случае, [.filename]#${WRKDIR}/foo-1.0.2#. Каждый дополнительный файл "
+"дистрибутива извлекается в `${WRKSRC_group}`. Здесь, для группы `icons`, он "
+"называется `${WRKSRC_icons}` и содержит [.filename]#${WRKDIR}/foo-"
+"icons-1.0#. Файл с группой `contrib` называется `${WRKSRC_contrib}` и "
+"содержит `${WRKDIR}/foo-contrib-fa579bc`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1745
+msgid ""
+"The software's build system expects to find the icons in a [.filename]#ext/"
+"icons# subdirectory in its sources, so `GH_SUBDIR` is used. `GH_SUBDIR` "
+"makes sure that [.filename]#ext# exists, but that [.filename]#ext/icons# "
+"does not already exist. Then it does this:"
+msgstr ""
+"Система сборки программы ожидает найти иконки в подкаталоге [.filename]#ext/"
+"icons# в её исходниках, поэтому используется `GH_SUBDIR`. `GH_SUBDIR` "
+"гарантирует, что [.filename]#ext# существует, но [.filename]#ext/icons# ещё "
+"не существует. Затем он выполняет следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1750
+#, no-wrap
+msgid ""
+"post-extract:\n"
+" @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons\n"
+msgstr ""
+"post-extract:\n"
+" @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1755
+#, no-wrap
+msgid "Use of `USE_GITHUB` with Multiple Distribution Files Using `GH_TUPLE`"
+msgstr "Использование `USE_GITHUB` с несколькими файлами дистрибутива с помощью `GH_TUPLE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1761
+msgid ""
+"This is functionally equivalent to crossref:makefiles[makefile-master_sites-"
+"github-multi,Use of `USE_GITHUB` with Multiple Distribution Files], but "
+"using `GH_TUPLE`:"
+msgstr ""
+"Это функционально эквивалентно crossref:makefiles[makefile-master_sites-"
+"github-multi,Использованию `USE_GITHUB` с несколькими файлами дистрибутива], "
+"но с использованием `GH_TUPLE`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1770
+#, no-wrap
+msgid ""
+"USE_GITHUB=\tyes\n"
+"GH_TUPLE=\tbar:foo-icons:1.0:icons/ext/icons \\\n"
+"\t\tbar:foo-contrib:fa579bc:contrib\n"
+msgstr ""
+"USE_GITHUB=\tyes\n"
+"GH_TUPLE=\tbar:foo-icons:1.0:icons/ext/icons \\\n"
+"\t\tbar:foo-contrib:fa579bc:contrib\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1776
+msgid ""
+"Grouping was used in the previous example with `bar:icons,contrib`. Some "
+"redundant information is present with `GH_TUPLE` because grouping is not "
+"possible."
+msgstr ""
+"В предыдущем примере использовалась группировка с `bar:icons,contrib`. В "
+"`GH_TUPLE` присутствует избыточная информация, так как группировка "
+"невозможна."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1779
+#, no-wrap
+msgid "How to Use `USE_GITHUB` with Git Submodules?"
+msgstr "Как использовать `USE_GITHUB` с подмодулями Git?"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1784
+msgid ""
+"Ports with GitHub as an upstream repository sometimes use submodules. See "
+"man:git-submodule[1] for more information."
+msgstr ""
+"Порты, использующие GitHub в качестве вышестоящего репозитория, иногда "
+"применяют подмодули. Подробнее см. man:git-submodule[1]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1787
+msgid ""
+"The problem with submodules is that each is a separate repository. As such, "
+"they each must be fetched separately."
+msgstr ""
+"Проблема с подмодулями заключается в том, что каждый из них является "
+"отдельным репозиторием. Таким образом, каждый из них должен быть загружен "
+"отдельно."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1792
+msgid ""
+"Using package:finance/moneymanagerex[] as an example, its GitHub repository "
+"is https://github.com/moneymanagerex/moneymanagerex/[]. It has a https://"
+"github.com/moneymanagerex/moneymanagerex/blob/"
+"master/.gitmodules[.gitmodules] file at the root. This file describes all "
+"the submodules used in this repository, and lists additional repositories "
+"needed. This file will tell what additional repositories are needed:"
+msgstr ""
+"В качестве примера используем пакет package:finance/moneymanagerex[], его "
+"репозиторий на GitHub находится по адресу https://github.com/moneymanagerex/"
+"moneymanagerex/[]. В корне репозитория есть файл https://github.com/"
+"moneymanagerex/moneymanagerex/blob/master/.gitmodules[.gitmodules]. Этот "
+"файл описывает все подмодули, используемые в данном репозитории, и "
+"перечисляет дополнительные необходимые репозитории. Этот файл покажет, какие "
+"дополнительные репозитории требуются:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1808
+#, no-wrap
+msgid ""
+"[submodule \"lib/wxsqlite3\"]\n"
+"\tpath = lib/wxsqlite3\n"
+"\turl = https://github.com/utelle/wxsqlite3.git\n"
+"[submodule \"3rd/mongoose\"]\n"
+"\tpath = 3rd/mongoose\n"
+"\turl = https://github.com/cesanta/mongoose.git\n"
+"[submodule \"3rd/LuaGlue\"]\n"
+"\tpath = 3rd/LuaGlue\n"
+"\turl = https://github.com/moneymanagerex/LuaGlue.git\n"
+"[submodule \"3rd/cgitemplate\"]\n"
+"\tpath = 3rd/cgitemplate\n"
+"\turl = https://github.com/moneymanagerex/html-template.git\n"
+"[...]\n"
+msgstr ""
+"[submodule \"lib/wxsqlite3\"]\n"
+"\tpath = lib/wxsqlite3\n"
+"\turl = https://github.com/utelle/wxsqlite3.git\n"
+"[submodule \"3rd/mongoose\"]\n"
+"\tpath = 3rd/mongoose\n"
+"\turl = https://github.com/cesanta/mongoose.git\n"
+"[submodule \"3rd/LuaGlue\"]\n"
+"\tpath = 3rd/LuaGlue\n"
+"\turl = https://github.com/moneymanagerex/LuaGlue.git\n"
+"[submodule \"3rd/cgitemplate\"]\n"
+"\tpath = 3rd/cgitemplate\n"
+"\turl = https://github.com/moneymanagerex/html-template.git\n"
+"[...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1812
+msgid ""
+"The only information missing from that file is the commit hash or tag to use "
+"as a version. This information is found after cloning the repository:"
+msgstr ""
+"Единственная информация, отсутствующая в этом файле, — это хэш коммита или "
+"тег, который следует использовать в качестве версии. Эта информация "
+"находится после клонирования репозитория:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1841
+#, no-wrap
+msgid ""
+"% git clone --recurse-submodules https://github.com/moneymanagerex/moneymanagerex.git\n"
+"Cloning into 'moneymanagerex'...\n"
+"remote: Counting objects: 32387, done.\n"
+"[...]\n"
+"Submodule '3rd/LuaGlue' (https://github.com/moneymanagerex/LuaGlue.git) registered for path '3rd/LuaGlue'\n"
+"Submodule '3rd/cgitemplate' (https://github.com/moneymanagerex/html-template.git) registered for path '3rd/cgitemplate'\n"
+"Submodule '3rd/mongoose' (https://github.com/cesanta/mongoose.git) registered for path '3rd/mongoose'\n"
+"Submodule 'lib/wxsqlite3' (https://github.com/utelle/wxsqlite3.git) registered for path 'lib/wxsqlite3'\n"
+"[...]\n"
+"Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/LuaGlue'...\n"
+"Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/cgitemplate'...\n"
+"Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/mongoose'...\n"
+"Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/lib/wxsqlite3'...\n"
+"[...]\n"
+"Submodule path '3rd/LuaGlue': checked out 'c51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b'\n"
+"Submodule path '3rd/cgitemplate': checked out 'cd434eeeb35904ebcd3d718ba29c281a649b192c'\n"
+"Submodule path '3rd/mongoose': checked out '2140e5992ab9a3a9a34ce9a281abf57f00f95cda'\n"
+"Submodule path 'lib/wxsqlite3': checked out 'fb66eb230d8aed21dec273b38c7c054dcb7d6b51'\n"
+"[...]\n"
+"% cd moneymanagerex\n"
+"% git submodule status\n"
+" c51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b 3rd/LuaGlue (heads/master)\n"
+" cd434eeeb35904ebcd3d718ba29c281a649b192c 3rd/cgitemplate (cd434ee)\n"
+" 2140e5992ab9a3a9a34ce9a281abf57f00f95cda 3rd/mongoose (6.2-138-g2140e59)\n"
+" fb66eb230d8aed21dec273b38c7c054dcb7d6b51 lib/wxsqlite3 (v3.4.0)\n"
+"[...]\n"
+msgstr ""
+"% git clone --recurse-submodules https://github.com/moneymanagerex/moneymanagerex.git\n"
+"Cloning into 'moneymanagerex'...\n"
+"remote: Counting objects: 32387, done.\n"
+"[...]\n"
+"Submodule '3rd/LuaGlue' (https://github.com/moneymanagerex/LuaGlue.git) registered for path '3rd/LuaGlue'\n"
+"Submodule '3rd/cgitemplate' (https://github.com/moneymanagerex/html-template.git) registered for path '3rd/cgitemplate'\n"
+"Submodule '3rd/mongoose' (https://github.com/cesanta/mongoose.git) registered for path '3rd/mongoose'\n"
+"Submodule 'lib/wxsqlite3' (https://github.com/utelle/wxsqlite3.git) registered for path 'lib/wxsqlite3'\n"
+"[...]\n"
+"Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/LuaGlue'...\n"
+"Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/cgitemplate'...\n"
+"Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/3rd/mongoose'...\n"
+"Cloning into '/home/mat/work/freebsd/ports/finance/moneymanagerex/moneymanagerex/lib/wxsqlite3'...\n"
+"[...]\n"
+"Submodule path '3rd/LuaGlue': checked out 'c51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b'\n"
+"Submodule path '3rd/cgitemplate': checked out 'cd434eeeb35904ebcd3d718ba29c281a649b192c'\n"
+"Submodule path '3rd/mongoose': checked out '2140e5992ab9a3a9a34ce9a281abf57f00f95cda'\n"
+"Submodule path 'lib/wxsqlite3': checked out 'fb66eb230d8aed21dec273b38c7c054dcb7d6b51'\n"
+"[...]\n"
+"% cd moneymanagerex\n"
+"% git submodule status\n"
+" c51d11a247ee4d1e9817dfa2a8da8d9e2f97ae3b 3rd/LuaGlue (heads/master)\n"
+" cd434eeeb35904ebcd3d718ba29c281a649b192c 3rd/cgitemplate (cd434ee)\n"
+" 2140e5992ab9a3a9a34ce9a281abf57f00f95cda 3rd/mongoose (6.2-138-g2140e59)\n"
+" fb66eb230d8aed21dec273b38c7c054dcb7d6b51 lib/wxsqlite3 (v3.4.0)\n"
+"[...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1845
+msgid ""
+"It can also be found on GitHub. Each subdirectory that is a submodule is "
+"shown as `_directory @ hash_`, for example, `mongoose @ 2140e59`."
+msgstr ""
+"Это также можно найти на GitHub. Каждый подкаталог, который является "
+"подмодулем, отображается как `_директория @ хэш_`, например, `mongoose @ "
+"2140e59`."
+
+#. type: delimited block * 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1851
+msgid ""
+"While getting the information from GitHub seems more straightforward, the "
+"information found using `git submodule status` will provide more meaningful "
+"information. For example, here, ``lib/wxsqlite3``'s commit hash `fb66eb2` "
+"correspond to `v3.4.0`. Both can be used interchangeably, but when a tag is "
+"available, use it."
+msgstr ""
+"Хотя получение информации из GitHub кажется более простым, данные, "
+"полученные с помощью `git submodule status`, будут более информативными. "
+"Например, здесь хеш коммита ``lib/wxsqlite3`` `fb66eb2` соответствует "
+"`v3.4.0`. Оба варианта можно использовать взаимозаменяемо, но если доступен "
+"тег, предпочтительнее использовать его."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1854
+msgid ""
+"Now that all the required information has been gathered, the "
+"[.filename]#Makefile# can be written (only GitHub-related lines are shown):"
+msgstr ""
+"Теперь, когда вся необходимая информация собрана, можно написать "
+"[.filename]#Makefile# (показаны только строки, связанные с GitHub):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1860
+#, no-wrap
+msgid ""
+"PORTNAME=\tmoneymanagerex\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION=\t1.3.0\n"
+msgstr ""
+"PORTNAME=\tmoneymanagerex\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION=\t1.3.0\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1867
+#, no-wrap
+msgid ""
+"USE_GITHUB=\tyes\n"
+"GH_TUPLE=\tutelle:wxsqlite3:v3.4.0:wxsqlite3/lib/wxsqlite3 \\\n"
+"\t\tmoneymanagerex:LuaGlue:c51d11a:lua_glue/3rd/LuaGlue \\\n"
+"\t\tmoneymanagerex:html-template:cd434ee:html_template/3rd/cgitemplate \\\n"
+"\t\tcesanta:mongoose:2140e59:mongoose/3rd/mongoose \\\n"
+"\t\t[...]\n"
+msgstr ""
+"USE_GITHUB=\tyes\n"
+"GH_TUPLE=\tutelle:wxsqlite3:v3.4.0:wxsqlite3/lib/wxsqlite3 \\\n"
+"\t\tmoneymanagerex:LuaGlue:c51d11a:lua_glue/3rd/LuaGlue \\\n"
+"\t\tmoneymanagerex:html-template:cd434ee:html_template/3rd/cgitemplate \\\n"
+"\t\tcesanta:mongoose:2140e59:mongoose/3rd/mongoose \\\n"
+"\t\t[...]\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1872
+#, no-wrap
+msgid "`USE_GITLAB`"
+msgstr "`USE_GITLAB`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1875
+msgid ""
+"Similar to GitHub, if the distribution file comes from https://gitlab.com/"
+"[gitlab.com] or is hosting the GitLab software, these variables are "
+"available for use and might need to be set."
+msgstr ""
+"Подобно GitHub, если файл дистрибутива поставляется с https://gitlab.com/"
+"[gitlab.com] или использует программное обеспечение GitLab, эти переменные "
+"доступны для использования и могут потребовать установки."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1877
+#, no-wrap
+msgid "`USE_GITLAB` Description"
+msgstr "Описание `USE_GITLAB`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1885
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4887
+#, no-wrap
+msgid "`GL_SITE`"
+msgstr "`GL_SITE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1886
+#, no-wrap
+msgid "Site name hosting the GitLab project"
+msgstr "Название сайта, на котором размещен проект GitLab"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1888
+#, no-wrap
+msgid "https://gitlab.com/"
+msgstr "https://gitlab.com/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1889
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4884
+#, no-wrap
+msgid "`GL_ACCOUNT`"
+msgstr "`GL_ACCOUNT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1890
+#, no-wrap
+msgid "Account name of the GitLab user hosting the project"
+msgstr "Имя учётной записи пользователя GitLab, размещающего проект"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1893
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4886
+#, no-wrap
+msgid "`GL_PROJECT`"
+msgstr "`GL_PROJECT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1894
+#, no-wrap
+msgid "Name of the project on GitLab"
+msgstr "Название проекта на GitLab"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1897
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4885
+#, no-wrap
+msgid "`GL_COMMIT`"
+msgstr "`GL_COMMIT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1898
+#, no-wrap
+msgid "The commit hash to download. Must be the full 160 bit, 40 character hex sha1 hash. This is a required variable for GitLab."
+msgstr "Хэш коммита для загрузки. Должен быть полным 160-битным, 40-символьным шестнадцатеричным хэшем sha1. Это обязательная переменная для GitLab."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1900
+#, no-wrap
+msgid "`(none)`"
+msgstr "`(нет)`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1901
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4888
+#, no-wrap
+msgid "`GL_SUBDIR`"
+msgstr "`GL_SUBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1904
+#, no-wrap
+msgid ""
+"When the software needs an additional distribution file to be extracted within\n"
+"`${WRKSRC}`, this variable can be used. See the examples in\n"
+"\tcrossref:makefiles[makefile-master_sites-gitlab-multiple, Fetching Multiple Files from GitLab] for more information."
+msgstr ""
+"Когда программному обеспечению требуется дополнительный файл дистрибутива для извлечения в\n"
+"`${WRKSRC}`, можно использовать эту переменную. Примеры можно найти в\n"
+"\tcrossref:makefiles[makefile-master_sites-gitlab-multiple, Загрузка нескольких файлов из GitLab] для получения дополнительной информации."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1907
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4889
+#, no-wrap
+msgid "`GL_TUPLE`"
+msgstr "`GL_TUPLE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1908
+#, no-wrap
+msgid "`GL_TUPLE` allows putting `GL_SITE`, `GL_ACCOUNT`, `GL_PROJECT`, `GL_COMMIT`, and `GL_SUBDIR` into a single variable. The format is _site_`:`_account_`:`_project_`:`_commit_`:`_group_`/`_subdir_. The _site_`:` and `/`_subdir_ part is optional. It is helpful when there are more than one GitLab project from which to fetch."
+msgstr "`GL_TUPLE` позволяет объединить `GL_SITE`, `GL_ACCOUNT`, `GL_PROJECT`, `GL_COMMIT` и `GL_SUBDIR` в одну переменную. Формат записи: _сайт_`:`_учётная запись_`:`_проект_`:`_коммит_`:`_группа_`/`_поддиректория_. Части _сайт_`:` и `/`_поддиректория_ являются необязательными. Это полезно, когда требуется загрузить данные из нескольких проектов GitLab."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1912
+#, no-wrap
+msgid "Simple Use of `USE_GITLAB`"
+msgstr "Простое использование `USE_GITLAB`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1916
+msgid ""
+"While trying to make a port for version `1.14` of libsignon-glib from the "
+"accounts-sso user on gitlab.com, at https://gitlab.com/accounts-sso/"
+"libsignon-glib/[], The [.filename]#Makefile# would end up looking like this "
+"for fetching the distribution files:"
+msgstr ""
+"Пытаясь создать порт для версии `1.14` библиотеки libsignon-glib от "
+"пользователя accounts-sso на gitlab.com, по адресу https://gitlab.com/"
+"accounts-sso/libsignon-glib/[], файл [.filename]#Makefile# будет выглядеть "
+"следующим образом для загрузки дистрибутивных файлов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1921
+#, no-wrap
+msgid ""
+"PORTNAME=\tlibsignon-glib\n"
+"DISTVERSION=\t1.14\n"
+msgstr ""
+"PORTNAME=\tlibsignon-glib\n"
+"DISTVERSION=\t1.14\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1925
+#, no-wrap
+msgid ""
+"USE_GITLAB=\tyes\n"
+"GL_ACCOUNT=\taccounts-sso\n"
+"GL_COMMIT=\te90302e342bfd27bc8c9132ab9d0ea3d8723fd03\n"
+msgstr ""
+"USE_GITLAB=\tyes\n"
+"GL_ACCOUNT=\taccounts-sso\n"
+"GL_COMMIT=\te90302e342bfd27bc8c9132ab9d0ea3d8723fd03\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1928
+msgid ""
+"It will automatically have `MASTER_SITES` set to https://gitlab.com/"
+"[gitlab.com] and `WRKSRC` to `${WRKDIR}/libsignon-glib-"
+"e90302e342bfd27bc8c9132ab9d0ea3d8723fd03-"
+"e90302e342bfd27bc8c9132ab9d0ea3d8723fd03`."
+msgstr ""
+"Он автоматически получит `MASTER_SITES`, установленный на https://gitlab.com/"
+"[gitlab.com], и `WRKSRC` на `${WRKDIR}/libsignon-glib-"
+"e90302e342bfd27bc8c9132ab9d0ea3d8723fd03-"
+"e90302e342bfd27bc8c9132ab9d0ea3d8723fd03`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1931
+#, no-wrap
+msgid "More Complete Use of `USE_GITLAB`"
+msgstr "Более полное использование `USE_GITLAB`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1936
+msgid ""
+"A more complete use of the above if port had no versioning and foobar from "
+"the foo user on project bar on a self hosted GitLab site `https://"
+"gitlab.example.com/`, the [.filename]#Makefile# ends up looking like this "
+"for fetching distribution files:"
+msgstr ""
+"Более полный пример использования вышеописанного, если порт не имеет "
+"версионирования и foobar принадлежит пользователю foo в проекте bar на "
+"самостоятельно размещенном сайте GitLab `https://gitlab.example.com/`, тогда "
+"[.filename]#Makefile# будет выглядеть следующим образом для загрузки "
+"дистрибутивных файлов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1941
+#, no-wrap
+msgid ""
+"PORTNAME=\tfoobar\n"
+"DISTVERSION=\tg20170906\n"
+msgstr ""
+"PORTNAME=\tfoobar\n"
+"DISTVERSION=\tg20170906\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1947
+#, no-wrap
+msgid ""
+"USE_GITLAB=\tyes\n"
+"GL_SITE=\thttps://gitlab.example.com\n"
+"GL_ACCOUNT=\tfoo\n"
+"GL_PROJECT=\tbar\n"
+"GL_COMMIT=\t9c1669ce60c3f4f5eb43df874d7314483fb3f8a6\n"
+msgstr ""
+"USE_GITLAB=\tyes\n"
+"GL_SITE=\thttps://gitlab.example.com\n"
+"GL_ACCOUNT=\tfoo\n"
+"GL_PROJECT=\tbar\n"
+"GL_COMMIT=\t9c1669ce60c3f4f5eb43df874d7314483fb3f8a6\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1950
+msgid ""
+"It will have `MASTER_SITES` set to `\"https://gitlab.example.com\"` and "
+"`WRKSRC` to `${WRKDIR}/"
+"bar-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6`."
+msgstr ""
+"В нем будет установлено `MASTER_SITES` в `\"https://gitlab.example.com\"` и "
+"`WRKSRC` в `${WRKDIR}/"
+"bar-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6-9c1669ce60c3f4f5eb43df874d7314483fb3f8a6`."
+
+#. type: delimited block = 6
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1954
+msgid ""
+"`20170906` is the date of the commit referenced in `GL_COMMIT`, not the date "
+"the [.filename]#Makefile# is edited, or the date the commit to the FreeBSD "
+"ports tree is made."
+msgstr ""
+"`20170906` — это дата коммита, указанного в `GL_COMMIT`, а не дата "
+"редактирования файла [.filename]#Makefile# или дата коммита в дерево портов "
+"FreeBSD."
+
+#. type: delimited block = 6
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1959
+msgid ""
+"``GL_SITE``'s protocol, port and webroot can all be modified in the same "
+"variable."
+msgstr ""
+"Протокол, порт и корневая директория веб-сервера ``GL_SITE`` могут быть "
+"изменены в той же переменной."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1964
+#, no-wrap
+msgid "Fetching Multiple Files from GitLab"
+msgstr "Извлечение нескольких файлов из GitLab"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1969
+msgid ""
+"The `USE_GITLAB` framework also supports fetching multiple distribution "
+"files from different places from GitLab and GitLab hosted sites. It works "
+"in a way very similar to crossref:makefiles[porting-master-sites-n, Multiple "
+"Distribution or Patches Files from Multiple Locations] and "
+"crossref:makefiles[makefile-master_sites-gitlab-multiple, Fetching Multiple "
+"Files from GitLab]."
+msgstr ""
+"Фреймворк `USE_GITLAB` также поддерживает загрузку нескольких файлов "
+"дистрибутивов из различных мест GitLab и сайтов, размещённых на GitLab. Он "
+"работает очень похоже на crossref:makefiles[porting-master-sites-n, "
+"Несколько файлов дистрибутивов или патчей из разных местоположений] и "
+"crossref:makefiles[makefile-master_sites-gitlab-multiple, Загрузка "
+"нескольких файлов из GitLab]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1973
+msgid ""
+"Multiple values are added to `GL_SITE`, `GL_ACCOUNT`, `GL_PROJECT` and "
+"`GL_COMMIT`. Each different value is assigned a group. "
+"crossref:makefiles[makefile-master_sites-gitlab-description,`USE_GITLAB` "
+"Description]."
+msgstr ""
+"В `GL_SITE`, `GL_ACCOUNT`, `GL_PROJECT` и `GL_COMMIT` добавляются "
+"множественные значения. Каждое уникальное значение назначается группе. "
+"crossref:makefiles[makefile-master_sites-gitlab-description,Описание "
+"`USE_GITLAB`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1976
+msgid ""
+"`GL_TUPLE` can also be used when there are a lot of distribution files. It "
+"helps keep the site, account, project, commit, and group information at the "
+"same place."
+msgstr ""
+"`GL_TUPLE` также может использоваться, когда имеется множество файлов "
+"дистрибутива. Это помогает хранить информацию о сайте, учётной записи, "
+"проекте, коммите и группе в одном месте."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1995
+msgid ""
+"When fetching multiple files using GitLab, sometimes the default "
+"distribution file is not fetched from a GitLab site. To disable fetching "
+"the default distribution, set:"
+msgstr ""
+"При получении нескольких файлов с использованием GitLab иногда файл "
+"дистрибутива по умолчанию не загружается с сайта GitLab. Чтобы отключить "
+"загрузку файла дистрибутива по умолчанию, установите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:1999
+#, no-wrap
+msgid "USE_GITLAB=\tnodefault\n"
+msgstr "USE_GITLAB=\tnodefault\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2006
+msgid ""
+"When using `USE_GITLAB=nodefault`, the [.filename]#Makefile# must set "
+"`DISTFILES` in its crossref:makefiles[porting-order-portname,top block]. "
+"The definition should be:"
+msgstr ""
+"При использовании `USE_GITLAB=nodefault`, [.filename]#Makefile# должен "
+"устанавливать `DISTFILES` в своем crossref:makefiles[porting-order-"
+"portname,верхнем блоке]. Определение должно быть следующим:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2015
+#, no-wrap
+msgid "Use of `USE_GITLAB` with Multiple Distribution Files"
+msgstr "Использование `USE_GITLAB` с несколькими файлами дистрибутива"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2021
+msgid ""
+"From time to time, there is a need to fetch more than one distribution "
+"file. For example, when the upstream git repository uses submodules. This "
+"can be done easily using groups in the `GL_*` variables:"
+msgstr ""
+"Время от времени возникает необходимость загрузить более одного файла "
+"дистрибутива. Например, когда вышестоящий git-репозиторий использует "
+"подмодули. Это можно легко сделать с помощью групп в переменных `GL_*`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2033
+#, no-wrap
+msgid ""
+"USE_GITLAB=\tyes\n"
+"GL_SITE=\thttps://gitlab.example.com:9434/gitlab:icons\n"
+"GL_ACCOUNT=\tbar:icons,contrib\n"
+"GL_PROJECT=\tfoo-icons:icons foo-contrib:contrib\n"
+"GL_COMMIT=\tc189207a55da45305c884fe2b50e086fcad4724b ae7368cab1ca7ca754b38d49da064df87968ffe4:icons 9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib\n"
+"GL_SUBDIR=\text/icons:icons\n"
+msgstr ""
+"USE_GITLAB=\tyes\n"
+"GL_SITE=\thttps://gitlab.example.com:9434/gitlab:icons\n"
+"GL_ACCOUNT=\tbar:icons,contrib\n"
+"GL_PROJECT=\tfoo-icons:icons foo-contrib:contrib\n"
+"GL_COMMIT=\tc189207a55da45305c884fe2b50e086fcad4724b ae7368cab1ca7ca754b38d49da064df87968ffe4:icons 9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib\n"
+"GL_SUBDIR=\text/icons:icons\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2035
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2079
+#, no-wrap
+msgid "CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}\n"
+msgstr "CONFIGURE_ARGS= --with-contrib=${WRKSRC_contrib}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2042
+msgid ""
+"This will fetch two distribution files from gitlab.com and one from "
+"`gitlab.example.com` hosting GitLab. The default one comes from "
+"[.filename]#https://gitlab.com/foo/foo# and commit is "
+"`c189207a55da45305c884fe2b50e086fcad4724b`. The second one, with the "
+"`icons` group, comes from [.filename]#https://gitlab.example.com:9434/gitlab/"
+"bar/foo-icons# and commit is `ae7368cab1ca7ca754b38d49da064df87968ffe4`. "
+"The third one comes from [.filename]#https://gitlab.com/bar/foo-contrib# and "
+"is commit `9e4dd76ad9b38f33fdb417a4c01935958d5acd2a`. The distribution "
+"files are named [.filename]#foo-foo-"
+"c189207a55da45305c884fe2b50e086fcad4724b_GL0.tar.gz#, [.filename]#bar-foo-"
+"icons-ae7368cab1ca7ca754b38d49da064df87968ffe4_GL0.tar.gz#, and "
+"[.filename]#bar-foo-"
+"contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a_GL0.tar.gz#."
+msgstr ""
+"Это загрузит два файла дистрибутива с gitlab.com и один с "
+"`gitlab.example.com`, где размещается GitLab. По умолчанию файл берется из "
+"[.filename]#https://gitlab.com/foo/foo#, а коммит — "
+"`c189207a55da45305c884fe2b50e086fcad4724b`. Второй файл, из группы `icons`, "
+"берется из [.filename]#https://gitlab.example.com:9434/gitlab/bar/foo-"
+"icons#, а коммит — `ae7368cab1ca7ca754b38d49da064df87968ffe4`. Третий файл "
+"берется из [.filename]#https://gitlab.com/bar/foo-contrib#, а коммит — "
+"`9e4dd76ad9b38f33fdb417a4c01935958d5acd2a`. Файлы дистрибутива называются "
+"[.filename]#foo-foo-c189207a55da45305c884fe2b50e086fcad4724b_GL0.tar.gz#, "
+"[.filename]#bar-foo-icons-"
+"ae7368cab1ca7ca754b38d49da064df87968ffe4_GL0.tar.gz# и [.filename]#bar-foo-"
+"contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a_GL0.tar.gz#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2048
+msgid ""
+"All the distribution files are extracted in `${WRKDIR}` in their respective "
+"subdirectories. The default file is still extracted in `${WRKSRC}`, in this "
+"case, [.filename]#${WRKDIR}/foo-c189207a55da45305c884fe2b50e086fcad4724b-"
+"c189207a55da45305c884fe2b50e086fcad4724b#. Each additional distribution "
+"file is extracted in `${WRKSRC_group}`. Here, for the `icons` group, it is "
+"called `${WRKSRC_icons}` and it contains [.filename]#${WRKDIR}/foo-icons-"
+"ae7368cab1ca7ca754b38d49da064df87968ffe4-"
+"ae7368cab1ca7ca754b38d49da064df87968ffe4#. The file with the `contrib` "
+"group is called `${WRKSRC_contrib}` and contains `${WRKDIR}/foo-"
+"contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a`."
+msgstr ""
+"Все файлы дистрибутива извлекаются в `${WRKDIR}` в соответствующих "
+"подкаталогах. Основной файл по-прежнему извлекается в `${WRKSRC}`, в данном "
+"случае это [.filename]#${WRKDIR}/foo-"
+"c189207a55da45305c884fe2b50e086fcad4724b-"
+"c189207a55da45305c884fe2b50e086fcad4724b#. Каждый дополнительный файл "
+"дистрибутива извлекается в `${WRKSRC_group}`. Здесь для группы `icons` он "
+"называется `${WRKSRC_icons}` и содержит [.filename]#${WRKDIR}/foo-icons-"
+"ae7368cab1ca7ca754b38d49da064df87968ffe4-"
+"ae7368cab1ca7ca754b38d49da064df87968ffe4#. Файл группы `contrib` называется "
+"`${WRKSRC_contrib}` и содержит `${WRKDIR}/foo-"
+"contrib-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a-9e4dd76ad9b38f33fdb417a4c01935958d5acd2a`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2052
+msgid ""
+"The software's build system expects to find the icons in a [.filename]#ext/"
+"icons# subdirectory in its sources, so `GL_SUBDIR` is used. `GL_SUBDIR` "
+"makes sure that [.filename]#ext# exists, but that [.filename]#ext/icons# "
+"does not already exist. Then it does this:"
+msgstr ""
+"Система сборки программного обеспечения ожидает найти иконки в подкаталоге "
+"[.filename]#ext/icons# в своих исходниках, поэтому используется `GL_SUBDIR`. "
+"`GL_SUBDIR` гарантирует, что [.filename]#ext# существует, но [.filename]#ext/"
+"icons# ещё не существует. Затем она выполняет следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2057
+#, no-wrap
+msgid ""
+"post-extract:\n"
+" @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons\n"
+msgstr ""
+"post-extract:\n"
+" @${MV} ${WRKSRC_icons} ${WRKSRC}/ext/icons\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2062
+#, no-wrap
+msgid "Use of `USE_GITLAB` with Multiple Distribution Files Using `GL_TUPLE`"
+msgstr "Использование `USE_GITLAB` с несколькими файлами дистрибуции с помощью `GL_TUPLE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2067
+msgid ""
+"This is functionally equivalent to crossref:makefiles[makefile-master_sites-"
+"gitlab-multi,Use of `USE_GITLAB` with Multiple Distribution Files], but "
+"using `GL_TUPLE`:"
+msgstr ""
+"Это функционально эквивалентно crossref:makefiles[makefile-master_sites-"
+"gitlab-multi,Использование `USE_GITLAB` с несколькими файлами дистрибуции], "
+"но с использованием `GL_TUPLE`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2077
+#, no-wrap
+msgid ""
+"USE_GITLAB=\tyes\n"
+"GL_COMMIT=\tc189207a55da45305c884fe2b50e086fcad4724b\n"
+"GL_TUPLE=\thttps://gitlab.example.com:9434/gitlab:bar:foo-icons:ae7368cab1ca7ca754b38d49da064df87968ffe4:icons/ext/icons \\\n"
+"\t\tbar:foo-contrib:9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib\n"
+msgstr ""
+"USE_GITLAB=\tyes\n"
+"GL_COMMIT=\tc189207a55da45305c884fe2b50e086fcad4724b\n"
+"GL_TUPLE=\thttps://gitlab.example.com:9434/gitlab:bar:foo-icons:ae7368cab1ca7ca754b38d49da064df87968ffe4:icons/ext/icons \\\n"
+"\t\tbar:foo-contrib:9e4dd76ad9b38f33fdb417a4c01935958d5acd2a:contrib\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2083
+msgid ""
+"Grouping was used in the previous example with `bar:icons,contrib`. Some "
+"redundant information is present with `GL_TUPLE` because grouping is not "
+"possible."
+msgstr ""
+"В предыдущем примере использовалась группировка с `bar:icons,contrib`. "
+"Некоторую избыточную информацию приходится указывать с `GL_TUPLE`, так как "
+"группировка невозможна."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2086
+#, no-wrap
+msgid "`EXTRACT_SUFX`"
+msgstr "`EXTRACT_SUFX`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2089
+msgid ""
+"If there is one distribution file, and it uses an odd suffix to indicate the "
+"compression mechanism, set `EXTRACT_SUFX`."
+msgstr ""
+"Если имеется один файл дистрибутива, и он использует нестандартное суффикс "
+"для указания механизма сжатия, установите `EXTRACT_SUFX`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2091
+msgid ""
+"For example, if the distribution file was named [.filename]#foo.tar.gzip# "
+"instead of the more normal [.filename]#foo.tar.gz#, write:"
+msgstr ""
+"Например, если файл дистрибутива был назван [.filename]#foo.tar.gzip# вместо "
+"более привычного [.filename]#foo.tar.gz#, напишите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2096
+#, no-wrap
+msgid ""
+"DISTNAME=\tfoo\n"
+"EXTRACT_SUFX=\t.tar.gzip\n"
+msgstr ""
+"DISTNAME=\tfoo\n"
+"EXTRACT_SUFX=\t.tar.gzip\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2100
+msgid ""
+"The `USES=tar[:__xxx__]`, `USES=lha` or `USES=zip` automatically set "
+"`EXTRACT_SUFX` to the most common archives extensions as necessary, see "
+"crossref:uses[uses,Using `USES` Macros] for more details. If neither of "
+"these are set then `EXTRACT_SUFX` defaults to `.tar.gz`."
+msgstr ""
+"`USES=tar[:__xxx__]`, `USES=lha` или `USES=zip` автоматически устанавливают "
+"`EXTRACT_SUFX` в наиболее распространённые расширения архивов при "
+"необходимости, подробнее см. crossref:uses[uses,Использование макросов "
+"`USES`]. Если ни один из них не задан, `EXTRACT_SUFX` по умолчанию принимает "
+"значение `.tar.gz`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2104
+msgid "As `EXTRACT_SUFX` is only used in `DISTFILES`, only set one of them.."
+msgstr ""
+"Как `EXTRACT_SUFX` используется только в `DISTFILES`, следует задавать "
+"только один из них."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2107
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4876
+#, no-wrap
+msgid "`DISTFILES`"
+msgstr "`DISTFILES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2112
+msgid ""
+"Sometimes the names of the files to be downloaded have no resemblance to the "
+"name of the port. For example, it might be called "
+"[.filename]#source.tar.gz# or similar. In other cases the application's "
+"source code might be in several different archives, all of which must be "
+"downloaded."
+msgstr ""
+"Иногда названия файлов для загрузки не имеют ничего общего с именем порта. "
+"Например, файл может называться [.filename]#source.tar.gz# или подобным "
+"образом. В других случаях исходный код приложения может быть разбит на "
+"несколько различных архивов, все из которых необходимо загрузить."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2114
+msgid ""
+"If this is the case, set `DISTFILES` to be a space separated list of all the "
+"files that must be downloaded."
+msgstr ""
+"Если это так, установите `DISTFILES` как список разделённых пробелами "
+"файлов, которые необходимо загрузить."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2118
+#, no-wrap
+msgid "DISTFILES=\tsource1.tar.gz source2.tar.gz\n"
+msgstr "DISTFILES=\tsource1.tar.gz source2.tar.gz\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2121
+msgid ""
+"If not explicitly set, `DISTFILES` defaults to `${DISTNAME}${EXTRACT_SUFX}`."
+msgstr ""
+"Если явно не задано, `DISTFILES` по умолчанию равно `${DISTNAME}$"
+"{EXTRACT_SUFX}`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2123
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4877
+#, no-wrap
+msgid "`EXTRACT_ONLY`"
+msgstr "`EXTRACT_ONLY`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2126
+msgid ""
+"If only some of the `DISTFILES` must be extracted-for example, one of them "
+"is the source code, while another is an uncompressed document-list the "
+"filenames that must be extracted in `EXTRACT_ONLY`."
+msgstr ""
+"Если необходимо извлечь только некоторые из `DISTFILES` — например, один из "
+"них является исходным кодом, а другой — несжатым документом — укажите имена "
+"файлов, которые нужно извлечь, в `EXTRACT_ONLY`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2131
+#, no-wrap
+msgid ""
+"DISTFILES=\tsource.tar.gz manual.html\n"
+"EXTRACT_ONLY=\tsource.tar.gz\n"
+msgstr ""
+"DISTFILES=\tsource.tar.gz manual.html\n"
+"EXTRACT_ONLY=\tsource.tar.gz\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2134
+msgid ""
+"When none of the `DISTFILES` need to be uncompressed, set `EXTRACT_ONLY` to "
+"the empty string."
+msgstr ""
+"Если ни один из `DISTFILES` не требует распаковки, установите `EXTRACT_ONLY` "
+"в пустую строку."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2138
+#, no-wrap
+msgid "EXTRACT_ONLY=\n"
+msgstr "EXTRACT_ONLY=\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2141
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4898
+#, no-wrap
+msgid "`PATCHFILES`"
+msgstr "`PATCHFILES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2144
+msgid ""
+"If the port requires some additional patches that are available by FTP or "
+"HTTP, set `PATCHFILES` to the names of the files and `PATCH_SITES` to the "
+"URL of the directory that contains them (the format is the same as "
+"`MASTER_SITES`)."
+msgstr ""
+"Если порт требует дополнительных исправлений, доступных через FTP или HTTP, "
+"установите `PATCHFILES` в имена файлов, а `PATCH_SITES` — в URL каталога, "
+"содержащего их (формат такой же, как у `MASTER_SITES`)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2147
+msgid ""
+"If the patch is not relative to the top of the source tree (that is, "
+"`WRKSRC`) because it contains some extra pathnames, set `PATCH_DIST_STRIP` "
+"accordingly. For instance, if all the pathnames in the patch have an extra "
+"`foozolix-1.0/` in front of the filenames, then set `PATCH_DIST_STRIP=-p1`."
+msgstr ""
+"Если патч не относится к корню исходного дерева (то есть к `WRKSRC`), потому "
+"что содержит дополнительные пути, установите `PATCH_DIST_STRIP` "
+"соответствующим образом. Например, если все пути в патче имеют "
+"дополнительный префикс `foozolix-1.0/` перед именами файлов, задайте "
+"`PATCH_DIST_STRIP=-p1`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2149
+msgid ""
+"Do not worry if the patches are compressed; they will be decompressed "
+"automatically if the filenames end with [.filename]#.Z#, [.filename]#.gz#, "
+"[.filename]#.bz2# or [.filename]#.xz#."
+msgstr ""
+"Не беспокойтесь, если патчи сжаты; они будут автоматически распакованы, если "
+"их имена заканчиваются на [.filename]#.Z#, [.filename]#.gz#, "
+"[.filename]#.bz2# или [.filename]#.xz#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2155
+msgid ""
+"If the patch is distributed with some other files, such as documentation, in "
+"a compressed tarball, using `PATCHFILES` is not possible. If that is the "
+"case, add the name and the location of the patch tarball to `DISTFILES` and "
+"`MASTER_SITES`. Then, use `EXTRA_PATCHES` to point to those files and "
+"[.filename]#bsd.port.mk# will automatically apply them. In particular, do "
+"_not_ copy patch files into [.filename]#${PATCHDIR}#. That directory may "
+"not be writable."
+msgstr ""
+"Если патч распространяется вместе с другими файлами, такими как "
+"документация, в сжатом tarball, использование `PATCHFILES` невозможно. В "
+"таком случае добавьте имя и расположение tarball с патчами в `DISTFILES` и "
+"`MASTER_SITES`. Затем используйте `EXTRA_PATCHES`, чтобы указать на эти "
+"файлы, и [.filename]#bsd.port.mk# автоматически применит их. В частности, "
+"_не_ копируйте файлы патчей в [.filename]#${PATCHDIR}#. Этот каталог может "
+"быть недоступен для записи."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2159
+msgid ""
+"If there are multiple patches and they need mixed values for the strip "
+"parameter, it can be added alongside the patch name in `PATCHFILES`, e.g:"
+msgstr ""
+"Если есть несколько патчей и для них требуются разные значения параметра "
+"strip, его можно добавить рядом с именем патча в `PATCHFILES`, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2163
+#, no-wrap
+msgid "PATCHFILES=\tpatch1 patch2:-p1\n"
+msgstr "PATCHFILES=\tpatch1 patch2:-p1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2166
+msgid ""
+"This does not conflict with crossref:makefiles[porting-master-sites-n,the "
+"master site grouping feature], adding a group also works:"
+msgstr ""
+"Это не конфликтует с crossref:makefiles[porting-master-sites-n,функцией "
+"группировки мастер-сайтов], добавление группы также работает:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2170
+#, no-wrap
+msgid "PATCHFILES=\tpatch2:-p1:source2\n"
+msgstr "PATCHFILES=\tpatch2:-p1:source2\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2178
+msgid ""
+"The tarball will have been extracted alongside the regular source by then, "
+"so there is no need to explicitly extract it if it is a regular compressed "
+"tarball. Take extra care not to overwrite something that already exists in "
+"that directory if extracting it manually. Also, do not forget to add a "
+"command to remove the copied patch in the `pre-clean` target."
+msgstr ""
+"Tarball уже будет распакован вместе с обычными исходными кодами, поэтому нет "
+"необходимости явно его распаковывать, если это обычный сжатый tarball. "
+"Будьте особенно осторожны, чтобы не перезаписать существующие файлы в этом "
+"каталоге при ручной распаковке. Также не забудьте добавить команду для "
+"удаления скопированного патча в цель `pre-clean`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2181
+#, no-wrap
+msgid "Multiple Distribution or Patches Files from Multiple Locations"
+msgstr "Несколько файлов дистрибутивов или исправлений из нескольких местоположений"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2184
+msgid ""
+"(Consider this to be a somewhat \"advanced topic\"; those new to this "
+"document may wish to skip this section at first)."
+msgstr ""
+"(Считайте, что это несколько «продвинутая тема»; тем, кто впервые читает "
+"этот документ, возможно, стоит сначала пропустить этот раздел)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2187
+msgid ""
+"This section has information on the fetching mechanism known as both "
+"`MASTER_SITES:n` and `MASTER_SITES_NN`. We will refer to this mechanism as "
+"`MASTER_SITES:n`."
+msgstr ""
+"Этот раздел содержит информацию о механизме загрузки, известном как "
+"`MASTER_SITES:n` и `MASTER_SITES_NN`. Мы будем называть этот механизм "
+"`MASTER_SITES:n`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2192
+msgid ""
+"A little background first. OpenBSD has a neat feature inside `DISTFILES` "
+"and `PATCHFILES` which allows files and patches to be postfixed with `:n` "
+"identifiers. Here, `n` can be any word containing `[0-9a-zA-Z_]` and denote "
+"a group designation. For example:"
+msgstr ""
+"Небольшая предыстория. В OpenBSD есть удобная функция внутри `DISTFILES` и "
+"`PATCHFILES`, которая позволяет добавлять постфикс `:n` к файлам и патчам. "
+"Здесь `n` может быть любым словом, содержащим `[0-9a-zA-Z_]`, и обозначать "
+"группу. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2196
+#, no-wrap
+msgid "DISTFILES=\talpha:0 beta:1\n"
+msgstr "DISTFILES=\talpha:0 beta:1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2199
+msgid ""
+"In OpenBSD, distribution file [.filename]#alpha# will be associated with "
+"variable `MASTER_SITES0` instead of our common `MASTER_SITES` and "
+"[.filename]#beta# with `MASTER_SITES1`."
+msgstr ""
+"В OpenBSD файл дистрибутива [.filename]#alpha# будет связан с переменной "
+"`MASTER_SITES0`, а не с нашей общей `MASTER_SITES`, а [.filename]#beta# — с "
+"`MASTER_SITES1`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2201
+msgid ""
+"This is a very interesting feature which can decrease that endless search "
+"for the correct download site."
+msgstr ""
+"Это очень интересная функция, которая может сократить бесконечные поиски "
+"нужного сайта для загрузки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2204
+msgid ""
+"Just picture 2 files in `DISTFILES` and 20 sites in `MASTER_SITES`, the "
+"sites slow as hell where [.filename]#beta# is carried by all sites in "
+"`MASTER_SITES`, and [.filename]#alpha# can only be found in the 20th site. "
+"It would be such a waste to check all of them if the maintainer knew this "
+"beforehand, would it not? Not a good start for that lovely weekend!"
+msgstr ""
+"Представьте 2 файла в `DISTFILES` и 20 сайтов в `MASTER_SITES`, причём сайты "
+"медленные как черепаха, где [.filename]#beta# есть на всех сайтах из "
+"`MASTER_SITES`, а [.filename]#alpha# можно найти только на 20-м сайте. Было "
+"бы так обидно проверять их все, если бы сопровождающий знал это заранее, не "
+"так ли? Не самое лучшее начало для чудесных выходных!"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2207
+msgid ""
+"Now that you have the idea, just imagine more `DISTFILES` and more "
+"`MASTER_SITES`. Surely our \"distfiles survey meister\" would appreciate "
+"the relief to network strain that this would bring."
+msgstr ""
+"Теперь, когда вы поняли идею, представьте больше `DISTFILES` и больше "
+"`MASTER_SITES`. Безусловно, наш \"мастер по исследованию distfiles\" оценил "
+"бы снижение нагрузки на сеть, которое это принесло бы."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2210
+msgid ""
+"In the next sections, information will follow on the FreeBSD implementation "
+"of this idea. We improved a bit on OpenBSD's concept."
+msgstr ""
+"В следующих разделах будет приведена информация о реализации этой идеи в "
+"FreeBSD. Мы немного улучшили концепцию OpenBSD."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2215
+msgid ""
+"The group names cannot have dashes in them (`-`), in fact, they cannot have "
+"any characters out of the `[a-zA-Z0-9_]` range. This is because, while "
+"man:make[1] is ok with variable names containing dashes, man:sh[1] is not."
+msgstr ""
+"Имена групп не могут содержать дефисы (`-`), более того, они не могут "
+"содержать любые символы вне диапазона `[a-zA-Z0-9_]`. Это связано с тем, "
+"что, хотя man:make[1] допускает использование имён переменных с дефисами, "
+"man:sh[1] — нет."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2218
+#, no-wrap
+msgid "Simplified Information"
+msgstr "Упрощенная информация"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2225
+msgid ""
+"This section explains how to quickly prepare fine grained fetching of "
+"multiple distribution files and patches from different sites and "
+"subdirectories. We describe here a case of simplified `MASTER_SITES:n` "
+"usage. This will be sufficient for most scenarios. More detailed "
+"information are available in crossref:makefiles[ports-master-sites-n-"
+"detailed, Detailed Information]."
+msgstr ""
+"В этом разделе объясняется, как быстро настроить детализированное получение "
+"нескольких файлов дистрибутивов и патчей с разных сайтов и подкаталогов. "
+"Здесь описывается случай упрощённого использования `MASTER_SITES:n`. Этого "
+"будет достаточно для большинства сценариев. Более подробная информация "
+"доступна в crossref:makefiles[ports-master-sites-n-detailed, Подробная "
+"Информация]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2229
+msgid ""
+"Some applications consist of multiple distribution files that must be "
+"downloaded from a number of different sites. For example, Ghostscript "
+"consists of the core of the program, and then a large number of driver files "
+"that are used depending on the user's printer. Some of these driver files "
+"are supplied with the core, but many others must be downloaded from a "
+"variety of different sites."
+msgstr ""
+"Некоторые приложения состоят из нескольких распространяемых файлов, которые "
+"необходимо загрузить с различных сайтов. Например, Ghostscript включает "
+"основную часть программы и множество драйверов, используемых в зависимости "
+"от принтера пользователя. Некоторые из этих драйверов поставляются вместе с "
+"основной частью, но многие другие необходимо загружать с различных сайтов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2232
+msgid ""
+"To support this, each entry in `DISTFILES` may be followed by a colon and a "
+"\"group name\". Each site listed in `MASTER_SITES` is then followed by a "
+"colon, and the group that indicates which distribution files are downloaded "
+"from this site."
+msgstr ""
+"Для поддержки этого, каждая запись в `DISTFILES` может сопровождаться "
+"двоеточием и \"именем группы\". Затем каждый сайт, указанный в "
+"`MASTER_SITES`, сопровождается двоеточием и группой, которая указывает, "
+"какие файлы дистрибутива загружаются с данного сайта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2236
+msgid ""
+"For example, consider an application with the source split in two parts, "
+"[.filename]#source1.tar.gz# and [.filename]#source2.tar.gz#, which must be "
+"downloaded from two different sites. The port's [.filename]#Makefile# would "
+"include lines like crossref:makefiles[ports-master-sites-n-example-simple-"
+"use-one-file-per-site,Simplified Use of `MASTER_SITES:n` with One File Per "
+"Site]."
+msgstr ""
+"Например, рассмотрим приложение, исходный код которого разделён на две "
+"части: [.filename]#source1.tar.gz# и [.filename]#source2.tar.gz#, которые "
+"необходимо загрузить с двух разных сайтов. В [.filename]#Makefile# порта "
+"будут присутствовать строки, подобные crossref:makefiles[ports-master-sites-"
+"n-example-simple-use-one-file-per-site,Упрощённое использование "
+"`MASTER_SITES:n` с одним файлом на сайт]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2238
+#, no-wrap
+msgid "Simplified Use of `MASTER_SITES:n` with One File Per Site"
+msgstr "Упрощённое использование `MASTER_SITES:n` с одним файлом на сайт"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2248
+#, no-wrap
+msgid ""
+"MASTER_SITES=\tftp://ftp1.example.com/:source1 \\\n"
+"\t\thttp://www.example.com/:source2\n"
+"DISTFILES=\tsource1.tar.gz:source1 \\\n"
+"\t\tsource2.tar.gz:source2\n"
+msgstr ""
+"MASTER_SITES=\tftp://ftp1.example.com/:source1 \\\n"
+"\t\thttp://www.example.com/:source2\n"
+"DISTFILES=\tsource1.tar.gz:source1 \\\n"
+"\t\tsource2.tar.gz:source2\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2256
+msgid ""
+"Multiple distribution files can have the same group. Continuing the "
+"previous example, suppose that there was a third distfile, "
+"[.filename]#source3.tar.gz#, that is downloaded from `ftp.example2.com`. "
+"The [.filename]#Makefile# would then be written like "
+"crossref:makefiles[ports-master-sites-n-example-simple-use-more-than-one-"
+"file-per-site,Simplified Use of `MASTER_SITES:n` with More Than One File Per "
+"Site]."
+msgstr ""
+"Несколько файлов дистрибутивов могут принадлежать одной группе. Продолжая "
+"предыдущий пример, предположим, что существует третий файл дистрибутива "
+"[.filename]#source3.tar.gz#, который загружается с `ftp.example2.com`. Тогда "
+"[.filename]#Makefile# будет записан, как показано в crossref:makefiles[ports-"
+"master-sites-n-example-simple-use-more-than-one-file-per-site,Упрощённое "
+"использование `MASTER_SITES:n` с несколькими файлами на один сайт]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2258
+#, no-wrap
+msgid "Simplified Use of `MASTER_SITES:n` with More Than One File Per Site"
+msgstr "Упрощённое использование `MASTER_SITES:n` с несколькими файлами на одном сайте"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2269
+#, no-wrap
+msgid ""
+"MASTER_SITES=\tftp://ftp.example.com/:source1 \\\n"
+"\t\thttp://www.example.com/:source2\n"
+"DISTFILES=\tsource1.tar.gz:source1 \\\n"
+"\t\tsource2.tar.gz:source2 \\\n"
+"\t\tsource3.tar.gz:source2\n"
+msgstr ""
+"MASTER_SITES=\tftp://ftp.example.com/:source1 \\\n"
+"\t\thttp://www.example.com/:source2\n"
+"DISTFILES=\tsource1.tar.gz:source1 \\\n"
+"\t\tsource2.tar.gz:source2 \\\n"
+"\t\tsource3.tar.gz:source2\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2274
+#, no-wrap
+msgid "Detailed Information"
+msgstr "Подробная информация"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2277
+msgid ""
+"Okay, so the previous example did not reflect the new port's needs? In this "
+"section we will explain in detail how the fine grained fetching mechanism "
+"`MASTER_SITES:n` works and how it can be used."
+msgstr ""
+"Хорошо, значит, предыдущий пример не отражал потребности нового порта? В "
+"этом разделе мы подробно объясним, как работает механизм детализированного "
+"получения `MASTER_SITES:n` и как его можно использовать."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2279
+msgid ""
+"Elements can be postfixed with `:__n__` where _n_ is `[^:,]\\+`, that is, "
+"_n_ could conceptually be any alphanumeric string but we will limit it to "
+"`[a-zA-Z_][0-9a-zA-Z_]+` for now."
+msgstr ""
+"Элементы могут иметь постфикс `:__n__`, где _n_ — это `[^:,]+`, то есть _n_ "
+"концептуально может быть любой буквенно-цифровой строкой, но пока мы "
+"ограничим её `[a-zA-Z_][0-9a-zA-Z_]+`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2281
+msgid ""
+"Moreover, string matching is case sensitive; that is, `n` is different from "
+"`N`."
+msgstr ""
+"Более того, сравнение строк чувствительно к регистру; то есть, `n` "
+"отличается от `N`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2287
+msgid ""
+"However, these words cannot be used for postfixing purposes since they yield "
+"special meaning: `default`, `all` and `ALL` (they are used internally in "
+"item crossref:makefiles[porting-master-sites-n-what-changes-in-port-targets, "
+"ii]). Furthermore, `DEFAULT` is a special purpose word (check item "
+"crossref:makefiles[porting-master-sites-n-DEFAULT-group,3])."
+msgstr ""
+"Однако эти слова не могут использоваться для постфиксных целей, так как "
+"имеют специальное значение: `default`, `all` и `ALL` (они используются "
+"внутри системы, см. crossref:makefiles[porting-master-sites-n-what-changes-"
+"in-port-targets, ii]). Кроме того, `DEFAULT` является словом специального "
+"назначения (проверьте пункт crossref:makefiles[porting-master-sites-n-"
+"DEFAULT-group,3])."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2288
+msgid ""
+"Elements postfixed with `:n` belong to the group `n`, `:m` belong to group "
+"`m` and so forth."
+msgstr ""
+"Элементы с постфиксом `:n` принадлежат группе `n`, `:m` — группе `m` и так "
+"далее."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2294
+msgid ""
+"Elements without a postfix are groupless, they all belong to the special "
+"group `DEFAULT`. Any elements postfixed with `DEFAULT`, is just being "
+"redundant unless an element belongs to both `DEFAULT` and other groups at "
+"the same time (check item crossref:makefiles[porting-master-sites-n-comma-"
+"operator,5])."
+msgstr ""
+"Элементы без постфикса не принадлежат к группам, все они относятся к "
+"специальной группе `DEFAULT`. Элементы с постфиксом `DEFAULT` избыточны, за "
+"исключением случаев, когда элемент одновременно принадлежит и к `DEFAULT`, и "
+"к другим группам (см. пункт crossref:makefiles[porting-master-sites-n-comma-"
+"operator,5])."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2296
+msgid "These examples are equivalent but the first one is preferred:"
+msgstr "Эти примеры эквивалентны, но первый предпочтительнее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2300
+#, no-wrap
+msgid "MASTER_SITES=\talpha\n"
+msgstr "MASTER_SITES=\talpha\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2305
+#, no-wrap
+msgid "MASTER_SITES=\talpha:DEFAULT\n"
+msgstr "MASTER_SITES=\talpha:DEFAULT\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2308
+msgid ""
+"Groups are not exclusive, an element may belong to several different groups "
+"at the same time and a group can either have either several different "
+"elements or none at all."
+msgstr ""
+"Группы не являются исключительными, элемент может принадлежать нескольким "
+"разным группам одновременно, а группа может содержать несколько разных "
+"элементов или не содержать их вовсе."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2311
+msgid ""
+"When an element belongs to several groups at the same time, use the comma "
+"operator (`,`)."
+msgstr ""
+"Когда элемент принадлежит нескольким группам одновременно, используйте "
+"оператор запятую (`,`)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2314
+msgid ""
+"Instead of repeating it several times, each time with a different postfix, "
+"we can list several groups at once in a single postfix. For instance, "
+"`:m,n,o` marks an element that belongs to group `m`, `n` and `o`."
+msgstr ""
+"Вместо повторения несколько раз, каждый раз с разным постфиксом, мы можем "
+"перечислить несколько групп сразу в одном постфиксе. Например, `:m,n,o` "
+"обозначает элемент, принадлежащий группам `m`, `n` и `o`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2316
+msgid "All these examples are equivalent but the last one is preferred:"
+msgstr "Все эти примеры эквивалентны, но последний является предпочтительным:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2320
+#, no-wrap
+msgid "MASTER_SITES=\talpha alpha:SOME_SITE\n"
+msgstr "MASTER_SITES=\talpha alpha:SOME_SITE\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2325
+#, no-wrap
+msgid "MASTER_SITES=\talpha:DEFAULT alpha:SOME_SITE\n"
+msgstr "MASTER_SITES=\talpha:DEFAULT alpha:SOME_SITE\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2330
+#, no-wrap
+msgid "MASTER_SITES=\talpha:SOME_SITE,DEFAULT\n"
+msgstr "MASTER_SITES=\talpha:SOME_SITE,DEFAULT\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2335
+#, no-wrap
+msgid "MASTER_SITES=\talpha:DEFAULT,SOME_SITE\n"
+msgstr "MASTER_SITES=\talpha:DEFAULT,SOME_SITE\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2338
+msgid ""
+"All sites within a given group are sorted according to `MASTER_SORT_AWK`. "
+"All groups within `MASTER_SITES` and `PATCH_SITES` are sorted as well."
+msgstr ""
+"Все сайты в заданной группе сортируются согласно `MASTER_SORT_AWK`. Все "
+"группы в `MASTER_SITES` и `PATCH_SITES` также сортируются."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2341
+msgid ""
+"Group semantics can be used in any of the variables `MASTER_SITES`, "
+"`PATCH_SITES`, `MASTER_SITE_SUBDIR`, `PATCH_SITE_SUBDIR`, `DISTFILES`, and "
+"`PATCHFILES` according to this syntax:"
+msgstr ""
+"Семантика групп может использоваться в любых переменных `MASTER_SITES`, "
+"`PATCH_SITES`, `MASTER_SITE_SUBDIR`, `PATCH_SITE_SUBDIR`, `DISTFILES` и "
+"`PATCHFILES` согласно следующему синтаксису:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2355
+msgid ""
+"All `MASTER_SITES`, `PATCH_SITES`, `MASTER_SITE_SUBDIR` and "
+"`PATCH_SITE_SUBDIR` elements must be terminated with the forward slash `/` "
+"character. If any elements belong to any groups, the group postfix `:__n__` "
+"must come right after the terminator `/`. The `MASTER_SITES:n` mechanism "
+"relies on the existence of the terminator `/` to avoid confusing elements "
+"where a `:n` is a valid part of the element with occurrences where `:n` "
+"denotes group `n`. For compatibility purposes, since the `/` terminator was "
+"not required before in both `MASTER_SITE_SUBDIR` and `PATCH_SITE_SUBDIR` "
+"elements, if the postfix immediate preceding character is not a `/` then "
+"`:n` will be considered a valid part of the element instead of a group "
+"postfix even if an element is postfixed with `:n`. See both "
+"crossref:makefiles[ports-master-sites-n-example-detailed-use-master-site-"
+"subdir,Detailed Use of `MASTER_SITES:n` in `MASTER_SITE_SUBDIR`] and "
+"crossref:makefiles[ports-master-sites-n-example-detailed-use-complete-"
+"example-master-sites,Detailed Use of `MASTER_SITES:n` with Comma Operator, "
+"Multiple Files, Multiple Sites and Multiple Subdirectories]."
+msgstr ""
+"Все элементы `MASTER_SITES`, `PATCH_SITES`, `MASTER_SITE_SUBDIR` и "
+"`PATCH_SITE_SUBDIR` должны заканчиваться символом дробной черты `/`. Если "
+"элементы принадлежат к какой-либо группе, постфикс группы `:__n__` должен "
+"следовать сразу после завершающего символа `/`. Механизм `MASTER_SITES:n` "
+"полагается на наличие завершающего символа `/`, чтобы избежать путаницы "
+"между элементами, где `:n` является допустимой частью элемента, и случаями, "
+"где `:n` обозначает группу `n`. В целях совместимости, поскольку ранее "
+"завершающий символ `/` не требовался в элементах `MASTER_SITE_SUBDIR` и "
+"`PATCH_SITE_SUBDIR`, если символ, непосредственно предшествующий постфиксу, "
+"не является `/`, то `:n` будет считаться допустимой частью элемента, а не "
+"постфиксом группы, даже если элемент оканчивается на `:n`. См. оба раздела "
+"crossref:makefiles[ports-master-sites-n-example-detailed-use-master-site-"
+"subdir,Подробное использование `MASTER_SITES:n` в `MASTER_SITE_SUBDIR`] и "
+"crossref:makefiles[ports-master-sites-n-example-detailed-use-complete-"
+"example-master-sites,Подробное использование `MASTER_SITES:n` с оператором "
+"запятая, несколькими файлами, несколькими сайтами и несколькими "
+"подкаталогами]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2357
+#, no-wrap
+msgid "Detailed Use of `MASTER_SITES:n` in `MASTER_SITE_SUBDIR`"
+msgstr "Подробное использование `MASTER_SITES:n` в `MASTER_SITE_SUBDIR`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2364
+#, no-wrap
+msgid "MASTER_SITE_SUBDIR=\told:n new/:NEW\n"
+msgstr "MASTER_SITE_SUBDIR=\told:n new/:NEW\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2367
+msgid "Directories within group `DEFAULT` -> old:n"
+msgstr "Каталоги в группе `DEFAULT` -> old:n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2368
+msgid "Directories within group `NEW` -> new"
+msgstr "Каталоги в группе `NEW` -> new"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2372
+#, no-wrap
+msgid "Detailed Use of `MASTER_SITES:n` with Comma Operator, Multiple Files, Multiple Sites and Multiple Subdirectories"
+msgstr "Подробное использование `MASTER_SITES:n` с оператором запятая, несколькими файлами, сайтами и подкаталогами"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2390
+#, no-wrap
+msgid ""
+"MASTER_SITES=\thttp://site1/%SUBDIR%/ http://site2/:DEFAULT \\\n"
+"\t\thttp://site3/:group3 http://site4/:group4 \\\n"
+"\t\thttp://site5/:group5 http://site6/:group6 \\\n"
+"\t\thttp://site7/:DEFAULT,group6 \\\n"
+"\t\thttp://site8/%SUBDIR%/:group6,group7 \\\n"
+"\t\thttp://site9/:group8\n"
+"DISTFILES=\tfile1 file2:DEFAULT file3:group3 \\\n"
+"\t\tfile4:group4,group5,group6 file5:grouping \\\n"
+"\t\tfile6:group7\n"
+"MASTER_SITE_SUBDIR=\tdirectory-trial:1 directory-n/:groupn \\\n"
+"\t\tdirectory-one/:group6,DEFAULT \\\n"
+"\t\tdirectory\n"
+msgstr ""
+"MASTER_SITES=\thttp://site1/%SUBDIR%/ http://site2/:DEFAULT \\\n"
+"\t\thttp://site3/:group3 http://site4/:group4 \\\n"
+"\t\thttp://site5/:group5 http://site6/:group6 \\\n"
+"\t\thttp://site7/:DEFAULT,group6 \\\n"
+"\t\thttp://site8/%SUBDIR%/:group6,group7 \\\n"
+"\t\thttp://site9/:group8\n"
+"DISTFILES=\tfile1 file2:DEFAULT file3:group3 \\\n"
+"\t\tfile4:group4,group5,group6 file5:grouping \\\n"
+"\t\tfile6:group7\n"
+"MASTER_SITE_SUBDIR=\tdirectory-trial:1 directory-n/:groupn \\\n"
+"\t\tdirectory-one/:group6,DEFAULT \\\n"
+"\t\tdirectory\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2394
+msgid ""
+"The previous example results in this fine grained fetching. Sites are "
+"listed in the exact order they will be used."
+msgstr ""
+"Предыдущий пример приводит к такой детализированной загрузке файлов. Сайты "
+"перечислены в точном порядке их использования."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2396
+msgid "[.filename]#file1# will be fetched from"
+msgstr "[.filename]#file1# будет загружен из"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2398
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2408
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2418
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2424
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2434
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2439
+msgid "`MASTER_SITE_OVERRIDE`"
+msgstr "`MASTER_SITE_OVERRIDE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2399
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2409
+msgid "http://site1/directory-trial:1/"
+msgstr "http://site1/directory-trial:1/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2400
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2410
+msgid "http://site1/directory-one/"
+msgstr "http://site1/directory-one/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2401
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2411
+msgid "http://site1/directory/"
+msgstr "http://site1/directory/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2402
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2412
+msgid "http://site2/"
+msgstr "http://site2/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2403
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2413
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2428
+msgid "http://site7/"
+msgstr "http://site7/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2404
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2414
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2420
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2430
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2435
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2441
+msgid "`MASTER_SITE_BACKUP`"
+msgstr "`MASTER_SITE_BACKUP`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2406
+msgid ""
+"[.filename]#file2# will be fetched exactly as [.filename]#file1# since they "
+"both belong to the same group"
+msgstr ""
+"[.filename]#file2# будет загружен точно так же, как [.filename]#file1#, "
+"поскольку они оба принадлежат к одной и той же группе"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2416
+msgid "[.filename]#file3# will be fetched from"
+msgstr "[.filename]#file3# будет загружен из"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2419
+msgid "http://site3/"
+msgstr "http://site3/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2422
+msgid "[.filename]#file4# will be fetched from"
+msgstr "[.filename]#file4# будет загружен из"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2425
+msgid "http://site4/"
+msgstr "http://site4/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2426
+msgid "http://site5/"
+msgstr "http://site5/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2427
+msgid "http://site6/"
+msgstr "http://site6/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2429
+msgid "http://site8/directory-one/"
+msgstr "http://site8/directory-one/"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2432
+msgid "[.filename]#file5# will be fetched from"
+msgstr "[.filename]#file5# будет загружен из"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2437
+msgid "[.filename]#file6# will be fetched from"
+msgstr "[.filename]#file6# будет получен из"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2440
+msgid "http://site8/"
+msgstr "http://site8/"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2445
+msgid ""
+"How do I group one of the special macros from [.filename]#bsd.sites.mk#, for "
+"example, SourceForge (`SF`)?"
+msgstr ""
+"Как сгруппировать один из специальных макросов из [.filename]#bsd.sites.mk#, "
+"например, SourceForge (`SF`)?"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2449
+msgid ""
+"This has been simplified as much as possible. See crossref:makefiles[ports-"
+"master-sites-n-example-detailed-use-master-site-sourceforge,Detailed Use of "
+"`MASTER_SITES:n` with SourceForge (`SF`)]."
+msgstr ""
+"Это максимально упрощено. См. crossref:makefiles[ports-master-sites-n-"
+"example-detailed-use-master-site-sourceforge,Подробное использование "
+"`MASTER_SITES:n` с SourceForge (`SF`)]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2451
+#, no-wrap
+msgid "Detailed Use of `MASTER_SITES:n` with SourceForge (`SF`)"
+msgstr "Подробное использование `MASTER_SITES:n` с SourceForge (`SF`)"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2459
+#, no-wrap
+msgid ""
+"MASTER_SITES=\thttp://site1/ SF/something/1.0:sourceforge,TEST\n"
+"DISTFILES=\tsomething.tar.gz:sourceforge\n"
+msgstr ""
+"MASTER_SITES=\thttp://site1/ SF/something/1.0:sourceforge,TEST\n"
+"DISTFILES=\tsomething.tar.gz:sourceforge\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2462
+msgid ""
+"[.filename]#something.tar.gz# will be fetched from all sites within "
+"SourceForge."
+msgstr ""
+"[.filename]#something.tar.gz# будет загружен со всех сайтов в пределах "
+"SourceForge."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2464
+msgid "How do I use this with `PATCH*`?"
+msgstr "Как использовать это с `PATCH*`?"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2468
+msgid ""
+"All examples were done with `MASTER*` but they work exactly the same for "
+"`PATCH*` ones as can be seen in crossref:makefiles[ports-master-sites-n-"
+"example-detailed-use-patch-sites,Simplified Use of `MASTER_SITES:n` with "
+"`PATCH_SITES`]."
+msgstr ""
+"Все примеры были выполнены с `MASTER*`, но они работают точно так же для "
+"`PATCH*`, как можно увидеть в crossref:makefiles[ports-master-sites-n-"
+"example-detailed-use-patch-sites,Упрощённое использование `MASTER_SITES:n` с "
+"`PATCH_SITES`]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2470
+#, no-wrap
+msgid "Simplified Use of `MASTER_SITES:n` with `PATCH_SITES`"
+msgstr "Упрощённое использование `MASTER_SITES:n` с `PATCH_SITES`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2478
+#, no-wrap
+msgid ""
+"PATCH_SITES=\thttp://site1/ http://site2/:test\n"
+"PATCHFILES=\tpatch1:test\n"
+msgstr ""
+"PATCH_SITES=\thttp://site1/ http://site2/:test\n"
+"PATCHFILES=\tpatch1:test\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2483
+#, no-wrap
+msgid "What Does Change for Ports? What Does Not?"
+msgstr "Что меняется для портов? Что остается неизменным?"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2490
+msgid ""
+"All current ports remain the same. The `MASTER_SITES:n` feature code is only "
+"activated if there are elements postfixed with `:__n__` like elements "
+"according to the aforementioned syntax rules, especially as shown in item "
+"crossref:makefiles[porting-master-sites-n-group-semantics, 7]."
+msgstr ""
+"Все текущие порты остаются без изменений. Функция `MASTER_SITES:n` "
+"активируется только при наличии элементов с постфиксом `:__n__`, "
+"соответствующих указанным выше синтаксическим правилам, в частности, как "
+"показано в пункте crossref:makefiles[porting-master-sites-n-group-semantics, "
+"7]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2493
+msgid ""
+"The port targets remain the same: `checksum`, `makesum`, `patch`, "
+"`configure`, `build`, etc. With the obvious exceptions of `do-fetch`, `fetch-"
+"list`, `master-sites` and `patch-sites`."
+msgstr ""
+"Порты сохраняют те же цели: `checksum`, `makesum`, `patch`, `configure`, "
+"`build` и т.д., за исключением очевидных случаев: `do-fetch`, `fetch-list`, "
+"`master-sites` и `patch-sites`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2499
+msgid ""
+"`do-fetch`: deploys the new grouping postfixed `DISTFILES` and `PATCHFILES` "
+"with their matching group elements within both `MASTER_SITES` and "
+"`PATCH_SITES` which use matching group elements within both "
+"`MASTER_SITE_SUBDIR` and `PATCH_SITE_SUBDIR`. Check crossref:makefiles[ports-"
+"master-sites-n-example-detailed-use-complete-example-master-sites,Detailed "
+"Use of `MASTER_SITES:n` with Comma Operator, Multiple Files, Multiple Sites "
+"and Multiple Subdirectories]."
+msgstr ""
+"`do-fetch`: развертывает новую группировку с постфиксом `DISTFILES` и "
+"`PATCHFILES` с соответствующими групповыми элементами в `MASTER_SITES` и "
+"`PATCH_SITES`, которые используют соответствующие групповые элементы в "
+"`MASTER_SITE_SUBDIR` и `PATCH_SITE_SUBDIR`. Проверьте "
+"crossref:makefiles[ports-master-sites-n-example-detailed-use-complete-"
+"example-master-sites,Подробное использование `MASTER_SITES:n` с оператором "
+"запятой, множественными файлами, множественными сайтами и множественными "
+"подкаталогами]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2500
+msgid ""
+"`fetch-list`: works like old `fetch-list` with the exception that it groups "
+"just like `do-fetch`."
+msgstr ""
+"`fetch-list`: работает как старый `fetch-list`, за исключением того, что "
+"группировка происходит так же, как в `do-fetch`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2501
+msgid ""
+"`master-sites` and `patch-sites`: (incompatible with older versions) only "
+"return the elements of group `DEFAULT`; in fact, they execute targets "
+"`master-sites-default` and `patch-sites-default` respectively."
+msgstr ""
+"`master-sites` и `patch-sites`: (несовместимо с более старыми версиями) "
+"возвращают только элементы группы `DEFAULT`; фактически они выполняют цели "
+"`master-sites-default` и `patch-sites-default` соответственно."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2506
+msgid ""
+"Furthermore, using target either `master-sites-all` or `patch-sites-all` is "
+"preferred to directly checking either `MASTER_SITES` or `PATCH_SITES`. "
+"Also, directly checking is not guaranteed to work in any future versions. "
+"Check item crossref:makefiles[porting-master-sites-n-new-port-targets-master-"
+"sites-all, B] for more information on these new port targets."
+msgstr ""
+"Кроме того, предпочтительнее использовать цель `master-sites-all` или `patch-"
+"sites-all`, чем напрямую проверять `MASTER_SITES` или `PATCH_SITES`. Кроме "
+"того, прямая проверка не гарантирует работу в будущих версиях. Для получения "
+"дополнительной информации об этих новых целях портов см. пункт "
+"crossref:makefiles[porting-master-sites-n-new-port-targets-master-sites-all, "
+"B]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2508
+msgid "New port targets"
+msgstr "Новые цели портов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2509
+msgid ""
+"There are `master-sites-_n_` and `patch-sites-_n_` targets which will list "
+"the elements of the respective group _n_ within `MASTER_SITES` and "
+"`PATCH_SITES` respectively. For instance, both `master-sites-DEFAULT` and "
+"`patch-sites-DEFAULT` will return the elements of group `DEFAULT`, `master-"
+"sites-test` and `patch-sites-test` of group `test`, and thereon."
+msgstr ""
+"Существуют цели `master-sites-_n_` и `patch-sites-_n_`, которые будут "
+"выводить элементы соответствующей группы _n_ в `MASTER_SITES` и "
+"`PATCH_SITES` соответственно. Например, и `master-sites-DEFAULT`, и `patch-"
+"sites-DEFAULT` вернут элементы группы `DEFAULT`, `master-sites-test` и "
+"`patch-sites-test` — группы `test`, и так далее."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2512
+msgid ""
+"There are new targets `master-sites-all` and `patch-sites-all` which do the "
+"work of the old `master-sites` and `patch-sites` ones. They return the "
+"elements of all groups as if they all belonged to the same group with the "
+"caveat that it lists as many `MASTER_SITE_BACKUP` and `MASTER_SITE_OVERRIDE` "
+"as there are groups defined within either `DISTFILES` or `PATCHFILES`; "
+"respectively for `master-sites-all` and `patch-sites-all`."
+msgstr ""
+"Существуют новые цели `master-sites-all` и `patch-sites-all`, которые "
+"выполняют работу старых `master-sites` и `patch-sites`. Они возвращают "
+"элементы всех групп, как если бы они все принадлежали одной группе, с "
+"оговоркой, что перечисляется столько же `MASTER_SITE_BACKUP` и "
+"`MASTER_SITE_OVERRIDE`, сколько определено групп в `DISTFILES` или "
+"`PATCHFILES`; соответственно для `master-sites-all` и `patch-sites-all`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2514
+#, no-wrap
+msgid "`DIST_SUBDIR`"
+msgstr "`DIST_SUBDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2519
+msgid ""
+"Do not let the port clutter [.filename]#/usr/ports/distfiles#. If the port "
+"requires a lot of files to be fetched, or contains a file that has a name "
+"that might conflict with other ports (for example, [.filename]#Makefile#), "
+"set `DIST_SUBDIR` to the name of the port (`${PORTNAME}` or `${PKGNAMEPREFIX}"
+"${PORTNAME}` are fine). This will change `DISTDIR` from the default "
+"[.filename]#/usr/ports/distfiles# to [.filename]#/usr/ports/distfiles/$"
+"{DIST_SUBDIR}#, and in effect puts everything that is required for the port "
+"into that subdirectory."
+msgstr ""
+"Не допускайте захламления портом каталога [.filename]#/usr/ports/distfiles#. "
+"Если порт требует загрузки большого количества файлов или содержит файл с "
+"именем, которое может конфликтовать с другими портами (например, "
+"[.filename]#Makefile#), установите `DIST_SUBDIR` в имя порта (подойдут `$"
+"{PORTNAME}` или `${PKGNAMEPREFIX}${PORTNAME}`). Это изменит `DISTDIR` со "
+"значения по умолчанию [.filename]#/usr/ports/distfiles# на [.filename]#/usr/"
+"ports/distfiles/${DIST_SUBDIR}#, фактически помещая все необходимые для "
+"порта файлы в этот подкаталог."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2521
+msgid ""
+"It will also look at the subdirectory with the same name on the backup "
+"master site at http://distcache.FreeBSD.org[http://distcache.FreeBSD.org] "
+"(Setting `DISTDIR` explicitly in [.filename]#Makefile# will not accomplish "
+"this, so please use `DIST_SUBDIR`.)"
+msgstr ""
+"Также будет проверяться подкаталог с тем же именем на основном резервном "
+"сайте по адресу http://distcache.FreeBSD.org[http://distcache.FreeBSD.org] "
+"(Явное указание `DISTDIR` в [.filename]#Makefile# не решит эту задачу, "
+"поэтому используйте `DIST_SUBDIR`.)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2525
+msgid ""
+"This does not affect `MASTER_SITES` defined in the [.filename]#Makefile#."
+msgstr ""
+"Это не влияет на сайты в `MASTER_SITES`, определённые в "
+"[.filename]#Makefile#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2528
+#, no-wrap
+msgid "`MAINTAINER`"
+msgstr "`MAINTAINER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2531
+msgid "Set your mail-address here. Please. _:-)_"
+msgstr "Установите здесь свой адрес электронной почты. Пожалуйста. _:-)_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2536
+msgid ""
+"Only a single address without the comment part is allowed as a `MAINTAINER` "
+"value. The format used is `user@hostname.domain`. Please do not include "
+"any descriptive text such as a real name in this entry. That merely "
+"confuses the Ports infrastructure and most tools using it."
+msgstr ""
+"Только один адрес без комментария допускается в качестве значения "
+"`MAINTAINER`. Используемый формат: `user@hostname.domain`. Пожалуйста, не "
+"включайте в эту запись описательный текст, например, настоящее имя. Это "
+"только вносит путаницу в инфраструктуру Ports и большинство инструментов, "
+"которые её используют."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2539
+msgid ""
+"The maintainer is responsible for keeping the port up to date and making "
+"sure that it works correctly. For a detailed description of the "
+"responsibilities of a port maintainer, refer to extref:{contributing}[The "
+"challenge for port maintainers, maintain-port]."
+msgstr ""
+"Ответственный за поддержку порта обязан поддерживать порт в актуальном "
+"состоянии и обеспечивать его корректную работу. Подробное описание "
+"обязанностей ответственного за поддержку порта приведено в разделе extref:"
+"{contributing}[Задача для сопровождающих портов,maintain-port]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2548
+msgid ""
+"A maintainer volunteers to keep a port in good working order. Maintainers "
+"have the primary responsibility for their ports, but not exclusive "
+"ownership. Ports exist for the benefit of the community and, in reality, "
+"belong to the community. What this means is that people other than the "
+"maintainer can make changes to a port. Large changes to the Ports "
+"Collection might require changes to many ports. The FreeBSD Ports "
+"Management Team or members of other teams might modify ports to fix "
+"dependency issues or other problems, like a version bump for a shared "
+"library update."
+msgstr ""
+"Сопровождающий добровольно поддерживает порт в рабочем состоянии. "
+"Сопровождающие несут основную ответственность за свои порты, но не имеют "
+"исключительных прав на них. Порты существуют для пользы сообщества и, по "
+"сути, принадлежат сообществу. Это означает, что люди, не являющиеся "
+"сопровождающими, также могут вносить изменения в порт. Крупные изменения в "
+"коллекции портов могут потребовать правок во многих портах. Команда "
+"управления портами FreeBSD или члены других команд могут изменять порты для "
+"исправления проблем с зависимостями или других проблем, таких как обновление "
+"версии динамической библиотеки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2551
+msgid ""
+"Some types of fixes have \"blanket approval\" from the {portmgr}, allowing "
+"any committer to fix those categories of problems on any port. These fixes "
+"do not need approval from the maintainer."
+msgstr ""
+"Некоторые типы исправлений имеют \"автоматическое согласование\" от "
+"{portmgr}, что позволяет любому коммиттеру исправлять эти категории проблем "
+"в любом порте. Такие исправления не требуют одобрения от сопровождающего."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2554
+msgid ""
+"Blanket approval for most ports applies to fixes like infrastructure "
+"changes, or trivial and _tested_ build and runtime fixes. The current list "
+"is available in extref:{committers-guide}[Ports section of the Committer's "
+"Guide, ports-qa-misc-blanket-approval]."
+msgstr ""
+"Автоматическое согласование для большинства портов применяется к "
+"исправлениям, таким как изменения инфраструктуры, или тривиальным и "
+"_проверенным_ исправлениям сборки и выполнения. Текущий список доступен в "
+"extref:{committers-guide}[разделе Портов Руководства коммиттера, ports-qa-"
+"misc-blanket-approval]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2561
+msgid ""
+"Other changes to the port will be sent to the maintainer for review and "
+"approval before being committed. If the maintainer does not respond to an "
+"update request after two weeks (excluding major public holidays), then that "
+"is considered a maintainer timeout, and the update can be made without "
+"explicit maintainer approval. If the maintainer does not respond within "
+"three months, or if there have been three consecutive timeouts, then that "
+"maintainer is considered absent without leave, and all of their ports can be "
+"assigned back to the pool. Exceptions to this are anything maintained by "
+"the {portmgr}, or the {security-officer}. No unauthorized commits may ever "
+"be made to ports maintained by those groups."
+msgstr ""
+"Другие изменения в порте будут отправлены сопровождающему на проверку и "
+"утверждение перед внесением. Если сопровождающий не отвечает на запрос об "
+"обновлении в течение двух недель (за исключением основных государственных "
+"праздников), это считается превышением времени ожидания сопровождающего, и "
+"обновление может быть внесено без его явного одобрения. Если сопровождающий "
+"не отвечает в течение трех месяцев или если произошло три последовательных "
+"превышения времени ожидания, то сопровождающий считается отсутствующим без "
+"уведомления, и все его порты могут быть возвращены в общий пул. Исключениями "
+"являются порты, сопровождаемые {portmgr} или {security-officer}. Никакие "
+"несанкционированные изменения не могут быть внесены в порты, сопровождаемые "
+"этими группами."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2565
+msgid ""
+"We reserve the right to modify the maintainer's submission to better match "
+"existing policies and style of the Ports Collection without explicit "
+"blessing from the submitter or the maintainer. Also, large infrastructural "
+"changes can result in a port being modified without the maintainer's "
+"consent. These kinds of changes will never affect the port's functionality."
+msgstr ""
+"Мы оставляем за собой право изменять представленные сопровождающим "
+"материалы, чтобы лучше соответствовать существующим политикам и стилю "
+"Коллекции портов, без явного одобрения отправителя или сопровождающего. "
+"Кроме того, масштабные инфраструктурные изменения могут привести к "
+"модификации порта без согласия сопровождающего. Подобные изменения никогда "
+"не повлияют на функциональность порта."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2567
+msgid ""
+"The {portmgr} reserves the right to revoke or override anyone's "
+"maintainership for any reason, and the {security-officer} reserves the right "
+"to revoke or override maintainership for security reasons."
+msgstr ""
+"{portmgr} оставляет за собой право отозвать или изменить права "
+"сопровождающего по любой причине, а {security-officer} оставляет за собой "
+"право отозвать или изменить права сопровождающего по соображениям "
+"безопасности."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2569
+#, no-wrap
+msgid "`COMMENT`"
+msgstr "`COMMENT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2573
+msgid ""
+"The comment is a one-line description of a port shown by `pkg info`. Please "
+"follow these rules when composing it:"
+msgstr ""
+"Комментарий — это однострочное описание порта, отображаемое командой `pkg "
+"info`. При составлении придерживайтесь следующих правил:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2575
+msgid "The COMMENT string should be 70 characters or less."
+msgstr "Строка COMMENT должна быть не длиннее 70 символов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2576
+msgid "Do _not_ include the package name or version number of software."
+msgstr ""
+"Не включайте название пакета или номер версии программного обеспечения."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2577
+msgid "The comment must begin with a capital and end without a period."
+msgstr ""
+"Комментарий должен начинаться с заглавной буквы и заканчиваться без точки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2578
+msgid "Do not start with an indefinite article (that is, A or An)."
+msgstr "Не начинайте с неопределённого артикля (то есть A или An)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2579
+msgid "Capitalize names such as Apache, JavaScript, or Perl."
+msgstr ""
+"Пишите названия с заглавной буквы, например: Apache, JavaScript или Perl."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2580
+msgid "Use a serial comma for lists of words: \"green, red, and blue.\""
+msgstr "Используйте запятую для списков слов: \"green, red, and blue.\""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2581
+msgid "Check for spelling errors."
+msgstr "Проверяйте на наличие орфографических ошибок."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2583
+msgid "Here is an example:"
+msgstr "Вот пример:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2587
+#, no-wrap
+msgid "COMMENT=\tCat chasing a mouse all over the screen\n"
+msgstr "COMMENT=\tCat chasing a mouse all over the screen\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2590
+msgid ""
+"The COMMENT variable immediately follows the MAINTAINER variable in the "
+"[.filename]#Makefile#."
+msgstr ""
+"Переменная COMMENT следует сразу за переменной MAINTAINER в файле "
+"[.filename]#Makefile#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2592
+#, no-wrap
+msgid "Project website"
+msgstr "Веб-сайт проекта"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2595
+msgid ""
+"Each port should point to a website that provides more information about the "
+"software."
+msgstr ""
+"Каждый порт должен указывать на веб-сайт, предоставляющий дополнительную "
+"информацию о программном обеспечении."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2597
+msgid ""
+"Whenever possible, this should be the official project website maintained by "
+"the developers of the software."
+msgstr ""
+"Везде, где это возможно, следует использовать официальный сайт проекта, "
+"поддерживаемый разработчиками программного обеспечения."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2601
+#, no-wrap
+msgid "WWW=\t\thttps://ffmpeg.org/\n"
+msgstr "WWW=\t\thttps://ffmpeg.org/\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2604
+msgid ""
+"But it can also be a directory or resource in the source code repository:"
+msgstr ""
+"Но это также может быть каталог или ресурс в репозитории исходного кода:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2608
+#, no-wrap
+msgid "WWW=\t\thttps://sourceforge.net/projects/mpd/\n"
+msgstr "WWW=\t\thttps://sourceforge.net/projects/mpd/\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2611
+msgid ""
+"The WWW variable immediately follows the COMMENT variable in the "
+"[.filename]#Makefile#."
+msgstr ""
+"Переменная WWW следует сразу за переменной COMMENT в файле "
+"[.filename]#Makefile#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2614
+msgid ""
+"If the same content can be accessed via HTTP and HTTPS, the URL starting "
+"with `https://` shall be used. If the URI is the root of the website or "
+"directory, it must be terminated with a slash."
+msgstr ""
+"Если один и тот же контент доступен по HTTP и HTTPS, следует использовать "
+"URL, начинающийся с `https://`. Если URI является корнем веб-сайта или "
+"директории, он должен заканчиваться косой чертой."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2618
+msgid ""
+"This information used to be placed into the last line of the [.filename]#pkg-"
+"descr# file. It has been moved into the Makefile for easier maintenance and "
+"processing. Having a `WWW:` line at the end of the [.filename]#pkg-descr# "
+"file is deprecated."
+msgstr ""
+"Эта информация ранее размещалась в последней строке файла [.filename]#pkg-"
+"descr#. Она была перенесена в Makefile для удобства обслуживания и "
+"обработки. Наличие строки `WWW:` в конце файла [.filename]#pkg-descr# "
+"считается устаревшим."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2620
+#, no-wrap
+msgid "Licenses"
+msgstr "Лицензии"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2624
+msgid ""
+"Each port must document the license under which it is available. If it is "
+"not an OSI approved license it must also document any restrictions on "
+"redistribution."
+msgstr ""
+"Каждый порт должен содержать документацию о лицензии, под которой он "
+"распространяется. Если лицензия не одобрена OSI, необходимо также указать "
+"любые ограничения на распространение."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2626
+#, no-wrap
+msgid "`LICENSE`"
+msgstr "`LICENSE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2629
+msgid ""
+"A short name for the license or licenses if more than one license apply."
+msgstr ""
+"Краткое название лицензии или лицензий, если применяется более одной "
+"лицензии."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2631
+msgid ""
+"If it is one of the licenses listed in crossref:makefiles[licenses-license-"
+"list,Predefined License List], only `LICENSE_FILE` and `LICENSE_DISTFILES` "
+"variables can be set."
+msgstr ""
+"Если это одна из лицензий, перечисленных в crossref:makefiles[licenses-"
+"license-list,Предопределенный список лицензий], можно задать только "
+"переменные `LICENSE_FILE` и `LICENSE_DISTFILES`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2635
+msgid ""
+"If this is a license that has not been defined in the ports framework (see "
+"crossref:makefiles[licenses-license-list,Predefined License List]), the "
+"`LICENSE_PERMS` and `LICENSE_NAME` must be set, along with either "
+"`LICENSE_FILE` or `LICENSE_TEXT`. `LICENSE_DISTFILES` and `LICENSE_GROUPS` "
+"can also be set, but are not required."
+msgstr ""
+"Если это лицензия, которая не определена в рамках портов (см. "
+"crossref:makefiles[licenses-license-list,Список предопределённых лицензий]), "
+"необходимо задать `LICENSE_PERMS` и `LICENSE_NAME`, а также `LICENSE_FILE` "
+"или `LICENSE_TEXT`. Также можно задать `LICENSE_DISTFILES` и "
+"`LICENSE_GROUPS`, но это не обязательно."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2638
+msgid ""
+"The predefined licenses are shown in crossref:makefiles[licenses-license-"
+"list,Predefined License List]. The current list is always available in "
+"[.filename]#Mk/bsd.licenses.db.mk#."
+msgstr ""
+"Предопределенные лицензии показаны в crossref:makefiles[licenses-license-"
+"list,Список предопределенных лицензий]. Текущий список всегда доступен в "
+"[.filename]#Mk/bsd.licenses.db.mk#."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2640
+#, no-wrap
+msgid "Simplest Usage, Predefined Licenses"
+msgstr "Простейшее использование, предопределённые лицензии"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2645
+msgid ""
+"When the [.filename]#README# of some software says \"This software is under "
+"the terms of the GNU Lesser General Public License as published by the Free "
+"Software Foundation; either version 2.1 of the License, or (at your option) "
+"any later version.\" but does not provide the license file, use this:"
+msgstr ""
+"Когда в файле [.filename]#README# какого-либо программного обеспечения "
+"указано: «Данное программное обеспечение распространяется на условиях GNU "
+"Lesser General Public License, опубликованной Free Software Foundation; либо "
+"версии 2.1 Лицензии, либо (по вашему выбору) любой более поздней версии», но "
+"сам файл лицензии не предоставлен, используйте следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2649
+#, no-wrap
+msgid "LICENSE=\tLGPL21+\n"
+msgstr "LICENSE=\tLGPL21+\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2652
+msgid "When the software provides the license file, use this:"
+msgstr ""
+"Когда программное обеспечение предоставляет файл лицензии, используйте это:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2657
+#, no-wrap
+msgid ""
+"LICENSE=\tLGPL21+\n"
+"LICENSE_FILE=\t${WRKSRC}/COPYING\n"
+msgstr ""
+"LICENSE=\tLGPL21+\n"
+"LICENSE_FILE=\t${WRKSRC}/COPYING\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2662
+msgid ""
+"For the predefined licenses, the default permissions are `dist-mirror dist-"
+"sell pkg-mirror pkg-sell auto-accept`."
+msgstr ""
+"Для предопределённых лицензий права по умолчанию: `dist-mirror dist-sell pkg-"
+"mirror pkg-sell auto-accept`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2664
+#, no-wrap
+msgid "Predefined License List"
+msgstr "Предопределенный список лицензий"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2668
+#, no-wrap
+msgid "Short Name"
+msgstr "Короткое имя"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2669
+#, no-wrap
+msgid "Name"
+msgstr "Имя"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2670
+#, no-wrap
+msgid "Group"
+msgstr "Группа"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2672
+#, no-wrap
+msgid "Permissions"
+msgstr "Разрешения"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2673
+#, no-wrap
+msgid "`AGPLv3`"
+msgstr "`AGPLv3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2674
+#, no-wrap
+msgid "GNU Affero General Public License version 3"
+msgstr "Универсальная общественная лицензия GNU Affero версии 3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2675
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2680
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2705
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2905
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2920
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2925
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2930
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2935
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2940
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2945
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2950
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2955
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2960
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2970
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2975
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2980
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2985
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2990
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2995
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3105
+#, no-wrap
+msgid "`FSF GPL OSI`"
+msgstr "`FSF GPL OSI`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2677
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2682
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2687
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2692
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2697
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2702
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2707
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2712
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2717
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2722
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2727
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2732
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2737
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2742
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2747
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2752
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2757
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2762
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2842
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2847
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2852
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2857
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2862
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2867
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2872
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2877
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2882
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2887
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2892
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2897
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2902
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2907
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2912
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2917
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2922
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2927
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2932
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2937
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2942
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2947
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2952
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2957
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2962
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2967
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2972
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2977
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2982
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2987
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2992
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2997
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3037
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3042
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3047
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3052
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3057
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3067
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3072
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3077
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3082
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3087
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3092
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3097
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3102
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3107
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3112
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3117
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3122
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3127
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3132
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3137
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3141
+#, no-wrap
+msgid "(default)"
+msgstr "(по умолчанию)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2678
+#, no-wrap
+msgid "`AGPLv3+`"
+msgstr "`AGPLv3+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2679
+#, no-wrap
+msgid "GNU Affero General Public License version 3 (or later)"
+msgstr "Универсальная общественная лицензия GNU Affero версии 3 (или позднее)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2683
+#, no-wrap
+msgid "`APACHE10`"
+msgstr "`APACHE10`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2684
+#, no-wrap
+msgid "Apache License 1.0"
+msgstr "Apache License 1.0"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2685
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2730
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2915
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3080
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3115
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3264
+#, no-wrap
+msgid "`FSF`"
+msgstr "`FSF`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2688
+#, no-wrap
+msgid "`APACHE11`"
+msgstr "`APACHE11`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2689
+#, no-wrap
+msgid "Apache License 1.1"
+msgstr "Apache License 1.1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2690
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2695
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2895
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2900
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2910
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3000
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3005
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3010
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3015
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3020
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3025
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3030
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3040
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3045
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3050
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3090
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3095
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3100
+#, no-wrap
+msgid "`FSF OSI`"
+msgstr "`FSF OSI`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2693
+#, no-wrap
+msgid "`APACHE20`"
+msgstr "`APACHE20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2694
+#, no-wrap
+msgid "Apache License 2.0"
+msgstr "Apache License 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2698
+#, no-wrap
+msgid "`ART10`"
+msgstr "`ART10`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2699
+#, no-wrap
+msgid "Artistic License version 1.0"
+msgstr "Художественная лицензия версия 1.0"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2700
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2710
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3272
+#, no-wrap
+msgid "`OSI`"
+msgstr "`OSI`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2703
+#, no-wrap
+msgid "`ART20`"
+msgstr "`ART20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2704
+#, no-wrap
+msgid "Artistic License version 2.0"
+msgstr "Художественная лицензия версии 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2708
+#, no-wrap
+msgid "`ARTPERL10`"
+msgstr "`ARTPERL10`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2709
+#, no-wrap
+msgid "Artistic License (perl) version 1.0"
+msgstr "Художественная лицензия (perl) версия 1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2713
+#, no-wrap
+msgid "`BSD`"
+msgstr "`BSD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2714
+#, no-wrap
+msgid "BSD license Generic Version (deprecated)"
+msgstr "Лицензия BSD, общая версия (устарела)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2715
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2720
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2725
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2735
+#, no-wrap
+msgid "`FSF OSI COPYFREE`"
+msgstr "`FSF OSI COPYFREE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2718
+#, no-wrap
+msgid "`BSD2CLAUSE`"
+msgstr "`BSD2CLAUSE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2719
+#, no-wrap
+msgid "BSD 2-clause \"Simplified\" License"
+msgstr "BSD 2-пунктная лицензия \"Упрощенная\""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2723
+#, no-wrap
+msgid "`BSD3CLAUSE`"
+msgstr "`BSD3CLAUSE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2724
+#, no-wrap
+msgid "BSD 3-clause \"New\" or \"Revised\" License"
+msgstr "BSD 3-пунктная лицензия \"Новая\" или \"Пересмотренная\""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2728
+#, no-wrap
+msgid "`BSD4CLAUSE`"
+msgstr "`BSD4CLAUSE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2729
+#, no-wrap
+msgid "BSD 4-clause \"Original\" or \"Old\" License"
+msgstr "BSD 4-пунктная лицензия \"Оригинальная\" или \"Старая\""
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2733
+#, no-wrap
+msgid "`BSL`"
+msgstr "`BSL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2734
+#, no-wrap
+msgid "Boost Software License"
+msgstr "Лицензия программного обеспечения Boost"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2738
+#, no-wrap
+msgid "`CC-BY-1.0`"
+msgstr "`CC-BY-1.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2739
+#, no-wrap
+msgid "Creative Commons Attribution 1.0"
+msgstr "Creative Commons с указанием авторства 1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2743
+#, no-wrap
+msgid "`CC-BY-2.0`"
+msgstr "`CC-BY-2.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2744
+#, no-wrap
+msgid "Creative Commons Attribution 2.0"
+msgstr "Creative Commons с указанием авторства 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2748
+#, no-wrap
+msgid "`CC-BY-2.5`"
+msgstr "`CC-BY-2.5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2749
+#, no-wrap
+msgid "Creative Commons Attribution 2.5"
+msgstr "Creative Commons с указанием авторства 2.5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2753
+#, no-wrap
+msgid "`CC-BY-3.0`"
+msgstr "`CC-BY-3.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2754
+#, no-wrap
+msgid "Creative Commons Attribution 3.0"
+msgstr "Creative Commons с указанием авторства 3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2758
+#, no-wrap
+msgid "`CC-BY-4.0`"
+msgstr "`CC-BY-4.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2759
+#, no-wrap
+msgid "Creative Commons Attribution 4.0"
+msgstr "Creative Commons с указанием авторства 4.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2763
+#, no-wrap
+msgid "`CC-BY-NC-1.0`"
+msgstr "`CC-BY-NC-1.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2764
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial 1.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая 1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2767
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2772
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2777
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2782
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2787
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2792
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2797
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2802
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2807
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2812
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2817
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2822
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2827
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2832
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2837
+#, no-wrap
+msgid "`dist-mirror``pkg-mirror``auto-accept`"
+msgstr "`dist-mirror``pkg-mirror``auto-accept`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2768
+#, no-wrap
+msgid "`CC-BY-NC-2.0`"
+msgstr "`CC-BY-NC-2.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2769
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial 2.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2773
+#, no-wrap
+msgid "`CC-BY-NC-2.5`"
+msgstr "`CC-BY-NC-2.5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2774
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial 2.5"
+msgstr "Creative Commons с указанием авторства – некоммерческая 2.5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2778
+#, no-wrap
+msgid "`CC-BY-NC-3.0`"
+msgstr "`CC-BY-NC-3.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2779
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial 3.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая 3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2783
+#, no-wrap
+msgid "`CC-BY-NC-4.0`"
+msgstr "`CC-BY-NC-4.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2784
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial 4.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая 4.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2788
+#, no-wrap
+msgid "`CC-BY-NC-ND-1.0`"
+msgstr "`CC-BY-NC-ND-1.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2789
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial No Derivatives 1.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая – без производных 1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2793
+#, no-wrap
+msgid "`CC-BY-NC-ND-2.0`"
+msgstr "`CC-BY-NC-ND-2.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2794
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial No Derivatives 2.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая – без производных 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2798
+#, no-wrap
+msgid "`CC-BY-NC-ND-2.5`"
+msgstr "`CC-BY-NC-ND-2.5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2799
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial No Derivatives 2.5"
+msgstr "Creative Commons с указанием авторства – некоммерческая – без производных 2.5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2803
+#, no-wrap
+msgid "`CC-BY-NC-ND-3.0`"
+msgstr "`CC-BY-NC-ND-3.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2804
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial No Derivatives 3.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая – без производных 3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2808
+#, no-wrap
+msgid "`CC-BY-NC-ND-4.0`"
+msgstr "`CC-BY-NC-ND-4.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2809
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial No Derivatives 4.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая – без производных 4.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2813
+#, no-wrap
+msgid "`CC-BY-NC-SA-1.0`"
+msgstr "`CC-BY-NC-SA-1.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2814
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial Share Alike 1.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая – на тех же условиях 1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2818
+#, no-wrap
+msgid "`CC-BY-NC-SA-2.0`"
+msgstr "`CC-BY-NC-SA-2.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2819
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial Share Alike 2.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая – на тех же условиях 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2823
+#, no-wrap
+msgid "`CC-BY-NC-SA-2.5`"
+msgstr "`CC-BY-NC-SA-2.5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2824
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial Share Alike 2.5"
+msgstr "Creative Commons с указанием авторства – некоммерческая – на тех же условиях 2.5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2828
+#, no-wrap
+msgid "`CC-BY-NC-SA-3.0`"
+msgstr "`CC-BY-NC-SA-3.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2829
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial Share Alike 3.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая – на тех же условиях 3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2833
+#, no-wrap
+msgid "`CC-BY-NC-SA-4.0`"
+msgstr "`CC-BY-NC-SA-4.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2834
+#, no-wrap
+msgid "Creative Commons Attribution Non Commercial Share Alike 4.0"
+msgstr "Creative Commons с указанием авторства – некоммерческая – на тех же условиях 4.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2838
+#, no-wrap
+msgid "`CC-BY-ND-1.0`"
+msgstr "`CC-BY-ND-1.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2839
+#, no-wrap
+msgid "Creative Commons Attribution No Derivatives 1.0"
+msgstr "Creative Commons с указанием авторства – без производных 1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2843
+#, no-wrap
+msgid "`CC-BY-ND-2.0`"
+msgstr "`CC-BY-ND-2.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2844
+#, no-wrap
+msgid "Creative Commons Attribution No Derivatives 2.0"
+msgstr "Creative Commons с указанием авторства – без производных 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2848
+#, no-wrap
+msgid "`CC-BY-ND-2.5`"
+msgstr "`CC-BY-ND-2.5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2849
+#, no-wrap
+msgid "Creative Commons Attribution No Derivatives 2.5"
+msgstr "Creative Commons с указанием авторства – без производных 2.5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2853
+#, no-wrap
+msgid "`CC-BY-ND-3.0`"
+msgstr "`CC-BY-ND-3.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2854
+#, no-wrap
+msgid "Creative Commons Attribution No Derivatives 3.0"
+msgstr "Creative Commons с указанием авторства – без производных 3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2858
+#, no-wrap
+msgid "`CC-BY-ND-4.0`"
+msgstr "`CC-BY-ND-4.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2859
+#, no-wrap
+msgid "Creative Commons Attribution No Derivatives 4.0"
+msgstr "Creative Commons с указанием авторства – без производных 4.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2863
+#, no-wrap
+msgid "`CC-BY-SA-1.0`"
+msgstr "`CC-BY-SA-1.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2864
+#, no-wrap
+msgid "Creative Commons Attribution Share Alike 1.0"
+msgstr "Creative Commons с указанием авторства – на тех же условиях 1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2868
+#, no-wrap
+msgid "`CC-BY-SA-2.0`"
+msgstr "`CC-BY-SA-2.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2869
+#, no-wrap
+msgid "Creative Commons Attribution Share Alike 2.0"
+msgstr "Creative Commons с указанием авторства – на тех же условиях 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2873
+#, no-wrap
+msgid "`CC-BY-SA-2.5`"
+msgstr "`CC-BY-SA-2.5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2874
+#, no-wrap
+msgid "Creative Commons Attribution Share Alike 2.5"
+msgstr "Creative Commons с указанием авторства – на тех же условиях 2.5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2878
+#, no-wrap
+msgid "`CC-BY-SA-3.0`"
+msgstr "`CC-BY-SA-3.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2879
+#, no-wrap
+msgid "Creative Commons Attribution Share Alike 3.0"
+msgstr "Creative Commons с указанием авторства – на тех же условиях 3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2883
+#, no-wrap
+msgid "`CC-BY-SA-4.0`"
+msgstr "`CC-BY-SA-4.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2884
+#, no-wrap
+msgid "Creative Commons Attribution Share Alike 4.0"
+msgstr "Creative Commons с указанием авторства – на тех же условиях 4.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2888
+#, no-wrap
+msgid "`CC0-1.0`"
+msgstr "`CC0-1.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2889
+#, no-wrap
+msgid "Creative Commons Zero v1.0 Universal"
+msgstr "Creative Commons Zero v1.0 Universal (Отказ от прав 1.0 Универсальная)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2890
+#, no-wrap
+msgid "`FSF GPL COPYFREE`"
+msgstr "`FSF GPL COPYFREE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2893
+#, no-wrap
+msgid "`CDDL`"
+msgstr "`CDDL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2894
+#, no-wrap
+msgid "Common Development and Distribution License"
+msgstr "Лицензия на совместную разработку и распространение"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2898
+#, no-wrap
+msgid "`CPAL-1.0`"
+msgstr "`CPAL-1.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2899
+#, no-wrap
+msgid "Common Public Attribution License"
+msgstr "Публичная лицензия общего распространения с указанием авторства"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2903
+#, no-wrap
+msgid "`ClArtistic`"
+msgstr "`ClArtistic`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2904
+#, no-wrap
+msgid "Clarified Artistic License"
+msgstr "Уточнённая художественная лицензия"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2908
+#, no-wrap
+msgid "`EPL`"
+msgstr "`EPL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2909
+#, no-wrap
+msgid "Eclipse Public License"
+msgstr "Публичная лицензия Eclipse"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2913
+#, no-wrap
+msgid "`GFDL`"
+msgstr "`GFDL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2914
+#, no-wrap
+msgid "GNU Free Documentation License"
+msgstr "GNU Свободная лицензия на документацию"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2918
+#, no-wrap
+msgid "`GMGPL`"
+msgstr "`GMGPL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2919
+#, no-wrap
+msgid "GNAT Modified General Public License"
+msgstr "Модифицированная Общедоступная лицензия GNAT"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2923
+#, no-wrap
+msgid "`GPLv1`"
+msgstr "`GPLv1`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2924
+#, no-wrap
+msgid "GNU General Public License version 1"
+msgstr "Универсальная общественная лицензия GNU версии 1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2928
+#, no-wrap
+msgid "`GPLv1+`"
+msgstr "`GPLv1+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2929
+#, no-wrap
+msgid "GNU General Public License version 1 (or later)"
+msgstr "Универсальная общественная лицензия GNU версии 1 (или более поздняя)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2933
+#, no-wrap
+msgid "`GPLv2`"
+msgstr "`GPLv2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2934
+#, no-wrap
+msgid "GNU General Public License version 2"
+msgstr "Универсальная общественная лицензия GNU версии 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2938
+#, no-wrap
+msgid "`GPLv2+`"
+msgstr "`GPLv2+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2939
+#, no-wrap
+msgid "GNU General Public License version 2 (or later)"
+msgstr "Универсальная общественная лицензия GNU версии 2 (или более поздняя)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2943
+#, no-wrap
+msgid "`GPLv3`"
+msgstr "`GPLv3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2944
+#, no-wrap
+msgid "GNU General Public License version 3"
+msgstr "Универсальная общественная лицензия GNU версии 3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2948
+#, no-wrap
+msgid "`GPLv3+`"
+msgstr "`GPLv3+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2949
+#, no-wrap
+msgid "GNU General Public License version 3 (or later)"
+msgstr "Универсальная общественная лицензия GNU версии 3 (или более поздняя)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2953
+#, no-wrap
+msgid "`GPLv3RLE`"
+msgstr "`GPLv3RLE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2954
+#, no-wrap
+msgid "GNU GPL version 3 Runtime Library Exception"
+msgstr "Исключение для библиотеки времени выполнения GNU GPL версии 3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2958
+#, no-wrap
+msgid "`GPLv3RLE+`"
+msgstr "`GPLv3RLE+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2959
+#, no-wrap
+msgid "GNU GPL version 3 Runtime Library Exception (or later)"
+msgstr "Исключение для библиотеки времени выполнения GNU GPL версии 3 (или более поздняя)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2963
+#, no-wrap
+msgid "`ISCL`"
+msgstr "`ISCL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2964
+#, no-wrap
+msgid "Internet Systems Consortium License"
+msgstr "Лицензия Internet Systems Consortium"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2965
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3110
+#, no-wrap
+msgid "`FSF GPL OSI COPYFREE`"
+msgstr "`FSF GPL OSI COPYFREE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2968
+#, no-wrap
+msgid "`LGPL20`"
+msgstr "`LGPL20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2969
+#, no-wrap
+msgid "GNU Library General Public License version 2.0"
+msgstr "Общедоступная лицензия GNU для библиотек, версия 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2973
+#, no-wrap
+msgid "`LGPL20+`"
+msgstr "`LGPL20+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2974
+#, no-wrap
+msgid "GNU Library General Public License version 2.0 (or later)"
+msgstr "Общедоступная лицензия GNU для библиотек, версия 2.0 (или более поздняя)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2978
+#, no-wrap
+msgid "`LGPL21`"
+msgstr "`LGPL21`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2979
+#, no-wrap
+msgid "GNU Lesser General Public License version 2.1"
+msgstr "Универсальная общественная лицензия GNU ограниченного применения, версия 2.1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2983
+#, no-wrap
+msgid "`LGPL21+`"
+msgstr "`LGPL21+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2984
+#, no-wrap
+msgid "GNU Lesser General Public License version 2.1 (or later)"
+msgstr "Универсальная общественная лицензия GNU ограниченного применения, версия 2.1 (или более поздняя)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2988
+#, no-wrap
+msgid "`LGPL3`"
+msgstr "`LGPL3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2989
+#, no-wrap
+msgid "GNU Lesser General Public License version 3"
+msgstr "Универсальная общественная лицензия GNU ограниченного применения, версия 3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2993
+#, no-wrap
+msgid "`LGPL3+`"
+msgstr "`LGPL3+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2994
+#, no-wrap
+msgid "GNU Lesser General Public License version 3 (or later)"
+msgstr "Универсальная общественная лицензия GNU ограниченного применения, версия 3 (или более поздней)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2998
+#, no-wrap
+msgid "`LPPL10`"
+msgstr "`LPPL10`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:2999
+#, no-wrap
+msgid "LaTeX Project Public License version 1.0"
+msgstr "Публичная лицензия проекта LaTeX, версия 1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3002
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3007
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3012
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3017
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3022
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3027
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3032
+#, no-wrap
+msgid "`dist-mirror dist-sell`"
+msgstr "`dist-mirror dist-sell`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3003
+#, no-wrap
+msgid "`LPPL11`"
+msgstr "`LPPL11`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3004
+#, no-wrap
+msgid "LaTeX Project Public License version 1.1"
+msgstr "Публичная лицензия проекта LaTeX, версия 1.1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3008
+#, no-wrap
+msgid "`LPPL12`"
+msgstr "`LPPL12`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3009
+#, no-wrap
+msgid "LaTeX Project Public License version 1.2"
+msgstr "Публичная лицензия проекта LaTeX, версия 1.2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3013
+#, no-wrap
+msgid "`LPPL13`"
+msgstr "`LPPL13`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3014
+#, no-wrap
+msgid "LaTeX Project Public License version 1.3"
+msgstr "Публичная лицензия проекта LaTeX, версия 1.3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3018
+#, no-wrap
+msgid "`LPPL13a`"
+msgstr "`LPPL13a`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3019
+#, no-wrap
+msgid "LaTeX Project Public License version 1.3a"
+msgstr "Публичная лицензия проекта LaTeX, версия 1.3a"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3023
+#, no-wrap
+msgid "`LPPL13b`"
+msgstr "`LPPL13b`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3024
+#, no-wrap
+msgid "LaTeX Project Public License version 1.3b"
+msgstr "Публичная лицензия проекта LaTeX, версия 1.3b"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3028
+#, no-wrap
+msgid "`LPPL13c`"
+msgstr "`LPPL13c`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3029
+#, no-wrap
+msgid "LaTeX Project Public License version 1.3c"
+msgstr "Публичная лицензия проекта LaTeX, версия 1.3c"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3033
+#, no-wrap
+msgid "`MIT`"
+msgstr "`MIT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3034
+#, no-wrap
+msgid "MIT license / X11 license"
+msgstr "Лицензия MIT / Лицензия X11"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3035
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3055
+#, no-wrap
+msgid "`COPYFREE FSF GPL OSI`"
+msgstr "`COPYFREE FSF GPL OSI`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3038
+#, no-wrap
+msgid "`MPL10`"
+msgstr "`MPL10`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3039
+#, no-wrap
+msgid "Mozilla Public License version 1.0"
+msgstr "Публичная лицензия Mozilla, версия 1.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3043
+#, no-wrap
+msgid "`MPL11`"
+msgstr "`MPL11`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3044
+#, no-wrap
+msgid "Mozilla Public License version 1.1"
+msgstr "Публичная лицензия Mozilla, версия 1.1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3048
+#, no-wrap
+msgid "`MPL20`"
+msgstr "`MPL20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3049
+#, no-wrap
+msgid "Mozilla Public License version 2.0"
+msgstr "Публичная лицензия Mozilla, версия 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3053
+#, no-wrap
+msgid "`NCSA`"
+msgstr "`NCSA`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3054
+#, no-wrap
+msgid "University of Illinois/NCSA Open Source License"
+msgstr "Открытая лицензия Университета Иллинойса/NCSA"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3058
+#, no-wrap
+msgid "`NONE`"
+msgstr "`NONE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3059
+#, no-wrap
+msgid "No license specified"
+msgstr "Лицензия не указана"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3062
+#, no-wrap
+msgid "`none`"
+msgstr "`none`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3063
+#, no-wrap
+msgid "`OFL10`"
+msgstr "`OFL10`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3064
+#, no-wrap
+msgid "SIL Open Font License version 1.0 (https://scripts.sil.org/OFL/)"
+msgstr "Лицензия SIL Open Font версия 1.0 (https://scripts.sil.org/OFL/)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3065
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3070
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3280
+#, no-wrap
+msgid "`FONTS`"
+msgstr "`FONTS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3068
+#, no-wrap
+msgid "`OFL11`"
+msgstr "`OFL11`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3069
+#, no-wrap
+msgid "SIL Open Font License version 1.1 (https://scripts.sil.org/OFL/)"
+msgstr "Лицензия SIL Open Font версия 1.1 (https://scripts.sil.org/OFL/)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3073
+#, no-wrap
+msgid "`OWL`"
+msgstr "`OWL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3074
+#, no-wrap
+msgid "Open Works License (owl.apotheon.org)"
+msgstr "Лицензия Открытых Произведений (owl.apotheon.org)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3075
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3276
+#, no-wrap
+msgid "`COPYFREE`"
+msgstr "`COPYFREE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3078
+#, no-wrap
+msgid "`OpenSSL`"
+msgstr "`OpenSSL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3079
+#, no-wrap
+msgid "OpenSSL License"
+msgstr "Лицензия OpenSSL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3083
+#, no-wrap
+msgid "`PD`"
+msgstr "`PD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3084
+#, no-wrap
+msgid "Public Domain"
+msgstr "Общественное достояние"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3085
+#, no-wrap
+msgid "`GPL COPYFREE`"
+msgstr "`GPL COPYFREE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3088
+#, no-wrap
+msgid "`PHP202`"
+msgstr "`PHP202`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3089
+#, no-wrap
+msgid "PHP License version 2.02"
+msgstr "Лицензия PHP версии 2.02"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3093
+#, no-wrap
+msgid "`PHP30`"
+msgstr "`PHP30`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3094
+#, no-wrap
+msgid "PHP License version 3.0"
+msgstr "Лицензия PHP версии 3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3098
+#, no-wrap
+msgid "`PHP301`"
+msgstr "`PHP301`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3099
+#, no-wrap
+msgid "PHP License version 3.01"
+msgstr "Лицензия PHP версии 3.01"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3103
+#, no-wrap
+msgid "`PSFL`"
+msgstr "`PSFL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3104
+#, no-wrap
+msgid "Python Software Foundation License"
+msgstr "Лицензия Python Software Foundation"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3108
+#, no-wrap
+msgid "`PostgreSQL`"
+msgstr "`PostgreSQL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3109
+#, no-wrap
+msgid "PostgreSQL License"
+msgstr "Лицензия PostgreSQL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3113
+#, no-wrap
+msgid "`RUBY`"
+msgstr "`RUBY`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3114
+#, no-wrap
+msgid "Ruby License"
+msgstr "Лицензия Ruby"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3118
+#, no-wrap
+msgid "`UNLICENSE`"
+msgstr "`UNLICENSE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3119
+#, no-wrap
+msgid "The Unlicense"
+msgstr "Отказ от лицензии (The Unlicense)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3120
+#, no-wrap
+msgid "`COPYFREE FSF GPL`"
+msgstr "`COPYFREE FSF GPL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3123
+#, no-wrap
+msgid "`WTFPL`"
+msgstr "`WTFPL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3124
+#, no-wrap
+msgid "Do What the Fuck You Want To Public License version 2"
+msgstr "Публичная лицензия \"Делай что хочешь\" версия 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3125
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3130
+#, no-wrap
+msgid "`GPL FSF COPYFREE`"
+msgstr "`GPL FSF COPYFREE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3128
+#, no-wrap
+msgid "`WTFPL1`"
+msgstr "`WTFPL1`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3129
+#, no-wrap
+msgid "Do What the Fuck You Want To Public License version 1"
+msgstr "Публичная лицензия \"Делай что хочешь\" версия 1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3133
+#, no-wrap
+msgid "`ZLIB`"
+msgstr "`ZLIB`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3134
+#, no-wrap
+msgid "zlib License"
+msgstr "Лицензия zlib"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3135
+#, no-wrap
+msgid "`GPL FSF OSI`"
+msgstr "`GPL FSF OSI`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3138
+#, no-wrap
+msgid "`ZPL21`"
+msgstr "`ZPL21`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3139
+#, no-wrap
+msgid "Zope Public License version 2.1"
+msgstr "Публичная лицензия Zope версия 2.1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3140
+#, no-wrap
+msgid "`GPL OSI`"
+msgstr "`GPL OSI`"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3144
+#, no-wrap
+msgid "`LICENSE_PERMS` and `LICENSE_PERMS_NAME_`"
+msgstr "`LICENSE_PERMS` и `LICENSE_PERMS_NAME_`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3147
+msgid "Permissions. use `none` if empty."
+msgstr "Разрешения. Используйте `none`, если пусто."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3148
+#, no-wrap
+msgid "License Permissions List"
+msgstr "Список разрешений лицензии"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3150
+#, no-wrap
+msgid "`dist-mirror`"
+msgstr "`dist-mirror`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3153
+msgid ""
+"Redistribution of the distribution files is permitted. The distribution "
+"files will be added to the FreeBSD `MASTER_SITE_BACKUP` CDN."
+msgstr ""
+"Разрешается распространение дистрибутивных файлов. Дистрибутивные файлы "
+"будут добавлены в CDN `MASTER_SITE_BACKUP` FreeBSD."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3155
+#, no-wrap
+msgid "`no-dist-mirror`"
+msgstr "`no-dist-mirror`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3159
+msgid ""
+"Redistribution of the distribution files is prohibited. This is equivalent "
+"to setting crossref:special[porting-restrictions-restricted,`RESTRICTED`]. "
+"The distribution files will _not_ be added to the FreeBSD "
+"`MASTER_SITE_BACKUP` CDN."
+msgstr ""
+"Распространение дистрибутивных файлов запрещено. Это эквивалентно установке "
+"crossref:special[porting-restrictions-restricted,`RESTRICTED`]. "
+"Дистрибутивные файлы _не_ будут добавлены в CDN `MASTER_SITE_BACKUP` FreeBSD."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3161
+#, no-wrap
+msgid "`dist-sell`"
+msgstr "`dist-sell`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3164
+msgid ""
+"Selling of distribution files is permitted. The distribution files will be "
+"present on the installer images."
+msgstr ""
+"Продажа файлов дистрибутива разрешена. Файлы дистрибутива будут "
+"присутствовать на образах установщика."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3166
+#, no-wrap
+msgid "`no-dist-sell`"
+msgstr "`no-dist-sell`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3169
+msgid ""
+"Selling of distribution files is prohibited. This is equivalent to setting "
+"crossref:special[porting-restrictions-no_cdrom,`NO_CDROM`]."
+msgstr ""
+"Продажа файлов дистрибутива запрещена. Это эквивалентно установке "
+"crossref:special[porting-restrictions-no_cdrom,`NO_CDROM`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3171
+#, no-wrap
+msgid "`pkg-mirror`"
+msgstr "`pkg-mirror`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3174
+msgid ""
+"Free redistribution of package is permitted. The package will be "
+"distributed on the FreeBSD package CDN https://pkg.freebsd.org/[https://"
+"pkg.freebsd.org/]."
+msgstr ""
+"Свободное распространение пакета разрешено. Пакет будет распространяться "
+"через CDN пакетов FreeBSD https://pkg.freebsd.org/[https://pkg.freebsd.org/]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3176
+#, no-wrap
+msgid "`no-pkg-mirror`"
+msgstr "`no-pkg-mirror`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3180
+msgid ""
+"Free redistribution of package is prohibited. Equivalent to setting "
+"crossref:special[porting-restrictions-no_package,`NO_PACKAGE`]. The package "
+"will _not_ be distributed from the FreeBSD package CDN https://"
+"pkg.freebsd.org/[https://pkg.freebsd.org/]."
+msgstr ""
+"Свободное распространение пакета запрещено. Эквивалентно установке "
+"crossref:special[porting-restrictions-no_package,`NO_PACKAGE`]. Пакет _не_ "
+"будет распространяться через FreeBSD CDN для пакетов https://pkg.freebsd.org/"
+"[https://pkg.freebsd.org/]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3182
+#, no-wrap
+msgid "`pkg-sell`"
+msgstr "`pkg-sell`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3185
+msgid ""
+"Selling of package is permitted. The package will be present on the "
+"installer images."
+msgstr ""
+"Продажа пакета разрешена. Пакет будет присутствовать на образах установщика."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3187
+#, no-wrap
+msgid "`no-pkg-sell`"
+msgstr "`no-pkg-sell`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3191
+msgid ""
+"Selling of package is prohibited. This is equivalent to setting "
+"crossref:special[porting-restrictions-no_cdrom,`NO_CDROM`]. The package "
+"will _not_ be present on the installer images."
+msgstr ""
+"Продажа пакета запрещена. Это эквивалентно установке "
+"crossref:special[porting-restrictions-no_cdrom,`NO_CDROM`]. Пакет _не_ будет "
+"присутствовать на образах установщика."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3193
+#, no-wrap
+msgid "`auto-accept`"
+msgstr "`auto-accept`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3197
+msgid ""
+"License is accepted by default. Prompts to accept a license are not "
+"displayed unless the user has defined `LICENSES_ASK`. Use this unless the "
+"license states the user must accept the terms of the license."
+msgstr ""
+"Лицензия принимается по умолчанию. Запросы на принятие лицензии не "
+"отображаются, если пользователь не определил `LICENSES_ASK`. Используйте "
+"это, если в лицензии не указано, что пользователь должен принять условия "
+"лицензии."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3199
+#, no-wrap
+msgid "`no-auto-accept`"
+msgstr "`no-auto-accept`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3203
+msgid ""
+"License is not accepted by default. The user will always be asked to "
+"confirm the acceptance of this license. This must be used if the license "
+"states that the user must accept its terms."
+msgstr ""
+"Лицензия не принимается по умолчанию. Пользователь всегда будет запрошен на "
+"подтверждение принятия данной лицензии. Это должно использоваться, если "
+"лицензия требует, чтобы пользователь принял её условия."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3205
+msgid ""
+"When both `_permission_` and `no-_permission_` is present the `no-"
+"_permission_` will cancel `_permission_`."
+msgstr ""
+"Когда присутствуют и `_permission_`, и `no-_permission_`, то `no-"
+"_permission_` отменяет `_permission_`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3207
+msgid ""
+"When `_permission_` is not present, it is considered to be a `no-"
+"_permission_`."
+msgstr "Когда `_permission_` отсутствует, это считается как `no-_permission_`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3211
+msgid ""
+"Some missing permissions will prevent a port (and all ports depending on it) "
+"from being usable by package users:"
+msgstr ""
+"Некоторые отсутствующие разрешения могут сделать порт (и все зависящие от "
+"него порты) непригодными для использования пользователями пакетов:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3213
+msgid ""
+"A port without the `auto-accept` permission will never be be built and all "
+"the ports depending on it will be ignored."
+msgstr ""
+"Порт без разрешения `auto-accept` никогда не будет собран, и все зависящие "
+"от него порты будут проигнорированы."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3215
+msgid ""
+"A port without the `pkg-mirror` permission, and any ports that depend on it, "
+"will be removed after the build, thus ensuring they are not distributed."
+msgstr ""
+"Порт без разрешения `pkg-mirror`, а также любые порты, зависящие от него, "
+"будут удалены после сборки, что гарантирует их отсутствие в дистрибуции."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3218
+#, no-wrap
+msgid "Nonstandard License"
+msgstr "Нестандартная лицензия"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3222
+msgid ""
+"Read the terms of the license and translate those using the available "
+"permissions."
+msgstr ""
+"Прочитайте условия лицензии и переведите их, используя доступные разрешения."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3230
+#, no-wrap
+msgid ""
+"LICENSE= UNKNOWN\n"
+"LICENSE_NAME= unknown\n"
+"LICENSE_TEXT= This program is NOT in public domain.\\\n"
+" It can be freely distributed for non-commercial purposes only.\n"
+"LICENSE_PERMS= dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept\n"
+msgstr ""
+"LICENSE= UNKNOWN\n"
+"LICENSE_NAME= unknown\n"
+"LICENSE_TEXT= This program is NOT in public domain.\\\n"
+" It can be freely distributed for non-commercial purposes only.\n"
+"LICENSE_PERMS= dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3235
+#, no-wrap
+msgid "Standard and Nonstandard Licenses"
+msgstr "Стандартные и нестандартные лицензии"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3241
+msgid ""
+"Read the terms of the license and express those using the available "
+"permissions. In case of doubt, please ask for guidance on the {freebsd-"
+"ports}."
+msgstr ""
+"Прочитайте условия лицензии и укажите их, используя доступные разрешения. В "
+"случае сомнений обратитесь за разъяснениями на {freebsd-ports}."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3249
+#, no-wrap
+msgid ""
+"LICENSE= WARSOW GPLv2\n"
+"LICENSE_COMB= multi\n"
+"LICENSE_NAME_WARSOW= Warsow Content License\n"
+"LICENSE_FILE_WARSOW= ${WRKSRC}/docs/license.txt\n"
+"LICENSE_PERMS_WARSOW= dist-mirror pkg-mirror auto-accept\n"
+msgstr ""
+"LICENSE= WARSOW GPLv2\n"
+"LICENSE_COMB= multi\n"
+"LICENSE_NAME_WARSOW= Warsow Content License\n"
+"LICENSE_FILE_WARSOW= ${WRKSRC}/docs/license.txt\n"
+"LICENSE_PERMS_WARSOW= dist-mirror pkg-mirror auto-accept\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3255
+msgid ""
+"When the permissions of the GPLv2 and the UNKNOWN licenses are mixed, the "
+"port ends up with `dist-mirror dist-sell pkg-mirror pkg-sell auto-accept "
+"dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept`. The `no-"
+"_permissions_` cancel the _permissions_. The resulting list of permissions "
+"are _dist-mirror pkg-mirror auto-accept_. The distribution files and the "
+"packages will not be available on the installer images."
+msgstr ""
+"Когда разрешения лицензий GPLv2 и UNKNOWN смешиваются, порт получает `dist-"
+"mirror dist-sell pkg-mirror pkg-sell auto-accept dist-mirror no-dist-sell "
+"pkg-mirror no-pkg-sell auto-accept`. Опции `no-_разрешения_` отменяют "
+"соответствующие _разрешения_. Итоговый список разрешений: _dist-mirror pkg-"
+"mirror auto-accept_. Файлы дистрибутива и пакеты не будут доступны в образах "
+"установщика."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3258
+#, no-wrap
+msgid "`LICENSE_GROUPS` and `LICENSE_GROUPS_NAME`"
+msgstr "`LICENSE_GROUPS` и `LICENSE_GROUPS_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3261
+msgid "Groups the license belongs."
+msgstr "Группы, к которым принадлежит лицензия."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3262
+#, no-wrap
+msgid "Predefined License Groups List"
+msgstr "Список предопределенных групп лицензий"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3266
+msgid ""
+"Free Software Foundation Approved, see the https://www.fsf.org/licensing/"
+"[FSF Licensing & Compliance Team]."
+msgstr ""
+"Одобрено Free Software Foundation, см. https://www.fsf.org/licensing/"
+"[Команда по лицензированию и соответствию FSF]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3268
+#, no-wrap
+msgid "`GPL`"
+msgstr "`GPL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3270
+msgid "GPL Compatible"
+msgstr "Совместимые с GPL"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3274
+msgid ""
+"OSI Approved, see the Open Source Initiative https://opensource.org/licenses/"
+"[Open Source Licenses] page."
+msgstr ""
+"Одобрено OSI, см. страницу https://opensource.org/licenses/[Открытых "
+"лицензий]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3278
+msgid ""
+"Comply with Copyfree Standard Definition, see the https://copyfree.org/"
+"standard/licenses/[Copyfree Licenses] page."
+msgstr ""
+"Соответствует определению стандарта Copyfree, см. страницу https://"
+"copyfree.org/standard/licenses/[лицензий Copyfree]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3282
+msgid "Font licenses"
+msgstr "Лицензии на шрифты"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3284
+#, no-wrap
+msgid "`LICENSE_NAME` and `LICENSE_NAME_NAME`"
+msgstr "`LICENSE_NAME` и `LICENSE_NAME_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3287
+msgid "Full name of the license."
+msgstr "Полное название лицензии."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3289
+#, no-wrap
+msgid "`LICENSE_NAME`"
+msgstr "`LICENSE_NAME`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3299
+#, no-wrap
+msgid ""
+"LICENSE= UNRAR\n"
+"LICENSE_NAME= UnRAR License\n"
+"LICENSE_FILE= ${WRKSRC}/license.txt\n"
+"LICENSE_PERMS= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept\n"
+msgstr ""
+"LICENSE= UNRAR\n"
+"LICENSE_NAME= UnRAR License\n"
+"LICENSE_FILE= ${WRKSRC}/license.txt\n"
+"LICENSE_PERMS= dist-mirror dist-sell pkg-mirror pkg-sell auto-accept\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3304
+#, no-wrap
+msgid "`LICENSE_FILE` and `LICENSE_FILE_NAME`"
+msgstr "`LICENSE_FILE` и `LICENSE_FILE_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3309
+msgid ""
+"Full path to the file containing the license text, usually [.filename]#$"
+"{WRKSRC}/some/file#. If the file is not in the distfile, and its content is "
+"too long to be put in crossref:makefiles[licenses-"
+"license_text,`LICENSE_TEXT`], put it in a new file in [.filename]#${FILESDIR}"
+"#."
+msgstr ""
+"Полный путь к файлу, содержащему текст лицензии, обычно [.filename]#$"
+"{WRKSRC}/some/file#. Если файл отсутствует в дистрибутиве, а его содержимое "
+"слишком длинное для размещения в crossref:makefiles[licenses-"
+"license_text,`LICENSE_TEXT`], поместите его в новый файл в [.filename]#$"
+"{FILESDIR}#."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3311
+#, no-wrap
+msgid "`LICENSE_FILE`"
+msgstr "`LICENSE_FILE`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3319
+#, no-wrap
+msgid ""
+"LICENSE=\tGPLv3+\n"
+"LICENSE_FILE=\t${WRKSRC}/COPYING\n"
+msgstr ""
+"LICENSE=\tGPLv3+\n"
+"LICENSE_FILE=\t${WRKSRC}/COPYING\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3324
+#, no-wrap
+msgid "`LICENSE_TEXT` and `LICENSE_TEXT_NAME`"
+msgstr "`LICENSE_TEXT` и `LICENSE_TEXT_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3328
+msgid ""
+"Text to use as a license. Useful when the license is not in the "
+"distribution files and its text is short."
+msgstr ""
+"Текст для использования в качестве лицензии. Полезно, когда лицензия "
+"отсутствует в файлах дистрибутива и её текст краток."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3330
+#, no-wrap
+msgid "`LICENSE_TEXT`"
+msgstr "`LICENSE_TEXT`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3341
+#, no-wrap
+msgid ""
+"LICENSE= UNKNOWN\n"
+"LICENSE_NAME= unknown\n"
+"LICENSE_TEXT= This program is NOT in public domain.\\\n"
+" It can be freely distributed for non-commercial purposes only,\\\n"
+" and THERE IS NO WARRANTY FOR THIS PROGRAM.\n"
+"LICENSE_PERMS= dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept\n"
+msgstr ""
+"LICENSE= UNKNOWN\n"
+"LICENSE_NAME= unknown\n"
+"LICENSE_TEXT= This program is NOT in public domain.\\\n"
+" It can be freely distributed for non-commercial purposes only,\\\n"
+" and THERE IS NO WARRANTY FOR THIS PROGRAM.\n"
+"LICENSE_PERMS= dist-mirror no-dist-sell pkg-mirror no-pkg-sell auto-accept\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3346
+#, no-wrap
+msgid "`LICENSE_DISTFILES` and `LICENSE_DISTFILES_NAME`"
+msgstr "`LICENSE_DISTFILES` и `LICENSE_DISTFILES_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3350
+msgid ""
+"The distribution files to which the licenses apply. Defaults to all the "
+"distribution files."
+msgstr ""
+"Файлы дистрибутива, к которым применяются лицензии. По умолчанию — все файлы "
+"дистрибутива."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3352
+#, no-wrap
+msgid "`LICENSE_DISTFILES`"
+msgstr "`LICENSE_DISTFILES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3357
+msgid ""
+"Used when the distribution files do not all have the same license. For "
+"example, one has a code license, and another has some artwork that cannot be "
+"redistributed:"
+msgstr ""
+"Используется, когда файлы дистрибутива имеют разные лицензии. Например, один "
+"файл имеет лицензию на код, а другой содержит некоторые произведения "
+"искусства, которые нельзя распространять:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3362
+#, no-wrap
+msgid ""
+"MASTER_SITES= SF/some-game\n"
+"DISTFILES= ${DISTNAME}${EXTRACT_SUFX} artwork.zip\n"
+msgstr ""
+"MASTER_SITES= SF/some-game\n"
+"DISTFILES= ${DISTNAME}${EXTRACT_SUFX} artwork.zip\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3370
+#, no-wrap
+msgid ""
+"LICENSE= BSD3CLAUSE ARTWORK\n"
+"LICENSE_COMB= dual\n"
+"LICENSE_NAME_ARTWORK= The game artwork license\n"
+"LICENSE_TEXT_ARTWORK= The README says that the files cannot be redistributed\n"
+"LICENSE_PERMS_ARTWORK= pkg-mirror pkg-sell auto-accept\n"
+"LICENSE_DISTFILES_BSD3CLAUSE= ${DISTNAME}${EXTRACT_SUFX}\n"
+"LICENSE_DISTFILES_ARTWORK= artwork.zip\n"
+msgstr ""
+"LICENSE= BSD3CLAUSE ARTWORK\n"
+"LICENSE_COMB= dual\n"
+"LICENSE_NAME_ARTWORK= The game artwork license\n"
+"LICENSE_TEXT_ARTWORK= The README says that the files cannot be redistributed\n"
+"LICENSE_PERMS_ARTWORK= pkg-mirror pkg-sell auto-accept\n"
+"LICENSE_DISTFILES_BSD3CLAUSE= ${DISTNAME}${EXTRACT_SUFX}\n"
+"LICENSE_DISTFILES_ARTWORK= artwork.zip\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3375
+#, no-wrap
+msgid "`LICENSE_COMB`"
+msgstr "`LICENSE_COMB`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3380
+msgid ""
+"Set to `multi` if all licenses apply. Set to `dual` if any license "
+"applies. Defaults to `single`."
+msgstr ""
+"Установите значение `multi`, если применяются все лицензии. Установите "
+"значение `dual`, если применяется любая из лицензий. По умолчанию "
+"используется значение `single`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3382
+#, no-wrap
+msgid "Dual Licenses"
+msgstr "Двойные лицензии"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3389
+msgid ""
+"When a port says \"This software may be distributed under the GNU General "
+"Public License or the Artistic License\", it means that either license can "
+"be used. Use this:"
+msgstr ""
+"Когда порт содержит указание «Это программное обеспечение может "
+"распространяться под GNU General Public License или Artistic License», это "
+"означает, что можно использовать любую из этих лицензий. Используйте "
+"следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3394
+#, no-wrap
+msgid ""
+"LICENSE=\tART10 GPLv1\n"
+"LICENSE_COMB= dual\n"
+msgstr ""
+"LICENSE=\tART10 GPLv1\n"
+"LICENSE_COMB= dual\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3397
+msgid "If license files are provided, use this:"
+msgstr "Если предоставлены файлы лицензий, используйте это:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3404
+#, no-wrap
+msgid ""
+"LICENSE=\tART10 GPLv1\n"
+"LICENSE_COMB= dual\n"
+"LICENSE_FILE_ART10= ${WRKSRC}/Artistic\n"
+"LICENSE_FILE_GPLv1= ${WRKSRC}/Copying\n"
+msgstr ""
+"LICENSE=\tART10 GPLv1\n"
+"LICENSE_COMB= dual\n"
+"LICENSE_FILE_ART10= ${WRKSRC}/Artistic\n"
+"LICENSE_FILE_GPLv1= ${WRKSRC}/Copying\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3409
+#, no-wrap
+msgid "Multiple Licenses"
+msgstr "Множественные лицензии"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3414
+msgid ""
+"When part of a port has one license, and another part has a different "
+"license, use `multi`:"
+msgstr ""
+"Если часть порта имеет одну лицензию, а другая часть — другую, используйте "
+"`multi`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3419
+#, no-wrap
+msgid ""
+"LICENSE=\tGPLv2 LGPL21+\n"
+"LICENSE_COMB=\tmulti\n"
+msgstr ""
+"LICENSE=\tGPLv2 LGPL21+\n"
+"LICENSE_COMB=\tmulti\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3424
+#, no-wrap
+msgid "`PORTSCOUT`"
+msgstr "`PORTSCOUT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3427
+msgid ""
+"Portscout is an automated distfile check utility for the FreeBSD Ports "
+"Collection, described in detail in crossref:keeping-up[distfile-"
+"survey,Portscout: the FreeBSD Ports Distfile Scanner]."
+msgstr ""
+"Portscout — это автоматизированная утилита проверки distfile для Коллекции "
+"портов FreeBSD, подробно описанная в crossref:keeping-up[distfile-"
+"survey,Portscout: сканирование distfile портов FreeBSD]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3429
+msgid ""
+"`PORTSCOUT` defines special conditions within which the Portscout distfile "
+"scanner is restricted."
+msgstr ""
+"`PORTSCOUT` определяет специальные условия, в рамках которых работа сканера "
+"дистрибутивных файлов Portscout ограничена."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3431
+msgid "Situations where `PORTSCOUT` is set include:"
+msgstr "Ситуации, когда установлена переменная `PORTSCOUT`, включают:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3433
+msgid ""
+"When distfiles have to be ignored for specific versions. For example, to "
+"exclude version _8.2_ and version _8.3_ from distfile version checks because "
+"they are known to be broken, add:"
+msgstr ""
+"Когда необходимо игнорировать distfiles для определённых версий. Например, "
+"чтобы исключить версию _8.2_ и версию _8.3_ из проверок версий distfiles, "
+"так как известно, что они неработоспособны, добавьте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3437
+#, no-wrap
+msgid "PORTSCOUT=\tskipv:8.2,8.3\n"
+msgstr "PORTSCOUT=\tskipv:8.2,8.3\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3440
+msgid ""
+"When distfile version checks have to be disabled completely. For example, if "
+"a port is not going to be updated ever again, add:"
+msgstr ""
+"Когда проверки версий distfile необходимо полностью отключить. Например, "
+"если порт больше не будет обновляться, добавьте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3444
+#, no-wrap
+msgid "PORTSCOUT=\tignore:1\n"
+msgstr "PORTSCOUT=\tignore:1\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3447
+msgid ""
+"When specific versions or specific major and minor revisions of a distfile "
+"must be checked. For example, if only version _0.6.4_ must be monitored "
+"because newer versions have compatibility issues with FreeBSD, add:"
+msgstr ""
+"Когда необходимо проверять конкретные версии или определенные мажорные и "
+"минорные редакции distfile. Например, если нужно отслеживать только версию "
+"_0.6.4_, потому что более новые версии имеют проблемы совместимости с "
+"FreeBSD, добавьте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3451
+#, no-wrap
+msgid "PORTSCOUT=\tlimit:^0\\.6\\.4\n"
+msgstr "PORTSCOUT=\tlimit:^0\\.6\\.4\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3454
+msgid ""
+"When URLs listing the available versions differ from the download URLs. For "
+"example, to limit distfile version checks to the download page for the "
+"package:databases/pgtune[] port, add:"
+msgstr ""
+"Когда URL-адреса, перечисляющие доступные версии, отличаются от URL-адресов "
+"загрузки. Например, чтобы ограничить проверку версий distfile страницей "
+"загрузки для пакета: package:databases/pgtune[] добавьте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3458
+#, no-wrap
+msgid "PORTSCOUT=\tsite:http://www.renpy.org/dl/release/\n"
+msgstr "PORTSCOUT=\tsite:http://www.renpy.org/dl/release/\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3461
+#, no-wrap
+msgid "Dependencies"
+msgstr "Зависимости"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3468
+msgid ""
+"Many ports depend on other ports. This is a very convenient feature of most "
+"Unix-like operating systems, including FreeBSD. Multiple ports can share a "
+"common dependency, rather than bundling that dependency with every port or "
+"package that needs it. There are seven variables that can be used to ensure "
+"that all the required bits will be on the user's machine. There are also "
+"some pre-supported dependency variables for common cases, plus a few more to "
+"control the behavior of dependencies."
+msgstr ""
+"Многие порты зависят от других портов. Это очень удобная особенность "
+"большинства Unix-подобных операционных систем, включая FreeBSD. Несколько "
+"портов могут использовать общую зависимость вместо того, чтобы включать эту "
+"зависимость в каждый порт или пакет, который в ней нуждается. Существует "
+"семь переменных, которые можно использовать для обеспечения наличия всех "
+"необходимых компонентов на машине пользователя. Также есть предопределенные "
+"переменные зависимостей для распространенных случаев и несколько "
+"дополнительных для управления поведением зависимостей."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3474
+msgid ""
+"When software has extra dependencies that provide extra features, the base "
+"dependencies listed in `*_DEPENDS` should include the extra dependencies "
+"that would benefit most users. The base dependencies should never be a "
+"\"minimal\" dependency set. The goal is not to include every dependency "
+"possible. Only include those that will benefit most people."
+msgstr ""
+"Когда у программного обеспечения есть дополнительные зависимости, "
+"предоставляющие дополнительные возможности, основные зависимости, "
+"перечисленные в `*_DEPENDS`, должны включать те дополнительные зависимости, "
+"которые будут полезны большинству пользователей. Основные зависимости "
+"никогда не должны быть \"минимальным\" набором зависимостей. Цель состоит не "
+"в том, чтобы включить все возможные зависимости. Включайте только те, "
+"которые будут полезны большинству людей."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3477
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4830
+#, no-wrap
+msgid "`LIB_DEPENDS`"
+msgstr "`LIB_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3482
+msgid ""
+"This variable specifies the shared libraries this port depends on. It is a "
+"list of `_lib:dir_` tuples where `_lib_` is the name of the shared library, "
+"`_dir_` is the directory in which to find it in case it is not available. "
+"For example,"
+msgstr ""
+"Эта переменная определяет разделяемые библиотеки, от которых зависит данный "
+"порт. Это список кортежей вида `_lib:dir_`, где `_lib_` — имя разделяемой "
+"библиотеки, а `_dir_` — директория, в которой её следует искать, если она "
+"недоступна. Например,"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3486
+#, no-wrap
+msgid "LIB_DEPENDS= libjpeg.so:graphics/jpeg\n"
+msgstr "LIB_DEPENDS= libjpeg.so:graphics/jpeg\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3489
+msgid ""
+"will check for a shared jpeg library with any version, and descend into the "
+"[.filename]#graphics/jpeg# subdirectory of the ports tree to build and "
+"install it if it is not found."
+msgstr ""
+"проверит наличие общей библиотеки jpeg с любой версией и перейдет в "
+"подкаталог [.filename]#graphics/jpeg# дерева портов, чтобы собрать и "
+"установить её, если она не найдена."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3492
+msgid ""
+"The dependency is checked twice, once from within the `build` target and "
+"then from within the `install` target. Also, the name of the dependency is "
+"put into the package so that `pkg install` (see man:pkg-install[8]) will "
+"automatically install it if it is not on the user's system."
+msgstr ""
+"Зависимость проверяется дважды: один раз внутри цели `build` и затем внутри "
+"цели `install`. Также имя зависимости добавляется в пакет, чтобы `pkg "
+"install` (см. man:pkg-install[8]) автоматически установил её, если её нет в "
+"системе пользователя."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3494
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4831
+#, no-wrap
+msgid "`RUN_DEPENDS`"
+msgstr "`RUN_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3499
+msgid ""
+"This variable specifies executables or files this port depends on during run-"
+"time. It is a list of ``_path:dir_``[:``_target_``] tuples where `_path_` "
+"is the name of the executable or file, _dir_ is the directory in which to "
+"find it in case it is not available, and _target_ is the target to call in "
+"that directory. If _path_ starts with a slash (`/`), it is treated as a "
+"file and its existence is tested with `test -e`; otherwise, it is assumed to "
+"be an executable, and `which -s` is used to determine if the program exists "
+"in the search path."
+msgstr ""
+"Эта переменная определяет исполняемые файлы или файлы, от которых зависит "
+"порт во время выполнения. Это список кортежей ``_path:dir_``[:``_target_``], "
+"где `_path_` — это имя исполняемого файла или файла, _dir_ — директория, в "
+"которой его следует искать, если он недоступен, а _target_ — цель, которую "
+"нужно вызвать в этой директории. Если _path_ начинается с косой черты (`/`), "
+"он считается файлом, и его существование проверяется с помощью `test -e`; в "
+"противном случае предполагается, что это исполняемый файл, и `which -s` "
+"используется для проверки наличия программы в пути поиска."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3501
+msgid "For example,"
+msgstr "Например,"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3506
+#, no-wrap
+msgid ""
+"RUN_DEPENDS=\t${LOCALBASE}/news/bin/innd:news/inn \\\n"
+"\t\txmlcatmgr:textproc/xmlcatmgr\n"
+msgstr ""
+"RUN_DEPENDS=\t${LOCALBASE}/news/bin/innd:news/inn \\\n"
+"\t\txmlcatmgr:textproc/xmlcatmgr\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3510
+msgid ""
+"will check if the file or directory [.filename]#/usr/local/news/bin/innd# "
+"exists, and build and install it from the [.filename]#news/inn# subdirectory "
+"of the ports tree if it is not found. It will also see if an executable "
+"called `xmlcatmgr` is in the search path, and descend into "
+"[.filename]#textproc/xmlcatmgr# to build and install it if it is not found."
+msgstr ""
+"проверит, существует ли файл или каталог [.filename]#/usr/local/news/bin/"
+"innd#, и соберет и установит его из подкаталога [.filename]#news/inn# дерева "
+"портов, если он не найден. Также будет проверено, находится ли исполняемый "
+"файл `xmlcatmgr` в пути поиска, и если он не найден, будет выполнен переход "
+"в [.filename]#textproc/xmlcatmgr# для сборки и установки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3515
+msgid ""
+"In this case, `innd` is actually an executable; if an executable is in a "
+"place that is not expected to be in the search path, use the full pathname."
+msgstr ""
+"В этом случае `innd` является исполняемым файлом; если исполняемый файл "
+"находится в месте, которое не ожидается в пути поиска, используйте полный "
+"путь."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3520
+msgid "The official search `PATH` used on the ports build cluster is"
+msgstr "Официальный путь поиска `PATH`, используемый в кластере сборки портов"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3524
+#, no-wrap
+msgid "/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin\n"
+msgstr "/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3531
+msgid ""
+"The dependency is checked from within the `install` target. Also, the name "
+"of the dependency is put into the package so that `pkg install` (see man:pkg-"
+"install[8]) will automatically install it if it is not on the user's "
+"system. The _target_ part can be omitted if it is the same as "
+"`DEPENDS_TARGET`."
+msgstr ""
+"Зависимость проверяется внутри цели `install`. Также имя зависимости "
+"добавляется в пакет, чтобы команда `pkg install` (см. man:pkg-install[8]) "
+"автоматически установила её, если она отсутствует в системе пользователя. "
+"Часть _target_ может быть опущена, если она совпадает с `DEPENDS_TARGET`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3534
+msgid ""
+"A quite common situation is when `RUN_DEPENDS` is literally the same as "
+"`BUILD_DEPENDS`, especially if ported software is written in a scripted "
+"language or if it requires the same build and run-time environment. In this "
+"case, it is both tempting and intuitive to directly assign one to the other:"
+msgstr ""
+"Довольно распространённая ситуация, когда `RUN_DEPENDS` буквально совпадает "
+"с `BUILD_DEPENDS`, особенно если портируемое программное обеспечение "
+"написано на скриптовом языке или требует одинаковой среды для сборки и "
+"выполнения. В этом случае возникает соблазн и интуитивное желание напрямую "
+"присвоить одно другому:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3538
+#, no-wrap
+msgid "RUN_DEPENDS=\t${BUILD_DEPENDS}\n"
+msgstr "RUN_DEPENDS=\t${BUILD_DEPENDS}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3545
+msgid ""
+"However, such assignment can pollute run-time dependencies with entries not "
+"defined in the port's original `BUILD_DEPENDS`. This happens because of "
+"man:make[1]'s lazy evaluation of variable assignment. Consider a "
+"[.filename]#Makefile# with `USE_*`, which are processed by [.filename]#ports/"
+"Mk/bsd.*.mk# to augment initial build dependencies. For example, `USES= "
+"gmake` adds package:devel/gmake[] to `BUILD_DEPENDS`. To prevent such "
+"additional dependencies from polluting `RUN_DEPENDS`, create another "
+"variable with the current content of `BUILD_DEPENDS` and assign it to both "
+"`BUILD_DEPENDS` and `RUN_DEPENDS`:"
+msgstr ""
+"Однако такое присваивание может загрязнить зависимости во время выполнения "
+"записями, не определёнными в оригинальном `BUILD_DEPENDS` порта. Это "
+"происходит из-за ленивого вычисления присваивания переменных в man:make[1]. "
+"Рассмотрим [.filename]#Makefile# с `USE_*`, которые обрабатываются "
+"[.filename]#ports/Mk/bsd.*.mk# для добавления начальных зависимостей сборки. "
+"Например, `USES= gmake` добавляет package:devel/gmake[] в `BUILD_DEPENDS`. "
+"Чтобы предотвратить попадание таких дополнительных зависимостей в "
+"`RUN_DEPENDS`, создайте другую переменную с текущим содержимым "
+"`BUILD_DEPENDS` и присвойте её как `BUILD_DEPENDS`, так и `RUN_DEPENDS`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3552
+#, no-wrap
+msgid ""
+"MY_DEPENDS=\tsome:devel/some \\\n"
+"\t\tother:lang/other\n"
+"BUILD_DEPENDS=\t${MY_DEPENDS}\n"
+"RUN_DEPENDS=\t${MY_DEPENDS}\n"
+msgstr ""
+"MY_DEPENDS=\tsome:devel/some \\\n"
+"\t\tother:lang/other\n"
+"BUILD_DEPENDS=\t${MY_DEPENDS}\n"
+"RUN_DEPENDS=\t${MY_DEPENDS}\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3558
+msgid ""
+"_Do not_ use `:=` to assign `BUILD_DEPENDS` to `RUN_DEPENDS` or vice-versa. "
+"All variables are expanded immediately, which is exactly the wrong thing to "
+"do and almost always a failure."
+msgstr ""
+"_Не используйте_ `:=` для присваивания `BUILD_DEPENDS` в `RUN_DEPENDS` или "
+"наоборот. Все переменные раскрываются немедленно, что является совершенно "
+"неправильным и почти всегда приводит к ошибке."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3561
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4829
+#, no-wrap
+msgid "`BUILD_DEPENDS`"
+msgstr "`BUILD_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3566
+msgid ""
+"This variable specifies executables or files this port requires to build. "
+"Like `RUN_DEPENDS`, it is a list of ``_path:dir_``[:``_target_``] tuples. "
+"For example,"
+msgstr ""
+"Эта переменная указывает исполняемые файлы или файлы, необходимые для сборки "
+"данного порта. Как и `RUN_DEPENDS`, это список кортежей "
+"``_path:dir_``[:``_target_``]. Например,"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3570
+#, no-wrap
+msgid "BUILD_DEPENDS=\tunzip:archivers/unzip\n"
+msgstr "BUILD_DEPENDS=\tunzip:archivers/unzip\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3573
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3611
+msgid ""
+"will check for an executable called `unzip`, and descend into the "
+"[.filename]#archivers/unzip# subdirectory of the ports tree to build and "
+"install it if it is not found."
+msgstr ""
+"проверит наличие исполняемого файла с именем `unzip` и перейдет в подкаталог "
+"[.filename]#archivers/unzip# дерева портов, чтобы собрать и установить его, "
+"если он не будет найден."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3579
+msgid ""
+"\"build\" here means everything from extraction to compilation. The "
+"dependency is checked from within the `extract` target. The _target_ part "
+"can be omitted if it is the same as `DEPENDS_TARGET`"
+msgstr ""
+"\"build\" здесь означает все процессы от извлечения до компиляции. "
+"Зависимость проверяется внутри цели `extract`. Часть _target_ может быть "
+"опущена, если она совпадает с `DEPENDS_TARGET`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3582
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4828
+#, no-wrap
+msgid "`FETCH_DEPENDS`"
+msgstr "`FETCH_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3587
+msgid ""
+"This variable specifies executables or files this port requires to fetch. "
+"Like the previous two, it is a list of ``_path:dir_``[:``_target_``] "
+"tuples. For example,"
+msgstr ""
+"Эта переменная определяет исполняемые файлы или файлы, необходимые для "
+"загрузки этого порта. Как и предыдущие две, это список кортежей "
+"``_path:dir_``[:``_target_``]. Например,"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3591
+#, no-wrap
+msgid "FETCH_DEPENDS=\tncftp2:net/ncftp2\n"
+msgstr "FETCH_DEPENDS=\tncftp2:net/ncftp2\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3594
+msgid ""
+"will check for an executable called `ncftp2`, and descend into the "
+"[.filename]#net/ncftp2# subdirectory of the ports tree to build and install "
+"it if it is not found."
+msgstr ""
+"проверит наличие исполняемого файла с именем `ncftp2` и перейдет в "
+"подкаталог [.filename]#net/ncftp2# дерева портов для сборки и установки, "
+"если файл не будет найден."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3597
+msgid ""
+"The dependency is checked from within the `fetch` target. The _target_ part "
+"can be omitted if it is the same as `DEPENDS_TARGET`."
+msgstr ""
+"Зависимость проверяется внутри цели `fetch`. Часть _target_ может быть "
+"опущена, если она совпадает с `DEPENDS_TARGET`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3599
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4826
+#, no-wrap
+msgid "`EXTRACT_DEPENDS`"
+msgstr "`EXTRACT_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3604
+msgid ""
+"This variable specifies executables or files this port requires for "
+"extraction. Like the previous, it is a list of "
+"``_path:dir_``[:``_target_``] tuples. For example,"
+msgstr ""
+"Эта переменная указывает исполняемые файлы или файлы, которые требуются для "
+"извлечения данного порта. Как и предыдущая, это список кортежей "
+"``_path:dir_``[:``_target_``]. Например,"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3608
+#, no-wrap
+msgid "EXTRACT_DEPENDS=\tunzip:archivers/unzip\n"
+msgstr "EXTRACT_DEPENDS=\tunzip:archivers/unzip\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3614
+msgid ""
+"The dependency is checked from within the `extract` target. The _target_ "
+"part can be omitted if it is the same as `DEPENDS_TARGET`."
+msgstr ""
+"Зависимость проверяется внутри цели `extract`. Часть _target_ может быть "
+"опущена, если она совпадает с `DEPENDS_TARGET`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3618
+msgid ""
+"Use this variable only if the extraction does not already work (the default "
+"assumes `tar`) and cannot be made to work using `USES=tar`, `USES=lha` or "
+"`USES=zip` described in crossref:uses[uses,Using `USES` Macros]."
+msgstr ""
+"Используйте эту переменную только если извлечение уже не работает (по "
+"умолчанию предполагается `tar`) и не может быть исправлено с помощью "
+"`USES=tar`, `USES=lha` или `USES=zip`, как описано в "
+"crossref:uses[uses,Использование макросов `USES`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3621
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4827
+#, no-wrap
+msgid "`PATCH_DEPENDS`"
+msgstr "`PATCH_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3625
+msgid ""
+"This variable specifies executables or files this port requires to patch. "
+"Like the previous, it is a list of ``_path:dir_``[:``_target_``] tuples. For "
+"example,"
+msgstr ""
+"Эта переменная указывает исполняемые файлы или файлы, которые требуются "
+"этому порту для применения патчей. Как и предыдущая, это список кортежей "
+"``_path:dir_``[:``_target_``]. Например,"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3629
+#, no-wrap
+msgid "PATCH_DEPENDS=\t${NONEXISTENT}:java/jfc:extract\n"
+msgstr "PATCH_DEPENDS=\t${NONEXISTENT}:java/jfc:extract\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3632
+msgid ""
+"will descend into the [.filename]#java/jfc# subdirectory of the ports tree "
+"to extract it."
+msgstr ""
+"будет спускаться в подкаталог [.filename]#java/jfc# дерева портов для его "
+"извлечения."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3635
+msgid ""
+"The dependency is checked from within the `patch` target. The _target_ part "
+"can be omitted if it is the same as `DEPENDS_TARGET`."
+msgstr ""
+"Зависимость проверяется в рамках цели `patch`. Часть _target_ может быть "
+"опущена, если она совпадает с `DEPENDS_TARGET`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3637
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4908
+#, no-wrap
+msgid "`USES`"
+msgstr "`USES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3641
+msgid ""
+"Parameters can be added to define different features and dependencies used "
+"by the port. They are specified by adding this line to the "
+"[.filename]#Makefile#:"
+msgstr ""
+"Параметры могут быть добавлены для определения различных функций и "
+"зависимостей, используемых портом. Они указываются путем добавления этой "
+"строки в [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3645
+#, no-wrap
+msgid "USES= feature[:arguments]\n"
+msgstr "USES= feature[:arguments]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3648
+msgid ""
+"For the complete list of values, please see crossref:uses[uses,Using `USES` "
+"Macros]."
+msgstr ""
+"Для полного списка значений обратитесь к crossref:uses[uses,Использование "
+"макросов `USES`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3652
+msgid ""
+"`USES` cannot be assigned after inclusion of [.filename]#bsd.port.pre.mk#."
+msgstr "`USES` нельзя назначать после включения [.filename]#bsd.port.pre.mk#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3655
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3677
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4205
+#, no-wrap
+msgid "`USE_*`"
+msgstr "`USE_*`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3662
+msgid ""
+"Several variables exist to define common dependencies shared by many ports. "
+"Their use is optional, but helps to reduce the verbosity of the port "
+"[.filename]##Makefile##s. Each of them is styled as `USE_*`. These "
+"variables may be used only in the port [.filename]##Makefile##s and "
+"[.filename]#ports/Mk/bsd.*.mk#. They are not meant for user-settable "
+"options - use `PORT_OPTIONS` for that purpose."
+msgstr ""
+"Существует несколько переменных для определения общих зависимостей, "
+"используемых многими портами. Их использование необязательно, но помогает "
+"сократить многословность [.filename]##Makefile## портов. Каждая из них "
+"оформлена как `USE_*`. Эти переменные могут использоваться только в "
+"[.filename]##Makefile## портов и [.filename]#ports/Mk/bsd.*.mk#. Они не "
+"предназначены для настраиваемых пользователем опций — для этой цели "
+"используйте `PORT_OPTIONS`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3667
+msgid ""
+"It is _always_ incorrect to set any `USE_*` in [.filename]#/etc/make.conf#. "
+"For instance, setting"
+msgstr ""
+"Всегда неправильно устанавливать любые `USE_*` в [.filename]#/etc/"
+"make.conf#. Например, установка"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3671
+#, no-wrap
+msgid "USE_GCC=X.Y\n"
+msgstr "USE_GCC=X.Y\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3674
+msgid ""
+"(where X.Y is version number) would add a dependency on gccXY for every "
+"port, including `lang/gccXY` itself!"
+msgstr ""
+"(где X.Y — номер версии) добавит зависимость от gccXY для каждого порта, "
+"включая сам `lang/gccXY`!"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3683
+#, no-wrap
+msgid "Means"
+msgstr "Значение"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3684
+#, no-wrap
+msgid "`USE_GCC`"
+msgstr "`USE_GCC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3709
+#, no-wrap
+msgid ""
+"The port requires GCC (`gcc` or `{g-plus-plus}`) to build.\n"
+"Some ports need a specific, old GCC version, some require modern, recent versions.\n"
+"It is typically set to `yes` (means always use stable, modern GCC from ports per `GCC_DEFAULT` in [.filename]#Mk/bsd.default-versions.mk#).\n"
+"This is also the default value.\n"
+"The exact version can also be specified, with a value such as `10`.\n"
+"GCC from the base system is used when it satisfies the requested version, otherwise an appropriate compiler is built from ports, and `CC` and `CXX` are adjusted accordingly.\n"
+"The `:build` argument following the version specifier adds only a build time dependency to the port.\n"
+"\n"
+"For example:\n"
+"[example]\n"
+"====\n"
+"[.programlisting]\n"
+"....\n"
+"USE_GCC=yes\t\t# port requires a current version of GCC\n"
+"USE_GCC=11:build\t# port requires GCC 11 at build time only\n"
+"....\n"
+"====\n"
+"\n"
+"[NOTE]\n"
+"====\n"
+"`USE_GCC=any` is deprecated and should not be used in new ports\n"
+"===="
+msgstr ""
+"Порт требует GCC (`gcc` или `{g-plus-plus}`) для сборки.\n"
+"Некоторые порты нуждаются в определённой, старой версии GCC, другие требуют современных, актуальных версий.\n"
+"Обычно устанавливается в `yes` (означает всегда использовать стабильную, современную версию GCC из портов, согласно `GCC_DEFAULT` в [.filename]#Mk/bsd.default-versions.mk#).\n"
+"Это также значение по умолчанию.\n"
+"Точная версия также может быть указана, например, значением `10`.\n"
+"GCC из базовой системы используется, если он удовлетворяет запрашиваемой версии, в противном случае подходящий компилятор собирается из портов, а `CC` и `CXX` корректируются соответствующим образом.\n"
+"Аргумент `:build`, следующий за указанием версии, добавляет только зависимость во время сборки порта.\n"
+"\n"
+"Например:\n"
+"[example]\n"
+"====\n"
+"[.programlisting]\n"
+"....\n"
+"USE_GCC=yes\t\t# порт требует текущей версии GCC\n"
+"USE_GCC=11:build\t# порт требует GCC 11 только во время сборки\n"
+"....\n"
+"====\n"
+"\n"
+"[NOTE]\n"
+"====\n"
+"`USE_GCC=any` устарел и не должен использоваться в новых портах\n"
+"===="
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3718
+msgid ""
+"Variables related to gmake and [.filename]#configure# are described in "
+"crossref:special[building,Building Mechanisms], while autoconf, automake and "
+"libtool are described in crossref:special[using-autotools,Using GNU "
+"Autotools]. Perl related variables are described in crossref:special[using-"
+"perl,Using Perl]. X11 variables are listed in crossref:special[using-"
+"x11,Using X11]. crossref:special[using-gnome,Using Gnome] deals with GNOME "
+"and crossref:special[using-kde,Using KDE] with KDE related variables. "
+"crossref:special[using-java,Using Java] documents Java variables, while "
+"crossref:special[using-php,Web Applications, Apache and PHP] contains "
+"information on Apache, PHP and PEAR modules. Python is discussed in "
+"crossref:special[using-python,Using Python], while Ruby in "
+"crossref:special[using-ruby,Using Ruby]. crossref:special[using-sdl,Using "
+"SDL] provides variables used for SDL applications and finally, "
+"crossref:special[using-xfce,Using Xfce] contains information on Xfce."
+msgstr ""
+"Переменные, связанные с gmake и [.filename]#configure#, описаны в "
+"crossref:special[building,Механизмы сборки], тогда как autoconf, automake и "
+"libtool описаны в crossref:special[using-autotools,Использование GNU "
+"Autotools]. Переменные, связанные с Perl, описаны в crossref:special[using-"
+"perl,Использование Perl]. Переменные X11 перечислены в "
+"crossref:special[using-x11,Использование X11]. crossref:special[using-"
+"gnome,Использование GNOME] посвящено GNOME, а crossref:special[using-"
+"kde,Использование KDE] — переменным, связанным с KDE. crossref:special[using-"
+"java,Использование Java] документирует переменные Java, тогда как "
+"crossref:special[using-php,Веб-приложения, Apache и PHP] содержит информацию "
+"о модулях Apache, PHP и PEAR. Python обсуждается в crossref:special[using-"
+"python,Использование Python], а Ruby — в crossref:special[using-"
+"ruby,Использование Ruby]. crossref:special[using-sdl,Использование SDL] "
+"предоставляет переменные, используемые для приложений SDL, и, наконец, "
+"crossref:special[using-xfce,Использование Xfce] содержит информацию о Xfce."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3720
+#, no-wrap
+msgid "Minimal Version of a Dependency"
+msgstr "Минимальная версия зависимого пакета"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3723
+msgid ""
+"A minimal version of a dependency can be specified in any `*_DEPENDS` except "
+"`LIB_DEPENDS` using this syntax:"
+msgstr ""
+"Минимальная версия зависимого пакета может быть указана в любом `*_DEPENDS`, "
+"кроме `LIB_DEPENDS`, используя следующий синтаксис:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3727
+#, no-wrap
+msgid "p5-Spiffy>=0.26:devel/p5-Spiffy\n"
+msgstr "p5-Spiffy>=0.26:devel/p5-Spiffy\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3731
+msgid ""
+"The first field contains a dependent package name, which must match the "
+"entry in the package database, a comparison sign, and a package version. "
+"The dependency is satisfied if p5-Spiffy-0.26 or newer is installed on the "
+"machine."
+msgstr ""
+"Первое поле содержит имя зависимого пакета, которое должно соответствовать "
+"записи в базе данных пакетов, знак сравнения и версию пакета. Зависимость "
+"считается удовлетворённой, если на машине установлен p5-Spiffy-0.26 или "
+"новее."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3733
+#, no-wrap
+msgid "Notes on Dependencies"
+msgstr "Заметки о зависимостях"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3739
+msgid ""
+"As mentioned above, the default target to call when a dependency is required "
+"is `DEPENDS_TARGET`. It defaults to `install`. This is a user variable; it "
+"is never defined in a port's [.filename]#Makefile#. If the port needs a "
+"special way to handle a dependency, use the `:target` part of `*_DEPENDS` "
+"instead of redefining `DEPENDS_TARGET`."
+msgstr ""
+"Как упомянуто выше, цель по умолчанию, вызываемая при необходимости "
+"зависимости, — это `DEPENDS_TARGET`. По умолчанию она установлена в "
+"`install`. Это пользовательская переменная; она никогда не определяется в "
+"[.filename]#Makefile# порта. Если порту требуется особый способ обработки "
+"зависимости, используйте часть `:target` в `*_DEPENDS` вместо "
+"переопределения `DEPENDS_TARGET`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3743
+msgid ""
+"When running `make clean`, the port dependencies are automatically cleaned "
+"too. If this is not desirable, define `NOCLEANDEPENDS` in the environment. "
+"This may be particularly desirable if the port has something that takes a "
+"long time to rebuild in its dependency list, such as KDE, GNOME or Mozilla."
+msgstr ""
+"При выполнении `make clean` зависимости портов также автоматически "
+"очищаются. Если это нежелательно, определите переменную `NOCLEANDEPENDS` в "
+"окружении. Это может быть особенно полезно, если среди зависимостей порта "
+"есть что-то, что требует много времени для пересборки, например KDE, GNOME "
+"или Mozilla."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3748
+msgid ""
+"To depend on another port unconditionally, use the variable `${NONEXISTENT}` "
+"as the first field of `BUILD_DEPENDS` or `RUN_DEPENDS`. Use this only when "
+"the source of the other port is needed. Compilation time can be saved by "
+"specifying the target too. For instance"
+msgstr ""
+"Для безусловной зависимости от другого порта используйте переменную `$"
+"{NONEXISTENT}` в качестве первого поля `BUILD_DEPENDS` или `RUN_DEPENDS`. "
+"Используйте это только в случае, когда необходим исходный код другого порта. "
+"Время компиляции можно сократить, указав также цель. Например"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3752
+#, no-wrap
+msgid "BUILD_DEPENDS=\t${NONEXISTENT}:graphics/jpeg:extract\n"
+msgstr "BUILD_DEPENDS=\t${NONEXISTENT}:graphics/jpeg:extract\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3755
+msgid "will always descend to the `jpeg` port and extract it."
+msgstr "всегда будет переходить к порту `jpeg` и извлекать его."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3757
+#, no-wrap
+msgid "Circular Dependencies Are Fatal"
+msgstr "Циклические зависимости фатальны"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3762
+msgid "Do not introduce any circular dependencies into the ports tree!"
+msgstr "Не создавайте циклических зависимостей в дереве портов!"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3769
+msgid ""
+"The ports building technology does not tolerate circular dependencies. If "
+"one is introduced, someone, somewhere in the world, will have their FreeBSD "
+"installation broken almost immediately, with many others quickly to follow. "
+"These can really be hard to detect. If in doubt, before making that change, "
+"make sure to run: `cd /usr/ports; make index`. That process can be quite "
+"slow on older machines, but it may be able to save a large number of people, "
+"including yourself, a lot of grief in the process."
+msgstr ""
+"Технология сборки портов не допускает циклических зависимостей. Если такая "
+"зависимость будет добавлена, у кого-то в мире почти сразу окажется сломанной "
+"установка FreeBSD, а за этим последуют многие другие. Подобные проблемы "
+"бывает очень сложно обнаружить. Если есть сомнения, перед внесением "
+"изменений обязательно выполните: `cd /usr/ports; make index`. Этот процесс "
+"может быть довольно медленным на старых машинах, но он способен избавить "
+"множество людей, включая вас, от серьёзных проблем."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3771
+#, no-wrap
+msgid "Problems Caused by Automatic Dependencies"
+msgstr "Проблемы, вызванные автоматическими зависимостями"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3776
+msgid ""
+"Dependencies must be declared either explicitly or by using the "
+"crossref:makefiles[makefile-options,OPTIONS framework]. Using other methods "
+"like automatic detection complicates indexing, which causes problems for "
+"port and package management."
+msgstr ""
+"Зависимости должны быть объявлены явно или с использованием "
+"crossref:makefiles[makefile-options,OPTIONS framework]. Использование других "
+"методов, таких как автоматическое обнаружение, усложняет индексацию, что "
+"вызывает проблемы для управления портами и пакетами."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3778
+#, no-wrap
+msgid "Wrong Declaration of an Optional Dependency"
+msgstr "Неправильное объявление необязательной зависимости"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3785
+#, no-wrap
+msgid ".include <bsd.port.pre.mk>\n"
+msgstr ".include <bsd.port.pre.mk>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3789
+#, no-wrap
+msgid ""
+".if exists(${LOCALBASE}/bin/foo)\n"
+"LIB_DEPENDS=\tlibbar.so:foo/bar\n"
+".endif\n"
+msgstr ""
+".if exists(${LOCALBASE}/bin/foo)\n"
+"LIB_DEPENDS=\tlibbar.so:foo/bar\n"
+".endif\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3798
+msgid ""
+"The problem with trying to automatically add dependencies is that files and "
+"settings outside an individual port can change at any time. For example: an "
+"index is built, then a batch of ports are installed. But one of the ports "
+"installs the tested file. The index is now incorrect, because an installed "
+"port unexpectedly has a new dependency. The index may still be wrong even "
+"after rebuilding if other ports also determine their need for dependencies "
+"based on the existence of other files."
+msgstr ""
+"Проблема с попыткой автоматического добавления зависимостей заключается в "
+"том, что файлы и настройки за пределами отдельного порта могут измениться в "
+"любой момент. Например: индекс строится, затем устанавливается группа "
+"портов. Но один из портов устанавливает проверяемый файл. Теперь индекс "
+"неверен, потому что у установленного порта неожиданно появилась новая "
+"зависимость. Индекс может оставаться неверным даже после пересборки, если "
+"другие порты также определяют свою потребность в зависимостях на основе "
+"существования других файлов."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3800
+#, no-wrap
+msgid "Correct Declaration of an Optional Dependency"
+msgstr "Правильное объявление необязательной зависимости"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3808
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tBAR\n"
+"BAR_DESC=\tCalling cellphones via bar\n"
+msgstr ""
+"OPTIONS_DEFINE=\tBAR\n"
+"BAR_DESC=\tCalling cellphones via bar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3810
+#, no-wrap
+msgid "BAR_LIB_DEPENDS=\tlibbar.so:foo/bar\n"
+msgstr "BAR_LIB_DEPENDS=\tlibbar.so:foo/bar\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3817
+msgid ""
+"Testing option variables is the correct method. It will not cause "
+"inconsistencies in the index of a batch of ports, provided the options were "
+"defined prior to the index build. Simple scripts can then be used to "
+"automate the building, installation, and updating of these ports and their "
+"packages."
+msgstr ""
+"Проверка переменных опций является правильным методом. Это не вызовет "
+"несоответствий в индексе группы портов, при условии что опции были "
+"определены до сборки индекса. Затем можно использовать простые скрипты для "
+"автоматизации сборки, установки и обновления этих портов и их пакетов."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3819
+#, no-wrap
+msgid "Slave Ports and `MASTERDIR`"
+msgstr "Подчиненные порты и `MASTERDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3826
+msgid ""
+"If the port needs to build slightly different versions of packages by having "
+"a variable (for instance, resolution, or paper size) take different values, "
+"create one subdirectory per package to make it easier for users to see what "
+"to do, but try to share as many files as possible between ports. Typically, "
+"by using variables cleverly, only a very short [.filename]#Makefile# is "
+"needed in all but one of the directories. In the sole "
+"[.filename]#Makefile#, use `MASTERDIR` to specify the directory where the "
+"rest of the files are. Also, use a variable as part of "
+"crossref:makefiles[porting-pkgname,`PKGNAMESUFFIX`] so the packages will "
+"have different names."
+msgstr ""
+"Если порту необходимо собирать немного разные версии пакетов, используя "
+"переменную (например, разрешение или размер бумаги) с разными значениями, "
+"создайте по одному подкаталогу для каждого пакета, чтобы пользователям было "
+"проще понять, что делать, но старайтесь максимально использовать общие файлы "
+"между портами. Обычно, при грамотном использовании переменных, во всех "
+"каталогах, кроме одного, требуется лишь очень короткий "
+"[.filename]#Makefile#. В единственном [.filename]#Makefile# укажите "
+"директорию с остальными файлами с помощью `MASTERDIR`. Также используйте "
+"переменную как часть crossref:makefiles[porting-pkgname,`PKGNAMESUFFIX`], "
+"чтобы пакеты имели разные имена."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3829
+msgid ""
+"This will be best demonstrated by an example. This is part of "
+"[.filename]#print/pkfonts300/Makefile#;"
+msgstr ""
+"Это лучше всего продемонстрировать на примере. Это часть файла "
+"[.filename]#print/pkfonts300/Makefile#;"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3835
+#, no-wrap
+msgid ""
+"PORTNAME=\tpkfonts${RESOLUTION}\n"
+"PORTVERSION=\t1.0\n"
+"DISTFILES=\tpk${RESOLUTION}.tar.gz\n"
+msgstr ""
+"PORTNAME=\tpkfonts${RESOLUTION}\n"
+"PORTVERSION=\t1.0\n"
+"DISTFILES=\tpk${RESOLUTION}.tar.gz\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3837
+#, no-wrap
+msgid "PLIST=\t\t${PKGDIR}/pkg-plist.${RESOLUTION}\n"
+msgstr "PLIST=\t\t${PKGDIR}/pkg-plist.${RESOLUTION}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3850
+#, no-wrap
+msgid ""
+".if !defined(RESOLUTION)\n"
+"RESOLUTION=\t300\n"
+".else\n"
+".if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \\\n"
+"\t${RESOLUTION} != 300 && ${RESOLUTION} != 360 && \\\n"
+"\t${RESOLUTION} != 400 && ${RESOLUTION} != 600\n"
+".BEGIN:\n"
+"\t@${ECHO_MSG} \"Error: invalid value for RESOLUTION: \\\"${RESOLUTION}\\\"\"\n"
+"\t@${ECHO_MSG} \"Possible values are: 118, 240, 300, 360, 400 and 600.\"\n"
+"\t@${FALSE}\n"
+".endif\n"
+".endif\n"
+msgstr ""
+".if !defined(RESOLUTION)\n"
+"RESOLUTION=\t300\n"
+".else\n"
+".if ${RESOLUTION} != 118 && ${RESOLUTION} != 240 && \\\n"
+"\t${RESOLUTION} != 300 && ${RESOLUTION} != 360 && \\\n"
+"\t${RESOLUTION} != 400 && ${RESOLUTION} != 600\n"
+".BEGIN:\n"
+"\t@${ECHO_MSG} \"Error: invalid value for RESOLUTION: \\\"${RESOLUTION}\\\"\"\n"
+"\t@${ECHO_MSG} \"Possible values are: 118, 240, 300, 360, 400 and 600.\"\n"
+"\t@${FALSE}\n"
+".endif\n"
+".endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3854
+msgid ""
+"package:print/pkfonts300[] also has all the regular patches, package files, "
+"etc. Running `make` there, it will take the default value for the "
+"resolution (300) and build the port normally."
+msgstr ""
+"Пакет `package:print/pkfonts300[]` также содержит все обычные исправления, "
+"файлы пакетов и т.д. При запуске `make` в этом месте будет взято значение "
+"разрешения по умолчанию (300), и порт будет собран в обычном режиме."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3856
+msgid ""
+"As for other resolutions, this is the _entire_ [.filename]#print/pkfonts360/"
+"Makefile#:"
+msgstr ""
+"Что касается других разрешений, это _полный_ [.filename]#print/pkfonts360/"
+"Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3861
+#, no-wrap
+msgid ""
+"RESOLUTION=\t360\n"
+"MASTERDIR=\t${.CURDIR}/../pkfonts300\n"
+msgstr ""
+"RESOLUTION=\t360\n"
+"MASTERDIR=\t${.CURDIR}/../pkfonts300\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3863
+#, no-wrap
+msgid ".include\t\"${MASTERDIR}/Makefile\"\n"
+msgstr ".include\t\"${MASTERDIR}/Makefile\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3868
+msgid ""
+"([.filename]#print/pkfonts118/Makefile#, [.filename]#print/pkfonts600/"
+"Makefile#, and all the other are similar). `MASTERDIR` definition tells "
+"[.filename]#bsd.port.mk# that the regular set of subdirectories like "
+"`FILESDIR` and `SCRIPTDIR` are to be found under [.filename]#pkfonts300#. "
+"The `RESOLUTION=360` line will override the `RESOLUTION=300` line in "
+"[.filename]#pkfonts300/Makefile# and the port will be built with resolution "
+"set to 360."
+msgstr ""
+"([.filename]#print/pkfonts118/Makefile#, [.filename]#print/pkfonts600/"
+"Makefile# и все остальные аналогичны). Определение `MASTERDIR` указывает "
+"[.filename]#bsd.port.mk#, что стандартный набор подкаталогов, таких как "
+"`FILESDIR` и `SCRIPTDIR`, следует искать в [.filename]#pkfonts300#. Строка "
+"`RESOLUTION=360` переопределит строку `RESOLUTION=300` в "
+"[.filename]#pkfonts300/Makefile#, и порт будет собран с разрешением, "
+"установленным на 360."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3870
+#, no-wrap
+msgid "Man Pages"
+msgstr "Страницы Cправочника"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3875
+msgid ""
+"If the port anchors its man tree somewhere other than `PREFIX`, use "
+"`MANDIRS` to specify those directories. Note that the files corresponding "
+"to manual pages must be placed in [.filename]#pkg-plist# along with the rest "
+"of the files. The purpose of `MANDIRS` is to enable automatic compression "
+"of manual pages, therefore the file names are suffixed with [.filename]#.gz#."
+msgstr ""
+"Если порт размещает дерево man в другом месте, отличном от `PREFIX`, "
+"используйте `MANDIRS` для указания этих каталогов. Обратите внимание, что "
+"файлы, соответствующие страницам руководства, должны быть добавлены в "
+"[.filename]#pkg-plist# вместе с остальными файлами. Назначение `MANDIRS` — "
+"обеспечить автоматическое сжатие страниц руководства, поэтому имена файлов "
+"имеют суффикс [.filename]#.gz#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3877
+#, no-wrap
+msgid "Info Files"
+msgstr "Файлы информации"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3884
+msgid ""
+"If the package needs to install GNU info files, list them in `INFO` (without "
+"the trailing `.info`), one entry per document. These files are assumed to "
+"be installed to [.filename]#PREFIX/INFO_PATH#. Change `INFO_PATH` if the "
+"package uses a different location. However, this is not recommended. These "
+"entries contain just the path relative to [.filename]#PREFIX/INFO_PATH#. "
+"For example, package:lang/gcc34[] installs info files to [.filename]#PREFIX/"
+"INFO_PATH/gcc34#, and `INFO` will be something like this:"
+msgstr ""
+"Если пакету требуется установить файлы GNU info, перечислите их в `INFO` "
+"(без завершающего `.info`), по одному документу на строку. Предполагается, "
+"что эти файлы будут установлены в [.filename]#PREFIX/INFO_PATH#. Измените "
+"`INFO_PATH`, если пакет использует другое расположение. Однако это не "
+"рекомендуется. Эти записи содержат только путь относительно "
+"[.filename]#PREFIX/INFO_PATH#. Например, пакет package:lang/gcc34[] "
+"устанавливает файлы info в [.filename]#PREFIX/INFO_PATH/gcc34#, и `INFO` "
+"будет выглядеть примерно так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3888
+#, no-wrap
+msgid "INFO=\tgcc34/cpp gcc34/cppinternals gcc34/g77 ...\n"
+msgstr "INFO=\tgcc34/cpp gcc34/cppinternals gcc34/g77 ...\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3891
+msgid ""
+"Appropriate installation/de-installation code will be automatically added to "
+"the temporary [.filename]#pkg-plist# before package registration."
+msgstr ""
+"Соответствующий код установки/удаления будет автоматически добавлен во "
+"временный файл [.filename]#pkg-plist# перед регистрацией пакета."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3893
+#, no-wrap
+msgid "Makefile Options"
+msgstr "Параметры Makefile"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3898
+msgid ""
+"Many applications can be built with optional or differing configurations. "
+"Examples include choice of natural (human) language, GUI versus command-"
+"line, or type of database to support. Users may need a different "
+"configuration than the default, so the ports system provides hooks the port "
+"author can use to control which variant will be built. Supporting these "
+"options properly will make users happy, and effectively provide two or more "
+"ports for the price of one."
+msgstr ""
+"Многие приложения могут быть собраны с дополнительными или различными "
+"конфигурациями. Примеры включают выбор естественного (человеческого) языка, "
+"графический интерфейс или командная строка, тип поддерживаемой базы данных. "
+"Пользователям может потребоваться конфигурация, отличная от стандартной, "
+"поэтому система портов предоставляет хуки, которые автор порта может "
+"использовать для управления вариантом сборки. Правильная поддержка этих "
+"опций сделает пользователей счастливыми и эффективно предоставит два или "
+"более порта по цене одного."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3900
+#, no-wrap
+msgid "`OPTIONS`"
+msgstr "`OPTIONS`"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3903
+#, no-wrap
+msgid "Background"
+msgstr "Пояснения"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3909
+msgid ""
+"`OPTIONS_*` give the user installing the port a dialog showing the available "
+"options, and then saves those options to [.filename]#${PORT_DBDIR}/$"
+"{OPTIONS_NAME}/options#. The next time the port is built, the options are "
+"reused. `PORT_DBDIR` defaults to [.filename]#/var/db/ports#. "
+"`OPTIONS_NAME` is to the port origin with an underscore as the space "
+"separator, for example, for package:dns/bind99[] it will be `dns_bind99`."
+msgstr ""
+"`OPTIONS_*` предоставляют пользователю, устанавливающему порт, диалоговое "
+"окно с доступными опциями, после чего сохраняют выбранные опции в "
+"[.filename]#${PORT_DBDIR}/${OPTIONS_NAME}/options#. При следующей сборке "
+"порта эти опции будут использованы повторно. `PORT_DBDIR` по умолчанию имеет "
+"значение [.filename]#/var/db/ports#. `OPTIONS_NAME` соответствует имени "
+"порта (origin) с заменой разделителя на подчёркивания, например, для "
+"package:dns/bind99[] это будет `dns_bind99`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3913
+msgid ""
+"When the user runs `make config` (or runs `make build` for the first time), "
+"the framework checks for [.filename]#${PORT_DBDIR}/${OPTIONS_NAME}/"
+"options#. If that file does not exist, the values of `OPTIONS_*` are used, "
+"and a dialog box is displayed where the options can be enabled or disabled. "
+"Then [.filename]#options# is saved and the configured variables are used "
+"when building the port."
+msgstr ""
+"Когда пользователь запускает `make config` (или впервые запускает `make "
+"build`), система проверяет наличие файла [.filename]#${PORT_DBDIR}/$"
+"{OPTIONS_NAME}/options#. Если этот файл не существует, используются значения "
+"`OPTIONS_*`, и отображается диалоговое окно, где можно включить или "
+"отключить опции. Затем файл [.filename]#options# сохраняется, а настроенные "
+"переменные используются при сборке порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3915
+msgid ""
+"If a new version of the port adds new `OPTIONS`, the dialog will be "
+"presented to the user with the saved values of old `OPTIONS` prefilled."
+msgstr ""
+"Если новая версия порта добавляет новые `OPTIONS`, пользователю будет "
+"показан диалог с сохранёнными значениями старых `OPTIONS`, заполненными "
+"заранее."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3918
+msgid ""
+"`make showconfig` shows the saved configuration. Use `make rmconfig` to "
+"remove the saved configuration."
+msgstr ""
+"`make showconfig` показывает сохранённую конфигурацию. Используйте `make "
+"rmconfig` для удаления сохранённой конфигурации."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3920
+#, no-wrap
+msgid "Syntax"
+msgstr "Синтаксис"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3924
+msgid ""
+"`OPTIONS_DEFINE` contains a list of `OPTIONS` to be used. These are "
+"independent of each other and are not grouped:"
+msgstr ""
+"`OPTIONS_DEFINE` содержит список `OPTIONS`, которые будут использоваться. "
+"Они независимы друг от друга и не сгруппированы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3928
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4357
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4654
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4711
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4775
+#, no-wrap
+msgid "OPTIONS_DEFINE=\tOPT1 OPT2\n"
+msgstr "OPTIONS_DEFINE=\tOPT1 OPT2\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3931
+msgid ""
+"Once defined, `OPTIONS` are described (optional, but strongly recommended):"
+msgstr ""
+"После определения `OPTIONS` описываются (необязательно, но настоятельно "
+"рекомендуется):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3940
+#, no-wrap
+msgid ""
+"OPT1_DESC=\tDescribe OPT1\n"
+"OPT2_DESC=\tDescribe OPT2\n"
+"OPT3_DESC=\tDescribe OPT3\n"
+"OPT4_DESC=\tDescribe OPT4\n"
+"OPT5_DESC=\tDescribe OPT5\n"
+"OPT6_DESC=\tDescribe OPT6\n"
+msgstr ""
+"OPT1_DESC=\tDescribe OPT1\n"
+"OPT2_DESC=\tDescribe OPT2\n"
+"OPT3_DESC=\tDescribe OPT3\n"
+"OPT4_DESC=\tDescribe OPT4\n"
+"OPT5_DESC=\tDescribe OPT5\n"
+"OPT6_DESC=\tDescribe OPT6\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3944
+msgid ""
+"[.filename]#ports/Mk/bsd.options.desc.mk# has descriptions for many common "
+"`OPTIONS`. While often useful, override them if the description is "
+"insufficient for the port."
+msgstr ""
+"[.filename]#ports/Mk/bsd.options.desc.mk# содержит описания для многих "
+"распространённых `OPTIONS`. Хотя они часто полезны, переопределите их, если "
+"описание недостаточно для порта."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3950
+msgid ""
+"When describing options, view it from the perspective of the user: \"What "
+"functionality does it change?\" and \"Why would I want to enable this?\" Do "
+"not just repeat the name. For example, describing the `NLS` option as "
+"\"include NLS support\" does not help the user, who can already see the "
+"option name but may not know what it means. Describing it as \"Native "
+"Language Support via gettext utilities\" is much more helpful."
+msgstr ""
+"При описании параметров рассматривайте их с точки зрения пользователя: "
+"«Какую функциональность это изменяет?» и «Зачем мне включать этот параметр?» "
+"Не просто повторяйте название. Например, описание параметра `NLS` как "
+"«включить поддержку NLS» не помогает пользователю, который уже видит "
+"название параметра, но может не знать, что оно означает. Описание вроде "
+"«Поддержка родного языка с помощью утилиты gettext» гораздо полезнее."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3956
+msgid ""
+"Option names are always in all uppercase. They cannot use mixed case or "
+"lowercase."
+msgstr ""
+"Названия параметров всегда пишутся в верхнем регистре. Они не могут "
+"использовать смешанный регистр или нижний регистр."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3959
+msgid ""
+"`OPTIONS` can be grouped as radio choices, where only one choice from each "
+"group is allowed:"
+msgstr ""
+"`OPTIONS` могут быть сгруппированы как переключаемые варианты, где "
+"допускается только один выбор из каждой группы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3964
+#, no-wrap
+msgid ""
+"OPTIONS_SINGLE=\t\tSG1\n"
+"OPTIONS_SINGLE_SG1=\tOPT3 OPT4\n"
+msgstr ""
+"OPTIONS_SINGLE=\t\tSG1\n"
+"OPTIONS_SINGLE_SG1=\tOPT3 OPT4\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3970
+msgid ""
+"There _must_ be one of each `OPTIONS_SINGLE` group selected at all times for "
+"the options to be valid. One option of each group _must_ be added to "
+"`OPTIONS_DEFAULT`."
+msgstr ""
+"В каждый момент времени _должна_ быть выбрана одна опция из каждой группы "
+"`OPTIONS_SINGLE`, чтобы параметры были действительными. Один вариант из "
+"каждой группы _должен_ быть добавлен в `OPTIONS_DEFAULT`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3973
+msgid ""
+"`OPTIONS` can be grouped as radio choices, where none or only one choice "
+"from each group is allowed:"
+msgstr ""
+"`OPTIONS` могут быть сгруппированы как переключаемые варианты, где ни один "
+"или только один вариант из каждой группы разрешён:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3978
+#, no-wrap
+msgid ""
+"OPTIONS_RADIO=\t\tRG1\n"
+"OPTIONS_RADIO_RG1=\tOPT7 OPT8\n"
+msgstr ""
+"OPTIONS_RADIO=\t\tRG1\n"
+"OPTIONS_RADIO_RG1=\tOPT7 OPT8\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3981
+msgid ""
+"`OPTIONS` can also be grouped as \"multiple-choice\" lists, where _at least "
+"one_ option must be enabled:"
+msgstr ""
+"`OPTIONS` также могут быть сгруппированы в виде списков \"множественного "
+"выбора\", где _хотя бы одна_ опция должна быть включена:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3986
+#, no-wrap
+msgid ""
+"OPTIONS_MULTI=\t\tMG1\n"
+"OPTIONS_MULTI_MG1=\tOPT5 OPT6\n"
+msgstr ""
+"OPTIONS_MULTI=\t\tMG1\n"
+"OPTIONS_MULTI_MG1=\tOPT5 OPT6\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3989
+msgid ""
+"`OPTIONS` can also be grouped as \"multiple-choice\" lists, where none or "
+"any option can be enabled:"
+msgstr ""
+"`OPTIONS` также могут быть сгруппированы в виде списков \"множественного "
+"выбора\", где ни одна или любые опции могут быть включены:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3994
+#, no-wrap
+msgid ""
+"OPTIONS_GROUP=\t\tGG1\n"
+"OPTIONS_GROUP_GG1=\tOPT9 OPT10\n"
+msgstr ""
+"OPTIONS_GROUP=\t\tGG1\n"
+"OPTIONS_GROUP_GG1=\tOPT9 OPT10\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:3997
+msgid ""
+"`OPTIONS` are unset by default, unless they are listed in `OPTIONS_DEFAULT`:"
+msgstr ""
+"`OPTIONS` по умолчанию не установлены, если они не перечислены в "
+"`OPTIONS_DEFAULT`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4001
+#, no-wrap
+msgid "OPTIONS_DEFAULT=\tOPT1 OPT3 OPT6\n"
+msgstr "OPTIONS_DEFAULT=\tOPT1 OPT3 OPT6\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4007
+msgid ""
+"`OPTIONS` definitions must appear before the inclusion of "
+"[.filename]#bsd.port.options.mk#. `PORT_OPTIONS` values can only be tested "
+"after the inclusion of [.filename]#bsd.port.options.mk#. Inclusion of "
+"[.filename]#bsd.port.pre.mk# can be used instead, too, and is still widely "
+"used in ports written before the introduction of "
+"[.filename]#bsd.port.options.mk#. But be aware that some variables will not "
+"work as expected after the inclusion of [.filename]#bsd.port.pre.mk#, "
+"typically some `USE_*` flags."
+msgstr ""
+"Определения `OPTIONS` должны быть указаны до включения файла "
+"[.filename]#bsd.port.options.mk#. Значения `PORT_OPTIONS` можно проверять "
+"только после включения [.filename]#bsd.port.options.mk#. Включение "
+"[.filename]#bsd.port.pre.mk# также может использоваться и до сих пор широко "
+"применяется в портах, написанных до введения "
+"[.filename]#bsd.port.options.mk#. Однако следует учитывать, что некоторые "
+"переменные не будут работать как ожидается после включения "
+"[.filename]#bsd.port.pre.mk#, обычно это некоторые флаги `USE_*`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4009
+#, no-wrap
+msgid "Simple Use of `OPTIONS`"
+msgstr "Простое использование `OPTIONS`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4017
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tFOO BAR\n"
+"OPTIONS_DEFAULT=FOO\n"
+msgstr ""
+"OPTIONS_DEFINE=\tFOO BAR\n"
+"OPTIONS_DEFAULT=FOO\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4020
+#, no-wrap
+msgid ""
+"FOO_DESC=\tOption foo support\n"
+"BAR_DESC=\tFeature bar support\n"
+msgstr ""
+"FOO_DESC=\tOption foo support\n"
+"BAR_DESC=\tFeature bar support\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4024
+#, no-wrap
+msgid ""
+"# Will add --with-foo / --without-foo\n"
+"FOO_CONFIGURE_WITH=\tfoo\n"
+"BAR_RUN_DEPENDS=\tbar:bar/bar\n"
+msgstr ""
+"# Will add --with-foo / --without-foo\n"
+"FOO_CONFIGURE_WITH=\tfoo\n"
+"BAR_RUN_DEPENDS=\tbar:bar/bar\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4026
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4090
+#, no-wrap
+msgid ".include <bsd.port.mk>\n"
+msgstr ".include <bsd.port.mk>\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4031
+#, no-wrap
+msgid "Check for Unset Port `OPTIONS`"
+msgstr "Проверка неустановленных `OPTIONS` порта"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4040
+#, no-wrap
+msgid ""
+".if ! ${PORT_OPTIONS:MEXAMPLES}\n"
+"CONFIGURE_ARGS+=--without-examples\n"
+".endif\n"
+msgstr ""
+".if ! ${PORT_OPTIONS:MEXAMPLES}\n"
+"CONFIGURE_ARGS+=--without-examples\n"
+".endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4044
+msgid ""
+"The form shown above is discouraged. The preferred method is using a "
+"configure knob to really enable and disable the feature to match the option:"
+msgstr ""
+"Приведённая выше форма не рекомендуется. Предпочтительный метод — "
+"использование параметра configure для фактического включения и отключения "
+"функции в соответствии с опцией:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4049
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4086
+#, no-wrap
+msgid ""
+"# Will add --with-examples / --without-examples\n"
+"EXAMPLES_CONFIGURE_WITH=\texamples\n"
+msgstr ""
+"# Will add --with-examples / --without-examples\n"
+"EXAMPLES_CONFIGURE_WITH=\texamples\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4054
+#, no-wrap
+msgid "Practical Use of `OPTIONS`"
+msgstr "Пример реального использования `OPTIONS`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4062
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\t\tEXAMPLES\n"
+"OPTIONS_DEFAULT=\tPGSQL LDAP SSL\n"
+msgstr ""
+"OPTIONS_DEFINE=\t\tEXAMPLES\n"
+"OPTIONS_DEFAULT=\tPGSQL LDAP SSL\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4065
+#, no-wrap
+msgid ""
+"OPTIONS_SINGLE=\t\tBACKEND\n"
+"OPTIONS_SINGLE_BACKEND=\tMYSQL PGSQL BDB\n"
+msgstr ""
+"OPTIONS_SINGLE=\t\tBACKEND\n"
+"OPTIONS_SINGLE_BACKEND=\tMYSQL PGSQL BDB\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4068
+#, no-wrap
+msgid ""
+"OPTIONS_MULTI=\t\tAUTH\n"
+"OPTIONS_MULTI_AUTH=\tLDAP PAM SSL\n"
+msgstr ""
+"OPTIONS_MULTI=\t\tAUTH\n"
+"OPTIONS_MULTI_AUTH=\tLDAP PAM SSL\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4076
+#, no-wrap
+msgid ""
+"EXAMPLES_DESC=\t\tInstall extra examples\n"
+"MYSQL_DESC=\t\tUse MySQL as backend\n"
+"PGSQL_DESC=\t\tUse PostgreSQL as backend\n"
+"BDB_DESC=\t\tUse Berkeley DB as backend\n"
+"LDAP_DESC=\t\tBuild with LDAP authentication support\n"
+"PAM_DESC=\t\tBuild with PAM support\n"
+"SSL_DESC=\t\tBuild with OpenSSL support\n"
+msgstr ""
+"EXAMPLES_DESC=\t\tInstall extra examples\n"
+"MYSQL_DESC=\t\tUse MySQL as backend\n"
+"PGSQL_DESC=\t\tUse PostgreSQL as backend\n"
+"BDB_DESC=\t\tUse Berkeley DB as backend\n"
+"LDAP_DESC=\t\tBuild with LDAP authentication support\n"
+"PAM_DESC=\t\tBuild with PAM support\n"
+"SSL_DESC=\t\tBuild with OpenSSL support\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4081
+#, no-wrap
+msgid ""
+"# Will add USE_PGSQL=yes\n"
+"PGSQL_USE=\tpgsql=yes\n"
+"# Will add --enable-postgres / --disable-postgres\n"
+"PGSQL_CONFIGURE_ENABLE=\tpostgres\n"
+msgstr ""
+"# Will add USE_PGSQL=yes\n"
+"PGSQL_USE=\tpgsql=yes\n"
+"# Will add --enable-postgres / --disable-postgres\n"
+"PGSQL_CONFIGURE_ENABLE=\tpostgres\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4083
+#, no-wrap
+msgid "ICU_LIB_DEPENDS=\tlibicuuc.so:devel/icu\n"
+msgstr "ICU_LIB_DEPENDS=\tlibicuuc.so:devel/icu\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4088
+#, no-wrap
+msgid "# Check other OPTIONS\n"
+msgstr "# Check other OPTIONS\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4095
+#, no-wrap
+msgid "Default Options"
+msgstr "Опции по умолчанию"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4098
+msgid "These options are always on by default."
+msgstr "Эти опции всегда включены по умолчанию."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4100
+msgid "`DOCS` - build and install documentation."
+msgstr "`DOCS` — сборка и установка документации."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4101
+msgid "`NLS` - Native Language Support."
+msgstr "`NLS` — Поддержка родного языка."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4102
+msgid "`EXAMPLES` - build and install examples."
+msgstr "`EXAMPLES` — сборка и установка примеров."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4103
+msgid "`IPV6` - IPv6 protocol support."
+msgstr "`IPV6` — Поддержка протокола IPv6."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4108
+msgid ""
+"There is no need to add these to `OPTIONS_DEFAULT`. To have them active, "
+"and show up in the options selection dialog, however, they must be added to "
+"`OPTIONS_DEFINE`."
+msgstr ""
+"Нет необходимости добавлять их в `OPTIONS_DEFAULT`. Однако, чтобы они были "
+"активны и отображались в диалоге выбора опций, их необходимо добавить в "
+"`OPTIONS_DEFINE`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4111
+#, no-wrap
+msgid "Feature Auto-Activation"
+msgstr "Автоматическая активация функций"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4115
+msgid ""
+"When using a GNU configure script, keep an eye on which optional features "
+"are activated by auto-detection. Explicitly disable optional features that "
+"are not needed by adding `--without-xxx` or `--disable-xxx` in "
+"`CONFIGURE_ARGS`."
+msgstr ""
+"При использовании скрипта GNU configure следите за тем, какие дополнительные "
+"функции активируются автоматическим определением. Явно отключите ненужные "
+"дополнительные функции, добавив `--without-xxx` или `--disable-xxx` в "
+"`CONFIGURE_ARGS`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4117
+#, no-wrap
+msgid "Wrong Handling of an Option"
+msgstr "Неправильная обработка опции"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4127
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MFOO}\n"
+"LIB_DEPENDS+=\t\tlibfoo.so:devel/foo\n"
+"CONFIGURE_ARGS+=\t--enable-foo\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MFOO}\n"
+"LIB_DEPENDS+=\t\tlibfoo.so:devel/foo\n"
+"CONFIGURE_ARGS+=\t--enable-foo\n"
+".endif\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4135
+msgid ""
+"In the example above, imagine a library libfoo is installed on the system. "
+"The user does not want this application to use libfoo, so he toggled the "
+"option off in the `make config` dialog. But the application's configure "
+"script detects the library present in the system and includes its support in "
+"the resulting executable. Now when the user decides to remove libfoo from "
+"the system, the ports system does not protest (no dependency on libfoo was "
+"recorded) but the application breaks."
+msgstr ""
+"В приведённом выше примере представьте, что библиотека libfoo установлена в "
+"системе. Пользователь не хочет, чтобы это приложение использовало libfoo, "
+"поэтому он отключил соответствующую опцию в диалоге `make config`. Однако "
+"скрипт configure приложения обнаруживает библиотеку в системе и включает её "
+"поддержку в итоговом исполняемом файле. Теперь, когда пользователь решает "
+"удалить libfoo из системы, система портов не протестует (зависимость от "
+"libfoo не была записана), но приложение перестаёт работать."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4137
+#, no-wrap
+msgid "Correct Handling of an Option"
+msgstr "Правильная обработка опции"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4146
+#, no-wrap
+msgid ""
+"FOO_LIB_DEPENDS=\t\tlibfoo.so:devel/foo\n"
+"# Will add --enable-foo / --disable-foo\n"
+"FOO_CONFIGURE_ENABLE=\tfoo\n"
+msgstr ""
+"FOO_LIB_DEPENDS=\t\tlibfoo.so:devel/foo\n"
+"# Will add --enable-foo / --disable-foo\n"
+"FOO_CONFIGURE_ENABLE=\tfoo\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4154
+msgid ""
+"Under some circumstances, the shorthand conditional syntax can cause "
+"problems with complex constructs. The errors are usually `Malformed "
+"conditional`, an alternative syntax can be used."
+msgstr ""
+"В некоторых случаях сокращенный синтаксис условных выражений может вызывать "
+"проблемы со сложными конструкциями. Ошибки обычно имеют вид `Malformed "
+"conditional`, тогда можно использовать альтернативный синтаксис."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4158
+#, no-wrap
+msgid ".if !empty(VARIABLE:MVALUE)\n"
+msgstr ".if !empty(VARIABLE:MVALUE)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4161
+msgid "as an alternative to"
+msgstr "в качестве альтернативы"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4165
+#, no-wrap
+msgid ".if ${VARIABLE:MVALUE}\n"
+msgstr ".if ${VARIABLE:MVALUE}\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4170
+#, no-wrap
+msgid "Options Helpers"
+msgstr "Помощники параметров"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4174
+msgid ""
+"There are some macros to help simplify conditional values which differ based "
+"on the options set. For easier access, a comprehensive list is provided:"
+msgstr ""
+"Существуют макросы, которые помогают упростить условные значения, "
+"различающиеся в зависимости от установленных опций. Для удобства приведён "
+"полный список:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4175
+#, no-wrap
+msgid "`PLIST_SUB`, `SUB_LIST`"
+msgstr "`PLIST_SUB`, `SUB_LIST`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4177
+msgid ""
+"For automatic `%%_OPT_%%` and `%%NO__OPT__%%` generation, see "
+"crossref:makefiles[options_sub, `OPTIONS_SUB`]."
+msgstr ""
+"Для автоматической генерации `%%_OPT_%%` и `%%NO__OPT__%%` см. "
+"crossref:makefiles[options_sub, `OPTIONS_SUB`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4179
+msgid ""
+"For more complex usage, see crossref:makefiles[options-variables, Generic "
+"Variables Replacement, `OPT_VARIABLE` and `OPT_VARIABLE_OFF`]."
+msgstr ""
+"Для более сложных случаев использования см. crossref:makefiles[options-"
+"variables, Замена общих переменных, `OPT_VARIABLE` и `OPT_VARIABLE_OFF`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4180
+#, no-wrap
+msgid "`CONFIGURE_ARGS`"
+msgstr "`CONFIGURE_ARGS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4182
+msgid ""
+"For `--enable-_x_` and `--disable-_x_`, see crossref:makefiles[options-"
+"configure_enable, `OPT_CONFIGURE_ENABLE`]."
+msgstr ""
+"Для информации о `--enable-_x_` и `--disable-_x_` см. "
+"crossref:makefiles[options-configure_enable, `OPT_CONFIGURE_ENABLE`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4184
+msgid ""
+"For `--with-_x_` and `--without-_x_`, see crossref:makefiles[options-"
+"configure_with, `OPT_CONFIGURE_WITH`]."
+msgstr ""
+"О `--with-_x_` и `--without-_x_` см. crossref:makefiles[options-"
+"configure_with, `OPT_CONFIGURE_WITH`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4186
+msgid ""
+"For all other cases, see crossref:makefiles[options-configure_on, "
+"`OPT_CONFIGURE_ON` and `OPT_CONFIGURE_OFF`]."
+msgstr ""
+"Во всех остальных случаях см. crossref:makefiles[options-configure_on, "
+"`OPT_CONFIGURE_ON` и `OPT_CONFIGURE_OFF`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4187
+#, no-wrap
+msgid "`CMAKE_ARGS`"
+msgstr "`CMAKE_ARGS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4190
+msgid ""
+"For arguments that are booleans (`on`, `off`, `true`, `false`, `0`, `1`) see "
+"crossref:makefiles[options-cmake_bool, `OPT_CMAKE_BOOL` and "
+"`OPT_CMAKE_BOOL_OFF`]."
+msgstr ""
+"Для аргументов, которые являются булевыми значениями (`on`, `off`, `true`, "
+"`false`, `0`, `1`), см. crossref:makefiles[options-cmake_bool, "
+"`OPT_CMAKE_BOOL` и `OPT_CMAKE_BOOL_OFF`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4192
+msgid ""
+"For all other cases, see crossref:makefiles[options-cmake_on, `OPT_CMAKE_ON` "
+"and `OPT_CMAKE_OFF`]."
+msgstr ""
+"Для всех остальных случаев см. crossref:makefiles[options-cmake_on, "
+"`OPT_CMAKE_ON` и `OPT_CMAKE_OFF`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4193
+#, no-wrap
+msgid "`MESON_ARGS`"
+msgstr "`MESON_ARGS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4195
+msgid ""
+"For arguments that take `true` or `false`, see crossref:makefiles[options-"
+"meson_true, `OPT_MESON_TRUE` and `OPT_MESON_FALSE`]."
+msgstr ""
+"Для аргументов, принимающих `true` или `false`, см. "
+"crossref:makefiles[options-meson_true, `OPT_MESON_TRUE` и `OPT_MESON_FALSE`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4197
+msgid ""
+"For arguments that take `yes` or `no`, use crossref:makefiles[options-"
+"meson_yes, `OPT_MESON_YES` and `OPT_MESON_NO`]."
+msgstr ""
+"Для аргументов, принимающих `yes` или `no`, используйте "
+"crossref:makefiles[options-meson_yes, `OPT_MESON_YES` и `OPT_MESON_NO`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4199
+msgid ""
+"For arguments that take `enabled` or `disabled`, see "
+"crossref:makefiles[options-meson_enabled, `OPT_MESON_ENABLED` and "
+"`OPT_MESON_DISABLED`]."
+msgstr ""
+"Для аргументов, принимающих `enabled` или `disabled`, см. "
+"crossref:makefiles[options-meson_enabled, `OPT_MESON_ENABLED` и "
+"`OPT_MESON_DISABLED`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4201
+msgid ""
+"For all other cases, use crossref:makefiles[options-meson_on, `OPT_MESON_ON` "
+"and `OPT_MESON_OFF`]."
+msgstr ""
+"Во всех остальных случаях используйте crossref:makefiles[options-meson_on, "
+"`OPT_MESON_ON` и `OPT_MESON_OFF`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4202
+#, no-wrap
+msgid "`QMAKE_ARGS`"
+msgstr "`QMAKE_ARGS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4204
+msgid ""
+"See crossref:makefiles[options-qmake_on, `OPT_QMAKE_ON` and `OPT_QMAKE_OFF`]."
+msgstr ""
+"См. crossref:makefiles[options-qmake_on, `OPT_QMAKE_ON` и `OPT_QMAKE_OFF`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4207
+msgid "See crossref:makefiles[options-use, `OPT_USE` and `OPT_USE_OFF`]."
+msgstr "См. crossref:makefiles[options-use, `OPT_USE` и `OPT_USE_OFF`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4208
+#, no-wrap
+msgid "`*_DEPENDS`"
+msgstr "`*_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4210
+msgid ""
+"See crossref:makefiles[options-dependencies, Dependencies, `OPT_DEPTYPE` and "
+"`OPT_DEPTYPE_OFF`]."
+msgstr ""
+"См. crossref:makefiles[options-dependencies, Зависимости, `OPT_DEPTYPE` и "
+"`OPT_DEPTYPE_OFF`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4211
+#, no-wrap
+msgid "`*` (Any variable)"
+msgstr "`*` (Любая переменная)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4214
+msgid ""
+"The most used variables have direct helpers, see crossref:makefiles[options-"
+"variables, Generic Variables Replacement, `OPT_VARIABLE` and "
+"`OPT_VARIABLE_OFF`]."
+msgstr ""
+"Наиболее используемые переменные имеют своих помощников, см. "
+"crossref:makefiles[options-variables, Замена Общих Переменных, "
+"`OPT_VARIABLE` и `OPT_VARIABLE_OFF`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4216
+msgid ""
+"For any variable without a specific helper, see crossref:makefiles[options-"
+"vars, `OPT_VARS` and `OPT_VARS_OFF`]."
+msgstr ""
+"Для любой переменной без специального помощника см. "
+"crossref:makefiles[options-vars, `OPT_VARS` и `OPT_VARS_OFF`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4217
+#, no-wrap
+msgid "Options dependencies"
+msgstr "Зависимости параметров"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4220
+msgid ""
+"When an option need another option to work, see crossref:makefiles[options-"
+"implies, `OPT_IMPLIES`]."
+msgstr ""
+"Когда для работы опции требуется другая опция, см. "
+"crossref:makefiles[options-implies, `OPT_IMPLIES`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4221
+#, no-wrap
+msgid "Options conflicts"
+msgstr "Конфликты опций"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4224
+msgid ""
+"When an option cannot work if another is also enabled, see "
+"crossref:makefiles[options-prevents, `OPT_PREVENTS` and `OPT_PREVENTS_MSG`]."
+msgstr ""
+"Когда опция не может работать, если включена другая, см. "
+"crossref:makefiles[options-prevents, `OPT_PREVENTS` и `OPT_PREVENTS_MSG`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4225
+#, no-wrap
+msgid "Build targets"
+msgstr "Цели сборки"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4228
+msgid ""
+"When an option need some extra processing, see crossref:makefiles[options-"
+"targets, Additional Build Targets, `_target_-_OPT_-on` and `_target_-_OPT_-"
+"off`]."
+msgstr ""
+"Когда для опции требуется дополнительная обработка, см. "
+"crossref:makefiles[options-targets, Дополнительные цели сборки, `_target_-"
+"_OPT_-on` и `_target_-_OPT_-off`]."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4230
+#, no-wrap
+msgid "`OPTIONS_SUB`"
+msgstr "`OPTIONS_SUB`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4233
+msgid ""
+"If `OPTIONS_SUB` is set to `yes` then each of the options added to "
+"`OPTIONS_DEFINE` will be added to `PLIST_SUB` and `SUB_LIST`, for example:"
+msgstr ""
+"Если `OPTIONS_SUB` установлен в `yes`, то каждая из опций, добавленных в "
+"`OPTIONS_DEFINE`, будет добавлена в `PLIST_SUB` и `SUB_LIST`, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4238
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPTIONS_SUB=\tyes\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPTIONS_SUB=\tyes\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4241
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4280
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4316
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4353
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4388
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4425
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4461
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4495
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4525
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4557
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4589
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4618
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4771
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4844
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4921
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5011
+msgid "is equivalent to:"
+msgstr "эквивалентно:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4245
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4284
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4320
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4392
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4429
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4465
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4499
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4529
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4561
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4593
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4622
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4848
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4925
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5002
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5015
+#, no-wrap
+msgid "OPTIONS_DEFINE=\tOPT1\n"
+msgstr "OPTIONS_DEFINE=\tOPT1\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4247
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4286
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4322
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4359
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4394
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4431
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4467
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4501
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4531
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4563
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4595
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4624
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4656
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4713
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4779
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4850
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4927
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5017
+#, no-wrap
+msgid ".include <bsd.port.options.mk>\n"
+msgstr ".include <bsd.port.options.mk>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4255
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"PLIST_SUB+=\tOPT1=\"\" NO_OPT1=\"@comment \"\n"
+"SUB_LIST+=\tOPT1=\"\" NO_OPT1=\"@comment \"\n"
+".else\n"
+"PLIST_SUB+=\tOPT1=\"@comment \" NO_OPT1=\"\"\n"
+"SUB_LIST+=\tOPT1=\"@comment \" NO_OPT1=\"\"\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"PLIST_SUB+=\tOPT1=\"\" NO_OPT1=\"@comment \"\n"
+"SUB_LIST+=\tOPT1=\"\" NO_OPT1=\"@comment \"\n"
+".else\n"
+"PLIST_SUB+=\tOPT1=\"@comment \" NO_OPT1=\"\"\n"
+"SUB_LIST+=\tOPT1=\"@comment \" NO_OPT1=\"\"\n"
+".endif\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4261
+msgid ""
+"The value of `OPTIONS_SUB` is ignored. Setting it to any value will add "
+"`PLIST_SUB` and `SUB_LIST` entries for _all_ options."
+msgstr ""
+"Значение `OPTIONS_SUB` игнорируется. Установка любого значения добавит "
+"записи `PLIST_SUB` и `SUB_LIST` для _всех_ опций."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4264
+#, no-wrap
+msgid "`OPT_USE` and `OPT_USE_OFF`"
+msgstr "`OPT_USE` и `OPT_USE_OFF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4270
+msgid ""
+"When option _OPT_ is selected, for each `_key=value_` pair in ``OPT_USE``, "
+"_value_ is appended to the corresponding `USE_KEY`. If _value_ has spaces "
+"in it, replace them with commas and they will be changed back to spaces "
+"during processing. `OPT_USE_OFF` works the same way, but when `OPT` is "
+"_not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, для каждой пары `_ключ=значение_` в ``OPT_USE``, "
+"_значение_ добавляется к соответствующему `USE_KEY`. Если _значение_ "
+"содержит пробелы, замените их запятыми, и они будут преобразованы обратно в "
+"пробелы во время обработки. `OPT_USE_OFF` работает аналогично, но когда "
+"`OPT` _не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4277
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_USES=\txorg\n"
+"OPT1_USE=\tmysql=yes xorg=x11,xextproto,xext,xrandr\n"
+"OPT1_USE_OFF=\topenssl=yes\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_USES=\txorg\n"
+"OPT1_USE=\tmysql=yes xorg=x11,xextproto,xext,xrandr\n"
+"OPT1_USE_OFF=\topenssl=yes\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4294
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"USE_MYSQL=\tyes\n"
+"USES+=\t\txorg\n"
+"USE_XORG=\tx11 xextproto xext xrandr\n"
+".else\n"
+"USE_OPENSSL=\tyes\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"USE_MYSQL=\tyes\n"
+"USES+=\t\txorg\n"
+"USE_XORG=\tx11 xextproto xext xrandr\n"
+".else\n"
+"USE_OPENSSL=\tyes\n"
+".endif\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4297
+#, no-wrap
+msgid "`CONFIGURE_ARGS` Helpers"
+msgstr "Помощники `CONFIGURE_ARGS`"
+
+#. type: Title =====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4300
+#, no-wrap
+msgid "`OPT_CONFIGURE_ENABLE`"
+msgstr "`OPT_CONFIGURE_ENABLE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4307
+msgid ""
+"When option _OPT_ is selected, for each _entry_ in `OPT_CONFIGURE_ENABLE` "
+"then `--enable-_entry_` is appended to `CONFIGURE_ARGS`. When option _OPT_ "
+"is _not_ selected, `--disable-_entry_` is appended to `CONFIGURE_ARGS`. An "
+"optional argument can be specified with an `=` symbol. This argument is "
+"only appended to the `--enable-_entry_` configure option. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_CONFIGURE_ENABLE` к "
+"`CONFIGURE_ARGS` добавляется `--enable-_элемент_`. Если опция _OPT_ _не_ "
+"выбрана, к `CONFIGURE_ARGS` добавляется `--disable-_элемент_`. "
+"Необязательный аргумент может быть указан с помощью символа `=`. Этот "
+"аргумент добавляется только к опции конфигурации `--enable-_элемент_`. "
+"Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4313
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1 OPT2\n"
+"OPT1_CONFIGURE_ENABLE=\ttest1 test2\n"
+"OPT2_CONFIGURE_ENABLE=\ttest2=exhaustive\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1 OPT2\n"
+"OPT1_CONFIGURE_ENABLE=\ttest1 test2\n"
+"OPT2_CONFIGURE_ENABLE=\ttest2=exhaustive\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4328
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--enable-test1 --enable-test2\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-test1 --disable-test2\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--enable-test1 --enable-test2\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-test1 --disable-test2\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4334
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT2}\n"
+"CONFIGURE_ARGS+=\t--enable-test2=exhaustive\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-test2\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT2}\n"
+"CONFIGURE_ARGS+=\t--enable-test2=exhaustive\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-test2\n"
+".endif\n"
+
+#. type: Title =====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4337
+#, no-wrap
+msgid "`OPT_CONFIGURE_WITH`"
+msgstr "`OPT_CONFIGURE_WITH`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4344
+msgid ""
+"When option _OPT_ is selected, for each _entry_ in `_OPT_CONFIGURE_WITH` "
+"then `--with-_entry_` is appended to `CONFIGURE_ARGS`. When option _OPT_ is "
+"_not_ selected, `--without-_entry_` is appended to `CONFIGURE_ARGS`. An "
+"optional argument can be specified with an `=` symbol. This argument is "
+"only appended to the `--with-_entry_` configure option. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, для каждого _элемента_ в `_OPT_CONFIGURE_WITH` к "
+"`CONFIGURE_ARGS` добавляется `--with-_элемент_`. Если опция _OPT_ _не_ "
+"выбрана, к `CONFIGURE_ARGS` добавляется `--without-_элемент_`. "
+"Необязательный аргумент можно указать с помощью символа `=`. Этот аргумент "
+"добавляется только к опции конфигурации `--with-_элемент_`. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4350
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1 OPT2\n"
+"OPT1_CONFIGURE_WITH=\ttest1\n"
+"OPT2_CONFIGURE_WITH=\ttest2=exhaustive\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1 OPT2\n"
+"OPT1_CONFIGURE_WITH=\ttest1\n"
+"OPT2_CONFIGURE_WITH=\ttest2=exhaustive\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4365
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--with-test1\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--without-test1\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--with-test1\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--without-test1\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4371
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT2}\n"
+"CONFIGURE_ARGS+=\t--with-test2=exhaustive\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--without-test2\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT2}\n"
+"CONFIGURE_ARGS+=\t--with-test2=exhaustive\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--without-test2\n"
+".endif\n"
+
+#. type: Title =====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4374
+#, no-wrap
+msgid "`OPT_CONFIGURE_ON` and `OPT_CONFIGURE_OFF`"
+msgstr "`OPT_CONFIGURE_ON` и `OPT_CONFIGURE_OFF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4379
+msgid ""
+"When option _OPT_ is selected, the value of `OPT_CONFIGURE_ON`, if defined, "
+"is appended to `CONFIGURE_ARGS`. `OPT_CONFIGURE_OFF` works the same way, "
+"but when `OPT` is _not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, значение `OPT_CONFIGURE_ON`, если оно определено, "
+"добавляется к `CONFIGURE_ARGS`. `OPT_CONFIGURE_OFF` работает аналогично, но "
+"когда `OPT` _не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4385
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_CONFIGURE_ON=\t--add-test\n"
+"OPT1_CONFIGURE_OFF=\t--no-test\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_CONFIGURE_ON=\t--add-test\n"
+"OPT1_CONFIGURE_OFF=\t--no-test\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4400
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--add-test\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--no-test\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--add-test\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--no-test\n"
+".endif\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4406
+msgid ""
+"Most of the time, the helpers in crossref:makefiles[options-"
+"configure_enable, `OPT_CONFIGURE_ENABLE`] and crossref:makefiles[options-"
+"configure_with, `OPT_CONFIGURE_WITH`] provide a shorter and more "
+"comprehensive functionality."
+msgstr ""
+"В большинстве случаев помощники crossref:makefiles[options-configure_enable, "
+"`OPT_CONFIGURE_ENABLE`] и crossref:makefiles[options-configure_with, "
+"`OPT_CONFIGURE_WITH`] предоставляют более короткий и понятный функционал."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4409
+#, no-wrap
+msgid "`CMAKE_ARGS` Helpers"
+msgstr "Помощники `CMAKE_ARGS`"
+
+#. type: Title =====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4412
+#, no-wrap
+msgid "`OPT_CMAKE_ON` and `OPT_CMAKE_OFF`"
+msgstr "`OPT_CMAKE_ON` и `OPT_CMAKE_OFF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4416
+msgid ""
+"When option _OPT_ is selected, the value of `OPT_CMAKE_ON`, if defined, is "
+"appended to `CMAKE_ARGS`. `OPT_CMAKE_OFF` works the same way, but when `OPT` "
+"is _not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, значение `OPT_CMAKE_ON`, если оно определено, "
+"добавляется к `CMAKE_ARGS`. `OPT_CMAKE_OFF` работает аналогично, но когда "
+"`OPT` _не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4422
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_CMAKE_ON=\t-DTEST:BOOL=true -DDEBUG:BOOL=true\n"
+"OPT1_CMAKE_OFF=\t-DOPTIMIZE:BOOL=true\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_CMAKE_ON=\t-DTEST:BOOL=true -DDEBUG:BOOL=true\n"
+"OPT1_CMAKE_OFF=\t-DOPTIMIZE:BOOL=true\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4437
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CMAKE_ARGS+=\t-DTEST:BOOL=true -DDEBUG:BOOL=true\n"
+".else\n"
+"CMAKE_ARGS+=\t-DOPTIMIZE:BOOL=true\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CMAKE_ARGS+=\t-DTEST:BOOL=true -DDEBUG:BOOL=true\n"
+".else\n"
+"CMAKE_ARGS+=\t-DOPTIMIZE:BOOL=true\n"
+".endif\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4443
+msgid ""
+"See crossref:makefiles[options-cmake_bool, `OPT_CMAKE_BOOL` and "
+"`OPT_CMAKE_BOOL_OFF`] for a shorter helper when the value is boolean."
+msgstr ""
+"См. crossref:makefiles[options-cmake_bool, `OPT_CMAKE_BOOL` и "
+"`OPT_CMAKE_BOOL_OFF`] для более краткой записи, когда значение является "
+"булевым."
+
+#. type: Title =====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4446
+#, no-wrap
+msgid "`OPT_CMAKE_BOOL` and `OPT_CMAKE_BOOL_OFF`"
+msgstr "`OPT_CMAKE_BOOL` и `OPT_CMAKE_BOOL_OFF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4452
+msgid ""
+"When option _OPT_ is selected, for each _entry_ in `OPT_CMAKE_BOOL` then `-"
+"D_entry_:BOOL=true` is appended to `CMAKE_ARGS`. When option _OPT_ is _not_ "
+"selected, `-D_entry_:BOOL=false` is appended to `CONFIGURE_ARGS`. "
+"`OPT_CMAKE_BOOL_OFF` is the opposite, `-D_entry_:BOOL=false` is appended to "
+"`CMAKE_ARGS` when the option is selected, and `-D_entry_:BOOL=true` when the "
+"option is _not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_CMAKE_BOOL` "
+"добавляется `-D_элемент_:BOOL=true` к `CMAKE_ARGS`. Если опция _OPT_ _не_ "
+"выбрана, `-D_элемент_:BOOL=false` добавляется к `CONFIGURE_ARGS`. "
+"`OPT_CMAKE_BOOL_OFF` работает наоборот: `-D_элемент_:BOOL=false` добавляется "
+"к `CMAKE_ARGS`, когда опция выбрана, и `-D_элемент_:BOOL=true`, когда опция "
+"_не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4458
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_CMAKE_BOOL=\tTEST DEBUG\n"
+"OPT1_CMAKE_BOOL_OFF=\tOPTIMIZE\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_CMAKE_BOOL=\tTEST DEBUG\n"
+"OPT1_CMAKE_BOOL_OFF=\tOPTIMIZE\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4475
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CMAKE_ARGS+=\t-DTEST:BOOL=true -DDEBUG:BOOL=true \\\n"
+"\t\t-DOPTIMIZE:BOOL=false\n"
+".else\n"
+"CMAKE_ARGS+=\t-DTEST:BOOL=false -DDEBUG:BOOL=false \\\n"
+"\t\t-DOPTIMIZE:BOOL=true\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CMAKE_ARGS+=\t-DTEST:BOOL=true -DDEBUG:BOOL=true \\\n"
+"\t\t-DOPTIMIZE:BOOL=false\n"
+".else\n"
+"CMAKE_ARGS+=\t-DTEST:BOOL=false -DDEBUG:BOOL=false \\\n"
+"\t\t-DOPTIMIZE:BOOL=true\n"
+".endif\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4478
+#, no-wrap
+msgid "`MESON_ARGS` Helpers"
+msgstr "Помощники `MESON_ARGS`"
+
+#. type: Title =====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4481
+#, no-wrap
+msgid "`OPT_MESON_ON` and `OPT_MESON_OFF`"
+msgstr "`OPT_MESON_ON` и `OPT_MESON_OFF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4486
+msgid ""
+"When option _OPT_ is selected, the value of `OPT_MESON_ON`, if defined, is "
+"appended to `MESON_ARGS`. `OPT_MESON_OFF` works the same way, but when "
+"`OPT` is _not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, значение `OPT_MESON_ON`, если оно определено, "
+"добавляется к `MESON_ARGS`. `OPT_MESON_OFF` работает аналогичным образом, "
+"но когда `OPT` _не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4492
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_MESON_ON=\t-Dopt=1\n"
+"OPT1_MESON_OFF=\t-Dopt=2\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_MESON_ON=\t-Dopt=1\n"
+"OPT1_MESON_OFF=\t-Dopt=2\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4507
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"MESON_ARGS+=\t-Dopt=1\n"
+".else\n"
+"MESON_ARGS+=\t-Dopt=2\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"MESON_ARGS+=\t-Dopt=1\n"
+".else\n"
+"MESON_ARGS+=\t-Dopt=2\n"
+".endif\n"
+
+#. type: Title =====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4510
+#, no-wrap
+msgid "`OPT_MESON_TRUE` and `OPT_MESON_FALSE`"
+msgstr "`OPT_MESON_TRUE` и `OPT_MESON_FALSE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4516
+msgid ""
+"When option _OPT_ is selected, for each _entry_ in `OPT_MESON_TRUE` then `-"
+"D_entry_=true` is appended to `MESON_ARGS`. When option _OPT_ is _not_ "
+"selected, `-D_entry_=false` is appended to `MESON_ARGS`. `OPT_MESON_FALSE` "
+"is the opposite, `-D_entry_=false` is appended to `MESON_ARGS` when the "
+"option is selected, and `-D_entry_=true` when the option is _not_ selected. "
+"For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_MESON_TRUE` "
+"добавляется `-D_элемент_=true` в `MESON_ARGS`. Если опция _OPT_ _не_ "
+"выбрана, добавляется `-D_элемент_=false` в `MESON_ARGS`. `OPT_MESON_FALSE` "
+"работает противоположным образом: `-D_элемент_=false` добавляется в "
+"`MESON_ARGS`, когда опция выбрана, и `-D_элемент_=true`, когда опция _не_ "
+"выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4522
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_MESON_TRUE=\ttest debug\n"
+"OPT1_MESON_FALSE=\toptimize\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_MESON_TRUE=\ttest debug\n"
+"OPT1_MESON_FALSE=\toptimize\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4539
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"MESON_ARGS+=\t-Dtest=true -Ddebug=true \\\n"
+"\t\t-Doptimize=false\n"
+".else\n"
+"MESON_ARGS+=\t-Dtest=false -Ddebug=false \\\n"
+"\t\t-Doptimize=true\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"MESON_ARGS+=\t-Dtest=true -Ddebug=true \\\n"
+"\t\t-Doptimize=false\n"
+".else\n"
+"MESON_ARGS+=\t-Dtest=false -Ddebug=false \\\n"
+"\t\t-Doptimize=true\n"
+".endif\n"
+
+#. type: Title =====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4542
+#, no-wrap
+msgid "`OPT_MESON_YES` and `OPT_MESON_NO`"
+msgstr "`OPT_MESON_YES` и `OPT_MESON_NO`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4548
+msgid ""
+"When option _OPT_ is selected, for each _entry_ in `OPT_MESON_YES` then `-"
+"D_entry_=yes` is appended to `MESON_ARGS`. When option _OPT_ is _not_ "
+"selected, `-D_entry_=no` is appended to `MESON_ARGS`. `OPT_MESON_NO` is the "
+"opposite, `-D_entry_=no` is appended to `MESON_ARGS` when the option is "
+"selected, and `-D_entry_=yes` when the option is _not_ selected. For "
+"example:"
+msgstr ""
+"Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_MESON_YES` "
+"добавляется `-D_элемент_=yes` к `MESON_ARGS`. Если опция _OPT_ _не_ выбрана, "
+"добавляется `-D_элемент_=no` к `MESON_ARGS`. `OPT_MESON_NO` работает "
+"противоположным образом: `-D_элемент_=no` добавляется к `MESON_ARGS`, когда "
+"опция выбрана, и `-D_элемент_=yes`, когда опция _не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4554
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_MESON_YES=\ttest debug\n"
+"OPT1_MESON_NO=\toptimize\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_MESON_YES=\ttest debug\n"
+"OPT1_MESON_NO=\toptimize\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4571
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"MESON_ARGS+=\t-Dtest=yes -Ddebug=yes \\\n"
+"\t\t-Doptimize=no\n"
+".else\n"
+"MESON_ARGS+=\t-Dtest=no -Ddebug=no \\\n"
+"\t\t-Doptimize=yes\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"MESON_ARGS+=\t-Dtest=yes -Ddebug=yes \\\n"
+"\t\t-Doptimize=no\n"
+".else\n"
+"MESON_ARGS+=\t-Dtest=no -Ddebug=no \\\n"
+"\t\t-Doptimize=yes\n"
+".endif\n"
+
+#. type: Title =====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4574
+#, no-wrap
+msgid "`OPT_MESON_ENABLED` and `OPT_MESON_DISABLED`"
+msgstr "`OPT_MESON_ENABLED` и `OPT_MESON_DISABLED`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4580
+msgid ""
+"When option _OPT_ is selected, for each _entry_ in `OPT_MESON_ENABLED` then "
+"`-D_entry_=enabled` is appended to `MESON_ARGS`. When option _OPT_ is _not_ "
+"selected, `-D_entry_=disabled` is appended to `MESON_ARGS`. "
+"`OPT_MESON_DISABLED` is the opposite, `-D_entry_=disabled` is appended to "
+"`MESON_ARGS` when the option is selected, and `-D_entry_=enabled` when the "
+"option is _not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, для каждого _элемента_ в `OPT_MESON_ENABLED` "
+"добавляется `-D_элемент_=enabled` к `MESON_ARGS`. Когда опция _OPT_ _не_ "
+"выбрана, добавляется `-D_элемент_=disabled` к `MESON_ARGS`. "
+"`OPT_MESON_DISABLED` работает противоположным образом: `-"
+"D_элемент_=disabled` добавляется к `MESON_ARGS`, когда опция выбрана, и `-"
+"D_элемент_=enabled`, когда опция _не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4586
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_MESON_ENABLED=\ttest\n"
+"OPT1_MESON_DISABLED=\tdebug\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_MESON_ENABLED=\ttest\n"
+"OPT1_MESON_DISABLED=\tdebug\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4601
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"MESON_ARGS+=\t-Dtest=enabled -Ddebug=disabled\n"
+".else\n"
+"MESON_ARGS+=\t-Dtest=disabled -Ddebug=enabled\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"MESON_ARGS+=\t-Dtest=enabled -Ddebug=disabled\n"
+".else\n"
+"MESON_ARGS+=\t-Dtest=disabled -Ddebug=enabled\n"
+".endif\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4604
+#, no-wrap
+msgid "`OPT_QMAKE_ON` and `OPT_QMAKE_OFF`"
+msgstr "`OPT_QMAKE_ON` и `OPT_QMAKE_OFF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4609
+msgid ""
+"When option _OPT_ is selected, the value of `OPT_QMAKE_ON`, if defined, is "
+"appended to `QMAKE_ARGS`. `OPT_QMAKE_OFF` works the same way, but when "
+"`OPT` is _not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, значение `OPT_QMAKE_ON`, если оно определено, "
+"добавляется к `QMAKE_ARGS`. `OPT_QMAKE_OFF` работает аналогичным образом, "
+"но когда `OPT` _не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4615
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_QMAKE_ON=\t-DTEST:BOOL=true\n"
+"OPT1_QMAKE_OFF=\t-DPRODUCTION:BOOL=true\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_QMAKE_ON=\t-DTEST:BOOL=true\n"
+"OPT1_QMAKE_OFF=\t-DPRODUCTION:BOOL=true\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4630
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"QMAKE_ARGS+=\t-DTEST:BOOL=true\n"
+".else\n"
+"QMAKE_ARGS+=\t-DPRODUCTION:BOOL=true\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"QMAKE_ARGS+=\t-DTEST:BOOL=true\n"
+".else\n"
+"QMAKE_ARGS+=\t-DPRODUCTION:BOOL=true\n"
+".endif\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4633
+#, no-wrap
+msgid "`OPT_IMPLIES`"
+msgstr "`OPT_IMPLIES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4636
+msgid "Provides a way to add dependencies between options."
+msgstr "Предоставляет способ добавления зависимостей между опциями."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4639
+msgid ""
+"When _OPT_ is selected, all the options listed in this variable will be "
+"selected too. Using the crossref:makefiles[options-"
+"configure_enable,`OPT_CONFIGURE_ENABLE`] described earlier to illustrate:"
+msgstr ""
+"При выборе _OPT_ все перечисленные в этой переменной опции также будут "
+"выбраны. В качестве примера можно использовать описанный ранее "
+"crossref:makefiles[options-configure_enable,`OPT_CONFIGURE_ENABLE`]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4644
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1 OPT2\n"
+"OPT1_IMPLIES=\tOPT2\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1 OPT2\n"
+"OPT1_IMPLIES=\tOPT2\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4647
+#, no-wrap
+msgid ""
+"OPT1_CONFIGURE_ENABLE=\topt1\n"
+"OPT2_CONFIGURE_ENABLE=\topt2\n"
+msgstr ""
+"OPT1_CONFIGURE_ENABLE=\topt1\n"
+"OPT2_CONFIGURE_ENABLE=\topt2\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4650
+msgid "Is equivalent to:"
+msgstr "Эквивалентно:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4662
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--enable-opt1\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-opt1\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--enable-opt1\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-opt1\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4668
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT2} || ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--enable-opt2\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-opt2\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT2} || ${PORT_OPTIONS:MOPT1}\n"
+"CONFIGURE_ARGS+=\t--enable-opt2\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-opt2\n"
+".endif\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4671
+#, no-wrap
+msgid "Simple Use of `OPT_IMPLIES`"
+msgstr "Простое использование `OPT_IMPLIES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4676
+msgid ""
+"This port has a `X11` option, and a `GNOME` option that needs the `X11` "
+"option to be selected to build."
+msgstr ""
+"Этот порт имеет опцию `X11` и опцию `GNOME`, для сборки которой необходимо "
+"выбрать опцию `X11`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4681
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tX11 GNOME\n"
+"OPTIONS_DEFAULT=\tX11\n"
+msgstr ""
+"OPTIONS_DEFINE=\tX11 GNOME\n"
+"OPTIONS_DEFAULT=\tX11\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4686
+#, no-wrap
+msgid ""
+"X11_USES=\txorg\n"
+"X11_USE=\txorg=xi,xextproto\n"
+"GNOME_USE=\tgnome=gtk30\n"
+"GNOME_IMPLIES=\tX11\n"
+msgstr ""
+"X11_USES=\txorg\n"
+"X11_USE=\txorg=xi,xextproto\n"
+"GNOME_USE=\tgnome=gtk30\n"
+"GNOME_IMPLIES=\tX11\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4691
+#, no-wrap
+msgid "`OPT_PREVENTS` and `OPT_PREVENTS_MSG`"
+msgstr "`OPT_PREVENTS` и `OPT_PREVENTS_MSG`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4694
+msgid "Provides a way to add conflicts between options."
+msgstr "Предоставляет способ добавления конфликтов между опциями."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4698
+msgid ""
+"When _OPT_ is selected, all the options listed in `OPT_PREVENTS` must be un-"
+"selected. If `OPT_PREVENTS_MSG` is set and a conflict is triggered, its "
+"content will be shown explaining why they conflict. For example:"
+msgstr ""
+"Когда выбрана _OPT_, все опции, перечисленные в `OPT_PREVENTS`, должны быть "
+"сняты. Если задано `OPT_PREVENTS_MSG` и возникает конфликт, его содержимое "
+"будет показано с объяснением причины конфликта. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4704
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1 OPT2\n"
+"OPT1_PREVENTS=\tOPT2\n"
+"OPT1_PREVENTS_MSG=\tOPT1 and OPT2 enable conflicting options\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1 OPT2\n"
+"OPT1_PREVENTS=\tOPT2\n"
+"OPT1_PREVENTS_MSG=\tOPT1 and OPT2 enable conflicting options\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4707
+msgid "Is roughly equivalent to:"
+msgstr "Примерно эквивалентно:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4717
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT2} && ${PORT_OPTIONS:MOPT1}\n"
+"BROKEN=\tOption OPT1 conflicts with OPT2 (select only one)\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT2} && ${PORT_OPTIONS:MOPT1}\n"
+"BROKEN=\tOption OPT1 conflicts with OPT2 (select only one)\n"
+".endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4720
+msgid ""
+"The only difference is that the first one will write an error after running "
+"`make config`, suggesting changing the selected options."
+msgstr ""
+"Единственное отличие заключается в том, что первый вариант выведет ошибку "
+"после выполнения `make config`, предлагая изменить выбранные настройки."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4722
+#, no-wrap
+msgid "Simple Use of `OPT_PREVENTS`"
+msgstr "Простое использование `OPT_PREVENTS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4728
+msgid ""
+"This port has `X509` and `SCTP` options. Both options add patches, but the "
+"patches conflict with each other, so they cannot be selected at the same "
+"time."
+msgstr ""
+"Этот порт имеет опции `X509` и `SCTP`. Обе опции добавляют патчи, но патчи "
+"конфликтуют друг с другом, поэтому их нельзя выбрать одновременно."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4732
+#, no-wrap
+msgid "OPTIONS_DEFINE=\tX509 SCTP\n"
+msgstr "OPTIONS_DEFINE=\tX509 SCTP\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4735
+#, no-wrap
+msgid ""
+"SCTP_PATCHFILES=\t${PORTNAME}-6.8p1-sctp-2573.patch.gz:-p1\n"
+"SCTP_CONFIGURE_WITH=\tsctp\n"
+msgstr ""
+"SCTP_PATCHFILES=\t${PORTNAME}-6.8p1-sctp-2573.patch.gz:-p1\n"
+"SCTP_CONFIGURE_WITH=\tsctp\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4740
+#, no-wrap
+msgid ""
+"X509_PATCH_SITES=\thttp://www.roumenpetrov.info/openssh/x509/:x509\n"
+"X509_PATCHFILES=\t${PORTNAME}-7.0p1+x509-8.5.diff.gz:-p1:x509\n"
+"X509_PREVENTS=\t\tSCTP\n"
+"X509_PREVENTS_MSG=\tX509 and SCTP patches conflict\n"
+msgstr ""
+"X509_PATCH_SITES=\thttp://www.roumenpetrov.info/openssh/x509/:x509\n"
+"X509_PATCHFILES=\t${PORTNAME}-7.0p1+x509-8.5.diff.gz:-p1:x509\n"
+"X509_PREVENTS=\t\tSCTP\n"
+"X509_PREVENTS_MSG=\tX509 and SCTP patches conflict\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4745
+#, no-wrap
+msgid "`OPT_VARS` and `OPT_VARS_OFF`"
+msgstr "`OPT_VARS` и `OPT_VARS_OFF`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4748
+msgid "Provides a generic way to set and append to variables."
+msgstr ""
+"Предоставляет универсальный способ установки и добавления значений "
+"переменным."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4753
+msgid ""
+"Before using `OPT_VARS` and `OPT_VARS_OFF`, see if there is already a more "
+"specific helper available in crossref:makefiles[options-variables, Generic "
+"Variables Replacement, `OPT_VARIABLE` and `OPT_VARIABLE_OFF`]."
+msgstr ""
+"Перед использованием `OPT_VARS` и `OPT_VARS_OFF` проверьте, доступен ли "
+"более специфичный вспомогательный инструмент в crossref:makefiles[options-"
+"variables, Универсальная замена переменных, `OPT_VARIABLE` и "
+"`OPT_VARIABLE_OFF`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4758
+msgid ""
+"When option _OPT_ is selected, and `OPT_VARS` defined, `_key_=_value_` and "
+"`_key_+=_value_` pairs are evaluated from `OPT_VARS`. An `=` cause the "
+"existing value of `KEY` to be overwritten, an `+=` appends to the value. "
+"`OPT_VARS_OFF` works the same way, but when `OPT` is _not_ selected."
+msgstr ""
+"Когда выбрана опция _OPT_ и определены `OPT_VARS`, пары `_key_=_value_` и "
+"`_key_+=_value_` обрабатываются из `OPT_VARS`. Оператор `=` приводит к "
+"перезаписи существующего значения `KEY`, а `+=` добавляет к значению. "
+"`OPT_VARS_OFF` работает аналогично, но когда `OPT` _не_ выбрана."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4766
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1 OPT2 OPT3\n"
+"OPT1_VARS=\talso_build+=bin1\n"
+"OPT2_VARS=\talso_build+=bin2\n"
+"OPT3_VARS=\tbin3_build=yes\n"
+"OPT3_VARS_OFF=\tbin3_build=no\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1 OPT2 OPT3\n"
+"OPT1_VARS=\talso_build+=bin1\n"
+"OPT2_VARS=\talso_build+=bin2\n"
+"OPT3_VARS=\tbin3_build=yes\n"
+"OPT3_VARS_OFF=\tbin3_build=no\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4768
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4777
+#, no-wrap
+msgid "MAKE_ARGS=\tALSO_BUILD=\"${ALSO_BUILD}\" BIN3_BUILD=\"${BIN3_BUILD}\"\n"
+msgstr "MAKE_ARGS=\tALSO_BUILD=\"${ALSO_BUILD}\" BIN3_BUILD=\"${BIN3_BUILD}\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4783
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"ALSO_BUILD+=\tbin1\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"ALSO_BUILD+=\tbin1\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4787
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT2}\n"
+"ALSO_BUILD+=\tbin2\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT2}\n"
+"ALSO_BUILD+=\tbin2\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4793
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT2}\n"
+"BIN3_BUILD=\tyes\n"
+".else\n"
+"BIN3_BUILD=\tno\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT2}\n"
+"BIN3_BUILD=\tyes\n"
+".else\n"
+"BIN3_BUILD=\tno\n"
+".endif\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4798
+msgid "Values containing whitespace must be enclosed in quotes:"
+msgstr "Значения, содержащие пробелы, должны быть заключены в кавычки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4802
+#, no-wrap
+msgid "OPT_VARS=\tfoo=\"bar baz\"\n"
+msgstr "OPT_VARS=\tfoo=\"bar baz\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4808
+msgid ""
+"This is due to the way man:make[1] variable expansion deals with "
+"whitespace. When `OPT_VARS= foo=bar baz` is expanded, the variable ends up "
+"containing two strings, `foo=bar` and `baz`. But the submitter probably "
+"intended there to be only one string, `foo=bar baz`. Quoting the value "
+"prevents whitespace from being used as a delimiter."
+msgstr ""
+"Это связано с тем, как man:make[1] обрабатывает пробелы при раскрытии "
+"переменных. Когда `OPT_VARS= foo=bar baz` раскрывается, переменная в итоге "
+"содержит две строки: `foo=bar` и `baz`. Однако отправитель, вероятно, "
+"предполагал, что должна быть только одна строка — `foo=bar baz`. Заключение "
+"значения в кавычки предотвращает использование пробела в качестве "
+"разделителя."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4811
+msgid ""
+"Also, _do not_ add extra spaces after the `_var_=` sign and before the "
+"value, it would also be split into two strings. _This will not work_:"
+msgstr ""
+"Также _не_ добавляйте лишние пробелы после знака `_var_=` и перед значением, "
+"это также разобьёт строку на две части. _Это не сработает_:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4815
+#, no-wrap
+msgid "OPT_VARS=\tfoo=\tbar\n"
+msgstr "OPT_VARS=\tfoo=\tbar\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4820
+#, no-wrap
+msgid "Dependencies, `OPT_DEPTYPE` and `OPT_DEPTYPE_OFF`"
+msgstr "Зависимости, `OPT_DEPTYPE` и `OPT_DEPTYPE_OFF`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4823
+msgid "For any of these dependency types:"
+msgstr "Для любого из этих типов зависимостей:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4825
+msgid "`PKG_DEPENDS`"
+msgstr "`PKG_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4835
+msgid ""
+"When option _OPT_ is selected, the value of `OPT_DEPTYPE`, if defined, is "
+"appended to `DEPTYPE`. `OPT_DEPTYPE_OFF` works the same, but when `OPT` is "
+"_not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, значение `OPT_DEPTYPE`, если оно определено, "
+"добавляется к `DEPTYPE`. `OPT_DEPTYPE_OFF` работает аналогично, но когда "
+"_не_ выбрана `OPT`. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4841
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_LIB_DEPENDS=\tliba.so:devel/a\n"
+"OPT1_LIB_DEPENDS_OFF=\tlibb.so:devel/b\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_LIB_DEPENDS=\tliba.so:devel/a\n"
+"OPT1_LIB_DEPENDS_OFF=\tlibb.so:devel/b\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4856
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"LIB_DEPENDS+=\tliba.so:devel/a\n"
+".else\n"
+"LIB_DEPENDS+=\tlibb.so:devel/b\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"LIB_DEPENDS+=\tliba.so:devel/a\n"
+".else\n"
+"LIB_DEPENDS+=\tlibb.so:devel/b\n"
+".endif\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4859
+#, no-wrap
+msgid "Generic Variables Replacement, `OPT_VARIABLE` and `OPT_VARIABLE_OFF`"
+msgstr "Универсальная замена переменных, `OPT_VARIABLE` и `OPT_VARIABLE_OFF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4862
+msgid "For any of these variables:"
+msgstr "Для любой из этих переменных:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4864
+msgid "`ALL_TARGET`"
+msgstr "`ALL_TARGET`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4865
+msgid "`BINARY_ALIAS`"
+msgstr "`BINARY_ALIAS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4866
+msgid "`BROKEN`"
+msgstr "`BROKEN`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4868
+msgid "`CFLAGS`"
+msgstr "`CFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4869
+msgid "`CONFIGURE_ENV`"
+msgstr "`CONFIGURE_ENV`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4870
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5109
+#, no-wrap
+msgid "`CONFLICTS`"
+msgstr "`CONFLICTS`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4871
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5104
+#, no-wrap
+msgid "`CONFLICTS_BUILD`"
+msgstr "`CONFLICTS_BUILD`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4872
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5099
+#, no-wrap
+msgid "`CONFLICTS_INSTALL`"
+msgstr "`CONFLICTS_INSTALL`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4873
+msgid "`CPPFLAGS`"
+msgstr "`CPPFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4874
+msgid "`CXXFLAGS`"
+msgstr "`CXXFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4875
+msgid "`DESKTOP_ENTRIES`"
+msgstr "`DESKTOP_ENTRIES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4878
+msgid "`EXTRA_PATCHES`"
+msgstr "`EXTRA_PATCHES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4890
+msgid "`IGNORE`"
+msgstr "`IGNORE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4891
+msgid "`INFO`"
+msgstr "`INFO`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4892
+msgid "`INSTALL_TARGET`"
+msgstr "`INSTALL_TARGET`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4893
+msgid "`LDFLAGS`"
+msgstr "`LDFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4894
+msgid "`LIBS`"
+msgstr "`LIBS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4895
+msgid "`MAKE_ARGS`"
+msgstr "`MAKE_ARGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4896
+msgid "`MAKE_ENV`"
+msgstr "`MAKE_ENV`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4899
+msgid "`PATCH_SITES`"
+msgstr "`PATCH_SITES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4900
+msgid "`PLIST_DIRS`"
+msgstr "`PLIST_DIRS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4901
+msgid "`PLIST_FILES`"
+msgstr "`PLIST_FILES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4902
+msgid "`PLIST_SUB`"
+msgstr "`PLIST_SUB`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4903
+msgid "`PORTDOCS`"
+msgstr "`PORTDOCS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4904
+msgid "`PORTEXAMPLES`"
+msgstr "`PORTEXAMPLES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4905
+msgid "`SUB_FILES`"
+msgstr "`SUB_FILES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4906
+msgid "`SUB_LIST`"
+msgstr "`SUB_LIST`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4907
+msgid "`TEST_TARGET`"
+msgstr "`TEST_TARGET`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4912
+msgid ""
+"When option _OPT_ is selected, the value of `OPT_ABOVEVARIABLE`, if defined, "
+"is appended to `_ABOVEVARIABLE_`. `OPT_ABOVEVARIABLE_OFF` works the same "
+"way, but when `OPT` is _not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, значение `OPT_ABOVEVARIABLE`, если оно "
+"определено, добавляется к `_ABOVEVARIABLE_`. `OPT_ABOVEVARIABLE_OFF` "
+"работает аналогично, но когда `OPT` _не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4918
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_USES=\tgmake\n"
+"OPT1_CFLAGS_OFF=\t-DTEST\n"
+msgstr ""
+"OPTIONS_DEFINE=\tOPT1\n"
+"OPT1_USES=\tgmake\n"
+"OPT1_CFLAGS_OFF=\t-DTEST\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4933
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"USES+=\t\tgmake\n"
+".else\n"
+"CFLAGS+=\t-DTEST\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MOPT1}\n"
+"USES+=\t\tgmake\n"
+".else\n"
+"CFLAGS+=\t-DTEST\n"
+".endif\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4940
+msgid ""
+"Some variables are not in this list, in particular `PKGNAMEPREFIX` and "
+"`PKGNAMESUFFIX`. This is intentional. A port _must not_ change its name "
+"when its option set changes."
+msgstr ""
+"Некоторые переменные отсутствуют в этом списке, в частности `PKGNAMEPREFIX` "
+"и `PKGNAMESUFFIX`. Это сделано намеренно. Порт _не должен_ изменять своё имя "
+"при изменении набора опций."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4945
+msgid ""
+"Some of these variables, at least `ALL_TARGET`, `DISTFILES` and "
+"`INSTALL_TARGET`, have their default values set _after_ the options are "
+"processed."
+msgstr ""
+"Некоторые из этих переменных, по крайней мере `ALL_TARGET`, `DISTFILES` и "
+"`INSTALL_TARGET`, получают свои значения по умолчанию _после_ обработки "
+"опций."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4947
+msgid "With these lines in the [.filename]#Makefile#:"
+msgstr "С такими строками в [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4951
+#, no-wrap
+msgid "ALL_TARGET=\tall\n"
+msgstr "ALL_TARGET=\tall\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4953
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4962
+#, no-wrap
+msgid "DOCS_ALL_TARGET=\tdoc\n"
+msgstr "DOCS_ALL_TARGET=\tdoc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4956
+msgid ""
+"If the `DOCS` option is enabled, `ALL_TARGET` will have a final value of "
+"`all doc`; if the option is disabled, it would have a value of `all`."
+msgstr ""
+"Если опция `DOCS` включена, `ALL_TARGET` будет иметь конечное значение `all "
+"doc`; если опция отключена, значение будет `all`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4958
+msgid "With only the options helper line in the [.filename]#Makefile#:"
+msgstr "Только со строкой помощника опций в [.filename]#Makefile#:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4965
+msgid ""
+"If the `DOCS` option is enabled, `ALL_TARGET` will have a final value of "
+"`doc`; if the option is disabled, it would have a value of `all`."
+msgstr ""
+"Если опция `DOCS` включена, `ALL_TARGET` будет иметь окончательное значение "
+"`doc`; если опция отключена, значение будет `all`."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4968
+#, no-wrap
+msgid "Additional Build Targets, `_target_-_OPT_-on` and `_target_-_OPT_-off`"
+msgstr "Дополнительные цели сборки, `_target_-_OPT_-on` и `_target_-_OPT_-off`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4971
+msgid ""
+"These [.filename]#Makefile# targets can accept optional extra build targets:"
+msgstr ""
+"Эти цели в [.filename]#Makefile# могут принимать дополнительные опциональные "
+"цели сборки:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4973
+msgid "`pre-fetch`"
+msgstr "`pre-fetch`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4974
+msgid "`do-fetch`"
+msgstr "`do-fetch`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4975
+msgid "`post-fetch`"
+msgstr "`post-fetch`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4976
+msgid "`pre-extract`"
+msgstr "`pre-extract`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4977
+msgid "`do-extract`"
+msgstr "`do-extract`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4978
+msgid "`post-extract`"
+msgstr "`post-extract`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4979
+msgid "`pre-patch`"
+msgstr "`pre-patch`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4980
+msgid "`do-patch`"
+msgstr "`do-patch`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4981
+msgid "`post-patch`"
+msgstr "`post-patch`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4982
+msgid "`pre-configure`"
+msgstr "`pre-configure`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4983
+msgid "`do-configure`"
+msgstr "`do-configure`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4984
+msgid "`post-configure`"
+msgstr "`post-configure`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4985
+msgid "`pre-build`"
+msgstr "`pre-build`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4986
+msgid "`do-build`"
+msgstr "`do-build`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4987
+msgid "`post-build`"
+msgstr "`post-build`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4988
+msgid "`pre-install`"
+msgstr "`pre-install`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4989
+msgid "`do-install`"
+msgstr "`do-install`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4990
+msgid "`post-install`"
+msgstr "`post-install`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4991
+msgid "`post-stage`"
+msgstr "`post-stage`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4992
+msgid "`pre-package`"
+msgstr "`pre-package`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4993
+msgid "`do-package`"
+msgstr "`do-package`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4994
+msgid "`post-package`"
+msgstr "`post-package`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:4998
+msgid ""
+"When option _OPT_ is selected, the target `_TARGET_-_OPT_-on`, if defined, "
+"is executed after `_TARGET_`. `_TARGET_-_OPT_-off` works the same way, but "
+"when `OPT` is _not_ selected. For example:"
+msgstr ""
+"Когда выбрана опция _OPT_, цель `_TARGET_-_OPT_-on`, если она определена, "
+"выполняется после `_TARGET_`. `_TARGET_-_OPT_-off` работает аналогично, но "
+"когда `OPT` _не_ выбрана. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5005
+#, no-wrap
+msgid ""
+"post-patch-OPT1-on:\n"
+"\t@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile\n"
+msgstr ""
+"post-patch-OPT1-on:\n"
+"\t@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5008
+#, no-wrap
+msgid ""
+"post-patch-OPT1-off:\n"
+"\t@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile\n"
+msgstr ""
+"post-patch-OPT1-off:\n"
+"\t@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5024
+#, no-wrap
+msgid ""
+"post-patch:\n"
+".if ${PORT_OPTIONS:MOPT1}\n"
+"\t@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile\n"
+".else\n"
+"\t@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile\n"
+".endif\n"
+msgstr ""
+"post-patch:\n"
+".if ${PORT_OPTIONS:MOPT1}\n"
+"\t@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${EXAMPLESDIR}/|' ${WRKSRC}/Makefile\n"
+".else\n"
+"\t@${REINPLACE_CMD} -e '/opt1/s|/usr/bin/|${PREFIX}/bin/|' ${WRKSRC}/Makefile\n"
+".endif\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5027
+#, no-wrap
+msgid "Specifying the Working Directory"
+msgstr "Указание рабочего каталога"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5032
+msgid ""
+"Each port is extracted into a working directory, which must be writable. "
+"The ports system defaults to having `DISTFILES` unpack in to a directory "
+"called `${DISTNAME}`. In other words, if the [.filename]#Makefile# has:"
+msgstr ""
+"Каждый порт извлекается в рабочий каталог, который должен быть доступен для "
+"записи. Система портов по умолчанию распаковывает `DISTFILES` в каталог с "
+"именем `${DISTNAME}`. Другими словами, если в [.filename]#Makefile# указано:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5037
+#, no-wrap
+msgid ""
+"PORTNAME=\tfoo\n"
+"DISTVERSION=\t1.0\n"
+msgstr ""
+"PORTNAME=\tfoo\n"
+"DISTVERSION=\t1.0\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5040
+msgid ""
+"then the port's distribution files contain a top-level directory, "
+"[.filename]#foo-1.0#, and the rest of the files are located under that "
+"directory."
+msgstr ""
+"то файлы дистрибутива порта содержат каталог верхнего уровня "
+"[.filename]#foo-1.0#, и остальные файлы находятся в этом каталоге."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5042
+msgid "A number of variables can be overridden if that is not the case."
+msgstr ""
+"Если нужно расположение файлов в других каталогах, можно переопределить ряд "
+"переменных."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5044
+#, no-wrap
+msgid "`WRKSRC`"
+msgstr "`WRKSRC`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5048
+msgid ""
+"The variable lists the name of the directory that is created when the "
+"application's distfiles are extracted. If our previous example extracted "
+"into a directory called [.filename]#foo# (and not [.filename]#foo-1.0#) "
+"write:"
+msgstr ""
+"Переменная указывает имя каталога, который создается при распаковке "
+"distfiles приложения. Чтобы в нашем предыдущем примере распаковка "
+"происходила в каталог с именем [.filename]#foo# (а не [.filename]#foo-1.0#), "
+"напишите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5052
+#, no-wrap
+msgid "WRKSRC=\t${WRKDIR}/foo\n"
+msgstr "WRKSRC=\t${WRKDIR}/foo\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5055
+msgid "or possibly"
+msgstr "или можно"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5059
+#, no-wrap
+msgid "WRKSRC=\t${WRKDIR}/${PORTNAME}\n"
+msgstr "WRKSRC=\t${WRKDIR}/${PORTNAME}\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5062
+#, no-wrap
+msgid "`WRKSRC_SUBDIR`"
+msgstr "`WRKSRC_SUBDIR`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5065
+msgid ""
+"If the source files needed for the port are in a subdirectory of the "
+"extracted distribution file, set `WRKSRC_SUBDIR` to that directory."
+msgstr ""
+"Если исходные файлы, необходимые для порта, находятся в подкаталоге "
+"распакованного дистрибутива, присвойте `WRKSRC_SUBDIR` имя этого каталога."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5069
+#, no-wrap
+msgid "WRKSRC_SUBDIR=\tsrc\n"
+msgstr "WRKSRC_SUBDIR=\tsrc\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5072
+#, no-wrap
+msgid "`NO_WRKSUBDIR`"
+msgstr "`NO_WRKSUBDIR`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5075
+msgid ""
+"If the port does not extract in to a subdirectory at all, then set "
+"`NO_WRKSUBDIR` to indicate that."
+msgstr ""
+"Если порт не распаковывается в подкаталог вообще, установите `NO_WRKSUBDIR`, "
+"чтобы указать это."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5079
+#, no-wrap
+msgid "NO_WRKSUBDIR=\tyes\n"
+msgstr "NO_WRKSUBDIR=\tyes\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5084
+msgid ""
+"Because `WRKDIR` is the only directory that is supposed to be writable "
+"during the build, and is used to store many files recording the status of "
+"the build, the port's extraction will be forced into a subdirectory."
+msgstr ""
+"Поскольку `WRKDIR` является единственной директорией, которая должна быть "
+"доступна для записи во время сборки, и используется для хранения многих "
+"файлов, фиксирующих состояние сборки, извлечение порта будет принудительно "
+"выполнено в поддиректорию."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5087
+#, no-wrap
+msgid "Conflict Handling"
+msgstr "Обработка конфликтов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5090
+msgid ""
+"There are three different variables to register a conflict between packages "
+"and ports: `CONFLICTS`, `CONFLICTS_INSTALL` and `CONFLICTS_BUILD`."
+msgstr ""
+"Существует три различные переменные для регистрации конфликтов между "
+"пакетами и портами: `CONFLICTS`, `CONFLICTS_INSTALL` и `CONFLICTS_BUILD`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5094
+msgid ""
+"The conflict variables automatically set the variable `IGNORE`, which is "
+"more fully documented in crossref:porting-dads[dads-noinstall,Marking a Port "
+"Not Installable with `BROKEN`, `FORBIDDEN`, or `IGNORE`]."
+msgstr ""
+"Эти переменные автоматически устанавливают переменную `IGNORE`, более "
+"подробно описанную в crossref:porting-dads[dads-noinstall,Пометка порта как "
+"неустанавливаемого с помощью `BROKEN`, `FORBIDDEN` или `IGNORE`]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5097
+msgid ""
+"When removing one of several conflicting ports, it is advisable to retain "
+"`CONFLICTS` in those other ports for a few months to cater for users who "
+"only update once in a while."
+msgstr ""
+"При удалении одного из нескольких конфликтующих портов рекомендуется "
+"оставлять `CONFLICTS` в тех других портах на несколько месяцев, чтобы учесть "
+"пользователей, которые обновляются лишь время от времени."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5102
+msgid ""
+"If the package cannot coexist with other packages (because of file "
+"conflicts, runtime incompatibilities, etc.). `CONFLICTS_INSTALL` check is "
+"done after the build stage and prior to the install stage."
+msgstr ""
+"Если пакет не может сосуществовать с другими пакетами (из-за конфликтов "
+"файлов, несовместимости во время выполнения и т.д.). Проверка "
+"`CONFLICTS_INSTALL` выполняется после этапа сборки и перед этапом установки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5107
+msgid ""
+"If the port cannot be built when other specific ports are already "
+"installed. Build conflicts are not recorded in the resulting package."
+msgstr ""
+"Если порт не может быть собран, когда уже установлены другие определённые "
+"порты. Конфликты сборки не фиксируются в результирующем пакете."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5112
+msgid ""
+"If the port cannot be built if a certain port is already installed and the "
+"resulting package cannot coexist with the other package. `CONFLICTS` check "
+"is done prior to the build stage and prior to the install stage."
+msgstr ""
+"Если порт не может быть собран, когда определённый порт уже установлен и "
+"итоговый пакет не может сосуществовать с другим пакетом. Проверка "
+"`CONFLICTS` выполняется до этапа сборки и до этапа установки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5116
+msgid ""
+"Each space-separated item in the `CONFLICTS*` variable values is matched "
+"against packages except the one being built, using shell globbing rules. "
+"This allows listing all flavors of a port in a conflict list instead of "
+"having to take pains to exclude the flavor being built from that list. For "
+"example, if git-lite is installed, `CONFLICTS_INSTALL=git git-lite` would "
+"allow to perform:"
+msgstr ""
+"Каждый элемент, разделённый пробелами, в значениях переменных `CONFLICTS*` "
+"сопоставляется с пакетами(кроме того, который собирается) с использованием "
+"правил раскрытия шаблонов имен файлов в оболочке shell. Это позволяет "
+"перечислить все варианты порта в списке конфликтов вместо необходимости "
+"исключать собираемый вариант из этого списка. Например, если установлен git-"
+"lite, `CONFLICTS_INSTALL=git git-lite` позволит выполнить:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5119
+#, no-wrap
+msgid "% make -C devel/git FLAVOR=lite all deinstall install\n"
+msgstr "% make -C devel/git FLAVOR=lite all deinstall install\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5122
+msgid ""
+"But the following command would report a conflict, since the package base "
+"name installed is `git-lite`, while `git` would be built, but cannot be "
+"installed in addition to `git-lite`:"
+msgstr ""
+"Но следующая команда сообщит о конфликте, так как установленное имя базового "
+"пакета — `git-lite`, а `git` будет собран, но не может быть установлен "
+"вместе с `git-lite`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5125
+#, no-wrap
+msgid "% make -C devel/git FLAVOR=default all deinstall install\n"
+msgstr "% make -C devel/git FLAVOR=default all deinstall install\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5128
+msgid ""
+"Without that feature, the Makefile would need one "
+"`_flavor__CONFLICTS_INSTALL` for each flavor, listing every other flavor."
+msgstr ""
+"Без этой функции Makefile потребовал бы по одному "
+"`_flavor__CONFLICTS_INSTALL` для каждого варианта, перечисляя все остальные "
+"варианты."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5131
+msgid ""
+"The most common content of one of these variable is the package base of "
+"another port. The package base is the package name without the appended "
+"version, it can be obtained by running `make -V PKGBASE`."
+msgstr ""
+"Наиболее распространённым содержимым одной из этих переменных является база "
+"пакета другого порта. База пакета — это имя пакета без указания версии, её "
+"можно получить, выполнив команду `make -V PKGBASE`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5133
+#, no-wrap
+msgid "Basic usage of `CONFLICTS*`"
+msgstr "Простой пример использования `CONFLICTS*`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5139
+msgid ""
+"package:dns/bind99[] cannot be installed if package:dns/bind910[] is present "
+"because they install same files. First gather the package base to use:"
+msgstr ""
+"Пакет package:dns/bind99[] не может быть установлен, если присутствует пакет "
+"package:dns/bind910[], так как они устанавливают одинаковые файлы. Сначала "
+"соберите базовый пакет для использования:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5146
+#, no-wrap
+msgid ""
+"% make -C dns/bind99 -V PKGBASE\n"
+"bind99\n"
+"% make -C dns/bind910 -V PKGBASE\n"
+"bind910\n"
+msgstr ""
+"% make -C dns/bind99 -V PKGBASE\n"
+"bind99\n"
+"% make -C dns/bind910 -V PKGBASE\n"
+"bind910\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5149
+msgid "Then add to the [.filename]#Makefile# of package:dns/bind99[]:"
+msgstr "Затем добавьте в [.filename]#Makefile# пакета package:dns/bind99[]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5153
+#, no-wrap
+msgid "CONFLICTS_INSTALL=\tbind910\n"
+msgstr "CONFLICTS_INSTALL=\tbind910\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5156
+msgid "And add to the [.filename]#Makefile# of package:dns/bind910[]:"
+msgstr "И добавьте в [.filename]#Makefile# пакета package:dns/bind910[]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5160
+#, no-wrap
+msgid "CONFLICTS_INSTALL=\tbind99\n"
+msgstr "CONFLICTS_INSTALL=\tbind99\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5167
+msgid ""
+"Sometimes, only certain versions of another port are incompatible. When "
+"this is the case, use the full package name including the version. If "
+"necessary, use shell globs like `*` and `?` so that all necessary versions "
+"are matched."
+msgstr ""
+"Иногда только определенные версии другого порта несовместимы. В этом случае "
+"используйте полное имя пакета, включая версию. При необходимости используйте "
+"подстановочные символы шаблонов имён файлов оболочки, такие как `*` и `?`, "
+"чтобы охватить все необходимые версии."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5169
+#, no-wrap
+msgid "Using `CONFLICTS*` With Globs."
+msgstr "Использование `CONFLICTS*` с шаблонами имён файлов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5174
+msgid ""
+"From versions from 2.0 and up-to 2.4.1_2, package:deskutils/gnotime[] used "
+"to install a bundled version of package:databases/qof[]."
+msgstr ""
+"В версиях с 2.0 по 2.4.1_2 пакет package:deskutils/gnotime[] устанавливал "
+"встроенную версию пакета package:databases/qof[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5176
+msgid ""
+"To reflect this past, the [.filename]#Makefile# of package:databases/qof[] "
+"contains:"
+msgstr ""
+"Чтобы отразить это прошлое, [.filename]#Makefile# пакета package:databases/"
+"qof[] содержит:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5182
+#, no-wrap
+msgid ""
+"CONFLICTS_INSTALL=\tgnotime-2.[0-3]* \\\n"
+"\t\t\tgnotime-2.4.0* gnotime-2.4.1 \\\n"
+"\t\t\tgnotime-2.4.1_[12]\n"
+msgstr ""
+"CONFLICTS_INSTALL=\tgnotime-2.[0-3]* \\\n"
+"\t\t\tgnotime-2.4.0* gnotime-2.4.1 \\\n"
+"\t\t\tgnotime-2.4.1_[12]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5185
+msgid ""
+"The first entry match versions `2.0` through `2.3`, the second all the "
+"revisions of `2.4.0`, the third the exact `2.4.1` version, and the last the "
+"first and second revisions of the `2.4.1` version."
+msgstr ""
+"Первый элемент соответствует версиям `2.0`–`2.3`, второй — всем редакциям "
+"`2.4.0`, третий — точно версии `2.4.1`, а последний — первой и второй "
+"редакциям версии `2.4.1`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5187
+msgid ""
+"package:deskutils/gnotime[] does not have any conflicts line because its "
+"current version does not conflict with anything else."
+msgstr ""
+"package:deskutils/gnotime[] не имеет строки конфликтов, потому что его "
+"текущая версия не конфликтует ни с чем другим."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5191
+msgid ""
+"The variable `DISABLE_CONFLICTS` may be temporarily set when making targets "
+"that are not affected by conflicts. The variable is not to be set in port "
+"Makefiles."
+msgstr ""
+"Переменная `DISABLE_CONFLICTS` может быть временно установлена при "
+"выполнении целей, на которые не влияют конфликты. Эту переменную не следует "
+"устанавливать в Makefiles портов."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5195
+#, no-wrap
+msgid "% make -DDISABLE_CONFLICTS patch\n"
+msgstr "% make -DDISABLE_CONFLICTS patch\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5198
+#, no-wrap
+msgid "Installing Files"
+msgstr "Установка файлов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5205
+msgid ""
+"The `install` phase is very important to the end user because it adds files "
+"to their system. All the additional commands run in the port "
+"[.filename]#Makefile#'s `*-install` targets should be echoed to the screen. "
+"_Do not_ silence these commands with `@` or `.SILENT`."
+msgstr ""
+"Фаза `install` очень важна для конечного пользователя, так как она добавляет "
+"файлы в его систему. Все дополнительные команды, выполняемые в целях `*-"
+"install` [.filename]#Makefile# порта, должны выводиться на экран. _Не_ "
+"заглушайте эти команды с помощью `@` или `.SILENT`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5208
+#, no-wrap
+msgid "`INSTALL_*` Macros"
+msgstr "Макросы `INSTALL_*`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5215
+msgid ""
+"Use the macros provided in [.filename]#bsd.port.mk# to ensure correct modes "
+"of files in the port's `*-install` targets. Set ownership directly in "
+"[.filename]#pkg-plist# with the corresponding entries, such as "
+"`@(_owner_,_group_,)`, `@owner _owner_`, and `@group _group_`. These "
+"operators work until overridden, or until the end of [.filename]#pkg-plist#, "
+"so remember to reset them after they are no longer needed. The default "
+"ownership is `root:wheel`. See crossref:plist[plist-keywords-base,Base "
+"Keywords] for more information."
+msgstr ""
+"Используйте макросы, предоставленные в [.filename]#bsd.port.mk#, чтобы "
+"обеспечить корректные режимы файлов в целях `*-install` порта. "
+"Устанавливайте владельца напрямую в [.filename]#pkg-plist# в соответствующих "
+"записях, таких как `@(_владелец_,_группа_,)`, `@owner _владелец_` и `@group "
+"_группа_`. Эти операторы действуют до переопределения или до конца "
+"[.filename]#pkg-plist#, поэтому не забудьте сбросить их, когда они больше не "
+"нужны. Владелец по умолчанию — `root:wheel`. Дополнительную информацию см. в "
+"crossref:plist[plist-keywords-base,Базовые Ключевые Слова]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5217
+msgid "`INSTALL_PROGRAM` is a command to install binary executables."
+msgstr "`INSTALL_PROGRAM` — команда для установки бинарных исполняемых файлов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5218
+msgid "`INSTALL_SCRIPT` is a command to install executable scripts."
+msgstr "`INSTALL_SCRIPT` — команда для установки исполняемых скриптов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5219
+msgid ""
+"`INSTALL_LIB` is a command to install shared libraries (but not static "
+"libraries)."
+msgstr ""
+"`INSTALL_LIB` — это команда для установки общих библиотек (но не статических "
+"библиотек)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5220
+msgid ""
+"`INSTALL_KLD` is a command to install kernel loadable modules. Some "
+"architectures do not like having the modules stripped, so use this command "
+"instead of `INSTALL_PROGRAM`."
+msgstr ""
+"`INSTALL_KLD` — это команда для установки загружаемых модулей ядра. "
+"Некоторые архитектуры не поддерживают удаление символов из модулей, поэтому "
+"используйте эту команду вместо `INSTALL_PROGRAM`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5221
+msgid ""
+"`INSTALL_DATA` is a command to install sharable data, including static "
+"libraries."
+msgstr ""
+"`INSTALL_DATA` — это команда для установки общих данных, включая статические "
+"библиотеки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5222
+msgid ""
+"`INSTALL_MAN` is a command to install manpages and other documentation (it "
+"does not compress anything)."
+msgstr ""
+"`INSTALL_MAN` — это команда для установки man-страниц и другой документации "
+"(она ничего не сжимает)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5224
+msgid ""
+"These variables are set to the man:install[1] command with the appropriate "
+"flags for each situation."
+msgstr ""
+"Эти переменные передаются команде man:install[1] с соответствующими флагами "
+"для каждой ситуации."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5228
+msgid ""
+"Do not use `INSTALL_LIB` to install static libraries, because stripping them "
+"renders them useless. Use `INSTALL_DATA` instead."
+msgstr ""
+"Не используйте `INSTALL_LIB` для установки статических библиотек, так как их "
+"удаление делает их бесполезными. Вместо этого используйте `INSTALL_DATA`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5231
+#, no-wrap
+msgid "Stripping Binaries and Shared Libraries"
+msgstr "Удаление символов из бинарных файлов и разделяемых библиотек"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5236
+msgid ""
+"Installed binaries should be stripped. Do not strip binaries manually unless "
+"absolutely required. The `INSTALL_PROGRAM` macro installs and strips a "
+"binary at the same time. The `INSTALL_LIB` macro does the same thing to "
+"shared libraries."
+msgstr ""
+"Установленные бинарные файлы должны быть очищены от отладочной информации. "
+"Не очищайте бинарные файлы вручную, если это не является абсолютно "
+"необходимым. Макрос `INSTALL_PROGRAM` устанавливает и очищает бинарный файл "
+"одновременно. Макрос `INSTALL_LIB` делает то же самое с разделяемыми "
+"библиотеками."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5239
+msgid ""
+"When a file must be stripped, but neither `INSTALL_PROGRAM` nor "
+"`INSTALL_LIB` macros are desirable, `${STRIP_CMD}` strips the program or "
+"shared library. This is typically done within the `post-install` target. "
+"For example:"
+msgstr ""
+"Когда файл необходимо очистить, но ни макросы `INSTALL_PROGRAM`, ни "
+"`INSTALL_LIB` не подходят, `${STRIP_CMD}` очищает программу или разделяемую "
+"библиотеку. Обычно это делается в цели `post-install`. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5244
+#, no-wrap
+msgid ""
+"post-install:\n"
+"\t${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xdl\n"
+msgstr ""
+"post-install:\n"
+"\t${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xdl\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5247
+msgid "When multiple files need to be stripped:"
+msgstr "Когда необходимо удалить отладочную информацию из нескольких файлов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5254
+#, no-wrap
+msgid ""
+"post-install:\n"
+".for l in geometry media body track world\n"
+"\t${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0\n"
+".endfor\n"
+msgstr ""
+"post-install:\n"
+".for l in geometry media body track world\n"
+"\t${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0\n"
+".endfor\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5259
+msgid ""
+"Use man:file[1] on a file to determine if it has been stripped. Binaries "
+"are reported by man:file[1] as `stripped`, or `not stripped`. Additionally, "
+"man:strip[1] will detect programs that have already been stripped and exit "
+"cleanly."
+msgstr ""
+"Используйте man:file[1] для файла, чтобы определить, был ли он подвергнут "
+"удалению символов. man:file[1] сообщает, что бинарные файлы либо `stripped` "
+"(удалены символы), либо `not stripped` (символы не удалены). Кроме того, "
+"man:strip[1] обнаружит программы, которые уже были подвергнуты удалению "
+"символов, и завершит работу без ошибок."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5263
+msgid "When `WITH_DEBUG` is defined, elf files _must not_ be stripped."
+msgstr "Когда определён `WITH_DEBUG`, elf-файлы _не должны_ быть очищены."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5265
+msgid ""
+"The variables (`STRIP_CMD`, `INSTALL_PROGRAM`, `INSTALL_LIB`, ...) and "
+"crossref:uses[uses,`USES`] provided by the framework handle this "
+"automatically."
+msgstr ""
+"Переменные (`STRIP_CMD`, `INSTALL_PROGRAM`, `INSTALL_LIB`, ...) и "
+"crossref:uses[uses,`USES`], предоставляемые фреймворком, обрабатывают это "
+"автоматически."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5267
+msgid ""
+"Some software, add `-s` to their `LDFLAGS`, in this case, either remove `-s` "
+"if `WITH_DEBUG` is set, or remove it unconditionally and use `STRIP_CMD` in "
+"`post-install`."
+msgstr ""
+"Некоторое программное обеспечение добавляет `-s` к своим `LDFLAGS`. В этом "
+"случае либо удалите `-s`, если установлен `WITH_DEBUG`, либо удалите его "
+"безусловно и используйте `STRIP_CMD` в `post-install`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5270
+#, no-wrap
+msgid "Installing a Whole Tree of Files"
+msgstr "Установка целого дерева файлов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5275
+msgid ""
+"Sometimes, a large number of files must be installed while preserving their "
+"hierarchical organization. For example, copying over a whole directory tree "
+"from `WRKSRC` to a target directory under `PREFIX`. Note that `PREFIX`, "
+"`EXAMPLESDIR`, `DATADIR`, and other path variables must always be prepended "
+"with `STAGEDIR` to respect staging (see crossref:special[staging,Staging])."
+msgstr ""
+"Иногда необходимо установить большое количество файлов с сохранением их "
+"иерархической структуры. Например, копирование всего дерева каталогов из "
+"`WRKSRC` в целевой каталог под `PREFIX`. Обратите внимание, что `PREFIX`, "
+"`EXAMPLESDIR`, `DATADIR` и другие переменные путей всегда должны "
+"предваряться `STAGEDIR` для соблюдения процедуры промежуточной установки "
+"(см. crossref:special[staging,Промежуточная установка])."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5280
+msgid ""
+"Two macros exist for this situation. The advantage of using these macros "
+"instead of `cp` is that they guarantee proper file ownership and permissions "
+"on target files. The first macro, `COPYTREE_BIN`, will set all the "
+"installed files to be executable, thus being suitable for installing into "
+"[.filename]#PREFIX/bin#. The second macro, `COPYTREE_SHARE`, does not set "
+"executable permissions on files, and is therefore suitable for installing "
+"files under [.filename]#PREFIX/share# target."
+msgstr ""
+"Для этой ситуации существуют два макроса. Преимущество использования этих "
+"макросов вместо `cp` заключается в том, что они гарантируют целевым файлам "
+"правильные значения владельца и разрешений. Первый макрос, `COPYTREE_BIN`, "
+"устанавливает все установленные файлы как исполняемые, что делает его "
+"подходящим для установки в [.filename]#PREFIX/bin#. Второй макрос, "
+"`COPYTREE_SHARE#, не устанавливает исполняемые разрешения для файлов и, "
+"следовательно, подходит для установки файлов в [.filename]#PREFIX/share#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5286
+#, no-wrap
+msgid ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${EXAMPLESDIR}\n"
+"\t(cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})\n"
+msgstr ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${EXAMPLESDIR}\n"
+"\t(cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5289
+msgid ""
+"This example will install the contents of the [.filename]#examples# "
+"directory in the vendor distfile to the proper examples location of the port."
+msgstr ""
+"Этот пример установит содержимое каталога [.filename]#examples# из "
+"дистрибутива вендора в соответствующее расположение примеров порта."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5295
+#, no-wrap
+msgid ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${DATADIR}/summer\n"
+"\t(cd ${WRKSRC}/temperatures && ${COPYTREE_SHARE} \"June July August\" ${STAGEDIR}${DATADIR}/summer)\n"
+msgstr ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${DATADIR}/summer\n"
+"\t(cd ${WRKSRC}/temperatures && ${COPYTREE_SHARE} \"June July August\" ${STAGEDIR}${DATADIR}/summer)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5298
+msgid ""
+"And this example will install the data of summer months to the "
+"[.filename]#summer# subdirectory of a [.filename]#DATADIR#."
+msgstr ""
+"И этот пример установит данные летних месяцев в подкаталог "
+"[.filename]#summer# каталога [.filename]#DATADIR#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5301
+msgid ""
+"Additional `find` arguments can be passed via the third argument to "
+"`COPYTREE_*` macros. For example, to install all files from the first "
+"example except Makefiles, one can use these commands."
+msgstr ""
+"Дополнительные аргументы `find` могут быть переданы через третий аргумент "
+"макросов `COPYTREE_*`. Например, чтобы установить все файлы из первого "
+"примера, кроме Makefiles, можно использовать следующие команды."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5308
+#, no-wrap
+msgid ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${EXAMPLESDIR}\n"
+"\t(cd ${WRKSRC}/examples && \\\n"
+"\t${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR} \"! -name Makefile\")\n"
+msgstr ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${EXAMPLESDIR}\n"
+"\t(cd ${WRKSRC}/examples && \\\n"
+"\t${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR} \"! -name Makefile\")\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5314
+msgid ""
+"These macros do not add the installed files to [.filename]#pkg-plist#. They "
+"must be added manually. For optional documentation (`PORTDOCS`, see "
+"crossref:makefiles[install-documentation, Install Additional Documentation]) "
+"and examples (`PORTEXAMPLES`), the `%%PORTDOCS%%` or `%%PORTEXAMPLES%%` "
+"prefixes must be prepended in [.filename]#pkg-plist#."
+msgstr ""
+"Эти макросы не добавляют установленные файлы в [.filename]#pkg-plist#. Их "
+"необходимо добавлять вручную. Для дополнительной документации (`PORTDOCS`, "
+"см. crossref:makefiles[install-documentation, Установка дополнительной "
+"документации]) и примеров (`PORTEXAMPLES`), префиксы `%%PORTDOCS%%` или `%"
+"%PORTEXAMPLES%%` должны быть добавлены в [.filename]#pkg-plist#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5316
+#, no-wrap
+msgid "Install Additional Documentation"
+msgstr "Установка дополнительной документации"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5320
+msgid ""
+"If the software has some documentation other than the standard man and info "
+"pages that is useful for the user, install it under `DOCSDIR`. This can be "
+"done, like the previous item, in the `post-install` target."
+msgstr ""
+"Если у программного обеспечения есть документация, помимо стандартных "
+"страниц man и info, которая может быть полезна пользователю, установите её в "
+"`DOCSDIR`. Это можно сделать, как и в предыдущем пункте, в цели `post-"
+"install`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5325
+msgid ""
+"Create a new directory for the port. The directory name is `DOCSDIR`. This "
+"usually equals `PORTNAME`. However, if the user might want different "
+"versions of the port to be installed at the same time, the whole `PKGNAME` "
+"can be used."
+msgstr ""
+"Создайте новый каталог для порта. Имя каталога — `DOCSDIR`. Обычно оно равно "
+"`PORTNAME`. Однако, если пользователю может потребоваться установка разных "
+"версий порта одновременно, можно использовать полное имя `PKGNAME`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5328
+msgid ""
+"Since only the files listed in [.filename]#pkg-plist# are installed, it is "
+"safe to always install documentation to `STAGEDIR` (see "
+"crossref:special[staging,Staging]). Hence `.if` blocks are only needed when "
+"the installed files are large enough to cause significant I/O overhead."
+msgstr ""
+"Поскольку устанавливаются только файлы, перечисленные в [.filename]#pkg-"
+"plist#, можно безопасно всегда устанавливать документацию в `STAGEDIR` (см. "
+"crossref:special[staging,Staging]). Поэтому блоки `.if` требуются только в "
+"тех случаях, когда устанавливаемые файлы достаточно велики, чтобы вызвать "
+"значительные накладные расходы на ввод-вывод."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5334
+#, no-wrap
+msgid ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${DOCSDIR}\n"
+"\t${INSTALL_DATA} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}\n"
+msgstr ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${DOCSDIR}\n"
+"\t${INSTALL_DATA} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5338
+msgid ""
+"On the other hand, if there is a DOCS option in the port, install the "
+"documentation in a `post-install-DOCS-on` target. These targets are "
+"described in crossref:makefiles[options-targets, Additional Build Targets, "
+"`_target_-_OPT_-on` and `_target_-_OPT_-off`]."
+msgstr ""
+"С другой стороны, если в порте есть опция DOCS, установите документацию в "
+"цели `post-install-DOCS-on`. Эти цели описаны в crossref:makefiles[options-"
+"targets, Дополнительные цели сборки, `_target_-_OPT_-on` и `_target_-_OPT_-"
+"off`]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5340
+msgid ""
+"Here are some handy variables and how they are expanded by default when used "
+"in the [.filename]#Makefile#:"
+msgstr ""
+"Вот несколько полезных переменных и их стандартное раскрытие при "
+"использовании в [.filename]#Makefile#:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5342
+msgid "`DATADIR` gets expanded to [.filename]#PREFIX/share/PORTNAME#."
+msgstr "`DATADIR` раскрывается в [.filename]#PREFIX/share/PORTNAME#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5343
+msgid "`DATADIR_REL` gets expanded to [.filename]#share/PORTNAME#."
+msgstr "`DATADIR_REL` раскрывается в [.filename]#share/PORTNAME#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5344
+msgid "`DOCSDIR` gets expanded to [.filename]#PREFIX/share/doc/PORTNAME#."
+msgstr "`DOCSDIR` раскрывается в [.filename]#PREFIX/share/doc/PORTNAME#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5345
+msgid "`DOCSDIR_REL` gets expanded to [.filename]#share/doc/PORTNAME#."
+msgstr "`DOCSDIR_REL` раскрывается в [.filename]#share/doc/PORTNAME#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5346
+msgid ""
+"`EXAMPLESDIR` gets expanded to [.filename]#PREFIX/share/examples/PORTNAME#."
+msgstr ""
+"`EXAMPLESDIR` раскрывается в [.filename]#PREFIX/share/examples/PORTNAME#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5347
+msgid ""
+"`EXAMPLESDIR_REL` gets expanded to [.filename]#share/examples/PORTNAME#."
+msgstr "`EXAMPLESDIR_REL` раскрывается в [.filename]#share/examples/PORTNAME#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5353
+msgid ""
+"The `DOCS` option only controls additional documentation installed in "
+"`DOCSDIR`. It does not apply to standard man pages and info pages. Things "
+"installed in `EXAMPLESDIR` are controlled by the `EXAMPLES` option."
+msgstr ""
+"Опция `DOCS` управляет только дополнительной документацией, устанавливаемой "
+"в `DOCSDIR`. Она не применяется к стандартным man-страницам и info-"
+"страницам. Содержимое, устанавливаемое в `EXAMPLESDIR`, контролируется "
+"опцией `EXAMPLES`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5359
+msgid ""
+"These variables are exported to `PLIST_SUB`. Their values will appear there "
+"as pathnames relative to [.filename]#PREFIX# if possible. That is, "
+"[.filename]#share/doc/PORTNAME# will be substituted for `%%DOCSDIR%%` in the "
+"packing list by default, and so on. (See more on [.filename]#pkg-plist# "
+"substitution crossref:plist[plist-sub,here].)"
+msgstr ""
+"Эти переменные экспортируются в `PLIST_SUB`. Их значения будут представлены "
+"там в виде путей относительно [.filename]#PREFIX#, если это возможно. То "
+"есть, [.filename]#share/doc/PORTNAME# будет заменено на `%%DOCSDIR%%` в "
+"списке упаковки по умолчанию и так далее. (Подробнее о подстановках в "
+"[.filename]#pkg-plist# см. crossref:plist[plist-sub,здесь].)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5361
+msgid ""
+"All conditionally installed documentation files and directories are included "
+"in [.filename]#pkg-plist# with the `%%PORTDOCS%%` prefix, for example:"
+msgstr ""
+"Все условно устанавливаемые файлы и каталоги документации включаются в "
+"[.filename]#pkg-plist# с префиксом `%%PORTDOCS%%`, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5366
+#, no-wrap
+msgid ""
+"%%PORTDOCS%%%%DOCSDIR%%/AUTHORS\n"
+"%%PORTDOCS%%%%DOCSDIR%%/CONTACT\n"
+msgstr ""
+"%%PORTDOCS%%%%DOCSDIR%%/AUTHORS\n"
+"%%PORTDOCS%%%%DOCSDIR%%/CONTACT\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5375
+msgid ""
+"As an alternative to enumerating the documentation files in [.filename]#pkg-"
+"plist#, a port can set the variable `PORTDOCS` to a list of file names and "
+"shell glob patterns to add to the final packing list. The names will be "
+"relative to `DOCSDIR`. Therefore, a port that utilizes `PORTDOCS`, and uses "
+"a non-default location for its documentation, must set `DOCSDIR` "
+"accordingly. If a directory is listed in `PORTDOCS` or matched by a glob "
+"pattern from this variable, the entire subtree of contained files and "
+"directories will be registered in the final packing list. If the `DOCS` "
+"option has been unset then files and directories listed in `PORTDOCS` would "
+"not be installed or added to port packing list. Installing the "
+"documentation at `PORTDOCS` as shown above remains up to the port itself. A "
+"typical example of utilizing `PORTDOCS`:"
+msgstr ""
+"В качестве альтернативы перечислению файлов документации в [.filename]#pkg-"
+"plist#, порт может установить переменную `PORTDOCS` в список имён файлов и "
+"шаблонов имен файлов shell для добавления в итоговый список упаковки. Имена "
+"будут относительны к `DOCSDIR`. Поэтому порт, использующий `PORTDOCS` и "
+"нестандартное расположение документации, должен соответствующим образом "
+"установить `DOCSDIR`. Если в `PORTDOCS` указан каталог или он соответствует "
+"шаблону из этой переменной, всё поддерево содержащихся файлов и каталогов "
+"будет зарегистрировано в итоговом списке упаковки. Если опция `DOCS` "
+"отключена, файлы и каталоги, перечисленные в `PORTDOCS`, не будут "
+"установлены или добавлены в список упаковки порта. Установка документации в "
+"`PORTDOCS`, как показано выше, остаётся на усмотрение самого порта. Типичный "
+"пример использования `PORTDOCS`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5379
+#, no-wrap
+msgid "PORTDOCS=\tREADME.* ChangeLog docs/*\n"
+msgstr "PORTDOCS=\tREADME.* ChangeLog docs/*\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5384
+msgid ""
+"The equivalents of `PORTDOCS` for files installed under `DATADIR` and "
+"`EXAMPLESDIR` are `PORTDATA` and `PORTEXAMPLES`, respectively."
+msgstr ""
+"Эквивалентами `PORTDOCS` для файлов, установленных в `DATADIR` и "
+"`EXAMPLESDIR`, являются `PORTDATA` и `PORTEXAMPLES` соответственно."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5388
+msgid ""
+"The contents of [.filename]#pkg-message# are displayed upon installation. "
+"See crossref:pkg-files[porting-message,the section on using [.filename]#pkg-"
+"message#] for details. [.filename]#pkg-message# does not need to be added "
+"to [.filename]#pkg-plist#."
+msgstr ""
+"Содержимое файла [.filename]#pkg-message# отображается при установке. "
+"Подробности см. в разделе crossref:pkg-files[porting-message,использование "
+"файла [.filename]#pkg-message#]. Файл [.filename]#pkg-message# не нужно "
+"добавлять в [.filename]#pkg-plist#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5391
+#, no-wrap
+msgid "Subdirectories Under `PREFIX`"
+msgstr "Подкаталоги в `PREFIX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5400
+msgid ""
+"Try to let the port put things in the right subdirectories of `PREFIX`. "
+"Some ports lump everything and put it in the subdirectory with the port's "
+"name, which is incorrect. Also, many ports put everything except binaries, "
+"header files and manual pages in a subdirectory of [.filename]#lib#, which "
+"does not work well with the BSD paradigm. Many of the files must be moved "
+"to one of these directories: [.filename]#etc# (setup/configuration files), "
+"[.filename]#libexec# (executables started internally), [.filename]#sbin# "
+"(executables for superusers/managers), [.filename]#info# (documentation for "
+"info browser) or [.filename]#share# (architecture independent files). See "
+"man:hier[7] for details; the rules governing [.filename]#/usr# pretty much "
+"apply to [.filename]#/usr/local# too. The exception are ports dealing with "
+"USENET \"news\". They may use [.filename]#PREFIX/news# as a destination for "
+"their files."
+msgstr ""
+"Попробуйте сделать так, чтобы порт размещал файлы в правильных подкаталогах "
+"`PREFIX`. Некоторые порты собирают всё в кучу и помещают в подкаталог с "
+"именем порта, что неверно. Также многие порты размещают все файлы, кроме "
+"бинарников, заголовочных файлов и страниц руководства, в подкаталоге "
+"[.filename]#lib#, что плохо согласуется с парадигмой BSD. Многие из этих "
+"файлов должны быть перемещены в один из следующих каталогов: "
+"[.filename]#etc# (файлы настройки/конфигурации), [.filename]#libexec# "
+"(исполняемые файлы для внутреннего использования), [.filename]#sbin# "
+"(исполняемые файлы для суперпользователей/администраторов), "
+"[.filename]#info# (документация для браузера info) или [.filename]#share# "
+"(архитектурно-независимые файлы). Подробности см. в man:hier[7]; правила, "
+"действующие для [.filename]#/usr#, в основном применимы и к [.filename]#/usr/"
+"local#. Исключение составляют порты, связанные с USENET \"news\". Они могут "
+"использовать [.filename]#PREFIX/news# в качестве места назначения для своих "
+"файлов."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5402
+#, no-wrap
+msgid "Use `BINARY_ALIAS` to Rename Commands Instead of Patching the Build"
+msgstr "Используйте `BINARY_ALIAS` для переименования команд вместо исправления сборки"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5405
+msgid ""
+"When `BINARY_ALIAS` is defined it will create symlinks of the given commands "
+"in a directory which will be prepended to `PATH`."
+msgstr ""
+"Когда определена переменная `BINARY_ALIAS`, будут созданы символьные ссылки "
+"на указанные команды в каталоге, который будет добавлен в начало переменной "
+"`PATH`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5407
+msgid ""
+"Use it to substitute hardcoded commands the build phase relies on without "
+"having to patch any build files."
+msgstr ""
+"Используйте это для замены жёстко заданных команд, от которых зависит этап "
+"сборки, без необходимости исправлять какие-либо файлы сборки."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5409
+#, no-wrap
+msgid "Using `BINARY_ALIAS` to Make `gsed` Available as `sed`"
+msgstr "Использование `BINARY_ALIAS` для предоставления `gsed` в качестве `sed`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5414
+msgid ""
+"Some ports expect `sed` to behave like GNU sed and use features that "
+"man:sed[1] does not provide. GNU sed is available from package:textproc/"
+"gsed[] on FreeBSD."
+msgstr ""
+"Некоторые порты ожидают, что `sed` будет вести себя как GNU sed и используют "
+"возможности, которые man:sed[1] не предоставляет. GNU sed доступен в пакете "
+"package:textproc/gsed[] на FreeBSD."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5416
+msgid ""
+"Use `BINARY_ALIAS` to substitute `sed` with `gsed` for the duration of the "
+"build:"
+msgstr "Используйте `BINARY_ALIAS` для замены `sed` на `gsed` на время сборки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5422
+#, no-wrap
+msgid ""
+"BUILD_DEPENDS=\tgsed:textproc/gsed\n"
+"...\n"
+"BINARY_ALIAS=\tsed=gsed\n"
+msgstr ""
+"BUILD_DEPENDS=\tgsed:textproc/gsed\n"
+"...\n"
+"BINARY_ALIAS=\tsed=gsed\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5427
+#, no-wrap
+msgid "Using `BINARY_ALIAS` to Provide Aliases for Hardcoded `python3` Commands"
+msgstr "Использование `BINARY_ALIAS` для создания псевдонимов жестко заданных команд `python3`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5432
+msgid ""
+"A port that has a hardcoded reference to `python3` in its build scripts will "
+"need to have it available in `PATH` at build time. Use `BINARY_ALIAS` to "
+"create an alias that points to the right Python 3 binary:"
+msgstr ""
+"Порт, в котором есть жёсткая ссылка на `python3` в скриптах сборки, требует "
+"его наличия в `PATH` во время сборки. Используйте `BINARY_ALIAS` для "
+"создания псевдонима, указывающего на нужный бинарный файл Python 3:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5438
+#, no-wrap
+msgid ""
+"USES=\tpython:3.4+,build\n"
+"...\n"
+"BINARY_ALIAS=\tpython3=${PYTHON_CMD}\n"
+msgstr ""
+"USES=\tpython:3.4+,build\n"
+"...\n"
+"BINARY_ALIAS=\tpython3=${PYTHON_CMD}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5441
+msgid ""
+"See crossref:special[using-python,Using Python] for more information about "
+"`USES=python`."
+msgstr ""
+"См. crossref:special[using-python,Использование Python] для получения "
+"дополнительной информации о `USES=python`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/makefiles/_index.adoc:5448
+msgid ""
+"Binary aliases are created after the dependencies provided via "
+"`BUILD_DEPENDS` and `LIB_DEPENDS` are processed and before the `configure` "
+"target. This leads to various limitations. For example, programs installed "
+"via `TEST_DEPENDS` cannot be used to create a binary alias as test "
+"dependencies specified this way are processed after binary aliases are "
+"created."
+msgstr ""
+"Бинарные псевдонимы создаются после обработки зависимостей, указанных через "
+"`BUILD_DEPENDS` и `LIB_DEPENDS`, но до цели `configure`. Это приводит к "
+"различным ограничениям. Например, программы, установленные через "
+"`TEST_DEPENDS`, нельзя использовать для создания бинарного псевдонима, так "
+"как тестовые зависимости, указанные таким образом, обрабатываются после "
+"создания бинарных псевдонимов."
diff --git a/documentation/content/ru/books/porters-handbook/new-port/_index.adoc b/documentation/content/ru/books/porters-handbook/new-port/_index.adoc
index fc44c12e37..dc7350143a 100644
--- a/documentation/content/ru/books/porters-handbook/new-port/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/new-port/_index.adoc
@@ -1,15 +1,17 @@
---
-title: Глава 2. Как самому сделать новый порт
-prev: books/porters-handbook/porting-why
+description: 'Как сделать новый порт'
next: books/porters-handbook/quick-porting
+params:
+ path: /books/porters-handbook/new-port/
+prev: books/porters-handbook/porting-why
showBookMenu: true
+tags: ["new port", "upgrading", "guidelines", "ports"]
+title: 'Глава 2. Как самому сделать новый порт'
weight: 2
-params:
- path: "/books/porters-handbook/new-port/"
---
[[own-port]]
-= Making a New Port
+= Как самому сделать новый порт
:doctype: book
:toc: macro
:toclevels: 1
@@ -57,4 +59,4 @@ endif::[]
Только часть переменных (`_VAR_`), которые могут быть переопределены, описаны в этом документе. Большинство (если не все) описаны в начале файла [.filename]#/usr/ports/Mk/bsd.port.mk#; остальные, скорее всего, тоже там описаны. Заметьте, что в этом файле используется нестандартная настройка шага табуляции: Emacs и Vim должны распознать это при загрузке файла. Как man:vi[1], так и man:ex[1] могут быть настроены на использование правильного значения выдачей команды `:set tabstop=4` после загрузки файла.
====
-Ищете, с чего бы начать попроще? Посмотрите на http://wiki.freebsd.org/WantedPorts[перечень запрошенных портов], есть ли там такие, над которыми вы можете работать.
+Ищете, с чего бы начать попроще? Посмотрите на https://wiki.freebsd.org/WantedPorts[перечень запрошенных портов], есть ли там такие, над которыми вы можете работать.
diff --git a/documentation/content/ru/books/porters-handbook/new-port/_index.po b/documentation/content/ru/books/porters-handbook/new-port/_index.po
new file mode 100644
index 0000000000..8908fe56d6
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/new-port/_index.po
@@ -0,0 +1,101 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-12 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbooknew-port_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/new-port/_index.adoc:1
+#, no-wrap
+msgid "How to make a new FreeBSD Port"
+msgstr "Как сделать новый порт"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/new-port/_index.adoc:1
+#, no-wrap
+msgid "Chapter 2. Making a New Port"
+msgstr "Глава 2. Как самому сделать новый порт"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/new-port/_index.adoc:14
+#, no-wrap
+msgid "Making a New Port"
+msgstr "Как самому сделать новый порт"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/new-port/_index.adoc:52
+msgid "Interested in making a new port, or upgrading existing ports? Great!"
+msgstr ""
+"Итак, вы интересуетесь, как создать собственный порт или обновить "
+"существующий? Великолепно!"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/new-port/_index.adoc:55
+msgid ""
+"What follows are some guidelines for creating a new port for FreeBSD. To "
+"upgrade an existing port, read this, then read crossref:upgrading[port-"
+"upgrading,Upgrading a Port]."
+msgstr ""
+"Ниже находятся некоторые указания по созданию нового порта для FreeBSD. Если "
+"вы хотите обновить существующий порт, вы должны прочесть их, а затем "
+"crossref:upgrading[port-upgrading, Обновление отдельного порта]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/new-port/_index.adoc:59
+msgid ""
+"When this document is not sufficiently detailed, refer to [.filename]#/usr/"
+"ports/Mk/bsd.port.mk#, which is included by all port "
+"[.filename]#Makefiles#. Even those not hacking [.filename]##Makefile##s "
+"daily can gain much knowledge from it. Additionally, specific questions can "
+"be sent to the {freebsd-ports}."
+msgstr ""
+"Если этот документ недостаточно подробен, вы должны обратиться к файлу "
+"[.filename]#/usr/ports/Mk/bsd.port.mk#, который включается в make-файл "
+"каждого порта. Он хорошо прокомментирован, и даже если вы не занимаетесь "
+"хакингом make-файлов каждодневно, из него вы сможете узнать много нового. "
+"Кроме того, конкретные вопросы можно задать, послав письмо на адрес {freebsd-"
+"ports}."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/new-port/_index.adoc:66
+msgid ""
+"Only a fraction of the variables (`_VAR_`) that can be overridden are "
+"mentioned in this document. Most (if not all) are documented at the start "
+"of [.filename]#/usr/ports/Mk/bsd.port.mk#; the others probably ought to be. "
+"Note that this file uses a non-standard tab setting: Emacs and Vim will "
+"recognize the setting on loading the file. Both man:vi[1] and man:ex[1] can "
+"be set to use the correct value by typing `:set tabstop=4` once the file has "
+"been loaded."
+msgstr ""
+"Только часть переменных (`_VAR_`), которые могут быть переопределены, "
+"описаны в этом документе. Большинство (если не все) описаны в начале файла "
+"[.filename]#/usr/ports/Mk/bsd.port.mk#; остальные, скорее всего, тоже там "
+"описаны. Заметьте, что в этом файле используется нестандартная настройка "
+"шага табуляции: Emacs и Vim должны распознать это при загрузке файла. Как "
+"man:vi[1], так и man:ex[1] могут быть настроены на использование правильного "
+"значения выдачей команды `:set tabstop=4` после загрузки файла."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/new-port/_index.adoc:68
+msgid ""
+"Looking for something easy to start with? Take a look at the https://"
+"wiki.freebsd.org/WantedPorts[list of requested ports] and see if you can "
+"work on one (or more)."
+msgstr ""
+"Ищете, с чего бы начать попроще? Посмотрите на https://wiki.freebsd.org/"
+"WantedPorts[перечень запрошенных портов], есть ли там такие, над которыми вы "
+"можете работать."
diff --git a/documentation/content/ru/books/porters-handbook/order/_index.adoc b/documentation/content/ru/books/porters-handbook/order/_index.adoc
new file mode 100644
index 0000000000..82869f5a85
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/order/_index.adoc
@@ -0,0 +1,260 @@
+---
+description: 'Порядок переменных в Makefile портов FreeBSD'
+next: books/porters-handbook/keeping-up
+params:
+ path: /books/porters-handbook/order/
+prev: books/porters-handbook/porting-samplem
+showBookMenu: true
+tags: ["order", "PORTNAME", "PATCHFILES", "MAINTAINER", "LICENSE", "dependencies", "USES"]
+title: 'Глава 15. Порядок переменных в Makefile портов'
+weight: 15
+---
+
+[[porting-order]]
+= Порядок переменных в Makefile портов
+:doctype: book
+:toc: macro
+:toclevels: 1
+:icons: font
+:sectnums:
+:sectnumlevels: 6
+:sectnumoffset: 15
+:partnums:
+:source-highlighter: rouge
+:experimental:
+:images-path: books/porters-handbook/
+
+ifdef::env-beastie[]
+ifdef::backend-html5[]
+:imagesdir: ../../../../images/{images-path}
+endif::[]
+ifndef::book[]
+include::shared/authors.adoc[]
+include::shared/mirrors.adoc[]
+include::shared/releases.adoc[]
+include::shared/attributes/attributes-{{% lang %}}.adoc[]
+include::shared/{{% lang %}}/teams.adoc[]
+include::shared/{{% lang %}}/mailing-lists.adoc[]
+include::shared/{{% lang %}}/urls.adoc[]
+toc::[]
+endif::[]
+ifdef::backend-pdf,backend-epub3[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+endif::[]
+
+ifndef::env-beastie[]
+toc::[]
+include::../../../../../shared/asciidoctor.adoc[]
+endif::[]
+
+Первые разделы [.filename]#Makefile# всегда должны идти в одном и том же порядке. Это стандартное правило позволяет любому легко читать любой порт, не тратя время на поиск переменных в произвольном порядке.
+
+[NOTE]
+====
+Описаные здесь разделы и переменные являются обязательными в обычном порте. В подчиненном порте многие разделы и переменные могут быть пропущены.
+====
+
+[IMPORTANT]
+====
+Каждый следующий блок должен быть отделен от предыдущего одним пустым пробелом.
+
+В следующих блоках устанавливайте только переменные, которые требуются для порта. Определяйте эти переменные в порядке, указанном здесь.
+====
+
+[[porting-order-portname]]
+== Блок `PORTNAME`
+
+Этот блок является наиболее важным. Он определяет имя порта, версию, расположение файла дистрибутива и категорию. Переменные должны быть в следующем порядке:
+
+* crossref:makefiles[makefile-portname,`PORTNAME`] * crossref:makefiles[makefile-versions,`PORTVERSION`][crossref:order[portversion-footnote, 1]]
+* crossref:makefiles[makefile-versions,`DISTVERSIONPREFIX`] * crossref:makefiles[makefile-versions,`DISTVERSION`][crossref:order[portversion-footnote, 1]]
+* crossref:makefiles[makefile-versions,`DISTVERSIONSUFFIX`]
+* crossref:makefiles[makefile-portrevision,`PORTREVISION`]
+* crossref:makefiles[makefile-portepoch,`PORTEPOCH`]
+* crossref:makefiles[makefile-categories,`CATEGORIES`]
+* crossref:makefiles[makefile-master_sites,`MASTER_SITES`]
+* crossref:makefiles[makefile-master_sites-shorthand,`MASTER_SITE_SUBDIR`] (устарело)
+* crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMEPREFIX`]
+* crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMESUFFIX`]
+* crossref:makefiles[makefile-distname,`DISTNAME`]
+* crossref:makefiles[makefile-extract_sufx,`EXTRACT_SUFX`]
+* crossref:makefiles[makefile-distfiles-definition,`DISTFILES`]
+* crossref:makefiles[makefile-dist_subdir,`DIST_SUBDIR`]
+* crossref:makefiles[makefile-extract_only,`EXTRACT_ONLY`]
+
+[[portversion-footnote]]
+[IMPORTANT]
+====
+Может быть использован только один из параметров — PORTVERSION или DISTVERSION.
+====
+
+[[porting-order-patch]]
+== Блок `PATCHFILES`
+
+Этот блок является необязательным. Переменные:
+
+* crossref:makefiles[porting-patchfiles,`PATCH_SITES`]
+* crossref:makefiles[porting-patchfiles,`PATCHFILES`]
+* crossref:makefiles[porting-patchfiles,`PATCH_DIST_STRIP`]
+
+[[porting-order-maintainer]]
+== Блок `MAINTAINER`
+
+Этот блок является обязательным. Переменные следующие:
+
+* crossref:makefiles[makefile-maintainer,`MAINTAINER`]
+* crossref:makefiles[makefile-comment,`COMMENT`]
+* crossref:makefiles[makefile-www,`WWW`]
+
+[[porting-order-license]]
+== Блок `LICENSE`
+
+Этот блок является необязательным, хотя настоятельно рекомендуется. Переменные:
+
+* crossref:makefiles[licenses-license,`LICENSE`]
+* crossref:makefiles[licenses-license_comb,`LICENSE_COMB`]
+* crossref:makefiles[licenses-license_groups,`LICENSE_GROUPS`] или `LICENSE_GROUPS_NAME`
+* crossref:makefiles[licenses-license_name,`LICENSE_NAME`] или `LICENSE_NAME_NAME`
+* crossref:makefiles[licenses-license_text,`LICENSE_TEXT`] или `LICENSE_TEXT_NAME`
+* crossref:makefiles[licenses-license_file,`LICENSE_FILE`] или `LICENSE_FILE_NAME`
+* crossref:makefiles[licenses-license_perms,`LICENSE_PERMS`] или `LICENSE_PERMS_NAME_`
+* crossref:makefiles[licenses-license_distfiles,`LICENSE_DISTFILES`] или `LICENSE_DISTFILES_NAME`
+
+Если имеется несколько лицензий, отсортируйте различные переменные LICENSE_VAR_NAME по названию лицензии.
+
+[[porting-order-broken]]
+== Общие сообщения `BROKEN`/`IGNORE`/`DEPRECATED`
+
+Этот блок необязателен. Переменные:
+
+* crossref:porting-dads[dads-deprecated,`DEPRECATED`]
+* crossref:porting-dads[dads-deprecated,`EXPIRATION_DATE`]
+* crossref:porting-dads[dads-noinstall,`FORBIDDEN`]
+* crossref:porting-dads[dads-noinstall,`BROKEN`]
+* crossref:porting-dads[dads-noinstall,`BROKEN_*`]
+* crossref:porting-dads[dads-noinstall,`IGNORE`]
+* crossref:porting-dads[dads-noinstall,`IGNORE_*`]
+* crossref:porting-dads[dads-noinstall,`ONLY_FOR_ARCHS`]
+* crossref:porting-dads[dads-noinstall,`ONLY_FOR_ARCHS_REASON*`]
+* crossref:porting-dads[dads-noinstall,`NOT_FOR_ARCHS`]
+* crossref:porting-dads[dads-noinstall,`NOT_FOR_ARCHS_REASON*`]
+
+[NOTE]
+====
+`BROKEN_*` и `IGNORE_*` могут быть любыми общими переменными, например, `IGNORE_amd64`, `BROKEN_FreeBSD_10` и т.д. За исключением переменных, которые зависят от crossref:uses[uses,`USES`], их следует размещать в crossref:order[porting-order-uses, `USES` и `USE_x`]. Например, `IGNORE_WITH_PHP` работает только если установлен crossref:uses[uses-php,`php`], а `BROKEN_SSL` — только если установлен crossref:uses[uses-ssl,`ssl`].
+
+Если порт помечен как BROKEN при выполнении определённых условий, и эти условия можно проверить только после включения [.filename]#bsd.port.options.mk# или [.filename]#bsd.port.pre.mk#, то такие переменные должны быть установлены позже, в crossref:order[porting-order-rest, Остальные Переменные].
+====
+
+[[porting-order-depends]]
+== Блок зависимостей
+
+Этот блок необязателен. Переменные:
+
+* crossref:makefiles[makefile-fetch_depends,`FETCH_DEPENDS`]
+* crossref:makefiles[makefile-extract_depends,`EXTRACT_DEPENDS`]
+* crossref:makefiles[makefile-patch_depends,`PATCH_DEPENDS`]
+* crossref:makefiles[makefile-build_depends,`BUILD_DEPENDS`]
+* crossref:makefiles[makefile-lib_depends,`LIB_DEPENDS`]
+* crossref:makefiles[makefile-run_depends,`RUN_DEPENDS`]
+* `TEST_DEPENDS`
+
+[[porting-order-flavors]]
+== Флейворы
+
+Этот блок необязателен.
+
+Начните этот раздел с определения `FLAVORS`. Затем рассмотрите возможные вспомогательные инструменты флейворов. Дополнительную информацию см. в разделе crossref:flavors[flavors-using,Использование флейворов (FLAVORS)].
+
+Конструкции, устанавливающие переменные, недоступные в виде помощников, с использованием `.if ${FLAVOR:U} == foo`, должны быть размещены в соответствующих разделах ниже.
+
+[[porting-order-uses]]
+== `USES` и `USE_x`
+
+Начните этот раздел с определения `USES`, а затем возможных `USE_x`.
+
+Держите связанные переменные рядом. Например, если используется crossref:makefiles[makefile-master_sites-github,`USE_GITHUB`], всегда размещайте переменные `GH_*` сразу после неё.
+
+[[porting-order-variables]]
+== Стандартные переменные bsd.port.mk
+
+Этот блок раздела предназначен для переменных, которые могут быть определены в [.filename]#bsd.port.mk# и не принадлежат ни к одному из предыдущих блоков разделов.
+
+Порядок не важен, однако старайтесь держать схожие переменные вместе. Например, переменные uid и gid `USERS` и `GROUPS`. Конфигурационные переменные `CONFIGURE_*` и `*_CONFIGURE`. Списки файлов и директорий `PORTDOCS` и `PORTEXAMPLES`.
+
+[[porting-order-options]]
+== Параметры и помощники
+
+Если порт использует crossref:makefiles[makefile-options,фреймворк опций], сначала определите `OPTIONS_DEFINE` и `OPTIONS_DEFAULT`, затем остальные переменные `OPTIONS_*`, далее описания `*_DESC`, а затем вспомогательные опции. Старайтесь сортировать их все в алфавитном порядке.
+
+[[porting-order-options-ex1]]
+.Пример порядка переменных-опций
+[example]
+====
+Опции `FOO` и `BAR` не имеют стандартного описания, поэтому его необходимо написать. Остальные опции уже имеют описание в [.filename]#Mk/bsd.options.desc.mk#, поэтому его создание не требуется. Переменные `DOCS` и `EXAMPLES` используют вспомогательные цели для установки своих файлов, они приведены здесь для полноты, хотя относятся к разделу crossref:order[porting-order-targets, Цели], поэтому перед ними могут быть вставлены другие переменные и цели.
+
+[.programlisting]
+....
+OPTIONS_DEFINE= DOCS EXAMPLES FOO BAR
+OPTIONS_DEFAULT= FOO
+OPTIONS_RADIO= SSL
+OPTIONS_RADIO_SSL= OPENSSL GNUTLS
+OPTIONS_SUB= yes
+
+BAR_DESC= Enable bar support
+FOO_DESC= Enable foo support
+
+BAR_CONFIGURE_WITH= bar=${LOCALBASE}
+FOO_CONFIGURE_ENABLE= foo
+GNUTLS_CONFIGURE_ON= --with-ssl=gnutls
+OPENSSL_CONFIGURE_ON= --with-ssl=openssl
+
+post-install-DOCS-on:
+ ${MKDIR} ${STAGEDIR}${DOCSDIR}
+ cd ${WRKSRC}/doc && ${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR}
+
+post-install-EXAMPLES-on:
+ ${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
+ cd ${WRKSRC}/ex && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR}
+....
+
+====
+
+[[porting-order-rest]]
+== Остальные переменные
+
+И затем, остальные переменные, которые не упоминались в предыдущих блоках.
+
+[[porting-order-targets]]
+== Цели
+
+После определения всех переменных можно определить дополнительные цели man:make[1]. Следует располагать `pre-*` перед `post-*` и в том же порядке, в котором выполняются различные этапы:
+
+* `fetch`
+* `extract`
+* `patch`
+* `configure`
+* `build`
+* `install`
+* `test`
+
+[TIP]
+====
+При использовании опций `helpers` для цели `target` сохраняйте их в алфавитном порядке, но оставляйте `*-on` перед `*-off`. Если также используется основная цель, размещайте её перед дополнительными:
+
+[.programlisting]
+....
+post-install:
+ # install generic bits
+
+post-install-DOCS-on:
+ # Install documentation
+
+post-install-X11-on:
+ # Install X11 related bits
+
+post-install-X11-off:
+ # Install bits that should be there if X11 is disabled
+....
+====
diff --git a/documentation/content/ru/books/porters-handbook/order/_index.po b/documentation/content/ru/books/porters-handbook/order/_index.po
new file mode 100644
index 0000000000..0492f69f9a
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/order/_index.po
@@ -0,0 +1,780 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-16 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookorder_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:1
+#, no-wrap
+msgid "Order of Variables in FreeBSD Port Makefiles"
+msgstr "Порядок переменных в Makefile портов FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:1
+#, no-wrap
+msgid "Chapter 15. Order of Variables in Port Makefiles"
+msgstr "Глава 15. Порядок переменных в Makefile портов"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:14
+#, no-wrap
+msgid "Order of Variables in Port Makefiles"
+msgstr "Порядок переменных в Makefile портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:53
+msgid ""
+"The first sections of the [.filename]#Makefile# must always come in the same "
+"order. This standard makes it so everyone can easily read any port without "
+"having to search for variables in a random order."
+msgstr ""
+"Первые разделы [.filename]#Makefile# всегда должны идти в одном и том же "
+"порядке. Это стандартное правило позволяет любому легко читать любой порт, "
+"не тратя время на поиск переменных в произвольном порядке."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:58
+msgid ""
+"The sections and variables described here are mandatory in a ordinary port. "
+"In a slave port, many sections and variables can be skipped."
+msgstr ""
+"Описаные здесь разделы и переменные являются обязательными в обычном порте. "
+"В подчиненном порте многие разделы и переменные могут быть пропущены."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:63
+msgid ""
+"Each following block must be separated from the previous block by a single "
+"blank line."
+msgstr ""
+"Каждый следующий блок должен быть отделен от предыдущего одним пустым "
+"пробелом."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:66
+msgid ""
+"In the following blocks, only set the variables that are required by the "
+"port. Define these variables in the order they are shown here."
+msgstr ""
+"В следующих блоках устанавливайте только переменные, которые требуются для "
+"порта. Определяйте эти переменные в порядке, указанном здесь."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:69
+#, no-wrap
+msgid "`PORTNAME` Block"
+msgstr "Блок `PORTNAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:73
+msgid ""
+"This block is the most important. It defines the port name, version, "
+"distribution file location, and category. The variables must be in this "
+"order:"
+msgstr ""
+"Этот блок является наиболее важным. Он определяет имя порта, версию, "
+"расположение файла дистрибутива и категорию. Переменные должны быть в "
+"следующем порядке:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:77
+msgid ""
+"crossref:makefiles[makefile-portname,`PORTNAME`] * "
+"crossref:makefiles[makefile-versions,`PORTVERSION`]"
+"[crossref:order[portversion-footnote, 1]]"
+msgstr ""
+"crossref:makefiles[makefile-portname,`PORTNAME`] * "
+"crossref:makefiles[makefile-versions,`PORTVERSION`]"
+"[crossref:order[portversion-footnote, 1]]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:80
+msgid ""
+"crossref:makefiles[makefile-versions,`DISTVERSIONPREFIX`] * "
+"crossref:makefiles[makefile-versions,`DISTVERSION`]"
+"[crossref:order[portversion-footnote, 1]]"
+msgstr ""
+"crossref:makefiles[makefile-versions,`DISTVERSIONPREFIX`] * "
+"crossref:makefiles[makefile-versions,`DISTVERSION`]"
+"[crossref:order[portversion-footnote, 1]]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:81
+msgid "crossref:makefiles[makefile-versions,`DISTVERSIONSUFFIX`]"
+msgstr "crossref:makefiles[makefile-versions,`DISTVERSIONSUFFIX`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:82
+msgid "crossref:makefiles[makefile-portrevision,`PORTREVISION`]"
+msgstr "crossref:makefiles[makefile-portrevision,`PORTREVISION`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:83
+msgid "crossref:makefiles[makefile-portepoch,`PORTEPOCH`]"
+msgstr "crossref:makefiles[makefile-portepoch,`PORTEPOCH`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:84
+msgid "crossref:makefiles[makefile-categories,`CATEGORIES`]"
+msgstr "crossref:makefiles[makefile-categories,`CATEGORIES`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:85
+msgid "crossref:makefiles[makefile-master_sites,`MASTER_SITES`]"
+msgstr "crossref:makefiles[makefile-master_sites,`MASTER_SITES`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:86
+msgid ""
+"crossref:makefiles[makefile-master_sites-shorthand,`MASTER_SITE_SUBDIR`] "
+"(deprecated)"
+msgstr ""
+"crossref:makefiles[makefile-master_sites-shorthand,`MASTER_SITE_SUBDIR`] "
+"(устарело)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:87
+msgid "crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMEPREFIX`]"
+msgstr "crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMEPREFIX`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:88
+msgid "crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMESUFFIX`]"
+msgstr "crossref:makefiles[porting-pkgnameprefix-suffix,`PKGNAMESUFFIX`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:89
+msgid "crossref:makefiles[makefile-distname,`DISTNAME`]"
+msgstr "crossref:makefiles[makefile-distname,`DISTNAME`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:90
+msgid "crossref:makefiles[makefile-extract_sufx,`EXTRACT_SUFX`]"
+msgstr "crossref:makefiles[makefile-extract_sufx,`EXTRACT_SUFX`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:91
+msgid "crossref:makefiles[makefile-distfiles-definition,`DISTFILES`]"
+msgstr "crossref:makefiles[makefile-distfiles-definition,`DISTFILES`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:92
+msgid "crossref:makefiles[makefile-dist_subdir,`DIST_SUBDIR`]"
+msgstr "crossref:makefiles[makefile-dist_subdir,`DIST_SUBDIR`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:93
+msgid "crossref:makefiles[makefile-extract_only,`EXTRACT_ONLY`]"
+msgstr "crossref:makefiles[makefile-extract_only,`EXTRACT_ONLY`]"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:98
+msgid "Only one of PORTVERSION and DISTVERSION can be used."
+msgstr ""
+"Может быть использован только один из параметров — PORTVERSION или "
+"DISTVERSION."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:101
+#, no-wrap
+msgid "`PATCHFILES` Block"
+msgstr "Блок `PATCHFILES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:105
+msgid "This block is optional. The variables are:"
+msgstr "Этот блок является необязательным. Переменные:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:107
+msgid "crossref:makefiles[porting-patchfiles,`PATCH_SITES`]"
+msgstr "crossref:makefiles[porting-patchfiles,`PATCH_SITES`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:108
+msgid "crossref:makefiles[porting-patchfiles,`PATCHFILES`]"
+msgstr "crossref:makefiles[porting-patchfiles,`PATCHFILES`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:109
+msgid "crossref:makefiles[porting-patchfiles,`PATCH_DIST_STRIP`]"
+msgstr "crossref:makefiles[porting-patchfiles,`PATCH_DIST_STRIP`]"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:111
+#, no-wrap
+msgid "`MAINTAINER` Block"
+msgstr "Блок `MAINTAINER`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:115
+msgid "This block is mandatory. The variables are:"
+msgstr "Этот блок является обязательным. Переменные следующие:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:117
+msgid "crossref:makefiles[makefile-maintainer,`MAINTAINER`]"
+msgstr "crossref:makefiles[makefile-maintainer,`MAINTAINER`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:118
+msgid "crossref:makefiles[makefile-comment,`COMMENT`]"
+msgstr "crossref:makefiles[makefile-comment,`COMMENT`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:119
+msgid "crossref:makefiles[makefile-www,`WWW`]"
+msgstr "crossref:makefiles[makefile-www,`WWW`]"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:121
+#, no-wrap
+msgid "`LICENSE` Block"
+msgstr "Блок `LICENSE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:125
+msgid ""
+"This block is optional, although it is highly recommended. The variables "
+"are:"
+msgstr ""
+"Этот блок является необязательным, хотя настоятельно рекомендуется. "
+"Переменные:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:127
+msgid "crossref:makefiles[licenses-license,`LICENSE`]"
+msgstr "crossref:makefiles[licenses-license,`LICENSE`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:128
+msgid "crossref:makefiles[licenses-license_comb,`LICENSE_COMB`]"
+msgstr "crossref:makefiles[licenses-license_comb,`LICENSE_COMB`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:129
+msgid ""
+"crossref:makefiles[licenses-license_groups,`LICENSE_GROUPS`] or "
+"`LICENSE_GROUPS_NAME`"
+msgstr ""
+"crossref:makefiles[licenses-license_groups,`LICENSE_GROUPS`] или "
+"`LICENSE_GROUPS_NAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:130
+msgid ""
+"crossref:makefiles[licenses-license_name,`LICENSE_NAME`] or "
+"`LICENSE_NAME_NAME`"
+msgstr ""
+"crossref:makefiles[licenses-license_name,`LICENSE_NAME`] или "
+"`LICENSE_NAME_NAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:131
+msgid ""
+"crossref:makefiles[licenses-license_text,`LICENSE_TEXT`] or "
+"`LICENSE_TEXT_NAME`"
+msgstr ""
+"crossref:makefiles[licenses-license_text,`LICENSE_TEXT`] или "
+"`LICENSE_TEXT_NAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:132
+msgid ""
+"crossref:makefiles[licenses-license_file,`LICENSE_FILE`] or "
+"`LICENSE_FILE_NAME`"
+msgstr ""
+"crossref:makefiles[licenses-license_file,`LICENSE_FILE`] или "
+"`LICENSE_FILE_NAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:133
+msgid ""
+"crossref:makefiles[licenses-license_perms,`LICENSE_PERMS`] or "
+"`LICENSE_PERMS_NAME_`"
+msgstr ""
+"crossref:makefiles[licenses-license_perms,`LICENSE_PERMS`] или "
+"`LICENSE_PERMS_NAME_`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:134
+msgid ""
+"crossref:makefiles[licenses-license_distfiles,`LICENSE_DISTFILES`] or "
+"`LICENSE_DISTFILES_NAME`"
+msgstr ""
+"crossref:makefiles[licenses-license_distfiles,`LICENSE_DISTFILES`] или "
+"`LICENSE_DISTFILES_NAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:136
+msgid ""
+"If there are multiple licenses, sort the different LICENSE_VAR_NAME "
+"variables by license name."
+msgstr ""
+"Если имеется несколько лицензий, отсортируйте различные переменные "
+"LICENSE_VAR_NAME по названию лицензии."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:138
+#, no-wrap
+msgid "Generic `BROKEN`/`IGNORE`/`DEPRECATED` Messages"
+msgstr "Общие сообщения `BROKEN`/`IGNORE`/`DEPRECATED`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:141
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:171
+msgid "This block is optional. The variables are:"
+msgstr "Этот блок необязателен. Переменные:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:143
+msgid "crossref:porting-dads[dads-deprecated,`DEPRECATED`]"
+msgstr "crossref:porting-dads[dads-deprecated,`DEPRECATED`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:144
+msgid "crossref:porting-dads[dads-deprecated,`EXPIRATION_DATE`]"
+msgstr "crossref:porting-dads[dads-deprecated,`EXPIRATION_DATE`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:145
+msgid "crossref:porting-dads[dads-noinstall,`FORBIDDEN`]"
+msgstr "crossref:porting-dads[dads-noinstall,`FORBIDDEN`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:146
+msgid "crossref:porting-dads[dads-noinstall,`BROKEN`]"
+msgstr "crossref:porting-dads[dads-noinstall,`BROKEN`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:147
+msgid "crossref:porting-dads[dads-noinstall,`BROKEN_*`]"
+msgstr "crossref:porting-dads[dads-noinstall,`BROKEN_*`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:148
+msgid "crossref:porting-dads[dads-noinstall,`IGNORE`]"
+msgstr "crossref:porting-dads[dads-noinstall,`IGNORE`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:149
+msgid "crossref:porting-dads[dads-noinstall,`IGNORE_*`]"
+msgstr "crossref:porting-dads[dads-noinstall,`IGNORE_*`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:150
+msgid "crossref:porting-dads[dads-noinstall,`ONLY_FOR_ARCHS`]"
+msgstr "crossref:porting-dads[dads-noinstall,`ONLY_FOR_ARCHS`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:151
+msgid "crossref:porting-dads[dads-noinstall,`ONLY_FOR_ARCHS_REASON*`]"
+msgstr "crossref:porting-dads[dads-noinstall,`ONLY_FOR_ARCHS_REASON*`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:152
+msgid "crossref:porting-dads[dads-noinstall,`NOT_FOR_ARCHS`]"
+msgstr "crossref:porting-dads[dads-noinstall,`NOT_FOR_ARCHS`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:153
+msgid "crossref:porting-dads[dads-noinstall,`NOT_FOR_ARCHS_REASON*`]"
+msgstr "crossref:porting-dads[dads-noinstall,`NOT_FOR_ARCHS_REASON*`]"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:160
+msgid ""
+"`BROKEN_*` and `IGNORE_*` can be any generic variables, for example, "
+"`IGNORE_amd64`, `BROKEN_FreeBSD_10`, etc. With the exception of variables "
+"that depend on a crossref:uses[uses,`USES`], place those in "
+"crossref:order[porting-order-uses, `USES` and `USE_x`]. For instance, "
+"`IGNORE_WITH_PHP` only works if crossref:uses[uses-php,`php`] is set, and "
+"`BROKEN_SSL` only if crossref:uses[uses-ssl,`ssl`] is set."
+msgstr ""
+"`BROKEN_*` и `IGNORE_*` могут быть любыми общими переменными, например, "
+"`IGNORE_amd64`, `BROKEN_FreeBSD_10` и т.д. За исключением переменных, "
+"которые зависят от crossref:uses[uses,`USES`], их следует размещать в "
+"crossref:order[porting-order-uses, `USES` и `USE_x`]. Например, "
+"`IGNORE_WITH_PHP` работает только если установлен crossref:uses[uses-"
+"php,`php`], а `BROKEN_SSL` — только если установлен crossref:uses[uses-"
+"ssl,`ssl`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:165
+msgid ""
+"If the port is marked BROKEN when some conditions are met, and such "
+"conditions can only be tested after including "
+"[.filename]#bsd.port.options.mk# or [.filename]#bsd.port.pre.mk#, then those "
+"variables should be set later, in crossref:order[porting-order-rest, The "
+"Rest of the Variables]."
+msgstr ""
+"Если порт помечен как BROKEN при выполнении определённых условий, и эти "
+"условия можно проверить только после включения "
+"[.filename]#bsd.port.options.mk# или [.filename]#bsd.port.pre.mk#, то такие "
+"переменные должны быть установлены позже, в crossref:order[porting-order-"
+"rest, Остальные Переменные]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:168
+#, no-wrap
+msgid "The Dependencies Block"
+msgstr "Блок зависимостей"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:173
+msgid "crossref:makefiles[makefile-fetch_depends,`FETCH_DEPENDS`]"
+msgstr "crossref:makefiles[makefile-fetch_depends,`FETCH_DEPENDS`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:174
+msgid "crossref:makefiles[makefile-extract_depends,`EXTRACT_DEPENDS`]"
+msgstr "crossref:makefiles[makefile-extract_depends,`EXTRACT_DEPENDS`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:175
+msgid "crossref:makefiles[makefile-patch_depends,`PATCH_DEPENDS`]"
+msgstr "crossref:makefiles[makefile-patch_depends,`PATCH_DEPENDS`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:176
+msgid "crossref:makefiles[makefile-build_depends,`BUILD_DEPENDS`]"
+msgstr "crossref:makefiles[makefile-build_depends,`BUILD_DEPENDS`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:177
+msgid "crossref:makefiles[makefile-lib_depends,`LIB_DEPENDS`]"
+msgstr "crossref:makefiles[makefile-lib_depends,`LIB_DEPENDS`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:178
+msgid "crossref:makefiles[makefile-run_depends,`RUN_DEPENDS`]"
+msgstr "crossref:makefiles[makefile-run_depends,`RUN_DEPENDS`]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:179
+msgid "`TEST_DEPENDS`"
+msgstr "`TEST_DEPENDS`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:181
+#, no-wrap
+msgid "Flavors"
+msgstr "Флейворы"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:184
+msgid "This block is optional."
+msgstr "Этот блок необязателен."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:188
+msgid ""
+"Start this section with defining `FLAVORS`. Continue with the possible "
+"Flavors helpers. See crossref:flavors[flavors-using,Using FLAVORS] for more "
+"Information."
+msgstr ""
+"Начните этот раздел с определения `FLAVORS`. Затем рассмотрите возможные "
+"вспомогательные инструменты флейворов. Дополнительную информацию см. в "
+"разделе crossref:flavors[flavors-using,Использование флейворов (FLAVORS)]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:190
+msgid ""
+"Constructs setting variables not available as helpers using `.if ${FLAVOR:U} "
+"== foo` should go in their respective sections below."
+msgstr ""
+"Конструкции, устанавливающие переменные, недоступные в виде помощников, с "
+"использованием `.if ${FLAVOR:U} == foo`, должны быть размещены в "
+"соответствующих разделах ниже."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:192
+#, no-wrap
+msgid "`USES` and `USE_x`"
+msgstr "`USES` и `USE_x`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:195
+msgid "Start this section with defining `USES`, and then possible `USE_x`."
+msgstr "Начните этот раздел с определения `USES`, а затем возможных `USE_x`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:198
+msgid ""
+"Keep related variables close together. For example, if using "
+"crossref:makefiles[makefile-master_sites-github,`USE_GITHUB`], always put "
+"the `GH_*` variables right after it."
+msgstr ""
+"Держите связанные переменные рядом. Например, если используется "
+"crossref:makefiles[makefile-master_sites-github,`USE_GITHUB`], всегда "
+"размещайте переменные `GH_*` сразу после неё."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:200
+#, no-wrap
+msgid "Standard bsd.port.mk Variables"
+msgstr "Стандартные переменные bsd.port.mk"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:203
+msgid ""
+"This section block is for variables that can be defined in "
+"[.filename]#bsd.port.mk# that do not belong in any of the previous section "
+"blocks."
+msgstr ""
+"Этот блок раздела предназначен для переменных, которые могут быть определены "
+"в [.filename]#bsd.port.mk# и не принадлежат ни к одному из предыдущих блоков "
+"разделов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:208
+msgid ""
+"Order is not important, however try to keep similar variables together. For "
+"example uid and gid variables `USERS` and `GROUPS`. Configuration variables "
+"`CONFIGURE_*` and `*_CONFIGURE`. List of files, and directories `PORTDOCS` "
+"and `PORTEXAMPLES`."
+msgstr ""
+"Порядок не важен, однако старайтесь держать схожие переменные вместе. "
+"Например, переменные uid и gid `USERS` и `GROUPS`. Конфигурационные "
+"переменные `CONFIGURE_*` и `*_CONFIGURE`. Списки файлов и директорий "
+"`PORTDOCS` и `PORTEXAMPLES`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:210
+#, no-wrap
+msgid "Options and Helpers"
+msgstr "Параметры и помощники"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:215
+msgid ""
+"If the port uses the crossref:makefiles[makefile-options,options framework], "
+"define `OPTIONS_DEFINE` and `OPTIONS_DEFAULT` first, then the other "
+"`OPTIONS_*` variables first, then the `*_DESC` descriptions, then the "
+"options helpers. Try and sort all of those alphabetically."
+msgstr ""
+"Если порт использует crossref:makefiles[makefile-options,фреймворк опций], "
+"сначала определите `OPTIONS_DEFINE` и `OPTIONS_DEFAULT`, затем остальные "
+"переменные `OPTIONS_*`, далее описания `*_DESC`, а затем вспомогательные "
+"опции. Старайтесь сортировать их все в алфавитном порядке."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:217
+#, no-wrap
+msgid "Options Variables Order Example"
+msgstr "Пример порядка переменных-опций"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:224
+msgid ""
+"The `FOO` and `BAR` options do not have a standard description, so one need "
+"to be written. The other options already have one in [.filename]#Mk/"
+"bsd.options.desc.mk# so writing one is not needed. The `DOCS` and "
+"`EXAMPLES` use target helpers to install their files, they are shown here "
+"for completeness, though they belong in crossref:order[porting-order-"
+"targets, The Targets], so other variables and targets could be inserted "
+"before them."
+msgstr ""
+"Опции `FOO` и `BAR` не имеют стандартного описания, поэтому его необходимо "
+"написать. Остальные опции уже имеют описание в [.filename]#Mk/"
+"bsd.options.desc.mk#, поэтому его создание не требуется. Переменные `DOCS` и "
+"`EXAMPLES` используют вспомогательные цели для установки своих файлов, они "
+"приведены здесь для полноты, хотя относятся к разделу crossref:order[porting-"
+"order-targets, Цели], поэтому перед ними могут быть вставлены другие "
+"переменные и цели."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:232
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tDOCS EXAMPLES FOO BAR\n"
+"OPTIONS_DEFAULT=\tFOO\n"
+"OPTIONS_RADIO=\tSSL\n"
+"OPTIONS_RADIO_SSL= OPENSSL GNUTLS\n"
+"OPTIONS_SUB=\tyes\n"
+msgstr ""
+"OPTIONS_DEFINE=\tDOCS EXAMPLES FOO BAR\n"
+"OPTIONS_DEFAULT=\tFOO\n"
+"OPTIONS_RADIO=\tSSL\n"
+"OPTIONS_RADIO_SSL= OPENSSL GNUTLS\n"
+"OPTIONS_SUB=\tyes\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:235
+#, no-wrap
+msgid ""
+"BAR_DESC=\t\tEnable bar support\n"
+"FOO_DESC=\t\tEnable foo support\n"
+msgstr ""
+"BAR_DESC=\t\tEnable bar support\n"
+"FOO_DESC=\t\tEnable foo support\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:240
+#, no-wrap
+msgid ""
+"BAR_CONFIGURE_WITH=\tbar=${LOCALBASE}\n"
+"FOO_CONFIGURE_ENABLE=\tfoo\n"
+"GNUTLS_CONFIGURE_ON=\t--with-ssl=gnutls\n"
+"OPENSSL_CONFIGURE_ON=\t--with-ssl=openssl\n"
+msgstr ""
+"BAR_CONFIGURE_WITH=\tbar=${LOCALBASE}\n"
+"FOO_CONFIGURE_ENABLE=\tfoo\n"
+"GNUTLS_CONFIGURE_ON=\t--with-ssl=gnutls\n"
+"OPENSSL_CONFIGURE_ON=\t--with-ssl=openssl\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:244
+#, no-wrap
+msgid ""
+"post-install-DOCS-on:\n"
+" ${MKDIR} ${STAGEDIR}${DOCSDIR}\n"
+" cd ${WRKSRC}/doc && ${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR}\n"
+msgstr ""
+"post-install-DOCS-on:\n"
+" ${MKDIR} ${STAGEDIR}${DOCSDIR}\n"
+" cd ${WRKSRC}/doc && ${COPYTREE_SHARE} . ${STAGEDIR}${DOCSDIR}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:248
+#, no-wrap
+msgid ""
+"post-install-EXAMPLES-on:\n"
+" ${MKDIR} ${STAGEDIR}${EXAMPLESDIR}\n"
+" cd ${WRKSRC}/ex && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR}\n"
+msgstr ""
+"post-install-EXAMPLES-on:\n"
+" ${MKDIR} ${STAGEDIR}${EXAMPLESDIR}\n"
+" cd ${WRKSRC}/ex && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR}\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:253
+#, no-wrap
+msgid "The Rest of the Variables"
+msgstr "Остальные переменные"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:256
+msgid ""
+"And then, the rest of the variables that are not mentioned in the previous "
+"blocks."
+msgstr ""
+"И затем, остальные переменные, которые не упоминались в предыдущих блоках."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:258
+#, no-wrap
+msgid "The Targets"
+msgstr "Цели"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:262
+msgid ""
+"After all the variables are defined, the optional man:make[1] targets can be "
+"defined. Keep `pre-*` before `post-*` and in the same order as the "
+"different stages run:"
+msgstr ""
+"После определения всех переменных можно определить дополнительные цели "
+"man:make[1]. Следует располагать `pre-*` перед `post-*` и в том же порядке, "
+"в котором выполняются различные этапы:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:264
+msgid "`fetch`"
+msgstr "`fetch`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:265
+msgid "`extract`"
+msgstr "`extract`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:266
+msgid "`patch`"
+msgstr "`patch`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:267
+msgid "`configure`"
+msgstr "`configure`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:268
+msgid "`build`"
+msgstr "`build`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:269
+msgid "`install`"
+msgstr "`install`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:270
+msgid "`test`"
+msgstr "`test`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:275
+msgid ""
+"When using options helpers target keep them alphabetically sorted, but keep "
+"the `*-on` before the `*-off`. When also using the main target, keep the "
+"main target before the optional ones:"
+msgstr ""
+"При использовании опций `helpers` для цели `target` сохраняйте их в "
+"алфавитном порядке, но оставляйте `*-on` перед `*-off`. Если также "
+"используется основная цель, размещайте её перед дополнительными:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:280
+#, no-wrap
+msgid ""
+"post-install:\n"
+"\t# install generic bits\n"
+msgstr ""
+"post-install:\n"
+"\t# install generic bits\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:283
+#, no-wrap
+msgid ""
+"post-install-DOCS-on:\n"
+"\t# Install documentation\n"
+msgstr ""
+"post-install-DOCS-on:\n"
+"\t# Install documentation\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:286
+#, no-wrap
+msgid ""
+"post-install-X11-on:\n"
+"\t# Install X11 related bits\n"
+msgstr ""
+"post-install-X11-on:\n"
+"\t# Install X11 related bits\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/order/_index.adoc:289
+#, no-wrap
+msgid ""
+"post-install-X11-off:\n"
+"\t# Install bits that should be there if X11 is disabled\n"
+msgstr ""
+"post-install-X11-off:\n"
+"\t# Install bits that should be there if X11 is disabled\n"
diff --git a/documentation/content/ru/books/porters-handbook/pkg-files/_index.adoc b/documentation/content/ru/books/porters-handbook/pkg-files/_index.adoc
index f68daf0dd9..dc1f0d89a5 100644
--- a/documentation/content/ru/books/porters-handbook/pkg-files/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/pkg-files/_index.adoc
@@ -1,22 +1,24 @@
---
-title: Глава 8. Файлы pkg-*
-prev: books/porters-handbook/plist
+description: 'Хитрости с файлами pkg-*'
next: books/porters-handbook/testing
-showBookMenu: true
-weight: 8
params:
- path: "/books/porters-handbook/pkg-files/"
+ path: /books/porters-handbook/pkg-files/
+prev: books/porters-handbook/plist
+showBookMenu: true
+tags: ["pkg", "pkg-message", "UCL", "pkg-install", "pkg-deinstall"]
+title: 'Глава 9. Файлы pkg-*'
+weight: 9
---
[[pkg-files]]
-= Файлы pkg-*
+= pkg-*
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 8
+:sectnumoffset: 9
:partnums:
:source-highlighter: rouge
:experimental:
@@ -49,48 +51,212 @@ endif::[]
Есть несколько приёмов работы с файлами [.filename]#pkg-*#, которые мы ещё не описали, но они иногда могут быть очень кстати.
[[porting-message]]
-== [.filename]#pkg-message#
+== pkg-message
Если вам нужно вывести сообщение для человека, устанавливающего приложение, то вы можете поместить сообщение в файл [.filename]#pkg-message#. Эта возможность часто оказывается полезной для вывода дополнительных шагов установки, которые нужно предпринять после выполнения команды `pkg install`, или для вывода информации о лицензировании.
-Если должны выводиться некоторые строки о knobs времени построения или предупреждения, используйте `ECHO_MSG`. Файл [.filename]#pkg-message# только для послеустановочных шагов. Также следует иметь в виду различие между `ECHO_MSG` и `ECHO_CMD`. Первое предназначено для вывода на экран информационного текста, а второе для конвейера команд:
+[IMPORTANT]
+====
+* Файл [.filename]#pkg-message# должен содержать только информацию, _критически важную_ для настройки и работы в FreeBSD, а также уникальную для данного порта.
+* Информация по настройке должна отображаться только при первоначальной установке. Инструкции по обновлению должны показываться только при обновлении с соответствующей версии.
+* Не обрамляйте сообщения ни пробелами, ни строками символов (такими как `----------`, `**********` или `==========`). Оставьте форматирование man:pkg[8].
+* Коммиттеры имеют полное право ограничивать существующие сообщения диапазонами установки или обновления, используя спецификации формата UCL.
+* Пожалуйста, убедитесь, что используете соответствующие инструменты для управления службами.
+** Используйте `service имя start` для запуска службы вместо `/usr/local/etc/rc.d/имя start`
+** Используйте `sysrc name_enable=YES` для изменения параметров в rc.conf
+
+====
+
+pkg-message поддерживает два формата:
+
+raw::
+Обычный текстовый файл. Его сообщение отображается только при установке.
+
+UCL::
+Если файл начинается с символа "`[`", то он считается файлом в формате UCL. Формат UCL описан на странице https://github.com/vstakhov/libucl[libucl's GitHub page].
+
+[NOTE]
+====
+Не добавляйте запись для [.filename]#pkg-message# в [.filename]#pkg-plist#.
+====
+
+[[porting-message-ucl]]
+=== UCL в pkg-message
+
+Формат следующий. Это должен быть массив объектов. Сами объекты могут содержать следующие ключевые слова:
+
+`message`::
+Отображаемое сообщение. Этот ключевой параметр является обязательным.
+
+`type`::
+Когда сообщение должно быть отображено.
+
+`maximum_version`::
+Только если `type` имеет значение `upgrade`. Отображается, если обновление выполняется с версии строго ниже указанной.
+
+`minimum_version`::
+Только если `type` имеет значение `upgrade`. Отображается, если обновление выполняется с версии, строго большей, чем указанная.
+
+Ключевые слова `maximum_version` и `minimum_version` можно комбинировать.
+
+Ключевое слово `type` может иметь три значения:
+
+`install`::
+Сообщение должно отображаться только при установке пакета.
+
+`remove`::
+Сообщение должно отображаться только при удалении пакета.
+
+`upgrade`::
+сообщение должно отображаться только во время обновления пакета.
+
+[IMPORTANT]
+====
+Для сохранения совместимости с файлами [.filename]#pkg-message#, не использующими UCL, первая строка UCL [.filename]#pkg-message# _ДОЛЖНА быть_ одиночным символом "`[`", а последняя строка _ДОЛЖНА быть_ одиночным символом "`]`".
+====
+
+[[porting-message-ucl-short-ex]]
+.Короткие строки UCL
+[example]
+====
+
+Сообщение ограничено двойными кавычками `"`, это используется для простых однострочных строк:
[.programlisting]
....
-update-etc-shells:
- @${ECHO_MSG} "updating /etc/shells"
- @${CP} /etc/shells /etc/shells.bak
- @( ${GREP} -v ${PREFIX}/bin/bash /etc/shells.bak; \
- ${ECHO_CMD} ${PREFIX}/bin/bash) >/etc/shells
- @${RM} /etc/shells.bak
+[
+{ type: install
+ message: "Simple message"
+}
+]
....
-[NOTE]
====
-Файл [.filename]#pkg-message# не нужно добавлять в [.filename]#pkg-plist#.
+
+[[porting-message-ucl-multiline-ex]]
+.Многострочные строки UCL
+[example]
+====
+
+Многострочные строки используют стандартную нотацию heredoc. Разделитель многострочной строки _должен_ начинаться сразу после символов `<<` без пробелов и _должен_ состоять только из заглавных букв. Чтобы завершить многострочную строку, добавьте строку-разделитель на отдельной строке без пробелов. Сообщение из раздела crossref:pkg-files[porting-message-ucl-short-ex,Короткие строки UCL] может быть записано как:
+
+[.programlisting]
+....
+[
+{ type: install
+ message: <<EOM
+Simple message
+EOM
+}
+]
+....
+
+====
+
+[[porting-message-ucl-ex2]]
+.Показать сообщение при установке/удалении
+[example]
+====
+
+Когда сообщение нужно отображать только при установке или удалении, укажите тип:
+
+[.programlisting]
+....
+[
+{
+ type: remove
+ message: "package being removed."
+}
+{ type: install, message: "package being installed."}
+]
+....
+
+====
+
+[[porting-message-ucl-ex3]]
+.Показать сообщение при обновлении
+[example]
+====
+
+При обновлении порта отображаемое сообщение может быть ещё более адаптировано к потребностям порта.
+
+[.programlisting]
+....
+[
+{
+ type: upgrade
+ message: "Package is being upgraded."
+}
+{
+ type: upgrade
+ maximum_version: "1.0"
+ message: "Upgrading from before 1.0 need to do this."
+}
+{
+ type: upgrade
+ minimum_version: "1.0"
+ message: "Upgrading from after 1.0 should do that."
+}
+{
+ type: upgrade
+ maximum_version: "3.0"
+ minimum_version: "1.0"
+ message: "Upgrading from > 1.0 and < 3.0 remove that file."
+}
+]
+....
+
+[IMPORTANT]
+****
+При отображении сообщения во время обновления важно ограничить случаи, когда оно показывается пользователю. Чаще всего это делается с помощью `maximum_version`, чтобы ограничить его использование обновлениями до определенной версии, когда требуется выполнить конкретное действие.
+****
+
====
[[pkg-install]]
-== [.filename]#pkg-install#
+== pkg-install, pkg-pre-install и pkg-post-install
-Если при установке бинарного пакета по команде `pkg add` или `pkg install` вашему порту нужно выполнить какие-то команды, то вы можете это сделать с помощью скрипта [.filename]#pkg-install#. Этот скрипт будет автоматически добавлен к пакету и будет дважды запускаться командой `pkg`: первый раз в виде `${SH} pkg-install ${PKGNAME} PRE-INSTALL`, а второй раз как `${SH} {PKGNAME} POST-INSTALL`. Для распознавания того, в каком режиме запущен скрипт, можно использовать параметр `$2`. Переменная окружения `PKG_PREFIX` будет принимать значение, соответствующее каталогу, в который устанавливается пакет.
+Если порту необходимо выполнять команды при установке бинарного пакета с помощью `pkg add` или `pkg install`, используйте [.filename]#pkg-install#. Он запускается дважды через `pkg`: первый раз как `${SH} pkg-install ${PKGNAME} PRE-INSTALL` перед установкой пакета и второй раз как `${SH} pkg-install ${PKGNAME} POST-INSTALL` после его установки. Переменная `$2` может быть проверена, чтобы определить, в каком режиме выполняется скрипт. Переменная окружения `PKG_PREFIX` устанавливается равной имени каталога установки пакета.
+
+Если используется [.filename]#pkg-pre-install# или [.filename]#pkg-post-install#, скрипт выполняется только один раз (до или после установки пакета), с единственным аргументом `${PKGNAME}`. Использование [.filename]#pkg-pre-install.lua# или [.filename]#pkg-post-install.lua# запускает скрипт на Lua вместо shell-скрипта. Скрипты на Lua, выполняемые `pkg`, предоставляют некоторые расширения и несколько ограничений, которые описаны в man:pkg-lua-script[5].
[NOTE]
====
-Этот скрипт не запускается автоматически, если вы устанавливаете порт командой `make install`. Если же вам действительно необходимо его запустить, то запустите его явно из файла [.filename]#Makefile# порта строкой вида `PKG_PREFIX=${PREFIX} ${SH} $ {PKGINSTALL}${PKGNAME} PRE-INSTALL`.
+Использование [.filename]#pkg-pre-install# (или [.filename]#pkg-pre-install.lua#) и [.filename]#pkg-post-install# (или [.filename]#pkg-post-install.lua#) предпочтительнее, чем использование [.filename]#pkg-install#.
+====
+
+Эти скрипты автоматически добавляются в список упаковки.
+
+[IMPORTANT]
+====
+Эти скрипты предназначены для упрощения настройки пакетов после установки. Они _не должны_ использоваться для запуска служб, остановки служб или выполнения любых других команд, которые изменяют текущую работающую систему.
====
[[pkg-deinstall]]
-== [.filename]#pkg-deinstall#
+== pkg-deinstall, pkg-pre-deinstall и pkg-post-deinstall
-Этот скрипт вызывается при удалении пакета.
+Эти скрипты выполняются при удалении пакета.
-Этот скрипт будет дважды запускаться командой `pkg delete`. Первый раз как `${SH} pkg-deinstall ${PKGNAME} DEINSTALL`, а второй раз как `${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL`.
+Скрипт [.filename]#pkg-deinstall# выполняется дважды командой `pkg delete`. Первый раз как `${SH} pkg-deinstall ${PKGNAME} DEINSTALL` до удаления порта и второй раз как `${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL` после удаления порта. Переменная `$2` может быть проверена для определения режима, в котором выполняется скрипт. Переменная окружения `PKG_PREFIX` устанавливается в каталог установки пакета.
+
+Если используется [.filename]#pkg-pre-deinstall# или [.filename]#pkg-post-deinstall#, скрипт выполняется только один раз (до или после удаления пакета) с единственным аргументом `${PKGNAME}`. Использование [.filename]#pkg-pre-deinstall.lua# или [.filename]#pkg-post-deinstall.lua# запустит скрипт на Lua вместо shell-скрипта. Скрипты на Lua, выполняемые `pkg`, предоставляют некоторые расширения и ограничения, которые описаны в man:pkg-lua-script[5].
+
+[NOTE]
+====
+Использование [.filename]#pkg-pre-deinstall# (или [.filename]#pkg-pre-deinstall.lua#) и [.filename]#pkg-post-deinstall# (или [.filename]#pkg-post-deinstall.lua#) предпочтительнее, чем использование [.filename]#pkg-deinstall#.
+====
+
+Эти скрипты автоматически добавляются в список упаковки.
+
+[IMPORTANT]
+====
+Эти скрипты предназначены для упрощения очистки после удаления пакетов. Они _не должны_ использоваться для запуска служб, остановки служб или выполнения любых других команд, которые изменяют текущую работающую систему.
+====
[[pkg-names]]
== Изменение имён файлов [.filename]#pkg-*#
-Все имена файлов [.filename]#pkg-\*# определяются с помощью переменных, так что вы можете изменить их, если это нужно, в вашем файле [.filename]#Makefile#. Это особенно полезно, если вы используете одни и те же файлы [.filename]#pkg-*# совместно между несколькими портами или пишете в один из вышеперечисленных файлов (в главе о <<porting-wrkdir,"записи в каталоги, отличные от ``WRKDIR``">> объяснено, почему не рекомендуется осуществлять запись непосредственно в файлы [.filename]#pkg-*#.
+Все имена файлов [.filename]#pkg-\*# определяются с помощью переменных, так что вы можете изменить их, если это нужно, в вашем файле [.filename]#Makefile#. Это особенно полезно, если вы используете одни и те же файлы [.filename]#pkg-*# совместно между несколькими портами или пишете в один из вышеперечисленных файлов (в главе о crossref:porting-dads[porting-wrkdir,"записи в каталоги, отличные от ``WRKDIR``"] объяснено, почему не рекомендуется осуществлять запись непосредственно в файлы [.filename]#pkg-*#).
Вот список имён переменных и их значений по умолчанию. (Значение `PKGDIR` по умолчанию равно `${MASTERDIR}`.)
@@ -109,15 +275,25 @@ update-etc-shells:
|`PKGINSTALL`
|`${PKGDIR}/pkg-install`
+|`PKGPREINSTALL`
+|`${PKGDIR}/pkg-pre-install`
+
+|`PKGPOSTINSTALL`
+|`${PKGDIR}/pkg-post-install`
+
|`PKGDEINSTALL`
|`${PKGDIR}/pkg-deinstall`
+|`PKGPREDEINSTALL`
+|`${PKGDIR}/pkg-pre-deinstall`
+
+|`PKGPOSTDEINSTALL`
+|`${PKGDIR}/pkg-post-deinstall`
+
|`PKGMESSAGE`
|`${PKGDIR}/pkg-message`
|===
-Пожалуйста, изменяйте значения этих переменных, а не переопределяйте `PKG_ARGS`. Если вы измените значение переменных `PKG_ARGS`, то эти файлы при установке из порта будут установлены в каталог [.filename]#/var/db/pkg# некорректно.
-
[[using-sub-files]]
== Использование `SUB_FILES` и `SUB_LIST`
diff --git a/documentation/content/ru/books/porters-handbook/pkg-files/_index.po b/documentation/content/ru/books/porters-handbook/pkg-files/_index.po
new file mode 100644
index 0000000000..245b823d41
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/pkg-files/_index.po
@@ -0,0 +1,873 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-16 22:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookpkg-files_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:1
+#, no-wrap
+msgid "Tricks about the pkg-* files"
+msgstr "Хитрости с файлами pkg-*"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:1
+#, no-wrap
+msgid "Chapter 9. pkg-*"
+msgstr "Глава 9. Файлы pkg-*"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:14
+#, no-wrap
+msgid "pkg-*"
+msgstr "pkg-*"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:52
+msgid ""
+"There are some tricks we have not mentioned yet about the [.filename]#pkg-*# "
+"files that come in handy sometimes."
+msgstr ""
+"Есть несколько приёмов работы с файлами [.filename]#pkg-*#, которые мы ещё "
+"не описали, но они иногда могут быть очень кстати."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:54
+#, no-wrap
+msgid "pkg-message"
+msgstr "pkg-message"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:58
+msgid ""
+"To display a message when the package is installed, place the message in "
+"[.filename]#pkg-message#. This capability is often useful to display "
+"additional installation steps to be taken after a `pkg install` or `pkg "
+"upgrade`."
+msgstr ""
+"Если вам нужно вывести сообщение для человека, устанавливающего приложение, "
+"то вы можете поместить сообщение в файл [.filename]#pkg-message#. Эта "
+"возможность часто оказывается полезной для вывода дополнительных шагов "
+"установки, которые нужно предпринять после выполнения команды `pkg install`, "
+"или для вывода информации о лицензировании."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:62
+msgid ""
+"[.filename]#pkg-message# must contain only information that is _vital_ to "
+"setup and operation on FreeBSD, and that is unique to the port in question."
+msgstr ""
+"Файл [.filename]#pkg-message# должен содержать только информацию, "
+"_критически важную_ для настройки и работы в FreeBSD, а также уникальную для "
+"данного порта."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:63
+msgid ""
+"Setup information should only be shown on initial install. Upgrade "
+"instructions should be shown only when upgrading from the relevant version."
+msgstr ""
+"Информация по настройке должна отображаться только при первоначальной "
+"установке. Инструкции по обновлению должны показываться только при "
+"обновлении с соответствующей версии."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:64
+msgid ""
+"Do not surround the messages with either whitespace or lines of symbols "
+"(like `----------`, `**********`, or `==========`). Leave the formatting to "
+"man:pkg[8]."
+msgstr ""
+"Не обрамляйте сообщения ни пробелами, ни строками символов (такими как "
+"`----------`, `**********` или `==========`). Оставьте форматирование "
+"man:pkg[8]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:65
+msgid ""
+"Committers have blanket approval to constrain existing messages to install "
+"or upgrade ranges using the UCL format specifications."
+msgstr ""
+"Коммиттеры имеют полное право ограничивать существующие сообщения "
+"диапазонами установки или обновления, используя спецификации формата UCL."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:66
+msgid "Please be sure to refer to the proper tools for handling services."
+msgstr ""
+"Пожалуйста, убедитесь, что используете соответствующие инструменты для "
+"управления службами."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:67
+msgid ""
+"Use `service name start` to start a service rather than using `/usr/local/"
+"etc/rc.d/name start`"
+msgstr ""
+"Используйте `service имя start` для запуска службы вместо `/usr/local/etc/"
+"rc.d/имя start`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:68
+msgid "Use `sysrc name_enable=YES` to change options in rc.conf"
+msgstr "Используйте `sysrc name_enable=YES` для изменения параметров в rc.conf"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:72
+msgid "pkg-message supports two formats:"
+msgstr "pkg-message поддерживает два формата:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:73
+#, no-wrap
+msgid "raw"
+msgstr "raw"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:76
+msgid "A regular plain text file. Its message is only displayed on install."
+msgstr ""
+"Обычный текстовый файл. Его сообщение отображается только при установке."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:77
+#, no-wrap
+msgid "UCL"
+msgstr "UCL"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:80
+msgid ""
+"If the file starts with \"`[`\" then it is considered to be a UCL file. The "
+"UCL format is described on https://github.com/vstakhov/libucl[libucl's "
+"GitHub page]."
+msgstr ""
+"Если файл начинается с символа \"`[`\", то он считается файлом в формате "
+"UCL. Формат UCL описан на странице https://github.com/vstakhov/"
+"libucl[libucl's GitHub page]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:84
+msgid ""
+"Do not add an entry for [.filename]#pkg-message# in [.filename]#pkg-plist#."
+msgstr ""
+"Не добавляйте запись для [.filename]#pkg-message# в [.filename]#pkg-plist#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:87
+#, no-wrap
+msgid "UCL in pkg-message"
+msgstr "UCL в pkg-message"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:92
+msgid ""
+"The format is the following. It should be an array of objects. The objects "
+"themselves can have these keywords:"
+msgstr ""
+"Формат следующий. Это должен быть массив объектов. Сами объекты могут "
+"содержать следующие ключевые слова:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:93
+#, no-wrap
+msgid "`message`"
+msgstr "`message`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:96
+msgid "The actual message to be displayed. This keyword is mandatory."
+msgstr "Отображаемое сообщение. Этот ключевой параметр является обязательным."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:97
+#, no-wrap
+msgid "`type`"
+msgstr "`type`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:99
+msgid "When the message should be displayed."
+msgstr "Когда сообщение должно быть отображено."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:100
+#, no-wrap
+msgid "`maximum_version`"
+msgstr "`maximum_version`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:103
+msgid ""
+"Only if `type` is `upgrade`. Display if upgrading from a version strictly "
+"lower than the version specified."
+msgstr ""
+"Только если `type` имеет значение `upgrade`. Отображается, если обновление "
+"выполняется с версии строго ниже указанной."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:104
+#, no-wrap
+msgid "`minimum_version`"
+msgstr "`minimum_version`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:107
+msgid ""
+"Only if `type` is `upgrade`. Display if upgrading from a version strictly "
+"greater than the version specified."
+msgstr ""
+"Только если `type` имеет значение `upgrade`. Отображается, если обновление "
+"выполняется с версии, строго большей, чем указанная."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:109
+msgid "The `maximum_version` and `minimum_version` keywords can be combined."
+msgstr ""
+"Ключевые слова `maximum_version` и `minimum_version` можно комбинировать."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:111
+msgid "The `type` keyword can have three values:"
+msgstr "Ключевое слово `type` может иметь три значения:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:112
+#, no-wrap
+msgid "`install`"
+msgstr "`install`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:114
+msgid "The message should only be displayed when the package is installed."
+msgstr "Сообщение должно отображаться только при установке пакета."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:115
+#, no-wrap
+msgid "`remove`"
+msgstr "`remove`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:117
+msgid "The message should only be displayed when the package is removed."
+msgstr "Сообщение должно отображаться только при удалении пакета."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:118
+#, no-wrap
+msgid "`upgrade`"
+msgstr "`upgrade`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:120
+msgid "the message should only be displayed during an upgrade of the package.."
+msgstr "сообщение должно отображаться только во время обновления пакета."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:125
+msgid ""
+"To preserve the compatibility with non UCL [.filename]#pkg-message# files, "
+"the first line of a UCL [.filename]#pkg-message# _MUST be_ a single \"`[`\", "
+"and the last line _MUST be_ a single \"`]`\"."
+msgstr ""
+"Для сохранения совместимости с файлами [.filename]#pkg-message#, не "
+"использующими UCL, первая строка UCL [.filename]#pkg-message# _ДОЛЖНА быть_ "
+"одиночным символом \"`[`\", а последняя строка _ДОЛЖНА быть_ одиночным "
+"символом \"`]`\"."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:128
+#, no-wrap
+msgid "UCL Short Strings"
+msgstr "Короткие строки UCL"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:133
+msgid ""
+"The message is delimited by double quotes `\"`, this is used for simple "
+"single line strings:"
+msgstr ""
+"Сообщение ограничено двойными кавычками `\"`, это используется для простых "
+"однострочных строк:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:141
+#, no-wrap
+msgid ""
+"[\n"
+"{ type: install\n"
+" message: \"Simple message\"\n"
+"}\n"
+"]\n"
+msgstr ""
+"[\n"
+"{ type: install\n"
+" message: \"Simple message\"\n"
+"}\n"
+"]\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:146
+#, no-wrap
+msgid "UCL Multiline Strings"
+msgstr "Многострочные строки UCL"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:154
+msgid ""
+"Multiline strings use the standard here document notation. The multiline "
+"delimiter _must_ start just after `<<` symbols without any whitespace and it "
+"_must_ consist of capital letters only. To finish a multiline string, add "
+"the delimiter string on a line of its own without any whitespace. The "
+"message from crossref:pkg-files[porting-message-ucl-short-ex,UCL Short "
+"Strings] can be written as:"
+msgstr ""
+"Многострочные строки используют стандартную нотацию heredoc. Разделитель "
+"многострочной строки _должен_ начинаться сразу после символов `<<` без "
+"пробелов и _должен_ состоять только из заглавных букв. Чтобы завершить "
+"многострочную строку, добавьте строку-разделитель на отдельной строке без "
+"пробелов. Сообщение из раздела crossref:pkg-files[porting-message-ucl-short-"
+"ex,Короткие строки UCL] может быть записано как:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:164
+#, no-wrap
+msgid ""
+"[\n"
+"{ type: install\n"
+" message: <<EOM\n"
+"Simple message\n"
+"EOM\n"
+"}\n"
+"]\n"
+msgstr ""
+"[\n"
+"{ type: install\n"
+" message: <<EOM\n"
+"Simple message\n"
+"EOM\n"
+"}\n"
+"]\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:169
+#, no-wrap
+msgid "Display a Message on Install/Deinstall"
+msgstr "Показать сообщение при установке/удалении"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:174
+msgid ""
+"When a message only needs to be displayed on installation or uninstallation, "
+"set the type:"
+msgstr ""
+"Когда сообщение нужно отображать только при установке или удалении, укажите "
+"тип:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:184
+#, no-wrap
+msgid ""
+"[\n"
+"{\n"
+" type: remove\n"
+" message: \"package being removed.\"\n"
+"}\n"
+"{ type: install, message: \"package being installed.\"}\n"
+"]\n"
+msgstr ""
+"[\n"
+"{\n"
+" type: remove\n"
+" message: \"package being removed.\"\n"
+"}\n"
+"{ type: install, message: \"package being installed.\"}\n"
+"]\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:189
+#, no-wrap
+msgid "Display a Message on Upgrade"
+msgstr "Показать сообщение при обновлении"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:194
+msgid ""
+"When a port is upgraded, the message displayed can be even more tailored to "
+"the port's needs."
+msgstr ""
+"При обновлении порта отображаемое сообщение может быть ещё более "
+"адаптировано к потребностям порта."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:219
+#, no-wrap
+msgid ""
+"[\n"
+"{\n"
+" type: upgrade\n"
+" message: \"Package is being upgraded.\"\n"
+"}\n"
+"{\n"
+" type: upgrade\n"
+" maximum_version: \"1.0\"\n"
+" message: \"Upgrading from before 1.0 need to do this.\"\n"
+"}\n"
+"{\n"
+" type: upgrade\n"
+" minimum_version: \"1.0\"\n"
+" message: \"Upgrading from after 1.0 should do that.\"\n"
+"}\n"
+"{\n"
+" type: upgrade\n"
+" maximum_version: \"3.0\"\n"
+" minimum_version: \"1.0\"\n"
+" message: \"Upgrading from > 1.0 and < 3.0 remove that file.\"\n"
+"}\n"
+"]\n"
+msgstr ""
+"[\n"
+"{\n"
+" type: upgrade\n"
+" message: \"Package is being upgraded.\"\n"
+"}\n"
+"{\n"
+" type: upgrade\n"
+" maximum_version: \"1.0\"\n"
+" message: \"Upgrading from before 1.0 need to do this.\"\n"
+"}\n"
+"{\n"
+" type: upgrade\n"
+" minimum_version: \"1.0\"\n"
+" message: \"Upgrading from after 1.0 should do that.\"\n"
+"}\n"
+"{\n"
+" type: upgrade\n"
+" maximum_version: \"3.0\"\n"
+" minimum_version: \"1.0\"\n"
+" message: \"Upgrading from > 1.0 and < 3.0 remove that file.\"\n"
+"}\n"
+"]\n"
+
+#. type: delimited block * 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:225
+msgid ""
+"When displaying a message on upgrade, it is important to limit when it is "
+"being shown to the user. Most of the time it is by using `maximum_version` "
+"to limit its usage to upgrades from before a certain version when something "
+"specific needs to be done."
+msgstr ""
+"При отображении сообщения во время обновления важно ограничить случаи, когда "
+"оно показывается пользователю. Чаще всего это делается с помощью "
+"`maximum_version`, чтобы ограничить его использование обновлениями до "
+"определенной версии, когда требуется выполнить конкретное действие."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:230
+#, no-wrap
+msgid "pkg-install, pkg-pre-install, and pkg-post-install"
+msgstr "pkg-install, pkg-pre-install и pkg-post-install"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:236
+msgid ""
+"If the port needs to execute commands when the binary package is installed "
+"with `pkg add` or `pkg install`, use [.filename]#pkg-install#. It is run "
+"twice by `pkg`, the first time as `${SH} pkg-install ${PKGNAME} PRE-INSTALL` "
+"before the package is installed, and the second time as `${SH} pkg-install $"
+"{PKGNAME} POST-INSTALL` after it has been installed. `$2` can be tested to "
+"determine which mode the script is being run in. The `PKG_PREFIX` "
+"environment variable is set to the package installation directory."
+msgstr ""
+"Если порту необходимо выполнять команды при установке бинарного пакета с "
+"помощью `pkg add` или `pkg install`, используйте [.filename]#pkg-install#. "
+"Он запускается дважды через `pkg`: первый раз как `${SH} pkg-install $"
+"{PKGNAME} PRE-INSTALL` перед установкой пакета и второй раз как `${SH} pkg-"
+"install ${PKGNAME} POST-INSTALL` после его установки. Переменная `$2` может "
+"быть проверена, чтобы определить, в каком режиме выполняется скрипт. "
+"Переменная окружения `PKG_PREFIX` устанавливается равной имени каталога "
+"установки пакета."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:240
+msgid ""
+"If using [.filename]#pkg-pre-install# or [.filename]#pkg-post-install# "
+"instead, the script is run only once (before or after installing the "
+"package), with the single argument `${PKGNAME}`. Using [.filename]#pkg-pre-"
+"install.lua# or [.filename]#pkg-post-install.lua# will run a lua script "
+"instead of a shell script. Lua scripts run by `pkg` provide some extensions "
+"and a few restrictions, both explained in man:pkg-lua-script[5]."
+msgstr ""
+"Если используется [.filename]#pkg-pre-install# или [.filename]#pkg-post-"
+"install#, скрипт выполняется только один раз (до или после установки "
+"пакета), с единственным аргументом `${PKGNAME}`. Использование "
+"[.filename]#pkg-pre-install.lua# или [.filename]#pkg-post-install.lua# "
+"запускает скрипт на Lua вместо shell-скрипта. Скрипты на Lua, выполняемые "
+"`pkg`, предоставляют некоторые расширения и несколько ограничений, которые "
+"описаны в man:pkg-lua-script[5]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:244
+msgid ""
+"Using [.filename]#pkg-pre-install# (or [.filename]#pkg-pre-install.lua#) and "
+"[.filename]#pkg-post-install# (or [.filename]#pkg-post-install.lua#) is "
+"preferred to using [.filename]#pkg-install#."
+msgstr ""
+"Использование [.filename]#pkg-pre-install# (или [.filename]#pkg-pre-"
+"install.lua#) и [.filename]#pkg-post-install# (или [.filename]#pkg-post-"
+"install.lua#) предпочтительнее, чем использование [.filename]#pkg-install#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:247
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:274
+msgid "These scripts are automatically added to the packing list."
+msgstr "Эти скрипты автоматически добавляются в список упаковки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:252
+msgid ""
+"These scripts are here to simplify package configuration after "
+"installation. They _must not_ be abused to start services, stop services, "
+"or run any other commands that will modify the currently running system."
+msgstr ""
+"Эти скрипты предназначены для упрощения настройки пакетов после установки. "
+"Они _не должны_ использоваться для запуска служб, остановки служб или "
+"выполнения любых других команд, которые изменяют текущую работающую систему."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:255
+#, no-wrap
+msgid "pkg-deinstall, pkg-pre-deinstall, and pkg-post-deinstall"
+msgstr "pkg-deinstall, pkg-pre-deinstall и pkg-post-deinstall"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:258
+msgid "These scripts execute when a package is removed."
+msgstr "Эти скрипты выполняются при удалении пакета."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:263
+msgid ""
+"The [.filename]#pkg-deinstall# script is run twice by `pkg delete`. The "
+"first time as `${SH} pkg-deinstall ${PKGNAME} DEINSTALL` before the port is "
+"de-installed and the second time as `${SH} pkg-deinstall ${PKGNAME} POST-"
+"DEINSTALL` after the port has been de-installed. `$2` can be tested to "
+"determine which mode the script is being run in. The `PKG_PREFIX` "
+"environment variable is set to the package installation directory."
+msgstr ""
+"Скрипт [.filename]#pkg-deinstall# выполняется дважды командой `pkg delete`. "
+"Первый раз как `${SH} pkg-deinstall ${PKGNAME} DEINSTALL` до удаления порта "
+"и второй раз как `${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL` после "
+"удаления порта. Переменная `$2` может быть проверена для определения режима, "
+"в котором выполняется скрипт. Переменная окружения `PKG_PREFIX` "
+"устанавливается в каталог установки пакета."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:267
+msgid ""
+"If using [.filename]#pkg-pre-deinstall# or [.filename]#pkg-post-deinstall# "
+"instead, the script is run only once (before or after deinstalling the "
+"package), with the single argument `${PKGNAME}`. Using [.filename]#pkg-pre-"
+"deinstall.lua# or [.filename]#pkg-post-deinstall.lua# will run a lua script "
+"instead of a shell script. Lua scripts run by `pkg` provide some extensions "
+"and a few restrictions, both explained in man:pkg-lua-script[5]."
+msgstr ""
+"Если используется [.filename]#pkg-pre-deinstall# или [.filename]#pkg-post-"
+"deinstall#, скрипт выполняется только один раз (до или после удаления "
+"пакета) с единственным аргументом `${PKGNAME}`. Использование "
+"[.filename]#pkg-pre-deinstall.lua# или [.filename]#pkg-post-deinstall.lua# "
+"запустит скрипт на Lua вместо shell-скрипта. Скрипты на Lua, выполняемые "
+"`pkg`, предоставляют некоторые расширения и ограничения, которые описаны в "
+"man:pkg-lua-script[5]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:271
+msgid ""
+"Using [.filename]#pkg-pre-deinstall# (or [.filename]#pkg-pre-deinstall.lua#) "
+"and [.filename]#pkg-post-deinstall# (or [.filename]#pkg-post-deinstall.lua#) "
+"is preferred to using [.filename]#pkg-deinstall#."
+msgstr ""
+"Использование [.filename]#pkg-pre-deinstall# (или [.filename]#pkg-pre-"
+"deinstall.lua#) и [.filename]#pkg-post-deinstall# (или [.filename]#pkg-post-"
+"deinstall.lua#) предпочтительнее, чем использование [.filename]#pkg-"
+"deinstall#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:279
+msgid ""
+"These scripts are here to simplify cleanup after package deinstallation. "
+"They _must not_ be abused to start services, stop services, or run any other "
+"commands that will modify the currently running system."
+msgstr ""
+"Эти скрипты предназначены для упрощения очистки после удаления пакетов. Они "
+"_не должны_ использоваться для запуска служб, остановки служб или выполнения "
+"любых других команд, которые изменяют текущую работающую систему."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:282
+#, no-wrap
+msgid "Changing the Names of pkg-*"
+msgstr "Изменение имён файлов [.filename]#pkg-*#"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:287
+msgid ""
+"All the names of [.filename]#pkg-\\*# are defined using variables that can "
+"be changed in the [.filename]#Makefile# if needed. This is especially "
+"useful when sharing the same [.filename]#pkg-*# files among several ports or "
+"when it is necessary to write to one of these files. See crossref:porting-"
+"dads[porting-wrkdir,writing to places other than `WRKDIR`] for why it is a "
+"bad idea to write directly into the directory containing the [.filename]#pkg-"
+"*# files."
+msgstr ""
+"Все имена файлов [.filename]#pkg-\\*# определяются с помощью переменных, так "
+"что вы можете изменить их, если это нужно, в вашем файле "
+"[.filename]#Makefile#. Это особенно полезно, если вы используете одни и те "
+"же файлы [.filename]#pkg-*# совместно между несколькими портами или пишете в "
+"один из вышеперечисленных файлов (в главе о crossref:porting-dads[porting-"
+"wrkdir,\"записи в каталоги, отличные от ``WRKDIR``\"] объяснено, почему не "
+"рекомендуется осуществлять запись непосредственно в файлы [.filename]#pkg-"
+"*#)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:290
+msgid ""
+"Here is a list of variable names and their default values. (`PKGDIR` "
+"defaults to `${MASTERDIR}`.)"
+msgstr ""
+"Вот список имён переменных и их значений по умолчанию. (Значение `PKGDIR` по "
+"умолчанию равно `${MASTERDIR}`.)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:295
+#, no-wrap
+msgid "Variable"
+msgstr "Переменная"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:297
+#, no-wrap
+msgid "Default value"
+msgstr "Значение по умолчанию"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:298
+#, no-wrap
+msgid "`DESCR`"
+msgstr "`DESCR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:300
+#, no-wrap
+msgid "`${PKGDIR}/pkg-descr`"
+msgstr "`${PKGDIR}/pkg-descr`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:301
+#, no-wrap
+msgid "`PLIST`"
+msgstr "`PLIST`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:303
+#, no-wrap
+msgid "`${PKGDIR}/pkg-plist`"
+msgstr "`${PKGDIR}/pkg-plist`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:304
+#, no-wrap
+msgid "`PKGINSTALL`"
+msgstr "`PKGINSTALL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:306
+#, no-wrap
+msgid "`${PKGDIR}/pkg-install`"
+msgstr "`${PKGDIR}/pkg-install`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:307
+#, no-wrap
+msgid "`PKGPREINSTALL`"
+msgstr "`PKGPREINSTALL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:309
+#, no-wrap
+msgid "`${PKGDIR}/pkg-pre-install`"
+msgstr "`${PKGDIR}/pkg-pre-install`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:310
+#, no-wrap
+msgid "`PKGPOSTINSTALL`"
+msgstr "`PKGPOSTINSTALL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:312
+#, no-wrap
+msgid "`${PKGDIR}/pkg-post-install`"
+msgstr "`${PKGDIR}/pkg-post-install`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:313
+#, no-wrap
+msgid "`PKGDEINSTALL`"
+msgstr "`PKGDEINSTALL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:315
+#, no-wrap
+msgid "`${PKGDIR}/pkg-deinstall`"
+msgstr "`${PKGDIR}/pkg-deinstall`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:316
+#, no-wrap
+msgid "`PKGPREDEINSTALL`"
+msgstr "`PKGPREDEINSTALL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:318
+#, no-wrap
+msgid "`${PKGDIR}/pkg-pre-deinstall`"
+msgstr "`${PKGDIR}/pkg-pre-deinstall`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:319
+#, no-wrap
+msgid "`PKGPOSTDEINSTALL`"
+msgstr "`PKGPOSTDEINSTALL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:321
+#, no-wrap
+msgid "`${PKGDIR}/pkg-post-deinstall`"
+msgstr "`${PKGDIR}/pkg-post-deinstall`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:322
+#, no-wrap
+msgid "`PKGMESSAGE`"
+msgstr "`PKGMESSAGE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:323
+#, no-wrap
+msgid "`${PKGDIR}/pkg-message`"
+msgstr "`${PKGDIR}/pkg-message`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:326
+#, no-wrap
+msgid "Making Use of `SUB_FILES` and `SUB_LIST`"
+msgstr "Использование `SUB_FILES` и `SUB_LIST`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:329
+msgid ""
+"`SUB_FILES` and `SUB_LIST` are useful for dynamic values in port files, such "
+"as the installation `PREFIX` in [.filename]#pkg-message#."
+msgstr ""
+"Переменные `SUB_FILES` и `SUB_LIST` подходят для задания в файлах порта "
+"динамических значений, таких как `PREFIX` установки в [.filename]#pkg-"
+"message#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:335
+msgid ""
+"`SUB_FILES` specifies a list of files to be automatically modified. Each "
+"[.filename]#file# in the `SUB_FILES` list must have a corresponding "
+"[.filename]#file.in# present in `FILESDIR`. A modified version will be "
+"created as [.filename]#${WRKDIR}/file#. Files defined as a value of "
+"`USE_RC_SUBR` are automatically added to `SUB_FILES`. For the files "
+"[.filename]#pkg-message#, [.filename]#pkg-install#, and [.filename]#pkg-"
+"deinstall#, the corresponding Makefile variable is automatically set to "
+"point to the processed version."
+msgstr ""
+"В переменной `SUB_FILES` указывается перечень файлов для автоматического "
+"изменения. Каждый _file_ из перечня `SUB_FILES` обязан иметь соответствующий "
+"[.filename]#file.in#, присутствующий в `FILESDIR`. Измененная версия будет "
+"создана в `WRKDIR`. Файлы, определенные в качестве значения `USE_RC_SUBR` "
+"(или устаревшего `USE_RCORDER`), автоматически добавляются в `SUB_FILES`. "
+"Для файлов [.filename]#pkg-message#, [.filename]#pkg-install# и "
+"[.filename]#pkg-deinstall# устанавливается соответствующая переменная "
+"Makefile, указывающая на обработанную версию."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:340
+msgid ""
+"`SUB_LIST` is a list of `VAR=VALUE` pairs. For each pair, `%%VAR%%` will be "
+"replaced with `VALUE` in each file listed in `SUB_FILES`. Several common "
+"pairs are automatically defined: `PREFIX`, `LOCALBASE`, `DATADIR`, "
+"`DOCSDIR`, `EXAMPLESDIR`, `WWWDIR`, and `ETCDIR`. Any line beginning with "
+"`@comment` followed by a space, will be deleted from resulting files after a "
+"variable substitution."
+msgstr ""
+"Переменная `SUB_LIST` содержит перечень пар `VAR=VALUE`. В каждом файле из "
+"`SUB_FILES` для каждой пары будет произведена замена `%%VAR%%` на `VALUE`. "
+"Некоторые общие пары определяются автоматически: `PREFIX`, `LOCALBASE`, "
+"`DATADIR`, `DOCSDIR`, `EXAMPLESDIR`, `WWWDIR` и `ETCDIR`. Любая строка, "
+"начинающаяся с `@comment`, будет удалена из конечного файла после "
+"подстановки переменной."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:342
+msgid ""
+"This example replaces `%%ARCH%%` with the system architecture in a "
+"[.filename]#pkg-message#:"
+msgstr ""
+"В следующем примере в [.filename]#pkg-message# будет сделана замена `%%ARCH%"
+"%` на системную архитектуру:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:347
+#, no-wrap
+msgid ""
+"SUB_FILES=\tpkg-message\n"
+"SUB_LIST=\tARCH=${ARCH}\n"
+msgstr ""
+"SUB_FILES=\tpkg-message\n"
+"SUB_LIST=\tARCH=${ARCH}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:350
+msgid ""
+"Note that for this example, [.filename]#pkg-message.in# must exist in "
+"`FILESDIR`."
+msgstr ""
+"Обратите внимание, что в этом примере в `FILESDIR` обязательно существование "
+"файла [.filename]#pkg-message.in#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:352
+msgid "Example of a good [.filename]#pkg-message.in#:"
+msgstr "Пример хорошего [.filename]#pkg-message.in#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/pkg-files/_index.adoc:358
+#, no-wrap
+msgid ""
+"Now it is time to configure this package.\n"
+"Copy %%PREFIX%%/shared/examples/putsy/%%ARCH%%.conf into your home directory\n"
+"as .putsy.conf and edit it.\n"
+msgstr ""
+"Now it is time to configure this package.\n"
+"Copy %%PREFIX%%/shared/examples/putsy/%%ARCH%%.conf into your home directory\n"
+"as .putsy.conf and edit it.\n"
diff --git a/documentation/content/ru/books/porters-handbook/plist/_index.adoc b/documentation/content/ru/books/porters-handbook/plist/_index.adoc
index 3bd999822b..d9b93ae0fb 100644
--- a/documentation/content/ru/books/porters-handbook/plist/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/plist/_index.adoc
@@ -1,11 +1,13 @@
---
-title: Глава 7. Продвинутые практики pkg-plist
-prev: books/porters-handbook/special
+description: 'Продвинутые практики pkg-plist'
next: books/porters-handbook/pkg-files
-showBookMenu: true
-weight: 7
params:
- path: "/books/porters-handbook/plist/"
+ path: /books/porters-handbook/plist/
+prev: books/porters-handbook/flavors
+showBookMenu: true
+tags: ["pkg-plist", "practices", "configuration"]
+title: 'Глава 8. Продвинутые практики pkg-plist'
+weight: 8
---
[[plist]]
@@ -16,7 +18,7 @@ params:
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 7
+:sectnumoffset: 8
:partnums:
:source-highlighter: rouge
:experimental:
@@ -49,32 +51,31 @@ endif::[]
[[plist-sub]]
== Изменение содержимого [.filename]#pkg-plist# в зависимости от make-переменных
-Некоторые порты, в частности, порты `p5-`, должны менять содержимое своих файлов [.filename]#pkg-plist# в зависимости от того, с какими параметрами они были отконфигурированы (или в зависимости от версии языка `perl` в случае портов `p5-`). Чтобы облегчить этот процесс, любые вхождения ключевых слов `%%OSREL%%`, `%%PERL_VER%%` и `%%PERL_VERSION%%` в файле [.filename]#pkg-plist# будут заменяться соответствующими значениями. Значением `%%OSREL%%` является номер версии операционной системы (например, `4.9`). `%%PERL_VERSION%%` и `%%PERL_VER%%` обозначают полный номер версии `perl` (например, `5.8.9`). Некоторые другие `%%VARS%%`, имеющие отношение к файлам документации порта, описаны в <<install-documentation,соответствующем разделе>>.
+Некоторые порты, в частности, порты `p5-`, должны менять содержимое своих файлов [.filename]#pkg-plist# в зависимости от того, с какими параметрами они были отконфигурированы (или в зависимости от версии языка `perl` в случае портов `p5-`). Чтобы облегчить этот процесс, любые вхождения ключевых слов `%%OSREL%%`, `%%PERL_VER%%` и `%%PERL_VERSION%%` в файле [.filename]#pkg-plist# будут заменяться соответствующими значениями. Значением `%%OSREL%%` является номер версии операционной системы (например, `4.9`). `%%PERL_VERSION%%` и `%%PERL_VER%%` обозначают полный номер версии `perl` (например, `5.8.9`). Некоторые другие `%%VARS%%`, имеющие отношение к файлам документации порта, описаны в crossref:makefiles[install-documentation,соответствующем разделе].
Если вам нужно сделать другие подстановки, вы можете указать в переменной `PLIST_SUB` список пар `VAR=VALUE`, и все вхождения `%%VAR%%` в файле [.filename]#pkg-plist# будут заменяться на значение _VALUE_.
-Например, если у вас имеется порт, который устанавливает много файлов в каталог, зависящий от версии, вы можете задать нечто типа
+Например, если порт устанавливает множество файлов в подкаталоге, зависящем от версии, используйте заполнитель для версии, чтобы файл [.filename]#pkg-plist# не требовал перегенерации при каждом обновлении порта. Например, укажите:
[.programlisting]
....
-OCTAVE_VERSION= 2.0.13
+OCTAVE_VERSION= ${PORTREVISION}
PLIST_SUB= OCTAVE_VERSION=${OCTAVE_VERSION}
....
в файле [.filename]#Makefile# и использовать `%%OCTAVE_VERSION%%` везде, где нужно указать номер версии в файле [.filename]#pkg-plist#. Таким образом, при обновлении порта вам не нужно будет менять десятки (а в некоторых случаях и сотни) строк в файле [.filename]#pkg-plist#.
-Если ваш порт устанавливает файлы в соответствии с установленными в порту опциями, то обычным способом управления является добавление префиксов `%%TAG%%` для строк [.filename]#pkg-plist# с добавлением этого `TAG` в переменную `PLIST_SUB` внутри [.filename]#Makefile# со специальным значением `@comment`, которое указывает пакетным инструментам игнорировать эти строки:
+Если файлы устанавливаются по условию в зависимости от опций, установленных в порте, обычный способ обработки — это добавление префикса `%%OPT%%` для строк в [.filename]#pkg-plist#, которые нужны при включении опции, или `%%NO_OPT%%`, когда опция отключена, а также добавление `OPTIONS_SUB=yes` в [.filename]#Makefile#. Подробнее см. crossref:makefiles[options_sub,`OPTIONS_SUB`].
+
+Например, если есть файлы, которые устанавливаются только при включении опции `X11`, и в [.filename]#Makefile# указано:
[.programlisting]
....
-.if defined(WITH_X11)
-PLIST_SUB+= X11=""
-.else
-PLIST_SUB+= X11="@comment "
-.endif
+OPTIONS_DEFINE= X11
+OPTIONS_SUB= yes
....
-и в самом [.filename]#pkg-plist#:
+В [.filename]#pkg-plist# укажите `%%X11%%` перед строками, которые устанавливаются только при включении опции, например:
[.programlisting]
....
@@ -83,7 +84,20 @@ PLIST_SUB+= X11="@comment "
Эта подстановка будет сделана между выполнением целей `pre-install` и `do-install`, посредством чтения файла [.filename]#PLIST# и записью в файл [.filename]#TMPPLIST# (по умолчанию это файл [.filename]#WRKDIR/.PLIST.mktmp#). Так что если ваш порт строит [.filename]#PLIST# на лету, делайте это во время или до выполнения цели `pre-install`. Кроме того, если вашему порту требуется отредактировать получающийся файл, делайте это в цели `post-install` изменением файла [.filename]#TMPPLIST#.
-Другой способ изменения списка сборки порта основан на определении значений переменных `PLIST_FILES`, `PLIST_DIRS` и `PLIST_DIRSTRY`. Каждое из них рассматривается как перечень путей для записи в [.filename]#TMPPLIST# содержимого [.filename]#PLIST#. Имена, перечисленные в `PLIST_FILES`, `PLIST_DIRS` и `PLIST_DIRSTRY` подвергаются подстановке `%%VAR%%`, как описано выше. За исключением этого, имена из `PLIST_FILES` будут появляться в окончательном варианте перечня сборки без изменений, тогда как `@dirrm` и `@dirrmtry` будут соответственно предшествовать именам из `PLIST_DIRS` и `PLIST_DIRSTRY`. Для того чтобы изменения вступили в силу, `PLIST_FILES`, `PLIST_DIRS` и `PLIST_DIRSTRY` должны задаваться до того, как будет записываться [.filename]#TMPPLIST#, то есть в цели `pre-install` или ещё раньше.
+Ещё один способ изменения списка упаковки порта основан на установке переменных `PLIST_FILES` и `PLIST_DIRS`. Значение каждой переменной рассматривается как список путей для записи в [.filename]#TMPPLIST# вместе с содержимым [.filename]#PLIST#. Хотя имена, перечисленные в `PLIST_FILES` и `PLIST_DIRS`, подлежат замене `%%_VAR_%%`, как описано выше, лучше использовать `${_VAR_}` напрямую. За исключением этого, имена из `PLIST_FILES` появятся в итоговом списке упаковки без изменений, тогда как к именам из `PLIST_DIRS` будет добавлен префикс `@dir`. Чтобы вступить в силу, `PLIST_FILES` и `PLIST_DIRS` должны быть установлены до записи [.filename]#TMPPLIST#, то есть в `pre-install` или ранее.
+
+Время от времени использования `OPTIONS_SUB` недостаточно. В таких случаях добавление специфичного `_TAG_` в `PLIST_SUB` внутри [.filename]#Makefile# со специальным значением `@comment` заставляет инструменты пакетирования игнорировать строку. Например, если некоторые файлы устанавливаются только при включённой опции `X11` и архитектуре `i386`:
+
+[.programlisting]
+....
+.include <bsd.port.pre.mk>
+
+.if ${PORT_OPTIONS:MX11} && ${ARCH} == "i386"
+PLIST_SUB+= X11I386=""
+.else
+PLIST_SUB+= X11I386="@comment "
+.endif
+....
[[plist-cleaning]]
== Пустые каталоги
@@ -91,84 +105,504 @@ PLIST_SUB+= X11="@comment "
[[plist-dir-cleaning]]
=== Очистка пустых каталогов
-Заставьте ваш порты удалять пустые каталоги при удалении. Обычно это достигается добавлением строк `@dirrm` для всех каталогов, которые создаются этим портом. Вам нужно удалить подкаталоги до того, как вы сможете удалить родительские каталоги.
+При удалении порт должен удалить пустые каталоги, которые он создал. Большинство этих каталогов автоматически удаляются с помощью man:pkg[8], но для каталогов, созданных вне [.filename]#${PREFIX}#, или пустых каталогов требуется дополнительная работа. Обычно это делается добавлением строк `@dir` для таких каталогов. Подкаталоги должны быть удалены до удаления родительских каталогов.
[.programlisting]
....
- :
-lib/X11/oneko/pixmaps/cat.xpm
-lib/X11/oneko/sounds/cat.au
- :
-@dirrm lib/X11/oneko/pixmaps
-@dirrm lib/X11/oneko/sounds
-@dirrm lib/X11/oneko
+[...]
+@dir /var/games/oneko/saved-games
+@dir /var/games/oneko
....
-Однако, иногда `@dirrm` будет выдавать ошибки, потому что другие порты используют тот же самый подкаталог. Вы можете использовать `@dirrmtry` для удаления только пустых каталогов без выдачи предупреждений.
+[[plist-dir-empty]]
+=== Создание пустых каталогов
+
+Пустые каталоги, созданные во время установки порта, требуют особого внимания. Они должны присутствовать при создании пакета. Если они не созданы кодом порта, создайте их в [.filename]#Makefile#:
[.programlisting]
....
-@dirrmtry share/doc/gimp
+post-install:
+ ${MKDIR} ${STAGEDIR}${PREFIX}/some/directory
....
-Эта команда не выведет никаких сообщений об ошибках и не вызовет аварийного завершения работы `pkg delete` (см. man:pkg-delete[8]), даже если каталог [.filename]#${PREFIX}/shared/doc/gimp# не пуст из-за того, что другие порты установили сюда какие-то файлы.
-
-[[plist-dir-empty]]
-=== Создание пустых каталогов
-
-Пустым каталогам, создаваемым во время установки порта, нужно особое внимание. Они не будут созданы при установке пакета, потому что пакеты содержат только файлы, а `pkg add` и `pkg install` создают для них каталоги по мере надобности. Чтобы убедиться, что пустой каталог создается при установке пакета, добавьте эту строку в [.filename]#pkg-plist# перед соответствующей строкой `@dirrm`:
+Добавьте директорию в [.filename]#pkg-plist# так же, как и любую другую. Например:
[.programlisting]
....
-@exec mkdir -p %D/shared/foo/templates
+@dir some/directory
....
[[plist-config]]
-== Конфигурационные файлы
-
-Если ваш порт устанавливает конфигурационные файлы в каталог [.filename]#PREFIX/etc# (или куда-то еще), _не_ делайте их простого перечисления в файле [.filename]#pkg-plist#. Это приведёт к тому, что по команде `pkg delete` или при новой установке файлы, тщательно отредактированные и настроенные пользователем, будут уничтожены.
+== Файлы конфигурации
-Вместо этого установите файл(ы) с примерами с расширением [.filename]#filename.sample#. Затем скопируйте файл с примером на место настоящего файла конфигурации, если таковой ещё не существует. При деинсталляции удаляйте файл конфигурации только в том случае, если он идентичен файлу с расширением [.filename]#.sample#. Вам нужно управлять этим в [.filename]#Makefile# и в [.filename]#pkg-plist# (для установки из пакета).
+Если порт устанавливает файлы конфигурации в [.filename]#PREFIX/etc# (или в другое место), _не_ указывайте их в [.filename]#pkg-plist#. Это приведёт к тому, что `pkg delete` удалит файлы, которые были тщательно отредактированы пользователем, а повторная установка перезапишет их.
-Пример части [.filename]#Makefile#:
+Вместо этого устанавливайте образцы файлов с расширением [.filename]#filename.sample#. Макрос `@sample` автоматизирует этот процесс; подробности его работы см. в разделе crossref:plist[plist-keywords-sample, Расширение списка пакетов с помощью ключевых слов]. Для каждого образца файла добавьте строку в [.filename]#pkg-plist#:
[.programlisting]
....
-post-install:
- @if [ ! -f ${PREFIX}/etc/orbit.conf ]; then \
- ${CP} -p ${PREFIX}/etc/orbit.conf.sample ${STAGEDIR}${PREFIX}/etc/orbit.conf ; \
- fi
+@sample etc/orbit.conf.sample
....
-Добавьте по три строки в [.filename]#pkg-plist# для каждого конфигурационного файла, как показано ниже:
+Если существует очень веская причина не устанавливать рабочий файл конфигурации по умолчанию, укажите только имя примера файла в [.filename]#pkg-plist#, без части `@sample` с последующим пробелом, и добавьте crossref:pkg-files[porting-message,сообщение], указывающее, что пользователь должен скопировать и отредактировать файл перед тем, как программа заработает.
+
+[TIP]
+====
+Когда порт устанавливает свою конфигурацию в подкаталоге [.filename]#${PREFIX}/etc#, используйте `ETCDIR`, который по умолчанию равен `${PREFIX}/etc/${PORTNAME}`. Это значение может быть переопределено в [.filename]#Makefile# порта, если для порта принято использовать другой каталог. Макрос `%%ETCDIR%%` будет использоваться вместо этого в [.filename]#pkg-plist#.
+====
+
+[NOTE]
+====
+Примеры конфигурационных файлов всегда должны иметь суффикс [.filename]#.sample#. Если по каким-то историческим причинам использование стандартного суффикса невозможно, или если примеры файлов взяты из другого каталога, используйте эту конструкцию:
[.programlisting]
....
-@unexec if cmp -s %D/etc/orbit.conf.sample %D/etc/orbit.conf; then rm -f %D/etc/orbit.conf; fi
-etc/orbit.conf.sample
-@exec if [ ! -f %D/etc/orbit.conf ] ; then cp -p %D/%F %B/orbit.conf; fi
+@sample etc/orbit.conf-dist etc/orbit.conf
....
-Данные строки являются упорядоченными. На этапе удаления файл с примером сравнивается с рабочим конфигурационным файлом. Полное совпадение означает отсутствие каких-либо изменений в рабочем файле со стороны пользователя, и следовательно этот файл может быть безопасно удалён. Так как файл с примером всё ещё должен существовать для сравнения, строка `@unexec` следует перед именем файла с примером конфигурации. На этапе установки, если рабочий файл конфигурации отсутствует, он копируется из файла с примером. Файл с примером обязательно должен быть установлен до операции копирования, поэтому строка `@exec` следует после имени файла с примером конфигурации.
+или
-Для получения дополнительного отладочного вывода на экран можно временно удалить параметр `-s` из команды man:cmp[1].
-
-Для получения дополнительной инфорации по использованию `%D` и прочих маркеров подстановки обратитесь к странице Справочника man:pkg-create[8].
+[.programlisting]
+....
+@sample %%EXAMPLESDIR%%/orbit.conf etc/orbit.conf
+....
-Если существует действительно стоящая причина не устанавливать рабочий файл конфигурации по умолчанию, уберите строку `@exec` из [.filename]#pkg-plist# и добавьте <<porting-message,сообщение>>, указывающее на то, что пользователь обязан скопировать и отредактировать этот файл перед тем, как программное обеспечение начнёт работать.
+Формат: `@sample _файл-образец фактический-конфигурационный-файл_`.
+====
[[plist-dynamic]]
== Динамический или статический список упаковки
-_Статический список упаковки_ - это список упаковки, который доступен в Коллекции Портов или как файл [.filename]#pkg-plist# (с подстановкой переменных или без неё), или как встроенный в [.filename]#Makefile# посредством `PLIST_FILES`, `PLIST_DIRS` и `PLIST_DIRSTRY`. Даже если содержимое является автоматически порождаемым при помощи инструмента или в результате выполнения цели в Makefile _до_ включения в Коллекцию Портов коммиттером, то список всё ещё будет считаться статическим, поскольку его можно узнать без необходимости скачивания или компиляции дистрибутива.
+_Статический список упаковки_ — это список упаковки, который доступен в Коллекции Портов или как файл [.filename]#pkg-plist# (с подстановкой переменных или без неё), или как встроенный в [.filename]#Makefile# через `PLIST_FILES` и `PLIST_DIRS`. Даже если содержимое было автоматически сгенерировано инструментом или целью в Makefile _до_ включения в Коллекцию портов коммиттером (например, с использованием `make makeplist`), такой список всё равно считается статическим, поскольку его можно посмотреть без необходимости загрузки или компиляции distfile.
-_Динамический список упаковки_ это список упаковки, который получается во время компиляции порта и строится на основе устанавливаемых файлов и каталогов. Узнать такой список невозможно до того, как исходный код портируемого приложения будет скачен и скомпилирован, или после запуска `make clean`.
+_Динамический список упаковки_ — это список упаковки, который генерируется во время компиляции порта на основе установленных файлов и каталогов. Невозможно изучить его до загрузки и компиляции исходного кода портированного приложения или после выполнения команды `make clean`.
-Хотя использование динамических список упаковки не запрещено, сопровождающие должны использовать статические списки упаковки везде, где это возможно, поскольку это позволяет пользователям выполнять man:grep[1] по доступным портам для обнаружения, например, который порт устанавливает определенный файл. Динамические списки должны быть использованы в основном для сложных портов, для которых изменения в списке упаковки кардинальным образом основаны на необязательных возможностях порта (и, таким образом, делая сопровождение статических списков упаковки невозможным), или портов, которые изменяют список упаковки на основе версии используемого им программного обеспечения (например, порты, которые порождают документы при помощи Javadoc).
+Хотя использование динамических списков упаковки не запрещено, сопровождающие должны использовать статические списки упаковки везде, где это возможно, поскольку это позволяет пользователям выполнять man:grep[1] по доступным портам для обнаружения, например, какой порт устанавливает определенный файл. Динамические списки должны быть использованы в основном для сложных портов, для которых изменения в списке упаковки кардинальным образом основаны на возможностях порта, настраиваемых параметрами, (и, таким образом, делая сопровождение статических списков упаковки невозможным), или портов, которые изменяют список упаковки на основе версии используемого им программного обеспечения (например, порты, которые порождают документы при помощи Javadoc).
[[plist-autoplist]]
== Автоматическое создание списка упаковки
-Первым делом убедитесь, что ваш порт практически полностью завершён и осталось создать только [.filename]#pkg-plist#. После этого вы можете запустить `make makeplist` для автоматического создания [.filename]#pkg-plist#. Содержимое этого файла должно быть дважды перепроверено.
+Сначала убедитесь, что порт почти готов, и отсутствует только файл [.filename]#pkg-plist#. Запуск команды `make makeplist` покажет пример для файла [.filename]#pkg-plist#. Вывод `makeplist` необходимо дважды перепроверять на корректность, так как он пытается автоматически угадать некоторые вещи и может ошибаться.
+
+Файлы конфигурации пользователя должны устанавливаться как [.filename]#filename.sample#, как описано в разделе crossref:plist[plist-config,Файлы конфигурации]. [.filename]#info/dir# не должен быть указан, а соответствующие строки [.filename]#install-info# должны быть добавлены, как указано в разделе crossref:makefiles[makefile-info,info-файлы]. Любые библиотеки, устанавливаемые портом, должны быть перечислены, как указано в разделе crossref:special[porting-shlibs,общие библиотеки].
+
+[[plist-autoplist-regex]]
+=== Расширение `PLIST_SUB` с помощью регулярных выражений
+
+Строки, которые нужно заменить, иногда должны быть очень конкретными, чтобы избежать нежелательных замен. Это распространённая проблема с короткими значениями.
+
+Для решения этой проблемы для каждого `_PLACEHOLDER_=_значение_` можно задать `PLACEHOLDER_regex=регулярное_выражение`, где часть `_regex_` более точно соответствует _значению_.
+
+[[plist-autoplist-regex-ex1]]
+.Использование PLIST_SUB с регулярными выражениями
+[example]
+====
+
+Порты Perl могут устанавливать архитектурно-зависимые файлы в специальное дерево. В FreeBSD для упрощения портирования это дерево называется `mach`. Например, порт, который устанавливает файл, чей путь содержит `mach`, может иметь эту часть строки пути заменённой неправильными значениями. Рассмотрим этот [.filename]#Makefile#:
+
+[.programlisting]
+....
+PORTNAME= Machine-Build
+DISTVERSION= 1
+CATEGORIES= devel perl5
+MASTER_SITES= CPAN
+PKGNAMEPREFIX= p5-
+
+MAINTAINER= perl@FreeBSD.org
+COMMENT= Building machine
+WWW= https://search.cpan.org/dist/Machine-Build
+
+USES= perl5
+USE_PERL5= configure
+
+PLIST_SUB= PERL_ARCH=mach
+....
+
+Файлы, установленные портом:
+
+[.programlisting]
+....
+/usr/local/bin/machine-build
+/usr/local/lib/perl5/site_perl/man/man1/machine-build.1.gz
+/usr/local/lib/perl5/site_perl/man/man3/Machine::Build.3.gz
+/usr/local/lib/perl5/site_perl/Machine/Build.pm
+/usr/local/lib/perl5/site_perl/mach/5.20/Machine/Build/Build.so
+....
+
+Запуск `make makeplist` ошибочно создает:
+
+[.programlisting]
+....
+bin/%%PERL_ARCH%%ine-build
+%%PERL5_MAN1%%/%%PERL_ARCH%%ine-build.1.gz
+%%PERL5_MAN3%%/Machine::Build.3.gz
+%%SITE_PERL%%/Machine/Build.pm
+%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so
+....
+
+Измените строку `PLIST_SUB` в [.filename]#Makefile# на:
+
+[.programlisting]
+....
+PLIST_SUB= PERL_ARCH=mach \
+ PERL_ARCH_regex=\bmach\b
+....
+
+Теперь `make makeplist` правильно генерирует:
+
+[.programlisting]
+....
+bin/machine-build
+%%PERL5_MAN1%%/machine-build.1.gz
+%%PERL5_MAN3%%/Machine::Build.3.gz
+%%SITE_PERL%%/Machine/Build.pm
+%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so
+....
+
+====
+
+[[plist-keywords]]
+== Расширение списка пакетов используя ключевые слова
+
+Все ключевые слова также могут принимать необязательные аргументы в скобках. Аргументами являются владелец, группа и режим доступа. Этот аргумент применяется к файлу или каталогу, на который ссылаются. Чтобы изменить владельца, группу и режим доступа конфигурационного файла, используйте:
+
+[.programlisting]
+....
+@sample(games,games,640) etc/config.sample
+....
+
+Аргументы являются необязательными. Если необходимо изменить только группу и режим, используйте:
+
+[.programlisting]
+....
+@sample(,games,660) etc/config.sample
+....
+
+[WARNING]
+====
+
+Если ключевое слово используется в crossref:makefiles[makefile-options,необязательной записи], оно должно быть добавлено после помощника:
+
+[.programlisting]
+....
+%%FOO%%@sample etc/orbit.conf.sample
+....
+
+Это происходит потому, что вспомогательные функции plist для опций используются для закомментирования строки, поэтому они должны быть указаны первыми. Дополнительную информацию см. в crossref:makefiles[options_sub,`OPTIONS_SUB`].
+====
+
+[[plist-keywords-desktop-file-utils]]
+=== `@desktop-file-utils`
+
+Будет выполнять `update-desktop-database -q` после установки и удаления. _Никогда_ не используйте напрямую, добавьте crossref:uses[uses-desktop-file-utils,`USES=desktop-file-utils`] в [.filename]#Makefile#.
+
+[[plist-keywords-fc]]
+=== `@fc` _каталог_
+
+Добавить запись `@dir` для каталога, переданного в качестве аргумента, и выполнить `fc-cache -fs` для этого каталога после установки и удаления.
+
+[[plist-keywords-fontsdir]]
+=== `@fontsdir` _каталог_
+
+Добавить запись `@dir` для каталога, переданного в качестве аргумента, и запустить `mkfontscale` и `mkfontdir` в этом каталоге после установки и удаления. Кроме того, при удалении удаляются кэш-файлы [.filename]#fonts.scale# и [.filename]#fonts.dir#, если они пусты.
+
+[[plist-keywords-info]]
+=== `@info` _файл_
+
+Добавляет файл, переданный в качестве аргумента, в plist и обновляет индекс документа info при установке и удалении. Кроме того, удаляет индекс, если он пуст, при удалении. Это никогда не следует использовать вручную, а только через `INFO`. Подробнее см. в crossref:makefiles[makefile-info,Файлы Info].
+
+[[plist-keywords-kld]]
+=== `@kld` _каталог_
+
+Выполняет `kldxref` для каталога при установке и удалении. Дополнительно при удалении каталог будет удалён, если он пуст.
+
+[[plist-keywords-rmtry]]
+=== `@rmtry` _файл_
+
+Удаляет файл при удалении и не выдает ошибку, если файл отсутствует.
+
+[[plist-keywords-sample]]
+=== `@sample` _файл_ [_файл_]
+
+Это используется для обработки установки файлов конфигурации, используя примеры файлов, поставляемых с пакетом. "Реальный" файл (не пример) — это либо второе имя файла, если оно присутствует, либо первое имя файла без расширения [.filename]#.sample#.
+
+Это делает три вещи. Во-первых, добавляет первый переданный файл в качестве аргумента, образец файла, в plist. Затем, при установке, если фактический файл не найден, копирует образец файла в фактический файл. И наконец, при удалении, удаляет фактический файл, если он не был изменён. Дополнительную информацию см. в crossref:plist[plist-config, Файлы конфигурации].
+
+[[plist-keywords-shared-mime-info]]
+=== `@shared-mime-info` _каталог_
+
+Выполняет `update-mime-database` для указанного каталога при установке и удалении.
+
+[[plist-keywords-shell]]
+=== `@shell` _файл_
+
+Добавить файл, переданный в качестве аргумента, в plist.
+
+При установке добавить полный путь к _file_ в [.filename]#/etc/shells#, убедившись, что он не добавлен повторно. При удалении удалите его из [.filename]#/etc/shells#.
+
+[[plist-keywords-terminfo]]
+=== `@terminfo`
+
+Не использовать самостоятельно. Если порт устанавливает файлы [.filename]#*.terminfo#, добавьте crossref:uses[uses-terminfo,`USES=terminfo`] в его [.filename]#Makefile#.
+
+При установке и удалении, если присутствует `tic`, обновить [.filename]#${PREFIX}/shared/misc/terminfo.db# из файлов [.filename]#*.terminfo# в [.filename]#${PREFIX}/shared/misc#.
+
+[[plist-keywords-base]]
+=== Основные ключевые слова
+
+Есть несколько ключевых слов, которые жестко закодированы и документированы в man:pkg-create[8]. Для полноты изложения они также документированы здесь.
+
+[[plist-keywords-base-empty]]
+==== `@` [_файл_]
+
+Ключевое слово `empty` является заполнителем, используемым, когда необходимо изменить владельца, группу или права доступа к файлу. Например, чтобы установить группу файла в `games` и добавить бит setgid, добавьте:
+
+[.programlisting]
+....
+@(,games,2755) sbin/daemon
+....
+
+[[plist-keywords-base-exec]]
+==== `@preexec` _команда_, `@postexec` _команда_, `@preunexec` _команда_, `@postunexec` _команда_
+
+Выполнить _комманду_ как часть процесса установки или удаления пакета.
+
+`@preexec` _команда_::
+Выполнить _команду_ как часть скриптов [.filename]#pre-install#.
+
+`@postexec` _команда_::
+Выполнить _команду_ как часть скриптов [.filename]#post-install#.
+
+`@preunexec` _команда_::
+Выполнить _команду_ как часть скриптов [.filename]#pre-deinstall#.
+
+`@postunexec` _команда_::
+Выполнить _команду_ как часть скриптов [.filename]#post-deinstall#.
+
+Если в _команде_ содержится любая из этих последовательностей, они раскрываются непосредственно. Для следующих примеров предположим, что `@cwd` установлен в [.filename]#/usr/local#, а последним извлечённым файлом был [.filename]#bin/emacs#.
+
+`%F`::
+Раскрывается до последнего извлеченного имени файла (как указано). В примере [.filename]#bin/emacs#.
+
+`%D`::
+Раскрыть до текущего префикса директории, установленного с помощью `@cwd`. В этом примере [.filename]#/usr/local#.
+
+`%B`::
+Раскрыть до базового имени полного имени файла, то есть префикс текущего каталога плюс последняя спецификация файла, за вычетом имени файла в конце спецификации. В данном примере это будет [.filename]#/usr/local/bin#.
+
+`%f`::
+Раскрывается до части имени файла в полном квалифицированном имени, или противоположный случай для `%B`. В примере, [.filename]#emacs#.
+
+[IMPORTANT]
+====
+Эти ключевые слова предназначены для помощи в настройке пакета, чтобы он был максимально готов к использованию. Они _не должны_ использоваться для запуска служб, остановки служб или выполнения любых других команд, которые изменяют текущую работающую систему.
+====
+
+[[plist-keywords-base-mode]]
+==== `@mode` _режим_
+
+Установить разрешения по умолчанию для всех последующих извлекаемых файлов в _режим_. Формат такой же, как используется в man:chmod[1]. Использование без аргумента вернёт разрешения по умолчанию (режим файла при упаковке).
+
+[IMPORTANT]
+====
+Это должен быть числовой режим, например `644`, `4755` или `600`. Нельзя использовать относительный режим, например `u+s`.
+====
+
+[[plist-keywords-base-owner]]
+==== `@owner` _пользователь_
+
+Установить владельца по умолчанию для всех последующих файлов в _пользователь_. Использование без аргумента вернёт владельца по умолчанию (`root`).
+
+[[plist-keywords-base-group]]
+==== `@group` _группа_
+
+Установить группу-владельца по умолчанию для всех последующих файлов в _группу_. Использование без аргумента вернёт группу-владельца по умолчанию (`wheel`).
+
+[[plist-keywords-base-comment]]
+==== `@comment` _строка_
+
+Эта строка игнорируется при упаковке.
+
+[[plist-keywords-base-dir]]
+==== `@dir` _каталог_
+
+Объявить имя каталога. По умолчанию каталоги, созданные в `PREFIX` при установке пакета, автоматически удаляются. Используйте эту опцию, если необходимо создать пустой каталог в `PREFIX` или если каталогу требуется нестандартный владелец, группа или права. Каталоги за пределами `PREFIX` необходимо регистрировать. Например, [.filename]#/var/db/${PORTNAME}# требует записи `@dir`, тогда как [.filename]#${PREFIX}/shared/${PORTNAME}# — нет, если он содержит файлы или использует стандартные владельца, группу и права.
+
+[[plist-keywords-base-exec-deprecated]]
+==== `@exec` _команда_, `@unexec` _команда_ (Устарело)
+
+Выполнить _команду_ как часть процесса установки или удаления. Рекомендуется использовать crossref:plist[plist-keywords-base-exec, `@preexec` _команда_, `@postexec` _команда_, `@preunexec` _команда_, `@postunexec` _команда_] вместо этого.
+
+[[plist-keywords-base-dirrm]]
+==== `@dirrm` _каталог_ (Устарело)
+
+Объявить имя каталога для удаления при деинсталляции. По умолчанию каталоги, созданные в `PREFIX` при установке пакета, удаляются при его деинсталляции.
+
+[[plist-keywords-base-dirrmtry]]
+==== `@dirrmtry` _каталог_ (Устарело)
+
+Объявить имя каталога для удаления, аналогично `@dirrm`, но не выводить предупреждение, если каталог не может быть удален.
+
+[[plist-keywords-creating-new]]
+=== Создание новых ключевых слов
+
+Файлы списка пакетов могут быть расширены ключевыми словами, которые определены в каталоге [.filename]#${PORTSDIR}/Keywords#. Настройки каждого ключевого слова хранятся в файле UCL с именем [.filename]#keyword.ucl#. Файл должен содержать как минимум один из следующих разделов:
+
+* `attributes`
+* `action`
+* `pre-install`
+* `post-install`
+* `pre-deinstall`
+* `post-deinstall`
+* `pre-upgrade`
+* `post-upgrade`
+
+[[plist-keywords-attributes]]
+==== `attributes`
+
+Изменяет владельца, группу или режим доступа, используемые ключевым словом. Содержит ассоциативный массив, в котором возможными ключами являются `owner`, `group` и `mode`. Значениями являются, соответственно, имя пользователя, имя группы и режим доступа к файлу. Например:
+
+[.programlisting]
+....
+attributes: { owner: "games", group: "games", mode: 0555 }
+....
+
+[[plist-keywords-action]]
+==== `action`
+
+Определяет, что происходит с параметром ключевого слова. Содержит массив, где возможные значения:
+
+`setprefix`::
+Установите префикс для следующих записей в plist.
+
+`dir`::
+Зарегистрировать каталог для создания при установке и удаления при деинсталляции.
+
+`dirrm`::
+Зарегистрировать каталог для удаления при деинсталляции. Устарело.
+
+`dirrmtry`::
+Зарегистрировать каталог для попытки удаления при деинсталляции. Устарело.
+
+`file`::
+Зарегистрировать файл.
+
+`setmode`::
+Установить режим для следующих записей plist.
+
+`setowner`::
+Установить владельца для следующих записей plist.
+
+`setgroup`::
+Установить группу для следующих записей в plist.
+
+`comment`::
+Не выполняет никаких действий, эквивалентно отсутствию раздела `action`.
+
+`ignore_next`::
+Игнорировать следующую запись в plist.
+
+[[plist-keywords-arguments]]
+==== `arguments`
+
+Если установлено значение `true`, добавляется обработка аргументов, разделяя всю строку, `%@`, на нумерованные аргументы, `%1`, `%2`, и так далее. Например, для такой строки:
+
+[.programlisting]
+....
+@foo some.content other.content
+....
+
+`%1` и `%2` будут содержать:
+
+[.programlisting]
+....
+some.content
+other.content
+....
+
+Это также влияет на работу записи crossref:plist[plist-keywords-action,`action`]. Если аргументов больше одного, необходимо указать номер аргумента. Например:
+
+[.programlisting]
+....
+actions: [file(1)]
+....
+
+[[plist-keywords-pre-post]]
+==== `pre-install`, `post-install`, `pre-deinstall`, `post-deinstall`, `pre-upgrade`, `post-upgrade`
+
+Эти ключевые слова содержат man:sh[1] скрипт, который выполняется до или после установки, удаления или обновления пакета. В дополнение к обычным заполнителям `@exec %_foo_`, описанным в crossref:plist[plist-keywords-base-exec, `@preexec` _команда_, `@postexec` _команда_, `@preunexec` _команда_, `@postunexec` _команда_], существует новый заполнитель `%@`, который представляет аргумент ключевого слова.
+
+[[plist-keywords-examples]]
+==== Примеры пользовательских ключевых слов
+
+[[plist-keywords-fc-example]]
+.Пример ключевого слова `@dirrmtryecho`
+[example]
+====
+
+Это ключевое слово выполняет две функции: добавляет строку `@dirrmtry _directory_` в список упаковки и сообщает о том, что директория удаляется при деинсталляции пакета.
+
+[.programlisting]
+....
+actions: [dirrmtry]
+post-deinstall: <<EOD
+ echo "Directory %D/%@ removed."
+EOD
+....
+
+====
+
+[[plist-keywords-sample-example]]
+.Реальный пример, как реализован `@sample`
+[example]
+====
+
+Этот ключевое слово выполняет три действия. Оно добавляет первый _filename_, переданный в качестве аргумента `@sample`, в список упаковки, добавляет в скрипт `post-install` инструкции для копирования образца в фактический файл конфигурации, если он ещё не существует, и добавляет в инструкции `post-deinstall` удаление файла конфигурации, если он не был изменён.
+
+[.programlisting]
+....
+actions: [file(1)]
+arguments: true
+post-install: <<EOD
+ case "%1" in
+ /*) sample_file="%1" ;;
+ *) sample_file="%D/%1" ;;
+ esac
+ target_file="${sample_file%.sample}"
+ set -- %@
+ if [ $# -eq 2 ]; then
+ target_file=${2}
+ fi
+ case "${target_file}" in
+ /*) target_file="${target_file}" ;;
+ *) target_file="%D/${target_file}" ;;
+ esac
+ if ! [ -f "${target_file}" ]; then
+ /bin/cp -p "${sample_file}" "${target_file}" && \
+ /bin/chmod u+w "${target_file}"
+ fi
+EOD
+pre-deinstall: <<EOD
+ case "%1" in
+ /*) sample_file="%1" ;;
+ *) sample_file="%D/%1" ;;
+ esac
+ target_file="${sample_file%.sample}"
+ set -- %@
+ if [ $# -eq 2 ]; then
+ set -- %@
+ target_file=${2}
+ fi
+ case "${target_file}" in
+ /*) target_file="${target_file}" ;;
+ *) target_file="%D/${target_file}" ;;
+ esac
+ if cmp -s "${target_file}" "${sample_file}"; then
+ rm -f "${target_file}"
+ else
+ echo "You may need to manually remove ${target_file} if it is no longer needed."
+ fi
+EOD
+....
-Пользовательские конфигурационные файлы должны быть удалены или быть установлены как [.filename]#filename.sample#. Файл [.filename]#info/dir# включать в список не нужно, но должны быть добавлены соответствующие строчки [.filename]#install-info#, так, как это описано в разделе о <<makefile-info,файлах в формате info>>. Все библиотеки, устанавливаемые портом, должны быть перечислены так, как это описано в разделе о <<porting-shlibs,динамических библиотеках>>.
+====
diff --git a/documentation/content/ru/books/porters-handbook/plist/_index.po b/documentation/content/ru/books/porters-handbook/plist/_index.po
new file mode 100644
index 0000000000..ae6c7cc6b7
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/plist/_index.po
@@ -0,0 +1,1731 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-24 21:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookplist_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:1
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:14
+#, no-wrap
+msgid "Advanced pkg-plist Practices"
+msgstr "Продвинутые практики pkg-plist"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:1
+#, no-wrap
+msgid "Chapter 8. Advanced pkg-plist Practices"
+msgstr "Глава 8. Продвинутые практики pkg-plist"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:52
+#, no-wrap
+msgid "Changing pkg-plist Based on Make Variables"
+msgstr "Изменение содержимого [.filename]#pkg-plist# в зависимости от make-переменных"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:59
+msgid ""
+"Some ports, particularly the `p5-` ports, need to change their "
+"[.filename]#pkg-plist# depending on what options they are configured with "
+"(or version of `perl`, in the case of `p5-` ports). To make this easy, any "
+"instances in [.filename]#pkg-plist# of `%%OSREL%%`, `%%PERL_VER%%`, and `%"
+"%PERL_VERSION%%` will be substituted appropriately. The value of `%%OSREL%"
+"%` is the numeric revision of the operating system (for example, `4.9`). `%"
+"%PERL_VERSION%%` and `%%PERL_VER%%` is the full version number of `perl` "
+"(for example, `5.8.9`). Several other `%%_VARS_%%` related to port's "
+"documentation files are described in crossref:makefiles[install-"
+"documentation,the relevant section]."
+msgstr ""
+"Некоторые порты, в частности, порты `p5-`, должны менять содержимое своих "
+"файлов [.filename]#pkg-plist# в зависимости от того, с какими параметрами "
+"они были отконфигурированы (или в зависимости от версии языка `perl` в "
+"случае портов `p5-`). Чтобы облегчить этот процесс, любые вхождения ключевых "
+"слов `%%OSREL%%`, `%%PERL_VER%%` и `%%PERL_VERSION%%` в файле "
+"[.filename]#pkg-plist# будут заменяться соответствующими значениями. "
+"Значением `%%OSREL%%` является номер версии операционной системы (например, "
+"`4.9`). `%%PERL_VERSION%%` и `%%PERL_VER%%` обозначают полный номер версии "
+"`perl` (например, `5.8.9`). Некоторые другие `%%VARS%%`, имеющие отношение к "
+"файлам документации порта, описаны в crossref:makefiles[install-"
+"documentation,соответствующем разделе]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:61
+msgid ""
+"To make other substitutions, set `PLIST_SUB` with a list of `_VAR=VALUE_` "
+"pairs and instances of `%%_VAR_%%` will be substituted with _VALUE_ in "
+"[.filename]#pkg-plist#."
+msgstr ""
+"Если вам нужно сделать другие подстановки, вы можете указать в переменной "
+"`PLIST_SUB` список пар `VAR=VALUE`, и все вхождения `%%VAR%%` в файле "
+"[.filename]#pkg-plist# будут заменяться на значение _VALUE_."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:64
+msgid ""
+"For instance, if a port installs many files in a version-specific "
+"subdirectory, use a placeholder for the version so that [.filename]#pkg-"
+"plist# does not have to be regenerated every time the port is updated. For "
+"example, set:"
+msgstr ""
+"Например, если порт устанавливает множество файлов в подкаталоге, зависящем "
+"от версии, используйте заполнитель для версии, чтобы файл [.filename]#pkg-"
+"plist# не требовал перегенерации при каждом обновлении порта. Например, "
+"укажите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:69
+#, no-wrap
+msgid ""
+"OCTAVE_VERSION=\t${PORTREVISION}\n"
+"PLIST_SUB=\tOCTAVE_VERSION=${OCTAVE_VERSION}\n"
+msgstr ""
+"OCTAVE_VERSION=\t${PORTREVISION}\n"
+"PLIST_SUB=\tOCTAVE_VERSION=${OCTAVE_VERSION}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:73
+msgid ""
+"in the [.filename]#Makefile# and use `%%OCTAVE_VERSION%%` wherever the "
+"version shows up in [.filename]#pkg-plist#. When the port is upgraded, it "
+"will not be necessary to edit dozens (or in some cases, hundreds) of lines "
+"in [.filename]#pkg-plist#."
+msgstr ""
+"в файле [.filename]#Makefile# и использовать `%%OCTAVE_VERSION%%` везде, где "
+"нужно указать номер версии в файле [.filename]#pkg-plist#. Таким образом, "
+"при обновлении порта вам не нужно будет менять десятки (а в некоторых "
+"случаях и сотни) строк в файле [.filename]#pkg-plist#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:76
+msgid ""
+"If files are installed conditionally on the options set in the port, the "
+"usual way of handling it is prefixing [.filename]#pkg-plist# lines with a `%"
+"%OPT%%` for lines needed when the option is enabled, or `%%NO_OPT%%` when "
+"the option is disabled, and adding `OPTIONS_SUB=yes` to the "
+"[.filename]#Makefile#. See crossref:makefiles[options_sub,`OPTIONS_SUB`] "
+"for more information."
+msgstr ""
+"Если файлы устанавливаются по условию в зависимости от опций, установленных "
+"в порте, обычный способ обработки — это добавление префикса `%%OPT%%` для "
+"строк в [.filename]#pkg-plist#, которые нужны при включении опции, или `%"
+"%NO_OPT%%`, когда опция отключена, а также добавление `OPTIONS_SUB=yes` в "
+"[.filename]#Makefile#. Подробнее см. "
+"crossref:makefiles[options_sub,`OPTIONS_SUB`]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:78
+msgid ""
+"For instance, if there are files that are only installed when the `X11` "
+"option is enabled, and [.filename]#Makefile# has:"
+msgstr ""
+"Например, если есть файлы, которые устанавливаются только при включении "
+"опции `X11`, и в [.filename]#Makefile# указано:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:83
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tX11\n"
+"OPTIONS_SUB=\tyes\n"
+msgstr ""
+"OPTIONS_DEFINE=\tX11\n"
+"OPTIONS_SUB=\tyes\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:86
+msgid ""
+"In [.filename]#pkg-plist#, put `%%X11%%` in front of the lines only being "
+"installed when the option is enabled, like this :"
+msgstr ""
+"В [.filename]#pkg-plist# укажите `%%X11%%` перед строками, которые "
+"устанавливаются только при включении опции, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:90
+#, no-wrap
+msgid "%%X11%%bin/foo-gui\n"
+msgstr "%%X11%%bin/foo-gui\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:95
+msgid ""
+"This substitution will be done between the `pre-install` and `do-install` "
+"targets, by reading from [.filename]#PLIST# and writing to "
+"[.filename]#TMPPLIST# (default: [.filename]#WRKDIR/.PLIST.mktmp#). So if "
+"the port builds [.filename]#PLIST# on the fly, do so in or before `pre-"
+"install`. Also, if the port needs to edit the resulting file, do so in "
+"`post-install` to a file named [.filename]#TMPPLIST#."
+msgstr ""
+"Эта подстановка будет сделана между выполнением целей `pre-install` и `do-"
+"install`, посредством чтения файла [.filename]#PLIST# и записью в файл "
+"[.filename]#TMPPLIST# (по умолчанию это файл "
+"[.filename]#WRKDIR/.PLIST.mktmp#). Так что если ваш порт строит "
+"[.filename]#PLIST# на лету, делайте это во время или до выполнения цели `pre-"
+"install`. Кроме того, если вашему порту требуется отредактировать "
+"получающийся файл, делайте это в цели `post-install` изменением файла "
+"[.filename]#TMPPLIST#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:101
+msgid ""
+"Another way of modifying a port's packing list is based on setting the "
+"variables `PLIST_FILES` and `PLIST_DIRS`. The value of each variable is "
+"regarded as a list of pathnames to write to [.filename]#TMPPLIST# along with "
+"[.filename]#PLIST# contents. While names listed in `PLIST_FILES` and "
+"`PLIST_DIRS` are subject to `%%_VAR_%%` substitution as described above, it "
+"is better to use the `${_VAR_}` directly. Except for that, names from "
+"`PLIST_FILES` will appear in the final packing list unchanged, while `@dir` "
+"will be prepended to names from `PLIST_DIRS`. To take effect, `PLIST_FILES` "
+"and `PLIST_DIRS` must be set before [.filename]#TMPPLIST# is written, that "
+"is, in `pre-install` or earlier."
+msgstr ""
+"Ещё один способ изменения списка упаковки порта основан на установке "
+"переменных `PLIST_FILES` и `PLIST_DIRS`. Значение каждой переменной "
+"рассматривается как список путей для записи в [.filename]#TMPPLIST# вместе с "
+"содержимым [.filename]#PLIST#. Хотя имена, перечисленные в `PLIST_FILES` и "
+"`PLIST_DIRS`, подлежат замене `%%_VAR_%%`, как описано выше, лучше "
+"использовать `${_VAR_}` напрямую. За исключением этого, имена из "
+"`PLIST_FILES` появятся в итоговом списке упаковки без изменений, тогда как к "
+"именам из `PLIST_DIRS` будет добавлен префикс `@dir`. Чтобы вступить в силу, "
+"`PLIST_FILES` и `PLIST_DIRS` должны быть установлены до записи "
+"[.filename]#TMPPLIST#, то есть в `pre-install` или ранее."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:105
+msgid ""
+"From time to time, using `OPTIONS_SUB` is not enough. In those cases, "
+"adding a specific `_TAG_` to `PLIST_SUB` inside the [.filename]#Makefile# "
+"with a special value of `@comment`, makes package tools to ignore the line. "
+"For instance, if some files are only installed when the `X11` option is on "
+"and the architecture is `i386`:"
+msgstr ""
+"Время от времени использования `OPTIONS_SUB` недостаточно. В таких случаях "
+"добавление специфичного `_TAG_` в `PLIST_SUB` внутри [.filename]#Makefile# "
+"со специальным значением `@comment` заставляет инструменты пакетирования "
+"игнорировать строку. Например, если некоторые файлы устанавливаются только "
+"при включённой опции `X11` и архитектуре `i386`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:109
+#, no-wrap
+msgid ".include <bsd.port.pre.mk>\n"
+msgstr ".include <bsd.port.pre.mk>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:115
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MX11} && ${ARCH} == \"i386\"\n"
+"PLIST_SUB+=\tX11I386=\"\"\n"
+".else\n"
+"PLIST_SUB+=\tX11I386=\"@comment \"\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MX11} && ${ARCH} == \"i386\"\n"
+"PLIST_SUB+=\tX11I386=\"\"\n"
+".else\n"
+"PLIST_SUB+=\tX11I386=\"@comment \"\n"
+".endif\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:118
+#, no-wrap
+msgid "Empty Directories"
+msgstr "Пустые каталоги"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:121
+#, no-wrap
+msgid "Cleaning Up Empty Directories"
+msgstr "Очистка пустых каталогов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:127
+msgid ""
+"When being de-installed, a port has to remove empty directories it created. "
+"Most of these directories are removed automatically by man:pkg[8], but for "
+"directories created outside of [.filename]#${PREFIX}#, or empty directories, "
+"some more work needs to be done. This is usually accomplished by adding "
+"`@dir` lines for those directories. Subdirectories must be deleted before "
+"deleting parent directories."
+msgstr ""
+"При удалении порт должен удалить пустые каталоги, которые он создал. "
+"Большинство этих каталогов автоматически удаляются с помощью man:pkg[8], но "
+"для каталогов, созданных вне [.filename]#${PREFIX}#, или пустых каталогов "
+"требуется дополнительная работа. Обычно это делается добавлением строк "
+"`@dir` для таких каталогов. Подкаталоги должны быть удалены до удаления "
+"родительских каталогов."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:133
+#, no-wrap
+msgid ""
+"[...]\n"
+"@dir /var/games/oneko/saved-games\n"
+"@dir /var/games/oneko\n"
+msgstr ""
+"[...]\n"
+"@dir /var/games/oneko/saved-games\n"
+"@dir /var/games/oneko\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:136
+#, no-wrap
+msgid "Creating Empty Directories"
+msgstr "Создание пустых каталогов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:141
+msgid ""
+"Empty directories created during port installation need special attention. "
+"They must be present when the package is created. If they are not created "
+"by the port code, create them in the [.filename]#Makefile#:"
+msgstr ""
+"Пустые каталоги, созданные во время установки порта, требуют особого "
+"внимания. Они должны присутствовать при создании пакета. Если они не созданы "
+"кодом порта, создайте их в [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:146
+#, no-wrap
+msgid ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${PREFIX}/some/directory\n"
+msgstr ""
+"post-install:\n"
+"\t${MKDIR} ${STAGEDIR}${PREFIX}/some/directory\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:150
+msgid ""
+"Add the directory to [.filename]#pkg-plist# like any other. For example:"
+msgstr ""
+"Добавьте директорию в [.filename]#pkg-plist# так же, как и любую другую. "
+"Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:154
+#, no-wrap
+msgid "@dir some/directory\n"
+msgstr "@dir some/directory\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:157
+#, no-wrap
+msgid "Configuration Files"
+msgstr "Файлы конфигурации"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:161
+msgid ""
+"If the port installs configuration files to [.filename]#PREFIX/etc# (or "
+"elsewhere) do _not_ list them in [.filename]#pkg-plist#. That will cause "
+"`pkg delete` to remove files that have been carefully edited by the user, "
+"and a re-installation will wipe them out."
+msgstr ""
+"Если порт устанавливает файлы конфигурации в [.filename]#PREFIX/etc# (или в "
+"другое место), _не_ указывайте их в [.filename]#pkg-plist#. Это приведёт к "
+"тому, что `pkg delete` удалит файлы, которые были тщательно отредактированы "
+"пользователем, а повторная установка перезапишет их."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:165
+msgid ""
+"Instead, install sample files with a [.filename]#filename.sample# "
+"extension. The `@sample` macro automates this, see crossref:plist[plist-"
+"keywords-sample, Expanding Package List with Keywords] for what it does "
+"exactly. For each sample file, add a line to [.filename]#pkg-plist#:"
+msgstr ""
+"Вместо этого устанавливайте образцы файлов с расширением "
+"[.filename]#filename.sample#. Макрос `@sample` автоматизирует этот процесс; "
+"подробности его работы см. в разделе crossref:plist[plist-keywords-sample, "
+"Расширение списка пакетов с помощью ключевых слов]. Для каждого образца "
+"файла добавьте строку в [.filename]#pkg-plist#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:169
+#, no-wrap
+msgid "@sample etc/orbit.conf.sample\n"
+msgstr "@sample etc/orbit.conf.sample\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:173
+msgid ""
+"If there is a very good reason not to install a working configuration file "
+"by default, only list the sample filename in [.filename]#pkg-plist#, without "
+"the `@sample` followed by a space part, and add a crossref:pkg-files[porting-"
+"message,message] pointing out that the user must copy and edit the file "
+"before the software will work."
+msgstr ""
+"Если существует очень веская причина не устанавливать рабочий файл "
+"конфигурации по умолчанию, укажите только имя примера файла в "
+"[.filename]#pkg-plist#, без части `@sample` с последующим пробелом, и "
+"добавьте crossref:pkg-files[porting-message,сообщение], указывающее, что "
+"пользователь должен скопировать и отредактировать файл перед тем, как "
+"программа заработает."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:178
+msgid ""
+"When a port installs its configuration in a subdirectory of [.filename]#$"
+"{PREFIX}/etc#, use `ETCDIR`, which defaults to `${PREFIX}/etc/${PORTNAME}`, "
+"it can be overridden in the ports [.filename]#Makefile# if there is a "
+"convention for the port to use some other directory. The `%%ETCDIR%%` macro "
+"will be used in its stead in [.filename]#pkg-plist#."
+msgstr ""
+"Когда порт устанавливает свою конфигурацию в подкаталоге [.filename]#$"
+"{PREFIX}/etc#, используйте `ETCDIR`, который по умолчанию равен `${PREFIX}/"
+"etc/${PORTNAME}`. Это значение может быть переопределено в "
+"[.filename]#Makefile# порта, если для порта принято использовать другой "
+"каталог. Макрос `%%ETCDIR%%` будет использоваться вместо этого в "
+"[.filename]#pkg-plist#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:184
+msgid ""
+"The sample configuration files should always have the [.filename]#.sample# "
+"suffix. If for some historical reason using the standard suffix is not "
+"possible, or if the sample files come from some other directory, use this "
+"construct:"
+msgstr ""
+"Примеры конфигурационных файлов всегда должны иметь суффикс "
+"[.filename]#.sample#. Если по каким-то историческим причинам использование "
+"стандартного суффикса невозможно, или если примеры файлов взяты из другого "
+"каталога, используйте эту конструкцию:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:188
+#, no-wrap
+msgid "@sample etc/orbit.conf-dist etc/orbit.conf\n"
+msgstr "@sample etc/orbit.conf-dist etc/orbit.conf\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:191
+msgid "or"
+msgstr "или"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:195
+#, no-wrap
+msgid "@sample %%EXAMPLESDIR%%/orbit.conf etc/orbit.conf\n"
+msgstr "@sample %%EXAMPLESDIR%%/orbit.conf etc/orbit.conf\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:198
+msgid "The format is `@sample _sample-file actual-config-file_`."
+msgstr "Формат: `@sample _файл-образец фактический-конфигурационный-файл_`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:201
+#, no-wrap
+msgid "Dynamic Versus Static Package List"
+msgstr "Динамический или статический список упаковки"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:205
+msgid ""
+"A _static package list_ is a package list which is available in the Ports "
+"Collection either as [.filename]#pkg-plist# (with or without variable "
+"substitution), or embedded into the [.filename]#Makefile# via `PLIST_FILES` "
+"and `PLIST_DIRS`. Even if the contents are auto-generated by a tool or a "
+"target in the Makefile _before_ the inclusion into the Ports Collection by a "
+"committer (for example, using `make makeplist`), this is still considered a "
+"static list, since it is possible to examine it without having to download "
+"or compile the distfile."
+msgstr ""
+"_Статический список упаковки_ — это список упаковки, который доступен в "
+"Коллекции Портов или как файл [.filename]#pkg-plist# (с подстановкой "
+"переменных или без неё), или как встроенный в [.filename]#Makefile# через "
+"`PLIST_FILES` и `PLIST_DIRS`. Даже если содержимое было автоматически "
+"сгенерировано инструментом или целью в Makefile _до_ включения в Коллекцию "
+"портов коммиттером (например, с использованием `make makeplist`), такой "
+"список всё равно считается статическим, поскольку его можно посмотреть без "
+"необходимости загрузки или компиляции distfile."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:208
+msgid ""
+"A _dynamic package list_ is a package list which is generated at the time "
+"the port is compiled based upon the files and directories which are "
+"installed. It is not possible to examine it before the source code of the "
+"ported application is downloaded and compiled, or after running a `make "
+"clean`."
+msgstr ""
+"_Динамический список упаковки_ — это список упаковки, который генерируется "
+"во время компиляции порта на основе установленных файлов и каталогов. "
+"Невозможно изучить его до загрузки и компиляции исходного кода "
+"портированного приложения или после выполнения команды `make clean`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:212
+msgid ""
+"While the use of dynamic package lists is not forbidden, maintainers should "
+"use static package lists wherever possible, as it enables users to "
+"man:grep[1] through available ports to discover, for example, which port "
+"installs a certain file. Dynamic lists should be primarily used for complex "
+"ports where the package list changes drastically based upon optional "
+"features of the port (and thus maintaining a static package list is "
+"infeasible), or ports which change the package list based upon the version "
+"of dependent software used. For example, ports which generate docs with "
+"Javadoc."
+msgstr ""
+"Хотя использование динамических списков упаковки не запрещено, "
+"сопровождающие должны использовать статические списки упаковки везде, где "
+"это возможно, поскольку это позволяет пользователям выполнять man:grep[1] по "
+"доступным портам для обнаружения, например, какой порт устанавливает "
+"определенный файл. Динамические списки должны быть использованы в основном "
+"для сложных портов, для которых изменения в списке упаковки кардинальным "
+"образом основаны на возможностях порта, настраиваемых параметрами, (и, таким "
+"образом, делая сопровождение статических списков упаковки невозможным), или "
+"портов, которые изменяют список упаковки на основе версии используемого им "
+"программного обеспечения (например, порты, которые порождают документы при "
+"помощи Javadoc)."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:214
+#, no-wrap
+msgid "Automated Package List Creation"
+msgstr "Автоматическое создание списка упаковки"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:219
+msgid ""
+"First, make sure the port is almost complete, with only [.filename]#pkg-"
+"plist# missing. Running `make makeplist` will show an example for "
+"[.filename]#pkg-plist#. The output of `makeplist` must be double checked "
+"for correctness as it tries to automatically guess a few things, and can get "
+"it wrong."
+msgstr ""
+"Сначала убедитесь, что порт почти готов, и отсутствует только файл "
+"[.filename]#pkg-plist#. Запуск команды `make makeplist` покажет пример для "
+"файла [.filename]#pkg-plist#. Вывод `makeplist` необходимо дважды "
+"перепроверять на корректность, так как он пытается автоматически угадать "
+"некоторые вещи и может ошибаться."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:224
+msgid ""
+"User configuration files should be installed as "
+"[.filename]#filename.sample#, as it is described in crossref:plist[plist-"
+"config, Configuration Files]. [.filename]#info/dir# must not be listed and "
+"appropriate [.filename]#install-info# lines must be added as noted in the "
+"crossref:makefiles[makefile-info,info files] section. Any libraries "
+"installed by the port must be listed as specified in the "
+"crossref:special[porting-shlibs,shared libraries] section."
+msgstr ""
+"Файлы конфигурации пользователя должны устанавливаться как "
+"[.filename]#filename.sample#, как описано в разделе crossref:plist[plist-"
+"config,Файлы конфигурации]. [.filename]#info/dir# не должен быть указан, а "
+"соответствующие строки [.filename]#install-info# должны быть добавлены, как "
+"указано в разделе crossref:makefiles[makefile-info,info-файлы]. Любые "
+"библиотеки, устанавливаемые портом, должны быть перечислены, как указано в "
+"разделе crossref:special[porting-shlibs,общие библиотеки]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:226
+#, no-wrap
+msgid "Expanding `PLIST_SUB` with Regular Expressions"
+msgstr "Расширение `PLIST_SUB` с помощью регулярных выражений"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:230
+msgid ""
+"Strings to be replaced sometimes need to be very specific to avoid undesired "
+"replacements. This is a common problem with shorter values."
+msgstr ""
+"Строки, которые нужно заменить, иногда должны быть очень конкретными, чтобы "
+"избежать нежелательных замен. Это распространённая проблема с короткими "
+"значениями."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:232
+msgid ""
+"To address this problem, for each `_PLACEHOLDER_=_value_`, a "
+"`PLACEHOLDER_regex=regex` can be set, with the `_regex_` part matching "
+"_value_ more precisely."
+msgstr ""
+"Для решения этой проблемы для каждого `_PLACEHOLDER_=_значение_` можно "
+"задать `PLACEHOLDER_regex=регулярное_выражение`, где часть `_regex_` более "
+"точно соответствует _значению_."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:234
+#, no-wrap
+msgid "Using PLIST_SUB with Regular Expressions"
+msgstr "Использование PLIST_SUB с регулярными выражениями"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:242
+msgid ""
+"Perl ports can install architecture dependent files in a specific tree. On "
+"FreeBSD to ease porting, this tree is called `mach`. For example, a port "
+"that installs a file whose path contains `mach` could have that part of the "
+"path string replaced with the wrong values. Consider this "
+"[.filename]#Makefile#:"
+msgstr ""
+"Порты Perl могут устанавливать архитектурно-зависимые файлы в специальное "
+"дерево. В FreeBSD для упрощения портирования это дерево называется `mach`. "
+"Например, порт, который устанавливает файл, чей путь содержит `mach`, может "
+"иметь эту часть строки пути заменённой неправильными значениями. Рассмотрим "
+"этот [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:250
+#, no-wrap
+msgid ""
+"PORTNAME=\tMachine-Build\n"
+"DISTVERSION=\t1\n"
+"CATEGORIES=\tdevel perl5\n"
+"MASTER_SITES=\tCPAN\n"
+"PKGNAMEPREFIX=\tp5-\n"
+msgstr ""
+"PORTNAME=\tMachine-Build\n"
+"DISTVERSION=\t1\n"
+"CATEGORIES=\tdevel perl5\n"
+"MASTER_SITES=\tCPAN\n"
+"PKGNAMEPREFIX=\tp5-\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:254
+#, no-wrap
+msgid ""
+"MAINTAINER=\tperl@FreeBSD.org\n"
+"COMMENT=\tBuilding machine\n"
+"WWW=\t\thttps://search.cpan.org/dist/Machine-Build\n"
+msgstr ""
+"MAINTAINER=\tperl@FreeBSD.org\n"
+"COMMENT=\tBuilding machine\n"
+"WWW=\t\thttps://search.cpan.org/dist/Machine-Build\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:257
+#, no-wrap
+msgid ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tconfigure\n"
+msgstr ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tconfigure\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:259
+#, no-wrap
+msgid "PLIST_SUB=\tPERL_ARCH=mach\n"
+msgstr "PLIST_SUB=\tPERL_ARCH=mach\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:262
+msgid "The files installed by the port are:"
+msgstr "Файлы, установленные портом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:270
+#, no-wrap
+msgid ""
+"/usr/local/bin/machine-build\n"
+"/usr/local/lib/perl5/site_perl/man/man1/machine-build.1.gz\n"
+"/usr/local/lib/perl5/site_perl/man/man3/Machine::Build.3.gz\n"
+"/usr/local/lib/perl5/site_perl/Machine/Build.pm\n"
+"/usr/local/lib/perl5/site_perl/mach/5.20/Machine/Build/Build.so\n"
+msgstr ""
+"/usr/local/bin/machine-build\n"
+"/usr/local/lib/perl5/site_perl/man/man1/machine-build.1.gz\n"
+"/usr/local/lib/perl5/site_perl/man/man3/Machine::Build.3.gz\n"
+"/usr/local/lib/perl5/site_perl/Machine/Build.pm\n"
+"/usr/local/lib/perl5/site_perl/mach/5.20/Machine/Build/Build.so\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:273
+msgid "Running `make makeplist` wrongly generates:"
+msgstr "Запуск `make makeplist` ошибочно создает:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:281
+#, no-wrap
+msgid ""
+"bin/%%PERL_ARCH%%ine-build\n"
+"%%PERL5_MAN1%%/%%PERL_ARCH%%ine-build.1.gz\n"
+"%%PERL5_MAN3%%/Machine::Build.3.gz\n"
+"%%SITE_PERL%%/Machine/Build.pm\n"
+"%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so\n"
+msgstr ""
+"bin/%%PERL_ARCH%%ine-build\n"
+"%%PERL5_MAN1%%/%%PERL_ARCH%%ine-build.1.gz\n"
+"%%PERL5_MAN3%%/Machine::Build.3.gz\n"
+"%%SITE_PERL%%/Machine/Build.pm\n"
+"%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:284
+msgid "Change the `PLIST_SUB` line from the [.filename]#Makefile# to:"
+msgstr "Измените строку `PLIST_SUB` в [.filename]#Makefile# на:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:289
+#, no-wrap
+msgid ""
+"PLIST_SUB=\tPERL_ARCH=mach \\\n"
+"\t\tPERL_ARCH_regex=\\bmach\\b\n"
+msgstr ""
+"PLIST_SUB=\tPERL_ARCH=mach \\\n"
+"\t\tPERL_ARCH_regex=\\bmach\\b\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:292
+msgid "Now `make makeplist` correctly generates:"
+msgstr "Теперь `make makeplist` правильно генерирует:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:300
+#, no-wrap
+msgid ""
+"bin/machine-build\n"
+"%%PERL5_MAN1%%/machine-build.1.gz\n"
+"%%PERL5_MAN3%%/Machine::Build.3.gz\n"
+"%%SITE_PERL%%/Machine/Build.pm\n"
+"%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so\n"
+msgstr ""
+"bin/machine-build\n"
+"%%PERL5_MAN1%%/machine-build.1.gz\n"
+"%%PERL5_MAN3%%/Machine::Build.3.gz\n"
+"%%SITE_PERL%%/Machine/Build.pm\n"
+"%%SITE_PERL%%/%%PERL_ARCH%%/%%PERL_VER%%/Machine/Build/Build.so\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:305
+#, no-wrap
+msgid "Expanding Package List with Keywords"
+msgstr "Расширение списка пакетов используя ключевые слова"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:311
+msgid ""
+"All keywords can also take optional arguments in parentheses. The arguments "
+"are owner, group, and mode. This argument is used on the file or directory "
+"referenced. To change the owner, group, and mode of a configuration file, "
+"use:"
+msgstr ""
+"Все ключевые слова также могут принимать необязательные аргументы в скобках. "
+"Аргументами являются владелец, группа и режим доступа. Этот аргумент "
+"применяется к файлу или каталогу, на который ссылаются. Чтобы изменить "
+"владельца, группу и режим доступа конфигурационного файла, используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:315
+#, no-wrap
+msgid "@sample(games,games,640) etc/config.sample\n"
+msgstr "@sample(games,games,640) etc/config.sample\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:319
+msgid ""
+"The arguments are optional. If only the group and mode need to be changed, "
+"use:"
+msgstr ""
+"Аргументы являются необязательными. Если необходимо изменить только группу и "
+"режим, используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:323
+#, no-wrap
+msgid "@sample(,games,660) etc/config.sample\n"
+msgstr "@sample(,games,660) etc/config.sample\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:329
+msgid ""
+"If a keyword is used on an crossref:makefiles[makefile-options,optional] "
+"entry, it must to be added after the helper:"
+msgstr ""
+"Если ключевое слово используется в crossref:makefiles[makefile-"
+"options,необязательной записи], оно должно быть добавлено после помощника:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:333
+#, no-wrap
+msgid "%%FOO%%@sample etc/orbit.conf.sample\n"
+msgstr "%%FOO%%@sample etc/orbit.conf.sample\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:337
+msgid ""
+"This is because the options plist helpers are used to comment out the line, "
+"so they need to be put first. See "
+"crossref:makefiles[options_sub,`OPTIONS_SUB`] for more information."
+msgstr ""
+"Это происходит потому, что вспомогательные функции plist для опций "
+"используются для закомментирования строки, поэтому они должны быть указаны "
+"первыми. Дополнительную информацию см. в "
+"crossref:makefiles[options_sub,`OPTIONS_SUB`]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:340
+#, no-wrap
+msgid "`@desktop-file-utils`"
+msgstr "`@desktop-file-utils`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:344
+msgid ""
+"Will run `update-desktop-database -q` after installation and "
+"deinstallation. _Never_ use directly, add crossref:uses[uses-desktop-file-"
+"utils,`USES=desktop-file-utils`] to the [.filename]#Makefile#."
+msgstr ""
+"Будет выполнять `update-desktop-database -q` после установки и удаления. "
+"_Никогда_ не используйте напрямую, добавьте crossref:uses[uses-desktop-file-"
+"utils,`USES=desktop-file-utils`] в [.filename]#Makefile#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:346
+#, no-wrap
+msgid "`@fc` _directory_"
+msgstr "`@fc` _каталог_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:349
+msgid ""
+"Add a `@dir` entry for the directory passed as an argument, and run `fc-"
+"cache -fs` on that directory after installation and deinstallation."
+msgstr ""
+"Добавить запись `@dir` для каталога, переданного в качестве аргумента, и "
+"выполнить `fc-cache -fs` для этого каталога после установки и удаления."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:351
+#, no-wrap
+msgid "`@fontsdir` _directory_"
+msgstr "`@fontsdir` _каталог_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:355
+msgid ""
+"Add a `@dir` entry for the directory passed as an argument, and run "
+"`mkfontscale` and `mkfontdir` on that directory after installation and "
+"deinstallation. Additionally, on deinstallation, it removes the "
+"[.filename]#fonts.scale# and [.filename]#fonts.dir# cache files if they are "
+"empty."
+msgstr ""
+"Добавить запись `@dir` для каталога, переданного в качестве аргумента, и "
+"запустить `mkfontscale` и `mkfontdir` в этом каталоге после установки и "
+"удаления. Кроме того, при удалении удаляются кэш-файлы "
+"[.filename]#fonts.scale# и [.filename]#fonts.dir#, если они пусты."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:357
+#, no-wrap
+msgid "`@info` _file_"
+msgstr "`@info` _файл_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:363
+msgid ""
+"Add the file passed as argument to the plist, and updates the info document "
+"index on installation and deinstallation. Additionally, it removes the "
+"index if empty on deinstallation. This should never be used manually, but "
+"always through `INFO`. See crossref:makefiles[makefile-info,Info Files] for "
+"more information."
+msgstr ""
+"Добавляет файл, переданный в качестве аргумента, в plist и обновляет индекс "
+"документа info при установке и удалении. Кроме того, удаляет индекс, если он "
+"пуст, при удалении. Это никогда не следует использовать вручную, а только "
+"через `INFO`. Подробнее см. в crossref:makefiles[makefile-info,Файлы Info]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:365
+#, no-wrap
+msgid "`@kld` _directory_"
+msgstr "`@kld` _каталог_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:369
+msgid ""
+"Runs `kldxref` on the directory on installation and deinstallation. "
+"Additionally, on deinstallation, it will remove the directory if empty."
+msgstr ""
+"Выполняет `kldxref` для каталога при установке и удалении. Дополнительно при "
+"удалении каталог будет удалён, если он пуст."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:371
+#, no-wrap
+msgid "`@rmtry` _file_"
+msgstr "`@rmtry` _файл_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:374
+msgid ""
+"Will remove the file on deinstallation, and not give an error if the file is "
+"not there."
+msgstr "Удаляет файл при удалении и не выдает ошибку, если файл отсутствует."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:376
+#, no-wrap
+msgid "`@sample` _file_ [_file_]"
+msgstr "`@sample` _файл_ [_файл_]"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:380
+msgid ""
+"This is used to handle installation of configuration files, through example "
+"files bundled with the package. The \"actual\", non-sample, file is either "
+"the second filename, if present, or the first filename without the "
+"[.filename]#.sample# extension."
+msgstr ""
+"Это используется для обработки установки файлов конфигурации, используя "
+"примеры файлов, поставляемых с пакетом. \"Реальный\" файл (не пример) — это "
+"либо второе имя файла, если оно присутствует, либо первое имя файла без "
+"расширения [.filename]#.sample#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:385
+msgid ""
+"This does three things. First, add the first file passed as argument, the "
+"sample file, to the plist. Then, on installation, if the actual file is not "
+"found, copy the sample file to the actual file. And finally, on "
+"deinstallation, remove the actual file if it has not been modified. See "
+"crossref:plist[plist-config, Configuration Files] for more information."
+msgstr ""
+"Это делает три вещи. Во-первых, добавляет первый переданный файл в качестве "
+"аргумента, образец файла, в plist. Затем, при установке, если фактический "
+"файл не найден, копирует образец файла в фактический файл. И наконец, при "
+"удалении, удаляет фактический файл, если он не был изменён. Дополнительную "
+"информацию см. в crossref:plist[plist-config, Файлы конфигурации]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:387
+#, no-wrap
+msgid "`@shared-mime-info` _directory_"
+msgstr "`@shared-mime-info` _каталог_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:390
+msgid ""
+"Runs `update-mime-database` on the directory on installation and "
+"deinstallation."
+msgstr ""
+"Выполняет `update-mime-database` для указанного каталога при установке и "
+"удалении."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:392
+#, no-wrap
+msgid "`@shell` _file_"
+msgstr "`@shell` _файл_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:395
+msgid "Add the file passed as argument to the plist."
+msgstr "Добавить файл, переданный в качестве аргумента, в plist."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:398
+msgid ""
+"On installation, add the full path to _file_ to [.filename]#/etc/shells#, "
+"while making sure it is not added twice. On deinstallation, remove it from "
+"[.filename]#/etc/shells#."
+msgstr ""
+"При установке добавить полный путь к _file_ в [.filename]#/etc/shells#, "
+"убедившись, что он не добавлен повторно. При удалении удалите его из "
+"[.filename]#/etc/shells#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:400
+#, no-wrap
+msgid "`@terminfo`"
+msgstr "`@terminfo`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:404
+msgid ""
+"Do not use by itself. If the port installs [.filename]#*.terminfo# files, "
+"add crossref:uses[uses-terminfo,`USES=terminfo`] to its "
+"[.filename]#Makefile#."
+msgstr ""
+"Не использовать самостоятельно. Если порт устанавливает файлы "
+"[.filename]#*.terminfo#, добавьте crossref:uses[uses-"
+"terminfo,`USES=terminfo`] в его [.filename]#Makefile#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:406
+msgid ""
+"On installation and deinstallation, if `tic` is present, refresh "
+"[.filename]#${PREFIX}/shared/misc/terminfo.db# from the "
+"[.filename]#*.terminfo# files in [.filename]#${PREFIX}/shared/misc#."
+msgstr ""
+"При установке и удалении, если присутствует `tic`, обновить [.filename]#$"
+"{PREFIX}/shared/misc/terminfo.db# из файлов [.filename]#*.terminfo# в "
+"[.filename]#${PREFIX}/shared/misc#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:408
+#, no-wrap
+msgid "Base Keywords"
+msgstr "Основные ключевые слова"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:411
+msgid ""
+"There are a few keywords that are hardcoded, and documented in man:pkg-"
+"create[8]. For the sake of completeness, they are also documented here."
+msgstr ""
+"Есть несколько ключевых слов, которые жестко закодированы и документированы "
+"в man:pkg-create[8]. Для полноты изложения они также документированы здесь."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:413
+#, no-wrap
+msgid "`@` [_file_]"
+msgstr "`@` [_файл_]"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:417
+msgid ""
+"The empty keyword is a placeholder to use when the file's owner, group, or "
+"mode need to be changed. For example, to set the group of the file to "
+"`games` and add the setgid bit, add:"
+msgstr ""
+"Ключевое слово `empty` является заполнителем, используемым, когда необходимо "
+"изменить владельца, группу или права доступа к файлу. Например, чтобы "
+"установить группу файла в `games` и добавить бит setgid, добавьте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:421
+#, no-wrap
+msgid "@(,games,2755) sbin/daemon\n"
+msgstr "@(,games,2755) sbin/daemon\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:424
+#, no-wrap
+msgid "`@preexec` _command_, `@postexec` _command_, `@preunexec` _command_, `@postunexec` _command_"
+msgstr "`@preexec` _команда_, `@postexec` _команда_, `@preunexec` _команда_, `@postunexec` _команда_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:427
+msgid ""
+"Execute _command_ as part of the package installation or deinstallation "
+"process."
+msgstr "Выполнить _комманду_ как часть процесса установки или удаления пакета."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:428
+#, no-wrap
+msgid "`@preexec` _command_"
+msgstr "`@preexec` _команда_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:430
+msgid "Execute _command_ as part of the [.filename]#pre-install# scripts."
+msgstr "Выполнить _команду_ как часть скриптов [.filename]#pre-install#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:431
+#, no-wrap
+msgid "`@postexec` _command_"
+msgstr "`@postexec` _команда_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:433
+msgid "Execute _command_ as part of the [.filename]#post-install# scripts."
+msgstr "Выполнить _команду_ как часть скриптов [.filename]#post-install#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:434
+#, no-wrap
+msgid "`@preunexec` _command_"
+msgstr "`@preunexec` _команда_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:436
+msgid "Execute _command_ as part of the [.filename]#pre-deinstall# scripts."
+msgstr "Выполнить _команду_ как часть скриптов [.filename]#pre-deinstall#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:437
+#, no-wrap
+msgid "`@postunexec` _command_"
+msgstr "`@postunexec` _команда_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:439
+msgid "Execute _command_ as part of the [.filename]#post-deinstall# scripts."
+msgstr "Выполнить _команду_ как часть скриптов [.filename]#post-deinstall#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:442
+msgid ""
+"If _command_ contains any of these sequences somewhere in it, they are "
+"expanded inline. For these examples, assume that `@cwd` is set to "
+"[.filename]#/usr/local# and the last extracted file was [.filename]#bin/"
+"emacs#."
+msgstr ""
+"Если в _команде_ содержится любая из этих последовательностей, они "
+"раскрываются непосредственно. Для следующих примеров предположим, что `@cwd` "
+"установлен в [.filename]#/usr/local#, а последним извлечённым файлом был "
+"[.filename]#bin/emacs#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:443
+#, no-wrap
+msgid "`%F`"
+msgstr "`%F`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:446
+msgid ""
+"Expand to the last filename extracted (as specified). In the example case "
+"[.filename]#bin/emacs#."
+msgstr ""
+"Раскрывается до последнего извлеченного имени файла (как указано). В примере "
+"[.filename]#bin/emacs#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:447
+#, no-wrap
+msgid "`%D`"
+msgstr "`%D`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:450
+msgid ""
+"Expand to the current directory prefix, as set with `@cwd`. In the example "
+"case [.filename]#/usr/local#."
+msgstr ""
+"Раскрыть до текущего префикса директории, установленного с помощью `@cwd`. В "
+"этом примере [.filename]#/usr/local#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:451
+#, no-wrap
+msgid "`%B`"
+msgstr "`%B`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:454
+msgid ""
+"Expand to the basename of the fully qualified filename, that is, the current "
+"directory prefix plus the last filespec, minus the trailing filename. In "
+"the example case, that would be [.filename]#/usr/local/bin#."
+msgstr ""
+"Раскрыть до базового имени полного имени файла, то есть префикс текущего "
+"каталога плюс последняя спецификация файла, за вычетом имени файла в конце "
+"спецификации. В данном примере это будет [.filename]#/usr/local/bin#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:455
+#, no-wrap
+msgid "`%f`"
+msgstr "`%f`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:458
+msgid ""
+"Expand to the filename part of the fully qualified name, or the converse of "
+"`%B`. In the example case, [.filename]#emacs#."
+msgstr ""
+"Раскрывается до части имени файла в полном квалифицированном имени, или "
+"противоположный случай для `%B`. В примере, [.filename]#emacs#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:463
+msgid ""
+"These keywords are here to help you set up the package so that it is as "
+"ready to use as possible. They _must not_ be abused to start services, stop "
+"services, or run any other commands that will modify the currently running "
+"system."
+msgstr ""
+"Эти ключевые слова предназначены для помощи в настройке пакета, чтобы он был "
+"максимально готов к использованию. Они _не должны_ использоваться для "
+"запуска служб, остановки служб или выполнения любых других команд, которые "
+"изменяют текущую работающую систему."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:466
+#, no-wrap
+msgid "`@mode` _mode_"
+msgstr "`@mode` _режим_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:471
+msgid ""
+"Set default permission for all subsequently extracted files to _mode_. "
+"Format is the same as that used by man:chmod[1]. Use without an arg to set "
+"back to default permissions (mode of the file while being packed)."
+msgstr ""
+"Установить разрешения по умолчанию для всех последующих извлекаемых файлов в "
+"_режим_. Формат такой же, как используется в man:chmod[1]. Использование без "
+"аргумента вернёт разрешения по умолчанию (режим файла при упаковке)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:476
+msgid ""
+"This must be a numeric mode, like `644`, `4755`, or `600`. It cannot be a "
+"relative mode like `u+s`."
+msgstr ""
+"Это должен быть числовой режим, например `644`, `4755` или `600`. Нельзя "
+"использовать относительный режим, например `u+s`."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:479
+#, no-wrap
+msgid "`@owner` _user_"
+msgstr "`@owner` _пользователь_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:483
+msgid ""
+"Set default ownership for all subsequent files to _user_. Use without an "
+"argument to set back to default ownership (`root`)."
+msgstr ""
+"Установить владельца по умолчанию для всех последующих файлов в "
+"_пользователь_. Использование без аргумента вернёт владельца по умолчанию "
+"(`root`)."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:485
+#, no-wrap
+msgid "`@group` _group_"
+msgstr "`@group` _группа_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:489
+msgid ""
+"Set default group ownership for all subsequent files to _group_. Use "
+"without an arg to set back to default group ownership (`wheel`)."
+msgstr ""
+"Установить группу-владельца по умолчанию для всех последующих файлов в "
+"_группу_. Использование без аргумента вернёт группу-владельца по умолчанию "
+"(`wheel`)."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:491
+#, no-wrap
+msgid "`@comment` _string_"
+msgstr "`@comment` _строка_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:494
+msgid "This line is ignored when packing."
+msgstr "Эта строка игнорируется при упаковке."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:496
+#, no-wrap
+msgid "`@dir` _directory_"
+msgstr "`@dir` _каталог_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:502
+msgid ""
+"Declare directory name. By default, directories created under `PREFIX` by a "
+"package installation are automatically removed. Use this when an empty "
+"directory under `PREFIX` needs to be created, or when the directory needs to "
+"have non default owner, group, or mode. Directories outside of `PREFIX` "
+"need to be registered. For example, [.filename]#/var/db/${PORTNAME}# needs "
+"to have a `@dir` entry whereas [.filename]#${PREFIX}/shared/${PORTNAME}# "
+"does not if it contains files or uses the default owner, group, and mode."
+msgstr ""
+"Объявить имя каталога. По умолчанию каталоги, созданные в `PREFIX` при "
+"установке пакета, автоматически удаляются. Используйте эту опцию, если "
+"необходимо создать пустой каталог в `PREFIX` или если каталогу требуется "
+"нестандартный владелец, группа или права. Каталоги за пределами `PREFIX` "
+"необходимо регистрировать. Например, [.filename]#/var/db/${PORTNAME}# "
+"требует записи `@dir`, тогда как [.filename]#${PREFIX}/shared/${PORTNAME}# — "
+"нет, если он содержит файлы или использует стандартные владельца, группу и "
+"права."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:504
+#, no-wrap
+msgid "`@exec` _command_, `@unexec` _command_ (Deprecated)"
+msgstr "`@exec` _команда_, `@unexec` _команда_ (Устарело)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:508
+msgid ""
+"Execute _command_ as part of the installation or deinstallation process. "
+"Please use crossref:plist[plist-keywords-base-exec, `@preexec` _command_, "
+"`@postexec` _command_, `@preunexec` _command_, `@postunexec` _command_] "
+"instead."
+msgstr ""
+"Выполнить _команду_ как часть процесса установки или удаления. Рекомендуется "
+"использовать crossref:plist[plist-keywords-base-exec, `@preexec` _команда_, "
+"`@postexec` _команда_, `@preunexec` _команда_, `@postunexec` _команда_] "
+"вместо этого."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:510
+#, no-wrap
+msgid "`@dirrm` _directory_ (Deprecated)"
+msgstr "`@dirrm` _каталог_ (Устарело)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:514
+msgid ""
+"Declare directory name to be deleted at deinstall time. By default, "
+"directories created under `PREFIX` by a package installation are deleted "
+"when the package is deinstalled."
+msgstr ""
+"Объявить имя каталога для удаления при деинсталляции. По умолчанию каталоги, "
+"созданные в `PREFIX` при установке пакета, удаляются при его деинсталляции."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:516
+#, no-wrap
+msgid "`@dirrmtry` _directory_ (Deprecated)"
+msgstr "`@dirrmtry` _каталог_ (Устарело)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:519
+msgid ""
+"Declare directory name to be removed, as for `@dirrm`, but does not issue a "
+"warning if the directory cannot be removed."
+msgstr ""
+"Объявить имя каталога для удаления, аналогично `@dirrm`, но не выводить "
+"предупреждение, если каталог не может быть удален."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:521
+#, no-wrap
+msgid "Creating New Keywords"
+msgstr "Создание новых ключевых слов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:526
+msgid ""
+"Package list files can be extended by keywords that are defined in the "
+"[.filename]#${PORTSDIR}/Keywords# directory. The settings for each keyword "
+"are stored in a UCL file named [.filename]#keyword.ucl#. The file must "
+"contain at least one of these sections:"
+msgstr ""
+"Файлы списка пакетов могут быть расширены ключевыми словами, которые "
+"определены в каталоге [.filename]#${PORTSDIR}/Keywords#. Настройки каждого "
+"ключевого слова хранятся в файле UCL с именем [.filename]#keyword.ucl#. Файл "
+"должен содержать как минимум один из следующих разделов:"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:528
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:537
+#, no-wrap
+msgid "`attributes`"
+msgstr "`attributes`"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:529
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:550
+#, no-wrap
+msgid "`action`"
+msgstr "`action`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:530
+msgid "`pre-install`"
+msgstr "`pre-install`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:531
+msgid "`post-install`"
+msgstr "`post-install`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:532
+msgid "`pre-deinstall`"
+msgstr "`pre-deinstall`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:533
+msgid "`post-deinstall`"
+msgstr "`post-deinstall`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:534
+msgid "`pre-upgrade`"
+msgstr "`pre-upgrade`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:535
+msgid "`post-upgrade`"
+msgstr "`post-upgrade`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:543
+msgid ""
+"Changes the owner, group, or mode used by the keyword. Contains an "
+"associative array where the possible keys are `owner`, `group`, and `mode`. "
+"The values are, respectively, a user name, a group name, and a file mode. "
+"For example:"
+msgstr ""
+"Изменяет владельца, группу или режим доступа, используемые ключевым словом. "
+"Содержит ассоциативный массив, в котором возможными ключами являются "
+"`owner`, `group` и `mode`. Значениями являются, соответственно, имя "
+"пользователя, имя группы и режим доступа к файлу. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:547
+#, no-wrap
+msgid "attributes: { owner: \"games\", group: \"games\", mode: 0555 }\n"
+msgstr "attributes: { owner: \"games\", group: \"games\", mode: 0555 }\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:553
+msgid ""
+"Defines what happens to the keyword's parameter. Contains an array where the "
+"possible values are:"
+msgstr ""
+"Определяет, что происходит с параметром ключевого слова. Содержит массив, "
+"где возможные значения:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:554
+#, no-wrap
+msgid "`setprefix`"
+msgstr "`setprefix`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:556
+msgid "Set the prefix for the next plist entries."
+msgstr "Установите префикс для следующих записей в plist."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:557
+#, no-wrap
+msgid "`dir`"
+msgstr "`dir`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:559
+msgid "Register a directory to be created on install and removed on deinstall."
+msgstr ""
+"Зарегистрировать каталог для создания при установке и удаления при "
+"деинсталляции."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:560
+#, no-wrap
+msgid "`dirrm`"
+msgstr "`dirrm`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:563
+msgid "Register a directory to be deleted on deinstall. Deprecated."
+msgstr "Зарегистрировать каталог для удаления при деинсталляции. Устарело."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:564
+#, no-wrap
+msgid "`dirrmtry`"
+msgstr "`dirrmtry`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:567
+msgid "Register a directory to try and deleted on deinstall. Deprecated."
+msgstr ""
+"Зарегистрировать каталог для попытки удаления при деинсталляции. Устарело."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:568
+#, no-wrap
+msgid "`file`"
+msgstr "`file`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:570
+msgid "Register a file."
+msgstr "Зарегистрировать файл."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:571
+#, no-wrap
+msgid "`setmode`"
+msgstr "`setmode`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:573
+msgid "Set the mode for the next plist entries."
+msgstr "Установить режим для следующих записей plist."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:574
+#, no-wrap
+msgid "`setowner`"
+msgstr "`setowner`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:576
+msgid "Set the owner for the next plist entries."
+msgstr "Установить владельца для следующих записей plist."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:577
+#, no-wrap
+msgid "`setgroup`"
+msgstr "`setgroup`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:579
+msgid "Set the group for the next plist entries."
+msgstr "Установить группу для следующих записей в plist."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:580
+#, no-wrap
+msgid "`comment`"
+msgstr "`comment`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:582
+msgid "Does not do anything, equivalent to not entering an `action` section."
+msgstr ""
+"Не выполняет никаких действий, эквивалентно отсутствию раздела `action`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:583
+#, no-wrap
+msgid "`ignore_next`"
+msgstr "`ignore_next`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:585
+msgid "Ignore the next entry in the plist."
+msgstr "Игнорировать следующую запись в plist."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:587
+#, no-wrap
+msgid "`arguments`"
+msgstr "`arguments`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:591
+msgid ""
+"If set to `true`, adds argument handling, splitting the whole line, `%@`, "
+"into numbered arguments, `%1`, `%2`, and so on. For example, for this line:"
+msgstr ""
+"Если установлено значение `true`, добавляется обработка аргументов, разделяя "
+"всю строку, `%@`, на нумерованные аргументы, `%1`, `%2`, и так далее. "
+"Например, для такой строки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:595
+#, no-wrap
+msgid "@foo some.content other.content\n"
+msgstr "@foo some.content other.content\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:598
+msgid "`%1` and `%2` will contain:"
+msgstr "`%1` и `%2` будут содержать:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:603
+#, no-wrap
+msgid ""
+"some.content\n"
+"other.content\n"
+msgstr ""
+"some.content\n"
+"other.content\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:608
+msgid ""
+"It also affects how the crossref:plist[plist-keywords-action,`action`] entry "
+"works. When there is more than one argument, the argument number must be "
+"specified. For example:"
+msgstr ""
+"Это также влияет на работу записи crossref:plist[plist-keywords-"
+"action,`action`]. Если аргументов больше одного, необходимо указать номер "
+"аргумента. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:612
+#, no-wrap
+msgid "actions: [file(1)]\n"
+msgstr "actions: [file(1)]\n"
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:615
+#, no-wrap
+msgid "`pre-install`, `post-install`, `pre-deinstall`, `post-deinstall`, `pre-upgrade`, `post-upgrade`"
+msgstr "`pre-install`, `post-install`, `pre-deinstall`, `post-deinstall`, `pre-upgrade`, `post-upgrade`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:620
+msgid ""
+"These keywords contains a man:sh[1] script to be executed before or after "
+"installation, deinstallation, or upgrade of the package. In addition to the "
+"usual `@exec %_foo_` placeholders described in crossref:plist[plist-keywords-"
+"base-exec, `@preexec` _command_, `@postexec` _command_, `@preunexec` "
+"_command_, `@postunexec` _command_], there is a new one, `%@`, which "
+"represents the argument of the keyword."
+msgstr ""
+"Эти ключевые слова содержат man:sh[1] скрипт, который выполняется до или "
+"после установки, удаления или обновления пакета. В дополнение к обычным "
+"заполнителям `@exec %_foo_`, описанным в crossref:plist[plist-keywords-base-"
+"exec, `@preexec` _команда_, `@postexec` _команда_, `@preunexec` _команда_, "
+"`@postunexec` _команда_], существует новый заполнитель `%@`, который "
+"представляет аргумент ключевого слова."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:622
+#, no-wrap
+msgid "Custom Keyword Examples"
+msgstr "Примеры пользовательских ключевых слов"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:625
+#, no-wrap
+msgid "Example of a `@dirrmtryecho` Keyword"
+msgstr "Пример ключевого слова `@dirrmtryecho`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:630
+msgid ""
+"This keyword does two things, it adds a `@dirrmtry _directory_` line to the "
+"packing list, and echoes the fact that the directory is removed when "
+"deinstalling the package."
+msgstr ""
+"Это ключевое слово выполняет две функции: добавляет строку `@dirrmtry "
+"_directory_` в список упаковки и сообщает о том, что директория удаляется "
+"при деинсталляции пакета."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:637
+#, no-wrap
+msgid ""
+"actions: [dirrmtry]\n"
+"post-deinstall: <<EOD\n"
+" echo \"Directory %D/%@ removed.\"\n"
+"EOD\n"
+msgstr ""
+"actions: [dirrmtry]\n"
+"post-deinstall: <<EOD\n"
+" echo \"Directory %D/%@ removed.\"\n"
+"EOD\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:642
+#, no-wrap
+msgid "Real Life Example, How `@sample` is Implemented"
+msgstr "Реальный пример, как реализован `@sample`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:648
+msgid ""
+"This keyword does three things. It adds the first _filename_ passed as an "
+"argument to `@sample` to the packing list, it adds to the `post-install` "
+"script instructions to copy the sample to the actual configuration file if "
+"it does not already exist, and it adds to the `post-deinstall` instructions "
+"to remove the configuration file if it has not been modified."
+msgstr ""
+"Этот ключевое слово выполняет три действия. Оно добавляет первый _filename_, "
+"переданный в качестве аргумента `@sample`, в список упаковки, добавляет в "
+"скрипт `post-install` инструкции для копирования образца в фактический файл "
+"конфигурации, если он ещё не существует, и добавляет в инструкции `post-"
+"deinstall` удаление файла конфигурации, если он не был изменён."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/plist/_index.adoc:693
+#, no-wrap
+msgid ""
+"actions: [file(1)]\n"
+"arguments: true\n"
+"post-install: <<EOD\n"
+" case \"%1\" in\n"
+" /*) sample_file=\"%1\" ;;\n"
+" *) sample_file=\"%D/%1\" ;;\n"
+" esac\n"
+" target_file=\"${sample_file%.sample}\"\n"
+" set -- %@\n"
+" if [ $# -eq 2 ]; then\n"
+" target_file=${2}\n"
+" fi\n"
+" case \"${target_file}\" in\n"
+" /*) target_file=\"${target_file}\" ;;\n"
+" *) target_file=\"%D/${target_file}\" ;;\n"
+" esac\n"
+" if ! [ -f \"${target_file}\" ]; then\n"
+" /bin/cp -p \"${sample_file}\" \"${target_file}\" && \\\n"
+" /bin/chmod u+w \"${target_file}\"\n"
+" fi\n"
+"EOD\n"
+"pre-deinstall: <<EOD\n"
+" case \"%1\" in\n"
+" /*) sample_file=\"%1\" ;;\n"
+" *) sample_file=\"%D/%1\" ;;\n"
+" esac\n"
+" target_file=\"${sample_file%.sample}\"\n"
+" set -- %@\n"
+" if [ $# -eq 2 ]; then\n"
+" set -- %@\n"
+" target_file=${2}\n"
+" fi\n"
+" case \"${target_file}\" in\n"
+" /*) target_file=\"${target_file}\" ;;\n"
+" *) target_file=\"%D/${target_file}\" ;;\n"
+" esac\n"
+" if cmp -s \"${target_file}\" \"${sample_file}\"; then\n"
+" rm -f \"${target_file}\"\n"
+" else\n"
+" echo \"You may need to manually remove ${target_file} if it is no longer needed.\"\n"
+" fi\n"
+"EOD\n"
+msgstr ""
+"actions: [file(1)]\n"
+"arguments: true\n"
+"post-install: <<EOD\n"
+" case \"%1\" in\n"
+" /*) sample_file=\"%1\" ;;\n"
+" *) sample_file=\"%D/%1\" ;;\n"
+" esac\n"
+" target_file=\"${sample_file%.sample}\"\n"
+" set -- %@\n"
+" if [ $# -eq 2 ]; then\n"
+" target_file=${2}\n"
+" fi\n"
+" case \"${target_file}\" in\n"
+" /*) target_file=\"${target_file}\" ;;\n"
+" *) target_file=\"%D/${target_file}\" ;;\n"
+" esac\n"
+" if ! [ -f \"${target_file}\" ]; then\n"
+" /bin/cp -p \"${sample_file}\" \"${target_file}\" && \\\n"
+" /bin/chmod u+w \"${target_file}\"\n"
+" fi\n"
+"EOD\n"
+"pre-deinstall: <<EOD\n"
+" case \"%1\" in\n"
+" /*) sample_file=\"%1\" ;;\n"
+" *) sample_file=\"%D/%1\" ;;\n"
+" esac\n"
+" target_file=\"${sample_file%.sample}\"\n"
+" set -- %@\n"
+" if [ $# -eq 2 ]; then\n"
+" set -- %@\n"
+" target_file=${2}\n"
+" fi\n"
+" case \"${target_file}\" in\n"
+" /*) target_file=\"${target_file}\" ;;\n"
+" *) target_file=\"%D/${target_file}\" ;;\n"
+" esac\n"
+" if cmp -s \"${target_file}\" \"${sample_file}\"; then\n"
+" rm -f \"${target_file}\"\n"
+" else\n"
+" echo \"You may need to manually remove ${target_file} if it is no longer needed.\"\n"
+" fi\n"
+"EOD\n"
diff --git a/documentation/content/ru/books/porters-handbook/porting-dads/_index.adoc b/documentation/content/ru/books/porters-handbook/porting-dads/_index.adoc
index bb5a06d72a..519a72f2e3 100644
--- a/documentation/content/ru/books/porters-handbook/porting-dads/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/porting-dads/_index.adoc
@@ -1,11 +1,13 @@
---
-title: Глава 12. Что делать нужно, и что делать нельзя
-prev: books/porters-handbook/security
+description: 'Список распространённых рекомендаций и ошибок, встречающихся в процессе портирования на FreeBSD'
next: books/porters-handbook/porting-samplem
-showBookMenu: true
-weight: 12
params:
- path: "/books/porters-handbook/porting-dads/"
+ path: /books/porters-handbook/porting-dads/
+prev: books/porters-handbook/security
+showBookMenu: true
+tags: "[\"dos\", \"don'ts\", \"porting\", \"ports\", \"guide\"]"
+title: 'Глава 13. Что делать нужно, и что делать нельзя'
+weight: 13
---
[[porting-dads]]
@@ -16,7 +18,7 @@ params:
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 12
+:sectnumoffset: 13
:partnums:
:source-highlighter: rouge
:experimental:
@@ -51,24 +53,22 @@ endif::[]
[[dads-intro]]
== Введение
-Вот список часто встречающихся действий, которые нужно и которые нельзя делать во время процесса портирования. Проверьте порт по этому списку, и также проверьте порты в http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[базе сообщений PR], которые присланы другими людьми. Присылайте любые комментарии о портах, которые вы проверили, так, как это описано в статье о extref:{contributing}[Сообщениях об ошибках и общих замечаниях, CONTRIB-GENERAL]. Проверка портов в базе сообщений PR позволит нам быстрее коммиттить их и удостовериться, что вы знаете, что делаете.
+Вот список часто встречающихся действий, которые нужно и которые нельзя делать во время процесса портирования. Проверьте порт по этому списку, и также проверьте порты в https://bugs.FreeBSD.org/search/[базе сообщений PR], которые присланы другими людьми. Присылайте любые комментарии о портах, которые вы проверили, так, как это описано в статье о extref:{contributing}[Сообщениях об ошибках и общих замечаниях, CONTRIB-GENERAL]. Проверка портов в базе сообщений PR позволит нам быстрее коммиттить их и удостовериться, что вы знаете, что делаете.
[[porting-wrkdir]]
== `WRKDIR`
-Не пишите ничего в файлы вне каталога `WRKDIR`. Каталог `WRKDIR` является единственным местом, которое гарантированно будет доступно для записи во время построения порта (обратитесь к главе об extref:{handbook}ports[установке портов с CDROM, PORTS-CD] за примером построения портов из дерева, доступного только для чтения). Если вам нужно изменить какой-либо из файлов [.filename]##pkg-*##, сделайте это, <<porting-pkgfiles,переопределив переменную>>, но не перезаписывая их.
+Не пишите ничего в файлы вне каталога `WRKDIR`. Каталог `WRKDIR` является единственным местом, которое гарантированно будет доступно для записи во время построения порта (обратитесь к главе об extref:{handbook}[установке портов с CDROM, PORTS-CD] за примером построения портов из дерева, доступного только для чтения). Если вам нужно изменить какой-либо из файлов [.filename]##pkg-*##, сделайте это, crossref:pkg-files[pkg-names,переопределив переменную], но не перезаписывая их.
[[porting-wrkdirprefix]]
== `WRKDIRPREFIX`
-Добейтесь того, чтобы ваш порт принимал во внимание значение переменной `WRKDIRPREFIX`. Большинство портов об этом не заботятся. В частности, если вы обращаетесь к каталогу `WRKDIR` другого порта, заметьте, что его правильным местоположением является [.filename]#WRKDIRPREFIXPORTSDIR/subdir/name/work#, а не [.filename]#PORTSDIR/subdir/work# или [.filename]#.CURDIR/../../subdir/name/work# мли что-то подобное.
-
-Кроме того, если вы сами задаете `WRKDIR`, то должны поставить перед ним знак `${WRKDIRPREFIX}${.CURDIR}`.
+Добейтесь того, чтобы ваш порт принимал во внимание значение переменной `WRKDIRPREFIX`. Большинство портов об этом не заботятся. В частности, если вы обращаетесь к каталогу `WRKDIR` другого порта, заметьте, что его правильным местоположением является [.filename]#WRKDIRPREFIXPORTSDIR/subdir/name/work#, а не [.filename]#PORTSDIR/subdir/work# или [.filename]#.CURDIR/../../subdir/name/work# мли что-то подобное. Кроме того, если вы сами задаете `WRKDIR`, то должны поставить перед ним знак `${WRKDIRPREFIX}${.CURDIR}`.
[[porting-versions]]
== Различение операционных систем и версий ОС
-Вы можете встретиться с кодом, который требует модификаций или условной компиляции в зависимости от того, с какой версией FreeBSD Unix он работает. Предпочтительным способом отделения кода для версий FreeBSD является использование макросов {freebsd-version} и {freebsd}, определённых в http://svnweb.freebsd.org/base/head/sys/sys/param.h?view=markup[sys/param.h]. Если этот файл не подключен, добавьте код
+Вы можете встретиться с кодом, который требует модификаций или условной компиляции в зависимости от того, с какой версией FreeBSD Unix он работает. Предпочтительным способом отделения кода для версий FreeBSD является использование макросов {freebsd-version} и {freebsd}, определённых в https://cgit.freebsd.org/src/tree/sys/sys/param.h[sys/param.h]. Если этот файл не подключен, добавьте код
[.programlisting]
....
@@ -83,17 +83,19 @@ endif::[]
....
#if __FreeBSD__ >= 9
# if __FreeBSD_version >= 901000
- /* здесь особый код для версий 9.1+ */
+ /* 9.1+ release specific code here */
# endif
#endif
....
+Полный список значений `{freebsd-version}` доступен в crossref:versions[versions,Значения __FreeBSD_version].
+
[[dads-after-port-mk]]
-== Написание чего-либо после [.filename]#bsd.port.mk#
+== Написание чего-либо после bsd.port.mk
Не пишите ничего после строки `.include <bsd.port.mk>`. Этой строки можно избежать, включив в где-то в середину вашего файла [.filename]#Makefile# файл [.filename]#bsd.port.pre.mk#, и файл [.filename]#bsd.port.post.mk# в конец.
-[NOTE]
+[IMPORTANT]
====
Вам нужно включить либо пару файлов [.filename]#bsd.port.pre.mk#/[.filename]#bsd.port.post.mk#, либо только [.filename]#bsd.port.mk#; не используйте оба этих метода одновременно.
====
@@ -118,13 +120,13 @@ endif::[]
|Версия релиза операционной системы (например, `2.1.5` или `2.2.7`)
|`OSVERSION`
-|Версия операционной системы в виде числа, та же, что и <<freebsd-versions,`__FreeBSD_version`>>.
+|Версия операционной системы в виде числа, та же, что и crossref:versions[versions,`{freebsd-version}`].
|`LOCALBASE`
|Корень дерева "local" (например, `/usr/local`)
|`PREFIX`
-|Куда, собственно, устанавливается порт (обратитесь к <<porting-prefix,подробной информации о `PREFIX`>>).
+|Куда, собственно, устанавливается порт (обратитесь к crossref:testing[porting-prefix,подробной информации о `PREFIX`]).
|===
[NOTE]
@@ -142,7 +144,7 @@ BROKEN= perl is in system
.endif
....
-Вы не забываете об использовании табуляции вместо пробелов после `BROKEN=`:-).
+Вы не забываете об использовании табуляции вместо пробелов после `BROKEN=`.
[[dads-sh-exec]]
== Использование выражения `exec` в сценариях обёртках
@@ -165,11 +167,11 @@ exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar "$@"
Если вы обнаружите, что для выполнения чего-то приходится писать много нового кода, то, пожалуйста, просмотрите файл [.filename]#bsd.port.mk# на предмет того, не содержит ли он решение именно вашей проблемы. Хотя его трудно читать, имеется много проблем, выглядящих сложными, для которых файл [.filename]#bsd.port.mk# уже содержит быстрое решение.
[[dads-cc]]
-== Работа как с `CC`, так и `CXX`
+== Относитесь внимательно как к `CC`, так и `CXX`
Порт должен принимать во внимание как переменную `CC`, так и `CXX`. Под этим мы подразумеваем, что порт ни в коем случае не должен устанавливать значения этих переменных, переопределяя имеющиеся значения; вместо этого можно добавлять нужные значения к уже имеющимся. Это связано с тем, что параметры построения, относящиеся ко всем портам, могут быть заданы глобально.
-Если порты не учитывают значения этих переменных, добавьте строку `NO_PACKAGE=ignores either cc or cxx` в файл [.filename]#Makefile#.
+Если порт не учитывает значения этих переменных, добавьте строку `NO_PACKAGE=ignores either cc or cxx` в файл [.filename]#Makefile#.
Далее следует пример файла [.filename]#Makefile#, использующего как переменную `CC`, так и `CXX`. Обратите внимание на использование символов `?=`:
@@ -198,11 +200,11 @@ CXX= g++
В системах FreeBSD обе переменные `CC` и `CXX` могут быть определены в файле [.filename]#/etc/make.conf#. В первом примере задаётся значение, если оно ранее не было определено в [.filename]#/etc/make.conf#, что сохраняет любые определения, данные на уровне системы в целом. Второй пример переопределяет всё, что было задано ранее.
[[dads-cflags]]
-== Использование `CFLAGS`
+== Относитесь внимательно к `CFLAGS`
Порт должен учитывать переменную `CFLAGS`. Под этим мы подразумеваем, что порт ни в коем случае не должен устанавливать значения этой переменной, переопределяя имеющиеся значения; вместо этого можно добавлять нужные значения к уже имеющимся. Это связано с тем, что параметры построения, относящиеся ко всем портам, могут быть заданы глобально.
-Если порты не учитывают значения этой переменной, добавьте строку `NO_PACKAGE=ignores cflags` в файл [.filename]#Makefile#.
+Если порт не учитывает значения этой переменной, добавьте строку `NO_PACKAGE=ignores cflags` в файл [.filename]#Makefile#.
Далее следует пример файла [.filename]#Makefile#, использующего переменную `CFLAGS`. Обратите внимание на использование символов `+=`:
@@ -234,23 +236,38 @@ CFLAGS= -O3 -funroll-loops -DHAVE_SOUND
CFLAGS+= -DHAVE_SOUND
....
-[[dads-pthread]]
-== Библиотеки потоков
+[[dads-verbose-logs]]
+== Подробные логи сборки
-Во FreeBSD библиотека потоков обязана быть скомпонована с исполняемыми файлами с использованием специального флага `-pthread`. Если порт настаивает на прямой компоновке с `-lpthread`, создайте патч для использования `-pthread`.
+Заставьте систему сборки портов отображать все команды, выполняемые на этапе сборки. Полные логи сборки критически важны для отладки проблем с портами.
-[NOTE]
-====
-Если построение порта заканчивается ошибкой `unrecognized option '-pthread'`, то может быть желательно использование `cc` в качестве компоновщика через установку `CONFIGURE_ENV` в `LD=${CC}`. Параметр `-pthread` напрямую командой `ld` не поддерживается.
-====
+Пример неинформативного лога сборки (плохой):
+
+[.programlisting]
+....
+ CC source1.o
+ CC source2.o
+ CCLD someprogram
+....
+
+Пример подробного журнала сборки (хороший):
+
+[.programlisting]
+....
+cc -O2 -pipe -I/usr/local/include -c -o source1.o source1.c
+cc -O2 -pipe -I/usr/local/include -c -o source2.o source2.c
+cc -o someprogram source1.o source2.o -L/usr/local/lib -lsomelib
+....
+
+Некоторые системы сборки, такие как CMake, ninja и GNU configure, настроены на подробное ведение журнала в рамках инфраструктуры портов. В других случаях портам могут потребоваться индивидуальные изменения.
[[dads-feedback]]
-== Пожелания
+== Обратная связь
Посылайте подходящие изменения/патчи автору/сопровождающему для включения в следующий релиз. Это только сделает вашу работу гораздо легче при выходе следующего релиза.
[[dads-readme]]
-== [.filename]#README.html#
+== README.html
[.filename]#README.html# не является частью порта и генерируется при помощи `make readme`. Не включайте этот файл в патчи или коммиты.
@@ -262,79 +279,117 @@ CFLAGS+= -DHAVE_SOUND
[[dads-noinstall]]
== Пометка неустанавливаемого порта как `BROKEN`, `FORBIDDEN` или `IGNORE`
-В некоторых случаях пользователи не должны допускаться к установке порта. Для того, чтобы сообщить пользователю, что порт не следует устанавливать, имеется несколько `make`-переменных, которые могут быть использованы в файле [.filename]#Makefile# порта. Значения следующих `make`-переменных будут причиной, возвращаемой пользователям, по которой порт отказывает в установке. Пожалуйста, используйте корректные `make`-переменные, так как каждая переменная make передает абсолютно различный смысл как для пользователей, так и для автоматизированных систем, которые полагаются на файлы [.filename]#Makefile#, таких как <<build-cluster,кластер построения портов>>, <<freshports,FreshPorts>> и <<portsmon,portsmon>>.
+В некоторых случаях пользователи не должны допускаться к установке порта. Для того, чтобы сообщить пользователю, что порт не следует устанавливать, имеется несколько `make`-переменных, которые могут быть использованы в файле [.filename]#Makefile# порта. Значения следующих `make`-переменных будут причиной, возвращаемой пользователям, по которой порт отказывает в установке. Пожалуйста, используйте корректные `make`-переменные, так как каждая переменная make передает абсолютно различный смысл как для пользователей, так и для автоматизированных систем, которые полагаются на файлы [.filename]#Makefile#, таких как crossref:keeping-up[build-cluster,кластер построения портов], crossref:keeping-up[freshports,FreshPorts].
[[dads-noinstall-variables]]
=== Переменные
* `BROKEN` предназначена для портов, которые в настоящее время не компилируются, не устанавливаются или не удаляются правильно. Следует использовать, когда проблема считается временной.
-+
++
В особых случаях кластер построения будет продолжать попытки собрать их, чтобы показать, решена ли основная проблема. (Однако, как правило, кластер запускается без этой возможности.)
-+
++
В частности, используйте `BROKEN`, когда порт:
** не компилируется
-** не выполняет процесс своей конфигурации или установки
-** устанавливает файлы вовне [.filename]#${LOCALBASE}#
+** выполняет со сбоем конфигурирование или процесс установки
+** устанавливает файлы вовне [.filename]#${PREFIX}#
** не удаляет полностью все свои файлы при деинсталляции (тем не менее, это может быть допустимо, и подходит для портов, оставляющих после себя файлы, измененные пользователем)
+** имеет проблемы во время выполнения на системах, где он должен работать нормально.
* `FORBIDDEN` используется для портов, которые содержат уязвимости в информационной безопасности или являются потенциально вредными в плане обеспечения информационной безопасности системы FreeBSD при установке данного порта (например: заведомо небезопасная программа или программа, которая предоставляет легко взламываемые сервисы). Порты должны помечаться как `FORBIDDEN`, как только в конкретном программном обеспечении обнаружилась уязвимость, но обновление выпущено не было. В идеальном случае порты должны обновляться максимально быстро после обнаружения уязвимости, чтобы уменьшить число уязвимых хостов FreeBSD (нам нравится иметь репутацию безопасной системы), однако иногда случается значительный временной разрыв между обнаружением уязвимости и выходом обновлённого релиза уязвимого программного обеспечения. Не помечайте порт как `FORBIDDEN`, если причина не вызвана соображениями информационной безопасности.
* `IGNORE` предназначена для портов, которые не должны строиться по какой-либо другой причине. Следует использовать для портов, в случае когда проблема считается структурной. Кластер построения ни при каких условиях не будет строить порты, помеченные как `IGNORE`. В частности, используйте `IGNORE`, когда порт:
-** компилируется, но работает неправильно
** не работает на установленной версии FreeBSD
-** имеет дистрибутивный файл, который не может быть автоматически извлечен из-за лицензионных ограничений
-** не работает с каким-либо другим портом, установленным в настоящее время (например, порт зависит от package:www/apache20[], но установлен package:www/apache22[])
-
+** имеет distfile, который не может быть автоматически загружен из-за ограничений лицензирования
+** не работает с некоторыми другими установленными портами (например, порт зависит от package:www/drupal7[], но установлен package:www/drupal8[])
+
[NOTE]
====
-Если порт будет конфликтовать с уже установленным портом (например, если они устанавливают файл в то же место, но с иным функциональным назначением), то <<conflicts,используйте вместо этого `CONFLICTS`>>. `CONFLICTS` сам установит значение `IGNORE`.
+Если порт будет конфликтовать с уже установленным портом (например, если они устанавливают файл в то же место, но с иным функциональным назначением), то crossref:makefiles[conflicts,используйте вместо этого `CONFLICTS`]. `CONFLICTS` сам установит значение `IGNORE`.
====
-* Если порт нужно пометить как `IGNORE` только на некоторых архитектурах, для этого есть две другие удобные переменные, которые автоматически установят для вас значения: `ONLY_FOR_ARCHS` и `NOT_FOR_ARCHS`. Примеры:
-+
+[[dads-noinstall-notes]]
+=== Заметки о реализации
+
+Не заключайте значения переменных `BROKEN`, `IGNORE` и связанных с ними в кавычки. Из-за способа отображения информации пользователю, формулировка сообщений для каждой переменной отличается:
+
[.programlisting]
....
-ONLY_FOR_ARCHS= i386 amd64
+BROKEN= fails to link with base -lcrypto
....
-+
[.programlisting]
....
-NOT_FOR_ARCHS= ia64 sparc64
+IGNORE= unsupported on recent versions
....
-+
-Собственное сообщение `IGNORE` можно задать с использованием `ONLY_FOR_ARCHS_REASON` и `NOT_FOR_ARCHS_REASON`. Отдельно для каждой архитектуры это возможно с использованием `ONLY_FOR_ARCHS_REASON_ARCH` и `NOT_FOR_ARCHS_REASON_ARCH`.
-* Если порт загружает и устанавливает исполняемые файлы i386, то следует установить `IA32_BINARY_PORT`. Если эта переменная установлена, будет выполнена проверка доступности каталога [.filename]#/usr/lib32# для библиотек версии IA32 и поддержки IA32 в ядре. При невыполнении любого из этих условий будет автоматически установлена переменная `IGNORE`.
-
-[[dads-noinstall-notes]]
-=== Замечания по реализации
-
-Строки не следует брать в кавычки. Также построение строки должно несколько различаться из-за способа отображения информации пользователю. Примеры:
+и в результате `make describe` выведен информацию в таком виде :
[.programlisting]
....
-BROKEN= fails to link with base -lcrypto
+===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.
....
[.programlisting]
....
-IGNORE= unsupported on recent versions
+===> foobar-0.1 is unsupported on recent versions.
....
-получаемые в результате следующего вывода `make describe`:
+[[dads-arch]]
+== Архитектурные соображения
+
+[[dads-arch-general]]
+=== Общие замечания об архитектурах
+
+FreeBSD работает на гораздо большем количестве архитектур процессоров, чем только хорошо известные x86-совместимые. Некоторые порты имеют ограничения, характерные для одной или нескольких из этих архитектур.
+
+Для списка поддерживаемых архитектур выполните:
[.programlisting]
....
-===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.
+cd ${SRCDIR}; make targets
....
+Значения отображаются в форме `TARGET`/`TARGET_ARCH`. Переменная только для чтения `ARCH` в ports устанавливается на основе значения `TARGET_ARCH`. [.filename]##Makefile## в портах должны проверять значение этой переменной.
+
+[[dads-arch-neutral]]
+=== Пометка порта как архитектурно нейтрального
+
+Порты, которые не имеют зависимых от архитектуры файлов или требований, определяются установкой `NO_ARCH=yes`.
+
+Пакеты, собранные из таких портов, имеют строку архитектуры, оканчивающуюся на `:*` (архитектура с подстановочным символом), в отличие от, например, `freebsd:13:x86:64` (архитектура amd64).
+
+[NOTE]
+====
+`NO_ARCH` предназначен для указания того, что нет необходимости собирать пакет для каждой из поддерживаемых архитектур. Цель состоит в том, чтобы сократить количество ресурсов, затрачиваемых на сборку и распространение пакетов, таких как сетевой трафик и дисковое пространство на зеркалах и на носителях дистрибутива. Однако в настоящее время наша инфраструктура пакетов (например, менеджеры пакетов, зеркала и сборщики пакетов) не настроена для полного использования преимуществ `NO_ARCH`.
+====
+
+[[dads-arch-ignore]]
+=== Пометка порта как игнорируемого только на определенных архитектурах
+
+* Чтобы пометить порт как ``IGNORE`` только для определенных архитектур, существуют две другие удобные переменные, которые автоматически устанавливают `IGNORE`: `ONLY_FOR_ARCHS` и `NOT_FOR_ARCHS`. Примеры:
++
[.programlisting]
....
-===> foobar-0.1 is unsupported on recent versions.
+ONLY_FOR_ARCHS= i386 amd64
+....
++
+[.programlisting]
+....
+NOT_FOR_ARCHS= ia64 sparc64
....
++
+Пользовательское сообщение `IGNORE` можно задать с помощью `ONLY_FOR_ARCHS_REASON` и `NOT_FOR_ARCHS_REASON`. Для отдельных архитектур возможны записи с `ONLY_FOR_ARCHS_REASON_ARCH` и `NOT_FOR_ARCHS_REASON_ARCH`.
+
+[[dads-arch-i386]]
+* Если порт загружает и устанавливает бинарные файлы i386, установите `IA32_BINARY_PORT`. Если эта переменная задана, [.filename]#/usr/lib32# должен присутствовать для IA32-версий библиотек, а ядро должно поддерживать совместимость с IA32. Если одно из этих двух условий не выполняется, `IGNORE` будет установлен автоматически.
+
+[[dads-arch-cluster]]
+=== Специфические аспекты для кластеров
+
+* Некоторые порты пытаются оптимизировать себя под конкретную машину, на которой они собираются, указывая компилятору `-march=native`. Этого следует избегать: либо добавить этот параметр в опцию, отключенную по умолчанию, либо удалить его полностью.
++
+В противном случае стандартный пакет, созданный кластером сборки, может не запускаться на каждой машине с данной `ARCH`.
[[dads-deprecated]]
== Пометка порта на удаление с `DEPRECATED` или `EXPIRATION_DATE`
@@ -345,7 +400,12 @@ IGNORE= unsupported on recent versions
Переменную `DEPRECATED` можно установить без использования `EXPIRATION_DATE` (в частности, при рекомендации новой версии порта), но обратный порядок не имеет никакого смысла.
-Не существует устоявшейся политики, как долго следует продолжать уведомления. Текущая практика дает около месяца для решения проблем безопасности и два месяца для проблем построения. Это также дает немного времени на исправление проблем любым заинтересованным коммиттерам.
+[NOTE]
+====
+При пометке порта как `DEPRECATED`, если существуют альтернативные порты, которые можно использовать вместо устаревающего, удобно упомянуть их в сообщении коммита.
+====
+
+Не существует установленного правила о том, насколько заранее нужно уведомлять. Текущая практика предполагает один месяц для проблем, связанных с безопасностью, и два месяца для проблем сборки. Это также дает заинтересованным коммиттерам немного времени на исправление проблем.
[[dads-dot-error]]
== Избегайте использования конструкции `.error`
@@ -358,6 +418,7 @@ IGNORE= unsupported on recent versions
.Как избегать использования `.error`
[example]
====
+
Из следующих двух вариантов строки файла [.filename]#Makefile# первый приведёт к неудачному завершению работы `make index`, а второй - нет:
[.programlisting]
@@ -373,7 +434,7 @@ IGNORE=option is not supported
====
[[dads-sysctl]]
-== Использование [.filename]#sysctl#
+== Использование sysctl
Использование [.filename]#sysctl# не рекомендуется, кроме как при выполнении целей. Это вызвано тем, что вычисление любых `makevar`, таких как во время команды `make index`, с необходимостью запуска этой команды, еще больше замедляет весь процесс.
@@ -382,28 +443,35 @@ man:sysctl[8] следует всегда использовать через п
[[dads-rerolling-distfiles]]
== Меняющиеся дистрибутивные файлы
-Иногда авторы программного обеспечения меняют содержимое выпущенных дистрибутивных файлов без смены названия. Вы должны проверять, что изменения являются официальными и произведены автором. В прошлом бывало, что дистрибутивный файл молча изменялся на сайтах загрузки с намерением нанести вред или скомпрометировать безопасность конечного пользователя.
+Иногда авторы программного обеспечения изменяют содержимое выпущенных дистрибутивных файлов, не меняя их названия. Убедитесь, что изменения официальны и были выполнены автором. В прошлом случалось, что дистрибутивный файл тихо изменялся на серверах загрузки с целью нанесения вреда или компрометации безопасности конечного пользователя.
-Отложите старый файл с дистрибутивом в сторону, загрузите новый, распакуйте его и сравните содержимое при помощи man:diff[1]. Если вы не видите ничего подозрительного, то можете обновить файл [.filename]#distinfo#. Убедитесь, что вы подытожили различия в вашем PR или описании коммита, чтобы другие люди были в курсе, что вы позаботились о том, что ничего плохого не случилось.
+Отложите старый distfile в сторону, загрузите новый, распакуйте их и сравните содержимое с помощью man:diff[1]. Если ничего подозрительного нет, обновите [.filename]#distinfo#.
-Возможно вы также захотите связаться с автором этого программного обеспечения для подтверждения изменений.
+[IMPORTANT]
+====
+Убедитесь, что вы выделили основные различия в PR и журнале коммитов, чтобы другие люди знали, что ничего плохого не произошло.
+====
-[[dads-avoiding-linuxisms]]
-== Избегание линуксизмов
+Связжитесь с автором этого программного обеспечения для подтверждения изменений.
-Не используйте [.filename]#/proc#, если доступны любые другие источники получения информации, например, `setprogname(argv[0])` в `main()` и man:getprogname[3], в случае если вы хотите "знать своё имя".
+[[dads-use-posix-standards]]
+== Используйте стандарты POSIX
-Не полагайтесь на поведение, не регламентированное POSIX.
+В большинстве случаев порты FreeBSD ожидают соответствия стандарту POSIX. Некоторые программы и системы сборки делают предположения, основанные на конкретной операционной системе или окружении, что может вызывать проблемы при использовании в порте.
-Не выполняйте запись временных меток в критических путях выполнения приложения, если можно обойтись без этого. Получение временных меток может быть медленным, в зависимости от степени точности используемых часов в операционной системе. Если временные метки действительно нужны, определите степень требуемой точности и используйте тот API, в котором документируется получение достаточной точности.
+Не используйте [.filename]#/proc#, если есть другие способы получить информацию. Например, `setprogname(argv[0])` в `main()`, а затем man:getprogname[3] для получения имени исполняемого файла.
-Ряд простых системных вызовов (например, man:gettimeofday[2], man:getpid[2]) работают намного быстрее в Linux(R) по сравнению с любой другой операционной системой из-за кеширования и используемой оптимизации vsyscall. Не полагайтесь на их дешевизну в критичных к производительности приложениях. В целом, старайтесь избегать системных вызовов там, где это возможно.
+Не полагайтесь на поведение, не документированное в POSIX.
+
+Не записывайте метки времени в критическом пути приложения, если оно работает и без них. Получение меток времени может быть медленным в зависимости от точности меток времени в ОС. Если метки времени действительно необходимы, определите, насколько точными они должны быть, и используйте API, которое, согласно документации, предоставляет только необходимую точность.
+
+Ряд простых системных вызовов (например, man:gettimeofday[2], man:getpid[2]) работают намного быстрее в Linux(R) по сравнению с любой другой операционной системой из-за кэширования и используемой оптимизации vsyscall. Не полагайтесь на их дешевизну в критичных к производительности приложениях. В целом, старайтесь избегать системных вызовов там, где это возможно.
Не полагайтесь на специфичное для Linux(R) поведение сокета. В частности, отличаются размеры буфера сокета по умолчанию (выполните вызов man:setsockopt[2] с `SO_SNDBUF` и `SO_RCVBUF`, и в то время как в Linux(R) при заполнении буфера сокета man:send[2] блокируется, FreeBSD возвращает ошибку и устанавливает `ENOBUFS` в качестве значения errno.
Если требуется рассчитывать на нестандартное поведение, инкапсулируйте это должным образом в общий для всех API с проверкой поведения на этапе конфигурации, и если требуемое поведение не найдено, прекращайте выполнение.
-Используйте http://www.freebsd.org/cgi/man.cgi[страницы справочника] для проверки, относится ли функция к интерфейсу POSIX (ищите раздел "STANDARDS" на странице справочника).
+Используйте https://www.freebsd.org/cgi/man.cgi[страницы справочника] для проверки, относится ли функция к интерфейсу POSIX (ищите раздел "STANDARDS" на странице справочника).
Не рассчитывайте на то, что в качестве [.filename]#/bin/sh# используется bash. Убедитесь, что командная строка, переданная в man:system[3], будет работать в POSIX-совместимой оболочке.
@@ -411,13 +479,9 @@ man:sysctl[8] следует всегда использовать через п
Проверьте, что используемые заголовочные файлы включены в POSIX или список, рекомендуемый страницей справочника, т.к. например, забыть подключить [.filename]#sys/types.h# - не такая уж проблема в Linux(R), однако это не так во FreeBSD.
-Компилируйте многопоточные приложения с ключом "-pthread", а не "-lpthread" или как-либо ещё.
-
[[dads-misc]]
== Разное
Файлы [.filename]#pkg-descr# и [.filename]#pkg-plist# должны проверяться дважды. Если вы пересматриваете порт и думаете, что его можно описать иначе, сделайте это.
-Пожалуйста, не создавайте дополнительных копий лицензии GNU General Public License в нашей системе.
-
Будьте внимательны с юридическими вопросами! Не делайте из нас нелегальных распространителей ПО!
diff --git a/documentation/content/ru/books/porters-handbook/porting-dads/_index.po b/documentation/content/ru/books/porters-handbook/porting-dads/_index.po
new file mode 100644
index 0000000000..d277972fb0
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/porting-dads/_index.po
@@ -0,0 +1,1473 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-08-26 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookporting-dads_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:1
+#, no-wrap
+msgid "A list of common dos and don'ts that are encountered during the FreeBSD porting process"
+msgstr "Список распространённых рекомендаций и ошибок, встречающихся в процессе портирования на FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:1
+#, no-wrap
+msgid "Chapter 13. Dos and Don'ts"
+msgstr "Глава 13. Что делать нужно, и что делать нельзя"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:14
+#, no-wrap
+msgid "Dos and Don'ts"
+msgstr "Что делать нужно, и что делать нельзя"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:54
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:60
+msgid ""
+"Here is a list of common dos and don'ts that are encountered during the "
+"porting process. Check the port against this list, but also check ports in "
+"the https://bugs.FreeBSD.org/search/[PR database] that others have "
+"submitted. Submit any comments on ports as described in extref:"
+"{contributing}[Bug Reports and General Commentary, CONTRIB-GENERAL]. "
+"Checking ports in the PR database will both make it faster for us to commit "
+"them, and prove that you know what you are doing."
+msgstr ""
+"Вот список часто встречающихся действий, которые нужно и которые нельзя "
+"делать во время процесса портирования. Проверьте порт по этому списку, и "
+"также проверьте порты в https://bugs.FreeBSD.org/search/[базе сообщений PR], "
+"которые присланы другими людьми. Присылайте любые комментарии о портах, "
+"которые вы проверили, так, как это описано в статье о extref:{contributing}"
+"[Сообщениях об ошибках и общих замечаниях, CONTRIB-GENERAL]. Проверка портов "
+"в базе сообщений PR позволит нам быстрее коммиттить их и удостовериться, что "
+"вы знаете, что делаете."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:62
+#, no-wrap
+msgid "`WRKDIR`"
+msgstr "`WRKDIR`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:66
+msgid ""
+"Do not write anything to files outside `WRKDIR`. `WRKDIR` is the only place "
+"that is guaranteed to be writable during the port build (see extref:"
+"{handbook}[ installing ports from a CDROM, PORTS-CD] for an example of "
+"building ports from a read-only tree). The [.filename]##pkg-*## files can "
+"be modified by crossref:pkg-files[pkg-names,redefining a variable] rather "
+"than overwriting the file."
+msgstr ""
+"Не пишите ничего в файлы вне каталога `WRKDIR`. Каталог `WRKDIR` является "
+"единственным местом, которое гарантированно будет доступно для записи во "
+"время построения порта (обратитесь к главе об extref:{handbook}[установке "
+"портов с CDROM, PORTS-CD] за примером построения портов из дерева, "
+"доступного только для чтения). Если вам нужно изменить какой-либо из файлов "
+"[.filename]##pkg-*##, сделайте это, crossref:pkg-files[pkg-"
+"names,переопределив переменную], но не перезаписывая их."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:68
+#, no-wrap
+msgid "`WRKDIRPREFIX`"
+msgstr "`WRKDIRPREFIX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:73
+msgid ""
+"Make sure the port honors `WRKDIRPREFIX`. Most ports do not have to worry "
+"about this. In particular, when referring to a `WRKDIR` of another port, "
+"note that the correct location is [.filename]#${WRKDIRPREFIX}${PORTSDIR}/"
+"subdir/name/work# not [.filename]#${PORTSDIR}/subdir/name/work# or "
+"[.filename]#${.CURDIR}/../../subdir/name/work# or some such."
+msgstr ""
+"Добейтесь того, чтобы ваш порт принимал во внимание значение переменной "
+"`WRKDIRPREFIX`. Большинство портов об этом не заботятся. В частности, если "
+"вы обращаетесь к каталогу `WRKDIR` другого порта, заметьте, что его "
+"правильным местоположением является [.filename]#WRKDIRPREFIXPORTSDIR/subdir/"
+"name/work#, а не [.filename]#PORTSDIR/subdir/work# или "
+"[.filename]#.CURDIR/../../subdir/name/work# мли что-то подобное. Кроме того, "
+"если вы сами задаете `WRKDIR`, то должны поставить перед ним знак `$"
+"{WRKDIRPREFIX}${.CURDIR}`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:75
+#, no-wrap
+msgid "Differentiating Operating Systems and OS Versions"
+msgstr "Различение операционных систем и версий ОС"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:79
+msgid ""
+"Some code needs modifications or conditional compilation based upon what "
+"version of FreeBSD Unix it is running under. The preferred way to tell "
+"FreeBSD versions apart are the `{freebsd-version}` and `{freebsd}` macros "
+"defined in https://cgit.freebsd.org/src/tree/sys/sys/param.h[sys/param.h]. "
+"If this file is not included add the code,"
+msgstr ""
+"Вы можете встретиться с кодом, который требует модификаций или условной "
+"компиляции в зависимости от того, с какой версией FreeBSD Unix он работает. "
+"Предпочтительным способом отделения кода для версий FreeBSD является "
+"использование макросов {freebsd-version} и {freebsd}, определённых в https://"
+"cgit.freebsd.org/src/tree/sys/sys/param.h[sys/param.h]. Если этот файл не "
+"подключен, добавьте код"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:83
+#, no-wrap
+msgid "#include <sys/param.h>\n"
+msgstr "#include <sys/param.h>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:86
+msgid "to the proper place in the [.filename]#.c# file."
+msgstr "в нужном месте файла [.filename]#.c#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:89
+msgid ""
+"`{freebsd}` is defined in all versions of FreeBSD as their major version "
+"number. For example, in FreeBSD 9.x, `{freebsd}` is defined to be `9`."
+msgstr ""
+"{freebsd} определён во всех версиях FreeBSD в качестве старшего номера "
+"версии системы. Например, в FreeBSD 9.x {freebsd} определён со значением `9`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:97
+#, no-wrap
+msgid ""
+"#if __FreeBSD__ >= 9\n"
+"# if __FreeBSD_version >= 901000\n"
+"\t /* 9.1+ release specific code here */\n"
+"# endif\n"
+"#endif\n"
+msgstr ""
+"#if __FreeBSD__ >= 9\n"
+"# if __FreeBSD_version >= 901000\n"
+"\t /* 9.1+ release specific code here */\n"
+"# endif\n"
+"#endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:100
+msgid ""
+"A complete list of `{freebsd-version}` values is available in "
+"crossref:versions[versions,__FreeBSD_version Values]."
+msgstr ""
+"Полный список значений `{freebsd-version}` доступен в "
+"crossref:versions[versions,Значения __FreeBSD_version]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:102
+#, no-wrap
+msgid "Writing Something After bsd.port.mk"
+msgstr "Написание чего-либо после bsd.port.mk"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:106
+msgid ""
+"Do not write anything after the `.include <bsd.port.mk>` line. It usually "
+"can be avoided by including [.filename]#bsd.port.pre.mk# somewhere in the "
+"middle of the [.filename]#Makefile# and [.filename]#bsd.port.post.mk# at the "
+"end."
+msgstr ""
+"Не пишите ничего после строки `.include <bsd.port.mk>`. Этой строки можно "
+"избежать, включив в где-то в середину вашего файла [.filename]#Makefile# "
+"файл [.filename]#bsd.port.pre.mk#, и файл [.filename]#bsd.port.post.mk# в "
+"конец."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:110
+msgid ""
+"Include either the [.filename]#bsd.port.pre.mk#/"
+"[.filename]#bsd.port.post.mk# pair or [.filename]#bsd.port.mk# only; do not "
+"mix these two usages."
+msgstr ""
+"Вам нужно включить либо пару файлов [.filename]#bsd.port.pre.mk#/"
+"[.filename]#bsd.port.post.mk#, либо только [.filename]#bsd.port.mk#; не "
+"используйте оба этих метода одновременно."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:113
+msgid ""
+"[.filename]#bsd.port.pre.mk# only defines a few variables, which can be used "
+"in tests in the [.filename]#Makefile#, [.filename]#bsd.port.post.mk# defines "
+"the rest."
+msgstr ""
+"В файле [.filename]#bsd.port.pre.mk# определяются лишь несколько переменных, "
+"которые могут быть использованы в тестах из файла [.filename]#Makefile#, в "
+"файле [.filename]#bsd.port.post.mk# заданы остальные."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:115
+msgid ""
+"Here are some important variables defined in [.filename]#bsd.port.pre.mk# "
+"(this is not the complete list, please read [.filename]#bsd.port.mk# for the "
+"complete list)."
+msgstr ""
+"Вот некоторые важные переменные, определенные в файле "
+"[.filename]#bsd.port.pre.mk# (это не полный список, для выяснения полного "
+"списка прочтите, пожалуйста, сам файл [.filename]#bsd.port.mk#)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:120
+#, no-wrap
+msgid "Variable"
+msgstr "Переменная"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:122
+#, no-wrap
+msgid "Description"
+msgstr "Описание"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:123
+#, no-wrap
+msgid "`ARCH`"
+msgstr "`ARCH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:125
+#, no-wrap
+msgid "The architecture as returned by `uname -m` (for example, `i386`)"
+msgstr "Архитектура машины в виде, получаемом по команде `uname -m` (например, `i386`)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:126
+#, no-wrap
+msgid "`OPSYS`"
+msgstr "`OPSYS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:128
+#, no-wrap
+msgid "The operating system type, as returned by `uname -s` (for example, `FreeBSD`)"
+msgstr "Тип операционной системы, получаемый по команде `uname -s` (например, `FreeBSD`)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:129
+#, no-wrap
+msgid "`OSREL`"
+msgstr "`OSREL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:131
+#, no-wrap
+msgid "The release version of the operating system (for example, `2.1.5` or `2.2.7`)"
+msgstr "Версия релиза операционной системы (например, `2.1.5` или `2.2.7`)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:132
+#, no-wrap
+msgid "`OSVERSION`"
+msgstr "`OSVERSION`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:134
+#, no-wrap
+msgid "The numeric version of the operating system; the same as crossref:versions[versions,`{freebsd-version}`]."
+msgstr "Версия операционной системы в виде числа, та же, что и crossref:versions[versions,`{freebsd-version}`]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:135
+#, no-wrap
+msgid "`LOCALBASE`"
+msgstr "`LOCALBASE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:137
+#, no-wrap
+msgid "The base of the \"local\" tree (for example, `/usr/local`)"
+msgstr "Корень дерева \"local\" (например, `/usr/local`)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:138
+#, no-wrap
+msgid "`PREFIX`"
+msgstr "`PREFIX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:139
+#, no-wrap
+msgid "Where the port installs itself (see crossref:testing[porting-prefix,more on `PREFIX`])."
+msgstr "Куда, собственно, устанавливается порт (обратитесь к crossref:testing[porting-prefix,подробной информации о `PREFIX`])."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:144
+msgid ""
+"When `MASTERDIR` is needed, always define it before including "
+"[.filename]#bsd.port.pre.mk#."
+msgstr ""
+"Если вы задаете переменную `MASTERDIR`, делайте это до подключения "
+"[.filename]#bsd.port.pre.mk#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:147
+msgid ""
+"Here are some examples of things that can be added after "
+"[.filename]#bsd.port.pre.mk#:"
+msgstr ""
+"Вот несколько примеров того, что вы можете написать после "
+"[.filename]#bsd.port.pre.mk#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:154
+#, no-wrap
+msgid ""
+"# no need to compile lang/perl5 if perl5 is already in system\n"
+".if ${OSVERSION} > 300003\n"
+"BROKEN=\tperl is in system\n"
+".endif\n"
+msgstr ""
+"# no need to compile lang/perl5 if perl5 is already in system\n"
+".if ${OSVERSION} > 300003\n"
+"BROKEN=\tperl is in system\n"
+".endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:157
+msgid "Always use tab instead of spaces after `BROKEN=`."
+msgstr ""
+"Вы не забываете об использовании табуляции вместо пробелов после `BROKEN=`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:159
+#, no-wrap
+msgid "Use the `exec` Statement in Wrapper Scripts"
+msgstr "Использование выражения `exec` в сценариях обёртках"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:164
+msgid ""
+"If the port installs a shell script whose purpose is to launch another "
+"program, and if launching that program is the last action performed by the "
+"script, make sure to launch the program using the `exec` statement, for "
+"instance:"
+msgstr ""
+"Если порт устанавливает сценарий на языке shell, который служит для запуска "
+"другой программы, и если запуск этой программы является последним действием "
+"сценария, убедитесь, что запуск программы производится с использованием "
+"выражения `exec`, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:169
+#, no-wrap
+msgid ""
+"#!/bin/sh\n"
+"exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar \"$@\"\n"
+msgstr ""
+"#!/bin/sh\n"
+"exec %%LOCALBASE%%/bin/java -jar %%DATADIR%%/foo.jar \"$@\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:174
+msgid ""
+"The `exec` statement replaces the shell process with the specified program. "
+"If `exec` is omitted, the shell process remains in memory while the program "
+"is executing, and needlessly consumes system resources."
+msgstr ""
+"Выражение `exec` заменяет процесс сценария на указанную программу. Если "
+"`exec` опущен, то процесс сценария во время работы программы остается в "
+"памяти, бесполезно потребляя системные ресурсы."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:176
+#, no-wrap
+msgid "Do Things Rationally"
+msgstr "Поступайте разумно"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:181
+msgid ""
+"The [.filename]#Makefile# should do things in a simple and reasonable "
+"manner. Making it a couple of lines shorter or more readable is always "
+"better. Examples include using a make `.if` construct instead of a shell "
+"`if` construct, not redefining `do-extract` if redefining `EXTRACT*` is "
+"enough, and using `GNU_CONFIGURE` instead of `CONFIGURE_ARGS += --prefix=$"
+"{PREFIX}`."
+msgstr ""
+"Файл [.filename]#Makefile# должен выполнять действия просто и небеспричинно. "
+"Если вы можете сделать что-то на несколько строк короче или более "
+"читабельно, сделайте это. В качестве примеров можно привести использование "
+"конструкций `.if` утилиты make вместо соответствующей конструкции `if` "
+"командного процессора, ненужность переопределения цели `do-extract` при "
+"возможности переопределения `EXTRACT*` и использование `GNU_CONFIGURE` "
+"вместо `CONFIGURE_ARGS += --prefix=${PREFIX}`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:184
+msgid ""
+"If a lot of new code is needed to do something, there may already be an "
+"implementation of it in [.filename]#bsd.port.mk#. While hard to read, there "
+"are a great many seemingly-hard problems for which [.filename]#bsd.port.mk# "
+"already provides a shorthand solution."
+msgstr ""
+"Если вы обнаружите, что для выполнения чего-то приходится писать много "
+"нового кода, то, пожалуйста, просмотрите файл [.filename]#bsd.port.mk# на "
+"предмет того, не содержит ли он решение именно вашей проблемы. Хотя его "
+"трудно читать, имеется много проблем, выглядящих сложными, для которых файл "
+"[.filename]#bsd.port.mk# уже содержит быстрое решение."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:186
+#, no-wrap
+msgid "Respect Both `CC` and `CXX`"
+msgstr "Относитесь внимательно как к `CC`, так и `CXX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:192
+msgid ""
+"The port must respect both `CC` and `CXX`. What we mean by this is that the "
+"port must not set the values of these variables absolutely, overriding "
+"existing values; instead, it may append whatever values it needs to the "
+"existing values. This is so that build options that affect all ports can be "
+"set globally."
+msgstr ""
+"Порт должен принимать во внимание как переменную `CC`, так и `CXX`. Под этим "
+"мы подразумеваем, что порт ни в коем случае не должен устанавливать значения "
+"этих переменных, переопределяя имеющиеся значения; вместо этого можно "
+"добавлять нужные значения к уже имеющимся. Это связано с тем, что параметры "
+"построения, относящиеся ко всем портам, могут быть заданы глобально."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:194
+msgid ""
+"If the port does not respect these variables, please add `NO_PACKAGE=ignores "
+"either cc or cxx` to the [.filename]#Makefile#."
+msgstr ""
+"Если порт не учитывает значения этих переменных, добавьте строку "
+"`NO_PACKAGE=ignores either cc or cxx` в файл [.filename]#Makefile#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:197
+msgid ""
+"Here is an example of a [.filename]#Makefile# respecting both `CC` and "
+"`CXX`. Note the `?=`:"
+msgstr ""
+"Далее следует пример файла [.filename]#Makefile#, использующего как "
+"переменную `CC`, так и `CXX`. Обратите внимание на использование символов `?"
+"=`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:201
+#, no-wrap
+msgid "CC?= gcc\n"
+msgstr "CC?= gcc\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:206
+#, no-wrap
+msgid "CXX?= g++\n"
+msgstr "CXX?= g++\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:209
+msgid "Here is an example which respects neither `CC` nor `CXX`:"
+msgstr "Вот пример, в котором не принимаются во внимание ни `CC`, ни `CXX`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:213
+#, no-wrap
+msgid "CC= gcc\n"
+msgstr "CC= gcc\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:218
+#, no-wrap
+msgid "CXX= g++\n"
+msgstr "CXX= g++\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:223
+msgid ""
+"Both `CC` and `CXX` can be defined on FreeBSD systems in [.filename]#/etc/"
+"make.conf#. The first example defines a value if it was not previously set "
+"in [.filename]#/etc/make.conf#, preserving any system-wide definitions. The "
+"second example clobbers anything previously defined."
+msgstr ""
+"В системах FreeBSD обе переменные `CC` и `CXX` могут быть определены в файле "
+"[.filename]#/etc/make.conf#. В первом примере задаётся значение, если оно "
+"ранее не было определено в [.filename]#/etc/make.conf#, что сохраняет любые "
+"определения, данные на уровне системы в целом. Второй пример переопределяет "
+"всё, что было задано ранее."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:225
+#, no-wrap
+msgid "Respect `CFLAGS`"
+msgstr "Относитесь внимательно к `CFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:231
+msgid ""
+"The port must respect `CFLAGS`. What we mean by this is that the port must "
+"not set the value of this variable absolutely, overriding the existing "
+"value. Instead, it may append whatever values it needs to the existing "
+"value. This is so that build options that affect all ports can be set "
+"globally."
+msgstr ""
+"Порт должен учитывать переменную `CFLAGS`. Под этим мы подразумеваем, что "
+"порт ни в коем случае не должен устанавливать значения этой переменной, "
+"переопределяя имеющиеся значения; вместо этого можно добавлять нужные "
+"значения к уже имеющимся. Это связано с тем, что параметры построения, "
+"относящиеся ко всем портам, могут быть заданы глобально."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:233
+msgid ""
+"If it does not, please add `NO_PACKAGE=ignores cflags` to the "
+"[.filename]#Makefile#."
+msgstr ""
+"Если порт не учитывает значения этой переменной, добавьте строку "
+"`NO_PACKAGE=ignores cflags` в файл [.filename]#Makefile#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:235
+msgid ""
+"Here is an example of a [.filename]#Makefile# respecting `CFLAGS`. Note the "
+"`+=`:"
+msgstr ""
+"Далее следует пример файла [.filename]#Makefile#, использующего переменную "
+"`CFLAGS`. Обратите внимание на использование символов `+=`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:239
+#, no-wrap
+msgid "CFLAGS+= -Wall -Werror\n"
+msgstr "CFLAGS+= -Wall -Werror\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:242
+msgid "Here is an example which does not respect `CFLAGS`:"
+msgstr "А вот пример, в котором не учитывается значение переменной `CFLAGS`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:246
+#, no-wrap
+msgid "CFLAGS= -Wall -Werror\n"
+msgstr "CFLAGS= -Wall -Werror\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:251
+msgid ""
+"`CFLAGS` is defined on FreeBSD systems in [.filename]#/etc/make.conf#. The "
+"first example appends additional flags to `CFLAGS`, preserving any system-"
+"wide definitions. The second example clobbers anything previously defined."
+msgstr ""
+"В системе FreeBSD переменная `CFLAGS` определена в файле [.filename]#/etc/"
+"make.conf#. В первом примере к переменной `CFLAGS` добавляются "
+"дополнительные флаги, при этом сохраняются все определения, данные ранее на "
+"уровне системы. Во втором примере всё, что было задано ранее, игнорируется."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:255
+msgid ""
+"Remove optimization flags from the third party [.filename]##Makefile##s. "
+"The system `CFLAGS` contains system-wide optimization flags. An example "
+"from an unmodified [.filename]#Makefile#:"
+msgstr ""
+"Из сторонних файлов [.filename]#Makefile# следует удалить флаги оптимизации. "
+"Общесистемные флаги оптимизации находятся в системной переменной `CFLAGS`. "
+"Пример из немодифицированного [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:259
+#, no-wrap
+msgid "CFLAGS= -O3 -funroll-loops -DHAVE_SOUND\n"
+msgstr "CFLAGS= -O3 -funroll-loops -DHAVE_SOUND\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:262
+msgid ""
+"Using system optimization flags, the [.filename]#Makefile# would look "
+"similar to this example:"
+msgstr ""
+"При использовании системных флагов оптимизации [.filename]#Makefile# станет "
+"похожим на следующий пример:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:266
+#, no-wrap
+msgid "CFLAGS+= -DHAVE_SOUND\n"
+msgstr "CFLAGS+= -DHAVE_SOUND\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:269
+#, no-wrap
+msgid "Verbose Build Logs"
+msgstr "Подробные логи сборки"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:273
+msgid ""
+"Make the port build system display all commands executed during the build "
+"stage. Complete build logs are crucial to debugging port problems."
+msgstr ""
+"Заставьте систему сборки портов отображать все команды, выполняемые на этапе "
+"сборки. Полные логи сборки критически важны для отладки проблем с портами."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:275
+msgid "Non-informative build log example (bad):"
+msgstr "Пример неинформативного лога сборки (плохой):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:281
+#, no-wrap
+msgid ""
+" CC source1.o\n"
+" CC source2.o\n"
+" CCLD someprogram\n"
+msgstr ""
+" CC source1.o\n"
+" CC source2.o\n"
+" CCLD someprogram\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:284
+msgid "Verbose build log example (good):"
+msgstr "Пример подробного журнала сборки (хороший):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:290
+#, no-wrap
+msgid ""
+"cc -O2 -pipe -I/usr/local/include -c -o source1.o source1.c\n"
+"cc -O2 -pipe -I/usr/local/include -c -o source2.o source2.c\n"
+"cc -o someprogram source1.o source2.o -L/usr/local/lib -lsomelib\n"
+msgstr ""
+"cc -O2 -pipe -I/usr/local/include -c -o source1.o source1.c\n"
+"cc -O2 -pipe -I/usr/local/include -c -o source2.o source2.c\n"
+"cc -o someprogram source1.o source2.o -L/usr/local/lib -lsomelib\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:294
+msgid ""
+"Some build systems such as CMake, ninja, and GNU configure are set up for "
+"verbose logging by the ports framework. In other cases, ports might need "
+"individual tweaks."
+msgstr ""
+"Некоторые системы сборки, такие как CMake, ninja и GNU configure, настроены "
+"на подробное ведение журнала в рамках инфраструктуры портов. В других "
+"случаях портам могут потребоваться индивидуальные изменения."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:296
+#, no-wrap
+msgid "Feedback"
+msgstr "Обратная связь"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:300
+msgid ""
+"Do send applicable changes and patches to the upstream maintainer for "
+"inclusion in the next release of the code. This makes updating to the next "
+"release that much easier."
+msgstr ""
+"Посылайте подходящие изменения/патчи автору/сопровождающему для включения в "
+"следующий релиз. Это только сделает вашу работу гораздо легче при выходе "
+"следующего релиза."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:302
+#, no-wrap
+msgid "README.html"
+msgstr "README.html"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:306
+msgid ""
+"[.filename]#README.html# is not part of the port, but generated by `make "
+"readme`. Do not include this file in patches or commits."
+msgstr ""
+"[.filename]#README.html# не является частью порта и генерируется при помощи "
+"`make readme`. Не включайте этот файл в патчи или коммиты."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:310
+msgid ""
+"If `make readme` fails, make sure that the default value of `ECHO_MSG` has "
+"not been modified by the port."
+msgstr ""
+"Если не удается выполнить `make readme`, убедитесь, что значение по "
+"умолчанию `ECHO_MSG` не изменено внутри порта."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:313
+#, no-wrap
+msgid "Marking a Port Not Installable with `BROKEN`, `FORBIDDEN`, or `IGNORE`"
+msgstr "Пометка неустанавливаемого порта как `BROKEN`, `FORBIDDEN` или `IGNORE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:320
+msgid ""
+"In certain cases, users must be prevented from installing a port. There are "
+"several variables that can be used in a port's [.filename]#Makefile# to tell "
+"the user that the port cannot be installed. The value of these make "
+"variables will be the reason that is shown to users for why the port refuses "
+"to install itself. Please use the correct make variable. Each variable "
+"conveys radically different meanings, both to users and to automated systems "
+"that depend on [.filename]##Makefile##s, such as crossref:keeping-up[build-"
+"cluster,the ports build cluster], and crossref:keeping-"
+"up[freshports,FreshPorts]."
+msgstr ""
+"В некоторых случаях пользователи не должны допускаться к установке порта. "
+"Для того, чтобы сообщить пользователю, что порт не следует устанавливать, "
+"имеется несколько `make`-переменных, которые могут быть использованы в файле "
+"[.filename]#Makefile# порта. Значения следующих `make`-переменных будут "
+"причиной, возвращаемой пользователям, по которой порт отказывает в "
+"установке. Пожалуйста, используйте корректные `make`-переменные, так как "
+"каждая переменная make передает абсолютно различный смысл как для "
+"пользователей, так и для автоматизированных систем, которые полагаются на "
+"файлы [.filename]#Makefile#, таких как crossref:keeping-up[build-"
+"cluster,кластер построения портов], crossref:keeping-"
+"up[freshports,FreshPorts]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:322
+#, no-wrap
+msgid "Variables"
+msgstr "Переменные"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:325
+msgid ""
+"`BROKEN` is reserved for ports that currently do not compile, install, "
+"deinstall, or run correctly. Use it for ports where the problem is believed "
+"to be temporary."
+msgstr ""
+"`BROKEN` предназначена для портов, которые в настоящее время не "
+"компилируются, не устанавливаются или не удаляются правильно. Следует "
+"использовать, когда проблема считается временной."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:328
+msgid ""
+"If instructed, the build cluster will still attempt to try to build them to "
+"see if the underlying problem has been resolved. (However, in general, the "
+"cluster is run without this.)"
+msgstr ""
+"В особых случаях кластер построения будет продолжать попытки собрать их, "
+"чтобы показать, решена ли основная проблема. (Однако, как правило, кластер "
+"запускается без этой возможности.)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:330
+msgid "For instance, use `BROKEN` when a port:"
+msgstr "В частности, используйте `BROKEN`, когда порт:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:332
+msgid "does not compile"
+msgstr "не компилируется"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:333
+msgid "fails its configuration or installation process"
+msgstr "выполняет со сбоем конфигурирование или процесс установки"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:334
+msgid "installs files outside of [.filename]#${PREFIX}#"
+msgstr "устанавливает файлы вовне [.filename]#${PREFIX}#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:335
+msgid ""
+"does not remove all its files cleanly upon deinstall (however, it may be "
+"acceptable, and desirable, for the port to leave user-modified files behind)"
+msgstr ""
+"не удаляет полностью все свои файлы при деинсталляции (тем не менее, это "
+"может быть допустимо, и подходит для портов, оставляющих после себя файлы, "
+"измененные пользователем)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:336
+msgid "has runtime issues on systems where it is supposed to run fine."
+msgstr ""
+"имеет проблемы во время выполнения на системах, где он должен работать "
+"нормально."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:338
+msgid ""
+"`FORBIDDEN` is used for ports that contain a security vulnerability or "
+"induce grave concern regarding the security of a FreeBSD system with a given "
+"port installed (for example, a reputably insecure program or a program that "
+"provides easily exploitable services). Mark ports as `FORBIDDEN` as soon as "
+"a particular piece of software has a vulnerability and there is no released "
+"upgrade. Ideally upgrade ports as soon as possible when a security "
+"vulnerability is discovered so as to reduce the number of vulnerable FreeBSD "
+"hosts (we like being known for being secure), however sometimes there is a "
+"noticeable time gap between disclosure of a vulnerability and an updated "
+"release of the vulnerable software. Do not mark a port `FORBIDDEN` for any "
+"reason other than security."
+msgstr ""
+"`FORBIDDEN` используется для портов, которые содержат уязвимости в "
+"информационной безопасности или являются потенциально вредными в плане "
+"обеспечения информационной безопасности системы FreeBSD при установке "
+"данного порта (например: заведомо небезопасная программа или программа, "
+"которая предоставляет легко взламываемые сервисы). Порты должны помечаться "
+"как `FORBIDDEN`, как только в конкретном программном обеспечении "
+"обнаружилась уязвимость, но обновление выпущено не было. В идеальном случае "
+"порты должны обновляться максимально быстро после обнаружения уязвимости, "
+"чтобы уменьшить число уязвимых хостов FreeBSD (нам нравится иметь репутацию "
+"безопасной системы), однако иногда случается значительный временной разрыв "
+"между обнаружением уязвимости и выходом обновлённого релиза уязвимого "
+"программного обеспечения. Не помечайте порт как `FORBIDDEN`, если причина не "
+"вызвана соображениями информационной безопасности."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:339
+msgid ""
+"`IGNORE` is reserved for ports that must not be built for some other reason. "
+"Use it for ports where the problem is believed to be structural. The build "
+"cluster will not, under any circumstances, build ports marked as `IGNORE`. "
+"For instance, use `IGNORE` when a port:"
+msgstr ""
+"`IGNORE` предназначена для портов, которые не должны строиться по какой-либо "
+"другой причине. Следует использовать для портов, в случае когда проблема "
+"считается структурной. Кластер построения ни при каких условиях не будет "
+"строить порты, помеченные как `IGNORE`. В частности, используйте `IGNORE`, "
+"когда порт:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:341
+msgid "does not work on the installed version of FreeBSD"
+msgstr "не работает на установленной версии FreeBSD"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:342
+msgid ""
+"has a distfile which may not be automatically fetched due to licensing "
+"restrictions"
+msgstr ""
+"имеет distfile, который не может быть автоматически загружен из-за "
+"ограничений лицензирования"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:343
+msgid ""
+"does not work with some other currently installed port (for instance, the "
+"port depends on package:www/drupal7[] but package:www/drupal8[] is installed)"
+msgstr ""
+"не работает с некоторыми другими установленными портами (например, порт "
+"зависит от package:www/drupal7[], но установлен package:www/drupal8[])"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:348
+msgid ""
+"If a port would conflict with a currently installed port (for example, if "
+"they install a file in the same place that performs a different function), "
+"crossref:makefiles[conflicts,use `CONFLICTS` instead]. `CONFLICTS` will set "
+"`IGNORE` by itself."
+msgstr ""
+"Если порт будет конфликтовать с уже установленным портом (например, если они "
+"устанавливают файл в то же место, но с иным функциональным назначением), то "
+"crossref:makefiles[conflicts,используйте вместо этого `CONFLICTS`]. "
+"`CONFLICTS` сам установит значение `IGNORE`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:351
+#, no-wrap
+msgid "Implementation Notes"
+msgstr "Заметки о реализации"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:355
+msgid ""
+"Do not quote the values of `BROKEN`, `IGNORE`, and related variables. Due "
+"to the way the information is shown to the user, the wording of messages for "
+"each variable differ:"
+msgstr ""
+"Не заключайте значения переменных `BROKEN`, `IGNORE` и связанных с ними в "
+"кавычки. Из-за способа отображения информации пользователю, формулировка "
+"сообщений для каждой переменной отличается:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:359
+#, no-wrap
+msgid "BROKEN=\tfails to link with base -lcrypto\n"
+msgstr "BROKEN=\tfails to link with base -lcrypto\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:364
+#, no-wrap
+msgid "IGNORE=\tunsupported on recent versions\n"
+msgstr "IGNORE=\tunsupported on recent versions\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:367
+msgid "resulting in this output from `make describe`:"
+msgstr "и в результате `make describe` выведен информацию в таком виде :"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:371
+#, no-wrap
+msgid "===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.\n"
+msgstr "===> foobar-0.1 is marked as broken: fails to link with base -lcrypto.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:376
+#, no-wrap
+msgid "===> foobar-0.1 is unsupported on recent versions.\n"
+msgstr "===> foobar-0.1 is unsupported on recent versions.\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:379
+#, no-wrap
+msgid "Architectural Considerations"
+msgstr "Архитектурные соображения"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:382
+#, no-wrap
+msgid "General Notes on Architectures"
+msgstr "Общие замечания об архитектурах"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:386
+msgid ""
+"FreeBSD runs on many more processor architectures than just the well-known "
+"x86-based ones. Some ports have constraints which are particular to one or "
+"more of these architectures."
+msgstr ""
+"FreeBSD работает на гораздо большем количестве архитектур процессоров, чем "
+"только хорошо известные x86-совместимые. Некоторые порты имеют ограничения, "
+"характерные для одной или нескольких из этих архитектур."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:388
+msgid "For the list of supported architectures, run:"
+msgstr "Для списка поддерживаемых архитектур выполните:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:392
+#, no-wrap
+msgid "cd ${SRCDIR}; make targets\n"
+msgstr "cd ${SRCDIR}; make targets\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:397
+msgid ""
+"The values are shown in the form `TARGET`/`TARGET_ARCH`. The ports read-"
+"only makevar `ARCH` is set based on the value of `TARGET_ARCH`. Port "
+"[.filename]##Makefile##s should test the value of this Makevar."
+msgstr ""
+"Значения отображаются в форме `TARGET`/`TARGET_ARCH`. Переменная только для "
+"чтения `ARCH` в ports устанавливается на основе значения `TARGET_ARCH`. "
+"[.filename]##Makefile## в портах должны проверять значение этой переменной."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:399
+#, no-wrap
+msgid "Marking a Port as Architecture Neutral"
+msgstr "Пометка порта как архитектурно нейтрального"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:402
+msgid ""
+"Ports that do not have any architecture-dependent files or requirements are "
+"identified by setting `NO_ARCH=yes`."
+msgstr ""
+"Порты, которые не имеют зависимых от архитектуры файлов или требований, "
+"определяются установкой `NO_ARCH=yes`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:404
+msgid ""
+"Packages built from such ports have their architecture string ending in `:*` "
+"(wildcard architecture) as opposed to, for example, `freebsd:13:x86:64` "
+"(amd64 architecture)."
+msgstr ""
+"Пакеты, собранные из таких портов, имеют строку архитектуры, оканчивающуюся "
+"на `:*` (архитектура с подстановочным символом), в отличие от, например, "
+"`freebsd:13:x86:64` (архитектура amd64)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:410
+msgid ""
+"`NO_ARCH` is meant to indicate that there is no need to build a package for "
+"each of the supported architectures. The goal is to reduce the amount of "
+"resources spent on building and distributing the packages such as network "
+"bandwidth and disk space on mirrors and on distribution media. Currently, "
+"however, our package infrastructure (e.g., package managers, mirrors, and "
+"package builders) is not set up to fully benefit from `NO_ARCH`."
+msgstr ""
+"`NO_ARCH` предназначен для указания того, что нет необходимости собирать "
+"пакет для каждой из поддерживаемых архитектур. Цель состоит в том, чтобы "
+"сократить количество ресурсов, затрачиваемых на сборку и распространение "
+"пакетов, таких как сетевой трафик и дисковое пространство на зеркалах и на "
+"носителях дистрибутива. Однако в настоящее время наша инфраструктура пакетов "
+"(например, менеджеры пакетов, зеркала и сборщики пакетов) не настроена для "
+"полного использования преимуществ `NO_ARCH`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:413
+#, no-wrap
+msgid "Marking a Port as Ignored Only On Certain Architectures"
+msgstr "Пометка порта как игнорируемого только на определенных архитектурах"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:416
+msgid ""
+"To mark a port as ``IGNORE``d only on certain architectures, there are two "
+"other convenience variables that will automatically set `IGNORE`: "
+"`ONLY_FOR_ARCHS` and `NOT_FOR_ARCHS`. Examples:"
+msgstr ""
+"Чтобы пометить порт как ``IGNORE`` только для определенных архитектур, "
+"существуют две другие удобные переменные, которые автоматически "
+"устанавливают `IGNORE`: `ONLY_FOR_ARCHS` и `NOT_FOR_ARCHS`. Примеры:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:420
+#, no-wrap
+msgid "ONLY_FOR_ARCHS=\ti386 amd64\n"
+msgstr "ONLY_FOR_ARCHS=\ti386 amd64\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:425
+#, no-wrap
+msgid "NOT_FOR_ARCHS=\tia64 sparc64\n"
+msgstr "NOT_FOR_ARCHS=\tia64 sparc64\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:429
+msgid ""
+"A custom `IGNORE` message can be set using `ONLY_FOR_ARCHS_REASON` and "
+"`NOT_FOR_ARCHS_REASON`. Per architecture entries are possible with "
+"`ONLY_FOR_ARCHS_REASON_ARCH` and `NOT_FOR_ARCHS_REASON_ARCH`."
+msgstr ""
+"Пользовательское сообщение `IGNORE` можно задать с помощью "
+"`ONLY_FOR_ARCHS_REASON` и `NOT_FOR_ARCHS_REASON`. Для отдельных архитектур "
+"возможны записи с `ONLY_FOR_ARCHS_REASON_ARCH` и `NOT_FOR_ARCHS_REASON_ARCH`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:432
+msgid ""
+"If a port fetches i386 binaries and installs them, set `IA32_BINARY_PORT`. "
+"If this variable is set, [.filename]#/usr/lib32# must be present for IA32 "
+"versions of libraries and the kernel must support IA32 compatibility. If one "
+"of these two dependencies is not satisfied, `IGNORE` will be set "
+"automatically."
+msgstr ""
+"Если порт загружает и устанавливает бинарные файлы i386, установите "
+"`IA32_BINARY_PORT`. Если эта переменная задана, [.filename]#/usr/lib32# "
+"должен присутствовать для IA32-версий библиотек, а ядро должно поддерживать "
+"совместимость с IA32. Если одно из этих двух условий не выполняется, "
+"`IGNORE` будет установлен автоматически."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:434
+#, no-wrap
+msgid "Cluster-Specific Considerations"
+msgstr "Специфические аспекты для кластеров"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:437
+msgid ""
+"Some ports attempt to tune themselves to the exact machine they are being "
+"built on by specifying `-march=native` to the compiler. This should be "
+"avoided: either list it under an off-by-default option, or delete it "
+"entirely."
+msgstr ""
+"Некоторые порты пытаются оптимизировать себя под конкретную машину, на "
+"которой они собираются, указывая компилятору `-march=native`. Этого следует "
+"избегать: либо добавить этот параметр в опцию, отключенную по умолчанию, "
+"либо удалить его полностью."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:439
+msgid ""
+"Otherwise, the default package produced by the build cluster might not run "
+"on every single machine of that `ARCH`."
+msgstr ""
+"В противном случае стандартный пакет, созданный кластером сборки, может не "
+"запускаться на каждой машине с данной `ARCH`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:441
+#, no-wrap
+msgid "Marking a Port for Removal with `DEPRECATED` or `EXPIRATION_DATE`"
+msgstr "Пометка порта на удаление с `DEPRECATED` или `EXPIRATION_DATE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:445
+msgid ""
+"Do remember that `BROKEN` and `FORBIDDEN` are to be used as a temporary "
+"resort if a port is not working. Permanently broken ports will be removed "
+"from the tree entirely."
+msgstr ""
+"Помните, что `BROKEN` и `FORBIDDEN` будут использованы как временное "
+"средство, если порт не является работающим. Постоянно неработоспособные "
+"порты должны полностью удаляться из дерева."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:449
+msgid ""
+"When it makes sense to do so, users can be warned about a pending port "
+"removal with `DEPRECATED` and `EXPIRATION_DATE`. The former is a string "
+"stating why the port is scheduled for removal; the latter is a string in ISO "
+"8601 format (YYYY-MM-DD). Both will be shown to the user."
+msgstr ""
+"В подходящих ситуациях пользователи могут быть оповещены о предстоящем "
+"удалении через переменные `DEPRECATED` и `EXPIRATION_DATE`. Первое - это "
+"просто строка, сообщающая причину запланированного удаления порта; вторая "
+"является строкой в формате ISO 8601 (YYYY-MM-DD). Обе будут показаны "
+"пользователю."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:451
+msgid ""
+"It is possible to set `DEPRECATED` without an `EXPIRATION_DATE` (for "
+"instance, recommending a newer version of the port), but the converse does "
+"not make any sense."
+msgstr ""
+"Переменную `DEPRECATED` можно установить без использования `EXPIRATION_DATE` "
+"(в частности, при рекомендации новой версии порта), но обратный порядок не "
+"имеет никакого смысла."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:457
+msgid ""
+"When marking a port as `DEPRECATED`, if there are any alternative ports that "
+"can be used as a replacement for the one being deprecated, it is convenient "
+"to mention them in the commit message."
+msgstr ""
+"При пометке порта как `DEPRECATED`, если существуют альтернативные порты, "
+"которые можно использовать вместо устаревающего, удобно упомянуть их в "
+"сообщении коммита."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:462
+msgid ""
+"There is no set policy on how much notice to give. Current practice seems "
+"to be one month for security-related issues and two months for build "
+"issues. This also gives any interested committers a little time to fix the "
+"problems."
+msgstr ""
+"Не существует установленного правила о том, насколько заранее нужно "
+"уведомлять. Текущая практика предполагает один месяц для проблем, связанных "
+"с безопасностью, и два месяца для проблем сборки. Это также дает "
+"заинтересованным коммиттерам немного времени на исправление проблем."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:464
+#, no-wrap
+msgid "Avoid Use of the `.error` Construct"
+msgstr "Избегайте использования конструкции `.error`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:468
+msgid ""
+"The correct way for a [.filename]#Makefile# to signal that the port cannot "
+"be installed due to some external factor (for instance, the user has "
+"specified an illegal combination of build options) is to set a non-blank "
+"value to `IGNORE`. This value will be formatted and shown to the user by "
+"`make install`."
+msgstr ""
+"Правильным способом подать сигнал для [.filename]#Makefile# о том, что порт "
+"не может быть установлен из-за какого-то внешнего фактора (например, "
+"пользователь указал недопустимую комбинацию опций построения), является "
+"установка непустого значения для `IGNORE`. Это значение будет сформатировано "
+"и показано пользователю во время `make install`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:474
+msgid ""
+"It is a common mistake to use `.error` for this purpose. The problem with "
+"this is that many automated tools that work with the ports tree will fail in "
+"this situation. The most common occurrence of this is seen when trying to "
+"build [.filename]#/usr/ports/INDEX# (see crossref:testing[make-"
+"describe,Running `make describe`]). However, even more trivial commands "
+"such as `make maintainer` also fail in this scenario. This is not "
+"acceptable."
+msgstr ""
+"Использование для этих целей `.error` является распространенной ошибкой. "
+"Проблема в том, что в этой ситуации будут повреждены многие инструменты "
+"автоматизации, работающие с деревом портов. Наибольшим образом это "
+"распространено при попытке построить [.filename]#/usr/ports/INDEX# (смотрите "
+"crossref:testing[make-describe, Запуск `make describe`]). Тем не менее, даже "
+"более простые команды, такие как `make maintainer`, в этом случае также "
+"вернут ошибку. Это не является приемлемым."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:476
+#, no-wrap
+msgid "How to Avoid Using `.error`"
+msgstr "Как избегать использования `.error`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:481
+msgid ""
+"The first of the next two [.filename]#Makefile# snippets will cause `make "
+"index` to fail, while the second one will not:"
+msgstr ""
+"Из следующих двух вариантов строки файла [.filename]#Makefile# первый "
+"приведёт к неудачному завершению работы `make index`, а второй - нет:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:485
+#, no-wrap
+msgid ".error \"option is not supported\"\n"
+msgstr ".error \"option is not supported\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:490
+#, no-wrap
+msgid "IGNORE=option is not supported\n"
+msgstr "IGNORE=option is not supported\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:495
+#, no-wrap
+msgid "Usage of sysctl"
+msgstr "Использование sysctl"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:500
+msgid ""
+"The usage of [.filename]#sysctl# is discouraged except in targets. This is "
+"because the evaluation of any ``makevar``s, such as used during `make "
+"index`, then has to run the command, further slowing down that process."
+msgstr ""
+"Использование [.filename]#sysctl# не рекомендуется, кроме как при выполнении "
+"целей. Это вызвано тем, что вычисление любых `makevar`, таких как во время "
+"команды `make index`, с необходимостью запуска этой команды, еще больше "
+"замедляет весь процесс."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:502
+msgid ""
+"Only use man:sysctl[8] through `SYSCTL`, as it contains the fully qualified "
+"path and can be overridden, if one has such a special need."
+msgstr ""
+"man:sysctl[8] следует всегда использовать через переменную `SYSCTL`, "
+"поскольку она содержит полностью заданный путь, и при необходимости может "
+"быть переопределена."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:504
+#, no-wrap
+msgid "Rerolling Distfiles"
+msgstr "Меняющиеся дистрибутивные файлы"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:509
+msgid ""
+"Sometimes the authors of software change the content of released distfiles "
+"without changing the file's name. Verify that the changes are official and "
+"have been performed by the author. It has happened in the past that the "
+"distfile was silently altered on the download servers with the intent to "
+"cause harm or compromise end user security."
+msgstr ""
+"Иногда авторы программного обеспечения изменяют содержимое выпущенных "
+"дистрибутивных файлов, не меняя их названия. Убедитесь, что изменения "
+"официальны и были выполнены автором. В прошлом случалось, что дистрибутивный "
+"файл тихо изменялся на серверах загрузки с целью нанесения вреда или "
+"компрометации безопасности конечного пользователя."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:512
+msgid ""
+"Put the old distfile aside, download the new one, unpack them and compare "
+"the content with man:diff[1]. If there is nothing suspicious, update "
+"[.filename]#distinfo#."
+msgstr ""
+"Отложите старый distfile в сторону, загрузите новый, распакуйте их и "
+"сравните содержимое с помощью man:diff[1]. Если ничего подозрительного нет, "
+"обновите [.filename]#distinfo#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:516
+msgid ""
+"Be sure to summarize the differences in the PR and commit log, so that other "
+"people know that nothing bad has happened."
+msgstr ""
+"Убедитесь, что вы выделили основные различия в PR и журнале коммитов, чтобы "
+"другие люди знали, что ничего плохого не произошло."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:519
+msgid "Contact the authors of the software and confirm the changes with them."
+msgstr ""
+"Связжитесь с автором этого программного обеспечения для подтверждения "
+"изменений."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:521
+#, no-wrap
+msgid "Use POSIX Standards"
+msgstr "Используйте стандарты POSIX"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:525
+msgid ""
+"FreeBSD ports generally expect POSIX compliance. Some software and build "
+"systems make assumptions based on a particular operating system or "
+"environment that can cause problems when used in a port."
+msgstr ""
+"В большинстве случаев порты FreeBSD ожидают соответствия стандарту POSIX. "
+"Некоторые программы и системы сборки делают предположения, основанные на "
+"конкретной операционной системе или окружении, что может вызывать проблемы "
+"при использовании в порте."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:528
+msgid ""
+"Do not use [.filename]#/proc# if there are any other ways of getting the "
+"information. For example, `setprogname(argv[0])` in `main()` and then "
+"man:getprogname[3] to know the executable name."
+msgstr ""
+"Не используйте [.filename]#/proc#, если есть другие способы получить "
+"информацию. Например, `setprogname(argv[0])` в `main()`, а затем "
+"man:getprogname[3] для получения имени исполняемого файла."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:530
+msgid "Do not rely on behavior that is undocumented by POSIX."
+msgstr "Не полагайтесь на поведение, не документированное в POSIX."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:534
+msgid ""
+"Do not record timestamps in the critical path of the application if it also "
+"works without. Getting timestamps may be slow, depending on the accuracy of "
+"timestamps in the OS. If timestamps are really needed, determine how "
+"precise they have to be and use an API which is documented to just deliver "
+"the needed precision."
+msgstr ""
+"Не записывайте метки времени в критическом пути приложения, если оно "
+"работает и без них. Получение меток времени может быть медленным в "
+"зависимости от точности меток времени в ОС. Если метки времени действительно "
+"необходимы, определите, насколько точными они должны быть, и используйте "
+"API, которое, согласно документации, предоставляет только необходимую "
+"точность."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:538
+msgid ""
+"A number of simple syscalls (for example man:gettimeofday[2], man:getpid[2]) "
+"are much faster on Linux(R) than on any other operating system due to "
+"caching and the vsyscall performance optimizations. Do not rely on them "
+"being cheap in performance-critical applications. In general, try hard to "
+"avoid syscalls if possible."
+msgstr ""
+"Ряд простых системных вызовов (например, man:gettimeofday[2], man:getpid[2]) "
+"работают намного быстрее в Linux(R) по сравнению с любой другой операционной "
+"системой из-за кэширования и используемой оптимизации vsyscall. Не "
+"полагайтесь на их дешевизну в критичных к производительности приложениях. В "
+"целом, старайтесь избегать системных вызовов там, где это возможно."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:541
+msgid ""
+"Do not rely on Linux(R)-specific socket behavior. In particular, default "
+"socket buffer sizes are different (call man:setsockopt[2] with `SO_SNDBUF` "
+"and `SO_RCVBUF`, and while Linux(R)'s man:send[2] blocks when the socket "
+"buffer is full, FreeBSD's will fail and set `ENOBUFS` in errno."
+msgstr ""
+"Не полагайтесь на специфичное для Linux(R) поведение сокета. В частности, "
+"отличаются размеры буфера сокета по умолчанию (выполните вызов "
+"man:setsockopt[2] с `SO_SNDBUF` и `SO_RCVBUF`, и в то время как в Linux(R) "
+"при заполнении буфера сокета man:send[2] блокируется, FreeBSD возвращает "
+"ошибку и устанавливает `ENOBUFS` в качестве значения errno."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:543
+msgid ""
+"If relying on non-standard behavior is required, encapsulate it properly "
+"into a generic API, do a check for the behavior in the configure stage, and "
+"stop if it is missing."
+msgstr ""
+"Если требуется рассчитывать на нестандартное поведение, инкапсулируйте это "
+"должным образом в общий для всех API с проверкой поведения на этапе "
+"конфигурации, и если требуемое поведение не найдено, прекращайте выполнение."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:545
+msgid ""
+"Check the https://man.freebsd.org/cgi/man.cgi[man pages] to see if the "
+"function used is a POSIX interface (in the \"STANDARDS\" section of the man "
+"page)."
+msgstr ""
+"Используйте https://www.freebsd.org/cgi/man.cgi[страницы справочника] для "
+"проверки, относится ли функция к интерфейсу POSIX (ищите раздел "
+"\"STANDARDS\" на странице справочника)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:548
+msgid ""
+"Do not assume that [.filename]#/bin/sh# is bash. Ensure that a command line "
+"passed to man:system[3] will work with a POSIX compliant shell."
+msgstr ""
+"Не рассчитывайте на то, что в качестве [.filename]#/bin/sh# используется "
+"bash. Убедитесь, что командная строка, переданная в man:system[3], будет "
+"работать в POSIX-совместимой оболочке."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:550
+msgid ""
+"A list of common bashisms is available https://wiki.ubuntu.com/"
+"DashAsBinSh[here]."
+msgstr ""
+"Список основных bash-измов расположен https://wiki.ubuntu.com/"
+"DashAsBinSh[здесь]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:553
+msgid ""
+"Check that headers are included in the POSIX or man page recommended way. "
+"For example, [.filename]#sys/types.h# is often forgotten, which is not as "
+"much of a problem for Linux(R) as it is for FreeBSD."
+msgstr ""
+"Проверьте, что используемые заголовочные файлы включены в POSIX или список, "
+"рекомендуемый страницей справочника, т.к. например, забыть подключить "
+"[.filename]#sys/types.h# - не такая уж проблема в Linux(R), однако это не "
+"так во FreeBSD."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:555
+#, no-wrap
+msgid "Miscellanea"
+msgstr "Разное"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:559
+msgid ""
+"Always double-check [.filename]#pkg-descr# and [.filename]#pkg-plist#. If "
+"reviewing a port and a better wording can be achieved, do so."
+msgstr ""
+"Файлы [.filename]#pkg-descr# и [.filename]#pkg-plist# должны проверяться "
+"дважды. Если вы пересматриваете порт и думаете, что его можно описать иначе, "
+"сделайте это."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/porting-dads/_index.adoc:560
+msgid ""
+"Please be careful to note any legal issues! Do not let us illegally "
+"distribute software!"
+msgstr ""
+"Будьте внимательны с юридическими вопросами! Не делайте из нас нелегальных "
+"распространителей ПО!"
diff --git a/documentation/content/ru/books/porters-handbook/porting-samplem/_index.adoc b/documentation/content/ru/books/porters-handbook/porting-samplem/_index.adoc
index c5c89e657d..d4dd67a440 100644
--- a/documentation/content/ru/books/porters-handbook/porting-samplem/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/porting-samplem/_index.adoc
@@ -1,22 +1,24 @@
---
-title: Глава 13. Примерный Makefile
+description: 'Образец Makefile, который можно использовать для создания нового порта FreeBSD'
+next: books/porters-handbook/order
+params:
+ path: /books/porters-handbook/porting-samplem/
prev: books/porters-handbook/porting-dads
-next: books/porters-handbook/keeping-up
showBookMenu: true
-weight: 13
-params:
- path: "/books/porters-handbook/porting-samplem/"
+tags: ["sample", "makefile"]
+title: 'Глава 14. Примерный Makefile'
+weight: 14
---
[[porting-samplem]]
-= Примерный [.filename]#Makefile#
+= Примерный Makefile
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 13
+:sectnumoffset: 14
:partnums:
:source-highlighter: rouge
:experimental:
@@ -46,86 +48,55 @@ toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
-Вот примерный [.filename]#Makefile#, который можно использовать при создании нового порта. Обязательно удалите все дополнительные комментарии (те, которые в скобках)!
+Образец Makefile, который можно использовать для создания нового порта.
-Вам рекомендуется следовать этому формату (соблюдая порядок следования переменных, пустые строки между разделами, и так далее). Этот формат разработан для того, чтобы важная информация была легко найдена. Мы рекомендуем вам воспользоваться утилитой <<porting-portlint,portlint>> для проверки файла [.filename]#Makefile#.
+Вам рекомендуется следовать этому формату (соблюдая crossref:order[,порядок] следования переменных, пустые строки между разделами, и так далее). Этот формат разработан для того, чтобы важная информация была легко найдена. Обратитесь crossref:testing[, главе о тестировании], чтобы узнать больше о lint, утилитах для форматирования и проверки файла [.filename]#Makefile#.
[.programlisting]
....
-[заголовок...просто чтобы нам было легче идентифицировать порт.]
-# Created by: Satoshi Asami <asami@FreeBSD.org>
-[Необязательная строка Created by: содержит имя
-человека, создавшего первоначальную версию порта. Следует отметить,
-что за : следует пробел, но не символ табуляции. Если
-эта строка присутствует, будущие сопровождающие не должны её менять
-или удалять, кроме как по запросу первоначального автора.]
-
-# $FreeBSD$
-[ ^^^^^^^^^ Эта строка будет автоматически заменена на строчку RCS ID
-системой SVN при выполнении операции коммита в наше хранилище. При
-обновлении порта не приводите эту строку обратно к виду
-"$FreeBSD$". SVN сделает это автоматически.]
-
-[секция описания собственно порта и основного сервера - сначала всегда
- PORTNAME и PORTVERSION, за ним следует CATEGORIES, а затем
- MASTER_SITES, за которым может идти MASTER_SITE_SUBDIR.
- PKGNAMEPREFIX и PKGNAMESUFFIX, если они нужны, следуют за ними.
- Затем следует DISTNAME, EXTRACT_SUFX и/или DISTFILES, а потом, если это нужно,
- EXTRACT_ONLY.]
-PORTNAME= xdvi
-PORTVERSION= 18.2
+PORTNAME= xdvi <1>
+DISTVERSION= 18.2
CATEGORIES= print
-[не забывайте про завершающую косую черту ("/")!
- если вы не используете макросы MASTER_SITE_*]
-MASTER_SITES= ${MASTER_SITE_XCONTRIB}
-MASTER_SITE_SUBDIR= applications
+MASTER_SITES= ${MASTER_SITE_XCONTRIB} <2>
+MASTER_SITE_SUBDIR= applications
PKGNAMEPREFIX= ja-
DISTNAME= xdvi-pl18
-[задайте это, если исходный код поставляется не в виде
- стандартного файла ".tar.gz"]
-EXTRACT_SUFX= .tar.Z
+EXTRACT_SUFX= .tar.Z <3>
-[секция патчей -- может быть пустой]
-PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/
+PATCH_SITES= ftp://ftp.sra.co.jp/pub/X11/japanese/ <4>
PATCHFILES= xdvi-18.patch1.gz xdvi-18.patch2.gz
+PATCH_DIST_STRIP= -p1 <5>
-[сопровождающий; *обязательное поле*! Это человек, который добровольно
- занимается обновлениями порта и неисправностями при построении, и которому
- пользователь может направлять вопросы и сообщения об ошибках. Для
- сохранения как можно более высокого качества Коллекции Портов мы больше
- не принимаем новые порты, назначенные на "ports@FreeBSD.org".]
-MAINTAINER= asami@FreeBSD.org
+MAINTAINER= asami@FreeBSD.org <6>
COMMENT= DVI Previewer for the X Window System
+WWW= http://xdvi.sourceforge.net/
+
+LICENSE= BSD2CLAUSE <7>
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+RUN_DEPENDS= gs:print/ghostscript <8>
+
+USES= gmake <9>
-[зависимости -- могут быть пустыми]
-RUN_DEPENDS= gs:${PORTSDIR}/print/ghostscript
-
-[этот раздел для остальных стандартных переменных из bsd.port.mk, кроме
- тех, что перечислены выше]
-[Если порт задает вопросы во время этапов настройки, построения,
- установки...]
-IS_INTERACTIVE= yes
-[Если распаковка происходит в каталог, отличных от ${DISTNAME}...]
-WRKSRC= ${WRKDIR}/xdvi-new
-[Если патчи делались не относительно ${WRKSRC}, вам, может быть, не
- придется изменять эту переменную]
-PATCH_DIST_STRIP= -p1
-[Если порт требует скрипта "configure", генерируемого GNU-версией программы
- autoconf]
-GNU_CONFIGURE= yes
-[Если для построения порту требуется GNU-версия утилиты make, а не
- /usr/bin/make...]
-USES= gmake
-[Если это приложение X и требует запуска "xmkmf -a"...]
-USES= imake
-[и так далее]
-
-[В правилах ниже используются нестандартные переменные]
+<10>
+IS_INTERACTIVE= yes <11>
+WRKSRC= ${WRKDIR}/xdvi-new <12>
+GNU_CONFIGURE= yes <13>
+
+<14>
+OPTIONS_DEFINE= DOCS EXAMPLES FOO
+OPTIONS_DEFAULT=FOO
+OPTIONS_SUB= yes <15>
+
+FOO_DESC= Enable foo support
+FOO_CONFIGURE_ENABLE= foo
+
+<16>
MY_FAVORITE_RESPONSE= "yeah, right"
-[теперь специальные правила, в порядке их вызова]
+<17>
pre-fetch:
- я что-то выкачиваю, точно
+ i go fetch something, yeah
post-patch:
мне кое-что сделать после применения патча, великолепно
@@ -133,7 +104,24 @@ post-patch:
pre-install:
и потом еще кое-что перед установкой, ого
-[и, наконец, эпилог]
-
-.include <bsd.port.mk>
+.include <bsd.port.mk> <18>
....
+
+<1> Секция для описания самого порта и его главного сайта: первыми идут переменные PORTNAME и PORTVERSION или DISTVERSION*, на ними CATEGORIES, затем MASTER_SITES, после которой идет MASTER_SITE_SUBDIR. Если нужно, то после нее идут PKGNAMEPREFIX и PKGNAMESUFFIX. Затем следуют DISTNAME, EXTRACT_SUFX и/или DISTFILES, и уже потом, если нужно, EXTRACT_ONLY.
+<2> Не забывайте про завершающую косую черту (`/`), если вы не используете макросы MASTER_SITE_*.
+<3> Задайте это, если исходный код поставляется не в виде стандартного файла ".tar.gz".
+<4> Секция патчей — может быть пустой.
+<5> Если распространяемые патчи не были созданы относительно ${WRKSRC},возможно, это потребуется исправить вручную.
+<6> Сопровождающий; *обязательное поле*! Это человек, который добровольно занимается обновлениями порта и неисправностями при построении, и которому пользователь может направлять вопросы и сообщения об ошибках. Для сохранения как можно более высокого качества Коллекции Портов мы больше не принимаем новые порты, назначенные на "ports@FreeBSD.org".
+<7> Лицензия — не следует оставлять пустым.
+<8> Зависимости — могут быть пустыми.
+<9> Если порт требует GNU make вместо стандартного FreeBSD `make` (man:make[1]) для сборки. Например, некоторым приложениям X требуется выполнение `xmkmf -a`, в этом случае порту понадобится `USES=imake`.
+<10> Этот раздел посвящён другим стандартным переменным [.filename]#bsd.port.mk#, которые не относятся ни к одной из вышеперечисленных категорий.
+<11> Если порты задают интерактивные вопросы во время настройки, сборки, установки.
+<12> Если извлечение происходит в каталог, отличный от `DISTNAME`.
+<13> Если требуется запустить скрипт `configure`, сгенерированный GNU autoconf.
+<14> Этот раздел предназначен для настройки параметров портов.
+<15> Установите `OPTIONS_SUB`, если параметры изменят список файлов в crossref:plist[plist-sub, plist].
+<16> В правилах ниже используются нестандартные переменные.
+<17> Специальные правила, в порядке их вызова фреймворком портов.
+<18> Наконец, эпилог.
diff --git a/documentation/content/ru/books/porters-handbook/porting-samplem/_index.po b/documentation/content/ru/books/porters-handbook/porting-samplem/_index.po
new file mode 100644
index 0000000000..9f10c99918
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/porting-samplem/_index.po
@@ -0,0 +1,412 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-08-20 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookporting-samplem_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:1
+#, no-wrap
+msgid "A sample Makefile that can be used to create a new FreeBSD Port"
+msgstr "Образец Makefile, который можно использовать для создания нового порта FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:1
+#, no-wrap
+msgid "Chapter 14. A Sample Makefile"
+msgstr "Глава 14. Примерный Makefile"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:14
+#, no-wrap
+msgid "A Sample Makefile"
+msgstr "Примерный Makefile"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:52
+msgid ""
+"Here is a sample [.filename]#Makefile# that can be used to create a new port."
+msgstr ""
+"Образец Makefile, который можно использовать для создания нового порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:56
+msgid ""
+"The format shown is the recommended one for crossref:order[, ordering] "
+"variables, empty lines between sections, and so on. This format is designed "
+"so that the most important information is easy to locate. Refer to "
+"crossref:testing[, the chapter about testing] to learn more about tools for "
+"linting, formatting, and checking the [.filename]#Makefile#."
+msgstr ""
+"Вам рекомендуется следовать этому формату (соблюдая crossref:order[,порядок] "
+"следования переменных, пустые строки между разделами, и так далее). Этот "
+"формат разработан для того, чтобы важная информация была легко найдена. "
+"Обратитесь crossref:testing[, главе о тестировании], чтобы узнать больше о "
+"lint, утилитах для форматирования и проверки файла [.filename]#Makefile#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:67
+#, no-wrap
+msgid ""
+"PORTNAME=\txdvi <1>\n"
+"DISTVERSION=\t18.2\n"
+"CATEGORIES=\tprint\n"
+"MASTER_SITES=\t${MASTER_SITE_XCONTRIB} <2>\n"
+"MASTER_SITE_SUBDIR=\tapplications\n"
+"PKGNAMEPREFIX=\tja-\n"
+"DISTNAME=\txdvi-pl18\n"
+"EXTRACT_SUFX=\t.tar.Z <3>\n"
+msgstr ""
+"PORTNAME=\txdvi <1>\n"
+"DISTVERSION=\t18.2\n"
+"CATEGORIES=\tprint\n"
+"MASTER_SITES=\t${MASTER_SITE_XCONTRIB} <2>\n"
+"MASTER_SITE_SUBDIR=\tapplications\n"
+"PKGNAMEPREFIX=\tja-\n"
+"DISTNAME=\txdvi-pl18\n"
+"EXTRACT_SUFX=\t.tar.Z <3>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:71
+#, no-wrap
+msgid ""
+"PATCH_SITES=\tftp://ftp.sra.co.jp/pub/X11/japanese/ <4>\n"
+"PATCHFILES=\txdvi-18.patch1.gz xdvi-18.patch2.gz\n"
+"PATCH_DIST_STRIP=\t-p1 <5>\n"
+msgstr ""
+"PATCH_SITES=\tftp://ftp.sra.co.jp/pub/X11/japanese/ <4>\n"
+"PATCHFILES=\txdvi-18.patch1.gz xdvi-18.patch2.gz\n"
+"PATCH_DIST_STRIP=\t-p1 <5>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:75
+#, no-wrap
+msgid ""
+"MAINTAINER=\tasami@FreeBSD.org <6>\n"
+"COMMENT=\tDVI Previewer for the X Window System\n"
+"WWW=\t\thttp://xdvi.sourceforge.net/\n"
+msgstr ""
+"MAINTAINER=\tasami@FreeBSD.org <6>\n"
+"COMMENT=\tDVI Previewer for the X Window System\n"
+"WWW=\t\thttp://xdvi.sourceforge.net/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:78
+#, no-wrap
+msgid ""
+"LICENSE=\tBSD2CLAUSE <7>\n"
+"LICENSE_FILE=\t${WRKSRC}/LICENSE\n"
+msgstr ""
+"LICENSE=\tBSD2CLAUSE <7>\n"
+"LICENSE_FILE=\t${WRKSRC}/LICENSE\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:80
+#, no-wrap
+msgid "RUN_DEPENDS=\tgs:print/ghostscript <8>\n"
+msgstr "RUN_DEPENDS=\tgs:print/ghostscript <8>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:82
+#, no-wrap
+msgid "USES=\t\tgmake <9>\n"
+msgstr "USES=\t\tgmake <9>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:87
+#, no-wrap
+msgid ""
+"<10>\n"
+"IS_INTERACTIVE=\tyes <11>\n"
+"WRKSRC=\t\t${WRKDIR}/xdvi-new <12>\n"
+"GNU_CONFIGURE=\tyes <13>\n"
+msgstr ""
+"<10>\n"
+"IS_INTERACTIVE=\tyes <11>\n"
+"WRKSRC=\t\t${WRKDIR}/xdvi-new <12>\n"
+"GNU_CONFIGURE=\tyes <13>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:92
+#, no-wrap
+msgid ""
+"<14>\n"
+"OPTIONS_DEFINE=\tDOCS EXAMPLES FOO\n"
+"OPTIONS_DEFAULT=FOO\n"
+"OPTIONS_SUB=\tyes <15>\n"
+msgstr ""
+"<14>\n"
+"OPTIONS_DEFINE=\tDOCS EXAMPLES FOO\n"
+"OPTIONS_DEFAULT=FOO\n"
+"OPTIONS_SUB=\tyes <15>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:95
+#, no-wrap
+msgid ""
+"FOO_DESC=\t\tEnable foo support\n"
+"FOO_CONFIGURE_ENABLE=\tfoo\n"
+msgstr ""
+"FOO_DESC=\t\tEnable foo support\n"
+"FOO_CONFIGURE_ENABLE=\tfoo\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:98
+#, no-wrap
+msgid ""
+"<16>\n"
+"MY_FAVORITE_RESPONSE=\t\"yeah, right\"\n"
+msgstr ""
+"<16>\n"
+"MY_FAVORITE_RESPONSE=\t\"yeah, right\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:102
+#, no-wrap
+msgid ""
+"<17>\n"
+"pre-fetch:\n"
+"\ti go fetch something, yeah\n"
+msgstr ""
+"<17>\n"
+"pre-fetch:\n"
+"\ti go fetch something, yeah\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:105
+#, no-wrap
+msgid ""
+"post-patch:\n"
+"\ti need to do something after patch, great\n"
+msgstr ""
+"post-patch:\n"
+"\tмне кое-что сделать после применения патча, великолепно\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:108
+#, no-wrap
+msgid ""
+"pre-install:\n"
+"\tand then some more stuff before installing, wow\n"
+msgstr ""
+"pre-install:\n"
+"\tи потом еще кое-что перед установкой, ого\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:110
+#, no-wrap
+msgid ".include <bsd.port.mk> <18>\n"
+msgstr ".include <bsd.port.mk> <18>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:115
+msgid ""
+"Section to describe the port itself and the master site -- `PORTNAME` and "
+"`PORTVERSION` or the `DISTVERSION*` variables are always first, followed by "
+"`CATEGORIES`, and then `MASTER_SITES`, which can be followed by "
+"`MASTER_SITE_SUBDIR`. `PKGNAMEPREFIX` and `PKGNAMESUFFIX`, if needed, will "
+"be after that. Then comes `DISTNAME`, `EXTRACT_SUFX` and/or `DISTFILES`, "
+"and then `EXTRACT_ONLY`, as necessary."
+msgstr ""
+"Секция для описания самого порта и его главного сайта: первыми идут "
+"переменные PORTNAME и PORTVERSION или DISTVERSION*, на ними CATEGORIES, "
+"затем MASTER_SITES, после которой идет MASTER_SITE_SUBDIR. Если нужно, то "
+"после нее идут PKGNAMEPREFIX и PKGNAMESUFFIX. Затем следуют DISTNAME, "
+"EXTRACT_SUFX и/или DISTFILES, и уже потом, если нужно, EXTRACT_ONLY."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:116
+msgid ""
+"Do not forget the trailing slash (`/`) if not using `MASTER_SITE_*` macros."
+msgstr ""
+"Не забывайте про завершающую косую черту (`/`), если вы не используете "
+"макросы MASTER_SITE_*."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:117
+msgid "Set this if the source is not in the standard \".tar.gz\" form."
+msgstr ""
+"Задайте это, если исходный код поставляется не в виде стандартного файла "
+"\".tar.gz\"."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:118
+msgid "Section for distributed patches -- can be empty."
+msgstr "Секция патчей — может быть пустой."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:119
+msgid ""
+"If the distributed patches were not made relative to `WRKSRC`, this may need "
+"to be tweaked."
+msgstr ""
+"Если распространяемые патчи не были созданы относительно ${WRKSRC},возможно, "
+"это потребуется исправить вручную."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:122
+msgid ""
+"Maintainer; *mandatory*! This is the person who is volunteering to handle "
+"port updates, build breakages, and to whom a users can direct questions and "
+"bug reports. To keep the quality of the Ports Collection as high as "
+"possible, we do not accept new ports that are assigned to "
+"\"ports@FreeBSD.org\"."
+msgstr ""
+"Сопровождающий; *обязательное поле*! Это человек, который добровольно "
+"занимается обновлениями порта и неисправностями при построении, и которому "
+"пользователь может направлять вопросы и сообщения об ошибках. Для сохранения "
+"как можно более высокого качества Коллекции Портов мы больше не принимаем "
+"новые порты, назначенные на \"ports@FreeBSD.org\"."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:123
+msgid "License -- should not be empty."
+msgstr "Лицензия — не следует оставлять пустым."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:124
+msgid "Dependencies -- can be empty."
+msgstr "Зависимости — могут быть пустыми."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:126
+msgid ""
+"If the port requires GNU make instead of the default FreeBSD `make` "
+"(man:make[1]) to build. For example, some X applications require `xmkmf -a` "
+"to run, in which case the port would need `USES=imake`."
+msgstr ""
+"Если порт требует GNU make вместо стандартного FreeBSD `make` (man:make[1]) "
+"для сборки. Например, некоторым приложениям X требуется выполнение `xmkmf "
+"-a`, в этом случае порту понадобится `USES=imake`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:127
+msgid ""
+"This section is for other standard [.filename]#bsd.port.mk# variables that "
+"do not belong to any of the above."
+msgstr ""
+"Этот раздел посвящён другим стандартным переменным [.filename]#bsd.port.mk#, "
+"которые не относятся ни к одной из вышеперечисленных категорий."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:128
+msgid ""
+"If the ports asks interactive questions during configure, build, install."
+msgstr ""
+"Если порты задают интерактивные вопросы во время настройки, сборки, "
+"установки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:129
+msgid "If it extracts to a directory other than `DISTNAME`."
+msgstr "Если извлечение происходит в каталог, отличный от `DISTNAME`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:130
+msgid ""
+"If it requires a `configure` script generated by GNU autoconf to be run."
+msgstr ""
+"Если требуется запустить скрипт `configure`, сгенерированный GNU autoconf."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:131
+msgid "This section is for handling ports options."
+msgstr "Этот раздел предназначен для настройки параметров портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:132
+msgid ""
+"Set `OPTIONS_SUB` if options will change the list of files in the "
+"crossref:plist[plist-sub, plist]."
+msgstr ""
+"Установите `OPTIONS_SUB`, если параметры изменят список файлов в "
+"crossref:plist[plist-sub, plist]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:133
+msgid "Non-standard variables to be used in the rules below."
+msgstr "В правилах ниже используются нестандартные переменные."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:134
+msgid "Special rules, in the order they are called by the ports framework."
+msgstr "Специальные правила, в порядке их вызова фреймворком портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-samplem/_index.adoc:134
+msgid "Finally, the epilogue."
+msgstr "Наконец, эпилог."
+
+#~ msgid ""
+#~ "Here is a sample [.filename]#Makefile# that can be used to create a new "
+#~ "port. Make sure to remove all the extra comments (ones between brackets)."
+#~ msgstr ""
+#~ "Вот примерный [.filename]#Makefile#, который можно использовать при "
+#~ "создании нового порта. Обязательно удалите все дополнительные комментарии "
+#~ "(те, которые в скобках)."
+
+#, no-wrap
+#~ msgid ""
+#~ "[If it requires GNU make, not /usr/bin/make, to build...]\n"
+#~ "USES= gmake\n"
+#~ "[If it is an X application and requires \"xmkmf -a\" to be run...]\n"
+#~ "USES= imake\n"
+#~ msgstr ""
+#~ "[Если для сборки требуется GNU make, а не /usr/bin/make...]\n"
+#~ "USES= gmake\n"
+#~ "[Если это приложение для X и требует выполнения команды \"xmkmf -a\"...]\n"
+#~ "USES= imake\n"
+
+#, no-wrap
+#~ msgid ""
+#~ "[this section is for other standard bsd.port.mk variables that do not]\n"
+#~ " belong to any of the above]\n"
+#~ "[If it asks questions during configure, build, install...]\n"
+#~ "IS_INTERACTIVE=\tyes\n"
+#~ "[If it extracts to a directory other than ${DISTNAME}...]\n"
+#~ "WRKSRC=\t\t${WRKDIR}/xdvi-new\n"
+#~ "[If it requires a \"configure\" script generated by GNU autoconf to be run]\n"
+#~ "GNU_CONFIGURE=\tyes\n"
+#~ "[et cetera.]\n"
+#~ msgstr ""
+#~ "[Этот раздел предназначен для прочих стандартных переменных bsd.port.mk,\n"
+#~ " не относящихся к указанным выше категориям]\n"
+#~ "[Если программа задаёт вопросы во время настройки (configure), сборки (build) или установки (install)...]\n"
+#~ "IS_INTERACTIVE=\tyes\n"
+#~ "[Если распаковка происходит в каталог, отличных от ${DISTNAME}...]\n"
+#~ "WRKSRC=\t\t${WRKDIR}/xdvi-new\n"
+#~ "[Если требуется выполнение сценария \"configure\", сгенерированного GNU autoconf.]\n"
+#~ "GNU_CONFIGURE=\tyes\n"
+#~ "[и так далее.]\n"
+
+#, no-wrap
+#~ msgid ""
+#~ "[If it requires options, this section is for options]\n"
+#~ "OPTIONS_DEFINE=\tDOCS EXAMPLES FOO\n"
+#~ "OPTIONS_DEFAULT=\tFOO\n"
+#~ "[If options will change the files in plist]\n"
+#~ "OPTIONS_SUB=yes\n"
+#~ msgstr ""
+#~ "[Если для сборки требуются параметры, этот раздел предназначен для их настройки]\n"
+#~ "OPTIONS_DEFINE=\tDOCS EXAMPLES FOO\n"
+#~ "OPTIONS_DEFAULT=\tFOO\n"
+#~ "[Если параметры влияют на список файлов в plist]\n"
+#~ "OPTIONS_SUB=yes\n"
+
+#, no-wrap
+#~ msgid "FOO_CONFIGURE_ENABLE=\tfoo\n"
+#~ msgstr "FOO_CONFIGURE_ENABLE=\tfoo\n"
diff --git a/documentation/content/ru/books/porters-handbook/porting-why/_index.adoc b/documentation/content/ru/books/porters-handbook/porting-why/_index.adoc
index 9b04d921da..83be752dab 100644
--- a/documentation/content/ru/books/porters-handbook/porting-why/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/porting-why/_index.adoc
@@ -1,11 +1,13 @@
---
-title: Глава 1. Введение
-prev: books/porters-handbook/
+description: 'Почему добавляют программы в коллекцию портов FreeBSD'
next: books/porters-handbook/new-port
+params:
+ path: /books/porters-handbook/porting-why/
+prev: books/porters-handbook
showBookMenu: true
+tags: ["ports", "why porting"]
+title: 'Глава 1. Введение'
weight: 1
-params:
- path: "/books/porters-handbook/porting-why/"
---
[[why-port]]
diff --git a/documentation/content/ru/books/porters-handbook/porting-why/_index.po b/documentation/content/ru/books/porters-handbook/porting-why/_index.po
new file mode 100644
index 0000000000..7cdf3c5595
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/porting-why/_index.po
@@ -0,0 +1,61 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-12 12:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookporting-why_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/porting-why/_index.adoc:1
+#, no-wrap
+msgid "Why port a program to the FreeBSD Ports Collection"
+msgstr "Почему добавляют программы в коллекцию портов FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/porting-why/_index.adoc:1
+#, no-wrap
+msgid "Chapter 1. Introduction"
+msgstr "Глава 1. Введение"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/porting-why/_index.adoc:14
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-why/_index.adoc:54
+msgid ""
+"The FreeBSD Ports Collection is the way almost everyone installs "
+"applications (\"ports\") on FreeBSD. Like everything else about FreeBSD, it "
+"is primarily a volunteer effort. It is important to keep this in mind when "
+"reading this document."
+msgstr ""
+"Коллекция портов FreeBSD является способом, используемым практически каждым "
+"для установки приложений (\"портов\") на FreeBSD. Как и почти всё остальное "
+"во FreeBSD, эта система в основном является добровольно поддерживаемым "
+"начинанием. Важно иметь это в виду при чтении данного документа."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/porting-why/_index.adoc:56
+msgid ""
+"In FreeBSD, anyone may submit a new port, or volunteer to maintain an "
+"existing unmaintained port. No special commit privilege is needed."
+msgstr ""
+"Во FreeBSD каждый может прислать новый порт либо изъявить желание "
+"поддерживать существующий порт, если его никто ещё никто не поддерживает-вам "
+"не нужно иметь никаких особых привилегий на внесение изменений, чтобы это "
+"делать."
diff --git a/documentation/content/ru/books/porters-handbook/quick-porting/_index.adoc b/documentation/content/ru/books/porters-handbook/quick-porting/_index.adoc
index ea91baf3f8..27cbe1b0ec 100644
--- a/documentation/content/ru/books/porters-handbook/quick-porting/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/quick-porting/_index.adoc
@@ -1,11 +1,13 @@
---
-title: Глава 3. Быстрое портирование
-prev: books/porters-handbook/new-port
+description: 'Как быстро создать новый порт FreeBSD'
next: books/porters-handbook/slow-porting
+params:
+ path: /books/porters-handbook/quick-porting/
+prev: books/porters-handbook/new-port
showBookMenu: true
+tags: ["quick porting", "guide", "port", "ports collection", "how-to"]
+title: 'Глава 3. Быстрое портирование'
weight: 3
-params:
- path: "/books/porters-handbook/quick-porting/"
---
[[quick-porting]]
@@ -46,20 +48,20 @@ toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
-В этом разделе описано, как создать новый порт на скорую руку. Во многих случаях этого бывает не достаточно, так что вам нужно будет прочитать документ дальше.
+В этом разделе описано, как быстро создать новый порт. Для случаев, когда этот быстрый метод не подходит, полный процесс "Медленного портирования" описан в разделе crossref:slow-porting[slow-porting,Медленное портирование].
Во-первых, скачайте оригинальный tar-файл и поместите его в каталог `DISTDIR`, который по умолчанию есть не что иное, как [.filename]#/usr/ports/distfiles#.
[NOTE]
====
-Здесь предполагается, что программное обеспечение компилируется без проблем как есть, то есть для работы приложения на вашей системе FreeBSD не потребовалось абсолютно никаких изменений. Если требовалось что-то изменить, то вам придется обратиться также и к следующему разделу.
+Здесь предполагается, что программное обеспечение компилируется без проблем как есть, то есть для работы приложения на вашей системе FreeBSD не потребовалось абсолютно никаких изменений. Если требовалось что-то изменить, то вам придется обратиться также и к следующему разделу — crossref:slow-porting[slow-porting,Медленное портирование].
====
[NOTE]
====
Перед началом портирования рекомендуется установить переменную man:make[1] `DEVELOPER` в [.filename]#/etc/make.conf#.
-[source,shell]
+[source, shell]
....
# echo DEVELOPER=yes >> /etc/make.conf
....
@@ -74,64 +76,48 @@ endif::[]
[.programlisting]
....
-# $FreeBSD$
-
PORTNAME= oneko
-PORTVERSION= 1.1b
+DISTVERSION= 1.1b
CATEGORIES= games
-MASTER_SITES= ftp://ftp.cs.columbia.edu/archives/X11R5/contrib/
+MASTER_SITES= ftp://ftp.rediris.es/sites/ftp.freebsd.org/pub/FreeBSD/
MAINTAINER= youremail@example.com
COMMENT= Cat chasing a mouse all over the screen
+WWW= http://www.daidouji.com/oneko/
.include <bsd.port.mk>
....
-[NOTE]
-====
-В некоторых случаях в заголовке [.filename]#Makefile# существующего порта могут содержаться дополнительные строки, такие как название порта и дата его создания. Эта дополнительная информация была объявлена устаревшей и находится в процессе удаления.
-====
-
-Посмотрим, сможете ли вы его понять. Не обращайте внимание на содержимое строчки `$FreeBSD$`, она будет заполнена автоматически системой Subversion, когда порт будет импортирован в наше дерево портов. Вы можете найти более подробный пример в разделе <<porting-samplem,пример Makefile>>.
+Посмотрим, сможете ли вы его понять. Более подробный пример приведен в секции crossref:porting-samplem[porting-samplem,пример Makefile].
[[porting-desc]]
== Создание информационных файлов
Имеется два информационных файла, которые требуются для любого порта, вне зависимости от того, является ли он пакетом или нет. Это [.filename]#pkg-descr# и [.filename]#pkg-plist#. Префикс [.filename]#pkg-# отличает их от других файлов.
+[[porting-pkg-descr]]
=== [.filename]#pkg-descr#
Это более подробное краткое описание порта. От одного до нескольких абзацев, кратко описывающих, что представляет собой порт, будет достаточно.
[NOTE]
====
-Это _не_ руководство и не подробнейшее описание того, как использовать или компилировать порт! _Пожалуйста, будьте внимательны при копировании текста из [.filename]#README# или страниц справочника_; слишком часто они не являются кратким описанием порта или имеют неудобный формат (например, страницы справочника выровнены пробелами, что особенно плохо смотрится с моноширинными шрифтами).
+Это _не_ руководство и не подробное описание того, как использовать или компилировать порт! _Пожалуйста, будьте осторожны при копировании из [.filename]#README# или manpage_. Очень часто они не содержат краткого описания порта или имеют неудобный формат. Например, manpages используют выравнивание по ширине, что особенно плохо выглядит с моноширинными шрифтами.
+
+С другой стороны, содержимое файла [.filename]#pkg-descr# должно быть длиннее, чем crossref:makefiles[makefile-comment,строка `COMMENT` из Makefile]. Оно должно более подробно объяснять, что собой представляет данный порт.
====
Хорошо составленный [.filename]#pkg-descr# описывает порт достаточно полно, чтобы пользователю не приходилось сверяться с документацией или посещать вебсайт для понимания того, что делает данное программное обеспечение, чем оно может быть полезно или какие хорошие функции у него имеются. Упоминание про определённые требования, такие как используемый графический инструментарий, тяжёлые зависимости, окружение для запуска или используемый язык программирования помогут пользователям определиться, будет ли этот порт для них работать.
-Включите сюда URL официальной домашней страницы Интернет. Перед _одним_ из сайтов (выберите основной) добавьте `WWW:` (с последующим единичным пробелом) для того, чтобы вспомогательные утилиты работали правильно. Если URI является корнем сайта или каталогом, то значение должно быть дополнено косой чертой.
-
[NOTE]
====
-Если указанная для порта веб-страница не доступна, попытайтесь сперва поискать, был ли официальный сайт перемещён, переименован или размещён в другом месте.
+URL, который ранее включался в последнюю строку файла [.filename]#pkg-descr#, был перемещен в [.filename]#Makefile#.
====
-Следующий пример показывает, как должен выглядеть ваш [.filename]#pkg-descr#:
-
-[.programlisting]
-....
-This is a port of oneko, in which a cat chases a poor mouse all over
-the screen.
- :
-(etc.)
-
-WWW: http://www.oneko.org/
-....
-
+[[porting-pkg-plist]]
=== [.filename]#pkg-plist#
-Здесь перечисляются все файлы, устанавливаемые портом. Его также называют "списком для упаковки", потому что пакет генерируется упаковкой файлов, которые здесь указаны. Имена путей указываются относительно установочного префикса (обычно [.filename]#/usr/local#). Если порт во время установки создает каталоги, убедитесь, что добавлены строки `@dirrm` для удаления каталогов при удалении пакета.
+Здесь перечисляются все файлы, устанавливаемые портом. Его также называют "списком для упаковки", потому что пакет генерируется упаковкой файлов, которые здесь указаны. Имена путей указываются относительно установочного префикса (обычно [.filename]#/usr/local#).
Вот маленький пример:
@@ -143,19 +129,18 @@ lib/X11/app-defaults/Oneko
lib/X11/oneko/cat1.xpm
lib/X11/oneko/cat2.xpm
lib/X11/oneko/mouse.xpm
-@dirrm lib/X11/oneko
....
Обратитесь к странице справочной системы по команде man:pkg-create[8] с подробным описанием формата списка упаковки.
[NOTE]
====
-Рекомендуется, чтобы имена файлов в этом списке были отсортированы в алфавитном порядке. Это позволит значительно облегчить сверку изменений при обновлении порта.
+Рекомендуется, чтобы имена файлов в этом списке были отсортированы в алфавитном порядке. Это позволит значительно облегчить сверку изменений при обновлении порта. Фреймворк делает это корректно, когда список пакета crossref:plist[plist-autoplist,сгенерирован автоматически].
====
-[NOTE]
+[TIP]
====
-Создание списка упаковки вручную может оказаться весьма трудоёмкой задачей. Если порт устанавливает большое количество файлов, раздел об <<plist-autoplist,автоматическом построении списка упаковки>> может помочь сэкономить время.
+Создание списка упаковки вручную может оказаться весьма трудоёмкой задачей. Если порт устанавливает большое количество файлов, раздел об crossref:plist[plist-autoplist,автоматическом построении списка упаковки] может помочь сэкономить время.
====
Существует только одно исключение, когда у порта может отсутствовать [.filename]#pkg-plist#. Если порт устанавливает лишь несколько файлов, а возможно, и каталогов, то они могут быть перечислены в переменных `PLIST_FILES` и `PLIST_DIRS`, соответственно, внутри файла [.filename]#Makefile# порта. К примеру, мы можем обойтись без файла [.filename]#pkg-plist# у приведённого выше порта [.filename]#oneko#, добавив следующие строки в [.filename]#Makefile#:
@@ -168,80 +153,127 @@ PLIST_FILES= bin/oneko \
lib/X11/oneko/cat1.xpm \
lib/X11/oneko/cat2.xpm \
lib/X11/oneko/mouse.xpm
-PLIST_DIRS= lib/X11/oneko
....
-Конечно, переменная `PLIST_DIRS` не должна задаваться, если порт не устанавливает никаких каталогов.
-
[NOTE]
====
-Несколько портов могут совместно использовать общий каталог. В этом случае `PLIST_DIRS` следует заменить на `PLIST_DIRSTRY`, так чтобы каталог удалялся только если он пуст, а иначе игнорировался. Использование `PLIST_DIRS` и `PLIST_DIRSTRY` аналогично `@dirrm` и `@dirrmtry` в [.filename]#pkg-plist#, описание которых входит в crossref:plist[plist-dir-cleaning,Очистка пустых каталогов].
+Использование `PLIST_FILES` не должно быть чрезмерным. При поиске происхождения файла обычно просматривают файлы [.filename]#pkg-plist# в дереве портов с помощью grep. Указание файлов в `PLIST_FILES` в [.filename]#Makefile# усложняет этот поиск.
====
-Обратной стороной такого способа перечисления файлов и каталогов порта является невозможность использования последовательностей команд, описанных в man:pkg-create[8]. Поэтому он подходит для простых портов, что делает их ещё более простыми. Одновременно с этим положительным моментом является уменьшение количества файлов в коллекции портов. Пожалуйста, подумайте над использованием этой техники, прежде чем создавать [.filename]#pkg-plist#.
+[TIP]
+====
+Если порту требуется создать пустой каталог или он создает каталоги вне [.filename]#${PREFIX}# во время установки, обратитесь к разделу crossref:plist[plist-dir-cleaning,Очистка пустых каталогов] для получения дополнительной информации.
+====
-Далее мы увидим, как можно использовать файлы [.filename]#pkg-plist# и `PLIST_FILES` выполнения crossref:plist[plist,более сложных задач].
+[TIP]
+====
+Поскольку `PLIST_FILES` является переменной man:make[1], любая запись с пробелами должна быть заключена в кавычки. Например, при использовании ключевых слов, описанных в man:pkg-create[8] и crossref:plist[plist-keywords,Расширение списка пакетов с помощью ключевых слов], запись должна быть заключена в кавычки.
+
+[.programlisting]
+....
+PLIST_FILES= "@sample ${ETCDIR}/oneko.conf.sample"
+....
+====
+
+Позже мы увидим, как [.filename]#pkg-plist# и `PLIST_FILES` могут использоваться для выполнения crossref:plist[plist,более сложных задач].
[[porting-checksum]]
== Создание файла с контрольной суммой
-Просто введите команду `make makesum`. Правила утилиты make автоматически сгенерируют файл [.filename]#distinfo#.
-
-Если у извлекаемого файла регулярно меняется контрольная сумма и вы не сомневаетесь в надежности источника (т.е. он получен из CD производителя, либо ежедневно обновляется документация), то вы должны указать эти файлы в переменной `IGNOREFILES`. Тогда контрольная сумма при выполнении `make makesum` для этого файла создаваться не будет, а вместо этого для него будет установлено значение `IGNORE`.
+Просто введите команду `make makesum`. Правила утилиты make автоматически сгенерируют файл [.filename]#distinfo#. Не пытайтесь создавать этот файл вручную.
[[porting-testing]]
== Тестирование порта
-Вы должны удостовериться, что правила построения порта выполняют именно то, что вы хотите, включая создание пакета для порта. Вот те важные вещи, которые вы должны проверить.
+Вы должны удостовериться, что правила построения порта выполняют именно то, что вы хотите, включая создание пакета для порта. Вот те важные вещи, которые вы должны проверить:
-* [.filename]#pkg-plist# не содержит ничего сверх того, что устанавливается портом
-* [.filename]#pkg-plist# содержит абсолютно все, что устанавливается портом
+* [.filename]#pkg-plist# не содержит ничего сверх того, что устанавливается портом.
+* [.filename]#pkg-plist# содержит абсолютно все, что устанавливается портом.
* Порт может быть установлен с помощью указания цели `install`. Это позволяет убедиться в правильной работе сценария установки.
* Порт может быть правильным образом удалён с помощью указания цели `deinstall`. Это позволяет убедиться в правильной работе сценария удаления.
-* Следует убедиться, что `make package` можно запустить из-под обычного пользователя (то есть, не из-под `root`). Если это не так, в [.filename]#Makefile# порта должно быть добавлено `NEED_ROOT=yes`.
+* Порт имеет доступ к сетевым ресурсам только во время фазы цели `fetch`. Это важно для сборщиков пакетов, таких как package:ports-mgmt/poudriere[].
+* Убедитесь, что команду `make package` можно выполнить от имени обычного пользователя (то есть не от `root`). Если это не работает, возможно, потребуется исправить программное обеспечение. См. также crossref:uses[uses-fakeroot,`fakeroot`] и crossref:uses[uses-uidfix,`uidfix`].
[.procedure]
-====
-*Procedure: Рекомендуемый порядок проверки*
-
+.*Procedure: Рекомендуемый порядок проверки*
. `make stage`
. `make check-orphans`
. `make package`
. `make install`
. `make deinstall`
-. `pkg add package-filename`
-. `make package` (из-под пользователя)
-====
+. `make package` (как пользователь)
Убедитесь, что на любом из этапов не выдается никаких предупреждений.
-Основательное автоматизированное тестирование может быть выполнено при помощи package:ports-mgmt/tinderbox[] или package:ports-mgmt/poudriere[] из Коллекции Портов. Эти приложения используют `jails`, в которых проверяются все перечисленные выше этапы без изменения состояния основной системы.
+Тщательное автоматизированное тестирование можно выполнить с помощью package:ports-mgmt/poudriere[] из коллекции портов, дополнительную информацию см. в crossref:testing[testing-poudriere,poudriere]. Он поддерживает `клетки`, в которых можно протестировать все указанные выше шаги без воздействия на состояние основной системы.
[[porting-portlint]]
== Проверка вашего порта утилитой `portlint`
-Будьте добры, пользуйтесь утилитой `portlint` для проверки того, что ваш порт соответствует нашим рекомендациям. Программа package:ports-mgmt/portlint[] является частью Коллекции Портов. В частности, вы можете захотеть проверить, правильно ли сформирован файл <<porting-samplem,Makefile>> и соответствующим ли образом именован <<porting-pkgname,пакет>>.
+Будьте добры, пользуйтесь утилитой `portlint` для проверки того, что ваш порт соответствует нашим рекомендациям. Программа package:ports-mgmt/portlint[] является частью Коллекции Портов. В частности, вы можете захотеть проверить, правильно ли сформирован файл crossref:porting-samplem[porting-samplem,Makefile] и соответствующим ли образом именован crossref:porting-pkgname[porting-pkgname,пакет].
+
+[IMPORTANT]
+====
+Не следуйте слепо выводу `portlint`. Это статический инструмент для проверки, и иногда он ошибается.
+====
[[porting-submitting]]
== Посылка нового порта
Перед посылкой нового порта прочитайте раздел о том, что crossref:porting-dads[porting-dads,можно и нельзя] делать.
-Когда вы наконец довольны своим первым портом, единственное, что осталось сделать, это включить его в основное дерево портов FreeBSD и осчастливить этим всех остальных. Нам не нужен ни каталог [.filename]#work#, ни пакет [.filename]#pkgname.tgz#, так что удалите их прямо сейчас.
+Когда вы наконец довольны своим первым портом, единственное, что осталось сделать, это включить его в основное дерево портов FreeBSD и осчастливить этим всех остальных.
+
+[IMPORTANT]
+====
+Нам не нужны каталог [.filename]#work# или пакет [.filename]#pkgname.txz#, поэтому их можно удалить.
+====
+
+Далее создайте файл man:patch[1]. Предположим, что порт называется `oneko` и находится в категории `games`.
+
+[[porting-submitting-diff]]
+.Создание [.filename]#.diff# для нового порта
+[example]
+====
+Добавьте все файлы с помощью `git add .`, затем просмотрите изменения с помощью `git diff`. Например:
+
+[source, shell]
+....
+% git add .
+% git diff --staged
+....
-Затем получите файл man:shar[1]. Предполагая, что порт называется oneko, перейдите в каталог выше, где находится каталог `oneko`, и наберите: `shar find oneko > oneko.shar`
+Убедитесь, что все необходимые файлы включены, затем зафиксируйте изменение в вашей локальной ветке и создайте патч с помощью `git format-patch`
+
+[source, shell]
+....
+% git commit
+% git format-patch origin/main
+....
-Включите [.filename]#oneko.shar# в сообщение об ошибке и пошлите его с помощью man:send-pr[1]. Обратитесь к разделу extref:{contributing}[Сообщения об ошибках и общие замечания, CONTRIB-GENERAL] для получения подробной информации о man:send-pr[1]).
+Патч, созданный с помощью `git format-patch`, будет содержать идентификатор автора и адреса электронной почты, что упрощает применение разработчиками (с помощью `git am`) и правильное указание авторства.
-Укажите в сообщении категорию `ports` и класс `change-request`. _Не_ указывайте, что сообщение имеет статус `confidential`! Добавьте краткое описание программы в поле "Description" отправляемого PR (например, содержимое `COMMENT` в сокращённом варианте) и сам файл в виде архива [.filename]#.shar# в поле "Fix".
+[IMPORTANT]
+****
+Чтобы упростить применение патча для коммиттеров в их рабочей копии дерева портов, пожалуйста, создайте файл [.filename]#.diff# из корня вашего дерева портов.
+****
+
+====
+
+Отправьте файл [.filename]#oneko.diff# через https://bugs.freebsd.org/submit/[форму отправки отчётов об ошибках]. Укажите продукт "Ports & Packages", компонент "Individual Port(s)" и следуйте приведённым там инструкциям. Добавьте краткое описание программы в поле Description PR (например, сокращённую версию `COMMENT`) и не забудьте прикрепить файл [.filename]#oneko.diff#.
[NOTE]
====
-Хорошее описание в заголовке сообщения о проблеме значительно облегчает работу коммиттеров портов. Для новых портов мы предпочитаем нечто вроде "New port: <категория>/<название порта> <краткое описание порта>". Следование этой схеме упрощает и ускоряет начало работы по добавлению нового порта.
+Хорошее описание в заголовке сообщения о проблеме значительно облегчает работу коммиттеров портов. Для новых портов мы предпочитаем нечто вроде "[NEW PORT] _категория/название_порта краткое описание порта_". Следование этой схеме упрощает и ускоряет начало работы по добавлению нового порта.
====
-Повторим ещё раз, что __не нужно включать ни оригинальный файл с дистрибутивом, ни каталог [.filename]#work#, ни пакет, построенный вами командой ``make package``__; для новых портов используйте man:shar[1], но не man:diff[1].
+После отправки порта, пожалуйста, потерпите. Время, необходимое для включения нового порта во FreeBSD, может занимать от нескольких дней до нескольких месяцев. https://bugs.freebsd.org/bugzilla/query.cgi[ Здесь] можно увидеть список ожидающих PR для портов.
-После отправки порта, пожалуйста, потерпите. Время, необходимое для включения нового порта во FreeBSD, может занимать от нескольких дней до нескольких месяцев. http://www.FreeBSD.org/cgi/query-pr-summary.cgi?category=ports[ Здесь] можно увидеть список ожидающих PR для портов.
+Чтобы получить список _открытых_ PR для портов, выберите _Open_ и _Ports & Packages_ в форме поиска, затем нажмите btn:[Search].
-После рассмотрения нового порта мы при необходимости вам ответим, а затем включим порт в наше дерево. Ваше имя также будет добавлено в список extref:{contributors}[Дополнительных контрибуторов проекта FreeBSD, contrib-additional] и другие файлы.
+После ознакомления с новым портом мы ответим, если это необходимо, и добавим его в дерево. Имя отправителя также будет добавлено в список extref:{contributors}[Дополнительных участников FreeBSD, contrib-additional] и другие файлы.
+
+[IMPORTANT]
+====
+Ранее можно было отправлять исправления для новых портов, используя файл man:shar[1]; однако с развитием man:git[1] это больше не актуально. Коммиттеры больше не принимают файлы man:shar[1], так как их использование чревато ошибками и не добавляет соответствующую запись в [.filename]#Makefile# категории.
+====
diff --git a/documentation/content/ru/books/porters-handbook/quick-porting/_index.po b/documentation/content/ru/books/porters-handbook/quick-porting/_index.po
new file mode 100644
index 0000000000..9900889410
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/quick-porting/_index.po
@@ -0,0 +1,767 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookquick-porting_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:1
+#, no-wrap
+msgid "How to quickly create a new FreeBSD Port"
+msgstr "Как быстро создать новый порт FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:1
+#, no-wrap
+msgid "Chapter 3. Quick Porting"
+msgstr "Глава 3. Быстрое портирование"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:14
+#, no-wrap
+msgid "Quick Porting"
+msgstr "Быстрое портирование"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:53
+msgid ""
+"This section describes how to quickly create a new port. For applications "
+"where this quick method is not adequate, the full \"Slow Porting\" process "
+"is described in crossref:slow-porting[slow-porting,Slow Porting]."
+msgstr ""
+"В этом разделе описано, как быстро создать новый порт. Для случаев, когда "
+"этот быстрый метод не подходит, полный процесс \"Медленного портирования\" "
+"описан в разделе crossref:slow-porting[slow-porting,Медленное портирование]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:55
+msgid ""
+"First, get the original tarball and put it into `DISTDIR`, which defaults to "
+"[.filename]#/usr/ports/distfiles#."
+msgstr ""
+"Во-первых, скачайте оригинальный tar-файл и поместите его в каталог "
+"`DISTDIR`, который по умолчанию есть не что иное, как [.filename]#/usr/ports/"
+"distfiles#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:61
+msgid ""
+"These steps assume that the software compiled out-of-the-box. In other "
+"words, absolutely no changes were required for the application to work on a "
+"FreeBSD system. If anything had to be changed, refer to crossref:slow-"
+"porting[slow-porting,Slow Porting]."
+msgstr ""
+"Здесь предполагается, что программное обеспечение компилируется без проблем "
+"как есть, то есть для работы приложения на вашей системе FreeBSD не "
+"потребовалось абсолютно никаких изменений. Если требовалось что-то изменить, "
+"то вам придется обратиться также и к следующему разделу — crossref:slow-"
+"porting[slow-porting,Медленное портирование]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:66
+msgid ""
+"It is recommended to set the `DEVELOPER` man:make[1] variable in "
+"[.filename]#/etc/make.conf# before getting into porting."
+msgstr ""
+"Перед началом портирования рекомендуется установить переменную man:make[1] "
+"`DEVELOPER` в [.filename]#/etc/make.conf#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:70
+#, no-wrap
+msgid "# echo DEVELOPER=yes >> /etc/make.conf\n"
+msgstr "# echo DEVELOPER=yes >> /etc/make.conf\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:73
+msgid ""
+"This setting enables the \"developer mode\" that displays deprecation "
+"warnings and activates some further quality checks on calling `make`."
+msgstr ""
+"Эта настройка включает \"режим разработчика\", в котором отображаются "
+"предупреждения при использовании устаревших конструкций и задействуются "
+"некоторые дополнительные проверки при вызове команды `make`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:76
+#, no-wrap
+msgid "Writing the Makefile"
+msgstr "Создание файла [.filename]#Makefile#"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:79
+msgid "The minimal [.filename]#Makefile# would look something like this:"
+msgstr "Минимальный [.filename]#Makefile# будет выглядеть примерно так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:86
+#, no-wrap
+msgid ""
+"PORTNAME=\toneko\n"
+"DISTVERSION=\t1.1b\n"
+"CATEGORIES=\tgames\n"
+"MASTER_SITES=\tftp://ftp.rediris.es/sites/ftp.freebsd.org/pub/FreeBSD/\n"
+msgstr ""
+"PORTNAME=\toneko\n"
+"DISTVERSION=\t1.1b\n"
+"CATEGORIES=\tgames\n"
+"MASTER_SITES=\tftp://ftp.rediris.es/sites/ftp.freebsd.org/pub/FreeBSD/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:90
+#, no-wrap
+msgid ""
+"MAINTAINER=\tyouremail@example.com\n"
+"COMMENT=\tCat chasing a mouse all over the screen\n"
+"WWW=\t\thttp://www.daidouji.com/oneko/\n"
+msgstr ""
+"MAINTAINER=\tyouremail@example.com\n"
+"COMMENT=\tCat chasing a mouse all over the screen\n"
+"WWW=\t\thttp://www.daidouji.com/oneko/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:92
+#, no-wrap
+msgid ".include <bsd.port.mk>\n"
+msgstr ".include <bsd.port.mk>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:96
+msgid ""
+"Try to figure it out. A more detailed example is shown in the "
+"crossref:porting-samplem[porting-samplem,sample Makefile] section."
+msgstr ""
+"Посмотрим, сможете ли вы его понять. Более подробный пример приведен в "
+"секции crossref:porting-samplem[porting-samplem,пример Makefile]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:98
+#, no-wrap
+msgid "Writing the Description Files"
+msgstr "Создание информационных файлов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:103
+msgid ""
+"There are two description files that are required for any port, whether they "
+"actually package or not. They are [.filename]#pkg-descr# and "
+"[.filename]#pkg-plist#. Their [.filename]#pkg-# prefix distinguishes them "
+"from other files."
+msgstr ""
+"Имеется два информационных файла, которые требуются для любого порта, вне "
+"зависимости от того, является ли он пакетом или нет. Это [.filename]#pkg-"
+"descr# и [.filename]#pkg-plist#. Префикс [.filename]#pkg-# отличает их от "
+"других файлов."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:105
+#, no-wrap
+msgid "[.filename]#pkg-descr#"
+msgstr "[.filename]#pkg-descr#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:109
+msgid ""
+"This is a longer description of the port. One to a few paragraphs concisely "
+"explaining what the port does is sufficient."
+msgstr ""
+"Это более подробное краткое описание порта. От одного до нескольких абзацев, "
+"кратко описывающих, что представляет собой порт, будет достаточно."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:116
+msgid ""
+"This is _not_ a manual or an in-depth description on how to use or compile "
+"the port! _Please be careful when copying from the [.filename]#README# or "
+"manpage_. Too often they are not a concise description of the port or are "
+"in an awkward format. For example, manpages have justified spacing, which "
+"looks particularly bad with monospaced fonts."
+msgstr ""
+"Это _не_ руководство и не подробное описание того, как использовать или "
+"компилировать порт! _Пожалуйста, будьте осторожны при копировании из "
+"[.filename]#README# или manpage_. Очень часто они не содержат краткого "
+"описания порта или имеют неудобный формат. Например, manpages используют "
+"выравнивание по ширине, что особенно плохо выглядит с моноширинными шрифтами."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:118
+msgid ""
+"On the other hand, the content of [.filename]#pkg-descr# must be longer than "
+"the crossref:makefiles[makefile-comment,`COMMENT` line from the Makefile]. "
+"It must explain in more depth what the port is all about."
+msgstr ""
+"С другой стороны, содержимое файла [.filename]#pkg-descr# должно быть "
+"длиннее, чем crossref:makefiles[makefile-comment,строка `COMMENT` из "
+"Makefile]. Оно должно более подробно объяснять, что собой представляет "
+"данный порт."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:122
+msgid ""
+"A well-written [.filename]#pkg-descr# describes the port completely enough "
+"that users would not have to consult the documentation or visit the website "
+"to understand what the software does, how it can be useful, or what "
+"particularly nice features it has. Mentioning certain requirements like a "
+"graphical toolkit, heavy dependencies, runtime environment, or "
+"implementation languages help users decide whether this port will work for "
+"them."
+msgstr ""
+"Хорошо составленный [.filename]#pkg-descr# описывает порт достаточно полно, "
+"чтобы пользователю не приходилось сверяться с документацией или посещать "
+"вебсайт для понимания того, что делает данное программное обеспечение, чем "
+"оно может быть полезно или какие хорошие функции у него имеются. Упоминание "
+"про определённые требования, такие как используемый графический "
+"инструментарий, тяжёлые зависимости, окружение для запуска или используемый "
+"язык программирования помогут пользователям определиться, будет ли этот порт "
+"для них работать."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:126
+msgid ""
+"The URL that used to be included as the last line of the [.filename]#pkg-"
+"descr# file has been moved to the [.filename]#Makefile#."
+msgstr ""
+"URL, который ранее включался в последнюю строку файла [.filename]#pkg-"
+"descr#, был перемещен в [.filename]#Makefile#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:129
+#, no-wrap
+msgid "[.filename]#pkg-plist#"
+msgstr "[.filename]#pkg-plist#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:134
+msgid ""
+"This file lists all the files installed by the port. It is also called the "
+"\"packing list\" because the package is generated by packing the files "
+"listed here. The pathnames are relative to the installation prefix (usually "
+"[.filename]#/usr/local#)."
+msgstr ""
+"Здесь перечисляются все файлы, устанавливаемые портом. Его также называют "
+"\"списком для упаковки\", потому что пакет генерируется упаковкой файлов, "
+"которые здесь указаны. Имена путей указываются относительно установочного "
+"префикса (обычно [.filename]#/usr/local#)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:136
+msgid "Here is a small example:"
+msgstr "Вот маленький пример:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:145
+#, no-wrap
+msgid ""
+"bin/oneko\n"
+"man/man1/oneko.1.gz\n"
+"lib/X11/app-defaults/Oneko\n"
+"lib/X11/oneko/cat1.xpm\n"
+"lib/X11/oneko/cat2.xpm\n"
+"lib/X11/oneko/mouse.xpm\n"
+msgstr ""
+"bin/oneko\n"
+"man/man1/oneko.1.gz\n"
+"lib/X11/app-defaults/Oneko\n"
+"lib/X11/oneko/cat1.xpm\n"
+"lib/X11/oneko/cat2.xpm\n"
+"lib/X11/oneko/mouse.xpm\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:148
+msgid ""
+"Refer to the man:pkg-create[8] manual page for details on the packing list."
+msgstr ""
+"Обратитесь к странице справочной системы по команде man:pkg-create[8] с "
+"подробным описанием формата списка упаковки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:155
+msgid ""
+"It is recommended to keep all the filenames in this file sorted "
+"alphabetically. It will make verifying changes when upgrading the port much "
+"easier. The sorting should be applied after variable expansion takes "
+"place. The framework does this correctly when the package list is "
+"crossref:plist[plist-autoplist,generated automatically]."
+msgstr ""
+"Рекомендуется, чтобы имена файлов в этом списке были отсортированы в "
+"алфавитном порядке. Это позволит значительно облегчить сверку изменений при "
+"обновлении порта. Фреймворк делает это корректно, когда список пакета "
+"crossref:plist[plist-autoplist,сгенерирован автоматически]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:161
+msgid ""
+"Creating a packing list manually can be a very tedious task. If the port "
+"installs a large numbers of files, crossref:plist[plist-autoplist,creating "
+"the packing list automatically] might save time."
+msgstr ""
+"Создание списка упаковки вручную может оказаться весьма трудоёмкой задачей. "
+"Если порт устанавливает большое количество файлов, раздел об "
+"crossref:plist[plist-autoplist,автоматическом построении списка упаковки] "
+"может помочь сэкономить время."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:166
+msgid ""
+"There is only one case when [.filename]#pkg-plist# can be omitted from a "
+"port. If the port installs just a handful of files, list them in "
+"`PLIST_FILES`, within the port's [.filename]#Makefile#. For instance, we "
+"could get along without [.filename]#pkg-plist# in the above "
+"[.filename]#oneko# port by adding these lines to the [.filename]#Makefile#:"
+msgstr ""
+"Существует только одно исключение, когда у порта может отсутствовать "
+"[.filename]#pkg-plist#. Если порт устанавливает лишь несколько файлов, а "
+"возможно, и каталогов, то они могут быть перечислены в переменных "
+"`PLIST_FILES` и `PLIST_DIRS`, соответственно, внутри файла "
+"[.filename]#Makefile# порта. К примеру, мы можем обойтись без файла "
+"[.filename]#pkg-plist# у приведённого выше порта [.filename]#oneko#, добавив "
+"следующие строки в [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:175
+#, no-wrap
+msgid ""
+"PLIST_FILES=\tbin/oneko \\\n"
+"\t\tman/man1/oneko.1.gz \\\n"
+"\t\tlib/X11/app-defaults/Oneko \\\n"
+"\t\tlib/X11/oneko/cat1.xpm \\\n"
+"\t\tlib/X11/oneko/cat2.xpm \\\n"
+"\t\tlib/X11/oneko/mouse.xpm\n"
+msgstr ""
+"PLIST_FILES=\tbin/oneko \\\n"
+"\t\tman/man1/oneko.1.gz \\\n"
+"\t\tlib/X11/app-defaults/Oneko \\\n"
+"\t\tlib/X11/oneko/cat1.xpm \\\n"
+"\t\tlib/X11/oneko/cat2.xpm \\\n"
+"\t\tlib/X11/oneko/mouse.xpm\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:182
+msgid ""
+"Usage of `PLIST_FILES` should not be abused. When looking for the origin of "
+"a file, people usually try to grep through the [.filename]#pkg-plist# files "
+"in the ports tree. Listing files in `PLIST_FILES` in the "
+"[.filename]#Makefile# makes that search more difficult."
+msgstr ""
+"Использование `PLIST_FILES` не должно быть чрезмерным. При поиске "
+"происхождения файла обычно просматривают файлы [.filename]#pkg-plist# в "
+"дереве портов с помощью grep. Указание файлов в `PLIST_FILES` в "
+"[.filename]#Makefile# усложняет этот поиск."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:187
+msgid ""
+"If a port needs to create an empty directory, or creates directories outside "
+"of [.filename]#${PREFIX}# during installation, refer to crossref:plist[plist-"
+"dir-cleaning,Cleaning Up Empty Directories] for more information."
+msgstr ""
+"Если порту требуется создать пустой каталог или он создает каталоги вне "
+"[.filename]#${PREFIX}# во время установки, обратитесь к разделу "
+"crossref:plist[plist-dir-cleaning,Очистка пустых каталогов] для получения "
+"дополнительной информации."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:193
+msgid ""
+"As `PLIST_FILES` is a man:make[1] variable, any entry with spaces must be "
+"quoted. For example, if using keywords described in man:pkg-create[8] and "
+"crossref:plist[plist-keywords,Expanding Package List with Keywords], the "
+"entry must be quoted."
+msgstr ""
+"Поскольку `PLIST_FILES` является переменной man:make[1], любая запись с "
+"пробелами должна быть заключена в кавычки. Например, при использовании "
+"ключевых слов, описанных в man:pkg-create[8] и crossref:plist[plist-"
+"keywords,Расширение списка пакетов с помощью ключевых слов], запись должна "
+"быть заключена в кавычки."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:197
+#, no-wrap
+msgid "PLIST_FILES=\t\"@sample ${ETCDIR}/oneko.conf.sample\"\n"
+msgstr "PLIST_FILES=\t\"@sample ${ETCDIR}/oneko.conf.sample\"\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:201
+msgid ""
+"Later we will see how [.filename]#pkg-plist# and `PLIST_FILES` can be used "
+"to fulfill crossref:plist[plist,more sophisticated tasks]."
+msgstr ""
+"Позже мы увидим, как [.filename]#pkg-plist# и `PLIST_FILES` могут "
+"использоваться для выполнения crossref:plist[plist,более сложных задач]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:203
+#, no-wrap
+msgid "Creating the Checksum File"
+msgstr "Создание файла с контрольной суммой"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:208
+msgid ""
+"Just type `make makesum`. The ports framework will automatically generate "
+"[.filename]#distinfo#. Do not try to generate the file manually."
+msgstr ""
+"Просто введите команду `make makesum`. Правила утилиты make автоматически "
+"сгенерируют файл [.filename]#distinfo#. Не пытайтесь создавать этот файл "
+"вручную."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:210
+#, no-wrap
+msgid "Testing the Port"
+msgstr "Тестирование порта"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:214
+msgid ""
+"Make sure that the port rules do exactly what is desired, including "
+"packaging up the port. These are the important points to verify:"
+msgstr ""
+"Вы должны удостовериться, что правила построения порта выполняют именно то, "
+"что вы хотите, включая создание пакета для порта. Вот те важные вещи, "
+"которые вы должны проверить:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:216
+msgid ""
+"[.filename]#pkg-plist# does not contain anything not installed by the port."
+msgstr ""
+"[.filename]#pkg-plist# не содержит ничего сверх того, что устанавливается "
+"портом."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:217
+msgid ""
+"[.filename]#pkg-plist# contains everything that is installed by the port."
+msgstr ""
+"[.filename]#pkg-plist# содержит абсолютно все, что устанавливается портом."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:218
+msgid ""
+"The port can be installed using the `install` target. This verifies that the "
+"install script works correctly."
+msgstr ""
+"Порт может быть установлен с помощью указания цели `install`. Это позволяет "
+"убедиться в правильной работе сценария установки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:219
+msgid ""
+"The port can be deinstalled properly using the `deinstall` target. This "
+"verifies that the deinstall script works correctly."
+msgstr ""
+"Порт может быть правильным образом удалён с помощью указания цели "
+"`deinstall`. Это позволяет убедиться в правильной работе сценария удаления."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:220
+msgid ""
+"The port only has access to network resources during the `fetch` target "
+"phase. This is important for package builders, such as package:ports-mgmt/"
+"poudriere[]."
+msgstr ""
+"Порт имеет доступ к сетевым ресурсам только во время фазы цели `fetch`. Это "
+"важно для сборщиков пакетов, таких как package:ports-mgmt/poudriere[]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:221
+msgid ""
+"Make sure that `make package` can be run as a normal user (that is, not as "
+"`root`). If that fails, the software may need to be patched. See also "
+"crossref:uses[uses-fakeroot,`fakeroot`] and crossref:uses[uses-"
+"uidfix,`uidfix`]."
+msgstr ""
+"Убедитесь, что команду `make package` можно выполнить от имени обычного "
+"пользователя (то есть не от `root`). Если это не работает, возможно, "
+"потребуется исправить программное обеспечение. См. также crossref:uses[uses-"
+"fakeroot,`fakeroot`] и crossref:uses[uses-uidfix,`uidfix`]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:223
+#, no-wrap
+msgid "Procedure: Recommended Test Ordering"
+msgstr "*Procedure: Рекомендуемый порядок проверки*"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:225
+msgid "`make stage`"
+msgstr "`make stage`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:226
+msgid "`make stage-qa`"
+msgstr "`make check-orphans`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:227
+msgid "`make package`"
+msgstr "`make package`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:228
+msgid "`make install`"
+msgstr "`make install`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:229
+msgid "`make deinstall`"
+msgstr "`make deinstall`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:230
+msgid "`make package` (as user)"
+msgstr "`make package` (как пользователь)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:232
+msgid "Make certain no warnings are shown in any of the stages."
+msgstr "Убедитесь, что на любом из этапов не выдается никаких предупреждений."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:235
+msgid ""
+"Thorough automated testing can be done with package:ports-mgmt/poudriere[] "
+"from the Ports Collection, see crossref:testing[testing-poudriere,poudriere] "
+"for more information. It maintains `jails` where all of the steps shown "
+"above can be tested without affecting the state of the host system."
+msgstr ""
+"Тщательное автоматизированное тестирование можно выполнить с помощью "
+"package:ports-mgmt/poudriere[] из коллекции портов, дополнительную "
+"информацию см. в crossref:testing[testing-poudriere,poudriere]. Он "
+"поддерживает `клетки`, в которых можно протестировать все указанные выше "
+"шаги без воздействия на состояние основной системы."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:237
+#, no-wrap
+msgid "Checking the Port with `portlint`"
+msgstr "Проверка вашего порта утилитой `portlint`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:242
+msgid ""
+"Please use `portlint` to see if the port conforms to our guidelines. The "
+"package:ports-mgmt/portlint[] program is part of the ports collection. In "
+"particular, check that the crossref:porting-samplem[porting-"
+"samplem,Makefile] is in the right shape and the crossref:porting-"
+"pkgname[porting-pkgname,package] is named appropriately."
+msgstr ""
+"Будьте добры, пользуйтесь утилитой `portlint` для проверки того, что ваш "
+"порт соответствует нашим рекомендациям. Программа package:ports-mgmt/"
+"portlint[] является частью Коллекции Портов. В частности, вы можете захотеть "
+"проверить, правильно ли сформирован файл crossref:porting-samplem[porting-"
+"samplem,Makefile] и соответствующим ли образом именован crossref:porting-"
+"pkgname[porting-pkgname,пакет]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:246
+msgid ""
+"Do not blindly follow the output of `portlint`. It is a static lint tool and "
+"sometimes gets things wrong."
+msgstr ""
+"Не следуйте слепо выводу `portlint`. Это статический инструмент для "
+"проверки, и иногда он ошибается."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:249
+#, no-wrap
+msgid "Submitting the New Port"
+msgstr "Посылка нового порта"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:252
+msgid ""
+"Before submitting the new port, read the crossref:porting-dads[porting-"
+"dads,DOs and DON'Ts] section."
+msgstr ""
+"Перед посылкой нового порта прочитайте раздел о том, что crossref:porting-"
+"dads[porting-dads,можно и нельзя] делать."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:254
+msgid ""
+"Once happy with the port, the only thing remaining is to put it in the main "
+"FreeBSD ports tree and make everybody else happy about it too."
+msgstr ""
+"Когда вы наконец довольны своим первым портом, единственное, что осталось "
+"сделать, это включить его в основное дерево портов FreeBSD и осчастливить "
+"этим всех остальных."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:258
+msgid ""
+"We do not need the [.filename]#work# directory or the "
+"[.filename]#pkgname.txz# package, so delete them now."
+msgstr ""
+"Нам не нужны каталог [.filename]#work# или пакет [.filename]#pkgname.txz#, "
+"поэтому их можно удалить."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:262
+msgid ""
+"Next, create a man:patch[1], file. Assuming the port is called `oneko` and "
+"is in the `games` category."
+msgstr ""
+"Далее создайте файл man:patch[1]. Предположим, что порт называется `oneko` и "
+"находится в категории `games`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:264
+#, no-wrap
+msgid "Creating a [.filename]#.diff# for a New Port"
+msgstr "Создание [.filename]#.diff# для нового порта"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:268
+msgid ""
+"Add all the files with `git add .`, then review the diff with `git diff`. "
+"For example:"
+msgstr ""
+"Добавьте все файлы с помощью `git add .`, затем просмотрите изменения с "
+"помощью `git diff`. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:273
+#, no-wrap
+msgid ""
+"% git add .\n"
+"% git diff --staged\n"
+msgstr ""
+"% git add .\n"
+"% git diff --staged\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:277
+msgid ""
+"Make sure that all required files are included, then commit the change to "
+"your local branch and generate a patch with `git format-patch`"
+msgstr ""
+"Убедитесь, что все необходимые файлы включены, затем зафиксируйте изменение "
+"в вашей локальной ветке и создайте патч с помощью `git format-patch`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:282
+#, no-wrap
+msgid ""
+"% git commit\n"
+"% git format-patch origin/main\n"
+msgstr ""
+"% git commit\n"
+"% git format-patch origin/main\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:286
+msgid ""
+"Patch generated with `git format-patch` will include author identity and "
+"email addresses, making it easier for developers to apply (with `git am`) "
+"and give proper credit."
+msgstr ""
+"Патч, созданный с помощью `git format-patch`, будет содержать идентификатор "
+"автора и адреса электронной почты, что упрощает применение разработчиками (с "
+"помощью `git am`) и правильное указание авторства."
+
+#. type: delimited block * 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:290
+msgid ""
+"To make it easier for committers to apply the patch on their working copy of "
+"the ports tree, please generate the [.filename]#.diff# from the base of your "
+"ports tree."
+msgstr ""
+"Чтобы упростить применение патча для коммиттеров в их рабочей копии дерева "
+"портов, пожалуйста, создайте файл [.filename]#.diff# из корня вашего дерева "
+"портов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:297
+msgid ""
+"Submit [.filename]#oneko.diff# with the https://bugs.freebsd.org/submit/[bug "
+"submission form]. Use product \"Ports & Packages\", component \"Individual "
+"Port(s)\", and follow the guidelines shown there. Add a short description "
+"of the program to the Description field of the PR (perhaps a short version "
+"of `COMMENT`), and remember to add [.filename]#oneko.diff# as an attachment."
+msgstr ""
+"Отправьте файл [.filename]#oneko.diff# через https://bugs.freebsd.org/submit/"
+"[форму отправки отчётов об ошибках]. Укажите продукт \"Ports & Packages\", "
+"компонент \"Individual Port(s)\" и следуйте приведённым там инструкциям. "
+"Добавьте краткое описание программы в поле Description PR (например, "
+"сокращённую версию `COMMENT`) и не забудьте прикрепить файл "
+"[.filename]#oneko.diff#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:303
+msgid ""
+"Giving a good description in the summary of the problem report makes the "
+"work of port committers and triagers a lot easier. The expected format for "
+"new ports is \"[NEW PORT] _category/portname short description of the "
+"port_\". Using this scheme makes it easier and faster to begin the work of "
+"committing the new port."
+msgstr ""
+"Хорошее описание в заголовке сообщения о проблеме значительно облегчает "
+"работу коммиттеров портов. Для новых портов мы предпочитаем нечто вроде "
+"\"[NEW PORT] _категория/название_порта краткое описание порта_\". Следование "
+"этой схеме упрощает и ускоряет начало работы по добавлению нового порта."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:308
+msgid ""
+"After submitting the port, please be patient. The time needed to include a "
+"new port in FreeBSD can vary from a few days to a few months. A simple "
+"search form of the Problem Report database can be searched at https://"
+"bugs.freebsd.org/bugzilla/query.cgi[]."
+msgstr ""
+"После отправки порта, пожалуйста, потерпите. Время, необходимое для "
+"включения нового порта во FreeBSD, может занимать от нескольких дней до "
+"нескольких месяцев. https://bugs.freebsd.org/bugzilla/query.cgi[ Здесь] "
+"можно увидеть список ожидающих PR для портов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:310
+msgid ""
+"To get a listing of _open_ port PRs, select _Open_ and _Ports & Packages_ in "
+"the search form, then click btn:[Search]."
+msgstr ""
+"Чтобы получить список _открытых_ PR для портов, выберите _Open_ и _Ports & "
+"Packages_ в форме поиска, затем нажмите btn:[Search]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:313
+msgid ""
+"After looking at the new port, we will reply if necessary, and commit it to "
+"the tree. The submitter's name will also be added to the list of extref:"
+"{contributors}[Additional FreeBSD Contributors, contrib-additional] and "
+"other files."
+msgstr ""
+"После ознакомления с новым портом мы ответим, если это необходимо, и добавим "
+"его в дерево. Имя отправителя также будет добавлено в список extref:"
+"{contributors}[Дополнительных участников FreeBSD, contrib-additional] и "
+"другие файлы."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/quick-porting/_index.adoc:318
+msgid ""
+"Previously it was possible to submit patches for new ports using a "
+"man:shar[1] file; this is no longer the case with the evolution of "
+"man:git[1]. Committers no longer accept man:shar[1] files as their use is "
+"prone to mistake and does not add the relevant entry in the category's "
+"[.filename]#Makefile#."
+msgstr ""
+"Ранее можно было отправлять исправления для новых портов, используя файл "
+"man:shar[1]; однако с развитием man:git[1] это больше не актуально. "
+"Коммиттеры больше не принимают файлы man:shar[1], так как их использование "
+"чревато ошибками и не добавляет соответствующую запись в "
+"[.filename]#Makefile# категории."
diff --git a/documentation/content/ru/books/porters-handbook/security/_index.adoc b/documentation/content/ru/books/porters-handbook/security/_index.adoc
index 6f75400cd0..77845b3b1c 100644
--- a/documentation/content/ru/books/porters-handbook/security/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/security/_index.adoc
@@ -1,22 +1,24 @@
---
-title: Глава 11. Безопасность портов
-prev: books/porters-handbook/upgrading
+description: 'Инструкции по безопасности при создании порта FreeBSD'
next: books/porters-handbook/porting-dads
-showBookMenu: true
-weight: 11
params:
- path: "/books/porters-handbook/security/"
+ path: /books/porters-handbook/security/
+prev: books/porters-handbook/upgrading
+showBookMenu: true
+tags: ["security", "porting", "ports", "VuXML"]
+title: 'Глава 12. Безопасность портов'
+weight: 12
---
[[security]]
-= Безопасность портов
+= Безопасность
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 11
+:sectnumoffset: 12
:partnums:
:source-highlighter: rouge
:experimental:
@@ -58,14 +60,14 @@ endif::[]
[[security-fix]]
== Исправление уязвимостей безопасности
-Что касается портов и пакетов, уязвимость безопасности изначально может появиться в исходном дистрибутиве или файлах порта. В первом случае, разработчик исходного программного обеспечения скорее всего сразу же выпустит патч или новую версию, и вам лишь понадобится сразу обновить порт в соответствии с исправлением автора. Если исправление по какой-то причине задерживается, вам следует либо <<dads-noinstall,пометить порт как `FORBIDDEN`>>, либо добавить в порт ваш собственный патч. В случае уязвимости порта просто исправьте этот порт как можно скорее. В любом случае нужно следовать <<port-upgrading,стандартной процедуре отправки вашего изменения>>, если вы не обладаете правами на коммит изменения непосредственно в дерево портов.
+Что касается портов и пакетов, уязвимость безопасности изначально может появиться в исходном дистрибутиве или файлах порта. В первом случае, разработчик исходного программного обеспечения скорее всего сразу же выпустит патч или новую версию, и вам лишь понадобится сразу обновить порт в соответствии с исправлением автора. Если исправление по какой-то причине задерживается, вам следует либо crossref:porting-dads[dads-noinstall,пометить порт как `FORBIDDEN`], либо добавить в порт ваш собственный патч. В случае уязвимости порта просто исправьте этот порт как можно скорее. В любом случае нужно следовать crossref:port-upgrading[port-upgrading,стандартной процедуре отправки вашего изменения], если вы не обладаете правами на коммит изменения непосредственно в дерево портов.
[IMPORTANT]
====
Быть коммиттером портов недостаточно для коммита произвольного порта. Помните, что обычно у портов есть сопровождающие, мнение которых вы должны учитывать.
====
-Пожалуйста, убедитесь, что ревизия порта после закрытия уязвимости увеличена. Вот как пользователи, обновляющие установленные пакеты на постоянной основе, увидят, что им нужно запустить обновление. Кроме того, новый пакет будет собран и распространен через FTP и WWW зеркала, замещая уязвимый. Если в процессе исправления уязвимости не было изменено значение `PORTVERSION`, то должно быть увеличено значение `PORTREVISION`. Вам следует увеличить значение `PORTREVISION` после добавления в порт файла с патчем, но не когда вы обновили порт до последней версии программного обеспечения, попутно затронув при этом `PORTVERSION`. За дальнейшей информацией обращайтесь к <<makefile-naming-revepoch,соответствующему разделу>>.
+Пожалуйста, убедитесь, что ревизия порта после закрытия уязвимости увеличена. Вот как пользователи, обновляющие установленные пакеты на постоянной основе, увидят, что им нужно запустить обновление. Кроме того, новый пакет будет собран и распространен через FTP и WWW зеркала, замещая уязвимый. Если в процессе исправления уязвимости не было изменено значение `PORTVERSION`, то должно быть увеличено значение `PORTREVISION`. Вам следует увеличить значение `PORTREVISION` после добавления в порт файла с патчем, но не когда вы обновили порт до последней версии программного обеспечения, попутно затронув при этом `PORTVERSION`. За дальнейшей информацией обращайтесь к crossref:makefiles[makefile-naming-revepoch,соответствующему разделу].
[[security-notify]]
== Обеспечение сообщества информацией
@@ -77,7 +79,7 @@ endif::[]
Учитывая огромное число портов в дереве, невозможно по каждому случаю выпускать бюллетень безопасности без создания флуда и потери внимания сообщества к моменту появления действительно серьезных причин. Поэтому уязвимости безопасности, обнаруженные в портах, записываются в http://vuxml.freebsd.org/[базу данных FreeBSD VuXML]. Члены Команды Офицеров Безопасности также отслеживают её на предмет появления вопросов, требующих их вмешательства.
-Если вы обладаете правами коммиттера, вы можете сам обновить базу данных VuXML. Так вы поможете Команде Офицеров Безопасности и своевременно пошлете ценную информацию сообществу. Тем не менее, если вы не являетесь коммиттером или верите, что нашли исключительно серьезную уязвимость, то не задумываясь свяжитесь с Командой Офицеров Безопасности напрямую как это описано на странице http://www.freebsd.org/security/#how[информационной безопасности FreeBSD].
+Если вы обладаете правами коммиттера, вы можете сам обновить базу данных VuXML. Так вы поможете Команде Офицеров Безопасности и своевременно пошлете ценную информацию сообществу. Тем не менее, если вы не являетесь коммиттером или верите, что нашли исключительно серьезную уязвимость, то не задумываясь свяжитесь с Командой Офицеров Безопасности напрямую как это описано на странице https://www.freebsd.org/security/#how[информационной безопасности FreeBSD].
База данных VuXML является документом XML. Его исходный файл [.filename]#vuln.xml# содержится прямо внутри порта package:security/vuxml[]. Следовательно, полное имя пути к файлу будет [.filename]#PORTSDIR/security/vuxml/vuln.xml#. Каждый раз, при обнаружении вами в порте уязвимости безопасности добавьте об этом запись в этот файл. Пока вы не знакомы с VuXML, лучшее, что вы можете сделать, это найти существующую запись, подпадающую под ваш случай, затем скопировать ее и использовать в качестве шаблона.
@@ -122,12 +124,8 @@ endif::[]
<references> <.>
<freebsdsa>SA-10:75.foo</freebsdsa> <.>
<freebsdpr>ports/987654</freebsdpr> <.>
- <cvename>CAN-2010-0201</cvename> <.>
- <cvename>CAN-2010-0466</cvename>
- <bid>96298</bid> <.>
- <certsa>CA-2010-99</certsa> <.>
+ <cvename>CVE-2023-48795</cvename> <.>
<certvu>740169</certvu> <.>
- <uscertsa>SA10-99A</uscertsa> <.>
<uscertta>SA10-99A</uscertta> <.>
<mlist msgid="201075606@hacker.com">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> <.>
<url>http://j.r.hacker.com/advisories/1</url> <.>
@@ -148,7 +146,9 @@ endif::[]
<.> Здесь перечислены имена затронутых пакетов. Может быть дано несколько имен, поскольку некоторые пакеты могут быть основаны на одном главном порте или программном продукте. Сюда можно включить стабильную ветвь и ветвь разработки, локализованные версии и подчиненные порты, зависящие от различного выбора важных вариантов конфигурации, указанных на этапе построения.
-<.> Здесь указаны затронутые версии пакета(-ов) как один или более диапазонов с использованием комбинации элементов `<lt>`, `<le>`, `<eq>`, `<ge>`, и `<gt>`. Диапазоны внесённых версий не должны пересекаться.В спецификации диапазонов `\*` (звёздочка) означает наименьший номер версии. В частности, `2.*` меньше, чем `2.a`. Поэтому звездочка может быть использована в диапазоне для совпадения со всеми возможными `alpha`, `beta` и `RC` версиями. Как вариант, `<ge>2.*</ge><lt>3.*</lt>` выборочно совпадет с версией `2.x`, а `<ge>2.0</ge><lt>3.0</lt>` - нет, поскольку последнее не включает `2.r3` и совпадает с `3.b`.Пример выше указывает, что к затронутым относятся версии с `1.6` до `1.9` включительно, версии `2.x` до `2.4_1` и версия `3.0b1`.
+<.> Затронутые версии пакета(ов) указаны там как один или несколько диапазонов с использованием комбинации элементов `<lt>`, `<le>`, `<eq>`, `<ge>` и `<gt>`. Убедитесь, что указанные диапазоны версий не перекрываются. +
+В спецификации диапазона `\*` (звёздочка) обозначает наименьший номер версии. В частности, `2.*` меньше, чем `2.a`. Таким образом, звёздочка может использоваться в диапазоне для соответствия всем возможным версиям `alpha`, `beta` и `RC`. Например, `<ge>2.*</ge><lt>3.*</lt>` выборочно соответствует каждой версии `2.x`, тогда как `<ge>2.0</ge><lt>3.0</lt>` — нет, поскольку последний пропускает `2.r3` и включает `3.b`. +
+Приведённый пример указывает, что затронуты версии `1.6` и выше, но не включая `1.9`, версии `2.x` до `2.4_1` и версия `3.0b1`.
<.> Некоторые связанные группы пакетов (в конечном счете, порты) могут быть указаны в разделе `<affected>`. Это можно использовать, если некоторые программные продукты (скажем, FooBar, FreeBar and OpenBar) являются производными от общей кодовой базы и всё еще совместно используют её ошибки и уязвимости. Имейте в виду отличие от перечисления множественных имён в одном разделе <package>.
@@ -158,112 +158,124 @@ endif::[]
<.> Этот раздел содержит ссылки на имеющие отношение документы. Приветствуется как можно большее количество ссылок.
-<.> Это http://www.freebsd.org/security/#adv[бюллетень безопасности FreeBSD].
+<.> Это https://www.freebsd.org/security/#adv[бюллетень безопасности FreeBSD].
-<.> Это http://www.freebsd.org/support/#gnats[сообщение об ошибке FreeBSD].
+<.> Это https://www.freebsd.org/support/[сообщение об ошибке FreeBSD].
-<.> Идентификатор http://www.cve.mitre.org/[MITRE CVE].
+<.> Идентификатор https://cve.mitre.org/[MITRE CVE].
-<.> Это http://www.securityfocus.com/bid[SecurityFocus Bug ID].
+<.> Это https://www.kb.cert.org/vuls/[SecurityFocus Bug ID].
-<.> Бюллетень безопасности http://www.cert.org/[US-CERT].
+<.> Бюллетень безопасности https://www.cisa.gov/news-events/cybersecurity-advisories[US-CERT].
-<.> Примечание к уязвимости http://www.cert.org/[US-CERT].
-
-<.> Уведомление системы Cyber Security Alert http://www.cert.org/[US-CERT].
+<.> URL к архивному сообщению в списке рассылки. Атрибут `msgid` является необязательным и может указывать на message ID сообщения.
-<.> Уведомление системы Technical Cyber Security Alert http://www.cert.org/[US-CERT].
+<.> Это общий URL. Используйте его только если ни одна из других категорий ссылок не подходит.
-<.> URL к архивному сообщению в списке рассылки. Атрибут `msgid` является необязательным и может указывать на message ID сообщения.
+<.> Это дата, когда проблема была раскрыта (_ГГГГ-ММ-ДД_).
-<.> Основной URL. Должен быть использован в случае, если не подходит ни одна из категорий источника.
+<.> Это дата добавления записи (_ГГГГ-ММ-ДД_).
-<.> Дата последнего изменения любой информации данной записи (_YYYY-MM-DD_). Новые записи не должны включать это поле. Поле должно быть добавлено после редактирования существующей записи.
+<.> Это дата, когда любая информация в записи была последний раз изменена (_ГГГГ-ММ-ДД_). Новые записи не должны включать это поле. Добавьте его при редактировании существующей записи.
[[security-notify-vuxml-testing]]
=== Тестирование ваших изменений в базе данных VuXML
-Предположим, что вы только что написали или заполнили запись об уязвимости в пакете `clamav`, которая была исправлена в версии `0.65_7`.
+Этот пример описывает новую запись об уязвимости в пакете `dropbear`, которая была исправлена в версии `dropbear-2013.59`.
-Прежде всего, вам нужно _установить_ последние версии портов package:ports-mgmt/portaudit[], package:ports-mgmt/portaudit-db[] и package:security/vuxml[].
+В качестве предварительного условия установите свежую версию порта package:security/vuxml[].
-[NOTE]
-====
-Для запуска `packaudit` вы должны обладать правами на запись в [.filename]#DATABASEDIR#; как правило, это [.filename]#/var/db/portaudit#.
+Сначала проверьте, есть ли уже запись об этой уязвимости. Если бы такая запись существовала, она соответствовала бы предыдущей версии пакета `2013.58`:
-Для использования другого каталога присвойте переменной окружения [.filename]#DATABASEDIR# другой путь.
-
-Если вы работаете в каталоге, отличном от [.filename]#${PORTSDIR}/security/vuxml#, присвойте переменной окружения [.filename]#VUXMLDIR# путь к каталогу, в котором находится [.filename]#vuln.xml#.
-====
+[source, shell]
+....
+% pkg audit dropbear-2013.58
+....
-Во-первых, проверьте, нет ли уже записи об этой уязвимости. Если такая запись есть, она совпадёт с предыдущей версией пакета `0.65_6`:
+Если запись не найдена, добавьте новую запись для этой уязвимости.
-[source,shell]
+[source, shell]
....
-% packaudit
-% portaudit clamav-0.65_6
+% cd ${PORTSDIR}/security/vuxml
+% make newentry
....
-Если ничего не найдено, значит вы получили зеленый свет для добавления новой записи для этой уязвимости.
+Если уязвимость имеет идентификатор https://cve.mitre.org/[MITRE CVE], можно использовать следующую команду:
-[source,shell]
+[source, shell]
....
% cd ${PORTSDIR}/security/vuxml
-% make newentry
+% make newentry CVE_ID=CVE-YYYY-XXXXX
....
-Когда вы закончите, проверьте синтаксис и форматирование.
+где `CVE-YYYYY-XXXX` является действительным идентификатором CVE.
-[source,shell]
+Если уязвимость относится к FreeBSD Security Advisory, вместо этого можно использовать следующую команду:
+
+[source, shell]
....
-% make validate
+% cd ${PORTSDIR}/security/vuxml
+% make newentry SA_ID=FreeBSD-SA-YY-XXXXXX.asc
....
-[NOTE]
-====
-Вам понадобится установить по крайней мере один из следующих пакетов: package:textproc/libxml2[], package:textproc/jade[].
-====
+где `FreeBSD-SA-YY-XXXXXX.asc` является опубликованным https://www.freebsd.org/security/advisories/[FreeBSD Security Advisory].
-Теперь выполните перепостроение базы данных `portaudit` из файла VuXML:
+Проверьте его синтаксис и форматирование:
-[source,shell]
+[source, shell]
....
-% packaudit
+% make validate
....
-Чтобы убедиться, что раздел `<affected>` в вашей записи совпадает с правильными пакетами, выполните следующую команду:
+Предыдущая команда создает файл [.filename]#vuln-flat.xml#. Его также можно создать с помощью:
-[source,shell]
+[source, shell]
....
-% portaudit -f /usr/ports/INDEX -r uuid
+% make vuln-flat.xml
....
[NOTE]
====
-Для лучшего понимания синтаксиса этой команды обращайтесь к man:portaudit[1].
+Должен быть установлен хотя бы один из следующих пакетов: package:textproc/libxml2[], package:textproc/jade[].
====
-Убедитесь, что ваша запись не производит ложных совпадений в выводе.
+Проверьте, что раздел `<affected>` записи соответствует правильным пакетам:
-Теперь проверьте, совпадает ли ваша запись с нужными версиями пакета:
-
-[source,shell]
+[source, shell]
+....
+% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58
....
-% portaudit clamav-0.65_6 clamav-0.65_7
-Affected package: clamav-0.65_6 (matched by clamav<0.65_7)
-Type of problem: clamav remote denial-of-service.
-Reference: <http://www.freebsd.org/ports/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html>
-1 problem(s) found.
+Убедитесь, что запись не создает ложных совпадений в выводе.
+
+Теперь проверьте, соответствуют ли записи правильные версии пакетов:
+
+[source, shell]
+....
+% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58 dropbear-2013.59
+dropbear-2012.58 is vulnerable:
+dropbear -- exposure of sensitive information, DoS
+CVE: CVE-2013-4434
+CVE: CVE-2013-4421
+WWW: https://portaudit.FreeBSD.org/8c9b48d1-3715-11e3-a624-00262d8b701d.html
+
+1 problem(s) in the installed packages found.
....
-Первая версия должна совпасть, а последняя нет.
+Предыдущая версия совпадает, а последняя — нет.
-В заключение проверьте, что веб-страница, сформированная из базы данных VuXML, выглядит как положено:
+[[security-xcheck-vuxml]]
+=== Контрольный список для новой записи в VuXML
-[source,shell]
+* Проверьте название порта. Иногда имя проекта в вышестоящем репозитории не полностью совпадает с именем порта.
+* Добавить все флейворы. Если у порта есть варианты, все имена пакетов должны быть добавлены в запись как `<package>`. Используйте следующий скрипт для генерации всех имен пакетов с вариантами:
++
+[source, shell]
....
-% mkdir -p ~/public_html/portaudit
-% packaudit
-% lynx ~/public_html/portaudit/74a9541d-5d6c-11d8-80e3-0020ed76ef5a.html
+% for flavor in $(make -V FLAVORS); do FLAVOR="${flavor}" make -VPKGNAME;done
....
++
+* Проверить, имеет ли порт `PORTEPOCH`. Приведённый выше фрагмент скрипта помогает в этом. Если порт использует `PORTEPOCH`, обязательно добавить его в тег `<range>`.
+* Перепроверьте диапазоны. В случае диапазонов, ограниченных с обеих сторон, убедитесь, что элементы `<ge>` и `<lt>` находятся внутри одного тега `<range>`. В противном случае запись может определить перекрывающийся диапазон.
+* Проверка производных версий. Если в вышестоящем проекте обнаружена уязвимость, проверьте, затронуты ли также производные или форки проекта, включённые в дерево портов. Например, если уязвимость обнаружена в package:www/firefox[], оцените, есть ли такая же уязвимость в производных, таких как package:www/librewolf[], package:www/waterfox[] или других подобных проектах. Включите все затронутые производные в запись VuXML, чтобы пользователи этих портов были проинформированы. Также проверьте наличие Linux-версий этого порта в дереве. Например, уязвимости в package:databases/sqlite3[] скорее всего затрагивают и пакеты вроде package:databases/linux-c7-sqlite3[].
+* Не делайте коммит записи, не запустив сначала `make validate`.
diff --git a/documentation/content/ru/books/porters-handbook/security/_index.po b/documentation/content/ru/books/porters-handbook/security/_index.po
new file mode 100644
index 0000000000..7d28e22d9c
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/security/_index.po
@@ -0,0 +1,858 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-08-20 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbooksecurity_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:1
+#, no-wrap
+msgid "Security instructions when making a FreeBSD Port"
+msgstr "Инструкции по безопасности при создании порта FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:1
+#, no-wrap
+msgid "Chapter 12. Security"
+msgstr "Глава 12. Безопасность портов"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:14
+#, no-wrap
+msgid "Security"
+msgstr "Безопасность"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:52
+#, no-wrap
+msgid "Why Security is So Important"
+msgstr "Почему безопасность так важна"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:58
+msgid ""
+"Bugs are occasionally introduced to the software. Arguably, the most "
+"dangerous of them are those opening security vulnerabilities. From the "
+"technical viewpoint, such vulnerabilities are to be closed by exterminating "
+"the bugs that caused them. However, the policies for handling mere bugs and "
+"security vulnerabilities are very different."
+msgstr ""
+"Ошибки в программном обеспечении появляются случайно. Возможно, самые "
+"опасные из них те, что создают уязвимости безопасности. С технической точки "
+"зрения подобные уязвимости должны быть закрыты путем исправления вызывающих "
+"их ошибок. Тем не менее, политики обработки несущественных ошибок и "
+"уязвимостей очень различаются."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:64
+msgid ""
+"A typical small bug affects only those users who have enabled some "
+"combination of options triggering the bug. The developer will eventually "
+"release a patch followed by a new version of the software, free of the bug, "
+"but the majority of users will not take the trouble of upgrading immediately "
+"because the bug has never vexed them. A critical bug that may cause data "
+"loss represents a graver issue. Nevertheless, prudent users know that a lot "
+"of possible accidents, besides software bugs, are likely to lead to data "
+"loss, and so they make backups of important data; in addition, a critical "
+"bug will be discovered really soon."
+msgstr ""
+"Обычная небольшая ошибка затрагивает только тех пользователей, которые "
+"задействуют некоторые комбинации настроек, активирующие эту ошибку. "
+"Разработчик в конечном счете выпустит патч, а зачтем новую версию "
+"программного обеспечения, свободного от ошибки, но большинство пользователей "
+"не посчитают нужным сразу же произвести обновление, поскольку эта ошибка "
+"никогда у них не проявлялась. Критическая ошибка, которая может приводить к "
+"потере данных, представляет серьезную проблему. Тем не менее, "
+"предусмотрительные пользователи знают, что большинство возможных "
+"происшествий, и среди них программные ошибки, скорее всего приводят к потере "
+"данных, поэтому они выполняют резервное копирование важных данных; "
+"дополнительно, критическая ошибка будет обнаружена очень скоро."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:72
+msgid ""
+"A security vulnerability is all different. First, it may remain unnoticed "
+"for years because often it does not cause software malfunction. Second, a "
+"malicious party can use it to gain unauthorized access to a vulnerable "
+"system, to destroy or alter sensitive data; and in the worst case the user "
+"will not even notice the harm caused. Third, exposing a vulnerable system "
+"often assists attackers to break into other systems that could not be "
+"compromised otherwise. Therefore closing a vulnerability alone is not "
+"enough: notify the audience of it in the most clear and comprehensive "
+"manner, which will allow them to evaluate the danger and take appropriate "
+"action."
+msgstr ""
+"С уязвимостью безопасности всё иначе. Во-первых, она может сохраняться "
+"необнаруженной целые годы, потому что чаще всего не вызывает ошибок в "
+"работе. Во-вторых, компания злоумышленников может использовать ее для "
+"получения неавторизованного доступа к уязвимой системе, уничтожить или "
+"подменить важные данные; в худшем случае пользователь даже не заметит "
+"нанесенный урон. В-третьих, взлом уязвимой системы часто упрощает задачу "
+"проникновения атакующих в другие системы, которые не могут быть "
+"скомпрометированы иначе. Таким образом, устранение уязвимости как таковой "
+"недостаточно: следует разослать всем заинтересованным уведомления в наиболее "
+"понятной и исчерпывающей форме, что позволит оценить риск и предпринять "
+"подходящие меры."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:74
+#, no-wrap
+msgid "Fixing Security Vulnerabilities"
+msgstr "Исправление уязвимостей безопасности"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:82
+msgid ""
+"While on the subject of ports and packages, a security vulnerability may "
+"initially appear in the original distribution or in the port files. In the "
+"former case, the original software developer is likely to release a patch or "
+"a new version instantly. Update the port promptly with respect to the "
+"author's fix. If the fix is delayed for some reason, either "
+"crossref:porting-dads[dads-noinstall,mark the port as `FORBIDDEN`] or "
+"introduce a patch file to the port. In the case of a vulnerable port, just "
+"fix the port as soon as possible. In either case, follow crossref:port-"
+"upgrading[port-upgrading,the standard procedure for submitting changes] "
+"unless having rights to commit it directly to the ports tree."
+msgstr ""
+"Что касается портов и пакетов, уязвимость безопасности изначально может "
+"появиться в исходном дистрибутиве или файлах порта. В первом случае, "
+"разработчик исходного программного обеспечения скорее всего сразу же "
+"выпустит патч или новую версию, и вам лишь понадобится сразу обновить порт в "
+"соответствии с исправлением автора. Если исправление по какой-то причине "
+"задерживается, вам следует либо crossref:porting-dads[dads-"
+"noinstall,пометить порт как `FORBIDDEN`], либо добавить в порт ваш "
+"собственный патч. В случае уязвимости порта просто исправьте этот порт как "
+"можно скорее. В любом случае нужно следовать crossref:port-upgrading[port-"
+"upgrading,стандартной процедуре отправки вашего изменения], если вы не "
+"обладаете правами на коммит изменения непосредственно в дерево портов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:87
+msgid ""
+"Being a ports committer is not enough to commit to an arbitrary port. "
+"Remember that ports usually have maintainers, must be respected."
+msgstr ""
+"Быть коммиттером портов недостаточно для коммита произвольного порта. "
+"Помните, что обычно у портов есть сопровождающие, мнение которых вы должны "
+"учитывать."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:95
+msgid ""
+"Please make sure that the port's revision is bumped as soon as the "
+"vulnerability has been closed. That is how the users who upgrade installed "
+"packages on a regular basis will see they need to run an update. Besides, a "
+"new package will be built and distributed over FTP and WWW mirrors, "
+"replacing the vulnerable one. Bump `PORTREVISION` unless `DISTVERSION` has "
+"changed in the course of correcting the vulnerability. That is, bump "
+"`PORTREVISION` if adding a patch file to the port, but do not bump it if "
+"updating the port to the latest software version and thus already touched "
+"`DISTVERSION`. Please refer to the crossref:makefiles[makefile-naming-"
+"revepoch,corresponding section] for more information."
+msgstr ""
+"Пожалуйста, убедитесь, что ревизия порта после закрытия уязвимости "
+"увеличена. Вот как пользователи, обновляющие установленные пакеты на "
+"постоянной основе, увидят, что им нужно запустить обновление. Кроме того, "
+"новый пакет будет собран и распространен через FTP и WWW зеркала, замещая "
+"уязвимый. Если в процессе исправления уязвимости не было изменено значение "
+"`PORTVERSION`, то должно быть увеличено значение `PORTREVISION`. Вам следует "
+"увеличить значение `PORTREVISION` после добавления в порт файла с патчем, но "
+"не когда вы обновили порт до последней версии программного обеспечения, "
+"попутно затронув при этом `PORTVERSION`. За дальнейшей информацией "
+"обращайтесь к crossref:makefiles[makefile-naming-revepoch,соответствующему "
+"разделу]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:97
+#, no-wrap
+msgid "Keeping the Community Informed"
+msgstr "Обеспечение сообщества информацией"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:100
+#, no-wrap
+msgid "The VuXML Database"
+msgstr "База данных VuXML"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:108
+msgid ""
+"A very important and urgent step to take as early after a security "
+"vulnerability is discovered as possible is to notify the community of port "
+"users about the jeopardy. Such notification serves two purposes. First, if "
+"the danger is really severe it will be wise to apply an instant workaround. "
+"For example, stop the affected network service or even deinstall the port "
+"completely until the vulnerability is closed. Second, a lot of users tend "
+"to upgrade installed packages only occasionally. They will know from the "
+"notification that they _must_ update the package without delay as soon as a "
+"corrected version is available."
+msgstr ""
+"Очень важным и первостепенным шагом при действии как можно раньше после "
+"раскрытия уязвимости является уведомление сообщества пользователей порта об "
+"опасности. Такие уведомления служат двум целям. Во-первых, в случае "
+"действительно серьезной угрозы, будет посоветовано применить мгновенное "
+"воздействие. Например, остановить затрагиваемый сетевой сервис или даже "
+"удалить порт целиком, пока уязвимость не будет устранена. Во-вторых, масса "
+"пользователей имеет тенденцию обновлять установленные пакеты только от "
+"случая к случаю. Из уведомления они узнают, что _должны_ обновить пакет без "
+"промедления сразу же после появления исправленной версии."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:112
+msgid ""
+"Given the huge number of ports in the tree, a security advisory cannot be "
+"issued on each incident without creating a flood and losing the attention of "
+"the audience when it comes to really serious matters. Therefore security "
+"vulnerabilities found in ports are recorded in https://vuxml.freebsd.org/"
+"[the FreeBSD VuXML database]. The Security Officer Team members also "
+"monitor it for issues requiring their intervention."
+msgstr ""
+"Учитывая огромное число портов в дереве, невозможно по каждому случаю "
+"выпускать бюллетень безопасности без создания флуда и потери внимания "
+"сообщества к моменту появления действительно серьезных причин. Поэтому "
+"уязвимости безопасности, обнаруженные в портах, записываются в http://"
+"vuxml.freebsd.org/[базу данных FreeBSD VuXML]. Члены Команды Офицеров "
+"Безопасности также отслеживают её на предмет появления вопросов, требующих "
+"их вмешательства."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:115
+msgid ""
+"Committers can update the VuXML database themselves, assisting the Security "
+"Officer Team and delivering crucial information to the community more "
+"quickly. Those who are not committers or have discovered an exceptionally "
+"severe vulnerability should not hesitate to contact the Security Officer "
+"Team directly, as described on the https://www.freebsd.org/security/"
+"#how[FreeBSD Security Information] page."
+msgstr ""
+"Если вы обладаете правами коммиттера, вы можете сам обновить базу данных "
+"VuXML. Так вы поможете Команде Офицеров Безопасности и своевременно пошлете "
+"ценную информацию сообществу. Тем не менее, если вы не являетесь коммиттером "
+"или верите, что нашли исключительно серьезную уязвимость, то не задумываясь "
+"свяжитесь с Командой Офицеров Безопасности напрямую как это описано на "
+"странице https://www.freebsd.org/security/#how[информационной безопасности "
+"FreeBSD]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:121
+msgid ""
+"The VuXML database is an XML document. Its source file "
+"[.filename]#vuln.xml# is kept right inside the port package:security/"
+"vuxml[]. Therefore the file's full pathname will be [.filename]#PORTSDIR/"
+"security/vuxml/vuln.xml#. Each time a security vulnerability is discovered "
+"in a port, please add an entry for it to that file. Until familiar with "
+"VuXML, the best thing to do is to find an existing entry fitting the case at "
+"hand, then copy it and use it as a template."
+msgstr ""
+"База данных VuXML является документом XML. Его исходный файл "
+"[.filename]#vuln.xml# содержится прямо внутри порта package:security/"
+"vuxml[]. Следовательно, полное имя пути к файлу будет [.filename]#PORTSDIR/"
+"security/vuxml/vuln.xml#. Каждый раз, при обнаружении вами в порте "
+"уязвимости безопасности добавьте об этом запись в этот файл. Пока вы не "
+"знакомы с VuXML, лучшее, что вы можете сделать, это найти существующую "
+"запись, подпадающую под ваш случай, затем скопировать ее и использовать в "
+"качестве шаблона."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:123
+#, no-wrap
+msgid "A Short Introduction to VuXML"
+msgstr "Короткое вступление в VuXML"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:135
+msgid ""
+"The full-blown XML format is complex, and far beyond the scope of this "
+"book. However, to gain basic insight on the structure of a VuXML entry only "
+"the notion of tags is needed. XML tag names are enclosed in angle "
+"brackets. Each opening <tag> must have a matching closing </tag>. Tags may "
+"be nested. If nesting, the inner tags must be closed before the outer ones. "
+"There is a hierarchy of tags, that is, more complex rules of nesting them. "
+"This is similar to HTML. The major difference is that XML is "
+"e__X__tensible, that is, based on defining custom tags. Due to its "
+"intrinsic structure XML puts otherwise amorphous data into shape. VuXML is "
+"particularly tailored to mark up descriptions of security vulnerabilities."
+msgstr ""
+"В совокупности XML является очень сложным форматом, и его описание выходит "
+"далеко за рамки этой книги. Тем не менее, для достижения основного понимания "
+"структуры записи VuXML вам понадобится всего лишь понять теги. Имена тегов "
+"XML обрамляются в угловые скобки. Каждый открывающий <tag> должен иметь "
+"совпадающий закрывающий </tag>. Теги могут быть вложенными. При вложенности "
+"внутренние теги должны быть закрыты до закрытия внешних. Существует иерархия "
+"тегов, т.е. более сложные правила вкладывания тегов. Это похоже на HTML. "
+"Основное отличие в расширяемости XML, т.е. в определении собственных тегов. "
+"Из-за своей характерной структуры XML придает форму разрозненным данным. В "
+"частности, XML подходит для разметки описаний уязвимостей безопасности."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:137
+msgid "Now consider a realistic VuXML entry:"
+msgstr "Теперь рассмотрим настоящую запись VuXML:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:184
+#, no-wrap
+msgid ""
+"<vuln vid=\"f4bc80f4-da62-11d8-90ea-0004ac98a7b9\"> <.>\n"
+" <topic>Several vulnerabilities found in Foo</topic> <.>\n"
+" <affects>\n"
+" <package>\n"
+" <name>foo</name> <.>\n"
+" <name>foo-devel</name>\n"
+" <name>ja-foo</name>\n"
+" <range><ge>1.6</ge><lt>1.9</lt></range> <.>\n"
+" <range><ge>2.*</ge><lt>2.4_1</lt></range>\n"
+" <range><eq>3.0b1</eq></range>\n"
+" </package>\n"
+" <package>\n"
+" <name>openfoo</name> <.>\n"
+" <range><lt>1.10_7</lt></range> <.>\n"
+" <range><ge>1.2,1</ge><lt>1.3_1,1</lt></range>\n"
+" </package>\n"
+" </affects>\n"
+" <description>\n"
+" <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+" <p>J. Random Hacker reports:</p> <.>\n"
+" <blockquote\n"
+" cite=\"http://j.r.hacker.com/advisories/1\">\n"
+" <p>Several issues in the Foo software may be exploited\n"
+" via carefully crafted QUUX requests. These requests will\n"
+" permit the injection of Bar code, mumble theft, and the\n"
+" readability of the Foo administrator account.</p>\n"
+" </blockquote>\n"
+" </body>\n"
+" </description>\n"
+" <references> <.>\n"
+" <freebsdsa>SA-10:75.foo</freebsdsa> <.>\n"
+" <freebsdpr>ports/987654</freebsdpr> <.>\n"
+" <cvename>CVE-2023-48795</cvename> <.>\n"
+" <certvu>740169</certvu> <.>\n"
+" <uscertta>SA10-99A</uscertta> <.>\n"
+" <mlist msgid=\"201075606@hacker.com\">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> <.>\n"
+" <url>http://j.r.hacker.com/advisories/1</url> <.>\n"
+" </references>\n"
+" <dates>\n"
+" <discovery>2010-05-25</discovery> <.>\n"
+" <entry>2010-07-13</entry> <.>\n"
+" <modified>2010-09-17</modified> <.>\n"
+" </dates>\n"
+"</vuln>\n"
+msgstr ""
+"<vuln vid=\"f4bc80f4-da62-11d8-90ea-0004ac98a7b9\"> <.>\n"
+" <topic>Several vulnerabilities found in Foo</topic> <.>\n"
+" <affects>\n"
+" <package>\n"
+" <name>foo</name> <.>\n"
+" <name>foo-devel</name>\n"
+" <name>ja-foo</name>\n"
+" <range><ge>1.6</ge><lt>1.9</lt></range> <.>\n"
+" <range><ge>2.*</ge><lt>2.4_1</lt></range>\n"
+" <range><eq>3.0b1</eq></range>\n"
+" </package>\n"
+" <package>\n"
+" <name>openfoo</name> <.>\n"
+" <range><lt>1.10_7</lt></range> <.>\n"
+" <range><ge>1.2,1</ge><lt>1.3_1,1</lt></range>\n"
+" </package>\n"
+" </affects>\n"
+" <description>\n"
+" <body xmlns=\"http://www.w3.org/1999/xhtml\">\n"
+" <p>J. Random Hacker reports:</p> <.>\n"
+" <blockquote\n"
+" cite=\"http://j.r.hacker.com/advisories/1\">\n"
+" <p>Several issues in the Foo software may be exploited\n"
+" via carefully crafted QUUX requests. These requests will\n"
+" permit the injection of Bar code, mumble theft, and the\n"
+" readability of the Foo administrator account.</p>\n"
+" </blockquote>\n"
+" </body>\n"
+" </description>\n"
+" <references> <.>\n"
+" <freebsdsa>SA-10:75.foo</freebsdsa> <.>\n"
+" <freebsdpr>ports/987654</freebsdpr> <.>\n"
+" <cvename>CVE-2023-48795</cvename> <.>\n"
+" <certvu>740169</certvu> <.>\n"
+" <uscertta>SA10-99A</uscertta> <.>\n"
+" <mlist msgid=\"201075606@hacker.com\">http://marc.theaimsgroup.com/?l=bugtraq&amp;m=203886607825605</mlist> <.>\n"
+" <url>http://j.r.hacker.com/advisories/1</url> <.>\n"
+" </references>\n"
+" <dates>\n"
+" <discovery>2010-05-25</discovery> <.>\n"
+" <entry>2010-07-13</entry> <.>\n"
+" <modified>2010-09-17</modified> <.>\n"
+" </dates>\n"
+"</vuln>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:187
+msgid ""
+"The tag names are supposed to be self-explanatory so we shall take a closer "
+"look only at fields which needs to be filled in:"
+msgstr ""
+"Имена тегов должны быть самодокументируемыми, чтобы мы сфокусировались "
+"только на полях, нужных нам для заполнения:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:190
+msgid ""
+"This is the top-level tag of a VuXML entry. It has a mandatory attribute, "
+"`vid`, specifying a universally unique identifier (UUID) for this entry (in "
+"quotes). Generate a UUID for each new VuXML entry (and do not forget to "
+"substitute it for the template UUID unless writing the entry from scratch). "
+"Use man:uuidgen[1] to generate a VuXML UUID."
+msgstr ""
+"Это тег верхнего уровня записи VuXML. У него есть обязательный атрибут "
+"`vid`, указывающий на универсальный уникальный идентификатор (UUID) для этой "
+"записи (в кавычках). Вы должны формировать UUID для каждой новой записи "
+"VuXML (и не забудьте заменить ее для шаблона UUID, если вы не пишете запись "
+"с нуля). Для получения VuXML UUID вы можете использовать man:uuidgen[1]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:192
+msgid "This is a one-line description of the issue found."
+msgstr "Однострочное описание найденной проблемы."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:194
+msgid ""
+"The names of packages affected are listed there. Multiple names can be given "
+"since several packages may be based on a single master port or software "
+"product. This may include stable and development branches, localized "
+"versions, and slave ports featuring different choices of important build-"
+"time configuration options."
+msgstr ""
+"Здесь перечислены имена затронутых пакетов. Может быть дано несколько имен, "
+"поскольку некоторые пакеты могут быть основаны на одном главном порте или "
+"программном продукте. Сюда можно включить стабильную ветвь и ветвь "
+"разработки, локализованные версии и подчиненные порты, зависящие от "
+"различного выбора важных вариантов конфигурации, указанных на этапе "
+"построения."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:198
+#, no-wrap
+msgid ""
+"Affected versions of the package(s) are specified there as one or more ranges using a combination of `<lt>`, `<le>`, `<eq>`, `<ge>`, and `<gt>` elements. Check that the version ranges given do not overlap.\n"
+"In a range specification, `\\*` (asterisk) denotes the smallest version number. In particular, `2.*` is less than `2.a`. Therefore an asterisk may be used for a range to match all possible `alpha`, `beta`, and `RC` versions. For instance, `<ge>2.*</ge><lt>3.*</lt>` will selectively match every `2.x` version while `<ge>2.0</ge><lt>3.0</lt>` will not since the latter misses `2.r3` and matches `3.b`.\n"
+"The above example specifies that affected are versions `1.6` and up to but not including `1.9`, versions `2.x` before `2.4_1`, and version `3.0b1`."
+msgstr ""
+"Затронутые версии пакета(ов) указаны там как один или несколько диапазонов с использованием комбинации элементов `<lt>`, `<le>`, `<eq>`, `<ge>` и `<gt>`. Убедитесь, что указанные диапазоны версий не перекрываются.\n"
+"В спецификации диапазона `\\*` (звёздочка) обозначает наименьший номер версии. В частности, `2.*` меньше, чем `2.a`. Таким образом, звёздочка может использоваться в диапазоне для соответствия всем возможным версиям `alpha`, `beta` и `RC`. Например, `<ge>2.*</ge><lt>3.*</lt>` выборочно соответствует каждой версии `2.x`, тогда как `<ge>2.0</ge><lt>3.0</lt>` — нет, поскольку последний пропускает `2.r3` и включает `3.b`.\n"
+"Приведённый пример указывает, что затронуты версии `1.6` и выше, но не включая `1.9`, версии `2.x` до `2.4_1` и версия `3.0b1`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:200
+msgid ""
+"Several related package groups (essentially, ports) can be listed in the "
+"`<affected>` section. This can be used if several software products (say "
+"FooBar, FreeBar and OpenBar) grow from the same code base and still share "
+"its bugs and vulnerabilities. Note the difference from listing multiple "
+"names within a single <package> section."
+msgstr ""
+"Некоторые связанные группы пакетов (в конечном счете, порты) могут быть "
+"указаны в разделе `<affected>`. Это можно использовать, если некоторые "
+"программные продукты (скажем, FooBar, FreeBar and OpenBar) являются "
+"производными от общей кодовой базы и всё еще совместно используют её ошибки "
+"и уязвимости. Имейте в виду отличие от перечисления множественных имён в "
+"одном разделе <package>."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:202
+msgid ""
+"The version ranges have to allow for `PORTEPOCH` and `PORTREVISION` if "
+"applicable. Please remember that according to the collation rules, a version "
+"with a non-zero `PORTEPOCH` is greater than any version without `PORTEPOCH`, "
+"for example, `3.0,1` is greater than `3.1` or even than `8.9`."
+msgstr ""
+"Диапазоны версий должны учитывать `PORTEPOCH` и `PORTREVISION`, если это "
+"применимо. Пожалуйста, помните, что в соответствии с правилами сравнения "
+"строк версия с ненулевым значением `PORTEPOCH` выше, чем любая версия без "
+"`PORTEPOCH`, например, `3.0,1` выше, чем `3.1` или даже `8.9`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:204
+msgid ""
+"This is a summary of the issue. XHTML is used in this field. At least "
+"enclosing `<p>` and `</p>` has to appear. More complex mark-up may be used, "
+"but only for the sake of accuracy and clarity: No eye candy please."
+msgstr ""
+"Сводная информация о проблеме. В этом поле используется XHTML. По крайней "
+"мере, должны быть обрамляющие `<p>` и `</p>`. Может быть использована более "
+"сложная разметка, но только в целях аккуратности и ясности: без эстетства, "
+"пожалуйста."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:206
+msgid ""
+"This section contains references to relevant documents. As many references "
+"as apply are encouraged."
+msgstr ""
+"Этот раздел содержит ссылки на имеющие отношение документы. Приветствуется "
+"как можно большее количество ссылок."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:208
+msgid ""
+"This is a https://www.freebsd.org/security/#adv[FreeBSD security advisory]."
+msgstr ""
+"Это https://www.freebsd.org/security/#adv[бюллетень безопасности FreeBSD]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:210
+msgid "This is a https://www.freebsd.org/support/[FreeBSD problem report]."
+msgstr "Это https://www.freebsd.org/support/[сообщение об ошибке FreeBSD]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:212
+msgid "This is a https://cve.mitre.org/[MITRE CVE] identifier."
+msgstr "Идентификатор https://cve.mitre.org/[MITRE CVE]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:214
+msgid "This is a https://www.kb.cert.org/vuls/[US-CERT] vulnerability note."
+msgstr "Это https://www.kb.cert.org/vuls/[SecurityFocus Bug ID]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:216
+msgid ""
+"This is a https://www.cisa.gov/news-events/cybersecurity-advisories[US-CERT] "
+"Technical Cyber Security Alert."
+msgstr ""
+"Бюллетень безопасности https://www.cisa.gov/news-events/cybersecurity-"
+"advisories[US-CERT]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:218
+msgid ""
+"This is a URL to an archived posting in a mailing list. The attribute "
+"`msgid` is optional and may specify the message ID of the posting."
+msgstr ""
+"URL к архивному сообщению в списке рассылки. Атрибут `msgid` является "
+"необязательным и может указывать на message ID сообщения."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:220
+msgid ""
+"This is a generic URL. Only it if none of the other reference categories "
+"apply."
+msgstr ""
+"Это общий URL. Используйте его только если ни одна из других категорий "
+"ссылок не подходит."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:222
+msgid "This is the date when the issue was disclosed (_YYYY-MM-DD_)."
+msgstr "Это дата, когда проблема была раскрыта (_ГГГГ-ММ-ДД_)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:224
+msgid "This is the date when the entry was added (_YYYY-MM-DD_)."
+msgstr "Это дата добавления записи (_ГГГГ-ММ-ДД_)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:226
+msgid ""
+"This is the date when any information in the entry was last modified (_YYYY-"
+"MM-DD_). New entries must not include this field. Add it when editing an "
+"existing entry."
+msgstr ""
+"Это дата, когда любая информация в записи была последний раз изменена (_ГГГГ-"
+"ММ-ДД_). Новые записи не должны включать это поле. Добавьте его при "
+"редактировании существующей записи."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:228
+#, no-wrap
+msgid "Testing Changes to the VuXML Database"
+msgstr "Тестирование ваших изменений в базе данных VuXML"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:231
+msgid ""
+"This example describes a new entry for a vulnerability in the package "
+"`dropbear` that has been fixed in version `dropbear-2013.59`."
+msgstr ""
+"Этот пример описывает новую запись об уязвимости в пакете `dropbear`, "
+"которая была исправлена в версии `dropbear-2013.59`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:233
+msgid ""
+"As a prerequisite, install a fresh version of package:security/vuxml[] port."
+msgstr ""
+"В качестве предварительного условия установите свежую версию порта "
+"package:security/vuxml[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:236
+msgid ""
+"First, check whether there already is an entry for this vulnerability. If "
+"there were such an entry, it would match the previous version of the "
+"package, `2013.58`:"
+msgstr ""
+"Сначала проверьте, есть ли уже запись об этой уязвимости. Если бы такая "
+"запись существовала, она соответствовала бы предыдущей версии пакета "
+"`2013.58`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:240
+#, no-wrap
+msgid "% pkg audit dropbear-2013.58\n"
+msgstr "% pkg audit dropbear-2013.58\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:243
+msgid "If there is none found, add a new entry for this vulnerability."
+msgstr "Если запись не найдена, добавьте новую запись для этой уязвимости."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:248
+#, no-wrap
+msgid ""
+"% cd ${PORTSDIR}/security/vuxml\n"
+"% make newentry\n"
+msgstr ""
+"% cd ${PORTSDIR}/security/vuxml\n"
+"% make newentry\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:252
+msgid ""
+"If the vulnerability has a https://cve.mitre.org/[MITRE CVE] identifier, the "
+"following command can be used instead:"
+msgstr ""
+"Если уязвимость имеет идентификатор https://cve.mitre.org/[MITRE CVE], можно "
+"использовать следующую команду:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:257
+#, no-wrap
+msgid ""
+"% cd ${PORTSDIR}/security/vuxml\n"
+"% make newentry CVE_ID=CVE-YYYY-XXXXX\n"
+msgstr ""
+"% cd ${PORTSDIR}/security/vuxml\n"
+"% make newentry CVE_ID=CVE-YYYY-XXXXX\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:260
+msgid "where `CVE-YYYYY-XXXX` is a valid CVE identifier."
+msgstr "где `CVE-YYYYY-XXXX` является действительным идентификатором CVE."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:263
+msgid ""
+"If the vulnerability is a FreeBSD Security Advisory, the following command "
+"can be used instead:"
+msgstr ""
+"Если уязвимость относится к FreeBSD Security Advisory, вместо этого можно "
+"использовать следующую команду:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:268
+#, no-wrap
+msgid ""
+"% cd ${PORTSDIR}/security/vuxml\n"
+"% make newentry SA_ID=FreeBSD-SA-YY-XXXXXX.asc\n"
+msgstr ""
+"% cd ${PORTSDIR}/security/vuxml\n"
+"% make newentry SA_ID=FreeBSD-SA-YY-XXXXXX.asc\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:271
+msgid ""
+"where `FreeBSD-SA-YY-XXXXXX.asc` is a published https://www.freebsd.org/"
+"security/advisories/[FreeBSD Security Advisory]."
+msgstr ""
+"где `FreeBSD-SA-YY-XXXXXX.asc` является опубликованным https://"
+"www.freebsd.org/security/advisories/[FreeBSD Security Advisory]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:273
+msgid "Verify its syntax and formatting:"
+msgstr "Проверьте его синтаксис и форматирование:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:277
+#, no-wrap
+msgid "% make validate\n"
+msgstr "% make validate\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:282
+msgid ""
+"The previous command generates the [.filename]#vuln-flat.xml# file. It can "
+"also be generated with:"
+msgstr ""
+"Предыдущая команда создает файл [.filename]#vuln-flat.xml#. Его также можно "
+"создать с помощью:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:286
+#, no-wrap
+msgid "% make vuln-flat.xml\n"
+msgstr "% make vuln-flat.xml\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:291
+msgid ""
+"At least one of these packages needs to be installed: package:textproc/"
+"libxml2[], package:textproc/jade[]."
+msgstr ""
+"Должен быть установлен хотя бы один из следующих пакетов: package:textproc/"
+"libxml2[], package:textproc/jade[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:294
+msgid ""
+"Verify that the `<affected>` section of the entry will match the correct "
+"packages:"
+msgstr ""
+"Проверьте, что раздел `<affected>` записи соответствует правильным пакетам:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:298
+#, no-wrap
+msgid "% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58\n"
+msgstr "% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:301
+msgid "Make sure that the entry produces no spurious matches in the output."
+msgstr "Убедитесь, что запись не создает ложных совпадений в выводе."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:303
+msgid "Now check whether the right package versions are matched by the entry:"
+msgstr "Теперь проверьте, соответствуют ли записи правильные версии пакетов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:312
+#, no-wrap
+msgid ""
+"% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58 dropbear-2013.59\n"
+"dropbear-2012.58 is vulnerable:\n"
+"dropbear -- exposure of sensitive information, DoS\n"
+"CVE: CVE-2013-4434\n"
+"CVE: CVE-2013-4421\n"
+"WWW: https://portaudit.FreeBSD.org/8c9b48d1-3715-11e3-a624-00262d8b701d.html\n"
+msgstr ""
+"% pkg audit -f ${PORTSDIR}/security/vuxml/vuln-flat.xml dropbear-2013.58 dropbear-2013.59\n"
+"dropbear-2012.58 is vulnerable:\n"
+"dropbear -- exposure of sensitive information, DoS\n"
+"CVE: CVE-2013-4434\n"
+"CVE: CVE-2013-4421\n"
+"WWW: https://portaudit.FreeBSD.org/8c9b48d1-3715-11e3-a624-00262d8b701d.html\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:314
+#, no-wrap
+msgid "1 problem(s) in the installed packages found.\n"
+msgstr "1 problem(s) in the installed packages found.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:317
+msgid "The former version matches while the latter one does not."
+msgstr "Предыдущая версия совпадает, а последняя — нет."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:319
+#, no-wrap
+msgid "VuXML new entry checklist"
+msgstr "Контрольный список для новой записи в VuXML"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:323
+msgid ""
+"Check the name of the port. Sometimes the upstream project name is not "
+"exactly the same as the port name."
+msgstr ""
+"Проверьте название порта. Иногда имя проекта в вышестоящем репозитории не "
+"полностью совпадает с именем порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:327
+msgid ""
+"Add all flavors. When a port has flavors all the package names need to be "
+"added as a `<package>` in the entry. Use the following script to generate "
+"all flavored package names:"
+msgstr ""
+"Добавить все флейворы. Если у порта есть варианты, все имена пакетов должны "
+"быть добавлены в запись как `<package>`. Используйте следующий скрипт для "
+"генерации всех имен пакетов с вариантами:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:331
+#, no-wrap
+msgid "% for flavor in $(make -V FLAVORS); do FLAVOR=\"${flavor}\" make -VPKGNAME;done\n"
+msgstr "% for flavor in $(make -V FLAVORS); do FLAVOR=\"${flavor}\" make -VPKGNAME;done\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:336
+msgid ""
+"Check if the port has `PORTEPOCH`. The above script snippet helps with "
+"that. If the port uses `PORTEPOCH` it is mandatory to add it to the "
+"`<range>` tag."
+msgstr ""
+"Проверить, имеет ли порт `PORTEPOCH`. Приведённый выше фрагмент скрипта "
+"помогает в этом. Если порт использует `PORTEPOCH`, обязательно добавить его "
+"в тег `<range>`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:340
+msgid ""
+"Double check ranges. In the case of ranges limited on both sides, make sure "
+"that the `<ge>` and `<lt>` elements are inside the same `<range>` tag. "
+"Otherwise the entry might end up defining an overlapping range."
+msgstr ""
+"Перепроверьте диапазоны. В случае диапазонов, ограниченных с обеих сторон, "
+"убедитесь, что элементы `<ge>` и `<lt>` находятся внутри одного тега "
+"`<range>`. В противном случае запись может определить перекрывающийся "
+"диапазон."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:349
+msgid ""
+"Cross-check derivatives. Check whether derivatives or forks of the project "
+"included in the ports tree are also affected. For example, if a "
+"vulnerability is discovered in package:www/firefox[], assess whether "
+"derivatives like package:www/librewolf[], package:www/waterfox[] or other "
+"similar projects share the same vulnerability. Include all affected "
+"derivatives in the VuXML entry, ensuring that users of these ports are "
+"informed. Also check if there are Linux versions of the same port in the "
+"tree. For instance, package:databases/sqlite3[] vulnerabilities most likely "
+"affect packages like package:databases/linux-c7-sqlite3[] too."
+msgstr ""
+"Проверка производных версий. Если в вышестоящем проекте обнаружена "
+"уязвимость, проверьте, затронуты ли также производные или форки проекта, "
+"включённые в дерево портов. Например, если уязвимость обнаружена в "
+"package:www/firefox[], оцените, есть ли такая же уязвимость в производных, "
+"таких как package:www/librewolf[], package:www/waterfox[] или других "
+"подобных проектах. Включите все затронутые производные в запись VuXML, чтобы "
+"пользователи этих портов были проинформированы. Также проверьте наличие "
+"Linux-версий этого порта в дереве. Например, уязвимости в package:databases/"
+"sqlite3[] скорее всего затрагивают и пакеты вроде package:databases/linux-c7-"
+"sqlite3[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/security/_index.adoc:349
+msgid "Do not commit an entry without running `make validate` first."
+msgstr "Не делайте коммит записи, не запустив сначала `make validate`."
+
+#, no-wrap
+#~ msgid "Cross-checking Derivatives"
+#~ msgstr "Перекрестная проверка производных"
diff --git a/documentation/content/ru/books/porters-handbook/slow-porting/_index.adoc b/documentation/content/ru/books/porters-handbook/slow-porting/_index.adoc
index 59e22915d2..a71f5e642d 100644
--- a/documentation/content/ru/books/porters-handbook/slow-porting/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/slow-porting/_index.adoc
@@ -1,11 +1,13 @@
---
-title: Глава 4. Медленное портирование
-prev: books/porters-handbook/quick-porting
+description: 'Описание создания порта FreeBSD, когда программа требует некоторых изменений'
next: books/porters-handbook/makefiles
+params:
+ path: /books/porters-handbook/slow-porting/
+prev: books/porters-handbook/quick-porting
showBookMenu: true
+tags: ["porting", "ports", "slow porting", "guide"]
+title: 'Глава 4. Медленное портирование'
weight: 4
-params:
- path: "/books/porters-handbook/slow-porting/"
---
[[slow-porting]]
@@ -51,23 +53,22 @@ endif::[]
[[slow-work]]
== Как всё это работает
-Во-первых, когда пользователь дает в своем каталоге с портом команду `make`, происходит целая череда событий. Во время чтения этого текста может оказаться полезным иметь файл [.filename]#bsd.port.mk# открытым в другом окне, что сильно поможет в их понимании.
+Во-первых, когда пользователь дает в своем каталоге с портом команду `make`, происходит целая череда событий. Во время чтения этого текста может оказаться полезным иметь файл [.filename]#bsd.port.mk# открытым в другом окне, что сильно поможет его понять.
-Но не волнуйтесь сильно, если вы не до конца понимаете, что делается в [.filename]#bsd.port.mk#, не так уж много людей его понимает... _:->_
+Но не волнуйтесь сильно, если вы не до конца понимаете, что делается в [.filename]#bsd.port.mk#, не так уж много людей его понимает... _:-)_
[.procedure]
-====
. Запускается цель `fetch`. Цель `fetch` отвечает за то, что архив исходных текстов имеется в наличии локально в каталоге `DISTDIR`. Если цель `fetch` не может найти требуемые файлы в каталоге `DISTDIR`, то они будут искаться по указателю URL `MASTER_SITES`, который устанавливается в Makefile, а также на наших FTP зеркалах, куда мы по возможности помещаем дистрибутивные файлы для архива. Затем она попытается сгрузить указанный файл с помощью `FETCH`, полагая, что запрашивающая машина имеет прямое подключение к Интернет. Если файл скачается удачно, то он будет помещен в каталог `DISTDIR` для последующего использования и обработки.
. Выполняется цель `extract`. Она ищет дистрибутивный файл порта (как правило, tar-архив `gzip`) в каталоге `DISTDIR` и распаковывает его во временный каталог, задаваемый переменной `WRKDIR` (по умолчанию [.filename]#work#).
. Выполняется цель `patch`. Во-первых, применяются все патчи, заданные переменной `PATCHFILES`. Во-вторых, если какие-либо файлы с патчами, носящие имена [.filename]#patch-*#, имеются в подкаталоге `PATCHDIR` (по умолчанию это каталог [.filename]#files#), то они применяются в этот момент в алфавитном порядке.
. Запускается цель `configure`. Здесь может выполняться любая из многих различных вещей.
-.. Если существует скрипт [.filename]#scripts/configure#, то он запускается.
-.. Если задана переменная `HAS_CONFIGURE` или `GNU_CONFIGURE`, то запускается скрипт [.filename]#WRKSRC/configure#.
+.. Если он существует, запускается [.filename]#scripts/configure#.
+.. Если установлены `HAS_CONFIGURE` или `GNU_CONFIGURE`, запускается [.filename]#WRKSRC/configure#.
. Выполняется цель `build`. Она отвечает за переход в собственный рабочий каталог порта (`WRKSRC`) и его построение.
. Выполняется цель `stage`. Конечный набор построенных файлов помещается во временный каталог (`STAGEDIR`, смотрите crossref:special[staging,Staging]). Иерархия этого каталога отражает иерархию каталогов системы, в которую данный пакет будет устанавливаться.
-. Выполняется цель `install`. В систему копируются файлы, перечисленные в pkg-plist порта.
-====
+. Выполняется цель `package`. При этом создается пакет с использованием файлов из временного каталога, созданного во время выполнения цели `stage`, и файла [.filename]#pkg-plist# порта.
+. Выполняется цель `install`. Это устанавливает пакет, созданный во время цели `package`, в хост-систему.
Выше перечислены стандартные действия. Кроме того, вы сами можете определить цели `pre-_что-то_` или `post-_что-то_`, или создать скрипты с такими именами в подкаталоге [.filename]#scripts#, и они будут запущены до или после выполнения действий по умолчанию.
@@ -87,15 +88,15 @@ endif::[]
Получите оригинальные исходные тексты (обычно) в виде упакованного tar-архива ([.filename]#foo.tar.gz# или [.filename]#foo.tar.bz2#) и скопируйте его в каталог `DISTDIR`. Всегда используйте исходные тексты _основной ветки разработки_ везде, где это возможно.
-Вам потребуется задать значение переменной `MASTER_SITES` так, чтобы оно указывало на местоположение оригинального tar-архива. В файле [.filename]#bsd.sites.mk# вы найдёте краткие обозначения для большинства популярных сайтов. Пожалуйста, используйте эти сайты-и соответствующие определения-везде, где это возможно, чтобы избежать проблем повторения одной и той же информации в базе источников. Так как эти сайты со временем меняются, для всех причастных поддержка становится настоящим кошмаром.
+Вам потребуется задать значение переменной `MASTER_SITES` так, чтобы оно указывало на местоположение оригинального tar-архива. В файле [.filename]#bsd.sites.mk# вы найдёте краткие обозначения для большинства популярных сайтов. Пожалуйста, используйте эти сайты-и соответствующие определения-везде, где это возможно, чтобы избежать проблем повторения одной и той же информации в базе источников. Так как эти сайты со временем меняются, для всех причастных поддержка становится настоящим кошмаром. Для подробностей смотрите crossref:makefiles[makefile-master_sites,`MASTER_SITES`].
Если вы не можете найти FTP/HTTP сайт с хорошим подключением к сети, или находите только сайты, которые имеют раздражающе нестандартные форматы, то можете захотеть поместить копию на надежный сервер FTP или HTTP, который вам доступен (например, ваша домашняя страница).
-Если вы не можете найти доступного и надёжного места для помещения дистрибутивного файла, то мы сами сможем разместить его на сервере `ftp.FreeBSD.org`; однако это наименее рекомендуемое решение. Дистрибутивный файл должен быть помещён в каталог [.filename]#~/public_distfiles/# одного из пользователей машины `freefall`. Попросите того, кто коммиттил ваш порт, сделать это. Этот человек также задаст переменной `MASTER_SITES` значение `MASTER_SITE_LOCAL`, а в переменной `MASTER_SITE_SUBDIR` укажет своё имя пользователя с машины `freefall`.
+Если вы не можете найти доступного и надёжного места для помещения дистрибутивного файла, то мы сами сможем разместить его на сервере `ftp.FreeBSD.org`; однако это наименее рекомендуемое решение. Дистрибутивный файл должен быть помещён в каталог [.filename]#~/public_distfiles/# одного из пользователей машины `freefall`. Попросите того, кто коммиттил ваш порт, сделать это. Этот человек также задаст переменной `MASTER_SITES` значение `MASTER_SITE_LOCAL`, а в переменной `MASTER_SITE_SUBDIR` укажет логин кластера FreeBSD.
Если дистрибутивные файлы вашего порта постоянно меняются по неизвестным причинам без изменения версий со стороны автора, остаётся только поместить дистрибутив на вашу домашнюю Web-страницу и указать её первой в списке `MASTER_SITES`. Если можете, попытайтесь договориться с автором порта об этом; это действительно помогает в достижении некоторого управления исходным кодом. Размещение собственной версии поможет избежать появления ошибок у пользователей типа `checksum mismatch`, а также уменьшит нагрузку на людей, сопровождающих наш FTP-сервер. Также, если у порта имеется только один основной сервер, то рекомендуется поместить архивную копию на свой сайт и указать его в списке `MASTER_SITES` вторым.
-Если вашему порту требуются дополнительные `патчи`, доступные в Интернет, скачайте также и их, поместив в каталог `DISTDIR`. Не волнуйтесь, если они находятся не на том же сайте, откуда взят дистрибутивный архив, мы умеем обрабатывать такие ситуации (смотрите описание <<porting-patchfiles,PATCHFILES>> ниже).
+Если вашему порту требуются дополнительные `патчи`, доступные в Интернет, скачайте также и их, поместив в каталог `DISTDIR`. Не волнуйтесь, если они находятся не на том же сайте, откуда взят дистрибутивный архив, мы умеем обрабатывать такие ситуации (смотрите описание crossref:makefiles[porting-patchfiles,PATCHFILES] ниже).
[[slow-modifying]]
== Модификация порта
@@ -110,61 +111,86 @@ endif::[]
====
[[slow-patch]]
-== Создание патчей
+== Работа с патчами
Файлы, которые добавлялись или изменялись в процессе создания порта, могут быть выявлены программой man:diff[1], а результат работы этой программы может быть в дальнейшем передан программе man:patch[1]. Такое действие с обычным файлом подразумевает сохранение копии файла с первоначальным содержимым перед внесением каких-либо изменений.
-[source,shell]
+[source, shell]
....
% cp file file.orig
....
Патчи сохраняются в виде файлов с именем [.filename]#patch-*#, где _*_ обозначает путь к файлу, к которому применяется патч, такой как [.filename]#patch-Imakefile# или [.filename]#patch-src-config.h#.
-После того как файл был изменён, используется man:diff[1] для получения разницы между первоначальной и изменённой версиями. Параметр `-u` указывает man:diff[1] выводить разницу в "унифицированном" формате, который также является предпочтительным.
+[TIP]
+====
+Используйте `BINARY_ALIAS` для замены жёстко заданных команд во время сборки и избежания исправлений в файлах сборки. Подробнее см. в crossref:makefiles[binary-alias,Использование `BINARY_ALIAS` для переименования команд вместо исправления сборки].
+====
+
+[[slow-patch-rules]]
+=== Общие правила для установки патчей
-[source,shell]
+Файлы патчей хранятся в `PATCHDIR`, обычно это [.filename]#files/#, откуда они будут автоматически применены. Все исправления должны быть относительны к `WRKSRC`. Обычно `WRKSRC` является подкаталогом `WRKDIR`, каталога, в котором распаковывается distfile. Используйте `make -V WRKSRC` для просмотра фактического пути. Имена файлов патчей должны соответствовать следующим правилам:
+
+* Избегайте ситуации, когда несколько патчей изменяют один и тот же файл. Например, если и [.filename]#patch-foobar.c#, и [.filename]#patch-foobar.c2# вносят изменения в [.filename]#${WRKSRC}/foobar.c#, это делает их хрупкими и затрудняет отладку.
+* При создании имен для файлов исправлений заменяйте каждое подчеркивание (`\_`) на два подчеркивания (`\__`) и каждый слэш (`/`) на одно подчеркивание (`_`). Например, чтобы исправить файл с именем [.filename]#src/freeglut_joystick.c#, назовите соответствующий исправление [.filename]#patch-src_freeglut__joystick.c#. Не называйте исправления как [.filename]#patch-aa# или [.filename]#patch-ab#. Всегда используйте путь и имя файла в названиях исправлений. Использование `make makepatch` автоматически генерирует правильные имена.
+* Патч может изменять несколько файлов, если изменения связаны между собой и патч назван соответствующим образом. Например, [.filename]#patch-add-missing-stdlib.h#.
+* Используйте только символы `[-+.\_a-zA-Z0-9]` для именования патчей. В частности, __не используйте `::` как разделитель путей,__ вместо этого используйте `_`.
+
+Минимизируйте количество нефункциональных изменений пробелов в патчах. В мире открытого исходного кода распространена практика, когда проекты используют обширные части кодовой базы, но следуют разным правилам стиля и отступов. При переносе работоспособного функционала из одного проекта для исправления аналогичных участков в другом будьте внимательны: итоговый патч может быть переполнен нефункциональными изменениями. Это не только увеличивает размер репозитория портов, но и затрудняет понимание того, что именно вызвало проблему и какие изменения были внесены.
+
+Если файл необходимо удалить, сделайте это в цели `post-extract`, а не как часть исправления.
+
+[[slow-patch-manual]]
+=== Ручное создание патчей
+
+[NOTE]
+====
+Ручное создание патчей обычно не требуется. Предпочтительным методом является автоматическая генерация патчей, как описано ранее в этом разделе. Однако иногда может потребоваться ручное исправление.
+====
+
+Патчи сохраняются в файлы с именами [.filename]#patch-*#, где * указывает на путь к файлу, который патчится, например [.filename]#patch-Imakefile# или [.filename]#patch-src-config.h#. Патчи с именами файлов, не начинающимися с [.filename]#patch-#, не будут применены автоматически.
+
+После изменения файла используется man:diff[1] для записи различий между оригинальной и изменённой версиями. `-u` заставляет man:diff[1] выводить различия файлов в "унифицированном" формате (unified diffs), которые являются предпочтительным форматом.
+
+[source, shell]
....
% diff -u file.orig file > patch-pathname-file
....
Для порождении патчей для новых добавляемых файлов используется параметр `-N`, который заставляет man:diff[1] трактовать несуществующие прежде файлы как если бы они существовали, но имели пустое содержимое:
-[source,shell]
+[source, shell]
....
% diff -u -N newfile.orig newfile > patch-pathname-newfile
....
-Файлы с патчами помещаются в каталоге `PATCHDIR` (как правило, это [.filename]#files/#), откуда они будут взяты автоматически. Все патчи обязаны быть сделаны относительно каталога `WRKSRC` (как правило, это каталог, в который распаковывается исходный архив и где будет выполняться построение). Для упрощения внесения изменений и обновлений избегайте наличия более чем одного патча для одного и того же файла (например, патчей [.filename]#patch-file# и [.filename]#patch-file2#, оба меняющих файл [.filename]#WRKSRC/foobar.c#). Обратите внимание, что если путь к изменяемому файлу содержит символ подчеркивания (`_`), то патч должен содержать в своем имени два подчеркивания вместо одного. Например, для применения патча на файл с именем [.filename]#src/freeglut_joystick.c# соответствующий патч следует назвать [.filename]#patch-src-freeglut__joystick.c#.
-
-Пожалуйста, используйте для именования патчей только символы `[-+._a-zA-Z0-9]`. Не используйте любые другие символы, кроме этих. Не называйте патчи как [.filename]#patch-aa# или [.filename]#patch-ab#, всегда ссылайтесь на путь и название файла в названиях самих патчей.
-
-Существует альтернативный упрощённый способ создания патчей для существующих файлов. Первые шаги те же самые: создание копии неизменённого файла с расширением [.filename]#.orig# и внесение изменений. После этого используйте `make makepatch`, чтобы обновить файлы с патчами в каталоге [.filename]#files# данного порта.
-
-Не помещайте строки RCS в патчи. Subversion будет изменять их при помещении файлов в дерево портов, и когда мы будем их оттуда извлекать, они будут уже другие, поэтому применение патчей окончится неудачей. Строчки RCS предваряются знаком доллара (`$`), и обычно начинаются с `$Id` или `$RCS`.
-
-Использование параметра рекурсии (`-r`) с командой man:diff[1] для генерации патчей - это хорошо, но всё же, пожалуйста, смотрите на получающиеся патчи, чтобы убедиться в отсутствии ненужного мусора. В частности, diff-разниц между двумя резервными копиями файлов, файлы [.filename]#Makefile#, когда как порт использует `Imake` или GNU-версию программы `configure`, и так далее, не нужны, и должны быть удалены. Если было необходимо отредактировать файл [.filename]#configure.in# и запустить `autoconf` для перегенерации `configure`, не нужно включать файлы diff для `configure` (они частенько вырастают до нескольких тысяч строк!). Вместо этого задайте `USE_AUTOTOOLS=autoconf:261` и включите diff-файл для [.filename]#configure.in#.
-
-Старайтесь минимизировать в патчах объём нефункциональных изменений с пустыми символами. В мире Открытого Исходного Кода является распространенным совместное использование проектами больших объемов кодовой базы, но с различными стилями и правилами отступов. При копировании работающей функциональной части из одного проекта для исправления похожей области в другом, будьте аккуратны, пожалуйста: получаемый однострочный патч может указаться полон нефункциональных изменений. Это не только увеличивает размер репозитория Subversion, но также усложняет поиск того, что конкретно вызвало проблему и что вообще поменялось.
+Использование опции рекурсии (`-r`) в man:diff[1] для создания патчей допустимо, но пожалуйста, проверяйте полученные патчи, чтобы убедиться в отсутствии ненужных данных. В частности, различия между резервными файлами, [.filename]##Makefile##, когда порт использует `Imake` или GNU `configure`, и т.д., являются избыточными и должны быть удалены. Если потребовалось отредактировать [.filename]#configure.in# и запустить `autoconf` для перегенерации `configure`, не включайте различия в `configure` (его объем часто достигает нескольких тысяч строк!). Вместо этого определите `USES=autoreconf` и возьмите различия для [.filename]#configure.in#.
-Если нужно удалить файл, сделайте это при выполнении цели `post-extract`, вместо того чтобы оформлять это как часть патча.
+[[slow-patch-automatic-replacements]]
+=== Простая автоматическая замена
-Простые перемещения могут быть выполнены непосредственно из [.filename]#Makefile# порта с использованием man:sed[1] в режиме in-place. Это удобно, когда при изменении используется значение переменной:
+Простые замены могут быть выполнены напрямую из [.filename]#Makefile# порта, используя режим редактирования на месте утилиты man:sed[1]. Это полезно, когда изменения используют значение переменной:
[.programlisting]
....
post-patch:
- @${REINPLACE_CMD} -e 's|for Linux|for FreeBSD|g' ${WRKSRC}/README
+ @${REINPLACE_CMD} -e 's|/usr/local|${PREFIX}|g' ${WRKSRC}/Makefile
....
-Довольно часто в исходных файлах портируемого программного обеспечения используется конвенция CR/LF. Это может стать причиной проблем с дальнейшей упаковкой, предупреждениями компилятора или выполнением скриптов (таких как `/bin/sh^M not found`). Для быстрого преобразования всех файлов из CR/LF просто в LF добавьте в [.filename]#Makefile# порта эту запись:
+[IMPORTANT]
+====
+Используйте man:sed[1] только для замены изменяемого содержимого. Для замены статического содержимого необходимо использовать файлы исправлений вместо man:sed[1].
+====
+
+Довольно часто портируемое программное обеспечение использует соглашение CR/LF в исходных файлах. Это может вызвать проблемы с дальнейшим наложением патчей, предупреждениями компилятора или выполнением скриптов (например, `/bin/sh^M не найден`). Для быстрого преобразования всех файлов из CR/LF в просто LF добавьте следующую запись в [.filename]#Makefile# порта:
[.programlisting]
....
USES= dos2unix
....
-Может быть задан точный список преобразуемых файлов:
+Список конкретных файлов для преобразования может быть указан:
[.programlisting]
....
@@ -172,7 +198,7 @@ USES= dos2unix
DOS2UNIX_FILES= util.c util.h
....
-Используйте `DOS2UNIX_REGEX`, чтобы преобразовать группу файлов в разных подкаталогах. Его параметром является регулярное выражение, совместимое с man:find[1]. Подробнее о формате в man:re_format[7]. Такой вариант удобен для преобразования всех файлов заданного расширения. Для примера, преобразуем все исходные файлы, не затрагивая двоичные файлы:
+Используйте `DOS2UNIX_REGEX` для преобразования группы файлов во вложенных каталогах. Его аргумент — это совместимое с man:find[1] регулярное выражение. Подробнее о формате можно узнать в man:re_format[7]. Эта опция полезна для преобразования всех файлов с заданным расширением. Например, преобразовать все исходные файлы кода, оставив двоичные файлы без изменений:
[.programlisting]
....
@@ -180,7 +206,7 @@ USES= dos2unix
DOS2UNIX_REGEX= .*\.([ch]|cpp)
....
-Другим вариантом является использование `DOS2UNIX_GLOB`, который вызывает `find` для каждого из перечисленных в нём элементов.
+Аналогичной опцией является `DOS2UNIX_GLOB`, которая запускает `find` для каждого указанного в ней элемента.
[.programlisting]
....
@@ -188,6 +214,79 @@ USES= dos2unix
DOS2UNIX_GLOB= *.c *.cpp *.h
....
+Базовый каталог для преобразования может быть установлен. Это полезно, когда имеется несколько distfiles и в нескольких из них содержатся файлы, требующие преобразования окончаний строк.
+
+[.programlisting]
+....
+USES= dos2unix
+DOS2UNIX_WRKSRC= ${WRKDIR}
+....
+
+[[slow-patch-extra]]
+=== Внесение исправлений при условии
+
+Некоторые порты требуют патчей, которые применяются только для определённых версий FreeBSD или при включении или отключении конкретной опции. Условные патчи указываются путём размещения полных путей к файлам патчей в `EXTRA_PATCHES`. Имена файлов условных патчей обычно начинаются с [.filename]#extra-#, хотя это и не обязательно. Однако их имена _не должны_ начинаться с [.filename]#patch-#. Если это произойдёт, они будут применены безусловно фреймворком, что нежелательно для условных патчей.
+
+[[slow-patch-extra-ex1]]
+.Применение патча для конкретной версии FreeBSD
+[example]
+====
+[.programlisting]
+....
+.include <bsd.port.options.mk>
+
+# Patch in the iconv const qualifier before this
+.if ${OPSYS} == FreeBSD && ${OSVERSION} < 1100069
+EXTRA_PATCHES= ${PATCHDIR}/extra-patch-fbsd10
+.endif
+
+.include <bsd.port.mk>
+....
+
+====
+
+[[slow-patch-extra-ex2]]
+.Опциональное применение патча
+[example]
+====
+Когда для crossref:makefiles[makefile-options,опции] требуется патч, используйте ``opt_EXTRA_PATCHES`` и ``opt_EXTRA_PATCHES_OFF``, чтобы сделать исправление зависимым от опции `opt`. Дополнительные сведения см. в crossref:makefiles[options-variables,Generic Variables Replacement, `OPT_VARIABLE` и `OPT_VARIABLE_OFF`].
+
+[.programlisting]
+....
+OPTIONS_DEFINE= FOO BAR
+FOO_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-foo
+BAR_EXTRA_PATCHES_OFF= ${PATCHDIR}/extra-patch-bar.c \
+ ${PATCHDIR}/extra-patch-bar.h
+....
+
+====
+
+[[slow-patch-extra-ex-dirs]]
+.Использование `EXTRA_PATCHES` с директорией
+[example]
+====
+Иногда для функции требуется множество патчей, в таком случае можно указать `EXTRA_PATCHES` на директорию, и все файлы с именем [.filename]#patch-*# в ней будут применены автоматически.
+
+Создайте подкаталог в [.filename]#${PATCHDIR}# и переместите в него патчи. Например:
+
+[source, shell]
+....
+% ls -l files/foo-patches
+-rw-r--r-- 1 root wheel 350 Jan 16 01:27 patch-Makefile.in
+-rw-r--r-- 1 root wheel 3084 Jan 18 15:37 patch-configure.ac
+....
+
+Затем добавьте это в [.filename]#Makefile#:
+
+[.programlisting]
+....
+OPTIONS_DEFINE= FOO
+FOO_EXTRA_PATCHES= ${PATCHDIR}/foo-patches
+....
+
+Затем фреймворк использует все файлы с именем [.filename]#patch-*# в этом каталоге.
+====
+
[[slow-configure]]
== Конфигурирование
diff --git a/documentation/content/ru/books/porters-handbook/slow-porting/_index.po b/documentation/content/ru/books/porters-handbook/slow-porting/_index.po
new file mode 100644
index 0000000000..388441324e
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/slow-porting/_index.po
@@ -0,0 +1,1017 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-24 21:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookslow-porting_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:1
+#, no-wrap
+msgid "Description about creating a FreeBSD Port when the program need some modifications"
+msgstr "Описание создания порта FreeBSD, когда программа требует некоторых изменений"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:1
+#, no-wrap
+msgid "Chapter 4. Slow Porting"
+msgstr "Глава 4. Медленное портирование"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:14
+#, no-wrap
+msgid "Slow Porting"
+msgstr "Медленное портирование"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:53
+msgid ""
+"Okay, so it was not that simple, and the port required some modifications to "
+"get it to work. In this section, we will explain, step by step, how to "
+"modify it to get it to work with the ports paradigm."
+msgstr ""
+"Итак, все оказалось не так уж и просто, и порт потребовал некоторых "
+"модификаций для того, чтобы заставить его работать. В этом разделе мы "
+"расскажем, шаг за шагом, как его модифицировать, чтобы он работал с нашей "
+"системой портов."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:55
+#, no-wrap
+msgid "How Things Work"
+msgstr "Как всё это работает"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:59
+msgid ""
+"First, this is the sequence of events which occurs when the user first types "
+"`make` in the port's directory. Having [.filename]#bsd.port.mk# in another "
+"window while reading this really helps to understand it."
+msgstr ""
+"Во-первых, когда пользователь дает в своем каталоге с портом команду `make`, "
+"происходит целая череда событий. Во время чтения этого текста может "
+"оказаться полезным иметь файл [.filename]#bsd.port.mk# открытым в другом "
+"окне, что сильно поможет его понять."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:61
+msgid ""
+"But do not worry, not many people understand exactly how "
+"[.filename]#bsd.port.mk# is working... _:-)_"
+msgstr ""
+"Но не волнуйтесь сильно, если вы не до конца понимаете, что делается в "
+"[.filename]#bsd.port.mk#, не так уж много людей его понимает... _:-)_"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:64
+msgid ""
+"The `fetch` target is run. The `fetch` target is responsible for making sure "
+"that the tarball exists locally in `DISTDIR`. If `fetch` cannot find the "
+"required files in `DISTDIR` it will look up the URL `MASTER_SITES`, which is "
+"set in the Makefile, as well as our FTP mirrors where we put distfiles as "
+"backup. It will then attempt to fetch the named distribution file with "
+"`FETCH`, assuming that the requesting site has direct access to the "
+"Internet. If that succeeds, it will save the file in `DISTDIR` for future "
+"use and proceed."
+msgstr ""
+"Запускается цель `fetch`. Цель `fetch` отвечает за то, что архив исходных "
+"текстов имеется в наличии локально в каталоге `DISTDIR`. Если цель `fetch` "
+"не может найти требуемые файлы в каталоге `DISTDIR`, то они будут искаться "
+"по указателю URL `MASTER_SITES`, который устанавливается в Makefile, а также "
+"на наших FTP зеркалах, куда мы по возможности помещаем дистрибутивные файлы "
+"для архива. Затем она попытается сгрузить указанный файл с помощью `FETCH`, "
+"полагая, что запрашивающая машина имеет прямое подключение к Интернет. Если "
+"файл скачается удачно, то он будет помещен в каталог `DISTDIR` для "
+"последующего использования и обработки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:65
+msgid ""
+"The `extract` target is run. It looks for the port's distribution file "
+"(typically a compressed tarball) in `DISTDIR` and unpacks it into a "
+"temporary subdirectory specified by `WRKDIR` (defaults to [.filename]#work#)."
+msgstr ""
+"Выполняется цель `extract`. Она ищет дистрибутивный файл порта (как правило, "
+"tar-архив `gzip`) в каталоге `DISTDIR` и распаковывает его во временный "
+"каталог, задаваемый переменной `WRKDIR` (по умолчанию [.filename]#work#)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:66
+msgid ""
+"The `patch` target is run. First, any patches defined in `PATCHFILES` are "
+"applied. Second, if any patch files named [.filename]#patch-*# are found in "
+"`PATCHDIR` (defaults to the [.filename]#files# subdirectory), they are "
+"applied at this time in alphabetical order."
+msgstr ""
+"Выполняется цель `patch`. Во-первых, применяются все патчи, заданные "
+"переменной `PATCHFILES`. Во-вторых, если какие-либо файлы с патчами, носящие "
+"имена [.filename]#patch-*#, имеются в подкаталоге `PATCHDIR` (по умолчанию "
+"это каталог [.filename]#files#), то они применяются в этот момент в "
+"алфавитном порядке."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:67
+msgid ""
+"The `configure` target is run. This can do any one of many different things."
+msgstr ""
+"Запускается цель `configure`. Здесь может выполняться любая из многих "
+"различных вещей."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:68
+msgid "If it exists, [.filename]#scripts/configure# is run."
+msgstr "Если он существует, запускается [.filename]#scripts/configure#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:69
+msgid ""
+"If `HAS_CONFIGURE` or `GNU_CONFIGURE` is set, [.filename]#WRKSRC/configure# "
+"is run."
+msgstr ""
+"Если установлены `HAS_CONFIGURE` или `GNU_CONFIGURE`, запускается "
+"[.filename]#WRKSRC/configure#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:71
+msgid ""
+"The `build` target is run. This is responsible for descending into the "
+"port's private working directory (`WRKSRC`) and building it."
+msgstr ""
+"Выполняется цель `build`. Она отвечает за переход в собственный рабочий "
+"каталог порта (`WRKSRC`) и его построение."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:72
+msgid ""
+"The `stage` target is run. This puts the final set of built files into a "
+"temporary directory (`STAGEDIR`, see crossref:special[staging,Staging]). The "
+"hierarchy of this directory mirrors that of the system on which the package "
+"will be installed."
+msgstr ""
+"Выполняется цель `stage`. Конечный набор построенных файлов помещается во "
+"временный каталог (`STAGEDIR`, смотрите crossref:special[staging,Staging]). "
+"Иерархия этого каталога отражает иерархию каталогов системы, в которую "
+"данный пакет будет устанавливаться."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:73
+msgid ""
+"The `package` target is run. This creates a package using the files from the "
+"temporary directory created during the `stage` target and the port's "
+"[.filename]#pkg-plist#."
+msgstr ""
+"Выполняется цель `package`. При этом создается пакет с использованием файлов "
+"из временного каталога, созданного во время выполнения цели `stage`, и файла "
+"[.filename]#pkg-plist# порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:74
+msgid ""
+"The `install` target is run. This installs the package created during the "
+"`package` target into the host system."
+msgstr ""
+"Выполняется цель `install`. Это устанавливает пакет, созданный во время цели "
+"`package`, в хост-систему."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:76
+msgid ""
+"The above are the default actions. In addition, define targets `pre-"
+"_something_` or `post-_something_`, or put scripts with those names, in the "
+"[.filename]#scripts# subdirectory, and they will be run before or after the "
+"default actions are done."
+msgstr ""
+"Выше перечислены стандартные действия. Кроме того, вы сами можете определить "
+"цели `pre-_что-то_` или `post-_что-то_`, или создать скрипты с такими "
+"именами в подкаталоге [.filename]#scripts#, и они будут запущены до или "
+"после выполнения действий по умолчанию."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:82
+msgid ""
+"For example, if there is a `post-extract` target defined in the "
+"[.filename]#Makefile#, and a file [.filename]#pre-build# in the "
+"[.filename]#scripts# subdirectory, the `post-extract` target will be called "
+"after the regular extraction actions, and [.filename]#pre-build# will be "
+"executed before the default build rules are done. It is recommended to use "
+"[.filename]#Makefile# targets if the actions are simple enough, because it "
+"will be easier for someone to figure out what kind of non-default action the "
+"port requires."
+msgstr ""
+"Например, если у вас есть цель `post-extract`, определённая в вашем файле "
+"[.filename]#Makefile# и файл [.filename]#pre-build# в подкаталоге "
+"[.filename]#scripts#, то после выполнения обычных действий по распаковке, "
+"будет вызвана цель `post-extract` а скрипт [.filename]#pre-build# будет "
+"выполнен перед запуском стандартных правил построения. Рекомендуется "
+"использовать цели из [.filename]#Makefile#, если действия достаточно просты, "
+"потому что в дальнейшем будет проще определить, какие нестандартные действия "
+"требует порт."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:86
+msgid ""
+"The default actions are done by the `do-_something_` targets from "
+"[.filename]#bsd.port.mk#. For example, the commands to extract a port are "
+"in the target `do-extract`. If the default target does not do the job "
+"right, redefine the `do-_something_` target in the [.filename]#Makefile#."
+msgstr ""
+"Действия по умолчанию выполняются целями `do-_что-то_` из "
+"[.filename]#bsd.port.mk#. Например, команды для распаковки порта находятся в "
+"цели `do-extract`. Если вам не хватает цели по умолчанию, вы можете ее "
+"исправить, переопределив цель `do-_something_` в вашем файле "
+"[.filename]#Makefile#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:92
+msgid ""
+"The \"main\" targets (for example, `extract`, `configure`, etc.) do nothing "
+"more than make sure all the stages up to that one are completed and call the "
+"real targets or scripts, and they are not intended to be changed. To fix "
+"the extraction, fix `do-extract`, but never ever change the way `extract` "
+"operates! Additionally, the target `post-deinstall` is invalid and is not "
+"run by the ports infrastructure."
+msgstr ""
+"\"Основные\" цели (к примеру, `extract`, `configure` и так далее) не делают "
+"ничего больше, чем проверяют успешность завершения всех предыдущих шагов и "
+"вызывают настоящие цели или скрипты, и их не нужно менять. Если вам нужно "
+"изменить распаковку, исправляйте `do-extract`, но никогда не меняйте способ "
+"работы `extract`! Кроме того, цель `post-deinstall` является "
+"недействительной и не выполняется инфраструктурой портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:95
+msgid ""
+"Now that what goes on when the user types `make install` is better "
+"understood, let us go through the recommended steps to create the perfect "
+"port."
+msgstr ""
+"Теперь, когда вы представляете, что происходит, когда пользователь набирает "
+"команду `make install`, давайте пройдемся через шаги, рекомендуемые для "
+"создания настоящего порта."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:97
+#, no-wrap
+msgid "Getting the Original Sources"
+msgstr "Получение исходного кода"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:101
+msgid ""
+"Get the original sources (normally) as a compressed tarball "
+"([.filename]#foo.tar.gz# or [.filename]#foo.tar.bz2#) and copy it into "
+"`DISTDIR`. Always use _mainstream_ sources when and where possible."
+msgstr ""
+"Получите оригинальные исходные тексты (обычно) в виде упакованного tar-"
+"архива ([.filename]#foo.tar.gz# или [.filename]#foo.tar.bz2#) и скопируйте "
+"его в каталог `DISTDIR`. Всегда используйте исходные тексты _основной ветки "
+"разработки_ везде, где это возможно."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:108
+msgid ""
+"Set the variable `MASTER_SITES` to reflect where the original tarball "
+"resides. Shorthand definitions exist for most mainstream sites in "
+"[.filename]#bsd.sites.mk#. Please use these sites-and the associated "
+"definitions-if at all possible, to help avoid the problem of having the same "
+"information repeated over again many times in the source base. As these "
+"sites tend to change over time, this becomes a maintenance nightmare for "
+"everyone involved. See crossref:makefiles[makefile-"
+"master_sites,`MASTER_SITES`] for details."
+msgstr ""
+"Вам потребуется задать значение переменной `MASTER_SITES` так, чтобы оно "
+"указывало на местоположение оригинального tar-архива. В файле "
+"[.filename]#bsd.sites.mk# вы найдёте краткие обозначения для большинства "
+"популярных сайтов. Пожалуйста, используйте эти сайты-и соответствующие "
+"определения-везде, где это возможно, чтобы избежать проблем повторения одной "
+"и той же информации в базе источников. Так как эти сайты со временем "
+"меняются, для всех причастных поддержка становится настоящим кошмаром. Для "
+"подробностей смотрите crossref:makefiles[makefile-"
+"master_sites,`MASTER_SITES`]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:110
+msgid ""
+"If there is no FTP/HTTP site that is well-connected to the net, or can only "
+"find sites that have irritatingly non-standard formats, put a copy on a "
+"reliable FTP or HTTP server (for example, a home page)."
+msgstr ""
+"Если вы не можете найти FTP/HTTP сайт с хорошим подключением к сети, или "
+"находите только сайты, которые имеют раздражающе нестандартные форматы, то "
+"можете захотеть поместить копию на надежный сервер FTP или HTTP, который вам "
+"доступен (например, ваша домашняя страница)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:114
+msgid ""
+"If a convenient and reliable place to put the distfile cannot be found, we "
+"can \"house\" it ourselves on `ftp.FreeBSD.org`; however, this is the least-"
+"preferred solution. The distfile must be placed into [.filename]#~/"
+"public_distfiles/# of someone's `freefall` account. Ask the person who "
+"commits the port to do this. This person will also set `MASTER_SITES` to "
+"`LOCAL/_username_` where `_username_` is their FreeBSD cluster login."
+msgstr ""
+"Если вы не можете найти доступного и надёжного места для помещения "
+"дистрибутивного файла, то мы сами сможем разместить его на сервере "
+"`ftp.FreeBSD.org`; однако это наименее рекомендуемое решение. Дистрибутивный "
+"файл должен быть помещён в каталог [.filename]#~/public_distfiles/# одного "
+"из пользователей машины `freefall`. Попросите того, кто коммиттил ваш порт, "
+"сделать это. Этот человек также задаст переменной `MASTER_SITES` значение "
+"`MASTER_SITE_LOCAL`, а в переменной `MASTER_SITE_SUBDIR` укажет логин "
+"кластера FreeBSD."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:119
+msgid ""
+"If the port's distfile changes all the time without any kind of version "
+"update by the author, consider putting the distfile on a home page and "
+"listing it as the first `MASTER_SITES`. Try to talk the port author out of "
+"doing this; it really does help to establish some kind of source code "
+"control. Hosting a specific version will prevent users from getting "
+"`checksum mismatch` errors, and also reduce the workload of maintainers of "
+"our FTP site. Also, if there is only one master site for the port, it is "
+"recommended to house a backup on a home page and list it as the second "
+"`MASTER_SITES`."
+msgstr ""
+"Если дистрибутивные файлы вашего порта постоянно меняются по неизвестным "
+"причинам без изменения версий со стороны автора, остаётся только поместить "
+"дистрибутив на вашу домашнюю Web-страницу и указать её первой в списке "
+"`MASTER_SITES`. Если можете, попытайтесь договориться с автором порта об "
+"этом; это действительно помогает в достижении некоторого управления исходным "
+"кодом. Размещение собственной версии поможет избежать появления ошибок у "
+"пользователей типа `checksum mismatch`, а также уменьшит нагрузку на людей, "
+"сопровождающих наш FTP-сервер. Также, если у порта имеется только один "
+"основной сервер, то рекомендуется поместить архивную копию на свой сайт и "
+"указать его в списке `MASTER_SITES` вторым."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:123
+msgid ""
+"If the port requires additional patches that are available on the Internet, "
+"fetch them too and put them in `DISTDIR`. Do not worry if they come from a "
+"site other than where the main source tarball comes, we have a way to handle "
+"these situations (see the description of crossref:makefiles[porting-"
+"patchfiles,PATCHFILES] below)."
+msgstr ""
+"Если вашему порту требуются дополнительные `патчи`, доступные в Интернет, "
+"скачайте также и их, поместив в каталог `DISTDIR`. Не волнуйтесь, если они "
+"находятся не на том же сайте, откуда взят дистрибутивный архив, мы умеем "
+"обрабатывать такие ситуации (смотрите описание crossref:makefiles[porting-"
+"patchfiles,PATCHFILES] ниже)."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:125
+#, no-wrap
+msgid "Modifying the Port"
+msgstr "Модификация порта"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:130
+msgid ""
+"Unpack a copy of the tarball in a private directory and make whatever "
+"changes are necessary to get the port to compile properly under the current "
+"version of FreeBSD. Keep _careful track_ of steps, as they will be needed "
+"to automate the process shortly. Everything, including the deletion, "
+"addition, or modification of files has to be doable using an automated "
+"script or patch file when the port is finished."
+msgstr ""
+"Распакуйте копию дистрибутивного файла в отдельный каталог и внесите "
+"изменения, которые необходимы для того, чтобы порт компилировался нормально "
+"в текущей версии FreeBSD. _Тщательно отслеживайте_ все, что вы делаете, этот "
+"процесс вам предстоит автоматизировать. Все, включая удаление, добавление "
+"или модификацию в файлах должны будут выполняться автоматически с помощью "
+"скриптов или файлов патчей, когда вы завершите работу над портом."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:133
+msgid ""
+"If the port requires significant user interaction/customization to compile "
+"or install, take a look at one of Larry Wall's classic Configure scripts and "
+"perhaps do something similar. The goal of the new ports collection is to "
+"make each port as \"plug-and-play\" as possible for the end-user while using "
+"a minimum of disk space."
+msgstr ""
+"Если вашему порту во время компиляции, установки и настройки требуется "
+"довольно много взаимодействовать с пользователем, то посмотрите на один из "
+"классических скриптов Configure Лэрри Уолла (Larry Wall) и сделайте сами что-"
+"либо подобное. Предназначение новой коллекции портов - это сделать каждое "
+"приложение в стиле \"plug-and-play\" настолько, насколько это вообще "
+"возможно для конечного пользователя при минимальном использовании дискового "
+"пространства."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:137
+msgid ""
+"Unless explicitly stated, patch files, scripts, and other files created and "
+"contributed to the FreeBSD ports collection are assumed to be covered by the "
+"standard BSD copyright conditions."
+msgstr ""
+"Если явно не указано обратное, то патчи, скрипты и другие файлы, которые вы "
+"создали и предоставили для Коллекции Портов FreeBSD, неявно подпадают под "
+"стандартные условия лицензии BSD."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:140
+#, no-wrap
+msgid "Patching"
+msgstr "Работа с патчами"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:144
+msgid ""
+"In the preparation of the port, files that have been added or changed can be "
+"recorded with man:diff[1] for later feeding to man:patch[1]. Doing this "
+"with a typical file involves saving a copy of the original file before "
+"making any changes using a [.filename]#.orig# suffix."
+msgstr ""
+"Файлы, которые добавлялись или изменялись в процессе создания порта, могут "
+"быть выявлены программой man:diff[1], а результат работы этой программы "
+"может быть в дальнейшем передан программе man:patch[1]. Такое действие с "
+"обычным файлом подразумевает сохранение копии файла с первоначальным "
+"содержимым перед внесением каких-либо изменений."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:148
+#, no-wrap
+msgid "% cp file file.orig\n"
+msgstr "% cp file file.orig\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:152
+msgid ""
+"After all changes have been made, `cd` back to the port directory. Use "
+"`make makepatch` to generate updated patch files in the [.filename]#files# "
+"directory."
+msgstr ""
+"Патчи сохраняются в виде файлов с именем [.filename]#patch-*#, где _*_ "
+"обозначает путь к файлу, к которому применяется патч, такой как "
+"[.filename]#patch-Imakefile# или [.filename]#patch-src-config.h#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:157
+msgid ""
+"Use `BINARY_ALIAS` to substitute hardcoded commands during the build and "
+"avoid patching build files. See crossref:makefiles[binary-alias,Use "
+"`BINARY_ALIAS` to Rename Commands Instead of Patching the Build] for more "
+"information."
+msgstr ""
+"Используйте `BINARY_ALIAS` для замены жёстко заданных команд во время сборки "
+"и избежания исправлений в файлах сборки. Подробнее см. в "
+"crossref:makefiles[binary-alias,Использование `BINARY_ALIAS` для "
+"переименования команд вместо исправления сборки]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:160
+#, no-wrap
+msgid "General Rules for Patching"
+msgstr "Общие правила для установки патчей"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:167
+msgid ""
+"Patch files are stored in `PATCHDIR`, usually [.filename]#files/#, from "
+"where they will be automatically applied. All patches must be relative to "
+"`WRKSRC`. Typically `WRKSRC` is a subdirectory of `WRKDIR`, the directory "
+"where the distfile is extracted. Use `make -V WRKSRC` to see the actual "
+"path. The patch names are to follow these rules:"
+msgstr ""
+"Файлы патчей хранятся в `PATCHDIR`, обычно это [.filename]#files/#, откуда "
+"они будут автоматически применены. Все исправления должны быть относительны "
+"к `WRKSRC`. Обычно `WRKSRC` является подкаталогом `WRKDIR`, каталога, в "
+"котором распаковывается distfile. Используйте `make -V WRKSRC` для просмотра "
+"фактического пути. Имена файлов патчей должны соответствовать следующим "
+"правилам:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:169
+msgid ""
+"Avoid having more than one patch modify the same file. For example, having "
+"both [.filename]#patch-foobar.c# and [.filename]#patch-foobar.c2# making "
+"changes to [.filename]#${WRKSRC}/foobar.c# makes them fragile and difficult "
+"to debug."
+msgstr ""
+"Избегайте ситуации, когда несколько патчей изменяют один и тот же файл. "
+"Например, если и [.filename]#patch-foobar.c#, и [.filename]#patch-foobar.c2# "
+"вносят изменения в [.filename]#${WRKSRC}/foobar.c#, это делает их хрупкими и "
+"затрудняет отладку."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:170
+msgid ""
+"When creating names for patch files, replace each underscore (`\\_`) with "
+"two underscores (`\\__`) and each slash (`/`) with one underscore (`_`). For "
+"example, to patch a file named [.filename]#src/freeglut_joystick.c#, name "
+"the corresponding patch [.filename]#patch-src_freeglut__joystick.c#. Do not "
+"name patches like [.filename]#patch-aa# or [.filename]#patch-ab#. Always use "
+"the path and file name in patch names. Using `make makepatch` automatically "
+"generates the correct names."
+msgstr ""
+"При создании имен для файлов исправлений заменяйте каждое подчеркивание "
+"(`\\_`) на два подчеркивания (`\\__`) и каждый слэш (`/`) на одно "
+"подчеркивание (`_`). Например, чтобы исправить файл с именем [.filename]#src/"
+"freeglut_joystick.c#, назовите соответствующий исправление [.filename]#patch-"
+"src_freeglut__joystick.c#. Не называйте исправления как [.filename]#patch-"
+"aa# или [.filename]#patch-ab#. Всегда используйте путь и имя файла в "
+"названиях исправлений. Использование `make makepatch` автоматически "
+"генерирует правильные имена."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:171
+msgid ""
+"A patch may modify multiple files if the changes are related and the patch "
+"is named appropriately. For example, [.filename]#patch-add-missing-stdlib.h#."
+msgstr ""
+"Патч может изменять несколько файлов, если изменения связаны между собой и "
+"патч назван соответствующим образом. Например, [.filename]#patch-add-missing-"
+"stdlib.h#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:172
+msgid ""
+"Only use characters `[-+.\\_a-zA-Z0-9]` for naming patches. In particular, "
+"__do not use `::` as a path separator,__ use `_` instead."
+msgstr ""
+"Используйте только символы `[-+.\\_a-zA-Z0-9]` для именования патчей. В "
+"частности, __не используйте `::` как разделитель путей,__ вместо этого "
+"используйте `_`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:177
+msgid ""
+"Minimize the amount of non-functional whitespace changes in patches. It is "
+"common in the Open Source world for projects to share large amounts of a "
+"code base, but obey different style and indenting rules. When taking a "
+"working piece of functionality from one project to fix similar areas in "
+"another, please be careful: the resulting patch may be full of non-"
+"functional changes. It not only increases the size of the ports repository "
+"but makes it hard to find out what exactly caused the problem and what was "
+"changed at all."
+msgstr ""
+"Минимизируйте количество нефункциональных изменений пробелов в патчах. В "
+"мире открытого исходного кода распространена практика, когда проекты "
+"используют обширные части кодовой базы, но следуют разным правилам стиля и "
+"отступов. При переносе работоспособного функционала из одного проекта для "
+"исправления аналогичных участков в другом будьте внимательны: итоговый патч "
+"может быть переполнен нефункциональными изменениями. Это не только "
+"увеличивает размер репозитория портов, но и затрудняет понимание того, что "
+"именно вызвало проблему и какие изменения были внесены."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:179
+msgid ""
+"If a file must be deleted, do it in the `post-extract` target rather than as "
+"part of the patch."
+msgstr ""
+"Если файл необходимо удалить, сделайте это в цели `post-extract`, а не как "
+"часть исправления."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:181
+#, no-wrap
+msgid "Manual Patch Generation"
+msgstr "Ручное создание патчей"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:188
+msgid ""
+"Manual patch creation is usually not necessary. Automatic patch generation "
+"as described earlier in this section is the preferred method. However, "
+"manual patching may be required occasionally."
+msgstr ""
+"Ручное создание патчей обычно не требуется. Предпочтительным методом "
+"является автоматическая генерация патчей, как описано ранее в этом разделе. "
+"Однако иногда может потребоваться ручное исправление."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:193
+msgid ""
+"Patches are saved into files named [.filename]#patch-*# where * indicates "
+"the pathname of the file that is patched, such as [.filename]#patch-"
+"Imakefile# or [.filename]#patch-src-config.h#. Patches with file names "
+"which do not start with [.filename]#patch-# will not be applied "
+"automatically."
+msgstr ""
+"Патчи сохраняются в файлы с именами [.filename]#patch-*#, где * указывает на "
+"путь к файлу, который патчится, например [.filename]#patch-Imakefile# или "
+"[.filename]#patch-src-config.h#. Патчи с именами файлов, не начинающимися с "
+"[.filename]#patch-#, не будут применены автоматически."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:196
+msgid ""
+"After the file has been modified, man:diff[1] is used to record the "
+"differences between the original and the modified version. `-u` causes "
+"man:diff[1] to produce \"unified\" diffs, the preferred form."
+msgstr ""
+"После изменения файла используется man:diff[1] для записи различий между "
+"оригинальной и изменённой версиями. `-u` заставляет man:diff[1] выводить "
+"различия файлов в \"унифицированном\" формате (unified diffs), которые "
+"являются предпочтительным форматом."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:200
+#, no-wrap
+msgid "% diff -u file.orig file > patch-pathname-file\n"
+msgstr "% diff -u file.orig file > patch-pathname-file\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:203
+msgid ""
+"When generating patches for new, added files, `-N` is used to tell "
+"man:diff[1] to treat the non-existent original file as if it existed but was "
+"empty:"
+msgstr ""
+"Для порождении патчей для новых добавляемых файлов используется параметр `-"
+"N`, который заставляет man:diff[1] трактовать несуществующие прежде файлы "
+"как если бы они существовали, но имели пустое содержимое:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:207
+#, no-wrap
+msgid "% diff -u -N newfile.orig newfile > patch-pathname-newfile\n"
+msgstr "% diff -u -N newfile.orig newfile > patch-pathname-newfile\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:213
+msgid ""
+"Using the recurse (`-r`) option to man:diff[1] to generate patches is fine, "
+"but please look at the resulting patches to make sure there is no "
+"unnecessary junk in there. In particular, diffs between two backup files, "
+"[.filename]##Makefile##s when the port uses `Imake` or GNU `configure`, "
+"etc., are unnecessary and have to be deleted. If it was necessary to edit "
+"[.filename]#configure.in# and run `autoconf` to regenerate `configure`, do "
+"not take the diffs of `configure` (it often grows to a few thousand "
+"lines!). Instead, define `USES=autoreconf` and take the diffs of "
+"[.filename]#configure.in#."
+msgstr ""
+"Использование опции рекурсии (`-r`) в man:diff[1] для создания патчей "
+"допустимо, но пожалуйста, проверяйте полученные патчи, чтобы убедиться в "
+"отсутствии ненужных данных. В частности, различия между резервными файлами, "
+"[.filename]##Makefile##, когда порт использует `Imake` или GNU `configure`, "
+"и т.д., являются избыточными и должны быть удалены. Если потребовалось "
+"отредактировать [.filename]#configure.in# и запустить `autoconf` для "
+"перегенерации `configure`, не включайте различия в `configure` (его объем "
+"часто достигает нескольких тысяч строк!). Вместо этого определите "
+"`USES=autoreconf` и возьмите различия для [.filename]#configure.in#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:215
+#, no-wrap
+msgid "Simple Automatic Replacements"
+msgstr "Простая автоматическая замена"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:219
+msgid ""
+"Simple replacements can be performed directly from the port "
+"[.filename]#Makefile# using the in-place mode of man:sed[1]. This is useful "
+"when changes use the value of a variable:"
+msgstr ""
+"Простые замены могут быть выполнены напрямую из [.filename]#Makefile# порта, "
+"используя режим редактирования на месте утилиты man:sed[1]. Это полезно, "
+"когда изменения используют значение переменной:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:224
+#, no-wrap
+msgid ""
+"post-patch:\n"
+"\t@${REINPLACE_CMD} -e 's|/usr/local|${PREFIX}|g' ${WRKSRC}/Makefile\n"
+msgstr ""
+"post-patch:\n"
+"\t@${REINPLACE_CMD} -e 's|/usr/local|${PREFIX}|g' ${WRKSRC}/Makefile\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:230
+msgid ""
+"Only use man:sed[1] to replace variable content. You must use patch files "
+"instead of man:sed[1] to replace static content."
+msgstr ""
+"Используйте man:sed[1] только для замены изменяемого содержимого. Для замены "
+"статического содержимого необходимо использовать файлы исправлений вместо "
+"man:sed[1]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:235
+msgid ""
+"Quite often, software being ported uses the CR/LF convention in source "
+"files. This may cause problems with further patching, compiler warnings, or "
+"script execution (like `/bin/sh^M not found`.) To quickly convert all files "
+"from CR/LF to just LF, add this entry to the port [.filename]#Makefile#:"
+msgstr ""
+"Довольно часто портируемое программное обеспечение использует соглашение CR/"
+"LF в исходных файлах. Это может вызвать проблемы с дальнейшим наложением "
+"патчей, предупреждениями компилятора или выполнением скриптов (например, `/"
+"bin/sh^M не найден`). Для быстрого преобразования всех файлов из CR/LF в "
+"просто LF добавьте следующую запись в [.filename]#Makefile# порта:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:239
+#, no-wrap
+msgid "USES=\tdos2unix\n"
+msgstr "USES=\tdos2unix\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:242
+msgid "A list of specific files to convert can be given:"
+msgstr "Список конкретных файлов для преобразования может быть указан:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:247
+#, no-wrap
+msgid ""
+"USES=\tdos2unix\n"
+"DOS2UNIX_FILES=\tutil.c util.h\n"
+msgstr ""
+"USES=\tdos2unix\n"
+"DOS2UNIX_FILES=\tutil.c util.h\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:254
+msgid ""
+"Use `DOS2UNIX_REGEX` to convert a group of files across subdirectories. Its "
+"argument is a man:find[1]-compatible regular expression. More on the format "
+"is in man:re_format[7]. This option is useful for converting all files of a "
+"given extension. For example, convert all source code files, leaving binary "
+"files intact:"
+msgstr ""
+"Используйте `DOS2UNIX_REGEX` для преобразования группы файлов во вложенных "
+"каталогах. Его аргумент — это совместимое с man:find[1] регулярное "
+"выражение. Подробнее о формате можно узнать в man:re_format[7]. Эта опция "
+"полезна для преобразования всех файлов с заданным расширением. Например, "
+"преобразовать все исходные файлы кода, оставив двоичные файлы без изменений:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:259
+#, no-wrap
+msgid ""
+"USES=\tdos2unix\n"
+"DOS2UNIX_REGEX=\t.*\\.([ch]|cpp)\n"
+msgstr ""
+"USES=\tdos2unix\n"
+"DOS2UNIX_REGEX=\t.*\\.([ch]|cpp)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:262
+msgid ""
+"A similar option is `DOS2UNIX_GLOB`, which runs `find` for each element "
+"listed in it."
+msgstr ""
+"Аналогичной опцией является `DOS2UNIX_GLOB`, которая запускает `find` для "
+"каждого указанного в ней элемента."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:267
+#, no-wrap
+msgid ""
+"USES=\tdos2unix\n"
+"DOS2UNIX_GLOB=\t*.c *.cpp *.h\n"
+msgstr ""
+"USES=\tdos2unix\n"
+"DOS2UNIX_GLOB=\t*.c *.cpp *.h\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:271
+msgid ""
+"The base directory for the conversion can be set. This is useful when there "
+"are multiple distfiles and several contain files which require line-ending "
+"conversion."
+msgstr ""
+"Базовый каталог для преобразования может быть установлен. Это полезно, когда "
+"имеется несколько distfiles и в нескольких из них содержатся файлы, "
+"требующие преобразования окончаний строк."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:276
+#, no-wrap
+msgid ""
+"USES=\tdos2unix\n"
+"DOS2UNIX_WRKSRC=\t${WRKDIR}\n"
+msgstr ""
+"USES=\tdos2unix\n"
+"DOS2UNIX_WRKSRC=\t${WRKDIR}\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:279
+#, no-wrap
+msgid "Patching Conditionally"
+msgstr "Внесение исправлений при условии"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:286
+msgid ""
+"Some ports need patches that are only applied for specific FreeBSD versions "
+"or when a particular option is enabled or disabled. Conditional patches are "
+"specified by placing the full paths to the patch files in `EXTRA_PATCHES`. "
+"Conditional patch file names usually start with [.filename]#extra-# although "
+"this is not necessary. However, their file names _must not_ start with "
+"[.filename]#patch-#. If they do, they are applied unconditionally by the "
+"framework which is undesired for conditional patches."
+msgstr ""
+"Некоторые порты требуют патчей, которые применяются только для определённых "
+"версий FreeBSD или при включении или отключении конкретной опции. Условные "
+"патчи указываются путём размещения полных путей к файлам патчей в "
+"`EXTRA_PATCHES`. Имена файлов условных патчей обычно начинаются с "
+"[.filename]#extra-#, хотя это и не обязательно. Однако их имена _не должны_ "
+"начинаться с [.filename]#patch-#. Если это произойдёт, они будут применены "
+"безусловно фреймворком, что нежелательно для условных патчей."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:288
+#, no-wrap
+msgid "Applying a Patch for a Specific FreeBSD Version"
+msgstr "Применение патча для конкретной версии FreeBSD"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:294
+#, no-wrap
+msgid ".include <bsd.port.options.mk>\n"
+msgstr ".include <bsd.port.options.mk>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:299
+#, no-wrap
+msgid ""
+"# Patch in the iconv const qualifier before this\n"
+".if ${OPSYS} == FreeBSD && ${OSVERSION} < 1100069\n"
+"EXTRA_PATCHES=\t${PATCHDIR}/extra-patch-fbsd10\n"
+".endif\n"
+msgstr ""
+"# Patch in the iconv const qualifier before this\n"
+".if ${OPSYS} == FreeBSD && ${OSVERSION} < 1100069\n"
+"EXTRA_PATCHES=\t${PATCHDIR}/extra-patch-fbsd10\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:301
+#, no-wrap
+msgid ".include <bsd.port.mk>\n"
+msgstr ".include <bsd.port.mk>\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:306
+#, no-wrap
+msgid "Optionally Applying a Patch"
+msgstr "Опциональное применение патча"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:311
+msgid ""
+"When an crossref:makefiles[makefile-options,option] requires a patch, use "
+"``opt_EXTRA_PATCHES`` and ``opt_EXTRA_PATCHES_OFF`` to make the patch "
+"conditional on the `opt` option. See crossref:makefiles[options-"
+"variables,Generic Variables Replacement, `OPT_VARIABLE` and "
+"`OPT_VARIABLE_OFF`] for more information."
+msgstr ""
+"Когда для crossref:makefiles[makefile-options,опции] требуется патч, "
+"используйте ``opt_EXTRA_PATCHES`` и ``opt_EXTRA_PATCHES_OFF``, чтобы сделать "
+"исправление зависимым от опции `opt`. Дополнительные сведения см. в "
+"crossref:makefiles[options-variables,Generic Variables Replacement, "
+"`OPT_VARIABLE` и `OPT_VARIABLE_OFF`]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:318
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\t FOO BAR\n"
+"FOO_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-foo\n"
+"BAR_EXTRA_PATCHES_OFF=\t${PATCHDIR}/extra-patch-bar.c \\\n"
+"\t\t${PATCHDIR}/extra-patch-bar.h\n"
+msgstr ""
+"OPTIONS_DEFINE=\t FOO BAR\n"
+"FOO_EXTRA_PATCHES= ${PATCHDIR}/extra-patch-foo\n"
+"BAR_EXTRA_PATCHES_OFF=\t${PATCHDIR}/extra-patch-bar.c \\\n"
+"\t\t${PATCHDIR}/extra-patch-bar.h\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:323
+#, no-wrap
+msgid "Using `EXTRA_PATCHES` With a Directory"
+msgstr "Использование `EXTRA_PATCHES` с директорией"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:328
+msgid ""
+"Sometimes, there are many patches that are needed for a feature, in this "
+"case, it is possible to point `EXTRA_PATCHES` to a directory, and it will "
+"automatically apply all files named [.filename]#patch-*# in it."
+msgstr ""
+"Иногда для функции требуется множество патчей, в таком случае можно указать "
+"`EXTRA_PATCHES` на директорию, и все файлы с именем [.filename]#patch-*# в "
+"ней будут применены автоматически."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:331
+msgid ""
+"Create a subdirectory in [.filename]#${PATCHDIR}#, and move the patches in "
+"it. For example:"
+msgstr ""
+"Создайте подкаталог в [.filename]#${PATCHDIR}# и переместите в него патчи. "
+"Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:337
+#, no-wrap
+msgid ""
+"% ls -l files/foo-patches\n"
+"-rw-r--r-- 1 root wheel 350 Jan 16 01:27 patch-Makefile.in\n"
+"-rw-r--r-- 1 root wheel 3084 Jan 18 15:37 patch-configure.ac\n"
+msgstr ""
+"% ls -l files/foo-patches\n"
+"-rw-r--r-- 1 root wheel 350 Jan 16 01:27 patch-Makefile.in\n"
+"-rw-r--r-- 1 root wheel 3084 Jan 18 15:37 patch-configure.ac\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:340
+msgid "Then add this to the [.filename]#Makefile#:"
+msgstr "Затем добавьте это в [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:345
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tFOO\n"
+"FOO_EXTRA_PATCHES=\t${PATCHDIR}/foo-patches\n"
+msgstr ""
+"OPTIONS_DEFINE=\tFOO\n"
+"FOO_EXTRA_PATCHES=\t${PATCHDIR}/foo-patches\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:348
+msgid ""
+"The framework will then use all the files named [.filename]#patch-*# in that "
+"directory."
+msgstr ""
+"Затем фреймворк использует все файлы с именем [.filename]#patch-*# в этом "
+"каталоге."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:351
+#, no-wrap
+msgid "Configuring"
+msgstr "Конфигурирование"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:355
+msgid ""
+"Include any additional customization commands in the [.filename]#configure# "
+"script and save it in the [.filename]#scripts# subdirectory. As mentioned "
+"above, it is also possible do this with [.filename]#Makefile# targets and/or "
+"scripts with the name [.filename]#pre-configure# or [.filename]#post-"
+"configure#."
+msgstr ""
+"Поместите все дополнительные команды, требуемые для настройки, в ваш скрипт "
+"[.filename]#configure# и сохраните его в подкаталоге [.filename]#scripts#. "
+"Как отмечено выше, вы можете сделать это целями в файле "
+"[.filename]#Makefile# и/или скриптами с именами [.filename]#pre-configure# "
+"или [.filename]#post-configure#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:357
+#, no-wrap
+msgid "Handling User Input"
+msgstr "Обработка пользовательского ввода"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:364
+msgid ""
+"If the port requires user input to build, configure, or install, set "
+"`IS_INTERACTIVE` in the [.filename]#Makefile#. This will allow \"overnight "
+"builds\" to skip it. If the user sets the variable `BATCH` in their "
+"environment (and if the user sets the variable `INTERACTIVE`, then _only_ "
+"those ports requiring interaction are built). This will save a lot of "
+"wasted time on the set of machines that continually build ports (see below)."
+msgstr ""
+"Если для построения, конфигурации или установки вашего порта требуется "
+"некоторый ввод со стороны пользователя, то вы должны задать переменную "
+"`IS_INTERACTIVE` в вашем файле [.filename]#Makefile#. В случае \"ночного "
+"построения\" это позволит пропустить ваш порт, если пользователь в своем "
+"окружении задал переменную `BATCH` (и если пользователь установил переменную "
+"`INTERACTIVE`, то будут строиться _только_ порты, которые требуют "
+"взаимодействия с пользователем. Это сэкономит значительное количество "
+"времени на части машин, которые постоянно строят порты (смотрите ниже)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/slow-porting/_index.adoc:366
+msgid ""
+"It is also recommended that if there are reasonable default answers to the "
+"questions, `PACKAGE_BUILDING` be used to turn off the interactive script "
+"when it is set. This will allow us to build the packages for CDROMs and FTP."
+msgstr ""
+"При наличии разумных ответов на задаваемые вопросы, подходящих по умолчанию, "
+"также рекомендуется проверять переменную `PACKAGE_BUILDING` и выключать "
+"интерактивный скрипт, если он есть. Это позволит нам строить пакеты для "
+"помещения на компакт-диски и FTP-серверы."
diff --git a/documentation/content/ru/books/porters-handbook/special/_index.adoc b/documentation/content/ru/books/porters-handbook/special/_index.adoc
index 9bfdfcc275..14f3d94db3 100644
--- a/documentation/content/ru/books/porters-handbook/special/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/special/_index.adoc
@@ -1,11 +1,13 @@
---
-title: Глава 6. Особые соглашения
+description: 'Особые соображения при создании нового порта FreeBSD'
+next: books/porters-handbook/flavors
+params:
+ path: /books/porters-handbook/special/
prev: books/porters-handbook/makefiles
-next: books/porters-handbook/plist
showBookMenu: true
+tags: ["special considerations", "Handling Symbolic Links", "Bundled Libraries"]
+title: 'Глава 6. Особые соглашения'
weight: 6
-params:
- path: "/books/porters-handbook/special/"
---
[[special]]
@@ -48,17 +50,31 @@ endif::[]
Имеется ещё несколько вещей, которые вы должны иметь в виду при создании порта. Этот раздел описывает наиболее часто встречающиеся из них.
+[[splitting-long-files]]
+== Разделение длинных файлов
+
+Иногда [.filename]#Makefiles# могут быть очень длинными. Например, порты rust могут содержать очень длинный список `CARGO_CRATES`. В других случаях [.filename]#Makefile# может содержать код, который варьируется в зависимости от архитектуры. В таких ситуациях может быть удобно разделить исходный [.filename]#Makefile# на несколько файлов. [.filename]#bsd.port.mk# автоматически включает некоторые типы [.filename]#Makefiles# в основной [.filename]#Makefile# порта.
+
+Вот файлы, которые система обрабатывает автоматически, если они обнаружены:
+
+* [.filename]#Makefile.crates#. Пример можно найти в пакете package:audio/ebur128[].
+* [.filename]#Makefile.inc#. Пример можно найти в пакете package:net/ntp[].
+* [.filename]#Makefile.${ARCH}-${OPSYS}#
+* [.filename]#Makefile.${OPSYS}#. Пример можно найти в пакете package:net/cvsup-static[].
+* [.filename]#Makefile.${ARCH}#
+* [.filename]#Makefile.local#
+
+Также распространённой практикой является разделение списка пакетов порта на несколько файлов, если список сильно различается в зависимости от архитектуры или выбранного флейвора. В этом случае файл [.filename]#pkg-plist# для каждой архитектуры именуется по шаблону [.filename]#pkg-plist.${ARCH}# или [.filename]#pkg-plist.${FLAVOR}#. Фреймворк не создаёт список пакетов автоматически, если существует несколько файлов [.filename]#pkg-plist#. Ответственность за выбор подходящего файла [.filename]#pkg-plist# и его присвоение переменной `PLIST` лежит на того, кто делает порт. Примеры работы с этим можно найти в портах package:audio/logitechmediaserver[] и package:deskutils/libportal[].
+
[[staging]]
== Staging
-[.filename]#bsd.port.mk# ожидает от портов работу с "каталогом сборки". Это означает, что порт должен устанавливать файлы не напрямую в назначенные каталоги (то есть, например, под `PREFIX`), а в отдельный каталог, из которого затем собирается пакет. Во многих случаях привилегии root для этого не требуются, что делает возможным сборку пакетов из-под непривилегированного пользователя. В режиме staging порт собирается и устанавливается в каталог сборки `STAGEDIR`. Пакет создается из каталога сборки и затем устанавливается в систему. В инструментарии automake такая концепция именуется `DESTDIR`; в прочем, в FreeBSD `DESTDIR` имеет собственное значение (смотрите crossref:testing[porting-prefix, `PREFIX` и `DESTDIR`]).
-
-Если для порта всё ещё требуются системные привилегии при выполнении цели `package`, то в [.filename]#Makefile# должна быть добавлена следующая строка:
+[.filename]#bsd.port.mk# ожидает, что порты будут работать с "директорией стадии". Это означает, что порт не должен устанавливать файлы напрямую в обычные целевые директории (например, под `PREFIX`), а вместо этого в отдельную директорию, из которой затем собирается пакет. Во многих случаях это не требует прав root, что позволяет собирать пакеты от имени непривилегированного пользователя. При использовании стадии порт собирается и устанавливается в директорию стадии `STAGEDIR`. Пакет создаётся из директории стадии и затем устанавливается в систему. Инструменты Automake называют эту концепцию `DESTDIR`, но в FreeBSD `DESTDIR` имеет другое значение (см. crossref:testing[porting-prefix,`PREFIX` и `DESTDIR`]).
-[.programlisting]
-....
-NEED_ROOT= yes
-....
+[NOTE]
+====
+Ни один порт _на самом деле_ не должен работать от root. Этого в большинстве случаев можно избежать, используя crossref:uses[uses-uidfix,`USES=uidfix`]. Если порт всё ещё выполняет команды, такие как man:chown[8], man:chgrp[1], или принудительно устанавливает владельца или группу с помощью man:install[1], то используйте crossref:uses[uses-fakeroot,`USES=fakeroot`], чтобы подделать эти вызовы. Потребуется некоторая правка [.filename]#Makefiles# порта.
+====
Метапорты, то есть порты, которые не устанавливают файлы непосредственно, а только зависят от других портов, должны по возможности избегать распаковки man:mtree[8] в каталог сборки. Это основная иерархия каталогов пакета, и эти пустые каталоги будут выглядеть лишними. Для предотвращения распаковки man:mtree[8] добавьте эту строку:
@@ -67,18 +83,97 @@ NEED_ROOT= yes
NO_MTREE= yes
....
-Staging задействуется посредством добавления переменной `STAGEDIR` слева от путей, которые используются в целях `pre-install`, `do-install` и `post-install` (смотрите примеры в книге). Обычно сюда относятся `PREFIX`, `ETCDIR`, `DATADIR`, `EXAMPLESDIR`, `MANPREFIX`, `DOCSDIR` и так далее. Каталоги должны создаваться при выполнении цели `post-install`. Избегайте использования абсолютных путей, когда это возможно.
+[TIP]
+====
+Метапорты должны использовать crossref:special[uses-metaport,`USES=metaport`]. Это устанавливает значения по умолчанию для портов, которые не загружают, не собирают и не устанавливают ничего.
+====
+
+Этап подготовки включается путем добавления `STAGEDIR` к путям, используемым в целях `pre-install`, `do-install` и `post-install` (см. примеры в книге). Обычно это включает `PREFIX`, `ETCDIR`, `DATADIR`, `EXAMPLESDIR`, `DOCSDIR` и т. д. Каталоги должны создаваться как часть цели `post-install`. По возможности избегайте использования абсолютных путей.
+
+[TIP]
+====
+Порты, которые устанавливают модули ядра, должны добавлять `STAGEDIR` к пути назначения, по умолчанию это [.filename]#/boot/modules#.
+====
-При создании символический ссылки `STAGEDIR` должен ставиться только для пути назначения. Например:
+[[staging-symlink]]
+=== Обработка символических ссылок
+
+При создании символической ссылки настоятельно рекомендуется использовать относительные пути. Используйте `${RLN}` для создания относительных символических ссылок. Эта команда использует man:install[1] для автоматического определения относительной ссылки, которую нужно создать.
+
+[[staging-ex1]]
+.Автоматическое создание относительных символических ссылок
+[example]
+====
+`${RLN}` использует относительную символическую ссылку из man:install[1], что освобождает сборщика порта от вычисления относительного пути.
[.programlisting]
....
-${LN} -sf libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so
+${RLN} ${STAGEDIR}${PREFIX}/lib/libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so
+${RLN} ${STAGEDIR}${PREFIX}/libexec/foo/bar ${STAGEDIR}${PREFIX}/bin/bar
+${RLN} ${STAGEDIR}/var/cache/foo ${STAGEDIR}${PREFIX}/share/foo
+....
+
+Будет создано:
+
+[source, shell]
+....
+% ls -lF ${STAGEDIR}${PREFIX}/lib
+lrwxr-xr-x 1 nobody nobody 181 Aug 3 11:27 libfoo.so@ -> libfoo.so.42
+-rwxr-xr-x 1 nobody nobody 15 Aug 3 11:24 libfoo.so.42*
+% ls -lF ${STAGEDIR}${PREFIX}/bin
+lrwxr-xr-x 1 nobody nobody 181 Aug 3 11:27 bar@ -> ../libexec/foo/bar
+% ls -lF ${STAGEDIRDIR}${PREFIX}/share
+lrwxr-xr-x 1 nobody nobody 181 Aug 3 11:27 foo@ -> ../../../var/cache/foo
....
-Первоначальный путь [.filename]#${PREFIX}/lib/libfoo.so.42# выглядит нормально, но по факту может быть неправильным. Абсолютные пути могут указывать на неподходящее место, например, когда удалённая файловая система смонтирована по NFS как непривилегированная точка монтирования. Относительные пути реже подвержены проблемам и часто намного короче.
+====
+
+[[bundled-libs]]
+== Встроенные библиотеки
+
+Этот раздел объясняет, почему встроенные зависимости считаются плохими и что с этим делать.
+
+[[bundled-libs-why-bad]]
+=== Почему встроенные библиотеки — это плохо
+
+Некоторое программное обеспечение требует от упаковщика найти сторонние библиотеки и добавить необходимые зависимости в порт. Другое ПО включает все необходимые библиотеки в дистрибутивный файл. Второй подход кажется проще на первый взгляд, но имеет серьёзные недостатки:
+
+Этот список частично основан на вики https://fedoraproject.org/wiki/Packaging:No_Bundled_Libraries[Fedora] и https://wiki.gentoo.org/wiki/Why_not_bundle_dependencies[Gentoo], оба распространяются по лицензии https://creativecommons.org/licenses/by-sa/3.0/[CC-BY-SA 3.0].
+
+Безопасность::
+Если уязвимости обнаружены в вышестоящей библиотеке и исправлены там, они могут остаться неисправленными в библиотеке, поставляемой с портом. Одной из причин может быть то, что автор не знает о проблеме. Это означает, что портировщик должен исправить их или обновить до не уязвимой версии и отправить исправление автору. Всё это требует времени, что приводит к тому, что программное обеспечение остаётся уязвимым дольше, чем необходимо. Это, в свою очередь, затрудняет координацию исправления без неоправданного раскрытия информации об уязвимости.
+
+Ошибки::
+Эта проблема аналогична проблеме с безопасностью в последнем абзаце, но в целом менее серьезная.
+
+Ветвление::
+Автору проще создать форк upstream-библиотеки после её включения в дистрибутив. Хотя на первый взгляд это кажется удобным, такой подход приводит к расхождению кода с исходным репозиторием, что усложняет исправление уязвимостей и других проблем в ПО. Одна из причин — затруднённое применение патчей.
++
+Еще одна проблема форкинга заключается в том, что из-за расхождения кода с основной веткой, ошибки исправляются снова и снова, вместо того чтобы быть исправленными один раз в центральном месте. Это противоречит самой идее открытого программного обеспечения.
+
+Конфликты символов::
+Когда библиотека установлена в системе, может возникнуть конфликт с встроенной в порт версией. Это может привести к немедленным ошибкам во время компиляции или компоновки. Также могут возникать ошибки при запуске программы, которые сложнее отследить. Последняя проблема может быть вызвана несовместимостью версий двух библиотек.
-Порты, устанавливающие модули ядра, должны предварять путь установки (по умолчанию [.filename]#/boot/modules#) переменной `STAGEDIR`.
+Лицензирование::
+При объединении проектов из различных источников могут возникать проблемы с лицензиями, особенно если лицензии несовместимы.
+
+Растрата ресурсов::
+Библиотеки, поставляемые в комплекте, растрачивают ресурсы на нескольких уровнях. Сборка самого приложения занимает больше времени, особенно если эти библиотеки уже присутствуют в системе. Во время выполнения они могут занимать дополнительную память, когда общесистемная библиотека уже загружена одной программой, а входящая в комплект библиотека загружена другой программой.
+
+Пустая трата усилий::
+Когда библиотеке требуются патчи для FreeBSD, эти патчи приходится дублировать в составе библиотеки. Это приводит к потере времени разработчиков, поскольку патчи могут применяться некорректно. Кроме того, бывает сложно сразу заметить, что эти патчи вообще необходимы.
+
+[[bundled-libs-practices]]
+=== Что делать со встроенными библиотеками
+
+По возможности используйте независимую версию библиотеки, добавив `LIB_DEPENDS` в порт. Если такого порта ещё не существует, рассмотрите возможность его создания.
+
+Используйте встроенные библиотеки только в том случае, если разработчик имеет хорошую репутацию в вопросах безопасности, а использование внешних версий приводит к излишне сложным исправлениям.
+
+[NOTE]
+====
+В некоторых особых случаях, например, для эмуляторов, таких как Wine, порт должен включать библиотеки, потому что они предназначены для другой архитектуры или были изменены для использования в данном программном обеспечении. В таком случае эти библиотеки не должны быть доступны для связывания с другими портами. Добавьте `BUNDLE_LIBS=yes` в [.filename]#Makefile# порта. Это укажет man:pkg[8] не учитывать предоставляемые библиотеки. Всегда спрашивайте {portmgr}, прежде чем добавлять это в порт.
+====
[[porting-shlibs]]
== Динамические библиотеки
@@ -101,7 +196,7 @@ USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar
При установке 32-разрядных библиотек на 64-разрядной системе используйте вместо этого `USE_LDCONFIG32`.
-Постарайтесь сохранять номера версий динамических библиотек в формате [.filename]#libfoo.so.0#. Наш компоновщик позаботится только о старшем (первом) номере.
+Если программное обеспечение использует crossref:special[using-autotools,autotools], в частности `libtool`, добавьте crossref:uses[uses-libtool,`USES=libtool`].
Если при обновлении порта увеличивается старший номер версии библиотеки, то для всех портов, компонуемых с затронутой библиотекой, следует увеличить значение `PORTREVISION` для форсирования перекомпиляции с новой версией библиотеки.
@@ -117,6 +212,7 @@ USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar
В подобных ситуациях можно использовать переменные, описываемые в последующих разделах.
+[[porting-restrictions-no_package]]
=== `NO_PACKAGE`
Эта переменная указывает, что мы не можем создавать для приложения двоичный пакет. К примеру, лицензия не позволяет бинарное распространение или она может запрещать распространение пакетов, созданных из изменённых исходников.
@@ -127,6 +223,7 @@ USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar
Значением переменной `NO_PACKAGE` должна быть строка, описывающая причину, по которой пакет не должен создаваться.
+[[porting-restrictions-no_cdrom]]
=== `NO_CDROM`
Эта переменная указывает на то, что, хотя мы имеем право создавать бинарные пакеты, мы не можем помещать эти пакеты или файлы `DISTFILES` порта на CD-ROM (или на похожие носители) для перепродажи. Однако бинарные пакеты и файлы `DISTFILES` порта будут оставаться доступными посредством FTP/HTTP.
@@ -135,12 +232,14 @@ USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar
В качестве значения `NO_CDROM` должна указываться строка, описывающая причины, по которым порт не может распространяться на CD-ROM. К примеру, это применяется, если лицензионное соглашение приложения предполагает только его "некоммерческое" использование.
+[[porting-restrictions-nofetchfiles]]
=== `NOFETCHFILES`
Файлы, определенные в переменной `NOFETCHFILES`, не будут извлекаться ни из одного из `MASTER_SITES`. Примером такого файла является файл, поставляемый на CD-ROM.
Инструменты, проверяющие доступность этих файлов на `MASTER_SITES`, должны игнорировать эти файлы и не сообщать о них.
+[[porting-restrictions-restricted]]
=== `RESTRICTED`
Задайте эту переменную, если лицензия на приложение не позволяет ни зеркалировать файлы `DISTFILES`, ни распространять бинарный пакет через FTP/HTTP или на CD-ROM.
@@ -149,19 +248,23 @@ USE_LDCONFIG= ${PREFIX}/lib/foo ${PREFIX}/lib/bar
В качестве значения `RESTRICTED` должна указываться строка, описывающая причины, по которым порт нельзя распространять. Обычно это означает, что порт использует закрытое программное обеспечение, а пользователь должен вручную сгрузить файлы `DISTFILES`, возможно, после заполнения регистрационной формы или подтверждения соглашения с условиями EULA.
+[[porting-restrictions-restricted_files]]
=== `RESTRICTED_FILES`
Если заданы `RESTRICTED` или `NO_CDROM`, то значение этой переменной по умолчанию соответствует `${DISTFILES} ${PATCHFILES}`, в противном случае она пуста. Если ограничены в распространении лишь некоторые из дистрибутивных файлов, то в этой переменной задаётся их список.
+[[porting-restrictions-legal_text]]
=== `LEGAL_TEXT`
Если порт имеет правовое обременение, которое не покрывается перечисленными выше переменными, то переменной `LEGAL_TEXT` следует присвоить строку с описанием данного обременения. Например, если было получено особое разрешение для FreeBSD на распространение двоичного файла, то эта переменная должна содержать соответствующее указание.
+[[porting-restrictions-legal]]
=== [.filename]#/usr/ports/LEGAL# и `LEGAL`
Порт, содержащий любую из перечисленных выше переменных, также должен быть добавлен в [.filename]#/usr/ports/LEGAL#. Первый столбец содержит шаблон совпадения с дистрибутивными файлами, имеющими ограничения на распространение. Второй столбец содержит корень порта. Третий столбец содержит вывод `make -VLEGAL`.
-=== Примеры использования
+[[porting-restrictions-examples]]
+=== Примеры
Предпочтительным способом реализации утверждения "архивы исходных текстов для этого порта должны загружаться самостоятельно" является следующее:
@@ -186,23 +289,19 @@ IGNORE= may not be redistributed because of licensing reasons. Please visit some
Это достигается путём передачи флага `-jX` команде man:make[1]. Такое построение портов является поведением по умолчанию. К сожалению, не все порты поддерживают параллельную сборку достаточно хорошо, и поэтому может потребоваться выключить этот механизм явным образом путём добавления переменной `MAKE_JOBS_UNSAFE=yes`. Эта переменная используется в случае, когда известно, что порт ломается с `-jX`.
+[IMPORTANT]
+====
+При установке `MAKE_JOBS_UNSAFE` очень важно объяснить либо комментарием в [.filename]#Makefile#, либо хотя бы в сообщении коммита, _почему_ порт не собирается при включении. В противном случае практически невозможно ни исправить проблему, ни проверить, была ли она исправлена при коммите обновления в дальнейшем.
+====
+
[[using-make]]
=== `make`, `gmake` и `imake`
-Если ваш порт использует GNU make, то установите `USES= gmake`.
-
-.Переменные для портов, использующих gmake
-[cols="1,1", frame="none", options="header"]
-|===
-| Переменная
-| Значение
+Существует несколько различных реализаций `make`. Переносимому программному обеспечению часто требуется конкретная реализация, например GNU `make`, известная в FreeBSD как `gmake`.
-|`USES= gmake`
-|Для сборки порта требуется `gmake`.
+Если порт использует GNU make, добавьте `gmake` в `USES`.
-|`GMAKE`
-|Полный путь к команде `gmake`, если отсутствует в `PATH`.
-|===
+`MAKE_CMD` может использоваться для ссылки на конкретную команду, настроенную параметром `USES` в [.filename]#Makefile# порта. Используйте `MAKE_CMD` только внутри [.filename]##Makefile## приложения в `WRKSRC` для вызова реализации `make`, ожидаемой портируемым программным обеспечением.
Если ваш порт является приложением X, которое создает файлы [.filename]#Makefile# из [.filename]#Imakefile#, используя imake, то установите `USES= imake`. Это заставит стадию конфигурирования автоматически выполнить `xmkmf -a`. Если флаг `-a` представляет для вашего порта проблему, то установите `XMKMF=xmkmf`. Если порт использует imake, но не понимает цель `install.man`, то следует установить `NO_INSTALL_MANPAGES=yes`.
@@ -213,6 +312,7 @@ IGNORE= may not be redistributed because of licensing reasons. Please visit some
Если ваш порт использует сценарий `configure` для получения файлов [.filename]#Makefile# из файлов [.filename]#Makefile.in#, то установите `GNU_CONFIGURE=yes`. Если вы хотите дать дополнительные параметры сценарию `configure` (аргументом по умолчанию является `--prefix=${PREFIX} --infodir=${PREFIX}/${INFO_PATH} --mandir=${MANPREFIX}/man --build=${CONFIGURE_TARGET}`), установите эти параметры в `CONFIGURE_ARGS`. Дополнительные переменные окружения можно передать, используя переменную `CONFIGURE_ENV`.
+[[using-configure-variables]]
.Переменные для портов, использующих `configure`
[cols="1,1", frame="none", options="header"]
|===
@@ -238,8 +338,9 @@ IGNORE= may not be redistributed because of licensing reasons. Please visit some
[[using-cmake]]
=== Использование `cmake`
-Если порт использует CMake, определите `USES= cmake` или `USES= cmake:outsource` для построения во внешнем каталоге (см. ниже).
+Если порт использует CMake, определите `USES= cmake`.
+[[using-cmake-variables]]
.Переменные для портов, использующих `cmake`
[cols="1,1", frame="none", options="header"]
|===
@@ -247,27 +348,33 @@ IGNORE= may not be redistributed because of licensing reasons. Please visit some
| Значение
|`CMAKE_ARGS`
-|Специфичные для порта флаги CMake, передаваемые `cmake`.
+|Специфичные для порта флаги CMake, передаваемые в бинарный файл `cmake`.
-|`CMAKE_BUILD_TYPE`
-|Тип построения (предопределённые профили построения CMake). По умолчанию `Release`, `Debug` при использовании `WITH_DEBUG`.
+|`CMAKE_ON`
+|Для каждой записи в `CMAKE_ON` добавляется булево значение "включено" в
+`CMAKE_ARGS`. См. crossref:special[using-cmake-example2,`CMAKE_ON` и `CMAKE_OFF`].
-|`CMAKE_ENV`
-|Переменные окружения для передачи `cmake`. По умолчанию `${CONFIGURE_ENV}`.
+|`CMAKE_OFF`
+|Для каждой записи в `CMAKE_OFF` в `CMAKE_ARGS` добавляется отключенное булево
+значение. См. crossref:special[using-cmake-example2,`CMAKE_ON` и `CMAKE_OFF`].
+
+|`CMAKE_BUILD_TYPE`
+|Тип сборки (предопределённые профили сборки CMake). По умолчанию `Release`, или `Debug`, если установлен `WITH_DEBUG`.
|`CMAKE_SOURCE_PATH`
-|Путь к каталогу с исходным кодом. По умолчанию `${WRKSRC}`.
+|Путь к исходному каталогу. По умолчанию `${WRKSRC}`.
+
+|`CONFIGURE_ENV`
+|Дополнительные переменные окружения, которые должны быть установлены для бинарного файла `cmake`.
|===
-.Переменные построения `cmake`, устанавливаемые пользователем
+[[using-cmake-user-variables]]
+.Переменные, которые пользователи могут определить для сборок `cmake`
[cols="1,1", frame="none", options="header"]
|===
| Переменная
| Значение
-|`CMAKE_VERBOSE`
-|Разрешает подробный вывод сообщений при построении. Значение по умолчанию не задано, если не заданы `BATCH` или `PACKAGE_BUILDING`.
-
|`CMAKE_NOCOLOR`
|Запрещает цветной вывод сообщений при построении. Значение по умолчанию не задано, если не заданы `BATCH` или `PACKAGE_BUILDING`.
|===
@@ -284,179 +391,765 @@ CMake поддерживает следующие профили построе
[.programlisting]
....
-USES= cmake:outsource
+USES= cmake
CMAKE_SOURCE_PATH= ${WRKSRC}/subproject
....
====
+[[using-cmake-example2]]
+.`CMAKE_ON` и `CMAKE_OFF`
+[example]
+====
+При добавлении логических значений в `CMAKE_ARGS` проще использовать переменные `CMAKE_ON` и `CMAKE_OFF` вместо этого. Это:
+
+[.programlisting]
+....
+CMAKE_ON= VAR1 VAR2
+CMAKE_OFF= VAR3
+....
+
+Эквивалентно:
+
+[.programlisting]
+....
+CMAKE_ARGS= -DVAR1:BOOL=TRUE -DVAR2:BOOL=TRUE -DVAR3:BOOL=FALSE
+....
+
+[IMPORTANT]
+======
+Это относится только к значениям по умолчанию в `CMAKE_ARGS`. Вспомогательные функции, описанные в crossref:makefiles[options-cmake_bool,`OPT_CMAKE_BOOL` и `OPT_CMAKE_BOOL_OFF`], используют ту же семантику, но для опциональных значений.
+======
+
+====
+
[[using-scons]]
=== Использование `scons`
-Если ваш порт использует SCons, определите `USE_SCONS=yes`.
+Если порт использует SCons, определите `USES=scons`.
-.Переменные для портов, использующих `scons`
-[cols="1,1", frame="none", options="header"]
+Чтобы сторонний [.filename]#SConstruct# учитывал все, что передается в SCons через окружение (то есть, что наиболее важно, `CC/CXX/CFLAGS/CXXFLAGS`), исправьте [.filename]#SConstruct#, чтобы сборка `Environment` создавалась следующим образом:
+
+[.programlisting]
+....
+env = Environment(**ARGUMENTS)
+....
+
+Он может быть изменён с помощью `env.Append` и `env.Replace`.
+
+[[using-cargo]]
+=== Сборка приложений на Rust с помощью `cargo`
+
+Для портов, использующих Cargo, определите `USES=cargo`.
+
+[[using-cargo-user-variables]]
+.Переменные, которые пользователи могут определить для сборок `cargo`
+[cols="1,1,1", frame="none", options="header"]
|===
| Переменная
-| Значение
+| По умолчанию
+| Описание
+
+|`CARGO_CRATES`
+|
+|Список ящиков (crates), от которых зависит порт. Каждая запись должна быть в формате `имя_ящика-семвер`, например, `libc-0.2.40`. Поддерживающие порт могут сгенерировать этот список из файла [.filename]#Cargo.lock# с помощью команды `make cargo-crates`. Вручную обновлять версии ящиков возможно, но следует учитывать транзитивные зависимости.
+Если список, сгенерированный `make cargo-crates`, слишком велик, его можно разместить в файле `Makefile.crates` в корневом каталоге порта.
+Если такой файл присутствует, фреймворк портов автоматически загружает его.
+Это помогает сохранять основной Makefile порта в удобном для работы размере.
+
+|`CARGO_FEATURES`
+|
+|Список функций приложения для сборки (список через пробел). Чтобы отключить все функции по умолчанию, добавьте специальный токен `--no-default-features` в `CARGO_FEATURES`. Вручную передавать его в `CARGO_BUILD_ARGS`, `CARGO_INSTALL_ARGS` и `CARGO_TEST_ARGS` не требуется.
+
+|`CARGO_CARGOTOML`
+|`${WRKSRC}/Cargo.toml`
+|Путь к файлу [.filename]#Cargo.toml#, который следует использовать.
+
+|`CARGO_CARGOLOCK`
+|`${WRKSRC}/Cargo.lock`
+|Путь к файлу [.filename]#Cargo.lock#, используемому для `make cargo-crates`. Можно указать более одного файла блокировки, если это необходимо.
+
+|`CARGO_ENV`
+|
+|Список переменных окружения, передаваемых в Cargo, аналогично `MAKE_ENV`.
-|`SCONS_ARGS`
-|Специфичные для порта флаги SCons, передаваемые окружению SCons.
+|`RUSTFLAGS`
+|
+|Флаги для передачи компилятору Rust.
-|`SCONS_BUILDENV`
-|Переменные для установки в системном окружении.
+|`CARGO_CONFIGURE`
+|`yes`
+|Используйте стандартный `do-configure`.
-|`SCONS_ENV`
-|Переменные для установки в окружении SCons.
+|`CARGO_UPDATE_ARGS`
+|
+|Дополнительные аргументы для передачи Cargo во время фазы настройки. Допустимые аргументы можно посмотреть с помощью `cargo update --help`.
-|`SCONS_TARGET`
-|Последний параметр для передачи SCons, похожий на `MAKE_TARGET`.
+|`CARGO_BUILDDEP`
+|`yes`
+|Добавить зависимость сборки на package:lang/rust[].
+
+|`CARGO_CARGO_BIN`
+|`${LOCALBASE}/bin/cargo`
+|Расположение бинарного файла `cargo`.
+
+|`CARGO_BUILD`
+|`yes`
+|Используйте значение по умолчанию `do-build`.
+
+|`CARGO_BUILD_ARGS`
+|
+|Дополнительные аргументы для передачи Cargo во время фазы сборки. Допустимые аргументы можно посмотреть с помощью `cargo build --help`.
+
+|`CARGO_INSTALL`
+|`yes`
+|Используйте настройку `do-install` по умолчанию.
+
+|`CARGO_INSTALL_ARGS`
+|
+|Дополнительные аргументы для передачи Cargo во время фазы установки. Допустимые аргументы можно посмотреть с помощью `cargo install --help`.
+
+|`CARGO_INSTALL_PATH`
+|`.`
+|Путь к пакету для установки. Этот аргумент передается в `cargo install` через параметр `--path`. Если указано несколько путей, `cargo install` запускается несколько раз.
+
+|`CARGO_TEST`
+|`yes`
+|Используйте значение по умолчанию `do-test`.
+
+|`CARGO_TEST_ARGS`
+|
+|Дополнительные аргументы для передачи Cargo во время тестовой фазы. Допустимые аргументы можно посмотреть с помощью `cargo test --help`.
+
+|`CARGO_TARGET_DIR`
+|`${WRKDIR}/target`
+|Расположение выходного каталога cargo.
+
+|`CARGO_DIST_SUBDIR`
+|[.filename]#rust/crates#
+|Каталог относительно `DISTDIR`, в котором будут храниться файлы дистрибутивов пакетов (crates).
+
+|`CARGO_VENDOR_DIR`
+|`${WRKSRC}/cargo-crates`
+|Расположение каталога сторонних поставщиков ПО, в который будут извлечены все крейты. Старайтесь держать его в пределах `PATCH_WRKSRC`, чтобы упростить применение патчей.
+
+|`CARGO_USE_GITHUB`
+|`no`
+|Включить загрузку крейтов, привязанных к определённым коммитам Git на GitHub, с помощью `GH_TUPLE`. Это попытается исправить все файлы [.filename]#Cargo.toml# в `WRKDIR`, чтобы они ссылались на автономные источники вместо загрузки из репозитория Git во время сборки.
+
+|`CARGO_USE_GITLAB`
+|`no`
+|То же, что и `CARGO_USE_GITHUB`, но для экземпляров GitLab и `GL_TUPLE`.
|===
-Для того, чтобы сторонний [.filename]#SConstruct# соответствовал всему, что передается SCons в переменной `SCONS_ENV` (самое главное, это `CC/CXX/CFLAGS/CXXFLAGS`), примените патч к [.filename]#SConstruct#, так чтобы переменная построения `Environment` выглядела следующим образом:
+[[cargo-ex1]]
+.Создание порта для простого приложения на Rust
+[example]
+====
+Создание порта на основе Cargo — это процесс из трёх этапов. Сначала необходимо предоставить шаблон портов, который загружает дистрибутивный файл приложения:
[.programlisting]
....
-env = Environment(**ARGUMENTS)
+PORTNAME= tokei
+DISTVERSIONPREFIX= v
+DISTVERSION= 7.0.2
+CATEGORIES= devel
+
+MAINTAINER= tobik@FreeBSD.org
+COMMENT= Display statistics about your code
+WWW= https://github.com/XAMPPRocky/tokei/
+
+USES= cargo
+USE_GITHUB= yes
+GH_ACCOUNT= Aaronepower
+
+.include <bsd.port.mk>
....
-В дальнейшем ее можно изменить при помощи `env.Append` и `env.Replace`.
+Сгенерировать первоначальный [.filename]#distinfo#:
-[[using-autotools]]
-== Использование GNU Autotools
+[source, shell]
+....
+% make makesum
+=> Aaronepower-tokei-v7.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+=> Attempting to fetch https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz
+fetch: https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz: size of remote file is not known
+Aaronepower-tokei-v7.0.2_GH0.tar.gz 45 kB 239 kBps 00m00s
+....
-[[using-autotools-introduction]]
-=== Введение
+Теперь файл дистрибутива готов к использованию, и мы можем продолжить, извлекая зависимости пакета из встроенного файла [.filename]#Cargo.lock#:
-Различные инструменты GNU autotools предоставляют механизм абстракции для построения частей программного обеспечения на широком наборе операционных систем и аппаратных архитектур. Внутри Коллекции Портов отдельный порт может использовать эти инструменты при помощи простых конструкций:
+[source, shell]
+....
+% make cargo-crates
+CARGO_CRATES= aho-corasick-0.6.4 \
+ ansi_term-0.11.0 \
+ arrayvec-0.4.7 \
+ atty-0.2.9 \
+ bitflags-1.0.1 \
+ byteorder-1.2.2 \
+ [...]
+....
+
+Вывод этой команды необходимо вставить напрямую в Makefile:
[.programlisting]
....
-USE_AUTOTOOLS= tool:version[:operation] ...
+PORTNAME= tokei
+DISTVERSIONPREFIX= v
+DISTVERSION= 7.0.2
+CATEGORIES= devel
+
+MAINTAINER= tobik@FreeBSD.org
+COMMENT= Display statistics about your code
+WWW= https://github.com/XAMPPRocky/tokei/
+
+USES= cargo
+USE_GITHUB= yes
+GH_ACCOUNT= Aaronepower
+
+CARGO_CRATES= aho-corasick-0.6.4 \
+ ansi_term-0.11.0 \
+ arrayvec-0.4.7 \
+ atty-0.2.9 \
+ bitflags-1.0.1 \
+ byteorder-1.2.2 \
+ [...]
+
+.include <bsd.port.mk>
+....
+
+[.filename]#distinfo# необходимо перегенерировать, чтобы включить все дистрибутивные файлы крейтов:
+
+[source, shell]
+....
+% make makesum
+=> rust/crates/aho-corasick-0.6.4.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+=> Attempting to fetch https://crates.io/api/v1/crates/aho-corasick/0.6.4/download?dummy=/rust/crates/aho-corasick-0.6.4.tar.gz
+rust/crates/aho-corasick-0.6.4.tar.gz 100% of 24 kB 6139 kBps 00m00s
+=> rust/crates/ansi_term-0.11.0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+=> Attempting to fetch https://crates.io/api/v1/crates/ansi_term/0.11.0/download?dummy=/rust/crates/ansi_term-0.11.0.tar.gz
+rust/crates/ansi_term-0.11.0.tar.gz 100% of 16 kB 21 MBps 00m00s
+=> rust/crates/arrayvec-0.4.7.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+=> Attempting to fetch https://crates.io/api/v1/crates/arrayvec/0.4.7/download?dummy=/rust/crates/arrayvec-0.4.7.tar.gz
+rust/crates/arrayvec-0.4.7.tar.gz 100% of 22 kB 3237 kBps 00m00s
+=> rust/crates/atty-0.2.9.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+=> Attempting to fetch https://crates.io/api/v1/crates/atty/0.2.9/download?dummy=/rust/crates/atty-0.2.9.tar.gz
+rust/crates/atty-0.2.9.tar.gz 100% of 5898 B 81 MBps 00m00s
+=> rust/crates/bitflags-1.0.1.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+[...]
....
-К моменту написания _tool_ может быть одним из `libtool`, `libltdl`, `autoconf`, `autoheader`, `automake` или `aclocal`.
+Порт теперь готов к тестовой сборке и дальнейшим настройкам, таким как создание plist, написание описания, добавление информации о лицензии, опций и т.д., как обычно.
+
+Если вы не тестируете свой порт в чистой среде, например, с использованием poudriere, не забудьте выполнить `make clean` перед любым тестированием.
+====
+
+[[cargo-ex2]]
+.Включение дополнительных возможностей приложений
+[example]
+====
+Некоторые приложения определяют дополнительные возможности в своем [.filename]#Cargo.toml#. Их можно включить при компиляции, установив `CARGO_FEATURES` в порте.
-_version_ указывает конкретную версию используемого инструмента (смотрите `devel/{automake,autoconf,libtool}[0-9]+` для получения действительных версий).
+Здесь мы включаем функции `json` и `yaml` в Tokei:
-_operation_ является необязательным расширением и указывает на способ использования инструмента.
+[.programlisting]
+....
+CARGO_FEATURES= json yaml
+....
-Одновременно может быть указано несколько инструментов, добавляя их все на одной строке или используя конструкцию Makefile `+=`.
+====
-В заключение, существует специальный инструмент по называнию `autotools`, который является удобной функцией при установке всех доступных версий autotools для возможности проведения кросс-разработки. Это также может быть достигнуто путем установки порта `devel/autotools`.
+[[cargo-ex4]]
+.Кодирование характеристик приложений как параметров порта
+[example]
+====
+Пример раздела `[features]` в [.filename]#Cargo.toml# может выглядеть так:
-[[using-libtool]]
-=== `libtool`
+[.programlisting]
+....
+[features]
+pulseaudio_backend = ["librespot-playback/pulseaudio-backend"]
+portaudio_backend = ["librespot-playback/portaudio-backend"]
+default = ["pulseaudio_backend"]
+....
-Динамические библиотеки, использующие инфраструктуру построения GNU, обычно используют libtool для настройки компиляции и установки динамических библиотек в соответствии с особенностями данной операционной системы. В типичной практике используется копирование встроенного в приложение `libtool`. Если вам нужно использовать внешнюю команду `libtool`, то вы можете использовать версию, поставляемую Коллекцией Портов:
+`pulseaudio_backend` — это функция по умолчанию. Она всегда включена, если мы явно не отключим функции по умолчанию, добавив `--no-default-features` в `CARGO_FEATURES`. Здесь мы превращаем функции `portaudio_backend` и `pulseaudio_backend` в опции порта:
[.programlisting]
....
-USE_AUTOTOOLS= libtool:version[:env]
+CARGO_FEATURES= --no-default-features
+
+OPTIONS_DEFINE= PORTAUDIO PULSEAUDIO
+
+PORTAUDIO_VARS= CARGO_FEATURES+=portaudio_backend
+PULSEAUDIO_VARS= CARGO_FEATURES+=pulseaudio_backend
....
-При отсутствии дополнительных операций, `libtool:version` сообщает инфраструктуре построения о применении патча к сценарию configure с установленной в системе копией `libtool`. Означает использование `GNU_CONFIGURE`. Более того, некоторые переменные make и оболочки shell будут назначены для дальнейшего использования этим портом. Подробности смотрите в [.filename]#bsd.autotools.mk#.
+====
-При использовании операции `:env` будет настроено только окружение.
+[[cargo-ex3]]
+.Перечисление лицензий крейтов
+[example]
+====
+Крейты имеют собственные лицензии. Важно знать, какие они, при добавлении блока `LICENSE` в порт (см. crossref:makefiles[licenses,Лицензии]). Вспомогательная цель `cargo-crates-licenses` попытается перечислить все лицензии всех ящиков, определённых в `CARGO_CRATES`.
-Наконец, `LIBTOOLFLAGS` и `LIBTOOLFILES` можно установить по желанию, чтобы переопределить наиболее вероятные аргументы для `libtool` и файлы, предназначенные для изменения. Большинству портов это скорее всего не понадобится. Для дальнейших подробностей смотрите [.filename]#bsd.autotools.mk#.
+[source, shell]
+....
+% make cargo-crates-licenses
+aho-corasick-0.6.4 Unlicense/MIT
+ansi_term-0.11.0 MIT
+arrayvec-0.4.7 MIT/Apache-2.0
+atty-0.2.9 MIT
+bitflags-1.0.1 MIT/Apache-2.0
+byteorder-1.2.2 Unlicense/MIT
+[...]
+....
-[[using-libltdl]]
-=== `libltdl`
+[NOTE]
+======
+Названия лицензий, которые выводит `make cargo-crates-licenses`, являются SPDX 2.1-совместимыми лицензионными выражениями, которые не совпадают с названиями лицензий, определёнными в фреймворке портов. Их необходимо перевести в названия из crossref:makefiles[licenses-license-list,Списка предопределённых лицензий].
+======
-Некоторые порты задействуют пакет с библиотекой `libltdl`, которая является частью комплекта `libtool`. Использование этой библиотеки не вызывает автоматическое использование самой `libtool`, и, таким образом, обеспечивается отдельная конструкция.
+====
+
+[[using-meson]]
+=== Использование `meson`
+
+Для портов, использующих Meson, определите `USES=meson`.
+
+[[using-meson-variables]]
+.Переменные для портов, использующих `meson`
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Описание
+
+|`MESON_ARGS`
+|Порт-специфичные флаги Meson, передаваемые в бинарный файл `meson`.
+
+|`MESON_BUILD_DIR`
+|Путь к директории сборки относительно `WRKSRC`. По умолчанию — `_build`.
+|===
+
+[[using-meson-example]]
+.Пример `USES=meson`
+[example]
+====
+Этот фрагмент демонстрирует использование Meson для порта.
+
+[.programlisting]
+....
+USES= meson
+MESON_ARGS= -Dfoo=enabled
+....
+
+====
+
+[[using-go]]
+=== Создание приложений на Go
+
+Для портов, использующих Go, определите `USES=go`. Обратитесь к crossref:uses[uses-go,`go`] для получения списка переменных, которые можно задать для управления процессом сборки.
+
+[[go-ex1]]
+.Создание порта для приложения на основе модулей Go
+[example]
+====
+В большинстве случаев достаточно установить переменную `GO_MODULE` в значение, указанное директивой `module` в `go.mod`:
+
+[.programlisting]
+....
+PORTNAME= hey
+DISTVERSIONPREFIX= v
+DISTVERSION= 0.1.4
+CATEGORIES= benchmarks
+
+MAINTAINER= dmgk@FreeBSD.org
+COMMENT= Tiny program that sends some load to a web application
+WWW= https://github.com/rakyll/hey/
+
+LICENSE= APACHE20
+LICENSE_FILE= ${WRKSRC}/LICENSE
+
+USES= go:modules
+GO_MODULE= github.com/rakyll/hey
+
+PLIST_FILES= bin/hey
+
+.include <bsd.port.mk>
+....
+
+Если «простой» способ не подходит или требуется больший контроль над зависимостями, полный процесс переноса описан ниже.
+
+Создание порта на основе Go — это процесс из пяти этапов. Сначала необходимо предоставить шаблон портов, который загружает дистрибутивный файл приложения:
+
+[.programlisting]
+....
+PORTNAME= ghq
+DISTVERSIONPREFIX= v
+DISTVERSION= 0.12.5
+CATEGORIES= devel
+
+MAINTAINER= tobik@FreeBSD.org
+COMMENT= Remote repository management made easy
+WWW= https://github.com/x-motemen/ghq/
+
+USES= go:modules
+USE_GITHUB= yes
+GH_ACCOUNT= motemen
+
+.include <bsd.port.mk>
+....
+
+Сгенерировать первоначальный [.filename]#distinfo#:
+
+[source, shell]
+....
+% make makesum
+===> License MIT accepted by the user
+=> motemen-ghq-v0.12.5_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+=> Attempting to fetch https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz
+fetch: https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz: size of remote file is not known
+motemen-ghq-v0.12.5_GH0.tar.gz 32 kB 177 kBps 00s
+....
+
+Теперь файл дистрибутива готов к использованию, и мы можем извлечь необходимые зависимости модуля Go. Этот шаг требует наличия установленного пакета package:ports-mgmt/modules2tuple[]:
+
+[source, shell]
+....
+% make gomod-vendor
+[...]
+GH_TUPLE= \
+ Songmu:gitconfig:v0.0.2:songmu_gitconfig/vendor/github.com/Songmu/gitconfig \
+ daviddengcn:go-colortext:186a3d44e920:daviddengcn_go_colortext/vendor/github.com/daviddengcn/go-colortext \
+ go-yaml:yaml:v2.2.2:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \
+ golang:net:3ec191127204:golang_net/vendor/golang.org/x/net \
+ golang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \
+ golang:xerrors:3ee3066db522:golang_xerrors/vendor/golang.org/x/xerrors \
+ motemen:go-colorine:45d19169413a:motemen_go_colorine/vendor/github.com/motemen/go-colorine \
+ urfave:cli:v1.20.0:urfave_cli/vendor/github.com/urfave/cli
+....
+
+Вывод этой команды необходимо вставить напрямую в Makefile:
+
+[.programlisting]
+....
+PORTNAME= ghq
+DISTVERSIONPREFIX= v
+DISTVERSION= 0.12.5
+CATEGORIES= devel
+
+MAINTAINER= tobik@FreeBSD.org
+COMMENT= Remote repository management made easy
+WWW= https://github.com/x-motemen/ghq/
+
+USES= go:modules
+USE_GITHUB= yes
+GH_ACCOUNT= motemen
+GH_TUPLE= Songmu:gitconfig:v0.0.2:songmu_gitconfig/vendor/github.com/Songmu/gitconfig \
+ daviddengcn:go-colortext:186a3d44e920:daviddengcn_go_colortext/vendor/github.com/daviddengcn/go-colortext \
+ go-yaml:yaml:v2.2.2:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \
+ golang:net:3ec191127204:golang_net/vendor/golang.org/x/net \
+ golang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \
+ golang:xerrors:3ee3066db522:golang_xerrors/vendor/golang.org/x/xerrors \
+ motemen:go-colorine:45d19169413a:motemen_go_colorine/vendor/github.com/motemen/go-colorine \
+ urfave:cli:v1.20.0:urfave_cli/vendor/github.com/urfave/cli
+
+.include <bsd.port.mk>
+....
+
+[.filename]#distinfo# необходимо обновить, чтобы включить все дистрибутивные файлы:
+
+[source, shell]
+....
+% make makesum
+=> Songmu-gitconfig-v0.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+=> Attempting to fetch https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz
+fetch: https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz: size of remote file is not known
+Songmu-gitconfig-v0.0.2_GH0.tar.gz 5662 B 936 kBps 00s
+=> daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.
+=> Attempting to fetch https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz
+fetch: https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz: size of remote file is not known
+daviddengcn-go-colortext-186a3d44e920_GH0.tar. 4534 B 1098 kBps 00s
+[...]
+....
+
+Порт теперь готов к тестовой сборке и дальнейшим настройкам, таким как создание plist, написание описания, добавление информации о лицензии, опций и т.д., как обычно.
+
+Если вы не тестируете свой порт в чистой среде, например, с использованием poudriere, не забудьте выполнить `make clean` перед любым тестированием.
+====
+
+[[go-ex2]]
+.Установка имени выходного бинарного файла или пути установки
+[example]
+====
+Некоторые порты требуют установки результирующего бинарного файла под другим именем или в путь, отличный от стандартного `${PREFIX}/bin`. Это можно сделать с помощью синтаксиса кортежа `GO_TARGET`, например:
+
+[.programlisting]
+....
+GO_TARGET= ./cmd/ipfs:ipfs-go
+....
+
+установит бинарный файл `ipfs` как `${PREFIX}/bin/ipfs-go` и
+
+[.programlisting]
+....
+GO_TARGET= ./dnscrypt-proxy:${PREFIX}/sbin/dnscrypt-proxy
+....
+
+установит `dnscrypt-proxy` в `${PREFIX}/sbin`.
+====
+
+[[using-cabal]]
+=== Построение приложений на Haskell с помощью `cabal`
+
+Для портов, использующих Cabal, система сборки определяет `USES=cabal`. Обратитесь к crossref:uses[uses-cabal,`cabal`] для получения списка переменных, которые можно задать для управления процессом сборки.
+
+[[cabal-ex1]]
+.Создание порта для приложения Haskell с Hackage
+[example]
+====
+При подготовке порта Haskell Cabal требуются программы package:devel/hs-cabal-install[] и package:ports-mgmt/hs-cabal2tuple[], поэтому убедитесь, что они установлены заранее. Сначала необходимо определить общие переменные портов, которые позволяют cabal-install загрузить файл дистрибутива пакета:
[.programlisting]
....
-USE_AUTOTOOLS= libltdl:version
+PORTNAME= ShellCheck
+DISTVERSION= 0.6.0
+CATEGORIES= devel
+
+MAINTAINER= haskell@FreeBSD.org
+COMMENT= Shell script analysis tool
+WWW= https://www.shellcheck.net/
+
+USES= cabal
+
+.include <bsd.port.mk>
+....
+
+Этот минимальный Makefile загружает файл дистрибутива с помощью вспомогательной цели `cabal-extract`:
+
+[source, shell]
+....
+% make cabal-extract
+[...]
+Downloading the latest package list from hackage.haskell.org
+cabal get ShellCheck-0.6.0
+Downloading ShellCheck-0.6.0
+Downloaded ShellCheck-0.6.0
+Unpacking to ShellCheck-0.6.0/
....
-Всё, что в настоящее время она делает, это добавление `LIB_DEPENDS` для подходящего порта `libltdl`, потому она предоставляется как удобная функция для помощи в устранении всяких зависимостей от портов autotools вне инфраструктуры `USE_AUTOTOOLS`. Для этого инструмента не существует необязательных операций.
+Теперь, когда у нас есть файл описания пакета ShellCheck.cabal в `${WRKSRC}`, мы можем использовать `cabal-configure` для создания плана сборки:
-[[using-autoconf]]
-=== `autoconf` и `autoheader`
+[source, shell]
+....
+% make cabal-configure
+[...]
+Resolving dependencies...
+Build profile: -w ghc-8.10.7 -O1
+In order, the following would be built (use -v for more details):
+ - Diff-0.4.1 (lib) (requires download & build)
+ - OneTuple-0.3.1 (lib) (requires download & build)
+[...]
+....
-Вместо сценария configure некоторые порты содержат шаблон autoconf в файле [.filename]#configure.ac#. Вы можете использовать следующие присвоения, чтобы позволить `autoconf` создать сценарий configure, а `autoheader` создать заголовки шаблона для использования в сценарии configure.
+После завершения можно сгенерировать список необходимых зависимостей:
+
+[source, shell]
+....
+% make make-use-cabal
+USE_CABAL= QuickCheck-2.12.6.1 \
+ hashable-1.3.0.0 \
+ integer-logarithms-1.0.3 \
+[...]
+....
+
+Пакеты Haskell могут содержать ревизии, как и порты FreeBSD. Ревизии могут затрагивать только файлы [.filename]#.cabal#. Обратите внимание на дополнительные номера версий после символа `_`. Замените старый список `USE_CABAL` на вновь сгенерированный.
+
+Наконец, файл [.filename]#distinfo# необходимо перегенерировать, чтобы он содержал все файлы дистрибутива:
+
+[source, shell]
+....
+% make makesum
+=> ShellCheck-0.6.0.tar.gz doesn't seem to exist in /usr/local/poudriere/ports/git/distfiles/cabal.
+=> Attempting to fetch https://hackage.haskell.org/package/ShellCheck-0.6.0/ShellCheck-0.6.0.tar.gz
+ShellCheck-0.6.0.tar.gz 136 kB 642 kBps 00s
+=> QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz doesn't seem to exist in /usr/local/poudriere/ports/git/distfiles/cabal.
+=> Attempting to fetch https://hackage.haskell.org/package/QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz
+QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz 65 kB 361 kBps 00s
+[...]
+....
+
+Порт теперь готов к тестовой сборке и дальнейшим настройкам, таким как создание plist, написание описания, добавление информации о лицензии, опций и т.д., как обычно.
+
+Если вы не тестируете свой порт в чистой среде, например, с использованием poudriere, не забудьте выполнить `make clean` перед любым тестированием.
+====
+
+Некоторые порты Haskell устанавливают различные файлы данных в `share/${PORTNAME}`. В таких случаях требуется особая обработка на стороне порта. Порт должен определить параметр `CABAL_WRAPPER_SCRIPTS`, перечислив каждый исполняемый файл, который будет использовать файлы данных. Более того, в редких случаях портируемая программа использует файлы данных других пакетов Haskell, и тогда на помощь приходит `FOO_DATADIR_VARS`.
+
+[[cabal-ex2]]
+.Обработка файлов данных в порте Haskell
+[example]
+====
+`devel/hs-profiteur` — это приложение на Haskell, которое генерирует одностраничный HTML с некоторым содержимым.
[.programlisting]
....
-USE_AUTOTOOLS= autoconf:version[:env]
+PORTNAME= profiteur
+
+[...]
+
+USES= cabal
+
+USE_CABAL= OneTuple-0.3.1_2 \
+ QuickCheck-2.14.2 \
+ [...]
+
+.include <bsd.port.mk>
....
+Он устанавливает HTML-шаблоны в `share/profiteur`, поэтому необходимо добавить параметр `CABAL_WRAPPER_SCRIPTS`:
[.programlisting]
....
-USE_AUTOTOOLS= autoheader:version
+[...]
+
+USE_CABAL= OneTuple-0.3.1_2 \
+ QuickCheck-2.14.2 \
+ [...]
+
+
+CABAL_WRAPPER_SCRIPTS= ${CABAL_EXECUTABLES}
+
+.include <bsd.port.mk>
+....
+
+Программа также пытается получить доступ к файлу `jquery.js`, который является частью пакета Haskell `js-jquery-3.3.1`. Чтобы этот файл был найден, необходимо, чтобы скрипт-обёртка искал файлы данных `js-jquery` также в `share/profiteur`. Для этого используется `profiteur_DATADIR_VARS`:
+
+[.programlisting]
....
+[...]
-которые также подразумевают использование `autoconf:version`.
+CABAL_WRAPPER_SCRIPTS= ${CABAL_EXECUTABLES}
+profiteur_DATADIR_VARS= js-jquery
-Аналогично команде `libtool` включение необязательной операции `:env` всего лишь настраивает окружение для дальнейшего использования. Без этого выполняется наложение патчей и переконфигурирование порта.
+.include <bsd.port.mk>
+....
-Дополнительные необязательные переменные `AUTOCONF_ARGS` и `AUTOHEADER_ARGS` можно переопределить в [.filename]#Makefile# порта, если указано явным образом. Как и с эквивалентами `libtool`, большинству портов это вряд ли понадобится.
+Теперь порт установит непосредственно бинарный файл в `libexec/cabal/profiteur`, а скрипт — в `bin/profiteur`.
-[[using-automake]]
-=== `automake` и `aclocal`
+====
+
+Не существует простого способа определить подходящее значение для параметра `FOO_DATADIR_VARS`, кроме как запустить программу и проверить, что всё работает. К счастью, необходимость использовать `FOO_DATADIR_VARS` возникает очень редко.
+
+Еще один крайний случай при переносе сложных программ на Haskell — наличие зависимостей от систем контроля версий (VCS) в файле `cabal.project`.
+
+[[cabal-ex3]]
+.Портирование приложений Haskell с зависимостями от VCS
+[example]
+====
+
+`net-p2p/cardano-node` — это чрезвычайно сложное программное обеспечение. В его `cabal.project` содержится множество блоков, подобных этому:
+
+[.programlisting]
+....
+[...]
+source-repository-package
+ type: git
+ location: https://github.com/input-output-hk/cardano-crypto
+ tag: f73079303f663e028288f9f4a9e08bcca39a923e
+[...]
+....
-Некоторые пакеты содержат только файлы [.filename]#Makefile.am#. Они должны быть преобразованы в файлы [.filename]#Makefile.in# с использованием automake и дальнейшей обработкой `configure` для получения настоящего [.filename]#Makefile#.
+Зависимости типа `source-repository-package` автоматически подтягиваются `cabal` в процессе сборки. К сожалению, это приводит к использованию сети после этапа `fetch`, что запрещено в рамках системы портов. Эти исходники необходимо указать в Makefile порта. Вспомогательная цель `make-use-cabal` может упростить работу с пакетами, размещёнными на GitHub. Запуск этой цели после стандартных `cabal-extract` и `cabal-configure` позволит получить не только параметр `USE_CABAL`, но и `GH_TUPLE`:
-Аналогично, иногда пакеты не поставляются с вложенными файлами [.filename]#aclocal.m4#, снова требуемых для построения программного обеспечения. Их можно получить командой `aclocal`, которая просматривает [.filename]#configure.ac# или [.filename]#configure.in#.
+[source, shell]
+....
+% make make-use-cabal
+USE_CABAL= Diff-0.4.1 \
+ Glob-0.10.2_3 \
+ HUnit-1.6.2.0 \
+ [...]
+
+GH_TUPLE= input-output-hk:cardano-base:0f3a867493059e650cda69e20a5cbf1ace289a57:cardano_base/dist-newstyle/src/cardano-b_-c8db9876882556ed \
+ input-output-hk:cardano-crypto:f73079303f663e028288f9f4a9e08bcca39a923e:cardano_crypto/dist-newstyle/src/cardano-c_-253fd88117badd8f \
+ [...]
+....
-`aclocal` имеет похожую связь с `automake`, как у `autoheader` с `autoconf`, что описано в предыдущей главе. `aclocal` подразумевает использование `automake`, таким образом, мы имеем:
+Может быть полезно отделить элементы `GH_TUPLE`, поступающие из `make-use-cabal`, от остальных, чтобы упростить обновление порта:
[.programlisting]
....
-USE_AUTOTOOLS= automake:version[:env]
+GH_TUPLE= input-output-hk:cardano-base:0f3a867493059e650cda69e20a5cbf1ace289a57:cardano_base/dist-newstyle/src/cardano-b_-c8db9876882556ed \
+ input-output-hk:cardano-crypto:f73079303f663e028288f9f4a9e08bcca39a923e:cardano_crypto/dist-newstyle/src/cardano-c_-253fd88117badd8f \
+ [...]
+
+GH_TUPLE+= bitcoin-core:secp256k1:ac83be33d0956faf6b7f61a60ab524ef7d6a473a:secp
....
+Версия Haskell-портов с зависимостями от систем контроля версий временно требует следующего обходного решения:
[.programlisting]
....
-USE_AUTOTOOLS= aclocal:version
+BINARY_ALIAS= git=true
....
-которые также подразумевают использование `automake:version`.
+====
-Также как и для `libtool` и `autoconf`, подключение необязательной операции `:env` всего лишь устанавливает окружение для дальнейшего пользования. Без этого выполняется реконфигурирование этого порта.
+[[using-autotools]]
+== Использование GNU Autotools
-Как и в случае с `autoconf` и `autoheader`, обе команды `automake` и `aclocal` соответственно имеют необязательные переменные `AUTOMAKE_ARGS` и `ACLOCAL_ARGS`, которые при необходимости можно переопределить в [.filename]#Makefile# порта.
+Если порту требуется какое-либо программное обеспечение GNU Autotools, добавьте `USES=autoreconf`. Подробнее см. в crossref:uses[uses-autoreconf,`autoreconf`].
[[using-gettext]]
== Использование GNU `gettext`
-=== Простой вариант использования
+[[using-gettext-basic]]
+=== Простые варианты использования
-Если для вашего порта требуется `gettext`, добавьте `USES= gettext`, и ваш порт унаследует зависимость от package:devel/gettext[]. crossref:makefiles[uses-makefiles, `USES`] содержит перечень других значений для использования `gettext`.
+Если порт требует `gettext`, установите `USES=gettext`, и порт унаследует зависимость от [.filename]#libintl.so# из пакета package:devel/gettext[]. Другие значения для использования `gettext` перечислены в crossref:uses[uses-gettext,`USES=gettext`].
-Довольно распространенным случаем является использование в порте `gettext` и `configure`. Как правило, GNU `configure` способен находить `gettext` автоматически. Если он все же не сможет это сделать, то подсказки для размещения `gettext` можно передать через переменные окружения `CPPFLAGS` и `LDFLAGS`:
+Довольно распространённый случай — порт, использующий `gettext` и `configure`. Обычно GNU `configure` должен автоматически находить `gettext`.
[.programlisting]
....
USES= gettext
-CPPFLAGS+= -I${LOCALBASE}/include
-LDFLAGS+= -L${LOCALBASE}/lib
-
GNU_CONFIGURE= yes
....
-Конечно же, этот код можно записать в более компактном виде, если передавать флаги в `configure` не требуется:
+Если он не сработает, можно указать расположение `gettext` через `CPPFLAGS` и `LDFLAGS`, используя `localbase` следующим образом:
[.programlisting]
....
-USES= gettext
+USES= gettext localbase:ldflags
GNU_CONFIGURE= yes
....
+[[using-gettext-optional]]
=== Оптимальное использование
Некоторые программные продукты позволяют отключать NLS, к примеру, передавая параметр `--disable-nls` сценарию `configure`. В этом случае ваш порт должен использовать `gettext`, в зависимости от значения `NLS`. Для портов небольшой или средней сложности вы можете полагаться на следующую идиому:
[.programlisting]
....
-GNU_CONFIGURE= yes
+GNU_CONFIGURE= yes
+
+OPTIONS_DEFINE= NLS
+OPTIONS_SUB= yes
+
+NLS_USES= gettext
+NLS_CONFIGURE_ENABLE= nls
+
+.include <bsd.port.mk>
+....
+
+Или используя старый способ с опциями:
+
+[.programlisting]
+....
+GNU_CONFIGURE= yes
+
+OPTIONS_DEFINE= NLS
.include <bsd.port.options.mk>
@@ -471,7 +1164,7 @@ PLIST_SUB+= NLS="@comment "
.include <bsd.port.mk>
....
-Следующий пункт в вашем списке дел разобраться, чтобы файлы каталога сообщения включались в список упаковки по условию. Часть, входящая в [.filename]#Makefile#, уже обеспечена этой идиомой. Остальное объясняется в главе <<plist-sub,продвинутые практики [.filename]#pkg-plist#>>. Вкратце, каждое вхождение `%%NLS%%` в [.filename]#pkg-plist# будет заменено на "`@comment`", если NLS выключен, или пустой строкой, если включен. В результате строки, предваряемые `%%NLS%%`, станут комментариями в итоговом листе упаковки, если NLS выключен; иначе, префикс будет просто удален. Всё, что вам нужно, это вставить `%%NLS%%` перед каждым путем к файлу каталога сообщений в [.filename]#pkg-plist#. Например:
+Следующий пункт в списке задач — организовать условное включение файлов каталогов сообщений в упаковочный список. Часть, связанная с [.filename]#Makefile#, уже предусмотрена идиомой. Это объясняется в разделе crossref:plist[plist-sub,расширенные практики работы с [.filename]#pkg-plist#]. Вкратце, каждое вхождение `%%NLS%%` в [.filename]#pkg-plist# будет заменено на "`@comment `", если NLS отключен, или на пустую строку, если NLS включен. Следовательно, строки с префиксом `%%NLS%%` станут обычными комментариями в итоговом упаковочном списке, если NLS выключен; в противном случае префикс будет просто удален. Затем вставьте `%%NLS%%` перед каждым путем к файлу каталога сообщений в [.filename]#pkg-plist#. Например:
[.programlisting]
....
@@ -479,8 +1172,9 @@ PLIST_SUB+= NLS="@comment "
%%NLS%%share/locale/no/LC_MESSAGES/foobar.mo
....
-В особо сложных случаях вам понадобиться использовать более продвинутые техники, чем данный рецепт, такие как <<plist-dynamic,динамические списки упаковки>>.
+В особо сложных случаях вам понадобиться использовать более продвинутые техники, чем данный рецепт, такие как crossref:plist[plist-dynamic,динамические списки упаковки].
+[[using-gettext-catalog-directories]]
=== Управление каталогами сообщений
Существует момент, который следует учитывать при установке файлов каталогов сообщений. Целевые каталоги для размещения, расположенные под [.filename]#LOCALBASE/shared/locale#, редко когда должны создаваться и удаляться портом. Для наиболее популярных языков имеются собственные каталоги, перечисленные в [.filename]#PORTSDIR/Templates/BSD.local.dist#. Каталоги для множества других языков управляются с помощью порта package:devel/gettext[]. Обратите внимание на его [.filename]#pkg-plist# и посмотрите, куда данный порт собирается установить файлы каталогов сообщений для единственного в своем роде языка.
@@ -488,45 +1182,46 @@ PLIST_SUB+= NLS="@comment "
[[using-perl]]
== Использование Perl
-Если `MASTER_SITES` установлена в значение `MASTER_SITE_PERL_CPAN`, то предпочтительным значением `MASTER_SITE_SUBDIR` является имя иерархии верхнего уровня. Например, рекомендуемым значением для `p5-Module-Name` является `Module`. Иерархию верхнего уровня можно посмотреть на сайте http://cpan.org/modules/by-module/[cpan.org]. Это поддерживает порт в рабочем состоянии при изменении модуля автором.
+Если `MASTER_SITES` установлена в значение `CPAN`, то правильная поддиректория выбирается автоматически. Если подкаталог по умолчанию указан неверно, можно использовать `CPAN/Module` для его изменения. Также можно установить `MASTER_SITES` в старое значение `MASTER_SITE_PERL_CPAN`, тогда предпочтительным значением `MASTER_SITE_SUBDIR` будет имя иерархии выше уровнем. Например, рекомендуемое значение для `p5-Module-Name` - `Module`. Иерархию верхнего уровня можно посмотреть на https://cpan.org/modules/by-module/[cpan.org]. Это гарантирует работоспособность порта при смене автора модуля.
-Исключением этого правила является отсутствие соответствующего каталога или файла с дистрибутивом в этом каталоге. В качестве `MASTER_SITE_SUBDIR` в этом случае разрешается использовать id автора.
+Исключением этого правила является отсутствие соответствующего каталога или файла с дистрибутивом в этом каталоге. В качестве `MASTER_SITE_SUBDIR` в этом случае разрешается использовать id автора. Можно использовать макрос `CPAN:AUTHOR`, который будет преобразован в хешированный каталог автора. Например, `CPAN:AUTHOR` преобразуется в `authors/id/A/AU/AUTHOR`.
-В качестве значения все из настраиваемых knobs ниже принимают `YES` или строку с версией вида `5.8.0+`. `YES` означает, что данный порт можно использовать с любой из поддерживаемых версий Perl. Если порт работает только с некоторыми версиями Perl, то это можно обозначить при помощи строки с версией, указывающей на минимальную версию (пример: `5.7.3+`), максимальную версию (пример: `5.8.0-`) или точную версию (пример: `5.8.3`).
+Когда порту требуется поддержка Perl, он должен установить `USES=perl5` с опциональным `USE_PERL5`, как описано в crossref:uses[uses-perl5,описание USES для perl5].
-.Переменные для портов, использующих Perl
+[[using-perl-variables]]
+.Переменные (только для чтения) для портов, использующих Perl
[cols="1,1", frame="none", options="header"]
|===
-| Переменная
+| Переменные (только для чтения)
| Значение
-|`USE_PERL5`
-|Perl 5 используется для построения и работы.
+|`PERL`
+|Полный путь к интерпретатору Perl 5, будь то системный или установленный из порта, но без номера версии. Используйте это, когда программному обеспечению требуется путь к интерпретатору Perl. Для замены строк "``#!``" в скриптах используйте crossref:uses[uses-shebangfix,`shebangfix`].
-|`USE_PERL5_BUILD`
-|Perl 5 используется для построения.
+|`PERL_VERSION`
+|Полная версия Perl установлена (например, `5.8.9`).
-|`USE_PERL5_RUN`
-|Perl 5 используется во время работы.
+|`PERL_LEVEL`
+|Установленная версия Perl в виде целого числа формата `MNNNPP` (например, `500809`).
-|`PERL`
-|Полный путь к интерпретатору Perl 5, либо в системе, либо установленному из портов, но без номера версии. Используйте это, если вам нужно заменить строки "`#!`" в скриптах.
+|`PERL_ARCH`
+|Где Perl хранит архитектурно-зависимые библиотеки. По умолчанию: `${ARCH}-freebsd`.
-|`PERL_CONFIGURE`
-|Конфигурация при помощи MakeMaker языка Perl. Влечёт `USE_PERL5`.
+|`PERL_PORT`
+|Имя порта Perl, который установлен (например, `perl5`).
-|`PERL_MODBUILD`
-|Конфигурация, построение и установка с использованием Module::Build. Влечёт `PERL_CONFIGURE`.
+|`SITE_PERL`
+|Имя каталога, в котором размещаются специфичные для сайта пакеты Perl. Это значение добавляется в `PLIST_SUB`.
|===
[NOTE]
====
-Порты для модулей Perl, которые не имеют официального вебсайта, должны указывать `cpan.org` в строке WWW в файле [.filename]#pkg-descr#. Предпочтительная форма URL `http://search.cpan.org/dist/Module-Name/` (включая завершающий слэш).
+Порты Perl-модулей, у которых нет официального сайта, должны ссылаться на `cpan.org` в строке WWW файла [.filename]#Makefile#. Предпочтительный формат URL: `https://search.cpan.org/dist/Module-Name/` (включая завершающий слеш).
====
[NOTE]
====
-Не используйте `${SITE_PERL}` в объявлении зависимостей. Использование этой конструкции подразумевает наличие подключенного [.filename]#bsd.perl.mk#, что не всегда так. Порты, зависимые от этого порта, получат неправильные зависимости, если файлы этого порта будут перемещены при последующем обновлении. Правильный способ объявления зависимостей для модулей Perl показан в примере ниже.
+Не используйте `${SITE_PERL}` в объявлениях зависимостей. Это предполагает, что был включён файл [.filename]#perl5.mk#, что не всегда верно. Порты, зависящие от этого порта, будут иметь некорректные зависимости, если файлы этого порта будут перемещены во время обновления. Правильный способ объявления зависимостей модулей Perl показан в примере ниже.
====
[[use-perl-dependency-example]]
@@ -535,125 +1230,199 @@ PLIST_SUB+= NLS="@comment "
====
[.programlisting]
....
-p5-IO-Tee>=0.64:${PORTSDIR}/devel/p5-IO-Tee
+p5-IO-Tee>=0.64:devel/p5-IO-Tee
....
====
-Для портов Perl, которые устанавливают страницы справочника, в [.filename]#pkg-plist# можно использовать макрос `PERL5_MANx` (где _x_ принимает значение от `1` до `9`). Например,
+Для портов Perl, которые устанавливают страницы руководства, макросы `PERL5_MAN3` и `PERL5_MAN1` могут использоваться внутри [.filename]#pkg-plist#. Например,
[.programlisting]
....
+lib/perl5/5.14/man/man1/event.1.gz
lib/perl5/5.14/man/man3/AnyEvent::I3.3.gz
....
-можно заменить на
+может быть заменено на
[.programlisting]
....
+%%PERL5_MAN1%%/event.1.gz
%%PERL5_MAN3%%/AnyEvent::I3.3.gz
....
+[NOTE]
+====
+Для других разделов (_x_ в `2` и `4`–`9`) макросы `PERL5_MAN_x_` отсутствуют, так как они устанавливаются в обычные каталоги.
+====
+
+[[use-perl-ex-build]]
+.Порт, требующий Perl только для сборки
+[example]
+====
+Поскольку значение USE_PERL5 по умолчанию включает build и run, установите его в:
+
+[.programlisting]
+....
+USES= perl5
+USE_PERL5= build
+....
+
+====
+
+[[use-perl-ex-patch]]
+.Порт, который также требует Perl для исправления
+[example]
+====
+Время от времени использования man:sed[1] для исправлений недостаточно. Когда использование man:perl[1] проще, примените:
+
+[.programlisting]
+....
+USES= perl5
+USE_PERL5= patch build run
+....
+
+====
+
+[[use-perl-ex-configure]]
+.Модуль Perl, для сборки которого требуется `ExtUtils::MakeMaker`
+[example]
+====
+Большинство модулей Perl поставляются с конфигурационным скриптом [.filename]#Makefile.PL#. В этом случае установите:
+
+[.programlisting]
+....
+USES= perl5
+USE_PERL5= configure
+....
+
+====
+
+[[use-perl-ex-modbuild]]
+.Модуль Perl, для сборки которого требуется `Module::Build`
+[example]
+====
+Когда модуль Perl поставляется с конфигурационным скриптом [.filename]#Build.PL#, он может требовать Module::Build, и в этом случае установите
+
+[.programlisting]
+....
+USES= perl5
+USE_PERL5= modbuild
+....
+
+Если вместо этого требуется Module::Build::Tiny, установите
+
+[.programlisting]
+....
+USES= perl5
+USE_PERL5= modbuildtiny
+....
+
+====
+
[[using-x11]]
== Использование X11
[[x11-variables]]
=== Компоненты X.Org
-X.Org является реализацией X11, доступной в Коллекции Портов. Если ваше приложение зависит от компонентов X, установите в переменную `USE_XORG` в перечень требуемых компонентов. К настоящему времени доступными компонентами являются:
-
-`bigreqsproto compositeproto damageproto dmx dmxproto dri2proto evieproto fixesproto fontcacheproto fontenc fontsproto fontutil glproto ice inputproto kbproto libfs oldx pciaccess pixman printproto randrproto recordproto renderproto resourceproto scrnsaverproto sm trapproto videoproto x11 xau xaw xaw6 xaw7 xbitmaps xcmiscproto xcomposite xcursor xdamage xdmcp xevie xext xextproto xf86bigfontproto xf86dgaproto xf86driproto xf86miscproto xf86rushproto xf86vidmodeproto xfixes xfont xfontcache xft xi xinerama xineramaproto xkbfile xkbui xmu xmuu xorg-server xp xpm xprintapputil xprintutil xproto xproxymngproto xrandr xrender xres xscrnsaver xt xtrans xtrap xtst xv xvmc xxf86dga xxf86misc xxf86vm`.
-
-Всегда актуальный перечень можно найти в [.filename]#/usr/ports/Mk/bsd.xorg.mk#.
+Реализация X11, доступная в Коллекции портов, — это X.Org. Если приложение зависит от компонентов X, добавьте `USES= xorg` и укажите необходимые компоненты в `USE_XORG`. Полный список можно найти в crossref:uses[uses-xorg,`xorg`].
-Проект Mesa является попыткой обеспечить свободную реализацию OpenGL. Вы можете указать зависимость от различных компонентов этого проекта при помощи переменной `USE_GL`. Действительные опции: `glut, glu, glw, glew, gl` и `linux`. Для обратной совместимости значение `yes` соответствует `glu`.
+Проект Mesa — это инициатива по предоставлению свободной реализации OpenGL. Чтобы указать зависимость от различных компонентов этого проекта, используйте `USES=gl` и `USE_GL`. См. crossref:uses[uses-gl,`gl`] для полного списка доступных компонентов. Для обратной совместимости значение `yes` соответствует `glu`.
[[use-xorg-example]]
-.Пример для USE_XORG
+.Пример `USE_XORG`
[example]
====
[.programlisting]
....
-USE_XORG= xrender xft xkbfile xt xaw
+USES= gl xorg
USE_GL= glu
+USE_XORG= xrender xft xkbfile xt xaw
....
====
+[[using-xorg-variables]]
.Переменные для портов, использующих X
[cols="1,1", frame="none"]
|===
|`USES= imake`
-|Используется `imake`.
+|Порт использует `imake`.
|`XMKMF`
-|Задаёт маршрут до `xmkmf`, если он отсутствует в `PATH`. По умолчанию это `xmkmf -a`.
+|Установить путь к `xmkmf`, если он отсутствует в `PATH`. По умолчанию: `xmkmf -a`.
|===
[[using-x11-vars]]
-.Использование переменных X11 в порте
+.Использование переменных, связанных с X11
[example]
====
[.programlisting]
....
-# Использовать некоторые библиотеки X11
+# Use some X11 libraries
+USES= xorg
USE_XORG= x11 xpm
....
====
-[[porting-motif]]
-=== Порты, которым требуется Motif
+[[x11-motif]]
+=== Порты, требующие Motif
-Если вашему порту требуется Motif, задайте переменную `USES= motif` в файле [.filename]#Makefile#. Реализация Motif, используемая по умолчанию, находится в package:x11-toolkits/open-motif[]. Пользователи вместо этого могут выбрать package:x11-toolkits/lesstif[] через установку переменной `WANT_LESSTIF`.
+Если порт требует библиотеку Motif, определите `USES= motif` в [.filename]#Makefile#. Реализация Motif по умолчанию — это package:x11-toolkits/open-motif[]. Пользователи могут выбрать package:x11-toolkits/lesstif[] вместо этого, установив `WANT_LESSTIF` в своём [.filename]#make.conf#. Аналогично package:x11-toolkits/open-motif-devel[] можно выбрать, установив `WANT_OPEN_MOTIF_DEVEL` в [.filename]#make.conf#.
-Переменная `MOTIFLIB` будет установлена в [.filename]#bsd.port.mk#, чтобы ссылаться на соответствующую библиотеку Motif. Пожалуйста, измените исходные тексты вашего порта на использование `${MOTIFLIB}` везде, где упоминается библиотека Motif, в первоначальном [.filename]#Makefile# или [.filename]#Imakefile#.
+`MOTIFLIB` будет установлен в файле [.filename]#motif.mk# для ссылки на соответствующую библиотеку Motif. Пожалуйста, исправьте исходный код порта, чтобы использовать `${MOTIFLIB}` везде, где библиотека Motif упоминается в оригинальном [.filename]#Makefile# или [.filename]#Imakefile#.
-Существует два общих случая:
+Есть два распространённых случая:
-* Если порт обращается к библиотеке Motif как `-lXm` в своих файлах [.filename]#Makefile# или [.filename]#Imakefile#, просто подставьте вместо этих обращений `${MOTIFLIB}`.
-* Если порт использует `XmClientLibs` в своем файле [.filename]#Imakefile#, измените это обращение на `${MOTIFLIB} ${XTOOLLIB} ${XLIB}`.
+* Если порт ссылается на библиотеку Motif как `-lXm` в своем [.filename]#Makefile# или [.filename]#Imakefile#, замените это на `${MOTIFLIB}`.
+* Если порт использует `XmClientLibs` в своем [.filename]#Imakefile#, замените это на `${MOTIFLIB} ${XTOOLLIB} ${XLIB}`.
-Заметьте, что переменная `MOTIFLIB` (как правило) раскрывается в `-L/usr/local/lib -lXm` или `/usr/local/lib/libXm.a`, так что нет нужды впереди добавлять `-L` или `-l`.
+Обратите внимание, что `MOTIFLIB` (обычно) раскрывается в `-L/usr/local/lib -lXm -lXp` или `/usr/local/lib/libXm.a`, поэтому нет необходимости добавлять `-L` или `-l` перед этим.
-=== Шрифты для X11
+[[x11-fonts]]
+=== Шрифты X11
-Если ваш порт устанавливает шрифты для X Window System, поместите их в каталог [.filename]#LOCALBASE/lib/X11/fonts/local#.
+Если порт устанавливает шрифты для X Window System, поместите их в [.filename]#LOCALBASE/lib/X11/fonts/local#.
-=== Получение поддельного `DISPLAY`, используя Xvfb
+[[x11-fake-display]]
+=== Получение поддельного `DISPLAY` с помощью Xvfb
-Некоторые приложения для успешной компиляции требуют наличие работающего дисплея X11. Это создает проблему для машин, которые работают в режиме headless. При использовании следующего канонического хака инфраструктура построения запустит сервер X в виртуальном фреймбуфере. Затем переменная работающего `DISPLAY` передается при построении.
+Некоторые приложения требуют рабочего дисплея X11 для успешной компиляции. Это создаёт проблему для машин, работающих без монитора. При использовании этой переменной инфраструктура сборки запустит виртуальный X-сервер с буфером кадров. Рабочий `DISPLAY` затем передаётся в процесс сборки. См. crossref:uses[uses-display,`USES=display`] для возможных аргументов.
[.programlisting]
....
USES= display
....
+
[[desktop-entries]]
-=== Элементы рабочего стола
+=== Desktop Entries (пункты рабочего стола)
-Элементы рабочего стола (http://standards.freedesktop.org/desktop-entry-spec/latest/[стандарта Freedesktop]) предоставляют способ автоматической настройки функций рабочего стола при установке новой программы, не требуя вмешательства пользователя. Например, новые программы автоматически отображаются в меню приложений совместимых окружений рабочего стола. Элементы рабочего стола изначально появились в окружении рабочего стола GNOME, но в настоящее время являются стандартом и также работают с KDE и Xfce. Такая небольшая автоматизация предоставляет реальное удобство для пользователя, и посему элементы рабочего стола приветствуются в приложениях, которые можно использовать в окружении рабочего стола.
+Desktop entries (https://standards.freedesktop.org/desktop-entry-spec/latest/[стандарт Freedesktop]) предоставляют способ автоматической настройки функций рабочего стола при установке новой программы без вмешательства пользователя. Например, вновь установленные программы автоматически появляются в меню приложений совместимых сред рабочего стола. Desktop entries появились в среде GNOME, но теперь стали стандартом и также работают с KDE и Xfce. Эта автоматизация приносит реальную пользу пользователю, поэтому Desktop entries рекомендуются для приложений, которые могут использоваться в среде рабочего стола.
+[[desktop-entries-predefined]]
==== Использование предопределенных файлов [.filename]#.desktop#
-Порты, включающие предопределенные файлы [.filename]#*.desktop#, должны включать эти файлы в [.filename]#pkg-plist# и устанавливать их в каталог [.filename]#$LOCALBASE/shared/applications#. Для установки этих файлов используется <<install-macros,макрос `INSTALL_DATA`>>.
+Порты, включающие предопределённые файлы [.filename]#*.desktop#, должны добавлять эти файлы в [.filename]#pkg-plist# и устанавливать их в директорию [.filename]#$LOCALBASE/share/applications#. Для установки таких файлов полезен макрос crossref:makefiles[install-macros,`INSTALL_DATA`].
[[updating-desktop-database]]
==== Обновление базы данных рабочего стола
-Если в файле порта [.filename]#portname.desktop# имеется запись MimeType, то база данных рабочего стола олжна быть обновлена после установки и удаления. Для этого укажите `USES`= desktop-file-utils.
+Если порт имеет запись MimeType в файле [.filename]#portname.desktop#, базу данных рабочего стола необходимо обновить после установки и удаления. Для этого определите `USES`= desktop-file-utils.
[[desktop-entries-macro]]
-==== Создание элементов рабочего стола с использованием `DESKTOP_ENTRIES`
+==== Создание Desktop Entries с помощью `DESKTOP_ENTRIES`
-Элементы рабочего стола можно легко создавать для приложений, используя переменную `DESKTOP_ENTRIES`. Будет автоматически создан, установлен и добавлен в [.filename]#pkg-plist# файл с названием [.filename]#name.desktop#. Синтаксис:
+Desktop Entries могут быть легко созданы для приложений с использованием `DESKTOP_ENTRIES`. Файл с именем [.filename]#name.desktop# будет создан, установлен и автоматически добавлен в [.filename]#pkg-plist#. Синтаксис следующий:
[.programlisting]
....
DESKTOP_ENTRIES= "NAME" "COMMENT" "ICON" "COMMAND" "CATEGORY" StartupNotify
....
-Перечень возможных категорий доступен на http://standards.freedesktop.org/menu-spec/latest/apa.html[вебсайте Freedesktop]. `StartupNotify` отобразит, поддерживает ли приложение _уведомления о запуске_. Как правило, это графический индикатор часы вместо указателя мыши, меню или панель, которые уведомляют пользователя о загрузке программы. Программа, поддерживающая уведомления о запуске, очистит этот индикатор после запуска. Программы, несовместимые с уведомлениями о запуске, не будут очищать индикатор (возможно, вызывая путаницу и приводя пользователей в бешенство), и поэтому должны иметь `StartupNotify` в выключенном состоянии `false`; тогда индикатор не будет отображаться совсем.
+Список возможных категорий доступен на https://standards.freedesktop.org/menu-spec/latest/apa.html[сайте Freedesktop]. `StartupNotify` указывает, совместимо ли приложение с _уведомлениями о запуске_. Обычно это графический индикатор, например, часы, который появляется у указателя мыши, в меню или на панели, чтобы дать пользователю понять, что программа запускается. Программа, совместимая с уведомлениями о запуске, очищает индикатор после своего старта. Программы, не совместимые с уведомлениями о запуске, никогда не очищают индикатор (что может сбивать с толку и раздражать пользователя), и у них должен быть установлен параметр `StartupNotify` в значение `false`, чтобы индикатор вообще не отображался.
Пример:
@@ -665,163 +1434,803 @@ DESKTOP_ENTRIES= "ToME" "Roguelike game based on JRR Tolkien's work" \
false
....
+`DESKTOP_ENTRIES` устанавливаются в директорию, указанную переменной `DESKTOPDIR`. По умолчанию `DESKTOPDIR` имеет значение [.filename]#${PREFIX}/share/applications#
+
+
[[using-gnome]]
== Использование GNOME
-Для задания того, какие компоненты GNOME использует конкретный порт, проект FreeBSD/GNOME использует собственный набор переменных. На странице проекта FreeBSD/GNOME размещён http://www.FreeBSD.org/gnome/docs/porting/[ исчерпывающий список этих переменных].
+[[using-gnome-introduction]]
+=== Введение
-[[using-qt]]
-== Использование Qt
+Эта глава объясняет фреймворк GNOME, используемый в портах. Фреймворк можно условно разделить на базовые компоненты, компоненты рабочего стола GNOME и несколько специальных макросов, упрощающих работу сопровождающих портов.
-[[qt-common]]
-=== Порты, для которых требуется Qt
+[[use-gnome]]
+=== Использование `USE_GNOME`
-.Переменные для портов, использующих Qt
-[cols="1,1", frame="none"]
+Добавление этой переменной в порт позволяет использовать макросы и компоненты, определённые в [.filename]#bsd.gnome.mk#. Код в [.filename]#bsd.gnome.mk# добавляет необходимые зависимости для сборки, выполнения или библиотеки, а также обработку специальных файлов. Приложения GNOME в FreeBSD используют инфраструктуру `USE_GNOME`. Включите все необходимые компоненты в виде списка, разделённого пробелами. Компоненты `USE_GNOME` разделены на следующие виртуальные списки: основные компоненты, компоненты GNOME 3 и устаревшие компоненты. Если порту требуются только библиотеки GTK3, это кратчайший способ определить это:
+
+[.programlisting]
+....
+USE_GNOME= gtk30
+....
+
+`USE_GNOME` компоненты автоматически добавляют необходимые им зависимости. Подробный список всех компонентов `USE_GNOME`, а также информацию о том, какие другие компоненты они подразумевают и их зависимости, можно найти в crossref:special[gnome-components, Компоненты GNOME].
+
+Вот пример [.filename]#Makefile# для порта GNOME, в котором используются многие методы, описанные в этом документе. Пожалуйста, используйте его в качестве руководства при создании новых портов.
+
+[.programlisting]
+....
+PORTNAME= regexxer
+DISTVERSION= 0.10
+CATEGORIES= devel textproc gnome
+MASTER_SITES= GNOME
+
+MAINTAINER= kwm@FreeBSD.org
+COMMENT= Interactive tool for performing search and replace operations
+WWW= http://regexxer.sourceforge.net/
+
+USES= gettext gmake localbase:ldflags pathfix pkgconfig tar:xz
+GNU_CONFIGURE= yes
+USE_GNOME= gnomeprefix intlhack gtksourceviewmm3
+
+GLIB_SCHEMAS= org.regexxer.gschema.xml
+
+.include <bsd.port.mk>
+....
+
+[NOTE]
+====
+Макрос `USE_GNOME` без аргументов не добавляет никаких зависимостей к порту. `USE_GNOME` не может быть установлен после [.filename]#bsd.port.pre.mk#.
+====
+
+[[using-gnome-variables]]
+=== Переменные
+
+Этот раздел объясняет, какие макросы доступны и как они используются. Как, например, в приведённом выше примере. В crossref:special[gnome-components, Компоненты GNOME] содержится более подробное объяснение. Для использования этих макросов необходимо установить `USE_GNOME`.
+
+`GLIB_SCHEMAS`::
+Список всех файлов схем glib, которые устанавливает порт. Макрос добавит файлы в plist порта и обработает регистрацию этих файлов при установке и удалении.
++
+Файлы схем glib написаны в XML и имеют расширение [.filename]#gschema.xml#. Они устанавливаются в директорию [.filename]#share/glib-2.0/schemas/#. Эти файлы схем содержат все настройки конфигурации приложений со значениями по умолчанию. Фактическая база данных, используемая приложениями, создаётся с помощью glib-compile-schema, которая запускается макросом `GLIB_SCHEMAS`.
++
+[.programlisting]
+....
+GLIB_SCHEMAS=foo.gschema.xml
+....
++
+[NOTE]
+====
+Не добавляйте схемы glib в файл [.filename]#pkg-plist#. Если они указаны в [.filename]#pkg-plist#, они не будут зарегистрированы, и приложения могут работать некорректно.
+====
+
+`GCONF_SCHEMAS`::
+Перечислите все файлы схем gconf. Макрос добавит файлы схем в plist порта и обеспечит их регистрацию при установке и удалении.
++
+GConf — это база данных на основе XML, которую используют практически все приложения GNOME для хранения своих настроек. Эти файлы устанавливаются в директорию [.filename]#etc/gconf/schemas#. Эта база данных определяется установленными файлами схем, которые используются для генерации ключевых файлов [.filename]#%gconf.xml#. Для каждого файла схемы, устанавливаемого портом, должна быть запись в [.filename]#Makefile#:
++
+[.programlisting]
+....
+GCONF_SCHEMAS=my_app.schemas my_app2.schemas my_app3.schemas
+....
++
+[NOTE]
+====
+Схемы Gconf перечислены в макросе `GCONF_SCHEMAS`, а не в файле [.filename]#pkg-plist#. Если они указаны в [.filename]#pkg-plist#, они не будут зарегистрированы, и приложения могут работать некорректно.
+====
+
+`INSTALLS_OMF`::
+Файлы Open Source Metadata Framework (OMF) часто используются приложениями GNOME 2. Эти файлы содержат информацию о файлах справки приложений и требуют специальной обработки с помощью ScrollKeeper/rarian. Для правильной регистрации файлов OMF при установке приложений GNOME из пакетов убедитесь, что файлы `omf` указаны в `pkg-plist` и что в [.filename]#Makefile# порта определено `INSTALLS_OMF`:
++
+[.programlisting]
+....
+INSTALLS_OMF=yes
+....
++
+При установке [.filename]#bsd.gnome.mk# автоматически сканирует [.filename]#pkg-plist# и добавляет соответствующие директивы `@exec` и `@unexec` для каждого файла [.filename]#.omf#, который необходимо отслеживать в базе данных регистрации OMF.
+
+[[gnome-components]]
+== Компоненты GNOME
+
+Для получения дополнительной помощи с портом GNOME, ознакомьтесь с некоторыми из link:https://ports.FreeBSD.org[существующих портов] в качестве примеров. На странице link:https://www.FreeBSD.org/gnome/[FreeBSD GNOME] указана контактная информация, если требуется дополнительная помощь. Компоненты разделены на используемые в настоящее время компоненты GNOME и устаревшие компоненты. Если компонент поддерживает аргументы, они перечислены в скобках в описании. Первый аргумент является значением по умолчанию. "Both" указывается, если компонент по умолчанию добавляется как в зависимости для сборки, так и для выполнения.
+
+[[gnome-components-list]]
+.Компоненты GNOME
+[cols="1,1,1", options="header"]
|===
-|`USE_QT4`
-|Указывает инструменты и библиотеки в качестве зависимостей для портов, которые используют Qt 4. Для получения подробностей смотрите <<qt4-components,выбор компонентов Qt 4>>.
+| Компонент
+| Связанная программа
+| Описание
-|`QT_PREFIX`
-|Устанавливается в значение, содержащее путь к установленному Qt (переменная только для чтения).
+|`atk`
+|accessibility/atk
+|Инструментарий доступности (ATK)
-|`MOC`
-|Устанавливается в значение, содержащее путь к `moc` (переменная только для чтения). По умолчанию устанавливается в соответствии со значением `USE_QT_VER`.
+|`atkmm`
+|accessibility/atkmm
+|C++ интерфейс для atk
+
+|`cairo`
+|graphics/cairo
+|Векторная графическая библиотека с поддержкой вывода на различные устройства
-|`QTCPPFLAGS`
-|Дополнительные флаги компилятора для инструментального пакета Qt, передаваемые через переменную `CONFIGURE_ENV`. По умолчанию устанавливается в соответствии со значением `USE_QT_VER`.
+|`cairomm`
+|graphics/cairomm
+|C++ интерфейс для cairo
-|`QTCFGLIBS`
-|Дополнительные флаги компоновки для инструментального пакета Qt, передаваемые через переменную `CONFIGURE_ENV`. По умолчанию устанавливается в соответствии со значением `USE_QT_VER`.
+|`dconf`
+|devel/dconf
+|Система базы данных конфигурации (both, build, run)
-|`QTNONSTANDARD`
-|Подавляет изменение `CONFIGURE_ENV`, `CONFIGURE_ARGS`, `CPPFLAGS` и `MAKE_ENV`.
+|`evolutiondataserver3`
+|databases/evolution-data-server
+|Бэкенды данных для интегрированного почтового клиента/PIM Evolution
+
+|`gdkpixbuf2`
+|graphics/gdk-pixbuf2
+|Графическая библиотека для GTK+
+
+|`glib20`
+|devel/glib20
+|Основная библиотека GNOME `glib20`
+
+|`glibmm`
+|devel/glibmm
+|C++ интерфейс для glib20
+
+|`gnomecontrolcenter3`
+|sysutils/gnome-control-center
+|Центр управления GNOME 3
+
+|`gnomedesktop3`
+|x11/gnome-desktop
+|Библиотека пользовательского интерфейса рабочего стола GNOME 3
+
+|`gsound`
+|audio/gsound
+|Библиотека GObject для воспроизведения системных звуков (both, build, run)
+
+|`gtk-update-icon-cache`
+|graphics/gtk-update-icon-cache
+|Утилита `gtk-update-icon-cache` из набора инструментов `Gtk+`
+
+|`gtk20`
+|x11-toolkits/gtk20
+|Набор инструментов Gtk+ 2
+
+|`gtk30`
+|x11-toolkits/gtk30
+|Набор инструментов Gtk+ 3
+
+|`gtkmm20`
+|x11-toolkits/gtkmm20
+|C++ интерфейс 2.0 для инструментария gtk20
+
+|`gtkmm24`
+|x11-toolkits/gtkmm24
+|C++ интерфейс 2.4 для инструментария gtk20
+
+|`gtkmm30`
+|x11-toolkits/gtkmm30
+|C++ интерфейс 3.0 для набора инструментов gtk30
+
+|`gtksourceview2`
+|x11-toolkits/gtksourceview2
+|Виджет, добавляющий подсветку синтаксиса в GtkTextView
+
+|`gtksourceview3`
+|x11-toolkits/gtksourceview3
+|Текстовая виджет, добавляющая подсветку синтаксиса к виджету GtkTextView
+
+|`gtksourceviewmm3`
+|x11-toolkits/gtksourceviewmm3
+|C++ интерфейс для библиотеки gtksourceview3
+
+|`gvfs`
+|devel/gvfs
+|Виртуальная файловая система GNOME
+
+|`intltool`
+|textproc/intltool
+|Инструмент для интернационализации (см. также intlhack)
+
+|`introspection`
+|devel/gobject-introspection
+|Базовые привязки (биндинги) интроспекции и инструменты для генерации привязок интроспекции. В большинстве случаев достаточно `:build`, `:both`/`:run` нужны только для приложений, использующих привязки интроспекции. (both, build, run)
+
+|`libgda5`
+|databases/libgda5
+|Обеспечивает единообразный доступ к различным типам источников данных
+
+|`libgda5-ui`
+|databases/libgda5-ui
+|Библиотека пользовательского интерфейса из библиотеки libgda5
+
+|`libgdamm5`
+|databases/libgdamm5
+|привязки C++ для библиотеки libgda5
+
+|`libgsf`
+|devel/libgsf
+|Расширяемая абстракция ввода-вывода для работы со структурированными форматами файлов
+
+|`librsvg2`
+|graphics/librsvg2
+|Библиотека для разбора и отображения SVG-файлов векторной графики
+
+|`libsigc++20`
+|devel/libsigc++20
+|Фреймворк обратных вызовов для C++
+
+|`libxml++26`
+|textproc/libxml++26
+|C++ привязки для библиотеки libxml2
+
+|`libxml2`
+|textproc/libxml2
+|Библиотека парсера XML (both, build, run)
+
+|`libxslt`
+|textproc/libxslt
+|Библиотека XSLT (сборка, выполнение)
+
+|`metacity`
+|x11-wm/metacity
+|Менеджер окон из GNOME
+
+|`nautilus3`
+|x11-fm/nautilus
+|GNOME файловый менеджер
+
+|`pango`
+|x11-toolkits/pango
+|Открытый фреймворк для разметки и отображения интернационализированного текста
+
+|`pangomm`
+|x11-toolkits/pangomm
+|C++ интерфейс для библиотеки pango
+
+|`py3gobject3`
+|devel/py3-gobject3
+|Python 3, интерфейс GObject 3.0
+
+|`pygobject3`
+|devel/py-gobject3
+|Python 2, интерфейс GObject 3.0
+
+|`vte3`
+|x11-toolkits/vte3
+|Виджет терминала с улучшенной поддержкой доступности и интернационализации (I18N)
|===
-.Дополнительные переменные для портов, использующих Qt 4.x
-[cols="1,1", frame="none"]
+[[gnome-components-macro]]
+.Компоненты макросов GNOME
+[cols="1,1", options="header"]
|===
-|`UIC`
-|Устанавливает путь к `uic` (переменная только для чтения).
+| Компонент
+| Описание
-|`QMAKE`
-|Устанавливает путь к `qmake` (переменная только для чтения).
+|`gnomeprefix`
+|Предоставляет `configure` некоторые стандартные расположения.
-|`QMAKESPEC`
-|Устанавливает путь к конфигурационному файлу для `qmake` (переменная только для чтения).
+|`intlhack`
+|То же, что и `intltool`, но с патчами для гарантии использования [.filename]#share/locale/#. Используйте только в случае, когда одного `intltool` недостаточно.
-|`QMAKEFLAGS`
-|Дополнительные флаги для `qmake`.
+|`referencehack`
+|Этот макрос предназначен для помощи в разделении API или справочной документации на собственный порт.
+|===
-|`QT_INCDIR`
-|Устанавливает каталоги для заголовков Qt 4 (переменная только для чтения).
+[[gnome-components-legacy]]
+.Компоненты GNOME Legacy
+[cols="1,1,1", options="header"]
+|===
+| Компонент
+| Связанная программа
+| Описание
-|`QT_LIBDIR`
-|Устанавливает путь к библиотекам Qt 4 (переменная только для чтения).
+|`atspi`
+|accessibility/at-spi
+|Интерфейс поставщика услуг вспомогательных технологий (AT-SPI)
+
+|`esound`
+|audio/esound
+|Пакет звука Enlightenment
+
+|`gal2`
+|x11-toolkits/gal2
+|Коллекция виджетов, взятых из GNOME 2 gnumeric
+
+|`gconf2`
+|devel/gconf2
+|Система базы данных конфигурации для GNOME 2
+
+|`gconfmm26`
+|devel/gconfmm26
+|C++ привязки C++ для gconf2
+
+|`gdkpixbuf`
+|graphics/gdk-pixbuf
+|Графическая библиотека для GTK+
+
+|`glib12`
+|devel/glib12
+|Библиотека ядра glib 1.2
+
+|`gnomedocutils`
+|textproc/gnome-doc-utils
+|Утилиты документации GNOME
+
+|`gnomemimedata`
+|misc/gnome-mime-data
+|База данных MIME и приложений для GNOME 2
+
+|`gnomesharp20`
+|x11-toolkits/gnome-sharp20
+|Интерфейсы GNOME 2 для среды выполнения .NET
+
+|`gnomespeech`
+|accessibility/gnome-speech
+|GNOME 2 API преобразования текста в речь
+
+|`gnomevfs2`
+|devel/gnome-vfs
+|Виртуальная файловая система GNOME 2
+
+|`gtk12`
+|x11-toolkits/gtk12
+|Набор инструментов Gtk+ 1.2
+
+|`gtkhtml3`
+|www/gtkhtml3
+|Облегченный движок для отображения/печати/редактирования HTML
+
+|`gtkhtml4`
+|www/gtkhtml4
+|Облегченный движок для отображения/печати/редактирования HTML
+
+|`gtksharp20`
+|x11-toolkits/gtk-sharp20
+|Интерфейсы GTK+ и GNOME 2 для среды выполнения .NET
+
+|`gtksourceview`
+|x11-toolkits/gtksourceview
+|Виджет, добавляющий подсветку синтаксиса в GtkTextView
+
+|`libartgpl2`
+|graphics/libart_lgpl
+|Библиотека для высокопроизводительной 2D графики
+
+|`libbonobo`
+|devel/libbonobo
+|Система компонентов и составных документов для GNOME 2
+
+|`libbonoboui`
+|x11-toolkits/libbonoboui
+|Интерфейс для libbonobo в GNOME 2
+
+|`libgda4`
+|databases/libgda4
+|Обеспечивает единообразный доступ к различным типам источников данных
+
+|`libglade2`
+|devel/libglade2
+|Библиотека glade для GNOME 2
+
+|`libgnome`
+|x11/libgnome
+|Библиотеки для GNOME 2, GNU окружения рабочего стола
+
+|`libgnomecanvas`
+|graphics/libgnomecanvas
+|Графическая библиотека для GNOME 2
+
+|`libgnomekbd`
+|x11/libgnomekbd
+|Динамическая библиотека клавиатуры GNOME 2
+
+|`libgnomeprint`
+|print/libgnomeprint
+|Библиотека поддержки печати Gnome 2
+
+|`libgnomeprintui`
+|x11-toolkits/libgnomeprintui
+|Библиотека поддержки печати Gnome 2
+
+|`libgnomeui`
+|x11-toolkits/libgnomeui
+|Библиотеки для графического интерфейса GNOME 2, среды рабочего стола GNU
+
+|`libgtkhtml`
+|www/libgtkhtml
+|Облегченный движок для отображения/печати/редактирования HTML
+
+|`libgtksourceviewmm`
+|x11-toolkits/libgtksourceviewmm
+|C++ интерфейс GtkSourceView
+
+|`libidl`
+|devel/libIDL
+|Библиотека для создания деревьев файлов CORBA IDL
+
+|`libsigc++12`
+|devel/libsigc++12
+|Фреймворк обратных вызовов для C++
+
+|`libwnck`
+|x11-toolkits/libwnck
+|Библиотека, используемая для написания пейджеров и списков задач
-|`QT_PLUGINDIRC`
-|Устанавливает путь к плагинам Qt 4 (переменная только для чтения).
+|`libwnck3`
+|x11-toolkits/libwnck3
+|Библиотека, используемая для написания пейджеров и списков задач
+
+|`orbit2`
+|devel/ORBit2
+|Высокопроизводительный CORBA ORB с поддержкой языка C
+
+|`pygnome2`
+|x11-toolkits/py-gnome2
+|Интерфейс Python для GNOME 2
+
+|`pygobject`
+|devel/py-gobject
+|Python 2, интерфейс GObject 2.0
+
+|`pygtk2`
+|x11-toolkits/py-gtk2
+|Набор интерфейсов Python для GTK+
+
+|`pygtksourceview`
+|x11-toolkits/py-gtksourceview
+|Интерфейс Python для GtkSourceView 2
+
+|`vte`
+|x11-toolkits/vte
+|Виджет терминала с улучшенной поддержкой доступности и интернационализации (I18N)
|===
-При заданной переменной `USE_QT4` применяются следующие настройки:
+[[gnome-components-deprecated]]
+.Устаревшие компоненты: не использовать
+[cols="1,1", options="header"]
+|===
+| Компонент
+| Описание
-[.programlisting]
-....
-CONFIGURE_ARGS+= --with-qt-includes=${QT_INCDIR} \
- --with-qt-libraries=${QT_LIBDIR} \
- --with-extra-libs=${LOCALBASE}/lib \
- --with-extra-includes=${LOCALBASE}/include
-CONFIGURE_ENV+= MOC="${MOC}" UIC="${UIC}" LIBS="${QTCFGLIBS}" \
- QMAKE="${QMAKE}" QMAKESPEC="${QMAKESPEC}" QTDIR="${QT_PREFIX}"
-MAKE_ENV+= QMAKESPEC="${QMAKESPEC}"
+|`pangox-compat`
+|pangox-compat устарел и был отделён от пакета pango.
+|===
-PLIST_SUB+= QT_INCDIR_REL=${QT_INCDIR_REL} \
- QT_LIBDIR_REL=${QT_LIBDIR_REL} \
- QT_PLUGINDIR_REL=${QT_PLUGINDIR_REL}
-....
+[[using-qt]]
+== Использование Qt
+
+[NOTE]
+====
+Для портов, которые являются частью самого Qt, см. crossref:uses[uses-qt-dist,`qt-dist`].
+====
+
+[[qt-common]]
+=== Порты, требующие Qt
+
+Коллекция портов поддерживает Qt 5 и Qt 6 с помощью `USES+=qt:5` и `USES+=qt:6` соответственно. Установите `USE_QT` в список необходимых компонентов Qt (libraries, tools, plugins - библиотеки, инструменты, плагины).
+
+Фреймворк Qt экспортирует ряд переменных, которые могут использоваться портами, некоторые из них перечислены ниже:
+
+[[using-qt-variables]]
+.Переменные, предоставляемые портам, использующим Qt
+[cols="1,1", frame="none"]
+|===
+|`QMAKE`
+|Полный путь к исполняемому файлу `qmake`.
+
+|`LRELEASE`
+|Полный путь к утилите `lrelease`.
+
+|`MOC`
+|Полный путь к `moc`.
+
+|`RCC`
+|Полный путь к `rcc`.
+
+|`UIC`
+|Полный путь к `uic`.
+
+|`QT_INCDIR`
+|Каталог включаемых файлов Qt.
+
+|`QT_LIBDIR`
+|Путь к библиотекам Qt.
+
+|`QT_PLUGINDIR`
+|Путь к плагинам Qt.
+|===
-[[qt4-components]]
+[[qt-components]]
=== Выбор компонентов
-В переменной `USE_QT4` должны указываться зависимости от отдельных инструментов и библиотек Qt 4. К каждому компоненту можно добавить суффикс, `_build` или `_run`, отражающий, когда должна быть применена зависимость, во время сборки или выполнения, соответственно. Если суффикс отсутствует, зависимость от компонента будет и для времени сборки, и для времени выполнения. Обычно, компоненты библиотек должны указываться без суффиксов, компоненты инструментов - с суффиксом `_build`, а компоненты плагинов - с суффиксом `_run`. Наиболее общие используемые компоненты перечислены ниже (все доступные компоненты перечислены в `_USE_QT4_ALL` в файле [.filename]#/usr/ports/Mk/bsd.qt.mk#):
+Отдельные зависимости инструментов и библиотек Qt должны быть указаны в `USE_QT`. Каждый компонент может иметь суффикс `_build` или `_run`, указывающий, требуется ли компонент во время сборки или выполнения. Если суффикс отсутствует, компонент будет требоваться как во время сборки, так и во время выполнения. Обычно компоненты библиотек указываются без суффикса, компоненты инструментов чаще всего указываются с суффиксом `_build`, а компоненты плагинов — с суффиксом `_run`. Наиболее часто используемые компоненты перечислены ниже (все доступные компоненты перечислены в `_USE_QT_ALL`, которая формируется из `_USE_QT_COMMON` и `_USE_QT[56]_ONLY` в [.filename]#/usr/ports/Mk/Uses/qt.mk#):
-.Доступные библиотечные компоненты Qt 4
+[[using-qt-library-list]]
+.Доступные компоненты библиотеки Qt
[cols="1,1", frame="none", options="header"]
|===
-| Название
+| Имя
| Описание
-|`corelib`
-|основная библиотека (можно опустить, если порт не использует ничего, кроме `corelib`)
+|`3d`
+|Модуль Qt3D
+
+|`5compat`
+|Модуль совместимости Qt 5 для Qt 6
+
+|`assistant`
+|Браузер документации Qt 5
+
+|`base`
+|Модуль Qt 6 base
+
+|`canvas3d`
+|Модуль Qt canvas3d
+
+|`charts`
+|Модуль Qt 5 charts
+
+|`concurrent`
+|Модуль многопоточности Qt
+
+|`connectivity`
+|Модуль Qt для подключения (Bluetooth/NFC)
+
+|`core`
+|Ядро Qt, неграфический модуль
+
+|`datavis3d`
+|Модуль визуализации 3D данных Qt 5
+
+|`dbus`
+|Модуль межпроцессного взаимодействия Qt D-Bus
+
+|`declarative`
+|Декларативный фреймворк Qt для динамических пользовательских интерфейсов
+
+|`designer`
+|Интерфейсный конструктор Qt 5 для графического пользовательского интерфейса
+
+|`diag`
+|Инструмент для сбора диагностической информации о Qt и его окружении
+
+|`doc`
+|Документация Qt 5
+
+|`examples`
+|Исходный код примеров Qt 5
+
+|`gamepad`
+|Модуль Qt 5 Gamepad
+
+|`graphicaleffects`
+|Графические эффекты Qt Quick
|`gui`
-|библиотека графического пользовательского интерфейса
+|Модуль графического интерфейса Qt
+
+|`help`
+|Модуль интеграции справки Qt в режиме онлайн
+
+|`l10n`
+|Локализованные сообщения Qt
+
+|`languageserver`
+|Реализация протокола Language Server Protocol в Qt 6
+
+|`linguist`
+|Инструмент перевода Qt 5
+
+|`location`
+|Модуль Qt Location
+
+|`lottie`
+|Qt 6 QML API для отрисовки графики и анимаций
+
+|`multimedia`
+|Модуль поддержки аудио, видео, радио и камеры Qt
|`network`
-|сетевая библиотека
+|Сетевой модуль Qt
+
+|`networkauth`
+|Модуль сетевой аутентификации Qt
|`opengl`
-|библиотека OpenGL
+|Модуль поддержки OpenGL, совместимый с Qt 5
+
+|`paths`
+|Клиент командной строки для QStandardPaths
+
+|`phonon4`
+|Мультимедийный фреймворк KDE
+
+|`pixeltool`
+|Увеличитель экрана Qt 5
+
+|`plugininfo`
+|Дампер метаданных плагинов Qt 5
+
+|`positioning`
+|Qt 6 API позиционирования из источников, таких как спутники, Wi-Fi или текстовые файлы.
+
+|`printsupport`
+|Модуль поддержки печати Qt
+
+|`qdbus`
+|Интерфейс командной строки Qt для D-Bus
+
+|`qdbusviewer`
+|Графический интерфейс Qt 5 для D-Bus
+
+|`qdoc`
+|Генератор документации Qt
-|`qt3support`
-|библиотека совместимости с Qt 3
+|`qdoc-data`
+|Файлы конфигурации QDoc
-|`qtestlib`
-|библиотека модульного тестирования
+|`qev`
+|Инструмент для интроспекции событий Qt QWidget
+
+|`qmake`
+|Генератор Makefile Qt
+
+|`quickcontrols`
+|Набор элементов управления для создания полных интерфейсов в Qt Quick
+
+|`quickcontrols2`
+|Набор элементов управления для создания полных интерфейсов в Qt Quick
+
+|`remoteobjects`
+|Модуль Qt 5 SXCML
|`script`
-|библиотека сценариев
+|Совместимый с Qt 4 модуль для написания сценариев
+
+|`scripttools`
+|Дополнительные компоненты Qt Script
+
+|`scxml`
+|Модуль Qt 5 SXCML
+
+|`sensors`
+|Модуль Qt sensors
+
+|`serialbus`
+|Функции Qt для доступа к промышленным шинным системам
+
+|`serialport`
+|Функции Qt для доступа к последовательным портам
+
+|`shadertools`
+|Инструменты Qt 6 для кроссплатформенного конвейера шейдеров Qt
+
+|`speech`
+|Доступность в Qt5
|`sql`
-|библиотека SQL
+|Модуль интеграции с базой данных Qt SQL
+
+|`sql-ibase`
+|Плагин Qt баз данных InterBase/Firebird
+
+|`sql-mysql`
+|Плагин Qt базы данных MySQL
+
+|`sql-odbc`
+|Плагин Qt ODBC
+
+|`sql-pgsql`
+|Плагин Qt базы данных PostgreSQL
+
+|`sql-sqlite2`
+|Плагин Qt базы данных SQLite 2
+
+|`sql-sqlite3`
+|Плагин Qt базы данных SQLite 3
+
+|`sql-tds`
+|Плагин Qt для подключение к базам данных по протоколу TDS
+
+|`svg`
+|Модуль поддержки SVG в Qt
+
+|`testlib`
+|Модуль тестирования Qt
+
+|`tools`
+|Различные инструменты Qt 6
+
+|`translations`
+|Модуль перевода Qt 6
+
+|`uiplugin`
+|Интерфейс плагина пользовательского виджета Qt для Qt Designer
+
+|`uitools`
+|Модуль поддержки форм пользовательского интерфейса Qt Designer
+
+|`virtualkeyboard`
+|Модуль виртуальной клавиатуры Qt 5
+
+|`wayland`
+|Оболочка Qt 5 для Wayland
+
+|`webchannel`
+|Библиотека Qt 5 для интеграции C++/QML с клиентами на HTML/js
+
+|`webengine`
+|Библиотека Qt 5 для отображения веб-содержимого
+
+|`webkit`
+|QtWebKit с более современной кодовой базой WebKit
+
+|`websockets`
+|Реализация протокола WebSocket на Qt
+
+|`websockets-qml`
+|Реализация протокола WebSocket на Qt (привязки QML)
+
+|`webview`
+|Компонент Qt для отображения веб-содержимого
+
+|`widgets`
+|Модуль виджетов Qt C++
+
+|`x11extras`
+|Платформо-специфичные возможности Qt для систем на основе X11
|`xml`
-|библиотека XML
+|Реализации SAX и DOM в Qt
+
+|`xmlpatterns`
+|Поддержка Qt для XPath, XQuery, XSLT и XML Schema
|===
-Вы можете определить, от каких библиотек зависит приложение, запустив `ldd` на основной исполняемый файл после успешной компиляции.
+Чтобы определить библиотеки, от которых зависит приложение, выполните `ldd` для основного исполняемого файла после успешной компиляции.
-.Доступные компоненты инструментов Qt 4
+[[using-qt-tools-list]]
+.Доступные компоненты инструментов Qt
[cols="1,1", frame="none", options="header"]
|===
-| Название
+| Имя
| Описание
-|`moc`
-|мета-объектный компилятор (нужен при построении почти для каждого приложения Qt)
-
-|`qmake`
-|генератор Makefile / утилита построения
+|`buildtools`
+|инструменты сборки (`moc`, `rcc`), необходимые практически для любого приложения Qt.
-|`rcc`
-|компилятор ресурсов (нужен, если приложение идет вместе с файлами [.filename]#*.rc# или [.filename]#*.qrc#)
+|`linguisttools`
+|инструменты локализации: `lrelease`, `lupdate`
-|`uic`
-|компилятор пользовательского интерфейса (нужен, если приложение идет вместе с файлами [.filename]#*.ui#, созданными при помощи Qt Designer, - на практике каждое приложение Qt с GUI)
+|`qmake`
+|Генератор Makefile/утилита сборки
|===
-.Доступные компоненты плагинов Qt 4
+[[using-qt-plugins-list]]
+.Доступные компоненты плагинов Qt
[cols="1,1", frame="none", options="header"]
|===
-| Название
+| Имя
| Описание
-|`iconengines`
-|плагин для движка иконок SVG (если приложение поставляется с иконками SVG)
-
|`imageformats`
-|плагины для графических форматов GIF, JPEG, MNG и SVG (если приложение поставляется с графическими файлами)
+|плагины для графических форматов TGA, TIFF и MNG
|===
-[[qt4-components-example]]
-.Выбор компонентов Qt 4
+[[qt5-components-example]]
+.Выбор компонентов Qt 5
[example]
====
-В этом примере портированное приложение использует библиотеку графического пользовательского интерфейса Qt 4, основную библиотеку Qt 4, все инструменты генерации кода Qt 4 и генератор Makefile Qt 4. Поскольку библиотека `gui` подразумевает зависимость от основной библиотеки, указывать `corelib` нет необходимости. Инструменты генерации кода Qt 4 `moc`, `uic` и `rcc`, а также генератор Makefile `qmake` нужны только для времени построения, поэтому они указаны с суффиксом `_build`:
+В этом примере портированное приложение использует библиотеку графического интерфейса Qt 5, основную библиотеку Qt 5, все инструменты генерации кода Qt 5 и генератор Makefile Qt 5. Поскольку библиотека `gui` подразумевает зависимость от основной библиотеки, `core` не нужно указывать. Инструменты генерации кода Qt 5 `moc`, `uic` и `rcc`, а также генератор Makefile `qmake` требуются только во время сборки, поэтому они указаны с суффиксом `_build`:
[.programlisting]
....
-USE_QT4= gui moc_build qmake_build rcc_build uic_build
+USES= qt:5
+USE_QT= gui buildtools_build qmake_build
....
====
@@ -829,81 +2238,444 @@ USE_QT4= gui moc_build qmake_build rcc_build uic_build
[[using-qmake]]
=== Использование `qmake`
+Если приложение предоставляет файл проекта qmake ([.filename]#*.pro#), определите `USES= qmake` вместе с `USE_QT`. `USES= qmake` уже подразумевает зависимость сборки от qmake, поэтому компонент qmake может быть опущен в `USE_QT`. Подобно crossref:special[using-cmake,CMake], qmake поддерживает сборку вне исходного дерева, которую можно включить, указав аргумент `outsource` (см. crossref:special[using-qmake-example,пример `USES= qmake`]). Также см. crossref:special[using-qmake-arguments,Возможные аргументы для `USES qmake`].
+
+[[using-qmake-arguments]]
+.Возможные аргументы для `USES= qmake`
+[cols="1,1", frame="none", options="header"]
+|===
+| Переменная
+| Описание
+
+|`no_configure`
+|Не добавлять цель configure. Это подразумевается при `HAS_CONFIGURE=yes` и `GNU_CONFIGURE=yes`. Это требуется, когда сборке нужна только настройка окружения из `USES= qmake`, но в остальном она запускает `qmake` самостоятельно.
+
+|`no_env`
+|Подавить модификацию окружения configure и make. Это требуется только когда `qmake` используется для настройки программного обеспечения и сборка не понимает окружение, установленное `USES= qmake`.
+
+|`norecursive`
+|Не передавать аргумент `-recursive` в `qmake`.
+
+|`outsource`
+|Выполнить сборку вне исходного кода.
+|===
+
+[[using-qmake-variables]]
.Переменные для портов, использующих `qmake`
[cols="1,1", frame="none", options="header"]
|===
-| Название
+| Переменная
| Описание
|`QMAKE_ARGS`
-|Спефицичные для порта флаги QMake для передачи программе `qmake`.
+|Специфичные для порта флаги qmake, передаваемые в бинарный файл `qmake`.
|`QMAKE_ENV`
-|Переменные окружения, устанавливаемые для программы `qmake`. По умолчанию соответствует значению `${CONFIGURE_ENV}`.
+|Переменные окружения, которые должны быть установлены для бинарного файла `qmake`. По умолчанию используется `${CONFIGURE_ENV}`.
-|`QMAKE_PRO`
-|Название файла проекта [.filename]#.pro#. По умолчанию имеет пустое значение (с использованием автоопределения).
+|`QMAKE_SOURCE_PATH`
+|Путь к файлам проекта qmake ([.filename]#.pro#). По умолчанию используется `${WRKSRC}`, если запрошена сборка вне исходного кода, в противном случае оставляется пустым.
|===
-Если вместе с приложением вместо [.filename]#configure# поставляется файл [.filename]#.pro#, вы можете использовать следующее:
+При использовании `USES= qmake` применяются следующие настройки:
[.programlisting]
....
-USES= qmake
-USE_QT4= qmake_build
+CONFIGURE_ARGS+= --with-qt-includes=${QT_INCDIR} \
+ --with-qt-libraries=${QT_LIBDIR} \
+ --with-extra-libs=${LOCALBASE}/lib \
+ --with-extra-includes=${LOCALBASE}/include
+
+CONFIGURE_ENV+= QTDIR="${QT_PREFIX}" QMAKE="${QMAKE}" \
+ MOC="${MOC}" RCC="${RCC}" UIC="${UIC}" \
+ QMAKESPEC="${QMAKESPEC}"
+
+PLIST_SUB+= QT_INCDIR=${QT_INCDIR_REL} \
+ QT_LIBDIR=${QT_LIBDIR_REL} \
+ QT_PLUGINDIR=${QT_PLUGINDIR_REL}
+....
+
+Некоторые скрипты configure не поддерживают указанные выше аргументы. Чтобы отключить изменение `CONFIGURE_ENV` и `CONFIGURE_ARGS`, установите `USES= qmake:no_env`.
+
+[[using-qmake-example]]
+.Пример `USES= qmake`
+[example]
+====
+Этот фрагмент демонстрирует использование qmake для порта Qt 5:
+
+[.programlisting]
+....
+USES= qmake:outsource qt:5
+USE_QT= buildtools_build
....
-`USES=qmake` указывает порту на использование `qmake` в процессе конфигурации. Обратите внимание, что `USES=qmake` не подразумевает зависимость от Qt 4 `qmake`. Для этого в значении `USE_QT4` должен присутствовать компонент `qmake_build`.
+====
-Приложения Qt часто пишутся в кроссплатформенной манере, и X11/Unix часто не является для них платформой разработки, что в свою очередь часто приводит к соответствующим упущенным моментам:
+Приложения Qt часто разрабатываются как кроссплатформенные, и зачастую X11/Unix — не та платформа, на которой они создаются. Это, в свою очередь, приводит к определённым недоработкам, таким как:
-* _Отсутствующие дополнительные пути для заголовочных файлов._ Многие приложения идут с поддержкой иконки в системном трее, но пренебрегают смотреть на наличие заголовочных файлов и/или библиотеками в каталогах X11. Вы можете сообщить `qmake`, чтобы она добавила каталоги в пути поиска заголовочных файлов и библиотек через командную строку. К примеру:
+* _Отсутствуют дополнительные пути для заголовочных файлов._ Многие приложения поддерживают значки в системном трее, но не учитывают пути для заголовочных файлов и/или библиотек в каталогах X11. Чтобы добавить каталоги в пути поиска заголовочных файлов и библиотек для `qmake` через командную строку, используйте:
+
[.programlisting]
....
-QMAKE_ARGS+= INCLUDEPATH+=${LOCALBASE}/include \
- LIBS+=-L${LOCALBASE}/lib
+QMAKE_ARGS+= INCLUDEPATH+=${LOCALBASE}/include \
+ LIBS+=-L${LOCALBASE}/lib
....
-* _Фиктивные пути установки._ Иногда данные, такие как иконки и файлы .desktop, устанавливаются по умолчанию в каталоги, которые не просматриваются XDG-совместимыми приложениями. Примером является package:editors/texmaker[] - взгляните на [.filename]#patch-texmaker.pro# из каталога [.filename]#files# этого порта, который можно взять в качестве шаблона исправления этого непосредственно в файле проекта `qmake`.
+* _Некорректные пути установки._ Иногда данные, такие как иконки или файлы .desktop, по умолчанию устанавливаются в каталоги, которые не сканируются приложениями, совместимыми с XDG. Например, package:editors/texmaker[] — посмотрите на файл [.filename]#patch-texmaker.pro# в директории [.filename]#files# этого порта, чтобы увидеть шаблон исправления этой проблемы напрямую в проектом файле `qmake`.
[[using-kde]]
== Использование KDE
-[[kde4-variables]]
-=== Задание переменных KDE 4
+[[kde5-variables]]
+=== Определения переменных KDE
-Если ваше приложение зависит от KDE 4.x, присвойте `USE_KDE4` список требуемых компонентов. Для переопределения типа зависимости компонента могут быть использованы суффиксы `_build` и `_run` (например, `baseapps_run`). Если суффикс не задан, будет использован тип зависимости по умолчанию. Если вы хотите использовать оба типа, добавьте компонент дважды с обоими суффиксами (например, `automoc4_build automoc4_run`). Основные наиболее используемые компоненты перечислены ниже (актуальные компоненты задокументированы в начале файла [.filename]#/usr/ports/Mk/bsd.kde4.mk#):
+Если приложение зависит от KDE, установите `USES+=kde:5` и `USE_KDE` в список необходимых компонентов. Суффиксы `_build` и `_run` можно использовать для принудительного указания типа зависимости компонентов (например, `baseapps_run`). Если суффикс не задан, будет использован тип зависимости по умолчанию. Чтобы принудительно задать оба типа, добавьте компонент дважды с обоими суффиксами (например, `ecm_build ecm_run`). Доступные компоненты перечислены ниже (актуальный список компонентов также приведён в [.filename]#/usr/ports/Mk/Uses/kde.mk#):
-.Доступные компоненты KDE 4
+[[using-kde-components]]
+.Доступные компоненты KDE
[cols="1,1", frame="none", options="header"]
|===
-| Название
+| Имя
| Описание
-|`kdehier`
-|Иерархия основных каталогов KDE
+|`activities`
+|Среда выполнения и библиотека KF5 для организации работы в отдельных автивностях
-|`kdelibs`
-|KDE Developer Platform
+|`activities-stats`
+|KF5 статистика для активностей
-|`kdeprefix`
-|Если установлено, то порт будет установлен в `${KDE4_PREFIX}` вместо `${LOCALBASE}`
+|`activitymanagerd`
+|Системный сервис для управления активностью пользователей, отслеживания шаблонов использования
-|`sharedmime`
-|База данных MIME типов для портов KDE
+|`akonadi`
+|Хранилище данных для KDE-Pim
-|`automoc4`
-|automoc для пакетов Qt 4
+|`akonadicalendar`
+|Интеграция Akonadi с Календарем
-|`akonadi`
-|Сервер хранения KDE-Pim
+|`akonadiconsole`
+|Консоль управления и отладки Akonadi
+
+|`akonadicontacts`
+|Библиотеки и демоны для реализации управления контактами в Akonadi
+
+|`akonadiimportwizard`
+|Импорт данных из других почтовых клиентов в KMail
+
+|`akonadimime`
+|Библиотеки и демоны для реализации базовой обработки электронной почты
+
+|`akonadinotes`
+|Библиотека KDE для доступа к хранилищам почты в формате MBox
+
+|`akonadisearch`
+|Библиотеки и демоны для реализации поиска в Akonadi
+
+|`akregator`
+|Читатель лент от KDE
+
+|`alarmcalendar`
+|KDE API для будильников KAlarm
+
+|`apidox`
+|Документация API KF5
+
+|`archive`
+|Библиотека KF5, предоставляющая классы для работы с форматами архивов
+
+|`attica`
+|Библиотека API Open Collaboration Services, версия для KDE5
+
+|`attica5`
+|Библиотека API Open Collaboration Services, версия для KDE5
+
+|`auth`
+|Абстракция KF5 для системной политики и функций аутентификации
+
+|`baloo`
+|KF5 Фреймворк для поиска и управления пользовательскими метаданными
+
+|`baloo-widgets`
+|Библиотека BalooWidgets
+
+|`baloo5`
+|KF5 Фреймворк для поиска и управления пользовательскими метаданными
+
+|`blog`
+|KDE API для доступа к веб-логам
+
+|`bookmarks`
+|Библиотека KF5 для закладок и формата XBEL
+
+|`breeze`
+|Plasma5 artwork, стили и ресурсы для визуального стиля Breeze
+
+|`breeze-gtk`
+|Plasma5 Breeze визуальный стиль для Gtk
+
+|`breeze-icons`
+|Тема значков Breeze для KDE
+
+|`calendarcore`
+|Библиотека доступа к календарю KDE
+
+|`calendarsupport`
+|Библиотеки поддержки календарей для KDEPim
+
+|`calendarutils`
+|Утилита KDE и пользовательские функции интерфейса для доступа к календарю
+
+|`codecs`
+|Библиотека KF5 для работы со строками
+
+|`completion`
+|KF5 вспомогательные средства и виджеты автодополнения текста
+
+|`config`
+|Виджеты KF5 для диалогов настройки
+
+|`configwidgets`
+|Виджеты KF5 для диалогов настройки
+
+|`contacts`
+|KDE API для управления контактной информацией
+
+|`coreaddons`
+|KF5 аддоны для QtCore
+
+|`crash`
+|Библиотека KF5 для обработки анализа сбоев и отчётов об ошибках в приложениях
+
+|`dbusaddons`
+|KF5 дополнения к QtDBus
+
+|`decoration`
+|Библиотека Plasma5 для создания оформления окон
+
+|`designerplugin`
+|Интеграция KF5 виджетов Frameworks в Qt Designer/Creator
+
+|`discover`
+|Инструменты управления пакетами Plasma5
+
+|`dnssd`
+|Абстракция KF5 для системных функций DNSSD
+
+|`doctools`
+|Генерация документации KF5 из docbook
+
+|`drkonqi`
+|Обработчик сбоев Plasma5
+
+|`ecm`
+|Дополнительные модули и скрипты для CMake
+
+|`emoticons`
+|Библиотека KF5 для преобразования эмотиконов
+
+|`eventviews`
+|Библиотеки просмотра событий для KDEPim
+
+|`filemetadata`
+|Библиотека KF5 для извлечения метаданных файлов
+
+|`frameworkintegration`
+|Плагины рабочего пространства KF5 и интеграции фреймворков
+
+|`gapi`
+|Библиотека на основе KDE для доступа к сервисам Google
+
+|`globalaccel`
+|Библиотека KF5 для добавления поддержки глобальных сочетаний клавиш рабочего пространства
+
+|`grantlee-editor`
+|Редактор тем Grantlee
+
+|`grantleetheme`
+|KDE PIM grantleetheme
-|`soprano`
-|Фреймворк Qt 4 RDF
+|`gravatar`
+|Библиотека для поддержки gravatar
-|`strigi`
-|Поисковые даемон рабочего стола
+|`guiaddons`
+|KF5 аддоны для QtGui
+
+|`holidays`
+|Библиотека KDE для календарных праздников
+
+|`hotkeys`
+|Библиотека Plasma5 для горячих клавиш
+
+|`i18n`
+|KF5 — расширенная инфраструктура интернационализации
+
+|`iconthemes`
+|Библиотека KF5 для работы с иконками в приложениях
+
+|`identitymanagement`
+|KDE pim идентификации
+
+|`idletime`
+|Библиотека KF5 для мониторинга активности пользователей
+
+|`imap`
+|KDE API для поддержки IMAP
+
+|`incidenceeditor`
+|Инцидентные редакторские библиотеки для KDEPim
+
+|`infocenter`
+|Утилита Plasma5, предоставляющая системную информацию
+
+|`init`
+|Запускатель процессов KF5 для ускорения запуска приложений KDE
+
+|`itemmodels`
+|Модели KF5 для системы Qt Model/View
+
+|`itemviews`
+|KF5 виджеты-дополнения для Qt Model/View
+
+|`jobwidgets`
+|Виджеты KF5 для отслеживания экземпляра KJob
+
+|`js`
+|Библиотека KF5, предоставляющая интерпретатор ECMAScript
+
+|`jsembed`
+|Библиотека KF5 для привязки объектов JavaScript к QObjects
+
+|`kaddressbook`
+|Менеджер контактов KDE
+
+|`kalarm`
+|Планировщик персональных сигналов тревоги
+
+|`kalarm`
+|Планировщик персональных сигналов тревоги
+
+|`kate`
+|Базовая структура редактора для системы KDE
+
+|`kcmutils`
+|KF5 утилиты для работы с KCModules
+
+|`kde-cli-tools`
+|Неинтерактивные системные инструменты Plasma5
+
+|`kde-gtk-config`
+|Plasma5 конфигуратор GTK2 и GTK3
+
+|`kdeclarative`
+|Библиотека KF5, обеспечивающая интеграцию QML и KDE Frameworks
+
+|`kded`
+|KF5 расширяемый демон для предоставления системных сервисов
+
+|`kdelibs4support`
+|Помощник в портировании KF5 из KDELibs4
+
+|`kdepim-addons`
+|Дополнения KDE PIM
+
+|`kdepim-apps-libs`
+|Библиотеки KDE PIM, связанные с почтой
+
+|`kdepim-runtime5`
+|Инструменты и службы KDE PIM
+
+|`kdeplasma-addons`
+|Дополнения Plasma5 для улучшения работы с Plasma
+
+|`kdesu`
+|Интеграция KF5 с su для повышенных привилегий
+
+|`kdewebkit`
+|Библиотека KF5, обеспечивающая интеграцию QtWebKit
+
+|`kgamma5`
+|Настройки гаммы монитора Plasma5
+
+|`khtml`
+|Механизм рендеринга KF5 KTHML
+
+|`kimageformats`
+|Библиотека KF5, обеспечивающая поддержку дополнительных форматов изображений
+
+|`kio`
+|Абстракция ресурсов и сетевого доступа KF5
+
+|`kirigami2`
+|Набор компонентов на основе QtQuick
+
+|`kitinerary`
+|Модель данных и система извлечения информации о бронировании путешествий
+
+|`kmail`
+|Клиент электронной почты KDE
+
+|`kmail`
+|Клиент электронной почты KDE
+
+|`kmail-account-wizard`
+|Мастер настройки почтового аккаунта KDE
+
+|`kmenuedit`
+|Редактор меню Plasma5
+
+|`knotes`
+|Всплывающие примечания
+
+|`kontact`
+|KDE Персональный Органайзер
+
+|`kontact`
+|KDE Персональный Органайзер
+
+|`kontactinterface`
+|KDE glue для встраивания KParts в Kontact
+
+|`korganizer`
+|Программа для календаря и планирования
+
+|`kpimdav`
+|Реализация протокола DAV с KJobs
+
+|`kpkpass`
+|Библиотека для работы с файлами паролей Apple Wallet
+
+|`kross`
+|KF5 мультиязыковые прикладные скрипты
+
+|`kscreen`
+|Библиотека управления экраном Plasma5
+
+|`kscreenlocker`
+|Архитектура безопасной блокировки экрана Plasma5
+
+|`ksmtp`
+|Библиотека на основе задач для отправки электронной почты через SMTP-сервер
+
+|`ksshaskpass`
+|Plasma5 интерфейс для ssh-add
+
+|`ksysguard`
+|Утилита Plasma5 для отслеживания и управления запущенными процессами
+
+|`kwallet-pam`
+|Интеграция Plasma5 KWallet с PAM
+
+|`kwayland-integration`
+|Интеграционные плагины для рабочего стола на основе Wayland
+
+|`kwin`
+|Менеджер окон Plasma5
+
+|`kwrited`
+|Демон Plasma5, ожидающий сообщения wall и write
+
+|`ldap`
+|API доступа к LDAP для KDE
|`libkcddb`
|Библиотека KDE CDDB
@@ -911,65 +2683,259 @@ QMAKE_ARGS+= INCLUDEPATH+=${LOCALBASE}/include \
|`libkcompactdisc`
|Библиотека KDE для взаимодействия с аудио-CD
-|`libkdeedu`
-|Библиотеки, используемые для образовательных приложений
-
|`libkdcraw`
-|Библиотека KDE LibRaw
+|Интерфейс LibRaw для KDE
+
+|`libkdegames`
+|Библиотеки, используемые играми KDE
+
+|`libkdepim`
+|Библиотеки KDE PIM
+
+|`libkeduvocdocument`
+|Библиотека для чтения и записи файлов словарей
|`libkexiv2`
-|Библиотека KDE Exiv2
+|Интерфейс библиотеки Exiv2 для KDE
|`libkipi`
-| KDE Image Plugin Interface
+|Интерфейс плагинов изображений KDE
-|`libkonq`
-|Основная библиотека Konqueror
+|`libkleo`
+|Менеджер сертификатов для KDE
|`libksane`
-|Библиотека KDE SANE ("Scanner Access Now Easy")
+|Интерфейс библиотеки SANE для KDE
-|`pimlibs`
-|Библиотеки KDE-Pim
+|`libkscreen`
+|Библиотека управления экраном Plasma5
-|`kate`
-|Тектовый редактор
+|`libksieve`
+|Библиотеки Sieve для KDEPim
+
+|`libksysguard`
+|Библиотека Plasma5 для отслеживания и управления запущенными процессами
+
+|`mailcommon`
+|Общие библиотеки для KDEPim
+
+|`mailimporter`
+|Импорт файлов mbox в KMail
+
+|`mailtransport`
+|Библиотека KDE для управления транспортом почты
|`marble`
-|Виртуальный глобус
+|Виртуальный глобус и мировой атлас для KDE
+
+|`mbox`
+|Библиотека KDE для доступа к хранилищам почты в формате MBox
+
+|`mbox-importer`
+|Импорт файлов mbox в KMail
+
+|`mediaplayer`
+|Интерфейс плагина KF5 для функций медиаплеера
+
+|`messagelib`
+|Библиотека для обработки сообщений
+
+|`milou`
+|Plasma5 Plasmoid для поиска
+
+|`mime`
+|Библиотека для обработки данных MIME
+
+|`newstuff`
+|Библиотека KF5 для загрузки ресурсов приложений из сети
+
+|`notifications`
+|Абстракция KF5 для системных уведомлений
+
+|`notifyconfig`
+|Система конфигурации KF5 для KNotify
|`okular`
-|Универсальный просмотрщик документов
+|Универсальная программа для просмотра документов KDE
+
+|`oxygen`
+|Стиль Plasma5 Oxygen
+
+|`oxygen-icons5`
+|Тема иконок Oxygen для KDE
+
+|`package`
+|Библиотека KF5 для загрузки и установки пакетов
+
+|`parts`
+|KF5 система плагинов для работы с документами
+
+|`people`
+|Библиотека KF5, предоставляющая доступ к контактам
+
+|`pim-data-exporter`
+|Импорт и экспорт настроек KDE PIM
+
+|`pimcommon`
+|Общие библиотеки для KDEPim
+
+|`pimtextedit`
+|Библиотека KDE для утилит редактирования текста, специфичных для PIM
+
+|`plasma-browser-integration`
+|Компоненты Plasma5 для интеграции браузеров в рабочий стол
+
+|`plasma-desktop`
+|Plasma5 рабочий стол Plasma
+
+|`plasma-framework`
+|KF5 - среда выполнения пользовательского интерфейса на основе плагинов, используемая для создания пользовательских интерфейсов
+
+|`plasma-integration`
+|Плагины интеграции Qt Platform Theme для рабочего окружения Plasma
+
+|`plasma-pa`
+|Plasma5 Микшер звука Plasma Pulse
+
+|`plasma-sdk`
+|Приложения Plasma5, полезные для разработки Plasma
+
+|`plasma-workspace`
+|Plasma5 Рабочее пространство Plasma
+
+|`plasma-workspace-wallpapers`
+|Обои Plasma5
+
+|`plotting`
+|KF5 облегченный фреймворк для построения графиков
+
+|`polkit-kde-agent-1`
+|Демон Plasma5, предоставляющий интерфейс аутентификации polkit
+
+|`powerdevil`
+|Инструмент Plasma5 для управления настройками энергопотребления
-|`korundum`
-|Привязка Ruby к KDE
+|`prison`
+|Интерфейс API для создания штрихкодов
-|`perlkde`
-|Привязка Perl к KDE
+|`pty`
+|Абстракция pty KF5
-|`pykde4`
-|Привязка Python к KDE
+|`purpose`
+|Предлагает доступные действия для конкретной цели
-|`pykdeuic4`
-|Компилятор пользовательского интерфейса PyKDE
+|`qqc2-desktop-style`
+|Стиль Qt QuickControl2 для KDE
-|`smokekde`
-|Библиотеки KDE SMOKE
+|`runner`
+|KF5 параллелизованная система запросов
+
+|`service`
+|KF5 расширенные плагины и интроспекция сервисов
+
+|`solid`
+|Интеграция и обнаружение оборудования KF5
+
+|`sonnet`
+|KF5 библиотека проверки орфографии на основе плагинов
+
+|`syndication`
+|Библиотека KDE для обработки RSS-лент
+
+|`syntaxhighlighting`
+|Движок подсветки синтаксиса KF5 для структурированного текста и кода
+
+|`systemsettings`
+|Настройки системы Plasma5
+
+|`texteditor`
+|KF5 продвинутый встраиваемый текстовый редактор
+
+|`textwidgets`
+|KF5 расширенные виджеты для редактирования текста
+
+|`threadweaver`
+|KF5 дополнения к QtDBus
+
+|`tnef`
+|KDE API для обработки данных TNEF
+
+|`unitconversion`
+|Библиотека KF5 для преобразования единиц измерения
+
+|`user-manager`
+|Пользовательский менеджер Plasma5
+
+|`wallet`
+|KF5 безопасный и унифицированный контейнер для паролей пользователей
+
+|`wayland`
+|Обёртка клиентской и серверной библиотек KF5 для библиотек Wayland
+
+|`widgetsaddons`
+|KF5 аддоны для QtWidgets
+
+|`windowsystem`
+|Библиотека KF5 для доступа к оконной системе
+
+|`xmlgui`
+|KF5 настраиваемые пользователем главные окна
+
+|`xmlrpcclient`
+|Взаимодействие KF5 с XMLRPC-сервисами
|===
-Порты KDE 4.x устанавливаются в `KDE4_PREFIX`, что в настоящее время соответствует [.filename]#/usr/local/kde4#. Это достигается путем указания компонента `kdeprefix`, который определяет значение по умолчанию для `PREFIX`. Тем не менее, порты учитывают любые `PREFIX`, установленные через переменную окружения `MAKEFLAGS` и/или параметры `make`.
+[[kde5-components-example]]
+.Пример `USE_KDE`
+[example]
+====
+Это простой пример порта для KDE. `USES= cmake` указывает порту использовать CMake, инструмент конфигурации, широко применяемый в проектах KDE (см. crossref:special[using-cmake, Использование `cmake`] для подробного описания). `USE_KDE` добавляет зависимость от библиотек KDE. Необходимые компоненты KDE и другие зависимости можно определить через лог конфигурации. `USE_KDE` не подразумевает `USE_QT`. Если порту требуются некоторые компоненты Qt, укажите их в `USE_QT`.
+
+[.programlisting]
+....
+USES= cmake kde:5 qt:5
+USE_KDE= ecm
+USE_QT= core buildtools_build qmake_build
+....
-[[kde4-components-example]]
-.Пример `USE_KDE4`
+====
+
+[[using-lxqt]]
+== Использование LXQt
+
+Приложения, зависящие от LXQt, должны устанавливать `USES+= lxqt` и задавать `USE_LXQT` списком необходимых компонентов из таблицы ниже
+
+[[using-lxqt-components]]
+.Доступные компоненты LXQt
+[cols="1,1", frame="none", options="header"]
+|===
+| Имя
+| Описание
+
+|`buildtools`
+|Помощники для дополнительных модулей CMake
+
+|`libfmqt`
+|Привязки Libfm к Qt
+
+|`lxqt`
+|Ядро библиотеки LXQt
+
+|`qtxdg`
+|Реализация Qt спецификаций freedesktop.org XDG
+|===
+
+[[lxqt-components-example]]
+.Пример `USE_LXQT`
[example]
====
-Это простой пример для порта KDE 4. `USES= cmake:outsource` указывает порту использовать CMake, конфигурационный инструмент, широко применяемый в проектах KDE 4 (подробное описание даёт <<using-cmake>>). `USE_KDE4` добавляет зависимость от библиотек KDE и заставляет порты использовать `automoc4` во время сборки. Требуемые компоненты KDE и другие зависимости можно определить в журнале configure. `USE_KDE4` не подразумевает `USE_QT4`. Если порт требует какой-либо из компонентов Qt 4, их следует указать в `USE_QT4`.
+Это простой пример, `USE_LXQT` добавляет зависимость от библиотек LXQt. Необходимые компоненты LXQt и другие зависимости можно определить из лога конфигурации.
[.programlisting]
....
-USES= cmake:outsource
-USE_KDE4= kdelibs kdeprefix automoc4
-USE_QT4= moc_build qmake_build rcc_build uic_build
+USES= cmake lxqt qt:5 tar:xz
+USE_QT= core dbus widgets buildtools_build qmake_build
+USE_LXQT= buildtools libfmqt
....
====
@@ -978,155 +2944,159 @@ USE_QT4= moc_build qmake_build rcc_build uic_build
== Использование Java
[[java-variables]]
-=== Задание переменных
+=== Определения переменных
-Если вашему порту необходимо наличие Java(TM) Development Kit (JDK(TM)) для построения, работы или даже распаковки дистрибутивного файла, то в нём должна быть задана переменная `USE_JAVA`.
+Если порту требуется Java(TM) Development Kit (JDK(TM)) для сборки, запуска или даже извлечения distfile, определите `USE_JAVA`.
-В Коллекции Портов присутствуют несколько JDK различных разработчиков и разных версий. Если ваш порт должен использовать одну из этих версий, то вы должны указать, какую именно. Самой последней версией и версией по умолчанию является package:java/openjdk6[].
+В коллекции портов доступно несколько JDK от различных поставщиков и в нескольких версиях. Если порт должен использовать определённую версию, укажите её с помощью переменной `JAVA_VERSION`. Самая актуальная версия — package:java/openjdk18[], также доступны package:java/openjdk17[], package:java/openjdk16[], package:java/openjdk15[], package:java/openjdk14[], package:java/openjdk13[], package:java/openjdk12[], package:java/openjdk11[], package:java/openjdk8[] и package:java/openjdk7[].
-.Переменные, которые которые могут задаваться портами, использующими Java
+[[using-java-variables]]
+.Переменные, которые могут быть установлены портами, использующими Java
[cols="1,1", frame="none", options="header"]
|===
| Переменная
| Значение
|`USE_JAVA`
-|Должна быть определена для того, что последующие переменные вступили в действие.
+|Определите для остальных переменных, чтобы они имели какой-либо эффект.
|`JAVA_VERSION`
-|Список версий Java, перечисленных через пробел, подходящих для порта. Опциональный знак `"+"` позволяет вам указать диапазон версий (возможные значения: `1.5[+] 1.6[+] 1.7[+]`).
+|Список подходящих версий Java для порта, разделённых пробелами.
+Необязательный символ `\+` позволяет указать диапазон версий (допустимые значения: `8[+] 11[\+] 17[+] 18[\+] 19[+] 20[\+] 21[+]`).
|`JAVA_OS`
-|Список операционных систем, перечисленных через пробел, порты JDK для которых подходят для порта (возможные значения: `native linux`).
+|Список разделенных пробелами подходящих операционных систем портов JDK для порта (допустимые значения: `native linux`).
|`JAVA_VENDOR`
-|Список разработчиков портов JDK, перечисленных через пробел, которые подходят для порта (возможные значения: `freebsd bsdjava sun openjdk`).
+|Список подходящих поставщиков портов JDK для порта через пробел (допустимые значения: `openjdk oracle`).
|`JAVA_BUILD`
-|Если задана, то означает, что выбранный порт JDK должен быть добавлен к зависимостям порта для его построения.
+|Когда установлено, добавляет выбранный порт JDK в зависимости сборки.
|`JAVA_RUN`
-|Если задана, то означает, что выбранный порт JDK должен быть добавлен в зависимостям порта для его работы.
+|Когда установлено, добавляет выбранный порт JDK в зависимости времени выполнения.
|`JAVA_EXTRACT`
-|Если задана, то означает, что выбранный порт JDK должен быть добавлен в зависимостям порта для распаковки его дистрибутивных файлов.
+|Когда установлено, добавляет выбранный порт JDK в зависимости для извлечения.
|===
-Ниже перечисляются все значения, которые принимают переменные после задания переменной `USE_JAVA`:
+Ниже приведен список всех настроек, которые порт получит после установки `USE_JAVA`:
-.Переменные, доступные в портах, использующих Java
+[[using-java-variables2]]
+.Переменные, предоставляемые портам, использующим Java
[cols="1,1", frame="none", options="header"]
|===
| Переменная
| Значение
|`JAVA_PORT`
-|Название порта JDK (к примеру, `'java/openjdk6'`).
+|Имя порта JDK (например, `java/openjdk6`).
|`JAVA_PORT_VERSION`
-|Полное наименовании версии порта JDK (к примеру, `'1.6.0'`). Если вам нужны только первые две цифры номера версии, используйте `${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}`.
+|Полная версия порта JDK (например, `1.6.0`). Требуются только первые две цифры номера версии, используйте `${JAVA_PORT_VERSION:C/^([0-9])\.([0-9])(.*)$/\1.\2/}`.
|`JAVA_PORT_OS`
-|Операционная система, используемая портом JDK (к примеру, `'native'`).
+|Операционная система, используемая портом JDK (например, `'native'`).
|`JAVA_PORT_VENDOR`
-|Разработчик порта JDK (к примеру, `'openjdk'`).
+|Поставщик порта JDK (например, `'openjdk'`).
|`JAVA_PORT_OS_DESCRIPTION`
-|Описание операционной системы, используемой портом JDK (к примеру, `'Native'`).
+|Описание операционной системы, используемой портом JDK (например, `'Native'`).
|`JAVA_PORT_VENDOR_DESCRIPTION`
-|Описание разработчика порта JDK (к примеру, `'OpenJDK BSD Porting Team'`).
+|Описание поставщика порта JDK (например, `'OpenJDK BSD Porting Team'`).
|`JAVA_HOME`
-|Маршрут к установочному каталогу JDK (к примеру, [.filename]#'/usr/local/openjdk6'#).
+|Путь к каталогу установки JDK (например, [.filename]#'/usr/local/openjdk6'#).
|`JAVAC`
-|Маршрут к используемому компилятору Java (к примеру, [.filename]#'/usr/local/openjdk6/bin/javac'#.
+|Путь к используемому компилятору Java (например, [.filename]#'/usr/local/openjdk6/bin/javac'#).
|`JAR`
-|Маршрут к используемой утилите `jar` (к примеру, [.filename]#'/usr/local/openjdk6/bin/jar'# или [.filename]#'/usr/local/bin/fastjar'#).
+|Путь к инструменту `jar`, который следует использовать (например, [.filename]#'/usr/local/openjdk6/bin/jar'# или [.filename]#'/usr/local/bin/fastjar'#).
|`APPLETVIEWER`
-|Маршрут к утилите `appletviewer` (к примеру, [.filename]#'/usr/local/openjdk6/bin/appletviewer'#).
+|Путь к утилите `appletviewer` (например, [.filename]#'/usr/local/openjdk6/bin/appletviewer'#).
|`JAVA`
-|Маршрут к выполняемому файлу `java`. Используйте его для запуска Java-программ (к примеру, [.filename]#'/usr/local/openjdk6/bin/java'#).
+|Путь к исполняемому файлу `java`. Используется для запуска программ на Java (например, [.filename]#'/usr/local/openjdk6/bin/java'#).
|`JAVADOC`
-|Маршрут к вспомогательной программе `javadoc`.
+|Путь к программе `javadoc`.
|`JAVAH`
-|Маршрут к программе `javah`.
+|Путь к программе `javah`.
|`JAVAP`
-|Маршрут к программе `javap`.
+|Путь к программе `javap`.
|`JAVA_KEYTOOL`
-|Маршрут к вспомогательной программе `keytool`.
+|Путь к утилите `keytool`.
|`JAVA_N2A`
-|Маршрут к утилите `native2ascii`.
+|Путь к инструменту `native2ascii`.
|`JAVA_POLICYTOOL`
-|Маршрут к программе `policytool`.
+|Путь к программе `policytool`.
|`JAVA_SERIALVER`
-|Маршрут к вспомогательной программе `serialver`.
+|Путь к утилите `serialver`.
|`RMIC`
-|Маршрут к генератору каркаса программ RMI, утилите `rmic`.
+|Путь к генератору RMI-заглушек/скелетов, `rmic`.
|`RMIREGISTRY`
-|Маршрут к программе регистрации RMI, `rmiregistry`.
+|Путь к программе реестра RMI, `rmiregistry`.
|`RMID`
-|Маршрут к программе-даемону RMI `rmid`.
+|Путь к программе демона RMI `rmid`.
|`JAVA_CLASSES`
-|Маршрут к архиву, который содержит файлы классов JDK, [.filename]#${JAVA_HOME}/jre/lib/rt.jar#.
+|Путь к архиву, содержащему файлы классов JDK, [.filename]#${JAVA_HOME}/jre/lib/rt.jar#.
|===
-Вы можете воспользоваться make-целью `java-debug` для получения информации, необходимой для отладки вашего порта. При её выполнении будут выданы значения многих упомянутых выше переменных.
+Используйте цель `java-debug` в make для получения информации для отладки порта. Она отобразит значения многих из перечисленных ранее переменных.
-Кроме того, для единообразия установки всех портов Java определены следующие константы:
+Кроме того, определены следующие константы, чтобы все порты Java могли быть установлены единообразно:
-.Константы, определённые для портов, использующих Java
+[[using-java-constants]]
+.Константы, определенные для портов, использующих Java
[cols="1,1", frame="none", options="header"]
|===
| Константа
| Значение
|`JAVASHAREDIR`
-|Корневой каталог для всего, что связано с Java. По умолчанию: [.filename]#${PREFIX}/shared/java#.
+|Базовый каталог для всего, связанного с Java. По умолчанию: [.filename]#${PREFIX}/share/java#.
|`JAVAJARDIR`
-|Каталог, в который должны устанавливаться JAR-файлы. По умолчанию: [.filename]#${JAVASHAREDIR}/classes#.
+|Каталог, в котором установлены JAR-файлы. По умолчанию: [.filename]#${JAVASHAREDIR}/classes#.
|`JAVALIBDIR`
-|Каталог, в который устанавливаются JAR-файлы из других портов. По умолчанию: [.filename]#${LOCALBASE}/shared/java/classes#.
+|Каталог, в котором расположены JAR-файлы, установленные другими портами. По умолчанию: [.filename]#${LOCALBASE}/share/java/classes#.
|===
-Соответствующие записи определяются в обоих переменных `PLIST_SUB` (описана в crossref:plist[plist-sub,Изменение содержимого pkg-plist в зависимости от make-переменных]) и `SUB_LIST`.
+Связанные записи определены как в `PLIST_SUB` (документировано в crossref:plist[plist-sub,Изменение pkg-plist на основе переменных Make]), так и в `SUB_LIST`.
[[java-building-with-ant]]
-=== Построение с Ant
+=== Сборка с Ant
-Если построение порта производится с использованием Apache Ant, то необходимо определить `USE_ANT`. Таким образом Ant становится подкомандой make. Если в порте не определена цель `do-build`, то будет установлена цель по умолчанию, которая просто запускает Ant в соответствии со значением `MAKE_ENV`, `MAKE_ARGS` и `ALL_TARGET`. Это похоже на механизм `USES= gmake`, который описан в <<building>>.
+Когда порт должен собираться с использованием Apache Ant, он должен определять `USE_ANT`. Таким образом, Ant считается командой sub-make. Если цель `do-build` не определена в порте, будет установлена цель по умолчанию, которая запускает Ant в соответствии с `MAKE_ENV`, `MAKE_ARGS` и `ALL_TARGET`. Это аналогично механизму `USES= gmake`, который документирован в crossref:special[building, Building Mechanisms].
[[java-best-practices]]
-=== Практические рекомендации
+=== Лучшие практики
-При портировании Java-библиотеки ваш порт должен устанавливать JAR-файл(ы) в каталог [.filename]#${JAVAJARDIR}#, а все остальные данные в каталог [.filename]#${JAVASHAREDIR}/${PORTNAME}# (за исключением документации, о которой пойдёт речь ниже). Для уменьшения размера упакованного файла вы можете сослаться на JAR-файл(ы) непосредственно в файле [.filename]#Makefile#. Просто воспользуйтесь следующей директивой (в которой [.filename]#myport.jar# является именем JAR-файла, устанавливаемого как часть порта):
+При переносе библиотеки Java порт должен устанавливать JAR-файл(ы) в [.filename]#${JAVAJARDIR}#, а все остальное — в [.filename]#${JAVASHAREDIR}/${PORTNAME}# (за исключением документации, см. ниже). Чтобы уменьшить размер упаковочного файла, ссылайтесь на JAR-файл(ы) напрямую в [.filename]#Makefile#. Используйте следующую инструкцию (где [.filename]#myport.jar# — имя JAR-файла, устанавливаемого как часть порта):
[.programlisting]
....
-PLIST_FILES+= %%JAVAJARDIR%%/myport.jar
+PLIST_FILES+= ${JAVAJARDIR}/myport.jar
....
-При портировании Java-приложения порт обычно устанавливает всё в один каталог (в том числе все свои JAR-зависимости). В этом отношении настоятельно рекомендуется использование [.filename]#${JAVASHAREDIR}/${PORTNAME}#. На усмотрение создателя порта остаётся решение вопроса о том, устанавливать ли дополнительные JAR-зависимости в этот каталог или напрямую использовать уже установленные (из каталога [.filename]#${JAVAJARDIR}#).
+При переносе Java-приложения порт обычно устанавливает все компоненты в единый каталог (включая зависимости в виде JAR-файлов). В этом отношении настоятельно рекомендуется использовать [.filename]#${JAVASHAREDIR}/${PORTNAME}#. Портеру предстоит решить, устанавливать ли дополнительные JAR-зависимости в этот каталог или использовать уже установленные (из [.filename]#${JAVAJARDIR}#).
-При портировании приложения Java(TM), для запуска сервиса которого требуется сервер приложений, такой как package:www/tomcat7[], для производителя в порядке вещей является распространение файла [.filename]#.war#. Файл [.filename]#.war# - это Веб-приложение АРхивированное и оно распаковывается при вызове данным приложением. Избегайте добавлять файлы [.filename]#.war# в [.filename]#pkg-plist#. Это не является наилучшим решением. Сервер приложений производит расширение архива [.filename]#war# без должной его очистки при удалении порта. Более подходящим способом работы с этим файлом будет распаковать архив, установить файлы и добавить их в [.filename]#pkg-plist#.
+При переносе Java(TM)-приложения, которое требует сервера приложений, такого как package:www/tomcat7[], для запуска службы, вендор часто распространяет файл [.filename]#.war#. [.filename]#.war# — это веб-архив приложения (Web application ARchive), который извлекается при вызове приложением. Избегайте добавления [.filename]#.war# в [.filename]#pkg-plist#. Это не считается лучшей практикой. Сервер приложений развернет архив war, но не очистит его должным образом при удалении порта. Более предпочтительный способ работы с этим файлом — извлечь архив, затем установить файлы и, наконец, добавить эти файлы в [.filename]#pkg-plist#.
[.programlisting]
....
@@ -1140,20 +3110,20 @@ post-extract:
do-install:
cd ${WRKDIR} && \
${INSTALL} -d -o ${WWWOWN} -g ${WWWGRP} ${TOMCATDIR}/webapps/${PORTDIRNAME}
- @cd ${WRKDIR}/${PORTDIRNAME} && ${COPYTREE_SHARE} \* ${WEBAPPDIR}/${PORTDIRNAME}
+ cd ${WRKDIR}/${PORTDIRNAME} && ${COPYTREE_SHARE} \* ${WEBAPPDIR}/${PORTDIRNAME}
....
-Вне зависимости от типа вашего порта (библиотека это или приложение), дополнительная документация должна устанавливаться <<install-documentation,в тоже самое место>>, что и для других портов. Известно, что в зависимости от используемой версии JDK утилита JavaDoc генерирует различные наборы файлов. Для портов, которые не привязаны к использованию определённой версии JDK, таким образом становится проблематичным определить список файлов для упаковки ([.filename]#pkg-plist#). Это одна из причин, по которой создателям портов настоятельно рекомендуется использовать макрос `PORTDOCS`. Более того, даже если вы сможете угадать набор файлов, который будет сгенерирован утилитой `javadoc`, размер получающегося файла [.filename]#pkg-plist# голосует за использование `PORTDOCS`.
+Независимо от типа порта (библиотека или приложение), дополнительная документация устанавливается crossref:makefiles[install-documentation,в том же месте], что и для любого другого порта. Известно, что инструмент Javadoc создает разный набор файлов в зависимости от версии используемого JDK. Для портов, которые не требуют использования конкретной версии JDK, указание списка упаковки ([.filename]#pkg-plist#) становится сложной задачей. Это одна из причин, по которой разработчикам портов настоятельно рекомендуется использовать `PORTDOCS`. Более того, даже если набор файлов, генерируемых `javadoc`, можно предсказать, размер результирующего [.filename]#pkg-plist# говорит в пользу использования `PORTDOCS`.
-Значением по умолчанию для переменной `DATADIR` является [.filename]#${PREFIX}/shared/${PORTNAME}#. Хорошей идеей является переопределение для Java-портов значения `DATADIR` как [.filename]#${JAVASHAREDIR}/${PORTNAME}#. На самом деле `DATADIR` автоматически добавляется к `PLIST_SUB` (это описано в crossref:plist[plist-sub,Изменение содержимого pkg-plist в зависимости от make-переменных]), так что вы сможете использовать `%%DATADIR%%` непосредственно в [.filename]#pkg-plist#.
+Значение по умолчанию для `DATADIR` — [.filename]#${PREFIX}/share/${PORTNAME}#. Рекомендуется переопределить `DATADIR` на [.filename]#${JAVASHAREDIR}/${PORTNAME}# для портов Java. Действительно, `DATADIR` автоматически добавляется в `PLIST_SUB` (документировано в crossref:plist[plist-sub,Изменение pkg-plist на основе переменных Make]), поэтому используйте `%%DATADIR%%` напрямую в [.filename]#pkg-plist#.
-Что касается выбора между построением портов Java из исходных текстов или их прямой установкой из бинарных дистрибутивов, то на момент создания этого текста определённой политики на этот счёт не существует. Однако участники http://www.freebsd.org/java/[Проекта FreeBSD Java] рекомендуют создателям портов строить их из исходных текстов, если эта задача является несложной.
+Что касается выбора между сборкой портов Java из исходного кода или их непосредственной установкой из бинарного дистрибутива, на момент написания документации определённой политики не существует. Однако участники https://www.freebsd.org/java/[FreeBSD Java Project] рекомендуют сопровождающим портов по возможности собирать их из исходного кода, если это не представляет сложностей.
-Все возможности, которые были описаны в этом разделе, реализованы в файле [.filename]#bsd.java.mk#. Если вы предположите, что вашему порту требуется менее тривиальная поддержка Java, пожалуйста, взгляните сначала на http://svnweb.FreeBSD.org/ports/head/Mk/bsd.java.mk?view=markup[журнал изменений bsd.java.mk в Subversion], так как для документирования последних изменений требуется какое-то время. Затем, если вы думаете, что не хватающая вам поддержка окажется полезной для многих других портов Java, обсудите ваш вопрос в freebsd-java.
+Все функции, представленные в этом разделе, реализованы в [.filename]#bsd.java.mk#. Если порту требуется более сложная поддержка Java, сначала ознакомьтесь с https://cgit.FreeBSD.org/ports/tree/Mk/bsd.java.mk[историей изменений bsd.java.mk], так как документирование новых функций обычно занимает некоторое время. Затем, если отсутствующая поддержка будет полезна для многих других Java-портов, не стесняйтесь обсудить это на списке рассылки freebsd-java.
-Хотя в базе сообщений об ошибках для соответствующих PR имеется категория `java`, она относится к работе над портированием JDK, которые проводит Проект FreeBSD Java. Таким образом, вы должны относить свой Java-порт, как и любой другой, к категории `ports`, если решаемый вами вопрос не относится ни к реализации JDK, ни к [.filename]#bsd.java.mk#.
+Хотя существует категория `java` для PR, она относится к усилиям по портированию JDK в рамках проекта FreeBSD Java. Поэтому отправляйте порт Java в категорию `ports`, как и любой другой порт, если только проблема не связана либо с реализацией JDK, либо с [.filename]#bsd.java.mk#.
-Похожим образом определена политика по отношению к `CATEGORIES` порта Java, которая подробно описана в crossref:makefiles[makefile-categories, Разделение по категориям].
+Аналогично существует определённая политика в отношении `CATEGORIES` для портов Java, которая подробно описана в crossref:makefiles[makefile-categories,Категоризация].
[[using-php]]
== Веб-приложения, Apache и PHP
@@ -1161,315 +3131,334 @@ do-install:
[[using-apache]]
=== Apache
+[[using-apache-variables]]
.Переменные для портов, использующих Apache
[cols="1,1", frame="none"]
|===
|`USE_APACHE`
-|Порт требует Apache. Возможные значения: `yes` (берёт любую версию), `22`, `24`, `22-24`, `22+` и так далее. Версия по умолчанию `22`. Более подробная информация содержится в файле [.filename]#ports/Mk/bsd.apache.mk# и на странице http://wiki.freebsd.org/Apache/[wiki.freebsd.org/Apache/].
+|Порт требует Apache. Возможные значения: `yes` (любая версия), `22`, `24`, `22-24`, `22+` и т.д. Версия APACHE по умолчанию — `22`. Подробнее см. в [.filename]#ports/Mk/bsd.apache.mk# и на https://wiki.freebsd.org/Apache/[wiki.freebsd.org/Apache/].
|`APXS`
-|Полный путь к исполняемому файлу `apxs`. Может быть переопределен в вашем порту.
+|Полный путь к бинарному файлу `apxs`. Может быть переопределён в порте.
|`HTTPD`
-|Полный путь к исполняемому файлу `httpd`. Может быть переопределен в вашем порту.
+|Полный путь к бинарному файлу `httpd`. Может быть переопределён в порте.
|`APACHE_VERSION`
-|Версия установленного Apache (переменная только для чтения). Эта переменная доступна только после подключения [.filename]#bsd.port.pre.mk#. Возможные значения: `22`, `24`.
+|Версия установленной Apache (переменная только для чтения). Эта переменная доступна только после включения [.filename]#bsd.port.pre.mk#. Возможные значения: `22`, `24`.
|`APACHEMODDIR`
-|Каталог для модулей Apache. Значение переменной автоматически подставляется в [.filename]#pkg-plist#.
+|Каталог для модулей Apache. Эта переменная автоматически раскрывается в [.filename]#pkg-plist#.
|`APACHEINCLUDEDIR`
-|Каталог для заголовков Apache. Значение переменной автоматически подставляется в [.filename]#pkg-plist#.
+|Каталог для заголовков Apache. Эта переменная автоматически раскрывается в [.filename]#pkg-plist#.
|`APACHEETCDIR`
-|Каталог для конфигурационных файлов Apache. Значение переменной автоматически подставляется в [.filename]#pkg-plist#.
+|Каталог для файлов конфигурации Apache. Эта переменная автоматически раскрывается в [.filename]#pkg-plist#.
|===
-.Используемые переменные при портировании модулей Apache
+[[using-apache-modules]]
+.Полезные переменные для переноса модулей Apache
[cols="1,1", frame="none"]
|===
|`MODULENAME`
-|Название модуля. Значением по умолчанию является `PORTNAME`. Пример: `mod_hello`
+|Имя модуля. Значение по умолчанию — `PORTNAME`. Пример: `mod_hello`
|`SHORTMODNAME`
-|Краткое название модуля. Наследуется автоматически от `MODULENAME`, но может быть переопределено. Пример: `hello`
+|Короткое имя модуля. Автоматически определяется из `MODULENAME`, но может быть переопределено. Пример: `hello`
|`AP_FAST_BUILD`
-|Использовать `apxs` для компиляции и установки модуля.
+|Используйте `apxs` для компиляции и установки модуля.
|`AP_GENPLIST`
-|Также автоматически создает [.filename]#pkg-plist#.
+|Также автоматически создаёт файл [.filename]#pkg-plist#.
|`AP_INC`
-|Добавляет каталог к пути поиска заголовков во время компиляции.
+|Добавляет каталог в путь поиска заголовков во время компиляции.
|`AP_LIB`
-|Добавляет каталог к пути поиска библиотек во время компиляции.
+|Добавляет каталог в путь поиска библиотек во время компиляции.
|`AP_EXTRAS`
-|Дополнительные флаги, передаваемые `apxs`.
+|Дополнительные флаги для передачи в `apxs`.
|===
[[web-apps]]
=== Веб-приложения
-Веб-приложения следует устанавливать в [.filename]#PREFIX/www/appname#. Для вашего удобства этот путь одинаково доступен в [.filename]#Makefile# и [.filename]#pkg-plist# как переменная `WWWDIR`, а путь относительно `PREFIX` доступен в [.filename]#Makefile# как `WWWDIR_REL`.
+Веб-приложения должны быть установлены в [.filename]#PREFIX/www/appname#. Этот путь доступен как в [.filename]#Makefile#, так и в [.filename]#pkg-plist# как `WWWDIR`, а путь относительно `PREFIX` доступен в [.filename]#Makefile# как `WWWDIR_REL`.
+
+Пользователь и группа процесса веб-сервера доступны как `WWWOWN` и `WWWGRP`, если необходимо изменить владельца некоторых файлов. Значения по умолчанию для обоих — `www`. Используйте `WWWOWN?= myuser` и `WWWGRP?= mygroup`, если порту требуются другие значения. Это позволяет пользователю легко их переопределить.
-Пользователь и группа процесса веб-сервера доступны как `WWWOWN` и `WWWGRP`, в случае если вам нужно изменить владельца для некоторых файлов. Значением по умолчанию и для владельца, и для группы является `www`. Если вы хотите использовать в вашем порте другие значения, воспользуйтесь для этого нотацией `WWWOWN?= myuser`, чтобы позволить пользователю легко переопределить их.
+[IMPORTANT]
+====
+Используйте `WWWOWN` и `WWWGRP` с осторожностью. Помните, что каждый файл, доступный для записи веб-серверу, представляет собой потенциальную угрозу безопасности.
+====
-Не добавляйте зависимость от Apache, если веб-приложение явным образом не нуждается в Apache. Учитывайте, что пользователи могут пожелать запустить ваше веб-приложение на другом веб-сервере помимо Apache.
+Не зависьте от Apache, если веб-приложение явно не требует Apache. Учитывайте, что пользователи могут захотеть запускать веб-приложение на другом веб-сервере, кроме Apache.
[[php-variables]]
=== PHP
-.Переменные для портов, использующих PHP
-[cols="1,1", frame="none"]
-|===
-|`USE_PHP`
-|Порт требует PHP. Значение `yes` добавляет зависимость от PHP. Вместо этого может быть указан перечень требуемых расширений PHP. Пример: `pcre xml gettext`
+Веб-приложения PHP объявляют свою зависимость от него с помощью `USES=php`. Подробнее см. в crossref:uses[uses-php,`php`].
-|`DEFAULT_PHP_VER`
-|Выбирает старший номер версии, с которым будет установлен PHP как зависимость в случае, когда PHP еще не установлен. По умолчанию `5`. Возможные значения: `4`, `5`
+[[php-pear]]
+=== Модули PEAR
-|`IGNORE_WITH_PHP`
-|Порт не работает с PHP данной версии. Возможные значения: `4`, `5`
+Портирование модулей PEAR — это очень простой процесс.
-|`USE_PHPIZE`
-|Порт будет построен как расширение PHP.
+Добавьте `USES=pear` в [.filename]#Makefile# порта. Фреймворк установит соответствующие файлы в нужные места и автоматически сгенерирует plist во время установки.
-|`USE_PHPEXT`
-|Порт будет считаться расширением PHP, включая установку и регистрацию в реестре расширений.
+[[pear-makefile]]
+.Пример Makefile для PEAR Class
+[example]
+====
+[.programlisting]
+....
+PORTNAME= Date
+DISTVERSION= 1.4.3
+CATEGORIES= devel www pear
-|`USE_PHP_BUILD`
-|Установить PHP как зависимость времени построения.
+MAINTAINER= someone@example.org
+COMMENT= PEAR Date and Time Zone Classes
+WWW= https://pear.php.net/package/Date/
-|`WANT_PHP_CLI`
-|Хочет CLI (командная строка) версию PHP.
+USES= pear
-|`WANT_PHP_CGI`
-|Хочет CGI версию PHP.
+.include <bsd.port.mk>
+....
-|`WANT_PHP_MOD`
-|Хочет PHP как модуль Apache.
+====
-|`WANT_PHP_SCR`
-|Хочет CLI или CGI версию PHP.
+[TIP]
+====
+Модули PEAR будут автоматически преобразованы в порт с флейвором с использованием crossref:flavors[flavors-auto-php,флейворов PHP].
+====
-|`WANT_PHP_WEB`
-|Хочет модуль Apache или CGI версию PHP.
-|===
+[NOTE]
+====
+Если используется нестандартный `PEAR_CHANNEL`, зависимости для сборки и выполнения будут добавлены автоматически.
+====
-=== Модули PEAR
+[IMPORTANT]
+====
+Модули PEAR не требуют определения `PKGNAMESUFFIX`, так как он автоматически заполняется с использованием `PEAR_PKGNAMEPREFIX`. Если порту необходимо добавить к `PKGNAMEPREFIX`, он также должен использовать `PEAR_PKGNAMEPREFIX`, чтобы отличать различные флейворы.
+====
-Портирование модулей PEAR является очень простым процессом.
+[[php-horde]]
+==== Модули Horde
-Используйте переменные `FILES`, `TESTS`, `DATA`, `SQLS`, `SCRIPTFILES`, `DOCS` and `EXAMPLES` для перечисления файлов, которые вы хотите установить. Все перечисленные файлы будут автоматически установлены в подходящие места и добавлены в [.filename]#pkg-plist#.
+Также и перенос модулей Horde является простым процессом.
-Подключите [.filename]#${PORTSDIR}/devel/pear/bsd.pear.mk# на последней строке [.filename]#Makefile#.
+Добавьте `USES=horde` в [.filename]#Makefile# порта. Фреймворк установит соответствующие файлы в нужные места и автоматически сгенерирует plist во время установки.
-[[pear-makefile]]
-.Пример Makefile для классов PEAR
+Переменные `USE_HORDE_BUILD` и `USE_HORDE_RUN` могут использоваться для добавления зависимостей времени сборки и выполнения от других модулей Horde. Полный список доступных модулей можно найти в [.filename]#Mk/Uses/horde.mk#.
+
+[[horde-Makefile]]
+.Пример Makefile для модуля Horde
[example]
====
[.programlisting]
....
-PORTNAME= Date
-PORTVERSION= 1.4.3
+PORTNAME= Horde_Core
+DISTVERSION= 2.14.0
CATEGORIES= devel www pear
-MAINTAINER= example@domain.com
-COMMENT= PEAR Date and Time Zone Classes
+MAINTAINER= horde@FreeBSD.org
+COMMENT= Horde Core Framework libraries
+WWW= https://pear.horde.org/
-BUILD_DEPENDS= ${PEARDIR}/PEAR.php:${PORTSDIR}/devel/pear-PEAR
-RUN_DEPENDS:= ${BUILD_DEPENDS}
+OPTIONS_DEFINE= KOLAB SOCKETS
+KOLAB_DESC= Enable Kolab server support
+SOCKETS_DESC= Depend on sockets PHP extension
-FILES= Date.php Date/Calc.php Date/Human.php Date/Span.php \
- Date/TimeZone.php
-TESTS= test_calc.php test_date_methods_span.php testunit.php \
- testunit_date.php testunit_date_span.php wknotest.txt \
- bug674.php bug727_1.php bug727_2.php bug727_3.php \
- bug727_4.php bug967.php weeksinmonth_4_monday.txt \
- weeksinmonth_4_sunday.txt weeksinmonth_rdm_monday.txt \
- weeksinmonth_rdm_sunday.txt
-DOCS= TODO
-_DOCSDIR= .
+USES= horde
+USE_PHP= session
-.include <bsd.port.pre.mk>
-.include "${PORTSDIR}/devel/pear/bsd.pear.mk"
-.include <bsd.port.post.mk>
+USE_HORDE_BUILD= Horde_Role
+USE_HORDE_RUN= Horde_Role Horde_History Horde_Pack \
+ Horde_Text_Filter Horde_View
+
+KOLAB_USE= HORDE_RUN=Horde_Kolab_Server,Horde_Kolab_Session
+SOCKETS_USE= PHP=sockets
+
+.include <bsd.port.mk>
....
====
+[TIP]
+====
+Поскольку модули Horde также являются модулями PEAR, они будут автоматически преобразованы с использованием crossref:flavors[flavors-auto-php,флейворов PHP].
+====
+
[[using-python]]
== Использование Python
-Коллекция Портов поддерживает параллельную установку множества версий Python. Следует убедиться, что в портах используется правильный интерпретатор `python` в соответствии с переменной `PYTHON_VERSION`, установленной пользователем. По большей части это означает замену пути к исполняемому файлу `python` в сценариях на значение переменной `PYTHON_CMD`.
+Коллекция портов поддерживает параллельную установку нескольких версий Python. Порты должны использовать правильный интерпретатор `python` в соответствии с настраиваемым пользователем параметром `PYTHON_VERSION`. Важнее всего заменить путь к исполняемому файлу `python` в скриптах на значение `PYTHON_CMD`.
-Порты, устанавливающие файлы под каталог `PYTHON_SITELIBDIR`, должны использовать префикс вида `pyXY-`, таким образом названия пакетов будут включать в себя версию Python, с которой они установлены.
+Порты, которые устанавливают файлы в `PYTHON_SITELIBDIR`, должны использовать префикс имени пакета `pyXY-`, чтобы их имя пакета включало версию Python, для которой они предназначены.
[.programlisting]
....
PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
....
-.Переменные для портов, которые используют Python
+
+[[using-python-variables]]
+.Наиболее полезные переменные для портов, использующих Python
[cols="1,1", frame="none"]
|===
-|`USE_PYTHON`
-|Для этого порта нужен Python. Минимальная требуемая версия может быть указана с таким значением как `2.6+`. Также можно указан диапазон версий с разделением двух версий через -, например: `2.6-2.7`
+|`USES=python`
+|Порту требуется Python. Минимально необходимая версия может быть указана с такими значениями, как `3.10+`. Диапазоны версий также можно указать, разделив две версии дефисом: `USES=python:3.8-3.9`. Обратите внимание, что `USES=python` _не_ включает Python 2.7, его нужно запрашивать явно с помощью `USES=python:2.7+`.
+
+|`USE_PYTHON=distutils`
+|Используйте Python distutils для настройки, компиляции и установки. Это требуется, когда порт поставляется с [.filename]#setup.py#. Это переопределяет цели `do-build` и `do-install`, а также может переопределить `do-configure`, если `GNU_CONFIGURE` не определён. Кроме того, подразумевается `USE_PYTHON=flavors`.
-|`USE_PYDISTUTILS`
-|Использовать дистрибутивные утилиты (distutils) Python для конфигурации, компиляции и установки. Необходимо, если порт использует [.filename]#setup.py#. Переопределяет цели `do-build` и `do-install` и также может переопределять `do-configure`, если не определена `GNU_CONFIGURE`.
+|`USE_PYTHON=autoplist`
+|Создать список пакетов автоматически. Это также требует установки `USE_PYTHON=distutils`.
+
+|`USE_PYTHON=concurrent`
+|Порт будет использовать уникальный префикс, обычно `PYTHON_PKGNAMEPREFIX`, для определённых каталогов, таких как `EXAMPLESDIR` и `DOCSDIR`, а также добавлять суффикс — версию Python из `PYTHON_VER` — к устанавливаемым бинарным файлам и скриптам. Это позволяет устанавливать порты для разных версий Python одновременно, что в противном случае приводило бы к конфликту файлов.
+
+|`USE_PYTHON=flavors`
+|Порт не использует distutils, но по-прежнему поддерживает несколько версий Python. `FLAVORS` будет установлен в поддерживаемые версии Python. Дополнительную информацию см. в crossref:flavors[flavors-auto-python,`USES`=python и флейворы].
+
+|`USE_PYTHON=optsuffix`
+|Если текущая версия Python не является версией по умолчанию, порт получит `PKGNAMESUFFIX=${PYTHON_PKGNAMESUFFIX}`. Полезно только для флейворов.
|`PYTHON_PKGNAMEPREFIX`
-|Используется как `PKGNAMEPREFIX` для отличия пакетов, использующих разные версии Python. Пример: `py24-`
+|Используется как `PKGNAMEPREFIX` для различения пакетов разных версий Python. Пример: `py27-`
|`PYTHON_SITELIBDIR`
-|Местонахождение дерева site-packages, которое содержит путь установки Python (обычно, `LOCALBASE`). Переменная `PYTHON_SITELIBDIR` может быть очень полезной при установке модулей Python.
+|Расположение дерева site-packages, которое содержит путь установки Python (обычно `LOCALBASE`). `PYTHON_SITELIBDIR` может быть очень полезно при установке модулей Python.
|`PYTHONPREFIX_SITELIBDIR`
-|Вариант PYTHON_SITELIBDIR без PREFIX. По возможности всегда используйте `%%PYTHON_SITELIBDIR%%` в [.filename]#pkg-plist#. Значением по умолчанию для `%%PYTHON_SITELIBDIR%%` является `lib/python%%PYTHON_VERSION%%/site-packages`.
+|Вариант PREFIX-clean для PYTHON_SITELIBDIR. Всегда используйте `%%PYTHON_SITELIBDIR%%` в [.filename]#pkg-plist#, когда это возможно. Значение по умолчанию для `%%PYTHON_SITELIBDIR%%` — `lib/python%%PYTHON_VERSION%%/site-packages`
|`PYTHON_CMD`
-|Командная строка интерпретатора Python, включая номер версии.
+|Интерпретатор командной строки Python, включая номер версии.
+|===
+[[using-python-variables-helpers]]
+.Помощники зависимостей модуля Python
+[cols="1,1", frame="none"]
+|===
|`PYNUMERIC`
-|Строка зависимости для расширения numeric.
+|Строка зависимости для числового расширения.
|`PYNUMPY`
-|Строка зависимости для нового расширения numeric, numpy (PYNUMERIC объявлен устаревшим вышестоящим производителем).
+|Строка зависимости для нового числового расширения, numpy. (PYNUMERIC устарел у вендора).
|`PYXML`
-|Строка зависимости для расширения XML (не нужно для Python 2.0 и выше, т.к. включено в основной дистрибутив).
-|===
+|Строка зависимости для расширения XML (не требуется для Python 2.0 и выше, так как оно также входит в базовую поставку).
-Полный перечень доступных переменных можно найти в [.filename]#/usr/ports/Mk/bsd.python.mk#.
+|`PY_ENUM34`
+|Условная зависимость от пакета package:devel/py-enum34[] в зависимости от версии Python.
-Некоторые приложения на Python заявляют о поддержке `DESTDIR` (требуется для staging), которая не работает (в частности, у Mailman до версии 2.1.16). Ограничение можно обойти путём перекомпиляции сценариев. Например, это можно выполнить в цели `post-build`. С учётом того, что после установки предполагаемое место размещения сценариев Python будет находиться в `PYTHONPREFIX_SITELIBDIR`, можно применить следующее решение:
+|`PY_ENUM_COMPAT`
+|Условная зависимость от пакета package:devel/py-enum-compat[] в зависимости от версии Python.
-[.programlisting]
-....
-(cd ${STAGEDIR}${PREFIX} \
- && ${PYTHON_CMD} ${PYTHON_LIBDIR}/compileall.py \
- -d ${PREFIX} -f ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;})
-....
+|`PY_PATHLIB`
+|Условная зависимость от пакета package:devel/py-pathlib[] в зависимости от версии Python.
-Эта команда перекомпилирует исходный текст с заменой путей на относительные к каталогу сборки, а также дописывает значение `PREFIX` перед именем файла, записанного в выходном файле с промежуточным представлением, с использованием `-d`. `-f` требуется для безусловной перекомпиляции, `:S;${PREFIX}/;;` удаляет префиксы из значения переменной `PYTHONPREFIX_SITELIBDIR`, чтобы сделать его относительным к `PREFIX`.
+|`PY_IPADDRESS`
+|Условная зависимость от пакета package:net/py-ipaddress[] в зависимости от версии Python.
-Для этого требуется Python 2.7 или выше. Это не работает с Python 2.6.
-
-[[using-tcl]]
-== Использование Tcl/Tk
-
-В Коллекции Портов поддерживается одновременная установка множественных версий Tcl/Tk. Порты должны пытаться поддерживать по крайней мере версию Tcl/Tk, используемую по умолчанию, и выше с помощью переменных `USE_TCL` и `USE_TK`. Желаемую версию `tcl` можно указать в переменной `WITH_TCL_VER`.
-
-.Наиболее востребованные переменные для портов, которые используют Tcl/Tk
-[cols="1,1", frame="none"]
+|`PY_FUTURES`
+|Условная зависимость от пакета package:devel/py-futures[] в зависимости от версии Python.
|===
-|`USE_TCL`
-|Порт зависит от библиотеки Tcl (не оболочки). Минимальную требуемую версию можно указать с использованием таких значений, как 84+. Отдельные неподдерживаемые версии указываются в переменной `INVALID_TCL_VER`.
-|`USE_TCL_BUILD`
-|Tcl нужен для порта только на время сборки.
+Полный список доступных переменных можно найти в [.filename]#/usr/ports/Mk/Uses/python.mk#.
-|`USE_TCL_WRAPPER`
-|Эту новую переменную следует использовать для портов, для которых требуется оболочка Tcl и не требуется конкретная версия `tclsh`. Обертка `tclsh` устанавливается в систему. Пользователь может указать желаемую оболочку `tcl` для использования.
+[IMPORTANT]
+====
+Все зависимости для портов Python, использующих crossref:flavors[flavors-auto-python,флейворы Python] (с `USE_PYTHON=distutils` или `USE_PYTHON=flavors`), должны иметь флейвор Python, добавленную к их origin с помощью `@${PY_FLAVOR}`. См. crossref:special[python-Makefile,Makefile для простого модуля Python].
+====
-|`WITH_TCL_VER`
-|Определяемые пользователем переменные, которые устанавливают желаемую версию Tcl.
+[[python-Makefile]]
+.Makefile для Простого Модуля Python
+[example]
+====
+[.programlisting]
+....
+PORTNAME= sample
+DISTVERSION= 1.2.3
+CATEGORIES= devel
-|`UNIQUENAME_WITH_TCL_VER`
-|Подобно `WITH_TCL_VER`, но для каждого порта.
+MAINTAINER= fred.bloggs@example.com
+COMMENT= Python sample module
+WWW= https://example.com/project/sample/
-|`USE_TCL_THREADS`
-|Требует многопоточную сборку Tcl/Tk.
+RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}six>0:devel/py-six@${PY_FLAVOR}
-|`USE_TK`
-|Порт зависит от библиотеки Tk (не от предпочитаемой оболочки). Подразумевает `USE_TCL` с тем же значением. Для большей информации смотрите описание переменной `USE_TCL`.
+USES= python
+USE_PYTHON= autoplist distutils
-|`USE_TK_BUILD`
-|Аналогично `USE_TCL_BUILD`.
+.include <bsd.port.mk>
+....
-|`USE_TK_WRAPPER`
-|Аналогично `USE_TCL_WRAPPER`.
+====
-|`WITH_TK_VER`
-|Аналогично `WITH_TCL_VER`, подразумевает `WITH_TCL_VER` той же версии.
-|===
+Некоторые приложения на Python заявляют о поддержке `DESTDIR` (что необходимо для промежуточной сборки), но она не работает (например, Mailman до версии 2.1.16). Это можно обойти, перекомпилировав скрипты. Это можно сделать, например, в цели `post-build`. Предполагая, что Python-скрипты должны находиться в `PYTHONPREFIX_SITELIBDIR` после установки, можно применить следующее решение:
-Полный перечень доступных переменных находится в [.filename]#/usr/ports/Mk/bsd.tcl.mk#.
+[.programlisting]
+....
+(cd ${STAGEDIR}${PREFIX} \
+ && ${PYTHON_CMD} ${PYTHON_LIBDIR}/compileall.py \
+ -d ${PREFIX} -f ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;})
+....
-[[using-emacs]]
-== Использование Emacs
+Это перекомпилирует исходники с путём, относительным к stage-директории, и добавляет значение `PREFIX` к имени файла, записанному в байт-компилированном выходном файле с помощью `-d`. `-f` требуется для принудительной перекомпиляции, а `:S;${PREFIX}/;;` удаляет префиксы из значения `PYTHONPREFIX_SITELIBDIR`, чтобы сделать его относительным к `PREFIX`.
-Этот раздел ещё предстоит написать.
+[[using-tcl]]
+== Использование Tcl/Tk
-[[using-ruby]]
-== Использование Ruby
+Коллекция Ports поддерживает параллельную установку нескольких версий Tcl/Tk. Порты должны стараться поддерживать как минимум версию Tcl/Tk по умолчанию и выше с помощью `USES=tcl`. Можно указать желаемую версию `tcl`, добавив `:_xx_`, например, `USES=tcl:85`.
-.Полезные переменные для портов, использующих Ruby
-[cols="1,1", frame="none", options="header"]
+[[using-tcl-variables]]
+.Самые полезные переменные только для чтения для портов, использующих Tcl/Tk
+[cols="1,1", frame="none"]
|===
-| Переменная
-| Описание
-
-|`USE_RUBY`
-|Порт требует Ruby.
+|`TCL_VER`
+| выбранная версия Tcl major.minor
-|`USE_RUBY_EXTCONF`
-|Порт использует для конфигурации [.filename]#extconf.rb#.
+|`TCLSH`
+| полный путь к интерпретатору Tcl
-|`USE_RUBY_SETUP`
-|Порт использует для конфигурации [.filename]#setup.rb#.
+|`TCL_LIBDIR`
+| путь к библиотекам Tcl
-|`RUBY_SETUP`
-|Устанавливает альтернативное имя для [.filename]#setup.rb#. Распространенным значением является [.filename]#install.rb#.
-|===
+|`TCL_INCLUDEDIR`
+| путь к заголовочным файлам Tcl C
-Следующая таблица отражает некоторые переменные, доступные авторам портов через инфраструктуру портов. Эти переменные должны использоваться для установки файлов в правильное месторасположение. Используйте их в [.filename]#pkg-plist# как можно больше. Эти переменные не должны переопределяться в самом порте.
+|`TCL_PKG_LIB_PREFIX`
+| Префикс библиотеки, согласно TIP595
-.Отобранные переменные только для чтения для портов, использующих Ruby
-[cols="1,1,1", frame="none", options="header"]
-|===
-| Переменная
-| Описание
-| Примерное значение
+|`TCL_PKG_STUB_POSTFIX`
+|Заглушка библиотеки postfix
-|`RUBY_PKGNAMEPREFIX`
-|Используется как `PKGNAMEPREFIX` для различия пакетов от разных версий Ruby.
-|`ruby18-`
+|`TK_VER`
+| выбранная версия Tk major.minor
-|`RUBY_VERSION`
-|Полная версия Ruby в форме `x.y.z`.
-|`1.8.2`
+|`WISH`
+| полный путь к интерпретатору Tk
-|`RUBY_SITELIBDIR`
-|Путь для установки архитектуронезависимых библиотек.
-|`/usr/local/lib/ruby/site_ruby/1.8`
+|`TK_LIBDIR`
+| путь к библиотекам Tk
-|`RUBY_SITEARCHLIBDIR`
-|Путь для установки архитектурозависимых библиотек.
-|`/usr/local/lib/ruby/site_ruby/1.8/amd64-freebsd6`
-
-|`RUBY_MODDOCDIR`
-|Путь для установки документации модуля.
-|`/usr/local/shared/doc/ruby18/patsy`
-
-|`RUBY_MODEXAMPLESDIR`
-|Путь для установки примеров модуля.
-|`/usr/local/shared/examples/ruby18/patsy`
+|`TK_INCLUDEDIR`
+| путь к заголовочным файлам Tk C
|===
-Полный перечень доступных переменных находится в [.filename]#/usr/ports/Mk/bsd.ruby.mk#.
+См. crossref:uses[uses-tcl,`USES=tcl`] и crossref:uses[uses-tk,`USES=tk`] в crossref:uses[uses,Использование макросов `USES`] для полного описания этих переменных. Полный список этих переменных доступен в [.filename]#/usr/ports/Mk/Uses/tcl.mk#.
[[using-sdl]]
== Использование SDL
-Переменная `USE_SDL` используется для автоматической настройки зависимостей для портов, использующих библиотеки на основе SDL, такие как package:devel/sdl12[] или package:graphics/sdl_image[].
+`USE_SDL` используется для автоматической настройки зависимостей для портов, которые используют библиотеку на основе SDL, такие как package:devel/sdl12[] и package:graphics/sdl_image[].
-Для версии 1.2 на данный момент распознаются следующие SDL-библиотеки:
+Эти библиотеки SDL для версии 1.2 распознаются:
* sdl: package:devel/sdl12[]
* console: package:devel/sdl_console[]
@@ -1482,7 +3471,7 @@ PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
* sound: package:audio/sdl_sound[]
* ttf: package:graphics/sdl_ttf[]
-Для версии 2.0 на данный момент распознаются следующие SDL-библиотеки:
+Эти библиотеки SDL для версии 2.0 распознаются:
* sdl: package:devel/sdl20[]
* gfx: package:graphics/sdl2_gfx[]
@@ -1491,61 +3480,47 @@ PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX}
* net: package:net/sdl2_net[]
* ttf: package:graphics/sdl2_ttf[]
-Таким образом, если порт имеет зависимость от package:net/sdl_net[] и package:audio/sdl_mixer[], то строка будет следующей:
+Следовательно, если порт зависит от package:net/sdl_net[] и package:audio/sdl_mixer[], синтаксис будет следующим:
[.programlisting]
....
USE_SDL= net mixer
....
-Зависимость от порта package:devel/sdl12[], который требуется для package:net/sdl_net[] и package:audio/sdl_mixer[], будет также автоматически добавлен.
-
-Если вы используете `USE_SDL` с элементами SDL 1.2, то он автоматически:
-
-* Добавляет зависимость от sdl12-config к `BUILD_DEPENDS`
-* Добавляет переменную `SDL_CONFIG` к `CONFIGURE_ENV`
-* Добавляет зависимости от указанных библиотек к `LIB_DEPENDS`
-
-Если вы используете `USE_SDL` с элементами SDL 2.0, то он автоматически:
+Пакет зависимости package:devel/sdl12[], который требуется для package:net/sdl_net[] и package:audio/sdl_mixer[], также автоматически добавляется.
-* Добавляет зависимость от sdl2-config к `BUILD_DEPENDS`
-* Добавляет переменную `SDL2_CONFIG` к `CONFIGURE_ENV`
-* Добавляет зависимости от указанных библиотек к `LIB_DEPENDS`
+Использование `USE_SDL` с указанием SDL 1.2 автоматически:
-Для проверки наличия библиотеки SDL вы можете делать это при помощи переменной `WANT_SDL`:
+* Добавить зависимость от sdl12-config в `BUILD_DEPENDS`
+* Добавьте переменную `SDL_CONFIG` в `CONFIGURE_ENV`
+* Добавьте зависимости выбранных библиотек в `LIB_DEPENDS`
-[.programlisting]
-....
-WANT_SDL= yes
-
-.include <bsd.port.pre.mk>
+Используя `USE_SDL` с записями для SDL 2.0, это автоматически:
-.if ${HAVE_SDL:Mmixer}!=""
-USE_SDL+= mixer
-.endif
+* Добавить зависимость от sdl2-config в `BUILD_DEPENDS`
+* Добавьте переменную `SDL2_CONFIG` в `CONFIGURE_ENV`
+* Добавьте зависимости выбранных библиотек в `LIB_DEPENDS`
-.include <bsd.port.post.mk>
-....
[[using-wx]]
== Использование wxWidgets
-Эта глава описывает статус библиотек wxWidgets в дереве портов и их интеграцию с системой портов.
+Этот раздел описывает состояние библиотек wxWidgets в дереве портов и их интеграцию с системой портов.
[[wx-introduction]]
=== Введение
-Существует множество версий библиотек wxWidgets, конфликтующих между собой (устанавливают файлы под тем же именем). В дереве портов эта проблема решена путем установки каждой версии под собственным названием с использованием номера версии в качестве суффикса.
+Существует множество версий библиотек wxWidgets, которые конфликтуют между собой (устанавливают файлы с одинаковыми именами). В дереве портов эта проблема решена путем установки каждой версии под разными именами с использованием суффиксов номеров версий.
-Очевидным недостатком этого является необходимость изменения каждого приложения для нахождения искомой версии. К счастью, большинство приложений для определения нужного компилятора и флагов компоновки вызывают сценарий `wx-config`. Для каждой доступной версии этот сценарий имеет своё имя. Большинство приложений учитывают переменную окружения или принимают аргумент configure для указания, какой сценарий `wx-config` следует вызывать. На все остальные приходится накладывать патч.
+Очевидный недостаток этого подхода заключается в том, что каждое приложение необходимо модифицировать для поиска нужной версии. К счастью, большинство приложений вызывают скрипт `wx-config` для определения необходимых флагов компилятора и компоновщика. Имя этого скрипта отличается для каждой доступной версии. Большинство приложений учитывают переменную окружения или принимают аргумент configure, чтобы указать, какой скрипт `wx-config` вызывать. В противном случае их необходимо патчить.
[[wx-version]]
=== Выбор версии
-Для того, чтобы заставить ваш порт использовать конкретную версию wxWidgets, существует две доступные для определения переменные (если определена только одна, то вторая примет значение по умолчанию):
+Чтобы порт использовал определённую версию wxWidgets, доступны две переменные для определения (если задана только одна, другая будет установлена в значение по умолчанию):
[[wx-ver-sel-table]]
-.Переменные для выбора версии wxWidgets
+.Переменные для выбора версий wxWidgets
[cols="1,1,1", frame="none", options="header"]
|===
| Переменная
@@ -1553,65 +3528,59 @@ USE_SDL+= mixer
| Значение по умолчанию
|`USE_WX`
-|Перечень версий, которые порт может использовать
+|Список версий, которые порт может использовать
|Все доступные версии
|`USE_WX_NOT`
-|Перечень версий, которые порт не может использовать
-|Нет
+|Список версий, которые порт не может использовать
+|Ничего
|===
-Перечень доступных версий wxWidgets и соответствующих им портов в дереве:
+Доступные версии wxWidgets и соответствующие порты в дереве:
+[[wx-widgets-versions-table]]
.Доступные версии wxWidgets
[cols="1,1", frame="none", options="header"]
|===
| Версия
| Порт
-|`2.4`
-|package:x11-toolkits/wxgtk24[]
-
-|`2.6`
-|package:x11-toolkits/wxgtk26[]
-
|`2.8`
|package:x11-toolkits/wxgtk28[]
-|===
-[NOTE]
-====
-Версии начиная с `2.5` также поставляются с Unicode и устанавливается подчиненным портом с названием как как у обычного, но с суффиксом `-unicode`, но этим можно управлять при помощи переменных (смотрите <<wx-unicode>>).
-====
+|`3.0`
+|package:x11-toolkits/wxgtk30[]
+|===
-Переменные в <<wx-ver-sel-table>> можно установить в одну или более следующих комбинаций, разделенных пробелами:
+Переменные в crossref:special[wx-ver-sel-table,Переменные для выбора версий wxWidgets] могут быть установлены в одну или несколько комбинаций, разделенных пробелами:
-.Определение версии для wxWidgets
+[[wx-widgets-versions-specification]]
+.Спецификации версий wxWidgets
[cols="1,1", frame="none", options="header"]
|===
| Описание
| Пример
-|Единичная версия
-|`2.4`
+|Единственная версия
+|`2.8`
-|Восходящий диапазон
-|`2.4+`
+|Возрастающий диапазон
+|`2.8+`
|Нисходящий диапазон
-|`2.6-`
+|`3.0-`
-|Полный диапазон (обязан быть восходящим)
-|`2.4-2.6`
+|Полный диапазон (должен быть возрастающим)
+|`2.8-3.0`
|===
-Кроме того, существует несколько переменных для выбора предпочитаемых версий из перечня доступных. Они могут быть установлены в несколько версий, первая из которых будет иметь наибольший приоритет.
-
-.Переменные для выбора предпочитаемых версий wxWidgets
+Существуют также переменные для выбора предпочтительных версий из доступных. Их можно установить в виде списка версий, где первые будут иметь более высокий приоритет.
+[[wx-widgets-preferred-version]]
+.Переменные для выбора предпочтительных версий wxWidgets
[cols="1,1", frame="none", options="header"]
|===
-| Название
-| Предназначение
+| Имя
+| Предназначен для
|`WANT_WX_VER`
|порт
@@ -1623,58 +3592,52 @@ USE_SDL+= mixer
[[wx-components]]
=== Выбор компонентов
-Существуют другие приложения, которые, хотя и не являются библиотеками wxWidgets, но в тоже время относятся к ним. Эти приложения можно указать в переменной `WX_COMPS`. Доступны следующие компоненты:
+Существуют другие приложения, которые, не являясь библиотеками wxWidgets, связаны с ними. Эти приложения можно указать в `WX_COMPS`. Доступны следующие компоненты:
+[[wx-widgets-components-table]]
.Доступные компоненты wxWidgets
[cols="1,1,1", frame="none", options="header"]
|===
-| Название
+| Имя
| Описание
| Ограничение версии
|`wx`
|основная библиотека
-|нет
+|none
|`contrib`
|сторонние библиотеки
-|`нет`
+|`none`
|`python`
-|wxPython (привязки к Python)
-|`2.4-2.6`
-
-|`mozilla`
-|wxMozilla
-|`2.4`
-
-|`svg`
-|wxSVG
-|`2.6`
+|wxPython (интерфейс Python)
+|`2.8-3.0`
|===
-Тип добавляемой зависимости при выборе каждого компонента может быть указан вручную путем добавления суффикса, отделенного точкой с запятой. Если таковой отсутствует, но будет использовано значение по умолчанию (смотрите <<wx-def-dep-types>>). Доступные типы зависимости:
+Тип зависимости может быть выбран для каждого компонента путем добавления суффикса, разделенного точкой с запятой. Если он отсутствует, будет использоваться тип по умолчанию (см. crossref:special[wx-def-dep-types,Типы зависимостей wxWidgets по умолчанию]). Доступны следующие типы:
-.Доступные типы зависимости wxWidgets
+[[wx-widgets-dependency-table]]
+.Доступные типы зависимостей wxWidgets
[cols="1,1", frame="none", options="header"]
|===
-| Название
+| Имя
| Описание
|`build`
-|Компонент требуется для построения, эквивалентен `BUILD_DEPENDS`
+|Компонент необходим для сборки, эквивалентен `BUILD_DEPENDS`
|`run`
-|Компонент требуется для запуска, эквивалентен `RUN_DEPENDS`
+|Компонент необходим для запуска, эквивалентно `RUN_DEPENDS`
|`lib`
-|Компонент требуется для построения и запуска, эквивалентен `LIB_DEPENDS`
+|Компонент необходим для сборки и запуска, эквивалентен `LIB_DEPENDS`
|===
-Значения по умолчанию для компонентов подробно рассматриваются в следующей таблице:
+Значения по умолчанию для компонентов подробно описаны в этой таблице:
[[wx-def-dep-types]]
-.Типы зависимости wxWidgets, используемые по умолчанию
+.Типы зависимостей wxWidgets по умолчанию
[cols="1,1", frame="none", options="header"]
|===
| Компонент
@@ -1700,61 +3663,26 @@ USE_SDL+= mixer
.Выбор компонентов wxWidgets
[example]
====
-Следующий фрагмент относится к порту, в котором используется wxWidgets версии `2.4` с его сторонними библиотеками.
+Этот фрагмент соответствует порту, который использует wxWidgets версии `2.4` и дополнительные библиотеки.
[.programlisting]
....
-USE_WX= 2.4
+USE_WX= 2.8
WX_COMPS= wx contrib
....
====
-[[wx-unicode]]
-=== Unicode
-
-Библиотека wxWidgets поддерживает Unicode начиная с версии `2.5`. В дереве портов доступны обе версии и могут быть выбраны с использованием следующих переменных:
-[[wx-unicode-var-table]]
-.Переменные для выбора версии wxWidgets с Unicode
-[cols="1,1,1", frame="none", options="header"]
-|===
-| Переменная
-| Описание
-| Предназначение
-
-|`WX_UNICODE`
-|Порт работает _только_ с версией Unicode
-|порт
-
-|`WANT_UNICODE`
-|Порт работает с обеими версиями, но предпочитает версию с Unicode
-|порт
-
-|`WITH_UNICODE`
-|Порт будет использовать версию Unicode
-|пользователь
-
-|`WITHOUT_UNICODE`
-|Порт будет использовать обычную версию, если это поддерживается (когда `WX_UNICODE` не определена)
-|пользователь
-|===
-
-[WARNING]
-====
-
-Не используйте `WX_UNICODE` для портов, которые могут использовать обе версии. Если вы хотите, чтобы порт по умолчанию использовал Unicode, определите вместо этого `WANT_UNICODE`.
-====
-
[[wx-version-detection]]
=== Обнаружение установленных версий
-Для обнаружения установленной версии вам необходимо задать переменную `WANT_WX`. Если вы не присвоите ей определенную версию, то компоненты получат суффикс версии. Переменная `HAVE_WX` будет заполнена после обнаружения.
+Для определения установленной версии определите `WANT_WX`. Если значение не задано для конкретной версии, компоненты будут иметь суффикс версии. `HAVE_WX` будет заполнен после обнаружения.
[[wx-ver-det-example]]
.Обнаружение установленных версий и компонентов wxWidgets
[example]
====
-Следующий фрагмент может быть использован в порту, который использует wxWidgets, в случае если он установлен или выбран соответствующий параметр.
+Этот фрагмент может использоваться в порте, который использует wxWidgets, если они установлены или выбран соответствующий параметр.
[.programlisting]
....
@@ -1762,19 +3690,19 @@ WANT_WX= yes
.include <bsd.port.pre.mk>
-.if defined(WITH_WX) || !empty(PORT_OPTIONS:MWX) || !empty(HAVE_WX:Mwx-2.4)
-USE_WX= 2.4
+.if defined(WITH_WX) || !empty(PORT_OPTIONS:MWX) || !empty(HAVE_WX:Mwx-2.8)
+USE_WX= 2.8
CONFIGURE_ARGS+= --enable-wx
.endif
....
-Следующий фрагмент может быть использован в порту, который задействует поддержку wxPython, в случае если он установлен или выбран соответствующий параметр, в дополнение к wxWidgets, обе версии `2.6`.
+Этот фрагмент может использоваться в порте, который включает поддержку wxPython, если она установлена или выбрана соответствующая опция, в дополнение к wxWidgets, обе версии `2.8`.
[.programlisting]
....
-USE_WX= 2.6
+USE_WX= 2.8
WX_COMPS= wx
-WANT_WX= 2.6
+WANT_WX= 2.8
.include <bsd.port.pre.mk>
@@ -1787,48 +3715,46 @@ CONFIGURE_ARGS+= --enable-wxpython
====
[[wx-defined-variables]]
-=== Переменные для определения
+=== Переменные, определенные в фреймворке
-Следующие переменные доступны в порту (после определения одной из переменных из <<wx-ver-sel-table>>).
+Эти переменные доступны в порте (после определения одной из crossref:special[wx-ver-sel-table,переменных для выбора версий wxWidgets]).
+[[wx-widgets-variables]]
.Переменные, определенные для портов, использующих wxWidgets
[cols="1,1", frame="none", options="header"]
|===
-| Название
+| Имя
| Описание
|`WX_CONFIG`
-|Путь к сценарию wxWidgets `wx-config` (с другим именем)
+|Путь к скрипту `wx-config` wxWidgets (с другим именем)
|`WXRC_CMD`
-|Путь к программе wxWidgets `wxrc` (с другим именем)
+|Путь к программе `wxrc` wxWidgets (с другим именем)
|`WX_VERSION`
|Версия wxWidgets, которая будет использоваться (например, `2.6`)
-
-|`WX_UNICODE`
-|Если не определена, но Unicode будет использоваться, то она будет определена
|===
[[wx-premk]]
=== Обработка в [.filename]#bsd.port.pre.mk#
-Если вам нужно использовать переменные для запуска команд сразу после подключения [.filename]#bsd.port.pre.mk#, то вам нужно определить `WX_PREMK`.
+Определите `WX_PREMK`, чтобы иметь возможность использовать переменные сразу после включения [.filename]#bsd.port.pre.mk#.
[IMPORTANT]
====
-Если вы определите `WX_PREMK`, то версия, зависимости, компоненты и заданные переменные не изменяться, в случае вы изменили переменные порта wxWidgets после подключения [.filename]#bsd.port.pre.mk#.
+При определении `WX_PREMK` версия, зависимости, компоненты и определенные переменные не изменятся при модификации переменных порта wxWidgets _после_ включения [.filename]#bsd.port.pre.mk#.
====
[[wx-premk-example]]
.Использование переменных wxWidgets в командах
[example]
====
-Следующий фрагмент иллюстрирует использование переменной `WX_PREMK` посредством запуска сценария `wx-config` для получения строки с полной версией с присвоением ее переменной и передачей в программу.
+Этот фрагмент иллюстрирует использование `WX_PREMK` путем запуска скрипта `wx-config` для получения полной строки версии, присвоения её переменной и передачи в программу.
[.programlisting]
....
-USE_WX= 2.4
+USE_WX= 2.8
WX_PREMK= yes
.include <bsd.port.pre.mk>
@@ -1844,15 +3770,16 @@ PLIST_SUB+= VERSION="${VER_STR}"
[NOTE]
====
-Переменные wxWidgets можно безопасно использовать в командах внутри целей без необходимости в использовании `WX_PREMK`.
+Переменные wxWidgets можно безопасно использовать в командах внутри целей без необходимости в `WX_PREMK`.
====
[[wx-additional-config-args]]
=== Дополнительные параметры `configure`
-Некоторые сценарии GNU `configure` не могут найти wxWidgets только с установленной переменной окружения `WX_CONFIG`, требуя дополнительные параметры. Для их передачи можно использовать переменную `WX_CONF_ARGS`.
+Некоторые скрипты GNU `configure` не могут найти wxWidgets, если задана только переменная окружения `WX_CONFIG`, и требуют дополнительные параметры. `WX_CONF_ARGS` можно использовать для их указания.
-.Допустимые значения `WX_CONF_ARGS`
+[[wx-conf-args-values]]
+.Допустимые значения для `WX_CONF_ARGS`
[cols="1,1", frame="none", options="header"]
|===
| Возможное значение
@@ -1868,374 +3795,465 @@ PLIST_SUB+= VERSION="${VER_STR}"
[[using-lua]]
== Использование Lua
-Эта глава описывает статус библиотек Lua в дереве портов и их интеграцию в систему портов.
+Этот раздел описывает состояние библиотек Lua в дереве портов и их интеграцию с системой портов.
[[lua-introduction]]
=== Введение
-Существует множество версий библиотек Lua и соответствующих интерпретаторов, конфликтующих между собой (устанавливают файлы под тем же именем). В дереве портов эта проблема решена путем установки каждой версии в собственное место с использованием номера версии в качестве суффикса.
+Существует множество версий библиотек Lua и соответствующих интерпретаторов, которые конфликтуют между собой (устанавливают файлы с одинаковыми именами). В дереве портов эта проблема решена установкой каждой версии под разными именами с использованием суффиксов номеров версий.
+
+Очевидный недостаток этого заключается в том, что каждое приложение необходимо модифицировать для поиска ожидаемой версии. Однако это можно решить, добавив дополнительные флаги компилятору и компоновщику.
-Очевидным недостатком этого является необходимость изменения каждого приложения для нахождения искомой версии. Но это решается добавлением некоторых дополнительных флагов для компилятора и компоновщика.
+Приложения, использующие Lua, обычно должны собираться только для одной версии. Однако загружаемые модули для Lua собираются в отдельных флейворах для каждой поддерживаемой версии Lua, и зависимости от таких модулей должны указывать флейвор с использованием суффикса `@${LUA_FLAVOR}` в расположении (origin) порта.
[[lua-version]]
=== Выбор версии
-Для того, чтобы заставить ваш порт использовать конкретную версию Lua, существует две доступные для определения переменные (если определена только одна, то вторая примет значение по умолчанию):
+Порт, использующий Lua, должен содержать строку следующего вида:
-[[lua-ver-sel-table]]
-.Переменные для выбора версии Lua
-[cols="1,1,1", frame="none", options="header"]
-|===
-| Переменная
-| Описание
-| Значение по умолчанию
+[.programlisting]
+....
+USES= lua
+....
-|`USE_LUA`
-|Перечень версий, которые порт может использовать
-|Все доступные версии
+Если требуется определённая версия Lua или диапазон версий, его можно указать в виде параметра `XY` (который можно использовать несколько раз), `XY+`, `-XY` или `XY-ZA`. Версия Lua, установленная через `DEFAULT_VERSIONS`, будет использована, если она попадает в запрошенный диапазон, в противном случае будет использована ближайшая к умолчанию запрошенная версия. Например:
-|`USE_LUA_NOT`
-|Перечень версий, которые порт не может использовать
-|Пусто
-|===
+[.programlisting]
+....
+USES= lua:52-53
+....
-Перечень доступных версий Lua и соответствующих портов в дереве:
+Обратите внимание, что не предпринимается попытка изменить выбор версии на основе наличия любой уже установленной версии Lua.
-.Доступные версии Lua
-[cols="1,1", frame="none", options="header"]
-|===
-| Версия
-| Порт
+[NOTE]
+====
+Форма указания версии `XY+` не должна использоваться без тщательного обдумывания; Lua API в некоторой степени меняется с каждой версией, и инструменты конфигурации, такие как CMake или Autoconf, скорее всего не будут работать с будущими версиями Lua, пока не будут обновлены для этого.
+====
-|`4.0`
-|package:lang/lua4[]
+[[lua-version-config]]
+=== Конфигурация и флаги компилятора
-|`5.0`
-|package:lang/lua50[]
+Программное обеспечение, использующее Lua, может быть написано с автоматическим определением версии Lua в использовании. В общем случае порты должны переопределять это предположение и принудительно использовать конкретную выбранную версию Lua, как описано выше. В зависимости от портируемого программного обеспечения, это может потребовать любого или всех из следующих действий:
-|`5.1`
-|package:lang/lua[]
-|===
+* Использование `LUA_VER` в качестве части параметра для скрипта конфигурации программного обеспечения через `CONFIGURE_ARGS` или `CONFIGURE_ENV` (или эквивалентные для других систем сборки);
+* Добавление `-I${LUA_INCDIR}`, `-L${LUA_LIBDIR}` и `-llua-${LUA_VER}` в `CFLAGS`, `LDFLAGS` и `LIBS` соответственно, где это необходимо;
+* Исправьте конфигурационные или файлы сборки программного обеспечения, чтобы выбрать правильную версию.
+
+
+[[lua-version-flavors]]
+=== Флейворы версии
+
+Порт, который устанавливает модуль Lua (а не приложение, просто использующее Lua), должен собирать отдельный флейвор для каждой поддерживаемой версии Lua. Это делается путем добавления параметра `module`:
+
+[.programlisting]
+....
+USES= lua:module
+....
+
+Так же может быть указае номер версии или диапазон версий. Используйте запятую для разделения параметров.
+
+Поскольку каждый флейвор должен иметь уникальное имя пакета, предоставляется переменная `LUA_PKGNAMEPREFIX`, которая будет установлена в соответствующее значение; предполагаемое использование:
+
+[.programlisting]
+....
+PKGNAMEPREFIX= ${LUA_PKGNAMEPREFIX}
+....
+
+Модульные порты обычно должны устанавливать файлы только в `LUA_MODLIBDIR`, `LUA_MODSHAREDIR`, `LUA_DOCSDIR` и `LUA_EXAMPLESDIR`, все из которых настроены на ссылки в версионно-зависимые подкаталоги. Установка любых других файлов должна выполняться с осторожностью, чтобы избежать конфликтов между версиями.
+
+Порт (кроме модуля Lua), который хочет собрать отдельный пакет для каждой версии Lua, должен использовать параметр `flavors`:
+
+[.programlisting]
+....
+USES= lua:flavors
+....
+
+Это работает так же, как параметр `module`, описанный выше, но без предположения, что пакет должен быть задокументирован как модуль Lua (поэтому `LUA_DOCSDIR` и `LUA_EXAMPLESDIR` по умолчанию не определены). Однако порт может определить `LUA_DOCSUBDIR` как подходящее имя подкаталога (обычно `PORTNAME` порта, если это не конфликтует с `PORTNAME` любого модуля), и в этом случае фреймворк определит как `LUA_DOCSDIR`, так и `LUA_EXAMPLESDIR`.
-Переменные из <<lua-ver-sel-table>> могут иметь комбинации из одного или нескольких значений, разделенных пробелом:
+Как и в случае с модульными портами, порт с флейворами должен избегать установки файлов, которые могут конфликтовать между версиями. Обычно это достигается добавлением `LUA_VER_STR` в качестве суффикса к именам программ (например, с использованием crossref:uses[uses-uniquefiles,`uniquefiles`]), а также использованием `LUA_VER` или `LUA_VER_STR` в составе других файлов или поддиректорий, используемых вне `LUA_MODLIBDIR` и `LUA_MODSHAREDIR`.
-.Определение версии Lua
+[[lua-defined-variables]]
+=== Переменные, определенные в фреймворке
+
+В порте доступны эти переменные.
+
+[[using-lua-variables-ports]]
+.Переменные, определенные для портов, использующих Lua
[cols="1,1", frame="none", options="header"]
|===
+| Имя
| Описание
-| Пример
-|Единичная версия
-|`4.0`
+|`LUA_VER`
+|Версия Lua, которая будет использоваться (например, `5.4`)
-|Восходящий диапазон
-|`5.0+`
+|`LUA_VER_STR`
+|Версия Lua без точек (например, `54`)
-|Нисходящий диапазон
-|`5.0-`
+|`LUA_FLAVOR`
+|Имя флейвора, соответствующее выбранной версии Lua, используемое для указания зависимостей
+
+|`LUA_BASE`
+|Префикс, который должен использоваться для поиска Lua (и компонентов), уже установленных
+
+|`LUA_PREFIX`
+|Префикс, куда этим портом будут установлены Lua (и компоненты)
+
+|`LUA_INCDIR`
+|Каталог, в котором установлены заголовочные файлы Lua
+
+|`LUA_LIBDIR`
+|Каталог, в котором установлены библиотеки Lua
-|Полный диапазон (обязан быть восходящим)
-|`5.0-5.1`
+|`LUA_REFMODLIBDIR`
+|Каталог, в котором находятся уже установленные библиотеки модулей Lua ([.filename]#.so#)
+
+|`LUA_REFMODSHAREDIR`
+|Каталог, в котором находятся установленные модули Lua ([.filename]#.lua#)
+
+|`LUA_MODLIBDIR`
+|Каталог, в котором библиотеки модулей Lua ([.filename]#.so#) должны быть установлены данным портом
+
+|`LUA_MODSHAREDIR`
+|Каталог, в котором должны быть установлены модули Lua ([.filename]#.lua#) данным портом
+
+|`LUA_PKGNAMEPREFIX`
+|Префикс имени пакета, используемый модулями Lua
+
+|`LUA_CMD`
+|Название интерпретатора Lua (например, `lua54`)
+
+|`LUAC_CMD`
+|Название компилятора Lua (например, `luac54`)
|===
-Кроме того, существует несколько переменных для выбора предпочитаемых версий из перечня доступных. Они могут быть установлены в несколько версий, первая из которых будет иметь наибольший приоритет.
+Эти дополнительные переменные доступны для портов, которые указали параметр `module`:
-.Переменные для выбора предпочитаемых версий Lua
+[[using-lua-variables-modules]]
+.Переменные, определенные для модулей Lua в портах
[cols="1,1", frame="none", options="header"]
|===
-| Название
-| Предназначение
+| Имя
+| Описание
-|`WANT_LUA_VER`
-|порт
+|`LUA_DOCSDIR`
+|каталог, в который должна быть установлена документация модуля.
-|`WITH_LUA_VER`
-|пользователь
+|`LUA_EXAMPLESDIR`
+|каталог, в который должны быть установлены примеры файлов модуля.
|===
-[[lua-version-example]]
-.Выбор версии Lua
+[[lua-examples]]
+=== Примеры
+
+[[lua-app-Makefile]]
+.`Makefile` для приложения, использующего Lua
[example]
====
-Следующий фрагмент взят из порта, который использует Lua версий `5.0` или `5.1`, по умолчанию `5.0`. Значение может быть переопределено пользователем с использованием переменной `WITH_LUA_VER`.
+Этот пример показывает, как сослаться на модуль Lua, требуемый во время выполнения. Обратите внимание, что ссылка должна указывать флейвор.
[.programlisting]
....
-USE_LUA= 5.0-5.1
-WANT_LUA_VER= 5.0
+PORTNAME= sample
+DISTVERSION= 1.2.3
+CATEGORIES= whatever
+
+MAINTAINER= fred.bloggs@example.com
+COMMENT= Sample
+WWW= https://example.com/lua_sample/sample/
+
+RUN_DEPENDS= ${LUA_REFMODLIBDIR}/lpeg.so:devel/lua-lpeg@${LUA_FLAVOR}
+
+USES= lua
+
+.include <bsd.port.mk>
....
====
-[[lua-components]]
-=== Выбор компонентов
-
-Существуют другие приложения, которые хотя и не являются библиотеками Lua, но относятся к ним. Эти приложения можно указать в переменной `LUA_COMPS`. Доступны следующие компоненты:
+[[lua-mod-Makefile]]
+.`Makefile` для простого модуля Lua
+[example]
+====
+[.programlisting]
+....
+PORTNAME= sample
+DISTVERSION= 1.2.3
+CATEGORIES= whatever
+PKGNAMEPREFIX= ${LUA_PKGNAMEPREFIX}
-.Доступные компоненты Lua
-[cols="1,1,1", frame="none", options="header"]
-|===
-| Название
-| Описание
-| Ограничение версии
+MAINTAINER= fred.bloggs@example.com
+COMMENT= Sample
+WWW= https://example.com/lua_sample/sample/
-|`lua`
-|Основная библиотека
-|нет
+USES= lua:module
-|`tolua`
-|Библиотека доступа к коду C/C++
-|4.0-5.0
+DOCSDIR= ${LUA_DOCSDIR}
-|`ruby`
-|Привязка к Ruby
-|4.0-5.0
-|===
+.include <bsd.port.mk>
+....
-[NOTE]
-====
-Есть и другие компоненты, но они относятся к модулям для интерпретатора и не используются приложениями (только другими модулями).
====
-Тип зависимости можно выбрать для каждого компонента через добавление суффикса, отделенного точкой с запятой. В случае отсутствия будет использован тип по умолчанию (смотрите <<lua-def-dep-types>>). Доступные следующие типы:
+[[using-guile]]
+== Использование Guile
-.Доступные типы зависимости Lua
-[cols="1,1", frame="none", options="header"]
-|===
-| Название
-| Описание
+Этот раздел описывает состояние Guile в дереве портов и его интеграцию с системой портов.
-|`build`
-|Компонент требуется для построения, эквивалентен `BUILD_DEPENDS`
+[[guile-introduction]]
+=== Введение
-|`run`
-|Компонент требуется для запуска, эквивалентен `RUN_DEPENDS`
+Существует несколько версий библиотек Guile и соответствующих интерпретаторов, которые конфликтуют между собой (устанавливают файлы с одинаковыми именами). В дереве портов эта проблема решена путем установки каждой версии под разными именами с использованием суффиксов номеров версий. В большинстве случаев приложения должны определять правильную версию из предоставленных конфигурационных переменных и использовать `pkg-config` для определения имени и связанных путей. Однако некоторые приложения (особенно те, которые используют собственные правила конфигурации для `cmake` или `meson`) всегда будут пытаться использовать последнюю доступную версию. В этом случае либо исправьте порт, либо объявите конфликт сборки (см. опцию `conflicts` ниже), чтобы гарантировать создание правильной зависимости при сборке вне poudriere.
-|`lib`
-|Компонент требуется для построения и запуска, эквивалентен `LIB_DEPENDS`
-|===
+Приложения, использующие Guile, обычно должны собираться только для одной версии, предпочтительно указанной в `DEFAULT_VERSIONS`, или, если это невозможно, для последней поддерживаемой версии. Однако библиотеки Guile или Scheme, а также модули расширения для Guile собираются в отдельных флейворах для каждой поддерживаемой версии Guile. Зависимости от таких портов должны указывать флейвор с использованием суффикса `@${GUILE_FLAVOR}` в расположении (origin) порта.
-Значения по умолчанию для компонентов подробно рассматриваются в следующей таблице:
+[[guile-version]]
+=== Выбор версии
-[[lua-def-dep-types]]
-.Типы зависимости Lua, используемые по умолчанию
-[cols="1,1", frame="none", options="header"]
+Порт, использующий Guile, должен определять `USES=guile:__arg,arg...__` с соответствующими параметрами следующим образом:
+
+[[guile-defined-uses-args]]
+.Параметры, определенные для портов, использующих Guile
+[cols="1m,4", frame="none", options="header"]
|===
-| Компонент
-| Тип зависимости
+| Имя
+| Описание
+
+|_X.Y_
+|Объявить совместимость с версией Guile `X.Y`.
+Доступные версии: `1.8` (устарела), `2.2` и `3.0`.
+Можно указать несколько версий.
+
+|flavors
+|Создать флейвор для каждой указанной версии Guile.
+Версия, указанная в `DEFAULT_VERSIONS`, станет флейвором по умолчанию.
+Названия флейворов имеют вид `guileXY`.
-|`lua`
-|`lib` для `4.0-5.0` (динамическая) и `build` для `5.1` (статическая)
+|build
+|Добавить интерпретатор Guile только как зависимость для сборки, а не как зависимость библиотеки.
+`build` и `run` могут быть указаны оба.
-|`tolua`
-|`build` (статическая)
+|run
+|Добавить интерпретатор Guile только как зависимость во время выполнения, а не как зависимость от библиотеки.
+`build` и `run` могут быть указаны оба.
-|`ruby`
-|`lib` (динамическая)
+|alias
+|Добавить значения `BINARY_ALIAS` для интерпретатора и инструментов.
+
+|conflicts
+|Объявить `CONFLICTS_BUILD` для версий Guile новее выбранной.
+Используйте это, когда порт нельзя настроить на использование определённой версии Guile.
|===
-[[lua-components-example]]
-.Выбор компонентов Lua
-[example]
-====
-Следующий фрагмент соответствует порту, использующему Lua версии `4.0` и привязку к Ruby.
+Некоторые дополнительные аргументы доступны для обработки нестандартных случаев; подробности см. в `Mk/Uses/guile.mk`.
-[.programlisting]
-....
-USE_LUA= 4.0
-LUA_COMPS= lua ruby
-....
+Если не указано `build` или `run`, то `LIB_DEPENDS` получает зависимость от библиотеки `libguile`, а также любые дополнительные зависимости, требуемые версией guile, например, `libgc`. Обычно порту не требуются дополнительные зависимости, связанные с использованием Guile.
-====
+[[guile-version-config]]
+=== Флаги конфигурации
-[[lua-version-detection]]
-=== Обнаружение установленных версий
+Программное обеспечение, использующее Guile, должно использовать механизм `pkg-config` для получения флагов компилятора и компоновщика. Некоторые старые или экзотические порты могут использовать `guile-config` или получать значения напрямую из `guile`, что также должно работать (в некоторых из этих случаев может быть полезен аргумент `alias`).
-Для обнаружения установленной версии вам необходимо задать переменную `WANT_LUA`. Если вы не присвоите ей определенную версию, то компоненты получат суффикс версии. Переменная `HAVE_LUA` будет заполнена после обнаружения.
+Фреймворк пытается сообщить порту желаемую версию Guile, используя следующие методы:
-[[lua-ver-det-example]]
-.Обнаружение установленных версий и компонентов Lua
-[example]
-====
-Следующий фрагмент можно использовать для порта, использующего Lua, если она установлена, или был выбран соответствующий параметр.
+* `GUILE_EFFECTIVE_VERSION` добавлен в `CONFIGURE_ENV`;
+* Полный путь к исполняемому файлу Guile указан в переменной `GUILE` в `CONFIGURE_ENV` и `MAKE_ENV`;
+* Если используется опция `alias`, то желаемые версии бинарных файлов Guile являются теми, которые имеют алиасы;
+* Если параметр `alias` не используется, пути к инструментам нужной версии Guile (`guild`, `guile-config` и т.д.) добавляются в `CONFIGURE_ENV` и `MAKE_ENV` в виде переменных `GUILD`, `GUILE_CONFIG` и т.д.
-[.programlisting]
-....
-WANT_LUA= yes
+Для некоторых портов может потребоваться указать версию дополнительными способами, например, через `CONFIGURE_ARGS` или `MESON_ARGS`, в зависимости от порта.
-.include <bsd.port.pre.mk>
+Если ни один из этих методов не приводит к тому, что порт выбирает указанную версию Guile при наличии других версий, то предпочтительно исправить его, чтобы это происходило. Если это невозможно, укажите опцию `conflicts`, чтобы предотвратить сборку порта в условиях, когда он обнаруживает неправильную версию.
-.if defined(WITH_LUA5) || !empty(PORT_OPTIONS:MLUA5) || !empty(HAVE_LUA:Mlua-5.[01])
-USE_LUA= 5.0-5.1
-CONFIGURE_ARGS+= --enable-lua5
-.endif
-....
+[[guile-version-flavors]]
+=== Флейворы версии
+
+Порт, который устанавливает расширение или библиотеку Guile, или библиотеку Scheme, которая предварительно компилируется для Guile, должен собирать отдельный флейвор для каждой поддерживаемой версии Guile. Это делается путем добавления опции `flavors`.
-Следующий фрагмент можно использовать для порта, который включает поддержку tolua, если такой компонент установлен, или был выбран соответствующий параметр в дополнение к Lua, оба имеют версию `4.0`.
+Поскольку каждый флейвор должен иметь уникальное имя пакета, такие порты обычно устанавливают `PKGNAMESUFFIX`, например:
[.programlisting]
....
-USE_LUA= 4.0
-LUA_COMPS= lua
-WANT_LUA= 4.0
+PKGNAMESUFFIX= -${FLAVOR}
+....
-.include <bsd.port.pre.mk>
+Такие порты должны устанавливать файлы Scheme в `GUILE_SITE_DIR`, а не в `GUILE_GLOBAL_SITE_DIR`, даже если файлы не зависят от версии. Это часто требует исправления порта.
-.if defined(WITH_TOLUA) || !empty(PORT_OPTIONS:MTOLUA) || !empty(HAVE_LUA:Mtolua)
-LUA_COMPS+= tolua
-CONFIGURE_ARGS+= --enable-tolua
-.endif
-....
+Кроме того, если такой порт устанавливает файл `.pc`, он должен быть размещён в `GUILE_PKGCONFIG_PATH`, а не в глобальной директории `pkgconfig`. Это позволяет зависимым портам находить правильную конфигурацию для используемой версии Guile.
-====
+Если порт расширения Guile устанавливает файл `.so`, то обычно он должен быть размещён в специфичной для версии Guile директории `extensions`. Обычно не следует использовать `USE_LDCONFIG`.
-[[lua-defined-variables]]
-=== Переменные для определения
+Любые другие файлы, устанавливаемые портом с флейвором, также должны находиться в версионных каталогах или использовать версионные имена файлов. Для документации и примеров переменные `GUILE_DOCS_DIR` и `GUILE_EXAMPLES_DIR` указывают подходящие расположения, в которых порт должен создать подкаталог (см. ниже).
-Следующие переменные доступны в порту (после определения одной из переменных из <<lua-ver-sel-table>>).
+[[guile-defined-variables]]
+=== Переменные, определенные в фреймворке
-.Переменные, определенные для портов, использующих Lua
-[cols="1,1", frame="none", options="header"]
+В порте доступны эти переменные.
+
+[[using-guile-variables-ports]]
+.Переменные, определенные для портов, использующих Guile
+[cols="1,3m,6", frame="none", options="header"]
|===
-| Название
+| Имя
+| Пример значения
| Описание
-|`LUA_VER`
-|Версия Lua, которая будет использоваться (например, `5.1`)
+|`GUILE_VER`
+|3.0
+|Используемая версия Guile.
-|`LUA_VER_SH`
-|Старший номер версии динамической библиотеки Lua (например, `1`)
+|`GUILE_SFX`
+|3
+|Короткий суффикс, используемый в некоторых именах.
+Используйте с осторожностью; может быть неуникальным или измениться в будущем.
-|`LUA_VER_STR`
-|Версия Lua без точки (например, `51`)
+|`GUILE_FLAVOR`
+|guile30
+|Название флейвора, соответствующее выбранной версии.
-|`LUA_PREFIX`
-|Префикс, в который установлена Lua (и компоненты)
+|`GUILE_PORT`
+|lang/guile3
+|Расположение порта (origin) для указанной версии Guile.
-|`LUA_SUBDIR`
-|Каталог под [.filename]#${PREFIX}/bin#, [.filename]#${PREFIX}/share# и [.filename]#${PREFIX}/lib#, в который установлена Lua
+|`GUILE_PREFIX`
+|${PREFIX}
+|Префикс каталога для использования при установке.
-|`LUA_INCDIR`
-|Каталог, в который установлены заголовочные файлы Lua и tolua
+|`GUILE_CMD`
+|guile-3.0
+|Имя интерпретатора Guile с суффиксом версии.
-|`LUA_LIBDIR`
-|Каталог, в который установлены библиотеки Lua и tolua
+|`GUILE_CMDPATH`
+|${LOCALBASE}/bin/guile-3.0
+|Полный путь к интерпретатору Guile.
-|`LUA_MODLIBDIR`
-|Каталог, в который установлены модули библиотеки Lua ([.filename]#.so#)
+|`GUILD_CMD`
+|guild-3.0
+|Название инструмента Guild, с суффиксом версии.
-|`LUA_MODSHAREDIR`
-|Каталог, в который установлены модули Lua ([.filename]#.lua#)
+|`GUILD_CMDPATH`
+|`${LOCALBASE}/bin/guild-3.0`
+|Полный путь к инструменту Guild.
-|`LUA_PKGNAMEPREFIX`
-|Префикс с именем пакета, используемый модулями Lua
+|`++GUILE_*_CMD++` +
+`++GUILE_*_CMDPATH++`
+|
+|Как `GUILE_CMD` и `GUILE_CMDPATH`, но для других исполняемых файлов утилит.
-|`LUA_CMD`
-|Путь к интерпретатору Lua
+|`GUILE_PKGCONFIG_PATH`
+|${LOCALBASE}/libdata/pkgconfig/guile/3.0
+|Где пакеты, использующие `flavors`, должны устанавливать файлы `.pc`.
-|`LUAC_CMD`
-|Путь к компилятору Lua
+|`GUILE_INFO_PATH`
+|share/info/guile3
+|Подходящее значение для `INFO_PATH` для портов, использующих опцию `flavors`.
+|===
-|`TOLUA_CMD`
-|Путь к программе tolua
+Следующие элементы определены как переменные и как записи `PLIST_SUB`. Форма переменной имеет суффикс `_DIR` и представляет собой полный путь (с префиксом `GUILE_PREFIX`).
+
+[[using-guile-path-variables-ports]]
+.Подстановки путей, определенные для портов, использующих Guile
+[cols="1m,3m,6", frame="none", options="header"]
|===
+| Имя
+| Пример значения
+| Описание
-[[lua-variables-example]]
-.Указание для порта, где искать Lua
-[example]
-====
-Следующий фрагмент показывает, как сообщить порту, который использует сценарий configure, где расположены заголовочные файлы и библиотеки Lua.
+|GUILE_GLOBAL_SITE
+|share/guile/site
+|Каталог сайта, общий для всех версий guile; обычно не должен использоваться.
-[.programlisting]
-....
-USE_LUA= 4.0
-GNU_CONFIGURE= yes
-CONFIGURE_ENV= CPPFLAGS="-I${LUA_INCDIR}" LDFLAGS="-L${LUA_LIBDIR}"
-....
+|GUILE_SITE
+|share/guile/3.0/site
+|Каталог сайта для выбранной версии Guile.
-====
+|GUILE_SITE_CCACHE
+|lib/guile/3.0/site-ccache
+|Каталог для скомпилированных файлов байт-кода.
-[[lua-premk]]
-=== Обработка в [.filename]#bsd.port.pre.mk#
+|GUILE_DOCS
+|share/doc/guile30
+|Родительский каталог для документации, специфичной для версий.
-Если вам нужно использовать переменные для запуска команд сразу после подключения [.filename]#bsd.port.pre.mk#, для этого вам нужно определить переменную `LUA_PREMK`.
+|GUILE_EXAMPLES
+|share/examples/guile30
+|Родительский каталог для примеров, специфичных для версий.
+|===
-[IMPORTANT]
-====
-Если вы задаете `LUA_PREMK`, то версия, зависимости, компоненты и уже заданные переменные не будут изменены, в случае если вы изменили переменные порта Lua после подключения [.filename]#bsd.port.pre.mk#.
-====
+[[guile-examples]]
+=== Примеры
-[[lua-premk-example]]
-.Использование переменных Lua в командах
+[[guile-app-Makefile]]
+.`Makefile` для приложения, использующего Guile
[example]
====
-Следующий фрагмент иллюстрирует использование `LUA_PREMK` посредством запуска интерпретатора Lua для того, чтобы получить строку с полной версией, сохранить ее в переменную и передать программе.
+Этот пример демонстрирует, как сослаться на библиотеку Guile, необходимую во время сборки и выполнения. Обратите внимание, что ссылка должна указывать флейвор. В этом примере предполагается, что приложение использует `pkg-config` для поиска зависимостей.
[.programlisting]
....
-USE_LUA= 5.0
-LUA_PREMK= yes
+PORTNAME= sample
+DISTVERSION= 1.2.3
+CATEGORIES= whatever
-.include <bsd.port.pre.mk>
+MAINTAINER= fred.bloggs@example.com
+COMMENT= Sample
+WWW= https://example.com/guile_sample/sample/
-.if exists(${LUA_CMD})
-VER_STR!= ${LUA_CMD} -v
+BUILD_DEPENDS= guile-lib-${GUILE_FLAVOR}>=0.2.5:devel/guile-lib@${GUILE_FLAVOR}
+RUN_DEPENDS= guile-lib-${GUILE_FLAVOR}>=0.2.5:devel/guile-lib@${GUILE_FLAVOR}
-CFLAGS+= -DLUA_VERSION_STRING="${VER_STR}"
-.endif
-....
+USES= guile:2.2,3.0 pkgconfig
-====
+.include <bsd.port.mk>
+....
-[NOTE]
-====
-Переменные Lua можно безопасно использовать в командах внутри целей без необходимости в использовании `LUA_PREMK`.
====
[[using-iconv]]
== Использование `iconv`
-После 10-08-2013 (link:https://svnweb.freebsd.org/changeset/base/254273[r254273]) в составе FreeBSD 10-CURRENT и более новых версий имеется собственный `iconv`. В более ранних версиях дополнительной зависимостью выступал package:converters/libiconv[].
+В FreeBSD имеется встроенная реализация `iconv` в самой операционной системе.
-Для программного обеспечения, которому нужен `iconv`, определите `USES=iconv`. Версии FreeBSD до 10-CURRENT от 13-08-2013 (link:https://svnweb.freebsd.org/changeset/base/254273[r254273]) не имеют собственного `iconv`. На этих более ранных версиях будет автоматически добавлена зависимость от package:converters/libiconv[].
+Для программного обеспечения, требующего `iconv`, определите `USES=iconv`.
-Когда порт задаёт `USES=iconv`, становятся доступными следующие переменные:
+Когда порт определяет `USES=iconv`, становятся доступны следующие переменные:
[.informaltable]
[cols="1,1,1,1", frame="none", options="header"]
|===
| Имя переменной
| Назначение
-| Значение до FreeBSD 10-CURRENT 254273 (13-08-2013)
-| Значение после FreeBSD 10-CURRENT 254273 (13-08-2013)
+| Порт iconv (при использовании расширений WCHAR_T или //TRANSLIT)
+| Базовый iconv
+
|`ICONV_CMD`
-|Каталог размещения двоичного файла `iconv`
+|Каталог, в котором находится бинарный файл `iconv`
|`${LOCALBASE}/bin/iconv`
|[.filename]#/usr/bin/iconv#
|`ICONV_LIB`
-|Аргумент `ld` для компоновки с [.filename]#libiconv# (если нужно)
+|аргумент `ld` для линковки с [.filename]#libiconv# (если требуется)
|`-liconv`
|(пусто)
|`ICONV_PREFIX`
-|Каталог размещения реализации `iconv` (используется для сценариев конфигурации)
+|Каталог, в котором находится реализация `iconv` (полезно для скриптов configure)
|`${LOCALBASE}`
|[.filename]#/usr#
|`ICONV_CONFIGURE_ARG`
-|Параметр предварительно собранной конфигурации для сценариев конфигурации
+|Предварительно сконструированный аргумент configure для скриптов configure
|`--with-libiconv-prefix=${LOCALBASE}`
|(пусто)
|`ICONV_CONFIGURE_BASE`
-|Параметр предварительно собранной конфигурации для сценариев конфигурации
+|Предварительно сконструированный аргумент configure для скриптов configure
|`--with-libiconv=${LOCALBASE}`
|(пусто)
|===
-В следующих двух примерах демонстрируется автоматическое присвоение переменным правильных значений для систем, использующих package:converters/libiconv[] или собственный `iconv`.
+Эти два примера автоматически заполняют переменные правильным значением для систем, использующих package:converters/libiconv[] или `iconv`, входящий в состав операционной системы, соответственно:
[[iconv-simple-use]]
.Простое использование `iconv`
@@ -2261,12 +4279,12 @@ CONFIGURE_ARGS+=${ICONV_CONFIGURE_ARG}
====
-Как показано выше, `ICONV_LIB` имеет пустое значение с собственным `iconv`. Эту особенность можно использовать для обнаружения собственного `iconv` с соответствующими действиями.
+Как показано выше, `ICONV_LIB` пуста, когда присутствует встроенный `iconv`. Это можно использовать для обнаружения встроенного `iconv` и действовать соответственно.
-Иногда в программе параметр `ld` или путь поиска жёстко заданы в [.filename]#Makefile# или сценарии конфигурации. Для решения этой проблемы можно использовать следующий подход:
+Иногда в программе аргумент `ld` или путь поиска жестко заданы в [.filename]#Makefile# или скрипте configure. Для решения этой проблемы можно использовать следующий подход:
[[iconv-reinplace]]
-.Исправление жёстко заданного `-liconv`
+.Исправление жестко заданного `-liconv`
[example]
====
[.programlisting]
@@ -2279,10 +4297,10 @@ post-patch:
====
-В некоторых случаях необходимо установить альтернативные значения или выполнить операции в случае использования собственного `iconv`. Перед проверкой значения `ICONV_LIB` обязан быть подключён [.filename]#bsd.port.pre.mk#:
+В некоторых случаях необходимо установить альтернативные значения или выполнить операции в зависимости от наличия встроенного `iconv`. [.filename]#bsd.port.pre.mk# должен быть включен до проверки значения `ICONV_LIB`:
[[iconv-conditional]]
-.Проверка доступности собственного `iconv`
+.Проверка доступности встроенной поддержки `iconv`
[example]
====
[.programlisting]
@@ -2293,7 +4311,7 @@ USES= iconv
post-patch:
.if empty(ICONV_LIB)
- # обнаружен собственный iconv
+ # native iconv detected
@${REINPLACE_CMD} -e 's|iconv||' ${WRKSRC}/Config.sh
.endif
@@ -2305,126 +4323,239 @@ post-patch:
[[using-xfce]]
== Использование Xfce
-Переменная `USE_XFCE` используется для автоматической конфигурации зависимостей для портов, использующих библиотеки или приложения на основе Xfce, такие как package:x11-toolkits/libxfce4gui[] и package:x11-wm/xfce4-panel[].
+Порты, которым требуются библиотеки или приложения Xfce, устанавливают `USES=xfce`.
-В настоящее время распознаются следующие библиотеки и приложения Xfce:
+Конкретные зависимости библиотек и приложений Xfce задаются с помощью значений, присвоенных `USE_XFCE`. Они определены в [.filename]#/usr/ports/Mk/Uses/xfce.mk#. Возможные значения:
-* libexo: package:x11/libexo[]
-* libgui: package:x11-toolkits/libxfce4gui[]
-* libutil: package:x11/libxfce4util[]
-* libmcs: package:x11/libxfce4mcs[]
-* mcsmanager: package:sysutils/xfce4-mcs-manager[]
-* panel: package:x11-wm/xfce4-panel[]
-* thunar: package:x11-fm/thunar[]
-* wm: package:x11-wm/xfce4-wm[]
-* xfdev: package:dev/xfce4-dev-tools[]
+.Значения `USE_XFCE`
+garcon::
+package:sysutils/garcon[]
-Распознаются следующие дополнительные параметры:
+libexo::
+package:x11/libexo[]
+
+libgui::
+package:x11-toolkits/libxfce4gui[]
+
+libmenu::
+package:x11/libxfce4menu[]
+
+libutil::
+package:x11/libxfce4util[]
+
+panel::
+package:x11-wm/xfce4-panel[]
+
+thunar::
+package:x11-fm/thunar[]
+
+xfconf::
+package:x11/xfce4-conf[]
+
+[[use-xfce]]
+.Пример `USES=xfce`
+[example]
+====
+[.programlisting]
+....
+USES= xfce
+USE_XFCE= libmenu
+....
+
+====
+
+[[use-xfce-gtk2]]
+.Использование собственных виджетов GTK2 в Xfce
+[example]
+====
+В этом примере портированное приложение использует пакет виджетов, специфичных для GTK2: package:x11/libxfce4menu[] и package:x11/xfce4-conf[].
-* configenv: Используйте, если ваш порт требует специально измененного значения `CONFIGURE_ENV` для поиска требуемых для порта библиотек.
-+
[.programlisting]
....
--I${LOCALBASE}/include -L${LOCALBASE}/lib
+USES= xfce:gtk2
+USE_XFCE= libmenu xfconf
....
-+
-добавляется в CPPFLAGS к `CONFIGURE_ENV`.
+====
-Следовательно, если у порта имеется зависимость от package:sysutils/xfce4-mcs-manager[], и порт требует специальных CPPFLAGS в своем окружении configure, то синтаксис будет следующим:
+[TIP]
+====
+Компоненты Xfce, включённые таким образом, автоматически загрузят все необходимые зависимости. Указывать полный список больше не требуется. Если порту нужен только package:x11-wm/xfce4-panel[], используйте:
[.programlisting]
....
-USE_XFCE= mcsmanager configenv
+USES= xfce
+USE_XFCE= panel
....
-[[using-mozilla]]
-== Использование Mozilla
+Нет необходимости перечислять компоненты package:x11-wm/xfce4-panel[], которые ему самому требуются, вот так:
-.Переменные для портов, использующих Mozilla
-[cols="1,1", frame="none"]
-|===
-|`USE_GECKO`
-|Один из бэкэндов Gecko, с которым может работать порт. Возможные значения: `libxul` ([.filename]#libxul.so#), `seamonkey` ([.filename]#libgtkembedmoz.so#, устаревший, больше не должен использоваться).
+[.programlisting]
+....
+USES= xfce
+USE_XFCE= libexo libmenu libutil panel
+....
+
+Однако компоненты Xfce и зависимости порта, не относящиеся к Xfce, должны быть явно включены. Не рассчитывайте, что компонент Xfce предоставит дополнительную зависимость, кроме себя, для основного порта.
+====
+
+[[using-budgie]]
+== Использование Budgie
+
+Приложения или библиотеки, зависящие от рабочего стола Budgie, должны указывать `USES= budgie` и устанавливать `USE_BUDGIE` в список необходимых компонентов.
-|`USE_FIREFOX`
-|Для запуска порта требуется Firefox. Возможные значения: `yes` (версия по умолчанию), `40`, `36`, `35`. По умолчанию устанавливает зависимость от версии `40`.
+[cols="1,1", frame="none", options="header"]
+|===
+| Имя
+| Описание
-|`USE_FIREFOX_BUILD`
-|Для построения порта требуется Firefox. Возможные значения: смотрите USE_FIREFOX. Автоматически устанавливает USE_FIREFOX с присвоением того же значения.
+| `libbudgie`
+| Ядро рабочего стола (библиотека)
-|`USE_SEAMONKEY`
-|Для запуска порта требуется SeaMonkey. Возможные значения: `yes` (версия по умолчанию), `20`, `11` (устарело, больше не должно использоваться). По умолчанию устанавливает зависимость от версии `20`.
+| `libmagpie`
+| Оконный менеджер X11 и библиотека композитинга Budgie
-|`USE_SEAMONKEY_BUILD`
-|Для построения порта требуется SeaMonkey. Возможные значения: смотрите USE_SEAMONKEY. Автоматически устанавливает USE_SEAMONKEY с присвоением того же значения.
+| `raven`
+| Универсальный центр в панели для доступа к различным виджетам приложений
-|`USE_THUNDERBIRD`
-|Для запуска порта требуется Thunderbird. Возможные значения: `yes` (версия по умолчанию), `31`, `30` (устарело, больше не должно использоваться). По умолчанию устанавливает зависимость от версии `31`.
+| `screensaver`
+| Рабочий стол: специальная заставка
-|`USE_THUNDERBIRD_BUILD`
-|Для построения порта требуется Thunderbird. Возможные значения: смотрите USE_THUNDERBIRD. Автоматически устанавливает USE_THUNDERBIRD с присвоением того же значения.
|===
-Полный перечень доступных переменных можно получить в файле [.filename]#/usr/ports/Mk/bsd.gecko.mk#.
+[NOTE]
+====
+Все виджеты приложений взаимодействуют через службу *org.budgie_desktop.Raven*.
+
+Зависимость по умолчанию включает время сборки и выполнения, её можно изменить с помощью `:build` или `:run`, например:
+
+[.programlisting]
+....
+USES= budgie
+USE_BUDGIE= screensaver:build
+....
+====
+
+[[budgie-components-example]]
+.Пример `USE_BUDGIE`
+[example]
+====
+[.programlisting]
+....
+USES= budgie gettext gnome meson pkgconfig
+USE_BUDGIE= libbudgie
+....
+====
[[using-databases]]
== Использование баз данных
-.Переменные для портов, использующих базы данных
+Используйте один из макросов `USES` из crossref:special[using-databases-uses,Макросы `USES` для баз данных], чтобы добавить зависимость от базы данных.
+
+[[using-databases-uses]]
+.Макросы `USES` для баз данных
[cols="1,1", frame="none", options="header"]
|===
-| Переменная
-| Значение
+| База данных
+| Макрос USES
-|`USE_BDB`
-|Если переменная установлена в `yes`, добавляет зависимость от порта package:databases/db41[]. Также переменной можно присвоить значения: 2, 3, 40, 41, 42, 43, 44, 46, 47, 48 или 51. Вы можете объявить диапазон принимаемых значений, `USE_BDB`=42+ будет искать установленную версию с наибольшим номером, и, если ничего не установлено, вернется к 42.
+|Berkeley DB
+|crossref:uses[uses-bdb,`bdb`]
-|`USE_MYSQL`
-|Если переменная установлена в `yes`, добавляет зависимость от порта package:databases/mysql55-client[]. Как связанная переменная, `WANT_MYSQL_VER` может быть установлена в значение 323, 40, 41, 50, 51, 52, 55 или 60.
+|MariaDB, MySQL, Percona
+|crossref:uses[uses-mysql,`mysql`]
-|`USE_PGSQL`
-|Если установлена в `yes`, добавляет зависимость от порта package:databases/postgresql90-client[]. Как связанная переменная, `WANT_PGSQL_VER` может быть установлена в значение 83, 84, 90, 91 или 92. Вы можете указать максимальное и минимальное значения; `WANT_PGSQL_VER=90+` сделает порт зависимым от минимальной версии 9.0.
+|PostgreSQL
+|crossref:uses[uses-pgsql,`pgsql`]
-|`USE_SQLITE`
-|Если переменная имеет значение `yes`, добавляет зависимость от порта package:databases/sqlite3[]. Переменная может принимать значения: 3, 2.
+|SQLite
+|crossref:uses[uses-sqlite,`sqlite`]
|===
-Подробнее смотрите в http://svnweb.FreeBSD.org/ports/head/Mk/bsd.database.mk?view=markup[bsd.database.mk].
+[[using-databases-bdb-ex1]]
+.Использование Berkeley DB 6
+[example]
+====
+[.programlisting]
+....
+USES= bdb:6
+....
+
+См. crossref:uses[uses-bdb,`bdb`] для получения дополнительной информации.
+====
+
+[[using-databases-mysql-ex1]]
+.Использование MySQL
+[example]
+====
+Когда порту требуется клиентская библиотека MySQL, добавьте
+
+[.programlisting]
+....
+USES= mysql
+....
+
+См. crossref:uses[uses-mysql,`mysql`] для получения дополнительной информации.
+====
+
+[[using-databases-pgsql-ex1]]
+.Использование PostgreSQL
+[example]
+====
+Когда порту требуется сервер PostgreSQL версии 9.6 или новее, добавьте
+
+[.programlisting]
+....
+USES= pgsql:9.6+
+WANT_PGSQL= server
+....
+
+См. crossref:uses[uses-pgsql,`pgsql`] для получения дополнительной информации.
+====
+
+[[using-databases-sqlite-ex1]]
+.Использование SQLite 3
+[example]
+====
+[.programlisting]
+....
+USES= sqlite:3
+....
+
+См. crossref:uses[uses-sqlite,`sqlite`] для получения дополнительной информации.
+====
[[rc-scripts]]
-== Запуск и остановка служб (сценарии `rc`)
+== Запуск и остановка служб (скрипты `rc`)
-Сценарии [.filename]#rc.d# используются для запуска служб при запуске системы и дают администратору стандартный способ остановки, запуска и перезапуска службы. Порты интегрируются в системную инфраструктуру [.filename]#rc.d#. Подробности по её использованию можно найти в extref:{handbook}config-tuning/[главе rc.d Руководства, configtuning-rcd]. Подробное объяснение доступных команд находится в man:rc[8] и man:rc.subr[8]. Наконец, есть extref:{rc-scripting}[статья]о практических аспектах написания сценариев [.filename]#rc.d#.
+[.filename]#rc.d# скрипты используются для запуска служб при загрузке системы, а также предоставляют администраторам стандартный способ остановки, запуска и перезапуска служб. Порты интегрируются в систему [.filename]#rc.d#. Подробности использования можно найти в extref:{handbook}[соответствующей главе Handbook, configtuning-rcd]. Детальное объяснение доступных команд приведено в man:rc[8] и man:rc.subr[8]. Наконец, существует extref:{rc-scripting}[статья], посвящённая практическим аспектам написания [.filename]#rc.d# скриптов.
-Установить можно один или более сценариев [.filename]#rc.d#:
+С мифическим портом под названием _doorman_, которому необходимо запустить демон _doormand_. Добавьте следующее в [.filename]#Makefile#:
[.programlisting]
....
USE_RC_SUBR= doormand
....
-Сценарии обязаны размещаться в подкаталоге [.filename]#files# с обязательным добавлением суффикса `.in` к имени файла. Для этого файла будут использоваться стандартные расширения `SUB_LIST`. Также особенно приветствуется использование расширений `%%PREFIX%%` и `%%LOCALBASE%%`. Подробнее о `SUB_LIST` в <<using-sub-files,соответствующей главе>>.
+Можно указать несколько скриптов, которые будут установлены. Скрипты должны быть размещены в подкаталоге [.filename]#files#, и к их имени должен быть добавлен суффикс `.in`. Для этого файла будут выполнены стандартные подстановки `SUB_LIST`. Также настоятельно рекомендуется использовать подстановки `%%PREFIX%%` и `%%LOCALBASE%%`. Подробнее о `SUB_LIST` см. в crossref:pkg-files[using-sub-files,соответствующем разделе].
-Начиная с FreeBSD 6.1-RELEASE локальные сценарии [.filename]#rc.d# (включая установленные из портов) включены в общий man:rcorder[8] основной системы.
+Начиная с FreeBSD 6.1-RELEASE, локальные скрипты [.filename]#rc.d# (включая те, что установлены через порты) включены в общий man:rcorder[8] базовой системы.
-Пример простого сценария [.filename]#rc.d#:
+Пример простого скрипта [.filename]#rc.d# для запуска демона doormand:
[.programlisting]
....
#!/bin/sh
-# $FreeBSD$
-#
# PROVIDE: doormand
# REQUIRE: LOGIN
# KEYWORD: shutdown
#
-# Add the following lines to /etc/rc.conf.local or /etc/rc.conf
+# Add these lines to /etc/rc.conf.local or /etc/rc.conf
# to enable this service:
#
# doormand_enable (bool): Set to NO by default.
-# Set it to YES to enable doorman.
+# Set it to YES to enable doormand.
# doormand_config (path): Set to %%PREFIX%%/etc/doormand/doormand.cf
# by default.
@@ -2446,73 +4577,76 @@ command_args="-p $pidfile -f $doormand_config"
run_rc_command "$1"
....
-Если нет стоящей причины запускать службы раньше всех портов, сценарии должны использовать
+Если нет очень веской причины запускать службу раньше или она работает от имени определенного пользователя (не root), все скрипты портов должны использовать:
[.programlisting]
....
REQUIRE: LOGIN
....
-Если служба работает под определенным пользователем (отличным от root), то это делается принудительно. В сценарий выше включена конструкция
+Если скрипт запуска демона требует его остановки, следующий код активирует остановку службы при выключении системы:
[.programlisting]
....
KEYWORD: shutdown
....
-потому что вымышленный порт, который мы используем в качестве примера, запускает службу, и она должна корректно завершиться при выключении системы. Если сценарий не запускает постоянную службу, то это не является необходимым.
+Если скрипт не запускает постоянную службу, это не требуется.
-Для необязательных элементов конфигурации присвоение переменной по умолчанию в стиле "=" является более предпочтительным по сравнению со стилем ":=", используемым здесь, поскольку первый устанавливает значение по умолчанию только если переменная не установлена, а последний устанавливает её, если переменная не установлена _или_ обнулена. Пользователь вполне может написать в своем файле [.filename]#rc.conf.local# что-нибудь типа
+Для необязательных элементов конфигурации предпочтительнее использовать стиль присваивания переменных по умолчанию "=" вместо стиля ":=", так как первый устанавливает значение по умолчанию только если переменная не задана, а второй — если переменная не задана _или_ равна null. Пользователь может включить что-то вроде:
[.programlisting]
....
doormand_flags=""
....
-и тогда произойдет неуместная подстановка переменной с использованием ":=", что переопределит намерения пользователя. Переменная `_enable` является обязательной; значением по умолчанию должно быть ":".
+в свой [.filename]#rc.conf.local#, а подстановка переменной с использованием ":=" некорректно переопределила бы намерение пользователя. Переменная `_enable` не является опциональной и должна использовать ":" для значения по умолчанию.
+
+[IMPORTANT]
+====
+Порты _не должны_ запускать и останавливать свои службы при установке и удалении. Не злоупотребляйте ключевыми словами [.filename]#plist#, описанными в crossref:plist[plist-keywords-base-exec, "разделе @preexec command,@postexec command,@preunexec command,@postunexec command"], выполняя команды, которые изменяют работающую систему, включая запуск или остановку служб.
+====
-=== Контрольный список перед внесением изменений
+[[rc-scripts-checklist]]
+=== Pre-Commit Checklist
-Перед тем, как отсылать порт со сценарием [.filename]#rc.d#, и тем более перед его коммитом, сверьтесь со следующим контрольным списком, чтобы убедиться, что порт для этого готов.
+Прежде чем внести порт с [.filename]#rc.d# скриптом, и что более важно, перед его коммитом, пожалуйста, ознакомьтесь с этим контрольным списком, чтобы убедиться, что он готов.
-Большинство из этих проверок умеет выполнять порт package:devel/rclint[], но это не является заменой надлежащему просмотру.
+Порт package:devel/rclint[] может проверить большинство из них, но он не заменяет тщательного просмотра и проверки.
[.procedure]
-====
-. Если это новый файл, заканчивается ли он на [.filename]#.sh#? Если это так, то имя файла должно быть изменено на [.filename]#file.in#, поскольку файлы [.filename]#rc.d# не могут оканчиваться на такое расширение.
-. Присутствует ли в файле тег `$FreeBSD$`?
-. Соответствуют ли друг другу имя файла (без [.filename]#.in#), строка `PROVIDE` и ``$``__name__? Имя файла, совпадающее с `PROVIDE`, упрощает отладку, особенно для проблем, связанных с man:rcorder[8]. Соответствие имени файла и ``$``__name__ также упрощает понимание, какие переменные имеют отношение к сценарию в [.filename]#rc.conf[.local]#. Последнее также является тем, что вы могли бы назвать "политикой" для всех новых сценариев, включая те, что входят в базовую систему.
-. Содержит ли строка `REQUIRE` значение LOGIN? Это условие обязательно для сценариев, работающих не из-под суперпользователя. Если сценарий запускается из-под суперпользователя, то стоит ли его запускать до `LOGIN`? Если нет, то его следует запускать после, так чтобы мы могли свободно сгруппировать локальные сценарии в той точке man:rcorder[8], когда почти все сценарии в базовой системе уже стартовали.
-. Запускает ли сценарий постоянную службу? Если да, то он должен иметь `KEYWORD: shutdown`.
-. Убедитесь в том, что в сценарии отсутствует `KEYWORD: FreeBSD`. Это перестало быть нужным и нежелательно уже много лет. Это также служит индикатором того, что новый сценарий был скопирован со старого, поэтому особое внимание должно быть уделено при проверке.
-. Если сценарий использует интерпретируемый язык, такой как `perl`, `python` или `ruby`, то убедитесь, что значение `command_interpreter` установлено должным образом. В противном случае
+. Если это новый файл, имеет ли он расширение [.filename]#.sh#? Если да, его необходимо изменить на просто [.filename]#file.in#, поскольку файлы [.filename]#rc.d# не могут оканчиваться таким расширением.
+. Совпадают ли имя файла (без [.filename]#.in#), строка `PROVIDE` и `$`_name_? Совпадение имени файла с `PROVIDE` упрощает отладку, особенно при проблемах с man:rcorder[8]. Совпадение имени файла и `$`_name_ облегчает понимание того, какие переменные актуальны в [.filename]#rc.conf[.local]#. Это также является политикой для всех новых скриптов, включая те, что в базовой системе.
+. Установлена ли строка `REQUIRE` в значение `LOGIN`? Это обязательно для скриптов, выполняемых от имени непривилегированного пользователя. Если скрипт выполняется от имени root, есть ли веская причина для его запуска до `LOGIN`? Если нет, он должен запускаться после, чтобы локальные скрипты можно было условно сгруппировать в man:rcorder[8] после запуска большинства компонентов базовой системы.
+. Запускает ли скрипт постоянную службу? Если да, он должен содержать `KEYWORD: shutdown`.
+. Убедитесь, что отсутствует `KEYWORD: FreeBSD`. Это перестало быть необходимым или желательным уже много лет. Это также указывает на то, что новый скрипт был скопирован/вставлен из старого скрипта, поэтому следует проявить дополнительную осторожность при проверке.
+. Если скрипт использует интерпретируемый язык, например `perl`, `python` или `ruby`, убедитесь, что `command_interpreter` установлен корректно. Например, для Perl добавьте `PERL=${PERL}` в `SUB_LIST` и используйте `%%PERL%%`. В противном случае,
+
-[source,shell]
+[source, shell]
....
# service name stop
....
-+
-возможно будет работать неправильно. Смотрите man:service[8] для дополнительной информации.
-. Все ли вхождения [.filename]#/usr/local# были заменены на `%%PREFIX%%`?
-. Идет ли присвоение переменным значений по умолчанию после `load_rc_config`?
++
+вероятно, не будет работать корректно. Дополнительную информацию смотрите в man:service[8].
+. Проверено, что все вхождения [.filename]#/usr/local# заменены на `%%PREFIX%%`?
+. Делаются ли присваивания переменным по умолчанию после `load_rc_config`?
. Используются ли пустые строки при присвоении значений по умолчанию? Такие присвоения должны быть удалены, но перепроверьте, что эти параметры задокументированы в комментариях в начале файла.
. Действительно ли в сценариях используются значения, присвоенные переменным?
-. Являются ли параметры по умолчанию, перечисленные в __name__``_flags``, обязательными? Если это так, то их следует поместить в `command_args`. Параметр `-d` здесь - это как красный флаг (прошу прощения за каламбур), поскольку обычно он применяется для "демонизации" процесса и поэтому на самом деле обязательный.
-. Никогда не включайте переменную __name__``_flags`` в `command_args` (и наоборот; в прочем, такая ошибка встречается реже).
-. Запускает ли сценарий какой-либо код безусловно? Это нехорошо. Обычно такие вещи могут/должны помещаться в `start_precmd`.
-. Все логические условия должны использовать функцию `checkyesno`. Не пишите самописных проверок для `[Yy][Ee][Ss]`, и так далее.
-. Если в сценарии выполняется цикл (например, ожидание чего-либо перед стартом), используется ли счетчик для завершения цикла? Мы не хотим бесконечного ожидания загрузки в случае возникновения ошибки.
-. Создает ли сценарий файлы или каталоги, которым нужны особые права доступа? Например, файл [.filename]#pid#, который должен принадлежать пользователю, из-под которого запускается процесс. Вместо традиционных команд man:touch[1]/man:chown[8]/man:chmod[1] подумайте об использовании man:install[1] с подходящими аргументами командной строки, для того чтобы выполнить всю процедуру за один шаг.
-====
+. Являются ли опции, перечисленные в стандартном _name_`_flags`, обязательными? Если да, они должны быть в `command_args`. Флаг `-d` здесь, как красный флаг (простите за каламбур), так как обычно это опция для "демонизации" процесса и, следовательно, фактически обязательна.
+. `_name__flags` никогда не должны включаться в `command_args` (и наоборот, хотя такая ошибка встречается реже).
+. Выполняет ли скрипт любой код безусловно? Это не приветствуется. Обычно такие вещи должны обрабатываться через `start_precmd`.
+. Все логические проверки должны использовать функцию `checkyesno`. Не допускаются самодельные проверки на `[Yy][Ee][Ss]` и т.п.
+. Если есть цикл (например, ожидание запуска чего-либо), есть ли в нём счётчик для завершения цикла? Мы не хотим, чтобы загрузка зависала навсегда в случае ошибки.
+. Создает ли скрипт файлы или каталоги, требующие определенных разрешений, например, [.filename]#pid#, который должен принадлежать пользователю, запускающему процесс? Вместо традиционной последовательности man:touch[1]/man:chown[8]/man:chmod[1] рассмотрите использование man:install[1] с соответствующими аргументами командной строки, чтобы выполнить всю процедуру за один шаг.
[[users-and-groups]]
== Добавление пользователей и групп
-Некоторые порты требуют в установленной системе наличие определенного пользователя. Выберите свободный UID в диапазоне от 50 до 999 и зарегистрируйте его в [.filename]#ports/UIDs# (для пользователей) и/или в [.filename]#ports/GIDs# (для групп). Удостоверьтесь, что не используете UID, уже используемый системой или другими портами.
+Некоторые порты требуют наличия определённой учётной записи пользователя, обычно для демонов, работающих от имени этого пользователя. Для таких портов выберите _уникальный_ UID в диапазоне от 50 до 999 и зарегистрируйте его в [.filename]#ports/UIDs# (для пользователей) и [.filename]#ports/GIDs# (для групп). Уникальный идентификатор должен быть одинаковым для пользователей и групп.
-Пожалуйста, включите в патч изменение для этих двух файлов, если вам требуется создать нового пользователя или группу для вашего порта.
+Пожалуйста, приложите патч для этих двух файлов, если требуется создать нового пользователя или группу для порта.
-Затем вы сможете использовать в вашем [.filename]#Makefile# переменные `USERS` и `GROUPS`, и пользователь автоматически создастся при установке порта.
+Затем используйте `USERS` и `GROUPS` в [.filename]#Makefile#, и пользователь будет автоматически создан при установке порта.
[.programlisting]
....
@@ -2520,16 +4654,58 @@ USERS= pulse
GROUPS= pulse pulse-access pulse-rt
....
-Текущий перечень зарезервированных UID и GID находится в [.filename]#ports/UIDs# и [.filename]#ports/GIDs#.
+Текущий список зарезервированных UID и GID можно найти в [.filename]#ports/UIDs# и [.filename]#ports/GIDs#.
[[requiring-kernel-sources]]
-== Порты, требующие наличия исходных текстов ядра
+== Порты, зависящие от исходных кодов ядра
-Некоторым портам (таким как загружаемые модули ядра) для компиляции нужны файлы с исходными текстами ядра. Ниже указан корректный способ определения, установлены ли они пользователем:
+Некоторые порты (например, загружаемые модули ядра) требуют исходные файлы ядра для компиляции порта. Вот правильный способ проверить, установлены ли они у пользователя:
[.programlisting]
....
USES= kmod
....
-Кроме этой проверки, `kmod` заботится о большинстве пунктов, которые должны учитываться в этих портах.
+Помимо этой проверки, функция `kmod` учитывает большинство аспектов, которые необходимо принимать во внимание данным портам.
+
+[[go-libs]]
+== Библиотеки Go
+
+Порты не должны упаковывать или устанавливать библиотеки или исходный код Go. Порты Go должны загружать необходимые зависимости в обычное время загрузки и должны устанавливать только программы и то, что нужно пользователям, а не то, что нужно разработчикам на Go.
+
+Порты должны (в порядке предпочтения):
+
+* Использовать зависимости, включенные в исходный код пакета.
+* Получить версии зависимостей, указанные вышестоящим проектом (в случае go.mod, vendor.json или аналогичных).
+* В крайнем случае (зависимости не включены и версии не указаны точно) получить версии зависимостей, доступные на момент разработки/выпуска вышестоящего проекта.
+
+[[haskell-libs]]
+== Библиотеки Haskell
+
+Как и в случае с языком Go, коллекция портов не должна включать или устанавливать библиотеки Haskell. Порты Haskell должны статически линковаться со своими зависимостями и загружать все распространяемые файлы на этапе fetch.
+
+[[shell-completion]]
+== Файлы завершения командной оболочки
+
+Многие современные оболочки (включая bash, fish, tcsh и zsh) поддерживают табуляцию для параметров и/или опций. Эта поддержка обычно обеспечивается файлами завершения, которые содержат определения того, как будет работать завершение по табуляции для определённой команды. Порты иногда поставляются со своими собственными файлами завершения, или разработчики портов могут создавать их самостоятельно.
+
+Если доступны файлы завершения, их всегда следует устанавливать. Нет необходимости создавать для этого опцию. Однако если опция используется, всегда включайте её в `OPTIONS_DEFAULT`.
+
+[[shell-completion-paths]]
+.Полные имена файлов завершения оболочки
+[cols="1,1,1", frame="none"]
+|===
+|`bash`
+|[.filename]#${PREFIX}/etc/bash_completion.d# or [.filename]#${PREFIX}/share/bash-completion/completions#
+|(любые уникальные имена файлов в одной из этих папок)
+
+|`fish`
+|[.filename]#${PREFIX}/share/fish/completions/${PORTNAME}.fish#
+|
+
+|`zsh`
+|[.filename]#${PREFIX}/share/zsh/site-functions/_${PORTNAME}#
+|
+|===
+
+Не регистрируйте зависимости от самих оболочек.
diff --git a/documentation/content/ru/books/porters-handbook/special/_index.po b/documentation/content/ru/books/porters-handbook/special/_index.po
new file mode 100644
index 0000000000..ca4f4e8072
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/special/_index.po
@@ -0,0 +1,14978 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-24 21:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookspecial_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1
+#, no-wrap
+msgid "Special considerations when creating a new FreeBSD Port"
+msgstr "Особые соображения при создании нового порта FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1
+#, no-wrap
+msgid "Chapter 6. Special Considerations"
+msgstr "Глава 6. Особые соглашения"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:14
+#, no-wrap
+msgid "Special Considerations"
+msgstr "Особые соглашения"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:52
+msgid ""
+"This section explains the most common things to consider when creating a "
+"port."
+msgstr ""
+"Имеется ещё несколько вещей, которые вы должны иметь в виду при создании "
+"порта. Этот раздел описывает наиболее часто встречающиеся из них."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:54
+#, no-wrap
+msgid "Splitting long files"
+msgstr "Разделение длинных файлов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:61
+msgid ""
+"Sometimes, port [.filename]#Makefiles# can be really long. For example, "
+"rust ports can have a very long `CARGO_CRATES` list. In other cases, the "
+"[.filename]#Makefile# might have code that varies depending on the "
+"architecture. In such cases, it can be convenient to split the original "
+"[.filename]#Makefile# into several files. [.filename]#bsd.port.mk# "
+"automatically includes some types of [.filename]#Makefiles# into the main "
+"port [.filename]#Makefile#."
+msgstr ""
+"Иногда [.filename]#Makefiles# могут быть очень длинными. Например, порты "
+"rust могут содержать очень длинный список `CARGO_CRATES`. В других случаях "
+"[.filename]#Makefile# может содержать код, который варьируется в зависимости "
+"от архитектуры. В таких ситуациях может быть удобно разделить исходный "
+"[.filename]#Makefile# на несколько файлов. [.filename]#bsd.port.mk# "
+"автоматически включает некоторые типы [.filename]#Makefiles# в основной "
+"[.filename]#Makefile# порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:63
+msgid ""
+"These are the files that the framework handles automatically if they are "
+"found:"
+msgstr ""
+"Вот файлы, которые система обрабатывает автоматически, если они обнаружены:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:65
+msgid ""
+"[.filename]#Makefile.crates#. An example can be found in package:audio/"
+"ebur128[]."
+msgstr ""
+"[.filename]#Makefile.crates#. Пример можно найти в пакете package:audio/"
+"ebur128[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:66
+msgid ""
+"[.filename]#Makefile.inc#. An example can be found in package:net/ntp[]."
+msgstr ""
+"[.filename]#Makefile.inc#. Пример можно найти в пакете package:net/ntp[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:67
+msgid "[.filename]#Makefile.${ARCH}-${OPSYS}#"
+msgstr "[.filename]#Makefile.${ARCH}-${OPSYS}#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:68
+msgid ""
+"[.filename]#Makefile.${OPSYS}#. An example can be found in package:net/cvsup-"
+"static[]."
+msgstr ""
+"[.filename]#Makefile.${OPSYS}#. Пример можно найти в пакете package:net/"
+"cvsup-static[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:69
+msgid "[.filename]#Makefile.${ARCH}#"
+msgstr "[.filename]#Makefile.${ARCH}#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:70
+msgid "[.filename]#Makefile.local#"
+msgstr "[.filename]#Makefile.local#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:76
+msgid ""
+"It is also usual practice to split the packaging list of the port into "
+"several files if the list varies a lot from one architecture to another or "
+"depends on the selected flavor. In this case, the [.filename]#pkg-plist# "
+"file for each architecture is named following the pattern [.filename]#pkg-"
+"plist.${ARCH}# or [.filename]#pkg-plist.${FLAVOR}#. The framework does not "
+"create the packaging list automatically if multiple [.filename]#pkg-plist# "
+"files exist. It is the responsibility of the porter to select the proper "
+"[.filename]#pkg-plist# and assign it to the `PLIST` variable. Examples on "
+"how to deal with this can be found in package:audio/logitechmediaserver[] "
+"and package:deskutils/libportal[]."
+msgstr ""
+"Также распространённой практикой является разделение списка пакетов порта на "
+"несколько файлов, если список сильно различается в зависимости от "
+"архитектуры или выбранного флейвора. В этом случае файл [.filename]#pkg-"
+"plist# для каждой архитектуры именуется по шаблону [.filename]#pkg-plist.$"
+"{ARCH}# или [.filename]#pkg-plist.${FLAVOR}#. Фреймворк не создаёт список "
+"пакетов автоматически, если существует несколько файлов [.filename]#pkg-"
+"plist#. Ответственность за выбор подходящего файла [.filename]#pkg-plist# и "
+"его присвоение переменной `PLIST` лежит на того, кто делает порт. Примеры "
+"работы с этим можно найти в портах package:audio/logitechmediaserver[] и "
+"package:deskutils/libportal[]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:78
+#, no-wrap
+msgid "Staging"
+msgstr "Staging"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:85
+msgid ""
+"[.filename]#bsd.port.mk# expects ports to work with a \"stage directory\". "
+"This means that a port must not install files directly to the regular "
+"destination directories (that is, under `PREFIX`, for example) but instead "
+"into a separate directory from which the package is then built. In many "
+"cases, this does not require root privileges, making it possible to build "
+"packages as an unprivileged user. With staging, the port is built and "
+"installed into the stage directory, `STAGEDIR`. A package is created from "
+"the stage directory and then installed on the system. Automake tools refer "
+"to this concept as `DESTDIR`, but in FreeBSD, `DESTDIR` has a different "
+"meaning (see crossref:testing[porting-prefix,`PREFIX` and `DESTDIR`])."
+msgstr ""
+"[.filename]#bsd.port.mk# ожидает, что порты будут работать с \"директорией "
+"стадии\". Это означает, что порт не должен устанавливать файлы напрямую в "
+"обычные целевые директории (например, под `PREFIX`), а вместо этого в "
+"отдельную директорию, из которой затем собирается пакет. Во многих случаях "
+"это не требует прав root, что позволяет собирать пакеты от имени "
+"непривилегированного пользователя. При использовании стадии порт собирается "
+"и устанавливается в директорию стадии `STAGEDIR`. Пакет создаётся из "
+"директории стадии и затем устанавливается в систему. Инструменты Automake "
+"называют эту концепцию `DESTDIR`, но в FreeBSD `DESTDIR` имеет другое "
+"значение (см. crossref:testing[porting-prefix,`PREFIX` и `DESTDIR`])."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:92
+msgid ""
+"No port _really_ needs to be root. It can mostly be avoided by using "
+"crossref:uses[uses-uidfix,`USES=uidfix`]. If the port still runs commands "
+"like man:chown[8], man:chgrp[1], or forces owner or group with "
+"man:install[1] then use crossref:uses[uses-fakeroot,`USES=fakeroot`] to fake "
+"those calls. Some patching of the port's [.filename]#Makefiles# will be "
+"needed."
+msgstr ""
+"Ни один порт _на самом деле_ не должен работать от root. Этого в большинстве "
+"случаев можно избежать, используя crossref:uses[uses-uidfix,`USES=uidfix`]. "
+"Если порт всё ещё выполняет команды, такие как man:chown[8], man:chgrp[1], "
+"или принудительно устанавливает владельца или группу с помощью "
+"man:install[1], то используйте crossref:uses[uses-fakeroot,`USES=fakeroot`], "
+"чтобы подделать эти вызовы. Потребуется некоторая правка "
+"[.filename]#Makefiles# порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:97
+msgid ""
+"Meta ports, or ports that do not install files themselves but only depend on "
+"other ports, must avoid needlessly extracting the man:mtree[8] to the stage "
+"directory. This is the basic directory layout of the package, and these "
+"empty directories will be seen as orphans. To prevent man:mtree[8] "
+"extraction, add this line:"
+msgstr ""
+"Метапорты, то есть порты, которые не устанавливают файлы непосредственно, а "
+"только зависят от других портов, должны по возможности избегать распаковки "
+"man:mtree[8] в каталог сборки. Это основная иерархия каталогов пакета, и эти "
+"пустые каталоги будут выглядеть лишними. Для предотвращения распаковки "
+"man:mtree[8] добавьте эту строку:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:101
+#, no-wrap
+msgid "NO_MTREE=\tyes\n"
+msgstr "NO_MTREE=\tyes\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:107
+msgid ""
+"Metaports should use crossref:special[uses-metaport,`USES=metaport`]. It "
+"sets up defaults for ports that do not fetch, build, or install anything."
+msgstr ""
+"Метапорты должны использовать crossref:special[uses-"
+"metaport,`USES=metaport`]. Это устанавливает значения по умолчанию для "
+"портов, которые не загружают, не собирают и не устанавливают ничего."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:113
+msgid ""
+"Staging is enabled by prepending `STAGEDIR` to paths used in the `pre-"
+"install`, `do-install`, and `post-install` targets (see the examples through "
+"the book). Typically, this includes `PREFIX`, `ETCDIR`, `DATADIR`, "
+"`EXAMPLESDIR`, `DOCSDIR`, and so on. Directories should be created as part "
+"of the `post-install` target. Avoid using absolute paths whenever possible."
+msgstr ""
+"Этап подготовки включается путем добавления `STAGEDIR` к путям, используемым "
+"в целях `pre-install`, `do-install` и `post-install` (см. примеры в книге). "
+"Обычно это включает `PREFIX`, `ETCDIR`, `DATADIR`, `EXAMPLESDIR`, `DOCSDIR` "
+"и т. д. Каталоги должны создаваться как часть цели `post-install`. По "
+"возможности избегайте использования абсолютных путей."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:117
+msgid ""
+"Ports that install kernel modules must prepend `STAGEDIR` to their "
+"destination, by default [.filename]#/boot/modules#."
+msgstr ""
+"Порты, которые устанавливают модули ядра, должны добавлять `STAGEDIR` к пути "
+"назначения, по умолчанию это [.filename]#/boot/modules#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:120
+#, no-wrap
+msgid "Handling Symbolic Links"
+msgstr "Обработка символических ссылок"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:125
+msgid ""
+"When creating a symbolic link, relative ones are strongly recommended. Use "
+"`${RLN}` to create relative symbolic links. It uses man:install[1] under "
+"the hood to automatically figure out the relative link to create."
+msgstr ""
+"При создании символической ссылки настоятельно рекомендуется использовать "
+"относительные пути. Используйте `${RLN}` для создания относительных "
+"символических ссылок. Эта команда использует man:install[1] для "
+"автоматического определения относительной ссылки, которую нужно создать."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:127
+#, no-wrap
+msgid "Create Relative Symbolic Links Automatically"
+msgstr "Автоматическое создание относительных символических ссылок"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:131
+msgid ""
+"`${RLN}` uses man:install[1]'s relative symbolic feature which frees the "
+"porter of computing the relative path."
+msgstr ""
+"`${RLN}` использует относительную символическую ссылку из man:install[1], "
+"что освобождает сборщика порта от вычисления относительного пути."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:137
+#, no-wrap
+msgid ""
+"${RLN} ${STAGEDIR}${PREFIX}/lib/libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so\n"
+"${RLN} ${STAGEDIR}${PREFIX}/libexec/foo/bar ${STAGEDIR}${PREFIX}/bin/bar\n"
+"${RLN} ${STAGEDIR}/var/cache/foo ${STAGEDIR}${PREFIX}/share/foo\n"
+msgstr ""
+"${RLN} ${STAGEDIR}${PREFIX}/lib/libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so\n"
+"${RLN} ${STAGEDIR}${PREFIX}/libexec/foo/bar ${STAGEDIR}${PREFIX}/bin/bar\n"
+"${RLN} ${STAGEDIR}/var/cache/foo ${STAGEDIR}${PREFIX}/share/foo\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:140
+msgid "Will generate:"
+msgstr "Будет создано:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:150
+#, no-wrap
+msgid ""
+"% ls -lF ${STAGEDIR}${PREFIX}/lib\n"
+"lrwxr-xr-x 1 nobody nobody 181 Aug 3 11:27 libfoo.so@ -> libfoo.so.42\n"
+"-rwxr-xr-x 1 nobody nobody 15 Aug 3 11:24 libfoo.so.42*\n"
+"% ls -lF ${STAGEDIR}${PREFIX}/bin\n"
+"lrwxr-xr-x 1 nobody nobody 181 Aug 3 11:27 bar@ -> ../libexec/foo/bar\n"
+"% ls -lF ${STAGEDIRDIR}${PREFIX}/share\n"
+"lrwxr-xr-x 1 nobody nobody 181 Aug 3 11:27 foo@ -> ../../../var/cache/foo\n"
+msgstr ""
+"% ls -lF ${STAGEDIR}${PREFIX}/lib\n"
+"lrwxr-xr-x 1 nobody nobody 181 Aug 3 11:27 libfoo.so@ -> libfoo.so.42\n"
+"-rwxr-xr-x 1 nobody nobody 15 Aug 3 11:24 libfoo.so.42*\n"
+"% ls -lF ${STAGEDIR}${PREFIX}/bin\n"
+"lrwxr-xr-x 1 nobody nobody 181 Aug 3 11:27 bar@ -> ../libexec/foo/bar\n"
+"% ls -lF ${STAGEDIRDIR}${PREFIX}/share\n"
+"lrwxr-xr-x 1 nobody nobody 181 Aug 3 11:27 foo@ -> ../../../var/cache/foo\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:155
+#, no-wrap
+msgid "Bundled Libraries"
+msgstr "Встроенные библиотеки"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:158
+msgid ""
+"This section explains why bundled dependencies are considered bad and what "
+"to do about them."
+msgstr ""
+"Этот раздел объясняет, почему встроенные зависимости считаются плохими и что "
+"с этим делать."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:160
+#, no-wrap
+msgid "Why Bundled Libraries Are Bad"
+msgstr "Почему встроенные библиотеки — это плохо"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:165
+msgid ""
+"Some software requires the porter to locate third-party libraries and add "
+"the required dependencies to the port. Other software bundles all necessary "
+"libraries into the distribution file. The second approach seems easier at "
+"first, but there are some serious drawbacks:"
+msgstr ""
+"Некоторое программное обеспечение требует от упаковщика найти сторонние "
+"библиотеки и добавить необходимые зависимости в порт. Другое ПО включает все "
+"необходимые библиотеки в дистрибутивный файл. Второй подход кажется проще на "
+"первый взгляд, но имеет серьёзные недостатки:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:167
+msgid ""
+"This list is loosely based on the https://fedoraproject.org/wiki/"
+"Packaging:No_Bundled_Libraries[Fedora] and https://wiki.gentoo.org/wiki/"
+"Why_not_bundle_dependencies[Gentoo] wikis, both licensed under the https://"
+"creativecommons.org/licenses/by-sa/3.0/[CC-BY-SA 3.0] license."
+msgstr ""
+"Этот список частично основан на вики https://fedoraproject.org/wiki/"
+"Packaging:No_Bundled_Libraries[Fedora] и https://wiki.gentoo.org/wiki/"
+"Why_not_bundle_dependencies[Gentoo], оба распространяются по лицензии "
+"https://creativecommons.org/licenses/by-sa/3.0/[CC-BY-SA 3.0]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:168
+#, no-wrap
+msgid "Security"
+msgstr "Безопасность"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:174
+msgid ""
+"If vulnerabilities are found in the upstream library and fixed there, they "
+"might not be fixed in the library bundled with the port. One reason could "
+"be that the author is not aware of the problem. This means that the porter "
+"must fix them, or upgrade to a non-vulnerable version, and send a patch to "
+"the author. This all takes time, which results in software being vulnerable "
+"longer than necessary. This in turn makes it harder to coordinate a fix "
+"without unnecessarily leaking information about the vulnerability."
+msgstr ""
+"Если уязвимости обнаружены в вышестоящей библиотеке и исправлены там, они "
+"могут остаться неисправленными в библиотеке, поставляемой с портом. Одной из "
+"причин может быть то, что автор не знает о проблеме. Это означает, что "
+"портировщик должен исправить их или обновить до не уязвимой версии и "
+"отправить исправление автору. Всё это требует времени, что приводит к тому, "
+"что программное обеспечение остаётся уязвимым дольше, чем необходимо. Это, в "
+"свою очередь, затрудняет координацию исправления без неоправданного "
+"раскрытия информации об уязвимости."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:175
+#, no-wrap
+msgid "Bugs"
+msgstr "Ошибки"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:177
+msgid ""
+"This problem is similar to the problem with security in the last paragraph, "
+"but generally less severe."
+msgstr ""
+"Эта проблема аналогична проблеме с безопасностью в последнем абзаце, но в "
+"целом менее серьезная."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:178
+#, no-wrap
+msgid "Forking"
+msgstr "Ветвление"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:182
+msgid ""
+"It is easier for the author to fork the upstream library once it is "
+"bundled. While convenient on first sight, it means that the code diverges "
+"from upstream making it harder to address security or other problems with "
+"the software. A reason for this is that patching becomes harder."
+msgstr ""
+"Автору проще создать форк upstream-библиотеки после её включения в "
+"дистрибутив. Хотя на первый взгляд это кажется удобным, такой подход "
+"приводит к расхождению кода с исходным репозиторием, что усложняет "
+"исправление уязвимостей и других проблем в ПО. Одна из причин — затруднённое "
+"применение патчей."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:185
+msgid ""
+"Another problem of forking is that because code diverges from upstream, bugs "
+"get solved over and over again instead of just once at a central location. "
+"This defeats the idea of open source software in the first place."
+msgstr ""
+"Еще одна проблема форкинга заключается в том, что из-за расхождения кода с "
+"основной веткой, ошибки исправляются снова и снова, вместо того чтобы быть "
+"исправленными один раз в центральном месте. Это противоречит самой идее "
+"открытого программного обеспечения."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:186
+#, no-wrap
+msgid "Symbol collision"
+msgstr "Конфликты символов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:191
+msgid ""
+"When a library is installed on the system, it might collide with the bundled "
+"version. This can cause immediate errors at compile or link time. It can "
+"also cause errors when running the program which might be harder to track "
+"down. The latter problem could be caused because the versions of the two "
+"libraries are incompatible."
+msgstr ""
+"Когда библиотека установлена в системе, может возникнуть конфликт с "
+"встроенной в порт версией. Это может привести к немедленным ошибкам во время "
+"компиляции или компоновки. Также могут возникать ошибки при запуске "
+"программы, которые сложнее отследить. Последняя проблема может быть вызвана "
+"несовместимостью версий двух библиотек."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:192
+#, no-wrap
+msgid "Licensing"
+msgstr "Лицензирование"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:194
+msgid ""
+"When bundling projects from different sources, license issues can arise more "
+"easily, especially when licenses are incompatible."
+msgstr ""
+"При объединении проектов из различных источников могут возникать проблемы с "
+"лицензиями, особенно если лицензии несовместимы."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:195
+#, no-wrap
+msgid "Waste of resources"
+msgstr "Растрата ресурсов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:199
+msgid ""
+"Bundled libraries waste resources on several levels. It takes longer to "
+"build the actual application, especially if these libraries are already "
+"present on the system. At run-time, they can take up unnecessary memory "
+"when the system-wide library is already loaded by one program and the "
+"bundled library is loaded by another program."
+msgstr ""
+"Библиотеки, поставляемые в комплекте, растрачивают ресурсы на нескольких "
+"уровнях. Сборка самого приложения занимает больше времени, особенно если эти "
+"библиотеки уже присутствуют в системе. Во время выполнения они могут "
+"занимать дополнительную память, когда общесистемная библиотека уже загружена "
+"одной программой, а входящая в комплект библиотека загружена другой "
+"программой."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:200
+#, no-wrap
+msgid "Waste of effort"
+msgstr "Пустая трата усилий"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:204
+msgid ""
+"When a library needs patches for FreeBSD, these patches have to be "
+"duplicated again in the bundled library. This wastes developer time because "
+"the patches might not apply cleanly. It can also be hard to notice that "
+"these patches are required in the first place."
+msgstr ""
+"Когда библиотеке требуются патчи для FreeBSD, эти патчи приходится "
+"дублировать в составе библиотеки. Это приводит к потере времени "
+"разработчиков, поскольку патчи могут применяться некорректно. Кроме того, "
+"бывает сложно сразу заметить, что эти патчи вообще необходимы."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:206
+#, no-wrap
+msgid "What to do About Bundled Libraries"
+msgstr "Что делать со встроенными библиотеками"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:210
+msgid ""
+"Whenever possible, use the unbundled version of the library by adding a "
+"`LIB_DEPENDS` to the port. If such a port does not exist yet, consider "
+"creating it."
+msgstr ""
+"По возможности используйте независимую версию библиотеки, добавив "
+"`LIB_DEPENDS` в порт. Если такого порта ещё не существует, рассмотрите "
+"возможность его создания."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:212
+msgid ""
+"Only use bundled libraries if the upstream has a good track record on "
+"security and using unbundled versions leads to overly complex patches."
+msgstr ""
+"Используйте встроенные библиотеки только в том случае, если разработчик "
+"имеет хорошую репутацию в вопросах безопасности, а использование внешних "
+"версий приводит к излишне сложным исправлениям."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:220
+msgid ""
+"In some very special cases, for example emulators, like Wine, a port has to "
+"bundle libraries, because they are in a different architecture, or they have "
+"been modified to fit the software's use. In that case, those libraries "
+"should not be exposed to other ports for linking. Add `BUNDLE_LIBS=yes` to "
+"the port's [.filename]#Makefile#. This will tell man:pkg[8] to not compute "
+"provided libraries. Always ask the {portmgr} before adding this to a port."
+msgstr ""
+"В некоторых особых случаях, например, для эмуляторов, таких как Wine, порт "
+"должен включать библиотеки, потому что они предназначены для другой "
+"архитектуры или были изменены для использования в данном программном "
+"обеспечении. В таком случае эти библиотеки не должны быть доступны для "
+"связывания с другими портами. Добавьте `BUNDLE_LIBS=yes` в "
+"[.filename]#Makefile# порта. Это укажет man:pkg[8] не учитывать "
+"предоставляемые библиотеки. Всегда спрашивайте {portmgr}, прежде чем "
+"добавлять это в порт."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:223
+#, no-wrap
+msgid "Shared Libraries"
+msgstr "Динамические библиотеки"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:227
+msgid ""
+"If the port installs one or more shared libraries, define a `USE_LDCONFIG` "
+"make variable, which will instruct a [.filename]#bsd.port.mk# to run `$"
+"{LDCONFIG} -m` on the directory where the new library is installed (usually "
+"[.filename]#PREFIX/lib#) during `post-install` target to register it into "
+"the shared library cache. This variable, when defined, will also facilitate "
+"addition of an appropriate `@exec /sbin/ldconfig -m` and `@unexec /sbin/"
+"ldconfig -R` pair into [.filename]#pkg-plist#, so that a user who installed "
+"the package can start using the shared library immediately and de-"
+"installation will not cause the system to still believe the library is there."
+msgstr ""
+"Если ваш порт устанавливает одну или несколько динамических библиотек, "
+"определите переменную `USE_LDCONFIG`, которая приведёт к запуску из "
+"[.filename]#bsd.port.mk# команды `${LDCONFIG} -m` относительно каталога, в "
+"который устанавливается новая библиотека (как правило, это "
+"[.filename]#PREFIX/lib#), во время выполнения цели `post-install` для её "
+"регистрации в кэше динамических библиотек. Эта переменная, если она "
+"определена, также приведёт к добавлению соответствующей пары команд `@exec /"
+"sbin/ldconfig -m` и `@unexec /sbin/ldconfig -R` в ваш файл [.filename]#pkg-"
+"plist#, так что пользователь, устанавливающий пакет, сможет сразу же "
+"использовать динамическую библиотеку, а удаление пакета не приведёт к тому, "
+"что система будет предполагать, что библиотека всё ещё имеется в наличии."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:231
+#, no-wrap
+msgid "USE_LDCONFIG=\tyes\n"
+msgstr "USE_LDCONFIG=\tyes\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:235
+msgid ""
+"The default directory can be overridden by setting `USE_LDCONFIG` to a list "
+"of directories into which shared libraries are to be installed. For "
+"example, if the port installs shared libraries into [.filename]#PREFIX/lib/"
+"foo# and [.filename]#PREFIX/lib/bar# use this in [.filename]#Makefile#:"
+msgstr ""
+"Если нужно, вы можете переопределить каталог по умолчанию, задав значение "
+"`USE_LDCONFIG`, в котором должны быть перечислены каталоги, в которые "
+"устанавливаются динамические библиотеки. Например, если ваш порт "
+"устанавливает динамические библиотеки в каталоги [.filename]#PREFIX/lib/foo# "
+"и [.filename]#PREFIX/lib/bar#, то вы можете в файле [.filename]#Makefile# "
+"указать следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:239
+#, no-wrap
+msgid "USE_LDCONFIG=\t${PREFIX}/lib/foo ${PREFIX}/lib/bar\n"
+msgstr "USE_LDCONFIG=\t${PREFIX}/lib/foo ${PREFIX}/lib/bar\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:242
+msgid ""
+"Please double-check, often this is not necessary at all or can be avoided "
+"through `-rpath` or setting `LD_RUN_PATH` during linking (see package:lang/"
+"mosml[] for an example), or through a shell-wrapper which sets "
+"`LD_LIBRARY_PATH` before invoking the binary, like package:www/seamonkey[] "
+"does."
+msgstr ""
+"Будьте добры перепроверить, т.к. часто это вовсе не является необходимым и "
+"может быть решено иначе с помощью `-rpath` или установки `LD_RUN_PATH` во "
+"время компоновки (для примера смотрите package:lang/moscow_ml[]), или с "
+"помощью сценария-обёртки, который выставляет `LD_LIBRARY_PATH` перед "
+"запуском исполняемого файла как это делает package:www/seamonkey[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:244
+msgid ""
+"When installing 32-bit libraries on a 64-bit system, use `USE_LDCONFIG32` "
+"instead."
+msgstr ""
+"При установке 32-разрядных библиотек на 64-разрядной системе используйте "
+"вместо этого `USE_LDCONFIG32`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:246
+msgid ""
+"If the software uses crossref:special[using-autotools,autotools], and "
+"specifically `libtool`, add crossref:uses[uses-libtool,`USES=libtool`]."
+msgstr ""
+"Если программное обеспечение использует crossref:special[using-"
+"autotools,autotools], в частности `libtool`, добавьте crossref:uses[uses-"
+"libtool,`USES=libtool`]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:248
+msgid ""
+"When the major library version number increments in the update to the new "
+"port version, all other ports that link to the affected library must have "
+"their `PORTREVISION` incremented, to force recompilation with the new "
+"library version."
+msgstr ""
+"Если при обновлении порта увеличивается старший номер версии библиотеки, то "
+"для всех портов, компонуемых с затронутой библиотекой, следует увеличить "
+"значение `PORTREVISION` для форсирования перекомпиляции с новой версией "
+"библиотеки."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:250
+#, no-wrap
+msgid "Ports with Distribution Restrictions or Legal Concerns"
+msgstr "Порты с ограничениями на распространение или с правовым обременением"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:253
+msgid ""
+"Licenses vary, and some of them place restrictions on how the application "
+"can be packaged, whether it can be sold for profit, and so on."
+msgstr ""
+"Лицензии бывают разных видов, и некоторые накладывают ограничение на то, как "
+"приложение может быть оформлено в виде пакета, может ли оно продаваться для "
+"извлечения коммерческой выгоды, и так далее."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:258
+msgid ""
+"It is the responsibility of a porter to read the licensing terms of the "
+"software and make sure that the FreeBSD project will not be held accountable "
+"for violating them by redistributing the source or compiled binaries either "
+"via FTP/HTTP or CD-ROM. If in doubt, please contact the {freebsd-ports}."
+msgstr ""
+"На вас, как на человека, портирующего приложение, ложится обязанность "
+"прочесть лицензионные соглашения на программное обеспечение и "
+"удостовериться, что проект FreeBSD не будет являться их нарушителем, если "
+"будет заниматься распространением исходного кода или в бинарном виде по FTP/"
+"HTTP или на CD-ROM. Если у вас возникли сомнения, то, пожалуйста, обратитесь "
+"в {freebsd-ports}."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:261
+msgid ""
+"In situations like this, the variables described in the next sections can be "
+"set."
+msgstr ""
+"В подобных ситуациях можно использовать переменные, описываемые в "
+"последующих разделах."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:263
+#, no-wrap
+msgid "`NO_PACKAGE`"
+msgstr "`NO_PACKAGE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:267
+msgid ""
+"This variable indicates that we may not generate a binary package of the "
+"application. For instance, the license may disallow binary redistribution, "
+"or it may prohibit distribution of packages created from patched sources."
+msgstr ""
+"Эта переменная указывает, что мы не можем создавать для приложения двоичный "
+"пакет. К примеру, лицензия не позволяет бинарное распространение или она "
+"может запрещать распространение пакетов, созданных из изменённых исходников."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:270
+msgid ""
+"However, the port's `DISTFILES` may be freely mirrored on FTP/HTTP. They "
+"may also be distributed on a CD-ROM (or similar media) unless `NO_CDROM` is "
+"set as well."
+msgstr ""
+"Однако файлы `DISTFILES` могут свободно зеркалироваться по FTP/HTTP. Они "
+"также могут распространяться, используя CD-ROM (или на похожих носителях), "
+"если не установлена переменная `NO_CDROM`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:273
+msgid ""
+"If the binary package is not generally useful, and the application must "
+"always be compiled from the source code, use `NO_PACKAGE`. For example, if "
+"the application has configuration information that is site specific hard "
+"coded into it at compile time, set `NO_PACKAGE`."
+msgstr ""
+"`NO_PACKAGE` должна также использоваться, если двоичный пакет, как правило, "
+"бесполезен, а приложение должно всегда компилироваться из исходного кода. К "
+"примеру, если в приложение во время компиляции жёстко включается "
+"конфигурационная информация, привязанная к конкретной системе, то задайте "
+"переменную `NO_PACKAGE`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:275
+msgid ""
+"Set `NO_PACKAGE` to a string describing the reason why the package cannot be "
+"generated."
+msgstr ""
+"Значением переменной `NO_PACKAGE` должна быть строка, описывающая причину, "
+"по которой пакет не должен создаваться."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:277
+#, no-wrap
+msgid "`NO_CDROM`"
+msgstr "`NO_CDROM`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:281
+msgid ""
+"This variable alone indicates that, although we are allowed to generate "
+"binary packages, we may put neither those packages nor the port's "
+"`DISTFILES` onto a CD-ROM (or similar media) for resale. However, the "
+"binary packages and the port's `DISTFILES` will still be available via FTP/"
+"HTTP."
+msgstr ""
+"Эта переменная указывает на то, что, хотя мы имеем право создавать бинарные "
+"пакеты, мы не можем помещать эти пакеты или файлы `DISTFILES` порта на CD-"
+"ROM (или на похожие носители) для перепродажи. Однако бинарные пакеты и "
+"файлы `DISTFILES` порта будут оставаться доступными посредством FTP/HTTP."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:283
+msgid ""
+"If this variable is set along with `NO_PACKAGE`, then only the port's "
+"`DISTFILES` will be available, and only via FTP/HTTP."
+msgstr ""
+"Если эта переменная устанавливается вместе с `NO_PACKAGE`, то только файлы "
+"порта `DISTFILES` будут доступны, и только посредством FTP/HTTP."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:286
+msgid ""
+"Set `NO_CDROM` to a string describing the reason why the port cannot be "
+"redistributed on CD-ROM. For instance, use this if the port's license is "
+"for \"non-commercial\" use only."
+msgstr ""
+"В качестве значения `NO_CDROM` должна указываться строка, описывающая "
+"причины, по которым порт не может распространяться на CD-ROM. К примеру, это "
+"применяется, если лицензионное соглашение приложения предполагает только его "
+"\"некоммерческое\" использование."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:288
+#, no-wrap
+msgid "`NOFETCHFILES`"
+msgstr "`NOFETCHFILES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:292
+msgid ""
+"Files defined in `NOFETCHFILES` are not fetchable from any of "
+"`MASTER_SITES`. An example of such a file is when the file is supplied on "
+"CD-ROM by the vendor."
+msgstr ""
+"Файлы, определенные в переменной `NOFETCHFILES`, не будут извлекаться ни из "
+"одного из `MASTER_SITES`. Примером такого файла является файл, поставляемый "
+"на CD-ROM."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:294
+msgid ""
+"Tools which check for the availability of these files on `MASTER_SITES` have "
+"to ignore these files and not report about them."
+msgstr ""
+"Инструменты, проверяющие доступность этих файлов на `MASTER_SITES`, должны "
+"игнорировать эти файлы и не сообщать о них."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:296
+#, no-wrap
+msgid "`RESTRICTED`"
+msgstr "`RESTRICTED`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:299
+msgid ""
+"Set this variable alone if the application's license permits neither "
+"mirroring the application's `DISTFILES` nor distributing the binary package "
+"in any way."
+msgstr ""
+"Задайте эту переменную, если лицензия на приложение не позволяет ни "
+"зеркалировать файлы `DISTFILES`, ни распространять бинарный пакет через FTP/"
+"HTTP или на CD-ROM."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:301
+msgid ""
+"Do not set `NO_CDROM` or `NO_PACKAGE` along with `RESTRICTED`, since the "
+"latter variable implies the former ones."
+msgstr ""
+"Ни `NO_CDROM`, ни `NO_PACKAGE` не стоит устанавливать вместе с `RESTRICTED`, "
+"так как последняя переменная подразумевает первые две."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:305
+msgid ""
+"Set `RESTRICTED` to a string describing the reason why the port cannot be "
+"redistributed. Typically, this indicates that the port contains proprietary "
+"software and that the user will need to manually download the `DISTFILES`, "
+"possibly after registering for the software or agreeing to accept the terms "
+"of an EULA."
+msgstr ""
+"В качестве значения `RESTRICTED` должна указываться строка, описывающая "
+"причины, по которым порт нельзя распространять. Обычно это означает, что "
+"порт использует закрытое программное обеспечение, а пользователь должен "
+"вручную сгрузить файлы `DISTFILES`, возможно, после заполнения "
+"регистрационной формы или подтверждения соглашения с условиями EULA."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:307
+#, no-wrap
+msgid "`RESTRICTED_FILES`"
+msgstr "`RESTRICTED_FILES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:311
+msgid ""
+"When `RESTRICTED` or `NO_CDROM` is set, this variable defaults to `$"
+"{DISTFILES} ${PATCHFILES}`, otherwise it is empty. If only some of the "
+"distribution files are restricted, then set this variable to list them."
+msgstr ""
+"Если заданы `RESTRICTED` или `NO_CDROM`, то значение этой переменной по "
+"умолчанию соответствует `${DISTFILES} ${PATCHFILES}`, в противном случае она "
+"пуста. Если ограничены в распространении лишь некоторые из дистрибутивных "
+"файлов, то в этой переменной задаётся их список."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:313
+#, no-wrap
+msgid "`LEGAL_TEXT`"
+msgstr "`LEGAL_TEXT`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:317
+msgid ""
+"If the port has legal concerns not addressed by the above variables, set "
+"`LEGAL_TEXT` to a string explaining the concern. For example, if special "
+"permission was obtained for FreeBSD to redistribute the binary, this "
+"variable must indicate so."
+msgstr ""
+"Если порт имеет правовое обременение, которое не покрывается перечисленными "
+"выше переменными, то переменной `LEGAL_TEXT` следует присвоить строку с "
+"описанием данного обременения. Например, если было получено особое "
+"разрешение для FreeBSD на распространение двоичного файла, то эта переменная "
+"должна содержать соответствующее указание."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:319
+#, no-wrap
+msgid "[.filename]#/usr/ports/LEGAL# and `LEGAL`"
+msgstr "[.filename]#/usr/ports/LEGAL# и `LEGAL`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:325
+msgid ""
+"A port which sets any of the above variables must also be added to "
+"[.filename]#/usr/ports/LEGAL#. The first column is a glob which matches the "
+"restricted distfiles. The second column is the port's origin. The third "
+"column is the output of `make -VLEGAL`."
+msgstr ""
+"Порт, содержащий любую из перечисленных выше переменных, также должен быть "
+"добавлен в [.filename]#/usr/ports/LEGAL#. Первый столбец содержит шаблон "
+"совпадения с дистрибутивными файлами, имеющими ограничения на "
+"распространение. Второй столбец содержит корень порта. Третий столбец "
+"содержит вывод `make -VLEGAL`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:327
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4228
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4488
+#, no-wrap
+msgid "Examples"
+msgstr "Примеры"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:330
+msgid ""
+"The preferred way to state \"the distfiles for this port must be fetched "
+"manually\" is as follows:"
+msgstr ""
+"Предпочтительным способом реализации утверждения \"архивы исходных текстов "
+"для этого порта должны загружаться самостоятельно\" является следующее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:336
+#, no-wrap
+msgid ""
+".if !exists(${DISTDIR}/${DISTNAME}${EXTRACT_SUFX})\n"
+"IGNORE=\tmay not be redistributed because of licensing reasons. Please visit some-website to accept their license and download ${DISTFILES} into ${DISTDIR}\n"
+".endif\n"
+msgstr ""
+".if !exists(${DISTDIR}/${DISTNAME}${EXTRACT_SUFX})\n"
+"IGNORE=\tmay not be redistributed because of licensing reasons. Please visit some-website to accept their license and download ${DISTFILES} into ${DISTDIR}\n"
+".endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:339
+msgid ""
+"This both informs the user, and sets the proper metadata on the user's "
+"machine for use by automated programs."
+msgstr ""
+"Это одновременно и информирует пользователя, и устанавливает нужные "
+"метаданные на пользовательской машине для использования автоматическими "
+"программами."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:341
+msgid ""
+"Note that this stanza must be preceded by an inclusion of "
+"[.filename]#bsd.port.pre.mk#."
+msgstr ""
+"Обратите внимание, что данная кляуза должна предшествовать подключению файла "
+"[.filename]#bsd.port.pre.mk#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:343
+#, no-wrap
+msgid "Building Mechanisms"
+msgstr "Механизмы построения"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:346
+#, no-wrap
+msgid "Building Ports in Parallel"
+msgstr "Параллельное построение портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:350
+msgid ""
+"The FreeBSD ports framework supports parallel building using multiple `make` "
+"sub-processes, which allows SMP systems to utilize all of their available "
+"CPU power, allowing port builds to be faster and more effective."
+msgstr ""
+"Инфраструктура портов FreeBSD поддерживает параллельное построение с "
+"использованием множественных подпроцессов `make`, что позволяет системам SMP "
+"задействовать всю доступную мощность CPU, тем самым делая построение портов "
+"более быстрым и эффективным."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:355
+msgid ""
+"This is achieved by passing `-jX` flag to man:make[1] running on vendor "
+"code. This is the default build behavior of ports. Unfortunately, not all "
+"ports handle parallel building well and it may be required to explicitly "
+"disable this feature by adding the `MAKE_JOBS_UNSAFE=yes` variable. It is "
+"used when a port is known to be broken with `-jX` due to race conditions "
+"causing intermittent build failures."
+msgstr ""
+"Это достигается путём передачи флага `-jX` команде man:make[1]. Такое "
+"построение портов является поведением по умолчанию. К сожалению, не все "
+"порты поддерживают параллельную сборку достаточно хорошо, и поэтому может "
+"потребоваться выключить этот механизм явным образом путём добавления "
+"переменной `MAKE_JOBS_UNSAFE=yes`. Эта переменная используется в случае, "
+"когда известно, что порт ломается с `-jX`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:360
+msgid ""
+"When setting `MAKE_JOBS_UNSAFE`, it is very important to explain either with "
+"a comment in the [.filename]#Makefile#, or at least in the commit message, "
+"_why_ the port does not build when enabling. Otherwise, it is almost "
+"impossible to either fix the problem, or test if it has been fixed when "
+"committing an update at a later date."
+msgstr ""
+"При установке `MAKE_JOBS_UNSAFE` очень важно объяснить либо комментарием в "
+"[.filename]#Makefile#, либо хотя бы в сообщении коммита, _почему_ порт не "
+"собирается при включении. В противном случае практически невозможно ни "
+"исправить проблему, ни проверить, была ли она исправлена при коммите "
+"обновления в дальнейшем."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:363
+#, no-wrap
+msgid "`make`, `gmake`, and `imake`"
+msgstr "`make`, `gmake` и `imake`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:366
+msgid ""
+"Several differing `make` implementations exist. Ported software often "
+"requires a particular implementation, like GNU `make`, known in FreeBSD as "
+"`gmake`."
+msgstr ""
+"Существует несколько различных реализаций `make`. Переносимому программному "
+"обеспечению часто требуется конкретная реализация, например GNU `make`, "
+"известная в FreeBSD как `gmake`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:368
+msgid "If the port uses GNU make, add `gmake` to `USES`."
+msgstr "Если порт использует GNU make, добавьте `gmake` в `USES`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:371
+msgid ""
+"`MAKE_CMD` can be used to reference the specific command configured by the "
+"`USES` setting in the port's [.filename]#Makefile#. Only use `MAKE_CMD` "
+"within the application [.filename]##Makefile##s in `WRKSRC` to call the "
+"`make` implementation expected by the ported software."
+msgstr ""
+"`MAKE_CMD` может использоваться для ссылки на конкретную команду, "
+"настроенную параметром `USES` в [.filename]#Makefile# порта. Используйте "
+"`MAKE_CMD` только внутри [.filename]##Makefile## приложения в `WRKSRC` для "
+"вызова реализации `make`, ожидаемой портируемым программным обеспечением."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:374
+msgid ""
+"If the port is an X application that uses imake to create "
+"[.filename]##Makefile##s from [.filename]##Imakefile##s, set `USES= imake`. "
+"See the crossref:uses[uses-imake,`USES=imake`] section of "
+"crossref:uses[uses,Using `USES` Macros] for more details."
+msgstr ""
+"Если ваш порт является приложением X, которое создает файлы "
+"[.filename]#Makefile# из [.filename]#Imakefile#, используя imake, то "
+"установите `USES= imake`. Это заставит стадию конфигурирования автоматически "
+"выполнить `xmkmf -a`. Если флаг `-a` представляет для вашего порта проблему, "
+"то установите `XMKMF=xmkmf`. Если порт использует imake, но не понимает цель "
+"`install.man`, то следует установить `NO_INSTALL_MANPAGES=yes`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:377
+msgid ""
+"If the port's source [.filename]#Makefile# has something other than `all` as "
+"the main build target, set `ALL_TARGET` accordingly. The same goes for "
+"`install` and `INSTALL_TARGET`."
+msgstr ""
+"Если исходный [.filename]#Makefile# вашего порта имеет что-нибудь помимо "
+"`all` в качестве основной цели построения, то задайте соответствующее "
+"значение `ALL_TARGET`. То же касается `install` и `INSTALL_TARGET`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:379
+#, no-wrap
+msgid "`configure` Script"
+msgstr "Сценарий `configure`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:384
+msgid ""
+"If the port uses the `configure` script to generate [.filename]#Makefile# "
+"from [.filename]#Makefile.in#, set `GNU_CONFIGURE=yes`. To give extra "
+"arguments to the `configure` script (the default argument is `--prefix=$"
+"{PREFIX} --infodir=${PREFIX}/${INFO_PATH} --mandir=${PREFIX}/man --build=$"
+"{CONFIGURE_TARGET}`), set those extra arguments in `CONFIGURE_ARGS`. Extra "
+"environment variables can be passed using `CONFIGURE_ENV`."
+msgstr ""
+"Если ваш порт использует сценарий `configure` для получения файлов "
+"[.filename]#Makefile# из файлов [.filename]#Makefile.in#, то установите "
+"`GNU_CONFIGURE=yes`. Если вы хотите дать дополнительные параметры сценарию "
+"`configure` (аргументом по умолчанию является `--prefix=${PREFIX} --infodir=$"
+"{PREFIX}/${INFO_PATH} --mandir=${MANPREFIX}/man --build=${CONFIGURE_TARGET}"
+"`), установите эти параметры в `CONFIGURE_ARGS`. Дополнительные переменные "
+"окружения можно передать, используя переменную `CONFIGURE_ENV`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:386
+#, no-wrap
+msgid "Variables for Ports That Use `configure`"
+msgstr "Переменные для портов, использующих `configure`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:390
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:418
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:446
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:529
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:812
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2449
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2469
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3173
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3205
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3790
+#, no-wrap
+msgid "Variable"
+msgstr "Переменная"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:392
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:420
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:448
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1325
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3175
+#, no-wrap
+msgid "Means"
+msgstr "Значение"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:393
+#, no-wrap
+msgid "`GNU_CONFIGURE`"
+msgstr "`GNU_CONFIGURE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:395
+#, no-wrap
+msgid "The port uses `configure` script to prepare build."
+msgstr "Порт использует сценарий `configure` для подготовки построения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:396
+#, no-wrap
+msgid "`HAS_CONFIGURE`"
+msgstr "`HAS_CONFIGURE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:398
+#, no-wrap
+msgid "Same as `GNU_CONFIGURE`, except default configure target is not added to `CONFIGURE_ARGS`."
+msgstr "То же, что и `GNU_CONFIGURE`, кроме того, что цель configure по умолчанию не добавляется в `CONFIGURE_ARGS`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:399
+#, no-wrap
+msgid "`CONFIGURE_ARGS`"
+msgstr "`CONFIGURE_ARGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:401
+#, no-wrap
+msgid "Additional arguments passed to `configure` script."
+msgstr "Дополнительные параметры, передаваемые сценарию `configure`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:402
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:438
+#, no-wrap
+msgid "`CONFIGURE_ENV`"
+msgstr "`CONFIGURE_ENV`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:404
+#, no-wrap
+msgid "Additional environment variables to be set for `configure` script run."
+msgstr "Дополнительные переменные окружения, задаваемые для запуска сценария `configure`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:405
+#, no-wrap
+msgid "`CONFIGURE_TARGET`"
+msgstr "`CONFIGURE_TARGET`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:406
+#, no-wrap
+msgid "Override default configure target. Default value is `${MACHINE_ARCH}-portbld-freebsd${OSREL}`."
+msgstr "Переопределить цель configure по умолчанию. Значением по умолчанию является `${MACHINE_ARCH}-portbld-freebsd${OSREL}`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:409
+#, no-wrap
+msgid "Using `cmake`"
+msgstr "Использование `cmake`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:412
+msgid "For ports that use CMake, define `USES= cmake`."
+msgstr "Если порт использует CMake, определите `USES= cmake`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:414
+#, no-wrap
+msgid "Variables for Ports That Use `cmake`"
+msgstr "Переменные для портов, использующих `cmake`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:421
+#, no-wrap
+msgid "`CMAKE_ARGS`"
+msgstr "`CMAKE_ARGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:423
+#, no-wrap
+msgid "Port specific CMake flags to be passed to the `cmake` binary."
+msgstr "Специфичные для порта флаги CMake, передаваемые в бинарный файл `cmake`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:424
+#, no-wrap
+msgid "`CMAKE_ON`"
+msgstr "`CMAKE_ON`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:427
+#, no-wrap
+msgid ""
+"For each entry in `CMAKE_ON`, an enabled boolean value is added to\n"
+"`CMAKE_ARGS`. See crossref:special[using-cmake-example2,`CMAKE_ON` and `CMAKE_OFF`]."
+msgstr ""
+"Для каждой записи в `CMAKE_ON` добавляется булево значение \"включено\" в\n"
+"`CMAKE_ARGS`. См. crossref:special[using-cmake-example2,`CMAKE_ON` и `CMAKE_OFF`]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:428
+#, no-wrap
+msgid "`CMAKE_OFF`"
+msgstr "`CMAKE_OFF`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:431
+#, no-wrap
+msgid ""
+"For each entry in `CMAKE_OFF`, a disabled boolean value is added to\n"
+"`CMAKE_ARGS`. See crossref:special[using-cmake-example2,`CMAKE_ON` and `CMAKE_OFF`]."
+msgstr ""
+"Для каждой записи в `CMAKE_OFF` в `CMAKE_ARGS` добавляется отключенное булево\n"
+"значение. См. crossref:special[using-cmake-example2,`CMAKE_ON` и `CMAKE_OFF`]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:432
+#, no-wrap
+msgid "`CMAKE_BUILD_TYPE`"
+msgstr "`CMAKE_BUILD_TYPE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:434
+#, no-wrap
+msgid "Type of build (CMake predefined build profiles). Default is `Release`, or `Debug` if `WITH_DEBUG` is set."
+msgstr "Тип сборки (предопределённые профили сборки CMake). По умолчанию `Release`, или `Debug`, если установлен `WITH_DEBUG`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:435
+#, no-wrap
+msgid "`CMAKE_SOURCE_PATH`"
+msgstr "`CMAKE_SOURCE_PATH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:437
+#, no-wrap
+msgid "Path to the source directory. Default is `${WRKSRC}`."
+msgstr "Путь к исходному каталогу. По умолчанию `${WRKSRC}`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:439
+#, no-wrap
+msgid "Additional environment variables to be set for the `cmake` binary."
+msgstr "Дополнительные переменные окружения, которые должны быть установлены для бинарного файла `cmake`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:442
+#, no-wrap
+msgid "Variables the Users Can Define for `cmake` Builds"
+msgstr "Переменные, которые пользователи могут определить для сборок `cmake`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:449
+#, no-wrap
+msgid "`CMAKE_NOCOLOR`"
+msgstr "`CMAKE_NOCOLOR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:450
+#, no-wrap
+msgid "Disables color build output. Default not set, unless `BATCH` or `PACKAGE_BUILDING` are set."
+msgstr "Запрещает цветной вывод сообщений при построении. Значение по умолчанию не задано, если не заданы `BATCH` или `PACKAGE_BUILDING`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:457
+msgid ""
+"CMake supports these build profiles: `Debug`, `Release`, `RelWithDebInfo` "
+"and `MinSizeRel`. `Debug` and `Release` profiles respect system `\\*FLAGS`, "
+"`RelWithDebInfo` and `MinSizeRel` will set `CFLAGS` to `-O2 -g` and `-Os "
+"-DNDEBUG` correspondingly. The lower-cased value of `CMAKE_BUILD_TYPE` is "
+"exported to `PLIST_SUB` and must be used if the port installs "
+"[.filename]#*.cmake# depending on the build type (see package:devel/kf5-"
+"kcrash[] for an example). Please note that some projects may define their "
+"own build profiles and/or force particular build type by setting "
+"`CMAKE_BUILD_TYPE` in [.filename]#CMakeLists.txt#. To make a port for such "
+"a project respect `CFLAGS` and `WITH_DEBUG`, the `CMAKE_BUILD_TYPE` "
+"definitions must be removed from those files."
+msgstr ""
+"CMake поддерживает следующие профили построения: `Debug`, `Release`, "
+"`RelWithDebInfo` и `MinSizeRel`. Профили `Debug` и `Release` учитывают "
+"системные флаги `\\*FLAGS`; `RelWithDebInfo` и `MinSizeRel` соответственно "
+"определяют `CFLAGS` со значением `-O2 -g` и `-Os -DNDEBUG`. Значение "
+"`CMAKE_BUILD_TYPE` экспортируется в нижнем регистре в `PLIST_SUB` и должно "
+"использоваться, если порт устанавливает файлы `*.cmake` в зависимости от "
+"типа построения (для примера посмотрите на package:deskutils/strigi[]). "
+"Следует учитывать, что некоторые проекты могут определять собственные "
+"профили построения и/или форсировать конкретный тип построения через "
+"установку `CMAKE_BUILD_TYPE` в файлах [.filename]#CMakeLists.txt#. Для того "
+"чтобы порт для такого проекта учитывал `CFLAGS` и `WITH_DEBUG`, из этих "
+"файлов должны быть удалены значения `CMAKE_BUILD_TYPE`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:462
+msgid ""
+"Most CMake-based projects support an out-of-source method of building. The "
+"out-of-source build for a port is the default setting. An in-source build "
+"can be requested by using the `:insource` suffix. With out-of-source "
+"builds, `CONFIGURE_WRKSRC`, `BUILD_WRKSRC` and `INSTALL_WRKSRC` will be set "
+"to `${WRKDIR}/.build` and this directory will be used to keep all files "
+"generated during configuration and build stages, leaving the source "
+"directory intact."
+msgstr ""
+"Большинство проектов, основанных на CMake, поддерживают метод внешнего (out-"
+"of-source) построения. Для порта внешнее построение можно запросить с "
+"использованием суффикса `:outsource`. В этом случае `CONFIGURE_WRKSRC`, "
+"`BUILD_WRKSRC` и `INSTALL_WRKSRC` будут иметь значение `${WRKDIR}/.build` "
+"для каталога, содержащего файлы, получаемые на этапах конфигурации и "
+"построения; при этом каталог с исходным кодом будет оставаться без изменений."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:464
+#, no-wrap
+msgid "`USES= cmake` Example"
+msgstr "Пример для `USES= cmake`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:469
+msgid ""
+"This snippet demonstrates the use of CMake for a port. `CMAKE_SOURCE_PATH` "
+"is not usually required, but can be set when the sources are not located in "
+"the top directory, or if only a subset of the project is intended to be "
+"built by the port."
+msgstr ""
+"Следующий отрывок демонстрирует использование CMake для порта. "
+"`CMAKE_SOURCE_PATH` обычно не требуется, но может быть установлен, когда "
+"исходный код не находится в верхнем каталоге или если порт используется для "
+"построения части проекта."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:474
+#, no-wrap
+msgid ""
+"USES=\t\t\tcmake\n"
+"CMAKE_SOURCE_PATH=\t${WRKSRC}/subproject\n"
+msgstr ""
+"USES=\t\t\tcmake\n"
+"CMAKE_SOURCE_PATH=\t${WRKSRC}/subproject\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:479
+#, no-wrap
+msgid "`CMAKE_ON` and `CMAKE_OFF`"
+msgstr "`CMAKE_ON` и `CMAKE_OFF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:483
+msgid ""
+"When adding boolean values to `CMAKE_ARGS`, it is easier to use the "
+"`CMAKE_ON` and `CMAKE_OFF` variables instead. This:"
+msgstr ""
+"При добавлении логических значений в `CMAKE_ARGS` проще использовать "
+"переменные `CMAKE_ON` и `CMAKE_OFF` вместо этого. Это:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:488
+#, no-wrap
+msgid ""
+"CMAKE_ON=\tVAR1 VAR2\n"
+"CMAKE_OFF=\tVAR3\n"
+msgstr ""
+"CMAKE_ON=\tVAR1 VAR2\n"
+"CMAKE_OFF=\tVAR3\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:491
+msgid "Is equivalent to:"
+msgstr "Эквивалентно:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:495
+#, no-wrap
+msgid "CMAKE_ARGS=\t-DVAR1:BOOL=TRUE -DVAR2:BOOL=TRUE -DVAR3:BOOL=FALSE\n"
+msgstr "CMAKE_ARGS=\t-DVAR1:BOOL=TRUE -DVAR2:BOOL=TRUE -DVAR3:BOOL=FALSE\n"
+
+#. type: delimited block = 6
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:501
+msgid ""
+"This is only for the default values off `CMAKE_ARGS`. The helpers described "
+"in crossref:makefiles[options-cmake_bool,`OPT_CMAKE_BOOL` and "
+"`OPT_CMAKE_BOOL_OFF`] use the same semantics, but for optional values."
+msgstr ""
+"Это относится только к значениям по умолчанию в `CMAKE_ARGS`. "
+"Вспомогательные функции, описанные в crossref:makefiles[options-"
+"cmake_bool,`OPT_CMAKE_BOOL` и `OPT_CMAKE_BOOL_OFF`], используют ту же "
+"семантику, но для опциональных значений."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:506
+#, no-wrap
+msgid "Using `scons`"
+msgstr "Использование `scons`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:509
+msgid "If the port uses SCons, define `USES=scons`."
+msgstr "Если порт использует SCons, определите `USES=scons`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:511
+msgid ""
+"To make third party [.filename]#SConstruct# respect everything that is "
+"passed to SCons in the environment (that is, most importantly, `CC/CXX/"
+"CFLAGS/CXXFLAGS`), patch [.filename]#SConstruct# so build `Environment` is "
+"constructed like this:"
+msgstr ""
+"Чтобы сторонний [.filename]#SConstruct# учитывал все, что передается в SCons "
+"через окружение (то есть, что наиболее важно, `CC/CXX/CFLAGS/CXXFLAGS`), "
+"исправьте [.filename]#SConstruct#, чтобы сборка `Environment` создавалась "
+"следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:515
+#, no-wrap
+msgid "env = Environment(**ARGUMENTS)\n"
+msgstr "env = Environment(**ARGUMENTS)\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:518
+msgid "It may be then modified with `env.Append` and `env.Replace`."
+msgstr "Он может быть изменён с помощью `env.Append` и `env.Replace`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:520
+#, no-wrap
+msgid "Building Rust Applications with `cargo`"
+msgstr "Сборка приложений на Rust с помощью `cargo`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:523
+msgid "For ports that use Cargo, define `USES=cargo`."
+msgstr "Для портов, использующих Cargo, определите `USES=cargo`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:525
+#, no-wrap
+msgid "Variables the Users Can Define for `cargo` Builds"
+msgstr "Переменные, которые пользователи могут определить для сборок `cargo`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:530
+#, no-wrap
+msgid "Default"
+msgstr "По умолчанию"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:532
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:814
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1733
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1901
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1919
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2087
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2153
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2397
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2414
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2451
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2471
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2547
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3127
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3791
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3825
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3868
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3894
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3998
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4168
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4220
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4312
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4404
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4466
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4726
+#, no-wrap
+msgid "Description"
+msgstr "Описание"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:533
+#, no-wrap
+msgid "`CARGO_CRATES`"
+msgstr "`CARGO_CRATES`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:539
+#, no-wrap
+msgid ""
+"List of crates the port depends on. Each entry needs to have a format like `cratename-semver` for example, `libc-0.2.40`. Port maintainers can generate this list from [.filename]#Cargo.lock# using `make cargo-crates`. Manually bumping crate versions is possible but be mindful of transitive dependencies.\n"
+"If the list generated by `make cargo-crates` is big, it might be convenient to place it inside a `Makefile.crates` file in the top-level port directory.\n"
+"If present, the ports framework sources that file automatically.\n"
+"This help keep the main port Makefile within a manageable size."
+msgstr ""
+"Список ящиков (crates), от которых зависит порт. Каждая запись должна быть в формате `имя_ящика-семвер`, например, `libc-0.2.40`. Поддерживающие порт могут сгенерировать этот список из файла [.filename]#Cargo.lock# с помощью команды `make cargo-crates`. Вручную обновлять версии ящиков возможно, но следует учитывать транзитивные зависимости.\n"
+"Если список, сгенерированный `make cargo-crates`, слишком велик, его можно разместить в файле `Makefile.crates` в корневом каталоге порта.\n"
+"Если такой файл присутствует, фреймворк портов автоматически загружает его.\n"
+"Это помогает сохранять основной Makefile порта в удобном для работы размере."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:540
+#, no-wrap
+msgid "`CARGO_FEATURES`"
+msgstr "`CARGO_FEATURES`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:543
+#, no-wrap
+msgid "List of application features to build (space separated list). To deactivate all default features add the special token `--no-default-features` to `CARGO_FEATURES`. Manually passing it to `CARGO_BUILD_ARGS`, `CARGO_INSTALL_ARGS`, and `CARGO_TEST_ARGS` is not needed."
+msgstr "Список функций приложения для сборки (список через пробел). Чтобы отключить все функции по умолчанию, добавьте специальный токен `--no-default-features` в `CARGO_FEATURES`. Вручную передавать его в `CARGO_BUILD_ARGS`, `CARGO_INSTALL_ARGS` и `CARGO_TEST_ARGS` не требуется."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:544
+#, no-wrap
+msgid "`CARGO_CARGOTOML`"
+msgstr "`CARGO_CARGOTOML`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:545
+#, no-wrap
+msgid "`${WRKSRC}/Cargo.toml`"
+msgstr "`${WRKSRC}/Cargo.toml`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:547
+#, no-wrap
+msgid "The path to the [.filename]#Cargo.toml# to use."
+msgstr "Путь к файлу [.filename]#Cargo.toml#, который следует использовать."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:548
+#, no-wrap
+msgid "`CARGO_CARGOLOCK`"
+msgstr "`CARGO_CARGOLOCK`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:549
+#, no-wrap
+msgid "`${WRKSRC}/Cargo.lock`"
+msgstr "`${WRKSRC}/Cargo.lock`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:551
+#, no-wrap
+msgid "The path to the [.filename]#Cargo.lock# to use for `make cargo-crates`. It is possible to specify more than one lock file when necessary."
+msgstr "Путь к файлу [.filename]#Cargo.lock#, используемому для `make cargo-crates`. Можно указать более одного файла блокировки, если это необходимо."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:552
+#, no-wrap
+msgid "`CARGO_ENV`"
+msgstr "`CARGO_ENV`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:555
+#, no-wrap
+msgid "A list of environment variables to pass to Cargo similar to `MAKE_ENV`."
+msgstr "Список переменных окружения, передаваемых в Cargo, аналогично `MAKE_ENV`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:556
+#, no-wrap
+msgid "`RUSTFLAGS`"
+msgstr "`RUSTFLAGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:559
+#, no-wrap
+msgid "Flags to pass to the Rust compiler."
+msgstr "Флаги для передачи компилятору Rust."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:560
+#, no-wrap
+msgid "`CARGO_CONFIGURE`"
+msgstr "`CARGO_CONFIGURE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:561
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:569
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:577
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:585
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:597
+#, no-wrap
+msgid "`yes`"
+msgstr "`yes`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:563
+#, no-wrap
+msgid "Use the default `do-configure`."
+msgstr "Используйте стандартный `do-configure`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:564
+#, no-wrap
+msgid "`CARGO_UPDATE_ARGS`"
+msgstr "`CARGO_UPDATE_ARGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:567
+#, no-wrap
+msgid "Extra arguments to pass to Cargo during the configure phase. Valid arguments can be looked up with `cargo update --help`."
+msgstr "Дополнительные аргументы для передачи Cargo во время фазы настройки. Допустимые аргументы можно посмотреть с помощью `cargo update --help`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:568
+#, no-wrap
+msgid "`CARGO_BUILDDEP`"
+msgstr "`CARGO_BUILDDEP`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:571
+#, no-wrap
+msgid "Add a build dependency on package:lang/rust[]."
+msgstr "Добавить зависимость сборки на package:lang/rust[]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:572
+#, no-wrap
+msgid "`CARGO_CARGO_BIN`"
+msgstr "`CARGO_CARGO_BIN`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:573
+#, no-wrap
+msgid "`${LOCALBASE}/bin/cargo`"
+msgstr "`${LOCALBASE}/bin/cargo`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:575
+#, no-wrap
+msgid "Location of the `cargo` binary."
+msgstr "Расположение бинарного файла `cargo`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:576
+#, no-wrap
+msgid "`CARGO_BUILD`"
+msgstr "`CARGO_BUILD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:579
+#, no-wrap
+msgid "Use the default `do-build`."
+msgstr "Используйте значение по умолчанию `do-build`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:580
+#, no-wrap
+msgid "`CARGO_BUILD_ARGS`"
+msgstr "`CARGO_BUILD_ARGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:583
+#, no-wrap
+msgid "Extra arguments to pass to Cargo during the build phase. Valid arguments can be looked up with `cargo build --help`."
+msgstr "Дополнительные аргументы для передачи Cargo во время фазы сборки. Допустимые аргументы можно посмотреть с помощью `cargo build --help`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:584
+#, no-wrap
+msgid "`CARGO_INSTALL`"
+msgstr "`CARGO_INSTALL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:587
+#, no-wrap
+msgid "Use the default `do-install`."
+msgstr "Используйте настройку `do-install` по умолчанию."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:588
+#, no-wrap
+msgid "`CARGO_INSTALL_ARGS`"
+msgstr "`CARGO_INSTALL_ARGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:591
+#, no-wrap
+msgid "Extra arguments to pass to Cargo during the install phase. Valid arguments can be looked up with `cargo install --help`."
+msgstr "Дополнительные аргументы для передачи Cargo во время фазы установки. Допустимые аргументы можно посмотреть с помощью `cargo install --help`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:592
+#, no-wrap
+msgid "`CARGO_INSTALL_PATH`"
+msgstr "`CARGO_INSTALL_PATH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:593
+#, no-wrap
+msgid "`.`"
+msgstr "`.`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:595
+#, no-wrap
+msgid "Path to the crate to install. This is passed to `cargo install` via its `--path` argument. When multiple paths are specified `cargo install` is run multiple times."
+msgstr "Путь к пакету для установки. Этот аргумент передается в `cargo install` через параметр `--path`. Если указано несколько путей, `cargo install` запускается несколько раз."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:596
+#, no-wrap
+msgid "`CARGO_TEST`"
+msgstr "`CARGO_TEST`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:599
+#, no-wrap
+msgid "Use the default `do-test`."
+msgstr "Используйте значение по умолчанию `do-test`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:600
+#, no-wrap
+msgid "`CARGO_TEST_ARGS`"
+msgstr "`CARGO_TEST_ARGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:603
+#, no-wrap
+msgid "Extra arguments to pass to Cargo during the test phase. Valid arguments can be looked up with `cargo test --help`."
+msgstr "Дополнительные аргументы для передачи Cargo во время тестовой фазы. Допустимые аргументы можно посмотреть с помощью `cargo test --help`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:604
+#, no-wrap
+msgid "`CARGO_TARGET_DIR`"
+msgstr "`CARGO_TARGET_DIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:605
+#, no-wrap
+msgid "`${WRKDIR}/target`"
+msgstr "`${WRKDIR}/target`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:607
+#, no-wrap
+msgid "Location of the cargo output directory."
+msgstr "Расположение выходного каталога cargo."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:608
+#, no-wrap
+msgid "`CARGO_DIST_SUBDIR`"
+msgstr "`CARGO_DIST_SUBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:609
+#, no-wrap
+msgid "[.filename]#rust/crates#"
+msgstr "[.filename]#rust/crates#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:611
+#, no-wrap
+msgid "Directory relative to `DISTDIR` where the crate distribution files will be stored."
+msgstr "Каталог относительно `DISTDIR`, в котором будут храниться файлы дистрибутивов пакетов (crates)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:612
+#, no-wrap
+msgid "`CARGO_VENDOR_DIR`"
+msgstr "`CARGO_VENDOR_DIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:613
+#, no-wrap
+msgid "`${WRKSRC}/cargo-crates`"
+msgstr "`${WRKSRC}/cargo-crates`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:615
+#, no-wrap
+msgid "Location of the vendor directory where all crates will be extracted to. Try to keep this under `PATCH_WRKSRC`, so that patches can be applied easily."
+msgstr "Расположение каталога сторонних поставщиков ПО, в который будут извлечены все крейты. Старайтесь держать его в пределах `PATCH_WRKSRC`, чтобы упростить применение патчей."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:616
+#, no-wrap
+msgid "`CARGO_USE_GITHUB`"
+msgstr "`CARGO_USE_GITHUB`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:617
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:621
+#, no-wrap
+msgid "`no`"
+msgstr "`no`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:619
+#, no-wrap
+msgid "Enable fetching of crates locked to specific Git commits on GitHub via `GH_TUPLE`. This will try to patch all [.filename]#Cargo.toml# under `WRKDIR` to point to the offline sources instead of fetching them from a Git repository during the build."
+msgstr "Включить загрузку крейтов, привязанных к определённым коммитам Git на GitHub, с помощью `GH_TUPLE`. Это попытается исправить все файлы [.filename]#Cargo.toml# в `WRKDIR`, чтобы они ссылались на автономные источники вместо загрузки из репозитория Git во время сборки."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:620
+#, no-wrap
+msgid "`CARGO_USE_GITLAB`"
+msgstr "`CARGO_USE_GITLAB`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:622
+#, no-wrap
+msgid "Same as `CARGO_USE_GITHUB` but for GitLab instances and `GL_TUPLE`."
+msgstr "То же, что и `CARGO_USE_GITHUB`, но для экземпляров GitLab и `GL_TUPLE`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:625
+#, no-wrap
+msgid "Creating a Port for a Simple Rust Application"
+msgstr "Создание порта для простого приложения на Rust"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:630
+msgid ""
+"Creating a Cargo based port is a three stage process. First we need to "
+"provide a ports template that fetches the application distribution file:"
+msgstr ""
+"Создание порта на основе Cargo — это процесс из трёх этапов. Сначала "
+"необходимо предоставить шаблон портов, который загружает дистрибутивный файл "
+"приложения:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:637
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:682
+#, no-wrap
+msgid ""
+"PORTNAME=\ttokei\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION=\t7.0.2\n"
+"CATEGORIES=\tdevel\n"
+msgstr ""
+"PORTNAME=\ttokei\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION=\t7.0.2\n"
+"CATEGORIES=\tdevel\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:641
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:686
+#, no-wrap
+msgid ""
+"MAINTAINER=\ttobik@FreeBSD.org\n"
+"COMMENT=\tDisplay statistics about your code\n"
+"WWW=\t\thttps://github.com/XAMPPRocky/tokei/\n"
+msgstr ""
+"MAINTAINER=\ttobik@FreeBSD.org\n"
+"COMMENT=\tDisplay statistics about your code\n"
+"WWW=\t\thttps://github.com/XAMPPRocky/tokei/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:645
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:690
+#, no-wrap
+msgid ""
+"USES=\t\tcargo\n"
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tAaronepower\n"
+msgstr ""
+"USES=\t\tcargo\n"
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tAaronepower\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:647
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:700
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:867
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:890
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:948
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1019
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1106
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1122
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1136
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1253
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1274
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1647
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3475
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3535
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3651
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4252
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4276
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4514
+#, no-wrap
+msgid ".include <bsd.port.mk>\n"
+msgstr ".include <bsd.port.mk>\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:650
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:893
+msgid "Generate an initial [.filename]#distinfo#:"
+msgstr "Сгенерировать первоначальный [.filename]#distinfo#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:658
+#, no-wrap
+msgid ""
+"% make makesum\n"
+"=> Aaronepower-tokei-v7.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz\n"
+"fetch: https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz: size of remote file is not known\n"
+"Aaronepower-tokei-v7.0.2_GH0.tar.gz 45 kB 239 kBps 00m00s\n"
+msgstr ""
+"% make makesum\n"
+"=> Aaronepower-tokei-v7.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz\n"
+"fetch: https://codeload.github.com/Aaronepower/tokei/tar.gz/v7.0.2?dummy=/Aaronepower-tokei-v7.0.2_GH0.tar.gz: size of remote file is not known\n"
+"Aaronepower-tokei-v7.0.2_GH0.tar.gz 45 kB 239 kBps 00m00s\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:661
+msgid ""
+"Now the distribution file is ready to use and we can go ahead and extract "
+"crate dependencies from the bundled [.filename]#Cargo.lock#:"
+msgstr ""
+"Теперь файл дистрибутива готов к использованию, и мы можем продолжить, "
+"извлекая зависимости пакета из встроенного файла [.filename]#Cargo.lock#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:672
+#, no-wrap
+msgid ""
+"% make cargo-crates\n"
+"CARGO_CRATES= aho-corasick-0.6.4 \\\n"
+" ansi_term-0.11.0 \\\n"
+" arrayvec-0.4.7 \\\n"
+" atty-0.2.9 \\\n"
+" bitflags-1.0.1 \\\n"
+" byteorder-1.2.2 \\\n"
+" [...]\n"
+msgstr ""
+"% make cargo-crates\n"
+"CARGO_CRATES= aho-corasick-0.6.4 \\\n"
+" ansi_term-0.11.0 \\\n"
+" arrayvec-0.4.7 \\\n"
+" atty-0.2.9 \\\n"
+" bitflags-1.0.1 \\\n"
+" byteorder-1.2.2 \\\n"
+" [...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:675
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:923
+msgid ""
+"The output of this command needs to be pasted directly into the Makefile:"
+msgstr "Вывод этой команды необходимо вставить напрямую в Makefile:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:698
+#, no-wrap
+msgid ""
+"CARGO_CRATES= aho-corasick-0.6.4 \\\n"
+" ansi_term-0.11.0 \\\n"
+" arrayvec-0.4.7 \\\n"
+" atty-0.2.9 \\\n"
+" bitflags-1.0.1 \\\n"
+" byteorder-1.2.2 \\\n"
+" [...]\n"
+msgstr ""
+"CARGO_CRATES= aho-corasick-0.6.4 \\\n"
+" ansi_term-0.11.0 \\\n"
+" arrayvec-0.4.7 \\\n"
+" atty-0.2.9 \\\n"
+" bitflags-1.0.1 \\\n"
+" byteorder-1.2.2 \\\n"
+" [...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:703
+msgid ""
+"[.filename]#distinfo# needs to be regenerated to contain all the crate "
+"distribution files:"
+msgstr ""
+"[.filename]#distinfo# необходимо перегенерировать, чтобы включить все "
+"дистрибутивные файлы крейтов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:721
+#, no-wrap
+msgid ""
+"% make makesum\n"
+"=> rust/crates/aho-corasick-0.6.4.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://crates.io/api/v1/crates/aho-corasick/0.6.4/download?dummy=/rust/crates/aho-corasick-0.6.4.tar.gz\n"
+"rust/crates/aho-corasick-0.6.4.tar.gz 100% of 24 kB 6139 kBps 00m00s\n"
+"=> rust/crates/ansi_term-0.11.0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://crates.io/api/v1/crates/ansi_term/0.11.0/download?dummy=/rust/crates/ansi_term-0.11.0.tar.gz\n"
+"rust/crates/ansi_term-0.11.0.tar.gz 100% of 16 kB 21 MBps 00m00s\n"
+"=> rust/crates/arrayvec-0.4.7.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://crates.io/api/v1/crates/arrayvec/0.4.7/download?dummy=/rust/crates/arrayvec-0.4.7.tar.gz\n"
+"rust/crates/arrayvec-0.4.7.tar.gz 100% of 22 kB 3237 kBps 00m00s\n"
+"=> rust/crates/atty-0.2.9.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://crates.io/api/v1/crates/atty/0.2.9/download?dummy=/rust/crates/atty-0.2.9.tar.gz\n"
+"rust/crates/atty-0.2.9.tar.gz 100% of 5898 B 81 MBps 00m00s\n"
+"=> rust/crates/bitflags-1.0.1.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"[...]\n"
+msgstr ""
+"% make makesum\n"
+"=> rust/crates/aho-corasick-0.6.4.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://crates.io/api/v1/crates/aho-corasick/0.6.4/download?dummy=/rust/crates/aho-corasick-0.6.4.tar.gz\n"
+"rust/crates/aho-corasick-0.6.4.tar.gz 100% of 24 kB 6139 kBps 00m00s\n"
+"=> rust/crates/ansi_term-0.11.0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://crates.io/api/v1/crates/ansi_term/0.11.0/download?dummy=/rust/crates/ansi_term-0.11.0.tar.gz\n"
+"rust/crates/ansi_term-0.11.0.tar.gz 100% of 16 kB 21 MBps 00m00s\n"
+"=> rust/crates/arrayvec-0.4.7.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://crates.io/api/v1/crates/arrayvec/0.4.7/download?dummy=/rust/crates/arrayvec-0.4.7.tar.gz\n"
+"rust/crates/arrayvec-0.4.7.tar.gz 100% of 22 kB 3237 kBps 00m00s\n"
+"=> rust/crates/atty-0.2.9.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://crates.io/api/v1/crates/atty/0.2.9/download?dummy=/rust/crates/atty-0.2.9.tar.gz\n"
+"rust/crates/atty-0.2.9.tar.gz 100% of 5898 B 81 MBps 00m00s\n"
+"=> rust/crates/bitflags-1.0.1.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"[...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:724
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:967
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1079
+msgid ""
+"The port is now ready for a test build and further adjustments like creating "
+"a plist, writing a description, adding license information, options, etc. as "
+"normal."
+msgstr ""
+"Порт теперь готов к тестовой сборке и дальнейшим настройкам, таким как "
+"создание plist, написание описания, добавление информации о лицензии, опций "
+"и т.д., как обычно."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:726
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:969
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1081
+msgid ""
+"If you are not testing your port in a clean environment like with poudriere, "
+"remember to run `make clean` before any testing."
+msgstr ""
+"Если вы не тестируете свой порт в чистой среде, например, с использованием "
+"poudriere, не забудьте выполнить `make clean` перед любым тестированием."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:729
+#, no-wrap
+msgid "Enabling Additional Application Features"
+msgstr "Включение дополнительных возможностей приложений"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:734
+msgid ""
+"Some applications define additional features in their "
+"[.filename]#Cargo.toml#. They can be compiled in by setting "
+"`CARGO_FEATURES` in the port."
+msgstr ""
+"Некоторые приложения определяют дополнительные возможности в своем "
+"[.filename]#Cargo.toml#. Их можно включить при компиляции, установив "
+"`CARGO_FEATURES` в порте."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:736
+msgid "Here we enable Tokei's `json` and `yaml` features:"
+msgstr "Здесь мы включаем функции `json` и `yaml` в Tokei:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:740
+#, no-wrap
+msgid "CARGO_FEATURES=\tjson yaml\n"
+msgstr "CARGO_FEATURES=\tjson yaml\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:745
+#, no-wrap
+msgid "Encoding Application Features As Port Options"
+msgstr "Кодирование характеристик приложений как параметров порта"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:749
+msgid ""
+"An example `[features]` section in [.filename]#Cargo.toml# could look like "
+"this:"
+msgstr ""
+"Пример раздела `[features]` в [.filename]#Cargo.toml# может выглядеть так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:756
+#, no-wrap
+msgid ""
+"[features]\n"
+"pulseaudio_backend = [\"librespot-playback/pulseaudio-backend\"]\n"
+"portaudio_backend = [\"librespot-playback/portaudio-backend\"]\n"
+"default = [\"pulseaudio_backend\"]\n"
+msgstr ""
+"[features]\n"
+"pulseaudio_backend = [\"librespot-playback/pulseaudio-backend\"]\n"
+"portaudio_backend = [\"librespot-playback/portaudio-backend\"]\n"
+"default = [\"pulseaudio_backend\"]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:761
+msgid ""
+"`pulseaudio_backend` is a default feature. It is always enabled unless we "
+"explicitly turn off default features by adding `--no-default-features` to "
+"`CARGO_FEATURES`. Here we turn the `portaudio_backend` and "
+"`pulseaudio_backend` features into port options:"
+msgstr ""
+"`pulseaudio_backend` — это функция по умолчанию. Она всегда включена, если "
+"мы явно не отключим функции по умолчанию, добавив `--no-default-features` в "
+"`CARGO_FEATURES`. Здесь мы превращаем функции `portaudio_backend` и "
+"`pulseaudio_backend` в опции порта:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:765
+#, no-wrap
+msgid "CARGO_FEATURES=\t--no-default-features\n"
+msgstr "CARGO_FEATURES=\t--no-default-features\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:767
+#, no-wrap
+msgid "OPTIONS_DEFINE=\tPORTAUDIO PULSEAUDIO\n"
+msgstr "OPTIONS_DEFINE=\tPORTAUDIO PULSEAUDIO\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:770
+#, no-wrap
+msgid ""
+"PORTAUDIO_VARS=\t\tCARGO_FEATURES+=portaudio_backend\n"
+"PULSEAUDIO_VARS=\tCARGO_FEATURES+=pulseaudio_backend\n"
+msgstr ""
+"PORTAUDIO_VARS=\t\tCARGO_FEATURES+=portaudio_backend\n"
+"PULSEAUDIO_VARS=\tCARGO_FEATURES+=pulseaudio_backend\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:775
+#, no-wrap
+msgid "Listing Crate Licenses"
+msgstr "Перечисление лицензий крейтов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:781
+msgid ""
+"Crates have their own licenses. It is important to know what they are when "
+"adding a `LICENSE` block to the port (see "
+"crossref:makefiles[licenses,Licenses]). The helper target `cargo-crates-"
+"licenses` will try to list all the licenses of all crates defined in "
+"`CARGO_CRATES`."
+msgstr ""
+"Крейты имеют собственные лицензии. Важно знать, какие они, при добавлении "
+"блока `LICENSE` в порт (см. crossref:makefiles[licenses,Лицензии]). "
+"Вспомогательная цель `cargo-crates-licenses` попытается перечислить все "
+"лицензии всех ящиков, определённых в `CARGO_CRATES`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:792
+#, no-wrap
+msgid ""
+"% make cargo-crates-licenses\n"
+"aho-corasick-0.6.4 Unlicense/MIT\n"
+"ansi_term-0.11.0 MIT\n"
+"arrayvec-0.4.7 MIT/Apache-2.0\n"
+"atty-0.2.9 MIT\n"
+"bitflags-1.0.1 MIT/Apache-2.0\n"
+"byteorder-1.2.2 Unlicense/MIT\n"
+"[...]\n"
+msgstr ""
+"% make cargo-crates-licenses\n"
+"aho-corasick-0.6.4 Unlicense/MIT\n"
+"ansi_term-0.11.0 MIT\n"
+"arrayvec-0.4.7 MIT/Apache-2.0\n"
+"atty-0.2.9 MIT\n"
+"bitflags-1.0.1 MIT/Apache-2.0\n"
+"byteorder-1.2.2 Unlicense/MIT\n"
+"[...]\n"
+
+#. type: delimited block = 6
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:798
+msgid ""
+"The license names `make cargo-crates-licenses` outputs are SPDX 2.1 licenses "
+"expression which do not match the license names defined in the ports "
+"framework. They need to be translated to the names from "
+"crossref:makefiles[licenses-license-list,Predefined License List]."
+msgstr ""
+"Названия лицензий, которые выводит `make cargo-crates-licenses`, являются "
+"SPDX 2.1-совместимыми лицензионными выражениями, которые не совпадают с "
+"названиями лицензий, определёнными в фреймворке портов. Их необходимо "
+"перевести в названия из crossref:makefiles[licenses-license-list,Списка "
+"предопределённых лицензий]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:803
+#, no-wrap
+msgid "Using `meson`"
+msgstr "Использование `meson`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:806
+msgid "For ports that use Meson, define `USES=meson`."
+msgstr "Для портов, использующих Meson, определите `USES=meson`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:808
+#, no-wrap
+msgid "Variables for Ports That Use `meson`"
+msgstr "Переменные для портов, использующих `meson`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:815
+#, no-wrap
+msgid "`MESON_ARGS`"
+msgstr "`MESON_ARGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:817
+#, no-wrap
+msgid "Port specific Meson flags to be passed to the `meson` binary."
+msgstr "Порт-специфичные флаги Meson, передаваемые в бинарный файл `meson`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:818
+#, no-wrap
+msgid "`MESON_BUILD_DIR`"
+msgstr "`MESON_BUILD_DIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:819
+#, no-wrap
+msgid "Path to the build directory relative to `WRKSRC`. Default is `_build`."
+msgstr "Путь к директории сборки относительно `WRKSRC`. По умолчанию — `_build`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:822
+#, no-wrap
+msgid "`USES=meson` Example"
+msgstr "Пример `USES=meson`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:826
+msgid "This snippet demonstrates the use of Meson for a port."
+msgstr "Этот фрагмент демонстрирует использование Meson для порта."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:831
+#, no-wrap
+msgid ""
+"USES=\t\tmeson\n"
+"MESON_ARGS=\t-Dfoo=enabled\n"
+msgstr ""
+"USES=\t\tmeson\n"
+"MESON_ARGS=\t-Dfoo=enabled\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:836
+#, no-wrap
+msgid "Building Go Applications"
+msgstr "Создание приложений на Go"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:840
+msgid ""
+"For ports that use Go, define `USES=go`. Refer to crossref:uses[uses-"
+"go,`go`] for a list of variables that can be set to control the build "
+"process."
+msgstr ""
+"Для портов, использующих Go, определите `USES=go`. Обратитесь к "
+"crossref:uses[uses-go,`go`] для получения списка переменных, которые можно "
+"задать для управления процессом сборки."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:842
+#, no-wrap
+msgid "Creating a Port for a Go Modules Based Application"
+msgstr "Создание порта для приложения на основе модулей Go"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:846
+msgid ""
+"In most cases, it is sufficient to set the `GO_MODULE` variable to the value "
+"specified by the `module` directive in `go.mod`:"
+msgstr ""
+"В большинстве случаев достаточно установить переменную `GO_MODULE` в "
+"значение, указанное директивой `module` в `go.mod`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:853
+#, no-wrap
+msgid ""
+"PORTNAME= hey\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION= 0.1.4\n"
+"CATEGORIES= benchmarks\n"
+msgstr ""
+"PORTNAME= hey\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION= 0.1.4\n"
+"CATEGORIES= benchmarks\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:857
+#, no-wrap
+msgid ""
+"MAINTAINER= dmgk@FreeBSD.org\n"
+"COMMENT= Tiny program that sends some load to a web application\n"
+"WWW= https://github.com/rakyll/hey/\n"
+msgstr ""
+"MAINTAINER= dmgk@FreeBSD.org\n"
+"COMMENT= Tiny program that sends some load to a web application\n"
+"WWW= https://github.com/rakyll/hey/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:860
+#, no-wrap
+msgid ""
+"LICENSE= APACHE20\n"
+"LICENSE_FILE= ${WRKSRC}/LICENSE\n"
+msgstr ""
+"LICENSE= APACHE20\n"
+"LICENSE_FILE= ${WRKSRC}/LICENSE\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:863
+#, no-wrap
+msgid ""
+"USES= go:modules\n"
+"GO_MODULE= github.com/rakyll/hey\n"
+msgstr ""
+"USES= go:modules\n"
+"GO_MODULE= github.com/rakyll/hey\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:865
+#, no-wrap
+msgid "PLIST_FILES= bin/hey\n"
+msgstr "PLIST_FILES= bin/hey\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:870
+msgid ""
+"If the \"easy\" way is not adequate or more control over dependencies is "
+"needed, the full porting process is described below."
+msgstr ""
+"Если «простой» способ не подходит или требуется больший контроль над "
+"зависимостями, полный процесс переноса описан ниже."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:873
+msgid ""
+"Creating a Go-based port is a five-stage process. First we need to provide "
+"a ports template that fetches the application distribution file:"
+msgstr ""
+"Создание порта на основе Go — это процесс из пяти этапов. Сначала необходимо "
+"предоставить шаблон портов, который загружает дистрибутивный файл приложения:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:880
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:930
+#, no-wrap
+msgid ""
+"PORTNAME=\tghq\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION=\t0.12.5\n"
+"CATEGORIES=\tdevel\n"
+msgstr ""
+"PORTNAME=\tghq\n"
+"DISTVERSIONPREFIX=\tv\n"
+"DISTVERSION=\t0.12.5\n"
+"CATEGORIES=\tdevel\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:884
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:934
+#, no-wrap
+msgid ""
+"MAINTAINER=\ttobik@FreeBSD.org\n"
+"COMMENT=\tRemote repository management made easy\n"
+"WWW=\t\thttps://github.com/x-motemen/ghq/\n"
+msgstr ""
+"MAINTAINER=\ttobik@FreeBSD.org\n"
+"COMMENT=\tRemote repository management made easy\n"
+"WWW=\t\thttps://github.com/x-motemen/ghq/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:888
+#, no-wrap
+msgid ""
+"USES=\t\tgo:modules\n"
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tmotemen\n"
+msgstr ""
+"USES=\t\tgo:modules\n"
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tmotemen\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:902
+#, no-wrap
+msgid ""
+"% make makesum\n"
+"===> License MIT accepted by the user\n"
+"=> motemen-ghq-v0.12.5_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz\n"
+"fetch: https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz: size of remote file is not known\n"
+"motemen-ghq-v0.12.5_GH0.tar.gz 32 kB 177 kBps 00s\n"
+msgstr ""
+"% make makesum\n"
+"===> License MIT accepted by the user\n"
+"=> motemen-ghq-v0.12.5_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz\n"
+"fetch: https://codeload.github.com/motemen/ghq/tar.gz/v0.12.5?dummy=/motemen-ghq-v0.12.5_GH0.tar.gz: size of remote file is not known\n"
+"motemen-ghq-v0.12.5_GH0.tar.gz 32 kB 177 kBps 00s\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:906
+msgid ""
+"Now the distribution file is ready to use and we can extract the required Go "
+"module dependencies. This step requires having package:ports-mgmt/"
+"modules2tuple[] installed:"
+msgstr ""
+"Теперь файл дистрибутива готов к использованию, и мы можем извлечь "
+"необходимые зависимости модуля Go. Этот шаг требует наличия установленного "
+"пакета package:ports-mgmt/modules2tuple[]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:920
+#, no-wrap
+msgid ""
+"% make gomod-vendor\n"
+"[...]\n"
+"GH_TUPLE=\t\\\n"
+"\t\tSongmu:gitconfig:v0.0.2:songmu_gitconfig/vendor/github.com/Songmu/gitconfig \\\n"
+"\t\tdaviddengcn:go-colortext:186a3d44e920:daviddengcn_go_colortext/vendor/github.com/daviddengcn/go-colortext \\\n"
+"\t\tgo-yaml:yaml:v2.2.2:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \\\n"
+"\t\tgolang:net:3ec191127204:golang_net/vendor/golang.org/x/net \\\n"
+"\t\tgolang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \\\n"
+"\t\tgolang:xerrors:3ee3066db522:golang_xerrors/vendor/golang.org/x/xerrors \\\n"
+"\t\tmotemen:go-colorine:45d19169413a:motemen_go_colorine/vendor/github.com/motemen/go-colorine \\\n"
+"\t\turfave:cli:v1.20.0:urfave_cli/vendor/github.com/urfave/cli\n"
+msgstr ""
+"% make gomod-vendor\n"
+"[...]\n"
+"GH_TUPLE=\t\\\n"
+"\t\tSongmu:gitconfig:v0.0.2:songmu_gitconfig/vendor/github.com/Songmu/gitconfig \\\n"
+"\t\tdaviddengcn:go-colortext:186a3d44e920:daviddengcn_go_colortext/vendor/github.com/daviddengcn/go-colortext \\\n"
+"\t\tgo-yaml:yaml:v2.2.2:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \\\n"
+"\t\tgolang:net:3ec191127204:golang_net/vendor/golang.org/x/net \\\n"
+"\t\tgolang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \\\n"
+"\t\tgolang:xerrors:3ee3066db522:golang_xerrors/vendor/golang.org/x/xerrors \\\n"
+"\t\tmotemen:go-colorine:45d19169413a:motemen_go_colorine/vendor/github.com/motemen/go-colorine \\\n"
+"\t\turfave:cli:v1.20.0:urfave_cli/vendor/github.com/urfave/cli\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:946
+#, no-wrap
+msgid ""
+"USES=\t\tgo:modules\n"
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tmotemen\n"
+"GH_TUPLE=\tSongmu:gitconfig:v0.0.2:songmu_gitconfig/vendor/github.com/Songmu/gitconfig \\\n"
+"\t\tdaviddengcn:go-colortext:186a3d44e920:daviddengcn_go_colortext/vendor/github.com/daviddengcn/go-colortext \\\n"
+"\t\tgo-yaml:yaml:v2.2.2:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \\\n"
+"\t\tgolang:net:3ec191127204:golang_net/vendor/golang.org/x/net \\\n"
+"\t\tgolang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \\\n"
+"\t\tgolang:xerrors:3ee3066db522:golang_xerrors/vendor/golang.org/x/xerrors \\\n"
+"\t\tmotemen:go-colorine:45d19169413a:motemen_go_colorine/vendor/github.com/motemen/go-colorine \\\n"
+"\t\turfave:cli:v1.20.0:urfave_cli/vendor/github.com/urfave/cli\n"
+msgstr ""
+"USES=\t\tgo:modules\n"
+"USE_GITHUB=\tyes\n"
+"GH_ACCOUNT=\tmotemen\n"
+"GH_TUPLE=\tSongmu:gitconfig:v0.0.2:songmu_gitconfig/vendor/github.com/Songmu/gitconfig \\\n"
+"\t\tdaviddengcn:go-colortext:186a3d44e920:daviddengcn_go_colortext/vendor/github.com/daviddengcn/go-colortext \\\n"
+"\t\tgo-yaml:yaml:v2.2.2:go_yaml_yaml/vendor/gopkg.in/yaml.v2 \\\n"
+"\t\tgolang:net:3ec191127204:golang_net/vendor/golang.org/x/net \\\n"
+"\t\tgolang:sync:112230192c58:golang_sync/vendor/golang.org/x/sync \\\n"
+"\t\tgolang:xerrors:3ee3066db522:golang_xerrors/vendor/golang.org/x/xerrors \\\n"
+"\t\tmotemen:go-colorine:45d19169413a:motemen_go_colorine/vendor/github.com/motemen/go-colorine \\\n"
+"\t\turfave:cli:v1.20.0:urfave_cli/vendor/github.com/urfave/cli\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:951
+msgid ""
+"[.filename]#distinfo# needs to be regenerated to contain all the "
+"distribution files:"
+msgstr ""
+"[.filename]#distinfo# необходимо обновить, чтобы включить все дистрибутивные "
+"файлы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:964
+#, no-wrap
+msgid ""
+"% make makesum\n"
+"=> Songmu-gitconfig-v0.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz\n"
+"fetch: https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz: size of remote file is not known\n"
+"Songmu-gitconfig-v0.0.2_GH0.tar.gz 5662 B 936 kBps 00s\n"
+"=> daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz\n"
+"fetch: https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz: size of remote file is not known\n"
+"daviddengcn-go-colortext-186a3d44e920_GH0.tar. 4534 B 1098 kBps 00s\n"
+"[...]\n"
+msgstr ""
+"% make makesum\n"
+"=> Songmu-gitconfig-v0.0.2_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz\n"
+"fetch: https://codeload.github.com/Songmu/gitconfig/tar.gz/v0.0.2?dummy=/Songmu-gitconfig-v0.0.2_GH0.tar.gz: size of remote file is not known\n"
+"Songmu-gitconfig-v0.0.2_GH0.tar.gz 5662 B 936 kBps 00s\n"
+"=> daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz doesn't seem to exist in /usr/ports/distfiles/.\n"
+"=> Attempting to fetch https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz\n"
+"fetch: https://codeload.github.com/daviddengcn/go-colortext/tar.gz/186a3d44e920?dummy=/daviddengcn-go-colortext-186a3d44e920_GH0.tar.gz: size of remote file is not known\n"
+"daviddengcn-go-colortext-186a3d44e920_GH0.tar. 4534 B 1098 kBps 00s\n"
+"[...]\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:972
+#, no-wrap
+msgid "Setting Output Binary Name or Installation Path"
+msgstr "Установка имени выходного бинарного файла или пути установки"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:977
+msgid ""
+"Some ports need to install the resulting binary under a different name or to "
+"a path other than the default `${PREFIX}/bin`. This can be done by using "
+"`GO_TARGET` tuple syntax, for example:"
+msgstr ""
+"Некоторые порты требуют установки результирующего бинарного файла под другим "
+"именем или в путь, отличный от стандартного `${PREFIX}/bin`. Это можно "
+"сделать с помощью синтаксиса кортежа `GO_TARGET`, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:981
+#, no-wrap
+msgid "GO_TARGET= ./cmd/ipfs:ipfs-go\n"
+msgstr "GO_TARGET= ./cmd/ipfs:ipfs-go\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:984
+msgid "will install `ipfs` binary as `${PREFIX}/bin/ipfs-go` and"
+msgstr "установит бинарный файл `ipfs` как `${PREFIX}/bin/ipfs-go` и"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:988
+#, no-wrap
+msgid "GO_TARGET= ./dnscrypt-proxy:${PREFIX}/sbin/dnscrypt-proxy\n"
+msgstr "GO_TARGET= ./dnscrypt-proxy:${PREFIX}/sbin/dnscrypt-proxy\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:991
+msgid "will install `dnscrypt-proxy` to `${PREFIX}/sbin`."
+msgstr "установит `dnscrypt-proxy` в `${PREFIX}/sbin`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:994
+#, no-wrap
+msgid "Building Haskell Applications with `cabal`"
+msgstr "Построение приложений на Haskell с помощью `cabal`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:998
+msgid ""
+"For ports that use Cabal, build system defines `USES=cabal`. Refer to "
+"crossref:uses[uses-cabal,`cabal`] for a list of variables that can be set to "
+"control the build process."
+msgstr ""
+"Для портов, использующих Cabal, система сборки определяет `USES=cabal`. "
+"Обратитесь к crossref:uses[uses-cabal,`cabal`] для получения списка "
+"переменных, которые можно задать для управления процессом сборки."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1000
+#, no-wrap
+msgid "Creating a Port for a Hackage-hosted Haskell Application"
+msgstr "Создание порта для приложения Haskell с Hackage"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1005
+msgid ""
+"When preparing a Haskell Cabal port, package:devel/hs-cabal-install[] and "
+"package:ports-mgmt/hs-cabal2tuple[] programs are required, so make sure they "
+"are installed beforehand. First we need to define common ports variables "
+"that allow cabal-install to fetch the package distribution file:"
+msgstr ""
+"При подготовке порта Haskell Cabal требуются программы package:devel/hs-"
+"cabal-install[] и package:ports-mgmt/hs-cabal2tuple[], поэтому убедитесь, "
+"что они установлены заранее. Сначала необходимо определить общие переменные "
+"портов, которые позволяют cabal-install загрузить файл дистрибутива пакета:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1011
+#, no-wrap
+msgid ""
+"PORTNAME=\tShellCheck\n"
+"DISTVERSION=\t0.6.0\n"
+"CATEGORIES=\tdevel\n"
+msgstr ""
+"PORTNAME=\tShellCheck\n"
+"DISTVERSION=\t0.6.0\n"
+"CATEGORIES=\tdevel\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1015
+#, no-wrap
+msgid ""
+"MAINTAINER=\thaskell@FreeBSD.org\n"
+"COMMENT=\tShell script analysis tool\n"
+"WWW=\t\thttps://www.shellcheck.net/\n"
+msgstr ""
+"MAINTAINER=\thaskell@FreeBSD.org\n"
+"COMMENT=\tShell script analysis tool\n"
+"WWW=\t\thttps://www.shellcheck.net/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1017
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1100
+#, no-wrap
+msgid "USES=\t\tcabal\n"
+msgstr "USES=\t\tcabal\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1022
+msgid ""
+"This minimal Makefile fetches the distribution file with the `cabal-extract` "
+"helper target:"
+msgstr ""
+"Этот минимальный Makefile загружает файл дистрибутива с помощью "
+"вспомогательной цели `cabal-extract`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1032
+#, no-wrap
+msgid ""
+"% make cabal-extract\n"
+"[...]\n"
+"Downloading the latest package list from hackage.haskell.org\n"
+"cabal get ShellCheck-0.6.0\n"
+"Downloading ShellCheck-0.6.0\n"
+"Downloaded ShellCheck-0.6.0\n"
+"Unpacking to ShellCheck-0.6.0/\n"
+msgstr ""
+"% make cabal-extract\n"
+"[...]\n"
+"Downloading the latest package list from hackage.haskell.org\n"
+"cabal get ShellCheck-0.6.0\n"
+"Downloading ShellCheck-0.6.0\n"
+"Downloaded ShellCheck-0.6.0\n"
+"Unpacking to ShellCheck-0.6.0/\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1035
+msgid ""
+"Now that we have ShellCheck.cabal package description file under `${WRKSRC}"
+"`, we can use `cabal-configure` to generate the build plan:"
+msgstr ""
+"Теперь, когда у нас есть файл описания пакета ShellCheck.cabal в `${WRKSRC}"
+"`, мы можем использовать `cabal-configure` для создания плана сборки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1046
+#, no-wrap
+msgid ""
+"% make cabal-configure\n"
+"[...]\n"
+"Resolving dependencies...\n"
+"Build profile: -w ghc-8.10.7 -O1\n"
+"In order, the following would be built (use -v for more details):\n"
+" - Diff-0.4.1 (lib) (requires download & build)\n"
+" - OneTuple-0.3.1 (lib) (requires download & build)\n"
+"[...]\n"
+msgstr ""
+"% make cabal-configure\n"
+"[...]\n"
+"Resolving dependencies...\n"
+"Build profile: -w ghc-8.10.7 -O1\n"
+"In order, the following would be built (use -v for more details):\n"
+" - Diff-0.4.1 (lib) (requires download & build)\n"
+" - OneTuple-0.3.1 (lib) (requires download & build)\n"
+"[...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1049
+msgid "Once done, a list of required dependencies can generated:"
+msgstr "После завершения можно сгенерировать список необходимых зависимостей:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1057
+#, no-wrap
+msgid ""
+"% make make-use-cabal\n"
+"USE_CABAL=\tQuickCheck-2.12.6.1 \\\n"
+"\t\thashable-1.3.0.0 \\\n"
+"\t\tinteger-logarithms-1.0.3 \\\n"
+"[...]\n"
+msgstr ""
+"% make make-use-cabal\n"
+"USE_CABAL=\tQuickCheck-2.12.6.1 \\\n"
+"\t\thashable-1.3.0.0 \\\n"
+"\t\tinteger-logarithms-1.0.3 \\\n"
+"[...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1063
+msgid ""
+"Haskell packages may contain revisions, just like FreeBSD ports. Revisions "
+"can affect [.filename]#.cabal# files only. Note additional version numbers "
+"after the `_` symbol. Put newly generated `USE_CABAL` list instead of an "
+"old one."
+msgstr ""
+"Пакеты Haskell могут содержать ревизии, как и порты FreeBSD. Ревизии могут "
+"затрагивать только файлы [.filename]#.cabal#. Обратите внимание на "
+"дополнительные номера версий после символа `_`. Замените старый список "
+"`USE_CABAL` на вновь сгенерированный."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1065
+msgid ""
+"Finally, [.filename]#distinfo# needs to be regenerated to contain all the "
+"distribution files:"
+msgstr ""
+"Наконец, файл [.filename]#distinfo# необходимо перегенерировать, чтобы он "
+"содержал все файлы дистрибутива:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1076
+#, no-wrap
+msgid ""
+"% make makesum\n"
+"=> ShellCheck-0.6.0.tar.gz doesn't seem to exist in /usr/local/poudriere/ports/git/distfiles/cabal.\n"
+"=> Attempting to fetch https://hackage.haskell.org/package/ShellCheck-0.6.0/ShellCheck-0.6.0.tar.gz\n"
+"ShellCheck-0.6.0.tar.gz 136 kB 642 kBps 00s\n"
+"=> QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz doesn't seem to exist in /usr/local/poudriere/ports/git/distfiles/cabal.\n"
+"=> Attempting to fetch https://hackage.haskell.org/package/QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz\n"
+"QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz 65 kB 361 kBps 00s\n"
+"[...]\n"
+msgstr ""
+"% make makesum\n"
+"=> ShellCheck-0.6.0.tar.gz doesn't seem to exist in /usr/local/poudriere/ports/git/distfiles/cabal.\n"
+"=> Attempting to fetch https://hackage.haskell.org/package/ShellCheck-0.6.0/ShellCheck-0.6.0.tar.gz\n"
+"ShellCheck-0.6.0.tar.gz 136 kB 642 kBps 00s\n"
+"=> QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz doesn't seem to exist in /usr/local/poudriere/ports/git/distfiles/cabal.\n"
+"=> Attempting to fetch https://hackage.haskell.org/package/QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz\n"
+"QuickCheck-2.12.6.1/QuickCheck-2.12.6.1.tar.gz 65 kB 361 kBps 00s\n"
+"[...]\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1086
+msgid ""
+"Some Haskell ports install various data files under `share/${PORTNAME}`. For "
+"such cases special handling is required on the port side. The port should "
+"define the `CABAL_WRAPPER_SCRIPTS` knob listing each executable that is "
+"going to use data files. Moreover, in rare cases the program being ported "
+"uses data files of other Haskell packages, in which case the "
+"`FOO_DATADIR_VARS` comes to the rescue."
+msgstr ""
+"Некоторые порты Haskell устанавливают различные файлы данных в `share/$"
+"{PORTNAME}`. В таких случаях требуется особая обработка на стороне порта. "
+"Порт должен определить параметр `CABAL_WRAPPER_SCRIPTS`, перечислив каждый "
+"исполняемый файл, который будет использовать файлы данных. Более того, в "
+"редких случаях портируемая программа использует файлы данных других пакетов "
+"Haskell, и тогда на помощь приходит `FOO_DATADIR_VARS`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1088
+#, no-wrap
+msgid "Handling Data Files in a Haskell Port"
+msgstr "Обработка файлов данных в порте Haskell"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1092
+msgid ""
+"`devel/hs-profiteur` is a Haskell application that generates a single-page "
+"HTML with some content."
+msgstr ""
+"`devel/hs-profiteur` — это приложение на Haskell, которое генерирует "
+"одностраничный HTML с некоторым содержимым."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1096
+#, no-wrap
+msgid "PORTNAME=\tprofiteur\n"
+msgstr "PORTNAME=\tprofiteur\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1098
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1113
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1131
+#, no-wrap
+msgid "[...]\n"
+msgstr "[...]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1104
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1117
+#, no-wrap
+msgid ""
+"USE_CABAL=\tOneTuple-0.3.1_2 \\\n"
+"\t\tQuickCheck-2.14.2 \\\n"
+"\t\t[...]\n"
+msgstr ""
+"USE_CABAL=\tOneTuple-0.3.1_2 \\\n"
+"\t\tQuickCheck-2.14.2 \\\n"
+"\t\t[...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1109
+msgid ""
+"It installs HTML templates under `share/profiteur`, so we need to add "
+"`CABAL_WRAPPER_SCRIPTS` knob:"
+msgstr ""
+"Он устанавливает HTML-шаблоны в `share/profiteur`, поэтому необходимо "
+"добавить параметр `CABAL_WRAPPER_SCRIPTS`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1120
+#, no-wrap
+msgid "CABAL_WRAPPER_SCRIPTS=\t\t${CABAL_EXECUTABLES}\n"
+msgstr "CABAL_WRAPPER_SCRIPTS=\t\t${CABAL_EXECUTABLES}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1127
+msgid ""
+"The program also tries to access the `jquery.js` file, which is a part of "
+"`js-jquery-3.3.1` Haskell package. For that file to be found, we need to "
+"make the wrapper script to look for `js-jquery` data files in `share/"
+"profiteur` too. We use `profiteur_DATADIR_VARS` for this:"
+msgstr ""
+"Программа также пытается получить доступ к файлу `jquery.js`, который "
+"является частью пакета Haskell `js-jquery-3.3.1`. Чтобы этот файл был "
+"найден, необходимо, чтобы скрипт-обёртка искал файлы данных `js-jquery` "
+"также в `share/profiteur`. Для этого используется `profiteur_DATADIR_VARS`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1134
+#, no-wrap
+msgid ""
+"CABAL_WRAPPER_SCRIPTS=\t\t${CABAL_EXECUTABLES}\n"
+"profiteur_DATADIR_VARS=\t\tjs-jquery\n"
+msgstr ""
+"CABAL_WRAPPER_SCRIPTS=\t\t${CABAL_EXECUTABLES}\n"
+"profiteur_DATADIR_VARS=\t\tjs-jquery\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1139
+msgid ""
+"Now the port will install the actual binary into `libexec/cabal/profiteur` "
+"and the script into `bin/profiteur`."
+msgstr ""
+"Теперь порт установит непосредственно бинарный файл в `libexec/cabal/"
+"profiteur`, а скрипт — в `bin/profiteur`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1144
+msgid ""
+"There is no easy way to find out a proper value for the `FOO_DATADIR_VARS` "
+"knob apart from running the program and checking that everything works. "
+"Luckily, the need to use `FOO_DATADIR_VARS` is very rare."
+msgstr ""
+"Не существует простого способа определить подходящее значение для параметра "
+"`FOO_DATADIR_VARS`, кроме как запустить программу и проверить, что всё "
+"работает. К счастью, необходимость использовать `FOO_DATADIR_VARS` возникает "
+"очень редко."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1146
+msgid ""
+"Another corner case when porting complex Haskell programs is the presence of "
+"VCS dependencies in the `cabal.project` file."
+msgstr ""
+"Еще один крайний случай при переносе сложных программ на Haskell — наличие "
+"зависимостей от систем контроля версий (VCS) в файле `cabal.project`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1148
+#, no-wrap
+msgid "Porting Haskell Applications with VCS Dependencies"
+msgstr "Портирование приложений Haskell с зависимостями от VCS"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1153
+msgid ""
+"`net-p2p/cardano-node` is an extremely complex piece of software. In its "
+"`cabal.project` there are a lot of blocks like this:"
+msgstr ""
+"`net-p2p/cardano-node` — это чрезвычайно сложное программное обеспечение. В "
+"его `cabal.project` содержится множество блоков, подобных этому:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1162
+#, no-wrap
+msgid ""
+"[...]\n"
+"source-repository-package\n"
+" type: git\n"
+" location: https://github.com/input-output-hk/cardano-crypto\n"
+" tag: f73079303f663e028288f9f4a9e08bcca39a923e\n"
+"[...]\n"
+msgstr ""
+"[...]\n"
+"source-repository-package\n"
+" type: git\n"
+" location: https://github.com/input-output-hk/cardano-crypto\n"
+" tag: f73079303f663e028288f9f4a9e08bcca39a923e\n"
+"[...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1168
+msgid ""
+"Dependencies of type `source-repository-package` are automatically pulled in "
+"by `cabal` during the build process. Unfortunately, this makes use of the "
+"network after the `fetch` stage. This is disallowed by the ports framework. "
+"These sources need to be listed in the port's Makefile. The `make-use-cabal` "
+"helper target can make it easy for packages hosted on GitHub. Running this "
+"target after the usual `cabal-extract` and `cabal-configure` will produce "
+"not only the `USE_CABAL` knob, but also `GH_TUPLE`:"
+msgstr ""
+"Зависимости типа `source-repository-package` автоматически подтягиваются "
+"`cabal` в процессе сборки. К сожалению, это приводит к использованию сети "
+"после этапа `fetch`, что запрещено в рамках системы портов. Эти исходники "
+"необходимо указать в Makefile порта. Вспомогательная цель `make-use-cabal` "
+"может упростить работу с пакетами, размещёнными на GitHub. Запуск этой цели "
+"после стандартных `cabal-extract` и `cabal-configure` позволит получить не "
+"только параметр `USE_CABAL`, но и `GH_TUPLE`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1176
+#, no-wrap
+msgid ""
+"% make make-use-cabal\n"
+"USE_CABAL=\tDiff-0.4.1 \\\n"
+"\t\tGlob-0.10.2_3 \\\n"
+"\t\tHUnit-1.6.2.0 \\\n"
+"\t\t[...]\n"
+msgstr ""
+"% make make-use-cabal\n"
+"USE_CABAL=\tDiff-0.4.1 \\\n"
+"\t\tGlob-0.10.2_3 \\\n"
+"\t\tHUnit-1.6.2.0 \\\n"
+"\t\t[...]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1180
+#, no-wrap
+msgid ""
+"GH_TUPLE=\t\tinput-output-hk:cardano-base:0f3a867493059e650cda69e20a5cbf1ace289a57:cardano_base/dist-newstyle/src/cardano-b_-c8db9876882556ed \\\n"
+"\t\tinput-output-hk:cardano-crypto:f73079303f663e028288f9f4a9e08bcca39a923e:cardano_crypto/dist-newstyle/src/cardano-c_-253fd88117badd8f \\\n"
+"\t\t[...]\n"
+msgstr ""
+"GH_TUPLE=\t\tinput-output-hk:cardano-base:0f3a867493059e650cda69e20a5cbf1ace289a57:cardano_base/dist-newstyle/src/cardano-b_-c8db9876882556ed \\\n"
+"\t\tinput-output-hk:cardano-crypto:f73079303f663e028288f9f4a9e08bcca39a923e:cardano_crypto/dist-newstyle/src/cardano-c_-253fd88117badd8f \\\n"
+"\t\t[...]\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1183
+msgid ""
+"It might be useful to separate the `GH_TUPLE` items coming from `make-use-"
+"cabal` from the other ones to make it easy to update the port:"
+msgstr ""
+"Может быть полезно отделить элементы `GH_TUPLE`, поступающие из `make-use-"
+"cabal`, от остальных, чтобы упростить обновление порта:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1189
+#, no-wrap
+msgid ""
+"GH_TUPLE=\tinput-output-hk:cardano-base:0f3a867493059e650cda69e20a5cbf1ace289a57:cardano_base/dist-newstyle/src/cardano-b_-c8db9876882556ed \\\n"
+"\t\tinput-output-hk:cardano-crypto:f73079303f663e028288f9f4a9e08bcca39a923e:cardano_crypto/dist-newstyle/src/cardano-c_-253fd88117badd8f \\\n"
+"\t\t[...]\n"
+msgstr ""
+"GH_TUPLE=\tinput-output-hk:cardano-base:0f3a867493059e650cda69e20a5cbf1ace289a57:cardano_base/dist-newstyle/src/cardano-b_-c8db9876882556ed \\\n"
+"\t\tinput-output-hk:cardano-crypto:f73079303f663e028288f9f4a9e08bcca39a923e:cardano_crypto/dist-newstyle/src/cardano-c_-253fd88117badd8f \\\n"
+"\t\t[...]\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1191
+#, no-wrap
+msgid "GH_TUPLE+=\tbitcoin-core:secp256k1:ac83be33d0956faf6b7f61a60ab524ef7d6a473a:secp\n"
+msgstr "GH_TUPLE+=\tbitcoin-core:secp256k1:ac83be33d0956faf6b7f61a60ab524ef7d6a473a:secp\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1194
+msgid ""
+"Haskell ports with VCS dependencies also require the following hack for the "
+"time being:"
+msgstr ""
+"Версия Haskell-портов с зависимостями от систем контроля версий временно "
+"требует следующего обходного решения:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1198
+#, no-wrap
+msgid "BINARY_ALIAS=\tgit=true\n"
+msgstr "BINARY_ALIAS=\tgit=true\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1203
+#, no-wrap
+msgid "Using GNU Autotools"
+msgstr "Использование GNU Autotools"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1207
+msgid ""
+"If a port needs any of the GNU Autotools software, add `USES=autoreconf`. "
+"See crossref:uses[uses-autoreconf,`autoreconf`] for more information."
+msgstr ""
+"Если порту требуется какое-либо программное обеспечение GNU Autotools, "
+"добавьте `USES=autoreconf`. Подробнее см. в crossref:uses[uses-"
+"autoreconf,`autoreconf`]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1209
+#, no-wrap
+msgid "Using GNU `gettext`"
+msgstr "Использование GNU `gettext`"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1212
+#, no-wrap
+msgid "Basic Usage"
+msgstr "Простые варианты использования"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1216
+msgid ""
+"If the port requires `gettext`, set `USES= gettext`, and the port will "
+"inherit a dependency on [.filename]#libintl.so# from package:devel/"
+"gettext[]. Other values for `gettext` usage are listed in "
+"crossref:uses[uses-gettext,`USES=gettext`]."
+msgstr ""
+"Если порт требует `gettext`, установите `USES=gettext`, и порт унаследует "
+"зависимость от [.filename]#libintl.so# из пакета package:devel/gettext[]. "
+"Другие значения для использования `gettext` перечислены в crossref:uses[uses-"
+"gettext,`USES=gettext`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1219
+msgid ""
+"A rather common case is a port using `gettext` and `configure`. Generally, "
+"GNU `configure` should be able to locate `gettext` automatically."
+msgstr ""
+"Довольно распространённый случай — порт, использующий `gettext` и "
+"`configure`. Обычно GNU `configure` должен автоматически находить `gettext`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1224
+#, no-wrap
+msgid ""
+"USES=\tgettext\n"
+"GNU_CONFIGURE=\tyes\n"
+msgstr ""
+"USES=\tgettext\n"
+"GNU_CONFIGURE=\tyes\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1227
+msgid ""
+"If it ever fails to, hints at the location of `gettext` can be passed in "
+"`CPPFLAGS` and `LDFLAGS` using `localbase` as follows:"
+msgstr ""
+"Если он не сработает, можно указать расположение `gettext` через `CPPFLAGS` "
+"и `LDFLAGS`, используя `localbase` следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1232
+#, no-wrap
+msgid ""
+"USES=\tgettext localbase:ldflags\n"
+"GNU_CONFIGURE=\tyes\n"
+msgstr ""
+"USES=\tgettext localbase:ldflags\n"
+"GNU_CONFIGURE=\tyes\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1235
+#, no-wrap
+msgid "Optional Usage"
+msgstr "Оптимальное использование"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1241
+msgid ""
+"Some software products allow for disabling NLS. For example, through "
+"passing `--disable-nls` to `configure`. In that case, the port must use "
+"`gettext` conditionally, depending on the status of the `NLS` option. For "
+"ports of low to medium complexity, use this idiom:"
+msgstr ""
+"Некоторые программные продукты позволяют отключать NLS, к примеру, передавая "
+"параметр `--disable-nls` сценарию `configure`. В этом случае ваш порт должен "
+"использовать `gettext`, в зависимости от значения `NLS`. Для портов "
+"небольшой или средней сложности вы можете полагаться на следующую идиому:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1245
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1260
+#, no-wrap
+msgid "GNU_CONFIGURE=\t\tyes\n"
+msgstr "GNU_CONFIGURE=\t\tyes\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1248
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\t\tNLS\n"
+"OPTIONS_SUB=\t\tyes\n"
+msgstr ""
+"OPTIONS_DEFINE=\t\tNLS\n"
+"OPTIONS_SUB=\t\tyes\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1251
+#, no-wrap
+msgid ""
+"NLS_USES=\t\tgettext\n"
+"NLS_CONFIGURE_ENABLE=\tnls\n"
+msgstr ""
+"NLS_USES=\t\tgettext\n"
+"NLS_CONFIGURE_ENABLE=\tnls\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1256
+msgid "Or using the older way of using options:"
+msgstr "Или используя старый способ с опциями:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1262
+#, no-wrap
+msgid "OPTIONS_DEFINE=\t\tNLS\n"
+msgstr "OPTIONS_DEFINE=\t\tNLS\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1264
+#, no-wrap
+msgid ".include <bsd.port.options.mk>\n"
+msgstr ".include <bsd.port.options.mk>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1272
+#, no-wrap
+msgid ""
+".if ${PORT_OPTIONS:MNLS}\n"
+"USES+=\t\t\tgettext\n"
+"PLIST_SUB+=\t\tNLS=\"\"\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-nls\n"
+"PLIST_SUB+=\t\tNLS=\"@comment \"\n"
+".endif\n"
+msgstr ""
+".if ${PORT_OPTIONS:MNLS}\n"
+"USES+=\t\t\tgettext\n"
+"PLIST_SUB+=\t\tNLS=\"\"\n"
+".else\n"
+"CONFIGURE_ARGS+=\t--disable-nls\n"
+"PLIST_SUB+=\t\tNLS=\"@comment \"\n"
+".endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1283
+msgid ""
+"The next item on the to-do list is to arrange so that the message catalog "
+"files are included in the packing list conditionally. The "
+"[.filename]#Makefile# part of this task is already provided by the idiom. "
+"It is explained in the section on crossref:plist[plist-sub,advanced "
+"[.filename]#pkg-plist# practices]. In a nutshell, each occurrence of `%%NLS%"
+"%` in [.filename]#pkg-plist# will be replaced by \"`@comment `\" if NLS is "
+"disabled, or by a null string if NLS is enabled. Consequently, the lines "
+"prefixed by `%%NLS%%` will become mere comments in the final packing list if "
+"NLS is off; otherwise the prefix will be just left out. Then insert `%%NLS%"
+"%` before each path to a message catalog file in [.filename]#pkg-plist#. "
+"For example:"
+msgstr ""
+"Следующий пункт в списке задач — организовать условное включение файлов "
+"каталогов сообщений в упаковочный список. Часть, связанная с "
+"[.filename]#Makefile#, уже предусмотрена идиомой. Это объясняется в разделе "
+"crossref:plist[plist-sub,расширенные практики работы с [.filename]#pkg-"
+"plist#]. Вкратце, каждое вхождение `%%NLS%%` в [.filename]#pkg-plist# будет "
+"заменено на \"`@comment `\", если NLS отключен, или на пустую строку, если "
+"NLS включен. Следовательно, строки с префиксом `%%NLS%%` станут обычными "
+"комментариями в итоговом упаковочном списке, если NLS выключен; в противном "
+"случае префикс будет просто удален. Затем вставьте `%%NLS%%` перед каждым "
+"путем к файлу каталога сообщений в [.filename]#pkg-plist#. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1288
+#, no-wrap
+msgid ""
+"%%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo\n"
+"%%NLS%%share/locale/no/LC_MESSAGES/foobar.mo\n"
+msgstr ""
+"%%NLS%%share/locale/fr/LC_MESSAGES/foobar.mo\n"
+"%%NLS%%share/locale/no/LC_MESSAGES/foobar.mo\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1291
+msgid ""
+"In high complexity cases, more advanced techniques may be needed, such as "
+"crossref:plist[plist-dynamic,dynamic packing list generation]."
+msgstr ""
+"В особо сложных случаях вам понадобиться использовать более продвинутые "
+"техники, чем данный рецепт, такие как crossref:plist[plist-"
+"dynamic,динамические списки упаковки]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1293
+#, no-wrap
+msgid "Handling Message Catalog Directories"
+msgstr "Управление каталогами сообщений"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1300
+msgid ""
+"There is a point to note about installing message catalog files. The target "
+"directories for them, which reside under [.filename]#LOCALBASE/share/"
+"locale#, must not be created and removed by a port. The most popular "
+"languages have their respective directories listed in [.filename]#PORTSDIR/"
+"Templates/BSD.local.dist#. The directories for many other languages are "
+"governed by the package:devel/gettext[] port. Consult its [.filename]#pkg-"
+"plist# and see whether the port is going to install a message catalog file "
+"for a unique language."
+msgstr ""
+"Существует момент, который следует учитывать при установке файлов каталогов "
+"сообщений. Целевые каталоги для размещения, расположенные под "
+"[.filename]#LOCALBASE/shared/locale#, редко когда должны создаваться и "
+"удаляться портом. Для наиболее популярных языков имеются собственные "
+"каталоги, перечисленные в [.filename]#PORTSDIR/Templates/BSD.local.dist#. "
+"Каталоги для множества других языков управляются с помощью порта "
+"package:devel/gettext[]. Обратите внимание на его [.filename]#pkg-plist# и "
+"посмотрите, куда данный порт собирается установить файлы каталогов сообщений "
+"для единственного в своем роде языка."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1302
+#, no-wrap
+msgid "Using Perl"
+msgstr "Использование Perl"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1310
+msgid ""
+"If `MASTER_SITES` is set to `CPAN`, the correct subdirectory is usually "
+"selected automatically. If the default subdirectory is wrong, `CPAN/Module` "
+"can be used to change it. `MASTER_SITES` can also be set to the old "
+"`MASTER_SITE_PERL_CPAN`, then the preferred value of `MASTER_SITE_SUBDIR` is "
+"the top-level hierarchy name. For example, the recommended value for `p5-"
+"Module-Name` is `Module`. The top-level hierarchy can be examined at "
+"https://cpan.org/modules/by-module/[cpan.org]. This keeps the port working "
+"when the author of the module changes."
+msgstr ""
+"Если `MASTER_SITES` установлена в значение `CPAN`, то правильная "
+"поддиректория выбирается автоматически. Если подкаталог по умолчанию указан "
+"неверно, можно использовать `CPAN/Module` для его изменения. Также можно "
+"установить `MASTER_SITES` в старое значение `MASTER_SITE_PERL_CPAN`, тогда "
+"предпочтительным значением `MASTER_SITE_SUBDIR` будет имя иерархии выше "
+"уровнем. Например, рекомендуемое значение для `p5-Module-Name` - `Module`. "
+"Иерархию верхнего уровня можно посмотреть на https://cpan.org/modules/by-"
+"module/[cpan.org]. Это гарантирует работоспособность порта при смене автора "
+"модуля."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1315
+msgid ""
+"The exception to this rule is when the relevant directory does not exist or "
+"the distfile does not exist in that directory. In such case, using author's "
+"id as `MASTER_SITE_SUBDIR` is allowed. The `CPAN:AUTHOR` macro can be used, "
+"which will be translated to the hashed author directory. For example, "
+"`CPAN:AUTHOR` will be converted to `authors/id/A/AU/AUTHOR`."
+msgstr ""
+"Исключением этого правила является отсутствие соответствующего каталога или "
+"файла с дистрибутивом в этом каталоге. В качестве `MASTER_SITE_SUBDIR` в "
+"этом случае разрешается использовать id автора. Можно использовать макрос "
+"`CPAN:AUTHOR`, который будет преобразован в хешированный каталог автора. "
+"Например, `CPAN:AUTHOR` преобразуется в `authors/id/A/AU/AUTHOR`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1317
+msgid ""
+"When a port needs Perl support, it must set `USES=perl5` with the optional "
+"`USE_PERL5` described in crossref:uses[uses-perl5,the perl5 USES "
+"description]."
+msgstr ""
+"Когда порту требуется поддержка Perl, он должен установить `USES=perl5` с "
+"опциональным `USE_PERL5`, как описано в crossref:uses[uses-perl5,описание "
+"USES для perl5]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1319
+#, no-wrap
+msgid "Read-Only Variables for Ports That Use Perl"
+msgstr "Переменные (только для чтения) для портов, использующих Perl"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1323
+#, no-wrap
+msgid "Read only variables"
+msgstr "Переменные (только для чтения)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1326
+#, no-wrap
+msgid "`PERL`"
+msgstr "`PERL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1328
+#, no-wrap
+msgid "The full path of the Perl 5 interpreter, either in the system or installed from a port, but without the version number. Use this when the software needs the path to the Perl interpreter. To replace \"``#!``\"lines in scripts, use crossref:uses[uses-shebangfix,`shebangfix`]."
+msgstr "Полный путь к интерпретатору Perl 5, будь то системный или установленный из порта, но без номера версии. Используйте это, когда программному обеспечению требуется путь к интерпретатору Perl. Для замены строк \"``#!``\" в скриптах используйте crossref:uses[uses-shebangfix,`shebangfix`]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1329
+#, no-wrap
+msgid "`PERL_VERSION`"
+msgstr "`PERL_VERSION`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1331
+#, no-wrap
+msgid "The full version of Perl installed (for example, `5.8.9`)."
+msgstr "Полная версия Perl установлена (например, `5.8.9`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1332
+#, no-wrap
+msgid "`PERL_LEVEL`"
+msgstr "`PERL_LEVEL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1334
+#, no-wrap
+msgid "The installed Perl version as an integer of the form `MNNNPP` (for example, `500809`)."
+msgstr "Установленная версия Perl в виде целого числа формата `MNNNPP` (например, `500809`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1335
+#, no-wrap
+msgid "`PERL_ARCH`"
+msgstr "`PERL_ARCH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1337
+#, no-wrap
+msgid "Where Perl stores architecture dependent libraries. Defaults to `${ARCH}-freebsd`."
+msgstr "Где Perl хранит архитектурно-зависимые библиотеки. По умолчанию: `${ARCH}-freebsd`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1338
+#, no-wrap
+msgid "`PERL_PORT`"
+msgstr "`PERL_PORT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1340
+#, no-wrap
+msgid "Name of the Perl port that is installed (for example, `perl5`)."
+msgstr "Имя порта Perl, который установлен (например, `perl5`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1341
+#, no-wrap
+msgid "`SITE_PERL`"
+msgstr "`SITE_PERL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1342
+#, no-wrap
+msgid "Directory name where site specific Perl packages go. This value is added to `PLIST_SUB`."
+msgstr "Имя каталога, в котором размещаются специфичные для сайта пакеты Perl. Это значение добавляется в `PLIST_SUB`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1348
+msgid ""
+"Ports of Perl modules which do not have an official website must link to "
+"`cpan.org` in the WWW line of [.filename]#Makefile#. The preferred URL form "
+"is `https://search.cpan.org/dist/Module-Name/` (including the trailing "
+"slash)."
+msgstr ""
+"Порты Perl-модулей, у которых нет официального сайта, должны ссылаться на "
+"`cpan.org` в строке WWW файла [.filename]#Makefile#. Предпочтительный формат "
+"URL: `https://search.cpan.org/dist/Module-Name/` (включая завершающий слеш)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1356
+msgid ""
+"Do not use `${SITE_PERL}` in dependency declarations. Doing so assumes that "
+"[.filename]#perl5.mk# has been included, which is not always true. Ports "
+"depending on this port will have incorrect dependencies if this port's files "
+"move later in an upgrade. The right way to declare Perl module dependencies "
+"is shown in the example below."
+msgstr ""
+"Не используйте `${SITE_PERL}` в объявлениях зависимостей. Это предполагает, "
+"что был включён файл [.filename]#perl5.mk#, что не всегда верно. Порты, "
+"зависящие от этого порта, будут иметь некорректные зависимости, если файлы "
+"этого порта будут перемещены во время обновления. Правильный способ "
+"объявления зависимостей модулей Perl показан в примере ниже."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1359
+#, no-wrap
+msgid "Perl Dependency Example"
+msgstr "Пример зависимости Perl"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1365
+#, no-wrap
+msgid "p5-IO-Tee>=0.64:devel/p5-IO-Tee\n"
+msgstr "p5-IO-Tee>=0.64:devel/p5-IO-Tee\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1370
+msgid ""
+"For Perl ports that install manual pages, the macro `PERL5_MAN3` and "
+"`PERL5_MAN1` can be used inside [.filename]#pkg-plist#. For example,"
+msgstr ""
+"Для портов Perl, которые устанавливают страницы руководства, макросы "
+"`PERL5_MAN3` и `PERL5_MAN1` могут использоваться внутри [.filename]#pkg-"
+"plist#. Например,"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1375
+#, no-wrap
+msgid ""
+"lib/perl5/5.14/man/man1/event.1.gz\n"
+"lib/perl5/5.14/man/man3/AnyEvent::I3.3.gz\n"
+msgstr ""
+"lib/perl5/5.14/man/man1/event.1.gz\n"
+"lib/perl5/5.14/man/man3/AnyEvent::I3.3.gz\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1378
+msgid "can be replaced with"
+msgstr "может быть заменено на"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1383
+#, no-wrap
+msgid ""
+"%%PERL5_MAN1%%/event.1.gz\n"
+"%%PERL5_MAN3%%/AnyEvent::I3.3.gz\n"
+msgstr ""
+"%%PERL5_MAN1%%/event.1.gz\n"
+"%%PERL5_MAN3%%/AnyEvent::I3.3.gz\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1388
+msgid ""
+"There are no `PERL5_MAN_x_` macros for the other sections (_x_ in `2` and "
+"`4` to `9`) because those get installed in the regular directories."
+msgstr ""
+"Для других разделов (_x_ в `2` и `4`–`9`) макросы `PERL5_MAN_x_` "
+"отсутствуют, так как они устанавливаются в обычные каталоги."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1391
+#, no-wrap
+msgid "A Port Which Only Requires Perl to Build"
+msgstr "Порт, требующий Perl только для сборки"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1395
+msgid "As the default USE_PERL5 value is build and run, set it to:"
+msgstr ""
+"Поскольку значение USE_PERL5 по умолчанию включает build и run, установите "
+"его в:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1400
+#, no-wrap
+msgid ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tbuild\n"
+msgstr ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tbuild\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1405
+#, no-wrap
+msgid "A Port Which Also Requires Perl to Patch"
+msgstr "Порт, который также требует Perl для исправления"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1410
+msgid ""
+"From time to time, using man:sed[1] for patching is not enough. When using "
+"man:perl[1] is easier, use:"
+msgstr ""
+"Время от времени использования man:sed[1] для исправлений недостаточно. "
+"Когда использование man:perl[1] проще, примените:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1415
+#, no-wrap
+msgid ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tpatch build run\n"
+msgstr ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tpatch build run\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1420
+#, no-wrap
+msgid "A Perl Module Which Needs `ExtUtils::MakeMaker` to Build"
+msgstr "Модуль Perl, для сборки которого требуется `ExtUtils::MakeMaker`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1425
+msgid ""
+"Most Perl modules come with a [.filename]#Makefile.PL# configure script. In "
+"this case, set:"
+msgstr ""
+"Большинство модулей Perl поставляются с конфигурационным скриптом "
+"[.filename]#Makefile.PL#. В этом случае установите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1430
+#, no-wrap
+msgid ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tconfigure\n"
+msgstr ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tconfigure\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1435
+#, no-wrap
+msgid "A Perl Module Which Needs `Module::Build` to Build"
+msgstr "Модуль Perl, для сборки которого требуется `Module::Build`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1439
+msgid ""
+"When a Perl module comes with a [.filename]#Build.PL# configure script, it "
+"can require Module::Build, in which case, set"
+msgstr ""
+"Когда модуль Perl поставляется с конфигурационным скриптом "
+"[.filename]#Build.PL#, он может требовать Module::Build, и в этом случае "
+"установите"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1444
+#, no-wrap
+msgid ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tmodbuild\n"
+msgstr ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tmodbuild\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1447
+msgid "If it instead requires Module::Build::Tiny, set"
+msgstr "Если вместо этого требуется Module::Build::Tiny, установите"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1452
+#, no-wrap
+msgid ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tmodbuildtiny\n"
+msgstr ""
+"USES=\t\tperl5\n"
+"USE_PERL5=\tmodbuildtiny\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1457
+#, no-wrap
+msgid "Using X11"
+msgstr "Использование X11"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1460
+#, no-wrap
+msgid "X.Org Components"
+msgstr "Компоненты X.Org"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1465
+msgid ""
+"The X11 implementation available in The Ports Collection is X.Org. If the "
+"application depends on X components, add `USES= xorg` and set `USE_XORG` to "
+"the list of required components. A full list can be found in "
+"crossref:uses[uses-xorg,`xorg`]."
+msgstr ""
+"Реализация X11, доступная в Коллекции портов, — это X.Org. Если приложение "
+"зависит от компонентов X, добавьте `USES= xorg` и укажите необходимые "
+"компоненты в `USE_XORG`. Полный список можно найти в crossref:uses[uses-"
+"xorg,`xorg`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1470
+msgid ""
+"The Mesa Project is an effort to provide free OpenGL implementation. To "
+"specify a dependency on various components of this project, use `USES= gl` "
+"and `USE_GL`. See crossref:uses[uses-gl,`gl`] for a full list of available "
+"components. For backwards compatibility, the value of `yes` maps to `glu`."
+msgstr ""
+"Проект Mesa — это инициатива по предоставлению свободной реализации OpenGL. "
+"Чтобы указать зависимость от различных компонентов этого проекта, "
+"используйте `USES=gl` и `USE_GL`. См. crossref:uses[uses-gl,`gl`] для "
+"полного списка доступных компонентов. Для обратной совместимости значение "
+"`yes` соответствует `glu`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1472
+#, no-wrap
+msgid "`USE_XORG` Example"
+msgstr "Пример `USE_XORG`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1480
+#, no-wrap
+msgid ""
+"USES=\t\tgl xorg\n"
+"USE_GL=\t\tglu\n"
+"USE_XORG=\txrender xft xkbfile xt xaw\n"
+msgstr ""
+"USES=\t\tgl xorg\n"
+"USE_GL=\t\tglu\n"
+"USE_XORG=\txrender xft xkbfile xt xaw\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1485
+#, no-wrap
+msgid "Variables for Ports That Use X"
+msgstr "Переменные для портов, использующих X"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1489
+#, no-wrap
+msgid "`USES= imake`"
+msgstr "`USES= imake`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1491
+#, no-wrap
+msgid "The port uses `imake`."
+msgstr "Порт использует `imake`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1492
+#, no-wrap
+msgid "`XMKMF`"
+msgstr "`XMKMF`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1493
+#, no-wrap
+msgid "Set to the path of `xmkmf` if not in the `PATH`. Defaults to `xmkmf -a`."
+msgstr "Установить путь к `xmkmf`, если он отсутствует в `PATH`. По умолчанию: `xmkmf -a`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1496
+#, no-wrap
+msgid "Using X11-Related Variables"
+msgstr "Использование переменных, связанных с X11"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1504
+#, no-wrap
+msgid ""
+"# Use some X11 libraries\n"
+"USES=\t\txorg\n"
+"USE_XORG=\tx11 xpm\n"
+msgstr ""
+"# Use some X11 libraries\n"
+"USES=\t\txorg\n"
+"USE_XORG=\tx11 xpm\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1509
+#, no-wrap
+msgid "Ports That Require Motif"
+msgstr "Порты, требующие Motif"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1515
+msgid ""
+"If the port requires a Motif library, define `USES= motif` in the "
+"[.filename]#Makefile#. Default Motif implementation is package:x11-toolkits/"
+"open-motif[]. Users can choose package:x11-toolkits/lesstif[] instead by "
+"setting `WANT_LESSTIF` in their [.filename]#make.conf#. Similarly "
+"package:x11-toolkits/open-motif-devel[] can be chosen by setting "
+"`WANT_OPEN_MOTIF_DEVEL` in [.filename]#make.conf#."
+msgstr ""
+"Если порт требует библиотеку Motif, определите `USES= motif` в "
+"[.filename]#Makefile#. Реализация Motif по умолчанию — это package:x11-"
+"toolkits/open-motif[]. Пользователи могут выбрать package:x11-toolkits/"
+"lesstif[] вместо этого, установив `WANT_LESSTIF` в своём "
+"[.filename]#make.conf#. Аналогично package:x11-toolkits/open-motif-devel[] "
+"можно выбрать, установив `WANT_OPEN_MOTIF_DEVEL` в [.filename]#make.conf#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1518
+msgid ""
+"`MOTIFLIB` will be set by [.filename]#motif.mk# to reference the appropriate "
+"Motif library. Please patch the source of the port to use `${MOTIFLIB}` "
+"wherever the Motif library is referenced in the original "
+"[.filename]#Makefile# or [.filename]#Imakefile#."
+msgstr ""
+"`MOTIFLIB` будет установлен в файле [.filename]#motif.mk# для ссылки на "
+"соответствующую библиотеку Motif. Пожалуйста, исправьте исходный код порта, "
+"чтобы использовать `${MOTIFLIB}` везде, где библиотека Motif упоминается в "
+"оригинальном [.filename]#Makefile# или [.filename]#Imakefile#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1520
+msgid "There are two common cases:"
+msgstr "Есть два распространённых случая:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1522
+msgid ""
+"If the port refers to the Motif library as `-lXm` in its "
+"[.filename]#Makefile# or [.filename]#Imakefile#, substitute `${MOTIFLIB}` "
+"for it."
+msgstr ""
+"Если порт ссылается на библиотеку Motif как `-lXm` в своем "
+"[.filename]#Makefile# или [.filename]#Imakefile#, замените это на `$"
+"{MOTIFLIB}`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1523
+msgid ""
+"If the port uses `XmClientLibs` in its [.filename]#Imakefile#, change it to "
+"`${MOTIFLIB} ${XTOOLLIB} ${XLIB}`."
+msgstr ""
+"Если порт использует `XmClientLibs` в своем [.filename]#Imakefile#, замените "
+"это на `${MOTIFLIB} ${XTOOLLIB} ${XLIB}`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1525
+msgid ""
+"Note that `MOTIFLIB` (usually) expands to `-L/usr/local/lib -lXm -lXp` or `/"
+"usr/local/lib/libXm.a`, so there is no need to add `-L` or `-l` in front."
+msgstr ""
+"Обратите внимание, что `MOTIFLIB` (обычно) раскрывается в `-L/usr/local/lib "
+"-lXm -lXp` или `/usr/local/lib/libXm.a`, поэтому нет необходимости добавлять "
+"`-L` или `-l` перед этим."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1527
+#, no-wrap
+msgid "X11 Fonts"
+msgstr "Шрифты X11"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1530
+msgid ""
+"If the port installs fonts for the X Window System, put them in "
+"[.filename]#LOCALBASE/lib/X11/fonts/local#."
+msgstr ""
+"Если порт устанавливает шрифты для X Window System, поместите их в "
+"[.filename]#LOCALBASE/lib/X11/fonts/local#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1532
+#, no-wrap
+msgid "Getting a Fake `DISPLAY` with Xvfb"
+msgstr "Получение поддельного `DISPLAY` с помощью Xvfb"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1539
+msgid ""
+"Some applications require a working X11 display for compilation to succeed. "
+"This poses a problem for machines that operate headless. When this variable "
+"is used, the build infrastructure will start the virtual framebuffer X "
+"server. The working `DISPLAY` is then passed to the build. See "
+"crossref:uses[uses-display,`USES=display`] for the possible arguments."
+msgstr ""
+"Некоторые приложения требуют рабочего дисплея X11 для успешной компиляции. "
+"Это создаёт проблему для машин, работающих без монитора. При использовании "
+"этой переменной инфраструктура сборки запустит виртуальный X-сервер с "
+"буфером кадров. Рабочий `DISPLAY` затем передаётся в процесс сборки. См. "
+"crossref:uses[uses-display,`USES=display`] для возможных аргументов."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1543
+#, no-wrap
+msgid "USES=\tdisplay\n"
+msgstr "USES=\tdisplay\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1547
+#, no-wrap
+msgid "Desktop Entries"
+msgstr "Desktop Entries (пункты рабочего стола)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1553
+msgid ""
+"Desktop entries (https://standards.freedesktop.org/desktop-entry-spec/latest/"
+"[a Freedesktop standard]) provide a way to automatically adjust desktop "
+"features when a new program is installed, without requiring user "
+"intervention. For example, newly-installed programs automatically appear in "
+"the application menus of compatible desktop environments. Desktop entries "
+"originated in the GNOME desktop environment, but are now a standard and also "
+"work with KDE and Xfce. This bit of automation provides a real benefit to "
+"the user, and desktop entries are encouraged for applications which can be "
+"used in a desktop environment."
+msgstr ""
+"Desktop entries (https://standards.freedesktop.org/desktop-entry-spec/latest/"
+"[стандарт Freedesktop]) предоставляют способ автоматической настройки "
+"функций рабочего стола при установке новой программы без вмешательства "
+"пользователя. Например, вновь установленные программы автоматически "
+"появляются в меню приложений совместимых сред рабочего стола. Desktop "
+"entries появились в среде GNOME, но теперь стали стандартом и также работают "
+"с KDE и Xfce. Эта автоматизация приносит реальную пользу пользователю, "
+"поэтому Desktop entries рекомендуются для приложений, которые могут "
+"использоваться в среде рабочего стола."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1555
+#, no-wrap
+msgid "Using Predefined [.filename]#.desktop# Files"
+msgstr "Использование предопределенных файлов [.filename]#.desktop#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1559
+msgid ""
+"Ports that include predefined [.filename]#*.desktop# must include those "
+"files in [.filename]#pkg-plist# and install them in the "
+"[.filename]#$LOCALBASE/share/applications# directory. The "
+"crossref:makefiles[install-macros,`INSTALL_DATA` macro] is useful for "
+"installing these files."
+msgstr ""
+"Порты, включающие предопределённые файлы [.filename]#*.desktop#, должны "
+"добавлять эти файлы в [.filename]#pkg-plist# и устанавливать их в директорию "
+"[.filename]#$LOCALBASE/share/applications#. Для установки таких файлов "
+"полезен макрос crossref:makefiles[install-macros,`INSTALL_DATA`]."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1561
+#, no-wrap
+msgid "Updating Desktop Database"
+msgstr "Обновление базы данных рабочего стола"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1565
+msgid ""
+"If a port has a MimeType entry in its [.filename]#portname.desktop#, the "
+"desktop database must be updated after install and deinstall. To do this, "
+"define `USES`= desktop-file-utils."
+msgstr ""
+"Если порт имеет запись MimeType в файле [.filename]#portname.desktop#, базу "
+"данных рабочего стола необходимо обновить после установки и удаления. Для "
+"этого определите `USES`= desktop-file-utils."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1567
+#, no-wrap
+msgid "Creating Desktop Entries with `DESKTOP_ENTRIES`"
+msgstr "Создание Desktop Entries с помощью `DESKTOP_ENTRIES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1572
+msgid ""
+"Desktop entries can be easily created for applications by using "
+"`DESKTOP_ENTRIES`. A file named [.filename]#name.desktop# will be created, "
+"installed, and added to [.filename]#pkg-plist# automatically. Syntax is:"
+msgstr ""
+"Desktop Entries могут быть легко созданы для приложений с использованием "
+"`DESKTOP_ENTRIES`. Файл с именем [.filename]#name.desktop# будет создан, "
+"установлен и автоматически добавлен в [.filename]#pkg-plist#. Синтаксис "
+"следующий:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1576
+#, no-wrap
+msgid "DESKTOP_ENTRIES=\t\"NAME\" \"COMMENT\" \"ICON\" \"COMMAND\" \"CATEGORY\" StartupNotify\n"
+msgstr "DESKTOP_ENTRIES=\t\"NAME\" \"COMMENT\" \"ICON\" \"COMMAND\" \"CATEGORY\" StartupNotify\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1583
+msgid ""
+"The list of possible categories is available on the https://"
+"standards.freedesktop.org/menu-spec/latest/apa.html[Freedesktop website]. "
+"`StartupNotify` indicates whether the application is compatible with "
+"_startup notifications_. These are typically a graphic indicator like a "
+"clock that appear at the mouse pointer, menu, or panel to give the user an "
+"indication when a program is starting. A program that is compatible with "
+"startup notifications clears the indicator after it has started. Programs "
+"that are not compatible with startup notifications would never clear the "
+"indicator (potentially confusing and infuriating the user), and must have "
+"`StartupNotify` set to `false` so the indicator is not shown at all."
+msgstr ""
+"Список возможных категорий доступен на https://standards.freedesktop.org/"
+"menu-spec/latest/apa.html[сайте Freedesktop]. `StartupNotify` указывает, "
+"совместимо ли приложение с _уведомлениями о запуске_. Обычно это "
+"графический индикатор, например, часы, который появляется у указателя мыши, "
+"в меню или на панели, чтобы дать пользователю понять, что программа "
+"запускается. Программа, совместимая с уведомлениями о запуске, очищает "
+"индикатор после своего старта. Программы, не совместимые с уведомлениями о "
+"запуске, никогда не очищают индикатор (что может сбивать с толку и "
+"раздражать пользователя), и у них должен быть установлен параметр "
+"`StartupNotify` в значение `false`, чтобы индикатор вообще не отображался."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1585
+msgid "Example:"
+msgstr "Пример:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1592
+#, no-wrap
+msgid ""
+"DESKTOP_ENTRIES=\t\"ToME\" \"Roguelike game based on JRR Tolkien's work\" \\\n"
+"\t\t\t\"${DATADIR}/xtra/graf/tome-128.png\" \\\n"
+"\t\t\t\"tome -v -g\" \"Application;Game;RolePlaying;\" \\\n"
+"\t\t\tfalse\n"
+msgstr ""
+"DESKTOP_ENTRIES=\t\"ToME\" \"Roguelike game based on JRR Tolkien's work\" \\\n"
+"\t\t\t\"${DATADIR}/xtra/graf/tome-128.png\" \\\n"
+"\t\t\t\"tome -v -g\" \"Application;Game;RolePlaying;\" \\\n"
+"\t\t\tfalse\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1597
+msgid ""
+"`DESKTOP_ENTRIES` are installed in the directory pointed to by the "
+"`DESKTOPDIR` variable. `DESKTOPDIR` defaults to [.filename]#${PREFIX}/share/"
+"applications#"
+msgstr ""
+"`DESKTOP_ENTRIES` устанавливаются в директорию, указанную переменной "
+"`DESKTOPDIR`. По умолчанию `DESKTOPDIR` имеет значение [.filename]#${PREFIX}/"
+"share/applications#"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1600
+#, no-wrap
+msgid "Using GNOME"
+msgstr "Использование GNOME"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1603
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3769
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4070
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4286
+#, no-wrap
+msgid "Introduction"
+msgstr "Введение"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1607
+msgid ""
+"This chapter explains the GNOME framework as used by ports. The framework "
+"can be loosely divided into the base components, GNOME desktop components, "
+"and a few special macros that simplify the work of port maintainers."
+msgstr ""
+"Эта глава объясняет фреймворк GNOME, используемый в портах. Фреймворк можно "
+"условно разделить на базовые компоненты, компоненты рабочего стола GNOME и "
+"несколько специальных макросов, упрощающих работу сопровождающих портов."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1609
+#, no-wrap
+msgid "Using `USE_GNOME`"
+msgstr "Использование `USE_GNOME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1617
+msgid ""
+"Adding this variable to the port allows the use of the macros and components "
+"defined in [.filename]#bsd.gnome.mk#. The code in [.filename]#bsd.gnome.mk# "
+"adds the needed build-time, run-time or library dependencies or the handling "
+"of special files. GNOME applications under FreeBSD use the `USE_GNOME` "
+"infrastructure. Include all the needed components as a space-separated "
+"list. The `USE_GNOME` components are divided into these virtual lists: "
+"basic components, GNOME 3 components and legacy components. If the port "
+"needs only GTK3 libraries, this is the shortest way to define it:"
+msgstr ""
+"Добавление этой переменной в порт позволяет использовать макросы и "
+"компоненты, определённые в [.filename]#bsd.gnome.mk#. Код в "
+"[.filename]#bsd.gnome.mk# добавляет необходимые зависимости для сборки, "
+"выполнения или библиотеки, а также обработку специальных файлов. Приложения "
+"GNOME в FreeBSD используют инфраструктуру `USE_GNOME`. Включите все "
+"необходимые компоненты в виде списка, разделённого пробелами. Компоненты "
+"`USE_GNOME` разделены на следующие виртуальные списки: основные компоненты, "
+"компоненты GNOME 3 и устаревшие компоненты. Если порту требуются только "
+"библиотеки GTK3, это кратчайший способ определить это:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1621
+#, no-wrap
+msgid "USE_GNOME=\tgtk30\n"
+msgstr "USE_GNOME=\tgtk30\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1625
+msgid ""
+"`USE_GNOME` components automatically add the dependencies they need. Please "
+"see crossref:special[gnome-components, GNOME Components] for an exhaustive "
+"list of all `USE_GNOME` components and which other components they imply and "
+"their dependencies."
+msgstr ""
+"`USE_GNOME` компоненты автоматически добавляют необходимые им зависимости. "
+"Подробный список всех компонентов `USE_GNOME`, а также информацию о том, "
+"какие другие компоненты они подразумевают и их зависимости, можно найти в "
+"crossref:special[gnome-components, Компоненты GNOME]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1628
+msgid ""
+"Here is an example [.filename]#Makefile# for a GNOME port that uses many of "
+"the techniques outlined in this document. Please use it as a guide for "
+"creating new ports."
+msgstr ""
+"Вот пример [.filename]#Makefile# для порта GNOME, в котором используются "
+"многие методы, описанные в этом документе. Пожалуйста, используйте его в "
+"качестве руководства при создании новых портов."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1635
+#, no-wrap
+msgid ""
+"PORTNAME=\tregexxer\n"
+"DISTVERSION=\t0.10\n"
+"CATEGORIES=\tdevel textproc gnome\n"
+"MASTER_SITES=\tGNOME\n"
+msgstr ""
+"PORTNAME=\tregexxer\n"
+"DISTVERSION=\t0.10\n"
+"CATEGORIES=\tdevel textproc gnome\n"
+"MASTER_SITES=\tGNOME\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1639
+#, no-wrap
+msgid ""
+"MAINTAINER=\tkwm@FreeBSD.org\n"
+"COMMENT=\tInteractive tool for performing search and replace operations\n"
+"WWW=\t\thttp://regexxer.sourceforge.net/\n"
+msgstr ""
+"MAINTAINER=\tkwm@FreeBSD.org\n"
+"COMMENT=\tInteractive tool for performing search and replace operations\n"
+"WWW=\t\thttp://regexxer.sourceforge.net/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1643
+#, no-wrap
+msgid ""
+"USES=\t\tgettext gmake localbase:ldflags pathfix pkgconfig tar:xz\n"
+"GNU_CONFIGURE=\tyes\n"
+"USE_GNOME=\tgnomeprefix intlhack gtksourceviewmm3\n"
+msgstr ""
+"USES=\t\tgettext gmake localbase:ldflags pathfix pkgconfig tar:xz\n"
+"GNU_CONFIGURE=\tyes\n"
+"USE_GNOME=\tgnomeprefix intlhack gtksourceviewmm3\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1645
+#, no-wrap
+msgid "GLIB_SCHEMAS=\torg.regexxer.gschema.xml\n"
+msgstr "GLIB_SCHEMAS=\torg.regexxer.gschema.xml\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1653
+msgid ""
+"The `USE_GNOME` macro without any arguments does not add any dependencies to "
+"the port. `USE_GNOME` cannot be set after [.filename]#bsd.port.pre.mk#."
+msgstr ""
+"Макрос `USE_GNOME` без аргументов не добавляет никаких зависимостей к порту. "
+"`USE_GNOME` не может быть установлен после [.filename]#bsd.port.pre.mk#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1656
+#, no-wrap
+msgid "Variables"
+msgstr "Переменные"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1662
+msgid ""
+"This section explains which macros are available and how they are used. "
+"Like they are used in the above example. The crossref:special[gnome-"
+"components, GNOME Components] has a more in-depth explanation. `USE_GNOME` "
+"has to be set for these macros to be of use."
+msgstr ""
+"Этот раздел объясняет, какие макросы доступны и как они используются. Как, "
+"например, в приведённом выше примере. В crossref:special[gnome-components, "
+"Компоненты GNOME] содержится более подробное объяснение. Для использования "
+"этих макросов необходимо установить `USE_GNOME`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1663
+#, no-wrap
+msgid "`GLIB_SCHEMAS`"
+msgstr "`GLIB_SCHEMAS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1666
+msgid ""
+"List of all the glib schema files the port installs. The macro will add the "
+"files to the port plist and handle the registration of these files on "
+"install and deinstall."
+msgstr ""
+"Список всех файлов схем glib, которые устанавливает порт. Макрос добавит "
+"файлы в plist порта и обработает регистрацию этих файлов при установке и "
+"удалении."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1671
+msgid ""
+"The glib schema files are written in XML and end with the "
+"[.filename]#gschema.xml# extension. They are installed in the "
+"[.filename]#share/glib-2.0/schemas/# directory. These schema files contain "
+"all application config values with their default settings. The actual "
+"database used by the applications is built by glib-compile-schema, which is "
+"run by the `GLIB_SCHEMAS` macro."
+msgstr ""
+"Файлы схем glib написаны в XML и имеют расширение [.filename]#gschema.xml#. "
+"Они устанавливаются в директорию [.filename]#share/glib-2.0/schemas/#. Эти "
+"файлы схем содержат все настройки конфигурации приложений со значениями по "
+"умолчанию. Фактическая база данных, используемая приложениями, создаётся с "
+"помощью glib-compile-schema, которая запускается макросом `GLIB_SCHEMAS`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1675
+#, no-wrap
+msgid "GLIB_SCHEMAS=foo.gschema.xml\n"
+msgstr "GLIB_SCHEMAS=foo.gschema.xml\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1681
+msgid ""
+"Do not add glib schemas to the [.filename]#pkg-plist#. If they are listed "
+"in [.filename]#pkg-plist#, they will not be registered and the applications "
+"might not work properly."
+msgstr ""
+"Не добавляйте схемы glib в файл [.filename]#pkg-plist#. Если они указаны в "
+"[.filename]#pkg-plist#, они не будут зарегистрированы, и приложения могут "
+"работать некорректно."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1683
+#, no-wrap
+msgid "`GCONF_SCHEMAS`"
+msgstr "`GCONF_SCHEMAS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1686
+msgid ""
+"List all the gconf schema files. The macro will add the schema files to the "
+"port plist and will handle their registration on install and deinstall."
+msgstr ""
+"Перечислите все файлы схем gconf. Макрос добавит файлы схем в plist порта и "
+"обеспечит их регистрацию при установке и удалении."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1691
+msgid ""
+"GConf is the XML-based database that virtually all GNOME applications use "
+"for storing their settings. These files are installed into the "
+"[.filename]#etc/gconf/schemas# directory. This database is defined by "
+"installed schema files that are used to generate [.filename]#%gconf.xml# key "
+"files. For each schema file installed by the port, there must be an entry "
+"in the [.filename]#Makefile#:"
+msgstr ""
+"GConf — это база данных на основе XML, которую используют практически все "
+"приложения GNOME для хранения своих настроек. Эти файлы устанавливаются в "
+"директорию [.filename]#etc/gconf/schemas#. Эта база данных определяется "
+"установленными файлами схем, которые используются для генерации ключевых "
+"файлов [.filename]#%gconf.xml#. Для каждого файла схемы, устанавливаемого "
+"портом, должна быть запись в [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1695
+#, no-wrap
+msgid "GCONF_SCHEMAS=my_app.schemas my_app2.schemas my_app3.schemas\n"
+msgstr "GCONF_SCHEMAS=my_app.schemas my_app2.schemas my_app3.schemas\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1701
+msgid ""
+"Gconf schemas are listed in the `GCONF_SCHEMAS` macro rather than "
+"[.filename]#pkg-plist#. If they are listed in [.filename]#pkg-plist#, they "
+"will not be registered and the applications might not work properly."
+msgstr ""
+"Схемы Gconf перечислены в макросе `GCONF_SCHEMAS`, а не в файле "
+"[.filename]#pkg-plist#. Если они указаны в [.filename]#pkg-plist#, они не "
+"будут зарегистрированы, и приложения могут работать некорректно."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1703
+#, no-wrap
+msgid "`INSTALLS_OMF`"
+msgstr "`INSTALLS_OMF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1707
+msgid ""
+"Open Source Metadata Framework (OMF) files are commonly used by GNOME 2 "
+"applications. These files contain the application help file information, "
+"and require special processing by ScrollKeeper/rarian. To properly register "
+"OMF files when installing GNOME applications from packages, make sure that "
+"`omf` files are listed in `pkg-plist` and that the port "
+"[.filename]#Makefile# has `INSTALLS_OMF` defined:"
+msgstr ""
+"Файлы Open Source Metadata Framework (OMF) часто используются приложениями "
+"GNOME 2. Эти файлы содержат информацию о файлах справки приложений и требуют "
+"специальной обработки с помощью ScrollKeeper/rarian. Для правильной "
+"регистрации файлов OMF при установке приложений GNOME из пакетов убедитесь, "
+"что файлы `omf` указаны в `pkg-plist` и что в [.filename]#Makefile# порта "
+"определено `INSTALLS_OMF`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1711
+#, no-wrap
+msgid "INSTALLS_OMF=yes\n"
+msgstr "INSTALLS_OMF=yes\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1714
+msgid ""
+"When set, [.filename]#bsd.gnome.mk# automatically scans [.filename]#pkg-"
+"plist# and adds appropriate `@exec` and `@unexec` directives for each "
+"[.filename]#.omf# to track in the OMF registration database."
+msgstr ""
+"При установке [.filename]#bsd.gnome.mk# автоматически сканирует "
+"[.filename]#pkg-plist# и добавляет соответствующие директивы `@exec` и "
+"`@unexec` для каждого файла [.filename]#.omf#, который необходимо "
+"отслеживать в базе данных регистрации OMF."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1716
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1726
+#, no-wrap
+msgid "GNOME Components"
+msgstr "Компоненты GNOME"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1724
+msgid ""
+"For further help with a GNOME port, look at some of the link:https://"
+"ports.FreeBSD.org[existing ports] for examples. The link:https://"
+"www.FreeBSD.org/gnome/[FreeBSD GNOME page] has contact information if more "
+"help is needed. The components are divided into GNOME components that are "
+"currently in use and legacy components. If the component supports argument, "
+"they are listed between parenthesis in the description. The first is the "
+"default. \"Both\" is shown if the component defaults to adding to both "
+"build and run dependencies."
+msgstr ""
+"Для получения дополнительной помощи с портом GNOME, ознакомьтесь с "
+"некоторыми из link:https://ports.FreeBSD.org[существующих портов] в качестве "
+"примеров. На странице link:https://www.FreeBSD.org/gnome/[FreeBSD GNOME] "
+"указана контактная информация, если требуется дополнительная помощь. "
+"Компоненты разделены на используемые в настоящее время компоненты GNOME и "
+"устаревшие компоненты. Если компонент поддерживает аргументы, они "
+"перечислены в скобках в описании. Первый аргумент является значением по "
+"умолчанию. \"Both\" указывается, если компонент по умолчанию добавляется как "
+"в зависимости для сборки, так и для выполнения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1730
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1899
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1916
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2085
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3911
+#, no-wrap
+msgid "Component"
+msgstr "Компонент"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1731
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1917
+#, no-wrap
+msgid "Associated program"
+msgstr "Связанная программа"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1734
+#, no-wrap
+msgid "`atk`"
+msgstr "`atk`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1735
+#, no-wrap
+msgid "accessibility/atk"
+msgstr "accessibility/atk"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1737
+#, no-wrap
+msgid "Accessibility toolkit (ATK)"
+msgstr "Инструментарий доступности (ATK)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1738
+#, no-wrap
+msgid "`atkmm`"
+msgstr "`atkmm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1739
+#, no-wrap
+msgid "accessibility/atkmm"
+msgstr "accessibility/atkmm"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1741
+#, no-wrap
+msgid "c++ bindings for atk"
+msgstr "C++ интерфейс для atk"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1742
+#, no-wrap
+msgid "`cairo`"
+msgstr "`cairo`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1743
+#, no-wrap
+msgid "graphics/cairo"
+msgstr "graphics/cairo"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1745
+#, no-wrap
+msgid "Vector graphics library with cross-device output support"
+msgstr "Векторная графическая библиотека с поддержкой вывода на различные устройства"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1746
+#, no-wrap
+msgid "`cairomm`"
+msgstr "`cairomm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1747
+#, no-wrap
+msgid "graphics/cairomm"
+msgstr "graphics/cairomm"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1749
+#, no-wrap
+msgid "c++ bindings for cairo"
+msgstr "C++ интерфейс для cairo"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1750
+#, no-wrap
+msgid "`dconf`"
+msgstr "`dconf`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1751
+#, no-wrap
+msgid "devel/dconf"
+msgstr "devel/dconf"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1753
+#, no-wrap
+msgid "Configuration database system (both, build, run)"
+msgstr "Система базы данных конфигурации (both, build, run)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1754
+#, no-wrap
+msgid "`evolutiondataserver3`"
+msgstr "`evolutiondataserver3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1755
+#, no-wrap
+msgid "databases/evolution-data-server"
+msgstr "databases/evolution-data-server"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1757
+#, no-wrap
+msgid "Data backends for the Evolution integrated mail/PIM suite"
+msgstr "Бэкенды данных для интегрированного почтового клиента/PIM Evolution"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1758
+#, no-wrap
+msgid "`gdkpixbuf2`"
+msgstr "`gdkpixbuf2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1759
+#, no-wrap
+msgid "graphics/gdk-pixbuf2"
+msgstr "graphics/gdk-pixbuf2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1761
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1943
+#, no-wrap
+msgid "Graphics library for GTK+"
+msgstr "Графическая библиотека для GTK+"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1762
+#, no-wrap
+msgid "`glib20`"
+msgstr "`glib20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1763
+#, no-wrap
+msgid "devel/glib20"
+msgstr "devel/glib20"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1765
+#, no-wrap
+msgid "GNOME core library `glib20`"
+msgstr "Основная библиотека GNOME `glib20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1766
+#, no-wrap
+msgid "`glibmm`"
+msgstr "`glibmm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1767
+#, no-wrap
+msgid "devel/glibmm"
+msgstr "devel/glibmm"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1769
+#, no-wrap
+msgid "c++ bindings for glib20"
+msgstr "C++ интерфейс для glib20"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1770
+#, no-wrap
+msgid "`gnomecontrolcenter3`"
+msgstr "`gnomecontrolcenter3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1771
+#, no-wrap
+msgid "sysutils/gnome-control-center"
+msgstr "sysutils/gnome-control-center"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1773
+#, no-wrap
+msgid "GNOME 3 Control Center"
+msgstr "Центр управления GNOME 3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1774
+#, no-wrap
+msgid "`gnomedesktop3`"
+msgstr "`gnomedesktop3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1775
+#, no-wrap
+msgid "x11/gnome-desktop"
+msgstr "x11/gnome-desktop"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1777
+#, no-wrap
+msgid "GNOME 3 desktop UI library"
+msgstr "Библиотека пользовательского интерфейса рабочего стола GNOME 3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1778
+#, no-wrap
+msgid "`gsound`"
+msgstr "`gsound`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1779
+#, no-wrap
+msgid "audio/gsound"
+msgstr "audio/gsound"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1781
+#, no-wrap
+msgid "GObject library for playing system sounds (both, build, run)"
+msgstr "Библиотека GObject для воспроизведения системных звуков (both, build, run)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1782
+#, no-wrap
+msgid "`gtk-update-icon-cache`"
+msgstr "`gtk-update-icon-cache`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1783
+#, no-wrap
+msgid "graphics/gtk-update-icon-cache"
+msgstr "graphics/gtk-update-icon-cache"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1785
+#, no-wrap
+msgid "Gtk-update-icon-cache utility from the Gtk+ toolkit"
+msgstr "Утилита `gtk-update-icon-cache` из набора инструментов `Gtk+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1786
+#, no-wrap
+msgid "`gtk20`"
+msgstr "`gtk20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1787
+#, no-wrap
+msgid "x11-toolkits/gtk20"
+msgstr "x11-toolkits/gtk20"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1789
+#, no-wrap
+msgid "Gtk+ 2 toolkit"
+msgstr "Набор инструментов Gtk+ 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1790
+#, no-wrap
+msgid "`gtk30`"
+msgstr "`gtk30`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1791
+#, no-wrap
+msgid "x11-toolkits/gtk30"
+msgstr "x11-toolkits/gtk30"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1793
+#, no-wrap
+msgid "Gtk+ 3 toolkit"
+msgstr "Набор инструментов Gtk+ 3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1794
+#, no-wrap
+msgid "`gtkmm20`"
+msgstr "`gtkmm20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1795
+#, no-wrap
+msgid "x11-toolkits/gtkmm20"
+msgstr "x11-toolkits/gtkmm20"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1797
+#, no-wrap
+msgid "c++ bindings 2.0 for the gtk20 toolkit"
+msgstr "C++ интерфейс 2.0 для инструментария gtk20"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1798
+#, no-wrap
+msgid "`gtkmm24`"
+msgstr "`gtkmm24`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1799
+#, no-wrap
+msgid "x11-toolkits/gtkmm24"
+msgstr "x11-toolkits/gtkmm24"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1801
+#, no-wrap
+msgid "c++ bindings 2.4 for the gtk20 toolkit"
+msgstr "C++ интерфейс 2.4 для инструментария gtk20"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1802
+#, no-wrap
+msgid "`gtkmm30`"
+msgstr "`gtkmm30`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1803
+#, no-wrap
+msgid "x11-toolkits/gtkmm30"
+msgstr "x11-toolkits/gtkmm30"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1805
+#, no-wrap
+msgid "c++ bindings 3.0 for the gtk30 toolkit"
+msgstr "C++ интерфейс 3.0 для набора инструментов gtk30"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1806
+#, no-wrap
+msgid "`gtksourceview2`"
+msgstr "`gtksourceview2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1807
+#, no-wrap
+msgid "x11-toolkits/gtksourceview2"
+msgstr "x11-toolkits/gtksourceview2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1809
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1987
+#, no-wrap
+msgid "Widget that adds syntax highlighting to GtkTextView"
+msgstr "Виджет, добавляющий подсветку синтаксиса в GtkTextView"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1810
+#, no-wrap
+msgid "`gtksourceview3`"
+msgstr "`gtksourceview3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1811
+#, no-wrap
+msgid "x11-toolkits/gtksourceview3"
+msgstr "x11-toolkits/gtksourceview3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1813
+#, no-wrap
+msgid "Text widget that adds syntax highlighting to the GtkTextView widget"
+msgstr "Текстовая виджет, добавляющая подсветку синтаксиса к виджету GtkTextView"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1814
+#, no-wrap
+msgid "`gtksourceviewmm3`"
+msgstr "`gtksourceviewmm3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1815
+#, no-wrap
+msgid "x11-toolkits/gtksourceviewmm3"
+msgstr "x11-toolkits/gtksourceviewmm3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1817
+#, no-wrap
+msgid "c++ bindings for the gtksourceview3 library"
+msgstr "C++ интерфейс для библиотеки gtksourceview3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1818
+#, no-wrap
+msgid "`gvfs`"
+msgstr "`gvfs`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1819
+#, no-wrap
+msgid "devel/gvfs"
+msgstr "devel/gvfs"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1821
+#, no-wrap
+msgid "GNOME virtual file system"
+msgstr "Виртуальная файловая система GNOME"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1822
+#, no-wrap
+msgid "`intltool`"
+msgstr "`intltool`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1823
+#, no-wrap
+msgid "textproc/intltool"
+msgstr "textproc/intltool"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1825
+#, no-wrap
+msgid "Tool for internationalization (also see intlhack)"
+msgstr "Инструмент для интернационализации (см. также intlhack)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1826
+#, no-wrap
+msgid "`introspection`"
+msgstr "`introspection`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1827
+#, no-wrap
+msgid "devel/gobject-introspection"
+msgstr "devel/gobject-introspection"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1829
+#, no-wrap
+msgid "Basic introspection bindings and tools to generate introspection bindings. Most of the time :build is enough, :both/:run is only need for applications that use introspection bindings. (both, build, run)"
+msgstr "Базовые привязки (биндинги) интроспекции и инструменты для генерации привязок интроспекции. В большинстве случаев достаточно `:build`, `:both`/`:run` нужны только для приложений, использующих привязки интроспекции. (both, build, run)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1830
+#, no-wrap
+msgid "`libgda5`"
+msgstr "`libgda5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1831
+#, no-wrap
+msgid "databases/libgda5"
+msgstr "databases/libgda5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1833
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2003
+#, no-wrap
+msgid "Provides uniform access to different kinds of data sources"
+msgstr "Обеспечивает единообразный доступ к различным типам источников данных"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1834
+#, no-wrap
+msgid "`libgda5-ui`"
+msgstr "`libgda5-ui`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1835
+#, no-wrap
+msgid "databases/libgda5-ui"
+msgstr "databases/libgda5-ui"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1837
+#, no-wrap
+msgid "UI library from the libgda5 library"
+msgstr "Библиотека пользовательского интерфейса из библиотеки libgda5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1838
+#, no-wrap
+msgid "`libgdamm5`"
+msgstr "`libgdamm5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1839
+#, no-wrap
+msgid "databases/libgdamm5"
+msgstr "databases/libgdamm5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1841
+#, no-wrap
+msgid "c++ bindings for the libgda5 library"
+msgstr "привязки C++ для библиотеки libgda5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1842
+#, no-wrap
+msgid "`libgsf`"
+msgstr "`libgsf`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1843
+#, no-wrap
+msgid "devel/libgsf"
+msgstr "devel/libgsf"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1845
+#, no-wrap
+msgid "Extensible I/O abstraction for dealing with structured file formats"
+msgstr "Расширяемая абстракция ввода-вывода для работы со структурированными форматами файлов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1846
+#, no-wrap
+msgid "`librsvg2`"
+msgstr "`librsvg2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1847
+#, no-wrap
+msgid "graphics/librsvg2"
+msgstr "graphics/librsvg2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1849
+#, no-wrap
+msgid "Library for parsing and rendering SVG vector-graphic files"
+msgstr "Библиотека для разбора и отображения SVG-файлов векторной графики"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1850
+#, no-wrap
+msgid "`libsigc++20`"
+msgstr "`libsigc++20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1851
+#, no-wrap
+msgid "devel/libsigc++20"
+msgstr "devel/libsigc++20"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1853
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2047
+#, no-wrap
+msgid "Callback Framework for C++"
+msgstr "Фреймворк обратных вызовов для C++"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1854
+#, no-wrap
+msgid "`libxml++26`"
+msgstr "`libxml++26`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1855
+#, no-wrap
+msgid "textproc/libxml++26"
+msgstr "textproc/libxml++26"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1857
+#, no-wrap
+msgid "c++ bindings for the libxml2 library"
+msgstr "C++ привязки для библиотеки libxml2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1858
+#, no-wrap
+msgid "`libxml2`"
+msgstr "`libxml2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1859
+#, no-wrap
+msgid "textproc/libxml2"
+msgstr "textproc/libxml2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1861
+#, no-wrap
+msgid "XML parser library (both, build, run)"
+msgstr "Библиотека парсера XML (both, build, run)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1862
+#, no-wrap
+msgid "`libxslt`"
+msgstr "`libxslt`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1863
+#, no-wrap
+msgid "textproc/libxslt"
+msgstr "textproc/libxslt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1865
+#, no-wrap
+msgid "XSLT C library (both, build, run)"
+msgstr "Библиотека XSLT (сборка, выполнение)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1866
+#, no-wrap
+msgid "`metacity`"
+msgstr "`metacity`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1867
+#, no-wrap
+msgid "x11-wm/metacity"
+msgstr "x11-wm/metacity"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1869
+#, no-wrap
+msgid "Window manager from GNOME"
+msgstr "Менеджер окон из GNOME"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1870
+#, no-wrap
+msgid "`nautilus3`"
+msgstr "`nautilus3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1871
+#, no-wrap
+msgid "x11-fm/nautilus"
+msgstr "x11-fm/nautilus"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1873
+#, no-wrap
+msgid "GNOME file manager"
+msgstr "GNOME файловый менеджер"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1874
+#, no-wrap
+msgid "`pango`"
+msgstr "`pango`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1875
+#, no-wrap
+msgid "x11-toolkits/pango"
+msgstr "x11-toolkits/pango"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1877
+#, no-wrap
+msgid "Open-source framework for the layout and rendering of i18n text"
+msgstr "Открытый фреймворк для разметки и отображения интернационализированного текста"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1878
+#, no-wrap
+msgid "`pangomm`"
+msgstr "`pangomm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1879
+#, no-wrap
+msgid "x11-toolkits/pangomm"
+msgstr "x11-toolkits/pangomm"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1881
+#, no-wrap
+msgid "c++ bindings for the pango library"
+msgstr "C++ интерфейс для библиотеки pango"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1882
+#, no-wrap
+msgid "`py3gobject3`"
+msgstr "`py3gobject3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1883
+#, no-wrap
+msgid "devel/py3-gobject3"
+msgstr "devel/py3-gobject3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1885
+#, no-wrap
+msgid "Python 3, GObject 3.0 bindings"
+msgstr "Python 3, интерфейс GObject 3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1886
+#, no-wrap
+msgid "`pygobject3`"
+msgstr "`pygobject3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1887
+#, no-wrap
+msgid "devel/py-gobject3"
+msgstr "devel/py-gobject3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1889
+#, no-wrap
+msgid "Python 2, GObject 3.0 bindings"
+msgstr "Python 2, интерфейс GObject 3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1890
+#, no-wrap
+msgid "`vte3`"
+msgstr "`vte3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1891
+#, no-wrap
+msgid "x11-toolkits/vte3"
+msgstr "x11-toolkits/vte3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1892
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2078
+#, no-wrap
+msgid "Terminal widget with improved accessibility and I18N support"
+msgstr "Виджет терминала с улучшенной поддержкой доступности и интернационализации (I18N)"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1895
+#, no-wrap
+msgid "GNOME Macro Components"
+msgstr "Компоненты макросов GNOME"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1902
+#, no-wrap
+msgid "`gnomeprefix`"
+msgstr "`gnomeprefix`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1904
+#, no-wrap
+msgid "Supply `configure` with some default locations."
+msgstr "Предоставляет `configure` некоторые стандартные расположения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1905
+#, no-wrap
+msgid "`intlhack`"
+msgstr "`intlhack`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1907
+#, no-wrap
+msgid "Same as intltool, but patches to make sure [.filename]#share/locale/# is used. Please only use when `intltool` alone is not enough."
+msgstr "То же, что и `intltool`, но с патчами для гарантии использования [.filename]#share/locale/#. Используйте только в случае, когда одного `intltool` недостаточно."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1908
+#, no-wrap
+msgid "`referencehack`"
+msgstr "`referencehack`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1909
+#, no-wrap
+msgid "This macro is there to help splitting of the API or reference documentation into its own port."
+msgstr "Этот макрос предназначен для помощи в разделении API или справочной документации на собственный порт."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1912
+#, no-wrap
+msgid "GNOME Legacy Components"
+msgstr "Компоненты GNOME Legacy"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1920
+#, no-wrap
+msgid "`atspi`"
+msgstr "`atspi`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1921
+#, no-wrap
+msgid "accessibility/at-spi"
+msgstr "accessibility/at-spi"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1923
+#, no-wrap
+msgid "Assistive Technology Service Provider Interface"
+msgstr "Интерфейс поставщика услуг вспомогательных технологий (AT-SPI)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1924
+#, no-wrap
+msgid "`esound`"
+msgstr "`esound`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1925
+#, no-wrap
+msgid "audio/esound"
+msgstr "audio/esound"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1927
+#, no-wrap
+msgid "Enlightenment sound package"
+msgstr "Пакет звука Enlightenment"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1928
+#, no-wrap
+msgid "`gal2`"
+msgstr "`gal2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1929
+#, no-wrap
+msgid "x11-toolkits/gal2"
+msgstr "x11-toolkits/gal2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1931
+#, no-wrap
+msgid "Collection of widgets taken from GNOME 2 gnumeric"
+msgstr "Коллекция виджетов, взятых из GNOME 2 gnumeric"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1932
+#, no-wrap
+msgid "`gconf2`"
+msgstr "`gconf2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1933
+#, no-wrap
+msgid "devel/gconf2"
+msgstr "devel/gconf2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1935
+#, no-wrap
+msgid "Configuration database system for GNOME 2"
+msgstr "Система базы данных конфигурации для GNOME 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1936
+#, no-wrap
+msgid "`gconfmm26`"
+msgstr "`gconfmm26`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1937
+#, no-wrap
+msgid "devel/gconfmm26"
+msgstr "devel/gconfmm26"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1939
+#, no-wrap
+msgid "c++ bindings for gconf2"
+msgstr "C++ привязки C++ для gconf2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1940
+#, no-wrap
+msgid "`gdkpixbuf`"
+msgstr "`gdkpixbuf`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1941
+#, no-wrap
+msgid "graphics/gdk-pixbuf"
+msgstr "graphics/gdk-pixbuf"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1944
+#, no-wrap
+msgid "`glib12`"
+msgstr "`glib12`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1945
+#, no-wrap
+msgid "devel/glib12"
+msgstr "devel/glib12"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1947
+#, no-wrap
+msgid "glib 1.2 core library"
+msgstr "Библиотека ядра glib 1.2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1948
+#, no-wrap
+msgid "`gnomedocutils`"
+msgstr "`gnomedocutils`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1949
+#, no-wrap
+msgid "textproc/gnome-doc-utils"
+msgstr "textproc/gnome-doc-utils"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1951
+#, no-wrap
+msgid "GNOME doc utils"
+msgstr "Утилиты документации GNOME"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1952
+#, no-wrap
+msgid "`gnomemimedata`"
+msgstr "`gnomemimedata`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1953
+#, no-wrap
+msgid "misc/gnome-mime-data"
+msgstr "misc/gnome-mime-data"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1955
+#, no-wrap
+msgid "MIME and Application database for GNOME 2"
+msgstr "База данных MIME и приложений для GNOME 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1956
+#, no-wrap
+msgid "`gnomesharp20`"
+msgstr "`gnomesharp20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1957
+#, no-wrap
+msgid "x11-toolkits/gnome-sharp20"
+msgstr "x11-toolkits/gnome-sharp20"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1959
+#, no-wrap
+msgid "GNOME 2 interfaces for the .NET runtime"
+msgstr "Интерфейсы GNOME 2 для среды выполнения .NET"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1960
+#, no-wrap
+msgid "`gnomespeech`"
+msgstr "`gnomespeech`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1961
+#, no-wrap
+msgid "accessibility/gnome-speech"
+msgstr "accessibility/gnome-speech"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1963
+#, no-wrap
+msgid "GNOME 2 text-to-speech API"
+msgstr "GNOME 2 API преобразования текста в речь"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1964
+#, no-wrap
+msgid "`gnomevfs2`"
+msgstr "`gnomevfs2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1965
+#, no-wrap
+msgid "devel/gnome-vfs"
+msgstr "devel/gnome-vfs"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1967
+#, no-wrap
+msgid "GNOME 2 Virtual File System"
+msgstr "Виртуальная файловая система GNOME 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1968
+#, no-wrap
+msgid "`gtk12`"
+msgstr "`gtk12`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1969
+#, no-wrap
+msgid "x11-toolkits/gtk12"
+msgstr "x11-toolkits/gtk12"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1971
+#, no-wrap
+msgid "Gtk+ 1.2 toolkit"
+msgstr "Набор инструментов Gtk+ 1.2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1972
+#, no-wrap
+msgid "`gtkhtml3`"
+msgstr "`gtkhtml3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1973
+#, no-wrap
+msgid "www/gtkhtml3"
+msgstr "www/gtkhtml3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1975
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1979
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2035
+#, no-wrap
+msgid "Lightweight HTML rendering/printing/editing engine"
+msgstr "Облегченный движок для отображения/печати/редактирования HTML"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1976
+#, no-wrap
+msgid "`gtkhtml4`"
+msgstr "`gtkhtml4`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1977
+#, no-wrap
+msgid "www/gtkhtml4"
+msgstr "www/gtkhtml4"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1980
+#, no-wrap
+msgid "`gtksharp20`"
+msgstr "`gtksharp20`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1981
+#, no-wrap
+msgid "x11-toolkits/gtk-sharp20"
+msgstr "x11-toolkits/gtk-sharp20"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1983
+#, no-wrap
+msgid "GTK+ and GNOME 2 interfaces for the .NET runtime"
+msgstr "Интерфейсы GTK+ и GNOME 2 для среды выполнения .NET"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1984
+#, no-wrap
+msgid "`gtksourceview`"
+msgstr "`gtksourceview`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1985
+#, no-wrap
+msgid "x11-toolkits/gtksourceview"
+msgstr "x11-toolkits/gtksourceview"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1988
+#, no-wrap
+msgid "`libartgpl2`"
+msgstr "`libartgpl2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1989
+#, no-wrap
+msgid "graphics/libart_lgpl"
+msgstr "graphics/libart_lgpl"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1991
+#, no-wrap
+msgid "Library for high-performance 2D graphics"
+msgstr "Библиотека для высокопроизводительной 2D графики"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1992
+#, no-wrap
+msgid "`libbonobo`"
+msgstr "`libbonobo`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1993
+#, no-wrap
+msgid "devel/libbonobo"
+msgstr "devel/libbonobo"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1995
+#, no-wrap
+msgid "Component and compound document system for GNOME 2"
+msgstr "Система компонентов и составных документов для GNOME 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1996
+#, no-wrap
+msgid "`libbonoboui`"
+msgstr "`libbonoboui`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1997
+#, no-wrap
+msgid "x11-toolkits/libbonoboui"
+msgstr "x11-toolkits/libbonoboui"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:1999
+#, no-wrap
+msgid "GUI frontend to the libbonobo component of GNOME 2"
+msgstr "Интерфейс для libbonobo в GNOME 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2000
+#, no-wrap
+msgid "`libgda4`"
+msgstr "`libgda4`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2001
+#, no-wrap
+msgid "databases/libgda4"
+msgstr "databases/libgda4"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2004
+#, no-wrap
+msgid "`libglade2`"
+msgstr "`libglade2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2005
+#, no-wrap
+msgid "devel/libglade2"
+msgstr "devel/libglade2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2007
+#, no-wrap
+msgid "GNOME 2 glade library"
+msgstr "Библиотека glade для GNOME 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2008
+#, no-wrap
+msgid "`libgnome`"
+msgstr "`libgnome`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2009
+#, no-wrap
+msgid "x11/libgnome"
+msgstr "x11/libgnome"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2011
+#, no-wrap
+msgid "Libraries for GNOME 2, a GNU desktop environment"
+msgstr "Библиотеки для GNOME 2, GNU окружения рабочего стола"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2012
+#, no-wrap
+msgid "`libgnomecanvas`"
+msgstr "`libgnomecanvas`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2013
+#, no-wrap
+msgid "graphics/libgnomecanvas"
+msgstr "graphics/libgnomecanvas"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2015
+#, no-wrap
+msgid "Graphics library for GNOME 2"
+msgstr "Графическая библиотека для GNOME 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2016
+#, no-wrap
+msgid "`libgnomekbd`"
+msgstr "`libgnomekbd`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2017
+#, no-wrap
+msgid "x11/libgnomekbd"
+msgstr "x11/libgnomekbd"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2019
+#, no-wrap
+msgid "GNOME 2 keyboard shared library"
+msgstr "Динамическая библиотека клавиатуры GNOME 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2020
+#, no-wrap
+msgid "`libgnomeprint`"
+msgstr "`libgnomeprint`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2021
+#, no-wrap
+msgid "print/libgnomeprint"
+msgstr "print/libgnomeprint"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2023
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2027
+#, no-wrap
+msgid "Gnome 2 print support library"
+msgstr "Библиотека поддержки печати Gnome 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2024
+#, no-wrap
+msgid "`libgnomeprintui`"
+msgstr "`libgnomeprintui`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2025
+#, no-wrap
+msgid "x11-toolkits/libgnomeprintui"
+msgstr "x11-toolkits/libgnomeprintui"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2028
+#, no-wrap
+msgid "`libgnomeui`"
+msgstr "`libgnomeui`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2029
+#, no-wrap
+msgid "x11-toolkits/libgnomeui"
+msgstr "x11-toolkits/libgnomeui"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2031
+#, no-wrap
+msgid "Libraries for the GNOME 2 GUI, a GNU desktop environment"
+msgstr "Библиотеки для графического интерфейса GNOME 2, среды рабочего стола GNU"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2032
+#, no-wrap
+msgid "`libgtkhtml`"
+msgstr "`libgtkhtml`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2033
+#, no-wrap
+msgid "www/libgtkhtml"
+msgstr "www/libgtkhtml"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2036
+#, no-wrap
+msgid "`libgtksourceviewmm`"
+msgstr "`libgtksourceviewmm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2037
+#, no-wrap
+msgid "x11-toolkits/libgtksourceviewmm"
+msgstr "x11-toolkits/libgtksourceviewmm"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2039
+#, no-wrap
+msgid "c++ binding of GtkSourceView"
+msgstr "C++ интерфейс GtkSourceView"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2040
+#, no-wrap
+msgid "`libidl`"
+msgstr "`libidl`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2041
+#, no-wrap
+msgid "devel/libIDL"
+msgstr "devel/libIDL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2043
+#, no-wrap
+msgid "Library for creating trees of CORBA IDL file"
+msgstr "Библиотека для создания деревьев файлов CORBA IDL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2044
+#, no-wrap
+msgid "`libsigc++12`"
+msgstr "`libsigc++12`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2045
+#, no-wrap
+msgid "devel/libsigc++12"
+msgstr "devel/libsigc++12"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2048
+#, no-wrap
+msgid "`libwnck`"
+msgstr "`libwnck`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2049
+#, no-wrap
+msgid "x11-toolkits/libwnck"
+msgstr "x11-toolkits/libwnck"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2051
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2055
+#, no-wrap
+msgid "Library used for writing pagers and taskslists"
+msgstr "Библиотека, используемая для написания пейджеров и списков задач"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2052
+#, no-wrap
+msgid "`libwnck3`"
+msgstr "`libwnck3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2053
+#, no-wrap
+msgid "x11-toolkits/libwnck3"
+msgstr "x11-toolkits/libwnck3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2056
+#, no-wrap
+msgid "`orbit2`"
+msgstr "`orbit2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2057
+#, no-wrap
+msgid "devel/ORBit2"
+msgstr "devel/ORBit2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2059
+#, no-wrap
+msgid "High-performance CORBA ORB with support for the C language"
+msgstr "Высокопроизводительный CORBA ORB с поддержкой языка C"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2060
+#, no-wrap
+msgid "`pygnome2`"
+msgstr "`pygnome2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2061
+#, no-wrap
+msgid "x11-toolkits/py-gnome2"
+msgstr "x11-toolkits/py-gnome2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2063
+#, no-wrap
+msgid "Python bindings for GNOME 2"
+msgstr "Интерфейс Python для GNOME 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2064
+#, no-wrap
+msgid "`pygobject`"
+msgstr "`pygobject`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2065
+#, no-wrap
+msgid "devel/py-gobject"
+msgstr "devel/py-gobject"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2067
+#, no-wrap
+msgid "Python 2, GObject 2.0 bindings"
+msgstr "Python 2, интерфейс GObject 2.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2068
+#, no-wrap
+msgid "`pygtk2`"
+msgstr "`pygtk2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2069
+#, no-wrap
+msgid "x11-toolkits/py-gtk2"
+msgstr "x11-toolkits/py-gtk2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2071
+#, no-wrap
+msgid "Set of Python bindings for GTK+"
+msgstr "Набор интерфейсов Python для GTK+"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2072
+#, no-wrap
+msgid "`pygtksourceview`"
+msgstr "`pygtksourceview`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2073
+#, no-wrap
+msgid "x11-toolkits/py-gtksourceview"
+msgstr "x11-toolkits/py-gtksourceview"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2075
+#, no-wrap
+msgid "Python bindings for GtkSourceView 2"
+msgstr "Интерфейс Python для GtkSourceView 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2076
+#, no-wrap
+msgid "`vte`"
+msgstr "`vte`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2077
+#, no-wrap
+msgid "x11-toolkits/vte"
+msgstr "x11-toolkits/vte"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2081
+#, no-wrap
+msgid "Deprecated Components: Do Not Use"
+msgstr "Устаревшие компоненты: не использовать"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2088
+#, no-wrap
+msgid "`pangox-compat`"
+msgstr "`pangox-compat`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2089
+#, no-wrap
+msgid "pangox-compat has been deprecated and split off from the pango package."
+msgstr "pangox-compat устарел и был отделён от пакета pango."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2092
+#, no-wrap
+msgid "Using Qt"
+msgstr "Использование Qt"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2097
+msgid ""
+"For ports that are part of Qt itself, see crossref:uses[uses-qt-dist,`qt-"
+"dist`]."
+msgstr ""
+"Для портов, которые являются частью самого Qt, см. crossref:uses[uses-qt-"
+"dist,`qt-dist`]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2100
+#, no-wrap
+msgid "Ports That Require Qt"
+msgstr "Порты, требующие Qt"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2105
+msgid ""
+"The Ports Collection provides support for Qt 5 and Qt 6 with `USES+=qt:5` "
+"and `USES+=qt:6` respectively. Set `USE_QT` to the list of required Qt "
+"components (libraries, tools, plugins)."
+msgstr ""
+"Коллекция портов поддерживает Qt 5 и Qt 6 с помощью `USES+=qt:5` и "
+"`USES+=qt:6` соответственно. Установите `USE_QT` в список необходимых "
+"компонентов Qt (libraries, tools, plugins - библиотеки, инструменты, "
+"плагины)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2107
+msgid ""
+"The Qt framework exports a number of variables which can be used by ports, "
+"some of them listed below:"
+msgstr ""
+"Фреймворк Qt экспортирует ряд переменных, которые могут использоваться "
+"портами, некоторые из них перечислены ниже:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2109
+#, no-wrap
+msgid "Variables Provided to Ports That Use Qt"
+msgstr "Переменные, предоставляемые портам, использующим Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2113
+#, no-wrap
+msgid "`QMAKE`"
+msgstr "`QMAKE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2115
+#, no-wrap
+msgid "Full path to `qmake` binary."
+msgstr "Полный путь к исполняемому файлу `qmake`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2116
+#, no-wrap
+msgid "`LRELEASE`"
+msgstr "`LRELEASE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2118
+#, no-wrap
+msgid "Full path to `lrelease` utility."
+msgstr "Полный путь к утилите `lrelease`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2119
+#, no-wrap
+msgid "`MOC`"
+msgstr "`MOC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2121
+#, no-wrap
+msgid "Full path to `moc`."
+msgstr "Полный путь к `moc`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2122
+#, no-wrap
+msgid "`RCC`"
+msgstr "`RCC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2124
+#, no-wrap
+msgid "Full path to `rcc`."
+msgstr "Полный путь к `rcc`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2125
+#, no-wrap
+msgid "`UIC`"
+msgstr "`UIC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2127
+#, no-wrap
+msgid "Full path to `uic`."
+msgstr "Полный путь к `uic`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2128
+#, no-wrap
+msgid "`QT_INCDIR`"
+msgstr "`QT_INCDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2130
+#, no-wrap
+msgid "Qt include directory."
+msgstr "Каталог включаемых файлов Qt."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2131
+#, no-wrap
+msgid "`QT_LIBDIR`"
+msgstr "`QT_LIBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2133
+#, no-wrap
+msgid "Qt libraries path."
+msgstr "Путь к библиотекам Qt."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2134
+#, no-wrap
+msgid "`QT_PLUGINDIR`"
+msgstr "`QT_PLUGINDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2135
+#, no-wrap
+msgid "Qt plugins path."
+msgstr "Путь к плагинам Qt."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2138
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3857
+#, no-wrap
+msgid "Component Selection"
+msgstr "Выбор компонентов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2145
+msgid ""
+"Individual Qt tool and library dependencies must be specified in `USE_QT`. "
+"Every component can be suffixed with `_build` or `_run`, the suffix "
+"indicating whether the dependency on the component is at buildtime or "
+"runtime. If unsuffixed, the component will be depended on at both build- "
+"and runtime. Usually, library components are specified unsuffixed, tool "
+"components are mostly specified with the `_build` suffix and plugin "
+"components are specified with the `_run` suffix. The most commonly used "
+"components are listed below (all available components are listed in "
+"`_USE_QT_ALL`, which is generated from `_USE_QT_COMMON` and "
+"`_USE_QT[56]_ONLY` in [.filename]#/usr/ports/Mk/Uses/qt.mk#):"
+msgstr ""
+"Отдельные зависимости инструментов и библиотек Qt должны быть указаны в "
+"`USE_QT`. Каждый компонент может иметь суффикс `_build` или `_run`, "
+"указывающий, требуется ли компонент во время сборки или выполнения. Если "
+"суффикс отсутствует, компонент будет требоваться как во время сборки, так и "
+"во время выполнения. Обычно компоненты библиотек указываются без суффикса, "
+"компоненты инструментов чаще всего указываются с суффиксом `_build`, а "
+"компоненты плагинов — с суффиксом `_run`. Наиболее часто используемые "
+"компоненты перечислены ниже (все доступные компоненты перечислены в "
+"`_USE_QT_ALL`, которая формируется из `_USE_QT_COMMON` и `_USE_QT[56]_ONLY` "
+"в [.filename]#/usr/ports/Mk/Uses/qt.mk#):"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2147
+#, no-wrap
+msgid "Available Qt Library Components"
+msgstr "Доступные компоненты библиотеки Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2151
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2395
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2412
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2545
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3125
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3847
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3867
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3892
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3996
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4166
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4218
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4310
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4401
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4463
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4724
+#, no-wrap
+msgid "Name"
+msgstr "Имя"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2154
+#, no-wrap
+msgid "`3d`"
+msgstr "`3d`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2156
+#, no-wrap
+msgid "Qt3D module"
+msgstr "Модуль Qt3D"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2157
+#, no-wrap
+msgid "`5compat`"
+msgstr "`5compat`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2159
+#, no-wrap
+msgid "Qt 5 compatibility module for Qt 6"
+msgstr "Модуль совместимости Qt 5 для Qt 6"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2160
+#, no-wrap
+msgid "`assistant`"
+msgstr "`assistant`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2162
+#, no-wrap
+msgid "Qt 5 documentation browser"
+msgstr "Браузер документации Qt 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2163
+#, no-wrap
+msgid "`base`"
+msgstr "`base`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2165
+#, no-wrap
+msgid "Qt 6 base module"
+msgstr "Модуль Qt 6 base"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2166
+#, no-wrap
+msgid "`canvas3d`"
+msgstr "`canvas3d`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2168
+#, no-wrap
+msgid "Qt canvas3d module"
+msgstr "Модуль Qt canvas3d"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2169
+#, no-wrap
+msgid "`charts`"
+msgstr "`charts`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2171
+#, no-wrap
+msgid "Qt 5 charts module"
+msgstr "Модуль Qt 5 charts"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2172
+#, no-wrap
+msgid "`concurrent`"
+msgstr "`concurrent`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2174
+#, no-wrap
+msgid "Qt multi-threading module"
+msgstr "Модуль многопоточности Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2175
+#, no-wrap
+msgid "`connectivity`"
+msgstr "`connectivity`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2177
+#, no-wrap
+msgid "Qt connectivity (Bluetooth/NFC) module"
+msgstr "Модуль Qt для подключения (Bluetooth/NFC)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2178
+#, no-wrap
+msgid "`core`"
+msgstr "`core`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2180
+#, no-wrap
+msgid "Qt core non-graphical module"
+msgstr "Ядро Qt, неграфический модуль"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2181
+#, no-wrap
+msgid "`datavis3d`"
+msgstr "`datavis3d`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2183
+#, no-wrap
+msgid "Qt 5 3D data visualization module"
+msgstr "Модуль визуализации 3D данных Qt 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2184
+#, no-wrap
+msgid "`dbus`"
+msgstr "`dbus`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2186
+#, no-wrap
+msgid "Qt D-Bus inter-process communication module"
+msgstr "Модуль межпроцессного взаимодействия Qt D-Bus"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2187
+#, no-wrap
+msgid "`declarative`"
+msgstr "`declarative`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2189
+#, no-wrap
+msgid "Qt declarative framework for dynamic user interfaces"
+msgstr "Декларативный фреймворк Qt для динамических пользовательских интерфейсов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2190
+#, no-wrap
+msgid "`designer`"
+msgstr "`designer`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2192
+#, no-wrap
+msgid "Qt 5 graphical user interface designer"
+msgstr "Интерфейсный конструктор Qt 5 для графического пользовательского интерфейса"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2193
+#, no-wrap
+msgid "`diag`"
+msgstr "`diag`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2195
+#, no-wrap
+msgid "Tool for reporting diagnostic information about Qt and its environment"
+msgstr "Инструмент для сбора диагностической информации о Qt и его окружении"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2196
+#, no-wrap
+msgid "`doc`"
+msgstr "`doc`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2198
+#, no-wrap
+msgid "Qt 5 documentation"
+msgstr "Документация Qt 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2199
+#, no-wrap
+msgid "`examples`"
+msgstr "`examples`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2201
+#, no-wrap
+msgid "Qt 5 examples sourcecode"
+msgstr "Исходный код примеров Qt 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2202
+#, no-wrap
+msgid "`gamepad`"
+msgstr "`gamepad`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2204
+#, no-wrap
+msgid "Qt 5 Gamepad Module"
+msgstr "Модуль Qt 5 Gamepad"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2205
+#, no-wrap
+msgid "`graphicaleffects`"
+msgstr "`graphicaleffects`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2207
+#, no-wrap
+msgid "Qt Quick graphical effects"
+msgstr "Графические эффекты Qt Quick"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2208
+#, no-wrap
+msgid "`gui`"
+msgstr "`gui`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2210
+#, no-wrap
+msgid "Qt graphical user interface module"
+msgstr "Модуль графического интерфейса Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2211
+#, no-wrap
+msgid "`help`"
+msgstr "`help`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2213
+#, no-wrap
+msgid "Qt online help integration module"
+msgstr "Модуль интеграции справки Qt в режиме онлайн"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2214
+#, no-wrap
+msgid "`l10n`"
+msgstr "`l10n`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2216
+#, no-wrap
+msgid "Qt localized messages"
+msgstr "Локализованные сообщения Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2217
+#, no-wrap
+msgid "`languageserver`"
+msgstr "`languageserver`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2219
+#, no-wrap
+msgid "Qt 6 Language Server Protocol implementation"
+msgstr "Реализация протокола Language Server Protocol в Qt 6"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2220
+#, no-wrap
+msgid "`linguist`"
+msgstr "`linguist`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2222
+#, no-wrap
+msgid "Qt 5 translation tool"
+msgstr "Инструмент перевода Qt 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2223
+#, no-wrap
+msgid "`location`"
+msgstr "`location`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2225
+#, no-wrap
+msgid "Qt location module"
+msgstr "Модуль Qt Location"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2226
+#, no-wrap
+msgid "`lottie`"
+msgstr "`lottie`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2228
+#, no-wrap
+msgid "Qt 6 QML API for rendering graphics and animations"
+msgstr "Qt 6 QML API для отрисовки графики и анимаций"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2229
+#, no-wrap
+msgid "`multimedia`"
+msgstr "`multimedia`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2231
+#, no-wrap
+msgid "Qt audio, video, radio and camera support module"
+msgstr "Модуль поддержки аудио, видео, радио и камеры Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2232
+#, no-wrap
+msgid "`network`"
+msgstr "`network`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2234
+#, no-wrap
+msgid "Qt network module"
+msgstr "Сетевой модуль Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2235
+#, no-wrap
+msgid "`networkauth`"
+msgstr "`networkauth`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2237
+#, no-wrap
+msgid "Qt network auth module"
+msgstr "Модуль сетевой аутентификации Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2238
+#, no-wrap
+msgid "`opengl`"
+msgstr "`opengl`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2240
+#, no-wrap
+msgid "Qt 5-compatible OpenGL support module"
+msgstr "Модуль поддержки OpenGL, совместимый с Qt 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2241
+#, no-wrap
+msgid "`paths`"
+msgstr "`paths`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2243
+#, no-wrap
+msgid "Command line client to QStandardPaths"
+msgstr "Клиент командной строки для QStandardPaths"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2244
+#, no-wrap
+msgid "`phonon4`"
+msgstr "`phonon4`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2246
+#, no-wrap
+msgid "KDE multimedia framework"
+msgstr "Мультимедийный фреймворк KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2247
+#, no-wrap
+msgid "`pixeltool`"
+msgstr "`pixeltool`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2249
+#, no-wrap
+msgid "Qt 5 screen magnifier"
+msgstr "Увеличитель экрана Qt 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2250
+#, no-wrap
+msgid "`plugininfo`"
+msgstr "`plugininfo`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2252
+#, no-wrap
+msgid "Qt 5 plugin metadata dumper"
+msgstr "Дампер метаданных плагинов Qt 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2253
+#, no-wrap
+msgid "`positioning`"
+msgstr "`positioning`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2255
+#, no-wrap
+msgid "Qt 6 positioning API from sources such as satellite, wifi or text files."
+msgstr "Qt 6 API позиционирования из источников, таких как спутники, Wi-Fi или текстовые файлы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2256
+#, no-wrap
+msgid "`printsupport`"
+msgstr "`printsupport`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2258
+#, no-wrap
+msgid "Qt print support module"
+msgstr "Модуль поддержки печати Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2259
+#, no-wrap
+msgid "`qdbus`"
+msgstr "`qdbus`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2261
+#, no-wrap
+msgid "Qt command-line interface to D-Bus"
+msgstr "Интерфейс командной строки Qt для D-Bus"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2262
+#, no-wrap
+msgid "`qdbusviewer`"
+msgstr "`qdbusviewer`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2264
+#, no-wrap
+msgid "Qt 5 graphical interface to D-Bus"
+msgstr "Графический интерфейс Qt 5 для D-Bus"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2265
+#, no-wrap
+msgid "`qdoc`"
+msgstr "`qdoc`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2267
+#, no-wrap
+msgid "Qt documentation generator"
+msgstr "Генератор документации Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2268
+#, no-wrap
+msgid "`qdoc-data`"
+msgstr "`qdoc-data`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2270
+#, no-wrap
+msgid "QDoc configuration files"
+msgstr "Файлы конфигурации QDoc"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2271
+#, no-wrap
+msgid "`qev`"
+msgstr "`qev`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2273
+#, no-wrap
+msgid "Qt QWidget events introspection tool"
+msgstr "Инструмент для интроспекции событий Qt QWidget"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2274
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2404
+#, no-wrap
+msgid "`qmake`"
+msgstr "`qmake`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2276
+#, no-wrap
+msgid "Qt Makefile generator"
+msgstr "Генератор Makefile Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2277
+#, no-wrap
+msgid "`quickcontrols`"
+msgstr "`quickcontrols`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2279
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2282
+#, no-wrap
+msgid "Set of controls for building complete interfaces in Qt Quick"
+msgstr "Набор элементов управления для создания полных интерфейсов в Qt Quick"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2280
+#, no-wrap
+msgid "`quickcontrols2`"
+msgstr "`quickcontrols2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2283
+#, no-wrap
+msgid "`remoteobjects`"
+msgstr "`remoteobjects`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2285
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2294
+#, no-wrap
+msgid "Qt 5 SXCML module"
+msgstr "Модуль Qt 5 SXCML"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2286
+#, no-wrap
+msgid "`script`"
+msgstr "`script`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2288
+#, no-wrap
+msgid "Qt 4-compatible scripting module"
+msgstr "Совместимый с Qt 4 модуль для написания сценариев"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2289
+#, no-wrap
+msgid "`scripttools`"
+msgstr "`scripttools`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2291
+#, no-wrap
+msgid "Qt Script additional components"
+msgstr "Дополнительные компоненты Qt Script"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2292
+#, no-wrap
+msgid "`scxml`"
+msgstr "`scxml`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2295
+#, no-wrap
+msgid "`sensors`"
+msgstr "`sensors`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2297
+#, no-wrap
+msgid "Qt sensors module"
+msgstr "Модуль Qt sensors"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2298
+#, no-wrap
+msgid "`serialbus`"
+msgstr "`serialbus`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2300
+#, no-wrap
+msgid "Qt functions to access industrial bus systems"
+msgstr "Функции Qt для доступа к промышленным шинным системам"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2301
+#, no-wrap
+msgid "`serialport`"
+msgstr "`serialport`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2303
+#, no-wrap
+msgid "Qt functions to access serial ports"
+msgstr "Функции Qt для доступа к последовательным портам"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2304
+#, no-wrap
+msgid "`shadertools`"
+msgstr "`shadertools`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2306
+#, no-wrap
+msgid "Qt 6 tools for the cross-platform Qt shader pipeline"
+msgstr "Инструменты Qt 6 для кроссплатформенного конвейера шейдеров Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2307
+#, no-wrap
+msgid "`speech`"
+msgstr "`speech`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2309
+#, no-wrap
+msgid "Accessibility features for Qt5"
+msgstr "Доступность в Qt5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2310
+#, no-wrap
+msgid "`sql`"
+msgstr "`sql`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2312
+#, no-wrap
+msgid "Qt SQL database integration module"
+msgstr "Модуль интеграции с базой данных Qt SQL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2313
+#, no-wrap
+msgid "`sql-ibase`"
+msgstr "`sql-ibase`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2315
+#, no-wrap
+msgid "Qt InterBase/Firebird database plugin"
+msgstr "Плагин Qt баз данных InterBase/Firebird"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2316
+#, no-wrap
+msgid "`sql-mysql`"
+msgstr "`sql-mysql`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2318
+#, no-wrap
+msgid "Qt MySQL database plugin"
+msgstr "Плагин Qt базы данных MySQL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2319
+#, no-wrap
+msgid "`sql-odbc`"
+msgstr "`sql-odbc`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2321
+#, no-wrap
+msgid "Qt Open Database Connectivity plugin"
+msgstr "Плагин Qt ODBC"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2322
+#, no-wrap
+msgid "`sql-pgsql`"
+msgstr "`sql-pgsql`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2324
+#, no-wrap
+msgid "Qt PostgreSQL database plugin"
+msgstr "Плагин Qt базы данных PostgreSQL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2325
+#, no-wrap
+msgid "`sql-sqlite2`"
+msgstr "`sql-sqlite2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2327
+#, no-wrap
+msgid "Qt SQLite 2 database plugin"
+msgstr "Плагин Qt базы данных SQLite 2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2328
+#, no-wrap
+msgid "`sql-sqlite3`"
+msgstr "`sql-sqlite3`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2330
+#, no-wrap
+msgid "Qt SQLite 3 database plugin"
+msgstr "Плагин Qt базы данных SQLite 3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2331
+#, no-wrap
+msgid "`sql-tds`"
+msgstr "`sql-tds`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2333
+#, no-wrap
+msgid "Qt TDS Database Connectivity database plugin"
+msgstr "Плагин Qt для подключение к базам данных по протоколу TDS"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2334
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3926
+#, no-wrap
+msgid "`svg`"
+msgstr "`svg`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2336
+#, no-wrap
+msgid "Qt SVG support module"
+msgstr "Модуль поддержки SVG в Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2337
+#, no-wrap
+msgid "`testlib`"
+msgstr "`testlib`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2339
+#, no-wrap
+msgid "Qt unit testing module"
+msgstr "Модуль тестирования Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2340
+#, no-wrap
+msgid "`tools`"
+msgstr "`tools`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2342
+#, no-wrap
+msgid "Qt 6 assorted tools"
+msgstr "Различные инструменты Qt 6"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2343
+#, no-wrap
+msgid "`translations`"
+msgstr "`translations`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2345
+#, no-wrap
+msgid "Qt 6 translation module"
+msgstr "Модуль перевода Qt 6"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2346
+#, no-wrap
+msgid "`uiplugin`"
+msgstr "`uiplugin`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2348
+#, no-wrap
+msgid "Custom Qt widget plugin interface for Qt Designer"
+msgstr "Интерфейс плагина пользовательского виджета Qt для Qt Designer"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2349
+#, no-wrap
+msgid "`uitools`"
+msgstr "`uitools`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2351
+#, no-wrap
+msgid "Qt Designer UI forms support module"
+msgstr "Модуль поддержки форм пользовательского интерфейса Qt Designer"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2352
+#, no-wrap
+msgid "`virtualkeyboard`"
+msgstr "`virtualkeyboard`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2354
+#, no-wrap
+msgid "Qt 5 Virtual Keyboard Module"
+msgstr "Модуль виртуальной клавиатуры Qt 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2355
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3079
+#, no-wrap
+msgid "`wayland`"
+msgstr "`wayland`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2357
+#, no-wrap
+msgid "Qt 5 wrapper for Wayland"
+msgstr "Оболочка Qt 5 для Wayland"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2358
+#, no-wrap
+msgid "`webchannel`"
+msgstr "`webchannel`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2360
+#, no-wrap
+msgid "Qt 5 library for integration of C++/QML with HTML/js clients"
+msgstr "Библиотека Qt 5 для интеграции C++/QML с клиентами на HTML/js"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2361
+#, no-wrap
+msgid "`webengine`"
+msgstr "`webengine`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2363
+#, no-wrap
+msgid "Qt 5 library to render web content"
+msgstr "Библиотека Qt 5 для отображения веб-содержимого"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2364
+#, no-wrap
+msgid "`webkit`"
+msgstr "`webkit`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2366
+#, no-wrap
+msgid "QtWebKit with a more modern WebKit code base"
+msgstr "QtWebKit с более современной кодовой базой WebKit"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2367
+#, no-wrap
+msgid "`websockets`"
+msgstr "`websockets`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2369
+#, no-wrap
+msgid "Qt implementation of WebSocket protocol"
+msgstr "Реализация протокола WebSocket на Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2370
+#, no-wrap
+msgid "`websockets-qml`"
+msgstr "`websockets-qml`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2372
+#, no-wrap
+msgid "Qt implementation of WebSocket protocol (QML bindings)"
+msgstr "Реализация протокола WebSocket на Qt (привязки QML)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2373
+#, no-wrap
+msgid "`webview`"
+msgstr "`webview`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2375
+#, no-wrap
+msgid "Qt component for displaying web content"
+msgstr "Компонент Qt для отображения веб-содержимого"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2376
+#, no-wrap
+msgid "`widgets`"
+msgstr "`widgets`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2378
+#, no-wrap
+msgid "Qt C++ widgets module"
+msgstr "Модуль виджетов Qt C++"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2379
+#, no-wrap
+msgid "`x11extras`"
+msgstr "`x11extras`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2381
+#, no-wrap
+msgid "Qt platform-specific features for X11-based systems"
+msgstr "Платформо-специфичные возможности Qt для систем на основе X11"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2382
+#, no-wrap
+msgid "`xml`"
+msgstr "`xml`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2384
+#, no-wrap
+msgid "Qt SAX and DOM implementations"
+msgstr "Реализации SAX и DOM в Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2385
+#, no-wrap
+msgid "`xmlpatterns`"
+msgstr "`xmlpatterns`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2386
+#, no-wrap
+msgid "Qt support for XPath, XQuery, XSLT and XML Schema"
+msgstr "Поддержка Qt для XPath, XQuery, XSLT и XML Schema"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2389
+msgid ""
+"To determine the libraries an application depends on, run `ldd` on the main "
+"executable after a successful compilation."
+msgstr ""
+"Чтобы определить библиотеки, от которых зависит приложение, выполните `ldd` "
+"для основного исполняемого файла после успешной компиляции."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2391
+#, no-wrap
+msgid "Available Qt Tool Components"
+msgstr "Доступные компоненты инструментов Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2398
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3128
+#, no-wrap
+msgid "`buildtools`"
+msgstr "`buildtools`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2400
+#, no-wrap
+msgid "build tools (`moc`, `rcc`), needed for almost every Qt application."
+msgstr "инструменты сборки (`moc`, `rcc`), необходимые практически для любого приложения Qt."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2401
+#, no-wrap
+msgid "`linguisttools`"
+msgstr "`linguisttools`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2403
+#, no-wrap
+msgid "localization tools: `lrelease`, `lupdate`"
+msgstr "инструменты локализации: `lrelease`, `lupdate`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2405
+#, no-wrap
+msgid "Makefile generator/build utility"
+msgstr "Генератор Makefile/утилита сборки"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2408
+#, no-wrap
+msgid "Available Qt Plugin Components"
+msgstr "Доступные компоненты плагинов Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2415
+#, no-wrap
+msgid "`imageformats`"
+msgstr "`imageformats`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2416
+#, no-wrap
+msgid "plugins for TGA, TIFF, and MNG image formats"
+msgstr "плагины для графических форматов TGA, TIFF и MNG"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2419
+#, no-wrap
+msgid "Selecting Qt 5 Components"
+msgstr "Выбор компонентов Qt 5"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2425
+msgid ""
+"In this example, the ported application uses the Qt 5 graphical user "
+"interface library, the Qt 5 core library, all of the Qt 5 code generation "
+"tools and Qt 5's Makefile generator. Since the `gui` library implies a "
+"dependency on the core library, `core` does not need to be specified. The "
+"Qt 5 code generation tools `moc`, `uic` and `rcc`, as well as the Makefile "
+"generator `qmake` are only needed at buildtime, thus they are specified with "
+"the `_build` suffix:"
+msgstr ""
+"В этом примере портированное приложение использует библиотеку графического "
+"интерфейса Qt 5, основную библиотеку Qt 5, все инструменты генерации кода Qt "
+"5 и генератор Makefile Qt 5. Поскольку библиотека `gui` подразумевает "
+"зависимость от основной библиотеки, `core` не нужно указывать. Инструменты "
+"генерации кода Qt 5 `moc`, `uic` и `rcc`, а также генератор Makefile `qmake` "
+"требуются только во время сборки, поэтому они указаны с суффиксом `_build`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2430
+#, no-wrap
+msgid ""
+"USES=\tqt:5\n"
+"USE_QT=\tgui buildtools_build qmake_build\n"
+msgstr ""
+"USES=\tqt:5\n"
+"USE_QT=\tgui buildtools_build qmake_build\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2435
+#, no-wrap
+msgid "Using `qmake`"
+msgstr "Использование `qmake`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2443
+msgid ""
+"If the application provides a qmake project file ([.filename]#*.pro#), "
+"define `USES= qmake` along with `USE_QT`. `USES= qmake` already implies a "
+"build dependency on qmake, therefore the qmake component can be omitted from "
+"`USE_QT`. Similar to crossref:special[using-cmake,CMake], qmake supports "
+"out-of-source builds, which can be enabled by specifying the `outsource` "
+"argument (see crossref:special[using-qmake-example,`USES= qmake` example]). "
+"Also see crossref:special[using-qmake-arguments,Possible Arguments for `USES "
+"qmake`]."
+msgstr ""
+"Если приложение предоставляет файл проекта qmake ([.filename]#*.pro#), "
+"определите `USES= qmake` вместе с `USE_QT`. `USES= qmake` уже подразумевает "
+"зависимость сборки от qmake, поэтому компонент qmake может быть опущен в "
+"`USE_QT`. Подобно crossref:special[using-cmake,CMake], qmake поддерживает "
+"сборку вне исходного дерева, которую можно включить, указав аргумент "
+"`outsource` (см. crossref:special[using-qmake-example,пример `USES= "
+"qmake`]). Также см. crossref:special[using-qmake-arguments,Возможные "
+"аргументы для `USES qmake`]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2445
+#, no-wrap
+msgid "Possible Arguments for `USES= qmake`"
+msgstr "Возможные аргументы для `USES= qmake`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2452
+#, no-wrap
+msgid "`no_configure`"
+msgstr "`no_configure`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2454
+#, no-wrap
+msgid "Do not add the configure target. This is implied by `HAS_CONFIGURE=yes` and `GNU_CONFIGURE=yes`. It is required when the build only needs the environment setup from `USES= qmake`, but otherwise runs `qmake` on its own."
+msgstr "Не добавлять цель configure. Это подразумевается при `HAS_CONFIGURE=yes` и `GNU_CONFIGURE=yes`. Это требуется, когда сборке нужна только настройка окружения из `USES= qmake`, но в остальном она запускает `qmake` самостоятельно."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2455
+#, no-wrap
+msgid "`no_env`"
+msgstr "`no_env`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2457
+#, no-wrap
+msgid "Suppress modification of the configure and make environments. It is only required when `qmake` is used to configure the software and the build fails to understand the environment setup by `USES= qmake`."
+msgstr "Подавить модификацию окружения configure и make. Это требуется только когда `qmake` используется для настройки программного обеспечения и сборка не понимает окружение, установленное `USES= qmake`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2458
+#, no-wrap
+msgid "`norecursive`"
+msgstr "`norecursive`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2460
+#, no-wrap
+msgid "Do not pass the `-recursive` argument to `qmake`."
+msgstr "Не передавать аргумент `-recursive` в `qmake`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2461
+#, no-wrap
+msgid "`outsource`"
+msgstr "`outsource`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2462
+#, no-wrap
+msgid "Perform an out-of-source build."
+msgstr "Выполнить сборку вне исходного кода."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2465
+#, no-wrap
+msgid "Variables for Ports That Use `qmake`"
+msgstr "Переменные для портов, использующих `qmake`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2472
+#, no-wrap
+msgid "`QMAKE_ARGS`"
+msgstr "`QMAKE_ARGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2474
+#, no-wrap
+msgid "Port specific qmake flags to be passed to the `qmake` binary."
+msgstr "Специфичные для порта флаги qmake, передаваемые в бинарный файл `qmake`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2475
+#, no-wrap
+msgid "`QMAKE_ENV`"
+msgstr "`QMAKE_ENV`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2477
+#, no-wrap
+msgid "Environment variables to be set for the `qmake` binary. The default is `${CONFIGURE_ENV}`."
+msgstr "Переменные окружения, которые должны быть установлены для бинарного файла `qmake`. По умолчанию используется `${CONFIGURE_ENV}`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2478
+#, no-wrap
+msgid "`QMAKE_SOURCE_PATH`"
+msgstr "`QMAKE_SOURCE_PATH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2479
+#, no-wrap
+msgid "Path to qmake project files ([.filename]#.pro#). The default is `${WRKSRC}` if an out-of-source build is requested, empty otherwise."
+msgstr "Путь к файлам проекта qmake ([.filename]#.pro#). По умолчанию используется `${WRKSRC}`, если запрошена сборка вне исходного кода, в противном случае оставляется пустым."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2482
+msgid "When using `USES= qmake`, these settings are deployed:"
+msgstr "При использовании `USES= qmake` применяются следующие настройки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2489
+#, no-wrap
+msgid ""
+"CONFIGURE_ARGS+=\t--with-qt-includes=${QT_INCDIR} \\\n"
+"\t\t\t--with-qt-libraries=${QT_LIBDIR} \\\n"
+"\t\t\t--with-extra-libs=${LOCALBASE}/lib \\\n"
+"\t\t\t--with-extra-includes=${LOCALBASE}/include\n"
+msgstr ""
+"CONFIGURE_ARGS+=\t--with-qt-includes=${QT_INCDIR} \\\n"
+"\t\t\t--with-qt-libraries=${QT_LIBDIR} \\\n"
+"\t\t\t--with-extra-libs=${LOCALBASE}/lib \\\n"
+"\t\t\t--with-extra-includes=${LOCALBASE}/include\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2493
+#, no-wrap
+msgid ""
+"CONFIGURE_ENV+=\tQTDIR=\"${QT_PREFIX}\" QMAKE=\"${QMAKE}\" \\\n"
+"\t\tMOC=\"${MOC}\" RCC=\"${RCC}\" UIC=\"${UIC}\" \\\n"
+"\t\tQMAKESPEC=\"${QMAKESPEC}\"\n"
+msgstr ""
+"CONFIGURE_ENV+=\tQTDIR=\"${QT_PREFIX}\" QMAKE=\"${QMAKE}\" \\\n"
+"\t\tMOC=\"${MOC}\" RCC=\"${RCC}\" UIC=\"${UIC}\" \\\n"
+"\t\tQMAKESPEC=\"${QMAKESPEC}\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2497
+#, no-wrap
+msgid ""
+"PLIST_SUB+=\tQT_INCDIR=${QT_INCDIR_REL} \\\n"
+"\t\tQT_LIBDIR=${QT_LIBDIR_REL} \\\n"
+"\t\tQT_PLUGINDIR=${QT_PLUGINDIR_REL}\n"
+msgstr ""
+"PLIST_SUB+=\tQT_INCDIR=${QT_INCDIR_REL} \\\n"
+"\t\tQT_LIBDIR=${QT_LIBDIR_REL} \\\n"
+"\t\tQT_PLUGINDIR=${QT_PLUGINDIR_REL}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2501
+msgid ""
+"Some configure scripts do not support the arguments above. To suppress "
+"modification of `CONFIGURE_ENV` and `CONFIGURE_ARGS`, set `USES= "
+"qmake:no_env`."
+msgstr ""
+"Некоторые скрипты configure не поддерживают указанные выше аргументы. Чтобы "
+"отключить изменение `CONFIGURE_ENV` и `CONFIGURE_ARGS`, установите `USES= "
+"qmake:no_env`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2503
+#, no-wrap
+msgid "`USES= qmake` Example"
+msgstr "Пример `USES= qmake`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2507
+msgid "This snippet demonstrates the use of qmake for a Qt 5 port:"
+msgstr "Этот фрагмент демонстрирует использование qmake для порта Qt 5:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2512
+#, no-wrap
+msgid ""
+"USES=\tqmake:outsource qt:5\n"
+"USE_QT=\tbuildtools_build\n"
+msgstr ""
+"USES=\tqmake:outsource qt:5\n"
+"USE_QT=\tbuildtools_build\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2517
+msgid ""
+"Qt applications are often written to be cross-platform and often X11/Unix is "
+"not the platform they are developed on, which in turn leads to certain loose "
+"ends, like:"
+msgstr ""
+"Приложения Qt часто разрабатываются как кроссплатформенные, и зачастую X11/"
+"Unix — не та платформа, на которой они создаются. Это, в свою очередь, "
+"приводит к определённым недоработкам, таким как:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2519
+msgid ""
+"_Missing additional include paths._ Many applications come with system tray "
+"icon support, but neglect to look for includes and/or libraries in the X11 "
+"directories. To add directories to `qmake`'s include and library search "
+"paths via the command line, use:"
+msgstr ""
+"_Отсутствуют дополнительные пути для заголовочных файлов._ Многие приложения "
+"поддерживают значки в системном трее, но не учитывают пути для заголовочных "
+"файлов и/или библиотек в каталогах X11. Чтобы добавить каталоги в пути "
+"поиска заголовочных файлов и библиотек для `qmake` через командную строку, "
+"используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2524
+#, no-wrap
+msgid ""
+"QMAKE_ARGS+=\tINCLUDEPATH+=${LOCALBASE}/include \\\n"
+"\t\tLIBS+=-L${LOCALBASE}/lib\n"
+msgstr ""
+"QMAKE_ARGS+=\tINCLUDEPATH+=${LOCALBASE}/include \\\n"
+"\t\tLIBS+=-L${LOCALBASE}/lib\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2527
+msgid ""
+"_Bogus installation paths._ Sometimes data such as icons or .desktop files "
+"are by default installed into directories which are not scanned by XDG-"
+"compatible applications. package:editors/texmaker[] is an example for this - "
+"look at [.filename]#patch-texmaker.pro# in the [.filename]#files# directory "
+"of that port for a template on how to remedy this directly in the `qmake` "
+"project file."
+msgstr ""
+"_Некорректные пути установки._ Иногда данные, такие как иконки или "
+"файлы .desktop, по умолчанию устанавливаются в каталоги, которые не "
+"сканируются приложениями, совместимыми с XDG. Например, package:editors/"
+"texmaker[] — посмотрите на файл [.filename]#patch-texmaker.pro# в директории "
+"[.filename]#files# этого порта, чтобы увидеть шаблон исправления этой "
+"проблемы напрямую в проектом файле `qmake`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2529
+#, no-wrap
+msgid "Using KDE"
+msgstr "Использование KDE"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2532
+#, no-wrap
+msgid "KDE Variable Definitions"
+msgstr "Определения переменных KDE"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2539
+msgid ""
+"If the application depends on KDE, set `USES+=kde:5` and `USE_KDE` to the "
+"list of required components. `_build` and `_run` suffixes can be used to "
+"force components dependency type (for example, `baseapps_run`). If no "
+"suffix is set, a default dependency type will be used. To force both types, "
+"add the component twice with both suffixes (for example, `ecm_build "
+"ecm_run`). Available components are listed below (up-to-date components are "
+"also listed in [.filename]#/usr/ports/Mk/Uses/kde.mk#):"
+msgstr ""
+"Если приложение зависит от KDE, установите `USES+=kde:5` и `USE_KDE` в "
+"список необходимых компонентов. Суффиксы `_build` и `_run` можно "
+"использовать для принудительного указания типа зависимости компонентов "
+"(например, `baseapps_run`). Если суффикс не задан, будет использован тип "
+"зависимости по умолчанию. Чтобы принудительно задать оба типа, добавьте "
+"компонент дважды с обоими суффиксами (например, `ecm_build ecm_run`). "
+"Доступные компоненты перечислены ниже (актуальный список компонентов также "
+"приведён в [.filename]#/usr/ports/Mk/Uses/kde.mk#):"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2541
+#, no-wrap
+msgid "Available KDE Components"
+msgstr "Доступные компоненты KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2548
+#, no-wrap
+msgid "`activities`"
+msgstr "`activities`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2550
+#, no-wrap
+msgid "KF5 runtime and library to organize work in separate activities"
+msgstr "Среда выполнения и библиотека KF5 для организации работы в отдельных автивностях"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2551
+#, no-wrap
+msgid "`activities-stats`"
+msgstr "`activities-stats`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2553
+#, no-wrap
+msgid "KF5 statistics for activities"
+msgstr "KF5 статистика для активностей"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2554
+#, no-wrap
+msgid "`activitymanagerd`"
+msgstr "`activitymanagerd`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2556
+#, no-wrap
+msgid "System service to manage user's activities, track the usage patterns"
+msgstr "Системный сервис для управления активностью пользователей, отслеживания шаблонов использования"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2557
+#, no-wrap
+msgid "`akonadi`"
+msgstr "`akonadi`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2559
+#, no-wrap
+msgid "Storage server for KDE-Pim"
+msgstr "Хранилище данных для KDE-Pim"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2560
+#, no-wrap
+msgid "`akonadicalendar`"
+msgstr "`akonadicalendar`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2562
+#, no-wrap
+msgid "Akonadi Calendar Integration"
+msgstr "Интеграция Akonadi с Календарем"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2563
+#, no-wrap
+msgid "`akonadiconsole`"
+msgstr "`akonadiconsole`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2565
+#, no-wrap
+msgid "Akonadi management and debugging console"
+msgstr "Консоль управления и отладки Akonadi"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2566
+#, no-wrap
+msgid "`akonadicontacts`"
+msgstr "`akonadicontacts`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2568
+#, no-wrap
+msgid "Libraries and daemons to implement Contact Management in Akonadi"
+msgstr "Библиотеки и демоны для реализации управления контактами в Akonadi"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2569
+#, no-wrap
+msgid "`akonadiimportwizard`"
+msgstr "`akonadiimportwizard`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2571
+#, no-wrap
+msgid "Import data from other mail clients to KMail"
+msgstr "Импорт данных из других почтовых клиентов в KMail"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2572
+#, no-wrap
+msgid "`akonadimime`"
+msgstr "`akonadimime`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2574
+#, no-wrap
+msgid "Libraries and daemons to implement basic email handling"
+msgstr "Библиотеки и демоны для реализации базовой обработки электронной почты"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2575
+#, no-wrap
+msgid "`akonadinotes`"
+msgstr "`akonadinotes`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2577
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2940
+#, no-wrap
+msgid "KDE library for accessing mail storages in MBox format"
+msgstr "Библиотека KDE для доступа к хранилищам почты в формате MBox"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2578
+#, no-wrap
+msgid "`akonadisearch`"
+msgstr "`akonadisearch`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2580
+#, no-wrap
+msgid "Libraries and daemons to implement searching in Akonadi"
+msgstr "Библиотеки и демоны для реализации поиска в Akonadi"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2581
+#, no-wrap
+msgid "`akregator`"
+msgstr "`akregator`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2583
+#, no-wrap
+msgid "A Feed Reader by KDE"
+msgstr "Читатель лент от KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2584
+#, no-wrap
+msgid "`alarmcalendar`"
+msgstr "`alarmcalendar`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2586
+#, no-wrap
+msgid "KDE API for KAlarm alarms"
+msgstr "KDE API для будильников KAlarm"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2587
+#, no-wrap
+msgid "`apidox`"
+msgstr "`apidox`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2589
+#, no-wrap
+msgid "KF5 API Documentation Tools"
+msgstr "Документация API KF5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2590
+#, no-wrap
+msgid "`archive`"
+msgstr "`archive`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2592
+#, no-wrap
+msgid "KF5 library that provides classes for handling archive formats"
+msgstr "Библиотека KF5, предоставляющая классы для работы с форматами архивов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2593
+#, no-wrap
+msgid "`attica`"
+msgstr "`attica`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2595
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2598
+#, no-wrap
+msgid "Open Collaboration Services API library KDE5 version"
+msgstr "Библиотека API Open Collaboration Services, версия для KDE5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2596
+#, no-wrap
+msgid "`attica5`"
+msgstr "`attica5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2599
+#, no-wrap
+msgid "`auth`"
+msgstr "`auth`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2601
+#, no-wrap
+msgid "KF5 abstraction to system policy and authentication features"
+msgstr "Абстракция KF5 для системной политики и функций аутентификации"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2602
+#, no-wrap
+msgid "`baloo`"
+msgstr "`baloo`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2604
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2610
+#, no-wrap
+msgid "KF5 Framework for searching and managing user metadata"
+msgstr "KF5 Фреймворк для поиска и управления пользовательскими метаданными"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2605
+#, no-wrap
+msgid "`baloo-widgets`"
+msgstr "`baloo-widgets`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2607
+#, no-wrap
+msgid "BalooWidgets library"
+msgstr "Библиотека BalooWidgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2608
+#, no-wrap
+msgid "`baloo5`"
+msgstr "`baloo5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2611
+#, no-wrap
+msgid "`blog`"
+msgstr "`blog`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2613
+#, no-wrap
+msgid "KDE API for weblogging access"
+msgstr "KDE API для доступа к веб-логам"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2614
+#, no-wrap
+msgid "`bookmarks`"
+msgstr "`bookmarks`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2616
+#, no-wrap
+msgid "KF5 library for bookmarks and the XBEL format"
+msgstr "Библиотека KF5 для закладок и формата XBEL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2617
+#, no-wrap
+msgid "`breeze`"
+msgstr "`breeze`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2619
+#, no-wrap
+msgid "Plasma5 artwork, styles and assets for the Breeze visual style"
+msgstr "Plasma5 artwork, стили и ресурсы для визуального стиля Breeze"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2620
+#, no-wrap
+msgid "`breeze-gtk`"
+msgstr "`breeze-gtk`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2622
+#, no-wrap
+msgid "Plasma5 Breeze visual style for Gtk"
+msgstr "Plasma5 Breeze визуальный стиль для Gtk"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2623
+#, no-wrap
+msgid "`breeze-icons`"
+msgstr "`breeze-icons`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2625
+#, no-wrap
+msgid "Breeze icon theme for KDE"
+msgstr "Тема значков Breeze для KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2626
+#, no-wrap
+msgid "`calendarcore`"
+msgstr "`calendarcore`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2628
+#, no-wrap
+msgid "KDE calendar access library"
+msgstr "Библиотека доступа к календарю KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2629
+#, no-wrap
+msgid "`calendarsupport`"
+msgstr "`calendarsupport`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2631
+#, no-wrap
+msgid "Calendar support libraries for KDEPim"
+msgstr "Библиотеки поддержки календарей для KDEPim"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2632
+#, no-wrap
+msgid "`calendarutils`"
+msgstr "`calendarutils`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2634
+#, no-wrap
+msgid "KDE utility and user interface functions for accessing calendar"
+msgstr "Утилита KDE и пользовательские функции интерфейса для доступа к календарю"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2635
+#, no-wrap
+msgid "`codecs`"
+msgstr "`codecs`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2637
+#, no-wrap
+msgid "KF5 library for string manipulation"
+msgstr "Библиотека KF5 для работы со строками"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2638
+#, no-wrap
+msgid "`completion`"
+msgstr "`completion`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2640
+#, no-wrap
+msgid "KF5 text completion helpers and widgets"
+msgstr "KF5 вспомогательные средства и виджеты автодополнения текста"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2641
+#, no-wrap
+msgid "`config`"
+msgstr "`config`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2643
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2646
+#, no-wrap
+msgid "KF5 widgets for configuration dialogs"
+msgstr "Виджеты KF5 для диалогов настройки"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2644
+#, no-wrap
+msgid "`configwidgets`"
+msgstr "`configwidgets`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2647
+#, no-wrap
+msgid "`contacts`"
+msgstr "`contacts`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2649
+#, no-wrap
+msgid "KDE api to manage contact information"
+msgstr "KDE API для управления контактной информацией"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2650
+#, no-wrap
+msgid "`coreaddons`"
+msgstr "`coreaddons`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2652
+#, no-wrap
+msgid "KF5 addons to QtCore"
+msgstr "KF5 аддоны для QtCore"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2653
+#, no-wrap
+msgid "`crash`"
+msgstr "`crash`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2655
+#, no-wrap
+msgid "KF5 library to handle crash analysis and bug report from apps"
+msgstr "Библиотека KF5 для обработки анализа сбоев и отчётов об ошибках в приложениях"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2656
+#, no-wrap
+msgid "`dbusaddons`"
+msgstr "`dbusaddons`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2658
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3066
+#, no-wrap
+msgid "KF5 addons to QtDBus"
+msgstr "KF5 дополнения к QtDBus"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2659
+#, no-wrap
+msgid "`decoration`"
+msgstr "`decoration`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2661
+#, no-wrap
+msgid "Plasma5 library to create window decorations"
+msgstr "Библиотека Plasma5 для создания оформления окон"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2662
+#, no-wrap
+msgid "`designerplugin`"
+msgstr "`designerplugin`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2664
+#, no-wrap
+msgid "KF5 integration of Frameworks widgets in Qt Designer/Creator"
+msgstr "Интеграция KF5 виджетов Frameworks в Qt Designer/Creator"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2665
+#, no-wrap
+msgid "`discover`"
+msgstr "`discover`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2667
+#, no-wrap
+msgid "Plasma5 package management tools"
+msgstr "Инструменты управления пакетами Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2668
+#, no-wrap
+msgid "`dnssd`"
+msgstr "`dnssd`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2670
+#, no-wrap
+msgid "KF5 abstraction to system DNSSD features"
+msgstr "Абстракция KF5 для системных функций DNSSD"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2671
+#, no-wrap
+msgid "`doctools`"
+msgstr "`doctools`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2673
+#, no-wrap
+msgid "KF5 documentation generation from docbook"
+msgstr "Генерация документации KF5 из docbook"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2674
+#, no-wrap
+msgid "`drkonqi`"
+msgstr "`drkonqi`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2676
+#, no-wrap
+msgid "Plasma5 crash handler"
+msgstr "Обработчик сбоев Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2677
+#, no-wrap
+msgid "`ecm`"
+msgstr "`ecm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2679
+#, no-wrap
+msgid "Extra modules and scripts for CMake"
+msgstr "Дополнительные модули и скрипты для CMake"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2680
+#, no-wrap
+msgid "`emoticons`"
+msgstr "`emoticons`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2682
+#, no-wrap
+msgid "KF5 library to convert emoticons"
+msgstr "Библиотека KF5 для преобразования эмотиконов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2683
+#, no-wrap
+msgid "`eventviews`"
+msgstr "`eventviews`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2685
+#, no-wrap
+msgid "Event view libriares for KDEPim"
+msgstr "Библиотеки просмотра событий для KDEPim"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2686
+#, no-wrap
+msgid "`filemetadata`"
+msgstr "`filemetadata`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2688
+#, no-wrap
+msgid "KF5 library for extracting file metadata"
+msgstr "Библиотека KF5 для извлечения метаданных файлов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2689
+#, no-wrap
+msgid "`frameworkintegration`"
+msgstr "`frameworkintegration`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2691
+#, no-wrap
+msgid "KF5 workspace and cross-framework integration plugins"
+msgstr "Плагины рабочего пространства KF5 и интеграции фреймворков"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2692
+#, no-wrap
+msgid "`gapi`"
+msgstr "`gapi`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2694
+#, no-wrap
+msgid "KDE based library to access google services"
+msgstr "Библиотека на основе KDE для доступа к сервисам Google"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2695
+#, no-wrap
+msgid "`globalaccel`"
+msgstr "`globalaccel`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2697
+#, no-wrap
+msgid "KF5 library to add support for global workspace shortcuts"
+msgstr "Библиотека KF5 для добавления поддержки глобальных сочетаний клавиш рабочего пространства"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2698
+#, no-wrap
+msgid "`grantlee-editor`"
+msgstr "`grantlee-editor`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2700
+#, no-wrap
+msgid "Editor for Grantlee themes"
+msgstr "Редактор тем Grantlee"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2701
+#, no-wrap
+msgid "`grantleetheme`"
+msgstr "`grantleetheme`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2703
+#, no-wrap
+msgid "KDE PIM grantleetheme"
+msgstr "KDE PIM grantleetheme"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2704
+#, no-wrap
+msgid "`gravatar`"
+msgstr "`gravatar`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2706
+#, no-wrap
+msgid "Library for gravatar support"
+msgstr "Библиотека для поддержки gravatar"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2707
+#, no-wrap
+msgid "`guiaddons`"
+msgstr "`guiaddons`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2709
+#, no-wrap
+msgid "KF5 addons to QtGui"
+msgstr "KF5 аддоны для QtGui"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2710
+#, no-wrap
+msgid "`holidays`"
+msgstr "`holidays`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2712
+#, no-wrap
+msgid "KDE library for calendar holidays"
+msgstr "Библиотека KDE для календарных праздников"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2713
+#, no-wrap
+msgid "`hotkeys`"
+msgstr "`hotkeys`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2715
+#, no-wrap
+msgid "Plasma5 library for hotkeys"
+msgstr "Библиотека Plasma5 для горячих клавиш"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2716
+#, no-wrap
+msgid "`i18n`"
+msgstr "`i18n`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2718
+#, no-wrap
+msgid "KF5 advanced internationalization framework"
+msgstr "KF5 — расширенная инфраструктура интернационализации"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2719
+#, no-wrap
+msgid "`iconthemes`"
+msgstr "`iconthemes`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2721
+#, no-wrap
+msgid "KF5 library for handling icons in applications"
+msgstr "Библиотека KF5 для работы с иконками в приложениях"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2722
+#, no-wrap
+msgid "`identitymanagement`"
+msgstr "`identitymanagement`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2724
+#, no-wrap
+msgid "KDE pim identities"
+msgstr "KDE pim идентификации"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2725
+#, no-wrap
+msgid "`idletime`"
+msgstr "`idletime`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2727
+#, no-wrap
+msgid "KF5 library for monitoring user activity"
+msgstr "Библиотека KF5 для мониторинга активности пользователей"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2728
+#, no-wrap
+msgid "`imap`"
+msgstr "`imap`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2730
+#, no-wrap
+msgid "KDE API for IMAP support"
+msgstr "KDE API для поддержки IMAP"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2731
+#, no-wrap
+msgid "`incidenceeditor`"
+msgstr "`incidenceeditor`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2733
+#, no-wrap
+msgid "Incidence editor libriares for KDEPim"
+msgstr "Инцидентные редакторские библиотеки для KDEPim"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2734
+#, no-wrap
+msgid "`infocenter`"
+msgstr "`infocenter`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2736
+#, no-wrap
+msgid "Plasma5 utility providing system information"
+msgstr "Утилита Plasma5, предоставляющая системную информацию"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2737
+#, no-wrap
+msgid "`init`"
+msgstr "`init`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2739
+#, no-wrap
+msgid "KF5 process launcher to speed up launching KDE applications"
+msgstr "Запускатель процессов KF5 для ускорения запуска приложений KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2740
+#, no-wrap
+msgid "`itemmodels`"
+msgstr "`itemmodels`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2742
+#, no-wrap
+msgid "KF5 models for Qt Model/View system"
+msgstr "Модели KF5 для системы Qt Model/View"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2743
+#, no-wrap
+msgid "`itemviews`"
+msgstr "`itemviews`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2745
+#, no-wrap
+msgid "KF5 widget addons for Qt Model/View"
+msgstr "KF5 виджеты-дополнения для Qt Model/View"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2746
+#, no-wrap
+msgid "`jobwidgets`"
+msgstr "`jobwidgets`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2748
+#, no-wrap
+msgid "KF5 widgets for tracking KJob instance"
+msgstr "Виджеты KF5 для отслеживания экземпляра KJob"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2749
+#, no-wrap
+msgid "`js`"
+msgstr "`js`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2751
+#, no-wrap
+msgid "KF5 library providing an ECMAScript interpreter"
+msgstr "Библиотека KF5, предоставляющая интерпретатор ECMAScript"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2752
+#, no-wrap
+msgid "`jsembed`"
+msgstr "`jsembed`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2754
+#, no-wrap
+msgid "KF5 library for binding JavaScript objects to QObjects"
+msgstr "Библиотека KF5 для привязки объектов JavaScript к QObjects"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2755
+#, no-wrap
+msgid "`kaddressbook`"
+msgstr "`kaddressbook`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2757
+#, no-wrap
+msgid "KDE contact manager"
+msgstr "Менеджер контактов KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2758
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2761
+#, no-wrap
+msgid "`kalarm`"
+msgstr "`kalarm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2760
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2763
+#, no-wrap
+msgid "Personal alarm scheduler"
+msgstr "Планировщик персональных сигналов тревоги"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2764
+#, no-wrap
+msgid "`kate`"
+msgstr "`kate`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2766
+#, no-wrap
+msgid "Basic editor framework for the KDE system"
+msgstr "Базовая структура редактора для системы KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2767
+#, no-wrap
+msgid "`kcmutils`"
+msgstr "`kcmutils`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2769
+#, no-wrap
+msgid "KF5 utilities for working with KCModules"
+msgstr "KF5 утилиты для работы с KCModules"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2770
+#, no-wrap
+msgid "`kde-cli-tools`"
+msgstr "`kde-cli-tools`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2772
+#, no-wrap
+msgid "Plasma5 non-interactive system tools"
+msgstr "Неинтерактивные системные инструменты Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2773
+#, no-wrap
+msgid "`kde-gtk-config`"
+msgstr "`kde-gtk-config`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2775
+#, no-wrap
+msgid "Plasma5 GTK2 and GTK3 configurator"
+msgstr "Plasma5 конфигуратор GTK2 и GTK3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2776
+#, no-wrap
+msgid "`kdeclarative`"
+msgstr "`kdeclarative`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2778
+#, no-wrap
+msgid "KF5 library providing integration of QML and KDE Frameworks"
+msgstr "Библиотека KF5, обеспечивающая интеграцию QML и KDE Frameworks"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2779
+#, no-wrap
+msgid "`kded`"
+msgstr "`kded`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2781
+#, no-wrap
+msgid "KF5 extensible daemon for providing system level services"
+msgstr "KF5 расширяемый демон для предоставления системных сервисов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2782
+#, no-wrap
+msgid "`kdelibs4support`"
+msgstr "`kdelibs4support`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2784
+#, no-wrap
+msgid "KF5 porting aid from KDELibs4"
+msgstr "Помощник в портировании KF5 из KDELibs4"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2785
+#, no-wrap
+msgid "`kdepim-addons`"
+msgstr "`kdepim-addons`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2787
+#, no-wrap
+msgid "KDE PIM addons"
+msgstr "Дополнения KDE PIM"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2788
+#, no-wrap
+msgid "`kdepim-apps-libs`"
+msgstr "`kdepim-apps-libs`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2790
+#, no-wrap
+msgid "KDE PIM mail related libraries"
+msgstr "Библиотеки KDE PIM, связанные с почтой"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2791
+#, no-wrap
+msgid "`kdepim-runtime5`"
+msgstr "`kdepim-runtime5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2793
+#, no-wrap
+msgid "KDE PIM tools and services"
+msgstr "Инструменты и службы KDE PIM"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2794
+#, no-wrap
+msgid "`kdeplasma-addons`"
+msgstr "`kdeplasma-addons`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2796
+#, no-wrap
+msgid "Plasma5 addons to improve the Plasma experience"
+msgstr "Дополнения Plasma5 для улучшения работы с Plasma"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2797
+#, no-wrap
+msgid "`kdesu`"
+msgstr "`kdesu`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2799
+#, no-wrap
+msgid "KF5 integration with su for elevated privileges"
+msgstr "Интеграция KF5 с su для повышенных привилегий"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2800
+#, no-wrap
+msgid "`kdewebkit`"
+msgstr "`kdewebkit`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2802
+#, no-wrap
+msgid "KF5 library providing integration of QtWebKit"
+msgstr "Библиотека KF5, обеспечивающая интеграцию QtWebKit"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2803
+#, no-wrap
+msgid "`kgamma5`"
+msgstr "`kgamma5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2805
+#, no-wrap
+msgid "Plasma5 monitor's gamma settings"
+msgstr "Настройки гаммы монитора Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2806
+#, no-wrap
+msgid "`khtml`"
+msgstr "`khtml`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2808
+#, no-wrap
+msgid "KF5 KTHML rendering engine"
+msgstr "Механизм рендеринга KF5 KTHML"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2809
+#, no-wrap
+msgid "`kimageformats`"
+msgstr "`kimageformats`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2811
+#, no-wrap
+msgid "KF5 library providing support for additional image formats"
+msgstr "Библиотека KF5, обеспечивающая поддержку дополнительных форматов изображений"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2812
+#, no-wrap
+msgid "`kio`"
+msgstr "`kio`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2814
+#, no-wrap
+msgid "KF5 resource and network access abstraction"
+msgstr "Абстракция ресурсов и сетевого доступа KF5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2815
+#, no-wrap
+msgid "`kirigami2`"
+msgstr "`kirigami2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2817
+#, no-wrap
+msgid "QtQuick based components set"
+msgstr "Набор компонентов на основе QtQuick"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2818
+#, no-wrap
+msgid "`kitinerary`"
+msgstr "`kitinerary`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2820
+#, no-wrap
+msgid "Data Model and Extraction System for Travel Reservation information"
+msgstr "Модель данных и система извлечения информации о бронировании путешествий"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2821
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2824
+#, no-wrap
+msgid "`kmail`"
+msgstr "`kmail`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2823
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2826
+#, no-wrap
+msgid "KDE mail client"
+msgstr "Клиент электронной почты KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2827
+#, no-wrap
+msgid "`kmail-account-wizard`"
+msgstr "`kmail-account-wizard`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2829
+#, no-wrap
+msgid "KDE mail account wizard"
+msgstr "Мастер настройки почтового аккаунта KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2830
+#, no-wrap
+msgid "`kmenuedit`"
+msgstr "`kmenuedit`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2832
+#, no-wrap
+msgid "Plasma5 menu editor"
+msgstr "Редактор меню Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2833
+#, no-wrap
+msgid "`knotes`"
+msgstr "`knotes`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2835
+#, no-wrap
+msgid "Popup notes"
+msgstr "Всплывающие примечания"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2836
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2839
+#, no-wrap
+msgid "`kontact`"
+msgstr "`kontact`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2838
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2841
+#, no-wrap
+msgid "KDE Personal Information Manager"
+msgstr "KDE Персональный Органайзер"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2842
+#, no-wrap
+msgid "`kontactinterface`"
+msgstr "`kontactinterface`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2844
+#, no-wrap
+msgid "KDE glue for embedding KParts into Kontact"
+msgstr "KDE glue для встраивания KParts в Kontact"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2845
+#, no-wrap
+msgid "`korganizer`"
+msgstr "`korganizer`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2847
+#, no-wrap
+msgid "Calendar and scheduling Program"
+msgstr "Программа для календаря и планирования"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2848
+#, no-wrap
+msgid "`kpimdav`"
+msgstr "`kpimdav`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2850
+#, no-wrap
+msgid "A DAV protocol implementation with KJobs"
+msgstr "Реализация протокола DAV с KJobs"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2851
+#, no-wrap
+msgid "`kpkpass`"
+msgstr "`kpkpass`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2853
+#, no-wrap
+msgid "Library to deal with Apple Wallet pass files"
+msgstr "Библиотека для работы с файлами паролей Apple Wallet"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2854
+#, no-wrap
+msgid "`kross`"
+msgstr "`kross`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2856
+#, no-wrap
+msgid "KF5 multi-language application scripting"
+msgstr "KF5 мультиязыковые прикладные скрипты"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2857
+#, no-wrap
+msgid "`kscreen`"
+msgstr "`kscreen`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2859
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2919
+#, no-wrap
+msgid "Plasma5 screen management library"
+msgstr "Библиотека управления экраном Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2860
+#, no-wrap
+msgid "`kscreenlocker`"
+msgstr "`kscreenlocker`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2862
+#, no-wrap
+msgid "Plasma5 secure lock screen architecture"
+msgstr "Архитектура безопасной блокировки экрана Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2863
+#, no-wrap
+msgid "`ksmtp`"
+msgstr "`ksmtp`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2865
+#, no-wrap
+msgid "Job-based library to send email through an SMTP server"
+msgstr "Библиотека на основе задач для отправки электронной почты через SMTP-сервер"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2866
+#, no-wrap
+msgid "`ksshaskpass`"
+msgstr "`ksshaskpass`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2868
+#, no-wrap
+msgid "Plasma5 ssh-add frontend"
+msgstr "Plasma5 интерфейс для ssh-add"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2869
+#, no-wrap
+msgid "`ksysguard`"
+msgstr "`ksysguard`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2871
+#, no-wrap
+msgid "Plasma5 utility to track and control the running processes"
+msgstr "Утилита Plasma5 для отслеживания и управления запущенными процессами"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2872
+#, no-wrap
+msgid "`kwallet-pam`"
+msgstr "`kwallet-pam`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2874
+#, no-wrap
+msgid "Plasma5 KWallet PAM Integration"
+msgstr "Интеграция Plasma5 KWallet с PAM"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2875
+#, no-wrap
+msgid "`kwayland-integration`"
+msgstr "`kwayland-integration`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2877
+#, no-wrap
+msgid "Integration plugins for a Wayland-based desktop"
+msgstr "Интеграционные плагины для рабочего стола на основе Wayland"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2878
+#, no-wrap
+msgid "`kwin`"
+msgstr "`kwin`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2880
+#, no-wrap
+msgid "Plasma5 window manager"
+msgstr "Менеджер окон Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2881
+#, no-wrap
+msgid "`kwrited`"
+msgstr "`kwrited`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2883
+#, no-wrap
+msgid "Plasma5 daemon listening for wall and write messages"
+msgstr "Демон Plasma5, ожидающий сообщения wall и write"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2884
+#, no-wrap
+msgid "`ldap`"
+msgstr "`ldap`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2886
+#, no-wrap
+msgid "LDAP access API for KDE"
+msgstr "API доступа к LDAP для KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2887
+#, no-wrap
+msgid "`libkcddb`"
+msgstr "`libkcddb`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2889
+#, no-wrap
+msgid "KDE CDDB library"
+msgstr "Библиотека KDE CDDB"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2890
+#, no-wrap
+msgid "`libkcompactdisc`"
+msgstr "`libkcompactdisc`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2892
+#, no-wrap
+msgid "KDE library for interfacing with audio CDs"
+msgstr "Библиотека KDE для взаимодействия с аудио-CD"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2893
+#, no-wrap
+msgid "`libkdcraw`"
+msgstr "`libkdcraw`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2895
+#, no-wrap
+msgid "LibRaw interface for KDE"
+msgstr "Интерфейс LibRaw для KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2896
+#, no-wrap
+msgid "`libkdegames`"
+msgstr "`libkdegames`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2898
+#, no-wrap
+msgid "Libraries used by KDE games"
+msgstr "Библиотеки, используемые играми KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2899
+#, no-wrap
+msgid "`libkdepim`"
+msgstr "`libkdepim`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2901
+#, no-wrap
+msgid "KDE PIM Libraries"
+msgstr "Библиотеки KDE PIM"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2902
+#, no-wrap
+msgid "`libkeduvocdocument`"
+msgstr "`libkeduvocdocument`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2904
+#, no-wrap
+msgid "Library for reading and writing vocabulary files"
+msgstr "Библиотека для чтения и записи файлов словарей"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2905
+#, no-wrap
+msgid "`libkexiv2`"
+msgstr "`libkexiv2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2907
+#, no-wrap
+msgid "Exiv2 library interface for KDE"
+msgstr "Интерфейс библиотеки Exiv2 для KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2908
+#, no-wrap
+msgid "`libkipi`"
+msgstr "`libkipi`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2910
+#, no-wrap
+msgid "KDE Image Plugin Interface"
+msgstr "Интерфейс плагинов изображений KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2911
+#, no-wrap
+msgid "`libkleo`"
+msgstr "`libkleo`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2913
+#, no-wrap
+msgid "Certificate manager for KDE"
+msgstr "Менеджер сертификатов для KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2914
+#, no-wrap
+msgid "`libksane`"
+msgstr "`libksane`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2916
+#, no-wrap
+msgid "SANE library interface for KDE"
+msgstr "Интерфейс библиотеки SANE для KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2917
+#, no-wrap
+msgid "`libkscreen`"
+msgstr "`libkscreen`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2920
+#, no-wrap
+msgid "`libksieve`"
+msgstr "`libksieve`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2922
+#, no-wrap
+msgid "Sieve libriares for KDEPim"
+msgstr "Библиотеки Sieve для KDEPim"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2923
+#, no-wrap
+msgid "`libksysguard`"
+msgstr "`libksysguard`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2925
+#, no-wrap
+msgid "Plasma5 library to track and control running processes"
+msgstr "Библиотека Plasma5 для отслеживания и управления запущенными процессами"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2926
+#, no-wrap
+msgid "`mailcommon`"
+msgstr "`mailcommon`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2928
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2988
+#, no-wrap
+msgid "Common libriares for KDEPim"
+msgstr "Общие библиотеки для KDEPim"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2929
+#, no-wrap
+msgid "`mailimporter`"
+msgstr "`mailimporter`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2931
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2943
+#, no-wrap
+msgid "Import mbox files to KMail"
+msgstr "Импорт файлов mbox в KMail"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2932
+#, no-wrap
+msgid "`mailtransport`"
+msgstr "`mailtransport`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2934
+#, no-wrap
+msgid "KDE library to managing mail transport"
+msgstr "Библиотека KDE для управления транспортом почты"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2935
+#, no-wrap
+msgid "`marble`"
+msgstr "`marble`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2937
+#, no-wrap
+msgid "Virtual globe and world atlas for KDE"
+msgstr "Виртуальный глобус и мировой атлас для KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2938
+#, no-wrap
+msgid "`mbox`"
+msgstr "`mbox`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2941
+#, no-wrap
+msgid "`mbox-importer`"
+msgstr "`mbox-importer`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2944
+#, no-wrap
+msgid "`mediaplayer`"
+msgstr "`mediaplayer`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2946
+#, no-wrap
+msgid "KF5 plugin interface for media player features"
+msgstr "Интерфейс плагина KF5 для функций медиаплеера"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2947
+#, no-wrap
+msgid "`messagelib`"
+msgstr "`messagelib`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2949
+#, no-wrap
+msgid "Library for handling messages"
+msgstr "Библиотека для обработки сообщений"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2950
+#, no-wrap
+msgid "`milou`"
+msgstr "`milou`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2952
+#, no-wrap
+msgid "Plasma5 Plasmoid for search"
+msgstr "Plasma5 Plasmoid для поиска"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2953
+#, no-wrap
+msgid "`mime`"
+msgstr "`mime`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2955
+#, no-wrap
+msgid "Library for handling MIME data"
+msgstr "Библиотека для обработки данных MIME"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2956
+#, no-wrap
+msgid "`newstuff`"
+msgstr "`newstuff`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2958
+#, no-wrap
+msgid "KF5 library for downloading application assets from the network"
+msgstr "Библиотека KF5 для загрузки ресурсов приложений из сети"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2959
+#, no-wrap
+msgid "`notifications`"
+msgstr "`notifications`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2961
+#, no-wrap
+msgid "KF5 abstraction for system notifications"
+msgstr "Абстракция KF5 для системных уведомлений"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2962
+#, no-wrap
+msgid "`notifyconfig`"
+msgstr "`notifyconfig`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2964
+#, no-wrap
+msgid "KF5 configuration system for KNotify"
+msgstr "Система конфигурации KF5 для KNotify"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2965
+#, no-wrap
+msgid "`okular`"
+msgstr "`okular`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2967
+#, no-wrap
+msgid "KDE universal document viewer"
+msgstr "Универсальная программа для просмотра документов KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2968
+#, no-wrap
+msgid "`oxygen`"
+msgstr "`oxygen`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2970
+#, no-wrap
+msgid "Plasma5 Oxygen style"
+msgstr "Стиль Plasma5 Oxygen"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2971
+#, no-wrap
+msgid "`oxygen-icons5`"
+msgstr "`oxygen-icons5`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2973
+#, no-wrap
+msgid "The Oxygen icon theme for KDE"
+msgstr "Тема иконок Oxygen для KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2974
+#, no-wrap
+msgid "`package`"
+msgstr "`package`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2976
+#, no-wrap
+msgid "KF5 library to load and install packages"
+msgstr "Библиотека KF5 для загрузки и установки пакетов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2977
+#, no-wrap
+msgid "`parts`"
+msgstr "`parts`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2979
+#, no-wrap
+msgid "KF5 document centric plugin system"
+msgstr "KF5 система плагинов для работы с документами"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2980
+#, no-wrap
+msgid "`people`"
+msgstr "`people`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2982
+#, no-wrap
+msgid "KF5 library providing access to contacts"
+msgstr "Библиотека KF5, предоставляющая доступ к контактам"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2983
+#, no-wrap
+msgid "`pim-data-exporter`"
+msgstr "`pim-data-exporter`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2985
+#, no-wrap
+msgid "Import and export KDE PIM settings"
+msgstr "Импорт и экспорт настроек KDE PIM"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2986
+#, no-wrap
+msgid "`pimcommon`"
+msgstr "`pimcommon`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2989
+#, no-wrap
+msgid "`pimtextedit`"
+msgstr "`pimtextedit`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2991
+#, no-wrap
+msgid "KDE library for PIM-specific text editing utilities"
+msgstr "Библиотека KDE для утилит редактирования текста, специфичных для PIM"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2992
+#, no-wrap
+msgid "`plasma-browser-integration`"
+msgstr "`plasma-browser-integration`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2994
+#, no-wrap
+msgid "Plasma5 components to integrate browsers into the desktop"
+msgstr "Компоненты Plasma5 для интеграции браузеров в рабочий стол"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2995
+#, no-wrap
+msgid "`plasma-desktop`"
+msgstr "`plasma-desktop`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2997
+#, no-wrap
+msgid "Plasma5 plasma desktop"
+msgstr "Plasma5 рабочий стол Plasma"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:2998
+#, no-wrap
+msgid "`plasma-framework`"
+msgstr "`plasma-framework`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3000
+#, no-wrap
+msgid "KF5 plugin based UI runtime used to write user interfaces"
+msgstr "KF5 - среда выполнения пользовательского интерфейса на основе плагинов, используемая для создания пользовательских интерфейсов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3001
+#, no-wrap
+msgid "`plasma-integration`"
+msgstr "`plasma-integration`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3003
+#, no-wrap
+msgid "Qt Platform Theme integration plugins for the Plasma workspaces"
+msgstr "Плагины интеграции Qt Platform Theme для рабочего окружения Plasma"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3004
+#, no-wrap
+msgid "`plasma-pa`"
+msgstr "`plasma-pa`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3006
+#, no-wrap
+msgid "Plasma5 Plasma pulse audio mixer"
+msgstr "Plasma5 Микшер звука Plasma Pulse"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3007
+#, no-wrap
+msgid "`plasma-sdk`"
+msgstr "`plasma-sdk`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3009
+#, no-wrap
+msgid "Plasma5 applications useful for Plasma development"
+msgstr "Приложения Plasma5, полезные для разработки Plasma"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3010
+#, no-wrap
+msgid "`plasma-workspace`"
+msgstr "`plasma-workspace`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3012
+#, no-wrap
+msgid "Plasma5 Plasma workspace"
+msgstr "Plasma5 Рабочее пространство Plasma"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3013
+#, no-wrap
+msgid "`plasma-workspace-wallpapers`"
+msgstr "`plasma-workspace-wallpapers`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3015
+#, no-wrap
+msgid "Plasma5 wallpapers"
+msgstr "Обои Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3016
+#, no-wrap
+msgid "`plotting`"
+msgstr "`plotting`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3018
+#, no-wrap
+msgid "KF5 lightweight plotting framework"
+msgstr "KF5 облегченный фреймворк для построения графиков"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3019
+#, no-wrap
+msgid "`polkit-kde-agent-1`"
+msgstr "`polkit-kde-agent-1`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3021
+#, no-wrap
+msgid "Plasma5 daemon providing a polkit authentication UI"
+msgstr "Демон Plasma5, предоставляющий интерфейс аутентификации polkit"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3022
+#, no-wrap
+msgid "`powerdevil`"
+msgstr "`powerdevil`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3024
+#, no-wrap
+msgid "Plasma5 tool to manage the power consumption settings"
+msgstr "Инструмент Plasma5 для управления настройками энергопотребления"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3025
+#, no-wrap
+msgid "`prison`"
+msgstr "`prison`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3027
+#, no-wrap
+msgid "API to produce barcodes"
+msgstr "Интерфейс API для создания штрихкодов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3028
+#, no-wrap
+msgid "`pty`"
+msgstr "`pty`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3030
+#, no-wrap
+msgid "KF5 pty abstraction"
+msgstr "Абстракция pty KF5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3031
+#, no-wrap
+msgid "`purpose`"
+msgstr "`purpose`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3033
+#, no-wrap
+msgid "Offers available actions for a specific purpose"
+msgstr "Предлагает доступные действия для конкретной цели"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3034
+#, no-wrap
+msgid "`qqc2-desktop-style`"
+msgstr "`qqc2-desktop-style`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3036
+#, no-wrap
+msgid "Qt QuickControl2 style for KDE"
+msgstr "Стиль Qt QuickControl2 для KDE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3037
+#, no-wrap
+msgid "`runner`"
+msgstr "`runner`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3039
+#, no-wrap
+msgid "KF5 parallelized query system"
+msgstr "KF5 параллелизованная система запросов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3040
+#, no-wrap
+msgid "`service`"
+msgstr "`service`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3042
+#, no-wrap
+msgid "KF5 advanced plugin and service introspection"
+msgstr "KF5 расширенные плагины и интроспекция сервисов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3043
+#, no-wrap
+msgid "`solid`"
+msgstr "`solid`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3045
+#, no-wrap
+msgid "KF5 hardware integration and detection"
+msgstr "Интеграция и обнаружение оборудования KF5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3046
+#, no-wrap
+msgid "`sonnet`"
+msgstr "`sonnet`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3048
+#, no-wrap
+msgid "KF5 plugin-based spell checking library"
+msgstr "KF5 библиотека проверки орфографии на основе плагинов"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3049
+#, no-wrap
+msgid "`syndication`"
+msgstr "`syndication`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3051
+#, no-wrap
+msgid "KDE RSS feed handling library"
+msgstr "Библиотека KDE для обработки RSS-лент"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3052
+#, no-wrap
+msgid "`syntaxhighlighting`"
+msgstr "`syntaxhighlighting`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3054
+#, no-wrap
+msgid "KF5 syntax highlighting engine for structured text and code"
+msgstr "Движок подсветки синтаксиса KF5 для структурированного текста и кода"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3055
+#, no-wrap
+msgid "`systemsettings`"
+msgstr "`systemsettings`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3057
+#, no-wrap
+msgid "Plasma5 system settings"
+msgstr "Настройки системы Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3058
+#, no-wrap
+msgid "`texteditor`"
+msgstr "`texteditor`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3060
+#, no-wrap
+msgid "KF5 advanced embeddable text editor"
+msgstr "KF5 продвинутый встраиваемый текстовый редактор"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3061
+#, no-wrap
+msgid "`textwidgets`"
+msgstr "`textwidgets`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3063
+#, no-wrap
+msgid "KF5 advanced text editing widgets"
+msgstr "KF5 расширенные виджеты для редактирования текста"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3064
+#, no-wrap
+msgid "`threadweaver`"
+msgstr "`threadweaver`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3067
+#, no-wrap
+msgid "`tnef`"
+msgstr "`tnef`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3069
+#, no-wrap
+msgid "KDE API for the handling of TNEF data"
+msgstr "KDE API для обработки данных TNEF"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3070
+#, no-wrap
+msgid "`unitconversion`"
+msgstr "`unitconversion`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3072
+#, no-wrap
+msgid "KF5 library for unit conversion"
+msgstr "Библиотека KF5 для преобразования единиц измерения"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3073
+#, no-wrap
+msgid "`user-manager`"
+msgstr "`user-manager`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3075
+#, no-wrap
+msgid "Plasma5 user manager"
+msgstr "Пользовательский менеджер Plasma5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3076
+#, no-wrap
+msgid "`wallet`"
+msgstr "`wallet`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3078
+#, no-wrap
+msgid "KF5 secure and unified container for user passwords"
+msgstr "KF5 безопасный и унифицированный контейнер для паролей пользователей"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3081
+#, no-wrap
+msgid "KF5 Client and Server library wrapper for the Wayland libraries"
+msgstr "Обёртка клиентской и серверной библиотек KF5 для библиотек Wayland"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3082
+#, no-wrap
+msgid "`widgetsaddons`"
+msgstr "`widgetsaddons`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3084
+#, no-wrap
+msgid "KF5 addons to QtWidgets"
+msgstr "KF5 аддоны для QtWidgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3085
+#, no-wrap
+msgid "`windowsystem`"
+msgstr "`windowsystem`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3087
+#, no-wrap
+msgid "KF5 library for access to the windowing system"
+msgstr "Библиотека KF5 для доступа к оконной системе"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3088
+#, no-wrap
+msgid "`xmlgui`"
+msgstr "`xmlgui`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3090
+#, no-wrap
+msgid "KF5 user configurable main windows"
+msgstr "KF5 настраиваемые пользователем главные окна"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3091
+#, no-wrap
+msgid "`xmlrpcclient`"
+msgstr "`xmlrpcclient`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3092
+#, no-wrap
+msgid "KF5 interaction with XMLRPC services"
+msgstr "Взаимодействие KF5 с XMLRPC-сервисами"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3095
+#, no-wrap
+msgid "`USE_KDE` Example"
+msgstr "Пример `USE_KDE`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3105
+msgid ""
+"This is a simple example for a KDE port. `USES= cmake` instructs the port "
+"to utilize CMake, a configuration tool widely used by KDE projects (see "
+"crossref:special[using-cmake, Using `cmake`] for detailed usage). `USE_KDE` "
+"brings dependency on KDE libraries. Required KDE components and other "
+"dependencies can be determined through the configure log. `USE_KDE` does "
+"not imply `USE_QT`. If a port requires some Qt components, specify them in "
+"`USE_QT`."
+msgstr ""
+"Это простой пример порта для KDE. `USES= cmake` указывает порту "
+"использовать CMake, инструмент конфигурации, широко применяемый в проектах "
+"KDE (см. crossref:special[using-cmake, Использование `cmake`] для подробного "
+"описания). `USE_KDE` добавляет зависимость от библиотек KDE. Необходимые "
+"компоненты KDE и другие зависимости можно определить через лог "
+"конфигурации. `USE_KDE` не подразумевает `USE_QT`. Если порту требуются "
+"некоторые компоненты Qt, укажите их в `USE_QT`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3111
+#, no-wrap
+msgid ""
+"USES=\t\tcmake kde:5 qt:5\n"
+"USE_KDE=\tecm\n"
+"USE_QT=\t\tcore buildtools_build qmake_build\n"
+msgstr ""
+"USES=\t\tcmake kde:5 qt:5\n"
+"USE_KDE=\tecm\n"
+"USE_QT=\t\tcore buildtools_build qmake_build\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3116
+#, no-wrap
+msgid "Using LXQt"
+msgstr "Использование LXQt"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3119
+msgid ""
+"Applications depending on LXQt should set `USES+= lxqt` and set `USE_LXQT` "
+"to the list of required components from the table below"
+msgstr ""
+"Приложения, зависящие от LXQt, должны устанавливать `USES+= lxqt` и задавать "
+"`USE_LXQT` списком необходимых компонентов из таблицы ниже"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3121
+#, no-wrap
+msgid "Available LXQt Components"
+msgstr "Доступные компоненты LXQt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3130
+#, no-wrap
+msgid "Helpers for additional CMake modules"
+msgstr "Помощники для дополнительных модулей CMake"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3131
+#, no-wrap
+msgid "`libfmqt`"
+msgstr "`libfmqt`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3133
+#, no-wrap
+msgid "Libfm Qt bindings"
+msgstr "Привязки Libfm к Qt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3134
+#, no-wrap
+msgid "`lxqt`"
+msgstr "`lxqt`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3136
+#, no-wrap
+msgid "LXQt core library"
+msgstr "Ядро библиотеки LXQt"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3137
+#, no-wrap
+msgid "`qtxdg`"
+msgstr "`qtxdg`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3138
+#, no-wrap
+msgid "Qt implementation of freedesktop.org XDG specifications"
+msgstr "Реализация Qt спецификаций freedesktop.org XDG"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3141
+#, no-wrap
+msgid "`USE_LXQT` Example"
+msgstr "Пример `USE_LXQT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3146
+msgid ""
+"This is a simple example, `USE_LXQT` adds a dependency on LXQt libraries. "
+"Required LXQt components and other dependencies can be determined from the "
+"configure log."
+msgstr ""
+"Это простой пример, `USE_LXQT` добавляет зависимость от библиотек LXQt. "
+"Необходимые компоненты LXQt и другие зависимости можно определить из лога "
+"конфигурации."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3152
+#, no-wrap
+msgid ""
+"USES=\tcmake lxqt qt:5 tar:xz\n"
+"USE_QT=\t\tcore dbus widgets buildtools_build qmake_build\n"
+"USE_LXQT=\tbuildtools libfmqt\n"
+msgstr ""
+"USES=\tcmake lxqt qt:5 tar:xz\n"
+"USE_QT=\t\tcore dbus widgets buildtools_build qmake_build\n"
+"USE_LXQT=\tbuildtools libfmqt\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3157
+#, no-wrap
+msgid "Using Java"
+msgstr "Использование Java"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3160
+#, no-wrap
+msgid "Variable Definitions"
+msgstr "Определения переменных"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3163
+msgid ""
+"If the port needs a Java(TM) Development Kit (JDK(TM)) to either build, run "
+"or even extract the distfile, then define `USE_JAVA`."
+msgstr ""
+"Если порту требуется Java(TM) Development Kit (JDK(TM)) для сборки, запуска "
+"или даже извлечения distfile, определите `USE_JAVA`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3167
+msgid ""
+"There are several JDKs in the ports collection, from various vendors, and in "
+"several versions. If the port must use a particular version, specify it "
+"using the `JAVA_VERSION` variable. The most current version is package:java/"
+"openjdk18[], with package:java/openjdk17[], package:java/openjdk16[], "
+"package:java/openjdk15[], package:java/openjdk14[], package:java/"
+"openjdk13[], package:java/openjdk12[], package:java/openjdk11[], "
+"package:java/openjdk8[], and package:java/openjdk7[] also available."
+msgstr ""
+"В коллекции портов доступно несколько JDK от различных поставщиков и в "
+"нескольких версиях. Если порт должен использовать определённую версию, "
+"укажите её с помощью переменной `JAVA_VERSION`. Самая актуальная версия — "
+"package:java/openjdk18[], также доступны package:java/openjdk17[], "
+"package:java/openjdk16[], package:java/openjdk15[], package:java/"
+"openjdk14[], package:java/openjdk13[], package:java/openjdk12[], "
+"package:java/openjdk11[], package:java/openjdk8[] и package:java/openjdk7[]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3169
+#, no-wrap
+msgid "Variables Which May be Set by Ports That Use Java"
+msgstr "Переменные, которые могут быть установлены портами, использующими Java"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3176
+#, no-wrap
+msgid "`USE_JAVA`"
+msgstr "`USE_JAVA`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3178
+#, no-wrap
+msgid "Define for the remaining variables to have any effect."
+msgstr "Определите для остальных переменных, чтобы они имели какой-либо эффект."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3179
+#, no-wrap
+msgid "`JAVA_VERSION`"
+msgstr "`JAVA_VERSION`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3182
+#, no-wrap
+msgid ""
+"List of space-separated suitable Java versions for the port.\n"
+"An optional `\\+` allows specifying a range of versions (allowed values: `8[+] 11[\\+] 17[+] 18[\\+] 19[+] 20[\\+] 21[+]`)."
+msgstr ""
+"Список подходящих версий Java для порта, разделённых пробелами.\n"
+"Необязательный символ `\\+` позволяет указать диапазон версий (допустимые значения: `8[+] 11[\\+] 17[+] 18[\\+] 19[+] 20[\\+] 21[+]`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3183
+#, no-wrap
+msgid "`JAVA_OS`"
+msgstr "`JAVA_OS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3185
+#, no-wrap
+msgid "List of space-separated suitable JDK port operating systems for the port (allowed values: `native linux`)."
+msgstr "Список разделенных пробелами подходящих операционных систем портов JDK для порта (допустимые значения: `native linux`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3186
+#, no-wrap
+msgid "`JAVA_VENDOR`"
+msgstr "`JAVA_VENDOR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3188
+#, no-wrap
+msgid "List of space-separated suitable JDK port vendors for the port (allowed values: `openjdk oracle`)."
+msgstr "Список подходящих поставщиков портов JDK для порта через пробел (допустимые значения: `openjdk oracle`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3189
+#, no-wrap
+msgid "`JAVA_BUILD`"
+msgstr "`JAVA_BUILD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3191
+#, no-wrap
+msgid "When set, add the selected JDK port to the build dependencies."
+msgstr "Когда установлено, добавляет выбранный порт JDK в зависимости сборки."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3192
+#, no-wrap
+msgid "`JAVA_RUN`"
+msgstr "`JAVA_RUN`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3194
+#, no-wrap
+msgid "When set, add the selected JDK port to the run dependencies."
+msgstr "Когда установлено, добавляет выбранный порт JDK в зависимости времени выполнения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3195
+#, no-wrap
+msgid "`JAVA_EXTRACT`"
+msgstr "`JAVA_EXTRACT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3196
+#, no-wrap
+msgid "When set, add the selected JDK port to the extract dependencies."
+msgstr "Когда установлено, добавляет выбранный порт JDK в зависимости для извлечения."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3199
+msgid ""
+"Below is the list of all settings a port will receive after setting "
+"`USE_JAVA`:"
+msgstr ""
+"Ниже приведен список всех настроек, которые порт получит после установки "
+"`USE_JAVA`:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3201
+#, no-wrap
+msgid "Variables Provided to Ports That Use Java"
+msgstr "Переменные, предоставляемые портам, использующим Java"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3207
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3286
+#, no-wrap
+msgid "Value"
+msgstr "Значение"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3208
+#, no-wrap
+msgid "`JAVA_PORT`"
+msgstr "`JAVA_PORT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3210
+#, no-wrap
+msgid "The name of the JDK port (for example, `java/openjdk6`)."
+msgstr "Имя порта JDK (например, `java/openjdk6`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3211
+#, no-wrap
+msgid "`JAVA_PORT_VERSION`"
+msgstr "`JAVA_PORT_VERSION`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3213
+#, no-wrap
+msgid "The full version of the JDK port (for example, `1.6.0`). Only the first two digits of this version number are needed, use `${JAVA_PORT_VERSION:C/^([0-9])\\.([0-9])(.*)$/\\1.\\2/}`."
+msgstr "Полная версия порта JDK (например, `1.6.0`). Требуются только первые две цифры номера версии, используйте `${JAVA_PORT_VERSION:C/^([0-9])\\.([0-9])(.*)$/\\1.\\2/}`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3214
+#, no-wrap
+msgid "`JAVA_PORT_OS`"
+msgstr "`JAVA_PORT_OS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3216
+#, no-wrap
+msgid "The operating system used by the JDK port (for example, `'native'`)."
+msgstr "Операционная система, используемая портом JDK (например, `'native'`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3217
+#, no-wrap
+msgid "`JAVA_PORT_VENDOR`"
+msgstr "`JAVA_PORT_VENDOR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3219
+#, no-wrap
+msgid "The vendor of the JDK port (for example, `'openjdk'`)."
+msgstr "Поставщик порта JDK (например, `'openjdk'`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3220
+#, no-wrap
+msgid "`JAVA_PORT_OS_DESCRIPTION`"
+msgstr "`JAVA_PORT_OS_DESCRIPTION`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3222
+#, no-wrap
+msgid "Description of the operating system used by the JDK port (for example, `'Native'`)."
+msgstr "Описание операционной системы, используемой портом JDK (например, `'Native'`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3223
+#, no-wrap
+msgid "`JAVA_PORT_VENDOR_DESCRIPTION`"
+msgstr "`JAVA_PORT_VENDOR_DESCRIPTION`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3225
+#, no-wrap
+msgid "Description of the vendor of the JDK port (for example, `'OpenJDK BSD Porting Team'`)."
+msgstr "Описание поставщика порта JDK (например, `'OpenJDK BSD Porting Team'`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3226
+#, no-wrap
+msgid "`JAVA_HOME`"
+msgstr "`JAVA_HOME`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3228
+#, no-wrap
+msgid "Path to the installation directory of the JDK (for example, [.filename]#'/usr/local/openjdk6'#)."
+msgstr "Путь к каталогу установки JDK (например, [.filename]#'/usr/local/openjdk6'#)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3229
+#, no-wrap
+msgid "`JAVAC`"
+msgstr "`JAVAC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3231
+#, no-wrap
+msgid "Path to the Java compiler to use (for example, [.filename]#'/usr/local/openjdk6/bin/javac'#)."
+msgstr "Путь к используемому компилятору Java (например, [.filename]#'/usr/local/openjdk6/bin/javac'#)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3232
+#, no-wrap
+msgid "`JAR`"
+msgstr "`JAR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3234
+#, no-wrap
+msgid "Path to the `jar` tool to use (for example, [.filename]#'/usr/local/openjdk6/bin/jar'# or [.filename]#'/usr/local/bin/fastjar'#)."
+msgstr "Путь к инструменту `jar`, который следует использовать (например, [.filename]#'/usr/local/openjdk6/bin/jar'# или [.filename]#'/usr/local/bin/fastjar'#)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3235
+#, no-wrap
+msgid "`APPLETVIEWER`"
+msgstr "`APPLETVIEWER`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3237
+#, no-wrap
+msgid "Path to the `appletviewer` utility (for example, [.filename]#'/usr/local/openjdk6/bin/appletviewer'#)."
+msgstr "Путь к утилите `appletviewer` (например, [.filename]#'/usr/local/openjdk6/bin/appletviewer'#)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3238
+#, no-wrap
+msgid "`JAVA`"
+msgstr "`JAVA`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3240
+#, no-wrap
+msgid "Path to the `java` executable. Use this for executing Java programs (for example, [.filename]#'/usr/local/openjdk6/bin/java'#)."
+msgstr "Путь к исполняемому файлу `java`. Используется для запуска программ на Java (например, [.filename]#'/usr/local/openjdk6/bin/java'#)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3241
+#, no-wrap
+msgid "`JAVADOC`"
+msgstr "`JAVADOC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3243
+#, no-wrap
+msgid "Path to the `javadoc` utility program."
+msgstr "Путь к программе `javadoc`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3244
+#, no-wrap
+msgid "`JAVAH`"
+msgstr "`JAVAH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3246
+#, no-wrap
+msgid "Path to the `javah` program."
+msgstr "Путь к программе `javah`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3247
+#, no-wrap
+msgid "`JAVAP`"
+msgstr "`JAVAP`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3249
+#, no-wrap
+msgid "Path to the `javap` program."
+msgstr "Путь к программе `javap`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3250
+#, no-wrap
+msgid "`JAVA_KEYTOOL`"
+msgstr "`JAVA_KEYTOOL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3252
+#, no-wrap
+msgid "Path to the `keytool` utility program."
+msgstr "Путь к утилите `keytool`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3253
+#, no-wrap
+msgid "`JAVA_N2A`"
+msgstr "`JAVA_N2A`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3255
+#, no-wrap
+msgid "Path to the `native2ascii` tool."
+msgstr "Путь к инструменту `native2ascii`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3256
+#, no-wrap
+msgid "`JAVA_POLICYTOOL`"
+msgstr "`JAVA_POLICYTOOL`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3258
+#, no-wrap
+msgid "Path to the `policytool` program."
+msgstr "Путь к программе `policytool`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3259
+#, no-wrap
+msgid "`JAVA_SERIALVER`"
+msgstr "`JAVA_SERIALVER`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3261
+#, no-wrap
+msgid "Path to the `serialver` utility program."
+msgstr "Путь к утилите `serialver`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3262
+#, no-wrap
+msgid "`RMIC`"
+msgstr "`RMIC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3264
+#, no-wrap
+msgid "Path to the RMI stub/skeleton generator, `rmic`."
+msgstr "Путь к генератору RMI-заглушек/скелетов, `rmic`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3265
+#, no-wrap
+msgid "`RMIREGISTRY`"
+msgstr "`RMIREGISTRY`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3267
+#, no-wrap
+msgid "Path to the RMI registry program, `rmiregistry`."
+msgstr "Путь к программе реестра RMI, `rmiregistry`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3268
+#, no-wrap
+msgid "`RMID`"
+msgstr "`RMID`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3270
+#, no-wrap
+msgid "Path to the RMI daemon program `rmid`."
+msgstr "Путь к программе демона RMI `rmid`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3271
+#, no-wrap
+msgid "`JAVA_CLASSES`"
+msgstr "`JAVA_CLASSES`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3272
+#, no-wrap
+msgid "Path to the archive that contains the JDK class files, [.filename]#${JAVA_HOME}/jre/lib/rt.jar#."
+msgstr "Путь к архиву, содержащему файлы классов JDK, [.filename]#${JAVA_HOME}/jre/lib/rt.jar#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3276
+msgid ""
+"Use the `java-debug` make target to get information for debugging the port. "
+"It will display the value of many of the previously listed variables."
+msgstr ""
+"Используйте цель `java-debug` в make для получения информации для отладки "
+"порта. Она отобразит значения многих из перечисленных ранее переменных."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3278
+msgid ""
+"Additionally, these constants are defined so all Java ports may be installed "
+"in a consistent way:"
+msgstr ""
+"Кроме того, определены следующие константы, чтобы все порты Java могли быть "
+"установлены единообразно:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3280
+#, no-wrap
+msgid "Constants Defined for Ports That Use Java"
+msgstr "Константы, определенные для портов, использующих Java"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3284
+#, no-wrap
+msgid "Constant"
+msgstr "Константа"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3287
+#, no-wrap
+msgid "`JAVASHAREDIR`"
+msgstr "`JAVASHAREDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3289
+#, no-wrap
+msgid "The base directory for everything related to Java. Default: [.filename]#${PREFIX}/share/java#."
+msgstr "Базовый каталог для всего, связанного с Java. По умолчанию: [.filename]#${PREFIX}/share/java#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3290
+#, no-wrap
+msgid "`JAVAJARDIR`"
+msgstr "`JAVAJARDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3292
+#, no-wrap
+msgid "The directory where JAR files is installed. Default: [.filename]#${JAVASHAREDIR}/classes#."
+msgstr "Каталог, в котором установлены JAR-файлы. По умолчанию: [.filename]#${JAVASHAREDIR}/classes#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3293
+#, no-wrap
+msgid "`JAVALIBDIR`"
+msgstr "`JAVALIBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3294
+#, no-wrap
+msgid "The directory where JAR files installed by other ports are located. Default: [.filename]#${LOCALBASE}/share/java/classes#."
+msgstr "Каталог, в котором расположены JAR-файлы, установленные другими портами. По умолчанию: [.filename]#${LOCALBASE}/share/java/classes#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3297
+msgid ""
+"The related entries are defined in both `PLIST_SUB` (documented in "
+"crossref:plist[plist-sub,Changing pkg-plist Based on Make Variables]) and "
+"`SUB_LIST`."
+msgstr ""
+"Связанные записи определены как в `PLIST_SUB` (документировано в "
+"crossref:plist[plist-sub,Изменение pkg-plist на основе переменных Make]), "
+"так и в `SUB_LIST`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3299
+#, no-wrap
+msgid "Building with Ant"
+msgstr "Сборка с Ant"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3305
+msgid ""
+"When the port is to be built using Apache Ant, it has to define `USE_ANT`. "
+"Ant is thus considered to be the sub-make command. When no `do-build` "
+"target is defined by the port, a default one will be set that runs Ant "
+"according to `MAKE_ENV`, `MAKE_ARGS` and `ALL_TARGET`. This is similar to "
+"the `USES= gmake` mechanism, which is documented in "
+"crossref:special[building, Building Mechanisms]."
+msgstr ""
+"Когда порт должен собираться с использованием Apache Ant, он должен "
+"определять `USE_ANT`. Таким образом, Ant считается командой sub-make. Если "
+"цель `do-build` не определена в порте, будет установлена цель по умолчанию, "
+"которая запускает Ant в соответствии с `MAKE_ENV`, `MAKE_ARGS` и "
+"`ALL_TARGET`. Это аналогично механизму `USES= gmake`, который документирован "
+"в crossref:special[building, Building Mechanisms]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3307
+#, no-wrap
+msgid "Best Practices"
+msgstr "Лучшие практики"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3312
+msgid ""
+"When porting a Java library, the port has to install the JAR file(s) in "
+"[.filename]#${JAVAJARDIR}#, and everything else under [.filename]#$"
+"{JAVASHAREDIR}/${PORTNAME}# (except for the documentation, see below). To "
+"reduce the packing file size, reference the JAR file(s) directly in the "
+"[.filename]#Makefile#. Use this statement (where [.filename]#myport.jar# is "
+"the name of the JAR file installed as part of the port):"
+msgstr ""
+"При переносе библиотеки Java порт должен устанавливать JAR-файл(ы) в "
+"[.filename]#${JAVAJARDIR}#, а все остальное — в [.filename]#${JAVASHAREDIR}/$"
+"{PORTNAME}# (за исключением документации, см. ниже). Чтобы уменьшить размер "
+"упаковочного файла, ссылайтесь на JAR-файл(ы) напрямую в "
+"[.filename]#Makefile#. Используйте следующую инструкцию (где "
+"[.filename]#myport.jar# — имя JAR-файла, устанавливаемого как часть порта):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3316
+#, no-wrap
+msgid "PLIST_FILES+=\t${JAVAJARDIR}/myport.jar\n"
+msgstr "PLIST_FILES+=\t${JAVAJARDIR}/myport.jar\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3321
+msgid ""
+"When porting a Java application, the port usually installs everything under "
+"a single directory (including its JAR dependencies). The use of "
+"[.filename]#${JAVASHAREDIR}/${PORTNAME}# is strongly encouraged in this "
+"regard. It is up the porter to decide whether the port installs the "
+"additional JAR dependencies under this directory or uses the already "
+"installed ones (from [.filename]#${JAVAJARDIR}#)."
+msgstr ""
+"При переносе Java-приложения порт обычно устанавливает все компоненты в "
+"единый каталог (включая зависимости в виде JAR-файлов). В этом отношении "
+"настоятельно рекомендуется использовать [.filename]#${JAVASHAREDIR}/$"
+"{PORTNAME}#. Портеру предстоит решить, устанавливать ли дополнительные JAR-"
+"зависимости в этот каталог или использовать уже установленные (из "
+"[.filename]#${JAVAJARDIR}#)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3328
+msgid ""
+"When porting a Java(TM) application that requires an application server such "
+"as package:www/tomcat7[] to run the service, it is quite common for a vendor "
+"to distribute a [.filename]#.war#. A [.filename]#.war# is a Web application "
+"ARchive and is extracted when called by the application. Avoid adding a "
+"[.filename]#.war# to [.filename]#pkg-plist#. It is not considered best "
+"practice. An application server will expand war archive, but not clean it "
+"up properly if the port is removed. A more desirable way of working with "
+"this file is to extract the archive, then install the files, and lastly add "
+"these files to [.filename]#pkg-plist#."
+msgstr ""
+"При переносе Java(TM)-приложения, которое требует сервера приложений, такого "
+"как package:www/tomcat7[], для запуска службы, вендор часто распространяет "
+"файл [.filename]#.war#. [.filename]#.war# — это веб-архив приложения (Web "
+"application ARchive), который извлекается при вызове приложением. Избегайте "
+"добавления [.filename]#.war# в [.filename]#pkg-plist#. Это не считается "
+"лучшей практикой. Сервер приложений развернет архив war, но не очистит его "
+"должным образом при удалении порта. Более предпочтительный способ работы с "
+"этим файлом — извлечь архив, затем установить файлы и, наконец, добавить эти "
+"файлы в [.filename]#pkg-plist#."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3333
+#, no-wrap
+msgid ""
+"TOMCATDIR=\t${LOCALBASE}/apache-tomcat-7.0\n"
+"WEBAPPDIR=\tmyapplication\n"
+msgstr ""
+"TOMCATDIR=\t${LOCALBASE}/apache-tomcat-7.0\n"
+"WEBAPPDIR=\tmyapplication\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3337
+#, no-wrap
+msgid ""
+"post-extract:\n"
+"\t@${MKDIR} ${WRKDIR}/${PORTDIRNAME}\n"
+"\t@${TAR} xf ${WRKDIR}/myapplication.war -C ${WRKDIR}/${PORTDIRNAME}\n"
+msgstr ""
+"post-extract:\n"
+"\t@${MKDIR} ${WRKDIR}/${PORTDIRNAME}\n"
+"\t@${TAR} xf ${WRKDIR}/myapplication.war -C ${WRKDIR}/${PORTDIRNAME}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3342
+#, no-wrap
+msgid ""
+"do-install:\n"
+"\tcd ${WRKDIR} && \\\n"
+"\t${INSTALL} -d -o ${WWWOWN} -g ${WWWGRP} ${TOMCATDIR}/webapps/${PORTDIRNAME}\n"
+"\tcd ${WRKDIR}/${PORTDIRNAME} && ${COPYTREE_SHARE} \\* ${WEBAPPDIR}/${PORTDIRNAME}\n"
+msgstr ""
+"do-install:\n"
+"\tcd ${WRKDIR} && \\\n"
+"\t${INSTALL} -d -o ${WWWOWN} -g ${WWWGRP} ${TOMCATDIR}/webapps/${PORTDIRNAME}\n"
+"\tcd ${WRKDIR}/${PORTDIRNAME} && ${COPYTREE_SHARE} \\* ${WEBAPPDIR}/${PORTDIRNAME}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3349
+msgid ""
+"Regardless of the type of port (library or application), the additional "
+"documentation is installed in the crossref:makefiles[install-"
+"documentation,same location] as for any other port. The Javadoc tool is "
+"known to produce a different set of files depending on the version of the "
+"JDK that is used. For ports that do not enforce the use of a particular "
+"JDK, it is therefore a complex task to specify the packing list "
+"([.filename]#pkg-plist#). This is one reason why porters are strongly "
+"encouraged to use `PORTDOCS`. Moreover, even if the set of files that will "
+"be generated by `javadoc` can be predicted, the size of the resulting "
+"[.filename]#pkg-plist# advocates for the use of `PORTDOCS`."
+msgstr ""
+"Независимо от типа порта (библиотека или приложение), дополнительная "
+"документация устанавливается crossref:makefiles[install-documentation,в том "
+"же месте], что и для любого другого порта. Известно, что инструмент Javadoc "
+"создает разный набор файлов в зависимости от версии используемого JDK. Для "
+"портов, которые не требуют использования конкретной версии JDK, указание "
+"списка упаковки ([.filename]#pkg-plist#) становится сложной задачей. Это "
+"одна из причин, по которой разработчикам портов настоятельно рекомендуется "
+"использовать `PORTDOCS`. Более того, даже если набор файлов, генерируемых "
+"`javadoc`, можно предсказать, размер результирующего [.filename]#pkg-plist# "
+"говорит в пользу использования `PORTDOCS`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3353
+msgid ""
+"The default value for `DATADIR` is [.filename]#${PREFIX}/share/${PORTNAME}"
+"#. It is a good idea to override `DATADIR` to [.filename]#${JAVASHAREDIR}/$"
+"{PORTNAME}# for Java ports. Indeed, `DATADIR` is automatically added to "
+"`PLIST_SUB` (documented in crossref:plist[plist-sub,Changing pkg-plist Based "
+"on Make Variables]) so use `%%DATADIR%%` directly in [.filename]#pkg-plist#."
+msgstr ""
+"Значение по умолчанию для `DATADIR` — [.filename]#${PREFIX}/share/${PORTNAME}"
+"#. Рекомендуется переопределить `DATADIR` на [.filename]#${JAVASHAREDIR}/$"
+"{PORTNAME}# для портов Java. Действительно, `DATADIR` автоматически "
+"добавляется в `PLIST_SUB` (документировано в crossref:plist[plist-"
+"sub,Изменение pkg-plist на основе переменных Make]), поэтому используйте `%"
+"%DATADIR%%` напрямую в [.filename]#pkg-plist#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3356
+msgid ""
+"As for the choice of building Java ports from source or directly installing "
+"them from a binary distribution, there is no defined policy at the time of "
+"writing. However, people from the https://www.freebsd.org/java/[FreeBSD "
+"Java Project] encourage porters to have their ports built from source "
+"whenever it is a trivial task."
+msgstr ""
+"Что касается выбора между сборкой портов Java из исходного кода или их "
+"непосредственной установкой из бинарного дистрибутива, на момент написания "
+"документации определённой политики не существует. Однако участники https://"
+"www.freebsd.org/java/[FreeBSD Java Project] рекомендуют сопровождающим "
+"портов по возможности собирать их из исходного кода, если это не "
+"представляет сложностей."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3360
+msgid ""
+"All the features that have been presented in this section are implemented in "
+"[.filename]#bsd.java.mk#. If the port needs more sophisticated Java "
+"support, please first have a look at the https://cgit.FreeBSD.org/ports/tree/"
+"Mk/bsd.java.mk[bsd.java.mk Git log] as it usually takes some time to "
+"document the latest features. Then, if the needed support that is lacking "
+"would be beneficial to many other Java ports, feel free to discuss it on the "
+"freebsd-java."
+msgstr ""
+"Все функции, представленные в этом разделе, реализованы в "
+"[.filename]#bsd.java.mk#. Если порту требуется более сложная поддержка Java, "
+"сначала ознакомьтесь с https://cgit.FreeBSD.org/ports/tree/Mk/"
+"bsd.java.mk[историей изменений bsd.java.mk], так как документирование новых "
+"функций обычно занимает некоторое время. Затем, если отсутствующая поддержка "
+"будет полезна для многих других Java-портов, не стесняйтесь обсудить это на "
+"списке рассылки freebsd-java."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3363
+msgid ""
+"Although there is a `java` category for PRs, it refers to the JDK porting "
+"effort from the FreeBSD Java project. Therefore, submit the Java port in "
+"the `ports` category as for any other port, unless the issue is related to "
+"either a JDK implementation or [.filename]#bsd.java.mk#."
+msgstr ""
+"Хотя существует категория `java` для PR, она относится к усилиям по "
+"портированию JDK в рамках проекта FreeBSD Java. Поэтому отправляйте порт "
+"Java в категорию `ports`, как и любой другой порт, если только проблема не "
+"связана либо с реализацией JDK, либо с [.filename]#bsd.java.mk#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3365
+msgid ""
+"Similarly, there is a defined policy regarding the `CATEGORIES` of a Java "
+"port, which is detailed in crossref:makefiles[makefile-"
+"categories,Categorization]."
+msgstr ""
+"Аналогично существует определённая политика в отношении `CATEGORIES` для "
+"портов Java, которая подробно описана в crossref:makefiles[makefile-"
+"categories,Категоризация]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3367
+#, no-wrap
+msgid "Web Applications, Apache and PHP"
+msgstr "Веб-приложения, Apache и PHP"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3370
+#, no-wrap
+msgid "Apache"
+msgstr "Apache"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3373
+#, no-wrap
+msgid "Variables for Ports That Use Apache"
+msgstr "Переменные для портов, использующих Apache"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3377
+#, no-wrap
+msgid "`USE_APACHE`"
+msgstr "`USE_APACHE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3379
+#, no-wrap
+msgid "The port requires Apache. Possible values: `yes` (gets any version), `22`, `24`, `22-24`, `22+`, etc. The default APACHE version is `22`. More details are available in [.filename]#ports/Mk/bsd.apache.mk# and at https://wiki.freebsd.org/Apache/[wiki.freebsd.org/Apache/]."
+msgstr "Порт требует Apache. Возможные значения: `yes` (любая версия), `22`, `24`, `22-24`, `22+` и т.д. Версия APACHE по умолчанию — `22`. Подробнее см. в [.filename]#ports/Mk/bsd.apache.mk# и на https://wiki.freebsd.org/Apache/[wiki.freebsd.org/Apache/]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3380
+#, no-wrap
+msgid "`APXS`"
+msgstr "`APXS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3382
+#, no-wrap
+msgid "Full path to the `apxs` binary. Can be overridden in the port."
+msgstr "Полный путь к бинарному файлу `apxs`. Может быть переопределён в порте."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3383
+#, no-wrap
+msgid "`HTTPD`"
+msgstr "`HTTPD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3385
+#, no-wrap
+msgid "Full path to the `httpd` binary. Can be overridden in the port."
+msgstr "Полный путь к бинарному файлу `httpd`. Может быть переопределён в порте."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3386
+#, no-wrap
+msgid "`APACHE_VERSION`"
+msgstr "`APACHE_VERSION`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3388
+#, no-wrap
+msgid "The version of present Apache installation (read-only variable). This variable is only available after inclusion of [.filename]#bsd.port.pre.mk#. Possible values: `22`, `24`."
+msgstr "Версия установленной Apache (переменная только для чтения). Эта переменная доступна только после включения [.filename]#bsd.port.pre.mk#. Возможные значения: `22`, `24`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3389
+#, no-wrap
+msgid "`APACHEMODDIR`"
+msgstr "`APACHEMODDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3391
+#, no-wrap
+msgid "Directory for Apache modules. This variable is automatically expanded in [.filename]#pkg-plist#."
+msgstr "Каталог для модулей Apache. Эта переменная автоматически раскрывается в [.filename]#pkg-plist#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3392
+#, no-wrap
+msgid "`APACHEINCLUDEDIR`"
+msgstr "`APACHEINCLUDEDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3394
+#, no-wrap
+msgid "Directory for Apache headers. This variable is automatically expanded in [.filename]#pkg-plist#."
+msgstr "Каталог для заголовков Apache. Эта переменная автоматически раскрывается в [.filename]#pkg-plist#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3395
+#, no-wrap
+msgid "`APACHEETCDIR`"
+msgstr "`APACHEETCDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3396
+#, no-wrap
+msgid "Directory for Apache configuration files. This variable is automatically expanded in [.filename]#pkg-plist#."
+msgstr "Каталог для файлов конфигурации Apache. Эта переменная автоматически раскрывается в [.filename]#pkg-plist#."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3399
+#, no-wrap
+msgid "Useful Variables for Porting Apache Modules"
+msgstr "Полезные переменные для переноса модулей Apache"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3403
+#, no-wrap
+msgid "`MODULENAME`"
+msgstr "`MODULENAME`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3405
+#, no-wrap
+msgid "Name of the module. Default value is `PORTNAME`. Example: `mod_hello`"
+msgstr "Имя модуля. Значение по умолчанию — `PORTNAME`. Пример: `mod_hello`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3406
+#, no-wrap
+msgid "`SHORTMODNAME`"
+msgstr "`SHORTMODNAME`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3408
+#, no-wrap
+msgid "Short name of the module. Automatically derived from `MODULENAME`, but can be overridden. Example: `hello`"
+msgstr "Короткое имя модуля. Автоматически определяется из `MODULENAME`, но может быть переопределено. Пример: `hello`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3409
+#, no-wrap
+msgid "`AP_FAST_BUILD`"
+msgstr "`AP_FAST_BUILD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3411
+#, no-wrap
+msgid "Use `apxs` to compile and install the module."
+msgstr "Используйте `apxs` для компиляции и установки модуля."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3412
+#, no-wrap
+msgid "`AP_GENPLIST`"
+msgstr "`AP_GENPLIST`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3414
+#, no-wrap
+msgid "Also automatically creates a [.filename]#pkg-plist#."
+msgstr "Также автоматически создаёт файл [.filename]#pkg-plist#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3415
+#, no-wrap
+msgid "`AP_INC`"
+msgstr "`AP_INC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3417
+#, no-wrap
+msgid "Adds a directory to a header search path during compilation."
+msgstr "Добавляет каталог в путь поиска заголовков во время компиляции."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3418
+#, no-wrap
+msgid "`AP_LIB`"
+msgstr "`AP_LIB`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3420
+#, no-wrap
+msgid "Adds a directory to a library search path during compilation."
+msgstr "Добавляет каталог в путь поиска библиотек во время компиляции."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3421
+#, no-wrap
+msgid "`AP_EXTRAS`"
+msgstr "`AP_EXTRAS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3422
+#, no-wrap
+msgid "Additional flags to pass to `apxs`."
+msgstr "Дополнительные флаги для передачи в `apxs`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3425
+#, no-wrap
+msgid "Web Applications"
+msgstr "Веб-приложения"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3429
+msgid ""
+"Web applications must be installed into [.filename]#PREFIX/www/appname#. "
+"This path is available both in [.filename]#Makefile# and in [.filename]#pkg-"
+"plist# as `WWWDIR`, and the path relative to `PREFIX` is available in "
+"[.filename]#Makefile# as `WWWDIR_REL`."
+msgstr ""
+"Веб-приложения должны быть установлены в [.filename]#PREFIX/www/appname#. "
+"Этот путь доступен как в [.filename]#Makefile#, так и в [.filename]#pkg-"
+"plist# как `WWWDIR`, а путь относительно `PREFIX` доступен в "
+"[.filename]#Makefile# как `WWWDIR_REL`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3434
+msgid ""
+"The user and group of web server process are available as `WWWOWN` and "
+"`WWWGRP`, in case the ownership of some files needs to be changed. The "
+"default values of both are `www`. Use `WWWOWN?= myuser` and `WWWGRP?= "
+"mygroup` if the port needs different values. This allows the user to "
+"override them easily."
+msgstr ""
+"Пользователь и группа процесса веб-сервера доступны как `WWWOWN` и `WWWGRP`, "
+"если необходимо изменить владельца некоторых файлов. Значения по умолчанию "
+"для обоих — `www`. Используйте `WWWOWN?= myuser` и `WWWGRP?= mygroup`, если "
+"порту требуются другие значения. Это позволяет пользователю легко их "
+"переопределить."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3439
+msgid ""
+"Use `WWWOWN` and `WWWGRP` sparingly. Remember that every file the web "
+"server can write to is a security risk waiting to happen."
+msgstr ""
+"Используйте `WWWOWN` и `WWWGRP` с осторожностью. Помните, что каждый файл, "
+"доступный для записи веб-серверу, представляет собой потенциальную угрозу "
+"безопасности."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3443
+msgid ""
+"Do not depend on Apache unless the web app explicitly needs Apache. Respect "
+"that users may wish to run a web application on a web server other than "
+"Apache."
+msgstr ""
+"Не зависьте от Apache, если веб-приложение явно не требует Apache. "
+"Учитывайте, что пользователи могут захотеть запускать веб-приложение на "
+"другом веб-сервере, кроме Apache."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3445
+#, no-wrap
+msgid "PHP"
+msgstr "PHP"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3449
+msgid ""
+"PHP web applications declare their dependency on it with `USES=php`. See "
+"crossref:uses[uses-php,`php`] for more information."
+msgstr ""
+"Веб-приложения PHP объявляют свою зависимость от него с помощью `USES=php`. "
+"Подробнее см. в crossref:uses[uses-php,`php`]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3451
+#, no-wrap
+msgid "PEAR Modules"
+msgstr "Модули PEAR"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3454
+msgid "Porting PEAR modules is a very simple process."
+msgstr "Портирование модулей PEAR — это очень простой процесс."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3457
+msgid ""
+"Add `USES=pear` to the port's [.filename]#Makefile#. The framework will "
+"install the relevant files in the right places and automatically generate "
+"the plist at install time."
+msgstr ""
+"Добавьте `USES=pear` в [.filename]#Makefile# порта. Фреймворк установит "
+"соответствующие файлы в нужные места и автоматически сгенерирует plist во "
+"время установки."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3459
+#, no-wrap
+msgid "Example Makefile for PEAR Class"
+msgstr "Пример Makefile для PEAR Class"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3467
+#, no-wrap
+msgid ""
+"PORTNAME= Date\n"
+"DISTVERSION=\t1.4.3\n"
+"CATEGORIES=\tdevel www pear\n"
+msgstr ""
+"PORTNAME= Date\n"
+"DISTVERSION=\t1.4.3\n"
+"CATEGORIES=\tdevel www pear\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3471
+#, no-wrap
+msgid ""
+"MAINTAINER=\tsomeone@example.org\n"
+"COMMENT=\tPEAR Date and Time Zone Classes\n"
+"WWW=\t\thttps://pear.php.net/package/Date/\n"
+msgstr ""
+"MAINTAINER=\tsomeone@example.org\n"
+"COMMENT=\tPEAR Date and Time Zone Classes\n"
+"WWW=\t\thttps://pear.php.net/package/Date/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3473
+#, no-wrap
+msgid "USES=\tpear\n"
+msgstr "USES=\tpear\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3482
+msgid ""
+"PEAR modules will automatically be flavorized using crossref:flavors[flavors-"
+"auto-php,PHP flavors]."
+msgstr ""
+"Модули PEAR будут автоматически преобразованы в порт с флейвором с "
+"использованием crossref:flavors[flavors-auto-php,флейворов PHP]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3487
+msgid ""
+"If a non default `PEAR_CHANNEL` is used, the build and run-time dependencies "
+"will automatically be added."
+msgstr ""
+"Если используется нестандартный `PEAR_CHANNEL`, зависимости для сборки и "
+"выполнения будут добавлены автоматически."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3493
+msgid ""
+"PEAR modules do not need to defined `PKGNAMESUFFIX` it is automatically "
+"filled in using `PEAR_PKGNAMEPREFIX`. If a port needs to add to "
+"`PKGNAMEPREFIX`, it must also use `PEAR_PKGNAMEPREFIX` to differentiate "
+"between different flavors."
+msgstr ""
+"Модули PEAR не требуют определения `PKGNAMESUFFIX`, так как он автоматически "
+"заполняется с использованием `PEAR_PKGNAMEPREFIX`. Если порту необходимо "
+"добавить к `PKGNAMEPREFIX`, он также должен использовать "
+"`PEAR_PKGNAMEPREFIX`, чтобы отличать различные флейворы."
+
+#. type: Title ====
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3496
+#, no-wrap
+msgid "Horde Modules"
+msgstr "Модули Horde"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3499
+msgid "In the same way, porting Horde modules is a simple process."
+msgstr "Также и перенос модулей Horde является простым процессом."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3502
+msgid ""
+"Add `USES=horde` to the port's [.filename]#Makefile#. The framework will "
+"install the relevant files in the right places and automatically generate "
+"the plist at install time."
+msgstr ""
+"Добавьте `USES=horde` в [.filename]#Makefile# порта. Фреймворк установит "
+"соответствующие файлы в нужные места и автоматически сгенерирует plist во "
+"время установки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3505
+msgid ""
+"The `USE_HORDE_BUILD` and `USE_HORDE_RUN` variables can be used to add "
+"buildtime and runtime dependencies on other Horde modules. See "
+"[.filename]#Mk/Uses/horde.mk# for a complete list of available modules."
+msgstr ""
+"Переменные `USE_HORDE_BUILD` и `USE_HORDE_RUN` могут использоваться для "
+"добавления зависимостей времени сборки и выполнения от других модулей Horde. "
+"Полный список доступных модулей можно найти в [.filename]#Mk/Uses/horde.mk#."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3507
+#, no-wrap
+msgid "Example Makefile for Horde Module"
+msgstr "Пример Makefile для модуля Horde"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3515
+#, no-wrap
+msgid ""
+"PORTNAME=\tHorde_Core\n"
+"DISTVERSION=\t2.14.0\n"
+"CATEGORIES=\tdevel www pear\n"
+msgstr ""
+"PORTNAME=\tHorde_Core\n"
+"DISTVERSION=\t2.14.0\n"
+"CATEGORIES=\tdevel www pear\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3519
+#, no-wrap
+msgid ""
+"MAINTAINER=\thorde@FreeBSD.org\n"
+"COMMENT=\tHorde Core Framework libraries\n"
+"WWW=\t\thttps://pear.horde.org/\n"
+msgstr ""
+"MAINTAINER=\thorde@FreeBSD.org\n"
+"COMMENT=\tHorde Core Framework libraries\n"
+"WWW=\t\thttps://pear.horde.org/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3523
+#, no-wrap
+msgid ""
+"OPTIONS_DEFINE=\tKOLAB SOCKETS\n"
+"KOLAB_DESC=\tEnable Kolab server support\n"
+"SOCKETS_DESC=\tDepend on sockets PHP extension\n"
+msgstr ""
+"OPTIONS_DEFINE=\tKOLAB SOCKETS\n"
+"KOLAB_DESC=\tEnable Kolab server support\n"
+"SOCKETS_DESC=\tDepend on sockets PHP extension\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3526
+#, no-wrap
+msgid ""
+"USES=\thorde\n"
+"USE_PHP=\tsession\n"
+msgstr ""
+"USES=\thorde\n"
+"USE_PHP=\tsession\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3530
+#, no-wrap
+msgid ""
+"USE_HORDE_BUILD=\tHorde_Role\n"
+"USE_HORDE_RUN=\tHorde_Role Horde_History Horde_Pack \\\n"
+"\t\tHorde_Text_Filter Horde_View\n"
+msgstr ""
+"USE_HORDE_BUILD=\tHorde_Role\n"
+"USE_HORDE_RUN=\tHorde_Role Horde_History Horde_Pack \\\n"
+"\t\tHorde_Text_Filter Horde_View\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3533
+#, no-wrap
+msgid ""
+"KOLAB_USE=\tHORDE_RUN=Horde_Kolab_Server,Horde_Kolab_Session\n"
+"SOCKETS_USE=\tPHP=sockets\n"
+msgstr ""
+"KOLAB_USE=\tHORDE_RUN=Horde_Kolab_Server,Horde_Kolab_Session\n"
+"SOCKETS_USE=\tPHP=sockets\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3542
+msgid ""
+"As Horde modules are also PEAR modules they will also automatically be "
+"flavorized using crossref:flavors[flavors-auto-php,PHP flavors]."
+msgstr ""
+"Поскольку модули Horde также являются модулями PEAR, они будут автоматически "
+"преобразованы с использованием crossref:flavors[flavors-auto-php,флейворов "
+"PHP]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3545
+#, no-wrap
+msgid "Using Python"
+msgstr "Использование Python"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3550
+msgid ""
+"The Ports Collection supports parallel installation of multiple Python "
+"versions. Ports must use a correct `python` interpreter, according to the "
+"user-settable `PYTHON_VERSION`. Most prominently, this means replacing the "
+"path to `python` executable in scripts with the value of `PYTHON_CMD`."
+msgstr ""
+"Коллекция портов поддерживает параллельную установку нескольких версий "
+"Python. Порты должны использовать правильный интерпретатор `python` в "
+"соответствии с настраиваемым пользователем параметром `PYTHON_VERSION`. "
+"Важнее всего заменить путь к исполняемому файлу `python` в скриптах на "
+"значение `PYTHON_CMD`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3552
+msgid ""
+"Ports that install files under `PYTHON_SITELIBDIR` must use the `pyXY-` "
+"package name prefix, so their package name embeds the version of Python they "
+"are installed into."
+msgstr ""
+"Порты, которые устанавливают файлы в `PYTHON_SITELIBDIR`, должны "
+"использовать префикс имени пакета `pyXY-`, чтобы их имя пакета включало "
+"версию Python, для которой они предназначены."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3556
+#, no-wrap
+msgid "PKGNAMEPREFIX=\t${PYTHON_PKGNAMEPREFIX}\n"
+msgstr "PKGNAMEPREFIX=\t${PYTHON_PKGNAMEPREFIX}\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3560
+#, no-wrap
+msgid "Most Useful Variables for Ports That Use Python"
+msgstr "Наиболее полезные переменные для портов, использующих Python"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3564
+#, no-wrap
+msgid "`USES=python`"
+msgstr "`USES=python`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3566
+#, no-wrap
+msgid "The port needs Python. The minimal required version can be specified with values such as `3.10+`. Version ranges can also be specified by separating two version numbers with a dash: `USES=python:3.8-3.9`. Note that `USES=python` does _not_ cover Python 2.7, it needs to be requested explicitly with `USES=python:2.7+`."
+msgstr "Порту требуется Python. Минимально необходимая версия может быть указана с такими значениями, как `3.10+`. Диапазоны версий также можно указать, разделив две версии дефисом: `USES=python:3.8-3.9`. Обратите внимание, что `USES=python` _не_ включает Python 2.7, его нужно запрашивать явно с помощью `USES=python:2.7+`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3567
+#, no-wrap
+msgid "`USE_PYTHON=distutils`"
+msgstr "`USE_PYTHON=distutils`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3569
+#, no-wrap
+msgid "Use Python distutils for configuring, compiling, and installing. This is required when the port comes with [.filename]#setup.py#. This overrides the `do-build` and `do-install` targets and may also override `do-configure` if `GNU_CONFIGURE` is not defined. Additionally, it implies `USE_PYTHON=flavors`."
+msgstr "Используйте Python distutils для настройки, компиляции и установки. Это требуется, когда порт поставляется с [.filename]#setup.py#. Это переопределяет цели `do-build` и `do-install`, а также может переопределить `do-configure`, если `GNU_CONFIGURE` не определён. Кроме того, подразумевается `USE_PYTHON=flavors`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3570
+#, no-wrap
+msgid "`USE_PYTHON=autoplist`"
+msgstr "`USE_PYTHON=autoplist`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3572
+#, no-wrap
+msgid "Create the packaging list automatically. This also requires `USE_PYTHON=distutils` to be set."
+msgstr "Создать список пакетов автоматически. Это также требует установки `USE_PYTHON=distutils`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3573
+#, no-wrap
+msgid "`USE_PYTHON=concurrent`"
+msgstr "`USE_PYTHON=concurrent`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3575
+#, no-wrap
+msgid "The port will use an unique prefix, typically `PYTHON_PKGNAMEPREFIX` for certain directories, such as `EXAMPLESDIR` and `DOCSDIR` and also will append a suffix, the python version from `PYTHON_VER`, to binaries and scripts to be installed. This allows ports to be installed for different Python versions at the same time, which otherwise would install conflicting files."
+msgstr "Порт будет использовать уникальный префикс, обычно `PYTHON_PKGNAMEPREFIX`, для определённых каталогов, таких как `EXAMPLESDIR` и `DOCSDIR`, а также добавлять суффикс — версию Python из `PYTHON_VER` — к устанавливаемым бинарным файлам и скриптам. Это позволяет устанавливать порты для разных версий Python одновременно, что в противном случае приводило бы к конфликту файлов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3576
+#, no-wrap
+msgid "`USE_PYTHON=flavors`"
+msgstr "`USE_PYTHON=flavors`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3578
+#, no-wrap
+msgid "The port does not use distutils but still supports multiple Python versions. `FLAVORS` will be set to the supported Python versions. See crossref:flavors[flavors-auto-python,`USES`=python and Flavors] for more information."
+msgstr "Порт не использует distutils, но по-прежнему поддерживает несколько версий Python. `FLAVORS` будет установлен в поддерживаемые версии Python. Дополнительную информацию см. в crossref:flavors[flavors-auto-python,`USES`=python и флейворы]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3579
+#, no-wrap
+msgid "`USE_PYTHON=optsuffix`"
+msgstr "`USE_PYTHON=optsuffix`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3581
+#, no-wrap
+msgid "If the current Python version is not the default version, the port will gain `PKGNAMESUFFIX=${PYTHON_PKGNAMESUFFIX}`. Only useful with flavors."
+msgstr "Если текущая версия Python не является версией по умолчанию, порт получит `PKGNAMESUFFIX=${PYTHON_PKGNAMESUFFIX}`. Полезно только для флейворов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3582
+#, no-wrap
+msgid "`PYTHON_PKGNAMEPREFIX`"
+msgstr "`PYTHON_PKGNAMEPREFIX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3584
+#, no-wrap
+msgid "Used as a `PKGNAMEPREFIX` to distinguish packages for different Python versions. Example: `py27-`"
+msgstr "Используется как `PKGNAMEPREFIX` для различения пакетов разных версий Python. Пример: `py27-`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3585
+#, no-wrap
+msgid "`PYTHON_SITELIBDIR`"
+msgstr "`PYTHON_SITELIBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3587
+#, no-wrap
+msgid "Location of the site-packages tree, that contains installation path of Python (usually `LOCALBASE`). `PYTHON_SITELIBDIR` can be very useful when installing Python modules."
+msgstr "Расположение дерева site-packages, которое содержит путь установки Python (обычно `LOCALBASE`). `PYTHON_SITELIBDIR` может быть очень полезно при установке модулей Python."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3588
+#, no-wrap
+msgid "`PYTHONPREFIX_SITELIBDIR`"
+msgstr "`PYTHONPREFIX_SITELIBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3590
+#, no-wrap
+msgid "The PREFIX-clean variant of PYTHON_SITELIBDIR. Always use `%%PYTHON_SITELIBDIR%%` in [.filename]#pkg-plist# when possible. The default value of `%%PYTHON_SITELIBDIR%%` is `lib/python%%PYTHON_VERSION%%/site-packages`"
+msgstr "Вариант PREFIX-clean для PYTHON_SITELIBDIR. Всегда используйте `%%PYTHON_SITELIBDIR%%` в [.filename]#pkg-plist#, когда это возможно. Значение по умолчанию для `%%PYTHON_SITELIBDIR%%` — `lib/python%%PYTHON_VERSION%%/site-packages`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3591
+#, no-wrap
+msgid "`PYTHON_CMD`"
+msgstr "`PYTHON_CMD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3592
+#, no-wrap
+msgid "Python interpreter command line, including version number."
+msgstr "Интерпретатор командной строки Python, включая номер версии."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3595
+#, no-wrap
+msgid "Python Module Dependency Helpers"
+msgstr "Помощники зависимостей модуля Python"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3599
+#, no-wrap
+msgid "`PYNUMERIC`"
+msgstr "`PYNUMERIC`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3601
+#, no-wrap
+msgid "Dependency line for numeric extension."
+msgstr "Строка зависимости для числового расширения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3602
+#, no-wrap
+msgid "`PYNUMPY`"
+msgstr "`PYNUMPY`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3604
+#, no-wrap
+msgid "Dependency line for the new numeric extension, numpy. (PYNUMERIC is deprecated by upstream vendor)."
+msgstr "Строка зависимости для нового числового расширения, numpy. (PYNUMERIC устарел у вендора)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3605
+#, no-wrap
+msgid "`PYXML`"
+msgstr "`PYXML`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3607
+#, no-wrap
+msgid "Dependency line for XML extension (not needed for Python 2.0 and higher as it is also in base distribution)."
+msgstr "Строка зависимости для расширения XML (не требуется для Python 2.0 и выше, так как оно также входит в базовую поставку)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3608
+#, no-wrap
+msgid "`PY_ENUM34`"
+msgstr "`PY_ENUM34`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3610
+#, no-wrap
+msgid "Conditional dependency on package:devel/py-enum34[] depending on the Python version."
+msgstr "Условная зависимость от пакета package:devel/py-enum34[] в зависимости от версии Python."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3611
+#, no-wrap
+msgid "`PY_ENUM_COMPAT`"
+msgstr "`PY_ENUM_COMPAT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3613
+#, no-wrap
+msgid "Conditional dependency on package:devel/py-enum-compat[] depending on the Python version."
+msgstr "Условная зависимость от пакета package:devel/py-enum-compat[] в зависимости от версии Python."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3614
+#, no-wrap
+msgid "`PY_PATHLIB`"
+msgstr "`PY_PATHLIB`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3616
+#, no-wrap
+msgid "Conditional dependency on package:devel/py-pathlib[] depending on the Python version."
+msgstr "Условная зависимость от пакета package:devel/py-pathlib[] в зависимости от версии Python."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3617
+#, no-wrap
+msgid "`PY_IPADDRESS`"
+msgstr "`PY_IPADDRESS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3619
+#, no-wrap
+msgid "Conditional dependency on package:net/py-ipaddress[] depending on the Python version."
+msgstr "Условная зависимость от пакета package:net/py-ipaddress[] в зависимости от версии Python."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3620
+#, no-wrap
+msgid "`PY_FUTURES`"
+msgstr "`PY_FUTURES`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3621
+#, no-wrap
+msgid "Conditional dependency on package:devel/py-futures[] depending on the Python version."
+msgstr "Условная зависимость от пакета package:devel/py-futures[] в зависимости от версии Python."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3624
+msgid ""
+"A complete list of available variables can be found in [.filename]#/usr/"
+"ports/Mk/Uses/python.mk#."
+msgstr ""
+"Полный список доступных переменных можно найти в [.filename]#/usr/ports/Mk/"
+"Uses/python.mk#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3629
+msgid ""
+"All dependencies to Python ports using crossref:flavors[flavors-auto-"
+"python,Python flavors] (either with `USE_PYTHON=distutils` or "
+"`USE_PYTHON=flavors`) must have the Python flavor appended to their origin "
+"using `@${PY_FLAVOR}`. See crossref:special[python-Makefile,Makefile for a "
+"Simple Python Module]."
+msgstr ""
+"Все зависимости для портов Python, использующих crossref:flavors[flavors-"
+"auto-python,флейворы Python] (с `USE_PYTHON=distutils` или "
+"`USE_PYTHON=flavors`), должны иметь флейвор Python, добавленную к их origin "
+"с помощью `@${PY_FLAVOR}`. См. crossref:special[python-Makefile,Makefile для "
+"простого модуля Python]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3632
+#, no-wrap
+msgid "Makefile for a Simple Python Module"
+msgstr "Makefile для Простого Модуля Python"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3640
+#, no-wrap
+msgid ""
+"PORTNAME=\tsample\n"
+"DISTVERSION=\t1.2.3\n"
+"CATEGORIES=\tdevel\n"
+msgstr ""
+"PORTNAME=\tsample\n"
+"DISTVERSION=\t1.2.3\n"
+"CATEGORIES=\tdevel\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3644
+#, no-wrap
+msgid ""
+"MAINTAINER=\tfred.bloggs@example.com\n"
+"COMMENT=\tPython sample module\n"
+"WWW=\t\thttps://example.com/project/sample/\n"
+msgstr ""
+"MAINTAINER=\tfred.bloggs@example.com\n"
+"COMMENT=\tPython sample module\n"
+"WWW=\t\thttps://example.com/project/sample/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3646
+#, no-wrap
+msgid "RUN_DEPENDS=\t${PYTHON_PKGNAMEPREFIX}six>0:devel/py-six@${PY_FLAVOR}\n"
+msgstr "RUN_DEPENDS=\t${PYTHON_PKGNAMEPREFIX}six>0:devel/py-six@${PY_FLAVOR}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3649
+#, no-wrap
+msgid ""
+"USES=\t\tpython\n"
+"USE_PYTHON=\tautoplist distutils\n"
+msgstr ""
+"USES=\t\tpython\n"
+"USE_PYTHON=\tautoplist distutils\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3659
+msgid ""
+"Some Python applications claim to have `DESTDIR` support (which would be "
+"required for staging) but it is broken (Mailman up to 2.1.16, for "
+"instance). This can be worked around by recompiling the scripts. This can "
+"be done, for example, in the `post-build` target. Assuming the Python "
+"scripts are supposed to reside in `PYTHONPREFIX_SITELIBDIR` after "
+"installation, this solution can be applied:"
+msgstr ""
+"Некоторые приложения на Python заявляют о поддержке `DESTDIR` (что "
+"необходимо для промежуточной сборки), но она не работает (например, Mailman "
+"до версии 2.1.16). Это можно обойти, перекомпилировав скрипты. Это можно "
+"сделать, например, в цели `post-build`. Предполагая, что Python-скрипты "
+"должны находиться в `PYTHONPREFIX_SITELIBDIR` после установки, можно "
+"применить следующее решение:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3665
+#, no-wrap
+msgid ""
+"(cd ${STAGEDIR}${PREFIX} \\\n"
+" && ${PYTHON_CMD} ${PYTHON_LIBDIR}/compileall.py \\\n"
+" -d ${PREFIX} -f ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;})\n"
+msgstr ""
+"(cd ${STAGEDIR}${PREFIX} \\\n"
+" && ${PYTHON_CMD} ${PYTHON_LIBDIR}/compileall.py \\\n"
+" -d ${PREFIX} -f ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;})\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3668
+msgid ""
+"This recompiles the sources with a path relative to the stage directory, and "
+"prepends the value of `PREFIX` to the file name recorded in the byte-"
+"compiled output file by `-d`. `-f` is required to force recompilation, and "
+"the `:S;${PREFIX}/;;` strips prefixes from the value of "
+"`PYTHONPREFIX_SITELIBDIR` to make it relative to `PREFIX`."
+msgstr ""
+"Это перекомпилирует исходники с путём, относительным к stage-директории, и "
+"добавляет значение `PREFIX` к имени файла, записанному в байт-"
+"компилированном выходном файле с помощью `-d`. `-f` требуется для "
+"принудительной перекомпиляции, а `:S;${PREFIX}/;;` удаляет префиксы из "
+"значения `PYTHONPREFIX_SITELIBDIR`, чтобы сделать его относительным к "
+"`PREFIX`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3670
+#, no-wrap
+msgid "Using Tcl/Tk"
+msgstr "Использование Tcl/Tk"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3675
+msgid ""
+"The Ports Collection supports parallel installation of multiple Tcl/Tk "
+"versions. Ports should try to support at least the default Tcl/Tk version "
+"and higher with `USES=tcl`. It is possible to specify the desired version "
+"of `tcl` by appending `:_xx_`, for example, `USES=tcl:85`."
+msgstr ""
+"Коллекция Ports поддерживает параллельную установку нескольких версий Tcl/"
+"Tk. Порты должны стараться поддерживать как минимум версию Tcl/Tk по "
+"умолчанию и выше с помощью `USES=tcl`. Можно указать желаемую версию `tcl`, "
+"добавив `:_xx_`, например, `USES=tcl:85`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3677
+#, no-wrap
+msgid "The Most Useful Read-Only Variables for Ports That Use Tcl/Tk"
+msgstr "Самые полезные переменные только для чтения для портов, использующих Tcl/Tk"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3681
+#, no-wrap
+msgid "`TCL_VER`"
+msgstr "`TCL_VER`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3683
+#, no-wrap
+msgid "chosen major.minor version of Tcl"
+msgstr "выбранная версия Tcl major.minor"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3684
+#, no-wrap
+msgid "`TCLSH`"
+msgstr "`TCLSH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3686
+#, no-wrap
+msgid "full path of the Tcl interpreter"
+msgstr "полный путь к интерпретатору Tcl"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3687
+#, no-wrap
+msgid "`TCL_LIBDIR`"
+msgstr "`TCL_LIBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3689
+#, no-wrap
+msgid "path of the Tcl libraries"
+msgstr "путь к библиотекам Tcl"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3690
+#, no-wrap
+msgid "`TCL_INCLUDEDIR`"
+msgstr "`TCL_INCLUDEDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3692
+#, no-wrap
+msgid "path of the Tcl C header files"
+msgstr "путь к заголовочным файлам Tcl C"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3693
+#, no-wrap
+msgid "`TCL_PKG_LIB_PREFIX`"
+msgstr "`TCL_PKG_LIB_PREFIX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3695
+#, no-wrap
+msgid "Library prefix, as per TIP595"
+msgstr "Префикс библиотеки, согласно TIP595"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3696
+#, no-wrap
+msgid "`TCL_PKG_STUB_POSTFIX`"
+msgstr "`TCL_PKG_STUB_POSTFIX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3698
+#, no-wrap
+msgid "Stub library postfix"
+msgstr "Заглушка библиотеки postfix"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3699
+#, no-wrap
+msgid "`TK_VER`"
+msgstr "`TK_VER`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3701
+#, no-wrap
+msgid "chosen major.minor version of Tk"
+msgstr "выбранная версия Tk major.minor"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3702
+#, no-wrap
+msgid "`WISH`"
+msgstr "`WISH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3704
+#, no-wrap
+msgid "full path of the Tk interpreter"
+msgstr "полный путь к интерпретатору Tk"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3705
+#, no-wrap
+msgid "`TK_LIBDIR`"
+msgstr "`TK_LIBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3707
+#, no-wrap
+msgid "path of the Tk libraries"
+msgstr "путь к библиотекам Tk"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3708
+#, no-wrap
+msgid "`TK_INCLUDEDIR`"
+msgstr "`TK_INCLUDEDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3709
+#, no-wrap
+msgid "path of the Tk C header files"
+msgstr "путь к заголовочным файлам Tk C"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3713
+msgid ""
+"See the crossref:uses[uses-tcl,`USES=tcl`] and crossref:uses[uses-"
+"tk,`USES=tk`] of crossref:uses[uses,Using `USES` Macros] for a full "
+"description of those variables. A complete list of those variables is "
+"available in [.filename]#/usr/ports/Mk/Uses/tcl.mk#."
+msgstr ""
+"См. crossref:uses[uses-tcl,`USES=tcl`] и crossref:uses[uses-tk,`USES=tk`] в "
+"crossref:uses[uses,Использование макросов `USES`] для полного описания этих "
+"переменных. Полный список этих переменных доступен в [.filename]#/usr/ports/"
+"Mk/Uses/tcl.mk#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3715
+#, no-wrap
+msgid "Using SDL"
+msgstr "Использование SDL"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3718
+msgid ""
+"`USE_SDL` is used to autoconfigure the dependencies for ports which use an "
+"SDL based library like package:devel/sdl12[] and package:graphics/"
+"sdl_image[]."
+msgstr ""
+"`USE_SDL` используется для автоматической настройки зависимостей для портов, "
+"которые используют библиотеку на основе SDL, такие как package:devel/sdl12[] "
+"и package:graphics/sdl_image[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3720
+msgid "These SDL libraries for version 1.2 are recognized:"
+msgstr "Эти библиотеки SDL для версии 1.2 распознаются:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3722
+msgid "sdl: package:devel/sdl12[]"
+msgstr "sdl: package:devel/sdl12[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3723
+msgid "console: package:devel/sdl_console[]"
+msgstr "console: package:devel/sdl_console[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3724
+msgid "gfx: package:graphics/sdl_gfx[]"
+msgstr "gfx: package:graphics/sdl_gfx[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3725
+msgid "image: package:graphics/sdl_image[]"
+msgstr "image: package:graphics/sdl_image[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3726
+msgid "mixer: package:audio/sdl_mixer[]"
+msgstr "mixer: package:audio/sdl_mixer[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3727
+msgid "mm: package:devel/sdlmm[]"
+msgstr "mm: package:devel/sdlmm[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3728
+msgid "net: package:net/sdl_net[]"
+msgstr "net: package:net/sdl_net[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3729
+msgid "pango: package:x11-toolkits/sdl_pango[]"
+msgstr "pango: package:x11-toolkits/sdl_pango[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3730
+msgid "sound: package:audio/sdl_sound[]"
+msgstr "sound: package:audio/sdl_sound[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3731
+msgid "ttf: package:graphics/sdl_ttf[]"
+msgstr "ttf: package:graphics/sdl_ttf[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3733
+msgid "These SDL libraries for version 2.0 are recognized:"
+msgstr "Эти библиотеки SDL для версии 2.0 распознаются:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3735
+msgid "sdl: package:devel/sdl20[]"
+msgstr "sdl: package:devel/sdl20[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3736
+msgid "gfx: package:graphics/sdl2_gfx[]"
+msgstr "gfx: package:graphics/sdl2_gfx[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3737
+msgid "image: package:graphics/sdl2_image[]"
+msgstr "image: package:graphics/sdl2_image[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3738
+msgid "mixer: package:audio/sdl2_mixer[]"
+msgstr "mixer: package:audio/sdl2_mixer[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3739
+msgid "net: package:net/sdl2_net[]"
+msgstr "net: package:net/sdl2_net[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3740
+msgid "ttf: package:graphics/sdl2_ttf[]"
+msgstr "ttf: package:graphics/sdl2_ttf[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3742
+msgid ""
+"Therefore, if a port has a dependency on package:net/sdl_net[] and "
+"package:audio/sdl_mixer[], the syntax will be:"
+msgstr ""
+"Следовательно, если порт зависит от package:net/sdl_net[] и package:audio/"
+"sdl_mixer[], синтаксис будет следующим:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3746
+#, no-wrap
+msgid "USE_SDL=\tnet mixer\n"
+msgstr "USE_SDL=\tnet mixer\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3749
+msgid ""
+"The dependency package:devel/sdl12[], which is required by package:net/"
+"sdl_net[] and package:audio/sdl_mixer[], is automatically added as well."
+msgstr ""
+"Пакет зависимости package:devel/sdl12[], который требуется для package:net/"
+"sdl_net[] и package:audio/sdl_mixer[], также автоматически добавляется."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3751
+msgid "Using `USE_SDL` with entries for SDL 1.2, it will automatically:"
+msgstr "Использование `USE_SDL` с указанием SDL 1.2 автоматически:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3753
+msgid "Add a dependency on sdl12-config to `BUILD_DEPENDS`"
+msgstr "Добавить зависимость от sdl12-config в `BUILD_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3754
+msgid "Add the variable `SDL_CONFIG` to `CONFIGURE_ENV`"
+msgstr "Добавьте переменную `SDL_CONFIG` в `CONFIGURE_ENV`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3755
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3761
+msgid "Add the dependencies of the selected libraries to `LIB_DEPENDS`"
+msgstr "Добавьте зависимости выбранных библиотек в `LIB_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3757
+msgid "Using `USE_SDL` with entries for SDL 2.0, it will automatically:"
+msgstr "Используя `USE_SDL` с записями для SDL 2.0, это автоматически:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3759
+msgid "Add a dependency on sdl2-config to `BUILD_DEPENDS`"
+msgstr "Добавить зависимость от sdl2-config в `BUILD_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3760
+msgid "Add the variable `SDL2_CONFIG` to `CONFIGURE_ENV`"
+msgstr "Добавьте переменную `SDL2_CONFIG` в `CONFIGURE_ENV`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3764
+#, no-wrap
+msgid "Using wxWidgets"
+msgstr "Использование wxWidgets"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3767
+msgid ""
+"This section describes the status of the wxWidgets libraries in the ports "
+"tree and its integration with the ports system."
+msgstr ""
+"Этот раздел описывает состояние библиотек wxWidgets в дереве портов и их "
+"интеграцию с системой портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3773
+msgid ""
+"There are many versions of the wxWidgets libraries which conflict between "
+"them (install files under the same name). In the ports tree this problem "
+"has been solved by installing each version under a different name using "
+"version number suffixes."
+msgstr ""
+"Существует множество версий библиотек wxWidgets, которые конфликтуют между "
+"собой (устанавливают файлы с одинаковыми именами). В дереве портов эта "
+"проблема решена путем установки каждой версии под разными именами с "
+"использованием суффиксов номеров версий."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3779
+msgid ""
+"The obvious disadvantage of this is that each application has to be modified "
+"to find the expected version. Fortunately, most of the applications call "
+"the `wx-config` script to determine the necessary compiler and linker "
+"flags. The script is named differently for every available version. "
+"Majority of applications respect an environment variable, or accept a "
+"configure argument, to specify which `wx-config` script to call. Otherwise "
+"they have to be patched."
+msgstr ""
+"Очевидный недостаток этого подхода заключается в том, что каждое приложение "
+"необходимо модифицировать для поиска нужной версии. К счастью, большинство "
+"приложений вызывают скрипт `wx-config` для определения необходимых флагов "
+"компилятора и компоновщика. Имя этого скрипта отличается для каждой "
+"доступной версии. Большинство приложений учитывают переменную окружения или "
+"принимают аргумент configure, чтобы указать, какой скрипт `wx-config` "
+"вызывать. В противном случае их необходимо патчить."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3781
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4082
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4301
+#, no-wrap
+msgid "Version Selection"
+msgstr "Выбор версии"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3784
+msgid ""
+"To make the port use a specific version of wxWidgets there are two variables "
+"available for defining (if only one is defined the other will be set to a "
+"default value):"
+msgstr ""
+"Чтобы порт использовал определённую версию wxWidgets, доступны две "
+"переменные для определения (если задана только одна, другая будет "
+"установлена в значение по умолчанию):"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3786
+#, no-wrap
+msgid "Variables to Select wxWidgets Versions"
+msgstr "Переменные для выбора версий wxWidgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3793
+#, no-wrap
+msgid "Default value"
+msgstr "Значение по умолчанию"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3794
+#, no-wrap
+msgid "`USE_WX`"
+msgstr "`USE_WX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3795
+#, no-wrap
+msgid "List of versions the port can use"
+msgstr "Список версий, которые порт может использовать"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3797
+#, no-wrap
+msgid "All available versions"
+msgstr "Все доступные версии"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3798
+#, no-wrap
+msgid "`USE_WX_NOT`"
+msgstr "`USE_WX_NOT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3799
+#, no-wrap
+msgid "List of versions the port cannot use"
+msgstr "Список версий, которые порт не может использовать"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3800
+#, no-wrap
+msgid "None"
+msgstr "Ничего"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3803
+msgid ""
+"The available wxWidgets versions and the corresponding ports in the tree are:"
+msgstr "Доступные версии wxWidgets и соответствующие порты в дереве:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3805
+#, no-wrap
+msgid "Available wxWidgets Versions"
+msgstr "Доступные версии wxWidgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3809
+#, no-wrap
+msgid "Version"
+msgstr "Версия"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3811
+#, no-wrap
+msgid "Port"
+msgstr "Порт"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3812
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3830
+#, no-wrap
+msgid "`2.8`"
+msgstr "`2.8`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3814
+#, no-wrap
+msgid "package:x11-toolkits/wxgtk28[]"
+msgstr "package:x11-toolkits/wxgtk28[]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3815
+#, no-wrap
+msgid "`3.0`"
+msgstr "`3.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3816
+#, no-wrap
+msgid "package:x11-toolkits/wxgtk30[]"
+msgstr "package:x11-toolkits/wxgtk30[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3819
+msgid ""
+"The variables in crossref:special[wx-ver-sel-table,Variables to Select "
+"wxWidgets Versions] can be set to one or more of these combinations "
+"separated by spaces:"
+msgstr ""
+"Переменные в crossref:special[wx-ver-sel-table,Переменные для выбора версий "
+"wxWidgets] могут быть установлены в одну или несколько комбинаций, "
+"разделенных пробелами:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3821
+#, no-wrap
+msgid "wxWidgets Version Specifications"
+msgstr "Спецификации версий wxWidgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3827
+#, no-wrap
+msgid "Example"
+msgstr "Пример"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3828
+#, no-wrap
+msgid "Single version"
+msgstr "Единственная версия"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3831
+#, no-wrap
+msgid "Ascending range"
+msgstr "Возрастающий диапазон"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3833
+#, no-wrap
+msgid "`2.8+`"
+msgstr "`2.8+`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3834
+#, no-wrap
+msgid "Descending range"
+msgstr "Нисходящий диапазон"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3836
+#, no-wrap
+msgid "`3.0-`"
+msgstr "`3.0-`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3837
+#, no-wrap
+msgid "Full range (must be ascending)"
+msgstr "Полный диапазон (должен быть возрастающим)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3838
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3881
+#, no-wrap
+msgid "`2.8-3.0`"
+msgstr "`2.8-3.0`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3842
+msgid ""
+"There are also some variables to select the preferred versions from the "
+"available ones. They can be set to a list of versions, the first ones will "
+"have higher priority."
+msgstr ""
+"Существуют также переменные для выбора предпочтительных версий из доступных. "
+"Их можно установить в виде списка версий, где первые будут иметь более "
+"высокий приоритет."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3843
+#, no-wrap
+msgid "Variables to Select Preferred wxWidgets Versions"
+msgstr "Переменные для выбора предпочтительных версий wxWidgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3849
+#, no-wrap
+msgid "Designed for"
+msgstr "Предназначен для"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3850
+#, no-wrap
+msgid "`WANT_WX_VER`"
+msgstr "`WANT_WX_VER`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3852
+#, no-wrap
+msgid "the port"
+msgstr "порт"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3853
+#, no-wrap
+msgid "`WITH_WX_VER`"
+msgstr "`WITH_WX_VER`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3854
+#, no-wrap
+msgid "the user"
+msgstr "пользователь"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3861
+msgid ""
+"There are other applications that, while not being wxWidgets libraries, are "
+"related to them. These applications can be specified in `WX_COMPS`. These "
+"components are available:"
+msgstr ""
+"Существуют другие приложения, которые, не являясь библиотеками wxWidgets, "
+"связаны с ними. Эти приложения можно указать в `WX_COMPS`. Доступны "
+"следующие компоненты:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3863
+#, no-wrap
+msgid "Available wxWidgets Components"
+msgstr "Доступные компоненты wxWidgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3870
+#, no-wrap
+msgid "Version restriction"
+msgstr "Ограничение версии"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3871
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3914
+#, no-wrap
+msgid "`wx`"
+msgstr "`wx`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3872
+#, no-wrap
+msgid "main library"
+msgstr "основная библиотека"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3874
+#, no-wrap
+msgid "none"
+msgstr "none"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3875
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3917
+#, no-wrap
+msgid "`contrib`"
+msgstr "`contrib`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3876
+#, no-wrap
+msgid "contributed libraries"
+msgstr "сторонние библиотеки"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3878
+#, no-wrap
+msgid "`none`"
+msgstr "`none`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3879
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3920
+#, no-wrap
+msgid "`python`"
+msgstr "`python`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3880
+#, no-wrap
+msgid "wxPython (Python bindings)"
+msgstr "wxPython (интерфейс Python)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3886
+msgid ""
+"The dependency type can be selected for each component by adding a suffix "
+"separated by a semicolon. If not present then a default type will be used "
+"(see crossref:special[wx-def-dep-types,Default wxWidgets Dependency "
+"Types]). These types are available:"
+msgstr ""
+"Тип зависимости может быть выбран для каждого компонента путем добавления "
+"суффикса, разделенного точкой с запятой. Если он отсутствует, будет "
+"использоваться тип по умолчанию (см. crossref:special[wx-def-dep-types,Типы "
+"зависимостей wxWidgets по умолчанию]). Доступны следующие типы:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3888
+#, no-wrap
+msgid "Available wxWidgets Dependency Types"
+msgstr "Доступные типы зависимостей wxWidgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3895
+#, no-wrap
+msgid "`build`"
+msgstr "`build`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3897
+#, no-wrap
+msgid "Component is required for building, equivalent to `BUILD_DEPENDS`"
+msgstr "Компонент необходим для сборки, эквивалентен `BUILD_DEPENDS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3898
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3922
+#, no-wrap
+msgid "`run`"
+msgstr "`run`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3900
+#, no-wrap
+msgid "Component is required for running, equivalent to `RUN_DEPENDS`"
+msgstr "Компонент необходим для запуска, эквивалентно `RUN_DEPENDS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3901
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3916
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3919
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3925
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3927
+#, no-wrap
+msgid "`lib`"
+msgstr "`lib`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3902
+#, no-wrap
+msgid "Component is required for building and running, equivalent to `LIB_DEPENDS`"
+msgstr "Компонент необходим для сборки и запуска, эквивалентен `LIB_DEPENDS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3905
+msgid "The default values for the components are detailed in this table:"
+msgstr "Значения по умолчанию для компонентов подробно описаны в этой таблице:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3907
+#, no-wrap
+msgid "Default wxWidgets Dependency Types"
+msgstr "Типы зависимостей wxWidgets по умолчанию"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3913
+#, no-wrap
+msgid "Dependency type"
+msgstr "Тип зависимости"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3923
+#, no-wrap
+msgid "`mozilla`"
+msgstr "`mozilla`"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3930
+#, no-wrap
+msgid "Selecting wxWidgets Components"
+msgstr "Выбор компонентов wxWidgets"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3934
+msgid ""
+"This fragment corresponds to a port which uses wxWidgets version `2.4` and "
+"its contributed libraries."
+msgstr ""
+"Этот фрагмент соответствует порту, который использует wxWidgets версии `2.4` "
+"и дополнительные библиотеки."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3939
+#, no-wrap
+msgid ""
+"USE_WX=\t\t2.8\n"
+"WX_COMPS=\twx contrib\n"
+msgstr ""
+"USE_WX=\t\t2.8\n"
+"WX_COMPS=\twx contrib\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3944
+#, no-wrap
+msgid "Detecting Installed Versions"
+msgstr "Обнаружение установленных версий"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3949
+msgid ""
+"To detect an installed version, define `WANT_WX`. If it is not set to a "
+"specific version then the components will have a version suffix. `HAVE_WX` "
+"will be filled after detection."
+msgstr ""
+"Для определения установленной версии определите `WANT_WX`. Если значение не "
+"задано для конкретной версии, компоненты будут иметь суффикс версии. "
+"`HAVE_WX` будет заполнен после обнаружения."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3951
+#, no-wrap
+msgid "Detecting Installed wxWidgets Versions and Components"
+msgstr "Обнаружение установленных версий и компонентов wxWidgets"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3955
+msgid ""
+"This fragment can be used in a port that uses wxWidgets if it is installed, "
+"or an option is selected."
+msgstr ""
+"Этот фрагмент может использоваться в порте, который использует wxWidgets, "
+"если они установлены или выбран соответствующий параметр."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3959
+#, no-wrap
+msgid "WANT_WX=\tyes\n"
+msgstr "WANT_WX=\tyes\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3961
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3977
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4030
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4620
+#, no-wrap
+msgid ".include <bsd.port.pre.mk>\n"
+msgstr ".include <bsd.port.pre.mk>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3966
+#, no-wrap
+msgid ""
+".if defined(WITH_WX) || !empty(PORT_OPTIONS:MWX) || !empty(HAVE_WX:Mwx-2.8)\n"
+"USE_WX=\t\t\t2.8\n"
+"CONFIGURE_ARGS+=\t--enable-wx\n"
+".endif\n"
+msgstr ""
+".if defined(WITH_WX) || !empty(PORT_OPTIONS:MWX) || !empty(HAVE_WX:Mwx-2.8)\n"
+"USE_WX=\t\t\t2.8\n"
+"CONFIGURE_ARGS+=\t--enable-wx\n"
+".endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3969
+msgid ""
+"This fragment can be used in a port that enables wxPython support if it is "
+"installed or if an option is selected, in addition to wxWidgets, both "
+"version `2.8`."
+msgstr ""
+"Этот фрагмент может использоваться в порте, который включает поддержку "
+"wxPython, если она установлена или выбрана соответствующая опция, в "
+"дополнение к wxWidgets, обе версии `2.8`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3975
+#, no-wrap
+msgid ""
+"USE_WX=\t\t2.8\n"
+"WX_COMPS=\twx\n"
+"WANT_WX=\t2.8\n"
+msgstr ""
+"USE_WX=\t\t2.8\n"
+"WX_COMPS=\twx\n"
+"WANT_WX=\t2.8\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3982
+#, no-wrap
+msgid ""
+".if defined(WITH_WXPYTHON) || !empty(PORT_OPTIONS:MWXPYTHON) || !empty(HAVE_WX:Mpython)\n"
+"WX_COMPS+=\t\tpython\n"
+"CONFIGURE_ARGS+=\t--enable-wxpython\n"
+".endif\n"
+msgstr ""
+".if defined(WITH_WXPYTHON) || !empty(PORT_OPTIONS:MWXPYTHON) || !empty(HAVE_WX:Mpython)\n"
+"WX_COMPS+=\t\tpython\n"
+"CONFIGURE_ARGS+=\t--enable-wxpython\n"
+".endif\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3987
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4157
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4392
+#, no-wrap
+msgid "Defined Variables"
+msgstr "Переменные, определенные в фреймворке"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3990
+msgid ""
+"These variables are available in the port (after defining one from "
+"crossref:special[wx-ver-sel-table,Variables to Select wxWidgets Versions])."
+msgstr ""
+"Эти переменные доступны в порте (после определения одной из "
+"crossref:special[wx-ver-sel-table,переменных для выбора версий wxWidgets])."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3992
+#, no-wrap
+msgid "Variables Defined for Ports That Use wxWidgets"
+msgstr "Переменные, определенные для портов, использующих wxWidgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:3999
+#, no-wrap
+msgid "`WX_CONFIG`"
+msgstr "`WX_CONFIG`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4001
+#, no-wrap
+msgid "The path to the wxWidgets`wx-config` script (with different name)"
+msgstr "Путь к скрипту `wx-config` wxWidgets (с другим именем)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4002
+#, no-wrap
+msgid "`WXRC_CMD`"
+msgstr "`WXRC_CMD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4004
+#, no-wrap
+msgid "The path to the wxWidgets`wxrc` program (with different name)"
+msgstr "Путь к программе `wxrc` wxWidgets (с другим именем)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4005
+#, no-wrap
+msgid "`WX_VERSION`"
+msgstr "`WX_VERSION`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4006
+#, no-wrap
+msgid "The wxWidgets version that is going to be used (for example, `2.6`)"
+msgstr "Версия wxWidgets, которая будет использоваться (например, `2.6`)"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4009
+#, no-wrap
+msgid "Processing in [.filename]#bsd.port.pre.mk#"
+msgstr "Обработка в [.filename]#bsd.port.pre.mk#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4012
+msgid ""
+"Define `WX_PREMK` to be able to use the variables right after including "
+"[.filename]#bsd.port.pre.mk#."
+msgstr ""
+"Определите `WX_PREMK`, чтобы иметь возможность использовать переменные сразу "
+"после включения [.filename]#bsd.port.pre.mk#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4016
+msgid ""
+"When defining `WX_PREMK`, then the version, dependencies, components and "
+"defined variables will not change if modifying the wxWidgets port variables "
+"_after_ including [.filename]#bsd.port.pre.mk#."
+msgstr ""
+"При определении `WX_PREMK` версия, зависимости, компоненты и определенные "
+"переменные не изменятся при модификации переменных порта wxWidgets _после_ "
+"включения [.filename]#bsd.port.pre.mk#."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4019
+#, no-wrap
+msgid "Using wxWidgets Variables in Commands"
+msgstr "Использование переменных wxWidgets в командах"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4023
+msgid ""
+"This fragment illustrates the use of `WX_PREMK` by running the `wx-config` "
+"script to obtain the full version string, assign it to a variable and pass "
+"it to the program."
+msgstr ""
+"Этот фрагмент иллюстрирует использование `WX_PREMK` путем запуска скрипта "
+"`wx-config` для получения полной строки версии, присвоения её переменной и "
+"передачи в программу."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4028
+#, no-wrap
+msgid ""
+"USE_WX=\t\t2.8\n"
+"WX_PREMK=\tyes\n"
+msgstr ""
+"USE_WX=\t\t2.8\n"
+"WX_PREMK=\tyes\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4033
+#, no-wrap
+msgid ""
+".if exists(${WX_CONFIG})\n"
+"VER_STR!=\t${WX_CONFIG} --release\n"
+msgstr ""
+".if exists(${WX_CONFIG})\n"
+"VER_STR!=\t${WX_CONFIG} --release\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4036
+#, no-wrap
+msgid ""
+"PLIST_SUB+=\tVERSION=\"${VER_STR}\"\n"
+".endif\n"
+msgstr ""
+"PLIST_SUB+=\tVERSION=\"${VER_STR}\"\n"
+".endif\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4043
+msgid ""
+"The wxWidgets variables can be safely used in commands when they are inside "
+"targets without the need of `WX_PREMK`."
+msgstr ""
+"Переменные wxWidgets можно безопасно использовать в командах внутри целей "
+"без необходимости в `WX_PREMK`."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4046
+#, no-wrap
+msgid "Additional `configure` Arguments"
+msgstr "Дополнительные параметры `configure`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4049
+msgid ""
+"Some GNU `configure` scripts cannot find wxWidgets with just the `WX_CONFIG` "
+"environment variable set, requiring additional arguments. `WX_CONF_ARGS` can "
+"be used for provide them."
+msgstr ""
+"Некоторые скрипты GNU `configure` не могут найти wxWidgets, если задана "
+"только переменная окружения `WX_CONFIG`, и требуют дополнительные параметры. "
+"`WX_CONF_ARGS` можно использовать для их указания."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4051
+#, no-wrap
+msgid "Legal Values for `WX_CONF_ARGS`"
+msgstr "Допустимые значения для `WX_CONF_ARGS`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4055
+#, no-wrap
+msgid "Possible value"
+msgstr "Возможное значение"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4057
+#, no-wrap
+msgid "Resulting argument"
+msgstr "Получаемый параметр"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4058
+#, no-wrap
+msgid "`absolute`"
+msgstr "`absolute`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4060
+#, no-wrap
+msgid "`--with-wx-config=${WX_CONFIG}`"
+msgstr "`--with-wx-config=${WX_CONFIG}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4061
+#, no-wrap
+msgid "`relative`"
+msgstr "`relative`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4062
+#, no-wrap
+msgid "`--with-wx=${LOCALBASE} --with-wx-config=${WX_CONFIG:T}`"
+msgstr "`--with-wx=${LOCALBASE} --with-wx-config=${WX_CONFIG:T}`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4065
+#, no-wrap
+msgid "Using Lua"
+msgstr "Использование Lua"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4068
+msgid ""
+"This section describes the status of the Lua libraries in the ports tree and "
+"its integration with the ports system."
+msgstr ""
+"Этот раздел описывает состояние библиотек Lua в дереве портов и их "
+"интеграцию с системой портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4074
+msgid ""
+"There are many versions of the Lua libraries and corresponding interpreters, "
+"which conflict between them (install files under the same name). In the "
+"ports tree this problem has been solved by installing each version under a "
+"different name using version number suffixes."
+msgstr ""
+"Существует множество версий библиотек Lua и соответствующих интерпретаторов, "
+"которые конфликтуют между собой (устанавливают файлы с одинаковыми именами). "
+"В дереве портов эта проблема решена установкой каждой версии под разными "
+"именами с использованием суффиксов номеров версий."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4077
+msgid ""
+"The obvious disadvantage of this is that each application has to be modified "
+"to find the expected version. But it can be solved by adding some "
+"additional flags to the compiler and linker."
+msgstr ""
+"Очевидный недостаток этого заключается в том, что каждое приложение "
+"необходимо модифицировать для поиска ожидаемой версии. Однако это можно "
+"решить, добавив дополнительные флаги компилятору и компоновщику."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4080
+msgid ""
+"Applications that use Lua should normally build for just one version. "
+"However, loadable modules for Lua are built in a separate flavor for each "
+"Lua version that they support, and dependencies on such modules should "
+"specify the flavor using the `@${LUA_FLAVOR}` suffix on the port origin."
+msgstr ""
+"Приложения, использующие Lua, обычно должны собираться только для одной "
+"версии. Однако загружаемые модули для Lua собираются в отдельных флейворах "
+"для каждой поддерживаемой версии Lua, и зависимости от таких модулей должны "
+"указывать флейвор с использованием суффикса `@${LUA_FLAVOR}` в расположении "
+"(origin) порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4085
+msgid "A port using Lua should have a line of this form:"
+msgstr "Порт, использующий Lua, должен содержать строку следующего вида:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4089
+#, no-wrap
+msgid "USES=\tlua\n"
+msgstr "USES=\tlua\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4094
+msgid ""
+"If a specific version of Lua, or range of versions, is needed, it can be "
+"specified as a parameter in the form `XY` (which may be used multiple "
+"times), `XY+`, `-XY`, or `XY-ZA`. The default version of Lua as set via "
+"`DEFAULT_VERSIONS` will be used if it falls in the requested range, "
+"otherwise the closest requested version to the default will be used. For "
+"example:"
+msgstr ""
+"Если требуется определённая версия Lua или диапазон версий, его можно "
+"указать в виде параметра `XY` (который можно использовать несколько раз), "
+"`XY+`, `-XY` или `XY-ZA`. Версия Lua, установленная через "
+"`DEFAULT_VERSIONS`, будет использована, если она попадает в запрошенный "
+"диапазон, в противном случае будет использована ближайшая к умолчанию "
+"запрошенная версия. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4098
+#, no-wrap
+msgid "USES=\tlua:52-53\n"
+msgstr "USES=\tlua:52-53\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4101
+msgid ""
+"Note that no attempt is made to adjust the version selection based on the "
+"presence of any already-installed Lua version."
+msgstr ""
+"Обратите внимание, что не предпринимается попытка изменить выбор версии на "
+"основе наличия любой уже установленной версии Lua."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4106
+msgid ""
+"The `XY+` form of version specification should not be used without careful "
+"consideration; the Lua API changes to some extent in every version, and "
+"configuration tools like CMake or Autoconf will often fail to work on future "
+"versions of Lua until updated to do so."
+msgstr ""
+"Форма указания версии `XY+` не должна использоваться без тщательного "
+"обдумывания; Lua API в некоторой степени меняется с каждой версией, и "
+"инструменты конфигурации, такие как CMake или Autoconf, скорее всего не "
+"будут работать с будущими версиями Lua, пока не будут обновлены для этого."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4109
+#, no-wrap
+msgid "Configuration and Compiler flags"
+msgstr "Конфигурация и флаги компилятора"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4114
+msgid ""
+"Software that uses Lua may have been written to auto-detect the Lua version "
+"in use. In general ports should override this assumption, and force the use "
+"of the specific Lua version selected as described above. Depending on the "
+"software being ported, this might require any or all of:"
+msgstr ""
+"Программное обеспечение, использующее Lua, может быть написано с "
+"автоматическим определением версии Lua в использовании. В общем случае порты "
+"должны переопределять это предположение и принудительно использовать "
+"конкретную выбранную версию Lua, как описано выше. В зависимости от "
+"портируемого программного обеспечения, это может потребовать любого или всех "
+"из следующих действий:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4116
+msgid ""
+"Using `LUA_VER` as part of a parameter to the software's configuration "
+"script via `CONFIGURE_ARGS` or `CONFIGURE_ENV` (or equivalent for other "
+"build systems);"
+msgstr ""
+"Использование `LUA_VER` в качестве части параметра для скрипта конфигурации "
+"программного обеспечения через `CONFIGURE_ARGS` или `CONFIGURE_ENV` (или "
+"эквивалентные для других систем сборки);"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4117
+msgid ""
+"Adding `-I${LUA_INCDIR}`, `-L${LUA_LIBDIR}`, and `-llua-${LUA_VER}` to "
+"`CFLAGS`, `LDFLAGS`, `LIBS` respectively as appropriate;"
+msgstr ""
+"Добавление `-I${LUA_INCDIR}`, `-L${LUA_LIBDIR}` и `-llua-${LUA_VER}` в "
+"`CFLAGS`, `LDFLAGS` и `LIBS` соответственно, где это необходимо;"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4118
+msgid ""
+"Patch the software's configuration or build files to select the correct "
+"version."
+msgstr ""
+"Исправьте конфигурационные или файлы сборки программного обеспечения, чтобы "
+"выбрать правильную версию."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4121
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4365
+#, no-wrap
+msgid "Version Flavors"
+msgstr "Флейворы версии"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4125
+msgid ""
+"A port which installs a Lua module (rather than an application that simply "
+"makes use of Lua) should build a separate flavor for each supported Lua "
+"version. This is done by adding the `module` parameter:"
+msgstr ""
+"Порт, который устанавливает модуль Lua (а не приложение, просто использующее "
+"Lua), должен собирать отдельный флейвор для каждой поддерживаемой версии "
+"Lua. Это делается путем добавления параметра `module`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4129
+#, no-wrap
+msgid "USES=\tlua:module\n"
+msgstr "USES=\tlua:module\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4132
+msgid ""
+"A version number or range of versions can be specified as well; use a comma "
+"to separate parameters."
+msgstr ""
+"Так же может быть указае номер версии или диапазон версий. Используйте "
+"запятую для разделения параметров."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4134
+msgid ""
+"Since each flavor must have a different package name, the variable "
+"`LUA_PKGNAMEPREFIX` is provided which will be set to an appropriate value; "
+"the intended usage is:"
+msgstr ""
+"Поскольку каждый флейвор должен иметь уникальное имя пакета, предоставляется "
+"переменная `LUA_PKGNAMEPREFIX`, которая будет установлена в соответствующее "
+"значение; предполагаемое использование:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4138
+#, no-wrap
+msgid "PKGNAMEPREFIX=\t${LUA_PKGNAMEPREFIX}\n"
+msgstr "PKGNAMEPREFIX=\t${LUA_PKGNAMEPREFIX}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4142
+msgid ""
+"Module ports should normally install files only to `LUA_MODLIBDIR`, "
+"`LUA_MODSHAREDIR`, `LUA_DOCSDIR`, and `LUA_EXAMPLESDIR`, all of which are "
+"set up to refer to version-specific subdirectories. Installing any other "
+"files must be done with care to avoid conflicts between versions."
+msgstr ""
+"Модульные порты обычно должны устанавливать файлы только в `LUA_MODLIBDIR`, "
+"`LUA_MODSHAREDIR`, `LUA_DOCSDIR` и `LUA_EXAMPLESDIR`, все из которых "
+"настроены на ссылки в версионно-зависимые подкаталоги. Установка любых "
+"других файлов должна выполняться с осторожностью, чтобы избежать конфликтов "
+"между версиями."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4144
+msgid ""
+"A port (other than a Lua module) which wishes to build a separate package "
+"for each Lua version should use the `flavors` parameter:"
+msgstr ""
+"Порт (кроме модуля Lua), который хочет собрать отдельный пакет для каждой "
+"версии Lua, должен использовать параметр `flavors`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4148
+#, no-wrap
+msgid "USES=\tlua:flavors\n"
+msgstr "USES=\tlua:flavors\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4152
+msgid ""
+"This operates the same way as the `module` parameter described above, but "
+"without the assumption that the package should be documented as a Lua module "
+"(so `LUA_DOCSDIR` and `LUA_EXAMPLESDIR` are not defined by default). "
+"However, the port may choose to define `LUA_DOCSUBDIR` as a suitable "
+"subdirectory name (usually the port's `PORTNAME` as long as this does not "
+"conflict with the `PORTNAME` of any module), in which case the framework "
+"will define both `LUA_DOCSDIR` and `LUA_EXAMPLESDIR`."
+msgstr ""
+"Это работает так же, как параметр `module`, описанный выше, но без "
+"предположения, что пакет должен быть задокументирован как модуль Lua "
+"(поэтому `LUA_DOCSDIR` и `LUA_EXAMPLESDIR` по умолчанию не определены). "
+"Однако порт может определить `LUA_DOCSUBDIR` как подходящее имя подкаталога "
+"(обычно `PORTNAME` порта, если это не конфликтует с `PORTNAME` любого "
+"модуля), и в этом случае фреймворк определит как `LUA_DOCSDIR`, так и "
+"`LUA_EXAMPLESDIR`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4155
+msgid ""
+"As with module ports, a flavored port should avoid installing files that "
+"would conflict between versions. Typically this is done by adding "
+"`LUA_VER_STR` as a suffix to program names (e.g. using crossref:uses[uses-"
+"uniquefiles,`uniquefiles`]), and otherwise using either `LUA_VER` or "
+"`LUA_VER_STR` as part of any other files or subdirectories used outside of "
+"`LUA_MODLIBDIR` and `LUA_MODSHAREDIR`."
+msgstr ""
+"Как и в случае с модульными портами, порт с флейворами должен избегать "
+"установки файлов, которые могут конфликтовать между версиями. Обычно это "
+"достигается добавлением `LUA_VER_STR` в качестве суффикса к именам программ "
+"(например, с использованием crossref:uses[uses-uniquefiles,`uniquefiles`]), "
+"а также использованием `LUA_VER` или `LUA_VER_STR` в составе других файлов "
+"или поддиректорий, используемых вне `LUA_MODLIBDIR` и `LUA_MODSHAREDIR`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4160
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4395
+msgid "These variables are available in the port."
+msgstr "В порте доступны эти переменные."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4162
+#, no-wrap
+msgid "Variables Defined for Ports That Use Lua"
+msgstr "Переменные, определенные для портов, использующих Lua"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4169
+#, no-wrap
+msgid "`LUA_VER`"
+msgstr "`LUA_VER`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4171
+#, no-wrap
+msgid "The Lua version that is going to be used (for example, `5.4`)"
+msgstr "Версия Lua, которая будет использоваться (например, `5.4`)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4172
+#, no-wrap
+msgid "`LUA_VER_STR`"
+msgstr "`LUA_VER_STR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4174
+#, no-wrap
+msgid "The Lua version without the dots (for example, `54`)"
+msgstr "Версия Lua без точек (например, `54`)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4175
+#, no-wrap
+msgid "`LUA_FLAVOR`"
+msgstr "`LUA_FLAVOR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4177
+#, no-wrap
+msgid "The flavor name corresponding to the selected Lua version, to be used for specifying dependencies"
+msgstr "Имя флейвора, соответствующее выбранной версии Lua, используемое для указания зависимостей"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4178
+#, no-wrap
+msgid "`LUA_BASE`"
+msgstr "`LUA_BASE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4180
+#, no-wrap
+msgid "The prefix that should be used to locate Lua (and components) that are already installed"
+msgstr "Префикс, который должен использоваться для поиска Lua (и компонентов), уже установленных"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4181
+#, no-wrap
+msgid "`LUA_PREFIX`"
+msgstr "`LUA_PREFIX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4183
+#, no-wrap
+msgid "The prefix where Lua (and components) are to be installed by this port"
+msgstr "Префикс, куда этим портом будут установлены Lua (и компоненты)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4184
+#, no-wrap
+msgid "`LUA_INCDIR`"
+msgstr "`LUA_INCDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4186
+#, no-wrap
+msgid "The directory where Lua header files are installed"
+msgstr "Каталог, в котором установлены заголовочные файлы Lua"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4187
+#, no-wrap
+msgid "`LUA_LIBDIR`"
+msgstr "`LUA_LIBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4189
+#, no-wrap
+msgid "The directory where Lua libraries are installed"
+msgstr "Каталог, в котором установлены библиотеки Lua"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4190
+#, no-wrap
+msgid "`LUA_REFMODLIBDIR`"
+msgstr "`LUA_REFMODLIBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4192
+#, no-wrap
+msgid "The directory where Lua module libraries ([.filename]#.so#) that are already installed are to be found"
+msgstr "Каталог, в котором находятся уже установленные библиотеки модулей Lua ([.filename]#.so#)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4193
+#, no-wrap
+msgid "`LUA_REFMODSHAREDIR`"
+msgstr "`LUA_REFMODSHAREDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4195
+#, no-wrap
+msgid "The directory where Lua modules ([.filename]#.lua#) that are already installed are to be found"
+msgstr "Каталог, в котором находятся установленные модули Lua ([.filename]#.lua#)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4196
+#, no-wrap
+msgid "`LUA_MODLIBDIR`"
+msgstr "`LUA_MODLIBDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4198
+#, no-wrap
+msgid "The directory where Lua module libraries ([.filename]#.so#) are to be installed by this port"
+msgstr "Каталог, в котором библиотеки модулей Lua ([.filename]#.so#) должны быть установлены данным портом"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4199
+#, no-wrap
+msgid "`LUA_MODSHAREDIR`"
+msgstr "`LUA_MODSHAREDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4201
+#, no-wrap
+msgid "The directory where Lua modules ([.filename]#.lua#) are to be installed by this port"
+msgstr "Каталог, в котором должны быть установлены модули Lua ([.filename]#.lua#) данным портом"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4202
+#, no-wrap
+msgid "`LUA_PKGNAMEPREFIX`"
+msgstr "`LUA_PKGNAMEPREFIX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4204
+#, no-wrap
+msgid "The package name prefix used by Lua modules"
+msgstr "Префикс имени пакета, используемый модулями Lua"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4205
+#, no-wrap
+msgid "`LUA_CMD`"
+msgstr "`LUA_CMD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4207
+#, no-wrap
+msgid "The name of the Lua interpreter (e.g. `lua54`)"
+msgstr "Название интерпретатора Lua (например, `lua54`)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4208
+#, no-wrap
+msgid "`LUAC_CMD`"
+msgstr "`LUAC_CMD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4209
+#, no-wrap
+msgid "The name of the Lua compiler (e.g. `luac54`)"
+msgstr "Название компилятора Lua (например, `luac54`)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4212
+msgid ""
+"These additional variables are available for ports that specified the "
+"`module` parameter:"
+msgstr ""
+"Эти дополнительные переменные доступны для портов, которые указали параметр "
+"`module`:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4214
+#, no-wrap
+msgid "Variables Defined for Lua Module Ports"
+msgstr "Переменные, определенные для модулей Lua в портах"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4221
+#, no-wrap
+msgid "`LUA_DOCSDIR`"
+msgstr "`LUA_DOCSDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4223
+#, no-wrap
+msgid "the directory to which the module's documentation should be installed."
+msgstr "каталог, в который должна быть установлена документация модуля."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4224
+#, no-wrap
+msgid "`LUA_EXAMPLESDIR`"
+msgstr "`LUA_EXAMPLESDIR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4225
+#, no-wrap
+msgid "the directory to which the module's example files should be installed."
+msgstr "каталог, в который должны быть установлены примеры файлов модуля."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4231
+#, no-wrap
+msgid "Makefile for an application using Lua"
+msgstr "`Makefile` для приложения, использующего Lua"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4236
+msgid ""
+"This example shows how to reference a Lua module required at run time. "
+"Notice that the reference must specify a flavor."
+msgstr ""
+"Этот пример показывает, как сослаться на модуль Lua, требуемый во время "
+"выполнения. Обратите внимание, что ссылка должна указывать флейвор."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4242
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4503
+#, no-wrap
+msgid ""
+"PORTNAME=\tsample\n"
+"DISTVERSION=\t1.2.3\n"
+"CATEGORIES=\twhatever\n"
+msgstr ""
+"PORTNAME=\tsample\n"
+"DISTVERSION=\t1.2.3\n"
+"CATEGORIES=\twhatever\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4246
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4270
+#, no-wrap
+msgid ""
+"MAINTAINER=\tfred.bloggs@example.com\n"
+"COMMENT=\tSample\n"
+"WWW=\t\thttps://example.com/lua_sample/sample/\n"
+msgstr ""
+"MAINTAINER=\tfred.bloggs@example.com\n"
+"COMMENT=\tSample\n"
+"WWW=\t\thttps://example.com/lua_sample/sample/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4248
+#, no-wrap
+msgid "RUN_DEPENDS=\t${LUA_REFMODLIBDIR}/lpeg.so:devel/lua-lpeg@${LUA_FLAVOR}\n"
+msgstr "RUN_DEPENDS=\t${LUA_REFMODLIBDIR}/lpeg.so:devel/lua-lpeg@${LUA_FLAVOR}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4250
+#, no-wrap
+msgid "USES=\t\tlua\n"
+msgstr "USES=\t\tlua\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4257
+#, no-wrap
+msgid "Makefile for a simple Lua module"
+msgstr "`Makefile` для простого модуля Lua"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4266
+#, no-wrap
+msgid ""
+"PORTNAME=\tsample\n"
+"DISTVERSION=\t1.2.3\n"
+"CATEGORIES=\twhatever\n"
+"PKGNAMEPREFIX=\t${LUA_PKGNAMEPREFIX}\n"
+msgstr ""
+"PORTNAME=\tsample\n"
+"DISTVERSION=\t1.2.3\n"
+"CATEGORIES=\twhatever\n"
+"PKGNAMEPREFIX=\t${LUA_PKGNAMEPREFIX}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4272
+#, no-wrap
+msgid "USES=\t\tlua:module\n"
+msgstr "USES=\t\tlua:module\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4274
+#, no-wrap
+msgid "DOCSDIR=\t${LUA_DOCSDIR}\n"
+msgstr "DOCSDIR=\t${LUA_DOCSDIR}\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4281
+#, no-wrap
+msgid "Using Guile"
+msgstr "Использование Guile"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4284
+msgid ""
+"This section describes the status of Guile in the ports tree and its "
+"integration with the ports system."
+msgstr ""
+"Этот раздел описывает состояние Guile в дереве портов и его интеграцию с "
+"системой портов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4293
+msgid ""
+"There are multiple versions of the Guile libraries and corresponding "
+"interpreters, which conflict between them (install files under the same "
+"name). In the ports tree this problem has been solved by installing each "
+"version under a different name using version number suffixes. In most "
+"cases, applications should detect the correct version from the configuration "
+"variables provided and use `pkg-config` to determine the name and associated "
+"paths. However, some applications (especially those using their own "
+"configuration rules for `cmake` or `meson`) will always try to use the "
+"latest available version. In this case, either patch the port or declare a "
+"build conflict (see the `conflicts` option below) to ensure that the correct "
+"dependency is generated when building outside of poudriere."
+msgstr ""
+"Существует несколько версий библиотек Guile и соответствующих "
+"интерпретаторов, которые конфликтуют между собой (устанавливают файлы с "
+"одинаковыми именами). В дереве портов эта проблема решена путем установки "
+"каждой версии под разными именами с использованием суффиксов номеров версий. "
+"В большинстве случаев приложения должны определять правильную версию из "
+"предоставленных конфигурационных переменных и использовать `pkg-config` для "
+"определения имени и связанных путей. Однако некоторые приложения (особенно "
+"те, которые используют собственные правила конфигурации для `cmake` или "
+"`meson`) всегда будут пытаться использовать последнюю доступную версию. В "
+"этом случае либо исправьте порт, либо объявите конфликт сборки (см. опцию "
+"`conflicts` ниже), чтобы гарантировать создание правильной зависимости при "
+"сборке вне poudriere."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4299
+msgid ""
+"Applications that use Guile should normally build for just one version, "
+"preferably the one specified in `DEFAULT_VERSIONS`, or failing that the "
+"latest version that they support. However, Guile or Scheme libraries, or "
+"extension modules for Guile are built in a separate flavor for each Guile "
+"version that they support, and dependencies on such ports should specify the "
+"flavor using the `@${GUILE_FLAVOR}` suffix on the port origin."
+msgstr ""
+"Приложения, использующие Guile, обычно должны собираться только для одной "
+"версии, предпочтительно указанной в `DEFAULT_VERSIONS`, или, если это "
+"невозможно, для последней поддерживаемой версии. Однако библиотеки Guile или "
+"Scheme, а также модули расширения для Guile собираются в отдельных флейворах "
+"для каждой поддерживаемой версии Guile. Зависимости от таких портов должны "
+"указывать флейвор с использованием суффикса `@${GUILE_FLAVOR}` в "
+"расположении (origin) порта."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4304
+msgid ""
+"A port using Guile should define `USES=guile:__arg,arg...__` with "
+"appropriate arguments as follows:"
+msgstr ""
+"Порт, использующий Guile, должен определять `USES=guile:__arg,arg...__` с "
+"соответствующими параметрами следующим образом:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4306
+#, no-wrap
+msgid "Arguments Defined for Ports That Use Guile"
+msgstr "Параметры, определенные для портов, использующих Guile"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4313
+#, no-wrap
+msgid "_X.Y_"
+msgstr "_X.Y_"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4317
+#, no-wrap
+msgid ""
+"Declare compatibility with Guile version `X.Y`.\n"
+"Currently available versions are `1.8` (obsolete), `2.2` and `3.0`.\n"
+"Multiple versions may be specified."
+msgstr ""
+"Объявить совместимость с версией Guile `X.Y`.\n"
+"Доступные версии: `1.8` (устарела), `2.2` и `3.0`.\n"
+"Можно указать несколько версий."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4318
+#, no-wrap
+msgid "flavors"
+msgstr "flavors"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4322
+#, no-wrap
+msgid ""
+"Create a flavor for every Guile version specified.\n"
+"The version specified by `DEFAULT_VERSIONS` will become the default flavor.\n"
+"Flavor names are of the form `guileXY`."
+msgstr ""
+"Создать флейвор для каждой указанной версии Guile.\n"
+"Версия, указанная в `DEFAULT_VERSIONS`, станет флейвором по умолчанию.\n"
+"Названия флейворов имеют вид `guileXY`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4323
+#, no-wrap
+msgid "build"
+msgstr "build"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4326
+#, no-wrap
+msgid ""
+"Add the Guile interpreter as a build dependency only, rather than a library dependency.\n"
+"`build` and `run` may both be specified."
+msgstr ""
+"Добавить интерпретатор Guile только как зависимость для сборки, а не как зависимость библиотеки.\n"
+"`build` и `run` могут быть указаны оба."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4327
+#, no-wrap
+msgid "run"
+msgstr "run"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4330
+#, no-wrap
+msgid ""
+"Add the Guile interpreter as a runtime dependency only, rather than a library dependency.\n"
+"`build` and `run` may both be specified."
+msgstr ""
+"Добавить интерпретатор Guile только как зависимость во время выполнения, а не как зависимость от библиотеки.\n"
+"`build` и `run` могут быть указаны оба."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4331
+#, no-wrap
+msgid "alias"
+msgstr "alias"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4333
+#, no-wrap
+msgid "Add `BINARY_ALIAS` values for the interpreter and tools."
+msgstr "Добавить значения `BINARY_ALIAS` для интерпретатора и инструментов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4334
+#, no-wrap
+msgid "conflicts"
+msgstr "conflicts"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4336
+#, no-wrap
+msgid ""
+"Declare `CONFLICTS_BUILD` for Guile versions newer than the one selected.\n"
+"Use this when the port cannot be configured to use a specific Guile version."
+msgstr ""
+"Объявить `CONFLICTS_BUILD` для версий Guile новее выбранной. \n"
+"Используйте это, когда порт нельзя настроить на использование определённой версии Guile."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4339
+msgid ""
+"Some additional arguments are available for handling unusual cases; see `Mk/"
+"Uses/guile.mk` for details."
+msgstr ""
+"Некоторые дополнительные аргументы доступны для обработки нестандартных "
+"случаев; подробности см. в `Mk/Uses/guile.mk`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4342
+msgid ""
+"Unless `build` or `run` is specified, then `LIB_DEPENDS` receives both the "
+"`libguile` library dependency and also any additional dependencies required "
+"by the guile version, e.g. `libgc`. Normally the port should not need any "
+"additional dependencies related to its use of Guile."
+msgstr ""
+"Если не указано `build` или `run`, то `LIB_DEPENDS` получает зависимость от "
+"библиотеки `libguile`, а также любые дополнительные зависимости, требуемые "
+"версией guile, например, `libgc`. Обычно порту не требуются дополнительные "
+"зависимости, связанные с использованием Guile."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4344
+#, no-wrap
+msgid "Configuration flags"
+msgstr "Флаги конфигурации"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4349
+msgid ""
+"Software that uses Guile should be using the `pkg-config` mechanism to "
+"obtain compiler and linker flags. Some older or esoteric ports may be using "
+"`guile-config` or obtaining values directly from `guile` instead, which "
+"should also work (the `alias` argument may be useful in some of these cases)."
+msgstr ""
+"Программное обеспечение, использующее Guile, должно использовать механизм "
+"`pkg-config` для получения флагов компилятора и компоновщика. Некоторые "
+"старые или экзотические порты могут использовать `guile-config` или получать "
+"значения напрямую из `guile`, что также должно работать (в некоторых из этих "
+"случаев может быть полезен аргумент `alias`)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4351
+msgid ""
+"The framework tries to inform the port of the desired Guile version using "
+"the following methods:"
+msgstr ""
+"Фреймворк пытается сообщить порту желаемую версию Guile, используя следующие "
+"методы:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4353
+msgid "`GUILE_EFFECTIVE_VERSION` is added to `CONFIGURE_ENV`;"
+msgstr "`GUILE_EFFECTIVE_VERSION` добавлен в `CONFIGURE_ENV`;"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4354
+msgid ""
+"The full path to the Guile binary is specified in the `GUILE` variable in "
+"`CONFIGURE_ENV` and `MAKE_ENV`;"
+msgstr ""
+"Полный путь к исполняемому файлу Guile указан в переменной `GUILE` в "
+"`CONFIGURE_ENV` и `MAKE_ENV`;"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4355
+msgid ""
+"If the `alias` option is used, the desired Guile version's binaries are the "
+"ones aliased;"
+msgstr ""
+"Если используется опция `alias`, то желаемые версии бинарных файлов Guile "
+"являются теми, которые имеют алиасы;"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4356
+msgid ""
+"If the `alias` option is not used, paths to the desired Guile version's "
+"tools (`guild`, `guile-config`, etc.) are added to `CONFIGURE_ENV` and "
+"`MAKE_ENV` as variables `GUILD`, `GUILE_CONFIG`, etc."
+msgstr ""
+"Если параметр `alias` не используется, пути к инструментам нужной версии "
+"Guile (`guild`, `guile-config` и т.д.) добавляются в `CONFIGURE_ENV` и "
+"`MAKE_ENV` в виде переменных `GUILD`, `GUILE_CONFIG` и т.д."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4359
+msgid ""
+"For some ports, it may be necessary to specify the version in additional "
+"ways, such as via `CONFIGURE_ARGS` or `MESON_ARGS`, depending on the port."
+msgstr ""
+"Для некоторых портов может потребоваться указать версию дополнительными "
+"способами, например, через `CONFIGURE_ARGS` или `MESON_ARGS`, в зависимости "
+"от порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4363
+msgid ""
+"If none of these methods cause the port to select the specified Guile "
+"version when other versions are present, then preferably patch it to do so. "
+"If that is not feasible, specify the `conflicts` option to prevent building "
+"the port under conditions where it will detect the wrong version."
+msgstr ""
+"Если ни один из этих методов не приводит к тому, что порт выбирает указанную "
+"версию Guile при наличии других версий, то предпочтительно исправить его, "
+"чтобы это происходило. Если это невозможно, укажите опцию `conflicts`, чтобы "
+"предотвратить сборку порта в условиях, когда он обнаруживает неправильную "
+"версию."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4370
+msgid ""
+"A port which installs a Guile extension or library, or a Scheme library that "
+"precompiles for Guile, should build a separate flavor for each supported "
+"Guile version. This is done by adding the `flavors` option."
+msgstr ""
+"Порт, который устанавливает расширение или библиотеку Guile, или библиотеку "
+"Scheme, которая предварительно компилируется для Guile, должен собирать "
+"отдельный флейвор для каждой поддерживаемой версии Guile. Это делается путем "
+"добавления опции `flavors`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4372
+msgid ""
+"Since each flavor must have a different package name, such ports must set "
+"`PKGNAMESUFFIX`, typically:"
+msgstr ""
+"Поскольку каждый флейвор должен иметь уникальное имя пакета, такие порты "
+"обычно устанавливают `PKGNAMESUFFIX`, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4376
+#, no-wrap
+msgid "PKGNAMESUFFIX=\t-${FLAVOR}\n"
+msgstr "PKGNAMESUFFIX=\t-${FLAVOR}\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4380
+msgid ""
+"Such ports must install Scheme files to `GUILE_SITE_DIR` rather than to "
+"`GUILE_GLOBAL_SITE_DIR` even when the files are not version-specific. This "
+"often requires patching the port."
+msgstr ""
+"Такие порты должны устанавливать файлы Scheme в `GUILE_SITE_DIR`, а не в "
+"`GUILE_GLOBAL_SITE_DIR`, даже если файлы не зависят от версии. Это часто "
+"требует исправления порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4383
+msgid ""
+"Additionally, if such a port installs a `.pc` file, it must be placed in "
+"`GUILE_PKGCONFIG_PATH` rather than in the global `pkgconfig` directory. "
+"This allows dependent ports to find a correct configuration for the specific "
+"Guile version in use."
+msgstr ""
+"Кроме того, если такой порт устанавливает файл `.pc`, он должен быть "
+"размещён в `GUILE_PKGCONFIG_PATH`, а не в глобальной директории `pkgconfig`. "
+"Это позволяет зависимым портам находить правильную конфигурацию для "
+"используемой версии Guile."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4386
+msgid ""
+"If a Guile extension port installs a `.so` file, then it must usually be "
+"placed in the Guile-version-specific `extensions` directory. `USE_LDCONFIG` "
+"should usually not be used."
+msgstr ""
+"Если порт расширения Guile устанавливает файл `.so`, то обычно он должен "
+"быть размещён в специфичной для версии Guile директории `extensions`. Обычно "
+"не следует использовать `USE_LDCONFIG`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4390
+msgid ""
+"Any other files installed by a flavored port must likewise be in version-"
+"specific directories or use version-specific filenames. For documentation "
+"and examples, `GUILE_DOCS_DIR` and `GUILE_EXAMPLES_DIR` specify suitable "
+"locations in which the port should create a subdirectory, see below."
+msgstr ""
+"Любые другие файлы, устанавливаемые портом с флейвором, также должны "
+"находиться в версионных каталогах или использовать версионные имена файлов. "
+"Для документации и примеров переменные `GUILE_DOCS_DIR` и "
+"`GUILE_EXAMPLES_DIR` указывают подходящие расположения, в которых порт "
+"должен создать подкаталог (см. ниже)."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4397
+#, no-wrap
+msgid "Variables Defined for Ports That Use Guile"
+msgstr "Переменные, определенные для портов, использующих Guile"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4402
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4464
+#, no-wrap
+msgid "Sample Value"
+msgstr "Пример значения"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4405
+#, no-wrap
+msgid "`GUILE_VER`"
+msgstr "`GUILE_VER`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4406
+#, no-wrap
+msgid "3.0"
+msgstr "3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4408
+#, no-wrap
+msgid "Guile version in use."
+msgstr "Используемая версия Guile."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4409
+#, no-wrap
+msgid "`GUILE_SFX`"
+msgstr "`GUILE_SFX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4410
+#, no-wrap
+msgid "3"
+msgstr "3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4413
+#, no-wrap
+msgid ""
+"Short suffix used on some names.\n"
+"Use only with care; may be non-unique or may change in the future."
+msgstr ""
+"Короткий суффикс, используемый в некоторых именах.\n"
+"Используйте с осторожностью; может быть неуникальным или измениться в будущем."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4414
+#, no-wrap
+msgid "`GUILE_FLAVOR`"
+msgstr "`GUILE_FLAVOR`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4415
+#, no-wrap
+msgid "guile30"
+msgstr "guile30"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4417
+#, no-wrap
+msgid "Flavor name corresponding to the selected version."
+msgstr "Название флейвора, соответствующее выбранной версии."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4418
+#, no-wrap
+msgid "`GUILE_PORT`"
+msgstr "`GUILE_PORT`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4419
+#, no-wrap
+msgid "lang/guile3"
+msgstr "lang/guile3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4421
+#, no-wrap
+msgid "Port origin of the specified Guile version."
+msgstr "Расположение порта (origin) для указанной версии Guile."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4422
+#, no-wrap
+msgid "`GUILE_PREFIX`"
+msgstr "`GUILE_PREFIX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4423
+#, no-wrap
+msgid "${PREFIX}"
+msgstr "${PREFIX}"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4425
+#, no-wrap
+msgid "Directory prefix to be used for installation."
+msgstr "Префикс каталога для использования при установке."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4426
+#, no-wrap
+msgid "`GUILE_CMD`"
+msgstr "`GUILE_CMD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4427
+#, no-wrap
+msgid "guile-3.0"
+msgstr "guile-3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4429
+#, no-wrap
+msgid "Name of the Guile interpreter, with version suffix."
+msgstr "Имя интерпретатора Guile с суффиксом версии."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4430
+#, no-wrap
+msgid "`GUILE_CMDPATH`"
+msgstr "`GUILE_CMDPATH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4431
+#, no-wrap
+msgid "${LOCALBASE}/bin/guile-3.0"
+msgstr "${LOCALBASE}/bin/guile-3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4433
+#, no-wrap
+msgid "Full path to the Guile interpreter."
+msgstr "Полный путь к интерпретатору Guile."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4434
+#, no-wrap
+msgid "`GUILD_CMD`"
+msgstr "`GUILD_CMD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4435
+#, no-wrap
+msgid "guild-3.0"
+msgstr "guild-3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4437
+#, no-wrap
+msgid "Name of the Guild tool, with version suffix."
+msgstr "Название инструмента Guild, с суффиксом версии."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4438
+#, no-wrap
+msgid "`GUILD_CMDPATH`"
+msgstr "`GUILD_CMDPATH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4439
+#, no-wrap
+msgid "${LOCALBASE}/bin/guild-3.0"
+msgstr "`${LOCALBASE}/bin/guild-3.0`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4441
+#, no-wrap
+msgid "Full path to the Guild tool."
+msgstr "Полный путь к инструменту Guild."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4443
+#, no-wrap
+msgid ""
+"`++GUILE_*_CMD++` +\n"
+"`++GUILE_*_CMDPATH++`"
+msgstr ""
+"`++GUILE_*_CMD++` +\n"
+"`++GUILE_*_CMDPATH++`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4446
+#, no-wrap
+msgid "Like `GUILE_CMD` and `GUILE_CMDPATH`, but for other tool binaries."
+msgstr "Как `GUILE_CMD` и `GUILE_CMDPATH`, но для других исполняемых файлов утилит."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4447
+#, no-wrap
+msgid "`GUILE_PKGCONFIG_PATH`"
+msgstr "`GUILE_PKGCONFIG_PATH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4448
+#, no-wrap
+msgid "${LOCALBASE}/libdata/pkgconfig/guile/3.0"
+msgstr "${LOCALBASE}/libdata/pkgconfig/guile/3.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4450
+#, no-wrap
+msgid "Where packages using `flavors` should install `.pc` files."
+msgstr "Где пакеты, использующие `flavors`, должны устанавливать файлы `.pc`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4451
+#, no-wrap
+msgid "`GUILE_INFO_PATH`"
+msgstr "`GUILE_INFO_PATH`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4452
+#, no-wrap
+msgid "share/info/guile3"
+msgstr "share/info/guile3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4453
+#, no-wrap
+msgid "A suitable value for `INFO_PATH` for ports using the `flavors` option."
+msgstr "Подходящее значение для `INFO_PATH` для портов, использующих опцию `flavors`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4457
+msgid ""
+"The following are defined as variables and as `PLIST_SUB` entries. The "
+"variable form is suffixed with `_DIR` and is a full path (prefixed with "
+"`GUILE_PREFIX`)."
+msgstr ""
+"Следующие элементы определены как переменные и как записи `PLIST_SUB`. Форма "
+"переменной имеет суффикс `_DIR` и представляет собой полный путь (с "
+"префиксом `GUILE_PREFIX`)."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4459
+#, no-wrap
+msgid "Path Substitutions Defined for Ports That Use Guile"
+msgstr "Подстановки путей, определенные для портов, использующих Guile"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4467
+#, no-wrap
+msgid "GUILE_GLOBAL_SITE"
+msgstr "GUILE_GLOBAL_SITE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4468
+#, no-wrap
+msgid "share/guile/site"
+msgstr "share/guile/site"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4470
+#, no-wrap
+msgid "Site directory shared by all guile versions; this should not usually be used."
+msgstr "Каталог сайта, общий для всех версий guile; обычно не должен использоваться."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4471
+#, no-wrap
+msgid "GUILE_SITE"
+msgstr "GUILE_SITE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4472
+#, no-wrap
+msgid "share/guile/3.0/site"
+msgstr "share/guile/3.0/site"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4474
+#, no-wrap
+msgid "Site directory for the selected Guile version."
+msgstr "Каталог сайта для выбранной версии Guile."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4475
+#, no-wrap
+msgid "GUILE_SITE_CCACHE"
+msgstr "GUILE_SITE_CCACHE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4476
+#, no-wrap
+msgid "lib/guile/3.0/site-ccache"
+msgstr "lib/guile/3.0/site-ccache"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4478
+#, no-wrap
+msgid "Directory for compiled bytecode files."
+msgstr "Каталог для скомпилированных файлов байт-кода."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4479
+#, no-wrap
+msgid "GUILE_DOCS"
+msgstr "GUILE_DOCS"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4480
+#, no-wrap
+msgid "share/doc/guile30"
+msgstr "share/doc/guile30"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4482
+#, no-wrap
+msgid "Parent directory for version-specific documentation."
+msgstr "Родительский каталог для документации, специфичной для версий."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4483
+#, no-wrap
+msgid "GUILE_EXAMPLES"
+msgstr "GUILE_EXAMPLES"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4484
+#, no-wrap
+msgid "share/examples/guile30"
+msgstr "share/examples/guile30"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4485
+#, no-wrap
+msgid "Parent directory for version-specific examples."
+msgstr "Родительский каталог для примеров, специфичных для версий."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4491
+#, no-wrap
+msgid "Makefile for an application using Guile"
+msgstr "`Makefile` для приложения, использующего Guile"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4497
+msgid ""
+"This example shows how to reference a Guile library required at build and "
+"run time. Notice that the reference must specify a flavor. This example "
+"assumes that the application is using `pkg-config` to locate dependencies."
+msgstr ""
+"Этот пример демонстрирует, как сослаться на библиотеку Guile, необходимую во "
+"время сборки и выполнения. Обратите внимание, что ссылка должна указывать "
+"флейвор. В этом примере предполагается, что приложение использует `pkg-"
+"config` для поиска зависимостей."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4507
+#, no-wrap
+msgid ""
+"MAINTAINER=\tfred.bloggs@example.com\n"
+"COMMENT=\tSample\n"
+"WWW=\t\thttps://example.com/guile_sample/sample/\n"
+msgstr ""
+"MAINTAINER=\tfred.bloggs@example.com\n"
+"COMMENT=\tSample\n"
+"WWW=\t\thttps://example.com/guile_sample/sample/\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4510
+#, no-wrap
+msgid ""
+"BUILD_DEPENDS=\tguile-lib-${GUILE_FLAVOR}>=0.2.5:devel/guile-lib@${GUILE_FLAVOR}\n"
+"RUN_DEPENDS=\tguile-lib-${GUILE_FLAVOR}>=0.2.5:devel/guile-lib@${GUILE_FLAVOR}\n"
+msgstr ""
+"BUILD_DEPENDS=\tguile-lib-${GUILE_FLAVOR}>=0.2.5:devel/guile-lib@${GUILE_FLAVOR}\n"
+"RUN_DEPENDS=\tguile-lib-${GUILE_FLAVOR}>=0.2.5:devel/guile-lib@${GUILE_FLAVOR}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4512
+#, no-wrap
+msgid "USES=\t\tguile:2.2,3.0 pkgconfig\n"
+msgstr "USES=\t\tguile:2.2,3.0 pkgconfig\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4519
+#, no-wrap
+msgid "Using `iconv`"
+msgstr "Использование `iconv`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4522
+msgid "FreeBSD has a native `iconv` in the operating system."
+msgstr ""
+"В FreeBSD имеется встроенная реализация `iconv` в самой операционной системе."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4524
+msgid "For software that needs `iconv`, define `USES=iconv`."
+msgstr ""
+"Для программного обеспечения, требующего `iconv`, определите `USES=iconv`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4526
+msgid "When a port defines `USES=iconv`, these variables will be available:"
+msgstr ""
+"Когда порт определяет `USES=iconv`, становятся доступны следующие переменные:"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4531
+#, no-wrap
+msgid "Variable name"
+msgstr "Имя переменной"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4532
+#, no-wrap
+msgid "Purpose"
+msgstr "Назначение"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4533
+#, no-wrap
+msgid "Port iconv (when using WCHAR_T or //TRANSLIT extensions)"
+msgstr "Порт iconv (при использовании расширений WCHAR_T или //TRANSLIT)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4536
+#, no-wrap
+msgid "Base iconv"
+msgstr "Базовый iconv"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4537
+#, no-wrap
+msgid "`ICONV_CMD`"
+msgstr "`ICONV_CMD`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4538
+#, no-wrap
+msgid "Directory where the `iconv` binary resides"
+msgstr "Каталог, в котором находится бинарный файл `iconv`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4539
+#, no-wrap
+msgid "`${LOCALBASE}/bin/iconv`"
+msgstr "`${LOCALBASE}/bin/iconv`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4541
+#, no-wrap
+msgid "[.filename]#/usr/bin/iconv#"
+msgstr "[.filename]#/usr/bin/iconv#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4542
+#, no-wrap
+msgid "`ICONV_LIB`"
+msgstr "`ICONV_LIB`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4543
+#, no-wrap
+msgid "`ld` argument to link to [.filename]#libiconv# (if needed)"
+msgstr "аргумент `ld` для линковки с [.filename]#libiconv# (если требуется)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4544
+#, no-wrap
+msgid "`-liconv`"
+msgstr "`-liconv`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4546
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4556
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4560
+#, no-wrap
+msgid "(empty)"
+msgstr "(пусто)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4547
+#, no-wrap
+msgid "`ICONV_PREFIX`"
+msgstr "`ICONV_PREFIX`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4548
+#, no-wrap
+msgid "Directory where the `iconv` implementation resides (useful for configure scripts)"
+msgstr "Каталог, в котором находится реализация `iconv` (полезно для скриптов configure)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4549
+#, no-wrap
+msgid "`${LOCALBASE}`"
+msgstr "`${LOCALBASE}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4551
+#, no-wrap
+msgid "[.filename]#/usr#"
+msgstr "[.filename]#/usr#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4552
+#, no-wrap
+msgid "`ICONV_CONFIGURE_ARG`"
+msgstr "`ICONV_CONFIGURE_ARG`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4553
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4558
+#, no-wrap
+msgid "Preconstructed configure argument for configure scripts"
+msgstr "Предварительно сконструированный аргумент configure для скриптов configure"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4554
+#, no-wrap
+msgid "`--with-libiconv-prefix=${LOCALBASE}`"
+msgstr "`--with-libiconv-prefix=${LOCALBASE}`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4557
+#, no-wrap
+msgid "`ICONV_CONFIGURE_BASE`"
+msgstr "`ICONV_CONFIGURE_BASE`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4559
+#, no-wrap
+msgid "`--with-libiconv=${LOCALBASE}`"
+msgstr "`--with-libiconv=${LOCALBASE}`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4563
+msgid ""
+"These two examples automatically populate the variables with the correct "
+"value for systems using package:converters/libiconv[] or the native `iconv` "
+"respectively:"
+msgstr ""
+"Эти два примера автоматически заполняют переменные правильным значением для "
+"систем, использующих package:converters/libiconv[] или `iconv`, входящий в "
+"состав операционной системы, соответственно:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4565
+#, no-wrap
+msgid "Simple `iconv` Usage"
+msgstr "Простое использование `iconv`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4572
+#, no-wrap
+msgid ""
+"USES=\t\ticonv\n"
+"LDFLAGS+=\t-L${LOCALBASE}/lib ${ICONV_LIB}\n"
+msgstr ""
+"USES=\t\ticonv\n"
+"LDFLAGS+=\t-L${LOCALBASE}/lib ${ICONV_LIB}\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4577
+#, no-wrap
+msgid "`iconv` Usage with `configure`"
+msgstr "Использование `iconv` с `configure`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4584
+#, no-wrap
+msgid ""
+"USES=\t\ticonv\n"
+"CONFIGURE_ARGS+=${ICONV_CONFIGURE_ARG}\n"
+msgstr ""
+"USES=\t\ticonv\n"
+"CONFIGURE_ARGS+=${ICONV_CONFIGURE_ARG}\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4590
+msgid ""
+"As shown above, `ICONV_LIB` is empty when a native `iconv` is present. This "
+"can be used to detect the native `iconv` and respond appropriately."
+msgstr ""
+"Как показано выше, `ICONV_LIB` пуста, когда присутствует встроенный `iconv`. "
+"Это можно использовать для обнаружения встроенного `iconv` и действовать "
+"соответственно."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4593
+msgid ""
+"Sometimes a program has an `ld` argument or search path hardcoded in a "
+"[.filename]#Makefile# or configure script. This approach can be used to "
+"solve that problem:"
+msgstr ""
+"Иногда в программе аргумент `ld` или путь поиска жестко заданы в "
+"[.filename]#Makefile# или скрипте configure. Для решения этой проблемы можно "
+"использовать следующий подход:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4595
+#, no-wrap
+msgid "Fixing Hardcoded `-liconv`"
+msgstr "Исправление жестко заданного `-liconv`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4601
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4618
+#, no-wrap
+msgid "USES=\t\ticonv\n"
+msgstr "USES=\t\ticonv\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4604
+#, no-wrap
+msgid ""
+"post-patch:\n"
+"\t@${REINPLACE_CMD} -e 's/-liconv/${ICONV_LIB}/' ${WRKSRC}/Makefile\n"
+msgstr ""
+"post-patch:\n"
+"\t@${REINPLACE_CMD} -e 's/-liconv/${ICONV_LIB}/' ${WRKSRC}/Makefile\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4610
+msgid ""
+"In some cases it is necessary to set alternate values or perform operations "
+"depending on whether there is a native `iconv`. "
+"[.filename]#bsd.port.pre.mk# must be included before testing the value of "
+"`ICONV_LIB`:"
+msgstr ""
+"В некоторых случаях необходимо установить альтернативные значения или "
+"выполнить операции в зависимости от наличия встроенного `iconv`. "
+"[.filename]#bsd.port.pre.mk# должен быть включен до проверки значения "
+"`ICONV_LIB`:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4612
+#, no-wrap
+msgid "Checking for Native `iconv` Availability"
+msgstr "Проверка доступности встроенной поддержки `iconv`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4626
+#, no-wrap
+msgid ""
+"post-patch:\n"
+".if empty(ICONV_LIB)\n"
+"\t# native iconv detected\n"
+"\t@${REINPLACE_CMD} -e 's|iconv||' ${WRKSRC}/Config.sh\n"
+".endif\n"
+msgstr ""
+"post-patch:\n"
+".if empty(ICONV_LIB)\n"
+"\t# native iconv detected\n"
+"\t@${REINPLACE_CMD} -e 's|iconv||' ${WRKSRC}/Config.sh\n"
+".endif\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4628
+#, no-wrap
+msgid ".include <bsd.port.post.mk>\n"
+msgstr ".include <bsd.port.post.mk>\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4633
+#, no-wrap
+msgid "Using Xfce"
+msgstr "Использование Xfce"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4636
+msgid "Ports that need Xfce libraries or applications set `USES=xfce`."
+msgstr ""
+"Порты, которым требуются библиотеки или приложения Xfce, устанавливают "
+"`USES=xfce`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4640
+msgid ""
+"Specific Xfce library and application dependencies are set with values "
+"assigned to `USE_XFCE`. They are defined in [.filename]#/usr/ports/Mk/Uses/"
+"xfce.mk#. The possible values are:"
+msgstr ""
+"Конкретные зависимости библиотек и приложений Xfce задаются с помощью "
+"значений, присвоенных `USE_XFCE`. Они определены в [.filename]#/usr/ports/Mk/"
+"Uses/xfce.mk#. Возможные значения:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4641
+#, no-wrap
+msgid "Values of `USE_XFCE`"
+msgstr "Значения `USE_XFCE`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4642
+#, no-wrap
+msgid "garcon"
+msgstr "garcon"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4644
+msgid "package:sysutils/garcon[]"
+msgstr "package:sysutils/garcon[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4645
+#, no-wrap
+msgid "libexo"
+msgstr "libexo"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4647
+msgid "package:x11/libexo[]"
+msgstr "package:x11/libexo[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4648
+#, no-wrap
+msgid "libgui"
+msgstr "libgui"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4650
+msgid "package:x11-toolkits/libxfce4gui[]"
+msgstr "package:x11-toolkits/libxfce4gui[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4651
+#, no-wrap
+msgid "libmenu"
+msgstr "libmenu"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4653
+msgid "package:x11/libxfce4menu[]"
+msgstr "package:x11/libxfce4menu[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4654
+#, no-wrap
+msgid "libutil"
+msgstr "libutil"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4656
+msgid "package:x11/libxfce4util[]"
+msgstr "package:x11/libxfce4util[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4657
+#, no-wrap
+msgid "panel"
+msgstr "panel"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4659
+msgid "package:x11-wm/xfce4-panel[]"
+msgstr "package:x11-wm/xfce4-panel[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4660
+#, no-wrap
+msgid "thunar"
+msgstr "thunar"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4662
+msgid "package:x11-fm/thunar[]"
+msgstr "package:x11-fm/thunar[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4663
+#, no-wrap
+msgid "xfconf"
+msgstr "xfconf"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4665
+msgid "package:x11/xfce4-conf[]"
+msgstr "package:x11/xfce4-conf[]"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4667
+#, no-wrap
+msgid "`USES=xfce` Example"
+msgstr "Пример `USES=xfce`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4674
+#, no-wrap
+msgid ""
+"USES=\t\txfce\n"
+"USE_XFCE=\tlibmenu\n"
+msgstr ""
+"USES=\t\txfce\n"
+"USE_XFCE=\tlibmenu\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4679
+#, no-wrap
+msgid "Using Xfce's Own GTK2 Widgets"
+msgstr "Использование собственных виджетов GTK2 в Xfce"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4683
+msgid ""
+"In this example, the ported application uses the GTK2-specific widgets "
+"package:x11/libxfce4menu[] and package:x11/xfce4-conf[]."
+msgstr ""
+"В этом примере портированное приложение использует пакет виджетов, "
+"специфичных для GTK2: package:x11/libxfce4menu[] и package:x11/xfce4-conf[]."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4688
+#, no-wrap
+msgid ""
+"USES=\t\txfce:gtk2\n"
+"USE_XFCE=\tlibmenu xfconf\n"
+msgstr ""
+"USES=\t\txfce:gtk2\n"
+"USE_XFCE=\tlibmenu xfconf\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4697
+msgid ""
+"Xfce components included this way will automatically include any "
+"dependencies they need. It is no longer necessary to specify the entire "
+"list. If the port only needs package:x11-wm/xfce4-panel[], use:"
+msgstr ""
+"Компоненты Xfce, включённые таким образом, автоматически загрузят все "
+"необходимые зависимости. Указывать полный список больше не требуется. Если "
+"порту нужен только package:x11-wm/xfce4-panel[], используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4702
+#, no-wrap
+msgid ""
+"USES=\t\txfce\n"
+"USE_XFCE=\tpanel\n"
+msgstr ""
+"USES=\t\txfce\n"
+"USE_XFCE=\tpanel\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4705
+msgid ""
+"There is no need to list the components package:x11-wm/xfce4-panel[] needs "
+"itself like this:"
+msgstr ""
+"Нет необходимости перечислять компоненты package:x11-wm/xfce4-panel[], "
+"которые ему самому требуются, вот так:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4710
+#, no-wrap
+msgid ""
+"USES=\t\txfce\n"
+"USE_XFCE=\tlibexo libmenu libutil panel\n"
+msgstr ""
+"USES=\t\txfce\n"
+"USE_XFCE=\tlibexo libmenu libutil panel\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4714
+msgid ""
+"However, Xfce components and non-Xfce dependencies of the port must be "
+"included explicitly. Do not count on an Xfce component to provide a sub-"
+"dependency other than itself for the main port."
+msgstr ""
+"Однако компоненты Xfce и зависимости порта, не относящиеся к Xfce, должны "
+"быть явно включены. Не рассчитывайте, что компонент Xfce предоставит "
+"дополнительную зависимость, кроме себя, для основного порта."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4717
+#, no-wrap
+msgid "Using Budgie"
+msgstr "Использование Budgie"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4720
+msgid ""
+"Applications or libraries depending on the Budgie desktop should set `USES= "
+"budgie` and set `USE_BUDGIE` to the list of required components."
+msgstr ""
+"Приложения или библиотеки, зависящие от рабочего стола Budgie, должны "
+"указывать `USES= budgie` и устанавливать `USE_BUDGIE` в список необходимых "
+"компонентов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4727
+#, no-wrap
+msgid "`libbudgie`"
+msgstr "`libbudgie`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4729
+#, no-wrap
+msgid "Desktop core (library)"
+msgstr "Ядро рабочего стола (библиотека)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4730
+#, no-wrap
+msgid "`libmagpie`"
+msgstr "`libmagpie`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4732
+#, no-wrap
+msgid "Budgie's X11 window manager and compositor library"
+msgstr "Оконный менеджер X11 и библиотека композитинга Budgie"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4733
+#, no-wrap
+msgid "`raven`"
+msgstr "`raven`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4735
+#, no-wrap
+msgid "All-in-one center in panel for accessing different applications widgets"
+msgstr "Универсальный центр в панели для доступа к различным виджетам приложений"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4736
+#, no-wrap
+msgid "`screensaver`"
+msgstr "`screensaver`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4738
+#, no-wrap
+msgid "Desktop-specific screensaver"
+msgstr "Рабочий стол: специальная заставка"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4743
+msgid ""
+"All application widgets communicate through the *org.budgie_desktop.Raven* "
+"service."
+msgstr ""
+"Все виджеты приложений взаимодействуют через службу "
+"*org.budgie_desktop.Raven*."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4745
+msgid ""
+"The default dependency is lib- and run-time, it can be changed with `:build` "
+"or `:run`, for example:"
+msgstr ""
+"Зависимость по умолчанию включает время сборки и выполнения, её можно "
+"изменить с помощью `:build` или `:run`, например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4750
+#, no-wrap
+msgid ""
+"USES=\t\tbudgie\n"
+"USE_BUDGIE=\tscreensaver:build\n"
+msgstr ""
+"USES=\t\tbudgie\n"
+"USE_BUDGIE=\tscreensaver:build\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4754
+#, no-wrap
+msgid "`USE_BUDGIE` Example"
+msgstr "Пример `USE_BUDGIE`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4761
+#, no-wrap
+msgid ""
+"USES=\t\tbudgie gettext gnome meson pkgconfig\n"
+"USE_BUDGIE=\tlibbudgie\n"
+msgstr ""
+"USES=\t\tbudgie gettext gnome meson pkgconfig\n"
+"USE_BUDGIE=\tlibbudgie\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4765
+#, no-wrap
+msgid "Using Databases"
+msgstr "Использование баз данных"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4768
+msgid ""
+"Use one of the `USES` macros from crossref:special[using-databases-"
+"uses,Database `USES` Macros] to add a dependency on a database."
+msgstr ""
+"Используйте один из макросов `USES` из crossref:special[using-databases-"
+"uses,Макросы `USES` для баз данных], чтобы добавить зависимость от базы "
+"данных."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4770
+#, no-wrap
+msgid "Database `USES` Macros"
+msgstr "Макросы `USES` для баз данных"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4774
+#, no-wrap
+msgid "Database"
+msgstr "База данных"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4776
+#, no-wrap
+msgid "USES Macro"
+msgstr "Макрос USES"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4777
+#, no-wrap
+msgid "Berkeley DB"
+msgstr "Berkeley DB"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4779
+#, no-wrap
+msgid "crossref:uses[uses-bdb,`bdb`]"
+msgstr "crossref:uses[uses-bdb,`bdb`]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4780
+#, no-wrap
+msgid "MariaDB, MySQL, Percona"
+msgstr "MariaDB, MySQL, Percona"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4782
+#, no-wrap
+msgid "crossref:uses[uses-mysql,`mysql`]"
+msgstr "crossref:uses[uses-mysql,`mysql`]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4783
+#, no-wrap
+msgid "PostgreSQL"
+msgstr "PostgreSQL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4785
+#, no-wrap
+msgid "crossref:uses[uses-pgsql,`pgsql`]"
+msgstr "crossref:uses[uses-pgsql,`pgsql`]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4786
+#, no-wrap
+msgid "SQLite"
+msgstr "SQLite"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4787
+#, no-wrap
+msgid "crossref:uses[uses-sqlite,`sqlite`]"
+msgstr "crossref:uses[uses-sqlite,`sqlite`]"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4790
+#, no-wrap
+msgid "Using Berkeley DB 6"
+msgstr "Использование Berkeley DB 6"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4796
+#, no-wrap
+msgid "USES=\tbdb:6\n"
+msgstr "USES=\tbdb:6\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4799
+msgid "See crossref:uses[uses-bdb,`bdb`] for more information."
+msgstr ""
+"См. crossref:uses[uses-bdb,`bdb`] для получения дополнительной информации."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4802
+#, no-wrap
+msgid "Using MySQL"
+msgstr "Использование MySQL"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4806
+msgid "When a port needs the MySQL client library add"
+msgstr "Когда порту требуется клиентская библиотека MySQL, добавьте"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4810
+#, no-wrap
+msgid "USES=\tmysql\n"
+msgstr "USES=\tmysql\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4813
+msgid "See crossref:uses[uses-mysql,`mysql`] for more information."
+msgstr ""
+"См. crossref:uses[uses-mysql,`mysql`] для получения дополнительной "
+"информации."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4816
+#, no-wrap
+msgid "Using PostgreSQL"
+msgstr "Использование PostgreSQL"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4820
+msgid "When a port needs the PostgreSQL server version 9.6 or later add"
+msgstr "Когда порту требуется сервер PostgreSQL версии 9.6 или новее, добавьте"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4825
+#, no-wrap
+msgid ""
+"USES=\t\tpgsql:9.6+\n"
+"WANT_PGSQL=\tserver\n"
+msgstr ""
+"USES=\t\tpgsql:9.6+\n"
+"WANT_PGSQL=\tserver\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4828
+msgid "See crossref:uses[uses-pgsql,`pgsql`] for more information."
+msgstr ""
+"См. crossref:uses[uses-pgsql,`pgsql`] для получения дополнительной "
+"информации."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4831
+#, no-wrap
+msgid "Using SQLite 3"
+msgstr "Использование SQLite 3"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4837
+#, no-wrap
+msgid "USES=\tsqlite:3\n"
+msgstr "USES=\tsqlite:3\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4840
+msgid "See crossref:uses[uses-sqlite,`sqlite`] for more information."
+msgstr ""
+"См. crossref:uses[uses-sqlite,`sqlite`] для получения дополнительной "
+"информации."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4843
+#, no-wrap
+msgid "Starting and Stopping Services (`rc` Scripts)"
+msgstr "Запуск и остановка служб (скрипты `rc`)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4850
+msgid ""
+"[.filename]#rc.d# scripts are used to start services on system startup, and "
+"to give administrators a standard way of stopping, starting and restarting "
+"the service. Ports integrate into the system [.filename]#rc.d# framework. "
+"Details on its usage can be found in extref:{handbook}[the rc.d Handbook "
+"chapter, configtuning-rcd]. Detailed explanation of the available commands "
+"is provided in man:rc[8] and man:rc.subr[8]. Finally, there is extref:{rc-"
+"scripting}[an article] on practical aspects of [.filename]#rc.d# scripting."
+msgstr ""
+"[.filename]#rc.d# скрипты используются для запуска служб при загрузке "
+"системы, а также предоставляют администраторам стандартный способ остановки, "
+"запуска и перезапуска служб. Порты интегрируются в систему "
+"[.filename]#rc.d#. Подробности использования можно найти в extref:{handbook}"
+"[соответствующей главе Handbook, configtuning-rcd]. Детальное объяснение "
+"доступных команд приведено в man:rc[8] и man:rc.subr[8]. Наконец, существует "
+"extref:{rc-scripting}[статья], посвящённая практическим аспектам написания "
+"[.filename]#rc.d# скриптов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4853
+msgid ""
+"With a mythical port called _doorman_, which needs to start a _doormand_ "
+"daemon. Add the following to the [.filename]#Makefile#:"
+msgstr ""
+"С мифическим портом под названием _doorman_, которому необходимо запустить "
+"демон _doormand_. Добавьте следующее в [.filename]#Makefile#:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4857
+#, no-wrap
+msgid "USE_RC_SUBR=\tdoormand\n"
+msgstr "USE_RC_SUBR=\tdoormand\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4864
+msgid ""
+"Multiple scripts may be listed and will be installed. Scripts must be "
+"placed in the [.filename]#files# subdirectory and a `.in` suffix must be "
+"added to their filename. Standard `SUB_LIST` expansions will be ran against "
+"this file. Use of the `%%PREFIX%%` and `%%LOCALBASE%%` expansions is "
+"strongly encouraged as well. More on `SUB_LIST` in crossref:pkg-files[using-"
+"sub-files,the relevant section]."
+msgstr ""
+"Можно указать несколько скриптов, которые будут установлены. Скрипты должны "
+"быть размещены в подкаталоге [.filename]#files#, и к их имени должен быть "
+"добавлен суффикс `.in`. Для этого файла будут выполнены стандартные "
+"подстановки `SUB_LIST`. Также настоятельно рекомендуется использовать "
+"подстановки `%%PREFIX%%` и `%%LOCALBASE%%`. Подробнее о `SUB_LIST` см. в "
+"crossref:pkg-files[using-sub-files,соответствующем разделе]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4866
+msgid ""
+"As of FreeBSD 6.1-RELEASE, local [.filename]#rc.d# scripts (including those "
+"installed by ports) are included in the overall man:rcorder[8] of the base "
+"system."
+msgstr ""
+"Начиная с FreeBSD 6.1-RELEASE, локальные скрипты [.filename]#rc.d# (включая "
+"те, что установлены через порты) включены в общий man:rcorder[8] базовой "
+"системы."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4868
+msgid ""
+"An example simple [.filename]#rc.d# script to start the doormand daemon:"
+msgstr "Пример простого скрипта [.filename]#rc.d# для запуска демона doormand:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4872
+#, no-wrap
+msgid "#!/bin/sh\n"
+msgstr "#!/bin/sh\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4884
+#, no-wrap
+msgid ""
+"# PROVIDE: doormand\n"
+"# REQUIRE: LOGIN\n"
+"# KEYWORD: shutdown\n"
+"#\n"
+"# Add these lines to /etc/rc.conf.local or /etc/rc.conf\n"
+"# to enable this service:\n"
+"#\n"
+"# doormand_enable (bool):\tSet to NO by default.\n"
+"#\t\t\t\tSet it to YES to enable doormand.\n"
+"# doormand_config (path):\tSet to %%PREFIX%%/etc/doormand/doormand.cf\n"
+"#\t\t\t\tby default.\n"
+msgstr ""
+"# PROVIDE: doormand\n"
+"# REQUIRE: LOGIN\n"
+"# KEYWORD: shutdown\n"
+"#\n"
+"# Add these lines to /etc/rc.conf.local or /etc/rc.conf\n"
+"# to enable this service:\n"
+"#\n"
+"# doormand_enable (bool):\tSet to NO by default.\n"
+"#\t\t\t\tSet it to YES to enable doormand.\n"
+"# doormand_config (path):\tSet to %%PREFIX%%/etc/doormand/doormand.cf\n"
+"#\t\t\t\tby default.\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4886
+#, no-wrap
+msgid ". /etc/rc.subr\n"
+msgstr ". /etc/rc.subr\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4889
+#, no-wrap
+msgid ""
+"name=doormand\n"
+"rcvar=doormand_enable\n"
+msgstr ""
+"name=doormand\n"
+"rcvar=doormand_enable\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4891
+#, no-wrap
+msgid "load_rc_config $name\n"
+msgstr "load_rc_config $name\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4894
+#, no-wrap
+msgid ""
+": ${doormand_enable:=\"NO\"}\n"
+": ${doormand_config=\"%%PREFIX%%/etc/doormand/doormand.cf\"}\n"
+msgstr ""
+": ${doormand_enable:=\"NO\"}\n"
+": ${doormand_config=\"%%PREFIX%%/etc/doormand/doormand.cf\"}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4897
+#, no-wrap
+msgid ""
+"command=%%PREFIX%%/sbin/${name}\n"
+"pidfile=/var/run/${name}.pid\n"
+msgstr ""
+"command=%%PREFIX%%/sbin/${name}\n"
+"pidfile=/var/run/${name}.pid\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4899
+#, no-wrap
+msgid "command_args=\"-p $pidfile -f $doormand_config\"\n"
+msgstr "command_args=\"-p $pidfile -f $doormand_config\"\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4901
+#, no-wrap
+msgid "run_rc_command \"$1\"\n"
+msgstr "run_rc_command \"$1\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4904
+msgid ""
+"Unless there is a very good reason to start the service earlier, or it runs "
+"as a particular user (other than root), all ports scripts must use:"
+msgstr ""
+"Если нет очень веской причины запускать службу раньше или она работает от "
+"имени определенного пользователя (не root), все скрипты портов должны "
+"использовать:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4908
+#, no-wrap
+msgid "REQUIRE: LOGIN\n"
+msgstr "REQUIRE: LOGIN\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4911
+msgid ""
+"If the startup script launches a daemon that must be shutdown, the following "
+"will trigger a stop of the service on system shutdown:"
+msgstr ""
+"Если скрипт запуска демона требует его остановки, следующий код активирует "
+"остановку службы при выключении системы:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4915
+#, no-wrap
+msgid "KEYWORD: shutdown\n"
+msgstr "KEYWORD: shutdown\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4918
+msgid ""
+"If the script is not starting a persistent service this is not necessary."
+msgstr "Если скрипт не запускает постоянную службу, это не требуется."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4921
+msgid ""
+"For optional configuration elements the \"=\" style of default variable "
+"assignment is preferable to the \":=\" style here, since the former sets a "
+"default value only if the variable is unset, and the latter sets one if the "
+"variable is unset _or_ null. A user might very well include something like:"
+msgstr ""
+"Для необязательных элементов конфигурации предпочтительнее использовать "
+"стиль присваивания переменных по умолчанию \"=\" вместо стиля \":=\", так "
+"как первый устанавливает значение по умолчанию только если переменная не "
+"задана, а второй — если переменная не задана _или_ равна null. Пользователь "
+"может включить что-то вроде:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4925
+#, no-wrap
+msgid "doormand_flags=\"\"\n"
+msgstr "doormand_flags=\"\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4929
+msgid ""
+"in their [.filename]#rc.conf.local#, and a variable substitution using "
+"\":=\" would inappropriately override the user's intention. The `_enable` "
+"variable is not optional, and must use the \":\" for the default."
+msgstr ""
+"в свой [.filename]#rc.conf.local#, а подстановка переменной с использованием "
+"\":=\" некорректно переопределила бы намерение пользователя. Переменная "
+"`_enable` не является опциональной и должна использовать \":\" для значения "
+"по умолчанию."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4934
+msgid ""
+"Ports _must not_ start and stop their services when installing and "
+"deinstalling. Do not abuse the [.filename]#plist# keywords described in "
+"crossref:plist[plist-keywords-base-exec, \"the @preexec command,@postexec "
+"command,@preunexec command,@postunexec command section\"] by running "
+"commands that modify the currently running system, including starting or "
+"stopping services."
+msgstr ""
+"Порты _не должны_ запускать и останавливать свои службы при установке и "
+"удалении. Не злоупотребляйте ключевыми словами [.filename]#plist#, "
+"описанными в crossref:plist[plist-keywords-base-exec, \"разделе @preexec "
+"command,@postexec command,@preunexec command,@postunexec command\"], "
+"выполняя команды, которые изменяют работающую систему, включая запуск или "
+"остановку служб."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4937
+#, no-wrap
+msgid "Pre-Commit Checklist"
+msgstr "Pre-Commit Checklist"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4940
+msgid ""
+"Before contributing a port with an [.filename]#rc.d# script, and more "
+"importantly, before committing one, please consult this checklist to be sure "
+"that it is ready."
+msgstr ""
+"Прежде чем внести порт с [.filename]#rc.d# скриптом, и что более важно, "
+"перед его коммитом, пожалуйста, ознакомьтесь с этим контрольным списком, "
+"чтобы убедиться, что он готов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4942
+msgid ""
+"The package:devel/rclint[] port can check for most of these, but it is not a "
+"substitute for proper review."
+msgstr ""
+"Порт package:devel/rclint[] может проверить большинство из них, но он не "
+"заменяет тщательного просмотра и проверки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4945
+msgid ""
+"If this is a new file, does it have a [.filename]#.sh# extension? If so, "
+"that must be changed to just [.filename]#file.in# since [.filename]#rc.d# "
+"files may not end with that extension."
+msgstr ""
+"Если это новый файл, имеет ли он расширение [.filename]#.sh#? Если да, его "
+"необходимо изменить на просто [.filename]#file.in#, поскольку файлы "
+"[.filename]#rc.d# не могут оканчиваться таким расширением."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4946
+msgid ""
+"Do the name of the file (minus [.filename]#.in#), the `PROVIDE` line, and "
+"`$` _name_ all match? The file name matching `PROVIDE` makes debugging "
+"easier, especially for man:rcorder[8] issues. Matching the file name and "
+"`$`_name_ makes it easier to figure out which variables are relevant in "
+"[.filename]#rc.conf[.local]#. It is also a policy for all new scripts, "
+"including those in the base system."
+msgstr ""
+"Совпадают ли имя файла (без [.filename]#.in#), строка `PROVIDE` и `$`_name_? "
+"Совпадение имени файла с `PROVIDE` упрощает отладку, особенно при проблемах "
+"с man:rcorder[8]. Совпадение имени файла и `$`_name_ облегчает понимание "
+"того, какие переменные актуальны в [.filename]#rc.conf[.local]#. Это также "
+"является политикой для всех новых скриптов, включая те, что в базовой "
+"системе."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4947
+msgid ""
+"Is the `REQUIRE` line set to `LOGIN`? This is mandatory for scripts that run "
+"as a non-root user. If it runs as root, is there a good reason for it to run "
+"prior to `LOGIN`? If not, it must run after so that local scrips can be "
+"loosely grouped to a point in man:rcorder[8] after most everything in the "
+"base is already running."
+msgstr ""
+"Установлена ли строка `REQUIRE` в значение `LOGIN`? Это обязательно для "
+"скриптов, выполняемых от имени непривилегированного пользователя. Если "
+"скрипт выполняется от имени root, есть ли веская причина для его запуска до "
+"`LOGIN`? Если нет, он должен запускаться после, чтобы локальные скрипты "
+"можно было условно сгруппировать в man:rcorder[8] после запуска большинства "
+"компонентов базовой системы."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4948
+msgid ""
+"Does the script start a persistent service? If so, it must have `KEYWORD: "
+"shutdown`."
+msgstr ""
+"Запускает ли скрипт постоянную службу? Если да, он должен содержать "
+"`KEYWORD: shutdown`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4949
+msgid ""
+"Make sure there is no `KEYWORD: FreeBSD` present. This has not been "
+"necessary nor desirable for years. It is also an indication that the new "
+"script was copy/pasted from an old script, so extra caution must be given to "
+"the review."
+msgstr ""
+"Убедитесь, что отсутствует `KEYWORD: FreeBSD`. Это перестало быть "
+"необходимым или желательным уже много лет. Это также указывает на то, что "
+"новый скрипт был скопирован/вставлен из старого скрипта, поэтому следует "
+"проявить дополнительную осторожность при проверке."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4950
+msgid ""
+"If the script uses an interpreted language like `perl`, `python`, or `ruby`, "
+"make certain that `command_interpreter` is set appropriately, for example, "
+"for Perl, by adding `PERL=${PERL}` to `SUB_LIST` and using `%%PERL%%`. "
+"Otherwise,"
+msgstr ""
+"Если скрипт использует интерпретируемый язык, например `perl`, `python` или "
+"`ruby`, убедитесь, что `command_interpreter` установлен корректно. Например, "
+"для Perl добавьте `PERL=${PERL}` в `SUB_LIST` и используйте `%%PERL%%`. В "
+"противном случае,"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4954
+#, no-wrap
+msgid "# service name stop\n"
+msgstr "# service name stop\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4957
+msgid ""
+"will probably not work properly. See man:service[8] for more information."
+msgstr ""
+"вероятно, не будет работать корректно. Дополнительную информацию смотрите в "
+"man:service[8]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4958
+msgid ""
+"Have all occurrences of [.filename]#/usr/local# been replaced with `%%PREFIX%"
+"%`?"
+msgstr ""
+"Проверено, что все вхождения [.filename]#/usr/local# заменены на `%%PREFIX%"
+"%`?"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4959
+msgid "Do the default variable assignments come after `load_rc_config`?"
+msgstr ""
+"Делаются ли присваивания переменным по умолчанию после `load_rc_config`?"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4960
+msgid ""
+"Are there default assignments to empty strings? They should be removed, but "
+"double-check that the option is documented in the comments at the top of the "
+"file."
+msgstr ""
+"Используются ли пустые строки при присвоении значений по умолчанию? Такие "
+"присвоения должны быть удалены, но перепроверьте, что эти параметры "
+"задокументированы в комментариях в начале файла."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4961
+msgid "Are things that are set in variables actually used in the script?"
+msgstr ""
+"Действительно ли в сценариях используются значения, присвоенные переменным?"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4962
+msgid ""
+"Are options listed in the default _name_`_flags` things that are actually "
+"mandatory? If so, they must be in `command_args`. `-d` is a red flag (pardon "
+"the pun) here, since it is usually the option to \"daemonize\" the process, "
+"and therefore is actually mandatory."
+msgstr ""
+"Являются ли опции, перечисленные в стандартном _name_`_flags`, "
+"обязательными? Если да, они должны быть в `command_args`. Флаг `-d` здесь, "
+"как красный флаг (простите за каламбур), так как обычно это опция для "
+"\"демонизации\" процесса и, следовательно, фактически обязательна."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4963
+msgid ""
+"`_name__flags` must never be included in `command_args` (and vice versa, "
+"although that error is less common)."
+msgstr ""
+"`_name__flags` никогда не должны включаться в `command_args` (и наоборот, "
+"хотя такая ошибка встречается реже)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4964
+msgid ""
+"Does the script execute any code unconditionally? This is frowned on. "
+"Usually these things must be dealt with through a `start_precmd`."
+msgstr ""
+"Выполняет ли скрипт любой код безусловно? Это не приветствуется. Обычно "
+"такие вещи должны обрабатываться через `start_precmd`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4965
+msgid ""
+"All boolean tests must use the `checkyesno` function. No hand-rolled tests "
+"for `[Yy][Ee][Ss]`, etc."
+msgstr ""
+"Все логические проверки должны использовать функцию `checkyesno`. Не "
+"допускаются самодельные проверки на `[Yy][Ee][Ss]` и т.п."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4966
+msgid ""
+"If there is a loop (for example, waiting for something to start) does it "
+"have a counter to terminate the loop? We do not want the boot to be stuck "
+"forever if there is an error."
+msgstr ""
+"Если есть цикл (например, ожидание запуска чего-либо), есть ли в нём счётчик "
+"для завершения цикла? Мы не хотим, чтобы загрузка зависала навсегда в случае "
+"ошибки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4967
+msgid ""
+"Does the script create files or directories that need specific permissions, "
+"for example, a [.filename]#pid# that needs to be owned by the user that runs "
+"the process? Rather than the traditional man:touch[1]/man:chown[8]/"
+"man:chmod[1] routine, consider using man:install[1] with the proper command "
+"line arguments to do the whole procedure with one step."
+msgstr ""
+"Создает ли скрипт файлы или каталоги, требующие определенных разрешений, "
+"например, [.filename]#pid#, который должен принадлежать пользователю, "
+"запускающему процесс? Вместо традиционной последовательности man:touch[1]/"
+"man:chown[8]/man:chmod[1] рассмотрите использование man:install[1] с "
+"соответствующими аргументами командной строки, чтобы выполнить всю процедуру "
+"за один шаг."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4969
+#, no-wrap
+msgid "Adding Users and Groups"
+msgstr "Добавление пользователей и групп"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4974
+msgid ""
+"Some ports require a particular user account to be present, usually for "
+"daemons that run as that user. For these ports, choose a _unique_ UID from "
+"50 to 999 and register it in [.filename]#ports/UIDs# (for users) and "
+"[.filename]#ports/GIDs# (for groups). The unique identification should be "
+"the same for users and groups."
+msgstr ""
+"Некоторые порты требуют наличия определённой учётной записи пользователя, "
+"обычно для демонов, работающих от имени этого пользователя. Для таких портов "
+"выберите _уникальный_ UID в диапазоне от 50 до 999 и зарегистрируйте его в "
+"[.filename]#ports/UIDs# (для пользователей) и [.filename]#ports/GIDs# (для "
+"групп). Уникальный идентификатор должен быть одинаковым для пользователей и "
+"групп."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4976
+msgid ""
+"Please include a patch against these two files when requiring a new user or "
+"group to be created for the port."
+msgstr ""
+"Пожалуйста, приложите патч для этих двух файлов, если требуется создать "
+"нового пользователя или группу для порта."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4978
+msgid ""
+"Then use `USERS` and `GROUPS` in [.filename]#Makefile#, and the user will be "
+"automatically created when installing the port."
+msgstr ""
+"Затем используйте `USERS` и `GROUPS` в [.filename]#Makefile#, и пользователь "
+"будет автоматически создан при установке порта."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4983
+#, no-wrap
+msgid ""
+"USERS=\tpulse\n"
+"GROUPS=\tpulse pulse-access pulse-rt\n"
+msgstr ""
+"USERS=\tpulse\n"
+"GROUPS=\tpulse pulse-access pulse-rt\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4986
+msgid ""
+"The current list of reserved UIDs and GIDs can be found in [.filename]#ports/"
+"UIDs# and [.filename]#ports/GIDs#."
+msgstr ""
+"Текущий список зарезервированных UID и GID можно найти в [.filename]#ports/"
+"UIDs# и [.filename]#ports/GIDs#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4988
+#, no-wrap
+msgid "Ports That Rely on Kernel Sources"
+msgstr "Порты, зависящие от исходных кодов ядра"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4992
+msgid ""
+"Some ports (such as kernel loadable modules) need the kernel source files so "
+"that the port can compile. Here is the correct way to determine if the user "
+"has them installed:"
+msgstr ""
+"Некоторые порты (например, загружаемые модули ядра) требуют исходные файлы "
+"ядра для компиляции порта. Вот правильный способ проверить, установлены ли "
+"они у пользователя:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4996
+#, no-wrap
+msgid "USES=\tkmod\n"
+msgstr "USES=\tkmod\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:4999
+msgid ""
+"Apart from this check, the `kmod` feature takes care of most items that "
+"these ports need to take into account."
+msgstr ""
+"Помимо этой проверки, функция `kmod` учитывает большинство аспектов, которые "
+"необходимо принимать во внимание данным портам."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5001
+#, no-wrap
+msgid "Go Libraries"
+msgstr "Библиотеки Go"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5005
+msgid ""
+"Ports must not package or install Go libs or source code. Go ports must "
+"fetch the required deps at the normal fetch time and should only install the "
+"programs and things users need, not the things Go developers would need."
+msgstr ""
+"Порты не должны упаковывать или устанавливать библиотеки или исходный код "
+"Go. Порты Go должны загружать необходимые зависимости в обычное время "
+"загрузки и должны устанавливать только программы и то, что нужно "
+"пользователям, а не то, что нужно разработчикам на Go."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5007
+msgid "Ports should (in order of preference):"
+msgstr "Порты должны (в порядке предпочтения):"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5009
+msgid "Use vendored dependencies included with the package source."
+msgstr "Использовать зависимости, включенные в исходный код пакета."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5010
+msgid ""
+"Fetch the versions of deps specified by upstream (in the case of go.mod, "
+"vendor.json or similar)."
+msgstr ""
+"Получить версии зависимостей, указанные вышестоящим проектом (в случае "
+"go.mod, vendor.json или аналогичных)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5011
+msgid ""
+"As a last resort (deps are not included nor versions specified exactly) "
+"fetch versions of dependencies available at the time of upstream development/"
+"release."
+msgstr ""
+"В крайнем случае (зависимости не включены и версии не указаны точно) "
+"получить версии зависимостей, доступные на момент разработки/выпуска "
+"вышестоящего проекта."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5013
+#, no-wrap
+msgid "Haskell Libraries"
+msgstr "Библиотеки Haskell"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5017
+msgid ""
+"Just like in case of Go language, Ports must not package or install Haskell "
+"libraries. Haskell ports must link statically to their dependencies and "
+"fetch all distribution files on fetch stage."
+msgstr ""
+"Как и в случае с языком Go, коллекция портов не должна включать или "
+"устанавливать библиотеки Haskell. Порты Haskell должны статически "
+"линковаться со своими зависимостями и загружать все распространяемые файлы "
+"на этапе fetch."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5019
+#, no-wrap
+msgid "Shell Completion Files"
+msgstr "Файлы завершения командной оболочки"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5024
+msgid ""
+"Many modern shells (including bash, fish, tcsh and zsh) support parameter "
+"and/or option tab-completion. This support usually comes from completion "
+"files, which contain the definitions for how tab completion will work for a "
+"certain command. Ports sometimes ship with their own completion files, or "
+"porters may have created them themselves."
+msgstr ""
+"Многие современные оболочки (включая bash, fish, tcsh и zsh) поддерживают "
+"табуляцию для параметров и/или опций. Эта поддержка обычно обеспечивается "
+"файлами завершения, которые содержат определения того, как будет работать "
+"завершение по табуляции для определённой команды. Порты иногда поставляются "
+"со своими собственными файлами завершения, или разработчики портов могут "
+"создавать их самостоятельно."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5028
+msgid ""
+"When available, completion files should always be installed. It is not "
+"necessary to make an option for it. If an option is used, though, always "
+"enable it in `OPTIONS_DEFAULT`."
+msgstr ""
+"Если доступны файлы завершения, их всегда следует устанавливать. Нет "
+"необходимости создавать для этого опцию. Однако если опция используется, "
+"всегда включайте её в `OPTIONS_DEFAULT`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5030
+#, no-wrap
+msgid "Full shell completion file names"
+msgstr "Полные имена файлов завершения оболочки"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5034
+#, no-wrap
+msgid "`bash`"
+msgstr "`bash`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5035
+#, no-wrap
+msgid "[.filename]#${PREFIX}/etc/bash_completion.d# or [.filename]#${PREFIX}/share/bash-completion/completions#"
+msgstr "[.filename]#${PREFIX}/etc/bash_completion.d# or [.filename]#${PREFIX}/share/bash-completion/completions#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5037
+#, no-wrap
+msgid "(any unique file names in one of these folders)"
+msgstr "(любые уникальные имена файлов в одной из этих папок)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5038
+#, no-wrap
+msgid "`fish`"
+msgstr "`fish`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5039
+#, no-wrap
+msgid "[.filename]#${PREFIX}/share/fish/completions/${PORTNAME}.fish#"
+msgstr "[.filename]#${PREFIX}/share/fish/completions/${PORTNAME}.fish#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5042
+#, no-wrap
+msgid "`zsh`"
+msgstr "`zsh`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5043
+#, no-wrap
+msgid "[.filename]#${PREFIX}/share/zsh/site-functions/_${PORTNAME}#"
+msgstr "[.filename]#${PREFIX}/share/zsh/site-functions/_${PORTNAME}#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/special/_index.adoc:5046
+msgid "Do not register any dependencies on the shells themselves."
+msgstr "Не регистрируйте зависимости от самих оболочек."
diff --git a/documentation/content/ru/books/porters-handbook/testing/_index.adoc b/documentation/content/ru/books/porters-handbook/testing/_index.adoc
index 57676e2f64..73b8cdff1f 100644
--- a/documentation/content/ru/books/porters-handbook/testing/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/testing/_index.adoc
@@ -1,22 +1,24 @@
---
-title: Глава 9. Тестирование вашего порта
-prev: books/porters-handbook/pkg-files
+description: 'Тестирование порта FreeBSD'
next: books/porters-handbook/upgrading
-showBookMenu: true
-weight: 9
params:
- path: "/books/porters-handbook/testing/"
+ path: /books/porters-handbook/testing/
+prev: books/porters-handbook/pkg-files
+showBookMenu: true
+tags: ["testing", "port", "Portclippy", "Portfmt", "Portlint", "poudriere", "sets"]
+title: 'Глава 10. Тестирование вашего порта'
+weight: 10
---
[[testing]]
-= Тестирование вашего порта
+= Тестирование порта
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 9
+:sectnumoffset: 10
:partnums:
:source-highlighter: rouge
:experimental:
@@ -58,7 +60,37 @@ endif::[]
Если `make describe` выдаёт строчку, а не ошибку, то для вас это пройдёт безболезненно. Обратитесь к файлу [.filename]#bsd.port.mk#, чтобы выяснить значение выдаваемых строк.
-Заметьте также, что запуск последней версии `portlint` (как указано в следующем разделе) приведёт к автоматическому запуску команды `make describe`.
+Также обратите внимание, что запуск актуальной версии `portlint` (как указано в следующем разделе) приведёт к автоматическому выполнению `make describe`.
+
+[[make-test]]
+== Запуск `make test`
+
+Даже если порт успешно собирается, рекомендуется убедиться, что программа корректно выполняет свои функции. Если исходный проект предоставляет тесты вместе с программным обеспечением, рекомендуется их запустить и проверить, что всё работает, как ожидается.
+
+Порт может автоматически включить тесты, используя переменную `TEST_TARGET`. Когда эта переменная установлена, она содержит имя цели тестирования порта. Обычно это просто `test`, но другие варианты включают `tests`, `check` или, в специфических случаях, такие значения, как `run_tests.py`.
+
+В дополнение к переменной `TEST_TARGET` фреймворк предоставляет следующие переменные для управления выполнением тестов:
+
+* `TEST_WRKSRC` — это каталог для выполнения тестов.
+* `TEST_ENV` содержит дополнительные переменные, которые передаются на этап тестирования.
+* `TEST_ARGS` содержит любые дополнительные аргументы, переданные на этапе тестирования.
+
+Примеры использования этих переменных можно найти в package:cad/xyce[], package:www/libjwt[] и других.
+
+[NOTE]
+====
+Убедитесь, что тесты не ломаются при обновлении порта.
+====
+
+
+[[testing-portclippy]]
+== Portclippy / Portfmt
+
+Эти инструменты поставляются из пакета:ports-mgmt/portfmt[].
+
+Portclippy — это линтер, проверяющий, расположены ли переменные в файле [.filename]#Makefile# в правильном порядке согласно crossref:order[porting-order,Порядку переменных в Makefile портов].
+
+Portfmt — это инструмент для автоматического форматирования [.filename]#Makefile#.
[[testing-portlint]]
== Portlint
@@ -68,13 +100,13 @@ endif::[]
Так как для обнаружения ошибок `portlint` использует эвристические методы, то им могут выдаваться и ошибочные предупреждения. Кроме того, время от времени нечто, отмечаемое как некорректность, из-за ограничений механизма создания портов не может быть сделано никак иначе. Если вы сомневаетесь, то лучше всего спросить в {freebsd-ports}.
[[testing-porttools]]
-== Port Tools
+== Инструменты для работы с портами
Программа package:ports-mgmt/porttools[] входит в состав Коллекции Портов.
-`port` является сценарием переднего плана, который может упростить вам задачу тестирования. Если вы хотите проверить новый порт или обновить существующий, то вы можете использовать `port test` для проверки вашего порта, включая проверку <<testing-portlint,`portlint`>>. Эта команда также находит и отображает любые файлы, которые невключенные в [.filename]#pkg-plist#. Смотрите следующий пример:
+`port` является сценарием переднего плана, который может упростить вам задачу тестирования. Если вы хотите проверить новый порт или обновить существующий, то вы можете использовать `port test` для проверки вашего порта, включая проверку crossref:testing[testing-portlint,`portlint`]. Эта команда также находит и отображает любые файлы, которые невключенные в [.filename]#pkg-plist#. Смотрите следующий пример:
-[source,shell]
+[source, shell]
....
# port test /usr/ports/net/csup
....
@@ -92,43 +124,417 @@ endif::[]
Проверьте, что ваше приложение не устанавливает чего-либо в каталог [.filename]#/usr/local# вместо `PREFIX`. Наличие явно указанных путей можно быстро проверить следующим образом:
-[source,shell]
+[source, shell]
....
-# make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`
+% make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`
....
Если что-то было установлено за пределами `PREFIX`, то процесс создания пакета сообщит об отсутствии файлов.
Это также стоит проверить с использованием поддержки каталога сборки (смотрите crossref:special[staging, Staging]):
-[source,shell]
+[source, shell]
....
-# make stage && make check-orphans && make package
+% make stage && make check-plist && make stage-qa && make package
....
-Эти проверки не найдут явно указанных путей внутри файлов порта и не проверят корректность использования `LOCALBASE` в качестве ссылки на файлы из других портов. Порт, временно установленный в [.filename]#/var/tmp/`make -V PORTNAME`#, следует проверять на работоспособность, чтобы убедиться в отсутствии проблем с путями.
+* `check-plist` проверяет отсутствующие в plist файлы и файлы в plist, которые не установлены портом.
+* `stage-qa` проверяет наличие распространённых проблем, таких как неправильный шебанг (интерпретаторная строка в первой строке скрипта), символьные ссылки, указывающие за пределы stage-директории,файлы с setuid битом и библиотеки с отладочной информацией...
+
+Эти тесты не обнаружат жёстко заданные пути в файлах порта, а также не проверят, что `LOCALBASE` используется корректно для ссылок на файлы из других портов. Временно установленный порт в [.filename]#/var/tmp/`make -V PORTNAME`# должен быть протестирован на корректную работу, чтобы убедиться в отсутствии проблем с путями.
-Переменная `PREFIX` не должна задаваться явно в файле [.filename]#Makefile# порта. Пользователи при установке порта могут задать в `PREFIX` свое собственное место, и порт должен учитывать это значение.
+`PREFIX` не должен быть явно установлен в [.filename]#Makefile# порта. Пользователи, устанавливающие порт, могут задать `PREFIX` в другом месте, и порт должен учитывать эту настройку.
-Обратитесь к программам/файлам из других портов с переменными, перечисленными выше, без указания явных маршрутов. Например, если ваш порт требует, чтобы макрос `PAGER` являлся полным путем утилиты `less`, не используйте строковый путь [.filename]#/usr/local/bin/less#. Вместо этого используйте `${LOCALBASE}`:
+Обращайтесь к программам и файлам из других портов с помощью упомянутых выше переменных, а не явных путей. Например, если порт требует, чтобы макрос `PAGER` содержал полный путь к `less`, не используйте явный путь [.filename]#/usr/local/bin/less#. Вместо этого используйте `${LOCALBASE}`:
[.programlisting]
....
-DPAGER=\"${LOCALBASE}/bin/less\"
....
-Путь с использованием `LOCALBASE` имеет больше шансов оставаться работоспособным, если системный администратор переместил всё дерево [.filename]#/usr/local# куда-то в другое место.
+Путь с `LOCALBASE` с большей вероятностью продолжит работать, если системный администратор переместил всё дерево [.filename]#/usr/local# в другое место.
-[[testing-tinderbox]]
-== Tinderbox
+[TIP]
+====
+Все эти тесты выполняются автоматически при запуске `poudriere testport` или `poudriere bulk -t`. Настоятельно рекомендуется каждому участнику разработки портов устанавливать и тестировать свои порты с помощью этого инструмента. Дополнительную информацию можно найти в crossref:testing[testing-poudriere, poudriere].
+====
+
+[[testing-poudriere]]
+== poudriere
-Если вы алчный контрибутор портов, то вы можете захотеть взглянуть на Tinderbox. Это мощная система построения и тестирования портов. Tinderbox можно установить, используя порт package:ports-mgmt/tinderbox[]. Обязательно прочитайте поставляемую документацию, поскольку конфигурация не является тривиальной.
+Для контрибьютора портов poudriere является одним из самых важных и полезных инструментов для тестирования и сборки. Его основные возможности включают:
-Для получения подробностей посетите http://tinderbox.marcuscom.com/[вебсайт Tinderbox].
+* Массовая сборка всего дерева портов, определенных подмножеств дерева портов или отдельного порта с его зависимостями
+* Автоматическая упаковка результатов сборки
+* Генерация файлов журнала сборки для каждого порта
+* Предоставление подписанного репозитория man:pkg[8]
+* Тестирование сборки портов перед отправкой патча в трекер ошибок FreeBSD или внесением изменений в дерево портов
+* Тестирование успешных сборок портов с использованием различных параметров
-[[testing-poudriere]]
-== Poudriere
+Поскольку poudriere выполняет сборку в чистой среде man:jail[8] и использует возможности man:zfs[8], он имеет несколько преимуществ по сравнению с традиционным тестированием на основной системе:
+
+* Отсутствие загрязнения основной среды: никаких оставшихся файлов, случайных удалений или изменений существующих конфигурационных файлов.
+* Проверяет [.filename]#pkg-plist# на наличие отсутствующих или лишних записей
+* Коммиттеры портов иногда запрашивают журнал poudriere вместе с отправкой патча, чтобы оценить, готов ли патч для интеграции в дерево портов
+
+Также его настройка и использование довольно просты, он не имеет зависимостей и будет работать в любой поддерживаемой версии FreeBSD. В этом разделе показано, как установить, настроить и запустить poudriere в рамках обычного рабочего процесса разработчика портов.
+
+Примеры в этом разделе показывают стандартную структуру файлов, принятую в FreeBSD. Внесите соответствующие изменения, если у вас используются другие настройки. Дерево портов, обозначаемое как `${PORTSDIR}`, находится в [.filename]#/usr/ports#. По умолчанию `${LOCALBASE}` и `${PREFIX}` указывают на [.filename]#/usr/local#.
+
+[[testing-poudriere-installing]]
+=== Установка poudriere
+
+poudriere доступен в дереве портов в пакете package:ports-mgmt/poudriere[]. Его можно установить с помощью man:pkg[8] или из портов:
+
+[source, shell]
+....
+# pkg install poudriere
+....
+
+или
+
+[source, shell]
+....
+# make -C /usr/ports/ports-mgmt/poudriere install clean
+....
+
+Также существует версия poudriere в разработке, которая в конечном итоге станет следующим релизом. Она доступна в пакете:ports-mgmt/poudriere-devel[]. Эта версия используется для официальных сборок пакетов FreeBSD, поэтому она хорошо протестирована. В ней часто появляются новые интересные функции. Коммиттер портов захочет использовать версию в разработке, так как именно она используется в продакшене и содержит все новые функции, которые гарантируют, что всё будет работать идеально. Контрибьютору не обязательно нужны эти функции, так как наиболее важные исправления переносятся в выпущенную версию. Основная причина использования версии в разработке для сборки официальных пакетов заключается в её скорости — она позволяет сократить время полной сборки с 18 до 17 часов при использовании высокопроизводительного сервера с 32 CPU и 128 ГБ оперативной памяти. Эти оптимизации не будут столь значимы при сборке портов на настольном компьютере.
+
+[[testing-poudriere-setup]]
+=== Настройка poudriere
+
+Порт устанавливает файл конфигурации по умолчанию, [.filename]#/usr/local/etc/poudriere.conf#. Каждый параметр описан в этом файле конфигурации.
+
+Вот минимальный пример конфигурационного файла:
+
+[.programlisting]
+....
+ZPOOL=zroot
+BASEFS=/usr/local/poudriere
+DISTFILES_CACHE=/usr/ports/distfiles
+RESOLV_CONF=/etc/resolv.conf
+....
+
+`ZPOOL`::
+Имя пула хранения ZFS, который будет использовать poudriere. Должно быть указано в выводе команды `zpool status`.
+
+`BASEFS`::
+Корневая точка монтирования файловых систем poudriere. Эта запись приведет к тому, что poudriere смонтирует `tank/poudriere` в `/poudriere`.
+
+`DISTFILES_CACHE`::
+Определяет, где хранятся distfiles. В этом примере poudriere и хост используют общий каталог для хранения distfiles. Это позволяет избежать загрузки tарболов, которые уже присутствуют в системе. Пожалуйста, создайте этот каталог, если он ещё не существует, чтобы poudriere мог его найти.
+
+`RESOLV_CONF`::
+Используйте файл [.filename]#/etc/resolv.conf# хоста внутри клеток для DNS. Это необходимо, чтобы клетки могли разрешать URL-адреса distfiles при загрузке. Это не требуется при использовании прокси. Обратитесь к файлу конфигурации по умолчанию для настройки прокси.
+
+[[testing-poudriere-create-jails]]
+=== Создание клеток poudriere
+
+Создайте базовые клетки, которые poudriere будет использовать для сборки:
+
+[source, shell]
+....
+# poudriere jail -c -j 131Ramd64 -v 13.1-RELEASE -a amd64
+....
+
+Загрузите `13.1-RELEASE` для `amd64` с FTP-сервера, указанного в `FREEBSD_HOST` в [.filename]#poudriere.conf#, создайте ZFS-файловую систему `tank/poudriere/jails/131Ramd64`, смонтируйте её в [.filename]#/poudriere/jails/131Ramd64# и распакуйте тарболлы `13.1-RELEASE` в эту файловую систему.
+
+[source, shell]
+....
+# poudriere jail -c -j 12i386 -v stable/12 -a i386 -m git+https
+....
+
+Создайте `tank/poudriere/jails/12i386`, смонтируйте его на [.filename]#/poudriere/jails/12i386#, затем извлеките верхушку ветки Git `FreeBSD-12-STABLE` из `GIT_HOST` в [.filename]#poudriere.conf# или по умолчанию `git.freebsd.org` в [.filename]#/poudriere/jails/12i386/usr/src#, после чего выполните `buildworld` и установите его в [.filename]#/poudriere/jails/12i386#.
+
+[NOTE]
+====
+Хотя возможно собрать более новую версию FreeBSD на старой версии, в большинстве случаев она не запустится. Например, если требуется клетка на `stable/13`, то хост также должен работать на `stable/13`. Запуск `13.1-RELEASE` недостаточен.
+====
+
+[NOTE]
+====
+Для создания клетки poudriere для `14.0-CURRENT`:
+
+[source, shell]
+....
+# poudriere jail -c -j 14amd64 -v main -a amd64 -m git+https
+....
+
+Для запуска клетки `14.0-CURRENT` poudriere хостовая система должна работать под управлением `14.0-CURRENT`. В общем случае, более новые ядра могут собирать и запускать более старые клетки. Например, ядро `14.0-CURRENT` может собирать и запускать клетку `12.4-STABLE`, если параметр ядра `COMPAT_FREEBSD12` был скомпилирован (включен по умолчанию в конфигурации ядра [.filename]#GENERIC# `14.0-CURRENT`).
+====
+
+Список клеток, известных poudriere, можно вывести с помощью команды `poudriere jail -l`:
+
+[source, shell]
+....
+# poudriere jail -l
+JAILNAME VERSION ARCH METHOD
+131Ramd64 13.1-RELEASE amd64 ftp
+12i386 12.4-STABLE i386 git+https
+....
+
+[[testing-poudriere-maintaining-jails]]
+=== Обновление клеток poudriere
+
+Управление обновлениями очень простое. Команда:
+
+[source, shell]
+....
+# poudriere jail -u -j JAILNAME
+....
+
+обновляет указанную клетку до последней доступной версии. Для релизов FreeBSD обновление до последнего уровня исправлений с помощью man:freebsd-update[8]. Для версий FreeBSD, собранных из исходников, обновление до последней ревизии git в ветке.
+
+[TIP]
+====
+Для клеток, использующих метод `git+*`, полезно добавить `-J _КоличествоПараллельныхСборок_` для ускорения сборки за счёт увеличения количества параллельных задач компиляции. Например, если на машине для сборки 6 CPU, используйте:
+
+[source, shell]
+....
+# poudriere jail -u -J 6 -j JAILNAME
+....
+
+====
+
+[[testing-poudriere-ports-tree]]
+=== Настройка деревьев портов для использования с poudriere
+
+Существует несколько способов использования деревьев портов в poudriere. Наиболее простой способ — позволить poudriere создать для себя дерево портов по умолчанию, используя link:{handbook}mirrors/#git[Git]:
+
+[source, shell]
+....
+# poudriere ports -c -m git+https -B main
+....
+
+Эти команды создают `tank/poudriere/ports/default`, монтируют его в [.filename]#/poudriere/ports/default# и заполняют с помощью Git. После этого он включается в список известных деревьев портов:
+
+[source, shell]
+....
+# poudriere ports -l
+PORTSTREE METHOD TIMESTAMP PATH
+default git+https 2020-07-20 04:23:56 /poudriere/ports/default
+....
+
+[NOTE]
+====
+Обратите внимание, что дерево портов "default" является особым. Каждая из команд сборки, объяснённых далее, будет неявно использовать это дерево портов, если явно не указано иное. Чтобы использовать другое дерево, добавьте `-p _treename_` к командам.
+====
+
+Лучший способ работы с локальными изменениями для разработчика портов — использовать link:{handbook}mirrors/#git[Git]. Как и при создании клеток, можно использовать другой метод для создания дерева портов. Чтобы добавить дополнительное дерево портов для тестирования локальных изменений и разработки портов, предпочтительно использовать клонирование дерева через git (как описано выше).
+
+[[testing-poudriere-ports-tree-manual]]
+=== Использование управляемых вручную деревьев портов с помощью poudriere
-Если вы контрибутор портов, подумайте об установке poudriere. Это мощная система для построения и тестирования портов. Poudriere можно установить из package:ports-mgmt/poudriere[].
+В зависимости от рабочего процесса может быть крайне полезно использовать деревья портов, которые поддерживаются вручную. Например, если существует локальная копия дерева портов в [.filename]#/work/ports#, укажите poudriere на это расположение:
+
+[source, shell]
+....
+# poudriere ports -c -m null -M /work/ports -p development
+....
+
+Это будет указано в таблице известных деревьев:
+
+[source, shell]
+....
+# poudriere ports -l
+PORTSTREE METHOD TIMESTAMP PATH
+development null 2020-07-20 05:06:33 /work/ports
+....
+
+[NOTE]
+====
+Тире или `null` в колонке `METHOD` означает, что poudriere никогда не будет обновлять или изменять это дерево портов. Полностью на пользователе лежит ответственность за поддержку этого дерева, включая все локальные изменения, которые могут использоваться для тестирования новых портов и отправки исправлений.
+====
+
+[[testing-poudriere-ports-tree-updating]]
+=== Обновление деревьев портов poudriere
+
+Так же просто, как с клетками, описанными ранее:
+
+[source, shell]
+....
+# poudriere ports -u -p PORTSTREE
+....
+
+Обновит указанное _PORTSTREE_, дерево, указанное в выводе команды `poudriere -l`, до последней доступной ревизии на официальных серверах.
+
+[NOTE]
+====
+Деревья портов без метода, см. crossref:testing[testing-poudriere-ports-tree-manual, Использование вручную управляемых деревьев портов с помощью poudriere], не могут быть обновлены таким образом и должны обновляться вручную сопровождающим портов.
+====
+
+[[testing-poudriere-testing-ports]]
+=== Тестирование портов
+
+После настройки клеток и деревьев портов можно проверить результат изменений, внесенных участником в дерево портов.
+
+Например, локальные изменения в порте package:www/firefox[], расположенном в [.filename]#/work/ports/www/firefox#, можно протестировать в ранее созданной клетке 13.1-RELEASE:
+
+[source, shell]
+....
+# poudriere testport -j 131Ramd64 -p development -o www/firefox
+....
+
+Это соберет все зависимости Firefox. Если зависимость уже была собрана ранее и остается актуальной, будет установлен готовый пакет. Если для зависимости нет актуального пакета, он будет собран с параметрами по умолчанию в клетке. Затем будет собран сам Firefox.
+
+Полная сборка каждого порта записывается в [.filename]#/poudriere/data/logs/bulk/131Ri386-development/build-time/logs#.
+
+Имя каталога `131Ri386-development` формируется из аргументов `-j` и `-p` соответственно. Для удобства также поддерживается символическая ссылка [.filename]#/poudriere/data/logs/bulk/131Ri386-development/latest#. Эта ссылка указывает на последний каталог _времени сборки_. Также в этом каталоге находится файл [.filename]#index.html#, который позволяет наблюдать за процессом сборки через веб-браузер.
+
+По умолчанию poudriere очищает клетки и оставляет файлы журналов в указанных выше каталогах. Для упрощения анализа клетки можно оставить запущенными после сборки, добавив `-i` к `testport`:
+
+[source, shell]
+....
+# poudriere testport -j 131Ramd64 -p development -i -o www/firefox
+....
+
+После завершения сборки, независимо от того, была ли она успешной, в клетке предоставляется оболочка. Эта оболочка используется для дальнейшего исследования. Можно указать poudriere оставить клетку запущенной после завершения сборки с помощью `-I`. poudriere покажет команду для выполнения, когда клетка больше не нужна. Затем можно использовать man:jexec[8] для входа в неё:
+
+[source, shell]
+....
+# poudriere testport -j 131Ramd64 -p development -I -o www/firefox
+[...]
+====>> Installing local Pkg repository to /usr/local/etc/pkg/repos
+====>> Leaving jail 131Ramd64-development-n running, mounted at /poudriere/data/.m/131Ramd64-development/ref for interactive run testing
+====>> To enter jail: jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root
+====>> To stop jail: poudriere jail -k -j 131Ramd64 -p development
+# jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root
+# [do some stuff in the jail]
+# exit
+# poudriere jail -k -j 131Ramd64 -p development
+====>> Umounting file systems
+....
+
+Неотъемлемой частью инфраструктуры сборки портов FreeBSD является возможность настройки портов под личные предпочтения с помощью опций. Их также можно тестировать с помощью poudriere. Добавление опции `-c`:
+
+[source, shell]
+....
+# poudriere testport -j 131Ramd64 -c -o www/firefox
+....
+
+Представляет диалог настройки порта перед его сборкой. Порты, указанные после `-o` в формате `_категория_/_имя_порта_`, будут использовать указанные опции, все зависимости будут использовать опции по умолчанию. Тестирование зависимых портов с нестандартными опциями может быть выполнено с использованием наборов, см. crossref:testing[testing-poudriere-sets, Использование наборов].
+
+[TIP]
+====
+При тестировании портов, где файл [.filename]#pkg-plist# изменяется во время сборки в зависимости от выбранных опций, рекомендуется выполнить тестовый запуск со всеми выбранными опциями _и_ один без выбранных опций.
+====
+
+[[testing-poudriere-sets]]
+=== Использование наборов
+
+Для всех действий, связанных со сборкой, можно указать так называемый _набор_ с помощью `-z _имя_набора_`. Набор относится к полностью независимой сборке. Это позволяет, например, использовать `testport` с нестандартными параметрами для зависимых портов.
+
+Для использования наборов poudriere ожидает, что будет использована структура каталогов, аналогичная `PORT_DBDIR`, по умолчанию [.filename]#/var/db/ports#, в его конфигурационной директории. Этот каталог затем монтируется с помощью man:nullfs[5] в клетки, где собираются порты и их зависимости. Обычно подходящую начальную точку можно получить, рекурсивно скопировав существующий `PORT_DBDIR` в [.filename]#/usr/local/etc/poudriere.d/jailname-portname-setname-options#. Это подробно описано в man:poudriere[8]. Например, для тестирования package:www/firefox[] в определённом наборе с именем `devset`, добавьте параметр `-z devset` к команде `testport`:
+
+[source, shell]
+....
+# poudriere testport -j 131Ramd64 -p development -z devset -o www/firefox
+....
+
+Это проверит наличие этих каталогов в следующем порядке:
+
+* [.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-devset-options#
+* [.filename]#/usr/local/etc/poudriere.d/131Ramd64-devset-options#
+* [.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-options#
+* [.filename]#/usr/local/etc/poudriere.d/devset-options#
+* [.filename]#/usr/local/etc/poudriere.d/development-options#
+* [.filename]#/usr/local/etc/poudriere.d/131Ramd64-options#
+* [.filename]#/usr/local/etc/poudriere.d/options#
+
+Из этого списка poudriere man:nullfs[5] монтирует _первое существующее_ дерево каталогов в директорию [.filename]#/var/db/ports# сборных клеток. Таким образом, все пользовательские настройки используются для всех портов во время этого запуска `testport`.
+
+После предоставления структуры каталогов для набора можно изменить параметры для конкретного порта. Например:
+
+[source, shell]
+....
+# poudriere options -c www/firefox -z devset
+....
+
+Отображается диалог настройки package:www/firefox[], где можно редактировать параметры. Выбранные параметры сохраняются в набор `devset`.
+
+[NOTE]
+====
+poudriere очень гибок в настройке опций. poudriere можно настроить для конкретных клеток, деревьев портов и для нескольких портов одной командой. Подробности см. в man:poudriere[8].
+====
+
+[[testing-poudriere-make-conf]]
+=== Предоставление пользовательского файла [.filename]#make.conf#
+
+Подобно использованию наборов, poudriere также использует пользовательский [.filename]#make.conf#, если он предоставлен. Для этого не требуется специального аргумента командной строки. Вместо этого poudriere ищет существующие файлы, соответствующие схеме именования, производной от командной строки. Например:
+
+[source, shell]
+....
+# poudriere testport -j 131Ramd64 -p development -z devset -o www/firefox
+....
+
+заставляет poudriere проверять наличие этих файлов в следующем порядке:
+
+* [.filename]#/usr/local/etc/poudriere.d/make.conf#
+* [.filename]#/usr/local/etc/poudriere.d/devset-make.conf#
+* [.filename]#/usr/local/etc/poudriere.d/development-make.conf#
+* [.filename]#/usr/local/etc/poudriere.d/131Ramd64-make.conf#
+* [.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-make.conf#
+* [.filename]#/usr/local/etc/poudriere.d/131Ramd64-devset-make.conf#
+* [.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-devset-make.conf#
+
+В отличие от наборов, все найденные файлы будут добавлены, _в указанном порядке_, в один [.filename]#make.conf# внутри клеток сборки. Таким образом, можно задать общие переменные make, предназначенные для влияния на все сборки, в файле [.filename]#/usr/local/etc/poudriere.d/make.conf#. Специальные переменные, предназначенные только для определённых клеток или наборов, можно задать в специализированных файлах [.filename]#make.conf#, например, в [.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-devset-make.conf#.
+
+[[testing-poudriere-sets-perl]]
+.Использование [.filename]#make.conf# для изменения Perl по умолчанию
+[example]
+====
+
+Для сборки набора с нестандартной версией Perl, например, `5.20`, используя набор с именем `perl5-20`, создайте файл [.filename]#perl5-20-make.conf# со следующей строкой:
+
+[.programlisting]
+....
+DEFAULT_VERSIONS+= perl=5.20
+....
+[NOTE]
+****
+Обратите внимание на использование `+=`, чтобы содержимое переменной не было перезаписано, если она уже установлена в стандартном [.filename]#make.conf#.
+****
+
+====
+
+[[testing-poudriere-pruning-distfiles]]
+=== Удаление ненужных файлов дистрибутива
+
+poudriere имеет встроенный механизм для удаления устаревших файлов дистрибутива, которые больше не используются ни одним портом данного дерева. Команда
+
+[source, shell]
+....
+# poudriere distclean -p portstree
+....
+
+будет сканировать папку файлов дистрибутива, `DISTFILES_CACHE` в [.filename]#poudriere.conf#, сравнивая ее с деревом портов, указанным аргументом `-p _portstree_`, и запрашивать подтверждение на удаление этих файлов дистрибутива. Чтобы пропустить запрос и удалить все неиспользуемые файлы без подтверждения, можно добавить аргумент `-y`:
+
+[source, shell]
+....
+# poudriere distclean -p portstree -y
+....
+
+[[testing-debugging-ports]]
+== Отладка портов
+
+Иногда что-то идёт не так, и порт не работает во время выполнения. Фреймворк предоставляет некоторые средства для отладки портов. Эти вспомогательные инструменты ограничены, поскольку способ отладки порта во многом зависит от используемой технологии. Следующие переменные помогают в отладке портов:
+
+* `WITH_DEBUG`. Если установлено, порты собираются с отладочными символами.
+* `WITH_DEBUG_PORTS`. Указывает список портов, которые должны собираться с установленным `WITH_DEBUG`.
+* `DEBUG_FLAGS`. Используется для указания дополнительных флагов для `CFLAGS`. По умолчанию `-g`.
+
+Когда `WITH_DEBUG` установлен, глобально или для списка портов, результирующие бинарные файлы не лишаются символов.
+
+Эти переменные могут быть указаны в [.filename]#make.conf# или в командной строке:
+
+[source, shell]
+....
+# cd category/port && make -DWITH_DEBUG DEBUG_FLAGSS="-g -O0"
+....
+
+[NOTE]
+====
+Если порт собирается с использованием package:ports-mgmt/poudriere[], отладочные переменные должны быть указаны в [.filename]#make.conf# poudriere, а не в [.filename]#/etc/make.conf#. Подробности см. в документации package:ports-mgmt/poudriere[].
+====
-Для получения подробной информации посетите http://fossil.etoilebsd.net/poudriere[вебсайт Poudriere].
+Пожалуйста, обратитесь к отладочной информации в extref:{developers-handbook}tools[Руководстве разработчика, отладка] для получения более подробной информации о доступных инструментах отладки.
diff --git a/documentation/content/ru/books/porters-handbook/testing/_index.po b/documentation/content/ru/books/porters-handbook/testing/_index.po
new file mode 100644
index 0000000000..30ce20d0d6
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/testing/_index.po
@@ -0,0 +1,1685 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbooktesting_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:1
+#, no-wrap
+msgid "Testing a FreeBSD Port"
+msgstr "Тестирование порта FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:1
+#, no-wrap
+msgid "Chapter 10. Testing the Port"
+msgstr "Глава 10. Тестирование вашего порта"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:14
+#, no-wrap
+msgid "Testing the Port"
+msgstr "Тестирование порта"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:52
+#, no-wrap
+msgid "Running `make describe`"
+msgstr "Запуск `make describe`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:57
+msgid ""
+"Several of the FreeBSD port maintenance tools, such as man:portupgrade[1], "
+"rely on a database called [.filename]#/usr/ports/INDEX# which keeps track of "
+"such items as port dependencies. [.filename]#INDEX# is created by the top-"
+"level [.filename]#ports/Makefile# via `make index`, which descends into each "
+"port subdirectory and executes `make describe` there. Thus, if `make "
+"describe` fails in any port, no one can generate [.filename]#INDEX#, and "
+"many people will quickly become unhappy."
+msgstr ""
+"Некоторые утилиты FreeBSD для сопровождения портов, например, "
+"man:portupgrade[1], опираются на базу данных с именем [.filename]#/usr/ports/"
+"INDEX#, в которой отслеживаются такие характеристики портов, как их "
+"зависимости. Файл [.filename]#INDEX# создаётся при помощи [.filename]#ports/"
+"Makefile# верхнего уровня по команде `make index`, спускающейся в подкаталог "
+"каждого порта и выполняющей в нём `make describe`. Таким образом, если "
+"выполнение `make describe` с каким-либо портом завершится неудачно, то "
+"никому не удастся создать [.filename]#INDEX#, при этом много людей вскоре "
+"станут несчастны."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:62
+msgid ""
+"It is important to be able to generate this file no matter what options are "
+"present in [.filename]#make.conf#, so please avoid doing things such as "
+"using `.error` statements when (for instance) a dependency is not "
+"satisfied. (See crossref:porting-dads[dads-dot-error,Avoid Use of the "
+"`.error` Construct].)"
+msgstr ""
+"Возможность генерировать этот файл очень важна вне зависимости от того, "
+"какие параметры присутствуют в [.filename]#make.conf#, поэтому, пожалуйста, "
+"избегайте, таких вещей, как использование декларации `.error`, когда (к "
+"примеру) требования к зависимости не было удовлетворено. (Смотрите "
+"crossref:porting-dads[dads-dot-error, Избегайте использования конструкции "
+"`.error`].)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:66
+msgid ""
+"If `make describe` produces a string rather than an error message, "
+"everything is probably safe. See [.filename]#bsd.port.mk# for the meaning "
+"of the string produced."
+msgstr ""
+"Если `make describe` выдаёт строчку, а не ошибку, то для вас это пройдёт "
+"безболезненно. Обратитесь к файлу [.filename]#bsd.port.mk#, чтобы выяснить "
+"значение выдаваемых строк."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:68
+msgid ""
+"Also note that running a recent version of `portlint` (as specified in the "
+"next section) will cause `make describe` to be run automatically."
+msgstr ""
+"Также обратите внимание, что запуск актуальной версии `portlint` (как "
+"указано в следующем разделе) приведёт к автоматическому выполнению `make "
+"describe`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:70
+#, no-wrap
+msgid "Running `make test`"
+msgstr "Запуск `make test`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:76
+msgid ""
+"Even if the port builds fine, it is a good idea to ensure that the software "
+"correctly does what it is supposed to do. If the original upstream project "
+"provides tests along with the software, it is a good idea to run them and "
+"check everything works as expected."
+msgstr ""
+"Даже если порт успешно собирается, рекомендуется убедиться, что программа "
+"корректно выполняет свои функции. Если исходный проект предоставляет тесты "
+"вместе с программным обеспечением, рекомендуется их запустить и проверить, "
+"что всё работает, как ожидается."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:81
+msgid ""
+"A port can enable tests automatically by using the `TEST_TARGET` variable. "
+"When set, this variable contains the name of the testing target of the "
+"port. This is usually just `test` but other names include `tests`, `check` "
+"or for specific cases things like `run_tests.py`."
+msgstr ""
+"Порт может автоматически включить тесты, используя переменную `TEST_TARGET`. "
+"Когда эта переменная установлена, она содержит имя цели тестирования порта. "
+"Обычно это просто `test`, но другие варианты включают `tests`, `check` или, "
+"в специфических случаях, такие значения, как `run_tests.py`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:84
+msgid ""
+"In addition to the `TEST_TARGET` variable the framework provides the "
+"following variables to control the tests execution:"
+msgstr ""
+"В дополнение к переменной `TEST_TARGET` фреймворк предоставляет следующие "
+"переменные для управления выполнением тестов:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:86
+msgid "`TEST_WRKSRC` is the directory to do the tests in."
+msgstr "`TEST_WRKSRC` — это каталог для выполнения тестов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:87
+msgid ""
+"`TEST_ENV` contains additional variables to be passed to the test stage."
+msgstr ""
+"`TEST_ENV` содержит дополнительные переменные, которые передаются на этап "
+"тестирования."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:88
+msgid "`TEST_ARGS` contains any extra arguments passed to the test stage."
+msgstr ""
+"`TEST_ARGS` содержит любые дополнительные аргументы, переданные на этапе "
+"тестирования."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:91
+msgid ""
+"Examples of use of these variables can be found in package:cad/xyce[], "
+"package:www/libjwt[] and others."
+msgstr ""
+"Примеры использования этих переменных можно найти в package:cad/xyce[], "
+"package:www/libjwt[] и других."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:95
+msgid "Please make sure that tests do not break when updating a port."
+msgstr "Убедитесь, что тесты не ломаются при обновлении порта."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:99
+#, no-wrap
+msgid "Portclippy / Portfmt"
+msgstr "Portclippy / Portfmt"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:102
+msgid "Those tools come from package:ports-mgmt/portfmt[]."
+msgstr "Эти инструменты поставляются из пакета:ports-mgmt/portfmt[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:104
+msgid ""
+"Portclippy is a linter that checks if variables in the [.filename]#Makefile# "
+"are in the correct order according to crossref:order[porting-order,Order of "
+"Variables in Port Makefiles]."
+msgstr ""
+"Portclippy — это линтер, проверяющий, расположены ли переменные в файле "
+"[.filename]#Makefile# в правильном порядке согласно crossref:order[porting-"
+"order,Порядку переменных в Makefile портов]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:106
+msgid "Portfmt is a tool for automatically formatting [.filename]#Makefile#."
+msgstr ""
+"Portfmt — это инструмент для автоматического форматирования "
+"[.filename]#Makefile#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:108
+#, no-wrap
+msgid "Portlint"
+msgstr "Portlint"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:113
+msgid ""
+"Do check the port with crossref:quick-porting[porting-portlint,`portlint`] "
+"before submitting or committing it. `portlint` warns about many common "
+"errors, both functional and stylistic. For a new port, `portlint -A` is the "
+"most thorough; for an existing port, `portlint -C` is sufficient."
+msgstr ""
+"Проверьте свою работу командой crossref:quick-porting[porting-"
+"portlint,`portlint`] перед тем, как её отослать или перенести в дерево "
+"портов. `portlint` предупреждает вас о многих распространённых ошибках, как "
+"функциональных, так и стилистических. Для нового (или скопированного внутри "
+"хранилища) порта самым подходящим является запуск `portlint -A`; для уже "
+"существующего порта достаточно будет запустить `portlint -C`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:117
+msgid ""
+"Since `portlint` uses heuristics to try to figure out errors, it can produce "
+"false positive warnings. In addition, occasionally something that is "
+"flagged as a problem really cannot be done in any other way due to "
+"limitations in the ports framework. When in doubt, the best thing to do is "
+"ask on {freebsd-ports}."
+msgstr ""
+"Так как для обнаружения ошибок `portlint` использует эвристические методы, "
+"то им могут выдаваться и ошибочные предупреждения. Кроме того, время от "
+"времени нечто, отмечаемое как некорректность, из-за ограничений механизма "
+"создания портов не может быть сделано никак иначе. Если вы сомневаетесь, то "
+"лучше всего спросить в {freebsd-ports}."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:119
+#, no-wrap
+msgid "Port Tools"
+msgstr "Инструменты для работы с портами"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:122
+msgid ""
+"The package:ports-mgmt/porttools[] program is part of the Ports Collection."
+msgstr ""
+"Программа package:ports-mgmt/porttools[] входит в состав Коллекции Портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:128
+msgid ""
+"`port` is the front-end script, which can help simplify the testing job. "
+"Whenever a new port or an update to an existing one needs testing, use `port "
+"test` to test the port, including the crossref:testing[testing-"
+"portlint,`portlint`] checking. This command also detects and lists any "
+"files that are not listed in [.filename]#pkg-plist#. For example:"
+msgstr ""
+"`port` является сценарием переднего плана, который может упростить вам "
+"задачу тестирования. Если вы хотите проверить новый порт или обновить "
+"существующий, то вы можете использовать `port test` для проверки вашего "
+"порта, включая проверку crossref:testing[testing-portlint,`portlint`]. Эта "
+"команда также находит и отображает любые файлы, которые невключенные в "
+"[.filename]#pkg-plist#. Смотрите следующий пример:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:132
+#, no-wrap
+msgid "# port test /usr/ports/net/csup\n"
+msgstr "# port test /usr/ports/net/csup\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:135
+#, no-wrap
+msgid "`PREFIX` and `DESTDIR`"
+msgstr "`PREFIX` и `DESTDIR`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:140
+msgid ""
+"`PREFIX` determines where the port will be installed. It defaults to "
+"[.filename]#/usr/local#, but can be set by the user to a custom path like "
+"[.filename]#/opt#. The port must respect the value of this variable."
+msgstr ""
+"Переменная `PREFIX` определяет, куда будет установлен порт. По умолчанию это "
+"[.filename]#/usr/local#, но может меняться пользователем на собственный "
+"путь, такой как [.filename]#/opt#. В вашем порту значение этой переменной "
+"должно учитываться."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:145
+msgid ""
+"`DESTDIR`, if set by the user, determines the complete alternative "
+"environment, usually a jail or an installed system mounted somewhere other "
+"than [.filename]#/#. A port will actually install into [.filename]#DESTDIR/"
+"PREFIX#, and register with the package database in [.filename]#DESTDIR/var/"
+"db/pkg#. `DESTDIR` is handled automatically by the ports infrastructure "
+"with man:chroot[8]. There is no need for modifications or any extra care to "
+"write `DESTDIR`-compliant ports."
+msgstr ""
+"Если пользователь установил переменную `DESTDIR`, то она определяет полное "
+"альтернативное окружение, обычно, это jail или установленная система, "
+"смонтированная в месте, отличном от [.filename]#/#. На самом деле порт "
+"устанавливается в [.filename]#DESTDIR/PREFIX# и регистрируется в базе данных "
+"пакетов в [.filename]#DESTDIR/var/db/pkg#. Поскольку управление `DESTDIR` "
+"производится автоматически инфраструктурой портов с помощью man:chroot[8], "
+"вам не нужны никакие изменения или проявление особой осторожности при "
+"написании портов, совместымых с `DESTDIR`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:148
+msgid ""
+"The value of `PREFIX` will be set to `LOCALBASE` (defaulting to [.filename]#/"
+"usr/local#). If `USE_LINUX_PREFIX` is set, `PREFIX` will be `LINUXBASE` "
+"(defaulting to [.filename]#/compat/linux#)."
+msgstr ""
+"Значение переменной `PREFIX` будет установлено в `LOCALBASE` (по умолчанию "
+"[.filename]#/usr/local#). Если задана переменная `USE_LINUX_PREFIX`, то "
+"`PREFIX` примет значение `LINUXBASE` (по умолчанию [.filename]#/compat/"
+"linux#)."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:152
+msgid ""
+"Avoiding hard-coded [.filename]#/usr/local# paths in the source makes the "
+"port much more flexible and able to cater to the needs of other sites. "
+"Often, this can be accomplished by replacing occurrences of [.filename]#/usr/"
+"local# in the port's various [.filename]##Makefile##s with `${PREFIX}`. "
+"This variable is automatically passed down to every stage of the build and "
+"install processes."
+msgstr ""
+"Избегание явно прописываемых путей [.filename]#/usr/local# в исходном коде "
+"сделает порт гораздо более гибким и способным удовлетворить потребности "
+"других серверов. Часто этого можно добиться простой заменой строк "
+"[.filename]#/usr/local# в различных файлах [.filename]#Makefile# внутри "
+"порта на `${PREFIX}`. Эта переменная автоматически передаётся далее на "
+"каждом этапе построения и установки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:155
+msgid ""
+"Make sure the application is not installing things in [.filename]#/usr/"
+"local# instead of `PREFIX`. A quick test for such hard-coded paths is:"
+msgstr ""
+"Проверьте, что ваше приложение не устанавливает чего-либо в каталог "
+"[.filename]#/usr/local# вместо `PREFIX`. Наличие явно указанных путей можно "
+"быстро проверить следующим образом:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:159
+#, no-wrap
+msgid "% make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`\n"
+msgstr "% make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:162
+msgid ""
+"If anything is installed outside of `PREFIX`, the package creation process "
+"will complain that it cannot find the files."
+msgstr ""
+"Если что-то было установлено за пределами `PREFIX`, то процесс создания "
+"пакета сообщит об отсутствии файлов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:164
+msgid ""
+"In addition, it is worth checking the same with the stage directory support "
+"(see crossref:special[staging,Staging]):"
+msgstr ""
+"Это также стоит проверить с использованием поддержки каталога сборки "
+"(смотрите crossref:special[staging, Staging]):"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:168
+#, no-wrap
+msgid "% make stage && make check-plist && make stage-qa && make package\n"
+msgstr "% make stage && make check-plist && make stage-qa && make package\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:171
+msgid ""
+"`check-plist` checks for files missing from the plist, and files in the "
+"plist that are not installed by the port."
+msgstr ""
+"`check-plist` проверяет отсутствующие в plist файлы и файлы в plist, которые "
+"не установлены портом."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:172
+msgid ""
+"`stage-qa` checks for common problems like bad shebang, symlinks pointing "
+"outside the stage directory, setuid files, and non-stripped libraries..."
+msgstr ""
+"`stage-qa` проверяет наличие распространённых проблем, таких как "
+"неправильный шебанг (интерпретаторная строка в первой строке скрипта), "
+"символьные ссылки, указывающие за пределы stage-директории,файлы с setuid "
+"битом и библиотеки с отладочной информацией..."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:175
+msgid ""
+"These tests will not find hard-coded paths inside the port's files, nor will "
+"it verify that `LOCALBASE` is being used to correctly refer to files from "
+"other ports. The temporarily installed port in [.filename]#/var/tmp/`make "
+"-V PORTNAME`# must be tested for proper operation to make sure there are no "
+"problems with paths."
+msgstr ""
+"Эти тесты не обнаружат жёстко заданные пути в файлах порта, а также не "
+"проверят, что `LOCALBASE` используется корректно для ссылок на файлы из "
+"других портов. Временно установленный порт в [.filename]#/var/tmp/`make -V "
+"PORTNAME`# должен быть протестирован на корректную работу, чтобы убедиться в "
+"отсутствии проблем с путями."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:178
+msgid ""
+"`PREFIX` must not be set explicitly in a port's [.filename]#Makefile#. "
+"Users installing the port may have set `PREFIX` to a custom location, and "
+"the port must respect that setting."
+msgstr ""
+"`PREFIX` не должен быть явно установлен в [.filename]#Makefile# порта. "
+"Пользователи, устанавливающие порт, могут задать `PREFIX` в другом месте, и "
+"порт должен учитывать эту настройку."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:182
+msgid ""
+"Refer to programs and files from other ports with the variables mentioned "
+"above, not explicit pathnames. For instance, if the port requires a macro "
+"`PAGER` to have the full pathname of `less`, do not use a literal path of "
+"[.filename]#/usr/local/bin/less#. Instead, use `${LOCALBASE}`:"
+msgstr ""
+"Обращайтесь к программам и файлам из других портов с помощью упомянутых выше "
+"переменных, а не явных путей. Например, если порт требует, чтобы макрос "
+"`PAGER` содержал полный путь к `less`, не используйте явный путь "
+"[.filename]#/usr/local/bin/less#. Вместо этого используйте `${LOCALBASE}`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:186
+#, no-wrap
+msgid "-DPAGER=\\\"${LOCALBASE}/bin/less\\\"\n"
+msgstr "-DPAGER=\\\"${LOCALBASE}/bin/less\\\"\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:189
+msgid ""
+"The path with `LOCALBASE` is more likely to still work if the system "
+"administrator has moved the whole [.filename]#/usr/local# tree somewhere "
+"else."
+msgstr ""
+"Путь с `LOCALBASE` с большей вероятностью продолжит работать, если системный "
+"администратор переместил всё дерево [.filename]#/usr/local# в другое место."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:195
+msgid ""
+"All these tests are done automatically when running `poudriere testport` or "
+"`poudriere bulk -t`. It is highly recommended that every ports contributor "
+"install and test their ports with it. See crossref:testing[testing-"
+"poudriere, poudriere] for more information."
+msgstr ""
+"Все эти тесты выполняются автоматически при запуске `poudriere testport` или "
+"`poudriere bulk -t`. Настоятельно рекомендуется каждому участнику разработки "
+"портов устанавливать и тестировать свои порты с помощью этого инструмента. "
+"Дополнительную информацию можно найти в crossref:testing[testing-poudriere, "
+"poudriere]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:198
+#, no-wrap
+msgid "poudriere"
+msgstr "poudriere"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:202
+msgid ""
+"For a ports contributor, poudriere is one of the most important and helpful "
+"testing and build tools. Its main features include:"
+msgstr ""
+"Для контрибьютора портов poudriere является одним из самых важных и полезных "
+"инструментов для тестирования и сборки. Его основные возможности включают:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:204
+msgid ""
+"Bulk building of the entire ports tree, specific subsets of the ports tree, "
+"or a single port including its dependencies"
+msgstr ""
+"Массовая сборка всего дерева портов, определенных подмножеств дерева портов "
+"или отдельного порта с его зависимостями"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:205
+msgid "Automatic packaging of build results"
+msgstr "Автоматическая упаковка результатов сборки"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:206
+msgid "Generation of build log files per port"
+msgstr "Генерация файлов журнала сборки для каждого порта"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:207
+msgid "Providing a signed man:pkg[8] repository"
+msgstr "Предоставление подписанного репозитория man:pkg[8]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:208
+msgid ""
+"Testing of port builds before submitting a patch to the FreeBSD bug tracker "
+"or committing to the ports tree"
+msgstr ""
+"Тестирование сборки портов перед отправкой патча в трекер ошибок FreeBSD или "
+"внесением изменений в дерево портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:209
+msgid "Testing for successful ports builds using different options"
+msgstr ""
+"Тестирование успешных сборок портов с использованием различных параметров"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:212
+msgid ""
+"Because poudriere performs its building in a clean man:jail[8] environment "
+"and uses man:zfs[8] features, it has several advantages over traditional "
+"testing on the host system:"
+msgstr ""
+"Поскольку poudriere выполняет сборку в чистой среде man:jail[8] и использует "
+"возможности man:zfs[8], он имеет несколько преимуществ по сравнению с "
+"традиционным тестированием на основной системе:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:214
+msgid ""
+"No pollution of the host environment: No leftover files, no accidental "
+"removals, no changes of existing configuration files."
+msgstr ""
+"Отсутствие загрязнения основной среды: никаких оставшихся файлов, случайных "
+"удалений или изменений существующих конфигурационных файлов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:215
+msgid "Verify [.filename]#pkg-plist# for missing or superfluous entries"
+msgstr ""
+"Проверяет [.filename]#pkg-plist# на наличие отсутствующих или лишних записей"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:216
+msgid ""
+"Ports committers sometimes ask for a poudriere log alongside a patch "
+"submission to assess whether the patch is ready for integration into the "
+"ports tree"
+msgstr ""
+"Коммиттеры портов иногда запрашивают журнал poudriere вместе с отправкой "
+"патча, чтобы оценить, готов ли патч для интеграции в дерево портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:219
+msgid ""
+"It is also quite straightforward to set up and use, has no dependencies, and "
+"will run on any supported FreeBSD release. This section shows how to "
+"install, configure, and run poudriere as part of the normal workflow of a "
+"ports contributor."
+msgstr ""
+"Также его настройка и использование довольно просты, он не имеет "
+"зависимостей и будет работать в любой поддерживаемой версии FreeBSD. В этом "
+"разделе показано, как установить, настроить и запустить poudriere в рамках "
+"обычного рабочего процесса разработчика портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:224
+msgid ""
+"The examples in this section show a default file layout, as standard in "
+"FreeBSD. Substitute any local changes accordingly. The ports tree, "
+"represented by `${PORTSDIR}`, is located in [.filename]#/usr/ports#. Both `$"
+"{LOCALBASE}` and `${PREFIX}` are [.filename]#/usr/local# by default."
+msgstr ""
+"Примеры в этом разделе показывают стандартную структуру файлов, принятую в "
+"FreeBSD. Внесите соответствующие изменения, если у вас используются другие "
+"настройки. Дерево портов, обозначаемое как `${PORTSDIR}`, находится в "
+"[.filename]#/usr/ports#. По умолчанию `${LOCALBASE}` и `${PREFIX}` указывают "
+"на [.filename]#/usr/local#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:226
+#, no-wrap
+msgid "Installing poudriere"
+msgstr "Установка poudriere"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:230
+msgid ""
+"poudriere is available in the ports tree in package:ports-mgmt/poudriere[]. "
+"It can be installed using man:pkg[8] or from ports:"
+msgstr ""
+"poudriere доступен в дереве портов в пакете package:ports-mgmt/poudriere[]. "
+"Его можно установить с помощью man:pkg[8] или из портов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:234
+#, no-wrap
+msgid "# pkg install poudriere\n"
+msgstr "# pkg install poudriere\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:237
+msgid "or"
+msgstr "или"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:241
+#, no-wrap
+msgid "# make -C /usr/ports/ports-mgmt/poudriere install clean\n"
+msgstr "# make -C /usr/ports/ports-mgmt/poudriere install clean\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:252
+msgid ""
+"There is also a work-in-progress version of poudriere which will eventually "
+"become the next release. It is available in package:ports-mgmt/poudriere-"
+"devel[]. This development version is used for the official FreeBSD package "
+"builds, so it is well tested. It often has newer interesting features. A "
+"ports committer will want to use the development version because it is what "
+"is used in production, and has all the new features that will make sure "
+"everything is exactly right. A contributor will not necessarily need those "
+"as the most important fixes are backported to released version. The main "
+"reason for the use of the development version to build the official package "
+"is because it is faster, in a way that will shorten a full build from 18 "
+"hours to 17 hours when using a high end 32 CPU server with 128GB of RAM. "
+"Those optimizations will not matter a lot when building ports on a desktop "
+"machine."
+msgstr ""
+"Также существует версия poudriere в разработке, которая в конечном итоге "
+"станет следующим релизом. Она доступна в пакете:ports-mgmt/poudriere-"
+"devel[]. Эта версия используется для официальных сборок пакетов FreeBSD, "
+"поэтому она хорошо протестирована. В ней часто появляются новые интересные "
+"функции. Коммиттер портов захочет использовать версию в разработке, так как "
+"именно она используется в продакшене и содержит все новые функции, которые "
+"гарантируют, что всё будет работать идеально. Контрибьютору не обязательно "
+"нужны эти функции, так как наиболее важные исправления переносятся в "
+"выпущенную версию. Основная причина использования версии в разработке для "
+"сборки официальных пакетов заключается в её скорости — она позволяет "
+"сократить время полной сборки с 18 до 17 часов при использовании "
+"высокопроизводительного сервера с 32 CPU и 128 ГБ оперативной памяти. Эти "
+"оптимизации не будут столь значимы при сборке портов на настольном "
+"компьютере."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:254
+#, no-wrap
+msgid "Setting Up poudriere"
+msgstr "Настройка poudriere"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:258
+msgid ""
+"The port installs a default configuration file, [.filename]#/usr/local/etc/"
+"poudriere.conf#. Each parameter is documented in the configuration file."
+msgstr ""
+"Порт устанавливает файл конфигурации по умолчанию, [.filename]#/usr/local/"
+"etc/poudriere.conf#. Каждый параметр описан в этом файле конфигурации."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:260
+msgid "Here is a minimal example config file:"
+msgstr "Вот минимальный пример конфигурационного файла:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:267
+#, no-wrap
+msgid ""
+"ZPOOL=zroot\n"
+"BASEFS=/usr/local/poudriere\n"
+"DISTFILES_CACHE=/usr/ports/distfiles\n"
+"RESOLV_CONF=/etc/resolv.conf\n"
+msgstr ""
+"ZPOOL=zroot\n"
+"BASEFS=/usr/local/poudriere\n"
+"DISTFILES_CACHE=/usr/ports/distfiles\n"
+"RESOLV_CONF=/etc/resolv.conf\n"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:269
+#, no-wrap
+msgid "`ZPOOL`"
+msgstr "`ZPOOL`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:272
+msgid ""
+"The name of the ZFS storage pool which poudriere shall use. Must be listed "
+"in the output of `zpool status`."
+msgstr ""
+"Имя пула хранения ZFS, который будет использовать poudriere. Должно быть "
+"указано в выводе команды `zpool status`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:273
+#, no-wrap
+msgid "`BASEFS`"
+msgstr "`BASEFS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:276
+msgid ""
+"The root mount point for poudriere file systems. This entry will cause "
+"poudriere to mount `tank/poudriere` to `/poudriere`."
+msgstr ""
+"Корневая точка монтирования файловых систем poudriere. Эта запись приведет к "
+"тому, что poudriere смонтирует `tank/poudriere` в `/poudriere`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:277
+#, no-wrap
+msgid "`DISTFILES_CACHE`"
+msgstr "`DISTFILES_CACHE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:282
+msgid ""
+"Defines where distfiles are stored. In this example, poudriere and the host "
+"share the distfiles storage directory. This avoids downloading tarballs "
+"which are already present on the system. Please create this directory if it "
+"does not already exist so that poudriere can find it."
+msgstr ""
+"Определяет, где хранятся distfiles. В этом примере poudriere и хост "
+"используют общий каталог для хранения distfiles. Это позволяет избежать "
+"загрузки tарболов, которые уже присутствуют в системе. Пожалуйста, создайте "
+"этот каталог, если он ещё не существует, чтобы poudriere мог его найти."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:283
+#, no-wrap
+msgid "`RESOLV_CONF`"
+msgstr "`RESOLV_CONF`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:288
+msgid ""
+"Use the host [.filename]#/etc/resolv.conf# inside jails for DNS. This is "
+"needed so jails can resolve the URLs of distfiles when downloading. It is "
+"not needed when using a proxy. Refer to the default configuration file for "
+"proxy configuration."
+msgstr ""
+"Используйте файл [.filename]#/etc/resolv.conf# хоста внутри клеток для DNS. "
+"Это необходимо, чтобы клетки могли разрешать URL-адреса distfiles при "
+"загрузке. Это не требуется при использовании прокси. Обратитесь к файлу "
+"конфигурации по умолчанию для настройки прокси."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:290
+#, no-wrap
+msgid "Creating poudriere Jails"
+msgstr "Создание клеток poudriere"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:293
+msgid "Create the base jails which poudriere will use for building:"
+msgstr ""
+"Создайте базовые клетки, которые poudriere будет использовать для сборки:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:297
+#, no-wrap
+msgid "# poudriere jail -c -j 131Ramd64 -v 13.1-RELEASE -a amd64\n"
+msgstr "# poudriere jail -c -j 131Ramd64 -v 13.1-RELEASE -a amd64\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:302
+msgid ""
+"Fetch a `13.1-RELEASE` for `amd64` from the FTP server given by "
+"`FREEBSD_HOST` in [.filename]#poudriere.conf#, create the zfs file system "
+"`tank/poudriere/jails/131Ramd64`, mount it on [.filename]#/poudriere/jails/"
+"131Ramd64# and extract the `13.1-RELEASE` tarballs into this file system."
+msgstr ""
+"Загрузите `13.1-RELEASE` для `amd64` с FTP-сервера, указанного в "
+"`FREEBSD_HOST` в [.filename]#poudriere.conf#, создайте ZFS-файловую систему "
+"`tank/poudriere/jails/131Ramd64`, смонтируйте её в [.filename]#/poudriere/"
+"jails/131Ramd64# и распакуйте тарболлы `13.1-RELEASE` в эту файловую систему."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:306
+#, no-wrap
+msgid "# poudriere jail -c -j 12i386 -v stable/12 -a i386 -m git+https\n"
+msgstr "# poudriere jail -c -j 12i386 -v stable/12 -a i386 -m git+https\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:311
+msgid ""
+"Create `tank/poudriere/jails/12i386`, mount it on [.filename]#/poudriere/"
+"jails/12i386#, then check out the tip of the Git branch of `FreeBSD-12-"
+"STABLE` from `GIT_HOST` in [.filename]#poudriere.conf# or the default "
+"`git.freebsd.org` into [.filename]#/poudriere/jails/12i386/usr/src#, then "
+"complete a `buildworld` and install it into [.filename]#/poudriere/jails/"
+"12i386#."
+msgstr ""
+"Создайте `tank/poudriere/jails/12i386`, смонтируйте его на [.filename]#/"
+"poudriere/jails/12i386#, затем извлеките верхушку ветки Git `FreeBSD-12-"
+"STABLE` из `GIT_HOST` в [.filename]#poudriere.conf# или по умолчанию "
+"`git.freebsd.org` в [.filename]#/poudriere/jails/12i386/usr/src#, после чего "
+"выполните `buildworld` и установите его в [.filename]#/poudriere/jails/"
+"12i386#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:317
+msgid ""
+"While it is possible to build a newer version of FreeBSD on an older "
+"version, most of the time it will not run. For example, if a `stable/13` "
+"jail is needed, the host will have to run `stable/13` too. Running `13.1-"
+"RELEASE` is not enough."
+msgstr ""
+"Хотя возможно собрать более новую версию FreeBSD на старой версии, в "
+"большинстве случаев она не запустится. Например, если требуется клетка на "
+"`stable/13`, то хост также должен работать на `stable/13`. Запуск `13.1-"
+"RELEASE` недостаточен."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:322
+msgid "To create a poudriere jail for `14.0-CURRENT`:"
+msgstr "Для создания клетки poudriere для `14.0-CURRENT`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:326
+#, no-wrap
+msgid "# poudriere jail -c -j 14amd64 -v main -a amd64 -m git+https\n"
+msgstr "# poudriere jail -c -j 14amd64 -v main -a amd64 -m git+https\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:331
+msgid ""
+"In order to run a `14.0-CURRENT` poudriere jail the host must be running "
+"`14.0-CURRENT`. In general, newer kernels can build and run older jails. "
+"For instance, a `14.0-CURRENT` kernel can build and run a `12.4-STABLE` if "
+"the `COMPAT_FREEBSD12` kernel option was compiled in (on by default in `14.0-"
+"CURRENT`[.filename]#GENERIC# kernel config)."
+msgstr ""
+"Для запуска клетки `14.0-CURRENT` poudriere хостовая система должна работать "
+"под управлением `14.0-CURRENT`. В общем случае, более новые ядра могут "
+"собирать и запускать более старые клетки. Например, ядро `14.0-CURRENT` "
+"может собирать и запускать клетку `12.4-STABLE`, если параметр ядра "
+"`COMPAT_FREEBSD12` был скомпилирован (включен по умолчанию в конфигурации "
+"ядра [.filename]#GENERIC# `14.0-CURRENT`)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:334
+msgid ""
+"A list of jails currently known to poudriere can be shown with `poudriere "
+"jail -l`:"
+msgstr ""
+"Список клеток, известных poudriere, можно вывести с помощью команды "
+"`poudriere jail -l`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:341
+#, no-wrap
+msgid ""
+"# poudriere jail -l\n"
+"JAILNAME VERSION ARCH METHOD\n"
+"131Ramd64 13.1-RELEASE amd64 ftp\n"
+"12i386 12.4-STABLE i386 git+https\n"
+msgstr ""
+"# poudriere jail -l\n"
+"JAILNAME VERSION ARCH METHOD\n"
+"131Ramd64 13.1-RELEASE amd64 ftp\n"
+"12i386 12.4-STABLE i386 git+https\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:344
+#, no-wrap
+msgid "Keeping poudriere Jails Updated"
+msgstr "Обновление клеток poudriere"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:348
+msgid "Managing updates is very straightforward. The command:"
+msgstr "Управление обновлениями очень простое. Команда:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:352
+#, no-wrap
+msgid "# poudriere jail -u -j JAILNAME\n"
+msgstr "# poudriere jail -u -j JAILNAME\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:357
+msgid ""
+"updates the specified jail to the latest version available. For FreeBSD "
+"releases, update to the latest patchlevel with man:freebsd-update[8]. For "
+"FreeBSD versions built from source, update to the latest git revision in the "
+"branch."
+msgstr ""
+"обновляет указанную клетку до последней доступной версии. Для релизов "
+"FreeBSD обновление до последнего уровня исправлений с помощью man:freebsd-"
+"update[8]. Для версий FreeBSD, собранных из исходников, обновление до "
+"последней ревизии git в ветке."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:362
+msgid ""
+"For jails employing a `git+*` method, it is helpful to add `-J "
+"_NumberOfParallelBuildJobs_` to speed up the build by increasing the number "
+"of parallel compile jobs used. For example, if the building machine has 6 "
+"CPUs, use:"
+msgstr ""
+"Для клеток, использующих метод `git+*`, полезно добавить `-J "
+"_КоличествоПараллельныхСборок_` для ускорения сборки за счёт увеличения "
+"количества параллельных задач компиляции. Например, если на машине для "
+"сборки 6 CPU, используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:366
+#, no-wrap
+msgid "# poudriere jail -u -J 6 -j JAILNAME\n"
+msgstr "# poudriere jail -u -J 6 -j JAILNAME\n"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:371
+#, no-wrap
+msgid "Setting Up Ports Trees for Use with poudriere"
+msgstr "Настройка деревьев портов для использования с poudriere"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:375
+msgid ""
+"There are multiple ways to use ports trees in poudriere. The most "
+"straightforward way is to have poudriere create a default ports tree for "
+"itself, using link:{handbook}mirrors/#git[Git]:"
+msgstr ""
+"Существует несколько способов использования деревьев портов в poudriere. "
+"Наиболее простой способ — позволить poudriere создать для себя дерево портов "
+"по умолчанию, используя link:{handbook}mirrors/#git[Git]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:379
+#, no-wrap
+msgid "# poudriere ports -c -m git+https -B main\n"
+msgstr "# poudriere ports -c -m git+https -B main\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:383
+msgid ""
+"These commands create `tank/poudriere/ports/default`, mount it on "
+"[.filename]#/poudriere/ports/default#, and populate it using Git. Afterward "
+"it is included in the list of known ports trees:"
+msgstr ""
+"Эти команды создают `tank/poudriere/ports/default`, монтируют его в "
+"[.filename]#/poudriere/ports/default# и заполняют с помощью Git. После этого "
+"он включается в список известных деревьев портов:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:389
+#, no-wrap
+msgid ""
+"# poudriere ports -l\n"
+"PORTSTREE METHOD TIMESTAMP PATH\n"
+"default git+https 2020-07-20 04:23:56 /poudriere/ports/default\n"
+msgstr ""
+"# poudriere ports -l\n"
+"PORTSTREE METHOD TIMESTAMP PATH\n"
+"default git+https 2020-07-20 04:23:56 /poudriere/ports/default\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:396
+msgid ""
+"Note that the \"default\" ports tree is special. Each of the build commands "
+"explained later will implicitly use this ports tree unless specifically "
+"specified otherwise. To use another tree, add `-p _treename_` to the "
+"commands."
+msgstr ""
+"Обратите внимание, что дерево портов \"default\" является особым. Каждая из "
+"команд сборки, объяснённых далее, будет неявно использовать это дерево "
+"портов, если явно не указано иное. Чтобы использовать другое дерево, "
+"добавьте `-p _treename_` к командам."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:401
+msgid ""
+"The best way to deal with local modifications for a ports contributor is to "
+"use link:{handbook}mirrors/#git[Git]. As with the creation of jails, it is "
+"possible to use a different method for creating the ports tree. To add an "
+"additional ports tree for testing local modifications and ports development, "
+"checking out the tree via git (as described above) is preferable."
+msgstr ""
+"Лучший способ работы с локальными изменениями для разработчика портов — "
+"использовать link:{handbook}mirrors/#git[Git]. Как и при создании клеток, "
+"можно использовать другой метод для создания дерева портов. Чтобы добавить "
+"дополнительное дерево портов для тестирования локальных изменений и "
+"разработки портов, предпочтительно использовать клонирование дерева через "
+"git (как описано выше)."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:403
+#, no-wrap
+msgid "Using Manually Managed Ports Trees with poudriere"
+msgstr "Использование управляемых вручную деревьев портов с помощью poudriere"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:407
+msgid ""
+"Depending on the workflow, it can be extremely helpful to use ports trees "
+"which are maintained manually. For instance, if there is a local copy of "
+"the ports tree in [.filename]#/work/ports#, point poudriere to the location:"
+msgstr ""
+"В зависимости от рабочего процесса может быть крайне полезно использовать "
+"деревья портов, которые поддерживаются вручную. Например, если существует "
+"локальная копия дерева портов в [.filename]#/work/ports#, укажите poudriere "
+"на это расположение:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:411
+#, no-wrap
+msgid "# poudriere ports -c -m null -M /work/ports -p development\n"
+msgstr "# poudriere ports -c -m null -M /work/ports -p development\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:414
+msgid "This will be listed in the table of known trees:"
+msgstr "Это будет указано в таблице известных деревьев:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:420
+#, no-wrap
+msgid ""
+"# poudriere ports -l\n"
+"PORTSTREE METHOD TIMESTAMP PATH\n"
+"development null 2020-07-20 05:06:33 /work/ports\n"
+msgstr ""
+"# poudriere ports -l\n"
+"PORTSTREE METHOD TIMESTAMP PATH\n"
+"development null 2020-07-20 05:06:33 /work/ports\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:426
+msgid ""
+"The dash or `null` in the `METHOD` column means that poudriere will not "
+"update or change this ports tree, ever. It is completely up to the user to "
+"maintain this tree, including all local modifications that may be used for "
+"testing new ports and submitting patches."
+msgstr ""
+"Тире или `null` в колонке `METHOD` означает, что poudriere никогда не будет "
+"обновлять или изменять это дерево портов. Полностью на пользователе лежит "
+"ответственность за поддержку этого дерева, включая все локальные изменения, "
+"которые могут использоваться для тестирования новых портов и отправки "
+"исправлений."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:429
+#, no-wrap
+msgid "Keeping poudriere Ports Trees Updated"
+msgstr "Обновление деревьев портов poudriere"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:432
+msgid "As straightforward as with jails described earlier:"
+msgstr "Так же просто, как с клетками, описанными ранее:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:436
+#, no-wrap
+msgid "# poudriere ports -u -p PORTSTREE\n"
+msgstr "# poudriere ports -u -p PORTSTREE\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:439
+msgid ""
+"Will update the given _PORTSTREE_, one tree given by the output of "
+"`poudriere -l`, to the latest revision available on the official servers."
+msgstr ""
+"Обновит указанное _PORTSTREE_, дерево, указанное в выводе команды `poudriere "
+"-l`, до последней доступной ревизии на официальных серверах."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:444
+msgid ""
+"Ports trees without a method, see crossref:testing[testing-poudriere-ports-"
+"tree-manual, Using Manually Managed Ports Trees with poudriere], cannot be "
+"updated like this and must be updated manually by the porter."
+msgstr ""
+"Деревья портов без метода, см. crossref:testing[testing-poudriere-ports-tree-"
+"manual, Использование вручную управляемых деревьев портов с помощью "
+"poudriere], не могут быть обновлены таким образом и должны обновляться "
+"вручную сопровождающим портов."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:447
+#, no-wrap
+msgid "Testing Ports"
+msgstr "Тестирование портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:450
+msgid ""
+"After jails and ports trees have been set up, the result of a contributor's "
+"modifications to the ports tree can be tested."
+msgstr ""
+"После настройки клеток и деревьев портов можно проверить результат "
+"изменений, внесенных участником в дерево портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:452
+msgid ""
+"For example, local modifications to the package:www/firefox[] port located "
+"in [.filename]#/work/ports/www/firefox# can be tested in the previously "
+"created 13.1-RELEASE jail:"
+msgstr ""
+"Например, локальные изменения в порте package:www/firefox[], расположенном в "
+"[.filename]#/work/ports/www/firefox#, можно протестировать в ранее созданной "
+"клетке 13.1-RELEASE:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:456
+#, no-wrap
+msgid "# poudriere testport -j 131Ramd64 -p development -o www/firefox\n"
+msgstr "# poudriere testport -j 131Ramd64 -p development -o www/firefox\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:462
+msgid ""
+"This will build all dependencies of Firefox. If a dependency has been built "
+"previously and is still up-to-date, the pre-built package is installed. If "
+"a dependency has no up-to-date package, one will be built with default "
+"options in a jail. Then Firefox itself is built."
+msgstr ""
+"Это соберет все зависимости Firefox. Если зависимость уже была собрана ранее "
+"и остается актуальной, будет установлен готовый пакет. Если для зависимости "
+"нет актуального пакета, он будет собран с параметрами по умолчанию в клетке. "
+"Затем будет собран сам Firefox."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:464
+msgid ""
+"The complete build of every port is logged to [.filename]#/poudriere/data/"
+"logs/bulk/131Ri386-development/build-time/logs#."
+msgstr ""
+"Полная сборка каждого порта записывается в [.filename]#/poudriere/data/logs/"
+"bulk/131Ri386-development/build-time/logs#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:469
+msgid ""
+"The directory name `131Ri386-development` is derived from the arguments to `-"
+"j` and `-p`, respectively. For convenience, a symbolic link [.filename]#/"
+"poudriere/data/logs/bulk/131Ri386-development/latest# is also maintained. "
+"The link points to the latest _build-time_ directory. Also in this "
+"directory is an [.filename]#index.html# for observing the build process with "
+"a web browser."
+msgstr ""
+"Имя каталога `131Ri386-development` формируется из аргументов `-j` и `-p` "
+"соответственно. Для удобства также поддерживается символическая ссылка "
+"[.filename]#/poudriere/data/logs/bulk/131Ri386-development/latest#. Эта "
+"ссылка указывает на последний каталог _времени сборки_. Также в этом "
+"каталоге находится файл [.filename]#index.html#, который позволяет наблюдать "
+"за процессом сборки через веб-браузер."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:472
+msgid ""
+"By default, poudriere cleans up the jails and leaves log files in the "
+"directories mentioned above. To ease investigation, jails can be kept "
+"running after the build by adding `-i` to `testport`:"
+msgstr ""
+"По умолчанию poudriere очищает клетки и оставляет файлы журналов в указанных "
+"выше каталогах. Для упрощения анализа клетки можно оставить запущенными "
+"после сборки, добавив `-i` к `testport`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:476
+#, no-wrap
+msgid "# poudriere testport -j 131Ramd64 -p development -i -o www/firefox\n"
+msgstr "# poudriere testport -j 131Ramd64 -p development -i -o www/firefox\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:483
+msgid ""
+"After the build completes, and regardless of whether it was successful, a "
+"shell is provided within the jail. The shell is used to investigate "
+"further. poudriere can be told to leave the jail running after the build "
+"finishes with `-I`. poudriere will show the command to run when the jail is "
+"no longer needed. It is then possible to man:jexec[8] into it:"
+msgstr ""
+"После завершения сборки, независимо от того, была ли она успешной, в клетке "
+"предоставляется оболочка. Эта оболочка используется для дальнейшего "
+"исследования. Можно указать poudriere оставить клетку запущенной после "
+"завершения сборки с помощью `-I`. poudriere покажет команду для выполнения, "
+"когда клетка больше не нужна. Затем можно использовать man:jexec[8] для "
+"входа в неё:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:497
+#, no-wrap
+msgid ""
+"# poudriere testport -j 131Ramd64 -p development -I -o www/firefox\n"
+"[...]\n"
+"====>> Installing local Pkg repository to /usr/local/etc/pkg/repos\n"
+"====>> Leaving jail 131Ramd64-development-n running, mounted at /poudriere/data/.m/131Ramd64-development/ref for interactive run testing\n"
+"====>> To enter jail: jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root\n"
+"====>> To stop jail: poudriere jail -k -j 131Ramd64 -p development\n"
+"# jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root\n"
+"# [do some stuff in the jail]\n"
+"# exit\n"
+"# poudriere jail -k -j 131Ramd64 -p development\n"
+"====>> Umounting file systems\n"
+msgstr ""
+"# poudriere testport -j 131Ramd64 -p development -I -o www/firefox\n"
+"[...]\n"
+"====>> Installing local Pkg repository to /usr/local/etc/pkg/repos\n"
+"====>> Leaving jail 131Ramd64-development-n running, mounted at /poudriere/data/.m/131Ramd64-development/ref for interactive run testing\n"
+"====>> To enter jail: jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root\n"
+"====>> To stop jail: poudriere jail -k -j 131Ramd64 -p development\n"
+"# jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root\n"
+"# [do some stuff in the jail]\n"
+"# exit\n"
+"# poudriere jail -k -j 131Ramd64 -p development\n"
+"====>> Umounting file systems\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:502
+msgid ""
+"An integral part of the FreeBSD ports build infrastructure is the ability to "
+"tweak ports to personal preferences with options. These can be tested with "
+"poudriere as well. Adding the `-c`:"
+msgstr ""
+"Неотъемлемой частью инфраструктуры сборки портов FreeBSD является "
+"возможность настройки портов под личные предпочтения с помощью опций. Их "
+"также можно тестировать с помощью poudriere. Добавление опции `-c`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:506
+#, no-wrap
+msgid "# poudriere testport -j 131Ramd64 -c -o www/firefox\n"
+msgstr "# poudriere testport -j 131Ramd64 -c -o www/firefox\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:512
+msgid ""
+"Presents the port configuration dialog before the port is built. The ports "
+"given after `-o` in the format `_category_/_portname_` will use the "
+"specified options, all dependencies will use the default options. Testing "
+"dependent ports with non-default options can be accomplished using sets, see "
+"crossref:testing[testing-poudriere-sets, Using Sets]."
+msgstr ""
+"Представляет диалог настройки порта перед его сборкой. Порты, указанные "
+"после `-o` в формате `_категория_/_имя_порта_`, будут использовать указанные "
+"опции, все зависимости будут использовать опции по умолчанию. Тестирование "
+"зависимых портов с нестандартными опциями может быть выполнено с "
+"использованием наборов, см. crossref:testing[testing-poudriere-sets, "
+"Использование наборов]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:517
+msgid ""
+"When testing ports where [.filename]#pkg-plist# is altered during build "
+"depending on the selected options, it is recommended to perform a test run "
+"with all options selected _and_ one with all options deselected."
+msgstr ""
+"При тестировании портов, где файл [.filename]#pkg-plist# изменяется во время "
+"сборки в зависимости от выбранных опций, рекомендуется выполнить тестовый "
+"запуск со всеми выбранными опциями _и_ один без выбранных опций."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:520
+#, no-wrap
+msgid "Using Sets"
+msgstr "Использование наборов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:525
+msgid ""
+"For all actions involving builds, a so-called _set_ can be specified using `-"
+"z _setname_`. A set refers to a fully independent build. This allows, for "
+"instance, usage of `testport` with non-standard options for the dependent "
+"ports."
+msgstr ""
+"Для всех действий, связанных со сборкой, можно указать так называемый "
+"_набор_ с помощью `-z _имя_набора_`. Набор относится к полностью независимой "
+"сборке. Это позволяет, например, использовать `testport` с нестандартными "
+"параметрами для зависимых портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:531
+msgid ""
+"To use sets, poudriere expects an existing directory structure similar to "
+"`PORT_DBDIR`, defaults to [.filename]#/var/db/ports# in its configuration "
+"directory. This directory is then man:nullfs[5]-mounted into the jails "
+"where the ports and their dependencies are built. Usually a suitable "
+"starting point can be obtained by recursively copying the existing "
+"`PORT_DBDIR` to [.filename]#/usr/local/etc/poudriere.d/jailname-portname-"
+"setname-options#. This is described in detail in man:poudriere[8]. For "
+"instance, testing package:www/firefox[] in a specific set named `devset`, "
+"add the `-z devset` parameter to the `testport` command:"
+msgstr ""
+"Для использования наборов poudriere ожидает, что будет использована "
+"структура каталогов, аналогичная `PORT_DBDIR`, по умолчанию [.filename]#/var/"
+"db/ports#, в его конфигурационной директории. Этот каталог затем монтируется "
+"с помощью man:nullfs[5] в клетки, где собираются порты и их зависимости. "
+"Обычно подходящую начальную точку можно получить, рекурсивно скопировав "
+"существующий `PORT_DBDIR` в [.filename]#/usr/local/etc/poudriere.d/jailname-"
+"portname-setname-options#. Это подробно описано в man:poudriere[8]. "
+"Например, для тестирования package:www/firefox[] в определённом наборе с "
+"именем `devset`, добавьте параметр `-z devset` к команде `testport`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:535
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:579
+#, no-wrap
+msgid "# poudriere testport -j 131Ramd64 -p development -z devset -o www/firefox\n"
+msgstr "# poudriere testport -j 131Ramd64 -p development -z devset -o www/firefox\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:538
+msgid "This will look for the existence of these directories in this order:"
+msgstr "Это проверит наличие этих каталогов в следующем порядке:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:540
+msgid ""
+"[.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-devset-options#"
+msgstr ""
+"[.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-devset-options#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:541
+msgid "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-devset-options#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-devset-options#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:542
+msgid "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-options#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-options#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:543
+msgid "[.filename]#/usr/local/etc/poudriere.d/devset-options#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/devset-options#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:544
+msgid "[.filename]#/usr/local/etc/poudriere.d/development-options#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/development-options#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:545
+msgid "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-options#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-options#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:546
+msgid "[.filename]#/usr/local/etc/poudriere.d/options#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/options#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:549
+msgid ""
+"From this list, poudriere man:nullfs[5]-mounts the _first existing_ "
+"directory tree into the [.filename]#/var/db/ports# directory of the build "
+"jails. Hence, all custom options are used for all the ports during this run "
+"of `testport`."
+msgstr ""
+"Из этого списка poudriere man:nullfs[5] монтирует _первое существующее_ "
+"дерево каталогов в директорию [.filename]#/var/db/ports# сборных клеток. "
+"Таким образом, все пользовательские настройки используются для всех портов "
+"во время этого запуска `testport`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:552
+msgid ""
+"After the directory structure for a set is provided, the options for a "
+"particular port can be altered. For example:"
+msgstr ""
+"После предоставления структуры каталогов для набора можно изменить параметры "
+"для конкретного порта. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:556
+#, no-wrap
+msgid "# poudriere options -c www/firefox -z devset\n"
+msgstr "# poudriere options -c www/firefox -z devset\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:560
+msgid ""
+"The configuration dialog for package:www/firefox[] is shown, and options can "
+"be edited. The selected options are saved to the `devset` set."
+msgstr ""
+"Отображается диалог настройки package:www/firefox[], где можно редактировать "
+"параметры. Выбранные параметры сохраняются в набор `devset`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:566
+msgid ""
+"poudriere is very flexible in the option configuration. poudriere can be "
+"set for particular jails, ports trees, and for multiple ports by one "
+"command. Refer to man:poudriere[8] for details."
+msgstr ""
+"poudriere очень гибок в настройке опций. poudriere можно настроить для "
+"конкретных клеток, деревьев портов и для нескольких портов одной командой. "
+"Подробности см. в man:poudriere[8]."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:569
+#, no-wrap
+msgid "Providing a Custom [.filename]#make.conf# File"
+msgstr "Предоставление пользовательского файла [.filename]#make.conf#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:575
+msgid ""
+"Similar to using sets, poudriere will also use a custom "
+"[.filename]#make.conf# if it is provided. No special command line argument "
+"is necessary. Instead, poudriere looks for existing files matching a name "
+"scheme derived from the command line. For instance:"
+msgstr ""
+"Подобно использованию наборов, poudriere также использует пользовательский "
+"[.filename]#make.conf#, если он предоставлен. Для этого не требуется "
+"специального аргумента командной строки. Вместо этого poudriere ищет "
+"существующие файлы, соответствующие схеме именования, производной от "
+"командной строки. Например:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:582
+msgid ""
+"causes poudriere to check for the existence of these files in this order:"
+msgstr ""
+"заставляет poudriere проверять наличие этих файлов в следующем порядке:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:584
+msgid "[.filename]#/usr/local/etc/poudriere.d/make.conf#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/make.conf#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:585
+msgid "[.filename]#/usr/local/etc/poudriere.d/devset-make.conf#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/devset-make.conf#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:586
+msgid "[.filename]#/usr/local/etc/poudriere.d/development-make.conf#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/development-make.conf#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:587
+msgid "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-make.conf#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-make.conf#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:588
+msgid "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-make.conf#"
+msgstr ""
+"[.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-make.conf#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:589
+msgid "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-devset-make.conf#"
+msgstr "[.filename]#/usr/local/etc/poudriere.d/131Ramd64-devset-make.conf#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:590
+msgid ""
+"[.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-devset-"
+"make.conf#"
+msgstr ""
+"[.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-devset-"
+"make.conf#"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:594
+msgid ""
+"Unlike with sets, all of the found files will be appended, _in that order_, "
+"into one [.filename]#make.conf# inside the build jails. It is hence "
+"possible to have general make variables, intended to affect all builds in "
+"[.filename]#/usr/local/etc/poudriere.d/make.conf#. Special variables, "
+"intended to affect only certain jails or sets can be set in specialised "
+"[.filename]#make.conf# files, such as [.filename]#/usr/local/etc/poudriere.d/"
+"131Ramd64-development-devset-make.conf#."
+msgstr ""
+"В отличие от наборов, все найденные файлы будут добавлены, _в указанном "
+"порядке_, в один [.filename]#make.conf# внутри клеток сборки. Таким образом, "
+"можно задать общие переменные make, предназначенные для влияния на все "
+"сборки, в файле [.filename]#/usr/local/etc/poudriere.d/make.conf#. "
+"Специальные переменные, предназначенные только для определённых клеток или "
+"наборов, можно задать в специализированных файлах [.filename]#make.conf#, "
+"например, в [.filename]#/usr/local/etc/poudriere.d/131Ramd64-development-"
+"devset-make.conf#."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:596
+#, no-wrap
+msgid "Using [.filename]#make.conf# to Change Default Perl"
+msgstr "Использование [.filename]#make.conf# для изменения Perl по умолчанию"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:601
+msgid ""
+"To build a set with a non default Perl version, for example, `5.20`, using a "
+"set named `perl5-20`, create a [.filename]#perl5-20-make.conf# with this "
+"line:"
+msgstr ""
+"Для сборки набора с нестандартной версией Perl, например, `5.20`, используя "
+"набор с именем `perl5-20`, создайте файл [.filename]#perl5-20-make.conf# со "
+"следующей строкой:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:605
+#, no-wrap
+msgid "DEFAULT_VERSIONS+= perl=5.20\n"
+msgstr "DEFAULT_VERSIONS+= perl=5.20\n"
+
+#. type: delimited block * 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:609
+msgid ""
+"Note the use of `+=` so that if the variable is already set in the default "
+"[.filename]#make.conf# its content will not be overwritten."
+msgstr ""
+"Обратите внимание на использование `+=`, чтобы содержимое переменной не было "
+"перезаписано, если она уже установлена в стандартном [.filename]#make.conf#."
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:614
+#, no-wrap
+msgid "Pruning no Longer Needed Distfiles"
+msgstr "Удаление ненужных файлов дистрибутива"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:618
+msgid ""
+"poudriere comes with a built-in mechanism to remove outdated distfiles that "
+"are no longer used by any port of a given tree. The command"
+msgstr ""
+"poudriere имеет встроенный механизм для удаления устаревших файлов "
+"дистрибутива, которые больше не используются ни одним портом данного дерева. "
+"Команда"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:622
+#, no-wrap
+msgid "# poudriere distclean -p portstree\n"
+msgstr "# poudriere distclean -p portstree\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:627
+msgid ""
+"will scan the distfiles folder, `DISTFILES_CACHE` in "
+"[.filename]#poudriere.conf#, versus the ports tree given by the `-p "
+"_portstree_` argument and prompt for removal of those distfiles. To skip "
+"the prompt and remove all unused files unconditionally, the `-y` argument "
+"can be added:"
+msgstr ""
+"будет сканировать папку файлов дистрибутива, `DISTFILES_CACHE` в "
+"[.filename]#poudriere.conf#, сравнивая ее с деревом портов, указанным "
+"аргументом `-p _portstree_`, и запрашивать подтверждение на удаление этих "
+"файлов дистрибутива. Чтобы пропустить запрос и удалить все неиспользуемые "
+"файлы без подтверждения, можно добавить аргумент `-y`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:631
+#, no-wrap
+msgid "# poudriere distclean -p portstree -y\n"
+msgstr "# poudriere distclean -p portstree -y\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:634
+#, no-wrap
+msgid "Debugging ports"
+msgstr "Отладка портов"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:641
+msgid ""
+"Sometimes things go wrong and the port fails at run time. The framework "
+"provides some facilities to help in debugging ports. These helpers are "
+"limited since the way of debugging a port heavily depends on the technology "
+"used. The following variables help with debugging ports:"
+msgstr ""
+"Иногда что-то идёт не так, и порт не работает во время выполнения. Фреймворк "
+"предоставляет некоторые средства для отладки портов. Эти вспомогательные "
+"инструменты ограничены, поскольку способ отладки порта во многом зависит от "
+"используемой технологии. Следующие переменные помогают в отладке портов:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:643
+msgid "`WITH_DEBUG`. If set, ports are built with debugging symbols."
+msgstr ""
+"`WITH_DEBUG`. Если установлено, порты собираются с отладочными символами."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:644
+msgid ""
+"`WITH_DEBUG_PORTS`. Specifies a list of ports to be built with `WITH_DEBUG` "
+"set."
+msgstr ""
+"`WITH_DEBUG_PORTS`. Указывает список портов, которые должны собираться с "
+"установленным `WITH_DEBUG`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:645
+msgid ""
+"`DEBUG_FLAGS`. Used to specify additional flags to `CFLAGS`. Defaults to `-"
+"g`."
+msgstr ""
+"`DEBUG_FLAGS`. Используется для указания дополнительных флагов для `CFLAGS`. "
+"По умолчанию `-g`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:648
+msgid ""
+"When `WITH_DEBUG` is set, either globally or for a list of ports, the "
+"resulting binaries are not stripped."
+msgstr ""
+"Когда `WITH_DEBUG` установлен, глобально или для списка портов, "
+"результирующие бинарные файлы не лишаются символов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:651
+msgid ""
+"These variables can be specified in [.filename]#make.conf# or in the command "
+"line:"
+msgstr ""
+"Эти переменные могут быть указаны в [.filename]#make.conf# или в командной "
+"строке:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:655
+#, no-wrap
+msgid "# cd category/port && make -DWITH_DEBUG DEBUG_FLAGSS=\"-g -O0\"\n"
+msgstr "# cd category/port && make -DWITH_DEBUG DEBUG_FLAGSS=\"-g -O0\"\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:663
+msgid ""
+"If the port is built using package:ports-mgmt/poudriere[] the debugging "
+"variables must be specified in poudriere's [.filename]#make.conf# and not in "
+"[.filename]#/etc/make.conf#. Refer to package:ports-mgmt/poudriere[] "
+"documentation for details."
+msgstr ""
+"Если порт собирается с использованием package:ports-mgmt/poudriere[], "
+"отладочные переменные должны быть указаны в [.filename]#make.conf# "
+"poudriere, а не в [.filename]#/etc/make.conf#. Подробности см. в "
+"документации package:ports-mgmt/poudriere[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/testing/_index.adoc:667
+msgid ""
+"Please refer to the debugging information in the extref:{developers-handbook}"
+"tools[Developer's Handbook, debugging] for more details about the debugging "
+"tools available."
+msgstr ""
+"Пожалуйста, обратитесь к отладочной информации в extref:{developers-handbook}"
+"tools[Руководстве разработчика, отладка] для получения более подробной "
+"информации о доступных инструментах отладки."
+
+#~ msgid ""
+#~ "Since `portlint` uses heuristics to try to figure out errors, it can "
+#~ "produce false positive warnings. In addition, occasionally something "
+#~ "that is flagged as a problem really cannot be done in any other way due "
+#~ "to limitations in the ports framework. pass:[<!-- vale Vale.Terms = NO --"
+#~ ">] When in doubt, the best thing to do is ask on {freebsd-ports}. pass:"
+#~ "[<!-- vale Vale.Terms = YES -->]"
+#~ msgstr ""
+#~ "Так как для обнаружения ошибок `portlint` использует эвристические "
+#~ "методы, то им могут выдаваться и ошибочные предупреждения. Кроме того, "
+#~ "время от времени нечто, отмечаемое как некорректность, из-за ограничений "
+#~ "механизма создания портов не может быть сделано никак иначе. pass:[<!-- "
+#~ "vale Vale.Terms = NO -->] Если вы сомневаетесь, то лучше всего спросить в "
+#~ "{freebsd-ports}. pass:[<!-- vale Vale.Terms = YES -->]"
+
+#~ msgid ""
+#~ "updates the specified jail to the latest version available. pass:[<!-- "
+#~ "vale Vale.Terms = NO -->] For FreeBSD releases, update to the latest "
+#~ "patchlevel with man:freebsd-update[8]. pass:[<!-- vale Vale.Terms = YES "
+#~ "-->] For FreeBSD versions built from source, update to the latest git "
+#~ "revision in the branch."
+#~ msgstr ""
+#~ "обновляет указанную клетку до последней доступной версии. pass:[<!-- "
+#~ "vale Vale.Terms = NO -->] Для релизов FreeBSD обновление до последнего "
+#~ "уровня исправлений с помощью man:freebsd-update[8]. pass:[<!-- vale "
+#~ "Vale.Terms = YES -->] Для версий FreeBSD, собранных из исходников, "
+#~ "обновление до последней ревизии git в ветке."
diff --git a/documentation/content/ru/books/porters-handbook/upgrading/_index.adoc b/documentation/content/ru/books/porters-handbook/upgrading/_index.adoc
index 863bd4ad3b..c6f3b2a5bb 100644
--- a/documentation/content/ru/books/porters-handbook/upgrading/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/upgrading/_index.adoc
@@ -1,11 +1,13 @@
---
-title: Глава 10. Обновление отдельного порта
-prev: books/porters-handbook/testing
+description: 'Обновление порта FreeBSD'
next: books/porters-handbook/security
-showBookMenu: true
-weight: 10
params:
- path: "/books/porters-handbook/upgrading/"
+ path: /books/porters-handbook/upgrading/
+prev: books/porters-handbook/testing
+showBookMenu: true
+tags: ["upgrading", "port", "git"]
+title: 'Глава 11. Обновление отдельного порта'
+weight: 11
---
[[port-upgrading]]
@@ -16,7 +18,7 @@ params:
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 10
+:sectnumoffset: 11
:partnums:
:source-highlighter: rouge
:experimental:
@@ -46,32 +48,37 @@ toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
-Если вы заметите, что ваш порт устарел по сравнению с последней авторской версией, первым делом вы должны получить самую последнюю версия порта. Вы можете найти их в каталоге [.filename]#ports/ports-current# на зеркальных FTP-серверах FreeBSD. Однако если вы работаете с достаточно большим количеством портов, наверное, будет проще использовать Subversion или man:portsnap[8] для поддержания всей коллекции портов в актуальном состоянии, как это описано в extref:{handbook}ports/[Руководстве, ports-using]. К тому же это даст возможность отслеживать все зависимости портов.
+Когда порт не является самой последней версией, доступной от авторов, обновите локальную рабочую копию [.filename]#/usr/ports#. Возможно, порт уже был обновлён до новой версии.
-На следующем шаге необходимо выяснить, нет ожидает ли уже это обновление своей очереди. Для этого у вас есть две возможности. Существует интерфейс к http://www.FreeBSD.org/cgi/query-pr-summary.cgi?query[базе данных сообщений о проблемах FreeBSD (PR)] (известной также как `GNATS`) с поисковыми возможностями. Выберите из выпадающего списка `ports` и введите название порта.
+При работе с большим количеством портов, вероятно, будет проще использовать Git для поддержания всей коллекции портов в актуальном состоянии, как описано в extref:{handbook}ports[Использование коллекции портов, ports-using]. Это также позволит отслеживать все зависимости портов.
-Однако иногда люди забывают поместить название порта в поле Synopsis в точном виде. В таком случае вы можете воспользоваться <<portsmon,Системой мониторинга портов FreeBSD>> (которая известна также как `portsmon`). В рамках этой системы делается попытка классифицировать PR, касающиеся портов, по имени порта. Для поиска PR, относящихся к определённому порту, используйте механизм http://portsmon.FreeBSD.org/portoverview.py[Просмотра по одному порту].
+Следующий шаг — проверить, есть ли уже ожидающее обновление. Для этого есть два варианта. Доступен поиск в https://bugs.freebsd.org/search/[Сообщения о проблемах (PR) или база данных ошибок FreeBSD]. Выберите `Ports & Packages` в меню множественного выбора `Product` и введите название порта в поле `Summary`.
Если таких отложенных PR не существует, то на следующем этапе следует послать сообщение электронной почты человеку, поддерживающему порт, который выдаётся по команде `make maintainer`. Этот человек может уже работать над обновлением, или иметь причину не обновлять порт прямо сейчас (например, из-за проблем со стабильностью функционирования новой версии); вам нет нужды дублировать их работу. Заметьте, что неподдерживаемые порты перечисляются с адресом сопровождающего `ports@FreeBSD.org`, который является всего лишь адресом общего списка рассылки, так что отправка туда сообщений, скорее всего, в данном случае не поможет.
Если сопровождающий просит вас выполнить обновление, либо сопровождающий отсутствует, то у вас появляется шанс помочь FreeBSD, приготовив обновление самим! Пожалуйста, делайте это с использованием команды man:diff[1] в основной системе.
-Чтобы создать подходящий `diff` для одного патча, скопируйте файл, который нужно пропатчить, в _something.orig_, сохраните ваши изменения в _something_, а затем создайте ваше патч:
+Чтобы создать подходящий `diff` для одного патча, скопируйте файл, который нужно пропатчить, в [.filename]#something.orig#, сохраните ваши изменения в [.filename]#something#, а затем создайте ваше патч:
-[source,shell]
+[source, shell]
....
% diff -u something.orig something > something.diff
....
-В противном случае, вам следует воспользоваться методом `svn diff` (<<svn-diff>>), либо скопировать содержимое порта в отдельный каталог и применить результат рекурсивной команды man:diff[1] между новым и старым каталогами порта (например, если каталог с модифицированным портом называется [.filename]#superedit#, а оригинальный, совпадающий с находящимся в нашем дереве портов, [.filename]#superedit.bak#, то сохраните результат выполнения команды `diff -ruN superedit.bak superedit`). Подойдёт как унифицированный, так и контекстный дифф, однако коммиттеры портов обычно предпочитают унифицированный формат. Отметьте использование опции `-N`-это одобряемый способ заставить diff корректно работать в случае добавления новых файлов или удаления старых. Перед тем, как посылать нам diff-файл, пожалуйста, проверьте его, чтобы убедиться в значимости всех внесённых изменений. (В частности, убедитесь, что вы очистили рабочие каталоги командой `make clean`).
+В противном случае используйте метод `git diff` (crossref:upgrading[git-diff, Использование Git для создания патчей]) или скопируйте содержимое порта в совершенно другой каталог и используйте результат рекурсивного вывода man:diff[1] для новых и старых каталогов портов (например, если изменённый каталог порта называется [.filename]#superedit#, а исходный находится в нашем дереве как [.filename]#superedit.bak#, сохраните результат выполнения `diff -ruN superedit.bak superedit`). Подойдёт как унифицированный, так и контекстный diff, но коммиттеры портов обычно предпочитают унифицированные diff. Обратите внимание на использование опции `-N` — это общепринятый способ заставить diff корректно обрабатывать случаи добавления новых файлов или удаления старых. Перед отправкой diff, пожалуйста, проверьте вывод, чтобы убедиться, что все изменения имеют смысл. (В частности, не забудьте сначала очистить рабочие каталоги с помощью `make clean`).
-Для упрощения повторяющихся операций с файлами заплаток вы можете воспользоваться скриптом [.filename]#/usr/ports/Tools/scripts/patchtool.py#. Перед тем, как его запускать, пожалуйста, прочтите [.filename]#/usr/ports/Tools/scripts/README.patchtool#.
+[NOTE]
+====
+Если некоторые файлы были добавлены, скопированы, перемещены или удалены, добавьте эту информацию в отчёт о проблеме, чтобы коммиттер, принимающий патч, знал, какие команды man:git[1] нужно выполнить.
+====
+
+Для упрощения стандартных операций с файлами исправлений используйте `make makepatch`, как описано в crossref:slow-porting[slow-patch,Применение партчей]. Существуют и другие инструменты, например [.filename]#/usr/ports/Tools/scripts/patchtool.py#. Перед его использованием прочтите [.filename]#/usr/ports/Tools/scripts/README.patchtool#.
Если порт никем не поддерживается, а вы активно его используете, пожалуйста, подумайте над тем, чтобы добровольно стать его сопровождающим. Во FreeBSD имеется более 4000 портов без поддержки, и это как раз та область, где всегда нужны добровольцы. (Детальное описание обязанностей сопровождающего можно найти в разделе extref:{developers-handbook}[Руководства Разработчика, POLICIES-MAINTAINER].)
-Лучше всего послать нам diff-файл, включив его в посылку по команде man:send-pr[1] (категория `ports`). Если вы сопровождаете порт, обязательно поместите текст `[maintainer update]` в начале строки описания и задайте в поле "Class" вашего PR строчку `maintainer-update`. В противном случае в поле "Class" вашего PR должно быть указано `change-request`. Будьте добры, в сообщении отметьте все добавленные или удалённые файлы, так как они будут непосредственно указаны man:svn[1] при выполнении операции коммита. Если diff-файл имеет размер, превышающий 20КБ, сожмите его и обработайте утилитой uuencode; в противном случае просто включите его как есть в PR.
+Для отправки diff используйте https://bugs.freebsd.org/submit/[форму отправки багов] (продукт `Ports & Packages`, компонент `Individual Port(s)`). Всегда указывайте категорию с именем порта, за которой следует двоеточие и краткое описание проблемы. Примеры: `_категория/имя_порта_: _добавить опцию FOO_`; `_категория/имя_порта_: _Обновление до X.Y_`. Упоминайте в сообщении все добавленные или удалённые файлы, так как они должны быть явно указаны в man:git[1] при выполнении коммита. Не сжимайте и не кодируйте diff.
-Прежде чем пользоваться man:send-pr[1] просмотрите раздел о extref:{problem-reports}[Написании сообщений о проблемах, pr-writing] в статье о Сообщениях об ошибках. Он содержит гораздо больше информации о том, как писать полезные сообщения о проблемах.
+Прежде чем отправить сообщение об ошибке, ознакомьтесь с разделом extref:{problem-reports}[Написание отчета о проблеме, pr-writing] в статье "Отчеты о проблемах". В нем содержится гораздо больше информации о том, как составлять полезные отчеты о проблемах.
[IMPORTANT]
====
@@ -80,82 +87,100 @@ endif::[]
[NOTE]
====
-Повторяем еще раз - для посылки обновлений существующих портов используйте утилиту man:diff[1], а не man:shar[1]! Это поможет понять коммиттерам портов, что именно было изменено.
+Пожалуйста, используйте man:diff[1] или `git diff` для создания обновлений существующих портов. Другие форматы включают весь файл и делают невозможным увидеть только изменённые части. Если различия не включены, всё обновление может быть проигнорировано.
====
Теперь, когда вы проделали всё это, прочитайте о том, как поддерживать актуальное состояние, в crossref:keeping-up[keeping-up, Актуализация].
-[[svn-diff]]
-== Использование Subversion для создания патчей
+[[git-diff]]
+== Использование Git для создания патчей
-По возможности присылайте исправления в формате man:svn[1] diff. В таком виде их проще использовать по сравнению с разницей между "старым и новым" каталогами. Так проще увидеть изменения и обновить их в случае, если что-нибудь изменилось в Коллекции Портов с тех пор, как вы начали работу, либо если коммиттер просит что-то исправить.
+Когда это возможно, пожалуйста, предоставляйте патч или diff с помощью man:git[1]. Их проще обрабатывать, чем различия между «новым и старым» каталогом. Так легче увидеть, что изменилось, и обновить diff, если что-то было изменено в Коллекции портов с момента начала работы над ней, или если коммиттер просит что-то исправить. Кроме того, патч, созданный с помощью man:git-format-patch[1] или man:git-diff[1], можно легко применить с помощью man:git-am[1] или man:git-apply[1], что сэкономит время коммиттера. Наконец, git-патч, созданный man:git-format-patch[1], включает информацию об авторе и сообщения коммитов. Они будут записаны в лог репозитория, и это рекомендуемый способ отправки ваших изменений.
-[source,shell]
+[source, shell]
....
-% cd ~/my_wrkdir <.>
-% svn co https://svn0.us-west.FreeBSD.org/ports/head/dns/pdnsd <.>
-% cd ~/my_wrkdir/pdnsd
+% git clone https://git.FreeBSD.org/ports.git ~/my_wrkdir <.> <.>
+% cd ~/my_wrkdir
....
<.> Это может быть где угодно; место, в котором производится построение портов, не привязано к [.filename]#/usr/ports/#.
-<.> https://svn0.us-west.FreeBSD.org/[svn0.us-west.FreeBSD.org] - это общедоступный сервер Subversion. Выберите ближайшее зеркало и проверьте сертификат зеркалирующего сервера на наличие в перечне extref:{handbook}mirrors/[зеркалирующих сайтов Subversion, svn-mirrors].
+<.> https://git.FreeBSD.org/[git.FreeBSD.org] — это публичный Git-сервер FreeBSD. Подробнее см. в extref:{handbook}mirrors[таблице URL-репозиториев FreeBSD Git, git-url-table].
-Находясь в рабочем каталоге, вносите любые изменения, которые обычно делают для порта. При добавлении или удалении файла используйте `svn` для отслеживания этих изменений:
+Находясь в каталоге порта, внесите необходимые изменения. Если требуется добавить, переместить или удалить файл, используйте `git` для отслеживания этих изменений:
-[source,shell]
+[source, shell]
....
-% svn add new_file
-% svn remove deleted_file
+% git add new_file
+% git mv old_name new_name
+% git rm deleted_file
....
-Убедитесь, что вы проверяете порт в соответствии с рекомендуемым порядком проверки, описанным в crossref:quick-porting[porting-testing, Тестирование порта] и crossref:quick-porting[porting-portlint, Проверка вашего порта утилитой `portlint`].
+Убедитесь, что проверили порт, используя контрольный список в crossref:quick-porting[porting-testing,Тестирование порта] и crossref:quick-porting[porting-portlint,Проверка порта с помощью `portlint`].
+
+Также обновите ссылку на контрольную сумму в distinfo с помощью `make makesum`.
-[source,shell]
+Прежде чем создавать патч, загрузите последнюю версию репозитория и перебазируйте изменения поверх неё. Внимательно следите за выводом и следуйте ему. Если какие-либо файлы не удалось перебазировать, это означает, что исходные файлы изменились во время вашего редактирования, и конфликты необходимо разрешить вручную.
+
+[source, shell]
....
-% svn status
-% svn update <.>
+% git fetch origin main
+% git rebase origin/main
....
-<.> Эта команда попытается выполнить слияние различий между вашим патчем и текущей версией репозитория; внимательно проверьте полученный вывод. Буква перед названием каждого файла означает тип изменения, сделанного с этим файлом. Для получения полного списка смотрите <<table-svn-up>>.
+Проверьте изменения, подготовленные для исправления:
-[[table-svn-up]]
-.Префиксы файлов для Subversion Update
-[cols="1,1", frame="none"]
-|===
-|U
-|Файл обновлен без проблем.
+[source, shell]
+....
+% git status
+% git diff --staged
+....
-|G
-|Файл обновлен без проблем (вы увидите это только при работе с удаленным репозиторием).
+Последний шаг — создать унифицированный diff или патч изменений:
-|M
-|Файл с локальными изменениями, слияние выполнено без конфликтов.
+Для создания патча с помощью man:git-format-patch[1]:
+[source, shell]
+....
+% git checkout -b my_branch
+% git commit
+% git format-patch main
+....
-|C
-|Файл с локальными изменениями, слияние выполнено с конфликтами.
-|===
+Это создаст файл исправления с именем вида `0001-foo.patch`. Это предпочтительный способ, так как он включает идентификацию автора, а также удобнее, когда вы делаете серию изменений, которые не должны объединяться вместе.
-Если в результате выполнения `svn update` отображается `C`, то это означает, что что-то изменилось в репозитории Subversion и man:svn[1] не смогла выполнить слияние локальных изменений с полученными из репозитория. В любом случае никогда не помешает просмотреть изменения, поскольку man:svn[1] ничего не знает о том, каким должен быть порт, поэтому эта команда может (и, вероятно, будет) делать слияние тех изменений, которые не имеют смысла.
+Или для создания унифицированного diff с помощью man:git-diff[1]:
+[source, shell]
+....
+% git diff --staged > ../`make -VPKGNAME`.diff
+....
+Это создаст файл с различиями с именем вида `foo-1.2.3.diff`. Здесь `foo` заменяется на первую строку сообщения коммита, то есть на тему сообщения коммита.
-Последним шагом является создание унифицированного man:diff[1] для полученных изменений:
+После создания патча вы можете переключиться на основную ветку для начала других разработок.
+[source, shell]
+....
+% git checkout main
+....
-[source,shell]
+После принятия и слияния патча вы можете удалить локальную ветку разработки, если хотите:
+[source, shell]
....
-% svn diff > ../`basename ${PWD}`.diff
+% git branch -D my_branch
....
[NOTE]
====
-Информация о любых удаляемых файлов должна быть явным образом указана в PR, поскольку необходимость в удалении файла для коммиттера может быть неочевидна.
+Если файлы были добавлены, перемещены или удалены, укажите использованные команды man:git[1] `add`, `mv` и `rm`. Команда `git mv` должна быть выполнена до применения патча. Команды `git add` или `git rm` должны быть выполнены после применения патча.
====
-Присылайте свои патчи в соответствии с руководством, описанном в <<port-upgrading>>.
+Отправьте исправление, следуя extref:{problem-reports}[рекомендациям по отправке отчетов о проблемах, pr-writing].
[[moved-and-updating-files]]
-== Файлы [.filename]#UPDATING# и [.filename]#MOVED#
+== UPDATING и MOVED
+
+[[moved-and-updating-updating]]
+=== /usr/ports/UPDATING
-Если при обновлении порта требуются специальные шаги, такие как изменение файлов конфигурации или запуск специальной программы, то вам следует это задокументировать в файле [.filename]#/usr/ports/UPDATING#. Формат записи в этом файле приводится ниже:
+Если обновление порта требует специальных действий, таких как изменение конфигурационных файлов или запуск определённой программы, это должно быть задокументировано в данном файле. Формат записи в этом файле следующий:
[.programlisting]
....
@@ -166,17 +191,55 @@ YYYYMMDD:
Special instructions
....
-Если вы включаете точные инструкции portmaster или portupgrade, пожалуйста, убедитесь в правильном экранировании символов внутри командной оболочки.
+[TIP]
+====
-Файл [.filename]#/usr/ports/MOVED# содержит записи об удалённых или перемещённых портах. Каждая строка в этом файле состоит из полей: название порта, место, куда он был перемещён, дата и причина перемещения. Если порт был удалён, то поле, указывающее новое место, может оставаться незаполненным. Поля должны разделяться символом `|` (pipe), как это показано ниже:
+При включении точных инструкций для portmaster, portupgrade и/или pkg, убедитесь в правильности экранирования в shell. Например, _не_ используйте:
+
+[source, shell]
+....
+# pkg delete -g -f docbook-xml* docbook-sk* docbook[2345]??-* docbook-4*
+....
+
+Как показано, команда будет работать только с bourne-оболочками. Вместо этого используйте форму, приведённую ниже, которая будет работать как с bourne-оболочкой, так и с c-оболочкой:
+
+[source, shell]
+....
+# pkg delete -g -f docbook-xml\* docbook-sk\* docbook\[2345\]\?\?-\* docbook-4\*
+....
+
+====
+
+[NOTE]
+====
+Рекомендуется, чтобы строка AFFECTS содержала glob-выражение, соответствующее всем портам, затронутым записью, чтобы автоматизированные инструменты могли максимально легко её обработать. Если обновление касается всех существующих версий BIND 9, содержимое `AFFECTS` должно быть `users of dns/bind9*`, и оно _не должно_ быть `users of BIND 9`
+====
+
+[[moved-and-updating-moved]]
+=== /usr/ports/MOVED
+
+Этот файл используется для перечисления перемещённых или удалённых портов. Каждая строка в файле состоит из названия порта, места, куда порт был перемещён, даты и причины. Если порт был удалён, раздел с указанием места перемещения может быть оставлен пустым. Каждый раздел должен быть отделён символом `|` (вертикальная черта), например:
[.programlisting]
....
old name|new name (blank for deleted)|date of move|reason
....
-Дату следует вводить в формате `YYYY-MM-DD`. Новые записи следует добавлять в конец файла в хронологическом порядке.
+Дата должна быть введена в формате `ГГГГ-ММ-ДД`. Новые записи добавляются в конец списка, чтобы сохранить его в хронологическом порядке, при этом самая старая запись находится в начале списка.
+
+Если порт был удален, но затем восстановлен, удалите строку в этом файле, которая указывает, что он был удален.
+
+Если порт был переименован, а затем переименован обратно в исходное имя, добавьте новую запись с промежуточным именем для старого имени и удалите старую запись, чтобы не создавать цикл.
+
+[NOTE]
+====
+Любые изменения должны быть проверены с помощью `Tools/scripts/MOVEDlint.awk`.
-Если порт был перемещён, но в дальнейшем восстановлен на прежнем месте, удалите в этом файле строку, содержащую информацию о перемещении.
+Если используется каталог портов, отличный от [.filename]#/usr/ports#, следует указать:
-Полученные изменения можно проверить командой `Tools/scripts/MOVEDlint.awk`.
+[source, shell]
+....
+% cd /home/user/ports
+% env PORTSDIR=$PWD Tools/scripts/MOVEDlint.awk
+....
+====
diff --git a/documentation/content/ru/books/porters-handbook/upgrading/_index.po b/documentation/content/ru/books/porters-handbook/upgrading/_index.po
new file mode 100644
index 0000000000..66343c9f72
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/upgrading/_index.po
@@ -0,0 +1,688 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-09-05 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookupgrading_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:1
+#, no-wrap
+msgid "Upgrading a FreeBSD Port"
+msgstr "Обновление порта FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:1
+#, no-wrap
+msgid "Chapter 11. Upgrading a Port"
+msgstr "Глава 11. Обновление отдельного порта"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:14
+#, no-wrap
+msgid "Upgrading a Port"
+msgstr "Обновление отдельного порта"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:53
+msgid ""
+"When a port is not the most recent version available from the authors, "
+"update the local working copy of [.filename]#/usr/ports#. The port might "
+"have already been updated to the new version."
+msgstr ""
+"Когда порт не является самой последней версией, доступной от авторов, "
+"обновите локальную рабочую копию [.filename]#/usr/ports#. Возможно, порт уже "
+"был обновлён до новой версии."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:57
+msgid ""
+"When working with more than a few ports, it will probably be easier to use "
+"Git to keep the whole ports collection up-to-date, as described in extref:"
+"{handbook}ports[Using the Ports Collection, ports-using]. This will have "
+"the added benefit of tracking all the port's dependencies."
+msgstr ""
+"При работе с большим количеством портов, вероятно, будет проще использовать "
+"Git для поддержания всей коллекции портов в актуальном состоянии, как "
+"описано в extref:{handbook}ports[Использование коллекции портов, ports-"
+"using]. Это также позволит отслеживать все зависимости портов."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:62
+msgid ""
+"The next step is to see if there is an update already pending. To do this, "
+"there are two options. There is a searchable interface to the https://"
+"bugs.freebsd.org/search/[FreeBSD Problem Report (PR) or bug database]. "
+"Select `Ports & Packages` in the `Product` multiple select menu, and enter "
+"the name of the port in the `Summary` field."
+msgstr ""
+"Следующий шаг — проверить, есть ли уже ожидающее обновление. Для этого есть "
+"два варианта. Доступен поиск в https://bugs.freebsd.org/search/[Сообщения о "
+"проблемах (PR) или база данных ошибок FreeBSD]. Выберите `Ports & Packages` "
+"в меню множественного выбора `Product` и введите название порта в поле "
+"`Summary`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:66
+msgid ""
+"If there is no pending PR, the next step is to send an email to the port's "
+"maintainer, as shown by `make maintainer`. That person may already be "
+"working on an upgrade, or have a reason to not upgrade the port right now "
+"(because of, for example, stability problems of the new version), and there "
+"is no need to duplicate their work. Note that unmaintained ports are listed "
+"with a maintainer of `ports@FreeBSD.org`, which is just the general ports "
+"mailing list, so sending mail there probably will not help in this case."
+msgstr ""
+"Если таких отложенных PR не существует, то на следующем этапе следует "
+"послать сообщение электронной почты человеку, поддерживающему порт, который "
+"выдаётся по команде `make maintainer`. Этот человек может уже работать над "
+"обновлением, или иметь причину не обновлять порт прямо сейчас (например, из-"
+"за проблем со стабильностью функционирования новой версии); вам нет нужды "
+"дублировать их работу. Заметьте, что неподдерживаемые порты перечисляются с "
+"адресом сопровождающего `ports@FreeBSD.org`, который является всего лишь "
+"адресом общего списка рассылки, так что отправка туда сообщений, скорее "
+"всего, в данном случае не поможет."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:68
+msgid ""
+"If the maintainer asks you to do the upgrade or there is no maintainer, then "
+"help out FreeBSD by preparing the update! Please do this by using the "
+"man:diff[1] command in the base system."
+msgstr ""
+"Если сопровождающий просит вас выполнить обновление, либо сопровождающий "
+"отсутствует, то у вас появляется шанс помочь FreeBSD, приготовив обновление "
+"самим! Пожалуйста, делайте это с использованием команды man:diff[1] в "
+"основной системе."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:70
+msgid ""
+"To create a suitable `diff` for a single patch, copy the file that needs "
+"patching to [.filename]#something.orig#, save the changes to "
+"[.filename]#something# and then create the patch:"
+msgstr ""
+"Чтобы создать подходящий `diff` для одного патча, скопируйте файл, который "
+"нужно пропатчить, в [.filename]#something.orig#, сохраните ваши изменения в "
+"[.filename]#something#, а затем создайте ваше патч:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:74
+#, no-wrap
+msgid "% diff -u something.orig something > something.diff\n"
+msgstr "% diff -u something.orig something > something.diff\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:81
+msgid ""
+"Otherwise, either use the `git diff` method (crossref:upgrading[git-diff, "
+"Using Git to Make Patches]) or copy the contents of the port to an entire "
+"different directory and use the result of the recursive man:diff[1] output "
+"of the new and old ports directories (for example, if the modified port "
+"directory is called [.filename]#superedit# and the original is in our tree "
+"as [.filename]#superedit.bak#, then save the result of `diff -ruN "
+"superedit.bak superedit`). Either unified or context diff is fine, but port "
+"committers generally prefer unified diffs. Note the use of the `-N` option-"
+"this is the accepted way to force diff to properly deal with the case of new "
+"files being added or old files being deleted. Before sending us the diff, "
+"please examine the output to make sure all the changes make sense. (In "
+"particular, make sure to first clean out the work directories with `make "
+"clean`)."
+msgstr ""
+"В противном случае используйте метод `git diff` (crossref:upgrading[git-"
+"diff, Использование Git для создания патчей]) или скопируйте содержимое "
+"порта в совершенно другой каталог и используйте результат рекурсивного "
+"вывода man:diff[1] для новых и старых каталогов портов (например, если "
+"изменённый каталог порта называется [.filename]#superedit#, а исходный "
+"находится в нашем дереве как [.filename]#superedit.bak#, сохраните результат "
+"выполнения `diff -ruN superedit.bak superedit`). Подойдёт как "
+"унифицированный, так и контекстный diff, но коммиттеры портов обычно "
+"предпочитают унифицированные diff. Обратите внимание на использование опции "
+"`-N` — это общепринятый способ заставить diff корректно обрабатывать случаи "
+"добавления новых файлов или удаления старых. Перед отправкой diff, "
+"пожалуйста, проверьте вывод, чтобы убедиться, что все изменения имеют смысл. "
+"(В частности, не забудьте сначала очистить рабочие каталоги с помощью `make "
+"clean`)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:85
+msgid ""
+"If some files have been added, copied, moved, or removed, add this "
+"information to the problem report so that the committer picking up the patch "
+"will know what man:git[1] commands to run."
+msgstr ""
+"Если некоторые файлы были добавлены, скопированы, перемещены или удалены, "
+"добавьте эту информацию в отчёт о проблеме, чтобы коммиттер, принимающий "
+"патч, знал, какие команды man:git[1] нужно выполнить."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:90
+msgid ""
+"To simplify common operations with patch files, use `make makepatch` as "
+"described in crossref:slow-porting[slow-patch,Patching]. Other tools "
+"exists, like [.filename]#/usr/ports/Tools/scripts/patchtool.py#. Before "
+"using it, please read [.filename]#/usr/ports/Tools/scripts/README.patchtool#."
+msgstr ""
+"Для упрощения стандартных операций с файлами исправлений используйте `make "
+"makepatch`, как описано в crossref:slow-porting[slow-patch,Применение "
+"партчей]. Существуют и другие инструменты, например [.filename]#/usr/ports/"
+"Tools/scripts/patchtool.py#. Перед его использованием прочтите [.filename]#/"
+"usr/ports/Tools/scripts/README.patchtool#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:94
+msgid ""
+"If the port is unmaintained, and you are actively using it, please consider "
+"volunteering to become its maintainer. FreeBSD has over 4000 ports without "
+"maintainers, and this is an area where more volunteers are always needed. "
+"(For a detailed description of the responsibilities of maintainers, refer to "
+"the section in the extref:{developers-handbook}[Developer's Handbook, "
+"POLICIES-MAINTAINER].)"
+msgstr ""
+"Если порт никем не поддерживается, а вы активно его используете, пожалуйста, "
+"подумайте над тем, чтобы добровольно стать его сопровождающим. Во FreeBSD "
+"имеется более 4000 портов без поддержки, и это как раз та область, где "
+"всегда нужны добровольцы. (Детальное описание обязанностей сопровождающего "
+"можно найти в разделе extref:{developers-handbook}[Руководства Разработчика, "
+"POLICIES-MAINTAINER].)"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:100
+msgid ""
+"To submit the diff, use the https://bugs.freebsd.org/submit/[bug submit "
+"form] (product `Ports & Packages`, component `Individual Port(s)`). Always "
+"include the category with the port name, followed by colon, and brief "
+"description of the issue. Examples: `_category/portname_: _add FOO "
+"option_`; `_category/portname_: _Update to X.Y_`. Please mention any added "
+"or deleted files in the message, as they have to be explicitly specified to "
+"man:git[1] when doing a commit. Do not compress or encode the diff."
+msgstr ""
+"Для отправки diff используйте https://bugs.freebsd.org/submit/[форму "
+"отправки багов] (продукт `Ports & Packages`, компонент `Individual "
+"Port(s)`). Всегда указывайте категорию с именем порта, за которой следует "
+"двоеточие и краткое описание проблемы. Примеры: `_категория/имя_порта_: "
+"_добавить опцию FOO_`; `_категория/имя_порта_: _Обновление до X.Y_`. "
+"Упоминайте в сообщении все добавленные или удалённые файлы, так как они "
+"должны быть явно указаны в man:git[1] при выполнении коммита. Не сжимайте и "
+"не кодируйте diff."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:103
+msgid ""
+"Before submitting the bug, review the extref:{problem-reports}[Writing the "
+"problem report, pr-writing] section in the Problem Reports article. It "
+"contains far more information about how to write useful problem reports."
+msgstr ""
+"Прежде чем отправить сообщение об ошибке, ознакомьтесь с разделом extref:"
+"{problem-reports}[Написание отчета о проблеме, pr-writing] в статье \"Отчеты "
+"о проблемах\". В нем содержится гораздо больше информации о том, как "
+"составлять полезные отчеты о проблемах."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:109
+msgid ""
+"If the upgrade is motivated by security concerns or a serious fault in the "
+"currently committed port, please notify the {portmgr} to request immediate "
+"rebuilding and redistribution of the port's package. Unsuspecting users of "
+"`pkg` will otherwise continue to install the old version via `pkg install` "
+"for several weeks."
+msgstr ""
+"Если обновление вызвано соображениями информационной безопасности или "
+"наличием серьёзных ошибок в имеющемся порте, пожалуйста, оповестите "
+"{portmgr} о необходимости немедленного перепостроения и повторного "
+"распространения пакета данного порта. В противном случае ничего не "
+"подозревающие пользователи `pkg` будут продолжать устанавливать старую "
+"версию по команде `pkg install` в течение ещё нескольких недель."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:116
+msgid ""
+"Please use man:diff[1] or `git diff` to create updates to existing ports. "
+"Other formats include the whole file and make it impossible to see just what "
+"has changed. When diffs are not included, the entire update might be "
+"ignored."
+msgstr ""
+"Пожалуйста, используйте man:diff[1] или `git diff` для создания обновлений "
+"существующих портов. Другие форматы включают весь файл и делают невозможным "
+"увидеть только изменённые части. Если различия не включены, всё обновление "
+"может быть проигнорировано."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:119
+msgid ""
+"Now that all of that is done, read about how to keep up-to-date in "
+"crossref:keeping-up[keeping-up,Keeping Up]."
+msgstr ""
+"Теперь, когда вы проделали всё это, прочитайте о том, как поддерживать "
+"актуальное состояние, в crossref:keeping-up[keeping-up, Актуализация]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:121
+#, no-wrap
+msgid "Using Git to Make Patches"
+msgstr "Использование Git для создания патчей"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:130
+msgid ""
+"When possible, please submit a man:git[1] patch or diff. They are easier to "
+"handle than diffs between \"new and old\" directories. It is easier to see "
+"what has changed, and to update the diff if something was modified in the "
+"Ports Collection since the work on it began, or if the committer asks for "
+"something to be fixed. Also, a patch generated with man:git-format-patch[1] "
+"or man:git-diff[1] can be easily applied with man:git-am[1] or man:git-"
+"apply[1] and will save some time for the committer. Finally, the git patch "
+"generated by man:git-format-patch[1] includes your author information and "
+"commit messages. These will be recorded in the log of the repository and "
+"this is the recommended way to submit your changes."
+msgstr ""
+"Когда это возможно, пожалуйста, предоставляйте патч или diff с помощью "
+"man:git[1]. Их проще обрабатывать, чем различия между «новым и старым» "
+"каталогом. Так легче увидеть, что изменилось, и обновить diff, если что-то "
+"было изменено в Коллекции портов с момента начала работы над ней, или если "
+"коммиттер просит что-то исправить. Кроме того, патч, созданный с помощью "
+"man:git-format-patch[1] или man:git-diff[1], можно легко применить с помощью "
+"man:git-am[1] или man:git-apply[1], что сэкономит время коммиттера. Наконец, "
+"git-патч, созданный man:git-format-patch[1], включает информацию об авторе и "
+"сообщения коммитов. Они будут записаны в лог репозитория, и это "
+"рекомендуемый способ отправки ваших изменений."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:135
+#, no-wrap
+msgid ""
+"% git clone https://git.FreeBSD.org/ports.git ~/my_wrkdir <.> <.>\n"
+"% cd ~/my_wrkdir\n"
+msgstr ""
+"% git clone https://git.FreeBSD.org/ports.git ~/my_wrkdir <.> <.>\n"
+"% cd ~/my_wrkdir\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:138
+msgid ""
+"This can be anywhere, of course. Building ports is not limited to within "
+"[.filename]#/usr/ports/#."
+msgstr ""
+"Это может быть где угодно; место, в котором производится построение портов, "
+"не привязано к [.filename]#/usr/ports/#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:140
+msgid ""
+"https://git.FreeBSD.org/[git.FreeBSD.org] is the FreeBSD public Git server. "
+"See extref:{handbook}mirrors[FreeBSD Git Repository URL Table, git-url-"
+"table] for more information."
+msgstr ""
+"https://git.FreeBSD.org/[git.FreeBSD.org] — это публичный Git-сервер "
+"FreeBSD. Подробнее см. в extref:{handbook}mirrors[таблице URL-репозиториев "
+"FreeBSD Git, git-url-table]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:143
+msgid ""
+"While in the port directory, make any changes that are needed. If adding, "
+"moving, or removing a file, use `git` to track these changes:"
+msgstr ""
+"Находясь в каталоге порта, внесите необходимые изменения. Если требуется "
+"добавить, переместить или удалить файл, используйте `git` для отслеживания "
+"этих изменений:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:149
+#, no-wrap
+msgid ""
+"% git add new_file\n"
+"% git mv old_name new_name\n"
+"% git rm deleted_file\n"
+msgstr ""
+"% git add new_file\n"
+"% git mv old_name new_name\n"
+"% git rm deleted_file\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:152
+msgid ""
+"Make sure to check the port using the checklist in crossref:quick-"
+"porting[porting-testing,Testing the Port] and crossref:quick-porting[porting-"
+"portlint,Checking the Port with `portlint`]."
+msgstr ""
+"Убедитесь, что проверили порт, используя контрольный список в crossref:quick-"
+"porting[porting-testing,Тестирование порта] и crossref:quick-porting[porting-"
+"portlint,Проверка порта с помощью `portlint`]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:154
+msgid "Also, update the checksum reference in distinfo with `make makesum`."
+msgstr ""
+"Также обновите ссылку на контрольную сумму в distinfo с помощью `make "
+"makesum`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:158
+msgid ""
+"Before making the patch, fetch the latest repository and rebase the changes "
+"on top of it. Watch and follow the output carefully. If any of the files "
+"failed to rebase, it means that the upstream files changed while you were "
+"editing the same file, and the conflicts need to be resolved manually."
+msgstr ""
+"Прежде чем создавать патч, загрузите последнюю версию репозитория и "
+"перебазируйте изменения поверх неё. Внимательно следите за выводом и "
+"следуйте ему. Если какие-либо файлы не удалось перебазировать, это означает, "
+"что исходные файлы изменились во время вашего редактирования, и конфликты "
+"необходимо разрешить вручную."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:163
+#, no-wrap
+msgid ""
+"% git fetch origin main\n"
+"% git rebase origin/main\n"
+msgstr ""
+"% git fetch origin main\n"
+"% git rebase origin/main\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:166
+msgid "Check the changes staged for the patch:"
+msgstr "Проверьте изменения, подготовленные для исправления:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:171
+#, no-wrap
+msgid ""
+"% git status\n"
+"% git diff --staged\n"
+msgstr ""
+"% git status\n"
+"% git diff --staged\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:174
+msgid "The last step is to make an unified diff or patch of the changes:"
+msgstr "Последний шаг — создать унифицированный diff или патч изменений:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:176
+msgid "To generate a patch with man:git-format-patch[1]:"
+msgstr "Для создания патча с помощью man:git-format-patch[1]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:181
+#, no-wrap
+msgid ""
+"% git checkout -b my_branch\n"
+"% git commit\n"
+"% git format-patch main\n"
+msgstr ""
+"% git checkout -b my_branch\n"
+"% git commit\n"
+"% git format-patch main\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:187
+msgid ""
+"This will generate a patch named like `0001-foo.patch`. This is the "
+"preferred way as it would include author identity, and it is also easier "
+"when you are making a series of changes that are not meant to be squashed "
+"together."
+msgstr ""
+"Это создаст файл исправления с именем вида `0001-foo.patch`. Это "
+"предпочтительный способ, так как он включает идентификацию автора, а также "
+"удобнее, когда вы делаете серию изменений, которые не должны объединяться "
+"вместе."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:189
+msgid "Alternatively, to generate an unified diff with man:git-diff[1]:"
+msgstr "Или для создания унифицированного diff с помощью man:git-diff[1]:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:192
+#, no-wrap
+msgid "% git diff --staged > ../`make -VPKGNAME`.diff\n"
+msgstr "% git diff --staged > ../`make -VPKGNAME`.diff\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:195
+msgid ""
+"This will generate a diff named like `foo-1.2.3.diff`. Where `foo` is "
+"replaced with the first line of the commit message, i.e., the subject of the "
+"commit message."
+msgstr ""
+"Это создаст файл с различиями с именем вида `foo-1.2.3.diff`. Здесь `foo` "
+"заменяется на первую строку сообщения коммита, то есть на тему сообщения "
+"коммита."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:197
+msgid ""
+"After patch has been created, you can switch to the main branch for starting "
+"other developments."
+msgstr ""
+"После создания патча вы можете переключиться на основную ветку для начала "
+"других разработок."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:200
+#, no-wrap
+msgid "% git checkout main\n"
+msgstr "% git checkout main\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:203
+msgid ""
+"Once the patch is accepted and merged, you can delete the local development "
+"branch if you want:"
+msgstr ""
+"После принятия и слияния патча вы можете удалить локальную ветку разработки, "
+"если хотите:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:206
+#, no-wrap
+msgid "% git branch -D my_branch\n"
+msgstr "% git branch -D my_branch\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:213
+msgid ""
+"If files have been added, moved, or removed, include the man:git[1] `add`, "
+"`mv`, and `rm` commands that were used. `git mv` must be run before the "
+"patch can be applied. `git add` or `git rm` must be run after the patch is "
+"applied."
+msgstr ""
+"Если файлы были добавлены, перемещены или удалены, укажите использованные "
+"команды man:git[1] `add`, `mv` и `rm`. Команда `git mv` должна быть "
+"выполнена до применения патча. Команды `git add` или `git rm` должны быть "
+"выполнены после применения патча."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:216
+msgid ""
+"Send the patch following the extref:{problem-reports}[problem report "
+"submission guidelines, pr-writing]."
+msgstr ""
+"Отправьте исправление, следуя extref:{problem-reports}[рекомендациям по "
+"отправке отчетов о проблемах, pr-writing]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:218
+#, no-wrap
+msgid "UPDATING and MOVED"
+msgstr "UPDATING и MOVED"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:221
+#, no-wrap
+msgid "/usr/ports/UPDATING"
+msgstr "/usr/ports/UPDATING"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:225
+msgid ""
+"If upgrading the port requires special steps like changing configuration "
+"files or running a specific program, it must be documented in this file. "
+"The format of an entry in this file is:"
+msgstr ""
+"Если обновление порта требует специальных действий, таких как изменение "
+"конфигурационных файлов или запуск определённой программы, это должно быть "
+"задокументировано в данном файле. Формат записи в этом файле следующий:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:231
+#, no-wrap
+msgid ""
+"YYYYMMDD:\n"
+" AFFECTS: users of portcategory/portname\n"
+" AUTHOR: Your name <Your email address>\n"
+msgstr ""
+"YYYYMMDD:\n"
+" AFFECTS: users of portcategory/portname\n"
+" AUTHOR: Your name <Your email address>\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:233
+#, no-wrap
+msgid " Special instructions\n"
+msgstr " Special instructions\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:240
+msgid ""
+"When including exact portmaster, portupgrade, and/or pkg instructions, "
+"please make sure to get the shell escaping right. For example, do _not_ use:"
+msgstr ""
+"При включении точных инструкций для portmaster, portupgrade и/или pkg, "
+"убедитесь в правильности экранирования в shell. Например, _не_ используйте:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:244
+#, no-wrap
+msgid "# pkg delete -g -f docbook-xml* docbook-sk* docbook[2345]??-* docbook-4*\n"
+msgstr "# pkg delete -g -f docbook-xml* docbook-sk* docbook[2345]??-* docbook-4*\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:248
+msgid ""
+"As shown, the command will only work with bourne shells. Instead, use the "
+"form shown below, which will work with both bourne shell and c-shell:"
+msgstr ""
+"Как показано, команда будет работать только с bourne-оболочками. Вместо "
+"этого используйте форму, приведённую ниже, которая будет работать как с "
+"bourne-оболочкой, так и с c-оболочкой:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:252
+#, no-wrap
+msgid "# pkg delete -g -f docbook-xml\\* docbook-sk\\* docbook\\[2345\\]\\?\\?-\\* docbook-4\\*\n"
+msgstr "# pkg delete -g -f docbook-xml\\* docbook-sk\\* docbook\\[2345\\]\\?\\?-\\* docbook-4\\*\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:260
+msgid ""
+"It is recommended that the AFFECTS line contains a glob matching all the "
+"ports affected by the entry so that automated tools can parse it as easily "
+"as possible. If an update concerns all the existing BIND 9 versions the "
+"`AFFECTS` content must be `users of dns/bind9*`, it must _not_ be `users of "
+"BIND 9`"
+msgstr ""
+"Рекомендуется, чтобы строка AFFECTS содержала glob-выражение, "
+"соответствующее всем портам, затронутым записью, чтобы автоматизированные "
+"инструменты могли максимально легко её обработать. Если обновление касается "
+"всех существующих версий BIND 9, содержимое `AFFECTS` должно быть `users of "
+"dns/bind9*`, и оно _не должно_ быть `users of BIND 9`"
+
+#. type: Title ===
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:263
+#, no-wrap
+msgid "/usr/ports/MOVED"
+msgstr "/usr/ports/MOVED"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:269
+msgid ""
+"This file is used to list moved or removed ports. Each line in the file is "
+"made up of the name of the port, where the port was moved, when, and why. "
+"If the port was removed, the section detailing where it was moved can be "
+"left blank. Each section must be separated by the `|` (pipe) character, "
+"like so:"
+msgstr ""
+"Этот файл используется для перечисления перемещённых или удалённых портов. "
+"Каждая строка в файле состоит из названия порта, места, куда порт был "
+"перемещён, даты и причины. Если порт был удалён, раздел с указанием места "
+"перемещения может быть оставлен пустым. Каждый раздел должен быть отделён "
+"символом `|` (вертикальная черта), например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:273
+#, no-wrap
+msgid "old name|new name (blank for deleted)|date of move|reason\n"
+msgstr "old name|new name (blank for deleted)|date of move|reason\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:277
+msgid ""
+"The date must be entered in the form `YYYY-MM-DD`. New entries are added to "
+"the end of the list to keep it in chronological order, with the oldest entry "
+"at the top of the list."
+msgstr ""
+"Дата должна быть введена в формате `ГГГГ-ММ-ДД`. Новые записи добавляются в "
+"конец списка, чтобы сохранить его в хронологическом порядке, при этом самая "
+"старая запись находится в начале списка."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:279
+msgid ""
+"If a port was removed but has since been restored, delete the line in this "
+"file that states that it was removed."
+msgstr ""
+"Если порт был удален, но затем восстановлен, удалите строку в этом файле, "
+"которая указывает, что он был удален."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:281
+msgid ""
+"If a port was renamed and then renamed back to its original name, add a new "
+"one with the intermediate name to the old name, and remove the old entry as "
+"to not create a loop."
+msgstr ""
+"Если порт был переименован, а затем переименован обратно в исходное имя, "
+"добавьте новую запись с промежуточным именем для старого имени и удалите "
+"старую запись, чтобы не создавать цикл."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:285
+msgid "Any changes must be validated with `Tools/scripts/MOVEDlint.awk`."
+msgstr ""
+"Любые изменения должны быть проверены с помощью `Tools/scripts/"
+"MOVEDlint.awk`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:287
+msgid "If using a ports directory other than [.filename]#/usr/ports#, use:"
+msgstr ""
+"Если используется каталог портов, отличный от [.filename]#/usr/ports#, "
+"следует указать:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/upgrading/_index.adoc:292
+#, no-wrap
+msgid ""
+"% cd /home/user/ports\n"
+"% env PORTSDIR=$PWD Tools/scripts/MOVEDlint.awk\n"
+msgstr ""
+"% cd /home/user/ports\n"
+"% env PORTSDIR=$PWD Tools/scripts/MOVEDlint.awk\n"
diff --git a/documentation/content/ru/books/porters-handbook/uses/_index.adoc b/documentation/content/ru/books/porters-handbook/uses/_index.adoc
index 3e441f697e..3f90e301f2 100644
--- a/documentation/content/ru/books/porters-handbook/uses/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/uses/_index.adoc
@@ -1,26 +1,27 @@
---
-title: Глава 15. Значения USES
-prev: books/porters-handbook/keeping-up
+description: 'Макросы USES упрощают объявление требований и настроек для порта FreeBSD'
next: books/porters-handbook/versions
-showBookMenu: true
-weight: 15
params:
- path: "/books/porters-handbook/uses/"
+ path: /books/porters-handbook/uses/
+prev: books/porters-handbook/keeping-up
+showBookMenu: true
+tags: ["uses", "macros", "introduction", "guide"]
+title: 'Глава 17. Использование макроса USES'
+weight: 17
---
[[uses]]
-= Значения `USES`
+= Использование макроса `USES`
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 15
+:sectnumoffset: 17
:partnums:
:source-highlighter: rouge
:experimental:
-:c-plus-plus: c++
:images-path: books/porters-handbook/
ifdef::env-beastie[]
@@ -48,17 +49,14 @@ include::../../../../../shared/asciidoctor.adoc[]
endif::[]
[[uses-intro]]
-== An Introduction to `USES`
+== Введение в `USES`
-`USES` macros make it easy to declare requirements and settings for a port.
-They can add dependencies, change building behavior, add metadata to packages, and so on, all by selecting simple, preset values.
+Макросы `USES` упрощают объявление требований и настроек для порта. Они могут добавлять зависимости, изменять поведение при сборке, добавлять метаданные в пакеты и так далее, просто выбирая предустановленные значения.
-Each section in this chapter describes a possible value for `USES`, along with its possible arguments.
-Arguments are appended to the value after a colon (`:`).
-Multiple arguments are separated by commas (`,`).
+Каждый раздел в этой главе описывает возможное значение для `USES`, а также его возможные аргументы. Аргументы добавляются к значению после двоеточия (`:`). Несколько аргументов разделяются запятыми (`,`).
[[uses-intro-ex1]]
-.Using Multiple Values
+.Использование нескольких значений
[example]
====
[.programlisting]
@@ -68,7 +66,7 @@ USES= bison perl
====
[[uses-intro-ex2]]
-.Adding an Argument
+.Добавление аргумента
[example]
====
[.programlisting]
@@ -78,7 +76,7 @@ USES= tar:xz
====
[[uses-intro-ex3]]
-.Adding Multiple Arguments
+.Добавление нескольких аргументов
[example]
====
[.programlisting]
@@ -88,7 +86,7 @@ USES= drupal:7,theme
====
[[uses-intro-ex4]]
-.Mixing it All Together
+.Смешивая Все Вместе
[example]
====
[.programlisting]
@@ -100,418 +98,721 @@ USES= pgsql:9.3+ cpe python:2.7,build
[[uses-7z]]
== `7z`
-Possible arguments: (none), `p7zip`, `partial`
+Возможные аргументы: (нет), `p7zip`, `partial`
-Extract using man:7z[1] instead of man:bsdtar[1] and sets `EXTRACT_SUFX=.7z`.
-The `p7zip` option forces a dependency on the `7z` from package:archivers/p7zip[] if the one from the base system is not able to extract the files.
-`EXTRACT_SUFX` is not changed if the `partial` option is used, this can be used if the main distribution file does not have a [.filename]#.7z# extension.
+Извлечение с использованием man:7z[1] вместо man:bsdtar[1] и устанавливает `EXTRACT_SUFX=.7z`. Опция `p7zip` добавляет зависимость от `7z` из package:archivers/p7zip[], если версия из базовой системы не может извлечь файлы. `EXTRACT_SUFX` не изменяется, если используется опция `partial`, это может быть полезно, если основной дистрибутивный файл не имеет расширения [.filename]#.7z#.
[[uses-ada]]
== `ada`
-Possible arguments: (none), `5`, `6`
+Возможные аргументы: (нет), `6`, `12`, `(запуск)`
+
+Зависит от компилятора с поддержкой Ada и устанавливает `CC` соответствующим образом. По умолчанию используется `gcc6-aux` из портов.
+
+[[uses-angr]]
+== `angr`
+
+Возможные аргументы: `binaries`, `nose`
+
+Обеспечить поддержку портов, требующих https://github.com/angr/angr[платформу бинарного анализа angr].
+
+Если присутствует аргумент `binaries`, для тестирования порта требуются специальные бинарные файлы `angr`.
+
+Если присутствует аргумент `nose`, порт использует `nosetests` для цели тестирования. Этот аргумент подразумевает `USES=python:test`.
+
+Фреймворк предоставляет следующие переменные, которые могут быть установлены портом:
+
+`ANGR_VERSION`::
+Версия программ проекта `angr`.
+
+`ANGR_BINARIES_TAGNAME`::
+Имя тега для бинарных файлов `angr`.
+
+`ANGR_NOSETESTS`::
+Путь к программе `nosetests`.
+
+[[uses-ansible]]
+== `ansible`
+
+Возможные аргументы: `env`, `module`, `plugin`
+
+Обеспечивает поддержку портов, зависящих от пакета package:sysutils/ansible[].
+
+Если присутствует аргумент `env`, порт не зависит от package:sysutils/ansible[], но требует установки некоторых переменных Ansible.
+
+Если присутствует аргумент `module`, то порт является модулем Ansible.
+
+Если присутствует аргумент `plugin`, то порт является плагином Ansible.
+
+Фреймворк предоставляет следующие переменные порту:
+
+`ANSIBLE_CMD`::
+Путь к программе ansible.
+
+`ANSIBLE_DOC_CMD`::
+Путь к программе ansible-doc.
+
+`ANSIBLE_RUN_DEPENDS`::
+RUN_DEPENDS с портом Ansible.
+
+`ANSIBLE_DATADIR`::
+Путь к корню структуры каталогов, где хранятся все модули и плагины Ansible.
+
+`ANSIBLE_ETCDIR`::
+Путь к каталогу etc Ansible.
+
+`ANSIBLE_PLUGINS_PREFIX`::
+Путь к директории "plugins" в `${ANSIBLE_DATADIR}`.
+`ANSIBLE_MODULESDIR`::
+Путь к каталогу для локальных модулей Ansible.
+
+`ANSIBLE_PLUGINSDIR`::
+Путь к каталогу для локальных плагинов Ansible.
+
+`ANSIBLE_PLUGIN_TYPE`::
+Тип плагина Ansible (например, "connection", "inventory" или "vars").
+
+[[uses-apache]]
+== `apache`
+
+Возможные аргументы: (нет), `2.4`, `build`, `run`, `server`
+
+Обеспечивает поддержку портов, зависящих от веб-сервера Apache.
+
+Аргумент `version` можно использовать для указания конкретной версии Apache httpd. Можно задать определённую версию (`USES=apache:2.4`), минимальную версию (`USES=apache:2.4+`) или максимальную версию (`USES=apache:-2.4`).
+
+Если указан аргумент `build`, к порту добавляется зависимость для сборки.
+
+Если указан аргумент `run`, к порту добавляется зависимость времени выполнения.
+
+Если указан аргумент `server`, это означает, что порт является серверным.
+
+Фреймворк предоставляет следующие переменные, которые могут быть установлены портом:
+
+`AP_FAST_BUILD`::
+Автоматическая сборка модуля
+
+`AP_GENPLIST`::
+Автоматическое создание `PLIST` плюс добавление модуля в отключенном состоянии в [.filename]#httpd.conf# (только если нет файла `pkg-plist`)
+
+`MODULENAME`::
+Имя модуля Apache. По умолчанию: `${PORTNAME}`
+
+`SHORTMODNAME`::
+Краткое название модуля Apache. По умолчанию: `${MODULENAME:S/mod_//}`
+
+`SRC_FILE`::
+Исходный файл модуля APACHE. По умолчанию: `${MODULENAME}.c`
+
+Следующие переменные могут быть доступны для порта:
+
+`APACHE_VERSION`::
+Основная-вспомогательная версия выбранного сервера Apache, например 2.4
+
+`APACHEETCDIR`::
+Расположение каталога конфигурации Apache. По умолчанию: [.filename]#${LOCALBASE}/etc/apache24#
+
+`APACHEINCLUDEDIR`::
+Расположение include-файлов Apache. По умолчанию: [.filename]#${LOCALBASE}/include/apache24#
+
+`APACHEMODDIR`::
+Расположение модулей Apache. По умолчанию: [.filename]#${LOCALBASE}/libxexec/apache24#
+
+`APACHE_DEFAULT`::Версия Apache по умолчанию
-Depends on an Ada-capable compiler, and sets `CC` accordingly.
-Defaults to use gcc 5 from ports.
-Use the `:_X_` version option to force building with a different version.
[[uses-autoreconf]]
== `autoreconf`
-Possible arguments: (none), `build`
+Возможные аргументы: (нет), `build`
+
+Выполняет `autoreconf`. Эта команда объединяет функциональность `aclocal`, `autoconf`, `autoheader`, `automake`, `autopoint` и `libtoolize`. Каждая из этих команд применяется к [.filename]#${AUTORECONF_WRKSRC}/configure.ac# или его старому названию [.filename]#${AUTORECONF_WRKSRC}/configure.in#. Если [.filename]#configure.ac# определяет подкаталоги с их собственными [.filename]#configure.ac# с использованием `AC_CONFIG_SUBDIRS`, `autoreconf` также рекурсивно обновит их. Аргумент `:build` только добавляет зависимости времени сборки на эти инструменты, но не запускает `autoreconf`. Порт может установить `AUTORECONF_WRKSRC`, если `WRKSRC` не содержит путь к [.filename]#configure.ac#.
+
+[[uses-azurepy]]
+== `azurepy`
+
+Возможные аргументы: (отсутствуют)
-Runs `autoreconf`.
-It encapsulates the `aclocal`, `autoconf`, `autoheader`, `automake`, `autopoint`, and `libtoolize` commands.
-Each command applies to [.filename]#${AUTORECONF_WRKSRC}/configure.ac# or its old name, [.filename]#${AUTORECONF_WRKSRC}/configure.in#.
-If [.filename]#configure.ac# defines subdirectories with their own [.filename]#configure.ac# using `AC_CONFIG_SUBDIRS`, `autoreconf` will recursively update those as well.
-The `:build` argument only adds build time dependencies on those tools but does not run `autoreconf`.
-A port can set `AUTORECONF_WRKSRC` if `WRKSRC` does not contain the path to [.filename]#configure.ac#.
+Обеспечить поддержку портов `py-azure*`. Удаляет пространства имен `azure` и очищает общие файлы.
[[uses-blaslapack]]
== `blaslapack`
-Possible arguments: (none), `atlas`, `netlib` (default), `gotoblas`, `openblas`
+Возможные аргументы: (нет), `atlas`, `netlib` (по умолчанию), `gotoblas`, `openblas`
-Adds dependencies on Blas / Lapack libraries.
+Добавляет зависимости от библиотек Blas / Lapack.
[[uses-bdb]]
== `bdb`
-Possible arguments: (none), `48`, `5` (default), `6`
+Возможные аргументы: (отсутствуют), `5` (по умолчанию), `18`
-Add dependency on the Berkeley DB library.
-Default to package:databases/db5[].
-It can also depend on package:databases/db48[] when using the `:48` argument or package:databases/db6[] with `:6`.
-It is possible to declare a range of acceptable values, `:48+` finds the highest installed version, and falls back to 4.8 if nothing else is installed.
-`INVALID_BDB_VER` can be used to specify versions which do not work with this port.
-The framework exposes the following variables to the port:
+Добавить зависимость от библиотеки Berkeley DB. По умолчанию используется package:databases/db5[]. Также может зависеть от package:databases/db18[] при использовании аргумента `:18`. Можно объявить диапазон допустимых значений: `:5+` находит самую высокую установленную версию и возвращается к 5, если ничего другого не установлено. `INVALID_BDB_VER` можно использовать для указания версий, которые не работают с этим портом. Фреймворк предоставляет порту следующие переменные:
`BDB_LIB_NAME`::
-The name of the Berkeley DB library.
-For example, when using package:databases/db5[], it contains `db-5.3`.
+Имя библиотеки Berkeley DB. Например, при использовании package:databases/db5[] она содержит `db-5.3`.
`BDB_LIB_CXX_NAME`::
-The name of the Berkeley DBC++ library.
-For example, when using package:databases/db5[], it contains `db_cxx-5.3`.
+Название библиотеки Berkeley DBC++. Например, при использовании package:databases/db5[] она содержит `db_cxx-5.3`.
`BDB_INCLUDE_DIR`::
-The location of the Berkeley DB include directory.
-For example, when using package:databases/db5[], it will contain `${LOCALBASE}/include/db5`.
+Расположение каталога с заголовочными файлами Berkeley DB. Например, при использовании пакета package:databases/db5[], он будет содержать `${LOCALBASE}/include/db5`.
`BDB_LIB_DIR`::
-The location of the Berkeley DB library directory.
-For example, when using package:databases/db5[], it contains `${LOCALBASE}/lib`.
+Расположение каталога библиотеки Berkeley DB. Например, при использовании package:databases/db5[], он содержит `${LOCALBASE}/lib`.
`BDB_VER`::
-The detected Berkeley DB version.
-For example, if using `USES=bdb:48+` and Berkeley DB 5 is installed, it contains `5`.
+Обнаруженная версия Berkeley DB. Например, при использовании `USES=bdb:5+` и установленной Berkeley DB 18, будет содержать `18`.
[IMPORTANT]
====
-package:databases/db48[] is deprecated and unsupported.
-It must not be used by any port.
+package:databases/db48[] устарел и не поддерживается. Он не должен использоваться ни одним портом.
====
[[uses-bison]]
== `bison`
-Possible arguments: (none), `build`, `run`, `both`
+Возможные аргументы: (нет), `build`, `run`, `both`
-Uses package:devel/bison[] By default, with no arguments or with the `build` argument, it implies `bison` is a build-time dependency, `run` implies a run-time dependency, and `both` implies both run-time and build-time dependencies.
+Использует пакет package:devel/bison[] По умолчанию, без аргументов или с аргументом `build`, подразумевается, что `bison` является зависимостью на этапе сборки, `run` — зависимостью на этапе выполнения, а `both` — зависимостью как на этапе сборки, так и на этапе выполнения.
+
+[[uses-budgie]]
+== `budgie`
+
+Возможные аргументы: (отсутствуют)
+
+Предоставить поддержку окружения рабочего стола Budgie. Используйте `USE_BUDGIE` для выбора необходимых компонентов порта. Дополнительную информацию см. в разделе crossref:special[using-budgie,Использование Budgie].
[[uses-cabal]]
== `cabal`
[IMPORTANT]
====
-Ports should not be created for Haskell libraries, see crossref:special[haskell-libs,Haskell Libraries] for more information.
+Порты не следует создавать для библиотек Haskell, подробнее см. в crossref:special[haskell-libs,Библиотеки Haskell].
====
-Possible arguments: (none), `hpack`
+Возможные аргументы: (отсутствуют), `hpack`, `nodefault`
-Sets default values and targets used to build Haskell software using Cabal.
-A build dependency on the Haskell compiler port (GHC) is added.
-If `hpack` argument is given, a build dependency on package:devel/hs-hpack[] is added and `hpack` is invoked at configuration step to generate.
-cabal file.
+Устанавливает значения и цели по умолчанию, используемые для сборки программного обеспечения на Haskell с помощью Cabal. Добавляется зависимость для сборки на порт компилятора Haskell (package:lang/ghc[]). Если в переменной `BUILD_DEPENDS` уже указана другая версия GHC (например, package:lang/ghc810[]), она будет использована вместо версии по умолчанию. Если указан аргумент `hpack`, добавляется зависимость для сборки на package:devel/hs-hpack[], и `hpack` вызывается на этапе конфигурации для генерации файла .cabal. Если указан аргумент `nodefault`, фреймворк не будет пытаться загрузить основной дистрибутивный файл из Hackage. Этот аргумент добавляется неявно, если присутствует `USE_GITHUB` или `USE_GITLAB`.
-The framework provides the following variables:
+Фреймворк предоставляет следующие переменные:
+
+`CABAL_REVISION`::
+Пакеты Haskell, размещённые на Hackage, могут иметь ревизии. Установите этот параметр в целочисленное значение, чтобы использовать исправленное описание пакета.
`USE_CABAL`::
-If the software uses Haskell dependencies, list them in this variable.
-Each item should be present on Hackage and be listed in form `packagename-_0.1.2_`.
-Dependencies can have revisions, which are specified after the `_` symbol.
-Automatic generation of dependency list is supported, see crossref:special[using-cabal,Building Haskell Applications with `cabal`].
+Если программное обеспечение использует зависимости на Haskell, перечислите их в этой переменной. Каждый элемент должен присутствовать на Hackage и быть указан в формате `имяпакета-_0.1.2_`. Зависимости также могут иметь ревизии, которые указываются после символа `_`. Поддерживается автоматическое формирование списка зависимостей, см. crossref:special[using-cabal,Сборка приложений на Haskell с помощью `cabal`].
`CABAL_FLAGS`::
-List of flags to be passed to `cabal-install` during the configuring and building stage.
-The flags are passed verbatim.
+Список флагов, передаваемых `cabal-install` на этапах настройки и сборки. Флаги передаются в исходном виде. Эта переменная обычно используется для включения или отключения флагов, объявленных в файле .cabal. Передайте `foo`, чтобы включить флаг `foo`, и `-foo`, чтобы отключить его.
-`EXECUTABLES`::
-List of executable files installed by the port.
-Default value: `${PORTNAME}`.
-Items from this list are automatically added to pkg-plist.
+`CABAL_EXECUTABLES`::
+Список исполняемых файлов, устанавливаемых портом. Значение по умолчанию: `${PORTNAME}`. Для получения списка возможных значений этой переменной обратитесь к файлу .cabal портируемого проекта. Каждое значение соответствует разделу `executable` в файле .cabal. Элементы из этого списка автоматически добавляются в pkg-plist.
`SKIP_CABAL_PLIST`::
-If defined, do not add items from `${EXECUTABLES}` to pkg-plist.
+Если определено, не добавлять элементы из `${CABAL_EXECUTABLES}` в pkg-plist.
`opt_USE_CABAL`::
-Adds items to `${USE_CABAL}` depending on `opt` option.
+Добавляет элементы в `${USE_CABAL}` в зависимости от опции `opt`.
-`opt_EXECUTABLES`::
-Adds items to `${EXECUTABLES}` depending on `opt` option.
+`opt_CABAL_EXECUTABLES`::
+Добавляет элементы в `${CABAL_EXECUTABLES}` в зависимости от опции `opt`.
`opt_CABAL_FLAGS`::
-If `opt` is enabled, append the value to `${CABAL_FLAGS}`.
-Otherwise, append `-value` to disable the flag.
+Если `opt` включён, добавить значение к `${CABAL_FLAGS}`. В противном случае добавить `-value`, чтобы отключить флаг. Обратите внимание, что это поведение немного отличается от простого `CABAL_FLAGS`, так как оно не принимает значения, начинающиеся с `-`.
+
+`CABAL_WRAPPER_SCRIPTS`::
+Подмножество `${CABAL_EXECUTABLES}`, содержащее программы на Haskell, которые будут обёрнуты в shell-скрипт, устанавливающий переменные окружения `*_datadir` перед запуском программы. Это также приводит к тому, что фактический бинарный файл Haskell устанавливается в директорию `libexec/cabal/`. Данная настройка необходима для программ на Haskell, которые устанавливают свои файлы данных в директорию `share/`.
`FOO_DATADIR_VARS`::
-For an executable named `FOO` list Haskell packages, whose data files should be accessible by the executable.
+Список дополнительных пакетов Haskell, чьи файлы данных должны быть доступны исполняемому файлу с именем `FOO`. Исполняемый файл должен быть частью `${CABAL_WRAPPER_SCRIPTS}`. Указанные пакеты Haskell не должны иметь суффикса версии.
+
+`CABAL_PROJECT`::
+Некоторые проекты на Haskell могут уже иметь файл `cabal.project`, который также создаётся фреймворком портов. Если это так, используйте эту переменную, чтобы указать, что делать с оригинальным файлом `cabal.project`. Установка этой переменной в значение `remove` приведёт к удалению оригинального файла. Установка этой переменной в значение `append` приведёт к следующему:
+. Исходный файл переместится в `cabal.project.${PORTNAME}` на этапе `extract`.
+. Исходный файл `cabal.project.${PORTNAME}` и сгенерированный `cabal.project` объединятся в один файл после этапа `patch`. Использование `append` позволяет выполнить патчинг исходного файла перед его объединением.
[[uses-cargo]]
== `cargo`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Uses Cargo for configuring, building, and testing.
-It can be used to port Rust applications that use the Cargo build system.
-For more information see crossref:special[using-cargo,Building Rust Applications with `cargo`].
+Использует Cargo для настройки, сборки и тестирования. Может применяться для портирования приложений на Rust, использующих систему сборки Cargo. Дополнительную информацию смотрите в crossref:special[using-cargo,Сборка приложений на Rust с помощью `cargo`].
[[uses-charsetfix]]
== `charsetfix`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
+
+Предотвращает установку файла [.filename]#charset.alias# портом. Этот файл должен устанавливаться только пакетом package:converters/libiconv[]. Переменная `CHARSETFIX_MAKEFILEIN` может быть установлена в путь относительно `WRKSRC`, если [.filename]#charset.alias# не устанавливается через [.filename]#${WRKSRC}/Makefile.in#.
+
+[[uses-cl]]
+== `cl`
+
+Возможные аргументы: (отсутствуют)
+
+Предоставляет поддержку портов Common Lisp.
+
+Фреймворк предоставляет следующие переменные, которые могут быть установлены портами:
+
+`ASDF_MODULES`::
+Список модулей `ASDF` для сборки, когда установлен `FASL_TARGET` (по умолчанию `PORTNAME`)
+
+`FASL_TARGET`::
+Собрать fasl вариант порта (один из `ccl`, `clisp` или `sbcl`)
+
+`USE_ASDF`::
+Зависит от пакета package:devel/cl-asdf[]
+
+`USE_ASDF_FASL`::
+Зависит от `devel/cl-asdf-<FASL_TARGET>`
+
+`USE_CCL`::
+Зависит от пакета package:lang/ccl[]; подразумевается при `FASL_TARGET=ccl`
-Prevents the port from installing [.filename]#charset.alias#.
-This must be installed only by package:converters/libiconv[].
-`CHARSETFIX_MAKEFILEIN` can be set to a path relative to `WRKSRC` if [.filename]#charset.alias# is not installed by [.filename]#${WRKSRC}/Makefile.in#.
+`USE_CLISP`::
+Зависит от пакета package:lang/clisp[]; подразумевается при `FASL_TARGET=clisp`
+
+`USE_SBCL`::
+Зависит от пакета package:lang/sbcl[]; подразумевается, если `FASL_TARGET=SBCL`
+
+
+Фреймворк предоставляет следующие переменные, которые могут быть прочитаны портами:
+
+`ASDF_PATHNAME`::
+Путь к исходному коду CL
+
+`ASDF_REGISTRY`::
+Путь к реестру CL, содержащему файлы asd
+
+`CCL`::
+Путь к компилятору Clozure Common Lisp
+
+`CLISP`::
+Путь к компилятору GNU Common Lisp
+
+`CL_LIBDIR_REL`::
+Каталог библиотек CL относительно `LOCALBASE` или `PREFIX`
+
+`FASL_DIR_REL`::
+Относительный путь к скомпилированным fasl-файлам; зависит от `FASL_TARGET`
+
+`FASL_PATHNAME`::
+Путь к CL fasl
+
+`LISP_EXTRA_ARG`::
+Дополнительные аргументы, используемые при сборке fasl
+
+`SBCL`::
+Путь к компилятору Steel Bank Common Lisp
[[uses-cmake]]
== `cmake`
-Possible arguments: (none), `insource`, `noninja`, `run`, `testing`
+Возможные аргументы: (отсутствуют), `insource`, `noninja`, `run`, `testing`
-Use CMake for configuring the port and generating a build system.
+Используйте CMake для настройки порта и генерации системы сборки.
-By default an out-of-source build is performed, leaving the sources in `WRKSRC` free from build artifacts.
-With the `insource` argument, an in-source build will be performed instead.
-This argument should be an exception, used only when a regular out-of-source build does not work.
+По умолчанию выполняется сборка в дереве вне исходного кода, оставляя исходные файлы в `WRKSRC` свободными от артефактов сборки. С аргументом `insource` вместо этого будет выполнена сборка в исходном коде. Этот аргумент должен быть исключением и использоваться только в случае, когда обычная сборка вне исходного кода не работает.
-By default Ninja (package:devel/ninja[]) is used for the build.
-In some cases this does not work correctly.
-With the `noninja` argument, the build will use regular `make` for builds.
-This argument should only be used if a Ninja-based build does not work.
+По умолчанию для сборки используется Ninja (package:devel/ninja[]). В некоторых случаях это может работать некорректно. С аргументом `noninja` сборка будет использовать обычный `make`. Этот аргумент следует применять только если сборка на основе Ninja не работает.
-With the `run` argument, a run dependency is registered in addition to a build dependency.
+С аргументом `run` регистрируется зависимость во время выполнения в дополнение к зависимости при сборке.
-With the `testing` argument, a test-target is added that uses CTest.
-When running tests the port will be re-configured for testing and re-built.
+С аргументом `testing`, добавляется цель тестирования, использующая CTest. При запуске тестов порт будет переконфигурирован для тестирования и пересобран.
-For more information see crossref:special[using-cmake,Using `cmake`].
+Для получения дополнительной информации см. crossref:special[using-cmake,Использование `cmake`].
[[uses-compiler]]
== `compiler`
-Possible arguments: (none), `env` (default, implicit), `{c-plus-plus}17-lang`, `{c-plus-plus}14-lang`, `{c-plus-plus}11-lang`, `gcc-{c-plus-plus}11-lib`, `{c-plus-plus}11-lib`, `{c-plus-plus}0x`, `c11`, `nestedfct`, `features`
+Возможные аргументы: (нет), `env` (по умолчанию, подразумевается), `{cpp}17-lang`, `{cpp}14-lang`, `{cpp}11-lang`, `gcc-{cpp}11-lib`, `{cpp}11-lib`, `{cpp}0x`, `c11`, `nestedfct`, `features`
-Determines which compiler to use based on any given wishes.
-Use `{c-plus-plus}17-lang` if the port needs a {c-plus-plus}17-capable compiler, `{c-plus-plus}14-lang` if the port needs a {c-plus-plus}14-capable compiler, `{c-plus-plus}11-lang` if the port needs a {c-plus-plus}11-capable compiler, `gcc-{c-plus-plus}11-lib` if the port needs the `g++` compiler with a {c-plus-plus}11 library, or `{c-plus-plus}11-lib` if the port needs a {c-plus-plus}11-ready standard library.
-If the port needs a compiler understanding {c-plus-plus}0X, C11 or nested functions, the corresponding parameters should be used.
+Определяет, какой компилятор использовать, исходя из заданных предпочтений. Используйте `{cpp}17-lang`, если порту требуется компилятор с поддержкой {cpp}17, `{cpp}14-lang`, если порту требуется компилятор с поддержкой {cpp}14, `{cpp}11-lang`, если порту требуется компилятор с поддержкой {cpp}11, `gcc-{cpp}11-lib`, если порту требуется компилятор `g++` с библиотекой {cpp}11, или `{cpp}11-lib`, если порту требуется стандартная библиотека с поддержкой {cpp}11. Если порту требуется компилятор, понимающий {cpp}0X, C11 или вложенные функции, следует использовать соответствующие параметры.
-Use `features` to request a list of features supported by the default compiler.
-After including [.filename]#bsd.port.pre.mk# the port can inspect the results using these variables:
+Используйте `features` для запроса списка возможностей, поддерживаемых компилятором по умолчанию. После включения [.filename]#bsd.port.pre.mk# порт может проверить результаты с помощью следующих переменных:
-* `COMPILER_TYPE`: the default compiler on the system, either gcc or clang
-* `ALT_COMPILER_TYPE`: the alternative compiler on the system, either gcc or clang. Only set if two compilers are present in the base system.
-* `COMPILER_VERSION`: the first two digits of the version of the default compiler.
-* `ALT_COMPILER_VERSION`: the first two digits of the version of the alternative compiler, if present.
-* `CHOSEN_COMPILER_TYPE`: the chosen compiler, either gcc or clang
-* `COMPILER_FEATURES`: the features supported by the default compiler. It currently lists the {c-plus-plus} library.
+* `COMPILER_TYPE`: компилятор по умолчанию в системе, gcc или clang
+* `ALT_COMPILER_TYPE`: альтернативный компилятор в системе, gcc или clang. Устанавливается только при наличии двух компиляторов в базовой системе.
+* `COMPILER_VERSION`: первые две цифры версии компилятора по умолчанию.
+* `ALT_COMPILER_VERSION`: первые две цифры версии альтернативного компилятора, если он присутствует.
+* `CHOSEN_COMPILER_TYPE`: выбранный компилятор, gcc или clang
+* `COMPILER_FEATURES`: возможности, поддерживаемые компилятором по умолчанию. В настоящее время указана библиотека {cpp}.
[[uses-cpe]]
== `cpe`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Include Common Platform Enumeration (CPE) information in package manifest as a CPE 2.3 formatted string.
-See the http://scap.nist.gov/specifications/cpe/[CPE specification] for details.
-To add CPE information to a port, follow these steps:
+Включает информацию о Common Platform Enumeration (CPE) в манифест пакета в виде строки формата CPE 2.3. Подробности см. в https://scap.nist.gov/specifications/cpe/[спецификации CPE]. Чтобы добавить информацию CPE в порт, выполните следующие шаги:
[.procedure]
-. Search for the official CPE entry for the software product either by using the NVD's http://web.nvd.nist.gov/view/cpe/search[CPE search engine] or in the http://static.nvd.nist.gov/feeds/xml/cpe/dictionary/official-cpe-dictionary_v2.3.xml[official CPE dictionary] (warning, very large XML file). _Do not ever make up CPE data._
-. Add `cpe` to `USES` and compare the result of `make -V CPE_STR` to the CPE dictionary entry. Continue one step at a time until `make -V CPE_STR` is correct.
-. If the product name (second field, defaults to `PORTNAME`) is incorrect, define `CPE_PRODUCT`.
-. If the vendor name (first field, defaults to `CPE_PRODUCT`) is incorrect, define `CPE_VENDOR`.
-. If the version field (third field, defaults to `PORTVERSION`) is incorrect, define `CPE_VERSION`.
-. If the update field (fourth field, defaults to empty) is incorrect, define `CPE_UPDATE`.
-. If it is still not correct, check [.filename]#Mk/Uses/cpe.mk# for additional details, or contact the {ports-secteam}.
-. Derive as much as possible of the CPE name from existing variables such as `PORTNAME` and `PORTVERSION`. Use variable modifiers to extract the relevant portions from these variables rather than hardcoding the name.
-. _Always_ run `make -V CPE_STR` and check the output before committing anything that changes `PORTNAME` or `PORTVERSION` or any other variable which is used to derive `CPE_STR`.
+. Поищите официальную запись CPE для программного продукта, используя либо https://web.nvd.nist.gov/view/cpe/search[поисковую систему CPE] от NVD, либо https://nvd.nist.gov/feeds/xml/cpe/dictionary/official-cpe-dictionary_v2.3.xml.gz[официальный словарь CPE] (предупреждение: очень большой XML-файл). _Никогда не создавайте данные CPE самостоятельно._
+. Добавьте `cpe` в `USES` и сравните результат выполнения `make -V CPE_STR` с записью в словаре CPE. Продолжайте шаг за шагом, пока результат `make -V CPE_STR` не станет корректным.
+. Если название продукта (второе поле, по умолчанию `PORTNAME`) указано неверно, определите `CPE_PRODUCT`.
+. Если название производителя (первое поле, по умолчанию `CPE_PRODUCT`) указано неверно, определите `CPE_VENDOR`.
+. Если поле версии (третье поле, по умолчанию `PORTVERSION`) указано неверно, определите `CPE_VERSION`.
+. Если поле обновления (четвертое поле, по умолчанию пустое) указано неверно, определите `CPE_UPDATE`.
+. Если это всё ещё неверно, проверьте файл [.filename]#Mk/Uses/cpe.mk# для получения дополнительной информации или свяжитесь с {ports-secteam}.
+. Извлекайте как можно больше информации для имени CPE из существующих переменных, таких как `PORTNAME` и `PORTVERSION`. Используйте модификаторы переменных для извлечения соответствующих частей из этих переменных, вместо того чтобы жестко прописывать имя.
+. _Всегда_ выполняйте `make -V CPE_STR` и проверяйте вывод перед коммитом любых изменений, затрагивающих `PORTNAME`, `PORTVERSION` или любые другие переменные, используемые для формирования `CPE_STR`.
[[uses-cran]]
== `cran`
-Possible arguments: (none), `auto-plist`, `compiles`
+Возможные аргументы: (нет), `auto-plist`, `compiles`
-Uses the Comprehensive R Archive Network.
-Specify `auto-plist` to automatically generate [.filename]#pkg-plist#.
-Specify `compiles` if the port has code that need to be compiled.
+Использует Comprehensive R Archive Network. Укажите `auto-plist` для автоматического создания [.filename]#pkg-plist#. Укажите `compiles`, если порт содержит код, который необходимо компилировать.
[[uses-desktop-file-utils]]
== `desktop-file-utils`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Uses update-desktop-database from package:devel/desktop-file-utils[].
-An extra post-install step will be run without interfering with any post-install steps already in the port [.filename]#Makefile#.
-A line with <<plist-keywords-desktop-file-utils,`@desktop-file-utils`>> will be added to the plist.
+Использует update-desktop-database из пакета package:devel/desktop-file-utils[]. Дополнительный шаг post-install будет выполнен без вмешательства в уже существующие шаги post-install в [.filename]#Makefile# порта. Строка с crossref:plist[plist-keywords-desktop-file-utils,`@desktop-file-utils`] будет добавлена в plist. Используйте этот макрос только если порт предоставляет файл `.desktop`, содержащий запись `MimeType`.
[[uses-desthack]]
== `desthack`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Changes the behavior of GNU configure to properly support `DESTDIR` in case the original software does not.
+Изменяет поведение GNU configure для корректной поддержки `DESTDIR` в случае, если исходное программное обеспечение этого не делает.
[[uses-display]]
== `display`
-Possible arguments: (none), _ARGS_
+Возможные аргументы: (отсутствуют), _ARGS_
-Set up a virtual display environment.
-If the environment variable `DISPLAY` is not set, then Xvfb is added as a build dependency, and `CONFIGURE_ENV` is extended with the port number of the currently running instance of Xvfb.
-The _ARGS_ parameter defaults to `install` and controls the phase around which to start and stop the virtual display.
+Настраивает виртуальное окружение для отображения. Если переменная окружения `DISPLAY` не установлена, то Xvfb добавляется как зависимость при сборке, а `CONFIGURE_ENV` расширяется с указанием номера порта текущего запущенного экземпляра Xvfb. Параметр _ARGS_ по умолчанию имеет значение `install` и управляет фазой, вокруг которой запускается и останавливается виртуальный дисплей.
[[uses-dos2unix]]
== `dos2unix`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-The port has files with line endings in DOS format which need to be converted.
-Several variables can be set to control which files will be converted.
-The default is to convert _all_ files, including binaries.
-See crossref:slow-porting[slow-patch-automatic-replacements,Simple Automatic Replacements] for examples.
+Порт содержит файлы с символами конца строки в формате DOS, которые необходимо преобразовать. Несколько переменных могут быть установлены для контроля, какие файлы будут преобразованы. По умолчанию преобразуются _все_ файлы, включая бинарные. См. crossref:slow-porting[slow-patch-automatic-replacements,Простые автоматические замены] для примеров.
-* `DOS2UNIX_REGEX`: match file names based on a regular expression.
-* `DOS2UNIX_FILES`: match literal file names.
-* `DOS2UNIX_GLOB`: match file names based on a glob pattern.
-* `DOS2UNIX_WRKSRC`: the directory from which to start the conversions. Defaults to `${WRKSRC}`.
+* `DOS2UNIX_REGEX`: сопоставлять имена файлов на основе регулярного выражения.
+* `DOS2UNIX_FILES`: соответствуют точным именам файлов.
+* `DOS2UNIX_GLOB`: сопоставлять имена файлов на основе шаблона файлов оболочки.
+* `DOS2UNIX_WRKSRC`: каталог, с которого начинать преобразования. По умолчанию `${WRKSRC}`.
[[uses-drupal]]
== `drupal`
-Possible arguments: `7`, `module`, `theme`
+Возможные аргументы: `7`, `module`, `theme`
+
+Автоматизирует установку порта, который является темой или модулем Drupal. Использовать с версией Drupal, которую ожидает порт. Например, `USES=drupal:7,module` означает, что этот порт создает модуль Drupal 7. Тему Drupal 7 можно указать с помощью `USES=drupal:7,theme`.
+
+[[uses-ebur128]]
+== `ebur128`
-Automate installation of a port that is a Drupal theme or module.
-Use with the version of Drupal that the port is expecting.
-For example, `USES=drupal:7,module` says that this port creates a Drupal 6 module.
-A Drupal 7 theme can be specified with `USES=drupal:7,theme`.
+Возможные аргументы: (нет), `build`, `lib`, `run`, `test`
+
+Добавляет зависимость от пакета package:audio/ebur128[]. Позволяет прозрачно зависеть от вариантов `rust` или `legacy`, используя `DEFAULT_VERSIONS` в [.filename]#make.conf#. Например, для использования устаревшей версии укажите `DEFAULT_VERSIONS+=ebur128=legacy`
+
+Без аргументов поведение аналогично случаю с предоставлением аргумента `lib`. Остальные аргументы указывают соответствующую категорию зависимости.
[[uses-eigen]]
== `eigen`
-Possible arguments: 2, 3, build (default), run
+Возможные аргументы: 2, 3, build (по умолчанию), run
+
+Добавить зависимость от пакета package:math/eigen[].
+
+[[uses-elextronfix]]
+== `electronfix`
+
+Возможные аргументы: `31`, `32`, `33`
+
+Предоставить поддержку для простого портирования Electron-приложений, распространяемых в бинарной форме. Добавляет зависимость на этапах сборки и выполнения от package:devel/electron31[], package:devel/electron32[] или package:devel/electron33[] в зависимости от используемого аргумента.
+
+Фреймворк предоставляет следующие переменные, которые могут быть установлены портами:
+
+`ELECTRONFIX_SYMLINK_FILES`::
+Список файлов для создания символьных ссылок из дистрибутива Electron.
-Add dependency on package:math/eigen[].
+`ELECTRONFIX_MAIN_EXECUTABLE`::
+Имя файла основного исполняемого файла, который будет заменен оригинальным бинарным файлом Electron.
+
+
+[[uses-elfctl]]
+== `elfctl`
+
+Возможные аргументы: (отсутствуют), `build` (по умолчанию), `stage`
+
+Установите управляющие заметки функций ELF-бинарных файлов, задав `ELF_FEATURES`.
+
+Когда не указан аргумент или указан аргумент `build`, операции выполняются над бинарными файлами в `BUILD_WRKSRC`, а файлы, перечисленные в `ELF_FEATURES`, указываются относительно `BUILD_WRKSRC`. Когда указан аргумент `stage`, операции выполняются над бинарными файлами в `STAGEDIR`, а файлы, перечисленные в `ELF_FEATURES`, указываются относительно `STAGEDIR`.
+
+[[uses-elfct-ex1]]
+.Uses=elfctl
+[example]
+====
+[.programlisting]
+....
+ELF_FEATURES= featurelist:path/to/file1 \
+ featurelist:path/to/file2
+....
+
+====
+
+Формат `featurelist` описан в man:elfctl[1].
+
+[[uses-elixir]]
+== `elixir`
+
+Возможные аргументы: (отсутствуют)
+
+Предоставить поддержку для портов, использующих package:lang/elixir[]. Добавляет зависимость во время сборки и выполнения на package:lang/elixir[].
+
+Предоставляемые фреймворком переменные:
+
+`ELIXIR_APP_NAME`::
+Название приложения Elixir, как оно установлено в каталоге lib Elixir
+`ELIXIR_LIB_ROOT`::
+Путь к библиотекам Elixir по умолчанию
+`ELIXIR_APP_ROOT`::
+Корневая директория для этого приложения Elixir
+`ELIXIR_HIDDEN`::
+Приложения, которые необходимо скрыть из пути выполнения кода; обычно `${PORTNAME}`
+`ELIXIR_LOCALE`::
+Локаль UTF-8, которая будет использоваться Elixir во время сборки (подойдет любая локаль UTF-8)
+`MIX_CMD`::
+Команда `mix`
+`MIX_COMPILE`::
+Команда `mix`, используемая для компиляции приложения на Elixir
+`MIX_REWRITE`::
+Автоматически заменять зависимости Mix на пути к коду
+`MIX_BUILD_DEPS`::
+Список `BUILD_DEPENDS` в формате категория/имя_порта (часто упоминаемый как "deps" в Erlang и Elixir)
+`MIX_RUN_DEPS`::
+Список `RUN_DEPENDS` в формате категория/имя порта
+`MIX_DOC_DIRS`::
+Дополнительные каталоги документации для установки в `DOCSDIR`
+`MIX_DOC_FILES`::
+Дополнительные файлы документации для установки в `DOCSDIR` (обычно README.md)
+`MIX_ENV`::
+Окружение для сборки Mix (в том же формате, что и `MAKE_ENV`)
+`MIX_ENV_NAME`::
+Имя среды сборки Mix, обычно "prod"
+`MIX_BUILD_NAME`::
+Имя выходного файла сборки в _build/, обычно `${MIX_ENV_NAME}`
+`MIX_TARGET`::
+Имя цели Mix, обычно "compile"
+`MIX_EXTRA_APPS`::
+Список подприложений для сборки, если имеются
+`MIX_EXTRA_DIRS`::
+Список дополнительных каталогов для установки в `ELIXIR_APP_ROOT`
+`MIX_EXTRA_FILES`::
+Список дополнительных файлов для установки в `ELIXIR_APP_ROOT`
+
+[[uses-emacs]]
+== `emacs`
+
+Возможные аргументы: (нет) (по умолчанию), `build`, `run`, `noflavors`
+
+Предоставляет поддержку для портов, требующих Emacs. Аргумент `build` создает зависимость сборки от Emacs. Аргумент `run` создает зависимость выполнения от Emacs. Если оба аргумента `build` и `run` отсутствуют, создаются зависимости сборки и выполнения от Emacs. Аргумент `noflavors` запрещает флейворы и подразумевается, если нет зависимости выполнения от Emacs.
+
+Стандартный вариант Emacs для портов с `USES=emacs` можно определить в [.filename]#make.conf#. Например, для варианта `nox` используйте `DEFAULT_VERSIONS+= emacs=nox`. Допустимые флейворы: `full`, `canna`, `nox`, `wayland`, `devel_full`, `devel_nox`.
+
+Переменные, которые могут быть установлены портами:
+
+`EMACS_FLAVORS_EXCLUDE`::
+НЕ собирать эти флейворы Emacs. Если `EMACS_FLAVORS_EXCLUDE` не определена и:
+
+* существует зависимость во время выполнения от Emacs
+* аргумент noflavors не указан
+
++
+то предполагаются все допустимые флейворы Emacs.
+
+`EMACS_NO_DEPENDS`::
+НЕ добавлять зависимости сборки или выполнения от Emacs. Это предотвратит создание вариантов, и никакие файлы байт-кода не будут сгенерированы как часть пакета.
+
+Переменные, которые могут быть прочитаны портами:
+
+`EMACS_CMD`::
+Команда Emacs с полным путём (например, [.filename]#/usr/local/bin/emacs-30.1#)
+
+`EMACS_FLAVOR`::
+Используется для зависимостей (например, `BUILD_DEPENDS= dash.el${EMACS_PKGNAMESUFFIX}>0:devel/dash@${EMACS_FLAVOR}`)
+
+`EMACS_LIBDIR`::
+Каталог библиотек Emacs без `${PREFIX}` (например, [.filename]#share/emacs#)
+
+`EMACS_LIBDIR_WITH_VER`::
+Каталог библиотеки без `${PREFIX}`, включая версию (например, [.filename]#share/emacs/30.1#)
+
+`EMACS_MAJOR_VER`::
+Основная версия Emacs (например, 30)
+
+`EMACS_PKGNAMESUFFIX`::
+`PKGNAMESUFFIX` для различия вариантов Emacs
+
+`EMACS_SITE_LISPDIR`::
+Каталог site-lisp Emacs без `${PREFIX}` (например, [.filename]#share/emacs/site-lisp#)
+
+`EMACS_VER`::
+Версия Emacs (например, 30.1)
+
+`EMACS_VERSION_SITE_LISPDIR`::
+Каталог site-lisp Emacs, включая номер версии (например, [.filename]#share/emacs/30.1/site-lisp#)
+
+[[uses-erlang]]
+== `erlang`
+
+Возможные аргументы: (нет), `enc`, `rebar`, `rebar3`
+
+Добавляет зависимость на время сборки и выполнения от package:lang/erlang[]. В зависимости от аргумента, добавляет дополнительные зависимости для сборки. `enc` добавляет зависимость от package:devel/erlang-native-compiler[], `rebar` добавляет зависимость от package:devel/rebar[], а `rebar3` добавляет зависимость от package:devel/rebar3[].
+
+В дополнение, следующие переменные доступны для порта:
+
+* `ERL_APP_NAME`: Имя приложения Erlang, как оно установлено в каталоге lib Erlang (без указания версии)
+* `ERL_APP_ROOT`: Корневой каталог для этого приложения Erlang
+* `REBAR_CMD`: Путь к команде "rebar"
+* `REBAR3_CMD`: Путь к команде "rebar3"
+* `REBAR_PROFILE`: Профиль Rebar
+* `REBAR_TARGETS`: Список целей Rebar (обычно compile, возможно escriptize)
+* `ERL_BUILD_NAME`: Имя сборки для rebar3
+* `ERL_BUILD_DEPS`: Список BUILD_DEPENDS в формате категория/имя_порта
+* `ERL_RUN_DEPS`: Список RUN_DEPENDS в формате категория/имя_порта
+* `ERL_DOCS`: Список файлов и каталогов документации
[[uses-fakeroot]]
== `fakeroot`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Changes some default behavior of build systems to allow installing as a user.
-See https://wiki.debian.org/FakeRoot[] for more information on `fakeroot`.
+Изменяет некоторые стандартные поведения систем сборки для разрешения установки от имени пользователя. Дополнительную информацию о `fakeroot` можно найти на https://wiki.debian.org/FakeRoot[].
[[uses-fam]]
== `fam`
-Possible arguments: (none), `fam`, `gamin`
+Возможные аргументы: (нет), `fam`, `gamin`
-Uses a File Alteration Monitor as a library dependency, either package:devel/fam[] or package:devel/gamin[].
-End users can set WITH_FAM_SYSTEM to specify their preference.
+Использует монитор изменений файлов (FAM — File Alteration Monitor) как зависимость от библиотеки, либо package:devel/fam[], либо package:devel/gamin[]. Конечные пользователи могут задать WITH_FAM_SYSTEM, чтобы указать свои предпочтения.
[[uses-firebird]]
== `firebird`
-Possible arguments: (none), `25`
+Возможные аргументы: (отсутствуют), `25`
-Add a dependency to the client library of the Firebird database.
+Добавить зависимость от клиентской библиотеке базы данных Firebird.
[[uses-fonts]]
== `fonts`
-Possible arguments: (none), `fc`, `fcfontsdir` (default), `fontsdir`, `none`
+Возможные аргументы: (отсутствуют), `fc`, `fontsdir` (по умолчанию), `none`
-Adds a runtime dependency on tools needed to register fonts.
-Depending on the argument, add a `crossref:plist[plist-keywords-fc,@fc] ${FONTSDIR}` line, `crossref:plist[plist-keywords-fcfontsdir,@fcfontsdir] ${FONTSDIR}` line, `crossref:plist[plist-keywords-fontsdir,@fontsdir] ${FONTSDIR}` line, or no line if the argument is `none`, to the plist.
-`FONTSDIR` defaults to [.filename]#${PREFIX}/share/fonts/${FONTNAME}# and `FONTNAME` to `${PORTNAME}`.
-Add `FONTSDIR` to `PLIST_SUB` and `SUB_LIST`
+Добавляет зависимость во время выполнения на инструменты, необходимые для регистрации шрифтов. В зависимости от аргумента добавляет строку `crossref:plist[plist-keywords-fc,@fc] ${FONTSDIR}`, строку `crossref:plist[plist-keywords-fontsdir,@fontsdir] ${FONTSDIR}` или не добавляет строку, если аргумент `none`, в plist. `FONTSDIR` по умолчанию имеет значение [.filename]#${PREFIX}/share/fonts/${FONTNAME}#, а `FONTNAME` — `${PORTNAME}`. Добавляет `FONTSDIR` в `PLIST_SUB` и `SUB_LIST`
[[uses-fortran]]
== `fortran`
-Possible arguments: `gcc` (default)
+Возможные аргументы: `gcc` (по умолчанию)
+
+Использует компилятор GNU Fortran.
-Uses the GNU Fortran compiler.
+[[uses-fpc]]
+== `fpc`
+
+Возможные аргументы: (нет), `run`
+
+Обеспечить поддержку портов на основе Free Pascal. Установит компилятор Free Pascal и модули.
+
+Добавляет зависимость сборки от package:lang/fpc[].
+
+Если указан аргумент `run`, также добавляется зависимость запуска.
[[uses-fuse]]
== `fuse`
-Possible arguments: `2` (default), `3`
+Возможные аргументы: `2` (по умолчанию), `3`
-The port will depend on the FUSE library and handle the dependency on the kernel module depending on the version of FreeBSD.
+Порт будет зависеть от библиотеки FUSE и обрабатывать зависимость от модуля ядра в зависимости от версии FreeBSD.
[[uses-gem]]
== `gem`
-Possible arguments: (none), `noautoplist`
+Возможные аргументы: (отсутствуют), `noautoplist`
+
+Обработка сборки с RubyGems. Если используется `noautoplist`, список упаковки не генерируется автоматически.
-Handle building with RubyGems.
-If `noautoplist` is used, the packing list is not generated automatically.
+Это подразумевает `USES=ruby`.
[[uses-gettext]]
== `gettext`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Deprecated.
-Will include both <<uses-gettext-runtime,`gettext-runtime`>> and <<uses-gettext-tools,`gettext-tools`>>.
+Устарело. Будет включать как crossref:uses[uses-gettext-runtime,`gettext-runtime`], так и crossref:uses[uses-gettext-tools,`gettext-tools`].
[[uses-gettext-runtime]]
== `gettext-runtime`
-Possible arguments: (none), `lib` (default), `build`, `run`
+Возможные аргументы: (отсутствуют), `lib` (по умолчанию), `build`, `run`
-Uses package:devel/gettext-runtime[].
-By default, with no arguments or with the `lib` argument, implies a library dependency on [.filename]#libintl.so#.
-`build` and `run` implies, respectively a build-time and a run-time dependency on [.filename]#gettext#.
+Использует пакет package:devel/gettext-runtime[]. По умолчанию, без аргументов или с аргументом `lib`, подразумевает зависимость от библиотеки [.filename]#libintl.so#. Аргументы `build` и `run` подразумевают, соответственно, зависимость во время сборки и во время выполнения от [.filename]#gettext#.
[[uses-gettext-tools]]
== `gettext-tools`
-Possible arguments: (none), `build` (default), `run`
+Возможные аргументы: (отсутствуют), `build` (по умолчанию), `run`
-Uses package:devel/gettext-tools[].
-By default, with no argument, or with the `build` argument, a build time dependency on [.filename]#msgfmt# is registered.
-With the `run` argument, a run-time dependency is registered.
+Использует пакет package:devel/gettext-tools[]. По умолчанию, без аргумента или с аргументом `build`, регистрируется зависимость во время сборки от [.filename]#msgfmt#. С аргументом `run` регистрируется зависимость во время выполнения.
[[uses-ghostscript]]
== `ghostscript`
-Possible arguments: _X_, `build`, `run`, `nox11`
+Возможные аргументы: _X_, `build`, `run`, `nox11`
-A specific version _X_ can be used. Possible versions are `7`, `8`, `9`, and `agpl` (default).
-`nox11` indicates that the `-nox11` version of the port is required.
-`build` and `run` add build- and run-time dependencies on Ghostscript.
-The default is both build- and run-time dependencies.
+Можно указать конкретную версию _X_. Доступные версии: `7`, `8`, `9` и `agpl` (по умолчанию). `nox11` указывает, что требуется версия порта `-nox11`. `build` и `run` добавляют зависимости на Ghostscript во время сборки и выполнения соответственно. По умолчанию добавляются зависимости как на сборку, так и на выполнение.
[[uses-gl]]
== `gl`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Provides an easy way to depend on GL components.
-The components should be listed in `USE_GL`.
-The available components are:
+Предоставляет простой способ зависеть от компонентов GL. Компоненты должны быть перечислены в `USE_GL`. Доступные компоненты:
`egl`::
-add a library dependency on [.filename]#libEGL.so# from package:graphics/libglvnd[]
+добавить зависимость от библиотеки [.filename]#libEGL.so# из пакета package:graphics/libglvnd[]
`gbm`::
-Add a library dependency on [.filename]#libgbm.so# from package:graphics/mesa-libs[]
+Добавить зависимость от библиотеки [.filename]#libgbm.so# из пакета package:graphics/mesa-libs[]
`gl`::
-Add a library dependency on [.filename]#libGL.so# from package:graphics/libglvnd[]
+Добавить зависимость от библиотеки [.filename]#libGL.so# из пакета package:graphics/libglvnd[]
`glesv2`::
-Add a library dependency on [.filename]#libGLESv2.so# from package:graphics/libglvnd[]
+Добавить зависимость от библиотеки [.filename]#libGLESv2.so# из пакета package:graphics/libglvnd[]
`glew`::
-Add a library dependency on [.filename]#libGLEW.so# from package:graphics/glew[]
+Добавить зависимость от библиотеки [.filename]#libGLEW.so# из пакета package:graphics/glew[]
`glu`::
-Add a library dependency on [.filename]#libGLU.so# from package:graphics/libGLU[]
+Добавить зависимость от библиотеки [.filename]#libGLU.so# из package:graphics/libGLU[]
`glut`::
-Add a library dependency on [.filename]#libglut.so# from package:graphics/freeglut[]
+Добавить зависимость от библиотеки [.filename]#libglut.so# из package:graphics/freeglut[]
`opengl`::
-Add a library dependency on [.filename]#libOpenGL.so# from package:graphics/libglvnd[]
+Добавить зависимость от библиотеки [.filename]#libOpenGL.so# из package:graphics/libglvnd[]
[[uses-gmake]]
== `gmake`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Uses package:devel/gmake[] as a build-time dependency and sets up the environment to use `gmake` as the default `make` for the build.
+Использует пакет package:devel/gmake[] как зависимость во время сборки и настраивает окружение для использования `gmake` в качестве стандартного `make` при сборке.
[[uses-gnome]]
== `gnome`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Provides an easy way to depend on GNOME components.
-The components should be listed in `USE_GNOME`.
-The available components are:
+Предоставляет простой способ зависеть от компонентов GNOME. Компоненты должны быть перечислены в `USE_GNOME`. Доступные компоненты:
* `atk`
* `atkmm`
@@ -529,6 +830,7 @@ The available components are:
* `glibmm`
* `gnomecontrolcenter3`
* `gnomedesktop3`
+* `gnomedesktop4`
* `gnomedocutils`
* `gnomemenus3`
* `gnomemimedata`
@@ -595,8 +897,7 @@ The available components are:
* `vte`
* `vte3`
-The default dependency is build- and run-time, it can be changed with `:build` or `:run`.
-For example:
+Зависимость по умолчанию — на время сборки и выполнения, её можно изменить с помощью `:build` или `:run`. Например:
[.programlisting]
....
@@ -604,105 +905,79 @@ USES= gnome
USE_GNOME= gnomemenus3:build intlhack
....
-See crossref:special[using-gnome,Using GNOME] for more information.
+См. crossref:special[using-gnome,Использование GNOME] для получения дополнительной информации.
[[uses-go]]
== `go`
[IMPORTANT]
====
-Ports should not be created for Go libs, see crossref:special[go-libs,Go Libraries] for more information.
+Порты не следует создавать для библиотек Go, дополнительную информацию см. в crossref:special[go-libs,Библиотеки Go].
====
-Possible arguments: (none), `modules`, `no_targets`, `run`
+Возможные аргументы: (нет), `N.NN`, `N.NN-devel`, `modules`, `no_targets`, `run`
-Sets default values and targets used to build Go software.
-A build dependency on the Go compiler port selected via `GO_PORT` is added.
-By default the build is performed in GOPATH mode.
-If Go software uses modules, the modules-aware mode can be switched on with `modules` argument.
-`no_targets` will setup build environment like `GO_ENV`, `GO_BUILDFLAGS` but skip creating `post-extract` and `do-{build,install,test}` targets.
-`run` will also add a run dependency on what is in `GO_PORT`.
+Устанавливает значения и цели по умолчанию, используемые для сборки ПО на Go. Добавляется зависимость сборки от порта компилятора Go, сопровождающие порта могут установить требуемую версию. По умолчанию сборка выполняется в режиме GOPATH. Если ПО на Go использует модули, режим с поддержкой модулей можно включить с помощью аргумента `modules`. `no_targets` настроит окружение сборки, как `GO_ENV`, `GO_BUILDFLAGS`, но пропустит создание целей извлечения (extract) и сборки (build). `run` также добавит зависимость выполнения от порта компилятора Go.
-The build process is controlled by several variables:
+Процесс сборки контролируется несколькими переменными:
`GO_MODULE`::
-The name of the application module as specified by the `module` directive in `go.mod`.
-In most cases, this is the only required variable for ports that use Go modules.
+Имя модуля приложения, указанное директивой `module` в `go.mod`. В большинстве случаев это единственная необходимая переменная для портов, использующих модули Go.
`GO_PKGNAME`::
-The name of the Go package when building in GOPATH mode.
-This is the directory that will be created in `${GOPATH}/src`.
-If not set explicitly and `GH_SUBDIR` or `GL_SUBDIR` is present, `GO_PKGNAME` will be inferred from it.
-It is not needed when building in modules-aware mode.
+Имя пакета Go при сборке в режиме GOPATH. Это каталог, который будет создан в `${GOPATH}/src`. Если не задано явно и присутствует `GH_SUBDIR` или `GL_SUBDIR`, то `GO_PKGNAME` будет выведено из них. Не требуется при сборке в режиме с поддержкой модулей.
`GO_TARGET`::
-The packages to build.
-The default value is `${GO_PKGNAME}`.
-`GO_TARGET` can also be a tuple in the form `package:path` where path can be either a simple filename or a full path starting with `${PREFIX}`.
+Пакеты для сборки. Значение по умолчанию — `${GO_PKGNAME}`. `GO_TARGET` также может быть кортежем в формате `package:path`, где path может быть либо простым именем файла, либо полным путём, начинающимся с `${PREFIX}`.
`GO_TESTTARGET`::
-The packages to test.
-The default value is `./...` (the current package and all subpackages).
+Пакеты для тестирования. Значение по умолчанию — `./...` (текущий пакет и все подпакеты).
`CGO_CFLAGS`::
-Additional `CFLAGS` values to be passed to the C compiler by `go`.
+Дополнительные значения `CFLAGS`, передаваемые компилятору C с помощью `go`.
`CGO_LDFLAGS`::
-Additional `LDFLAGS` values to be passed to the C compiler by `go`.
+Дополнительные значения `LDFLAGS`, передаваемые компилятору C через `go`.
`GO_BUILDFLAGS`::
-Additional build arguments to be passed to `go build`.
+Дополнительные аргументы сборки, передаваемые в `go build`.
`GO_TESTFLAGS`::
-Additional build arguments to be passed to `go test`.
+Дополнительные аргументы сборки, передаваемые в `go test`.
-`GO_PORT`::
-The Go compiler port to use.
-By default this is package:lang/go[] but can be set to package:lang/go-devel[] in `make.conf` for testing with future Go versions.
-+
-[WARNING]
-====
-This variable must not be set by individual ports!
-====
-
-See crossref:special[using-go,Building Go Applications] for usage examples.
+См. crossref:special[using-go,Сборка приложений на Go] для примеров использования.
[[uses-gperf]]
== `gperf`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Add a buildtime dependency on package:devel/gperf[] if `gperf` is not present in the base system.
+Добавить зависимость во время сборки на package:devel/gperf[], если `gperf` отсутствует в базовой системе.
[[uses-grantlee]]
== `grantlee`
-Possible arguments: `5`, `selfbuild`
+Возможные аргументы: `5`, `selfbuild`
-Handle dependency on Grantlee.
-Specify `5` to depend on the Qt5 based version, package:devel/grantlee5[].
-`selfbuild` is used internally by package:devel/grantlee5[] to get their versions numbers.
+Обработать зависимость от Grantlee. Указать `5` для зависимости от версии на основе Qt5, package:devel/grantlee5[]. `selfbuild` используется внутри package:devel/grantlee5[] для получения номеров их версий.
[[uses-groff]]
== `groff`
-Possible arguments: `build`, `run`, `both`
+Возможные аргументы: `build`, `run`, `both`
-Registers a dependency on package:textproc/groff[] if not present in the base system.
+Регистрирует зависимость от package:textproc/groff[], если пакет отсутствует в базовой системе.
[[uses-gssapi]]
== `gssapi`
-Possible arguments: (none), `base` (default), `heimdal`, `mit`, `flags`, `bootstrap`
+Возможные аргументы: (отсутствуют), `base` (по умолчанию), `heimdal`, `mit`, `flags`, `bootstrap`
-Handle dependencies needed by consumers of the GSS-API.
-Only libraries that provide the Kerberos mechanism are available.
-By default, or set to `base`, the GSS-API library from the base system is used.
-Can also be set to `heimdal` to use package:security/heimdal[], or `mit` to use package:security/krb5[].
+Обрабатывает зависимости, необходимые для использования GSS-API. Доступны только библиотеки, предоставляющие механизм Kerberos. По умолчанию (или при значении `base`) используется библиотека GSS-API из базовой системы. Также можно установить значение `heimdal` для использования package:security/heimdal[] или `mit` для использования package:security/krb5[].
-When the local Kerberos installation is not in `LOCALBASE`, set `HEIMDAL_HOME` (for `heimdal`) or `KRB5_HOME` (for `krb5`) to the location of the Kerberos installation.
+Если локальная установка Kerberos не находится в `LOCALBASE`, установите `HEIMDAL_HOME` (для `heimdal`) или `KRB5_HOME` (для `krb5`) на каталог установки Kerberos.
-These variables are exported for the ports to use:
+Эти переменные экспортируются для использования портами:
* `GSSAPIBASEDIR`
* `GSSAPICPPFLAGS`
@@ -712,14 +987,12 @@ These variables are exported for the ports to use:
* `GSSAPILIBS`
* `GSSAPI_CONFIGURE_ARGS`
-The `flags` option can be given alongside `base`, `heimdal`, or `mit` to automatically add `GSSAPICPPFLAGS`, `GSSAPILDFLAGS`, and `GSSAPILIBS` to `CFLAGS`, `LDFLAGS`, and `LDADD`, respectively.
-For example, use `base,flags`.
+Опция `flags` может быть указана вместе с `base`, `heimdal` или `mit` для автоматического добавления `GSSAPICPPFLAGS`, `GSSAPILDFLAGS` и `GSSAPILIBS` в `CFLAGS`, `LDFLAGS` и `LDADD` соответственно. Например, используйте `base,flags`.
-The `bootstrap` option is a special prefix only for use by package:security/krb5[] and package:security/heimdal[].
-For example, use `bootstrap,mit`.
+Опция `bootstrap` — это специальный префикс, предназначенный только для использования в package:security/krb5[] и package:security/heimdal[]. Например, используйте `bootstrap,mit`.
[[uses-gssapi-ex1]]
-.Typical Use
+.Типичное использование
[example]
====
[.programlisting]
@@ -738,98 +1011,375 @@ GSSAPI_NONE_CONFIGURE_ON= --without-gssapi
====
+[[uses-gstreamer]]
+== `gstreamer`
+
+Возможные аргументы: (отсутствуют)
+
+Предоставляет простой способ зависимости от компонентов GStreamer. Компоненты должны быть перечислены в `USE_GSTREAMER`. Доступные компоненты:
+
+* `a52dec`
+* `aalib`
+* `amrnb`
+* `amrwbdec`
+* `aom`
+* `assrender`
+* `bad`
+* `bs2b`
+* `cairo`
+* `cdio`
+* `cdparanoia`
+* `chromaprint`
+* `curl`
+* `dash`
+* `dtls`
+* `dts`
+* `dv`
+* `dvd`
+* `dvdread`
+* `editing-services`
+* `faac`
+* `faad`
+* `flac`
+* `flite`
+* `gdkpixbuf`
+* `gl`
+* `gme`
+* `gnonlin`
+* `good`
+* `gsm`
+* `gtk4`
+* `gtk`
+* `hal`
+* `hls`
+* `jack`
+* `jpeg`
+* `kate`
+* `kms`
+* `ladspa`
+* `lame`
+* `libav`
+* `libcaca`
+* `libde265`
+* `libmms`
+* `libvisual`
+* `lv2`
+* `mm`
+* `modplug`
+* `mpeg2dec`
+* `mpeg2enc`
+* `mpg123`
+* `mplex`
+* `musepack`
+* `neon`
+* `ogg`
+* `opencv`
+* `openexr`
+* `openh264`
+* `openjpeg`
+* `openmpt`
+* `opus`
+* `pango`
+* `png`
+* `pulse`
+* `qt`
+* `resindvd`
+* `rsvg`
+* `rtmp`
+* `shout2`
+* `sidplay`
+* `smoothstreaming`
+* `sndfile`
+* `sndio`
+* `soundtouch`
+* `soup`
+* `spandsp`
+* `speex`
+* `srtp`
+* `taglib`
+* `theora`
+* `ttml`
+* `twolame`
+* `ugly`
+* `v4l2`
+* `vorbis`
+* `vpx`
+* `vulkan`
+* `wavpack`
+* `webp`
+* `webrtcdsp`
+* `x264`
+* `x265`
+* `x`
+* `ximagesrc`
+* `zbar`
+
+[[uses-guile]]
+== `guile`
+
+Возможные аргументы: (нет), `_X.Y_`, `flavors`, `build`, `run`, `alias`, `conflicts`
+
+Добавляет зависимость от Guile. По умолчанию это зависимость от соответствующей библиотеки `libguile*.so`, если не переопределено опциями `build` и/или `run`. Опция `alias` настраивает `BINARY_ALIAS` соответствующим образом (см. crossref:makefiles[binary-alias,Использование `BINARY_ALIAS`]).
+
+Версия по умолчанию устанавливается с помощью обычного механизма `DEFAULT_VERSIONS`; если версия по умолчанию не входит в список указанных версий, то используется последняя доступная версия из списка.
+
+Приложения, использующие Guile, обычно собираются только для одной версии Guile. Однако модули расширений или библиотек должны использовать опцию `flavors` для сборки с несколькими флейворами.
+
+Для получения дополнительной информации см. crossref:special[using-guile,Использование Guile].
+
[[uses-horde]]
== `horde`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Add buildtime and runtime dependencies on package:devel/pear-channel-horde[].
-Other Horde dependencies can be added with `USE_HORDE_BUILD` and `USE_HORDE_RUN`.
-See crossref:special[php-horde,Horde Modules] for more information.
+Добавить зависимости времени сборки и выполнения для package:devel/pear-channel-horde[]. Другие зависимости Horde можно добавить с помощью `USE_HORDE_BUILD` и `USE_HORDE_RUN`. Дополнительную информацию см. в разделе crossref:special[php-horde,Модули Horde].
[[uses-iconv]]
== `iconv`
-Possible arguments: (none), `lib`, `build`, `patch`, `translit`, `wchar_t`
+Возможные аргументы: (нет), `lib`, `build`, `patch`, `translit`, `wchar_t`
-Uses `iconv` functions, either from the port package:converters/libiconv[] as a build-time and run-time dependency, or from the base system.
-By default, with no arguments or with the `lib` argument, implies `iconv` with build-time and run-time dependencies.
-`build` implies a build-time dependency, and `patch` implies a patch-time dependency.
-If the port uses the `WCHAR_T` or `//TRANSLIT` iconv extensions, add the relevant arguments so that the correct iconv is used.
-For more information see crossref:special[using-iconv,Using `iconv`].
+Использует функции `iconv`, либо из порта package:converters/libiconv[] как зависимость на этапе сборки и выполнения, либо из базовой системы. По умолчанию, без аргументов или с аргументом `lib`, подразумевает `iconv` с зависимостями на этапе сборки и выполнения. `build` подразумевает зависимость на этапе сборки, а `patch` — на этапе патчинга. Если порт использует расширения `WCHAR_T` или `//TRANSLIT` для `iconv`, добавьте соответствующие аргументы, чтобы использовалась правильная версия `iconv`. Для получения дополнительной информации см. crossref:special[using-iconv,Использование `iconv`].
[[uses-imake]]
== `imake`
-Possible arguments: (none), `env`, `notall`, `noman`
+Возможные аргументы: (нет), `env`, `notall`, `noman`
+
+Добавить package:devel/imake[] как зависимость на этапе сборки и выполнить `xmkmf -a` на этапе `configure`. Если указан аргумент `env`, цель `configure` не устанавливается. Если флаг `-a` вызывает проблемы для порта, добавьте аргумент `notall`. Если `xmkmf` не генерирует цель `install.man`, добавьте аргумент `noman`.
+
+[[uses-java]]
+== `java`
+
+Возможные аргументы: (нет), `ant`, `build`, `extract`, `run`
+
+По умолчанию используется `USES=java:build,run`, если аргументы не предоставлены и `NO_BUILD` не определен. Если `NO_BUILD` определен, используется `USES=java:run`. Если указан аргумент `ant`, порт использует Apache Ant. Если указан аргумент `build`, порт JDK добавляется в зависимости сборки. Если указан аргумент `extract`, порт JDK добавляется в зависимости извлечения. Если указан аргумент `run`, порт JDK добавляется в зависимости выполнения.
+
+Фреймворк предоставляет следующие переменные, которые могут быть установлены портом:
+
+`JAVA_VERSION`::
+Список подходящих версий Java для порта, разделенных пробелами. Необязательный символ `\+` позволяет указать диапазон версий. (допустимые значения `8[+]`, `11[\+]`, `17[+]`, `18[\+]`, `19[+]`, `20[\+]`, `21[+]`, `22[\+]`, `22[+]`)
+
+`JAVA_OS`::
+Список поддерживаемых операционных систем для порта JDK, разделённых пробелами. (допустимые значения: `native`, `linux`)
+
+`JAVA_VENDOR`::
+Список подходящих поставщиков портов JDK для порта, разделенных пробелами. (допустимые значения: `openjdk`, `oracle`)
+
+Фреймворк предоставляет следующие переменные для чтения портом:
+
+`JAVA_PORT`::
+Имя порта JDK. (например, 'java/openjdk8')
+
+`JAVA_PORT_VERSION`::
+Версия порта JDK. (например, '8')
+
+`JAVA_PORT_OS`::
+Используемая операционная система для порта JDK. (например, 'linux')
+
+`JAVA_PORT_VENDOR`::
+Поставщик порта JDK. (например, 'openjdk')
+
+`JAVA_PORT_OS_DESCRIPTION`::
+Описание операционной системы, используемой портом JDK. (например, 'Linux')
+
+`JAVA_PORT_VENDOR_DESCRIPTION`::
+Описание поставщика порта JDK. (например, 'OpenJDK BSD Porting Team')
+
+`JAVA_HOME`::
+Путь к каталогу установки JDK. (например, [.filename]#/usr/local/openjdk8#)
+
+`JAVAC`::
+Путь к используемому компилятору Java. (например, [.filename]#/usr/local/openjdk8/bin/javac# или [.filename]#/usr/local/bin/javac#)
+
+`JAR`::
+Путь к используемому инструменту JAR. (например, [.filename]#/usr/local/openjdk8/bin/jar# или [.filename]#/usr/local/bin/fastjar#)
+
+`APPLETVIEWER`::
+Путь к утилите appletviewer. (например, [.filename]#/usr/local/linux-jdk1.8.0/bin/appletviewer#)
+
+`JAVA`::
+Путь к исполняемому файлу `java`. Используется для запуска программ на Java. (например, [.filename]#/usr/local/openjdk8/bin/java#)
+
+`JAVADOC`::
+Путь к программе `javadoc`.
+
+`JAVAH`::
+Путь к программе `javah`.
+
+`JAVAP`::
+Путь к программе `javap`.
+
+`JAVA_KEYTOOL`::
+Путь к утилите `keytool`.
+
+`JAVA_N2A`::
+Путь к инструменту `native2ascii`.
+
+`JAVA_POLICYTOOL`::
+Путь к программе `policytool`.
+
+`JAVA_SERIALVER`::
+Путь к утилите `serialver`.
+
+`RMIC`::
+Путь к генератору RMI-заглушек/скелетов, `rmic`.
+
+`RMIREGISTRY`::
+Путь к программе реестра RMI, `rmiregistry`.
+
+`RMID`::
+Путь к программе демона RMI.
+
+`JAVA_CLASSES`::
+Путь к архиву, содержащему файлы классов JDK. В большинстве JDK это [.filename]#${JAVA_HOME}/jre/lib/rt.jar#.
+
+`JAVASHAREDIR`::
+Базовый каталог для всех общих ресурсов Java.
+
+`JAVAJARDIR`::
+Каталог, в котором порт должен устанавливать JAR-файлы.
+
+`JAVALIBDIR`::
+Каталог, в котором находятся JAR-файлы, установленные другими портами.
-Add package:devel/imake[] as a build-time dependency and run `xmkmf -a` during the `configure` stage.
-If the `env` argument is given, the `configure` target is not set.
-If the `-a` flag is a problem for the port, add the `notall` argument.
-If `xmkmf` does not generate a `install.man` target, add the `noman` argument.
+[[uses-jpeg]]
+== `jpeg`
+
+Возможные аргументы: `lib` (по умолчанию, подразумевается), `build`, `run`
+
+Помощь в обработке зависимостей от `jpeg`.
+
+Если указан аргумент `lib` или аргументы не предоставлены, то в порт добавляется зависимость от библиотеки.
+
+Если указан аргумент `build`, то в порт добавляется зависимость сборки.
+
+Если указан аргумент `run`, то к порту добавляется зависимость времени выполнения.
+
+Если указан аргумент `both`, то к порту добавляется зависимость для сборки и зависимость для выполнения.
+
+Фреймворк предоставляет следующую переменную, которая может быть установлена портами:
+
+`JPEG_PORT`::
+Указывает реализацию JPEG для использования. Возможные значения:
+
+* package:graphics/jpeg-turbo[] (по умолчанию)
+* package:graphics/mozjpeg[]
[[uses-kde]]
== `kde`
-Possible arguments: `5`
+Возможные аргументы: `5`
-Add dependency on KDE components.
-See crossref:special[using-kde,Using KDE] for more information.
+Добавить зависимость от компонентов KDE. Подробнее см. в crossref:special[using-kde,Использование KDE].
[[uses-kmod]]
== `kmod`
-Possible arguments: (none), `debug`
+Возможные аргументы: (отсутствуют), `debug`
+
+Заполняет шаблон для портов модулей ядра, в настоящее время:
+
+* Добавьте `kld` в `CATEGORIES`.
+* Установите `SSP_UNSAFE`.
+* Установите `IGNORE`, если исходные коды ядра не найдены в `SRC_BASE`.
+* Определить `KMODDIR` по умолчанию как [.filename]#/boot/modules#, добавить его в `PLIST_SUB` и `MAKE_ENV`, а также создать его при установке. Если `KMODDIR` установлен в [.filename]#/boot/kernel#, он будет перезаписан в [.filename]#/boot/modules#. Это предотвращает повреждение пакетов при обновлении ядра из-за переименования [.filename]#/boot/kernel# в [.filename]#/boot/kernel.old# в процессе.
+* Обрабатывать перекрестные ссылки на модули ядра при установке и удалении, используя crossref:plist[plist-keywords-kld,`@kld`].
+* Если указан аргумент `debug`, порт может установить отладочную версию модуля в [.filename]#KERN_DEBUGDIR#/[.filename]#KMODDIR#. По умолчанию `KERN_DEBUGDIR` копируется из `DEBUGDIR` и устанавливается в [.filename]#/usr/lib/debug#. Фреймворк позаботится о создании и удалении необходимых каталогов.
+
+[[uses-kodi]]
+== `kodi`
+
+Возможные аргументы: (отсутствуют), `noautoplist`
+
+Обеспечить поддержку дополнений для package:multimedia/kodi[]. Если указан аргумент `noautoplist`, автоматическое создание `plist` не выполняется.
+
+[[uses-lazarus]]
+== `lazarus`
+
+Возможные аргументы: (отсутствуют), `gtk2` (по умолчанию), `qt5`, `qt6`, `flavors`
+
+Обеспечить поддержку портов на основе package:editors/lazarus[].
+
+Если аргументы не предоставлены или указан `gtk2`, приложение lazarus-app будет собрано с интерфейсом `gtk2`, и порт package:editors/lazarus[] будет собран с интерфейсом `gtk2`.
+
+Если указан аргумент `qt5`, приложение lazarus-app собирается с интерфейсом `qt5`.
+
+Если указан аргумент `qt6`, приложение lazarus-app собирается с интерфейсом `qt6`.
+
+Если указан аргумент `flavors`, приложение `lazarus-app` собирается с поддержкой функций флейворов.
+
+Если порт не требует автоматической компиляции файлов проекта lazarus, можно определить следующую переменную:
+
+`NO_LAZBUILD`= `yes`
-Fills in the boilerplate for kernel module ports, currently:
+Доступны следующие переменные для портов:
-* Add `kld` to `CATEGORIES`.
-* Set `SSP_UNSAFE`.
-* Set `IGNORE` if the kernel sources are not found in `SRC_BASE`.
-* Define `KMODDIR` to [.filename]#/boot/modules# by default, add it to `PLIST_SUB` and `MAKE_ENV`, and create it upon installation. If `KMODDIR` is set to [.filename]#/boot/kernel#, it will be rewritten to [.filename]#/boot/modules#. This prevents breaking packages when upgrading the kernel due to [.filename]#/boot/kernel# being renamed to [.filename]#/boot/kernel.old# in the process.
-* Handle cross-referencing kernel modules upon installation and deinstallation, using crossref:plist[plist-keywords-kld,`@kld`].
-* If the `debug` argument is given, the port can install a debug version of the module into [.filename]#KERN_DEBUGDIR#/[.filename]#KMODDIR#. By default, `KERN_DEBUGDIR` is copied from `DEBUGDIR` and set to [.filename]#/usr/lib/debug#. The framework will take care of creating and removing any required directories.
+`LAZARUS_PROJECT_FILES`::
+Список lpi-файлов. Он не должен быть пустым. По умолчанию: пусто
+
+`LAZARUS_DIR`::
+Путь к директории установки lazarus. По умолчанию: [.filename]#${LOCALBASE}/share/lazarus-${LAZARUS_VER}#
+
+`LAZBUILD_ARGS`::
+Дополнительные аргументы lazbuild. В большинстве случаев это может быть `-d`. Подробнее см. man:lazbuild[1]. По умолчанию: пусто
+
+`LAZARUS_NO_FLAVORS`::
+Не собирать эти флейворы lazarus. Если `LAZARUS_NO_FLAVORS` не определена, то предполагаются все допустимые флейворы lazarus.
+
+`WANT_LAZARUS_DEVEL`::
+Если установлено значение `yes`, то используйте package:lazarus/devel[] как зависимость сборки.
+
+[[uses-ldap]]
+== `ldap`
+
+Возможные аргументы: (нет), <версия>, клиент, сервер
+
+Регистрирует зависимость от пакета package:net/openldap[]. Использует конкретную `<версию>` (без точечной нотации), если она указана. В противном случае пытается найти установленную версию. При необходимости возвращается к версии по умолчанию, указанной в `bsd.default-versions.mk`. `client` указывает на зависимость во время выполнения от клиентской библиотеки. Это также значение по умолчанию. `server` указывает на зависимость во время выполнения от сервера.
+
+Следующие переменные могут быть доступны для порта:
+
+`IGNORE_WITH_OPENLDAP`::
+Эта переменная может быть определена, если порты не поддерживают одну или несколько версий OpenLDAP.
+`WITH_OPENLDAP_VER`::
+Пользовательская переменная для установки версии OpenLDAP.
+`OPENLDAP_VER`::
+Обнаруженная версия OpenLDAP.
[[uses-lha]]
== `lha`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Set `EXTRACT_SUFX` to `.lzh`
+Установите `EXTRACT_SUFX` в `.lzh`
[[uses-libarchive]]
== `libarchive`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Registers a dependency on package:archivers/libarchive[].
-Any ports depending on libarchive must include `USES=libarchive`.
+Регистрирует зависимость от package:archivers/libarchive[]. Любые порты, зависящие от libarchive, должны включать `USES=libarchive`.
[[uses-libedit]]
== `libedit`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Registers a dependency on package:devel/libedit[].
-Any ports depending on libedit must include `USES=libedit`.
+Регистрирует зависимость от package:devel/libedit[]. Все порты, зависящие от libedit, должны включать `USES=libedit`.
[[uses-libtool]]
== `libtool`
-Possible arguments: (none), `keepla`, `build`
+Возможные аргументы: (нет), `keepla`, `build`
-Patches `libtool` scripts. This must be added to all ports that use `libtool`.
-The `keepla` argument can be used to keep [.filename]#.la# files.
-Some ports do not ship with their own copy of libtool and need a build time dependency on package:devel/libtool[], use the `:build` argument to add such dependency.
+Исправляет скрипты `libtool`. Это должно быть добавлено во все порты, использующие `libtool`. Аргумент `keepla` может быть использован для сохранения файлов [.filename]#.la#. Некоторые порты не поставляются с собственной копией libtool и требуют зависимость во время сборки от package:devel/libtool[], используйте аргумент `:build` для добавления такой зависимости.
[[uses-linux]]
== `linux`
-Possible arguments: `c6`, `c7`
+Возможные аргументы: `c6`, `c7`
-Ports Linux compatibility framework.
-Specify `c6` to depend on CentOS 6 packags.
-Specify `c7` to depend on CentOS 7 packages. The available packages are:
+Порт фреймворка совместимости с Linux. Укажите `c6` для зависимостей от пакетов CentOS 6. Укажите `c7` для зависимостей от пакетов CentOS 7. Доступные пакеты:
* `allegro`
* `alsa-plugins-oss`
@@ -904,63 +1454,96 @@ Specify `c7` to depend on CentOS 7 packages. The available packages are:
* `ucl`
* `xorglibs`
+[[uses-llvm]]
+== `llvm`
+
+Возможные аргументы: (нет), `_XY_`, min=`_XY_`, max=`_XY_`, build, run, lib
+
+Добавляет зависимость от LLVM. По умолчанию это зависимость для сборки, если не переопределено опциями `run` или `lib`. Версия по умолчанию задаётся в `LLVM_DEFAULT`. Также можно указать конкретную версию. Минимальную и максимальную версии можно указать с помощью параметров `min` и `max` соответственно. Фреймворк портов экспортирует следующие переменные в порт:
+
+`LLVM_VERSION`::
+Версия, выбранная из аргументов к llvm.mk
+`LLVM_PORT`::
+Выбранный порт llvm
+`LLVM_CONFIG`::
+`llvm-config` выбранного порта
+`LLVM_LIBLLVM`::
+`libLLVM.so` выбранного порта
+`LLVM_PREFIX`::
+Префикс инсталляции выбранного порта
+
[[uses-localbase]]
== `localbase`
-Possible arguments: (none), `ldflags`
+Возможные аргументы: (отсутствуют), `ldflags`
-Ensures that libraries from dependencies in `LOCALBASE` are used instead of the ones from the base system.
-Specify `ldflags` to add `-L${LOCALBASE}/lib` to `LDFLAGS` instead of `LIBS`.
-Ports that depend on libraries that are also present in the base system should use this.
-It is also used internally by a few other `USES`.
+Гарантирует использование библиотек из зависимостей в `LOCALBASE` вместо библиотек из базовой системы. Указывает `ldflags` для добавления `-L${LOCALBASE}/lib` в `LDFLAGS` вместо `LIBS`. Порты, зависящие от библиотек, которые также присутствуют в базовой системе, должны использовать эту опцию. Она также используется внутри несколькими другими `USES`.
[[uses-lua]]
== `lua`
-Possible arguments: (none), `_XY_`, `_XY_+`, `-_XY_`, `_XY_-_ZA_`, `module`, `flavors`, `build`, `run`, `env`
+Возможные аргументы: (нет), `_XY_`, `_XY_+`, `-_XY_`, `_XY_-_ZA_`, `module`, `flavors`, `build`, `run`, `env`
+
+Добавляет зависимость от Lua. По умолчанию это зависимость от библиотеки, если не переопределено опциями `build` и/или `run`. Опция `env` предотвращает добавление любой зависимости, при этом все обычные переменные остаются определенными.
+
+Версия по умолчанию устанавливается с помощью обычного механизма `DEFAULT_VERSIONS`, если только версия или диапазон версий не указаны в качестве аргумента, например, `51` или `51-54`.
+
+Приложения, использующие Lua, обычно собираются только для одной версии Lua. Однако модули библиотек, предназначенные для загрузки кодом Lua, должны использовать опцию `module` для сборки с несколькими вариантами.
+
+Для получения дополнительной информации см. crossref:special[using-lua,Использование Lua].
-Adds a dependency on Lua.
-By default this is a library dependency, unless overridden by the `build` and/or `run` option.
-The `env` option prevents the addition of any dependency, while still defining all the usual variables.
+[[uses-luajit]]
+== `luajit`
-The default version is set by the usual `DEFAULT_VERSIONS` mechanism, unless a version or range of versions is specified as an argument, for example, `51` or `51-53`.
+Возможные аргументы: (нет), `_X_`
-Applications using Lua are normally built for only a single Lua version.
-However, library modules intended to be loaded by Lua code should use the `module` option to build with multiple flavors.
+Добавляет зависимость от среды выполнения luajit. Можно указать конкретную версию _X_. Доступные версии: `luajit`, `luajit-devel`, `luajit-openresty`
-For more information see crossref:special[using-lua,Using Lua].
+После включения [.filename]#bsd.port.options.mk# или [.filename]#bsd.port.pre.mk# порт может проверять эти переменные:
+
+`LUAJIT_VER`::
+Выбранная версия luajit
+`LUAJIT_INCDIR`::
+Путь к заголовочным файлам luajit
+`LUAJIT_LUAVER`::
+Какой версии спецификации luajit выбрана (2.0 для luajit, иначе 2.1)
+
+Для получения дополнительной информации см. crossref:special[using-lua,Использование Lua].
[[uses-lxqt]]
== `lxqt`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
+
+Обработка зависимостей для рабочей среды LXQt. Используйте `USE_LXQT` для выбора необходимых компонентов для порта. Дополнительную информацию см. в разделе crossref:special[using-lxqt,Использование LXQt].
+
+[[uses-magick]]
+== `magick`
+
+Возможные аргументы: (нет), `_X_`, `build`, `nox11`, `run`, `test`
-Handle dependencies for the LXQt Desktop Environment.
-Use `USE_LXQT` to select the components needed for the port.
-See crossref:special[using-lxqt,Using LXQt] for more information.
+Добавить зависимость библиотеки от `ImageMagick`. Можно указать конкретную версию _X_. Доступные версии: `6` и `7` (по умолчанию). `nox11` означает, что требуется версия порта `-nox11`. `build`, `run` и `test` добавляют зависимости на сборку, выполнение и тестирование для ImageMagick.
[[uses-makeinfo]]
== `makeinfo`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Add a build-time dependency on `makeinfo` if it is not present in the base system.
+Добавить зависимость во время сборки на `makeinfo`, если его нет в базовой системе.
[[uses-makeself]]
== `makeself`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Indicates that the distribution files are makeself archives and sets the appropriate dependencies.
+Указывает, что файлы дистрибутива являются архивами makeself и устанавливает соответствующие зависимости.
[[uses-mate]]
== `mate`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Provides an easy way to depend on MATE components.
-The components should be listed in `USE_MATE`.
-The available components are:
+Предоставляет простой способ зависимостей от компонентов MATE. Компоненты должны быть перечислены в `USE_MATE`. Доступные компоненты:
* `autogen`
* `caja`
@@ -983,8 +1566,7 @@ The available components are:
* `session`
* `settingsdaemon`
-The default dependency is build- and run-time, it can be changed with `:build` or `:run`.
-For example:
+Зависимость по умолчанию — на время сборки и выполнения, её можно изменить с помощью `:build` или `:run`. Например:
[.programlisting]
....
@@ -995,138 +1577,233 @@ USE_MATE= menus:build intlhack
[[uses-meson]]
== `meson`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Provide support for Meson based projects.
-For more information see crossref:special[using-meson,Using `meson`].
+Предоставить поддержку для проектов на основе Meson. Дополнительную информацию смотрите в crossref:special[using-meson,Использование `meson`].
[[uses-metaport]]
== `metaport`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Sets the following variables to make it easier to create a metaport: `MASTER_SITES`, `DISTFILES`, `EXTRACT_ONLY`, `NO_BUILD`, `NO_INSTALL`, `NO_MTREE`, `NO_ARCH`.
+Устанавливает следующие переменные для упрощения создания метапорта: `MASTER_SITES`, `DISTFILES`, `EXTRACT_ONLY`, `NO_BUILD`, `NO_INSTALL`, `NO_MTREE`, `NO_ARCH`.
+
+[[uses-minizip]]
+== `minizip`
+
+Возможные аргументы: (отсутствуют), `ng`
+
+Добавляет зависимость библиотеки от package:archivers/minizip[] или package:archivers/minizip-ng[] соответственно.
+
+[[uses-mlt]]
+== `mlt`
+
+Возможные аргументы: `7`, `nodepend`
+
+Обеспечить поддержку портов, зависящих от package:multimedia/mlt7[].
+
+Если указан аргумент `nodepend`, зависимости от библиотек не создаются. Этот аргумент имеет смысл только для портов multimedia/mlt7*.
[[uses-mysql]]
== `mysql`
-Possible arguments: (none), `_version_`, `client` (default), `server`, `embedded`
+Возможные аргументы: (отсутствуют), `_версия_`, `client` (по умолчанию), `server`, `embedded`
-Provide support for MySQL
-If no version is given, try to find the current installed version.
-Fall back to the default version, MySQL-5.6.
-The possible versions are `55`, `55m`, `55p`, `56`, `56p`, `56w`, `57`, `57p`, `80`, `100m`, `101m`, and `102m`.
-The `m` and `p` suffixes are for the MariaDB and Percona variants of MySQL.
-`server` and `embedded` add a build- and run-time dependency on the MySQL server.
-When using `server` or `embedded`, add `client` to also add a dependency on [.filename]#libmysqlclient.so#.
-A port can set `IGNORE_WITH_MYSQL` if some versions are not supported.
+Предоставить поддержку MySQL. Если версия не указана, попытаться определить установленную версию. В случае неудачи использовать версию по умолчанию, MySQL-5.6. Возможные версии: `55`, `55m`, `55p`, `56`, `56p`, `56w`, `57`, `57p`, `80`, `100m`, `101m` и `102m`. Суффиксы `m` и `p` обозначают флейворс MariaDB и Percona для MySQL. Параметры `server` и `embedded` добавляют зависимости во время сборки и выполнения на сервер MySQL. При использовании `server` или `embedded` добавьте `client`, чтобы также включить зависимость от [.filename]#libmysqlclient.so#. Порт может установить `IGNORE_WITH_MYSQL`, если некоторые версии не поддерживаются.
-The framework sets `MYSQL_VER` to the detected MySQL version.
+Фреймворк устанавливает `MYSQL_VER` в обнаруженную версию MySQL.
[[uses-mono]]
== `mono`
-Possible arguments: (none), `nuget`
+Возможные аргументы: (отсутствуют), `nuget`
-Adds a dependency on the Mono (currently only C#) framework by setting the appropriate dependencies.
+Добавляет зависимость от фреймворка Mono (в настоящее время только C#), устанавливая соответствующие зависимости.
-Specify `nuget` when the port uses nuget packages.
-`NUGET_DEPENDS` needs to be set with the names and versions of the nuget packages in the format `_name_=_version_`.
-An optional package origin can be added using `_name_=_version_:_origin_`.
+Укажите `nuget`, если порт использует пакеты nuget. `NUGET_DEPENDS` должен содержать имена и версии пакетов nuget в формате `_имя_=_версия_`. Можно добавить необязательное расположение пакета (origin), используя `_имя_=_версия_:_ расположение _`.
-The helper target, `buildnuget`, will output the content of the `NUGET_DEPENDS` based on the provided [.filename]#packages.config#.
+Вспомогательная цель `buildnuget` выведет содержимое `NUGET_DEPENDS` на основе предоставленного файла [.filename]#packages.config#.
[[uses-motif]]
== `motif`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
+
+Использует package:x11-toolkits/open-motif[] как зависимость библиотеки. Конечные пользователи могут установить `WANT_LESSTIF` в [.filename]#make.conf#, чтобы использовать package:x11-toolkits/lesstif[] как зависимость вместо package:x11-toolkits/open-motif[]. Аналогично, установка `WANT_OPEN_MOTIF_DEVEL` в [.filename]#make.conf# добавит зависимость от package:x11-toolkits/open-motif-devel[]
+
+[[uses-mpi]]
+== `mpi`
+
+Возможные аргументы: `mpich` (по умолчанию), `openmpi`
+
+Обеспечить поддержку портов, зависящих от `MPI`.
+
+Если указан аргумент `mpich`, в порт добавляется зависимость от package:net/mpich[].
+
+Если указан аргумент `openmpi`, в порт добавляется зависимость от package:net/openmpi[].
+
+Фреймворк портов предоставляет следующие переменные, которые могут быть прочитаны портом:
+
+`MPI_LIBS`::
+Библиотеки, необходимые для связывания программ с использованием `MPI`.
+
+`MPI_CFLAGS`::
+Флаги компилятора, необходимые для сборки программ с использованием `MPI`.
+
+`MPICC`::
+Расположение исполняемого файла `mpicc`. По умолчанию: [.filename]#${MPI_HOME}/bin/mpicc#.
+
+`MPICXX`::
+Расположение исполняемого файла `mpicxx`. По умолчанию: [.filename]#${MPI_HOME}/bin/mpicxx#.
+
+`MPIF90`::
+Расположение исполняемого файла `mpif90`. По умолчанию: [.filename]#${MPI_HOME}/bin/mpif90#.
+
+`MPIFC`::
+То же, что и выше.
+
+`MPI_HOME`::
+Каталог установки `MPI`. По умолчанию используется `${LOCALBASE}` для `MPICH`.
+
+`MPIEXEC`::
+Расположение исполняемого файла `mpiexec`. По умолчанию: [.filename]#${MPI_HOME}/bin/mpiexec#.
+
+`MPIRUN`::
+Расположение исполняемого файла `mpirun`. По умолчанию: [.filename]#${MPI_HOME}/bin/mpirun#.
-Uses package:x11-toolkits/open-motif[] as a library dependency.
-End users can set `WANT_LESSTIF` for the dependency to be on package:x11-toolkits/lesstif[] instead of package:x11-toolkits/open-motif[].
[[uses-ncurses]]
== `ncurses`
-Possible arguments: (none), `base`, `port`
+Возможные аргументы: (нет), `base`, `port`
+
+Использует ncurses и устанавливает некоторые полезные переменные.
+
+[[uses-nextcloud]]
+== `nextcloud`
-Uses ncurses, and causes some useful variables to be set.
+Возможные аргументы: (отсутствуют)
+
+Добавляет поддержку приложений Nextcloud, добавляя зависимость во время выполнения на package:www/nextcloud[].
[[uses-ninja]]
== `ninja`
-Possible arguments: (none)
+Возможные аргументы: (нет), `build`, `make` (по умолчанию), `run`
+
+Если указаны аргументы `build` или `run`, это соответственно добавляет зависимость во время сборки или выполнения от пакета package:devel/ninja[]. Если указан `make` или аргументы не предоставлены, используется ninja для сборки порта вместо make. `make` подразумевает `build`. Если переменная `NINJA_DEFAULT` установлена в `samurai`, тогда зависимости устанавливаются для пакета package:devel/samurai[] вместо этого.
+
+[[uses-nodejs]]
+== `nodejs`
-Uses ninja to build the port.
+Возможные аргументы: (нет), `build`, `run`, `current`, `lts`, `10`, `14`, `16`,
+ `17`.
+
+Использует nodejs. Добавляет зависимость от пакета package:www/node*[]. Если указана поддерживаемая версия, то также необходимо указать `run` и/или `build`.
[[uses-objc]]
== `objc`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
+
+Добавить зависимости Objective C (компилятор, библиотека времени выполнения), если базовая система их не поддерживает.
+
+[[uses-ocaml]]
+== `ocaml`
+
+Возможные аргументы: (нет), `build`, `camlp4`, `dune`, `findlib`, `findplist`, `ldconfig`, `run`, `tk`, `tkbuild`, `tkrun`, `wash`
+
+Обеспечить поддержку OCaml.
+
+Если аргументы не указаны, по умолчанию используются `build`, `run`.
+
+Если указан аргумент `build`, то package:lang/ocamlc[] добавляется в `BUILD_DEPENDS`, `EXTRACT` и `PATCH_DEPENDS`.
+
+Если указан аргумент `camlp4`, то для сборки используется package:devel/ocamlp4[].
+
+Если указан аргумент `dune`, то package:devel/ocaml-dune[] используется как система сборки.
+
+Если указан аргумент `findlib`, то для установки пакетов будет использоваться `ocamlfind`. Директории пакетов будут автоматически удалены.
+
+Если указан аргумент `findplist`, то содержимое целевых каталогов `findlib` будет добавлено автоматически.
+
+Если указан аргумент `ldconfig`, то файл [.filename]#ld.conf# OCaml будет обработан автоматически. При использовании `dune` Dune может устанавливать stublibs в директориях пакетов site-lib или в отдельной директории ниже `DUNE_LIBDIR` site-lib. Установите, если ваш порт устанавливает общие библиотеки в ocaml
+
+Если указан аргумент `run`, добавить ocamlc в `RUN_DEPENDS`.
+
+Если указан аргумент `tk`, то в порт добавляется зависимость на сборку и выполнение от пакета package:x11-toolkits/ocaml-labltk[]. Подразумевает `tkbuild` и `tkrun`.
+
+Если указан аргумент `tkbuild`, то пакет package:x11-toolkits/ocaml-labltk[] добавляется в `BUILD_DEPENDS`, `EXTRACT` и `PATCH_DEPENDS`.
+
+Если указан аргумент `tkrun`, то package:x11-toolkits/ocaml-labltk[] добавляется в `RUN_DEPENDS`.
-Add objective C dependencies (compiler, runtime library) if the base system does not support it.
+Если указан аргумент `wash`, общие каталоги Ocaml будут очищены при удалении. Полезно при установке в нестандартный `PREFIX`.
+
+Портом могут быть установлены следующие переменные:
+
+`OCAML_PKGDIRS`::
+Каталоги в site-lib для обработки, если указан аргумент `findlib`. По умолчанию: `${PORTNAME}`
+
+`OCAML_LDLIBS`::
+Каталоги в `PREFIX`, которые будут автоматически добавлены/удалены из [.filename]#ld.conf#. По умолчанию: `${OCAML_SITELIBDIR}/${PORTNAME}`
+
+`OCAML_PACKAGES`::
+Список пакетов для сборки и установки. По умолчанию `${PORTNAME}`
+
+
+[[uses-octave]]
+== `octave`
+
+Возможные аргументы: (нет), env
+
+Использует package:math/octave[]. `env` загружает только одну переменную окружения `OCTAVE_VERSION`.
[[uses-openal]]
== `openal`
-Possible arguments: `al`, `soft` (default), `si`, `alut`
+Возможные аргументы: `al`, `soft` (по умолчанию), `si`, `alut`
-Uses OpenAL.
-The backend can be specified, with the software implementation as the default.
-The user can specify a preferred backend with `WANT_OPENAL`.
-Valid values for this knob are `soft` (default) and `si`.
+Использует OpenAL. Бэкенд может быть указан, с программной реализацией по умолчанию. Пользователь может указать предпочтительный бэкенд с помощью `WANT_OPENAL`. Допустимые значения для этой настройки: `soft` (по умолчанию) и `si`.
[[uses-pathfix]]
== `pathfix`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Look for [.filename]#Makefile.in# and [.filename]#configure# in `PATHFIX_WRKSRC` (defaults to `WRKSRC`) and fix common paths to make sure they respect the FreeBSD hierarchy.
-For example, it fixes the installation directory of `pkgconfig`'s [.filename]#.pc# files to [.filename]#${PREFIX}/libdata/pkgconfig#.
-If the port uses `USES=autoreconf`, [.filename]#Makefile.am# will be added to `PATHFIX_MAKEFILEIN` automatically.
+Ищите [.filename]#Makefile.in# и [.filename]#configure# в `PATHFIX_WRKSRC` (по умолчанию `WRKSRC`) и исправляйте стандартные пути, чтобы они соответствовали иерархии FreeBSD. Например, исправляется каталог установки для файлов [.filename]#.pc# `pkgconfig` на [.filename]#${PREFIX}/libdata/pkgconfig#. Если порт использует `USES=autoreconf`, [.filename]#Makefile.am# будет автоматически добавлен в `PATHFIX_MAKEFILEIN`.
-If the port <<uses-cmake,`USES=cmake`>> it will look for [.filename]#CMakeLists.txt# in `PATHFIX_WRKSRC`.
-If needed, that default filename can be changed with `PATHFIX_CMAKELISTSTXT`.
+Если порт crossref:uses[uses-cmake,`USES=cmake`], он будет искать файл [.filename]#CMakeLists.txt# в `PATHFIX_WRKSRC`. При необходимости это имя файла по умолчанию можно изменить с помощью `PATHFIX_CMAKELISTSTXT`.
[[uses-pear]]
== `pear`
-Possible arguments: `env`
+Возможные аргументы: `env`
-Adds a dependency on package:devel/pear[].
-It will setup default behavior for software using the PHP Extension and Application Repository.
-Using the `env` arguments only sets up the PEAR environment variables.
-See crossref:special[php-pear,PEAR Modules] for more information.
+Добавляет зависимость от пакета package:devel/pear[]. Настраивает поведение по умолчанию для программного обеспечения, использующего PHP Extension and Application Repository. Использование аргументов `env` только устанавливает переменные окружения PEAR. Дополнительную информацию см. в crossref:special[php-pear,Модули PEAR].
[[uses-perl5]]
== `perl5`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Depends on Perl. The configuration is done using `USE_PERL5`.
+Зависит от Perl. Настройка выполняется с помощью `USE_PERL5`.
-`USE_PERL5` can contain the phases in which to use Perl, can be `extract`, `patch`, `build`, `run`, or `test`.
+`USE_PERL5` может содержать фазы, в которых используется Perl: `extract`, `patch`, `build`, `run` или `test`.
-`USE_PERL5` can also contain `configure`, `modbuild`, or `modbuildtiny` when [.filename]#Makefile.PL#, [.filename]#Build.PL#,
-or Module::Build::Tiny's flavor of [.filename]#Build.PL# is required.
+`USE_PERL5` также может содержать `configure`, `modbuild` или `modbuildtiny`, если требуется [.filename]#Makefile.PL#, [.filename]#Build.PL# или вариант [.filename]#Build.PL# для Module::Build::Tiny.
-`USE_PERL5` defaults to `build run`.
-When using `configure`, `modbuild`, or `modbuildtiny`, `build` and `run` are implied.
+`USE_PERL5` по умолчанию имеет значение `build run`. При использовании `configure`, `modbuild` или `modbuildtiny`, `build` и `run` подразумеваются автоматически.
-See crossref:special[using-perl,Using Perl] for more information.
+См. crossref:special[using-perl,Использование Perl] для получения дополнительной информации.
[[uses-pgsql]]
== `pgsql`
-Possible arguments: (none), `_X.Y_`, `_X.Y_+`, `_X.Y_-`, `_X.Y_-_Z.A_`
+Возможные аргументы: (нет), `_X.Y_`, `_X.Y_+`, `_X.Y_-`, `_X.Y_-_Z.A_`
-Provide support for PostgreSQL.
-Port maintainer can set version required.
-Minimum and maximum versions or a range can be specified; for example, `9.0-`, `8.4+`, `8.4-9.2.`
+Предоставить поддержку PostgreSQL. Ответственный за порт может указать требуемую версию. Можно указать минимальную и максимальную версии или диапазон; например, `9.0-`, `8.4+`, `8.4-9.2`
-By default, the added dependency will be the client, but if the port requires additional components,
-this can be done using `WANT_PGSQL=_component[:target]_`;
-for example, `WANT_PGSQL=server:configure pltcl plperl`.
-The available components are:
+По умолчанию добавляемая зависимость будет клиентской, но если порту требуются дополнительные компоненты, это можно указать с помощью `WANT_PGSQL=_компонент[:цель]_`; например, `WANT_PGSQL=server:configure pltcl plperl`. Доступные компоненты:
* `client`
* `contrib`
@@ -1140,83 +1817,67 @@ The available components are:
[[uses-php]]
== `php`
-Possible arguments: (none), `phpize`, `ext`, `zend`, `build`, `cli`, `cgi`, `mod`, `web`, `embed`, `pecl`, `flavors`, `noflavors`
+Возможные аргументы: (нет), `phpize`, `ext`, `zend`, `build`, `cli`, `cgi`, `mod`, `web`, `embed`, `pecl`, `flavors`, `noflavors`
-Provide support for PHP.
-Add a runtime dependency on the default PHP version, package:lang/php56[].
+Обеспечить поддержку PHP. Добавить зависимость во время выполнения на версию PHP по умолчанию, package:lang/php81[].
`phpize`::
-Use to build a PHP extension.
-Enables flavors.
+Используется для создания расширения PHP. Поддерживает флейворы.
`ext`::
-Use to build, install and register a PHP extension.
-Enables flavors.
+Используется для сборки, установки и регистрации расширения PHP. Поддерживает флейворы.
`zend`::
-Use to build, install and register a Zend extension.
-Enables flavors.
+Используется для сборки, установки и регистрации Zend-расширения. Поддерживает флейворы.
`build`::
-Set PHP also as a build-time dependency.
+Установить PHP также как зависимость во время сборки.
`cli`::
-Needs the CLI version of PHP.
+Требуется версия PHP для командной строки.
`cgi`::
-Needs the CGI version of PHP.
+Требуется CGI-версия PHP.
`mod`::
-Needs the Apache module for PHP.
+Требуется модуль Apache для PHP.
`web`::
-Needs the Apache module or the CGI version of PHP.
+Требуется модуль Apache или CGI-версия PHP.
`embed`::
-Needs the embedded library version of PHP.
+Требуется встроенная версия библиотеки PHP.
`pecl`::
-Provide defaults for fetching PHP extensions from the PECL repository.
-Enables flavors.
+Установить значения по умолчанию для загрузки расширений PHP из репозитория PECL. Включает флейворы.
`flavors`::
-Enable automatic crossref:flavors[flavors-auto-php,PHP flavors] generation.
-Flavors will be generated for all PHP versions, except the ones present in <<uses-php-ignore,`IGNORE_WITH_PHP`>>.
+Включить автоматическую генерацию crossref:flavors[flavors-auto-php,флейворов PHP]. Флейворы будут созданы для всех версий PHP, за исключением указанных в crossref:uses[uses-php-ignore,`IGNORE_WITH_PHP`].
`noflavors`::
-Disable automatic PHP flavors generation.
-_Must only_ be used with extensions provided by PHP itself.
+Отключить автоматическое создание флейворов PHP. _Должно_ использоваться только с расширениями, предоставляемыми самим PHP.
-Variables are used to specify which PHP modules are required, as well as which version of PHP are supported.
+Переменные используются для указания необходимых модулей PHP, а также версий PHP, которые поддерживаются.
`USE_PHP`::
-The list of required PHP extensions at run-time.
-Add `:build` to the extension name to add a build-time dependency.
-Example: `pcre xml:build gettext`
+Список необходимых расширений PHP во время выполнения. Добавьте `:build` к названию расширения, чтобы указать зависимость во время сборки. Пример: `pcre xml:build gettext`
[[uses-php-ignore]]
`IGNORE_WITH_PHP`::
-The port does not work with PHP of the given version.
-For possible values look at the content of `_ALL_PHP_VERSIONS` in [.filename]#Mk/Uses/php.mk#.
+Порт не работает с PHP указанной версии. Возможные значения можно посмотреть в содержимом `_ALL_PHP_VERSIONS` в [.filename]#Mk/Uses/php.mk#.
-When building a PHP or Zend extension with `:ext` or `:zend`, these variables can be set:
+При сборке расширения PHP или Zend с помощью `:ext` или `:zend`, можно задать следующие переменные:
`PHP_MODNAME`::
-The name of the PHP or Zend extension.
-Default value is `${PORTNAME}`.
+Имя расширения PHP или Zend. Значение по умолчанию: `${PORTNAME}`.
`PHP_HEADER_DIRS`::
-A list of subdirectories from which to install header files.
-The framework will always install the header files that are present in the same directory as the extension.
+Список подкаталогов, из которых следует устанавливать заголовочные файлы. Фреймворк всегда будет устанавливать заголовочные файлы, находящиеся в том же каталоге, что и расширение.
`PHP_MOD_PRIO`::
-The priority at which to load the extension.
-It is a number between `00` and `99`.
+Приоритет загрузки расширения. Это число от `00` до `99`.
+
-For extensions that do not depend on any extension, the priority is automatically set to `20`, for extensions that depend on another extension, the priority is automatically set to `30`.
-Some extensions may need to be loaded before every other extension, for example package:www/php56-opcache[].
-Some may need to be loaded after an extension with a priority of `30`.
-In that case, add `PHP_MOD_PRIO=_XX_` in the port's Makefile. For example:
+Для расширений, которые не зависят от других расширений, приоритет автоматически устанавливается в `20`, а для расширений, зависящих от другого расширения, приоритет автоматически устанавливается в `30`. Некоторые расширения могут требовать загрузки перед всеми остальными, например, package:www/php56-opcache[]. Некоторые могут требовать загрузки после расширения с приоритетом `30`. В таком случае добавьте `PHP_MOD_PRIO=_XX_` в Makefile порта. Например:
+
[.programlisting]
....
@@ -1225,52 +1886,42 @@ USE_PHP= wddx
PHP_MOD_PRIO= 40
....
-These variables are available to use in `PKGNAMEPREFIX` or `PKGNAMESUFFIX`:
+Эти переменные доступны для использования в `PKGNAMEPREFIX` или `PKGNAMESUFFIX`:
`PHP_PKGNAMEPREFIX`::
-Contains `php_XY_-` where _XY_ is the current flavor's PHP version.
-Use with PHP extensions and modules.
+Содержит `php_XY_-`, где _XY_ — версия PHP текущей редакции. Используется с расширениями и модулями PHP.
`PHP_PKGNAMESUFFIX`::
-Contains `-php_XY_` where _XY_ is the current flavor's PHP version.
-Use with PHP applications.
+Содержит `-php_XY_`, где _XY_ — версия PHP текущего варианта. Используется с PHP-приложениями.
`PECL_PKGNAMEPREFIX`::
-Contains `php_XY_-pecl-` where _XY_ is the current flavor's PHP version.
-Use with PECL modules.
+Содержит `php_XY_-pecl-`, где _XY_ — версия PHP текущей редакции. Используется с модулями PECL.
[IMPORTANT]
====
-With flavors, all PHP extensions, PECL extensions, PEAR modules _must have_ a different package name,
-so they must all use one of these three variables in their `PKGNAMEPREFIX` or `PKGNAMESUFFIX`.
+С вариантами сборки все расширения PHP, расширения PECL, модули PEAR _должны иметь_ разные имена пакетов, поэтому они должны использовать одну из трёх переменных в `PKGNAMEPREFIX` или `PKGNAMESUFFIX`.
====
[[uses-pkgconfig]]
== `pkgconfig`
-Possible arguments: (none), `build` (default), `run`, `both`
+Возможные аргументы: (отсутствуют), `build` (по умолчанию), `run`, `both`
-Uses package:devel/pkgconf[].
-With no arguments or with the `build` argument, it implies `pkg-config` as a build-time dependency.
-`run` implies a run-time dependency and `both` implies both run-time and build-time dependencies.
+Использует package:devel/pkgconf[]. Без аргументов или с аргументом `build` подразумевает зависимость от `pkg-config` во время сборки. `run` подразумевает зависимость во время выполнения, а `both` — зависимости как во время выполнения, так и во время сборки.
[[uses-pure]]
== `pure`
-Possible arguments: (none), `ffi`
+Возможные аргументы: (нет), `ffi`
-Uses package:lang/pure[].
-Largely used for building related pure ports.
-With the `ffi` argument, it implies package:devel/pure-ffi[] as a run-time dependency.
+Использует package:lang/pure[]. В основном применяется для сборки портов, зависящих от pure. С аргументом `ffi` подразумевает package:devel/pure-ffi[] как зависимость во время выполнения.
[[uses-pyqt]]
== `pyqt`
-Possible arguments: (none), `4`, `5`
+Возможные аргументы: (нет), `4`, `5`
-Uses PyQt. If the port is part of PyQT itself, set `PYQT_DIST`.
-Use `USE_PYQT` to select the components the port needs.
-The available components are:
+Использует PyQt. Если порт является частью самого PyQT, установите `PYQT_DIST`. Используйте `USE_PYQT` для выбора необходимых порту компонентов. Доступные компоненты:
* `core`
* `dbus`
@@ -1292,7 +1943,7 @@ The available components are:
* `xml`
* `xmlpatterns`
-These components are only available with PyQT4:
+Эти компоненты доступны только с PyQT4:
* `assistant`
* `declarative`
@@ -1301,7 +1952,7 @@ These components are only available with PyQT4:
* `script`
* `scripttools`
-These components are only available with PyQT5:
+Эти компоненты доступны только с PyQT5:
* `multimediawidgets`
* `printsupport`
@@ -1310,7 +1961,7 @@ These components are only available with PyQT5:
* `webkitwidgets`
* `widgets`
-The default dependency for each component is build- and run-time, to select only build or run, add `_build` or `_run` to the component name. For example:
+Зависимость по умолчанию для каждого компонента — это время сборки и выполнения. Чтобы выбрать только сборку или выполнение, добавьте `_build` или `_run` к имени компонента. Например:
[.programlisting]
....
@@ -1318,58 +1969,76 @@ USES= pyqt
USE_PYQT= core doc_build designer_run
....
+[[uses-pytest]]
+== `pytest`
+
+Возможные аргументы: (нет), 4
+
+Вводит новую зависимость от package:devel/pytest[]. Он определяет цель `do-test`, которая будет правильно запускать тесты. Используйте аргумент, чтобы зависеть от определённой версии package:devel/pytest[]. Для портов, использующих package:devel/pytest[], рекомендуется использовать это вместо конкретной цели `do-test`. Фреймворк предоставляет порту следующие переменные:
+
+`PYTEST_ARGS`::
+Дополнительные аргументы для pytest (по умолчанию пусто).
+
+`PYTEST_IGNORED_TESTS`::
+списки шаблонов `pytest -k` для игнорирования тестов (по умолчанию пустые). Для тестов, которые не должны проходить, например, требующих доступа к базе данных.
+
+`PYTEST_BROKEN_TESTS`::
+списки шаблонов `pytest -k` тестов для игнорирования (по умолчанию пустые). Для сломанных тестов, которые требуют исправления.
+
+В дополнение следующие переменные могут быть заданы пользователем:
+
+`PYTEST_ENABLE_IGNORED_TESTS`::
+Включить тесты, которые в противном случае игнорируются `PYTEST_IGNORED_TESTS`.
+
+`PYTEST_ENABLE_BROKEN_TESTS`::
+Включить тесты, которые в противном случае игнорируются `PYTEST_BROKEN_TESTS`.
+
+`PYTEST_ENABLE_ALL_TESTS`::
+Включить тесты, которые в противном случае игнорируются `PYTEST_IGNORED_TESTS` и `PYTEST_BROKEN_TESTS`.
+
+
[[uses-python]]
== `python`
-Possible arguments: (none), `_X.Y_`, `_X.Y+_`, `_-X.Y_`, `_X.Y-Z.A_`, `patch`, `build`, `run`, `test`
+Возможные аргументы: (нет), `_X.Y_`, `_X.Y+_`, `_-X.Y_`, `_X.Y-Z.A_`, `patch`, `build`, `run`, `test`
-Uses Python. A supported version or version range can be specified.
-If Python is only needed at build time, run time or for the tests, it can be set as a build, run or test dependency with `build`, `run`, or `test`.
-If Python is also needed during the patch phase, use `patch`.
-See crossref:special[using-python, Using Python] for more information.
+Использует Python. Можно указать поддерживаемую версию или диапазон версий. Если Python требуется только во время сборки, выполнения или тестирования, его можно установить как зависимость для сборки, выполнения или тестирования с помощью `build`, `run` или `test`. Если Python также требуется на этапе исправлений, используйте `patch`. Дополнительную информацию см. в разделе crossref:special[using-python,Использование Python].
-`PYTHON_NO_DEPENDS=yes` can be used when the variables exported by the framework are needed but a dependency on Python is not.
-It can happen when using with <<uses-shebangfix,`USES=shebangfix`>>, and the goal is only to fix the shebangs but not add a dependency on Python.
+`USES=python:env` можно использовать, когда необходимы переменные, экспортируемые фреймворком, но зависимость от Python не требуется. Это может быть полезно при использовании с crossref:uses[uses-shebangfix,`USES=shebangfix`], если цель состоит только в исправлении shebang без добавления зависимости от Python.
[[uses-qmail]]
== `qmail`
-Possible arguments: (none), `build`, `run`, `both`, `vars`
+Возможные аргументы: (нет), `build`, `run`, `both`, `vars`
-Uses package:mail/qmail[]. With the `build` argument, it implies `qmail` as a build-time dependency.
-`run` implies a run-time dependency.
-Using no argument or the `both` argument implies both run-time and build-time dependencies.
-`vars` will only set QMAIL variables for the port to use.
+Использует package:mail/qmail[]. С аргументом `build` подразумевается зависимость от `qmail` во время сборки. Аргумент `run` подразумевает зависимость во время выполнения. Использование без аргументов или с аргументом `both` подразумевает зависимости как во время выполнения, так и во время сборки. Аргумент `vars` только устанавливает переменные QMAIL для использования в порте.
[[uses-qmake]]
== `qmake`
-Possible arguments: (none), `norecursive`, `outsource`, `no_env`, `no_configure`
+Возможные аргументы: (отсутствуют), `norecursive`, `outsource`, `no_env`, `no_configure`
-Uses QMake for configuring. For more information see crossref:special[using-qmake,Using `qmake`].
+Использует QMake для настройки. Для получения дополнительной информации см. crossref:special[using-qmake,Использование `qmake`].
[[uses-qt]]
== `qt`
-Possible arguments: `5`, `no_env`
+Возможные аргументы: `5`, `6`, `no_env`
-Add dependency on Qt components.
-`no_env` is passed directly to `USES= qmake`.
-See crossref:special[using-qt,Using Qt] for more information.
+Добавить зависимость от компонентов Qt. `no_env` передаётся напрямую в `USES= qmake`. Подробнее см. в crossref:special[using-qt,Использование Qt].
[[uses-qt-dist]]
== `qt-dist`
-Possible arguments: (none) or `5` and (none) or one of `3d`, `activeqt`, `androidextras`, `base`, `canvas3d`, `charts`, `connectivity`, `datavis3d`, `declarative`, `doc`, `gamepad`, `graphicaleffects`, `imageformats`, `location`, `macextras`, `multimedia`, `networkauth`, `purchasing`, `quickcontrols2`, `quickcontrols`, `remoteobjects`, `script`, `scxml`, `sensors`, `serialbus`, `serialport`, `speech`, `svg`, `tools`, `translations`, `virtualkeyboard`, `wayland`, `webchannel`, `webengine`, `websockets`, `webview`, `winextras`, `x11extras`, `xmlpatterns`
+Possible arguments: (none) or `5` and (none) or `6` and (none) or one of `3d`, `5compat`, `base`, `charts`, `connectivity`, `datavis3d`, `declarative`, `doc` `languageserver`, `gamepad`, `graphicaleffects`, `imageformats`, `locat ion`, `lottie`, `multimedia`, `networkauth`, `positioning`, `quick3d`, `quickcontrols2`, `quickcontrols`, `quicktimeline`, `remoteobjects`, `script`, `scxml `, `sensors`, `serialbus`, `serialport`, `shadertools`, `speech`, `svg`, `tools`, `translations`, `virtualkeyboard`, `wayland`, `webchannel`, `webengine`, `webglplugin`, `websockets`, `webview`, `x11extras`, `xmlpatterns`.
-Provides support for building Qt 5 components.
-It takes care of setting up the appropriate configuration environment for the port to build.
+Предоставляет поддержку сборки компонентов Qt 5 и Qt 6. Обеспечивает настройку соответствующей конфигурации окружения для сборки порта.
[[qt5-dist-example]]
-.Building Qt 5 Components
+.Сборка компонентов Qt 5
[example]
====
-The port is Qt 5's `networkauth` component, which is part of the `networkauth` distribution file.
+Порт представляет собой компонент `networkauth` из Qt 5, который входит в файл дистрибутива `networkauth`.
[.programlisting]
....
@@ -1381,13 +2050,30 @@ USES= qt-dist:5
====
-If `PORTNAME` does not match the component name, it can be passed as an argument to `qt-dist`.
+
+[[qt6-dist-example]]
+.Сборка компонентов Qt 6
+[example]
+====
+Порт представляет собой компонент `websockets` из Qt 6, который входит в файл дистрибутива `websockets`.
+
+[.programlisting]
+....
+PORTNAME= websockets
+PORTVERSION= ${QT6_VERSION}
+
+USES= qt-dist:6
+....
+
+====
+
+Если `PORTNAME` не совпадает с именем компонента, его можно передать как аргумент в `qt-dist`.
[[qt5-dist-example-explicit]]
-.Building Qt 5 Components with Different Names
+.Сборка компонентов Qt 5 с разными именами
[example]
====
-The port is Qt 5's `gui` component, which is part of the `base` distribution file.
+Порт представляет собой компонент `gui` из Qt 5, который входит в файл дистрибутива `base`.
[.programlisting]
....
@@ -1402,116 +2088,181 @@ USES= qt-dist:5,base
[[uses-readline]]
== `readline`
-Possible arguments: (none), `port`
+Возможные аргументы: (нет), `port`
+
+Использует readline в качестве зависимости библиотеки и устанавливает `CPPFLAGS` и `LDFLAGS` по необходимости. Если используется аргумент `port` или если readline отсутствует в базовой системе, добавляет зависимость от package:devel/readline[]
+
+
+[[uses-ruby]]
+== `ruby`
+
+Возможные аргументы: (нет), `build`, `extconf`, `run`, `setup`
+
+Предоставить поддержку для портов, связанных с Ruby. `(none)` без аргументов добавляет зависимость во время выполнения на package:lang/ruby[]. `build` добавляет зависимость на package:lang/ruby[] во время сборки. `extconf` указывает, что порт использует extconf.rb для настройки. `run` добавляет зависимость на package:lang/ruby[] во время выполнения. Это также значение по умолчанию. `setup` указывает, что порт использует setup.rb для настройки и сборки.
+
+Пользователь может определить следующие переменные:
+
+`RUBY_VER`::
+Альтернативная короткая версия ruby в виде `x.y`.
+
+`RUBY_DEFAULT_VER`::
+Установите (например) `2.7`, чтобы использовать `ruby27` в качестве версии по умолчанию.
+
+`RUBY_ARCH`::
+Установите имя архитектуры (например, i386-freebsd7).
+
+Следующие переменные экспортируются для использования портом:
+
+`RUBY`::
+Установлена в полный путь к ruby. Если задано, значения следующих переменных автоматически получаются из исполняемого файла ruby: `RUBY_ARCH`, `RUBY_ARCHLIBDIR`, `RUBY_LIBDIR`, `RUBY_SITEARCHLIBDIR`, `RUBY_SITELIBDIR`, `RUBY_VER` и `RUBY_VERSION`
+
+`RUBY_VER`::
+Установлена в альтернативную короткую версию ruby в формате `x.y`.
+
+`RUBY_EXTCONF`::
+Установлена в альтернативное имя для extconf.rb (по умолчанию: extconf.rb).
+
+`RUBY_EXTCONF_SUBDIRS`::
+Установлена в список подкаталогов, если включено несколько модулей.
+
+`RUBY_SETUP`::
+Установлена в альтернативное имя для setup.rb (по умолчанию: setup.rb).
-Uses readline as a library dependency, and sets `CPPFLAGS` and `LDFLAGS` as necessary.
-If the `port` argument is used or if readline is not present in the base system, add a dependency on package:devel/readline[]
[[uses-samba]]
== `samba`
-Possible arguments: `build`, `env`, `lib`, `run`
+Возможные аргументы: `build`, `env`, `lib`, `run`
+
+Обработать зависимость от Samba. `env` не добавит никаких зависимостей, а только установит переменные. `build` и `run` добавят зависимости во время сборки и выполнения на [.filename]#smbd#. `lib` добавит зависимость на [.filename]#libsmbclient.so#. Экспортируемые переменные:
+
+`SAMBA_PORT`::
+Расположение порта Samba по умолчанию.
-Handle dependency on Samba.
-`env` will not add any dependency and only set up the variables.
-`build` and `run` will add build-time and run-time dependency on [.filename]#smbd#. `lib` will add a dependency on [.filename]#libsmbclient.so#.
-The variables that are exported are:
+`SAMBA_INCLUDEDIR`::
+Расположение заголовочных файлов Samba.
-`SAMBAPORT`::
-The origin of the default Samba port.
+`SAMBA_LIBS`::
+Каталог, в котором доступны общие библиотеки Samba.
-`SAMBAINCLUDES`::
-The location of the Samba header files.
+`SAMBA_LDB_PORT`::
+Расположение порта ldb, используемого выбранной версией Samba (например, package:databases/ldb28[]). Он должен использоваться, если порту требуется зависимость от той же версии ldb, что и у выбранной версии Samba.
-`SAMBALIBS`::
-The directory where the Samba shared libraries are available.
+`SAMBA_TALLOC_PORT`::
+Расположение порта talloc, используемого выбранной версией Samba. Следует использовать, если порту требуется зависеть от той же версии talloc, что и выбранная версия Samba.
+
+`SAMBA_TDB_PORT`::
+Расположение порта TDB, используемого выбранной версией Samba. Его следует использовать, если порту требуется зависеть от той же версии TDB, что и выбранная версия Samba.
+
+`SAMBA_TEVENT_PORT`::
+Расположение порта tevent, используемого выбранной версией Samba. Это следует использовать, если порту необходимо зависеть от той же версии tevent, что и выбранная версия Samba.
[[uses-scons]]
== `scons`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
+
+Предоставить поддержку для использования package:devel/scons[]. Дополнительную информацию смотрите в crossref:special[using-scons,Использование `scons`].
+
+[[uses-sdl]]
+== `sdl`
+
+Возможные аргументы: `sdl`
+
+Обеспечить поддержку использования пакетов `SDL`. Переменная `USE_SDL` является обязательной и указывает, какие компоненты добавить в зависимости.
+
+Поддерживаемые в настоящее время модули `SDL1.2`:
+
+* sdl
+* console
+* gfx
+* image
+* mixer
+* mm
+* net
+* pango
+* sound
+* ttf
-Provide support for the use of package:devel/scons[].
-See crossref:special[using-scons,Using `scons`] for more information.
+Текущие поддерживаемые модули `SDL2`:
+
+ * sdl2
+ * gfx2
+ * image2
+ * mixer2
+ * net2
+ * sound2
+ * ttf2
+
+Текущие поддерживаемые модули `SDL3`:
+
+ * sdl3
+ * image3
+ * ttf3
[[uses-shared-mime-info]]
== `shared-mime-info`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Uses update-mime-database from package:misc/shared-mime-info[].
-This uses will automatically add a post-install step in such a way that the port itself still can specify there own post-install step if needed.
-It also add an crossref:plist[plist-keywords-shared-mime-info,`@shared-mime-info`] entry to the plist.
+Использует update-mime-database из пакета package:misc/shared-mime-info[]. Это автоматически добавит шаг post-install таким образом, что сам порт всё ещё может указать собственный шаг post-install при необходимости. Также добавляет запись crossref:plist[plist-keywords-shared-mime-info,`@shared-mime-info`] в plist.
[[uses-shebangfix]]
== `shebangfix`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-A lot of software uses incorrect locations for script interpreters, most notably [.filename]#/usr/bin/perl# and [.filename]#/bin/bash#.
-The shebangfix macro fixes shebang lines in scripts listed in `SHEBANG_REGEX`, `SHEBANG_GLOB`, or `SHEBANG_FILES`.
+Множество программ используют некорректные расположения для интерпретаторов скриптов, особенно [.filename]#/usr/bin/perl# и [.filename]#/bin/bash#. Макрос shebangfix исправляет строки shebang в скриптах, перечисленных в `SHEBANG_REGEX`, `SHEBANG_GLOB` или `SHEBANG_FILES`.
`SHEBANG_REGEX`::
-Contains _one_ extended regular expressions, and is used with the `-iregex` argument of man:find[1].
-See <<uses-shebangfix-ex-regex>>.
+Содержит _одно_ расширенное регулярное выражение и используется с аргументом `-iregex` в man:find[1]. См. crossref:uses[uses-shebangfix-ex-regex,`USESshebangfix` с `SHEBANG_REGEX`].
`SHEBANG_GLOB`::
-Contains a list of patterns used with the `-name` argument of man:find[1].
-See <<uses-shebangfix-ex-glob>>.
+Содержит список шаблонов, используемых с аргументом `-name` в man:find[1]. См. crossref:uses[uses-shebangfix-ex-glob,`USESshebangfix` с `SHEBANG_GLOB`].
`SHEBANG_FILES`::
-Contains a list of files or man:sh[1] globs.
-The shebangfix macro is run from `${WRKSRC}`, so `SHEBANG_FILES` can contain paths that are relative to `${WRKSRC}`.
-It can also deal with absolute paths if files outside of `${WRKSRC}` require patching.
-See <<uses-shebangfix-ex-files>>.
+Содержит список файлов или шаблонов man:sh[1]. Макрос shebangfix выполняется из `${WRKSRC}`, поэтому `SHEBANG_FILES` может содержать пути, относительные к `${WRKSRC}`. Также он может работать с абсолютными путями, если требуется исправление файлов вне `${WRKSRC}`. См. crossref:uses[uses-shebangfix-ex-files,`USESshebangfix` с `SHEBANG_FILES`].
-Currently Bash, Java, Ksh, Lua, Perl, PHP, Python, Ruby, Tcl, and Tk are supported by default.
+В настоящее время Bash, Java, Ksh, Lua, Perl, PHP, Python, Ruby, Tcl и Tk поддерживаются по умолчанию.
-There are three configuration variables:
+Существует три переменных конфигурации:
`SHEBANG_LANG`::
-The list of supported interpreters.
+Список поддерживаемых интерпретаторов.
`_interp__CMD`::
-The path to the command interpreter on FreeBSD.
-The default value is `${LOCALBASE}/bin/_interp_`.
+Путь к интерпретатору команд в FreeBSD. Значение по умолчанию — `${LOCALBASE}/bin/_interp_`.
`_interp__OLD_CMD`::
-The list of wrong invocations of interpreters.
-These are typically obsolete paths, or paths used on other operating systems that are incorrect on FreeBSD.
-They will be replaced by the correct path in `_interp__CMD`.
+Список неправильных вызовов интерпретаторов. Обычно это устаревшие пути или пути, используемые в других операционных системах, которые неверны в FreeBSD. Они будут заменены на правильные пути в `_interp__CMD`.
+
[NOTE]
====
-These will _always_ be part of `_interp__OLD_CMD`: `"/usr/bin/env _interp_" /bin/_interp_ /usr/bin/_interp_ /usr/local/bin/_interp_`.
+Эти пути _всегда_ будут частью `_interp__OLD_CMD`: `"/usr/bin/env _interp_" /bin/_interp_ /usr/bin/_interp_ /usr/local/bin/_interp_`.
====
+
[TIP]
====
-`_interp__OLD_CMD` contain multiple values.
-Any entry with spaces must be quoted.
-See <<uses-shebangfix-ex-ksh>>.
+`_interp__OLD_CMD` содержит несколько значений. Любая запись с пробелами должна быть заключена в кавычки. См. crossref:uses[uses-shebangfix-ex-ksh,Указание всех путей при добавлении интерпретатора в `USESshebangfix`].
====
[IMPORTANT]
====
-The fixing of shebangs is done during the `patch` phase.
-If scripts are created with incorrect shebangs during the `build` phase, the build process (for example, the [.filename]#configure# script, or the [.filename]#Makefiles#) must be patched or given the right path (for example, with `CONFIGURE_ENV`, `CONFIGURE_ARGS`, `MAKE_ENV`, or `MAKE_ARGS`) to generate the right shebangs.
+Исправление шебанг-строк выполняется на этапе `patch`. Если скрипты создаются с некорректными шебанг-строками на этапе `build`, процесс сборки (например, скрипт [.filename]#configure# или [.filename]#Makefiles#) должен быть исправлен или ему должен быть указан правильный путь (например, с помощью `CONFIGURE_ENV`, `CONFIGURE_ARGS`, `MAKE_ENV` или `MAKE_ARGS`) для генерации корректных шебанг-строк.
-Correct paths for supported interpreters are available in `_interp__CMD`.
+Правильные пути для поддерживаемых интерпретаторов доступны в `_interp__CMD`.
====
[TIP]
====
-When used with <<uses-python,`USES=python`>>, and the aim is only to fix the shebangs but a dependency on Python itself is not wanted, use `PYTHON_NO_DEPENDS=yes`.
+При использовании с crossref:uses[uses-python,`USES=python`], если цель состоит только в исправлении shebang, но зависимость от самого Python не требуется, используйте `USES=python:env`.
====
[[uses-shebangfix-ex-lua]]
-.Adding Another Interpreter to `USES=shebangfix`
+.Добавление другого интерпретатора в `USES=shebangfix`
[example]
====
-To add another interpreter, set `SHEBANG_LANG`.
-For example:
+Чтобы добавить другой интерпретатор, установите `SHEBANG_LANG`. Например:
[.programlisting]
....
@@ -1521,10 +2272,10 @@ SHEBANG_LANG= lua
====
[[uses-shebangfix-ex-ksh]]
-.Specifying all the Paths When Adding an Interpreter to `USES=shebangfix`
+.Указание всех путей при добавлении интерпретатора в `USES=shebangfix`
[example]
====
-If it was not already defined, and there were no default values for `_interp__OLD_CMD` and `_interp__CMD` the Ksh entry could be defined as:
+Если они еще не были определены и не было значений по умолчанию для `_interp__OLD_CMD` и `_interp__CMD`, запись Ksh можно определить как:
[.programlisting]
....
@@ -1536,12 +2287,10 @@ ksh_CMD= ${LOCALBASE}/bin/ksh
====
[[uses-shebangfix-ex-strange]]
-.Adding a Strange Location for an Interpreter
+.Добавление нестандартного расположения интерпретатора
[example]
====
-Some software uses strange locations for an interpreter.
-For example, an application might expect Python to be located in [.filename]#/opt/bin/python2.7#.
-The strange path to be replaced can be declared in the port [.filename]#Makefile#:
+Некоторое программное обеспечение использует нестандартные пути для интерпретатора. Например, приложение может ожидать, что Python будет расположен в [.filename]#/opt/bin/python2.7#. Нестандартный путь, который нужно заменить, можно указать в [.filename]#Makefile# порта:
[.programlisting]
....
@@ -1551,10 +2300,10 @@ python_OLD_CMD= /opt/bin/python2.7
====
[[uses-shebangfix-ex-regex]]
-.`USES=shebangfix` with `SHEBANG_REGEX`
+.`USES=shebangfix` с `SHEBANG_REGEX`
[example]
====
-To fix all the files in `${WRKSRC}/scripts` ending in [.filename]#.pl#, [.filename]#.sh#, or [.filename]#.cgi# do:
+Для исправления всех файлов в `${WRKSRC}/scripts`, оканчивающихся на [.filename]#.pl#, [.filename]#.sh# или [.filename]#.cgi#, выполните:
[.programlisting]
....
@@ -1564,17 +2313,16 @@ SHEBANG_REGEX= ./scripts/.*\.(sh|pl|cgi)
[NOTE]
======
-`SHEBANG_REGEX` is used by running `find -E`, which uses modern regular expressions also known as extended regular expressions.
-See man:re_format[7] for more information.
+`SHEBANG_REGEX` используется при выполнении `find -E`, который применяет современные регулярные выражения, также известные как расширенные регулярные выражения. Подробнее см. в man:re_format[7].
======
====
[[uses-shebangfix-ex-glob]]
-.`USES=shebangfix` with `SHEBANG_GLOB`
+.`USES=shebangfix` с `SHEBANG_GLOB`
[example]
====
-To fix all the files in `${WRKSRC}` ending in [.filename]#.pl# or [.filename]#.sh#, do:
+Для исправления всех файлов в `${WRKSRC}` с окончанием [.filename]#.pl# или [.filename]#.sh# выполните:
[.programlisting]
....
@@ -1585,10 +2333,10 @@ SHEBANG_GLOB= *.sh *.pl
====
[[uses-shebangfix-ex-files]]
-.`USES=shebangfix` with `SHEBANG_FILES`
+.`USES=shebangfix` с `SHEBANG_FILES`
[example]
====
-To fix the files [.filename]#script/foobar.pl# and [.filename]#script/*.sh# in `${WRKSRC}`, do:
+Для исправления файлов [.filename]#script/foobar.pl# и [.filename]#script/*.sh# в `${WRKSRC}` выполните:
[.programlisting]
....
@@ -1601,38 +2349,42 @@ SHEBANG_FILES= scripts/foobar.pl scripts/*.sh
[[uses-sqlite]]
== `sqlite`
-Possible arguments: (none), `2`, `3`
+Возможные аргументы: (нет), `2`, `3`
+
+Добавить зависимость от SQLite. Используемая по умолчанию версия — 3, но также возможна версия 2 с использованием модификатора `:2`.
+
+[[uses-sbrk]]
+== `sbrk`
+
+Возможные аргументы: (отсутствуют)
-Add a dependency on SQLite.
-The default version used is 3, but version 2 is also possible using the `:2` modifier.
+Помечает порт как `BROKEN` для `aarch64` и `riscv64`.
[[uses-ssl]]
== `ssl`
-Possible arguments: (none), `build`, `run`
+Возможные аргументы: (нет), `build`, `run`
-Provide support for OpenSSL.
-A build- or run-time only dependency can be specified using `build` or `run`.
-These variables are available for the port's use, they are also added to `MAKE_ENV`:
+Обеспечить поддержку OpenSSL. Зависимость только для сборки или выполнения может быть указана с использованием `build` или `run`. Эти переменные доступны для использования портом, а также добавлены в `MAKE_ENV`:
`OPENSSLBASE`::
-Path to the OpenSSL installation base.
+Путь к базовой установке OpenSSL.
`OPENSSLDIR`::
-Path to OpenSSL's configuration files.
+Путь к файлам конфигурации OpenSSL.
`OPENSSLLIB`::
-Path to the OpenSSL libraries.
+Путь к библиотекам OpenSSL.
`OPENSSLINC`::
-Path to the OpenSSL includes.
+Путь к заголовочным файлам OpenSSL.
`OPENSSLRPATH`::
-If defined, the path the linker needs to use to find the OpenSSL libraries.
+Если определено, путь, который требуется компоновщику для поиска библиотек OpenSSL.
[TIP]
====
-If a port does not build with an OpenSSL flavor, set the `BROKEN_SSL` variable, and possibly the `BROKEN_SSL_REASON__flavor_`:
+Если порт не собирается с вариантом OpenSSL, установите переменную `BROKEN_SSL`, а также, возможно, `BROKEN_SSL_REASON__flavor_`:
[.programlisting]
....
@@ -1645,282 +2397,351 @@ BROKEN_SSL_REASON_libressl= needs features only available in OpenSSL
[[uses-tar]]
== `tar`
-Possible arguments: (none), `Z`, `bz2`, `bzip2`, `lzma`, `tbz`, `tbz2`, `tgz`, `txz`, `xz`
+Возможные аргументы: (нет), `Z`, `bz2`, `bzip2`, `lzma`, `tbz`, `tbz2`, `tgz`, `txz`, `xz`, `zst`, `zstd`
-Set `EXTRACT_SUFX` to `.tar`, `.tar.Z`, `.tar.bz2`, `.tar.bz2`, `.tar.lzma`, `.tbz`, `.tbz2`, `.tgz`, `.txz` or `.tar.xz` respectively.
+Установите `EXTRACT_SUFX` в `.tar`, `.tar.Z`, `.tar.bz2`, `.tar.bz2`, `.tar.lzma`, `.tbz`, `.tbz2`, `.tgz`, `.txz`, `.tar.xz`, `.tar.zst` или `.tar.zstd` соответственно.
[[uses-tcl]]
== `tcl`
-Possible arguments: _version_, `wrapper`, `build`, `run`, `tea`
+Возможные аргументы: _version_, `wrapper`, `build`, `run`, `tea`
-Add a dependency on Tcl. A specific version can be requested using _version_.
-The version can be empty, one or more exact version numbers (currently `84`, `85`, or `86`), or a minimal version number (currently `84+`, `85+` or `86+`).
-To only request a non version specific wrapper, use `wrapper`.
-A build- or run-time only dependency can be specified using `build` or `run`.
-To build the port using the Tcl Extension Architecture, use `tea`.
-After including [.filename]#bsd.port.pre.mk# the port can inspect the results using these variables:
+Добавьте зависимость от Tcl. Конкретная версия может быть запрошена с помощью _version_. Версия может быть пустой, одной или несколькими точными номерами версий (в настоящее время `84`, `85` или `86`), либо минимальным номером версии (в настоящее время `84+`, `85+` или `86+`). Чтобы запросить только неспецифичную для версии обёртку, используйте `wrapper`. Зависимость только на время сборки или выполнения может быть указана с помощью `build` или `run`. Для сборки порта с использованием Tcl Extension Architecture используйте `tea`. После включения [.filename]#bsd.port.pre.mk# порт может проверить результаты с помощью этих переменных:
-* `TCL_VER`: chosen major.minor version of Tcl
-* `TCLSH`: full path of the Tcl interpreter
-* `TCL_LIBDIR`: path of the Tcl libraries
-* `TCL_INCLUDEDIR`: path of the Tcl C header files
-* `TK_VER`: chosen major.minor version of Tk
-* `WISH`: full path of the Tk interpreter
-* `TK_LIBDIR`: path of the Tk libraries
-* `TK_INCLUDEDIR`: path of the Tk C header files
+* `TCL_VER`: выбранная версия Tcl в формате major.minor
+* `TCLSH`: полный путь к интерпретатору Tcl
+* `TCL_LIBDIR`: путь к библиотекам Tcl
+* `TCL_INCLUDEDIR`: путь к заголовочным файлам Tcl на языке C
+* `TCL_PKG_LIB_PREFIX`: Префикс библиотеки, согласно TIP595
+* `TCL_PKG_STUB_POSTFIX`: Постфикс библиотеки заглушки
+* `TK_VER`: выбранная версия Tk в формате major.minor
+* `WISH`: полный путь к интерпретатору Tk
+* `TK_LIBDIR`: путь к библиотекам Tk
+* `TK_INCLUDEDIR`: путь к заголовочным файлам Tk на языке C
[[uses-terminfo]]
== `terminfo`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
+
+Добавляет crossref:plist[plist-keywords-terminfo,`@terminfo`] в файл [.filename]#plist#. Используется, когда порт устанавливает файлы [.filename]#*.terminfo# в каталог [.filename]#${PREFIX}/share/misc#.
+
+[[uses-tex]]
+== `tex`
+
+Возможные аргументы: (отсутствуют)
+
+Обеспечить поддержку tex. Загружает все стандартные переменные для портов, связанных с TEX, и не добавляет зависимостей от других портов.
+
+Переменные используются для указания того, какие модули TEX требуются.
-Adds crossref:plist[plist-keywords-terminfo,`@terminfo`] to the [.filename]#plist#.
-Use when the port installs [.filename]#*.terminfo# files in [.filename]#${PREFIX}/share/misc#.
+`USE_TEX`::
+Список необходимых расширений TEX во время выполнения. Добавьте `:build` к названию расширения, чтобы добавить зависимость на время сборки, `:run` — для зависимости во время выполнения, `:test` — для зависимости во время тестирования, `:extract` — для зависимости во время извлечения. Пример: `base texmf:build source:run`
+
+Текущие возможные аргументы следующие:
+
+* `base`
+* `texmf`
+* `source`
+* `docs`
+* `web2c`
+* `kpathsea`
+* `ptexenc`
+* `basic`
+* `tlmgr`
+* `texlua`
+* `texluajit`
+* `synctex`
+* `xpdfopen`
+* `dvipsk`
+* `dvipdfmx`
+* `xdvik`
+* `gbklatex`
+* `formats`
+* `tex`
+* `latex`
+* `pdftex`
+* `jadetex`
+* `luatex`
+* `ptex`
+* `xetex`
+* `xmltex`
+* `texhash`
+* `updmap`
+* `fmtutil`
[[uses-tk]]
== `tk`
-Same as arguments for `tcl`
+Так же, как аргументы для `tcl`
+
+Небольшая обертка при использовании Tcl и Tk. Возвращаются те же переменные, что и при использовании Tcl.
+
+[[uses-trigger]]
+== `trigger`
-Small wrapper when using both Tcl and Tk.
-The same variables are returned as when using Tcl.
+Возможные аргументы: (отсутствуют)
+
+Предоставить поддержку для портов, требующих выполнения триггеров с помощью man:pkg[8]. Триггеры выполняются в конце транзакции, если условия выполнены.
+
+Следующая переменная может быть установлена портами:
+
+`TRIGGERS`::
+Список триггеров для пакета. По умолчанию используется `${PORTNAME}`.
+
+Триггеры указываются в формате UCL и обычно размещаются в каталоге [.filename]#files/# порта.
[[uses-uidfix]]
== `uidfix`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Changes some default behavior (mostly variables) of the build system to allow installing this port as a normal user.
-Try this in the port before using <<uses-fakeroot,USES=fakeroot>> or patching.
+Изменяет некоторые стандартные настройки (в основном переменные) системы сборки, чтобы позволить установку этого порта обычным пользователем. Попробуйте это в порте перед использованием crossref:uses[uses-fakeroot,`USES=fakeroot`] или исправлением.
[[uses-uniquefiles]]
== `uniquefiles`
-Possible arguments: (none), `dirs`
+Возможные аргументы: (нет), `dirs`
+
+Сделать файлы или каталоги 'уникальными', добавляя префикс или суффикс. Если используется аргумент `dirs`, порту требуется префикс (и только префикс) на основе `UNIQUE_PREFIX` для стандартных каталогов `DOCSDIR`, `EXAMPLESDIR`, `DATADIR`, `WWWDIR`, `ETCDIR`. Эти переменные доступны для портов:
-Make files or directories 'unique', by adding a prefix or suffix.
-If the `dirs` argument is used, the port needs a prefix (and only a prefix) based on `UNIQUE_PREFIX` for standard directories `DOCSDIR`, `EXAMPLESDIR`, `DATADIR`, `WWWDIR`, `ETCDIR`.
-These variables are available for ports:
+* `UNIQUE_PREFIX`: Префикс, используемый для каталогов и файлов. По умолчанию: `${PKGNAMEPREFIX}`.
+* `UNIQUE_PREFIX_FILES`: Список файлов, которые необходимо предварить префиксом. По умолчанию: пусто.
+* `UNIQUE_SUFFIX`: Суффикс, используемый для файлов. По умолчанию: `${PKGNAMESUFFIX}`.
+* `UNIQUE_SUFFIX_FILES`: Список файлов, к которым необходимо добавить суффикс. По умолчанию: пусто.
-* `UNIQUE_PREFIX`: The prefix to be used for directories and files. Default: `${PKGNAMEPREFIX}`.
-* `UNIQUE_PREFIX_FILES`: A list of files that need to be prefixed. Default: empty.
-* `UNIQUE_SUFFIX`: The suffix to be used for files. Default: `${PKGNAMESUFFIX}`.
-* `UNIQUE_SUFFIX_FILES`: A list of files that need to be suffixed. Default: empty.
+[[uses-vala]]
+== `vala`
+
+Возможные аргументы: `build`, `lib`, `no_depend`
+
+Добавляет зависимости сборки или библиотеки на package:lang/vala[]. Аргумент `no_depend` зарезервирован для самого package:lang/vala[].
[[uses-varnish]]
== `varnish`
-Possible arguments: `4`, `6`
+Возможные аргументы: `4` (по умолчанию), `6`, `7`
+
+Обрабатывает зависимости для Varnish Cache. Добавляет зависимость от пакета `package:www/varnish*[]`.
+
+[[uses-waf]]
+== `waf`
+
+Возможные аргументы: (отсутствуют)
+
+Обеспечить поддержку портов, использующих систему сборки `waf`.
+
+Это подразумевает `USES=python:build`.
+
+Следующие переменные экспортируются для использования портом:
+
+`WAF_CMD`::
+Расположение скрипта `waf`. Установите этот параметр, если скрипт `waf` не находится в [.filename]#WRKSRC/waf#.
+
+`CONFIGURE_TARGET`::
+Цель для `configure`. По умолчанию – `configure`.
+
+`ALL_TARGET`::
+Цель для `all`. По умолчанию `build`.
-Handle dependencies on Varnish Cache.
-`4` will add a dependency on package:www/varnish4[].
-`6` will add a dependency on package:www/varnish6[].
+`INSTALL_TARGET`::
+Цель для `install`. По умолчанию `install`.
[[uses-webplugin]]
== `webplugin`
-Possible arguments: (none), `ARGS`
+Возможные аргументы: (нет), `ARGS`
-Automatically create and remove symbolic links for each application that supports the webplugin framework.
-`ARGS` can be one of:
+Автоматически создавать и удалять символические ссылки для каждого приложения, поддерживающего фреймворк webplugin. `ARGS` может быть одним из:
-* `gecko`: support plug-ins based on Gecko
-* `native`: support plug-ins for Gecko, Opera, and WebKit-GTK
-* `linux`: support Linux plug-ins
-* `all` (default, implicit): support all plug-in types
-* (individual entries): support only the browsers listed
+* `gecko`: поддержка плагинов на основе Gecko
+* `native`: поддержка плагинов для Gecko, Opera и WebKit-GTK
+* `linux`: поддержка Linux плагинов
+* `all` (по умолчанию, неявно): поддержка всех типов плагинов
+* (отдельные записи): поддерживаются только перечисленные браузеры
-These variables can be adjusted:
+Эти переменные можно настроить:
-* `WEBPLUGIN_FILES`: No default, must be set manually. The plug-in files to install.
-* `WEBPLUGIN_DIR`: The directory to install the plug-in files to, default [.filename]#PREFIX/lib/browser_plugins/WEBPLUGIN_NAME#. Set this if the port installs plug-in files outside of the default directory to prevent broken symbolic links.
-* `WEBPLUGIN_NAME`: The final directory to install the plug-in files into, default `PKGBASE`.
+* `WEBPLUGIN_FILES`: Значение по умолчанию отсутствует, должно быть установлено вручную. Файлы плагинов для установки.
+* `WEBPLUGIN_DIR`: Каталог для установки файлов плагина, по умолчанию [.filename]#PREFIX/lib/browser_plugins/WEBPLUGIN_NAME#. Установите это значение, если порт устанавливает файлы плагина вне стандартного каталога, чтобы избежать битых символических ссылок.
+* `WEBPLUGIN_NAME`: Конечный каталог для установки файлов плагина, по умолчанию `PKGBASE`.
[[uses-xfce]]
== `xfce`
-Possible arguments: (none), `gtk2`
+Возможные аргументы: (нет), `gtk2`
-Provide support for Xfce related ports.
-See crossref:special[using-xfce,Using Xfce] for details.
+Предоставить поддержку для портов, связанных с Xfce. Подробности см. в crossref:special[using-xfce,Использование Xfce].
-The `gtk2` argument specifies that the port requires GTK2 support.
-It adds additional features provided by some core components, for example, package:x11/libxfce4menu[] and package:x11-wm/xfce4-panel[].
+Аргумент `gtk2` указывает, что порт требует поддержки GTK2. Он добавляет дополнительные возможности, предоставляемые некоторыми основными компонентами, например, package:x11/libxfce4menu[] и package:x11-wm/xfce4-panel[].
[[uses-xorg]]
== `xorg`
-Possible arguments: (none)
+Возможные аргументы: (отсутствуют)
-Provides an easy way to depend on X.org components.
-The components should be listed in `USE_XORG`.
-The available components are:
+Предоставляет простой способ зависеть от компонентов X.org. Компоненты должны быть перечислены в `USE_XORG`. Доступные компоненты:
[[using-x11-components]]
-.Available X.Org Components
+.Доступные компоненты X.Org
[cols="1,1", frame="none", options="header"]
|===
-| Name
-| Description
+| Имя
+| Описание
|`dmx`
-|DMX extension library
+|Библиотека расширений DMX
|`fontenc`
-|The fontenc Library
+|Библиотека fontenc
|`fontutil`
-|Create an index of X font files in a directory
+|Создать индекс файлов шрифтов X в каталоге
|`ice`
-|Inter Client Exchange library for X11
+|Библиотека Inter Client Exchange для X11
|`libfs`
-|The FS library
+|Библиотека FS
|`pciaccess`
-|Generic PCI access library
+|Универсальная библиотека доступа к PCI
|`pixman`
-|Low-level pixel manipulation library
+|Библиотека для низкоуровневого управления пикселями
|`sm`
-|Session Management library for X11
+|Библиотека управления сеансами для X11
|`x11`
-|X11 library
+|Библиотека X11
|`xau`
-|Authentication Protocol library for X11
+|Библиотека протокола аутентификации для X11
|`xaw`
-|X Athena Widgets library
+|Библиотека X Athena Widgets
|`xaw6`
-|X Athena Widgets library
+|Библиотека X Athena Widgets
|`xaw7`
-|X Athena Widgets library
+|Библиотека X Athena Widgets
|`xbitmaps`
-|X.Org bitmaps data
+|Данные растровых изображений X.Org
|`xcb`
-|The X protocol C-language Binding (XCB) library
+|Библиотека с интерфейсом языка С для X протокола (XCB)
|`xcomposite`
-|X Composite extension library
+|Библиотека расширения X Composite
|`xcursor`
-|X client-side cursor loading library
+|X библиотека загрузки курсоров на стороне клиента
|`xdamage`
-|X Damage extension library
+|Библиотека расширения X Damage
|`xdmcp`
-|X Display Manager Control Protocol library
+|Библиотека протокола управления дисплейным менеджером X (XDMCP)
|`xext`
-|X11 Extension library
+|Библиотека расширений X11
|`xfixes`
-|X Fixes extension library
+|Библиотека расширений X Fixes
|`xfont`
-|X font library
+|Библиотека шрифтов X
|`xfont2`
-|X font library
+|Библиотека шрифтов X
|`xft`
-|Client-sided font API for X applications
+|Клиентский API шрифтов для приложений X
|`xi`
-|X Input extension library
+|Библиотека расширения X Input
|`xinerama`
-|X11 Xinerama library
+|Библиотека X11 Xinerama
|`xkbfile`
-|XKB file library
+|Библиотека файлов XKB
|`xmu`
-|X Miscellaneous Utilities libraries
+|Библиотека X Miscellaneous Utilities
|`xmuu`
-|X Miscellaneous Utilities libraries
+|Библиотека X Miscellaneous Utilities
|`xorg-macros`
-|X.Org development aclocal macros
+|X.Org макросы разработки aclocal
|`xorg-server`
-|X.Org X server and related programs
+|Сервер X.Org X и относящиеся к нему программы
|`xorgproto`
-|xorg protocol headers
+|Заголовочные файлы протокола xorg
|`xpm`
-|X Pixmap library
+|Библиотека X Pixmap
|`xpresent`
-|X Present Extension library
+|Библиотека расширений X Present
|`xrandr`
-|X Resize and Rotate extension library
+|Библиотека расширений X Resize and Rotate
|`xrender`
-|X Render extension library
+|Библиотека расширения X Render
|`xres`
-|X Resource usage library
+|Библиотека мониторинга ресурсов X Resource usage
|`xscrnsaver`
-|The XScrnSaver library
+|Библиотека XScrnSaver
|`xshmfence`
-|Shared memory 'SyncFence' synchronization primitive
+|Примитив синхронизации "SyncFence" в разделяемой памяти
|`xt`
-|X Toolkit library
+|Библиотека X Toolkit
|`xtrans`
-|Abstract network code for X
+|Абстрактный сетевой код для X
|`xtst`
-|X Test extension
+|Расширение X Test
|`xv`
-|X Video Extension library
+|Библиотека расширения X Video
|`xvmc`
-|X Video Extension Motion Compensation library
+|Библиотека X Video Extension Motion Compensation
|`xxf86dga`
-|X DGA Extension
+|Расширение X DGA
|`xxf86vm`
-|X Vidmode Extension
+|Расширение X Vidmode
|===
[[uses-xorg-cat]]
== `xorg-cat`
-Possible arguments: `app`, `data`, `doc`, `driver`, `font`, `lib`, `proto`, `util`, `xserver` and (none) or one off `autotools` (default), `meson`
+Возможные аргументы: `app`, `data`, `doc`, `driver`, `font`, `lib`, `proto`, `util`, `xserver` и (без аргументов) или один из `autotools` (по умолчанию), `meson`
-Provide support for building Xorg components.
-It takes care of setting up common dependencies and an appropriate configuration environment needed.
-This is intended only for Xorg components.
+Обеспечивает поддержку сборки компонентов Xorg. Управляет настройкой общих зависимостей и необходимой конфигурационной среды. Предназначено только для компонентов Xorg.
-The category has to match upstream categories.
+Категория должна соответствовать категориям вышестоящего репозитория.
-The second argument is the build system to use.
-autotools is the default, but meson is also supported.
+Второй аргумент — используемая система сборки. По умолчанию используется `autotools`, но также поддерживается `meson`.
[[uses-zip]]
== `zip`
-Possible arguments: (none), `infozip`
+Возможные аргументы: (нет), `infozip`
-Indicates that the distribution files use the ZIP compression algorithm.
-For files using the InfoZip algorithm the `infozip` argument must be passed to set the appropriate dependencies.
+Указывает, что файлы дистрибутива используют алгоритм сжатия ZIP. Для файлов, использующих алгоритм InfoZip, необходимо передать аргумент `infozip`, чтобы установить соответствующие зависимости.
diff --git a/documentation/content/ru/books/porters-handbook/uses/_index.po b/documentation/content/ru/books/porters-handbook/uses/_index.po
new file mode 100644
index 0000000000..8326053acb
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/uses/_index.po
@@ -0,0 +1,9971 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-07-24 21:10+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookuses_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1
+#, no-wrap
+msgid "USES macros make it easy to declare requirements and settings for a FreeBSD Port"
+msgstr "Макросы USES упрощают объявление требований и настроек для порта FreeBSD"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1
+#, no-wrap
+msgid "Chapter 17. Using USES Macros"
+msgstr "Глава 17. Использование макроса USES"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:14
+#, no-wrap
+msgid "Using `USES` Macros"
+msgstr "Использование макроса `USES`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:52
+#, no-wrap
+msgid "An Introduction to `USES`"
+msgstr "Введение в `USES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:56
+msgid ""
+"`USES` macros make it easy to declare requirements and settings for a port. "
+"They can add dependencies, change building behavior, add metadata to "
+"packages, and so on, all by selecting simple, preset values."
+msgstr ""
+"Макросы `USES` упрощают объявление требований и настроек для порта. Они "
+"могут добавлять зависимости, изменять поведение при сборке, добавлять "
+"метаданные в пакеты и так далее, просто выбирая предустановленные значения."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:60
+msgid ""
+"Each section in this chapter describes a possible value for `USES`, along "
+"with its possible arguments. Arguments are appended to the value after a "
+"colon (`:`). Multiple arguments are separated by commas (`,`)."
+msgstr ""
+"Каждый раздел в этой главе описывает возможное значение для `USES`, а также "
+"его возможные аргументы. Аргументы добавляются к значению после двоеточия "
+"(`:`). Несколько аргументов разделяются запятыми (`,`)."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:62
+#, no-wrap
+msgid "Using Multiple Values"
+msgstr "Использование нескольких значений"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:68
+#, no-wrap
+msgid "USES=\tbison perl\n"
+msgstr "USES=\tbison perl\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:72
+#, no-wrap
+msgid "Adding an Argument"
+msgstr "Добавление аргумента"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:78
+#, no-wrap
+msgid "USES=\ttar:xz\n"
+msgstr "USES=\ttar:xz\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:82
+#, no-wrap
+msgid "Adding Multiple Arguments"
+msgstr "Добавление нескольких аргументов"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:88
+#, no-wrap
+msgid "USES=\tdrupal:7,theme\n"
+msgstr "USES=\tdrupal:7,theme\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:92
+#, no-wrap
+msgid "Mixing it All Together"
+msgstr "Смешивая Все Вместе"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:98
+#, no-wrap
+msgid "USES=\tpgsql:9.3+ cpe python:2.7,build\n"
+msgstr "USES=\tpgsql:9.3+ cpe python:2.7,build\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:102
+#, no-wrap
+msgid "`7z`"
+msgstr "`7z`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:105
+msgid "Possible arguments: (none), `p7zip`, `partial`"
+msgstr "Возможные аргументы: (нет), `p7zip`, `partial`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:109
+msgid ""
+"Extract using man:7z[1] instead of man:bsdtar[1] and sets "
+"`EXTRACT_SUFX=.7z`. The `p7zip` option forces a dependency on the `7z` from "
+"package:archivers/p7zip[] if the one from the base system is not able to "
+"extract the files. `EXTRACT_SUFX` is not changed if the `partial` option is "
+"used, this can be used if the main distribution file does not have a "
+"[.filename]#.7z# extension."
+msgstr ""
+"Извлечение с использованием man:7z[1] вместо man:bsdtar[1] и устанавливает "
+"`EXTRACT_SUFX=.7z`. Опция `p7zip` добавляет зависимость от `7z` из "
+"package:archivers/p7zip[], если версия из базовой системы не может извлечь "
+"файлы. `EXTRACT_SUFX` не изменяется, если используется опция `partial`, это "
+"может быть полезно, если основной дистрибутивный файл не имеет расширения "
+"[.filename]#.7z#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:111
+#, no-wrap
+msgid "`ada`"
+msgstr "`ada`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:114
+msgid "Possible arguments: (none), `6`, `12`, `(run)`"
+msgstr "Возможные аргументы: (нет), `6`, `12`, `(запуск)`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:117
+msgid ""
+"Depends on an Ada-capable compiler, and sets `CC` accordingly. Defaults to "
+"use `gcc6-aux` from ports."
+msgstr ""
+"Зависит от компилятора с поддержкой Ada и устанавливает `CC` соответствующим "
+"образом. По умолчанию используется `gcc6-aux` из портов."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:119
+#, no-wrap
+msgid "`angr`"
+msgstr "`angr`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:122
+msgid "Possible arguments: `binaries`, `nose`"
+msgstr "Возможные аргументы: `binaries`, `nose`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:124
+msgid ""
+"Provide support for ports that need the https://github.com/angr/"
+"angr[angrinary analysis platform]."
+msgstr ""
+"Обеспечить поддержку портов, требующих https://github.com/angr/"
+"angr[платформу бинарного анализа angr]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:127
+msgid ""
+"If the `binaries` argument is present, the port requires the special `angr` "
+"binaries for testing."
+msgstr ""
+"Если присутствует аргумент `binaries`, для тестирования порта требуются "
+"специальные бинарные файлы `angr`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:130
+msgid ""
+"If the `nose` argument is present, the port uses `nosetests` for the test "
+"target. This argument implies `USES=python:test`."
+msgstr ""
+"Если присутствует аргумент `nose`, порт использует `nosetests` для цели "
+"тестирования. Этот аргумент подразумевает `USES=python:test`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:132
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:203
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1331
+msgid "The framework provides the following variables to be set by the port:"
+msgstr ""
+"Фреймворк предоставляет следующие переменные, которые могут быть установлены "
+"портом:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:133
+#, no-wrap
+msgid "`ANGR_VERSION`"
+msgstr "`ANGR_VERSION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:135
+msgid "The version of the `angr` project programs."
+msgstr "Версия программ проекта `angr`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:136
+#, no-wrap
+msgid "`ANGR_BINARIES_TAGNAME`"
+msgstr "`ANGR_BINARIES_TAGNAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:138
+msgid "The tagname of the `angr` binaries."
+msgstr "Имя тега для бинарных файлов `angr`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:139
+#, no-wrap
+msgid "`ANGR_NOSETESTS`"
+msgstr "`ANGR_NOSETESTS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:141
+msgid "The path to the `nosetests` program."
+msgstr "Путь к программе `nosetests`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:143
+#, no-wrap
+msgid "`ansible`"
+msgstr "`ansible`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:146
+msgid "Possible arguments: `env`, `module`, `plugin`"
+msgstr "Возможные аргументы: `env`, `module`, `plugin`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:148
+msgid "Provide support for ports depending on package:sysutils/ansible[]."
+msgstr ""
+"Обеспечивает поддержку портов, зависящих от пакета package:sysutils/"
+"ansible[]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:151
+msgid ""
+"If the `env` argument is present, the port does not depend on "
+"package:sysutils/ansible[] but needs some Ansible variables set."
+msgstr ""
+"Если присутствует аргумент `env`, порт не зависит от package:sysutils/"
+"ansible[], но требует установки некоторых переменных Ansible."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:153
+msgid "If the `module` argument is present then the port is an Ansible module."
+msgstr "Если присутствует аргумент `module`, то порт является модулем Ansible."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:155
+msgid "If the `plugin` argument is present then the port is an Ansible plugin."
+msgstr ""
+"Если присутствует аргумент `plugin`, то порт является плагином Ansible."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:157
+msgid "The framework exposes the following variables to the port:"
+msgstr "Фреймворк предоставляет следующие переменные порту:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:158
+#, no-wrap
+msgid "`ANSIBLE_CMD`"
+msgstr "`ANSIBLE_CMD`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:160
+msgid "Path to the ansible program."
+msgstr "Путь к программе ansible."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:161
+#, no-wrap
+msgid "`ANSIBLE_DOC_CMD`"
+msgstr "`ANSIBLE_DOC_CMD`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:163
+msgid "Path to the ansible-doc program."
+msgstr "Путь к программе ansible-doc."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:164
+#, no-wrap
+msgid "`ANSIBLE_RUN_DEPENDS`"
+msgstr "`ANSIBLE_RUN_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:166
+msgid "RUN_DEPENDS with the Ansible port."
+msgstr "RUN_DEPENDS с портом Ansible."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:167
+#, no-wrap
+msgid "`ANSIBLE_DATADIR`"
+msgstr "`ANSIBLE_DATADIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:169
+msgid ""
+"Path to the root of the directory structure where all Ansible's modules and "
+"plugins are stored."
+msgstr ""
+"Путь к корню структуры каталогов, где хранятся все модули и плагины Ansible."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:170
+#, no-wrap
+msgid "`ANSIBLE_ETCDIR`"
+msgstr "`ANSIBLE_ETCDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:172
+msgid "Path to the Ansible etc directory."
+msgstr "Путь к каталогу etc Ansible."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:173
+#, no-wrap
+msgid "`ANSIBLE_PLUGINS_PREFIX`"
+msgstr "`ANSIBLE_PLUGINS_PREFIX`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:175
+msgid "Path to the \"plugins\" directory within `${ANSIBLE_DATADIR}`."
+msgstr "Путь к директории \"plugins\" в `${ANSIBLE_DATADIR}`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:175
+#, no-wrap
+msgid "`ANSIBLE_MODULESDIR`"
+msgstr "`ANSIBLE_MODULESDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:177
+msgid "Path to the directory for local Ansible modules."
+msgstr "Путь к каталогу для локальных модулей Ansible."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:178
+#, no-wrap
+msgid "`ANSIBLE_PLUGINSDIR`"
+msgstr "`ANSIBLE_PLUGINSDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:180
+msgid "Path to the directory for local Ansible plugins."
+msgstr "Путь к каталогу для локальных плагинов Ansible."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:181
+#, no-wrap
+msgid "`ANSIBLE_PLUGIN_TYPE`"
+msgstr "`ANSIBLE_PLUGIN_TYPE`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:183
+msgid "Ansible plugin type (e.g., \"connection\", \"inventory\", or \"vars\")."
+msgstr ""
+"Тип плагина Ansible (например, \"connection\", \"inventory\" или \"vars\")."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:185
+#, no-wrap
+msgid "`apache`"
+msgstr "`apache`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:188
+msgid "Possible arguments: (none), `2.4`, `build`, `run`, `server`"
+msgstr "Возможные аргументы: (нет), `2.4`, `build`, `run`, `server`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:190
+msgid "Provide support for ports depending on the Apache web server."
+msgstr "Обеспечивает поддержку портов, зависящих от веб-сервера Apache."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:194
+msgid ""
+"The version argument can be used to require a specific Apache httpd "
+"version. It is possible to set a specific version (`USES=apache:2.4`) a "
+"minimum version (`USES=apache:2.4+`) or a maximum version "
+"(`USES=apache:-2.4`)."
+msgstr ""
+"Аргумент `version` можно использовать для указания конкретной версии Apache "
+"httpd. Можно задать определённую версию (`USES=apache:2.4`), минимальную "
+"версию (`USES=apache:2.4+`) или максимальную версию (`USES=apache:-2.4`)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:196
+msgid ""
+"If the `build` argument is provided a build dependency is added to the port."
+msgstr ""
+"Если указан аргумент `build`, к порту добавляется зависимость для сборки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:198
+msgid ""
+"If the `run` argument is provided a run dependency is added to the port."
+msgstr ""
+"Если указан аргумент `run`, к порту добавляется зависимость времени "
+"выполнения."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:201
+msgid ""
+"If the `server` argument is provided then it indicates the port is a server "
+"port."
+msgstr ""
+"Если указан аргумент `server`, это означает, что порт является серверным."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:204
+#, no-wrap
+msgid "`AP_FAST_BUILD`"
+msgstr "`AP_FAST_BUILD`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:206
+msgid "Automatic module build"
+msgstr "Автоматическая сборка модуля"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:207
+#, no-wrap
+msgid "`AP_GENPLIST`"
+msgstr "`AP_GENPLIST`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:209
+msgid ""
+"Automatic `PLIST` generation plus add the module disabled into "
+"[.filename]#httpd.conf# (only if no `pkg-plist` exist)"
+msgstr ""
+"Автоматическое создание `PLIST` плюс добавление модуля в отключенном "
+"состоянии в [.filename]#httpd.conf# (только если нет файла `pkg-plist`)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:210
+#, no-wrap
+msgid "`MODULENAME`"
+msgstr "`MODULENAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:212
+msgid "Name of the Apache module. Default: `${PORTNAME}`"
+msgstr "Имя модуля Apache. По умолчанию: `${PORTNAME}`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:213
+#, no-wrap
+msgid "`SHORTMODNAME`"
+msgstr "`SHORTMODNAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:215
+msgid "Short name of the Apache module. Default: `${MODULENAME:S/mod_//}`"
+msgstr "Краткое название модуля Apache. По умолчанию: `${MODULENAME:S/mod_//}`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:216
+#, no-wrap
+msgid "`SRC_FILE`"
+msgstr "`SRC_FILE`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:218
+msgid "Source file of the APACHE module. Default: `${MODULENAME}.c`"
+msgstr "Исходный файл модуля APACHE. По умолчанию: `${MODULENAME}.c`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:220
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1544
+msgid "The following variables can be accessed by the port:"
+msgstr "Следующие переменные могут быть доступны для порта:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:221
+#, no-wrap
+msgid "`APACHE_VERSION`"
+msgstr "`APACHE_VERSION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:223
+msgid "The major-minor release version of the chosen Apache server, e.g. 2.4"
+msgstr ""
+"Основная-вспомогательная версия выбранного сервера Apache, например 2.4"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:224
+#, no-wrap
+msgid "`APACHEETCDIR`"
+msgstr "`APACHEETCDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:226
+msgid ""
+"Location of the Apache configuration directory. Default: [.filename]#$"
+"{LOCALBASE}/etc/apache24#"
+msgstr ""
+"Расположение каталога конфигурации Apache. По умолчанию: [.filename]#$"
+"{LOCALBASE}/etc/apache24#"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:227
+#, no-wrap
+msgid "`APACHEINCLUDEDIR`"
+msgstr "`APACHEINCLUDEDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:229
+msgid ""
+"Location of the Apache include files Default: [.filename]#${LOCALBASE}/"
+"include/apache24#"
+msgstr ""
+"Расположение include-файлов Apache. По умолчанию: [.filename]#${LOCALBASE}/"
+"include/apache24#"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:230
+#, no-wrap
+msgid "`APACHEMODDIR`"
+msgstr "`APACHEMODDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:232
+msgid ""
+"Location of the Apache modules Default: [.filename]#${LOCALBASE}/libxexec/"
+"apache24#"
+msgstr ""
+"Расположение модулей Apache. По умолчанию: [.filename]#${LOCALBASE}/libxexec/"
+"apache24#"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:234
+msgid "`APACHE_DEFAULT`::Default Apache version"
+msgstr "`APACHE_DEFAULT`::Версия Apache по умолчанию"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:237
+#, no-wrap
+msgid "`autoreconf`"
+msgstr "`autoreconf`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:240
+msgid "Possible arguments: (none), `build`"
+msgstr "Возможные аргументы: (нет), `build`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:247
+msgid ""
+"Runs `autoreconf`. It encapsulates the `aclocal`, `autoconf`, `autoheader`, "
+"`automake`, `autopoint`, and `libtoolize` commands. Each command applies to "
+"[.filename]#${AUTORECONF_WRKSRC}/configure.ac# or its old name, [.filename]#$"
+"{AUTORECONF_WRKSRC}/configure.in#. If [.filename]#configure.ac# defines "
+"subdirectories with their own [.filename]#configure.ac# using "
+"`AC_CONFIG_SUBDIRS`, `autoreconf` will recursively update those as well. "
+"The `:build` argument only adds build time dependencies on those tools but "
+"does not run `autoreconf`. A port can set `AUTORECONF_WRKSRC` if `WRKSRC` "
+"does not contain the path to [.filename]#configure.ac#."
+msgstr ""
+"Выполняет `autoreconf`. Эта команда объединяет функциональность `aclocal`, "
+"`autoconf`, `autoheader`, `automake`, `autopoint` и `libtoolize`. Каждая из "
+"этих команд применяется к [.filename]#${AUTORECONF_WRKSRC}/configure.ac# или "
+"его старому названию [.filename]#${AUTORECONF_WRKSRC}/configure.in#. Если "
+"[.filename]#configure.ac# определяет подкаталоги с их собственными "
+"[.filename]#configure.ac# с использованием `AC_CONFIG_SUBDIRS`, `autoreconf` "
+"также рекурсивно обновит их. Аргумент `:build` только добавляет зависимости "
+"времени сборки на эти инструменты, но не запускает `autoreconf`. Порт может "
+"установить `AUTORECONF_WRKSRC`, если `WRKSRC` не содержит путь к "
+"[.filename]#configure.ac#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:249
+#, no-wrap
+msgid "`azurepy`"
+msgstr "`azurepy`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:252
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:313
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:399
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:408
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:417
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:519
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:548
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:559
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:575
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:663
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:797
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:867
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:904
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:937
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:944
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1099
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1170
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1292
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1556
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1563
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1571
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1739
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1758
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1765
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1772
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1811
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1819
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1872
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1933
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1961
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2039
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2061
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2505
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2551
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2560
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2723
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2798
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2806
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2861
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2877
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2915
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2970
+msgid "Possible arguments: (none)"
+msgstr "Возможные аргументы: (отсутствуют)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:255
+msgid ""
+"Provide support for `py-azure*` ports. Removes `azure` namespaces and "
+"cleans up common files."
+msgstr ""
+"Обеспечить поддержку портов `py-azure*`. Удаляет пространства имен `azure` и "
+"очищает общие файлы."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:257
+#, no-wrap
+msgid "`blaslapack`"
+msgstr "`blaslapack`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:260
+msgid ""
+"Possible arguments: (none), `atlas`, `netlib` (default), `gotoblas`, "
+"`openblas`"
+msgstr ""
+"Возможные аргументы: (нет), `atlas`, `netlib` (по умолчанию), `gotoblas`, "
+"`openblas`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:262
+msgid "Adds dependencies on Blas / Lapack libraries."
+msgstr "Добавляет зависимости от библиотек Blas / Lapack."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:264
+#, no-wrap
+msgid "`bdb`"
+msgstr "`bdb`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:267
+msgid "Possible arguments: (none), `5` (default), `18`"
+msgstr "Возможные аргументы: (отсутствуют), `5` (по умолчанию), `18`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:275
+msgid ""
+"Add dependency on the Berkeley DB library. Default to package:databases/"
+"db5[]. It can also depend on package:databases/db18[] when using the `:18` "
+"argument. It is possible to declare a range of acceptable values, `:5+` "
+"finds the highest installed version, and falls back to 5 if nothing else is "
+"installed. `INVALID_BDB_VER` can be used to specify versions which do not "
+"work with this port. The framework exposes the following variables to the "
+"port:"
+msgstr ""
+"Добавить зависимость от библиотеки Berkeley DB. По умолчанию используется "
+"package:databases/db5[]. Также может зависеть от package:databases/db18[] "
+"при использовании аргумента `:18`. Можно объявить диапазон допустимых "
+"значений: `:5+` находит самую высокую установленную версию и возвращается к "
+"5, если ничего другого не установлено. `INVALID_BDB_VER` можно использовать "
+"для указания версий, которые не работают с этим портом. Фреймворк "
+"предоставляет порту следующие переменные:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:276
+#, no-wrap
+msgid "`BDB_LIB_NAME`"
+msgstr "`BDB_LIB_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:279
+msgid ""
+"The name of the Berkeley DB library. For example, when using "
+"package:databases/db5[], it contains `db-5.3`."
+msgstr ""
+"Имя библиотеки Berkeley DB. Например, при использовании package:databases/"
+"db5[] она содержит `db-5.3`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:280
+#, no-wrap
+msgid "`BDB_LIB_CXX_NAME`"
+msgstr "`BDB_LIB_CXX_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:283
+msgid ""
+"The name of the Berkeley DBC++ library. For example, when using "
+"package:databases/db5[], it contains `db_cxx-5.3`."
+msgstr ""
+"Название библиотеки Berkeley DBC++. Например, при использовании "
+"package:databases/db5[] она содержит `db_cxx-5.3`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:284
+#, no-wrap
+msgid "`BDB_INCLUDE_DIR`"
+msgstr "`BDB_INCLUDE_DIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:287
+msgid ""
+"The location of the Berkeley DB include directory. For example, when using "
+"package:databases/db5[], it will contain `${LOCALBASE}/include/db5`."
+msgstr ""
+"Расположение каталога с заголовочными файлами Berkeley DB. Например, при "
+"использовании пакета package:databases/db5[], он будет содержать `$"
+"{LOCALBASE}/include/db5`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:288
+#, no-wrap
+msgid "`BDB_LIB_DIR`"
+msgstr "`BDB_LIB_DIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:291
+msgid ""
+"The location of the Berkeley DB library directory. For example, when using "
+"package:databases/db5[], it contains `${LOCALBASE}/lib`."
+msgstr ""
+"Расположение каталога библиотеки Berkeley DB. Например, при использовании "
+"package:databases/db5[], он содержит `${LOCALBASE}/lib`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:292
+#, no-wrap
+msgid "`BDB_VER`"
+msgstr "`BDB_VER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:295
+msgid ""
+"The detected Berkeley DB version. For example, if using `USES=bdb:5+` and "
+"Berkeley DB 18 is installed, it contains `18`."
+msgstr ""
+"Обнаруженная версия Berkeley DB. Например, при использовании `USES=bdb:5+` и "
+"установленной Berkeley DB 18, будет содержать `18`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:300
+msgid ""
+"package:databases/db48[] is deprecated and unsupported. It must not be used "
+"by any port."
+msgstr ""
+"package:databases/db48[] устарел и не поддерживается. Он не должен "
+"использоваться ни одним портом."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:303
+#, no-wrap
+msgid "`bison`"
+msgstr "`bison`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:306
+msgid "Possible arguments: (none), `build`, `run`, `both`"
+msgstr "Возможные аргументы: (нет), `build`, `run`, `both`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:308
+msgid ""
+"Uses package:devel/bison[] By default, with no arguments or with the `build` "
+"argument, it implies `bison` is a build-time dependency, `run` implies a run-"
+"time dependency, and `both` implies both run-time and build-time "
+"dependencies."
+msgstr ""
+"Использует пакет package:devel/bison[] По умолчанию, без аргументов или с "
+"аргументом `build`, подразумевается, что `bison` является зависимостью на "
+"этапе сборки, `run` — зависимостью на этапе выполнения, а `both` — "
+"зависимостью как на этапе сборки, так и на этапе выполнения."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:310
+#, no-wrap
+msgid "`budgie`"
+msgstr "`budgie`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:317
+msgid ""
+"Provide support for the Budgie desktop environment. Use `USE_BUDGIE` to "
+"select the components needed for the port. See crossref:special[using-"
+"budgie,Using Budgie] for more information."
+msgstr ""
+"Предоставить поддержку окружения рабочего стола Budgie. Используйте "
+"`USE_BUDGIE` для выбора необходимых компонентов порта. Дополнительную "
+"информацию см. в разделе crossref:special[using-budgie,Использование Budgie]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:319
+#, no-wrap
+msgid "`cabal`"
+msgstr "`cabal`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:324
+msgid ""
+"Ports should not be created for Haskell libraries, see "
+"crossref:special[haskell-libs,Haskell Libraries] for more information."
+msgstr ""
+"Порты не следует создавать для библиотек Haskell, подробнее см. в "
+"crossref:special[haskell-libs,Библиотеки Haskell]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:327
+msgid "Possible arguments: (none), `hpack`, `nodefault`"
+msgstr "Возможные аргументы: (отсутствуют), `hpack`, `nodefault`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:335
+msgid ""
+"Sets default values and targets used to build Haskell software using Cabal. "
+"A build dependency on the Haskell compiler port (package:lang/ghc[]) is "
+"added. If there is some other version of GHC already listed in the "
+"`BUILD_DEPENDS` variable (for example, package:lang/ghc810[]), it would be "
+"used instead. If the `hpack` argument is given, a build dependency on "
+"package:devel/hs-hpack[] is added and `hpack` is invoked at configuration "
+"step to generate .cabal file. If the `nodefault` argument is given, the "
+"framework will not try to pull the main distribution file from the Hackage. "
+"This argument is implicitly added if `USE_GITHUB` or `USE_GITLAB` is present."
+msgstr ""
+"Устанавливает значения и цели по умолчанию, используемые для сборки "
+"программного обеспечения на Haskell с помощью Cabal. Добавляется зависимость "
+"для сборки на порт компилятора Haskell (package:lang/ghc[]). Если в "
+"переменной `BUILD_DEPENDS` уже указана другая версия GHC (например, "
+"package:lang/ghc810[]), она будет использована вместо версии по умолчанию. "
+"Если указан аргумент `hpack`, добавляется зависимость для сборки на "
+"package:devel/hs-hpack[], и `hpack` вызывается на этапе конфигурации для "
+"генерации файла .cabal. Если указан аргумент `nodefault`, фреймворк не будет "
+"пытаться загрузить основной дистрибутивный файл из Hackage. Этот аргумент "
+"добавляется неявно, если присутствует `USE_GITHUB` или `USE_GITLAB`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:337
+msgid "The framework provides the following variables:"
+msgstr "Фреймворк предоставляет следующие переменные:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:338
+#, no-wrap
+msgid "`CABAL_REVISION`"
+msgstr "`CABAL_REVISION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:341
+msgid ""
+"Haskell packages hosted on Hackage may have revisions. Set this knob to an "
+"integer number to pull in revised package description."
+msgstr ""
+"Пакеты Haskell, размещённые на Hackage, могут иметь ревизии. Установите этот "
+"параметр в целочисленное значение, чтобы использовать исправленное описание "
+"пакета."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:342
+#, no-wrap
+msgid "`USE_CABAL`"
+msgstr "`USE_CABAL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:347
+msgid ""
+"If the software uses Haskell dependencies, list them in this variable. Each "
+"item should be present on Hackage and be listed in form `packagename-"
+"_0.1.2_`. Dependencies can have revisions too, which are specified after "
+"the `_` symbol. Automatic generation of the dependency list is supported, "
+"see crossref:special[using-cabal,Building Haskell Applications with `cabal`]."
+msgstr ""
+"Если программное обеспечение использует зависимости на Haskell, перечислите "
+"их в этой переменной. Каждый элемент должен присутствовать на Hackage и быть "
+"указан в формате `имяпакета-_0.1.2_`. Зависимости также могут иметь ревизии, "
+"которые указываются после символа `_`. Поддерживается автоматическое "
+"формирование списка зависимостей, см. crossref:special[using-cabal,Сборка "
+"приложений на Haskell с помощью `cabal`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:348
+#, no-wrap
+msgid "`CABAL_FLAGS`"
+msgstr "`CABAL_FLAGS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:353
+msgid ""
+"List of flags to be passed to `cabal-install` during the configuring and "
+"building stage. The flags are passed verbatim. This variable is usually "
+"used to enable or disable flags that are declared in the .cabal file. Pass "
+"`foo` to enable the `foo` flag and `-foo` to disable it."
+msgstr ""
+"Список флагов, передаваемых `cabal-install` на этапах настройки и сборки. "
+"Флаги передаются в исходном виде. Эта переменная обычно используется для "
+"включения или отключения флагов, объявленных в файле .cabal. Передайте "
+"`foo`, чтобы включить флаг `foo`, и `-foo`, чтобы отключить его."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:354
+#, no-wrap
+msgid "`CABAL_EXECUTABLES`"
+msgstr "`CABAL_EXECUTABLES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:360
+msgid ""
+"List of executable files installed by the port. Default value: `${PORTNAME}"
+"`. Consult the .cabal file of the project being ported to get a list of "
+"possible values for this variable. Each value corresponds to an `executable` "
+"stanza in the .cabal file. Items from this list are automatically added to "
+"pkg-plist."
+msgstr ""
+"Список исполняемых файлов, устанавливаемых портом. Значение по умолчанию: `$"
+"{PORTNAME}`. Для получения списка возможных значений этой переменной "
+"обратитесь к файлу .cabal портируемого проекта. Каждое значение "
+"соответствует разделу `executable` в файле .cabal. Элементы из этого списка "
+"автоматически добавляются в pkg-plist."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:361
+#, no-wrap
+msgid "`SKIP_CABAL_PLIST`"
+msgstr "`SKIP_CABAL_PLIST`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:363
+msgid "If defined, do not add items from `${CABAL_EXECUTABLES}` to pkg-plist."
+msgstr ""
+"Если определено, не добавлять элементы из `${CABAL_EXECUTABLES}` в pkg-plist."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:364
+#, no-wrap
+msgid "`opt_USE_CABAL`"
+msgstr "`opt_USE_CABAL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:366
+msgid "Adds items to `${USE_CABAL}` depending on `opt` option."
+msgstr "Добавляет элементы в `${USE_CABAL}` в зависимости от опции `opt`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:367
+#, no-wrap
+msgid "`opt_CABAL_EXECUTABLES`"
+msgstr "`opt_CABAL_EXECUTABLES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:369
+msgid "Adds items to `${CABAL_EXECUTABLES}` depending on `opt` option."
+msgstr ""
+"Добавляет элементы в `${CABAL_EXECUTABLES}` в зависимости от опции `opt`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:370
+#, no-wrap
+msgid "`opt_CABAL_FLAGS`"
+msgstr "`opt_CABAL_FLAGS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:374
+msgid ""
+"If `opt` is enabled, append the value to `${CABAL_FLAGS}`. Otherwise, "
+"append `-value` to disable the flag. Note that this behavior is slightly "
+"different from the plain `CABAL_FLAGS` as it does not accept values starting "
+"with `-`."
+msgstr ""
+"Если `opt` включён, добавить значение к `${CABAL_FLAGS}`. В противном случае "
+"добавить `-value`, чтобы отключить флаг. Обратите внимание, что это "
+"поведение немного отличается от простого `CABAL_FLAGS`, так как оно не "
+"принимает значения, начинающиеся с `-`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:375
+#, no-wrap
+msgid "`CABAL_WRAPPER_SCRIPTS`"
+msgstr "`CABAL_WRAPPER_SCRIPTS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:380
+msgid ""
+"A subset of `${CABAL_EXECUTABLES}` containing Haskell programs to be wrapped "
+"into a shell script that sets `*_datadir` environment variables before "
+"running the program. This also causes the actual Haskell binary to be "
+"installed under `libexec/cabal/` directory. This knob is needed for Haskell "
+"programs that install their data files under `share/` directory."
+msgstr ""
+"Подмножество `${CABAL_EXECUTABLES}`, содержащее программы на Haskell, "
+"которые будут обёрнуты в shell-скрипт, устанавливающий переменные окружения "
+"`*_datadir` перед запуском программы. Это также приводит к тому, что "
+"фактический бинарный файл Haskell устанавливается в директорию `libexec/"
+"cabal/`. Данная настройка необходима для программ на Haskell, которые "
+"устанавливают свои файлы данных в директорию `share/`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:381
+#, no-wrap
+msgid "`FOO_DATADIR_VARS`"
+msgstr "`FOO_DATADIR_VARS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:385
+msgid ""
+"List of extra Haskell packages, whose data files should be accessible by the "
+"executable named `FOO`. The executable should be a part of `$"
+"{CABAL_WRAPPER_SCRIPTS}`. Haskell packages listed there should not have a "
+"version suffix."
+msgstr ""
+"Список дополнительных пакетов Haskell, чьи файлы данных должны быть доступны "
+"исполняемому файлу с именем `FOO`. Исполняемый файл должен быть частью `$"
+"{CABAL_WRAPPER_SCRIPTS}`. Указанные пакеты Haskell не должны иметь суффикса "
+"версии."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:386
+#, no-wrap
+msgid "`CABAL_PROJECT`"
+msgstr "`CABAL_PROJECT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:391
+msgid ""
+"Some Haskell projects may already have a `cabal.project` file, which is also "
+"generated by the ports framework. If that is the case, use this variable to "
+"specify what to do with the original `cabal.project`. Setting this variable "
+"to `remove` will cause the original file to be removed. Setting this "
+"variable to `append` will:"
+msgstr ""
+"Некоторые проекты на Haskell могут уже иметь файл `cabal.project`, который "
+"также создаётся фреймворком портов. Если это так, используйте эту "
+"переменную, чтобы указать, что делать с оригинальным файлом `cabal.project`. "
+"Установка этой переменной в значение `remove` приведёт к удалению "
+"оригинального файла. Установка этой переменной в значение `append` приведёт "
+"к следующему:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:392
+msgid ""
+"Move the original file to `cabal.project.${PORTNAME}` during the `extract` "
+"stage."
+msgstr ""
+"Исходный файл переместится в `cabal.project.${PORTNAME}` на этапе `extract`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:394
+msgid ""
+"Concatenate the original `cabal.project.${PORTNAME}` and the generated "
+"`cabal.project` into a single file after the `patch` stage. Using `append` "
+"makes it possible to perform patching on the original file before it gets "
+"merged."
+msgstr ""
+"Исходный файл `cabal.project.${PORTNAME}` и сгенерированный `cabal.project` "
+"объединятся в один файл после этапа `patch`. Использование `append` "
+"позволяет выполнить патчинг исходного файла перед его объединением."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:396
+#, no-wrap
+msgid "`cargo`"
+msgstr "`cargo`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:403
+msgid ""
+"Uses Cargo for configuring, building, and testing. It can be used to port "
+"Rust applications that use the Cargo build system. For more information see "
+"crossref:special[using-cargo,Building Rust Applications with `cargo`]."
+msgstr ""
+"Использует Cargo для настройки, сборки и тестирования. Может применяться для "
+"портирования приложений на Rust, использующих систему сборки Cargo. "
+"Дополнительную информацию смотрите в crossref:special[using-cargo,Сборка "
+"приложений на Rust с помощью `cargo`]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:405
+#, no-wrap
+msgid "`charsetfix`"
+msgstr "`charsetfix`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:412
+msgid ""
+"Prevents the port from installing [.filename]#charset.alias#. This must be "
+"installed only by package:converters/libiconv[]. `CHARSETFIX_MAKEFILEIN` "
+"can be set to a path relative to `WRKSRC` if [.filename]#charset.alias# is "
+"not installed by [.filename]#${WRKSRC}/Makefile.in#."
+msgstr ""
+"Предотвращает установку файла [.filename]#charset.alias# портом. Этот файл "
+"должен устанавливаться только пакетом package:converters/libiconv[]. "
+"Переменная `CHARSETFIX_MAKEFILEIN` может быть установлена в путь "
+"относительно `WRKSRC`, если [.filename]#charset.alias# не устанавливается "
+"через [.filename]#${WRKSRC}/Makefile.in#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:414
+#, no-wrap
+msgid "`cl`"
+msgstr "`cl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:419
+msgid "Provides support for Common Lisp ports."
+msgstr "Предоставляет поддержку портов Common Lisp."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:421
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:627
+msgid ""
+"The framework provides the following variables that can be set by ports:"
+msgstr ""
+"Фреймворк предоставляет следующие переменные, которые могут быть установлены "
+"портами:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:422
+#, no-wrap
+msgid "`ASDF_MODULES`"
+msgstr "`ASDF_MODULES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:424
+msgid ""
+"List of `ASDF` modules to build when `FASL_TARGET` is set (defaults to "
+"`PORTNAME`)"
+msgstr ""
+"Список модулей `ASDF` для сборки, когда установлен `FASL_TARGET` (по "
+"умолчанию `PORTNAME`)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:425
+#, no-wrap
+msgid "`FASL_TARGET`"
+msgstr "`FASL_TARGET`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:427
+msgid "Build fasl variant of port (one of `ccl`, `clisp`, or `sbcl`)"
+msgstr "Собрать fasl вариант порта (один из `ccl`, `clisp` или `sbcl`)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:428
+#, no-wrap
+msgid "`USE_ASDF`"
+msgstr "`USE_ASDF`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:430
+msgid "Depend on package:devel/cl-asdf[]"
+msgstr "Зависит от пакета package:devel/cl-asdf[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:431
+#, no-wrap
+msgid "`USE_ASDF_FASL`"
+msgstr "`USE_ASDF_FASL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:433
+msgid "Depend on `devel/cl-asdf-<FASL_TARGET>`"
+msgstr "Зависит от `devel/cl-asdf-<FASL_TARGET>`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:434
+#, no-wrap
+msgid "`USE_CCL`"
+msgstr "`USE_CCL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:436
+msgid "Depend on package:lang/ccl[]; implied when `FASL_TARGET=ccl`"
+msgstr ""
+"Зависит от пакета package:lang/ccl[]; подразумевается при `FASL_TARGET=ccl`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:437
+#, no-wrap
+msgid "`USE_CLISP`"
+msgstr "`USE_CLISP`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:439
+msgid "Depend on package:lang/clisp[]; implied when `FASL_TARGET=clisp`"
+msgstr ""
+"Зависит от пакета package:lang/clisp[]; подразумевается при "
+"`FASL_TARGET=clisp`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:440
+#, no-wrap
+msgid "`USE_SBCL`"
+msgstr "`USE_SBCL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:442
+msgid "Depend on package:lang/sbcl[]; implied when `FASL_TARGET=SBCL`"
+msgstr ""
+"Зависит от пакета package:lang/sbcl[]; подразумевается, если "
+"`FASL_TARGET=SBCL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:445
+msgid ""
+"The framework provides the following variables that can be read by ports:"
+msgstr ""
+"Фреймворк предоставляет следующие переменные, которые могут быть прочитаны "
+"портами:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:446
+#, no-wrap
+msgid "`ASDF_PATHNAME`"
+msgstr "`ASDF_PATHNAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:448
+msgid "Path to CL source"
+msgstr "Путь к исходному коду CL"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:449
+#, no-wrap
+msgid "`ASDF_REGISTRY`"
+msgstr "`ASDF_REGISTRY`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:451
+msgid "Path to CL registry containing asd files"
+msgstr "Путь к реестру CL, содержащему файлы asd"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:452
+#, no-wrap
+msgid "`CCL`"
+msgstr "`CCL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:454
+msgid "Path to the Clozure Common Lisp compiler"
+msgstr "Путь к компилятору Clozure Common Lisp"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:455
+#, no-wrap
+msgid "`CLISP`"
+msgstr "`CLISP`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:457
+msgid "Path to the GNU Common Lisp compiler"
+msgstr "Путь к компилятору GNU Common Lisp"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:458
+#, no-wrap
+msgid "`CL_LIBDIR_REL`"
+msgstr "`CL_LIBDIR_REL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:460
+msgid "CL library directory relative to `LOCALBASE` or `PREFIX`"
+msgstr "Каталог библиотек CL относительно `LOCALBASE` или `PREFIX`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:461
+#, no-wrap
+msgid "`FASL_DIR_REL`"
+msgstr "`FASL_DIR_REL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:463
+msgid "Relative path to compiled fasl files; depends on `FASL_TARGET`"
+msgstr ""
+"Относительный путь к скомпилированным fasl-файлам; зависит от `FASL_TARGET`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:464
+#, no-wrap
+msgid "`FASL_PATHNAME`"
+msgstr "`FASL_PATHNAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:466
+msgid "Path to CL fasl"
+msgstr "Путь к CL fasl"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:467
+#, no-wrap
+msgid "`LISP_EXTRA_ARG`"
+msgstr "`LISP_EXTRA_ARG`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:469
+msgid "Extra arguments used when building fasl"
+msgstr "Дополнительные аргументы, используемые при сборке fasl"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:470
+#, no-wrap
+msgid "`SBCL`"
+msgstr "`SBCL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:472
+msgid "Path to the Steel Bank Common Lisp compiler"
+msgstr "Путь к компилятору Steel Bank Common Lisp"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:474
+#, no-wrap
+msgid "`cmake`"
+msgstr "`cmake`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:477
+msgid "Possible arguments: (none), `insource`, `noninja`, `run`, `testing`"
+msgstr ""
+"Возможные аргументы: (отсутствуют), `insource`, `noninja`, `run`, `testing`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:479
+msgid "Use CMake for configuring the port and generating a build system."
+msgstr "Используйте CMake для настройки порта и генерации системы сборки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:483
+msgid ""
+"By default an out-of-source build is performed, leaving the sources in "
+"`WRKSRC` free from build artifacts. With the `insource` argument, an in-"
+"source build will be performed instead. This argument should be an "
+"exception, used only when a regular out-of-source build does not work."
+msgstr ""
+"По умолчанию выполняется сборка в дереве вне исходного кода, оставляя "
+"исходные файлы в `WRKSRC` свободными от артефактов сборки. С аргументом "
+"`insource` вместо этого будет выполнена сборка в исходном коде. Этот "
+"аргумент должен быть исключением и использоваться только в случае, когда "
+"обычная сборка вне исходного кода не работает."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:488
+msgid ""
+"By default Ninja (package:devel/ninja[]) is used for the build. In some "
+"cases this does not work correctly. With the `noninja` argument, the build "
+"will use regular `make` for builds. This argument should only be used if a "
+"Ninja-based build does not work."
+msgstr ""
+"По умолчанию для сборки используется Ninja (package:devel/ninja[]). В "
+"некоторых случаях это может работать некорректно. С аргументом `noninja` "
+"сборка будет использовать обычный `make`. Этот аргумент следует применять "
+"только если сборка на основе Ninja не работает."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:490
+msgid ""
+"With the `run` argument, a run dependency is registered in addition to a "
+"build dependency."
+msgstr ""
+"С аргументом `run` регистрируется зависимость во время выполнения в "
+"дополнение к зависимости при сборке."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:493
+msgid ""
+"With the `testing` argument, a test-target is added that uses CTest. When "
+"running tests the port will be re-configured for testing and re-built."
+msgstr ""
+"С аргументом `testing`, добавляется цель тестирования, использующая CTest. "
+"При запуске тестов порт будет переконфигурирован для тестирования и "
+"пересобран."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:495
+msgid "For more information see crossref:special[using-cmake,Using `cmake`]."
+msgstr ""
+"Для получения дополнительной информации см. crossref:special[using-"
+"cmake,Использование `cmake`]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:497
+#, no-wrap
+msgid "`compiler`"
+msgstr "`compiler`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:500
+msgid ""
+"Possible arguments: (none), `env` (default, implicit), `{cpp}17-lang`, `{cpp}"
+"14-lang`, `{cpp}11-lang`, `gcc-{cpp}11-lib`, `{cpp}11-lib`, `{cpp}0x`, "
+"`c11`, `nestedfct`, `features`"
+msgstr ""
+"Возможные аргументы: (нет), `env` (по умолчанию, подразумевается), `{cpp}17-"
+"lang`, `{cpp}14-lang`, `{cpp}11-lang`, `gcc-{cpp}11-lib`, `{cpp}11-lib`, "
+"`{cpp}0x`, `c11`, `nestedfct`, `features`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:504
+msgid ""
+"Determines which compiler to use based on any given wishes. Use `{cpp}17-"
+"lang` if the port needs a {cpp}17-capable compiler, `{cpp}14-lang` if the "
+"port needs a {cpp}14-capable compiler, `{cpp}11-lang` if the port needs a "
+"{cpp}11-capable compiler, `gcc-{cpp}11-lib` if the port needs the `g++` "
+"compiler with a {cpp}11 library, or `{cpp}11-lib` if the port needs a {cpp}"
+"11-ready standard library. If the port needs a compiler understanding {cpp}"
+"0X, C11 or nested functions, the corresponding parameters should be used."
+msgstr ""
+"Определяет, какой компилятор использовать, исходя из заданных предпочтений. "
+"Используйте `{cpp}17-lang`, если порту требуется компилятор с поддержкой "
+"{cpp}17, `{cpp}14-lang`, если порту требуется компилятор с поддержкой {cpp}"
+"14, `{cpp}11-lang`, если порту требуется компилятор с поддержкой {cpp}11, "
+"`gcc-{cpp}11-lib`, если порту требуется компилятор `g++` с библиотекой {cpp}"
+"11, или `{cpp}11-lib`, если порту требуется стандартная библиотека с "
+"поддержкой {cpp}11. Если порту требуется компилятор, понимающий {cpp}0X, C11 "
+"или вложенные функции, следует использовать соответствующие параметры."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:507
+msgid ""
+"Use `features` to request a list of features supported by the default "
+"compiler. After including [.filename]#bsd.port.pre.mk# the port can inspect "
+"the results using these variables:"
+msgstr ""
+"Используйте `features` для запроса списка возможностей, поддерживаемых "
+"компилятором по умолчанию. После включения [.filename]#bsd.port.pre.mk# порт "
+"может проверить результаты с помощью следующих переменных:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:509
+msgid ""
+"`COMPILER_TYPE`: the default compiler on the system, either gcc or clang"
+msgstr "`COMPILER_TYPE`: компилятор по умолчанию в системе, gcc или clang"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:510
+msgid ""
+"`ALT_COMPILER_TYPE`: the alternative compiler on the system, either gcc or "
+"clang. Only set if two compilers are present in the base system."
+msgstr ""
+"`ALT_COMPILER_TYPE`: альтернативный компилятор в системе, gcc или clang. "
+"Устанавливается только при наличии двух компиляторов в базовой системе."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:511
+msgid ""
+"`COMPILER_VERSION`: the first two digits of the version of the default "
+"compiler."
+msgstr "`COMPILER_VERSION`: первые две цифры версии компилятора по умолчанию."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:512
+msgid ""
+"`ALT_COMPILER_VERSION`: the first two digits of the version of the "
+"alternative compiler, if present."
+msgstr ""
+"`ALT_COMPILER_VERSION`: первые две цифры версии альтернативного компилятора, "
+"если он присутствует."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:513
+msgid "`CHOSEN_COMPILER_TYPE`: the chosen compiler, either gcc or clang"
+msgstr "`CHOSEN_COMPILER_TYPE`: выбранный компилятор, gcc или clang"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:514
+msgid ""
+"`COMPILER_FEATURES`: the features supported by the default compiler. It "
+"currently lists the {cpp} library."
+msgstr ""
+"`COMPILER_FEATURES`: возможности, поддерживаемые компилятором по умолчанию. "
+"В настоящее время указана библиотека {cpp}."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:516
+#, no-wrap
+msgid "`cpe`"
+msgstr "`cpe`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:523
+msgid ""
+"Include Common Platform Enumeration (CPE) information in package manifest as "
+"a CPE 2.3 formatted string. See the https://scap.nist.gov/specifications/"
+"cpe/[CPE specification] for details. To add CPE information to a port, "
+"follow these steps:"
+msgstr ""
+"Включает информацию о Common Platform Enumeration (CPE) в манифест пакета в "
+"виде строки формата CPE 2.3. Подробности см. в https://scap.nist.gov/"
+"specifications/cpe/[спецификации CPE]. Чтобы добавить информацию CPE в порт, "
+"выполните следующие шаги:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:526
+msgid ""
+"Search for the official CPE entry for the software product either by using "
+"the NVD's https://web.nvd.nist.gov/view/cpe/search[CPE search engine] or in "
+"the https://nvd.nist.gov/feeds/xml/cpe/dictionary/official-cpe-"
+"dictionary_v2.3.xml.gz[official CPE dictionary] (warning, very large XML "
+"file). _Do not ever make up CPE data._"
+msgstr ""
+"Поищите официальную запись CPE для программного продукта, используя либо "
+"https://web.nvd.nist.gov/view/cpe/search[поисковую систему CPE] от NVD, либо "
+"https://nvd.nist.gov/feeds/xml/cpe/dictionary/official-cpe-"
+"dictionary_v2.3.xml.gz[официальный словарь CPE] (предупреждение: очень "
+"большой XML-файл). _Никогда не создавайте данные CPE самостоятельно._"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:527
+msgid ""
+"Add `cpe` to `USES` and compare the result of `make -V CPE_STR` to the CPE "
+"dictionary entry. Continue one step at a time until `make -V CPE_STR` is "
+"correct."
+msgstr ""
+"Добавьте `cpe` в `USES` и сравните результат выполнения `make -V CPE_STR` с "
+"записью в словаре CPE. Продолжайте шаг за шагом, пока результат `make -V "
+"CPE_STR` не станет корректным."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:528
+msgid ""
+"If the product name (second field, defaults to `PORTNAME`) is incorrect, "
+"define `CPE_PRODUCT`."
+msgstr ""
+"Если название продукта (второе поле, по умолчанию `PORTNAME`) указано "
+"неверно, определите `CPE_PRODUCT`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:529
+msgid ""
+"If the vendor name (first field, defaults to `CPE_PRODUCT`) is incorrect, "
+"define `CPE_VENDOR`."
+msgstr ""
+"Если название производителя (первое поле, по умолчанию `CPE_PRODUCT`) "
+"указано неверно, определите `CPE_VENDOR`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:530
+msgid ""
+"If the version field (third field, defaults to `PORTVERSION`) is incorrect, "
+"define `CPE_VERSION`."
+msgstr ""
+"Если поле версии (третье поле, по умолчанию `PORTVERSION`) указано неверно, "
+"определите `CPE_VERSION`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:531
+msgid ""
+"If the update field (fourth field, defaults to empty) is incorrect, define "
+"`CPE_UPDATE`."
+msgstr ""
+"Если поле обновления (четвертое поле, по умолчанию пустое) указано неверно, "
+"определите `CPE_UPDATE`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:532
+msgid ""
+"If it is still not correct, check [.filename]#Mk/Uses/cpe.mk# for additional "
+"details, or contact the {ports-secteam}."
+msgstr ""
+"Если это всё ещё неверно, проверьте файл [.filename]#Mk/Uses/cpe.mk# для "
+"получения дополнительной информации или свяжитесь с {ports-secteam}."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:533
+msgid ""
+"Derive as much as possible of the CPE name from existing variables such as "
+"`PORTNAME` and `PORTVERSION`. Use variable modifiers to extract the relevant "
+"portions from these variables rather than hardcoding the name."
+msgstr ""
+"Извлекайте как можно больше информации для имени CPE из существующих "
+"переменных, таких как `PORTNAME` и `PORTVERSION`. Используйте модификаторы "
+"переменных для извлечения соответствующих частей из этих переменных, вместо "
+"того чтобы жестко прописывать имя."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:534
+msgid ""
+"_Always_ run `make -V CPE_STR` and check the output before committing "
+"anything that changes `PORTNAME` or `PORTVERSION` or any other variable "
+"which is used to derive `CPE_STR`."
+msgstr ""
+"_Всегда_ выполняйте `make -V CPE_STR` и проверяйте вывод перед коммитом "
+"любых изменений, затрагивающих `PORTNAME`, `PORTVERSION` или любые другие "
+"переменные, используемые для формирования `CPE_STR`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:536
+#, no-wrap
+msgid "`cran`"
+msgstr "`cran`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:539
+msgid "Possible arguments: (none), `auto-plist`, `compiles`"
+msgstr "Возможные аргументы: (нет), `auto-plist`, `compiles`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:543
+msgid ""
+"Uses the Comprehensive R Archive Network. Specify `auto-plist` to "
+"automatically generate [.filename]#pkg-plist#. Specify `compiles` if the "
+"port has code that need to be compiled."
+msgstr ""
+"Использует Comprehensive R Archive Network. Укажите `auto-plist` для "
+"автоматического создания [.filename]#pkg-plist#. Укажите `compiles`, если "
+"порт содержит код, который необходимо компилировать."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:545
+#, no-wrap
+msgid "`desktop-file-utils`"
+msgstr "`desktop-file-utils`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:554
+msgid ""
+"Uses update-desktop-database from package:devel/desktop-file-utils[]. An "
+"extra post-install step will be run without interfering with any post-"
+"install steps already in the port [.filename]#Makefile#. A line with "
+"crossref:plist[plist-keywords-desktop-file-utils,`@desktop-file-utils`] will "
+"be added to the plist. Only use this macro if the port provides a "
+"`.desktop` file which contains a `MimeType` entry."
+msgstr ""
+"Использует update-desktop-database из пакета package:devel/desktop-file-"
+"utils[]. Дополнительный шаг post-install будет выполнен без вмешательства в "
+"уже существующие шаги post-install в [.filename]#Makefile# порта. Строка с "
+"crossref:plist[plist-keywords-desktop-file-utils,`@desktop-file-utils`] "
+"будет добавлена в plist. Используйте этот макрос только если порт "
+"предоставляет файл `.desktop`, содержащий запись `MimeType`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:556
+#, no-wrap
+msgid "`desthack`"
+msgstr "`desthack`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:561
+msgid ""
+"Changes the behavior of GNU configure to properly support `DESTDIR` in case "
+"the original software does not."
+msgstr ""
+"Изменяет поведение GNU configure для корректной поддержки `DESTDIR` в "
+"случае, если исходное программное обеспечение этого не делает."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:563
+#, no-wrap
+msgid "`display`"
+msgstr "`display`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:566
+msgid "Possible arguments: (none), _ARGS_"
+msgstr "Возможные аргументы: (отсутствуют), _ARGS_"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:570
+msgid ""
+"Set up a virtual display environment. If the environment variable `DISPLAY` "
+"is not set, then Xvfb is added as a build dependency, and `CONFIGURE_ENV` is "
+"extended with the port number of the currently running instance of Xvfb. "
+"The _ARGS_ parameter defaults to `install` and controls the phase around "
+"which to start and stop the virtual display."
+msgstr ""
+"Настраивает виртуальное окружение для отображения. Если переменная окружения "
+"`DISPLAY` не установлена, то Xvfb добавляется как зависимость при сборке, а "
+"`CONFIGURE_ENV` расширяется с указанием номера порта текущего запущенного "
+"экземпляра Xvfb. Параметр _ARGS_ по умолчанию имеет значение `install` и "
+"управляет фазой, вокруг которой запускается и останавливается виртуальный "
+"дисплей."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:572
+#, no-wrap
+msgid "`dos2unix`"
+msgstr "`dos2unix`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:580
+msgid ""
+"The port has files with line endings in DOS format which need to be "
+"converted. Several variables can be set to control which files will be "
+"converted. The default is to convert _all_ files, including binaries. See "
+"crossref:slow-porting[slow-patch-automatic-replacements,Simple Automatic "
+"Replacements] for examples."
+msgstr ""
+"Порт содержит файлы с символами конца строки в формате DOS, которые "
+"необходимо преобразовать. Несколько переменных могут быть установлены для "
+"контроля, какие файлы будут преобразованы. По умолчанию преобразуются _все_ "
+"файлы, включая бинарные. См. crossref:slow-porting[slow-patch-automatic-"
+"replacements,Простые автоматические замены] для примеров."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:582
+msgid "`DOS2UNIX_REGEX`: match file names based on a regular expression."
+msgstr ""
+"`DOS2UNIX_REGEX`: сопоставлять имена файлов на основе регулярного выражения."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:583
+msgid "`DOS2UNIX_FILES`: match literal file names."
+msgstr "`DOS2UNIX_FILES`: соответствуют точным именам файлов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:584
+msgid "`DOS2UNIX_GLOB`: match file names based on a glob pattern."
+msgstr ""
+"`DOS2UNIX_GLOB`: сопоставлять имена файлов на основе шаблона файлов оболочки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:585
+msgid ""
+"`DOS2UNIX_WRKSRC`: the directory from which to start the conversions. "
+"Defaults to `${WRKSRC}`."
+msgstr ""
+"`DOS2UNIX_WRKSRC`: каталог, с которого начинать преобразования. По умолчанию "
+"`${WRKSRC}`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:587
+#, no-wrap
+msgid "`drupal`"
+msgstr "`drupal`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:590
+msgid "Possible arguments: `7`, `module`, `theme`"
+msgstr "Возможные аргументы: `7`, `module`, `theme`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:595
+msgid ""
+"Automate installation of a port that is a Drupal theme or module. Use with "
+"the version of Drupal that the port is expecting. For example, "
+"`USES=drupal:7,module` says that this port creates a Drupal 7 module. A "
+"Drupal 7 theme can be specified with `USES=drupal:7,theme`."
+msgstr ""
+"Автоматизирует установку порта, который является темой или модулем Drupal. "
+"Использовать с версией Drupal, которую ожидает порт. Например, "
+"`USES=drupal:7,module` означает, что этот порт создает модуль Drupal 7. Тему "
+"Drupal 7 можно указать с помощью `USES=drupal:7,theme`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:597
+#, no-wrap
+msgid "`ebur128`"
+msgstr "`ebur128`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:600
+msgid "Possible arguments: (none), `build`, `lib`, `run`, `test`"
+msgstr "Возможные аргументы: (нет), `build`, `lib`, `run`, `test`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:605
+msgid ""
+"Adds a dependency on package:audio/ebur128[]. It allows to transparently "
+"depend on the `rust` or `legacy` variants by using `DEFAULT_VERSIONS` in "
+"[.filename]#make.conf#. For instance, to use the legacy version, use "
+"`DEFAULT_VERSIONS+=ebur128=legacy`"
+msgstr ""
+"Добавляет зависимость от пакета package:audio/ebur128[]. Позволяет прозрачно "
+"зависеть от вариантов `rust` или `legacy`, используя `DEFAULT_VERSIONS` в "
+"[.filename]#make.conf#. Например, для использования устаревшей версии "
+"укажите `DEFAULT_VERSIONS+=ebur128=legacy`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:609
+msgid ""
+"When no arguments are used, the behavior is the same as if the `lib` "
+"argument was provided. The rest of the arguments provide the corresponding "
+"category of dependency."
+msgstr ""
+"Без аргументов поведение аналогично случаю с предоставлением аргумента "
+"`lib`. Остальные аргументы указывают соответствующую категорию зависимости."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:611
+#, no-wrap
+msgid "`eigen`"
+msgstr "`eigen`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:614
+msgid "Possible arguments: 2, 3, build (default), run"
+msgstr "Возможные аргументы: 2, 3, build (по умолчанию), run"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:616
+msgid "Add dependency on package:math/eigen[]."
+msgstr "Добавить зависимость от пакета package:math/eigen[]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:618
+#, no-wrap
+msgid "`electronfix`"
+msgstr "`electronfix`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:621
+msgid "Possible arguments: `31`, `32`, `33`"
+msgstr "Возможные аргументы: `31`, `32`, `33`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:625
+msgid ""
+"Provide support for easy porting of Electron applications that are "
+"distributed in binary form. Adds a build and run time dependency on "
+"package:devel/electron31[], package:devel/electron32[], or package:devel/"
+"electron33[] depending on the argument used."
+msgstr ""
+"Предоставить поддержку для простого портирования Electron-приложений, "
+"распространяемых в бинарной форме. Добавляет зависимость на этапах сборки и "
+"выполнения от package:devel/electron31[], package:devel/electron32[] или "
+"package:devel/electron33[] в зависимости от используемого аргумента."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:628
+#, no-wrap
+msgid "`ELECTRONFIX_SYMLINK_FILES`"
+msgstr "`ELECTRONFIX_SYMLINK_FILES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:630
+msgid "List of files to be symlinked from Electron distribution."
+msgstr "Список файлов для создания символьных ссылок из дистрибутива Electron."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:631
+#, no-wrap
+msgid "`ELECTRONFIX_MAIN_EXECUTABLE`"
+msgstr "`ELECTRONFIX_MAIN_EXECUTABLE`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:633
+msgid ""
+"File name of the main executable to be replaced with the original Electron "
+"binary."
+msgstr ""
+"Имя файла основного исполняемого файла, который будет заменен оригинальным "
+"бинарным файлом Electron."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:636
+#, no-wrap
+msgid "`elfctl`"
+msgstr "`elfctl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:639
+msgid "Possible arguments: (none), `build` (default), `stage`"
+msgstr "Возможные аргументы: (отсутствуют), `build` (по умолчанию), `stage`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:641
+msgid "Set ELF binary feature control notes by setting `ELF_FEATURES`."
+msgstr ""
+"Установите управляющие заметки функций ELF-бинарных файлов, задав "
+"`ELF_FEATURES`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:644
+msgid ""
+"When either no argument or the `build` argument is supplied, binaries under "
+"`BUILD_WRKSRC` are operated on, and files listed in `ELF_FEATURES` are "
+"relative to `BUILD_WRKSRC`. When the `stage` argument is supplied, binaries "
+"under `STAGEDIR` are operated on and files listed in `ELF_FEATURES` are "
+"relative to `STAGEDIR`."
+msgstr ""
+"Когда не указан аргумент или указан аргумент `build`, операции выполняются "
+"над бинарными файлами в `BUILD_WRKSRC`, а файлы, перечисленные в "
+"`ELF_FEATURES`, указываются относительно `BUILD_WRKSRC`. Когда указан "
+"аргумент `stage`, операции выполняются над бинарными файлами в `STAGEDIR`, а "
+"файлы, перечисленные в `ELF_FEATURES`, указываются относительно `STAGEDIR`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:646
+#, no-wrap
+msgid "Uses=elfctl"
+msgstr "Uses=elfctl"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:653
+#, no-wrap
+msgid ""
+"ELF_FEATURES=\tfeaturelist:path/to/file1 \\\n"
+"\t\tfeaturelist:path/to/file2\n"
+msgstr ""
+"ELF_FEATURES=\tfeaturelist:path/to/file1 \\\n"
+"\t\tfeaturelist:path/to/file2\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:658
+msgid "The format of `featurelist` is described in man:elfctl[1]."
+msgstr "Формат `featurelist` описан в man:elfctl[1]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:660
+#, no-wrap
+msgid "`elixir`"
+msgstr "`elixir`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:666
+msgid ""
+"Provide support for ports using package:lang/elixir[]. Adds a build and run "
+"time dependency on package:lang/elixir[]."
+msgstr ""
+"Предоставить поддержку для портов, использующих package:lang/elixir[]. "
+"Добавляет зависимость во время сборки и выполнения на package:lang/elixir[]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:668
+msgid "Variables provided by the framework:"
+msgstr "Предоставляемые фреймворком переменные:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:669
+#, no-wrap
+msgid "`ELIXIR_APP_NAME`"
+msgstr "`ELIXIR_APP_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:671
+msgid "Elixir app name as installed in Elixir's lib directory"
+msgstr "Название приложения Elixir, как оно установлено в каталоге lib Elixir"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:671
+#, no-wrap
+msgid "`ELIXIR_LIB_ROOT`"
+msgstr "`ELIXIR_LIB_ROOT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:673
+msgid "Elixir default library path"
+msgstr "Путь к библиотекам Elixir по умолчанию"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:673
+#, no-wrap
+msgid "`ELIXIR_APP_ROOT`"
+msgstr "`ELIXIR_APP_ROOT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:675
+msgid "Root directory for this Elixir app"
+msgstr "Корневая директория для этого приложения Elixir"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:675
+#, no-wrap
+msgid "`ELIXIR_HIDDEN`"
+msgstr "`ELIXIR_HIDDEN`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:677
+msgid "Applications to be hidden from the code path; usually ${PORTNAME}"
+msgstr ""
+"Приложения, которые необходимо скрыть из пути выполнения кода; обычно `$"
+"{PORTNAME}`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:677
+#, no-wrap
+msgid "`ELIXIR_LOCALE`"
+msgstr "`ELIXIR_LOCALE`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:679
+msgid ""
+"An UTF-8 locale to be used by Elixir during builds (any UTF-8 locale is good)"
+msgstr ""
+"Локаль UTF-8, которая будет использоваться Elixir во время сборки (подойдет "
+"любая локаль UTF-8)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:679
+#, no-wrap
+msgid "`MIX_CMD`"
+msgstr "`MIX_CMD`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:681
+msgid "The `mix` command"
+msgstr "Команда `mix`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:681
+#, no-wrap
+msgid "`MIX_COMPILE`"
+msgstr "`MIX_COMPILE`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:683
+msgid "The `mix` command used to compile an Elixir app"
+msgstr "Команда `mix`, используемая для компиляции приложения на Elixir"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:683
+#, no-wrap
+msgid "`MIX_REWRITE`"
+msgstr "`MIX_REWRITE`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:685
+msgid "Automatically replace Mix dependencies with code paths"
+msgstr "Автоматически заменять зависимости Mix на пути к коду"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:685
+#, no-wrap
+msgid "`MIX_BUILD_DEPS`"
+msgstr "`MIX_BUILD_DEPS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:687
+msgid ""
+"List of `BUILD_DEPENDS` in category/portname format (commonly referenced to "
+"as \"deps\" in Erlang and Elixir)"
+msgstr ""
+"Список `BUILD_DEPENDS` в формате категория/имя_порта (часто упоминаемый как "
+"\"deps\" в Erlang и Elixir)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:687
+#, no-wrap
+msgid "`MIX_RUN_DEPS`"
+msgstr "`MIX_RUN_DEPS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:689
+msgid "List of `RUN_DEPENDS` in category/portname format"
+msgstr "Список `RUN_DEPENDS` в формате категория/имя порта"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:689
+#, no-wrap
+msgid "`MIX_DOC_DIRS`"
+msgstr "`MIX_DOC_DIRS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:691
+msgid "Extra doc directories to be installed in `DOCSDIR`"
+msgstr "Дополнительные каталоги документации для установки в `DOCSDIR`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:691
+#, no-wrap
+msgid "`MIX_DOC_FILES`"
+msgstr "`MIX_DOC_FILES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:693
+msgid "Extra doc files to be installed in `DOCSDIR` (usually README.md)"
+msgstr ""
+"Дополнительные файлы документации для установки в `DOCSDIR` (обычно "
+"README.md)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:693
+#, no-wrap
+msgid "`MIX_ENV`"
+msgstr "`MIX_ENV`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:695
+msgid "Environment for the Mix build (same format as `MAKE_ENV`)"
+msgstr "Окружение для сборки Mix (в том же формате, что и `MAKE_ENV`)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:695
+#, no-wrap
+msgid "`MIX_ENV_NAME`"
+msgstr "`MIX_ENV_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:697
+msgid "Name of the Mix build environment, usually \"prod\""
+msgstr "Имя среды сборки Mix, обычно \"prod\""
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:697
+#, no-wrap
+msgid "`MIX_BUILD_NAME`"
+msgstr "`MIX_BUILD_NAME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:699
+msgid "Name of the build output in _build/, usually `${MIX_ENV_NAME}`"
+msgstr "Имя выходного файла сборки в _build/, обычно `${MIX_ENV_NAME}`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:699
+#, no-wrap
+msgid "`MIX_TARGET`"
+msgstr "`MIX_TARGET`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:701
+msgid "Name of the Mix target, usually \"compile\""
+msgstr "Имя цели Mix, обычно \"compile\""
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:701
+#, no-wrap
+msgid "`MIX_EXTRA_APPS`"
+msgstr "`MIX_EXTRA_APPS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:703
+msgid "List of sub-applications to be built, if any"
+msgstr "Список подприложений для сборки, если имеются"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:703
+#, no-wrap
+msgid "`MIX_EXTRA_DIRS`"
+msgstr "`MIX_EXTRA_DIRS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:705
+msgid "List of extra directories to be installed in `ELIXIR_APP_ROOT`"
+msgstr "Список дополнительных каталогов для установки в `ELIXIR_APP_ROOT`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:705
+#, no-wrap
+msgid "`MIX_EXTRA_FILES`"
+msgstr "`MIX_EXTRA_FILES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:707
+msgid "List of extra files to be installed in `ELIXIR_APP_ROOT`"
+msgstr "Список дополнительных файлов для установки в `ELIXIR_APP_ROOT`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:709
+#, no-wrap
+msgid "`emacs`"
+msgstr "`emacs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:712
+msgid "Possible arguments: (none) (default), `build`, `run`, `noflavors`"
+msgstr "Возможные аргументы: (нет) (по умолчанию), `build`, `run`, `noflavors`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:719
+msgid ""
+"Provides support for ports requiring Emacs. The `build` argument creates a "
+"build dependency on Emacs. The `run` argument creates a run dependency on "
+"Emacs. If both the `build` and `run` arguments are absent, create build and "
+"run dependencies on Emacs. The `noflavors` argument prevents flavors, and "
+"is implied if there is no run dependency on Emacs."
+msgstr ""
+"Предоставляет поддержку для портов, требующих Emacs. Аргумент `build` "
+"создает зависимость сборки от Emacs. Аргумент `run` создает зависимость "
+"выполнения от Emacs. Если оба аргумента `build` и `run` отсутствуют, "
+"создаются зависимости сборки и выполнения от Emacs. Аргумент `noflavors` "
+"запрещает флейворы и подразумевается, если нет зависимости выполнения от "
+"Emacs."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:723
+msgid ""
+"The default Emacs flavor for ports with `USES=emacs` can be defined in "
+"[.filename]#make.conf#. For example, for the `nox` flavor, use "
+"`DEFAULT_VERSIONS+= emacs=nox`. The valid flavors are: `full`, `canna`, "
+"`nox`, `wayland`, `devel_full`, `devel_nox`."
+msgstr ""
+"Стандартный вариант Emacs для портов с `USES=emacs` можно определить в "
+"[.filename]#make.conf#. Например, для варианта `nox` используйте "
+"`DEFAULT_VERSIONS+= emacs=nox`. Допустимые флейворы: `full`, `canna`, `nox`, "
+"`wayland`, `devel_full`, `devel_nox`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:725
+msgid "Variables, which can be set by ports:"
+msgstr "Переменные, которые могут быть установлены портами:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:726
+#, no-wrap
+msgid "`EMACS_FLAVORS_EXCLUDE`"
+msgstr "`EMACS_FLAVORS_EXCLUDE`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:729
+msgid ""
+"Do NOT build these Emacs flavors. If `EMACS_FLAVORS_EXCLUDE` is not defined "
+"and:"
+msgstr ""
+"НЕ собирать эти флейворы Emacs. Если `EMACS_FLAVORS_EXCLUDE` не определена и:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:731
+msgid "there is a run dependency on Emacs"
+msgstr "существует зависимость во время выполнения от Emacs"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:732
+msgid "the noflavors argument is not specified"
+msgstr "аргумент noflavors не указан"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:735
+msgid "then all valid Emacs flavors are assumed."
+msgstr "то предполагаются все допустимые флейворы Emacs."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:736
+#, no-wrap
+msgid "`EMACS_NO_DEPENDS`"
+msgstr "`EMACS_NO_DEPENDS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:740
+msgid ""
+"Do NOT add build or run dependencies on Emacs. This will prevent flavors, "
+"and no byte code files will be generated as part of the package."
+msgstr ""
+"НЕ добавлять зависимости сборки или выполнения от Emacs. Это предотвратит "
+"создание вариантов, и никакие файлы байт-кода не будут сгенерированы как "
+"часть пакета."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:742
+msgid "Variables, which can be read by ports:"
+msgstr "Переменные, которые могут быть прочитаны портами:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:743
+#, no-wrap
+msgid "`EMACS_CMD`"
+msgstr "`EMACS_CMD`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:745
+msgid ""
+"Emacs command with full path (e.g. [.filename]#/usr/local/bin/emacs-30.1#)"
+msgstr ""
+"Команда Emacs с полным путём (например, [.filename]#/usr/local/bin/"
+"emacs-30.1#)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:746
+#, no-wrap
+msgid "`EMACS_FLAVOR`"
+msgstr "`EMACS_FLAVOR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:748
+msgid ""
+"Used for dependencies (e.g. `BUILD_DEPENDS= dash.el${EMACS_PKGNAMESUFFIX}"
+">0:devel/dash@${EMACS_FLAVOR}`)"
+msgstr ""
+"Используется для зависимостей (например, `BUILD_DEPENDS= dash.el$"
+"{EMACS_PKGNAMESUFFIX}>0:devel/dash@${EMACS_FLAVOR}`)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:749
+#, no-wrap
+msgid "`EMACS_LIBDIR`"
+msgstr "`EMACS_LIBDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:751
+msgid ""
+"Emacs Library directory without `${PREFIX}` (e.g. [.filename]#share/emacs#)"
+msgstr ""
+"Каталог библиотек Emacs без `${PREFIX}` (например, [.filename]#share/emacs#)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:752
+#, no-wrap
+msgid "`EMACS_LIBDIR_WITH_VER`"
+msgstr "`EMACS_LIBDIR_WITH_VER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:754
+msgid ""
+"Library directory without `${PREFIX}` including version (e.g. "
+"[.filename]#share/emacs/30.1#)"
+msgstr ""
+"Каталог библиотеки без `${PREFIX}`, включая версию (например, "
+"[.filename]#share/emacs/30.1#)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:755
+#, no-wrap
+msgid "`EMACS_MAJOR_VER`"
+msgstr "`EMACS_MAJOR_VER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:757
+msgid "Emacs major version (e.g. 30)"
+msgstr "Основная версия Emacs (например, 30)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:758
+#, no-wrap
+msgid "`EMACS_PKGNAMESUFFIX`"
+msgstr "`EMACS_PKGNAMESUFFIX`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:760
+msgid "`PKGNAMESUFFIX` to distinguish Emacs flavors"
+msgstr "`PKGNAMESUFFIX` для различия вариантов Emacs"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:761
+#, no-wrap
+msgid "`EMACS_SITE_LISPDIR`"
+msgstr "`EMACS_SITE_LISPDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:763
+msgid ""
+"Emacs site-lisp directory without `${PREFIX}` (e.g. [.filename]#share/emacs/"
+"site-lisp#)"
+msgstr ""
+"Каталог site-lisp Emacs без `${PREFIX}` (например, [.filename]#share/emacs/"
+"site-lisp#)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:764
+#, no-wrap
+msgid "`EMACS_VER`"
+msgstr "`EMACS_VER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:766
+msgid "Emacs version (e.g. 30.1)"
+msgstr "Версия Emacs (например, 30.1)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:767
+#, no-wrap
+msgid "`EMACS_VERSION_SITE_LISPDIR`"
+msgstr "`EMACS_VERSION_SITE_LISPDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:769
+msgid "Include version (e.g. [.filename]#share/emacs/30.1/site-lisp#)"
+msgstr ""
+"Каталог site-lisp Emacs, включая номер версии (например, [.filename]#share/"
+"emacs/30.1/site-lisp#)"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:771
+#, no-wrap
+msgid "`erlang`"
+msgstr "`erlang`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:774
+msgid "Possible arguments: (none), `enc`, `rebar`, `rebar3`"
+msgstr "Возможные аргументы: (нет), `enc`, `rebar`, `rebar3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:779
+msgid ""
+"Adds a build and run time dependency on package:lang/erlang[]. Depending on "
+"the argument, it adds additional build dependencies. `enc` adds a dependency "
+"on package:devel/erlang-native-compiler[], `rebar` adds a dependency on "
+"package:devel/rebar[] and `rebar3` adds a dependency on package:devel/"
+"rebar3[]."
+msgstr ""
+"Добавляет зависимость на время сборки и выполнения от package:lang/erlang[]. "
+"В зависимости от аргумента, добавляет дополнительные зависимости для сборки. "
+"`enc` добавляет зависимость от package:devel/erlang-native-compiler[], "
+"`rebar` добавляет зависимость от package:devel/rebar[], а `rebar3` добавляет "
+"зависимость от package:devel/rebar3[]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:781
+msgid "In addition, the following variables are available to the port:"
+msgstr "В дополнение, следующие переменные доступны для порта:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:783
+msgid ""
+"`ERL_APP_NAME`: Erlang app name as installed in Erlang's lib dir (minus "
+"version)"
+msgstr ""
+"`ERL_APP_NAME`: Имя приложения Erlang, как оно установлено в каталоге lib "
+"Erlang (без указания версии)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:784
+msgid "`ERL_APP_ROOT`: Root directory for this Erlang app"
+msgstr "`ERL_APP_ROOT`: Корневой каталог для этого приложения Erlang"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:785
+msgid "`REBAR_CMD`: Path to the \"rebar\" command"
+msgstr "`REBAR_CMD`: Путь к команде \"rebar\""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:786
+msgid "`REBAR3_CMD`: Path to the \"rebar3\" command"
+msgstr "`REBAR3_CMD`: Путь к команде \"rebar3\""
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:787
+msgid "`REBAR_PROFILE`: Rebar profile"
+msgstr "`REBAR_PROFILE`: Профиль Rebar"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:788
+msgid "`REBAR_TARGETS`: Rebar target list (usually compile, maybe escriptize)"
+msgstr ""
+"`REBAR_TARGETS`: Список целей Rebar (обычно compile, возможно escriptize)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:789
+msgid "`ERL_BUILD_NAME`: Build name for rebar3"
+msgstr "`ERL_BUILD_NAME`: Имя сборки для rebar3"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:790
+msgid "`ERL_BUILD_DEPS`: List of BUILD_DEPENDS in category/portname format"
+msgstr "`ERL_BUILD_DEPS`: Список BUILD_DEPENDS в формате категория/имя_порта"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:791
+msgid "`ERL_RUN_DEPS`: List of RUN_DEPENDS in category/portname format"
+msgstr "`ERL_RUN_DEPS`: Список RUN_DEPENDS в формате категория/имя_порта"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:792
+msgid "`ERL_DOCS`: List of documentation files and directories"
+msgstr "`ERL_DOCS`: Список файлов и каталогов документации"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:794
+#, no-wrap
+msgid "`fakeroot`"
+msgstr "`fakeroot`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:800
+msgid ""
+"Changes some default behavior of build systems to allow installing as a "
+"user. See https://wiki.debian.org/FakeRoot[] for more information on "
+"`fakeroot`."
+msgstr ""
+"Изменяет некоторые стандартные поведения систем сборки для разрешения "
+"установки от имени пользователя. Дополнительную информацию о `fakeroot` "
+"можно найти на https://wiki.debian.org/FakeRoot[]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:802
+#, no-wrap
+msgid "`fam`"
+msgstr "`fam`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:805
+msgid "Possible arguments: (none), `fam`, `gamin`"
+msgstr "Возможные аргументы: (нет), `fam`, `gamin`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:808
+msgid ""
+"Uses a File Alteration Monitor as a library dependency, either package:devel/"
+"fam[] or package:devel/gamin[]. End users can set WITH_FAM_SYSTEM to "
+"specify their preference."
+msgstr ""
+"Использует монитор изменений файлов (FAM — File Alteration Monitor) как "
+"зависимость от библиотеки, либо package:devel/fam[], либо package:devel/"
+"gamin[]. Конечные пользователи могут задать WITH_FAM_SYSTEM, чтобы указать "
+"свои предпочтения."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:810
+#, no-wrap
+msgid "`firebird`"
+msgstr "`firebird`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:813
+msgid "Possible arguments: (none), `25`"
+msgstr "Возможные аргументы: (отсутствуют), `25`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:815
+msgid "Add a dependency to the client library of the Firebird database."
+msgstr "Добавить зависимость от клиентской библиотеке базы данных Firebird."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:817
+#, no-wrap
+msgid "`fonts`"
+msgstr "`fonts`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:820
+msgid "Possible arguments: (none), `fc`, `fontsdir` (default), `none`"
+msgstr ""
+"Возможные аргументы: (отсутствуют), `fc`, `fontsdir` (по умолчанию), `none`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:826
+msgid ""
+"Adds a runtime dependency on tools needed to register fonts. Depending on "
+"the argument, add a `crossref:plist[plist-keywords-fc,`@fc`] ${FONTSDIR}` "
+"line, `crossref:plist[plist-keywords-fontsdir,`@fontsdir`] ${FONTSDIR}` "
+"line, or no line if the argument is `none`, to the plist. `FONTSDIR` "
+"defaults to [.filename]#${PREFIX}/share/fonts/${FONTNAME}# and `FONTNAME` to "
+"`${PORTNAME}`. Add `FONTSDIR` to `PLIST_SUB` and `SUB_LIST`"
+msgstr ""
+"Добавляет зависимость во время выполнения на инструменты, необходимые для "
+"регистрации шрифтов. В зависимости от аргумента добавляет строку "
+"`crossref:plist[plist-keywords-fc,@fc] ${FONTSDIR}`, строку "
+"`crossref:plist[plist-keywords-fontsdir,@fontsdir] ${FONTSDIR}` или не "
+"добавляет строку, если аргумент `none`, в plist. `FONTSDIR` по умолчанию "
+"имеет значение [.filename]#${PREFIX}/share/fonts/${FONTNAME}#, а `FONTNAME` "
+"— `${PORTNAME}`. Добавляет `FONTSDIR` в `PLIST_SUB` и `SUB_LIST`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:828
+#, no-wrap
+msgid "`fortran`"
+msgstr "`fortran`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:831
+msgid "Possible arguments: `gcc` (default)"
+msgstr "Возможные аргументы: `gcc` (по умолчанию)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:833
+msgid "Uses the GNU Fortran compiler."
+msgstr "Использует компилятор GNU Fortran."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:835
+#, no-wrap
+msgid "`fpc`"
+msgstr "`fpc`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:838
+msgid "Possible arguments: (none), `run`"
+msgstr "Возможные аргументы: (нет), `run`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:841
+msgid ""
+"Provide support for Free Pascal based ports. It will install Free Pascal "
+"compiler and units."
+msgstr ""
+"Обеспечить поддержку портов на основе Free Pascal. Установит компилятор Free "
+"Pascal и модули."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:843
+msgid "Adds a build dependency on package:lang/fpc[]."
+msgstr "Добавляет зависимость сборки от package:lang/fpc[]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:845
+msgid "If the `run` argument is given a run dependency is also added."
+msgstr "Если указан аргумент `run`, также добавляется зависимость запуска."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:847
+#, no-wrap
+msgid "`fuse`"
+msgstr "`fuse`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:850
+msgid "Possible arguments: `2` (default), `3`"
+msgstr "Возможные аргументы: `2` (по умолчанию), `3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:852
+msgid ""
+"The port will depend on the FUSE library and handle the dependency on the "
+"kernel module depending on the version of FreeBSD."
+msgstr ""
+"Порт будет зависеть от библиотеки FUSE и обрабатывать зависимость от модуля "
+"ядра в зависимости от версии FreeBSD."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:854
+#, no-wrap
+msgid "`gem`"
+msgstr "`gem`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:857
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1479
+msgid "Possible arguments: (none), `noautoplist`"
+msgstr "Возможные аргументы: (отсутствуют), `noautoplist`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:860
+msgid ""
+"Handle building with RubyGems. If `noautoplist` is used, the packing list "
+"is not generated automatically."
+msgstr ""
+"Обработка сборки с RubyGems. Если используется `noautoplist`, список "
+"упаковки не генерируется автоматически."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:862
+msgid "This implies `USES=ruby`."
+msgstr "Это подразумевает `USES=ruby`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:864
+#, no-wrap
+msgid "`gettext`"
+msgstr "`gettext`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:871
+msgid ""
+"Deprecated. Will include both crossref:uses[uses-gettext-runtime,`gettext-"
+"runtime`] and crossref:uses[uses-gettext-tools,`gettext-tools`]."
+msgstr ""
+"Устарело. Будет включать как crossref:uses[uses-gettext-runtime,`gettext-"
+"runtime`], так и crossref:uses[uses-gettext-tools,`gettext-tools`]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:873
+#, no-wrap
+msgid "`gettext-runtime`"
+msgstr "`gettext-runtime`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:876
+msgid "Possible arguments: (none), `lib` (default), `build`, `run`"
+msgstr ""
+"Возможные аргументы: (отсутствуют), `lib` (по умолчанию), `build`, `run`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:880
+msgid ""
+"Uses package:devel/gettext-runtime[]. By default, with no arguments or with "
+"the `lib` argument, implies a library dependency on "
+"[.filename]#libintl.so#. `build` and `run` implies, respectively a build-"
+"time and a run-time dependency on [.filename]#gettext#."
+msgstr ""
+"Использует пакет package:devel/gettext-runtime[]. По умолчанию, без "
+"аргументов или с аргументом `lib`, подразумевает зависимость от библиотеки "
+"[.filename]#libintl.so#. Аргументы `build` и `run` подразумевают, "
+"соответственно, зависимость во время сборки и во время выполнения от "
+"[.filename]#gettext#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:882
+#, no-wrap
+msgid "`gettext-tools`"
+msgstr "`gettext-tools`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:885
+msgid "Possible arguments: (none), `build` (default), `run`"
+msgstr "Возможные аргументы: (отсутствуют), `build` (по умолчанию), `run`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:889
+msgid ""
+"Uses package:devel/gettext-tools[]. By default, with no argument, or with "
+"the `build` argument, a build time dependency on [.filename]#msgfmt# is "
+"registered. With the `run` argument, a run-time dependency is registered."
+msgstr ""
+"Использует пакет package:devel/gettext-tools[]. По умолчанию, без аргумента "
+"или с аргументом `build`, регистрируется зависимость во время сборки от "
+"[.filename]#msgfmt#. С аргументом `run` регистрируется зависимость во время "
+"выполнения."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:891
+#, no-wrap
+msgid "`ghostscript`"
+msgstr "`ghostscript`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:894
+msgid "Possible arguments: _X_, `build`, `run`, `nox11`"
+msgstr "Возможные аргументы: _X_, `build`, `run`, `nox11`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:899
+msgid ""
+"A specific version _X_ can be used. Possible versions are `7`, `8`, `9`, and "
+"`agpl` (default). `nox11` indicates that the `-nox11` version of the port "
+"is required. `build` and `run` add build- and run-time dependencies on "
+"Ghostscript. The default is both build- and run-time dependencies."
+msgstr ""
+"Можно указать конкретную версию _X_. Доступные версии: `7`, `8`, `9` и "
+"`agpl` (по умолчанию). `nox11` указывает, что требуется версия порта `-"
+"nox11`. `build` и `run` добавляют зависимости на Ghostscript во время "
+"сборки и выполнения соответственно. По умолчанию добавляются зависимости "
+"как на сборку, так и на выполнение."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:901
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:915
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1201
+#, no-wrap
+msgid "`gl`"
+msgstr "`gl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:908
+msgid ""
+"Provides an easy way to depend on GL components. The components should be "
+"listed in `USE_GL`. The available components are:"
+msgstr ""
+"Предоставляет простой способ зависеть от компонентов GL. Компоненты должны "
+"быть перечислены в `USE_GL`. Доступные компоненты:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:909
+#, no-wrap
+msgid "`egl`"
+msgstr "`egl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:911
+msgid ""
+"add a library dependency on [.filename]#libEGL.so# from package:graphics/"
+"libglvnd[]"
+msgstr ""
+"добавить зависимость от библиотеки [.filename]#libEGL.so# из пакета "
+"package:graphics/libglvnd[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:912
+#, no-wrap
+msgid "`gbm`"
+msgstr "`gbm`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:914
+msgid ""
+"Add a library dependency on [.filename]#libgbm.so# from package:graphics/"
+"mesa-libs[]"
+msgstr ""
+"Добавить зависимость от библиотеки [.filename]#libgbm.so# из пакета "
+"package:graphics/mesa-libs[]"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:917
+msgid ""
+"Add a library dependency on [.filename]#libGL.so# from package:graphics/"
+"libglvnd[]"
+msgstr ""
+"Добавить зависимость от библиотеки [.filename]#libGL.so# из пакета "
+"package:graphics/libglvnd[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:918
+#, no-wrap
+msgid "`glesv2`"
+msgstr "`glesv2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:920
+msgid ""
+"Add a library dependency on [.filename]#libGLESv2.so# from package:graphics/"
+"libglvnd[]"
+msgstr ""
+"Добавить зависимость от библиотеки [.filename]#libGLESv2.so# из пакета "
+"package:graphics/libglvnd[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:921
+#, no-wrap
+msgid "`glew`"
+msgstr "`glew`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:923
+msgid ""
+"Add a library dependency on [.filename]#libGLEW.so# from package:graphics/"
+"glew[]"
+msgstr ""
+"Добавить зависимость от библиотеки [.filename]#libGLEW.so# из пакета "
+"package:graphics/glew[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:924
+#, no-wrap
+msgid "`glu`"
+msgstr "`glu`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:926
+msgid ""
+"Add a library dependency on [.filename]#libGLU.so# from package:graphics/"
+"libGLU[]"
+msgstr ""
+"Добавить зависимость от библиотеки [.filename]#libGLU.so# из "
+"package:graphics/libGLU[]"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:927
+#, no-wrap
+msgid "`glut`"
+msgstr "`glut`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:929
+msgid ""
+"Add a library dependency on [.filename]#libglut.so# from package:graphics/"
+"freeglut[]"
+msgstr ""
+"Добавить зависимость от библиотеки [.filename]#libglut.so# из "
+"package:graphics/freeglut[]"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:930
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2244
+#, no-wrap
+msgid "`opengl`"
+msgstr "`opengl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:932
+msgid ""
+"Add a library dependency on [.filename]#libOpenGL.so# from package:graphics/"
+"libglvnd[]"
+msgstr ""
+"Добавить зависимость от библиотеки [.filename]#libOpenGL.so# из "
+"package:graphics/libglvnd[]"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:934
+#, no-wrap
+msgid "`gmake`"
+msgstr "`gmake`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:939
+msgid ""
+"Uses package:devel/gmake[] as a build-time dependency and sets up the "
+"environment to use `gmake` as the default `make` for the build."
+msgstr ""
+"Использует пакет package:devel/gmake[] как зависимость во время сборки и "
+"настраивает окружение для использования `gmake` в качестве стандартного "
+"`make` при сборке."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:941
+#, no-wrap
+msgid "`gnome`"
+msgstr "`gnome`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:948
+msgid ""
+"Provides an easy way to depend on GNOME components. The components should "
+"be listed in `USE_GNOME`. The available components are:"
+msgstr ""
+"Предоставляет простой способ зависеть от компонентов GNOME. Компоненты "
+"должны быть перечислены в `USE_GNOME`. Доступные компоненты:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:950
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1598
+msgid "`atk`"
+msgstr "`atk`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:951
+msgid "`atkmm`"
+msgstr "`atkmm`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:952
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1184
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1601
+msgid "`cairo`"
+msgstr "`cairo`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:953
+msgid "`cairomm`"
+msgstr "`cairomm`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:954
+msgid "`dconf`"
+msgstr "`dconf`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:955
+msgid "`esound`"
+msgstr "`esound`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:956
+msgid "`evolutiondataserver3`"
+msgstr "`evolutiondataserver3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:957
+msgid "`gconf2`"
+msgstr "`gconf2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:958
+msgid "`gconfmm26`"
+msgstr "`gconfmm26`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:959
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1200
+msgid "`gdkpixbuf`"
+msgstr "`gdkpixbuf`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:960
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1612
+msgid "`gdkpixbuf2`"
+msgstr "`gdkpixbuf2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:961
+msgid "`glib12`"
+msgstr "`glib12`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:962
+msgid "`glib20`"
+msgstr "`glib20`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:963
+msgid "`glibmm`"
+msgstr "`glibmm`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:964
+msgid "`gnomecontrolcenter3`"
+msgstr "`gnomecontrolcenter3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:965
+msgid "`gnomedesktop3`"
+msgstr "`gnomedesktop3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:966
+msgid "`gnomedesktop4`"
+msgstr "`gnomedesktop4`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:967
+msgid "`gnomedocutils`"
+msgstr "`gnomedocutils`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:968
+msgid "`gnomemenus3`"
+msgstr "`gnomemenus3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:969
+msgid "`gnomemimedata`"
+msgstr "`gnomemimedata`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:970
+msgid "`gnomeprefix`"
+msgstr "`gnomeprefix`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:971
+msgid "`gnomesharp20`"
+msgstr "`gnomesharp20`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:972
+msgid "`gnomevfs2`"
+msgstr "`gnomevfs2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:973
+msgid "`gsound`"
+msgstr "`gsound`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:974
+msgid "`gtk-update-icon-cache`"
+msgstr "`gtk-update-icon-cache`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:975
+msgid "`gtk12`"
+msgstr "`gtk12`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:976
+msgid "`gtk20`"
+msgstr "`gtk20`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:977
+msgid "`gtk30`"
+msgstr "`gtk30`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:978
+msgid "`gtkhtml3`"
+msgstr "`gtkhtml3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:979
+msgid "`gtkhtml4`"
+msgstr "`gtkhtml4`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:980
+msgid "`gtkmm20`"
+msgstr "`gtkmm20`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:981
+msgid "`gtkmm24`"
+msgstr "`gtkmm24`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:982
+msgid "`gtkmm30`"
+msgstr "`gtkmm30`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:983
+msgid "`gtksharp20`"
+msgstr "`gtksharp20`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:984
+msgid "`gtksourceview`"
+msgstr "`gtksourceview`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:985
+msgid "`gtksourceview2`"
+msgstr "`gtksourceview2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:986
+msgid "`gtksourceview3`"
+msgstr "`gtksourceview3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:987
+msgid "`gtksourceviewmm3`"
+msgstr "`gtksourceviewmm3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:988
+msgid "`gvfs`"
+msgstr "`gvfs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:989
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1786
+msgid "`intlhack`"
+msgstr "`intlhack`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:990
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1787
+msgid "`intltool`"
+msgstr "`intltool`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:991
+msgid "`introspection`"
+msgstr "`introspection`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:992
+msgid "`libartlgpl2`"
+msgstr "`libartlgpl2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:993
+msgid "`libbonobo`"
+msgstr "`libbonobo`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:994
+msgid "`libbonoboui`"
+msgstr "`libbonoboui`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:995
+msgid "`libgda5`"
+msgstr "`libgda5`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:996
+msgid "`libgda5-ui`"
+msgstr "`libgda5-ui`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:997
+msgid "`libgdamm5`"
+msgstr "`libgdamm5`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:998
+msgid "`libglade2`"
+msgstr "`libglade2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:999
+msgid "`libgnome`"
+msgstr "`libgnome`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1000
+msgid "`libgnomecanvas`"
+msgstr "`libgnomecanvas`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1001
+msgid "`libgnomekbd`"
+msgstr "`libgnomekbd`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1002
+msgid "`libgnomeprint`"
+msgstr "`libgnomeprint`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1003
+msgid "`libgnomeprintui`"
+msgstr "`libgnomeprintui`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1004
+msgid "`libgnomeui`"
+msgstr "`libgnomeui`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1005
+msgid "`libgsf`"
+msgstr "`libgsf`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1006
+msgid "`libgtkhtml`"
+msgstr "`libgtkhtml`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1007
+msgid "`libgtksourceviewmm`"
+msgstr "`libgtksourceviewmm`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1008
+msgid "`libidl`"
+msgstr "`libidl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1009
+msgid "`librsvg2`"
+msgstr "`librsvg2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1010
+msgid "`libsigc++12`"
+msgstr "`libsigc++12`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1011
+msgid "`libsigc++20`"
+msgstr "`libsigc++20`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1012
+msgid "`libwnck`"
+msgstr "`libwnck`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1013
+msgid "`libwnck3`"
+msgstr "`libwnck3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1014
+msgid "`libxml++26`"
+msgstr "`libxml++26`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1015
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1637
+msgid "`libxml2`"
+msgstr "`libxml2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1016
+msgid "`libxslt`"
+msgstr "`libxslt`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1017
+msgid "`metacity`"
+msgstr "`metacity`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1018
+msgid "`nautilus3`"
+msgstr "`nautilus3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1019
+msgid "`orbit2`"
+msgstr "`orbit2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1020
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1237
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1648
+msgid "`pango`"
+msgstr "`pango`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1021
+msgid "`pangomm`"
+msgstr "`pangomm`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1022
+msgid "`pangox-compat`"
+msgstr "`pangox-compat`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1023
+msgid "`py3gobject3`"
+msgstr "`py3gobject3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1024
+msgid "`pygnome2`"
+msgstr "`pygnome2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1025
+msgid "`pygobject`"
+msgstr "`pygobject`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1026
+msgid "`pygobject3`"
+msgstr "`pygobject3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1027
+msgid "`pygtk2`"
+msgstr "`pygtk2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1028
+msgid "`pygtksourceview`"
+msgstr "`pygtksourceview`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1029
+msgid "`referencehack`"
+msgstr "`referencehack`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1030
+msgid "`vte`"
+msgstr "`vte`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1031
+msgid "`vte3`"
+msgstr "`vte3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1034
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1800
+msgid ""
+"The default dependency is build- and run-time, it can be changed with "
+"`:build` or `:run`. For example:"
+msgstr ""
+"Зависимость по умолчанию — на время сборки и выполнения, её можно изменить с "
+"помощью `:build` или `:run`. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1039
+#, no-wrap
+msgid ""
+"USES=\t\tgnome\n"
+"USE_GNOME=\tgnomemenus3:build intlhack\n"
+msgstr ""
+"USES=\t\tgnome\n"
+"USE_GNOME=\tgnomemenus3:build intlhack\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1042
+msgid "See crossref:special[using-gnome,Using GNOME] for more information."
+msgstr ""
+"См. crossref:special[using-gnome,Использование GNOME] для получения "
+"дополнительной информации."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1044
+#, no-wrap
+msgid "`go`"
+msgstr "`go`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1049
+msgid ""
+"Ports should not be created for Go libs, see crossref:special[go-libs,Go "
+"Libraries] for more information."
+msgstr ""
+"Порты не следует создавать для библиотек Go, дополнительную информацию см. в "
+"crossref:special[go-libs,Библиотеки Go]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1052
+msgid ""
+"Possible arguments: (none), `N.NN`, `N.NN-devel`, `modules`, `no_targets`, "
+"`run`"
+msgstr ""
+"Возможные аргументы: (нет), `N.NN`, `N.NN-devel`, `modules`, `no_targets`, "
+"`run`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1059
+msgid ""
+"Sets default values and targets used to build Go software. A build "
+"dependency on the Go compiler port is added, port maintainers can set "
+"version required. By default the build is performed in GOPATH mode. If Go "
+"software uses modules, the modules-aware mode can be switched on with "
+"`modules` argument. `no_targets` will setup build environment like "
+"`GO_ENV`, `GO_BUILDFLAGS` but skip creating extract and build targets. "
+"`run` will also add a run dependency on the Go compiler port."
+msgstr ""
+"Устанавливает значения и цели по умолчанию, используемые для сборки ПО на "
+"Go. Добавляется зависимость сборки от порта компилятора Go, сопровождающие "
+"порта могут установить требуемую версию. По умолчанию сборка выполняется в "
+"режиме GOPATH. Если ПО на Go использует модули, режим с поддержкой модулей "
+"можно включить с помощью аргумента `modules`. `no_targets` настроит "
+"окружение сборки, как `GO_ENV`, `GO_BUILDFLAGS`, но пропустит создание целей "
+"извлечения (extract) и сборки (build). `run` также добавит зависимость "
+"выполнения от порта компилятора Go."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1061
+msgid "The build process is controlled by several variables:"
+msgstr "Процесс сборки контролируется несколькими переменными:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1062
+#, no-wrap
+msgid "`GO_MODULE`"
+msgstr "`GO_MODULE`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1065
+msgid ""
+"The name of the application module as specified by the `module` directive in "
+"`go.mod`. In most cases, this is the only required variable for ports that "
+"use Go modules."
+msgstr ""
+"Имя модуля приложения, указанное директивой `module` в `go.mod`. В "
+"большинстве случаев это единственная необходимая переменная для портов, "
+"использующих модули Go."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1066
+#, no-wrap
+msgid "`GO_PKGNAME`"
+msgstr "`GO_PKGNAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1071
+msgid ""
+"The name of the Go package when building in GOPATH mode. This is the "
+"directory that will be created in `${GOPATH}/src`. If not set explicitly "
+"and `GH_SUBDIR` or `GL_SUBDIR` is present, `GO_PKGNAME` will be inferred "
+"from it. It is not needed when building in modules-aware mode."
+msgstr ""
+"Имя пакета Go при сборке в режиме GOPATH. Это каталог, который будет создан "
+"в `${GOPATH}/src`. Если не задано явно и присутствует `GH_SUBDIR` или "
+"`GL_SUBDIR`, то `GO_PKGNAME` будет выведено из них. Не требуется при сборке "
+"в режиме с поддержкой модулей."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1072
+#, no-wrap
+msgid "`GO_TARGET`"
+msgstr "`GO_TARGET`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1076
+msgid ""
+"The packages to build. The default value is `${GO_PKGNAME}`. `GO_TARGET` "
+"can also be a tuple in the form `package:path` where path can be either a "
+"simple filename or a full path starting with `${PREFIX}`."
+msgstr ""
+"Пакеты для сборки. Значение по умолчанию — `${GO_PKGNAME}`. `GO_TARGET` "
+"также может быть кортежем в формате `package:path`, где path может быть либо "
+"простым именем файла, либо полным путём, начинающимся с `${PREFIX}`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1077
+#, no-wrap
+msgid "`GO_TESTTARGET`"
+msgstr "`GO_TESTTARGET`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1080
+msgid ""
+"The packages to test. The default value is `./...` (the current package and "
+"all subpackages)."
+msgstr ""
+"Пакеты для тестирования. Значение по умолчанию — `./...` (текущий пакет и "
+"все подпакеты)."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1081
+#, no-wrap
+msgid "`CGO_CFLAGS`"
+msgstr "`CGO_CFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1083
+msgid "Additional `CFLAGS` values to be passed to the C compiler by `go`."
+msgstr ""
+"Дополнительные значения `CFLAGS`, передаваемые компилятору C с помощью `go`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1084
+#, no-wrap
+msgid "`CGO_LDFLAGS`"
+msgstr "`CGO_LDFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1086
+msgid "Additional `LDFLAGS` values to be passed to the C compiler by `go`."
+msgstr ""
+"Дополнительные значения `LDFLAGS`, передаваемые компилятору C через `go`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1087
+#, no-wrap
+msgid "`GO_BUILDFLAGS`"
+msgstr "`GO_BUILDFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1089
+msgid "Additional build arguments to be passed to `go build`."
+msgstr "Дополнительные аргументы сборки, передаваемые в `go build`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1090
+#, no-wrap
+msgid "`GO_TESTFLAGS`"
+msgstr "`GO_TESTFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1092
+msgid "Additional build arguments to be passed to `go test`."
+msgstr "Дополнительные аргументы сборки, передаваемые в `go test`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1094
+msgid ""
+"See crossref:special[using-go,Building Go Applications] for usage examples."
+msgstr ""
+"См. crossref:special[using-go,Сборка приложений на Go] для примеров "
+"использования."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1096
+#, no-wrap
+msgid "`gperf`"
+msgstr "`gperf`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1101
+msgid ""
+"Add a buildtime dependency on package:devel/gperf[] if `gperf` is not "
+"present in the base system."
+msgstr ""
+"Добавить зависимость во время сборки на package:devel/gperf[], если `gperf` "
+"отсутствует в базовой системе."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1103
+#, no-wrap
+msgid "`grantlee`"
+msgstr "`grantlee`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1106
+msgid "Possible arguments: `5`, `selfbuild`"
+msgstr "Возможные аргументы: `5`, `selfbuild`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1110
+msgid ""
+"Handle dependency on Grantlee. Specify `5` to depend on the Qt5 based "
+"version, package:devel/grantlee5[]. `selfbuild` is used internally by "
+"package:devel/grantlee5[] to get their versions numbers."
+msgstr ""
+"Обработать зависимость от Grantlee. Указать `5` для зависимости от версии на "
+"основе Qt5, package:devel/grantlee5[]. `selfbuild` используется внутри "
+"package:devel/grantlee5[] для получения номеров их версий."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1112
+#, no-wrap
+msgid "`groff`"
+msgstr "`groff`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1115
+msgid "Possible arguments: `build`, `run`, `both`"
+msgstr "Возможные аргументы: `build`, `run`, `both`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1117
+msgid ""
+"Registers a dependency on package:textproc/groff[] if not present in the "
+"base system."
+msgstr ""
+"Регистрирует зависимость от package:textproc/groff[], если пакет отсутствует "
+"в базовой системе."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1119
+#, no-wrap
+msgid "`gssapi`"
+msgstr "`gssapi`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1122
+msgid ""
+"Possible arguments: (none), `base` (default), `heimdal`, `mit`, `flags`, "
+"`bootstrap`"
+msgstr ""
+"Возможные аргументы: (отсутствуют), `base` (по умолчанию), `heimdal`, `mit`, "
+"`flags`, `bootstrap`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1127
+msgid ""
+"Handle dependencies needed by consumers of the GSS-API. Only libraries that "
+"provide the Kerberos mechanism are available. By default, or set to `base`, "
+"the GSS-API library from the base system is used. Can also be set to "
+"`heimdal` to use package:security/heimdal[], or `mit` to use "
+"package:security/krb5[]."
+msgstr ""
+"Обрабатывает зависимости, необходимые для использования GSS-API. Доступны "
+"только библиотеки, предоставляющие механизм Kerberos. По умолчанию (или при "
+"значении `base`) используется библиотека GSS-API из базовой системы. Также "
+"можно установить значение `heimdal` для использования package:security/"
+"heimdal[] или `mit` для использования package:security/krb5[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1129
+msgid ""
+"When the local Kerberos installation is not in `LOCALBASE`, set "
+"`HEIMDAL_HOME` (for `heimdal`) or `KRB5_HOME` (for `krb5`) to the location "
+"of the Kerberos installation."
+msgstr ""
+"Если локальная установка Kerberos не находится в `LOCALBASE`, установите "
+"`HEIMDAL_HOME` (для `heimdal`) или `KRB5_HOME` (для `krb5`) на каталог "
+"установки Kerberos."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1131
+msgid "These variables are exported for the ports to use:"
+msgstr "Эти переменные экспортируются для использования портами:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1133
+msgid "`GSSAPIBASEDIR`"
+msgstr "`GSSAPIBASEDIR`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1134
+msgid "`GSSAPICPPFLAGS`"
+msgstr "`GSSAPICPPFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1135
+msgid "`GSSAPIINCDIR`"
+msgstr "`GSSAPIINCDIR`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1136
+msgid "`GSSAPILDFLAGS`"
+msgstr "`GSSAPILDFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1137
+msgid "`GSSAPILIBDIR`"
+msgstr "`GSSAPILIBDIR`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1138
+msgid "`GSSAPILIBS`"
+msgstr "`GSSAPILIBS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1139
+msgid "`GSSAPI_CONFIGURE_ARGS`"
+msgstr "`GSSAPI_CONFIGURE_ARGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1142
+msgid ""
+"The `flags` option can be given alongside `base`, `heimdal`, or `mit` to "
+"automatically add `GSSAPICPPFLAGS`, `GSSAPILDFLAGS`, and `GSSAPILIBS` to "
+"`CFLAGS`, `LDFLAGS`, and `LDADD`, respectively. For example, use "
+"`base,flags`."
+msgstr ""
+"Опция `flags` может быть указана вместе с `base`, `heimdal` или `mit` для "
+"автоматического добавления `GSSAPICPPFLAGS`, `GSSAPILDFLAGS` и `GSSAPILIBS` "
+"в `CFLAGS`, `LDFLAGS` и `LDADD` соответственно. Например, используйте "
+"`base,flags`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1145
+msgid ""
+"The `bootstrap` option is a special prefix only for use by package:security/"
+"krb5[] and package:security/heimdal[]. For example, use `bootstrap,mit`."
+msgstr ""
+"Опция `bootstrap` — это специальный префикс, предназначенный только для "
+"использования в package:security/krb5[] и package:security/heimdal[]. "
+"Например, используйте `bootstrap,mit`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1147
+#, no-wrap
+msgid "Typical Use"
+msgstr "Типичное использование"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1154
+#, no-wrap
+msgid ""
+"OPTIONS_SINGLE=\tGSSAPI\n"
+"OPTIONS_SINGLE_GSSAPI=\tGSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT GSSAPI_NONE\n"
+msgstr ""
+"OPTIONS_SINGLE=\tGSSAPI\n"
+"OPTIONS_SINGLE_GSSAPI=\tGSSAPI_BASE GSSAPI_HEIMDAL GSSAPI_MIT GSSAPI_NONE\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1162
+#, no-wrap
+msgid ""
+"GSSAPI_BASE_USES=\tgssapi\n"
+"GSSAPI_BASE_CONFIGURE_ON=\t--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}\n"
+"GSSAPI_HEIMDAL_USES=\tgssapi:heimdal\n"
+"GSSAPI_HEIMDAL_CONFIGURE_ON=\t--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}\n"
+"GSSAPI_MIT_USES=\tgssapi:mit\n"
+"GSSAPI_MIT_CONFIGURE_ON=\t--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}\n"
+"GSSAPI_NONE_CONFIGURE_ON=\t--without-gssapi\n"
+msgstr ""
+"GSSAPI_BASE_USES=\tgssapi\n"
+"GSSAPI_BASE_CONFIGURE_ON=\t--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}\n"
+"GSSAPI_HEIMDAL_USES=\tgssapi:heimdal\n"
+"GSSAPI_HEIMDAL_CONFIGURE_ON=\t--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}\n"
+"GSSAPI_MIT_USES=\tgssapi:mit\n"
+"GSSAPI_MIT_CONFIGURE_ON=\t--with-gssapi=${GSSAPIBASEDIR} ${GSSAPI_CONFIGURE_ARGS}\n"
+"GSSAPI_NONE_CONFIGURE_ON=\t--without-gssapi\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1167
+#, no-wrap
+msgid "`gstreamer`"
+msgstr "`gstreamer`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1174
+msgid ""
+"Provides an easy way to depend on GStreamer components. The components "
+"should be listed in `USE_GSTREAMER`. The available components are:"
+msgstr ""
+"Предоставляет простой способ зависимости от компонентов GStreamer. "
+"Компоненты должны быть перечислены в `USE_GSTREAMER`. Доступные компоненты:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1176
+msgid "`a52dec`"
+msgstr "`a52dec`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1177
+msgid "`aalib`"
+msgstr "`aalib`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1178
+msgid "`amrnb`"
+msgstr "`amrnb`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1179
+msgid "`amrwbdec`"
+msgstr "`amrwbdec`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1180
+msgid "`aom`"
+msgstr "`aom`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1181
+msgid "`assrender`"
+msgstr "`assrender`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1182
+msgid "`bad`"
+msgstr "`bad`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1183
+msgid "`bs2b`"
+msgstr "`bs2b`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1185
+msgid "`cdio`"
+msgstr "`cdio`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1186
+msgid "`cdparanoia`"
+msgstr "`cdparanoia`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1187
+msgid "`chromaprint`"
+msgstr "`chromaprint`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1188
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1603
+msgid "`curl`"
+msgstr "`curl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1189
+msgid "`dash`"
+msgstr "`dash`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1190
+msgid "`dtls`"
+msgstr "`dtls`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1191
+msgid "`dts`"
+msgstr "`dts`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1192
+msgid "`dv`"
+msgstr "`dv`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1193
+msgid "`dvd`"
+msgstr "`dvd`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1194
+msgid "`dvdread`"
+msgstr "`dvdread`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1195
+msgid "`editing-services`"
+msgstr "`editing-services`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1196
+msgid "`faac`"
+msgstr "`faac`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1197
+msgid "`faad`"
+msgstr "`faad`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1198
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1610
+msgid "`flac`"
+msgstr "`flac`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1199
+msgid "`flite`"
+msgstr "`flite`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1202
+msgid "`gme`"
+msgstr "`gme`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1203
+msgid "`gnonlin`"
+msgstr "`gnonlin`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1204
+msgid "`good`"
+msgstr "`good`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1205
+msgid "`gsm`"
+msgstr "`gsm`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1206
+msgid "`gtk4`"
+msgstr "`gtk4`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1207
+msgid "`gtk`"
+msgstr "`gtk`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1208
+msgid "`hal`"
+msgstr "`hal`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1209
+msgid "`hls`"
+msgstr "`hls`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1210
+msgid "`jack`"
+msgstr "`jack`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1211
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1427
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1619
+#, no-wrap
+msgid "`jpeg`"
+msgstr "`jpeg`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1212
+msgid "`kate`"
+msgstr "`kate`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1213
+msgid "`kms`"
+msgstr "`kms`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1214
+msgid "`ladspa`"
+msgstr "`ladspa`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1215
+msgid "`lame`"
+msgstr "`lame`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1216
+msgid "`libav`"
+msgstr "`libav`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1217
+msgid "`libcaca`"
+msgstr "`libcaca`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1218
+msgid "`libde265`"
+msgstr "`libde265`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1219
+msgid "`libmms`"
+msgstr "`libmms`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1220
+msgid "`libvisual`"
+msgstr "`libvisual`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1221
+msgid "`lv2`"
+msgstr "`lv2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1222
+msgid "`mm`"
+msgstr "`mm`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1223
+msgid "`modplug`"
+msgstr "`modplug`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1224
+msgid "`mpeg2dec`"
+msgstr "`mpeg2dec`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1225
+msgid "`mpeg2enc`"
+msgstr "`mpeg2enc`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1226
+msgid "`mpg123`"
+msgstr "`mpg123`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1227
+msgid "`mplex`"
+msgstr "`mplex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1228
+msgid "`musepack`"
+msgstr "`musepack`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1229
+msgid "`neon`"
+msgstr "`neon`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1230
+msgid "`ogg`"
+msgstr "`ogg`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1231
+msgid "`opencv`"
+msgstr "`opencv`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1232
+msgid "`openexr`"
+msgstr "`openexr`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1233
+msgid "`openh264`"
+msgstr "`openh264`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1234
+msgid "`openjpeg`"
+msgstr "`openjpeg`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1235
+msgid "`openmpt`"
+msgstr "`openmpt`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1236
+msgid "`opus`"
+msgstr "`opus`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1238
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1650
+msgid "`png`"
+msgstr "`png`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1239
+msgid "`pulse`"
+msgstr "`pulse`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1240
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1652
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2346
+#, no-wrap
+msgid "`qt`"
+msgstr "`qt`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1241
+msgid "`resindvd`"
+msgstr "`resindvd`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1242
+msgid "`rsvg`"
+msgstr "`rsvg`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1243
+msgid "`rtmp`"
+msgstr "`rtmp`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1244
+msgid "`shout2`"
+msgstr "`shout2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1245
+msgid "`sidplay`"
+msgstr "`sidplay`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1246
+msgid "`smoothstreaming`"
+msgstr "`smoothstreaming`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1247
+msgid "`sndfile`"
+msgstr "`sndfile`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1248
+msgid "`sndio`"
+msgstr "`sndio`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1249
+msgid "`soundtouch`"
+msgstr "`soundtouch`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1250
+msgid "`soup`"
+msgstr "`soup`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1251
+msgid "`spandsp`"
+msgstr "`spandsp`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1252
+msgid "`speex`"
+msgstr "`speex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1253
+msgid "`srtp`"
+msgstr "`srtp`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1254
+msgid "`taglib`"
+msgstr "`taglib`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1255
+msgid "`theora`"
+msgstr "`theora`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1256
+msgid "`ttml`"
+msgstr "`ttml`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1257
+msgid "`twolame`"
+msgstr "`twolame`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1258
+msgid "`ugly`"
+msgstr "`ugly`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1259
+msgid "`v4l2`"
+msgstr "`v4l2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1260
+msgid "`vorbis`"
+msgstr "`vorbis`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1261
+msgid "`vpx`"
+msgstr "`vpx`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1262
+msgid "`vulkan`"
+msgstr "`vulkan`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1263
+msgid "`wavpack`"
+msgstr "`wavpack`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1264
+msgid "`webp`"
+msgstr "`webp`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1265
+msgid "`webrtcdsp`"
+msgstr "`webrtcdsp`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1266
+msgid "`x264`"
+msgstr "`x264`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1267
+msgid "`x265`"
+msgstr "`x265`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1268
+msgid "`x`"
+msgstr "`x`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1269
+msgid "`ximagesrc`"
+msgstr "`ximagesrc`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1270
+msgid "`zbar`"
+msgstr "`zbar`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1272
+#, no-wrap
+msgid "`guile`"
+msgstr "`guile`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1275
+msgid ""
+"Possible arguments: (none), `_X.Y_`, `flavors`, `build`, `run`, `alias`, "
+"`conflicts`"
+msgstr ""
+"Возможные аргументы: (нет), `_X.Y_`, `flavors`, `build`, `run`, `alias`, "
+"`conflicts`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1279
+msgid ""
+"Adds a dependency on Guile. By default this is a library dependency on the "
+"appropriate `libguile*.so`, unless overridden by the `build` and/or `run` "
+"option. The `alias` option configures `BINARY_ALIAS` appropriately (see "
+"crossref:makefiles[binary-alias,Use `BINARY_ALIAS`])."
+msgstr ""
+"Добавляет зависимость от Guile. По умолчанию это зависимость от "
+"соответствующей библиотеки `libguile*.so`, если не переопределено опциями "
+"`build` и/или `run`. Опция `alias` настраивает `BINARY_ALIAS` "
+"соответствующим образом (см. crossref:makefiles[binary-alias,Использование "
+"`BINARY_ALIAS`])."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1282
+msgid ""
+"The default version is set by the usual `DEFAULT_VERSIONS` mechanism; if the "
+"default version is not one of the listed versions, then the latest available "
+"listed version is used."
+msgstr ""
+"Версия по умолчанию устанавливается с помощью обычного механизма "
+"`DEFAULT_VERSIONS`; если версия по умолчанию не входит в список указанных "
+"версий, то используется последняя доступная версия из списка."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1285
+msgid ""
+"Applications using Guile are normally built for only a single Guile "
+"version. However, extension or library modules should use the `flavors` "
+"option to build with multiple flavors."
+msgstr ""
+"Приложения, использующие Guile, обычно собираются только для одной версии "
+"Guile. Однако модули расширений или библиотек должны использовать опцию "
+"`flavors` для сборки с несколькими флейворами."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1287
+msgid "For more information see crossref:special[using-guile,Using Guile]."
+msgstr ""
+"Для получения дополнительной информации см. crossref:special[using-"
+"guile,Использование Guile]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1289
+#, no-wrap
+msgid "`horde`"
+msgstr "`horde`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1296
+msgid ""
+"Add buildtime and runtime dependencies on package:devel/pear-channel-"
+"horde[]. Other Horde dependencies can be added with `USE_HORDE_BUILD` and "
+"`USE_HORDE_RUN`. See crossref:special[php-horde,Horde Modules] for more "
+"information."
+msgstr ""
+"Добавить зависимости времени сборки и выполнения для package:devel/pear-"
+"channel-horde[]. Другие зависимости Horde можно добавить с помощью "
+"`USE_HORDE_BUILD` и `USE_HORDE_RUN`. Дополнительную информацию см. в разделе "
+"crossref:special[php-horde,Модули Horde]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1298
+#, no-wrap
+msgid "`iconv`"
+msgstr "`iconv`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1301
+msgid ""
+"Possible arguments: (none), `lib`, `build`, `patch`, `translit`, `wchar_t`"
+msgstr ""
+"Возможные аргументы: (нет), `lib`, `build`, `patch`, `translit`, `wchar_t`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1307
+msgid ""
+"Uses `iconv` functions, either from the port package:converters/libiconv[] "
+"as a build-time and run-time dependency, or from the base system. By "
+"default, with no arguments or with the `lib` argument, implies `iconv` with "
+"build-time and run-time dependencies. `build` implies a build-time "
+"dependency, and `patch` implies a patch-time dependency. If the port uses "
+"the `WCHAR_T` or `//TRANSLIT` iconv extensions, add the relevant arguments "
+"so that the correct iconv is used. For more information see "
+"crossref:special[using-iconv,Using `iconv`]."
+msgstr ""
+"Использует функции `iconv`, либо из порта package:converters/libiconv[] как "
+"зависимость на этапе сборки и выполнения, либо из базовой системы. По "
+"умолчанию, без аргументов или с аргументом `lib`, подразумевает `iconv` с "
+"зависимостями на этапе сборки и выполнения. `build` подразумевает "
+"зависимость на этапе сборки, а `patch` — на этапе патчинга. Если порт "
+"использует расширения `WCHAR_T` или `//TRANSLIT` для `iconv`, добавьте "
+"соответствующие аргументы, чтобы использовалась правильная версия `iconv`. "
+"Для получения дополнительной информации см. crossref:special[using-"
+"iconv,Использование `iconv`]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1309
+#, no-wrap
+msgid "`imake`"
+msgstr "`imake`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1312
+msgid "Possible arguments: (none), `env`, `notall`, `noman`"
+msgstr "Возможные аргументы: (нет), `env`, `notall`, `noman`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1317
+msgid ""
+"Add package:devel/imake[] as a build-time dependency and run `xmkmf -a` "
+"during the `configure` stage. If the `env` argument is given, the "
+"`configure` target is not set. If the `-a` flag is a problem for the port, "
+"add the `notall` argument. If `xmkmf` does not generate a `install.man` "
+"target, add the `noman` argument."
+msgstr ""
+"Добавить package:devel/imake[] как зависимость на этапе сборки и выполнить "
+"`xmkmf -a` на этапе `configure`. Если указан аргумент `env`, цель "
+"`configure` не устанавливается. Если флаг `-a` вызывает проблемы для порта, "
+"добавьте аргумент `notall`. Если `xmkmf` не генерирует цель `install.man`, "
+"добавьте аргумент `noman`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1319
+#, no-wrap
+msgid "`java`"
+msgstr "`java`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1322
+msgid "Possible arguments: (none), `ant`, `build`, `extract`, `run`"
+msgstr "Возможные аргументы: (нет), `ant`, `build`, `extract`, `run`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1329
+msgid ""
+"Defaults to `USES=java:build,run` if no arguments are provided and "
+"`NO_BUILD` is undefined. If `NO_BUILD` is defined, `USES=java:run` is used. "
+"If the `ant` argument is given, the port uses Apache Ant. If the `build` "
+"argument is given, a JDK port is added to the build dependencies. If the "
+"`extract` argument is given, a JDK port is added to the extract "
+"dependencies. If the `run` argument is given, a JDK port is added to the "
+"run dependencies."
+msgstr ""
+"По умолчанию используется `USES=java:build,run`, если аргументы не "
+"предоставлены и `NO_BUILD` не определен. Если `NO_BUILD` определен, "
+"используется `USES=java:run`. Если указан аргумент `ant`, порт использует "
+"Apache Ant. Если указан аргумент `build`, порт JDK добавляется в зависимости "
+"сборки. Если указан аргумент `extract`, порт JDK добавляется в зависимости "
+"извлечения. Если указан аргумент `run`, порт JDK добавляется в зависимости "
+"выполнения."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1332
+#, no-wrap
+msgid "`JAVA_VERSION`"
+msgstr "`JAVA_VERSION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1336
+msgid ""
+"List of space-separated suitable java versions for the port. An optional `\\"
+"+` allows you to specify a range of versions. (allowed values `8[+]`, `11[\\"
+"+]`, `17[+]`, `18[\\+]`, `19[+]`, `20[\\+]`, `21[+]`, `22[\\+]`, `22[+]`)"
+msgstr ""
+"Список подходящих версий Java для порта, разделенных пробелами. "
+"Необязательный символ `\\+` позволяет указать диапазон версий. (допустимые "
+"значения `8[+]`, `11[\\+]`, `17[+]`, `18[\\+]`, `19[+]`, `20[\\+]`, `21[+]`, "
+"`22[\\+]`, `22[+]`)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1337
+#, no-wrap
+msgid "`JAVA_OS`"
+msgstr "`JAVA_OS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1340
+msgid ""
+"List of space-separated suitable JDK port operating systems for the port. "
+"(allowed values: `native`, `linux`)"
+msgstr ""
+"Список поддерживаемых операционных систем для порта JDK, разделённых "
+"пробелами. (допустимые значения: `native`, `linux`)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1341
+#, no-wrap
+msgid "`JAVA_VENDOR`"
+msgstr "`JAVA_VENDOR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1344
+msgid ""
+"List of space-separated suitable JDK port vendors for the port. (allowed "
+"values: `openjdk`, `oracle`)"
+msgstr ""
+"Список подходящих поставщиков портов JDK для порта, разделенных пробелами. "
+"(допустимые значения: `openjdk`, `oracle`)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1346
+msgid "The framework exposes the following variables to be read by the port:"
+msgstr "Фреймворк предоставляет следующие переменные для чтения портом:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1347
+#, no-wrap
+msgid "`JAVA_PORT`"
+msgstr "`JAVA_PORT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1349
+msgid "The name of the JDK port. (e.g. 'java/openjdk8')"
+msgstr "Имя порта JDK. (например, 'java/openjdk8')"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1350
+#, no-wrap
+msgid "`JAVA_PORT_VERSION`"
+msgstr "`JAVA_PORT_VERSION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1352
+msgid "The version of the JDK port. (e.g. '8')"
+msgstr "Версия порта JDK. (например, '8')"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1353
+#, no-wrap
+msgid "`JAVA_PORT_OS`"
+msgstr "`JAVA_PORT_OS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1355
+msgid "The operating system used by the JDK port. (e.g. 'linux')"
+msgstr "Используемая операционная система для порта JDK. (например, 'linux')"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1356
+#, no-wrap
+msgid "`JAVA_PORT_VENDOR`"
+msgstr "`JAVA_PORT_VENDOR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1358
+msgid "The vendor of the JDK port. (e.g. 'openjdk')"
+msgstr "Поставщик порта JDK. (например, 'openjdk')"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1359
+#, no-wrap
+msgid "`JAVA_PORT_OS_DESCRIPTION`"
+msgstr "`JAVA_PORT_OS_DESCRIPTION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1361
+msgid ""
+"Description of the operating system used by the JDK port. (e.g. 'Linux')"
+msgstr ""
+"Описание операционной системы, используемой портом JDK. (например, 'Linux')"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1362
+#, no-wrap
+msgid "`JAVA_PORT_VENDOR_DESCRIPTION`"
+msgstr "`JAVA_PORT_VENDOR_DESCRIPTION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1364
+msgid ""
+"Description of the vendor of the JDK port. (e.g. 'OpenJDK BSD Porting Team')"
+msgstr "Описание поставщика порта JDK. (например, 'OpenJDK BSD Porting Team')"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1365
+#, no-wrap
+msgid "`JAVA_HOME`"
+msgstr "`JAVA_HOME`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1367
+msgid ""
+"Path to the installation directory of the JDK. (e.g. [.filename]#/usr/local/"
+"openjdk8#)"
+msgstr ""
+"Путь к каталогу установки JDK. (например, [.filename]#/usr/local/openjdk8#)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1368
+#, no-wrap
+msgid "`JAVAC`"
+msgstr "`JAVAC`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1371
+msgid ""
+"Path to the Java compiler to use. (e.g. [.filename]#/usr/local/openjdk8/bin/"
+"javac# or [.filename]#/usr/local/bin/javac#)"
+msgstr ""
+"Путь к используемому компилятору Java. (например, [.filename]#/usr/local/"
+"openjdk8/bin/javac# или [.filename]#/usr/local/bin/javac#)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1372
+#, no-wrap
+msgid "`JAR`"
+msgstr "`JAR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1375
+msgid ""
+"Path to the JAR tool to use. (e.g. [.filename]#/usr/local/openjdk8/bin/jar# "
+"or [.filename]#/usr/local/bin/fastjar#)"
+msgstr ""
+"Путь к используемому инструменту JAR. (например, [.filename]#/usr/local/"
+"openjdk8/bin/jar# или [.filename]#/usr/local/bin/fastjar#)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1376
+#, no-wrap
+msgid "`APPLETVIEWER`"
+msgstr "`APPLETVIEWER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1379
+msgid ""
+"Path to the appletviewer utility. (e.g. [.filename]#/usr/local/linux-"
+"jdk1.8.0/bin/appletviewer#)"
+msgstr ""
+"Путь к утилите appletviewer. (например, [.filename]#/usr/local/linux-"
+"jdk1.8.0/bin/appletviewer#)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1380
+#, no-wrap
+msgid "`JAVA`"
+msgstr "`JAVA`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1382
+msgid ""
+"Path to the `java` executable. Use this for executing Java programs. (e.g. "
+"[.filename]#/usr/local/openjdk8/bin/java#)"
+msgstr ""
+"Путь к исполняемому файлу `java`. Используется для запуска программ на Java. "
+"(например, [.filename]#/usr/local/openjdk8/bin/java#)"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1383
+#, no-wrap
+msgid "`JAVADOC`"
+msgstr "`JAVADOC`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1385
+msgid "Path to the `javadoc` utility program."
+msgstr "Путь к программе `javadoc`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1386
+#, no-wrap
+msgid "`JAVAH`"
+msgstr "`JAVAH`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1388
+msgid "Path to the `javah` program."
+msgstr "Путь к программе `javah`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1389
+#, no-wrap
+msgid "`JAVAP`"
+msgstr "`JAVAP`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1391
+msgid "Path to the `javap` program."
+msgstr "Путь к программе `javap`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1392
+#, no-wrap
+msgid "`JAVA_KEYTOOL`"
+msgstr "`JAVA_KEYTOOL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1394
+msgid "Path to the `keytool` utility program."
+msgstr "Путь к утилите `keytool`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1395
+#, no-wrap
+msgid "`JAVA_N2A`"
+msgstr "`JAVA_N2A`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1397
+msgid "Path to the `native2ascii` tool."
+msgstr "Путь к инструменту `native2ascii`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1398
+#, no-wrap
+msgid "`JAVA_POLICYTOOL`"
+msgstr "`JAVA_POLICYTOOL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1400
+msgid "Path to the `policytool` program."
+msgstr "Путь к программе `policytool`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1401
+#, no-wrap
+msgid "`JAVA_SERIALVER`"
+msgstr "`JAVA_SERIALVER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1403
+msgid "Path to the `serialver` utility program."
+msgstr "Путь к утилите `serialver`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1404
+#, no-wrap
+msgid "`RMIC`"
+msgstr "`RMIC`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1406
+msgid "Path to the RMI stub/skeleton generator, `rmic`."
+msgstr "Путь к генератору RMI-заглушек/скелетов, `rmic`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1407
+#, no-wrap
+msgid "`RMIREGISTRY`"
+msgstr "`RMIREGISTRY`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1409
+msgid "Path to the RMI registry program, `rmiregistry`."
+msgstr "Путь к программе реестра RMI, `rmiregistry`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1410
+#, no-wrap
+msgid "`RMID`"
+msgstr "`RMID`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1412
+msgid "Path to the RMI daemon program."
+msgstr "Путь к программе демона RMI."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1413
+#, no-wrap
+msgid "`JAVA_CLASSES`"
+msgstr "`JAVA_CLASSES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1416
+msgid ""
+"Path to the archive that contains the JDK class files. On most JDKs, this is "
+"[.filename]#${JAVA_HOME}/jre/lib/rt.jar#."
+msgstr ""
+"Путь к архиву, содержащему файлы классов JDK. В большинстве JDK это "
+"[.filename]#${JAVA_HOME}/jre/lib/rt.jar#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1417
+#, no-wrap
+msgid "`JAVASHAREDIR`"
+msgstr "`JAVASHAREDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1419
+msgid "The base directory for all shared Java resources."
+msgstr "Базовый каталог для всех общих ресурсов Java."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1420
+#, no-wrap
+msgid "`JAVAJARDIR`"
+msgstr "`JAVAJARDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1422
+msgid "The directory where a port should install JAR files."
+msgstr "Каталог, в котором порт должен устанавливать JAR-файлы."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1423
+#, no-wrap
+msgid "`JAVALIBDIR`"
+msgstr "`JAVALIBDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1425
+msgid "The directory where JAR files installed by other ports are located."
+msgstr "Каталог, в котором находятся JAR-файлы, установленные другими портами."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1430
+msgid "Possible arguments: `lib` (default, implicit), `build`, `run`"
+msgstr ""
+"Возможные аргументы: `lib` (по умолчанию, подразумевается), `build`, `run`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1432
+msgid "Help handling dependencies on `jpeg`."
+msgstr "Помощь в обработке зависимостей от `jpeg`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1435
+msgid ""
+"If the `lib` argument is provided or no arguments are provided then a lib "
+"dependency is added to the port."
+msgstr ""
+"Если указан аргумент `lib` или аргументы не предоставлены, то в порт "
+"добавляется зависимость от библиотеки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1438
+msgid ""
+"If the `build` argument is provided then a build dependency is added to the "
+"port."
+msgstr ""
+"Если указан аргумент `build`, то в порт добавляется зависимость сборки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1441
+msgid ""
+"If the `run` argument is provided then a run dependency is added to the port."
+msgstr ""
+"Если указан аргумент `run`, то к порту добавляется зависимость времени "
+"выполнения."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1444
+msgid ""
+"If the `both` argument is provided then a build dependency and a run "
+"dependency are added to the port."
+msgstr ""
+"Если указан аргумент `both`, то к порту добавляется зависимость для сборки и "
+"зависимость для выполнения."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1446
+msgid "The framework provides the following variable that can be set by ports:"
+msgstr ""
+"Фреймворк предоставляет следующую переменную, которая может быть установлена "
+"портами:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1447
+#, no-wrap
+msgid "`JPEG_PORT`"
+msgstr "`JPEG_PORT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1449
+msgid "Specifies the JPEG implementation to use. Possible values are:"
+msgstr "Указывает реализацию JPEG для использования. Возможные значения:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1451
+msgid "package:graphics/jpeg-turbo[] (default)"
+msgstr "package:graphics/jpeg-turbo[] (по умолчанию)"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1452
+msgid "package:graphics/mozjpeg[]"
+msgstr "package:graphics/mozjpeg[]"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1454
+#, no-wrap
+msgid "`kde`"
+msgstr "`kde`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1457
+msgid "Possible arguments: `5`"
+msgstr "Возможные аргументы: `5`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1460
+msgid ""
+"Add dependency on KDE components. See crossref:special[using-kde,Using KDE] "
+"for more information."
+msgstr ""
+"Добавить зависимость от компонентов KDE. Подробнее см. в "
+"crossref:special[using-kde,Использование KDE]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1462
+#, no-wrap
+msgid "`kmod`"
+msgstr "`kmod`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1465
+msgid "Possible arguments: (none), `debug`"
+msgstr "Возможные аргументы: (отсутствуют), `debug`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1467
+msgid "Fills in the boilerplate for kernel module ports, currently:"
+msgstr "Заполняет шаблон для портов модулей ядра, в настоящее время:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1469
+msgid "Add `kld` to `CATEGORIES`."
+msgstr "Добавьте `kld` в `CATEGORIES`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1470
+msgid "Set `SSP_UNSAFE`."
+msgstr "Установите `SSP_UNSAFE`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1471
+msgid "Set `IGNORE` if the kernel sources are not found in `SRC_BASE`."
+msgstr "Установите `IGNORE`, если исходные коды ядра не найдены в `SRC_BASE`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1472
+msgid ""
+"Define `KMODDIR` to [.filename]#/boot/modules# by default, add it to "
+"`PLIST_SUB` and `MAKE_ENV`, and create it upon installation. If `KMODDIR` is "
+"set to [.filename]#/boot/kernel#, it will be rewritten to [.filename]#/boot/"
+"modules#. This prevents breaking packages when upgrading the kernel due to "
+"[.filename]#/boot/kernel# being renamed to [.filename]#/boot/kernel.old# in "
+"the process."
+msgstr ""
+"Определить `KMODDIR` по умолчанию как [.filename]#/boot/modules#, добавить "
+"его в `PLIST_SUB` и `MAKE_ENV`, а также создать его при установке. Если "
+"`KMODDIR` установлен в [.filename]#/boot/kernel#, он будет перезаписан в "
+"[.filename]#/boot/modules#. Это предотвращает повреждение пакетов при "
+"обновлении ядра из-за переименования [.filename]#/boot/kernel# в "
+"[.filename]#/boot/kernel.old# в процессе."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1473
+msgid ""
+"Handle cross-referencing kernel modules upon installation and "
+"deinstallation, using crossref:plist[plist-keywords-kld,`@kld`]."
+msgstr ""
+"Обрабатывать перекрестные ссылки на модули ядра при установке и удалении, "
+"используя crossref:plist[plist-keywords-kld,`@kld`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1474
+msgid ""
+"If the `debug` argument is given, the port can install a debug version of "
+"the module into [.filename]#KERN_DEBUGDIR#/[.filename]#KMODDIR#. By default, "
+"`KERN_DEBUGDIR` is copied from `DEBUGDIR` and set to [.filename]#/usr/lib/"
+"debug#. The framework will take care of creating and removing any required "
+"directories."
+msgstr ""
+"Если указан аргумент `debug`, порт может установить отладочную версию модуля "
+"в [.filename]#KERN_DEBUGDIR#/[.filename]#KMODDIR#. По умолчанию "
+"`KERN_DEBUGDIR` копируется из `DEBUGDIR` и устанавливается в [.filename]#/"
+"usr/lib/debug#. Фреймворк позаботится о создании и удалении необходимых "
+"каталогов."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1476
+#, no-wrap
+msgid "`kodi`"
+msgstr "`kodi`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1483
+msgid ""
+"Provide support for package:multimedia/kodi[] add-ons. If the `noautoplist` "
+"argument is provided it does not generate the `plist` automatically."
+msgstr ""
+"Обеспечить поддержку дополнений для package:multimedia/kodi[]. Если указан "
+"аргумент `noautoplist`, автоматическое создание `plist` не выполняется."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1485
+#, no-wrap
+msgid "`lazarus`"
+msgstr "`lazarus`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1488
+msgid "Possible arguments: (none), `gtk2` (default), `qt5`, `qt6`, `flavors`"
+msgstr ""
+"Возможные аргументы: (отсутствуют), `gtk2` (по умолчанию), `qt5`, `qt6`, "
+"`flavors`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1490
+msgid "Provide support for package:editors/lazarus[] based ports."
+msgstr "Обеспечить поддержку портов на основе package:editors/lazarus[]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1494
+msgid ""
+"If no arguments are provided or if `gtk2` is provided the lazarus-app is "
+"built with a `gtk2` interface the package:editors/lazarus[] port will be "
+"built with the `gtk2` interface."
+msgstr ""
+"Если аргументы не предоставлены или указан `gtk2`, приложение lazarus-app "
+"будет собрано с интерфейсом `gtk2`, и порт package:editors/lazarus[] будет "
+"собран с интерфейсом `gtk2`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1497
+msgid ""
+"If the `qt5` argument is provided, the lazarus-app is built with a `qt5` "
+"interface."
+msgstr ""
+"Если указан аргумент `qt5`, приложение lazarus-app собирается с интерфейсом "
+"`qt5`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1500
+msgid ""
+"If the `qt6` argument is provided, the lazarus-app is built with a `qt6` "
+"interface."
+msgstr ""
+"Если указан аргумент `qt6`, приложение lazarus-app собирается с интерфейсом "
+"`qt6`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1503
+msgid ""
+"If the `flavors` argument is provided the lazarus-app is built with flavors "
+"feature."
+msgstr ""
+"Если указан аргумент `flavors`, приложение `lazarus-app` собирается с "
+"поддержкой функций флейворов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1506
+msgid ""
+"If the port does not require compiling lazarus project files automatically, "
+"the following variable can be defined:"
+msgstr ""
+"Если порт не требует автоматической компиляции файлов проекта lazarus, можно "
+"определить следующую переменную:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1508
+msgid "`NO_LAZBUILD`= `yes`"
+msgstr "`NO_LAZBUILD`= `yes`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1510
+msgid "The following variables are available for ports:"
+msgstr "Доступны следующие переменные для портов:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1511
+#, no-wrap
+msgid "`LAZARUS_PROJECT_FILES`"
+msgstr "`LAZARUS_PROJECT_FILES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1513
+msgid "List of lpi files. It must not be empty. Default: empty"
+msgstr "Список lpi-файлов. Он не должен быть пустым. По умолчанию: пусто"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1514
+#, no-wrap
+msgid "`LAZARUS_DIR`"
+msgstr "`LAZARUS_DIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1517
+msgid ""
+"Path to lazarus installation directory Default: [.filename]#${LOCALBASE}/"
+"share/lazarus-${LAZARUS_VER}#"
+msgstr ""
+"Путь к директории установки lazarus. По умолчанию: [.filename]#${LOCALBASE}/"
+"share/lazarus-${LAZARUS_VER}#"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1518
+#, no-wrap
+msgid "`LAZBUILD_ARGS`"
+msgstr "`LAZBUILD_ARGS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1522
+msgid ""
+"lazbuild extra args. It could be `-d` in most of cases. See man:lazbuild[1] "
+"for more information. Default: empty"
+msgstr ""
+"Дополнительные аргументы lazbuild. В большинстве случаев это может быть `-"
+"d`. Подробнее см. man:lazbuild[1]. По умолчанию: пусто"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1523
+#, no-wrap
+msgid "`LAZARUS_NO_FLAVORS`"
+msgstr "`LAZARUS_NO_FLAVORS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1526
+msgid ""
+"Do not build these lazarus flavors. If `LAZARUS_NO_FLAVORS` is not defined "
+"then all valid lazarus flavors are assumed."
+msgstr ""
+"Не собирать эти флейворы lazarus. Если `LAZARUS_NO_FLAVORS` не определена, "
+"то предполагаются все допустимые флейворы lazarus."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1527
+#, no-wrap
+msgid "`WANT_LAZARUS_DEVEL`"
+msgstr "`WANT_LAZARUS_DEVEL`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1529
+msgid "If set to `yes` then use package:lazarus/devel[] as build dependency."
+msgstr ""
+"Если установлено значение `yes`, то используйте package:lazarus/devel[] как "
+"зависимость сборки."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1531
+#, no-wrap
+msgid "`ldap`"
+msgstr "`ldap`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1534
+msgid "Possible arguments: (none), <version>, client, server"
+msgstr "Возможные аргументы: (нет), <версия>, клиент, сервер"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1542
+msgid ""
+"Registers a dependency on package:net/openldap[]. It uses the specific "
+"`<version>` (without the dot notation) if set. Otherwise it tries to find "
+"the currently installed version. If necessary it falls back to the default "
+"version found in `bsd.default-versions.mk`. `client` specifies a runtime "
+"dependency on the client library. This is also the default. `server` "
+"specifies a runtime dependency on the server."
+msgstr ""
+"Регистрирует зависимость от пакета package:net/openldap[]. Использует "
+"конкретную `<версию>` (без точечной нотации), если она указана. В противном "
+"случае пытается найти установленную версию. При необходимости возвращается к "
+"версии по умолчанию, указанной в `bsd.default-versions.mk`. `client` "
+"указывает на зависимость во время выполнения от клиентской библиотеки. Это "
+"также значение по умолчанию. `server` указывает на зависимость во время "
+"выполнения от сервера."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1545
+#, no-wrap
+msgid "`IGNORE_WITH_OPENLDAP`"
+msgstr "`IGNORE_WITH_OPENLDAP`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1547
+msgid ""
+"This variable can be defined if the ports does not support one or more "
+"versions of OpenLDAP."
+msgstr ""
+"Эта переменная может быть определена, если порты не поддерживают одну или "
+"несколько версий OpenLDAP."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1547
+#, no-wrap
+msgid "`WITH_OPENLDAP_VER`"
+msgstr "`WITH_OPENLDAP_VER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1549
+msgid "User defined variable to set OpenLDAP version."
+msgstr "Пользовательская переменная для установки версии OpenLDAP."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1549
+#, no-wrap
+msgid "`OPENLDAP_VER`"
+msgstr "`OPENLDAP_VER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1551
+msgid "Detected OpenLDAP version."
+msgstr "Обнаруженная версия OpenLDAP."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1553
+#, no-wrap
+msgid "`lha`"
+msgstr "`lha`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1558
+msgid "Set `EXTRACT_SUFX` to `.lzh`"
+msgstr "Установите `EXTRACT_SUFX` в `.lzh`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1560
+#, no-wrap
+msgid "`libarchive`"
+msgstr "`libarchive`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1566
+msgid ""
+"Registers a dependency on package:archivers/libarchive[]. Any ports "
+"depending on libarchive must include `USES=libarchive`."
+msgstr ""
+"Регистрирует зависимость от package:archivers/libarchive[]. Любые порты, "
+"зависящие от libarchive, должны включать `USES=libarchive`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1568
+#, no-wrap
+msgid "`libedit`"
+msgstr "`libedit`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1574
+msgid ""
+"Registers a dependency on package:devel/libedit[]. Any ports depending on "
+"libedit must include `USES=libedit`."
+msgstr ""
+"Регистрирует зависимость от package:devel/libedit[]. Все порты, зависящие от "
+"libedit, должны включать `USES=libedit`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1576
+#, no-wrap
+msgid "`libtool`"
+msgstr "`libtool`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1579
+msgid "Possible arguments: (none), `keepla`, `build`"
+msgstr "Возможные аргументы: (нет), `keepla`, `build`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1583
+msgid ""
+"Patches `libtool` scripts. This must be added to all ports that use "
+"`libtool`. The `keepla` argument can be used to keep [.filename]#.la# "
+"files. Some ports do not ship with their own copy of libtool and need a "
+"build time dependency on package:devel/libtool[], use the `:build` argument "
+"to add such dependency."
+msgstr ""
+"Исправляет скрипты `libtool`. Это должно быть добавлено во все порты, "
+"использующие `libtool`. Аргумент `keepla` может быть использован для "
+"сохранения файлов [.filename]#.la#. Некоторые порты не поставляются с "
+"собственной копией libtool и требуют зависимость во время сборки от "
+"package:devel/libtool[], используйте аргумент `:build` для добавления такой "
+"зависимости."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1585
+#, no-wrap
+msgid "`linux`"
+msgstr "`linux`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1588
+msgid "Possible arguments: `c6`, `c7`"
+msgstr "Возможные аргументы: `c6`, `c7`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1592
+msgid ""
+"Ports Linux compatibility framework. Specify `c6` to depend on CentOS 6 "
+"packages. Specify `c7` to depend on CentOS 7 packages. The available "
+"packages are:"
+msgstr ""
+"Порт фреймворка совместимости с Linux. Укажите `c6` для зависимостей от "
+"пакетов CentOS 6. Укажите `c7` для зависимостей от пакетов CentOS 7. "
+"Доступные пакеты:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1594
+msgid "`allegro`"
+msgstr "`allegro`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1595
+msgid "`alsa-plugins-oss`"
+msgstr "`alsa-plugins-oss`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1596
+msgid "`alsa-plugins-pulseaudio`"
+msgstr "`alsa-plugins-pulseaudio`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1597
+msgid "`alsalib`"
+msgstr "`alsalib`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1599
+msgid "`avahi-libs`"
+msgstr "`avahi-libs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1600
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2820
+msgid "`base`"
+msgstr "`base`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1602
+msgid "`cups-libs`"
+msgstr "`cups-libs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1604
+msgid "`cyrus-sasl2`"
+msgstr "`cyrus-sasl2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1605
+msgid "`dbusglib`"
+msgstr "`dbusglib`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1606
+msgid "`dbuslibs`"
+msgstr "`dbuslibs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1607
+msgid "`devtools`"
+msgstr "`devtools`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1608
+msgid "`dri`"
+msgstr "`dri`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1609
+msgid "`expat`"
+msgstr "`expat`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1611
+msgid "`fontconfig`"
+msgstr "`fontconfig`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1613
+msgid "`gnutls`"
+msgstr "`gnutls`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1614
+msgid "`graphite2`"
+msgstr "`graphite2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1615
+msgid "`gtk2`"
+msgstr "`gtk2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1616
+msgid "`harfbuzz`"
+msgstr "`harfbuzz`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1617
+msgid "`jasper`"
+msgstr "`jasper`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1618
+msgid "`jbigkit`"
+msgstr "`jbigkit`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1620
+msgid "`libasyncns`"
+msgstr "`libasyncns`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1621
+msgid "`libaudiofile`"
+msgstr "`libaudiofile`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1622
+msgid "`libelf`"
+msgstr "`libelf`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1623
+msgid "`libgcrypt`"
+msgstr "`libgcrypt`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1624
+msgid "`libgfortran`"
+msgstr "`libgfortran`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1625
+msgid "`libgpg-error`"
+msgstr "`libgpg-error`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1626
+msgid "`libmng`"
+msgstr "`libmng`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1627
+msgid "`libogg`"
+msgstr "`libogg`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1628
+msgid "`libpciaccess`"
+msgstr "`libpciaccess`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1629
+msgid "`libsndfile`"
+msgstr "`libsndfile`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1630
+msgid "`libsoup`"
+msgstr "`libsoup`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1631
+msgid "`libssh2`"
+msgstr "`libssh2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1632
+msgid "`libtasn1`"
+msgstr "`libtasn1`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1633
+msgid "`libthai`"
+msgstr "`libthai`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1634
+msgid "`libtheora`"
+msgstr "`libtheora`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1635
+msgid "`libv4l`"
+msgstr "`libv4l`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1636
+msgid "`libvorbis`"
+msgstr "`libvorbis`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1638
+msgid "`mikmod`"
+msgstr "`mikmod`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1639
+msgid "`naslibs`"
+msgstr "`naslibs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1640
+msgid "`ncurses-base`"
+msgstr "`ncurses-base`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1641
+msgid "`nspr`"
+msgstr "`nspr`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1642
+msgid "`nss`"
+msgstr "`nss`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1643
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2026
+#, no-wrap
+msgid "`openal`"
+msgstr "`openal`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1644
+msgid "`openal-soft`"
+msgstr "`openal-soft`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1645
+msgid "`openldap`"
+msgstr "`openldap`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1646
+msgid "`openmotif`"
+msgstr "`openmotif`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1647
+msgid "`openssl`"
+msgstr "`openssl`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1649
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3001
+#, no-wrap
+msgid "`pixman`"
+msgstr "`pixman`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1651
+msgid "`pulseaudio-libs`"
+msgstr "`pulseaudio-libs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1653
+msgid "`qt-x11`"
+msgstr "`qt-x11`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1654
+msgid "`qtwebkit`"
+msgstr "`qtwebkit`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1655
+msgid "`scimlibs`"
+msgstr "`scimlibs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1656
+msgid "`sdl12`"
+msgstr "`sdl12`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1657
+msgid "`sdlimage`"
+msgstr "`sdlimage`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1658
+msgid "`sdlmixer`"
+msgstr "`sdlmixer`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1659
+msgid "`sqlite3`"
+msgstr "`sqlite3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1660
+msgid "`tcl85`"
+msgstr "`tcl85`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1661
+msgid "`tcp_wrappers-libs`"
+msgstr "`tcp_wrappers-libs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1662
+msgid "`tiff`"
+msgstr "`tiff`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1663
+msgid "`tk85`"
+msgstr "`tk85`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1664
+msgid "`ucl`"
+msgstr "`ucl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1665
+msgid "`xorglibs`"
+msgstr "`xorglibs`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1667
+#, no-wrap
+msgid "`llvm`"
+msgstr "`llvm`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1670
+msgid ""
+"Possible arguments: (none), `_XY_`, min=`_XY_`, max=`_XY_`, build, run, lib"
+msgstr ""
+"Возможные аргументы: (нет), `_XY_`, min=`_XY_`, max=`_XY_`, build, run, lib"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1678
+msgid ""
+"Adds a dependency on LLVM. By default this is a build dependency unless "
+"overridden by the `run` or `lib` options. The default version is the one "
+"set in `LLVM_DEFAULT`. A specific version can be specified as well. The "
+"minimum and maximum versions can be specified with the `min` and `max` "
+"parameters respectively. The ports framework export the following variables "
+"to the port:"
+msgstr ""
+"Добавляет зависимость от LLVM. По умолчанию это зависимость для сборки, если "
+"не переопределено опциями `run` или `lib`. Версия по умолчанию задаётся в "
+"`LLVM_DEFAULT`. Также можно указать конкретную версию. Минимальную и "
+"максимальную версии можно указать с помощью параметров `min` и `max` "
+"соответственно. Фреймворк портов экспортирует следующие переменные в порт:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1679
+#, no-wrap
+msgid "`LLVM_VERSION`"
+msgstr "`LLVM_VERSION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1681
+msgid "Version chosen from the arguments to llvm.mk"
+msgstr "Версия, выбранная из аргументов к llvm.mk"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1681
+#, no-wrap
+msgid "`LLVM_PORT`"
+msgstr "`LLVM_PORT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1683
+msgid "Chosen llvm port"
+msgstr "Выбранный порт llvm"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1683
+#, no-wrap
+msgid "`LLVM_CONFIG`"
+msgstr "`LLVM_CONFIG`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1685
+msgid "llvm-config of the chosen port"
+msgstr "`llvm-config` выбранного порта"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1685
+#, no-wrap
+msgid "`LLVM_LIBLLVM`"
+msgstr "`LLVM_LIBLLVM`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1687
+msgid "libLLVM.so of the chosen port"
+msgstr "`libLLVM.so` выбранного порта"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1687
+#, no-wrap
+msgid "`LLVM_PREFIX`"
+msgstr "`LLVM_PREFIX`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1689
+msgid "Installation prefix of the chosen port"
+msgstr "Префикс инсталляции выбранного порта"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1691
+#, no-wrap
+msgid "`localbase`"
+msgstr "`localbase`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1694
+msgid "Possible arguments: (none), `ldflags`"
+msgstr "Возможные аргументы: (отсутствуют), `ldflags`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1699
+msgid ""
+"Ensures that libraries from dependencies in `LOCALBASE` are used instead of "
+"the ones from the base system. Specify `ldflags` to add `-L${LOCALBASE}/"
+"lib` to `LDFLAGS` instead of `LIBS`. Ports that depend on libraries that "
+"are also present in the base system should use this. It is also used "
+"internally by a few other `USES`."
+msgstr ""
+"Гарантирует использование библиотек из зависимостей в `LOCALBASE` вместо "
+"библиотек из базовой системы. Указывает `ldflags` для добавления `-L$"
+"{LOCALBASE}/lib` в `LDFLAGS` вместо `LIBS`. Порты, зависящие от библиотек, "
+"которые также присутствуют в базовой системе, должны использовать эту опцию. "
+"Она также используется внутри несколькими другими `USES`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1701
+#, no-wrap
+msgid "`lua`"
+msgstr "`lua`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1704
+msgid ""
+"Possible arguments: (none), `_XY_`, `_XY_+`, `-_XY_`, `_XY_-_ZA_`, `module`, "
+"`flavors`, `build`, `run`, `env`"
+msgstr ""
+"Возможные аргументы: (нет), `_XY_`, `_XY_+`, `-_XY_`, `_XY_-_ZA_`, `module`, "
+"`flavors`, `build`, `run`, `env`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1708
+msgid ""
+"Adds a dependency on Lua. By default this is a library dependency, unless "
+"overridden by the `build` and/or `run` option. The `env` option prevents "
+"the addition of any dependency, while still defining all the usual variables."
+msgstr ""
+"Добавляет зависимость от Lua. По умолчанию это зависимость от библиотеки, "
+"если не переопределено опциями `build` и/или `run`. Опция `env` "
+"предотвращает добавление любой зависимости, при этом все обычные переменные "
+"остаются определенными."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1710
+msgid ""
+"The default version is set by the usual `DEFAULT_VERSIONS` mechanism, unless "
+"a version or range of versions is specified as an argument, for example, "
+"`51` or `51-54`."
+msgstr ""
+"Версия по умолчанию устанавливается с помощью обычного механизма "
+"`DEFAULT_VERSIONS`, если только версия или диапазон версий не указаны в "
+"качестве аргумента, например, `51` или `51-54`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1713
+msgid ""
+"Applications using Lua are normally built for only a single Lua version. "
+"However, library modules intended to be loaded by Lua code should use the "
+"`module` option to build with multiple flavors."
+msgstr ""
+"Приложения, использующие Lua, обычно собираются только для одной версии Lua. "
+"Однако модули библиотек, предназначенные для загрузки кодом Lua, должны "
+"использовать опцию `module` для сборки с несколькими вариантами."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1715
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1734
+msgid "For more information see crossref:special[using-lua,Using Lua]."
+msgstr ""
+"Для получения дополнительной информации см. crossref:special[using-"
+"lua,Использование Lua]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1717
+#, no-wrap
+msgid "`luajit`"
+msgstr "`luajit`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1720
+msgid "Possible arguments: (none), `_X_`"
+msgstr "Возможные аргументы: (нет), `_X_`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1723
+msgid ""
+"Adds a dependency on luajit runtime. A specific version _X_ can be used. "
+"Possible versions are `luajit`, `luajit-devel`, `luajit-openresty`"
+msgstr ""
+"Добавляет зависимость от среды выполнения luajit. Можно указать конкретную "
+"версию _X_. Доступные версии: `luajit`, `luajit-devel`, `luajit-openresty`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1725
+msgid ""
+"After including [.filename]#bsd.port.options.mk# or "
+"[.filename]#bsd.port.pre.mk# the port can inspect these variables:"
+msgstr ""
+"После включения [.filename]#bsd.port.options.mk# или "
+"[.filename]#bsd.port.pre.mk# порт может проверять эти переменные:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1726
+#, no-wrap
+msgid "`LUAJIT_VER`"
+msgstr "`LUAJIT_VER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1728
+msgid "The selected luajit version"
+msgstr "Выбранная версия luajit"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1728
+#, no-wrap
+msgid "`LUAJIT_INCDIR`"
+msgstr "`LUAJIT_INCDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1730
+msgid "The path to luajit's header files"
+msgstr "Путь к заголовочным файлам luajit"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1730
+#, no-wrap
+msgid "`LUAJIT_LUAVER`"
+msgstr "`LUAJIT_LUAVER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1732
+msgid "Which luajit spec version is selected (2.0 for luajit, else 2.1)"
+msgstr "Какой версии спецификации luajit выбрана (2.0 для luajit, иначе 2.1)"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1736
+#, no-wrap
+msgid "`lxqt`"
+msgstr "`lxqt`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1743
+msgid ""
+"Handle dependencies for the LXQt Desktop Environment. Use `USE_LXQT` to "
+"select the components needed for the port. See crossref:special[using-"
+"lxqt,Using LXQt] for more information."
+msgstr ""
+"Обработка зависимостей для рабочей среды LXQt. Используйте `USE_LXQT` для "
+"выбора необходимых компонентов для порта. Дополнительную информацию см. в "
+"разделе crossref:special[using-lxqt,Использование LXQt]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1745
+#, no-wrap
+msgid "`magick`"
+msgstr "`magick`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1748
+msgid "Possible arguments: (none), `_X_`, `build`, `nox11`, `run`, `test`"
+msgstr "Возможные аргументы: (нет), `_X_`, `build`, `nox11`, `run`, `test`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1753
+msgid ""
+"Add a library dependency on `ImageMagick`. A specific version _X_ can be "
+"used. Possible versions are `6` and `7` (default). `nox11` indicates that "
+"the `-nox11` version of the port is required. `build`, `run` and `test` add "
+"build-, run-time and test dependencies on ImageMagick."
+msgstr ""
+"Добавить зависимость библиотеки от `ImageMagick`. Можно указать конкретную "
+"версию _X_. Доступные версии: `6` и `7` (по умолчанию). `nox11` означает, "
+"что требуется версия порта `-nox11`. `build`, `run` и `test` добавляют "
+"зависимости на сборку, выполнение и тестирование для ImageMagick."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1755
+#, no-wrap
+msgid "`makeinfo`"
+msgstr "`makeinfo`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1760
+msgid ""
+"Add a build-time dependency on `makeinfo` if it is not present in the base "
+"system."
+msgstr ""
+"Добавить зависимость во время сборки на `makeinfo`, если его нет в базовой "
+"системе."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1762
+#, no-wrap
+msgid "`makeself`"
+msgstr "`makeself`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1767
+msgid ""
+"Indicates that the distribution files are makeself archives and sets the "
+"appropriate dependencies."
+msgstr ""
+"Указывает, что файлы дистрибутива являются архивами makeself и устанавливает "
+"соответствующие зависимости."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1769
+#, no-wrap
+msgid "`mate`"
+msgstr "`mate`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1776
+msgid ""
+"Provides an easy way to depend on MATE components. The components should be "
+"listed in `USE_MATE`. The available components are:"
+msgstr ""
+"Предоставляет простой способ зависимостей от компонентов MATE. Компоненты "
+"должны быть перечислены в `USE_MATE`. Доступные компоненты:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1778
+msgid "`autogen`"
+msgstr "`autogen`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1779
+msgid "`caja`"
+msgstr "`caja`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1780
+msgid "`common`"
+msgstr "`common`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1781
+msgid "`controlcenter`"
+msgstr "`controlcenter`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1782
+msgid "`desktop`"
+msgstr "`desktop`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1783
+msgid "`dialogs`"
+msgstr "`dialogs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1784
+msgid "`docutils`"
+msgstr "`docutils`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1785
+msgid "`icontheme`"
+msgstr "`icontheme`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1788
+msgid "`libmatekbd`"
+msgstr "`libmatekbd`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1789
+msgid "`libmateweather`"
+msgstr "`libmateweather`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1790
+msgid "`marco`"
+msgstr "`marco`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1791
+msgid "`menus`"
+msgstr "`menus`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1792
+msgid "`notificationdaemon`"
+msgstr "`notificationdaemon`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1793
+msgid "`panel`"
+msgstr "`panel`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1794
+msgid "`pluma`"
+msgstr "`pluma`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1795
+msgid "`polkit`"
+msgstr "`polkit`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1796
+msgid "`session`"
+msgstr "`session`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1797
+msgid "`settingsdaemon`"
+msgstr "`settingsdaemon`"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1805
+#, no-wrap
+msgid ""
+"USES=\t\tmate\n"
+"USE_MATE=\tmenus:build intlhack\n"
+msgstr ""
+"USES=\t\tmate\n"
+"USE_MATE=\tmenus:build intlhack\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1808
+#, no-wrap
+msgid "`meson`"
+msgstr "`meson`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1814
+msgid ""
+"Provide support for Meson based projects. For more information see "
+"crossref:special[using-meson,Using `meson`]."
+msgstr ""
+"Предоставить поддержку для проектов на основе Meson. Дополнительную "
+"информацию смотрите в crossref:special[using-meson,Использование `meson`]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1816
+#, no-wrap
+msgid "`metaport`"
+msgstr "`metaport`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1821
+msgid ""
+"Sets the following variables to make it easier to create a metaport: "
+"`MASTER_SITES`, `DISTFILES`, `EXTRACT_ONLY`, `NO_BUILD`, `NO_INSTALL`, "
+"`NO_MTREE`, `NO_ARCH`."
+msgstr ""
+"Устанавливает следующие переменные для упрощения создания метапорта: "
+"`MASTER_SITES`, `DISTFILES`, `EXTRACT_ONLY`, `NO_BUILD`, `NO_INSTALL`, "
+"`NO_MTREE`, `NO_ARCH`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1823
+#, no-wrap
+msgid "`minizip`"
+msgstr "`minizip`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1826
+msgid "Possible arguments: (none), `ng`"
+msgstr "Возможные аргументы: (отсутствуют), `ng`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1828
+msgid ""
+"Adds a library dependency on package:archivers/minizip[] or "
+"package:archivers/minizip-ng[] respectively."
+msgstr ""
+"Добавляет зависимость библиотеки от package:archivers/minizip[] или "
+"package:archivers/minizip-ng[] соответственно."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1830
+#, no-wrap
+msgid "`mlt`"
+msgstr "`mlt`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1833
+msgid "Possible arguments: `7`, `nodepend`"
+msgstr "Возможные аргументы: `7`, `nodepend`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1835
+msgid "Provide support for ports depending on package:multimedia/mlt7[]."
+msgstr "Обеспечить поддержку портов, зависящих от package:multimedia/mlt7[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1838
+msgid ""
+"If the `nodepend` argument is provided no library dependency is generated. "
+"This argument only makes sense for multimedia/mlt7* ports."
+msgstr ""
+"Если указан аргумент `nodepend`, зависимости от библиотек не создаются. Этот "
+"аргумент имеет смысл только для портов multimedia/mlt7*."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1840
+#, no-wrap
+msgid "`mysql`"
+msgstr "`mysql`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1843
+msgid ""
+"Possible arguments: (none), `_version_`, `client` (default), `server`, "
+"`embedded`"
+msgstr ""
+"Возможные аргументы: (отсутствуют), `_версия_`, `client` (по умолчанию), "
+"`server`, `embedded`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1852
+msgid ""
+"Provide support for MySQL If no version is given, try to find the current "
+"installed version. Fall back to the default version, MySQL-5.6. The "
+"possible versions are `55`, `55m`, `55p`, `56`, `56p`, `56w`, `57`, `57p`, "
+"`80`, `100m`, `101m`, and `102m`. The `m` and `p` suffixes are for the "
+"MariaDB and Percona variants of MySQL. `server` and `embedded` add a build- "
+"and run-time dependency on the MySQL server. When using `server` or "
+"`embedded`, add `client` to also add a dependency on "
+"[.filename]#libmysqlclient.so#. A port can set `IGNORE_WITH_MYSQL` if some "
+"versions are not supported."
+msgstr ""
+"Предоставить поддержку MySQL. Если версия не указана, попытаться определить "
+"установленную версию. В случае неудачи использовать версию по умолчанию, "
+"MySQL-5.6. Возможные версии: `55`, `55m`, `55p`, `56`, `56p`, `56w`, `57`, "
+"`57p`, `80`, `100m`, `101m` и `102m`. Суффиксы `m` и `p` обозначают флейворс "
+"MariaDB и Percona для MySQL. Параметры `server` и `embedded` добавляют "
+"зависимости во время сборки и выполнения на сервер MySQL. При использовании "
+"`server` или `embedded` добавьте `client`, чтобы также включить зависимость "
+"от [.filename]#libmysqlclient.so#. Порт может установить "
+"`IGNORE_WITH_MYSQL`, если некоторые версии не поддерживаются."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1854
+msgid "The framework sets `MYSQL_VER` to the detected MySQL version."
+msgstr "Фреймворк устанавливает `MYSQL_VER` в обнаруженную версию MySQL."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1856
+#, no-wrap
+msgid "`mono`"
+msgstr "`mono`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1859
+msgid "Possible arguments: (none), `nuget`"
+msgstr "Возможные аргументы: (отсутствуют), `nuget`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1861
+msgid ""
+"Adds a dependency on the Mono (currently only C#) framework by setting the "
+"appropriate dependencies."
+msgstr ""
+"Добавляет зависимость от фреймворка Mono (в настоящее время только C#), "
+"устанавливая соответствующие зависимости."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1865
+msgid ""
+"Specify `nuget` when the port uses nuget packages. `NUGET_DEPENDS` needs to "
+"be set with the names and versions of the nuget packages in the format "
+"`_name_=_version_`. An optional package origin can be added using "
+"`_name_=_version_:_origin_`."
+msgstr ""
+"Укажите `nuget`, если порт использует пакеты nuget. `NUGET_DEPENDS` должен "
+"содержать имена и версии пакетов nuget в формате `_имя_=_версия_`. Можно "
+"добавить необязательное расположение пакета (origin), используя "
+"`_имя_=_версия_:_ расположение _`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1867
+msgid ""
+"The helper target, `buildnuget`, will output the content of the "
+"`NUGET_DEPENDS` based on the provided [.filename]#packages.config#."
+msgstr ""
+"Вспомогательная цель `buildnuget` выведет содержимое `NUGET_DEPENDS` на "
+"основе предоставленного файла [.filename]#packages.config#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1869
+#, no-wrap
+msgid "`motif`"
+msgstr "`motif`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1878
+msgid ""
+"Uses package:x11-toolkits/open-motif[] as a library dependency. End users "
+"can set `WANT_LESSTIF` in [.filename]#make.conf# to use package:x11-toolkits/"
+"lesstif[] as dependency instead of package:x11-toolkits/open-motif[]. "
+"Similarly setting `WANT_OPEN_MOTIF_DEVEL` in [.filename]#make.conf# will add "
+"a dependency on package:x11-toolkits/open-motif-devel[]"
+msgstr ""
+"Использует package:x11-toolkits/open-motif[] как зависимость библиотеки. "
+"Конечные пользователи могут установить `WANT_LESSTIF` в "
+"[.filename]#make.conf#, чтобы использовать package:x11-toolkits/lesstif[] "
+"как зависимость вместо package:x11-toolkits/open-motif[]. Аналогично, "
+"установка `WANT_OPEN_MOTIF_DEVEL` в [.filename]#make.conf# добавит "
+"зависимость от package:x11-toolkits/open-motif-devel[]"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1880
+#, no-wrap
+msgid "`mpi`"
+msgstr "`mpi`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1883
+msgid "Possible arguments: `mpich` (default), `openmpi`"
+msgstr "Возможные аргументы: `mpich` (по умолчанию), `openmpi`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1885
+msgid "Provide support for ports depending on `MPI`."
+msgstr "Обеспечить поддержку портов, зависящих от `MPI`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1888
+msgid ""
+"If the `mpich` argument is provided a dependency on package:net/mpich[] is "
+"added to the port."
+msgstr ""
+"Если указан аргумент `mpich`, в порт добавляется зависимость от package:net/"
+"mpich[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1891
+msgid ""
+"If the `openmpi` argument is provided a dependency on package:net/openmpi[] "
+"is added to the port."
+msgstr ""
+"Если указан аргумент `openmpi`, в порт добавляется зависимость от "
+"package:net/openmpi[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1893
+msgid ""
+"The ports framework provides the following variables that can be read by the "
+"port:"
+msgstr ""
+"Фреймворк портов предоставляет следующие переменные, которые могут быть "
+"прочитаны портом:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1894
+#, no-wrap
+msgid "`MPI_LIBS`"
+msgstr "`MPI_LIBS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1896
+msgid "Libraries needed to link programs using `MPI`."
+msgstr ""
+"Библиотеки, необходимые для связывания программ с использованием `MPI`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1897
+#, no-wrap
+msgid "`MPI_CFLAGS`"
+msgstr "`MPI_CFLAGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1899
+msgid "Compiler flags necessary to build programs using `MPI`."
+msgstr ""
+"Флаги компилятора, необходимые для сборки программ с использованием `MPI`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1900
+#, no-wrap
+msgid "`MPICC`"
+msgstr "`MPICC`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1902
+msgid ""
+"Location of the `mpicc` executable. Default: [.filename]#${MPI_HOME}/bin/"
+"mpicc#."
+msgstr ""
+"Расположение исполняемого файла `mpicc`. По умолчанию: [.filename]#$"
+"{MPI_HOME}/bin/mpicc#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1903
+#, no-wrap
+msgid "`MPICXX`"
+msgstr "`MPICXX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1905
+msgid ""
+"Location of the `mpicxx` executable. Default: [.filename]#${MPI_HOME}/bin/"
+"mpicxx#."
+msgstr ""
+"Расположение исполняемого файла `mpicxx`. По умолчанию: [.filename]#$"
+"{MPI_HOME}/bin/mpicxx#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1906
+#, no-wrap
+msgid "`MPIF90`"
+msgstr "`MPIF90`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1908
+msgid ""
+"Location of the `mpif90` executable. Default: [.filename]#${MPI_HOME}/bin/"
+"mpif90#."
+msgstr ""
+"Расположение исполняемого файла `mpif90`. По умолчанию: [.filename]#$"
+"{MPI_HOME}/bin/mpif90#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1909
+#, no-wrap
+msgid "`MPIFC`"
+msgstr "`MPIFC`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1911
+msgid "Same as above."
+msgstr "То же, что и выше."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1912
+#, no-wrap
+msgid "`MPI_HOME`"
+msgstr "`MPI_HOME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1914
+msgid ""
+"Installation directory of `MPI`. Defaults to `${LOCALBASE}` for `MPICH`."
+msgstr ""
+"Каталог установки `MPI`. По умолчанию используется `${LOCALBASE}` для "
+"`MPICH`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1915
+#, no-wrap
+msgid "`MPIEXEC`"
+msgstr "`MPIEXEC`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1917
+msgid ""
+"Location of the `mpiexec` executable. Default: [.filename]#${MPI_HOME}/bin/"
+"mpiexec#."
+msgstr ""
+"Расположение исполняемого файла `mpiexec`. По умолчанию: [.filename]#$"
+"{MPI_HOME}/bin/mpiexec#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1918
+#, no-wrap
+msgid "`MPIRUN`"
+msgstr "`MPIRUN`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1920
+msgid ""
+"Location of the `mpirun` executable. Default: [.filename]#${MPI_HOME}/bin/"
+"mpirun#."
+msgstr ""
+"Расположение исполняемого файла `mpirun`. По умолчанию: [.filename]#$"
+"{MPI_HOME}/bin/mpirun#."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1923
+#, no-wrap
+msgid "`ncurses`"
+msgstr "`ncurses`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1926
+msgid "Possible arguments: (none), `base`, `port`"
+msgstr "Возможные аргументы: (нет), `base`, `port`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1928
+msgid "Uses ncurses, and causes some useful variables to be set."
+msgstr "Использует ncurses и устанавливает некоторые полезные переменные."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1930
+#, no-wrap
+msgid "`nextcloud`"
+msgstr "`nextcloud`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1935
+msgid ""
+"Adds support for Nextcloud applications by adding a run time dependency on "
+"package:www/nextcloud[]."
+msgstr ""
+"Добавляет поддержку приложений Nextcloud, добавляя зависимость во время "
+"выполнения на package:www/nextcloud[]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1937
+#, no-wrap
+msgid "`ninja`"
+msgstr "`ninja`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1940
+msgid "Possible arguments: (none), `build`, `make` (default), `run`"
+msgstr "Возможные аргументы: (нет), `build`, `make` (по умолчанию), `run`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1947
+msgid ""
+"If `build` or `run` arguments are specify, it respectively adds a build or "
+"run time dependency on package:devel/ninja[]. If `make` or no arguments are "
+"provided, use ninja to build the port instead of make. `make` implies "
+"`build`. If the variable `NINJA_DEFAULT` is set to `samurai`, then the "
+"dependencies are set on package:devel/samurai[] instead."
+msgstr ""
+"Если указаны аргументы `build` или `run`, это соответственно добавляет "
+"зависимость во время сборки или выполнения от пакета package:devel/ninja[]. "
+"Если указан `make` или аргументы не предоставлены, используется ninja для "
+"сборки порта вместо make. `make` подразумевает `build`. Если переменная "
+"`NINJA_DEFAULT` установлена в `samurai`, тогда зависимости устанавливаются "
+"для пакета package:devel/samurai[] вместо этого."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1949
+#, no-wrap
+msgid "`nodejs`"
+msgstr "`nodejs`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1953
+#, no-wrap
+msgid ""
+"Possible arguments: (none), `build`, `run`, `current`, `lts`, `10`, `14`, `16`,\n"
+" `17`.\n"
+msgstr ""
+"Возможные аргументы: (нет), `build`, `run`, `current`, `lts`, `10`, `14`, `16`,\n"
+" `17`.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1956
+msgid ""
+"Uses nodejs. Adds a dependency on package:www/node*[]. If a supported "
+"version is specified then `run` and/or `build` must be specified too."
+msgstr ""
+"Использует nodejs. Добавляет зависимость от пакета package:www/node*[]. Если "
+"указана поддерживаемая версия, то также необходимо указать `run` и/или "
+"`build`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1958
+#, no-wrap
+msgid "`objc`"
+msgstr "`objc`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1963
+msgid ""
+"Add objective C dependencies (compiler, runtime library) if the base system "
+"does not support it."
+msgstr ""
+"Добавить зависимости Objective C (компилятор, библиотека времени "
+"выполнения), если базовая система их не поддерживает."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1965
+#, no-wrap
+msgid "`ocaml`"
+msgstr "`ocaml`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1968
+msgid ""
+"Possible arguments: (none), "
+"`build`,`camlp4`,`dune`,`findlib`,`findplist`,`ldconfig`,`run`,`tk`,`tkbuild`,`tkrun`,`wash`"
+msgstr ""
+"Возможные аргументы: (нет), `build`, `camlp4`, `dune`, `findlib`, "
+"`findplist`, `ldconfig`, `run`, `tk`, `tkbuild`, `tkrun`, `wash`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1970
+msgid "Provide support for OCaml."
+msgstr "Обеспечить поддержку OCaml."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1972
+msgid "If no arguments are provided, it defaults to `build`, `run`."
+msgstr "Если аргументы не указаны, по умолчанию используются `build`, `run`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1975
+msgid ""
+"If the `build` argument is provided then package:lang/ocamlc[] is added to "
+"`BUILD_DEPENDS`, `EXTRACT` and `PATCH_DEPENDS`."
+msgstr ""
+"Если указан аргумент `build`, то package:lang/ocamlc[] добавляется в "
+"`BUILD_DEPENDS`, `EXTRACT` и `PATCH_DEPENDS`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1977
+msgid ""
+"If the `camlp4` argument is provided then package:devel/ocamlp4[] is used to "
+"build."
+msgstr ""
+"Если указан аргумент `camlp4`, то для сборки используется package:devel/"
+"ocamlp4[]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1979
+msgid ""
+"If the `dune` argument is provided then package:devel/ocaml-dune[] is used "
+"as build system."
+msgstr ""
+"Если указан аргумент `dune`, то package:devel/ocaml-dune[] используется как "
+"система сборки."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1981
+msgid ""
+"If the `findlib` argument is provided then `ocamlfind` will be used to "
+"install packages. Package directories will be automatically deleted."
+msgstr ""
+"Если указан аргумент `findlib`, то для установки пакетов будет "
+"использоваться `ocamlfind`. Директории пакетов будут автоматически удалены."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1983
+msgid ""
+"If the `findplist` argument is provided then contents of the `findlib` "
+"target directories will be added automatically."
+msgstr ""
+"Если указан аргумент `findplist`, то содержимое целевых каталогов `findlib` "
+"будет добавлено автоматически."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1988
+msgid ""
+"If the `ldconfig` argument is provided then OCaml's [.filename]#ld.conf# "
+"file will be automatically processed. When `dune` is used Dune may install "
+"stublibs in site-lib package directory(ies) or in a single directory below "
+"`DUNE_LIBDIR` site-lib directory. Set if your port installs shared "
+"libraries into ocaml"
+msgstr ""
+"Если указан аргумент `ldconfig`, то файл [.filename]#ld.conf# OCaml будет "
+"обработан автоматически. При использовании `dune` Dune может устанавливать "
+"stublibs в директориях пакетов site-lib или в отдельной директории ниже "
+"`DUNE_LIBDIR` site-lib. Установите, если ваш порт устанавливает общие "
+"библиотеки в ocaml"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1990
+msgid "If the `run` argument is provided add ocamlc to `RUN_DEPENDS`."
+msgstr "Если указан аргумент `run`, добавить ocamlc в `RUN_DEPENDS`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1994
+msgid ""
+"If the `tk` argument is provided then a build and run dependency on "
+"package:x11-toolkits/ocaml-labltk[] is added to the port. Implies `tkbuild` "
+"and `tkrun`."
+msgstr ""
+"Если указан аргумент `tk`, то в порт добавляется зависимость на сборку и "
+"выполнение от пакета package:x11-toolkits/ocaml-labltk[]. Подразумевает "
+"`tkbuild` и `tkrun`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:1997
+msgid ""
+"If the `tkbuild` argument is provided then package:x11-toolkits/ocaml-"
+"labltk[] is added to `BUILD_DEPENDS`, `EXTRACT` and `PATCH_DEPENDS`."
+msgstr ""
+"Если указан аргумент `tkbuild`, то пакет package:x11-toolkits/ocaml-labltk[] "
+"добавляется в `BUILD_DEPENDS`, `EXTRACT` и `PATCH_DEPENDS`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2000
+msgid ""
+"If the `tkrun` argument is provided then package:x11-toolkits/ocaml-labltk[] "
+"is added to `RUN_DEPENDS`."
+msgstr ""
+"Если указан аргумент `tkrun`, то package:x11-toolkits/ocaml-labltk[] "
+"добавляется в `RUN_DEPENDS`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2003
+msgid ""
+"If the `wash` argument is provided Ocaml's shared directories will be purged "
+"on uninstall. Useful when installing to non-standard `PREFIX`."
+msgstr ""
+"Если указан аргумент `wash`, общие каталоги Ocaml будут очищены при "
+"удалении. Полезно при установке в нестандартный `PREFIX`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2005
+msgid "The following variables can be set by the port:"
+msgstr "Портом могут быть установлены следующие переменные:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2006
+#, no-wrap
+msgid "`OCAML_PKGDIRS`"
+msgstr "`OCAML_PKGDIRS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2008
+msgid ""
+"Directories under site-lib to be processed if the `findlib` argument is "
+"specified. Default: `${PORTNAME}`"
+msgstr ""
+"Каталоги в site-lib для обработки, если указан аргумент `findlib`. По "
+"умолчанию: `${PORTNAME}`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2009
+#, no-wrap
+msgid "`OCAML_LDLIBS`"
+msgstr "`OCAML_LDLIBS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2012
+msgid ""
+"Directories under `PREFIX` to be automatically added/removed from "
+"[.filename]#ld.conf#. Default: `${OCAML_SITELIBDIR}/${PORTNAME}`"
+msgstr ""
+"Каталоги в `PREFIX`, которые будут автоматически добавлены/удалены из "
+"[.filename]#ld.conf#. По умолчанию: `${OCAML_SITELIBDIR}/${PORTNAME}`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2013
+#, no-wrap
+msgid "`OCAML_PACKAGES`"
+msgstr "`OCAML_PACKAGES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2015
+msgid "List of packages to build and install. Default to `${PORTNAME}`"
+msgstr "Список пакетов для сборки и установки. По умолчанию `${PORTNAME}`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2018
+#, no-wrap
+msgid "`octave`"
+msgstr "`octave`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2021
+msgid "Possible arguments: (none), env"
+msgstr "Возможные аргументы: (нет), env"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2024
+msgid ""
+"Uses package:math/octave[]. `env` loads only one `OCTAVE_VERSION` "
+"environmental variable."
+msgstr ""
+"Использует package:math/octave[]. `env` загружает только одну переменную "
+"окружения `OCTAVE_VERSION`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2029
+msgid "Possible arguments: `al`, `soft` (default), `si`, `alut`"
+msgstr "Возможные аргументы: `al`, `soft` (по умолчанию), `si`, `alut`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2034
+msgid ""
+"Uses OpenAL. The backend can be specified, with the software implementation "
+"as the default. The user can specify a preferred backend with "
+"`WANT_OPENAL`. Valid values for this knob are `soft` (default) and `si`."
+msgstr ""
+"Использует OpenAL. Бэкенд может быть указан, с программной реализацией по "
+"умолчанию. Пользователь может указать предпочтительный бэкенд с помощью "
+"`WANT_OPENAL`. Допустимые значения для этой настройки: `soft` (по умолчанию) "
+"и `si`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2036
+#, no-wrap
+msgid "`pathfix`"
+msgstr "`pathfix`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2043
+msgid ""
+"Look for [.filename]#Makefile.in# and [.filename]#configure# in "
+"`PATHFIX_WRKSRC` (defaults to `WRKSRC`) and fix common paths to make sure "
+"they respect the FreeBSD hierarchy. For example, it fixes the installation "
+"directory of `pkgconfig`'s [.filename]#.pc# files to [.filename]#${PREFIX}/"
+"libdata/pkgconfig#. If the port uses `USES=autoreconf`, "
+"[.filename]#Makefile.am# will be added to `PATHFIX_MAKEFILEIN` automatically."
+msgstr ""
+"Ищите [.filename]#Makefile.in# и [.filename]#configure# в `PATHFIX_WRKSRC` "
+"(по умолчанию `WRKSRC`) и исправляйте стандартные пути, чтобы они "
+"соответствовали иерархии FreeBSD. Например, исправляется каталог установки "
+"для файлов [.filename]#.pc# `pkgconfig` на [.filename]#${PREFIX}/libdata/"
+"pkgconfig#. Если порт использует `USES=autoreconf`, [.filename]#Makefile.am# "
+"будет автоматически добавлен в `PATHFIX_MAKEFILEIN`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2046
+msgid ""
+"If the port crossref:uses[uses-cmake,`USES=cmake`] it will look for "
+"[.filename]#CMakeLists.txt# in `PATHFIX_WRKSRC`. If needed, that default "
+"filename can be changed with `PATHFIX_CMAKELISTSTXT`."
+msgstr ""
+"Если порт crossref:uses[uses-cmake,`USES=cmake`], он будет искать файл "
+"[.filename]#CMakeLists.txt# в `PATHFIX_WRKSRC`. При необходимости это имя "
+"файла по умолчанию можно изменить с помощью `PATHFIX_CMAKELISTSTXT`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2048
+#, no-wrap
+msgid "`pear`"
+msgstr "`pear`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2051
+msgid "Possible arguments: `env`"
+msgstr "Возможные аргументы: `env`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2056
+msgid ""
+"Adds a dependency on package:devel/pear[]. It will setup default behavior "
+"for software using the PHP Extension and Application Repository. Using the "
+"`env` arguments only sets up the PEAR environment variables. See "
+"crossref:special[php-pear,PEAR Modules] for more information."
+msgstr ""
+"Добавляет зависимость от пакета package:devel/pear[]. Настраивает поведение "
+"по умолчанию для программного обеспечения, использующего PHP Extension and "
+"Application Repository. Использование аргументов `env` только устанавливает "
+"переменные окружения PEAR. Дополнительную информацию см. в "
+"crossref:special[php-pear,Модули PEAR]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2058
+#, no-wrap
+msgid "`perl5`"
+msgstr "`perl5`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2063
+msgid "Depends on Perl. The configuration is done using `USE_PERL5`."
+msgstr "Зависит от Perl. Настройка выполняется с помощью `USE_PERL5`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2065
+msgid ""
+"`USE_PERL5` can contain the phases in which to use Perl, can be `extract`, "
+"`patch`, `build`, `run`, or `test`."
+msgstr ""
+"`USE_PERL5` может содержать фазы, в которых используется Perl: `extract`, "
+"`patch`, `build`, `run` или `test`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2068
+msgid ""
+"`USE_PERL5` can also contain `configure`, `modbuild`, or `modbuildtiny` when "
+"[.filename]#Makefile.PL#, [.filename]#Build.PL#, or Module::Build::Tiny's "
+"flavor of [.filename]#Build.PL# is required."
+msgstr ""
+"`USE_PERL5` также может содержать `configure`, `modbuild` или "
+"`modbuildtiny`, если требуется [.filename]#Makefile.PL#, "
+"[.filename]#Build.PL# или вариант [.filename]#Build.PL# для "
+"Module::Build::Tiny."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2071
+msgid ""
+"`USE_PERL5` defaults to `build run`. When using `configure`, `modbuild`, or "
+"`modbuildtiny`, `build` and `run` are implied."
+msgstr ""
+"`USE_PERL5` по умолчанию имеет значение `build run`. При использовании "
+"`configure`, `modbuild` или `modbuildtiny`, `build` и `run` подразумеваются "
+"автоматически."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2073
+msgid "See crossref:special[using-perl,Using Perl] for more information."
+msgstr ""
+"См. crossref:special[using-perl,Использование Perl] для получения "
+"дополнительной информации."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2075
+#, no-wrap
+msgid "`pgsql`"
+msgstr "`pgsql`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2078
+msgid "Possible arguments: (none), `_X.Y_`, `_X.Y_+`, `_X.Y_-`, `_X.Y_-_Z.A_`"
+msgstr "Возможные аргументы: (нет), `_X.Y_`, `_X.Y_+`, `_X.Y_-`, `_X.Y_-_Z.A_`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2082
+msgid ""
+"Provide support for PostgreSQL. Port maintainer can set version required. "
+"Minimum and maximum versions or a range can be specified; for example, `9.0-"
+"`, `8.4+`, `8.4-9.2.`"
+msgstr ""
+"Предоставить поддержку PostgreSQL. Ответственный за порт может указать "
+"требуемую версию. Можно указать минимальную и максимальную версии или "
+"диапазон; например, `9.0-`, `8.4+`, `8.4-9.2`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2087
+msgid ""
+"By default, the added dependency will be the client, but if the port "
+"requires additional components, this can be done using "
+"`WANT_PGSQL=_component[:target]_`; for example, `WANT_PGSQL=server:configure "
+"pltcl plperl`. The available components are:"
+msgstr ""
+"По умолчанию добавляемая зависимость будет клиентской, но если порту "
+"требуются дополнительные компоненты, это можно указать с помощью "
+"`WANT_PGSQL=_компонент[:цель]_`; например, `WANT_PGSQL=server:configure "
+"pltcl plperl`. Доступные компоненты:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2089
+msgid "`client`"
+msgstr "`client`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2090
+msgid "`contrib`"
+msgstr "`contrib`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2091
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2823
+msgid "`docs`"
+msgstr "`docs`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2092
+msgid "`pgtcl`"
+msgstr "`pgtcl`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2093
+msgid "`plperl`"
+msgstr "`plperl`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2094
+msgid "`plpython`"
+msgstr "`plpython`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2095
+msgid "`pltcl`"
+msgstr "`pltcl`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2096
+msgid "`server`"
+msgstr "`server`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2098
+#, no-wrap
+msgid "`php`"
+msgstr "`php`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2101
+msgid ""
+"Possible arguments: (none), `phpize`, `ext`, `zend`, `build`, `cli`, `cgi`, "
+"`mod`, `web`, `embed`, `pecl`, `flavors`, `noflavors`"
+msgstr ""
+"Возможные аргументы: (нет), `phpize`, `ext`, `zend`, `build`, `cli`, `cgi`, "
+"`mod`, `web`, `embed`, `pecl`, `flavors`, `noflavors`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2104
+msgid ""
+"Provide support for PHP. Add a runtime dependency on the default PHP "
+"version, package:lang/php81[]."
+msgstr ""
+"Обеспечить поддержку PHP. Добавить зависимость во время выполнения на версию "
+"PHP по умолчанию, package:lang/php81[]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2105
+#, no-wrap
+msgid "`phpize`"
+msgstr "`phpize`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2108
+msgid "Use to build a PHP extension. Enables flavors."
+msgstr "Используется для создания расширения PHP. Поддерживает флейворы."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2109
+#, no-wrap
+msgid "`ext`"
+msgstr "`ext`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2112
+msgid "Use to build, install and register a PHP extension. Enables flavors."
+msgstr ""
+"Используется для сборки, установки и регистрации расширения PHP. "
+"Поддерживает флейворы."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2113
+#, no-wrap
+msgid "`zend`"
+msgstr "`zend`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2116
+msgid "Use to build, install and register a Zend extension. Enables flavors."
+msgstr ""
+"Используется для сборки, установки и регистрации Zend-расширения. "
+"Поддерживает флейворы."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2117
+#, no-wrap
+msgid "`build`"
+msgstr "`build`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2119
+msgid "Set PHP also as a build-time dependency."
+msgstr "Установить PHP также как зависимость во время сборки."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2120
+#, no-wrap
+msgid "`cli`"
+msgstr "`cli`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2122
+msgid "Needs the CLI version of PHP."
+msgstr "Требуется версия PHP для командной строки."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2123
+#, no-wrap
+msgid "`cgi`"
+msgstr "`cgi`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2125
+msgid "Needs the CGI version of PHP."
+msgstr "Требуется CGI-версия PHP."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2126
+#, no-wrap
+msgid "`mod`"
+msgstr "`mod`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2128
+msgid "Needs the Apache module for PHP."
+msgstr "Требуется модуль Apache для PHP."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2129
+#, no-wrap
+msgid "`web`"
+msgstr "`web`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2131
+msgid "Needs the Apache module or the CGI version of PHP."
+msgstr "Требуется модуль Apache или CGI-версия PHP."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2132
+#, no-wrap
+msgid "`embed`"
+msgstr "`embed`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2134
+msgid "Needs the embedded library version of PHP."
+msgstr "Требуется встроенная версия библиотеки PHP."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2135
+#, no-wrap
+msgid "`pecl`"
+msgstr "`pecl`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2138
+msgid ""
+"Provide defaults for fetching PHP extensions from the PECL repository. "
+"Enables flavors."
+msgstr ""
+"Установить значения по умолчанию для загрузки расширений PHP из репозитория "
+"PECL. Включает флейворы."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2139
+#, no-wrap
+msgid "`flavors`"
+msgstr "`flavors`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2143
+msgid ""
+"Enable automatic crossref:flavors[flavors-auto-php,PHP flavors] generation. "
+"Flavors will be generated for all PHP versions, except the ones present in "
+"crossref:uses[uses-php-ignore,`IGNORE_WITH_PHP`]."
+msgstr ""
+"Включить автоматическую генерацию crossref:flavors[flavors-auto-"
+"php,флейворов PHP]. Флейворы будут созданы для всех версий PHP, за "
+"исключением указанных в crossref:uses[uses-php-ignore,`IGNORE_WITH_PHP`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2144
+#, no-wrap
+msgid "`noflavors`"
+msgstr "`noflavors`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2147
+msgid ""
+"Disable automatic PHP flavors generation. _Must only_ be used with "
+"extensions provided by PHP itself."
+msgstr ""
+"Отключить автоматическое создание флейворов PHP. _Должно_ использоваться "
+"только с расширениями, предоставляемыми самим PHP."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2149
+msgid ""
+"Variables are used to specify which PHP modules are required, as well as "
+"which version of PHP are supported."
+msgstr ""
+"Переменные используются для указания необходимых модулей PHP, а также версий "
+"PHP, которые поддерживаются."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2150
+#, no-wrap
+msgid "`USE_PHP`"
+msgstr "`USE_PHP`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2154
+msgid ""
+"The list of required PHP extensions at run-time. Add `:build` to the "
+"extension name to add a build-time dependency. Example: `pcre xml:build "
+"gettext`"
+msgstr ""
+"Список необходимых расширений PHP во время выполнения. Добавьте `:build` к "
+"названию расширения, чтобы указать зависимость во время сборки. Пример: "
+"`pcre xml:build gettext`"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2156
+#, no-wrap
+msgid "`IGNORE_WITH_PHP`"
+msgstr "`IGNORE_WITH_PHP`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2159
+msgid ""
+"The port does not work with PHP of the given version. For possible values "
+"look at the content of `_ALL_PHP_VERSIONS` in [.filename]#Mk/Uses/php.mk#."
+msgstr ""
+"Порт не работает с PHP указанной версии. Возможные значения можно посмотреть "
+"в содержимом `_ALL_PHP_VERSIONS` в [.filename]#Mk/Uses/php.mk#."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2161
+msgid ""
+"When building a PHP or Zend extension with `:ext` or `:zend`, these "
+"variables can be set:"
+msgstr ""
+"При сборке расширения PHP или Zend с помощью `:ext` или `:zend`, можно "
+"задать следующие переменные:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2162
+#, no-wrap
+msgid "`PHP_MODNAME`"
+msgstr "`PHP_MODNAME`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2165
+msgid "The name of the PHP or Zend extension. Default value is `${PORTNAME}`."
+msgstr "Имя расширения PHP или Zend. Значение по умолчанию: `${PORTNAME}`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2166
+#, no-wrap
+msgid "`PHP_HEADER_DIRS`"
+msgstr "`PHP_HEADER_DIRS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2169
+msgid ""
+"A list of subdirectories from which to install header files. The framework "
+"will always install the header files that are present in the same directory "
+"as the extension."
+msgstr ""
+"Список подкаталогов, из которых следует устанавливать заголовочные файлы. "
+"Фреймворк всегда будет устанавливать заголовочные файлы, находящиеся в том "
+"же каталоге, что и расширение."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2170
+#, no-wrap
+msgid "`PHP_MOD_PRIO`"
+msgstr "`PHP_MOD_PRIO`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2173
+msgid ""
+"The priority at which to load the extension. It is a number between `00` "
+"and `99`."
+msgstr "Приоритет загрузки расширения. Это число от `00` до `99`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2178
+msgid ""
+"For extensions that do not depend on any extension, the priority is "
+"automatically set to `20`, for extensions that depend on another extension, "
+"the priority is automatically set to `30`. Some extensions may need to be "
+"loaded before every other extension, for example package:www/php56-"
+"opcache[]. Some may need to be loaded after an extension with a priority of "
+"`30`. In that case, add `PHP_MOD_PRIO=_XX_` in the port's Makefile. For "
+"example:"
+msgstr ""
+"Для расширений, которые не зависят от других расширений, приоритет "
+"автоматически устанавливается в `20`, а для расширений, зависящих от другого "
+"расширения, приоритет автоматически устанавливается в `30`. Некоторые "
+"расширения могут требовать загрузки перед всеми остальными, например, "
+"package:www/php56-opcache[]. Некоторые могут требовать загрузки после "
+"расширения с приоритетом `30`. В таком случае добавьте `PHP_MOD_PRIO=_XX_` в "
+"Makefile порта. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2184
+#, no-wrap
+msgid ""
+"USES=\t\tphp:ext\n"
+"USE_PHP=\twddx\n"
+"PHP_MOD_PRIO=\t40\n"
+msgstr ""
+"USES=\t\tphp:ext\n"
+"USE_PHP=\twddx\n"
+"PHP_MOD_PRIO=\t40\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2187
+msgid ""
+"These variables are available to use in `PKGNAMEPREFIX` or `PKGNAMESUFFIX`:"
+msgstr ""
+"Эти переменные доступны для использования в `PKGNAMEPREFIX` или "
+"`PKGNAMESUFFIX`:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2188
+#, no-wrap
+msgid "`PHP_PKGNAMEPREFIX`"
+msgstr "`PHP_PKGNAMEPREFIX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2191
+msgid ""
+"Contains `php_XY_-` where _XY_ is the current flavor's PHP version. Use "
+"with PHP extensions and modules."
+msgstr ""
+"Содержит `php_XY_-`, где _XY_ — версия PHP текущей редакции. Используется с "
+"расширениями и модулями PHP."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2192
+#, no-wrap
+msgid "`PHP_PKGNAMESUFFIX`"
+msgstr "`PHP_PKGNAMESUFFIX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2195
+msgid ""
+"Contains `-php_XY_` where _XY_ is the current flavor's PHP version. Use "
+"with PHP applications."
+msgstr ""
+"Содержит `-php_XY_`, где _XY_ — версия PHP текущего варианта. Используется с "
+"PHP-приложениями."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2196
+#, no-wrap
+msgid "`PECL_PKGNAMEPREFIX`"
+msgstr "`PECL_PKGNAMEPREFIX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2199
+msgid ""
+"Contains `php_XY_-pecl-` where _XY_ is the current flavor's PHP version. "
+"Use with PECL modules."
+msgstr ""
+"Содержит `php_XY_-pecl-`, где _XY_ — версия PHP текущей редакции. "
+"Используется с модулями PECL."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2204
+msgid ""
+"With flavors, all PHP extensions, PECL extensions, PEAR modules _must have_ "
+"a different package name, so they must all use one of these three variables "
+"in their `PKGNAMEPREFIX` or `PKGNAMESUFFIX`."
+msgstr ""
+"С вариантами сборки все расширения PHP, расширения PECL, модули PEAR _должны "
+"иметь_ разные имена пакетов, поэтому они должны использовать одну из трёх "
+"переменных в `PKGNAMEPREFIX` или `PKGNAMESUFFIX`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2207
+#, no-wrap
+msgid "`pkgconfig`"
+msgstr "`pkgconfig`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2210
+msgid "Possible arguments: (none), `build` (default), `run`, `both`"
+msgstr ""
+"Возможные аргументы: (отсутствуют), `build` (по умолчанию), `run`, `both`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2214
+msgid ""
+"Uses package:devel/pkgconf[]. With no arguments or with the `build` "
+"argument, it implies `pkg-config` as a build-time dependency. `run` implies "
+"a run-time dependency and `both` implies both run-time and build-time "
+"dependencies."
+msgstr ""
+"Использует package:devel/pkgconf[]. Без аргументов или с аргументом `build` "
+"подразумевает зависимость от `pkg-config` во время сборки. `run` "
+"подразумевает зависимость во время выполнения, а `both` — зависимости как во "
+"время выполнения, так и во время сборки."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2216
+#, no-wrap
+msgid "`pure`"
+msgstr "`pure`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2219
+msgid "Possible arguments: (none), `ffi`"
+msgstr "Возможные аргументы: (нет), `ffi`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2223
+msgid ""
+"Uses package:lang/pure[]. Largely used for building related pure ports. "
+"With the `ffi` argument, it implies package:devel/pure-ffi[] as a run-time "
+"dependency."
+msgstr ""
+"Использует package:lang/pure[]. В основном применяется для сборки портов, "
+"зависящих от pure. С аргументом `ffi` подразумевает package:devel/pure-ffi[] "
+"как зависимость во время выполнения."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2225
+#, no-wrap
+msgid "`pyqt`"
+msgstr "`pyqt`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2228
+msgid "Possible arguments: (none), `4`, `5`"
+msgstr "Возможные аргументы: (нет), `4`, `5`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2232
+msgid ""
+"Uses PyQt. If the port is part of PyQT itself, set `PYQT_DIST`. Use "
+"`USE_PYQT` to select the components the port needs. The available "
+"components are:"
+msgstr ""
+"Использует PyQt. Если порт является частью самого PyQT, установите "
+"`PYQT_DIST`. Используйте `USE_PYQT` для выбора необходимых порту "
+"компонентов. Доступные компоненты:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2234
+msgid "`core`"
+msgstr "`core`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2235
+msgid "`dbus`"
+msgstr "`dbus`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2236
+msgid "`dbussupport`"
+msgstr "`dbussupport`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2237
+msgid "`demo`"
+msgstr "`demo`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2238
+msgid "`designer`"
+msgstr "`designer`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2239
+msgid "`designerplugin`"
+msgstr "`designerplugin`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2240
+msgid "`doc`"
+msgstr "`doc`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2241
+msgid "`gui`"
+msgstr "`gui`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2242
+msgid "`multimedia`"
+msgstr "`multimedia`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2243
+msgid "`network`"
+msgstr "`network`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2245
+msgid "`qscintilla2`"
+msgstr "`qscintilla2`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2246
+msgid "`sip`"
+msgstr "`sip`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2247
+msgid "`sql`"
+msgstr "`sql`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2248
+msgid "`svg`"
+msgstr "`svg`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2249
+msgid "`test`"
+msgstr "`test`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2250
+msgid "`webkit`"
+msgstr "`webkit`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2251
+msgid "`xml`"
+msgstr "`xml`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2252
+msgid "`xmlpatterns`"
+msgstr "`xmlpatterns`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2254
+msgid "These components are only available with PyQT4:"
+msgstr "Эти компоненты доступны только с PyQT4:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2256
+msgid "`assistant`"
+msgstr "`assistant`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2257
+msgid "`declarative`"
+msgstr "`declarative`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2258
+msgid "`help`"
+msgstr "`help`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2259
+msgid "`phonon`"
+msgstr "`phonon`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2260
+msgid "`script`"
+msgstr "`script`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2261
+msgid "`scripttools`"
+msgstr "`scripttools`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2263
+msgid "These components are only available with PyQT5:"
+msgstr "Эти компоненты доступны только с PyQT5:"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2265
+msgid "`multimediawidgets`"
+msgstr "`multimediawidgets`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2266
+msgid "`printsupport`"
+msgstr "`printsupport`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2267
+msgid "`qml`"
+msgstr "`qml`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2268
+msgid "`serialport`"
+msgstr "`serialport`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2269
+msgid "`webkitwidgets`"
+msgstr "`webkitwidgets`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2270
+msgid "`widgets`"
+msgstr "`widgets`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2272
+msgid ""
+"The default dependency for each component is build- and run-time, to select "
+"only build or run, add `_build` or `_run` to the component name. For example:"
+msgstr ""
+"Зависимость по умолчанию для каждого компонента — это время сборки и "
+"выполнения. Чтобы выбрать только сборку или выполнение, добавьте `_build` "
+"или `_run` к имени компонента. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2277
+#, no-wrap
+msgid ""
+"USES=\t\tpyqt\n"
+"USE_PYQT=\tcore doc_build designer_run\n"
+msgstr ""
+"USES=\t\tpyqt\n"
+"USE_PYQT=\tcore doc_build designer_run\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2280
+#, no-wrap
+msgid "`pytest`"
+msgstr "`pytest`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2283
+msgid "Possible arguments: (none), 4"
+msgstr "Возможные аргументы: (нет), 4"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2290
+msgid ""
+"Introduces a new dependency on package:devel/pytest[]. It defines a `do-"
+"test` target which will run the tests properly. Use the argument to depend "
+"on a specific package:devel/pytest[] version. For ports using package:devel/"
+"pytest[] consider using this instead of a specific `do-test` target. The "
+"framework exposes the following variables to the port:"
+msgstr ""
+"Вводит новую зависимость от package:devel/pytest[]. Он определяет цель `do-"
+"test`, которая будет правильно запускать тесты. Используйте аргумент, чтобы "
+"зависеть от определённой версии package:devel/pytest[]. Для портов, "
+"использующих package:devel/pytest[], рекомендуется использовать это вместо "
+"конкретной цели `do-test`. Фреймворк предоставляет порту следующие "
+"переменные:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2291
+#, no-wrap
+msgid "`PYTEST_ARGS`"
+msgstr "`PYTEST_ARGS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2293
+msgid "Additional arguments to pytest (defaults to empty)."
+msgstr "Дополнительные аргументы для pytest (по умолчанию пусто)."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2294
+#, no-wrap
+msgid "`PYTEST_IGNORED_TESTS`"
+msgstr "`PYTEST_IGNORED_TESTS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2297
+msgid ""
+"lists of `pytest -k` patterns of tests to ignore (defaults to empty). For "
+"tests which are not expected to pass, such as ones requiring a database "
+"access."
+msgstr ""
+"списки шаблонов `pytest -k` для игнорирования тестов (по умолчанию пустые). "
+"Для тестов, которые не должны проходить, например, требующих доступа к базе "
+"данных."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2298
+#, no-wrap
+msgid "`PYTEST_BROKEN_TESTS`"
+msgstr "`PYTEST_BROKEN_TESTS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2301
+msgid ""
+"lists of `pytest -k` patterns of tests to ignore (defaults to empty). For "
+"broken tests which require fixing."
+msgstr ""
+"списки шаблонов `pytest -k` тестов для игнорирования (по умолчанию пустые). "
+"Для сломанных тестов, которые требуют исправления."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2303
+msgid "In addition the following variables may be set by the user:"
+msgstr "В дополнение следующие переменные могут быть заданы пользователем:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2304
+#, no-wrap
+msgid "`PYTEST_ENABLE_IGNORED_TESTS`"
+msgstr "`PYTEST_ENABLE_IGNORED_TESTS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2306
+msgid "Enable tests which are otherwise ignored by `PYTEST_IGNORED_TESTS`."
+msgstr ""
+"Включить тесты, которые в противном случае игнорируются "
+"`PYTEST_IGNORED_TESTS`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2307
+#, no-wrap
+msgid "`PYTEST_ENABLE_BROKEN_TESTS`"
+msgstr "`PYTEST_ENABLE_BROKEN_TESTS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2309
+msgid "Enable tests which are otherwise ignored by `PYTEST_BROKEN_TESTS`."
+msgstr ""
+"Включить тесты, которые в противном случае игнорируются "
+"`PYTEST_BROKEN_TESTS`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2310
+#, no-wrap
+msgid "`PYTEST_ENABLE_ALL_TESTS`"
+msgstr "`PYTEST_ENABLE_ALL_TESTS`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2313
+msgid ""
+"Enable tests which are otherwise ignored by `PYTEST_IGNORED_TESTS` and "
+"`PYTEST_BROKEN_TESTS`."
+msgstr ""
+"Включить тесты, которые в противном случае игнорируются "
+"`PYTEST_IGNORED_TESTS` и `PYTEST_BROKEN_TESTS`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2316
+#, no-wrap
+msgid "`python`"
+msgstr "`python`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2319
+msgid ""
+"Possible arguments: (none), `_X.Y_`, `_X.Y+_`, `_-X.Y_`, `_X.Y-Z.A_`, "
+"`patch`, `build`, `run`, `test`"
+msgstr ""
+"Возможные аргументы: (нет), `_X.Y_`, `_X.Y+_`, `_-X.Y_`, `_X.Y-Z.A_`, "
+"`patch`, `build`, `run`, `test`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2324
+msgid ""
+"Uses Python. A supported version or version range can be specified. If "
+"Python is only needed at build time, run time or for the tests, it can be "
+"set as a build, run or test dependency with `build`, `run`, or `test`. If "
+"Python is also needed during the patch phase, use `patch`. See "
+"crossref:special[using-python, Using Python] for more information."
+msgstr ""
+"Использует Python. Можно указать поддерживаемую версию или диапазон версий. "
+"Если Python требуется только во время сборки, выполнения или тестирования, "
+"его можно установить как зависимость для сборки, выполнения или тестирования "
+"с помощью `build`, `run` или `test`. Если Python также требуется на этапе "
+"исправлений, используйте `patch`. Дополнительную информацию см. в разделе "
+"crossref:special[using-python,Использование Python]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2327
+msgid ""
+"`USES=python:env` can be used when the variables exported by the framework "
+"are needed but a dependency on Python is not. It can happen when using with "
+"crossref:uses[uses-shebangfix,`USES=shebangfix`], and the goal is only to "
+"fix the shebangs but not add a dependency on Python."
+msgstr ""
+"`USES=python:env` можно использовать, когда необходимы переменные, "
+"экспортируемые фреймворком, но зависимость от Python не требуется. Это может "
+"быть полезно при использовании с crossref:uses[uses-"
+"shebangfix,`USES=shebangfix`], если цель состоит только в исправлении "
+"shebang без добавления зависимости от Python."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2329
+#, no-wrap
+msgid "`qmail`"
+msgstr "`qmail`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2332
+msgid "Possible arguments: (none), `build`, `run`, `both`, `vars`"
+msgstr "Возможные аргументы: (нет), `build`, `run`, `both`, `vars`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2337
+msgid ""
+"Uses package:mail/qmail[]. With the `build` argument, it implies `qmail` as "
+"a build-time dependency. `run` implies a run-time dependency. Using no "
+"argument or the `both` argument implies both run-time and build-time "
+"dependencies. `vars` will only set QMAIL variables for the port to use."
+msgstr ""
+"Использует package:mail/qmail[]. С аргументом `build` подразумевается "
+"зависимость от `qmail` во время сборки. Аргумент `run` подразумевает "
+"зависимость во время выполнения. Использование без аргументов или с "
+"аргументом `both` подразумевает зависимости как во время выполнения, так и "
+"во время сборки. Аргумент `vars` только устанавливает переменные QMAIL для "
+"использования в порте."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2339
+#, no-wrap
+msgid "`qmake`"
+msgstr "`qmake`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2342
+msgid ""
+"Possible arguments: (none), `norecursive`, `outsource`, `no_env`, "
+"`no_configure`"
+msgstr ""
+"Возможные аргументы: (отсутствуют), `norecursive`, `outsource`, `no_env`, "
+"`no_configure`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2344
+msgid ""
+"Uses QMake for configuring. For more information see crossref:special[using-"
+"qmake,Using `qmake`]."
+msgstr ""
+"Использует QMake для настройки. Для получения дополнительной информации см. "
+"crossref:special[using-qmake,Использование `qmake`]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2349
+msgid "Possible arguments: `5`, `6`, `no_env`"
+msgstr "Возможные аргументы: `5`, `6`, `no_env`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2353
+msgid ""
+"Add dependency on Qt components. `no_env` is passed directly to `USES= "
+"qmake`. See crossref:special[using-qt,Using Qt] for more information."
+msgstr ""
+"Добавить зависимость от компонентов Qt. `no_env` передаётся напрямую в "
+"`USES= qmake`. Подробнее см. в crossref:special[using-qt,Использование Qt]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2355
+#, no-wrap
+msgid "`qt-dist`"
+msgstr "`qt-dist`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2358
+#, fuzzy
+#| msgid ""
+#| "Possible arguments: (none) or `5` and (none) or `6` and (none) or one of "
+#| "`3d`, `5compat`, `base`, `charts`, `connectivity`, `datavis3d`, "
+#| "`declarative`, `doc` `languageserver`, `gamepad`, `graphicaleffects`, "
+#| "`imageformats`, `locat ion`, `lottie`, `multimedia`, `networkauth`, "
+#| "`positioning`, `quick3d`, `quickcontrols2`, `quickcontrols`, "
+#| "`quicktimeline`, `remoteobjects`, `script`, `scxml `, `sensors`, "
+#| "`serialbus`, `serialport`, `shadertools`, `speech`, `svg`, `tools`, "
+#| "`translations`, `virtualkeyboard`, `wayland`, `webchannel`, `webengine`, "
+#| "`webglplugin`, `websockets`, `webview`, `x11extras`, `xmlpatterns`.\n"
+msgid ""
+"Possible arguments: (none) or `5` and (none) or `6` and (none) or one of "
+"`3d`, `5compat`, `base`, `charts`, `connectivity`, `datavis3d`, "
+"`declarative`, `doc` `languageserver`, `gamepad`, `graphicaleffects`, "
+"`imageformats`, `locat ion`, `lottie`, `multimedia`, `networkauth`, "
+"`positioning`, `quick3d`, `quickcontrols2`, `quickcontrols`, "
+"`quicktimeline`, `remoteobjects`, `script`, `scxml `, `sensors`, "
+"`serialbus`, `serialport`, `shadertools`, `speech`, `svg`, `tools`, "
+"`translations`, `virtualkeyboard`, `wayland`, `webchannel`, `webengine`, "
+"`webglplugin`, `websockets`, `webview`, `x11extras`, `xmlpatterns`."
+msgstr ""
+"Возможные аргументы: (нет) или `5` и (нет) или `6` и (нет) или один из `3d`, "
+"`5compat`, `base`, `charts`, `connectivity`, `datavis3d`, `declarative`, "
+"`doc`, `languageserver`, `gamepad`, `graphicaleffects`, `imageformats`, "
+"`location`, `lottie`, `multimedia`, `networkauth`, `positioning`, `quick3d`, "
+"`quickcontrols2`, `quickcontrols`, `quicktimeline`, `remoteobjects`, "
+"`script`, `scxml`, `sensors`, `serialbus`, `serialport`, `shadertools`, "
+"`speech`, `svg`, `tools`, `translations`, `virtualkeyboard`, `wayland`, "
+"`webchannel`, `webengine`, `webglplugin`, `websockets`, `webview`, "
+"`x11extras`, `xmlpatterns`.\n"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2361
+msgid ""
+"Provides support for building Qt 5 and Qt 6 components. It takes care of "
+"setting up the appropriate configuration environment for the port to build."
+msgstr ""
+"Предоставляет поддержку сборки компонентов Qt 5 и Qt 6. Обеспечивает "
+"настройку соответствующей конфигурации окружения для сборки порта."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2363
+#, no-wrap
+msgid "Building Qt 5 Components"
+msgstr "Сборка компонентов Qt 5"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2367
+msgid ""
+"The port is Qt 5's `networkauth` component, which is part of the "
+"`networkauth` distribution file."
+msgstr ""
+"Порт представляет собой компонент `networkauth` из Qt 5, который входит в "
+"файл дистрибутива `networkauth`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2372
+#, no-wrap
+msgid ""
+"PORTNAME=\tnetworkauth\n"
+"DISTVERSION=\t${QT5_VERSION}\n"
+msgstr ""
+"PORTNAME=\tnetworkauth\n"
+"DISTVERSION=\t${QT5_VERSION}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2374
+#, no-wrap
+msgid "USES=\t\tqt-dist:5\n"
+msgstr "USES=\t\tqt-dist:5\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2380
+#, no-wrap
+msgid "Building Qt 6 Components"
+msgstr "Сборка компонентов Qt 6"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2384
+msgid ""
+"The port is Qt 6's `websockets` component, which is part of the `websockets` "
+"distribution file."
+msgstr ""
+"Порт представляет собой компонент `websockets` из Qt 6, который входит в "
+"файл дистрибутива `websockets`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2389
+#, no-wrap
+msgid ""
+"PORTNAME= websockets\n"
+"PORTVERSION= ${QT6_VERSION}\n"
+msgstr ""
+"PORTNAME= websockets\n"
+"PORTVERSION= ${QT6_VERSION}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2391
+#, no-wrap
+msgid "USES= qt-dist:6\n"
+msgstr "USES= qt-dist:6\n"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2396
+msgid ""
+"If `PORTNAME` does not match the component name, it can be passed as an "
+"argument to `qt-dist`."
+msgstr ""
+"Если `PORTNAME` не совпадает с именем компонента, его можно передать как "
+"аргумент в `qt-dist`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2398
+#, no-wrap
+msgid "Building Qt 5 Components with Different Names"
+msgstr "Сборка компонентов Qt 5 с разными именами"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2402
+msgid ""
+"The port is Qt 5's `gui` component, which is part of the `base` distribution "
+"file."
+msgstr ""
+"Порт представляет собой компонент `gui` из Qt 5, который входит в файл "
+"дистрибутива `base`."
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2407
+#, no-wrap
+msgid ""
+"PORTNAME=\tgui\n"
+"DISTVERSION=\t${QT5_VERSION}\n"
+msgstr ""
+"PORTNAME=\tgui\n"
+"DISTVERSION=\t${QT5_VERSION}\n"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2409
+#, no-wrap
+msgid "USES=\t\tqt-dist:5,base\n"
+msgstr "USES=\t\tqt-dist:5,base\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2414
+#, no-wrap
+msgid "`readline`"
+msgstr "`readline`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2417
+msgid "Possible arguments: (none), `port`"
+msgstr "Возможные аргументы: (нет), `port`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2420
+msgid ""
+"Uses readline as a library dependency, and sets `CPPFLAGS` and `LDFLAGS` as "
+"necessary. If the `port` argument is used or if readline is not present in "
+"the base system, add a dependency on package:devel/readline[]"
+msgstr ""
+"Использует readline в качестве зависимости библиотеки и устанавливает "
+"`CPPFLAGS` и `LDFLAGS` по необходимости. Если используется аргумент `port` "
+"или если readline отсутствует в базовой системе, добавляет зависимость от "
+"package:devel/readline[]"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2423
+#, no-wrap
+msgid "`ruby`"
+msgstr "`ruby`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2426
+msgid "Possible arguments: (none), `build`, `extconf`, `run`, `setup`"
+msgstr "Возможные аргументы: (нет), `build`, `extconf`, `run`, `setup`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2433
+msgid ""
+"Provide support for Ruby related ports. `(none)` without arguments adds "
+"runtime dependency on package:lang/ruby[]. `build` adds a dependency on "
+"package:lang/ruby[] at build time. `extconf` states that the port uses "
+"extconf.rb to configure. `run` adds a dependency on package:lang/ruby[] at "
+"run time. This is also the default. `setup` states that the port uses "
+"setup.rb to configure and build."
+msgstr ""
+"Предоставить поддержку для портов, связанных с Ruby. `(none)` без "
+"аргументов добавляет зависимость во время выполнения на package:lang/"
+"ruby[]. `build` добавляет зависимость на package:lang/ruby[] во время "
+"сборки. `extconf` указывает, что порт использует extconf.rb для настройки. "
+"`run` добавляет зависимость на package:lang/ruby[] во время выполнения. Это "
+"также значение по умолчанию. `setup` указывает, что порт использует "
+"setup.rb для настройки и сборки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2435
+msgid "The user may have the following variables defined:"
+msgstr "Пользователь может определить следующие переменные:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2436
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2453
+#, no-wrap
+msgid "`RUBY_VER`"
+msgstr "`RUBY_VER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2438
+msgid "Alternative short version of ruby in the form of `x.y'."
+msgstr "Альтернативная короткая версия ruby в виде `x.y`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2439
+#, no-wrap
+msgid "`RUBY_DEFAULT_VER`"
+msgstr "`RUBY_DEFAULT_VER`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2441
+msgid "Set to (e.g.) `2.7` to use `ruby27` as the default version."
+msgstr ""
+"Установите (например) `2.7`, чтобы использовать `ruby27` в качестве версии "
+"по умолчанию."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2442
+#, no-wrap
+msgid "`RUBY_ARCH`"
+msgstr "`RUBY_ARCH`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2444
+msgid "Set the architecture name (e.g. i386-freebsd7)."
+msgstr "Установите имя архитектуры (например, i386-freebsd7)."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2446
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2921
+msgid "The following variables are exported to be used by the port:"
+msgstr "Следующие переменные экспортируются для использования портом:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2447
+#, no-wrap
+msgid "`RUBY`"
+msgstr "`RUBY`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2452
+msgid ""
+"Set to full path of ruby. If set, the values of the following variables are "
+"automatically obtained from the ruby executable: `RUBY_ARCH`, "
+"`RUBY_ARCHLIBDIR`, `RUBY_LIBDIR`, `RUBY_SITEARCHLIBDIR`, `RUBY_SITELIBDIR`, "
+"`RUBY_VER` and `RUBY_VERSION`"
+msgstr ""
+"Установлена в полный путь к ruby. Если задано, значения следующих переменных "
+"автоматически получаются из исполняемого файла ruby: `RUBY_ARCH`, "
+"`RUBY_ARCHLIBDIR`, `RUBY_LIBDIR`, `RUBY_SITEARCHLIBDIR`, `RUBY_SITELIBDIR`, "
+"`RUBY_VER` и `RUBY_VERSION`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2455
+msgid "Set to the alternative short version of ruby in the form of `x.y'."
+msgstr "Установлена в альтернативную короткую версию ruby в формате `x.y`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2456
+#, no-wrap
+msgid "`RUBY_EXTCONF`"
+msgstr "`RUBY_EXTCONF`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2458
+msgid "Set to the alternative name of extconf.rb (default: extconf.rb)."
+msgstr ""
+"Установлена в альтернативное имя для extconf.rb (по умолчанию: extconf.rb)."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2459
+#, no-wrap
+msgid "`RUBY_EXTCONF_SUBDIRS`"
+msgstr "`RUBY_EXTCONF_SUBDIRS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2461
+msgid "Set to list of subdirectories, if multiple modules are included."
+msgstr "Установлена в список подкаталогов, если включено несколько модулей."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2462
+#, no-wrap
+msgid "`RUBY_SETUP`"
+msgstr "`RUBY_SETUP`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2464
+msgid "Set to the alternative name of setup.rb (default: setup.rb)."
+msgstr ""
+"Установлена в альтернативное имя для setup.rb (по умолчанию: setup.rb)."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2467
+#, no-wrap
+msgid "`samba`"
+msgstr "`samba`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2470
+msgid "Possible arguments: `build`, `env`, `lib`, `run`"
+msgstr "Возможные аргументы: `build`, `env`, `lib`, `run`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2475
+msgid ""
+"Handle dependency on Samba. `env` will not add any dependency and only set "
+"up the variables. `build` and `run` will add build-time and run-time "
+"dependency on [.filename]#smbd#. `lib` will add a dependency on "
+"[.filename]#libsmbclient.so#. The variables that are exported are:"
+msgstr ""
+"Обработать зависимость от Samba. `env` не добавит никаких зависимостей, а "
+"только установит переменные. `build` и `run` добавят зависимости во время "
+"сборки и выполнения на [.filename]#smbd#. `lib` добавит зависимость на "
+"[.filename]#libsmbclient.so#. Экспортируемые переменные:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2476
+#, no-wrap
+msgid "`SAMBA_PORT`"
+msgstr "`SAMBA_PORT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2478
+msgid "The origin of the default Samba port."
+msgstr "Расположение порта Samba по умолчанию."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2479
+#, no-wrap
+msgid "`SAMBA_INCLUDEDIR`"
+msgstr "`SAMBA_INCLUDEDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2481
+msgid "The location of the Samba header files."
+msgstr "Расположение заголовочных файлов Samba."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2482
+#, no-wrap
+msgid "`SAMBA_LIBS`"
+msgstr "`SAMBA_LIBS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2484
+msgid "The directory where the Samba shared libraries are available."
+msgstr "Каталог, в котором доступны общие библиотеки Samba."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2485
+#, no-wrap
+msgid "`SAMBA_LDB_PORT`"
+msgstr "`SAMBA_LDB_PORT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2488
+msgid ""
+"The origin of the ldb port used by the selected Samba version (e.g., "
+"package:databases/ldb28[]). It should be used if a port needs to depend on "
+"the same ldb version as the selected Samba version."
+msgstr ""
+"Расположение порта ldb, используемого выбранной версией Samba (например, "
+"package:databases/ldb28[]). Он должен использоваться, если порту требуется "
+"зависимость от той же версии ldb, что и у выбранной версии Samba."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2489
+#, no-wrap
+msgid "`SAMBA_TALLOC_PORT`"
+msgstr "`SAMBA_TALLOC_PORT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2492
+msgid ""
+"The origin of the talloc port used by the selected Samba version. It should "
+"be used if a port needs to depend on the same talloc version as the selected "
+"Samba version."
+msgstr ""
+"Расположение порта talloc, используемого выбранной версией Samba. Следует "
+"использовать, если порту требуется зависеть от той же версии talloc, что и "
+"выбранная версия Samba."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2493
+#, no-wrap
+msgid "`SAMBA_TDB_PORT`"
+msgstr "`SAMBA_TDB_PORT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2496
+msgid ""
+"The origin of the TDB port used by the selected Samba version. It should be "
+"used if a port needs to depend on the same TDB version as the selected Samba "
+"version."
+msgstr ""
+"Расположение порта TDB, используемого выбранной версией Samba. Его следует "
+"использовать, если порту требуется зависеть от той же версии TDB, что и "
+"выбранная версия Samba."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2497
+#, no-wrap
+msgid "`SAMBA_TEVENT_PORT`"
+msgstr "`SAMBA_TEVENT_PORT`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2500
+msgid ""
+"The origin of the tevent port used by the selected Samba version. It should "
+"be used if a port needs to depend on the same tevent version as the selected "
+"Samba version."
+msgstr ""
+"Расположение порта tevent, используемого выбранной версией Samba. Это "
+"следует использовать, если порту необходимо зависеть от той же версии "
+"tevent, что и выбранная версия Samba."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2502
+#, no-wrap
+msgid "`scons`"
+msgstr "`scons`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2508
+msgid ""
+"Provide support for the use of package:devel/scons[]. See "
+"crossref:special[using-scons,Using `scons`] for more information."
+msgstr ""
+"Предоставить поддержку для использования package:devel/scons[]. "
+"Дополнительную информацию смотрите в crossref:special[using-"
+"scons,Использование `scons`]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2510
+#, no-wrap
+msgid "`sdl`"
+msgstr "`sdl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2513
+msgid "Possible arguments: `sdl`"
+msgstr "Возможные аргументы: `sdl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2517
+msgid ""
+"Provide support for the use of `SDL` packages. The variable `USE_SDL` is "
+"mandatory and specifies which components to add as dependencies."
+msgstr ""
+"Обеспечить поддержку использования пакетов `SDL`. Переменная `USE_SDL` "
+"является обязательной и указывает, какие компоненты добавить в зависимости."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2519
+msgid "The current supported `SDL1.2` modules are:"
+msgstr "Поддерживаемые в настоящее время модули `SDL1.2`:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2521
+msgid "sdl"
+msgstr "sdl"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2522
+msgid "console"
+msgstr "console"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2523
+msgid "gfx"
+msgstr "gfx"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2524
+msgid "image"
+msgstr "image"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2525
+msgid "mixer"
+msgstr "mixer"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2526
+msgid "mm"
+msgstr "mm"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2527
+msgid "net"
+msgstr "net"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2528
+msgid "pango"
+msgstr "pango"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2529
+msgid "sound"
+msgstr "sound"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2530
+msgid "ttf"
+msgstr "ttf"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2532
+msgid "The current supported `SDL2` modules are:"
+msgstr "Текущие поддерживаемые модули `SDL2`:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2534
+msgid "sdl2"
+msgstr "sdl2"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2535
+msgid "gfx2"
+msgstr "gfx2"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2536
+msgid "image2"
+msgstr "image2"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2537
+msgid "mixer2"
+msgstr "mixer2"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2538
+msgid "net2"
+msgstr "net2"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2539
+msgid "sound2"
+msgstr "sound2"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2540
+msgid "ttf2"
+msgstr "ttf2"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2542
+msgid "The current supported `SDL3` modules are:"
+msgstr "Текущие поддерживаемые модули `SDL3`:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2544
+msgid "sdl3"
+msgstr "sdl3"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2545
+msgid "image3"
+msgstr "image3"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2546
+msgid "ttf3"
+msgstr "ttf3"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2548
+#, no-wrap
+msgid "`shared-mime-info`"
+msgstr "`shared-mime-info`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2555
+msgid ""
+"Uses update-mime-database from package:misc/shared-mime-info[]. This uses "
+"will automatically add a post-install step in such a way that the port "
+"itself still can specify there own post-install step if needed. It also add "
+"an crossref:plist[plist-keywords-shared-mime-info,`@shared-mime-info`] entry "
+"to the plist."
+msgstr ""
+"Использует update-mime-database из пакета package:misc/shared-mime-info[]. "
+"Это автоматически добавит шаг post-install таким образом, что сам порт всё "
+"ещё может указать собственный шаг post-install при необходимости. Также "
+"добавляет запись crossref:plist[plist-keywords-shared-mime-info,`@shared-"
+"mime-info`] в plist."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2557
+#, no-wrap
+msgid "`shebangfix`"
+msgstr "`shebangfix`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2563
+msgid ""
+"A lot of software uses incorrect locations for script interpreters, most "
+"notably [.filename]#/usr/bin/perl# and [.filename]#/bin/bash#. The "
+"shebangfix macro fixes shebang lines in scripts listed in `SHEBANG_REGEX`, "
+"`SHEBANG_GLOB`, or `SHEBANG_FILES`."
+msgstr ""
+"Множество программ используют некорректные расположения для интерпретаторов "
+"скриптов, особенно [.filename]#/usr/bin/perl# и [.filename]#/bin/bash#. "
+"Макрос shebangfix исправляет строки shebang в скриптах, перечисленных в "
+"`SHEBANG_REGEX`, `SHEBANG_GLOB` или `SHEBANG_FILES`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2564
+#, no-wrap
+msgid "`SHEBANG_REGEX`"
+msgstr "`SHEBANG_REGEX`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2567
+msgid ""
+"Contains _one_ extended regular expressions, and is used with the `-iregex` "
+"argument of man:find[1]. See crossref:uses[uses-shebangfix-ex-"
+"regex,`USESshebangfix` with `SHEBANG_REGEX`]."
+msgstr ""
+"Содержит _одно_ расширенное регулярное выражение и используется с аргументом "
+"`-iregex` в man:find[1]. См. crossref:uses[uses-shebangfix-ex-"
+"regex,`USESshebangfix` с `SHEBANG_REGEX`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2568
+#, no-wrap
+msgid "`SHEBANG_GLOB`"
+msgstr "`SHEBANG_GLOB`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2571
+msgid ""
+"Contains a list of patterns used with the `-name` argument of man:find[1]. "
+"See crossref:uses[uses-shebangfix-ex-glob,`USESshebangfix` with "
+"`SHEBANG_GLOB`]."
+msgstr ""
+"Содержит список шаблонов, используемых с аргументом `-name` в man:find[1]. "
+"См. crossref:uses[uses-shebangfix-ex-glob,`USESshebangfix` с `SHEBANG_GLOB`]."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2572
+#, no-wrap
+msgid "`SHEBANG_FILES`"
+msgstr "`SHEBANG_FILES`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2577
+msgid ""
+"Contains a list of files or man:sh[1] globs. The shebangfix macro is run "
+"from `${WRKSRC}`, so `SHEBANG_FILES` can contain paths that are relative to "
+"`${WRKSRC}`. It can also deal with absolute paths if files outside of `$"
+"{WRKSRC}` require patching. See crossref:uses[uses-shebangfix-ex-"
+"files,`USESshebangfix` with `SHEBANG_FILES`]."
+msgstr ""
+"Содержит список файлов или шаблонов man:sh[1]. Макрос shebangfix выполняется "
+"из `${WRKSRC}`, поэтому `SHEBANG_FILES` может содержать пути, относительные "
+"к `${WRKSRC}`. Также он может работать с абсолютными путями, если требуется "
+"исправление файлов вне `${WRKSRC}`. См. crossref:uses[uses-shebangfix-ex-"
+"files,`USESshebangfix` с `SHEBANG_FILES`]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2579
+msgid ""
+"Currently Bash, Java, Ksh, Lua, Perl, PHP, Python, Ruby, Tcl, and Tk are "
+"supported by default."
+msgstr ""
+"В настоящее время Bash, Java, Ksh, Lua, Perl, PHP, Python, Ruby, Tcl и Tk "
+"поддерживаются по умолчанию."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2581
+msgid "There are three configuration variables:"
+msgstr "Существует три переменных конфигурации:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2582
+#, no-wrap
+msgid "`SHEBANG_LANG`"
+msgstr "`SHEBANG_LANG`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2584
+msgid "The list of supported interpreters."
+msgstr "Список поддерживаемых интерпретаторов."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2585
+#, no-wrap
+msgid "`_interp__CMD`"
+msgstr "`_interp__CMD`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2588
+msgid ""
+"The path to the command interpreter on FreeBSD. The default value is `$"
+"{LOCALBASE}/bin/_interp_`."
+msgstr ""
+"Путь к интерпретатору команд в FreeBSD. Значение по умолчанию — `$"
+"{LOCALBASE}/bin/_interp_`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2589
+#, no-wrap
+msgid "`_interp__OLD_CMD`"
+msgstr "`_interp__OLD_CMD`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2593
+msgid ""
+"The list of wrong invocations of interpreters. These are typically obsolete "
+"paths, or paths used on other operating systems that are incorrect on "
+"FreeBSD. They will be replaced by the correct path in `_interp__CMD`."
+msgstr ""
+"Список неправильных вызовов интерпретаторов. Обычно это устаревшие пути или "
+"пути, используемые в других операционных системах, которые неверны в "
+"FreeBSD. Они будут заменены на правильные пути в `_interp__CMD`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2597
+msgid ""
+"These will _always_ be part of `_interp__OLD_CMD`: `\"/usr/bin/env "
+"_interp_\" /bin/_interp_ /usr/bin/_interp_ /usr/local/bin/_interp_`."
+msgstr ""
+"Эти пути _всегда_ будут частью `_interp__OLD_CMD`: `\"/usr/bin/env "
+"_interp_\" /bin/_interp_ /usr/bin/_interp_ /usr/local/bin/_interp_`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2604
+msgid ""
+"`_interp__OLD_CMD` contain multiple values. Any entry with spaces must be "
+"quoted. See crossref:uses[uses-shebangfix-ex-ksh,Specifying all the Paths "
+"When Adding an Interpreter to `USESshebangfix`]."
+msgstr ""
+"`_interp__OLD_CMD` содержит несколько значений. Любая запись с пробелами "
+"должна быть заключена в кавычки. См. crossref:uses[uses-shebangfix-ex-"
+"ksh,Указание всех путей при добавлении интерпретатора в `USESshebangfix`]."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2610
+msgid ""
+"The fixing of shebangs is done during the `patch` phase. If scripts are "
+"created with incorrect shebangs during the `build` phase, the build process "
+"(for example, the [.filename]#configure# script, or the "
+"[.filename]#Makefiles#) must be patched or given the right path (for "
+"example, with `CONFIGURE_ENV`, `CONFIGURE_ARGS`, `MAKE_ENV`, or `MAKE_ARGS`) "
+"to generate the right shebangs."
+msgstr ""
+"Исправление шебанг-строк выполняется на этапе `patch`. Если скрипты "
+"создаются с некорректными шебанг-строками на этапе `build`, процесс сборки "
+"(например, скрипт [.filename]#configure# или [.filename]#Makefiles#) должен "
+"быть исправлен или ему должен быть указан правильный путь (например, с "
+"помощью `CONFIGURE_ENV`, `CONFIGURE_ARGS`, `MAKE_ENV` или `MAKE_ARGS`) для "
+"генерации корректных шебанг-строк."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2612
+msgid ""
+"Correct paths for supported interpreters are available in `_interp__CMD`."
+msgstr ""
+"Правильные пути для поддерживаемых интерпретаторов доступны в `_interp__CMD`."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2617
+msgid ""
+"When used with crossref:uses[uses-python,`USES=python`], and the aim is only "
+"to fix the shebangs but a dependency on Python itself is not wanted, use "
+"`USES=python:env` instead."
+msgstr ""
+"При использовании с crossref:uses[uses-python,`USES=python`], если цель "
+"состоит только в исправлении shebang, но зависимость от самого Python не "
+"требуется, используйте `USES=python:env`."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2620
+#, no-wrap
+msgid "Adding Another Interpreter to `USES=shebangfix`"
+msgstr "Добавление другого интерпретатора в `USES=shebangfix`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2625
+msgid "To add another interpreter, set `SHEBANG_LANG`. For example:"
+msgstr ""
+"Чтобы добавить другой интерпретатор, установите `SHEBANG_LANG`. Например:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2629
+#, no-wrap
+msgid "SHEBANG_LANG=\tlua\n"
+msgstr "SHEBANG_LANG=\tlua\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2634
+#, no-wrap
+msgid "Specifying all the Paths When Adding an Interpreter to `USES=shebangfix`"
+msgstr "Указание всех путей при добавлении интерпретатора в `USES=shebangfix`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2638
+msgid ""
+"If it was not already defined, and there were no default values for "
+"`_interp__OLD_CMD` and `_interp__CMD` the Ksh entry could be defined as:"
+msgstr ""
+"Если они еще не были определены и не было значений по умолчанию для "
+"`_interp__OLD_CMD` и `_interp__CMD`, запись Ksh можно определить как:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2644
+#, no-wrap
+msgid ""
+"SHEBANG_LANG=\tksh\n"
+"ksh_OLD_CMD=\t\"/usr/bin/env ksh\" /bin/ksh /usr/bin/ksh\n"
+"ksh_CMD=\t${LOCALBASE}/bin/ksh\n"
+msgstr ""
+"SHEBANG_LANG=\tksh\n"
+"ksh_OLD_CMD=\t\"/usr/bin/env ksh\" /bin/ksh /usr/bin/ksh\n"
+"ksh_CMD=\t${LOCALBASE}/bin/ksh\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2649
+#, no-wrap
+msgid "Adding a Strange Location for an Interpreter"
+msgstr "Добавление нестандартного расположения интерпретатора"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2655
+msgid ""
+"Some software uses strange locations for an interpreter. For example, an "
+"application might expect Python to be located in [.filename]#/opt/bin/"
+"python2.7#. The strange path to be replaced can be declared in the port "
+"[.filename]#Makefile#:"
+msgstr ""
+"Некоторое программное обеспечение использует нестандартные пути для "
+"интерпретатора. Например, приложение может ожидать, что Python будет "
+"расположен в [.filename]#/opt/bin/python2.7#. Нестандартный путь, который "
+"нужно заменить, можно указать в [.filename]#Makefile# порта:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2659
+#, no-wrap
+msgid "python_OLD_CMD=\t/opt/bin/python2.7\n"
+msgstr "python_OLD_CMD=\t/opt/bin/python2.7\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2664
+#, no-wrap
+msgid "`USES=shebangfix` with `SHEBANG_REGEX`"
+msgstr "`USES=shebangfix` с `SHEBANG_REGEX`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2668
+msgid ""
+"To fix all the files in `${WRKSRC}/scripts` ending in [.filename]#.pl#, "
+"[.filename]#.sh#, or [.filename]#.cgi# do:"
+msgstr ""
+"Для исправления всех файлов в `${WRKSRC}/scripts`, оканчивающихся на "
+"[.filename]#.pl#, [.filename]#.sh# или [.filename]#.cgi#, выполните:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2673
+#, no-wrap
+msgid ""
+"USES=\tshebangfix\n"
+"SHEBANG_REGEX=\t./scripts/.*\\.(sh|pl|cgi)\n"
+msgstr ""
+"USES=\tshebangfix\n"
+"SHEBANG_REGEX=\t./scripts/.*\\.(sh|pl|cgi)\n"
+
+#. type: delimited block = 6
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2679
+msgid ""
+"`SHEBANG_REGEX` is used by running `find -E`, which uses modern regular "
+"expressions also known as extended regular expressions. See "
+"man:re_format[7] for more information."
+msgstr ""
+"`SHEBANG_REGEX` используется при выполнении `find -E`, который применяет "
+"современные регулярные выражения, также известные как расширенные регулярные "
+"выражения. Подробнее см. в man:re_format[7]."
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2684
+#, no-wrap
+msgid "`USES=shebangfix` with `SHEBANG_GLOB`"
+msgstr "`USES=shebangfix` с `SHEBANG_GLOB`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2688
+msgid ""
+"To fix all the files in `${WRKSRC}` ending in [.filename]#.pl# or "
+"[.filename]#.sh#, do:"
+msgstr ""
+"Для исправления всех файлов в `${WRKSRC}` с окончанием [.filename]#.pl# или "
+"[.filename]#.sh# выполните:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2693
+#, no-wrap
+msgid ""
+"USES=\tshebangfix\n"
+"SHEBANG_GLOB=\t*.sh *.pl\n"
+msgstr ""
+"USES=\tshebangfix\n"
+"SHEBANG_GLOB=\t*.sh *.pl\n"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2698
+#, no-wrap
+msgid "`USES=shebangfix` with `SHEBANG_FILES`"
+msgstr "`USES=shebangfix` с `SHEBANG_FILES`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2702
+msgid ""
+"To fix the files [.filename]#script/foobar.pl# and [.filename]#script/*.sh# "
+"in `${WRKSRC}`, do:"
+msgstr ""
+"Для исправления файлов [.filename]#script/foobar.pl# и [.filename]#script/"
+"*.sh# в `${WRKSRC}` выполните:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2707
+#, no-wrap
+msgid ""
+"USES=\tshebangfix\n"
+"SHEBANG_FILES=\tscripts/foobar.pl scripts/*.sh\n"
+msgstr ""
+"USES=\tshebangfix\n"
+"SHEBANG_FILES=\tscripts/foobar.pl scripts/*.sh\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2712
+#, no-wrap
+msgid "`sqlite`"
+msgstr "`sqlite`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2715
+msgid "Possible arguments: (none), `2`, `3`"
+msgstr "Возможные аргументы: (нет), `2`, `3`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2718
+msgid ""
+"Add a dependency on SQLite. The default version used is 3, but version 2 is "
+"also possible using the `:2` modifier."
+msgstr ""
+"Добавить зависимость от SQLite. Используемая по умолчанию версия — 3, но "
+"также возможна версия 2 с использованием модификатора `:2`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2720
+#, no-wrap
+msgid "`sbrk`"
+msgstr "`sbrk`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2725
+msgid "Marks the port as `BROKEN` in `aarch64` and `riscv64`."
+msgstr "Помечает порт как `BROKEN` для `aarch64` и `riscv64`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2727
+#, no-wrap
+msgid "`ssl`"
+msgstr "`ssl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2730
+msgid "Possible arguments: (none), `build`, `run`"
+msgstr "Возможные аргументы: (нет), `build`, `run`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2734
+msgid ""
+"Provide support for OpenSSL. A build- or run-time only dependency can be "
+"specified using `build` or `run`. These variables are available for the "
+"port's use, they are also added to `MAKE_ENV`:"
+msgstr ""
+"Обеспечить поддержку OpenSSL. Зависимость только для сборки или выполнения "
+"может быть указана с использованием `build` или `run`. Эти переменные "
+"доступны для использования портом, а также добавлены в `MAKE_ENV`:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2735
+#, no-wrap
+msgid "`OPENSSLBASE`"
+msgstr "`OPENSSLBASE`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2737
+msgid "Path to the OpenSSL installation base."
+msgstr "Путь к базовой установке OpenSSL."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2738
+#, no-wrap
+msgid "`OPENSSLDIR`"
+msgstr "`OPENSSLDIR`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2740
+msgid "Path to OpenSSL's configuration files."
+msgstr "Путь к файлам конфигурации OpenSSL."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2741
+#, no-wrap
+msgid "`OPENSSLLIB`"
+msgstr "`OPENSSLLIB`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2743
+msgid "Path to the OpenSSL libraries."
+msgstr "Путь к библиотекам OpenSSL."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2744
+#, no-wrap
+msgid "`OPENSSLINC`"
+msgstr "`OPENSSLINC`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2746
+msgid "Path to the OpenSSL includes."
+msgstr "Путь к заголовочным файлам OpenSSL."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2747
+#, no-wrap
+msgid "`OPENSSLRPATH`"
+msgstr "`OPENSSLRPATH`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2749
+msgid ""
+"If defined, the path the linker needs to use to find the OpenSSL libraries."
+msgstr ""
+"Если определено, путь, который требуется компоновщику для поиска библиотек "
+"OpenSSL."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2753
+msgid ""
+"If a port does not build with an OpenSSL flavor, set the `BROKEN_SSL` "
+"variable, and possibly the `BROKEN_SSL_REASON__flavor_`:"
+msgstr ""
+"Если порт не собирается с вариантом OpenSSL, установите переменную "
+"`BROKEN_SSL`, а также, возможно, `BROKEN_SSL_REASON__flavor_`:"
+
+#. type: delimited block . 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2758
+#, no-wrap
+msgid ""
+"BROKEN_SSL=\tlibressl\n"
+"BROKEN_SSL_REASON_libressl=\tneeds features only available in OpenSSL\n"
+msgstr ""
+"BROKEN_SSL=\tlibressl\n"
+"BROKEN_SSL_REASON_libressl=\tneeds features only available in OpenSSL\n"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2763
+#, no-wrap
+msgid "`tar`"
+msgstr "`tar`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2767
+msgid ""
+"Possible arguments: (none), `Z`, `bz2`, `bzip2`, `lzma`, `tbz`, `tbz2`, "
+"`tgz`, `txz`, `xz`, `zst`, `zstd`"
+msgstr ""
+"Возможные аргументы: (нет), `Z`, `bz2`, `bzip2`, `lzma`, `tbz`, `tbz2`, "
+"`tgz`, `txz`, `xz`, `zst`, `zstd`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2770
+msgid ""
+"Set `EXTRACT_SUFX` to `.tar`, `.tar.Z`, `.tar.bz2`, `.tar.bz2`, `.tar.lzma`, "
+"`.tbz`, `.tbz2`, `.tgz`, `.txz`, `.tar.xz`, `.tar.zst` or `.tar.zstd` "
+"respectively."
+msgstr ""
+"Установите `EXTRACT_SUFX` в `.tar`, `.tar.Z`, `.tar.bz2`, `.tar.bz2`, "
+"`.tar.lzma`, `.tbz`, `.tbz2`, `.tgz`, `.txz`, `.tar.xz`, `.tar.zst` или "
+"`.tar.zstd` соответственно."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2772
+#, no-wrap
+msgid "`tcl`"
+msgstr "`tcl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2775
+msgid "Possible arguments: _version_, `wrapper`, `build`, `run`, `tea`"
+msgstr "Возможные аргументы: _version_, `wrapper`, `build`, `run`, `tea`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2782
+msgid ""
+"Add a dependency on Tcl. A specific version can be requested using "
+"_version_. The version can be empty, one or more exact version numbers "
+"(currently `84`, `85`, or `86`), or a minimal version number (currently "
+"`84+`, `85+` or `86+`). To only request a non version specific wrapper, use "
+"`wrapper`. A build- or run-time only dependency can be specified using "
+"`build` or `run`. To build the port using the Tcl Extension Architecture, "
+"use `tea`. After including [.filename]#bsd.port.pre.mk# the port can "
+"inspect the results using these variables:"
+msgstr ""
+"Добавьте зависимость от Tcl. Конкретная версия может быть запрошена с "
+"помощью _version_. Версия может быть пустой, одной или несколькими точными "
+"номерами версий (в настоящее время `84`, `85` или `86`), либо минимальным "
+"номером версии (в настоящее время `84+`, `85+` или `86+`). Чтобы запросить "
+"только неспецифичную для версии обёртку, используйте `wrapper`. Зависимость "
+"только на время сборки или выполнения может быть указана с помощью `build` "
+"или `run`. Для сборки порта с использованием Tcl Extension Architecture "
+"используйте `tea`. После включения [.filename]#bsd.port.pre.mk# порт может "
+"проверить результаты с помощью этих переменных:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2784
+msgid "`TCL_VER`: chosen major.minor version of Tcl"
+msgstr "`TCL_VER`: выбранная версия Tcl в формате major.minor"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2785
+msgid "`TCLSH`: full path of the Tcl interpreter"
+msgstr "`TCLSH`: полный путь к интерпретатору Tcl"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2786
+msgid "`TCL_LIBDIR`: path of the Tcl libraries"
+msgstr "`TCL_LIBDIR`: путь к библиотекам Tcl"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2787
+msgid "`TCL_INCLUDEDIR`: path of the Tcl C header files"
+msgstr "`TCL_INCLUDEDIR`: путь к заголовочным файлам Tcl на языке C"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2788
+msgid "`TCL_PKG_LIB_PREFIX`: Library prefix, as per TIP595"
+msgstr "`TCL_PKG_LIB_PREFIX`: Префикс библиотеки, согласно TIP595"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2789
+msgid "`TCL_PKG_STUB_POSTFIX`: Stub library postfix"
+msgstr "`TCL_PKG_STUB_POSTFIX`: Постфикс библиотеки заглушки"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2790
+msgid "`TK_VER`: chosen major.minor version of Tk"
+msgstr "`TK_VER`: выбранная версия Tk в формате major.minor"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2791
+msgid "`WISH`: full path of the Tk interpreter"
+msgstr "`WISH`: полный путь к интерпретатору Tk"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2792
+msgid "`TK_LIBDIR`: path of the Tk libraries"
+msgstr "`TK_LIBDIR`: путь к библиотекам Tk"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2793
+msgid "`TK_INCLUDEDIR`: path of the Tk C header files"
+msgstr "`TK_INCLUDEDIR`: путь к заголовочным файлам Tk на языке C"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2795
+#, no-wrap
+msgid "`terminfo`"
+msgstr "`terminfo`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2801
+msgid ""
+"Adds crossref:plist[plist-keywords-terminfo,`@terminfo`] to the "
+"[.filename]#plist#. Use when the port installs [.filename]#*.terminfo# "
+"files in [.filename]#${PREFIX}/share/misc#."
+msgstr ""
+"Добавляет crossref:plist[plist-keywords-terminfo,`@terminfo`] в файл "
+"[.filename]#plist#. Используется, когда порт устанавливает файлы "
+"[.filename]#*.terminfo# в каталог [.filename]#${PREFIX}/share/misc#."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2803
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2838
+#, no-wrap
+msgid "`tex`"
+msgstr "`tex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2809
+msgid ""
+"Provide support for tex. Loads all the default variables for TEX related "
+"ports and does not add any dependency on any ports."
+msgstr ""
+"Обеспечить поддержку tex. Загружает все стандартные переменные для портов, "
+"связанных с TEX, и не добавляет зависимостей от других портов."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2811
+msgid "Variables are used to specify which TEX modules are required."
+msgstr "Переменные используются для указания того, какие модули TEX требуются."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2812
+#, no-wrap
+msgid "`USE_TEX`"
+msgstr "`USE_TEX`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2816
+msgid ""
+"The list of required TEX extensions at run-time. Add `:build` to the "
+"extension name to add a build-time dependency, `:run` to add runtime "
+"dependency, `:test` for test time dependency, `:extract` for extract time "
+"dependency. Example: `base texmf:build source:run`"
+msgstr ""
+"Список необходимых расширений TEX во время выполнения. Добавьте `:build` к "
+"названию расширения, чтобы добавить зависимость на время сборки, `:run` — "
+"для зависимости во время выполнения, `:test` — для зависимости во время "
+"тестирования, `:extract` — для зависимости во время извлечения. Пример: "
+"`base texmf:build source:run`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2818
+msgid "Current possible arguments are as follows:"
+msgstr "Текущие возможные аргументы следующие:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2821
+msgid "`texmf`"
+msgstr "`texmf`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2822
+msgid "`source`"
+msgstr "`source`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2824
+msgid "`web2c`"
+msgstr "`web2c`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2825
+msgid "`kpathsea`"
+msgstr "`kpathsea`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2826
+msgid "`ptexenc`"
+msgstr "`ptexenc`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2827
+msgid "`basic`"
+msgstr "`basic`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2828
+msgid "`tlmgr`"
+msgstr "`tlmgr`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2829
+msgid "`texlua`"
+msgstr "`texlua`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2830
+msgid "`texluajit`"
+msgstr "`texluajit`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2831
+msgid "`synctex`"
+msgstr "`synctex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2832
+msgid "`xpdfopen`"
+msgstr "`xpdfopen`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2833
+msgid "`dvipsk`"
+msgstr "`dvipsk`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2834
+msgid "`dvipdfmx`"
+msgstr "`dvipdfmx`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2835
+msgid "`xdvik`"
+msgstr "`xdvik`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2836
+msgid "`gbklatex`"
+msgstr "`gbklatex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2837
+msgid "`formats`"
+msgstr "`formats`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2839
+msgid "`latex`"
+msgstr "`latex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2840
+msgid "`pdftex`"
+msgstr "`pdftex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2841
+msgid "`jadetex`"
+msgstr "`jadetex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2842
+msgid "`luatex`"
+msgstr "`luatex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2843
+msgid "`ptex`"
+msgstr "`ptex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2844
+msgid "`xetex`"
+msgstr "`xetex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2845
+msgid "`xmltex`"
+msgstr "`xmltex`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2846
+msgid "`texhash`"
+msgstr "`texhash`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2847
+msgid "`updmap`"
+msgstr "`updmap`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2848
+msgid "`fmtutil`"
+msgstr "`fmtutil`"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2850
+#, no-wrap
+msgid "`tk`"
+msgstr "`tk`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2853
+msgid "Same as arguments for `tcl`"
+msgstr "Так же, как аргументы для `tcl`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2856
+msgid ""
+"Small wrapper when using both Tcl and Tk. The same variables are returned "
+"as when using Tcl."
+msgstr ""
+"Небольшая обертка при использовании Tcl и Tk. Возвращаются те же переменные, "
+"что и при использовании Tcl."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2858
+#, no-wrap
+msgid "`trigger`"
+msgstr "`trigger`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2864
+msgid ""
+"Provide support for ports requiring triggers to be executed by man:pkg[8]. "
+"Triggers are executed at the end of a transaction if the conditions are met."
+msgstr ""
+"Предоставить поддержку для портов, требующих выполнения триггеров с помощью "
+"man:pkg[8]. Триггеры выполняются в конце транзакции, если условия выполнены."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2866
+msgid "The following variable can be set by ports:"
+msgstr "Следующая переменная может быть установлена портами:"
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2867
+#, no-wrap
+msgid "`TRIGGERS`"
+msgstr "`TRIGGERS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2869
+msgid "List of triggers to package. Defaults to `${PORTNAME}`."
+msgstr "Список триггеров для пакета. По умолчанию используется `${PORTNAME}`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2872
+msgid ""
+"Triggers are specified in UCL format and are usually placed in the "
+"[.filename]#files/# directory of the port."
+msgstr ""
+"Триггеры указываются в формате UCL и обычно размещаются в каталоге "
+"[.filename]#files/# порта."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2874
+#, no-wrap
+msgid "`uidfix`"
+msgstr "`uidfix`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2880
+msgid ""
+"Changes some default behavior (mostly variables) of the build system to "
+"allow installing this port as a normal user. Try this in the port before "
+"using crossref:uses[uses-fakeroot,`USES=fakeroot`] or patching."
+msgstr ""
+"Изменяет некоторые стандартные настройки (в основном переменные) системы "
+"сборки, чтобы позволить установку этого порта обычным пользователем. "
+"Попробуйте это в порте перед использованием crossref:uses[uses-"
+"fakeroot,`USES=fakeroot`] или исправлением."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2882
+#, no-wrap
+msgid "`uniquefiles`"
+msgstr "`uniquefiles`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2885
+msgid "Possible arguments: (none), `dirs`"
+msgstr "Возможные аргументы: (нет), `dirs`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2889
+msgid ""
+"Make files or directories 'unique', by adding a prefix or suffix. If the "
+"`dirs` argument is used, the port needs a prefix (and only a prefix) based "
+"on `UNIQUE_PREFIX` for standard directories `DOCSDIR`, `EXAMPLESDIR`, "
+"`DATADIR`, `WWWDIR`, `ETCDIR`. These variables are available for ports:"
+msgstr ""
+"Сделать файлы или каталоги 'уникальными', добавляя префикс или суффикс. Если "
+"используется аргумент `dirs`, порту требуется префикс (и только префикс) на "
+"основе `UNIQUE_PREFIX` для стандартных каталогов `DOCSDIR`, `EXAMPLESDIR`, "
+"`DATADIR`, `WWWDIR`, `ETCDIR`. Эти переменные доступны для портов:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2891
+msgid ""
+"`UNIQUE_PREFIX`: The prefix to be used for directories and files. Default: `$"
+"{PKGNAMEPREFIX}`."
+msgstr ""
+"`UNIQUE_PREFIX`: Префикс, используемый для каталогов и файлов. По умолчанию: "
+"`${PKGNAMEPREFIX}`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2892
+msgid ""
+"`UNIQUE_PREFIX_FILES`: A list of files that need to be prefixed. Default: "
+"empty."
+msgstr ""
+"`UNIQUE_PREFIX_FILES`: Список файлов, которые необходимо предварить "
+"префиксом. По умолчанию: пусто."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2893
+msgid ""
+"`UNIQUE_SUFFIX`: The suffix to be used for files. Default: `${PKGNAMESUFFIX}"
+"`."
+msgstr ""
+"`UNIQUE_SUFFIX`: Суффикс, используемый для файлов. По умолчанию: `$"
+"{PKGNAMESUFFIX}`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2894
+msgid ""
+"`UNIQUE_SUFFIX_FILES`: A list of files that need to be suffixed. Default: "
+"empty."
+msgstr ""
+"`UNIQUE_SUFFIX_FILES`: Список файлов, к которым необходимо добавить суффикс. "
+"По умолчанию: пусто."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2896
+#, no-wrap
+msgid "`vala`"
+msgstr "`vala`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2899
+msgid "Possible arguments: `build`, `lib`, `no_depend`"
+msgstr "Возможные аргументы: `build`, `lib`, `no_depend`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2902
+msgid ""
+"Adds build or library dependencies on package:lang/vala[]. The `no_depend` "
+"argument is reserved for package:lang/vala[] itself."
+msgstr ""
+"Добавляет зависимости сборки или библиотеки на package:lang/vala[]. Аргумент "
+"`no_depend` зарезервирован для самого package:lang/vala[]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2904
+#, no-wrap
+msgid "`varnish`"
+msgstr "`varnish`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2907
+msgid "Possible arguments: `4` (default), `6`, `7`"
+msgstr "Возможные аргументы: `4` (по умолчанию), `6`, `7`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2910
+msgid ""
+"Handle dependencies on Varnish Cache. Adds a dependency on package:www/"
+"varnish*[]."
+msgstr ""
+"Обрабатывает зависимости для Varnish Cache. Добавляет зависимость от пакета "
+"`package:www/varnish*[]`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2912
+#, no-wrap
+msgid "`waf`"
+msgstr "`waf`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2917
+msgid "Provide support for ports using the `waf` build system."
+msgstr "Обеспечить поддержку портов, использующих систему сборки `waf`."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2919
+msgid "It implies `USES=python:build`."
+msgstr "Это подразумевает `USES=python:build`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2922
+#, no-wrap
+msgid "`WAF_CMD`"
+msgstr "`WAF_CMD`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2925
+msgid ""
+"Location of the `waf` script. Set this if the `waf` script is not in "
+"[.filename]#WRKSRC/waf#."
+msgstr ""
+"Расположение скрипта `waf`. Установите этот параметр, если скрипт `waf` не "
+"находится в [.filename]#WRKSRC/waf#."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2926
+#, no-wrap
+msgid "`CONFIGURE_TARGET`"
+msgstr "`CONFIGURE_TARGET`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2928
+msgid "`Configure` target. Default `configure`."
+msgstr "Цель для `configure`. По умолчанию – `configure`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2929
+#, no-wrap
+msgid "`ALL_TARGET`"
+msgstr "`ALL_TARGET`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2931
+msgid "`All` target. Default `build`."
+msgstr "Цель для `all`. По умолчанию `build`."
+
+#. type: Labeled list
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2932
+#, no-wrap
+msgid "`INSTALL_TARGET`"
+msgstr "`INSTALL_TARGET`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2934
+msgid "`Install` target. Default `install`."
+msgstr "Цель для `install`. По умолчанию `install`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2936
+#, no-wrap
+msgid "`webplugin`"
+msgstr "`webplugin`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2939
+msgid "Possible arguments: (none), `ARGS`"
+msgstr "Возможные аргументы: (нет), `ARGS`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2942
+msgid ""
+"Automatically create and remove symbolic links for each application that "
+"supports the webplugin framework. `ARGS` can be one of:"
+msgstr ""
+"Автоматически создавать и удалять символические ссылки для каждого "
+"приложения, поддерживающего фреймворк webplugin. `ARGS` может быть одним из:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2944
+msgid "`gecko`: support plug-ins based on Gecko"
+msgstr "`gecko`: поддержка плагинов на основе Gecko"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2945
+msgid "`native`: support plug-ins for Gecko, Opera, and WebKit-GTK"
+msgstr "`native`: поддержка плагинов для Gecko, Opera и WebKit-GTK"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2946
+msgid "`linux`: support Linux plug-ins"
+msgstr "`linux`: поддержка Linux плагинов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2947
+msgid "`all` (default, implicit): support all plug-in types"
+msgstr "`all` (по умолчанию, неявно): поддержка всех типов плагинов"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2948
+msgid "(individual entries): support only the browsers listed"
+msgstr "(отдельные записи): поддерживаются только перечисленные браузеры"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2950
+msgid "These variables can be adjusted:"
+msgstr "Эти переменные можно настроить:"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2952
+msgid ""
+"`WEBPLUGIN_FILES`: No default, must be set manually. The plug-in files to "
+"install."
+msgstr ""
+"`WEBPLUGIN_FILES`: Значение по умолчанию отсутствует, должно быть "
+"установлено вручную. Файлы плагинов для установки."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2953
+msgid ""
+"`WEBPLUGIN_DIR`: The directory to install the plug-in files to, default "
+"[.filename]#PREFIX/lib/browser_plugins/WEBPLUGIN_NAME#. Set this if the port "
+"installs plug-in files outside of the default directory to prevent broken "
+"symbolic links."
+msgstr ""
+"`WEBPLUGIN_DIR`: Каталог для установки файлов плагина, по умолчанию "
+"[.filename]#PREFIX/lib/browser_plugins/WEBPLUGIN_NAME#. Установите это "
+"значение, если порт устанавливает файлы плагина вне стандартного каталога, "
+"чтобы избежать битых символических ссылок."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2954
+msgid ""
+"`WEBPLUGIN_NAME`: The final directory to install the plug-in files into, "
+"default `PKGBASE`."
+msgstr ""
+"`WEBPLUGIN_NAME`: Конечный каталог для установки файлов плагина, по "
+"умолчанию `PKGBASE`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2956
+#, no-wrap
+msgid "`xfce`"
+msgstr "`xfce`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2959
+msgid "Possible arguments: (none), `gtk2`"
+msgstr "Возможные аргументы: (нет), `gtk2`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2962
+msgid ""
+"Provide support for Xfce related ports. See crossref:special[using-"
+"xfce,Using Xfce] for details."
+msgstr ""
+"Предоставить поддержку для портов, связанных с Xfce. Подробности см. в "
+"crossref:special[using-xfce,Использование Xfce]."
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2965
+msgid ""
+"The `gtk2` argument specifies that the port requires GTK2 support. It adds "
+"additional features provided by some core components, for example, "
+"package:x11/libxfce4menu[] and package:x11-wm/xfce4-panel[]."
+msgstr ""
+"Аргумент `gtk2` указывает, что порт требует поддержки GTK2. Он добавляет "
+"дополнительные возможности, предоставляемые некоторыми основными "
+"компонентами, например, package:x11/libxfce4menu[] и package:x11-wm/xfce4-"
+"panel[]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2967
+#, no-wrap
+msgid "`xorg`"
+msgstr "`xorg`"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2974
+msgid ""
+"Provides an easy way to depend on X.org components. The components should "
+"be listed in `USE_XORG`. The available components are:"
+msgstr ""
+"Предоставляет простой способ зависеть от компонентов X.org. Компоненты "
+"должны быть перечислены в `USE_XORG`. Доступные компоненты:"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2976
+#, no-wrap
+msgid "Available X.Org Components"
+msgstr "Доступные компоненты X.Org"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2980
+#, no-wrap
+msgid "Name"
+msgstr "Имя"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2982
+#, no-wrap
+msgid "Description"
+msgstr "Описание"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2983
+#, no-wrap
+msgid "`dmx`"
+msgstr "`dmx`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2985
+#, no-wrap
+msgid "DMX extension library"
+msgstr "Библиотека расширений DMX"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2986
+#, no-wrap
+msgid "`fontenc`"
+msgstr "`fontenc`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2988
+#, no-wrap
+msgid "The fontenc Library"
+msgstr "Библиотека fontenc"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2989
+#, no-wrap
+msgid "`fontutil`"
+msgstr "`fontutil`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2991
+#, no-wrap
+msgid "Create an index of X font files in a directory"
+msgstr "Создать индекс файлов шрифтов X в каталоге"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2992
+#, no-wrap
+msgid "`ice`"
+msgstr "`ice`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2994
+#, no-wrap
+msgid "Inter Client Exchange library for X11"
+msgstr "Библиотека Inter Client Exchange для X11"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2995
+#, no-wrap
+msgid "`libfs`"
+msgstr "`libfs`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2997
+#, no-wrap
+msgid "The FS library"
+msgstr "Библиотека FS"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:2998
+#, no-wrap
+msgid "`pciaccess`"
+msgstr "`pciaccess`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3000
+#, no-wrap
+msgid "Generic PCI access library"
+msgstr "Универсальная библиотека доступа к PCI"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3003
+#, no-wrap
+msgid "Low-level pixel manipulation library"
+msgstr "Библиотека для низкоуровневого управления пикселями"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3004
+#, no-wrap
+msgid "`sm`"
+msgstr "`sm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3006
+#, no-wrap
+msgid "Session Management library for X11"
+msgstr "Библиотека управления сеансами для X11"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3007
+#, no-wrap
+msgid "`x11`"
+msgstr "`x11`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3009
+#, no-wrap
+msgid "X11 library"
+msgstr "Библиотека X11"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3010
+#, no-wrap
+msgid "`xau`"
+msgstr "`xau`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3012
+#, no-wrap
+msgid "Authentication Protocol library for X11"
+msgstr "Библиотека протокола аутентификации для X11"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3013
+#, no-wrap
+msgid "`xaw`"
+msgstr "`xaw`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3015
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3018
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3021
+#, no-wrap
+msgid "X Athena Widgets library"
+msgstr "Библиотека X Athena Widgets"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3016
+#, no-wrap
+msgid "`xaw6`"
+msgstr "`xaw6`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3019
+#, no-wrap
+msgid "`xaw7`"
+msgstr "`xaw7`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3022
+#, no-wrap
+msgid "`xbitmaps`"
+msgstr "`xbitmaps`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3024
+#, no-wrap
+msgid "X.Org bitmaps data"
+msgstr "Данные растровых изображений X.Org"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3025
+#, no-wrap
+msgid "`xcb`"
+msgstr "`xcb`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3027
+#, no-wrap
+msgid "The X protocol C-language Binding (XCB) library"
+msgstr "Библиотека с интерфейсом языка С для X протокола (XCB)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3028
+#, no-wrap
+msgid "`xcomposite`"
+msgstr "`xcomposite`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3030
+#, no-wrap
+msgid "X Composite extension library"
+msgstr "Библиотека расширения X Composite"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3031
+#, no-wrap
+msgid "`xcursor`"
+msgstr "`xcursor`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3033
+#, no-wrap
+msgid "X client-side cursor loading library"
+msgstr "X библиотека загрузки курсоров на стороне клиента"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3034
+#, no-wrap
+msgid "`xdamage`"
+msgstr "`xdamage`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3036
+#, no-wrap
+msgid "X Damage extension library"
+msgstr "Библиотека расширения X Damage"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3037
+#, no-wrap
+msgid "`xdmcp`"
+msgstr "`xdmcp`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3039
+#, no-wrap
+msgid "X Display Manager Control Protocol library"
+msgstr "Библиотека протокола управления дисплейным менеджером X (XDMCP)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3040
+#, no-wrap
+msgid "`xext`"
+msgstr "`xext`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3042
+#, no-wrap
+msgid "X11 Extension library"
+msgstr "Библиотека расширений X11"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3043
+#, no-wrap
+msgid "`xfixes`"
+msgstr "`xfixes`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3045
+#, no-wrap
+msgid "X Fixes extension library"
+msgstr "Библиотека расширений X Fixes"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3046
+#, no-wrap
+msgid "`xfont`"
+msgstr "`xfont`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3048
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3051
+#, no-wrap
+msgid "X font library"
+msgstr "Библиотека шрифтов X"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3049
+#, no-wrap
+msgid "`xfont2`"
+msgstr "`xfont2`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3052
+#, no-wrap
+msgid "`xft`"
+msgstr "`xft`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3054
+#, no-wrap
+msgid "Client-sided font API for X applications"
+msgstr "Клиентский API шрифтов для приложений X"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3055
+#, no-wrap
+msgid "`xi`"
+msgstr "`xi`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3057
+#, no-wrap
+msgid "X Input extension library"
+msgstr "Библиотека расширения X Input"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3058
+#, no-wrap
+msgid "`xinerama`"
+msgstr "`xinerama`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3060
+#, no-wrap
+msgid "X11 Xinerama library"
+msgstr "Библиотека X11 Xinerama"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3061
+#, no-wrap
+msgid "`xkbfile`"
+msgstr "`xkbfile`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3063
+#, no-wrap
+msgid "XKB file library"
+msgstr "Библиотека файлов XKB"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3064
+#, no-wrap
+msgid "`xmu`"
+msgstr "`xmu`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3066
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3069
+#, no-wrap
+msgid "X Miscellaneous Utilities libraries"
+msgstr "Библиотека X Miscellaneous Utilities"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3067
+#, no-wrap
+msgid "`xmuu`"
+msgstr "`xmuu`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3070
+#, no-wrap
+msgid "`xorg-macros`"
+msgstr "`xorg-macros`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3072
+#, no-wrap
+msgid "X.Org development aclocal macros"
+msgstr "X.Org макросы разработки aclocal"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3073
+#, no-wrap
+msgid "`xorg-server`"
+msgstr "`xorg-server`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3075
+#, no-wrap
+msgid "X.Org X server and related programs"
+msgstr "Сервер X.Org X и относящиеся к нему программы"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3076
+#, no-wrap
+msgid "`xorgproto`"
+msgstr "`xorgproto`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3078
+#, no-wrap
+msgid "xorg protocol headers"
+msgstr "Заголовочные файлы протокола xorg"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3079
+#, no-wrap
+msgid "`xpm`"
+msgstr "`xpm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3081
+#, no-wrap
+msgid "X Pixmap library"
+msgstr "Библиотека X Pixmap"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3082
+#, no-wrap
+msgid "`xpresent`"
+msgstr "`xpresent`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3084
+#, no-wrap
+msgid "X Present Extension library"
+msgstr "Библиотека расширений X Present"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3085
+#, no-wrap
+msgid "`xrandr`"
+msgstr "`xrandr`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3087
+#, no-wrap
+msgid "X Resize and Rotate extension library"
+msgstr "Библиотека расширений X Resize and Rotate"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3088
+#, no-wrap
+msgid "`xrender`"
+msgstr "`xrender`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3090
+#, no-wrap
+msgid "X Render extension library"
+msgstr "Библиотека расширения X Render"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3091
+#, no-wrap
+msgid "`xres`"
+msgstr "`xres`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3093
+#, no-wrap
+msgid "X Resource usage library"
+msgstr "Библиотека мониторинга ресурсов X Resource usage"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3094
+#, no-wrap
+msgid "`xscrnsaver`"
+msgstr "`xscrnsaver`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3096
+#, no-wrap
+msgid "The XScrnSaver library"
+msgstr "Библиотека XScrnSaver"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3097
+#, no-wrap
+msgid "`xshmfence`"
+msgstr "`xshmfence`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3099
+#, no-wrap
+msgid "Shared memory 'SyncFence' synchronization primitive"
+msgstr "Примитив синхронизации \"SyncFence\" в разделяемой памяти"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3100
+#, no-wrap
+msgid "`xt`"
+msgstr "`xt`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3102
+#, no-wrap
+msgid "X Toolkit library"
+msgstr "Библиотека X Toolkit"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3103
+#, no-wrap
+msgid "`xtrans`"
+msgstr "`xtrans`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3105
+#, no-wrap
+msgid "Abstract network code for X"
+msgstr "Абстрактный сетевой код для X"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3106
+#, no-wrap
+msgid "`xtst`"
+msgstr "`xtst`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3108
+#, no-wrap
+msgid "X Test extension"
+msgstr "Расширение X Test"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3109
+#, no-wrap
+msgid "`xv`"
+msgstr "`xv`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3111
+#, no-wrap
+msgid "X Video Extension library"
+msgstr "Библиотека расширения X Video"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3112
+#, no-wrap
+msgid "`xvmc`"
+msgstr "`xvmc`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3114
+#, no-wrap
+msgid "X Video Extension Motion Compensation library"
+msgstr "Библиотека X Video Extension Motion Compensation"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3115
+#, no-wrap
+msgid "`xxf86dga`"
+msgstr "`xxf86dga`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3117
+#, no-wrap
+msgid "X DGA Extension"
+msgstr "Расширение X DGA"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3118
+#, no-wrap
+msgid "`xxf86vm`"
+msgstr "`xxf86vm`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3119
+#, no-wrap
+msgid "X Vidmode Extension"
+msgstr "Расширение X Vidmode"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3122
+#, no-wrap
+msgid "`xorg-cat`"
+msgstr "`xorg-cat`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3125
+msgid ""
+"Possible arguments: `app`, `data`, `doc`, `driver`, `font`, `lib`, `proto`, "
+"`util`, `xserver` and (none) or one off `autotools` (default), `meson`"
+msgstr ""
+"Возможные аргументы: `app`, `data`, `doc`, `driver`, `font`, `lib`, `proto`, "
+"`util`, `xserver` и (без аргументов) или один из `autotools` (по умолчанию), "
+"`meson`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3129
+msgid ""
+"Provide support for building Xorg components. It takes care of setting up "
+"common dependencies and an appropriate configuration environment needed. "
+"This is intended only for Xorg components."
+msgstr ""
+"Обеспечивает поддержку сборки компонентов Xorg. Управляет настройкой общих "
+"зависимостей и необходимой конфигурационной среды. Предназначено только для "
+"компонентов Xorg."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3131
+msgid "The category has to match upstream categories."
+msgstr "Категория должна соответствовать категориям вышестоящего репозитория."
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3134
+msgid ""
+"The second argument is the build system to use. autotools is the default, "
+"but meson is also supported."
+msgstr ""
+"Второй аргумент — используемая система сборки. По умолчанию используется "
+"`autotools`, но также поддерживается `meson`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3136
+#, no-wrap
+msgid "`zip`"
+msgstr "`zip`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3139
+msgid "Possible arguments: (none), `infozip`"
+msgstr "Возможные аргументы: (нет), `infozip`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/uses/_index.adoc:3141
+msgid ""
+"Indicates that the distribution files use the ZIP compression algorithm. "
+"For files using the InfoZip algorithm the `infozip` argument must be passed "
+"to set the appropriate dependencies."
+msgstr ""
+"Указывает, что файлы дистрибутива используют алгоритм сжатия ZIP. Для "
+"файлов, использующих алгоритм InfoZip, необходимо передать аргумент "
+"`infozip`, чтобы установить соответствующие зависимости."
diff --git a/documentation/content/ru/books/porters-handbook/versions/_index.adoc b/documentation/content/ru/books/porters-handbook/versions/_index.adoc
index 26bc8c466e..9be7515004 100644
--- a/documentation/content/ru/books/porters-handbook/versions/_index.adoc
+++ b/documentation/content/ru/books/porters-handbook/versions/_index.adoc
@@ -1,10 +1,12 @@
---
-title: Глава 16. Значения __FreeBSD_version
+description: 'Список изменений файла sys/param.h'
+params:
+ path: /books/porters-handbook/versions/
prev: books/porters-handbook/uses
showBookMenu: true
-weight: 16
-params:
- path: "/books/porters-handbook/versions/"
+tags: ["FreeBSD versions"]
+title: 'Глава 18. Значения __FreeBSD_version'
+weight: 18
---
[[versions]]
@@ -15,7 +17,7 @@ params:
:icons: font
:sectnums:
:sectnumlevels: 6
-:sectnumoffset: 16
+:sectnumoffset: 18
:partnums:
:source-highlighter: rouge
:experimental:
@@ -45,6313 +47,7575 @@ toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
-Here is a convenient list of `__FreeBSD_version` values as defined in http://svnweb.FreeBSD.org/base/head/sys/sys/param.h?view=markup[sys/param.h]:
+Здесь удобный список значений `__FreeBSD_version` как определено в https://cgit.freebsd.org/src/tree/sys/sys/param.h[sys/param.h]:
+
+[[versions-15]]
+== Версии FreeBSD 15
+
+[[freebsd-versions-table-15]]
+.Значения `__FreeBSD_version` в FreeBSD 15
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Значение
+| Версия
+| Дата
+| Релиз
+
+|1500000
+|gitref:29a16ce065dbc28bc9e87c9bfadb08bb58b137e4[repository="src",length=12]
+|24 августа 2023
+|15.0-CURRENT.
+
+|1500001
+|gitref:a6662c37b6ffee46e18be5f7570149edc64c1d0b[repository="src",length=12]
+|17 сентября 2023
+|15.0-CURRENT после реализации `fpu_kern_enter` и `fpu_kern_leave` для powerpc.
+
+|1500002
+|gitref:17f5e2b904aff8e4863199a137ee21ef0939bcf4[repository="src",length=12]
+|18 октября 2023
+|15.0-CURRENT после изменения внутреннего KAPI между модулями nfscommon и nfscl.
+
+|1500003
+|gitref:ef85fd507e6e1784a726bccd485129e00bb63311[repository="src",length=12]
+|1 ноября 2023
+|15.0-CURRENT после удаления кода обратной совместимости для преобразования inode64.
+
+|1500004
+|gitref:7fabea328fed60d5207b262d2372e85a7f731eef[repository="src",length=12]
+|23 ноября 2023
+|15.0-CURRENT после добавления новой функции VFS под названием `vfs_exjail_clone()`, которая будет использоваться модулем ZFS.
+
+|1500005
+|gitref:21fce617d1de231a30833cdd9819ef61277b08d8[repository="src",length=12]
+|27 ноября 2023
+|15.0-CURRENT после серии механических изменений в дереве: идентификаторы SCCS удалены, закомментированные строки с авторскими правами удалены с помощью `#if 0`, механические исправления стиля после этих изменений и удаление некоторых макросов из [.filename]#sys/cdefs.h#.
+
+|1500006
+|gitref:c711af7727824da79d87f375f3d6829feec3799a[repository="src",length=12]
+|8 декабря 2023
+|15.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-17.0.6-0-g6009708b4367, также известного как релиз 17.0.6.
+
+|1500007
+|gitref:8ccd0b876e67fda6249f294ff484798cc1e1569f[repository="src",length=12]
+|11 декабря 2023
+|15.0-CURRENT после предоставления доступа к execvpe для совместимости с Linux в libc.
+
+|1500008
+|gitref:9bf957fc9b378e0f9e65eb97e84c2166b450fccc[repository="src",length=12]
+|24 декабря 2023
+|15.0-CURRENT после изменений в LinuxKPI.
+
+|1500009
+|gitref:b068bb09a1a82d9fef0e939ad6135443a959e290[repository="src",length=12]
+|11 января 2024
+|15.0-CURRENT после добавления man:vnode_pager_clean_async[9] и man:vnode_pager_clean_sync[9].
+
+|1500010
+|gitref:a2da1bdb61bc2d9db0b4268f53281e7c0bbce0bc[repository="src",length=12]
+|12 января 2024
+|15.0-CURRENT после изменения внутреннего KAPI между модулями nfscommon и nfscl.
+
+|1500011
+|gitref:a2da1bdb61bc2d9db0b4268f53281e7c0bbce0bc[repository="src",length=12]
+|17 января 2024
+|15.0-CURRENT после добавления поддержки zfs.dataset в man:jail[8].
+
+|1500012
+|gitref:120ceebab5d4947dfc80d7492effa034a925d43e[repository="src",length=12]
+|24 января 2024
+|15.0-CURRENT после добавления man:kern_openatfp[9] и man:kcmp[2].
+
+|1500013
+|gitref:d04abb05375d3525132f1e9f78090db3d0d27f14[repository="src",length=12]
+|7 февраля 2024
+|15.0-CURRENT после добавления libsys.
+
+|1500014
+|gitref:ed27ae8df4b10f67289a32458d89d143e758f6d4[repository="src",length=12]
+|11 февраля 2024
+|15.0-CURRENT после переключения clang и других исполняемых файлов LLVM на сборку как PIE.
+
+|1500015
+|gitref:a7b9f4d96e8bdc30db27ec7a193a8d8fdf7c652c[repository="src",length=12]
+|13 марта 2024
+|15.0-CURRENT после удаления избыточных аргументов `type` и `rid` из нескольких функций в API ресурсов new-bus.
+
+|1500016
+|gitref:60bc9617e79e99bdf670304923f3baed4b749ad3[repository="src",length=12]
+|18 марта 2024
+|15.0-CURRENT после введения man:livedump_start_vnode[9].
+
+|1500017
+|gitref:bcd401b5a39c6186bb1fe450286299f2a481244c[repository="src",length=12]
+|20 марта 2024
+|15.0-CURRENT после исправления утверждения или сбоя clang при сборке последних библиотек boost.
+
+|1500018
+|gitref:0192eda105b367d4670205547e8e830e3716bea3[repository="src",length=12]
+|6 апреля 2024
+|15.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-18.1.3-0-gc13b7485b879, также известной как релиз 18.1.3.
+
+|1500019
+|gitref:e03e8b07743385e5b199409074fb60b1a9ed1fac[repository="src",length=12]
+|31 мая 2024
+|15.0-CURRENT после переопределения `CLOCK_BOOTTIME` как псевдонима для `CLOCK_MONOTONIC` вместо `CLOCK_UPTIME`.
+
+|1500020
+|gitref:7818c2d37c2c600fc9ad6f2a0951e50dd21b17c8[repository="src",length=12]
+|12 июля 2024
+|15.0-CURRENT после удаления поддержки сборки armv6.
+
+|1500021
+|gitref:24388fccd551f79f64e54099a7d78196535c0a29[repository="src",length=12]
+|21 июля 2024
+|15.0-CURRENT после изменений в LinuxKPI.
+
+|1500022
+|gitref:a1740cb93639648b41055958ad8c7f6083efdc96[repository="src",length=12]
+|29 июля 2024
+|15.0-CURRENT после удаления поддержки подкачки стека ядра.
+
+|1500023
+|gitref:1206cf04a717a55bc15255ed043b066941cb43f2[repository="src",length=12]
+|30 июля 2024
+|15.0-CURRENT после добавления новых флагов в man:malloc[9].
+
+|1500024
+|gitref:e3953c036f9d66c85b8e19f99f0710b3288ce5fb[repository="src",length=12]
+|2 октября 2024
+|15.0-CURRENT после увеличения версии [.filename]#libmd.so.6# до [.filename]#libmd.so.7#.
+
+|1500025
+|gitref:9d52823bf1dfac237e58b5208299aaa5e2df42e9[repository="src",length=12]
+|6 октября 2024
+|15.0-CURRENT после расширения поля `flags` в `vm_object`.
+
+|1500026
+|gitref:f3dbef108212460489ae68b4c47e20b73984f433[repository="src",length=12]
+|23 октября 2024
+|15.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-19.1.2-0-g7ba7d8e2f7b6, также известной как релиз 19.1.2.
+
+|1500027
+|gitref:893d044346d5ae5fe10cc188b8b0762efd2a5b27[repository="src",length=12]
+|14 ноября 2024
+|15.0-CURRENT после скрытия `struct ifnet` и изменения KPI регистрации устройств man:sound[4].
+
+|1500028
+|gitref:cab31f5633c1ffdd8b24749a3c9dd22c59568503[repository="src",length=12]
+|25 ноября 2024
+|15.0-CURRENT после добавления флага `TDA_PSELECT` для раннего восстановления масок сигналов.
+
+|1500029
+|gitref:46297859a74563dde6fc5bff9f9ecded9fb61ba6[repository="src",length=12]
+|6 декабря 2024
+|15.0-CURRENT после добавления `bus_attach_children`, `bus_detach_children` и `bus_identify_children`.
+
+|1500030
+|gitref:b196276c20b577b364372f1aa1a646b9ce34bf5c[repository="src",length=12]
+|2 января 2025
+|15.0-CURRENT после изменения `bus_generic_detach` для удаления дочерних устройств после их отключения.
+
+|1500037
+|gitref:7acd5af48cf1870ec48d5910dff1a26466d98074[repository="src",length=12]
+|12 апреля 2025
+|15.0-CURRENT после внесения изменений в alloc в LinuxKPI.
+
+|1500038
+|gitref:[repository="src",length=12]
+|19 апреля 2025
+|15.0-CURRENT после удаления vm_page_next() и _prev.
+
+|1500039
+|gitref:[repository="src",length=12]
+|4 мая 2025
+|15.0-CURRENT после введения правильно типизированных jiffies.
+
+|1500040
+|gitref:[repository="src",length=12]
+|4 мая 2025
+|15.0-CURRENT после изменения внутреннего API между модулями nfscommon и nfscl.
+
+|1500045
+|gitref:a02180cf60a6a0102669b678e9c81ad9f1aa4d91[repository="src",length=12]
+|3 июня 2025
+|15.0-CURRENT после внесения изменений dma-mapping.h из drm-kmod в LinuxKPI.
+
+|1500062
+|gitref:567e6250c003eeb251b4bc8dbe60d2adabab2988[repository="src",length=12]
+|17 августа 2025
+|15.0-CURRENT после добавления VTYPE_ISDEV(), VN_ISDEV() и VATTR_ISDEV().
+
+|===
+
+[[versions-14]]
+== Версии FreeBSD 14
+
+[[freebsd-versions-table-14]]
+.Значения `__FreeBSD_version` в FreeBSD 14
+[cols="1,1,1,1", frame="none", options="header"]
+|===
+| Значение
+| Версия
+| Дата
+| Релиз
+
+|1400000
+|gitref:a53ce3fc4938e37d5ec89304846203d2083c61a2[repository="src",length=12]
+|22 января 2021
+|14.0-CURRENT.
+
+|1400001
+|gitref:739ecbcf1c4fd22b5f6ee0bb180a67644046a3e0[repository="src",length=12]
+|23 января 2021
+|14.0-CURRENT после добавления поддержки символьных ссылок к бесблокировочному поиску.
+
+|1400002
+|gitref:2cf84258922f306a3f84866685d2f5346f67db58[repository="src",length=12]
+|26 января 2021
+|14.0-CURRENT после исправления утверждения clang при сборке порта package:devel/onetbb[].
+
+|1400003
+|gitref:d386f3a3c32f0396aa7995349dd65d6c59711393[repository="src",length=12]
+|28 января 2021
+|14.0-CURRENT после добавления различных компонентов LinuxKPI, конфликтующих с drm-kmod.
+
+|1400004
+|gitref:68f6800ce05c386ff045b4416d8595d09c4d8fdd[repository="src",length=12]
+|8 февраля 2021
+|14.0-CURRENT после изменения интерфейсов ядра для диспетчеризации криптографических операций.
+
+|1400005
+|gitref:45eabf5754ac1d291bd677fdf29f59ce4bbc2c8f[repository="src",length=12]
+|17 февраля 2021
+|14.0-CURRENT после изменения API man:ptrace[2] `PT_GETDBREGS`/`PT_SETDBREGS` на arm64.
+
+|1400006
+|gitref:c96151d33509655efb7fb26768cb56a041c176f1[repository="src",length=12]
+|17 марта 2021
+|14.0-CURRENT после добавления перечисляющих ioctl в man:sndstat[4].
+
+|1400007
+|gitref:d36d6816151705907393889d661cbfd25c630ca8[repository="src",length=12]
+|6 апреля 2021
+|14.0-CURRENT после исправления некорректного `dlpi_tls_data`.
+
+|1400008
+|gitref:e152bbecb221a592e7dbcabe3d1170a60f0d0dfe[repository="src",length=12]
+|11 апреля 2021
+|14.0-CURRENT после изменения внутреннего KAPI между модулями `krpc` и NFS.
+
+|1400009
+|gitref:9ca874cf740ee68c5742df8b5f9e20910085c011[repository="src",length=12]
+|20 апреля 2021
+|14.0-CURRENT после добавления поддержки TCP LRO для VLAN и VxLAN.
+
+|1400010
+|gitref:a3a02acde1009f03dc78e979e051acee9f9247c2[repository="src",length=12]
+|21 апреля 2021
+|14.0-CURRENT после изменения схемы и определений `nvlist` для ioctl man:sndstat[4].
+
+|1400015
+|gitref:d72cd275187c6399caf0ca4125292dc7e55fa478[repository="src",length=12]
+|25 мая 2021
+|14.0-CURRENT после добавления дополнительных изменений LinuxKPI, требующих корректировки drm-kmod.
+
+|1400016
+|gitref:21e3c1fbe2460f144f6d4dfd61c3346b2de59667[repository="src",length=12]
+|25 мая 2021
+|14.0-CURRENT после удаления поддержки программных бэкендов KTLS.
+
+|1400017
+|gitref:beb817edfe22cdea91e19a60c42caabd9404da48[repository="src",length=12]
+|25 мая 2021
+|14.0-CURRENT после добавления `crypto_cursor_segment()`.
+
+|1400018
+|gitref:a4b07a2701f568c2c0f0c0426091f1489244a92d[repository="src",length=12]
+|30 мая 2021
+|14.0-CURRENT после разрешения реализации man:VFS_QUOTACTL[9] указывать изменения состояния занятости.
+
+|1400019
+|gitref:37d64dcdfa519157aff9711f1f226ad7bd778f46[repository="src",length=12]
+|7 июня 2021
+|14.0-CURRENT после включения `pr_err_once()` в LinuxKPI [.filename]#printk.h#.
+
+|1400020
+|gitref:8a1a42b2a7a428fb97fda9f19fd0d67a4eec7535[repository="src",length=12]
+|9 июня 2021
+|14.0-CURRENT после добавления макросов для `might_lock_nested()` и `lockdep_(re/un/)pin_lock()` в LinuxKPI.
+
+|1400021
+|gitref:b47f461c8e67253fdb394968428b760e880baa08[repository="src",length=12]
+|10 июня 2021
+|14.0-CURRENT после добавления макроса `list_for_each_entry_lockless()` в LinuxKPI.
+
+|1400022
+|gitref:40cc9a3a6b81a65a03712dfd93bbed48552a97ad[repository="src",length=12]
+|11 июня 2021
+|14.0-CURRENT после коммита gitref:e1a907a25cfa422c0d1acaf9f91352ada04f4bca[repository="src",length=12] изменил внутренний KAPI между модулями `krpc` и nfsserver.
+
+|1400023
+|gitref:d409305fa3838fb39b38c26fc085fb729b8766d5[repository="src",length=12]
+|13 июня 2021
+|14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-12.0.0-0-gd28af7c654d8, также известной как релиз 12.0.0.
+
+|1400024
+|gitref:41dfd8bd6466fd39957dee2614d88c81cdf420a7[repository="src",length=12]
+|18 июня 2021
+|14.0-CURRENT после различных добавлений в LinuxKPI.
+
+|1400025
+|gitref:5fa1eb1cd927219070b5753b64114a9240d76bf8[repository="src",length=12]
+|5 июля 2021
+|14.0-CURRENT после различных добавлений в LinuxKPI.
+
+|1400026
+|gitref:fad3f322efb53d4924fdda34f9f23f881659c269[repository="src",length=12]
+|16 июля 2021
+|14.0-CURRENT после изменения внутреннего KAPI между модулями nfscommon и nfsd.
+
+|1400027
+|gitref:cc55ee8009a550810d38777fd6ace9abf3a2f6b4[repository="src",length=12]
+|28 июля 2021
+|14.0-CURRENT после добавления вспомогательных функций LSE атомарных операций вне строки в [.filename]#libcompiler_rt.a# для архитектуры aarch64.
+
+|1400028
+|gitref:792b602a337ddc5efaa5e5326d9433fe3da7f303[repository="src",length=12]
+|31 июля 2021
+|14.0-CURRENT после обеспечения потокобезопасности разделов FPU в LinuxKPI.
+
+|1400029
+|gitref:245ec7651e4221043d1032fb3f82f335dc65fc7f[repository="src",length=12]
+|5 августа 2021
+|14.0-CURRENT после добавления man:fspacectl[2], man:vn_deallocate[9] и man:VOP_DEALLOCATE[9].
+
+|1400030
+|gitref:95941b963606f6e03282cd6f866f3166dcedfa5b[repository="src",length=12]
+|12 августа 2021
+|14.0-CURRENT после изменений параметров man:VOP_DEALLOCATE[9] и добавления поддержки man:fspacectl[2] для POSIX разделяемой памяти.
+
+|1400031
+|gitref:1a4c5061fc5ba8f2eee41456a6873547915f268a[repository="src",length=12]
+|24 августа 2021
+|14.0-CURRENT после изменения man:fspacectl[2], man:vn_deallocate[9] и man:VOP_DEALLOCATE[9] для обновления rmsr.r_offset до значимого значения.
+
+|1400032
+|gitref:76321d2d432ed270d93b282e54e59b708c0cf3b4[repository="src",length=12]
+|25 августа 2021
+|14.0-CURRENT после изменения man:fspacectl[2], man:vn_deallocate[9] и man:VOP_DEALLOCATE[9] для упрощения подсчёта количества обнулённых байт.
+
+|1400033
+|gitref:c751d067c166db71ce8bf3a323c62ac3428bd32a[repository="src",length=12]
+|7 сентября 2021
+|14.0-CURRENT после перемещения блокировок буфера сокета в содержащий сокет и переименования sb(un)lock в SOCK_IO_RECV_LOCK, SOCK_IO_RECV_UNLOCK, SOCK_IO_SEND_LOCK и SOCK_IO_SEND_UNLOCK.
+
+|1400034
+|gitref:c751d067c166db71ce8bf3a323c62ac3428bd32a[repository="src",length=12]
+|29 сентября 2021
+|14.0-CURRENT после изменений в LinuxKPI.
+
+|1400035
+|gitref:16f1ee11e6574d7f8d8a9dc6ebc9be3036ff9fd0[repository="src",length=12]
+|4 октября 2021
+|14.0-CURRENT после разделения libtinfow и libncurses.
+
+|1400036
+|gitref:ac847dbf73685a5df9f70bbcdefa9fdeb559071d[repository="src",length=12]
+|6 октября 2021
+|14.0-CURRENT после расширения шифров AES-CCM и Chacha20-Poly1305 в OCF для поддержки нескольких длин одноразовых номеров.
+
+|1400037
+|gitref:2b68eb8e1dbbdaf6a0df1c83b26f5403ca52d4c3[repository="src",length=12]
+|11 октября 2021
+|14.0-CURRENT после удаления аргумента thread из man:VOP_STAT[9] и `fo_stat`.
+
+|1400038
+|gitref:0d6516b453469ce1d92ec903c4c4df9ee08be0f9[repository="src",length=12]
+|17 октября 2021
+|14.0-CURRENT после того, как LinuxKPI получил поддержку отложенного выделения BAR.
+
+|1400039
+|gitref:bd49c454ca62170506a98959c1acab7ad50c3276[repository="src",length=12]
+|19 октября 2021
+|14.0-CURRENT после изменений в аллокаторе страниц.
+
+|1400040
+|gitref:f38bef2ce417d6270f32b4ed17cec84bfd95d548[repository="src",length=12]
+|30 октября 2021
+|14.0-CURRENT после увеличения номера версии разделяемой библиотеки libdialog.
+
+|1400041
+|gitref:0c276dee030b241e12e1ceb1b2ab619004f08ce1[repository="src",length=12]
+|6 ноября 2021
+|14.0-CURRENT после изменения аргументов для man:VOP_ALLOCATE[9].
+
+|1400042
+|gitref:20aa359773befc8182f6b5dcb5aad7390cab6c26[repository="src",length=12]
+|13 ноября 2021
+|14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-13.0.0-0-gd7b669b3a303, также известного как релиз 13.0.0.
+
+|1400043
+|gitref:7e1d3eefd410ca0fbae5a217422821244c3eeee4[repository="src",length=12]
+|25 ноября 2021
+|14.0-CURRENT после удаления неиспользуемого аргумента потока из man:NDINIT[9]*.
+
+|1400044
+|gitref:ec434c85b46dd715da1940e2a8911bf476b0e477[repository="src",length=12]
+|9 декабря 2021
+|14.0-CURRENT после изменения встроенных программных криптографических преобразований для поддержки AEAD-шифров и изменения аутентификационных преобразований Blake-2S/B для поддержки Init перед Setkey, как в других аутентификационных преобразованиях.
+
+|1400045
+|gitref:b214fcceacad6b842545150664bd2695c1c2b34f[repository="src",length=12]
+|15 декабря 2021
+|14.0-CURRENT после изменения аргумента cookies в man:VOP_READDIR[9] на `**uint64_t`.
+
+|1400046
+|gitref:e2650af157bc7489deaf2c9054995f0f88a6e5da[repository="src",length=12]
+|30 декабря 2021
+|14.0-CURRENT после приведения макросов CPU_SET в соответствие с glibc.
+
+|1400047
+|gitref:ed6417cd8d0bb5a2c175fce9d8e4a495fae9e9f4[repository="src",length=12]
+|January 17, 2022
+|14.0-CURRENT после множества изменений LinuxKPI, необходимых для drm-kmod.
+
+|1400048
+|gitref:dd2f7a4b45eb1285e710cfce60cb77f7c11f8075[repository="src",length=12]
+|18 января 2022
+|14.0-CURRENT после добавления <crypto/chacha20_poly1305.h>.
+
+|1400049
+|gitref:2c4b65cc3d227f31864e183c15f6c42e2c596cd9[repository="src",length=12]
+|January 24, 2022
+|14.0-CURRENT after adding <crypto/curve25519.h>.
+
+|1400050
+|gitref:213e91399b7998554d787bb290109ebe602aa279[repository="src",length=12]
+|25 января 2022
+|14.0-CURRENT после iflib добавляет возможность, при которой драйвер может установить свою собственную функцию выбора TX-очереди как `ift_txq_select` в структуре `if_txrx`.
+
+|1400051
+|gitref:59d465e200bb7058dfdb183c061730c10dd5bc03[repository="src",length=12]
+|25 января 2022
+|14.0-CURRENT после добавления поддержки i2c для LinuxKPI.
+
+|1400052
+|gitref:05f0b24bfb3416606c8ea02bc1bdb9bcee7aee0c[repository="src",length=12]
+|February 14, 2022
+|14.0-CURRENT после добавления поддержки GUID_INIT и pm_qos.h для LinuxKPI.
+
+|1400053
+|gitref:ba87e9bf74202b08b8e3b0a297b9b88f6869fbfb[repository="src",length=12]
+|February 17, 2022
+|14.0-CURRENT после добавления mmap_lock.h в LinuxKPI.
+
+|1400054
+|gitref:50bb3a33d879536e86e8a23365f070ef00b5cb32[repository="src",length=12]
+|28 марта 2022
+|14.0-CURRENT после изменения `irq_work_queue` для возврата типа bool в LinuxKPI в соответствии с API 5.10.
+
+|1400055
+|gitref:d69af4758be912625ec08656ba64eb90a98c9a7f[repository="src",length=12]
+|29 марта 2022
+|14.0-CURRENT после добавления `for_each_sgtable_dma_sg` и `for_each_sgtable_dma_page` в LinuxKPI
+
+|1400056
+|gitref:ab8ac4c28574a42a2891b2e2341f802949c1fb57[repository="src",length=12]
+|31 марта 2022
+|14.0-CURRENT после обновления zlib до версии 1.2.12
+
+|1400057
+|gitref:e68b35e40881a1bd858e1b4b5003123a484fd7cd[repository="src",length=12]
+|22 апреля 2022
+|14.0-CURRENT после изменения прототипа udp_tun_func_t().
+
+|1400058
+|gitref:2e32d4e41d205d6f14834f87306a77ff77b9c0bd[repository="src",length=12]
+|7 мая 2022
+|14.0-CURRENT после изменений в newbus для удаления аргументов devclass.
+
+|1400059
+|gitref:3a9a9c0ca44ec535dcf73fe8462bee458e54814b[repository="src",length=12]
+|14 мая 2022
+|14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-14.0.3-0-g1f9140064dfb, также известной как релиз 14.0.3.
+
+|1400060
+|gitref:85d7875d42913c2cb10a007a1be05b210dc6aab2[repository="src",length=12]
+|6 июня 2022
+|14.0-CURRENT после исправлений LinuxKPI dmi_matches().
+
+|1400061
+|gitref:c4c5981c14d5bd69e9df9ae691069ec4c2e92174[repository="src",length=12]
+|8 июня 2022
+|14.0-CURRENT после изменений структуры man:mbuf[9].
+
+|1400062
+|gitref:8c309d48aabf1cb469334c7716033f177a2715c0[repository="src",length=12]
+|18 июня 2022
+|14.0-CURRENT после изменений структуры `kinfo_file`.
+
+|1400063
+|gitref:8cff8e6e13a6d3ccff40fc0d8d97f5aef22a8f4d[repository="src",length=12]
+|29 июня 2022
+|14.0-CURRENT после множества изменений LinuxKPI, необходимых для drm-kmod.
+
+|1400064
+|gitref:ddd9004e7a5dbf02c34ef0effcef90f7d5df357d[repository="src",length=12]
+|18 июля 2022
+|14.0-CURRENT после удаления OBJT_DEFAULT.
+
+|1400065
+|gitref:b273f93657cf0e6f2c6ee4d0f40a43656233c6d0[repository="src",length=12]
+|8 августа 2022
+|14.0-CURRENT после множества изменений LinuxKPI, необходимых для drm-kmod.
+
+|1400066
+|gitref:ff7812ee7d444b738a454064f9639c3feb5743e8[repository="src",length=12]
+|18 августа 2022
+|14.0-CURRENT после множества изменений LinuxKPI, необходимых для drm-kmod.
+
+|1400069
+|gitref:f95c0bc89ea4fcde04b0990d57e842ef387ea896[repository="src",length=12]
+|22 сентября 2022
+|14.0-CURRENT после нескольких изменений в LinuxKPI.
+
+|1400070
+|gitref:6bddde307e21eba297ac3f3e534b4cf3be81dfe2[repository="src",length=12]
+|22 сентября 2022
+|14.0-CURRENT после изменений KPI в pmap_unmapdev() и kmem_*().
+
+|1400071
+|gitref:d3f96f661050e9bd21fe29931992a8b9e67ff189[repository="src",length=12]
+|26 сентября 2022
+|14.0-CURRENT после изменений KPI, когда списки OID sysctl были преобразованы в RB-деревья.
+
+|1400072
+|gitref:8a96874eeeee5195b0b0952b77227bef6a26d1a6[repository="src",length=12]
+|22 сентября 2022
+|14.0-CURRENT после изменения прототипа `qsort_r` для соответствия POSIX.
+
+|1400073
+|gitref:9c950139051298831ce19d01ea5fb33ec6ea7f89[repository="src",length=12]
+|17 октября 2022
+|14.0-CURRENT after introduction of v2 of TX Queue Select Functionality.
+
+|1400074
+|gitref:e28932c643e891294a49f386ba65322cf8410225[repository="src",length=12]
+|9 декабря 2022
+|14.0-CURRENT после добавления запасных слотов fops в fileops.
+
+|1400078
+|gitref:4b56afaf7bf4fa37bae5b26fd93ee1ff5969c1bb[repository="src",length=12]
+|13 января 2023
+|14.0-CURRENT после изменения LinuxKPI pci.h.
+
+|1400079
+|gitref:3264f6b88fce7c5437d205685863617d8f6a22dd[repository="src",length=12]
+|8 февраля 2023
+|14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-15.0.7-0-g8dfdcc7b7bf6, также известного как релиз 15.0.7.
+
+|1400084
+|gitref:ea3061526e9ce5d3b65932c1d3e4437abd556d65[repository="src",length=12]
+|23 марта 2023
+|14.0-CURRENT после изменения структур reg, gpreg, trapframe и pcb для архитектуры arm64.
+
+|1400085
+|gitref:1cebc9298cf2272da46c3c574d06a80ce59854aa[repository="src",length=12]
+|28 марта 2023
+|14.0-CURRENT после нескольких изменений в LinuxKPI.
+
+|1400086
+|gitref:c17eb99a66e7d1e8a64458a969eeb7649f827493[repository="src",length=12]
+|8 апреля 2023
+|14.0-CURRENT после изменений аргументов vn_lock_pair().
+
+|1400087
+|gitref:af22da75a035e25cb47cd3f2eabe5a84d8a5cb34[repository="src",length=12]
+|22 апреля 2023
+|14.0-CURRENT после обновлений LinuxKPI.
+
+|1400088
+|gitref:97583aa2567589cb83540d2d9de1980b76db9a99[repository="src",length=12]
+|24 апреля 2023
+|14.0-CURRENT после миграции LinuxKPI на IfAPI.
+
+|1400089
+|gitref:9fb6718d1b180c341373b25c03dbfc221ddee311[repository="src",length=12]
+|25 апреля 2023
+|14.0-CURRENT после динамического выделения массива stoppcbs в smp.
+
+|1400090
+|gitref:653738e895ba022be1179a95a85089e7bc66dbbe[repository="src",length=12]
+|7 июня 2023
+|14.0-CURRENT после того, как ptrace начал очищать TDB_BORN во время PT_DETACH.
+
+|1400091
+|gitref:a681cba16d8967651a2146385ce44a2bfeb1c4c3[repository="src",length=12]
+|22 июня 2023
+|14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-16.0.6-0-g7cbf1a259152, также известного как релиз 16.0.6.
+
+|1400092
+|gitref:9ead001d5b42ef9cba04757c9e7ee74c06037139[repository="src",length=12]
+|24 июня 2023
+|14.0-CURRENT после импорта OpenSSL 3.0.9 в базовую систему.
+
+|1400093
+|gitref:ba8cc6d7271a50fec978a1d3a088aec7985fae48[repository="src",length=12]
+|5 июля 2023
+|14.0-CURRENT после использования __enum_uint8 для vtype и vstate в VFS
+
+|1400097
+|gitref:29a16ce065dbc28bc9e87c9bfadb08bb58b137e4[repository="src",length=12]
+|24 августа 2023
+|14.0-STABLE после ветвления stable/14
+
+|1400500
+|gitref:29a16ce065dbc28bc9e87c9bfadb08bb58b137e4[repository="src",length=12]
+|8 сентября 2023
+|14.0-STABLE после ветвления releng/14.0
+
+|1400501
+|gitref:91e53779b4fc39e755a03190f785ce0cf3f83eb7[repository="src",length=12]
+|19 ноября 2023
+|14.0-STABLE после реализации `fpu_kern_enter` и `fpu_kern_leave` для powerpc.
+
+|1400502
+|gitref:092abb839d1d2826533bb9c4c93d713f8b5043f9[repository="src",length=12]
+|24 декабря 2023
+|14.0-STABLE после изменения внутреннего API между модулями kgssapi и krpc.
+
+|1400503
+|gitref:ba99d960884d50eb7d36146914206644ee132aa4[repository="src",length=12]
+|29 декабря 2023
+|14.0-STABLE после изменения внутреннего KAPI между модулями nfscommon и nfscl.
+
+|1400504
+|gitref:68584c97ecfb3046de7fb1b16c2caa785392237c[repository="src",length=12]
+|7 января 2024
+|14.0-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-17.0.6-0-g6009708b4367, также известного как релиз 17.0.6.
+
+|1400505
+|gitref:64e869e9b93c8ce47f874b770df696c06bcba0d3[repository="src",length=12]
+|7 января 2024
+|14.0-STABLE после добавления man:vnode_pager_clean_async[9] и man:vnode_pager_clean_sync[9].
+
+|1400506
+|gitref:d9041710958227194c5e34b169ae73d7ad411017[repository="src",length=12]
+|19 января 2024
+|14.0-STABLE после изменения внутреннего KAPI между модулями nfscommon и nfscl.
+
+|1400507
+|gitref:b566e44b2b88eb9f1b3b658998c7418cccab9e2f[repository="src",length=12]
+|31 января 2024
+|14.0-STABLE после добавления man:kern_openatfp[9] и man:kcmp[2].
+
+|1400508
+|gitref:2d120981e26dfef5c9cb9eb9936bb46cb6918136[repository="src",length=12]
+|18 февраля 2024
+|14.0-STABLE после обновлений LinuxKPI.
+
+|1400509
+|gitref:b392b36d3776b696601ce0253256803276d24ea2[repository="src",length=12]
+|18 февраля 2024
+|14.0-STABLE после изменения внутренней структуры `struct ieee80211vap` в net80211.
+
+|1400510
+|gitref:69da6e0879831f1ccc5c60135ed43fcea10a933b[repository="src",length=12]
+|23 марта 2024
+|14.0-STABLE после исправления утверждения или падения clang при сборке последних библиотек boost.
+
+|1400511
+|gitref:7c41358a2b0a2e70a2b61ec347354f3452e4d2f3[repository="src",length=12]
+|20 апреля 2024
+|14.0-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-18.1.3-0-gc13b7485b879, также известной как релиз 18.1.3.
+
+|1401500
+|gitref:7b082bdf72e65f94b9b17d9fa1d0c1c202e4eb49[repository="src",length=12]
+|2 мая 2024
+|14.1-STABLE после переименования из 14.1-PRERELEASE.
+
+|1401501
+|gitref:f285eabc89ce8ccf3aaf563401df942e406c2b5f[repository="src",length=12]
+|6 июня 2024
+|14.1-STABLE после добавления модуля linuxkpi_video.
+
+|1401502
+|gitref:b37a6d41a046dbb46ee1d6bf00c710c03c944a24[repository="src",length=12]
+|2 августа 2024
+|14.1-STABLE после изменений в LinuxKPI.
+
+|1401503
+|gitref:8a5a9dbf389e86d278764ababf2f1eb8ee276680[repository="src",length=12]
+|15 октября 2024
+|14.1-STABLE после расширения поля `flags` в `vm_object`.
+
+|1402500
+|gitref:4e8444d5750a5d9da9c812e8f6caf6d62862be0a[repository="src",length=12]
+|31 октября 2024
+|14.2-STABLE после переименования из 14.2-PRERELEASE.
+
+|1402501
+|gitref:35d2f335e855af816d0a7fe5baf6a3facba84562[repository="src",length=12]
+|1 декабря 2024
+|14.2-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-19.1.4-0-gaadaa00de76e, также известного как релиз 19.1.4.
+
+|1402502
+|gitref:d172f42e4ba7ba8542ae0866aaba56e329b4ea2c[repository="src",length=12]
+|27 февраля 2025
+|14.2-STABLE после удаления избыточных аргументов `type` и `rid` из нескольких функций в API ресурсов new-bus.
+
+|1402503
+|gitref:4aed8b3b613c5e1499336e4d7ec7e9a3ac3d9a12[repository="src",length=12]
+|27 февраля 2025
+|14.2-STABLE после добавления `bus_attach_children`, `bus_detach_children` и `bus_identify_children`.
+
+|1402505
+|gitref:a3b2d8e360c37853035f9cede6064c4602312bfc[repository="src",length=12]
+|18 апреля 2025
+|14.2-STABLE после изменения аллокации в LinuxKPI и удаления микропрограммы iwlwifi.
+
+|1403503
+|gitref:6cdcf08c9c5eda6dc3b8395cefd9d30a4f5e2f1a[repository="src",length=12]
+|13 июля 2025
+|14.3-STABLE после изменений в LinuxKPI dma-mapping.h and acpi.
+
+|===
+
+////
+Template:
+
+|14XXXXX
+|gitref:XXXXXXXX[repository="src",length=12]
+|October 30, 2021
+|14.0-CURRENT after XXXXXX.
+////
[[versions-13]]
-== FreeBSD 13 Versions
+== FreeBSD 13 Версии
[[freebsd-versions-table-13]]
-.FreeBSD 13 `__FreeBSD_version` Values
+.FreeBSD 13 Значения `__FreeBSD_version`
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|1300000
|link:https://svnweb.freebsd.org/changeset/base/339436[339436]
-|October 19, 2018
+|19 октября 2018
|13.0-CURRENT.
|1300001
|link:https://svnweb.freebsd.org/changeset/base/339730[339730]
-|October 25, 2018
-|13.0-CURRENT after bumping OpenSSL shared library version numbers.
+|25 октября 2018
+|13.0-CURRENT после увеличения номеров версий разделяемых библиотек OpenSSL.
|1300002
|link:https://svnweb.freebsd.org/changeset/base/339765[339765]
-|October 25, 2018
-|13.0-CURRENT after restoration of [.filename]#sys/joystick.h#.
+|25 октября 2018
+|13.0-CURRENT после восстановления [.filename]#sys/joystick.h#.
|1300003
|link:https://svnweb.freebsd.org/changeset/base/340055[340055]
-|November 2, 2018
-|13.0-CURRENT after vop_symlink API change (`a_target` is now `const`.)
+|2 ноября 2018
+|13.0-CURRENT после изменения API `vop_symlink` (параметр `a_target` теперь объявлен как `const`.)
|1300004
|link:https://svnweb.freebsd.org/changeset/base/340841[340841]
-|November 23, 2018
-|13.0-CURRENT after enabling crtbegin and crtend code.
+|23 ноября 2018
+|13.0-CURRENT после включения кода crtbegin и crtend.
|1300005
|link:https://svnweb.freebsd.org/changeset/base/341836[341836]
-|December 11, 2018
-|13.0-CURRENT after enabling UFS inode checksums.
+|11 декабря 2018
+|13.0-CURRENT после включения контрольных сумм inode в UFS.
|1300006
|link:https://svnweb.freebsd.org/changeset/base/342398[342398]
-|December 24, 2018
-|13.0-CURRENT after fixing `sys/random.h` include to be usable from C++.
+|24 декабря 2018
+|13.0-CURRENT после исправления включения [.filename]#sys/random.h# для использования из C++.
|1300007
|link:https://svnweb.freebsd.org/changeset/base/342629[342629]
-|December 30, 2018
-|13.0-CURRENT after changing the size of `struct linux_cdev` on 32-bit platforms.
+|30 декабря 2018
+|13.0-CURRENT после изменения размера `struct linux_cdev` на 32-битных платформах.
|1300008
|link:https://svnweb.freebsd.org/changeset/base/342772[342772]
-|January 4, 2019
-|13.0-CURRENT after adding `kern.smp.threads_per_core` and `kern.smp.cores` sysctls.
+|4 января 2019
+|13.0-CURRENT после добавления системных переменных `kern.smp.threads_per_core` и `kern.smp.cores`.
|1300009
|link:https://svnweb.freebsd.org/changeset/base/343213[343213]
-|January 20, 2019
-|13.0-CURRENT after `struct ieee80211vap` structure change to resolve ioctl/detach race for ieee80211com structure.
+|20 января 2019
+|13.0-CURRENT после изменения структуры `struct ieee80211vap` для устранения состояния гонки между ioctl и detach в структуре ieee80211com.
|1300010
|link:https://svnweb.freebsd.org/changeset/base/343485[343485]
-|January 27, 2019
-|13.0-CURRENT after increasing `SPECNAMELEN` from 63 to MAXNAMELEN (255).
+|27 января 2019
+|13.0-CURRENT после увеличения `SPECNAMELEN` с 63 до `MAXNAMELEN` (255).
|1300011
|link:https://svnweb.freebsd.org/changeset/base/344041[344041]
-|February 12, 2019
-|13.0-CURRENT after man:renameat[2] has been corrected to work with kernels built with the `CAPABILITIES` option.
+|12 февраля 2019
+|13.0-CURRENT после исправления man:renameat[2] для работы с ядрами, собранными с опцией `CAPABILITIES`.
|1300012
|link:https://svnweb.freebsd.org/changeset/base/344062[344062]
-|February 12, 2019
-|13.0-CURRENT after `taskqgroup_attach()` and `taskqgroup_attach_cpu()` take a device_t and a struct resource pointer as arguments for denoting device interrupts.
+|12 февраля 2019
+|13.0-CURRENT после того, как `taskqgroup_attach()` и `taskqgroup_attach_cpu()` принимают аргументы `device_t` и указатель на структуру resource для обозначения прерываний устройства.
|1300013
|link:https://svnweb.freebsd.org/changeset/base/344300[344300]
-|February 19, 2019
-|13.0-CURRENT after the removal of drm and drm2.
+|19 февраля 2019
+|13.0-CURRENT после удаления drm и drm2.
|1300014
|link:https://svnweb.freebsd.org/changeset/base/344779[344779]
-|March 4, 2019
-|13.0-CURRENT after upgrading clang, llvm, lld, lldb, compiler-rt and libc++ to 8.0.0 rc3.
+|4 марта 2019
+|13.0-CURRENT после обновления clang, llvm, lld, lldb, compiler-rt и libc++ до версии 8.0.0 rc3.
|1300015
|link:https://svnweb.freebsd.org/changeset/base/345196[345196]
-|March 15, 2019
-|13.0-CURRENT after deanonymizing thread and proc state enums, so userland applications can use them without redefining the value names.
+|15 марта 2019
+|13.0-CURRENT после деанонимизации перечислений состояний потоков и процессов, что позволяет приложениям пользовательского пространства использовать их без переопределения имен значений.
|1300016
|link:https://svnweb.freebsd.org/changeset/base/345236[345236]
-|March 16, 2019
-|13.0-CURRENT after enabling LLVM OpenMP 8.0.0 rc5 on amd64 by default.
+|16 марта 2019
+|13.0-CURRENT после включения LLVM OpenMP 8.0.0 rc5 на amd64 по умолчанию.
|1300017
|link:https://svnweb.freebsd.org/changeset/base/345305[345305]
-|March 19, 2019
-|13.0-CURRENT after exposing the Rx mbuf buffer size to drivers in iflib.
+|19 марта 2019
+|13.0-CURRENT после раскрытия размера буфера Rx mbuf для драйверов в iflib.
|1300018
|link:https://svnweb.freebsd.org/changeset/base/346012[346012]
-|March 16, 2019
-|13.0-CURRENT after introduction of funlinkat syscall in link:https://svnweb.freebsd.org/changeset/base/345982[345982].
+|16 марта 2019
+|13.0-CURRENT после введения системного вызова `funlinkat` в link:https://svnweb.freebsd.org/changeset/base/345982[345982].
|1300019
|link:https://svnweb.freebsd.org/changeset/base/346282[346282]
-|April 16, 2019
-|13.0-CURRENT after addition of is_random_seeded(9) to man:random[4].
+|16 апреля 2019
+|13.0-CURRENT после добавления man:is_random_seeded[9] в man:random[4].
|1300020
|link:https://svnweb.freebsd.org/changeset/base/346358[346358]
-|April 18, 2019
-|13.0-CURRENT after restoring man:random[4] availability tradeoff prior to link:https://svnweb.freebsd.org/changeset/base/346250[346250] and adding new tunables and diagnostic sysctls for programmatically discovering early seeding problems after boot.
+|18 апреля 2019
+|13.0-CURRENT после восстановления доступности man:random[4] с учетом компромиссов до link:https://svnweb.freebsd.org/changeset/base/346250[346250] и добавления новых настроек и диагностических sysctl для программного обнаружения проблем с ранней инициализацией семени после загрузки.
|1300021
|link:https://svnweb.freebsd.org/changeset/base/346645[346645]
-|April 24, 2019
-|13.0-CURRENT after LinuxKPI uses man:bus_dma[9] to be compatible with an IOMMU.
+|24 апреля 2019
+|13.0-CURRENT после того, как LinuxKPI использует man:bus_dma[9] для совместимости с IOMMU.
|1300022
|link:https://svnweb.freebsd.org/changeset/base/347089[347089]
-|May 4, 2019
-|13.0-CURRENT after fixing regression issue after link:https://svnweb.freebsd.org/changeset/base/346645[346645] in the LinuxKPI.
+|4 мая 2019
+|13.0-CURRENT после исправления регрессии, возникшей после link:https://svnweb.freebsd.org/changeset/base/346645[346645] в LinuxKPI.
|1300023
|link:https://svnweb.freebsd.org/changeset/base/347192[347192]
-|May 6, 2019
-|13.0-CURRENT after list-ifying kernel dump device configuration.
+|6 мая 2019
+|13.0-CURRENT после преобразования конфигурации устройства дампа ядра в список.
|1300024
|link:https://svnweb.freebsd.org/changeset/base/347325[347325]
-|May 8, 2019
-|13.0-CURRENT after bumping the Mellanox driver version numbers (man:mlx4en[4]; man:mlx5en[4]).
+|8 мая 2019
+|13.0-CURRENT после увеличения номеров версий драйверов Mellanox (man:mlx4en[4]; man:mlx5en[4]).
|1300025
|link:https://svnweb.freebsd.org/changeset/base/347532[347532]
-|May 13, 2019
-|13.0-CURRENT after renaming `vm.max_wired` to `vm.max_user_wired` and changing its type.
+|13 мая 2019
+|13.0-CURRENT после переименования `vm.max_wired` в `vm.max_user_wired` и изменения его типа.
|1300026
|link:https://svnweb.freebsd.org/changeset/base/347596[347596]
-|May 14, 2019
-|13.0-CURRENT after adding context member to ww_mutex in LinuxKPI.
+|14 мая 2019
+|13.0-CURRENT после добавления члена контекста к ww_mutex в LinuxKPI.
|1300027
|link:https://svnweb.freebsd.org/changeset/base/347601[347601]
-|May 14, 2019
-|13.0-CURRENT after adding prepare to pm_ops in LinuxKPI.
+|14 мая 2019
+|13.0-CURRENT после добавления prepare в `pm_ops` в LinuxKPI.
|1300028
|link:https://svnweb.freebsd.org/changeset/base/347925[347925]
-|May 17, 2019
-|13.0-CURRENT after removal of bm, cs, de, ed, ep, ex, fe, pcn, sf, sn, tl, tx, txp, vx, wb, and xe drivers.
+|17 мая 2019
+|13.0-CURRENT после удаления драйверов `bm`, `cs`, de, ed, `ep`, ex, `fe`, `pcn`, sf, `sn`, `tl`, `tx`, `txp`, `vx`, `wb` и xe.
|1300029
|link:https://svnweb.freebsd.org/changeset/base/347984[347984]
-|May 20, 2019
-|13.0-CURRENT after removing some header pollution due to `sys/eventhandler.h`. Affected files may now need to explicitly include one or more of `sys/eventhandler.h`, `sys/ktr.h`, `sys/lock.h`, or `sys/mutex.h`, when the missing header may have been included implicitly prior to 1300029.
+|20 мая 2019
+|13.0-CURRENT после удаления некоторых загрязнений заголовков из-за [.filename]#sys/eventhandler.h#. Затронутые файлы теперь могут требовать явного включения одного или нескольких заголовков: [.filename]#sys/eventhandler.h#, [.filename]#sys/ktr.h#, [.filename]#sys/lock.h# или [.filename]#sys/mutex.h#, тогда как ранее они могли включаться неявно до версии 1300029.
|1300030
|link:https://svnweb.freebsd.org/changeset/base/348350[348350]
-|May 29, 2019
-|13.0-CURRENT after adding relocation support to libdwarf on powerpc64 to fix handling of DWARF information on unlinked objects. Original commit in link:https://svnweb.freebsd.org/changeset/base/348347[348347].
+|29 мая 2019
+|13.0-CURRENT после добавления поддержки перемещения в libdwarf на powerpc64 для исправления обработки DWARF-информации в несвязанных объектах. Оригинальный коммит в ссылке:https://svnweb.freebsd.org/changeset/base/348347[348347].
|1300031
|link:https://svnweb.freebsd.org/changeset/base/348808[348808]
-|June 8, 2019
-|13.0-CURRENT after adding dpcpu and vnet section fixes to i386 kernel modules to avoid panics in certain conditions. i386 kernel modules need to be recompiled with the linker script magic in place or they will refuse to load.
+|8 июня 2019
+|13.0-CURRENT после добавления исправлений разделов dpcpu и vnet в модули ядра i386 для предотвращения паники в определённых условиях. Модули ядра i386 необходимо перекомпилировать с включёнными изменениями в скрипт компоновщика, иначе они откажутся загружаться.
|1300032
|link:https://svnweb.freebsd.org/changeset/base/349151[349151]
-|June 17, 2019
-|13.0-CURRENT after separating kernel crc32() implementation to its own header (gsb_crc32.h) and renaming the source to gsb_crc32.c.
+|17 июня 2019
+|13.0-CURRENT после выделения реализации `crc32()` ядра в отдельный заголовочный файл ([.filename]#gsb_crc32.h#) и переименования исходного файла в [.filename]#gsb_crc32.c#.
|1300033
|link:https://svnweb.freebsd.org/changeset/base/349277[349277]
|June 21, 2019
-|13.0-CURRENT after additions to LinuxKPI's rcu list.
+|13.0-CURRENT после добавлений в список `rcu` LinuxKPI.
|1300034
|link:https://svnweb.freebsd.org/changeset/base/349352[349352]
-|June 24, 2019
-|13.0-CURRENT after NAND and NANDFS removal.
+|24 июня 2019
+|13.0-CURRENT после удаления NAND и NANDFS.
|1300035
|link:https://svnweb.freebsd.org/changeset/base/349846[349846]
-|July 8, 2019
-|13.0-CURRENT after merging the vm_page hold and wire mechanisms.
+|8 июля 2019
+|13.0-CURRENT после объединения механизмов удержания и фиксации `vm_page`.
|1300036
|link:https://svnweb.freebsd.org/changeset/base/349972[349972]
-|July 13, 2019
-|13.0-CURRENT after adding arm_drain_writebuf() and arm_sync_icache() for compatibility with NetBSD and OpenBSD.
+|13 июля 2019
+|13.0-CURRENT после добавления `arm_drain_writebuf()` и `arm_sync_icache()` для совместимости с NetBSD и OpenBSD.
|1300037
|link:https://svnweb.freebsd.org/changeset/base/350307[350307]
-|July 24, 2019
-|13.0-CURRENT after removal of libcap_random(3).
+|24 июля 2019
+|13.0-CURRENT после удаления man:libcap_random[3].
|1300038
|link:https://svnweb.freebsd.org/changeset/base/350437[350437]
-|July 30, 2019
-|13.0-CURRENT after removal of gzip'ed a.out support.
+|30 июля 2019
+|13.0-CURRENT после удаления поддержки gzip'ed a.out.
|1300039
|link:https://svnweb.freebsd.org/changeset/base/350665[350665]
-|August 7, 2019
-|13.0-CURRENT after merge of fusefs from projects/fuse2.
+|7 августа 2019
+|13.0-CURRENT после объединения fusefs из projects/fuse2.
|1300040
|link:https://svnweb.freebsd.org/changeset/base/351140[351140]
-|August 16, 2019
-|13.0-CURRENT after deletion of sys/dir.h which has been deprecated since 1997.
+|16 августа 2019
+|13.0-CURRENT после удаления [.filename]#sys/dir.h#, который был устаревшим с 1997 года.
-|(not changed)
+|(не изменено)
|link:https://svnweb.freebsd.org/changeset/base/351423[351423]
-|August 23, 2019
-|13.0-CURRENT after changing most arguments to man:ping6[8].
+|23 августа 2019
+|13.0-CURRENT после изменения большинства аргументов в man:ping6[8].
|1300041
|link:https://svnweb.freebsd.org/changeset/base/351480[351480]
-|August 25, 2019
-|13.0-CURRENT after removal of zlib 1.0.4 after the completion of kernel zlib unification.
+|25 августа 2019
+|13.0-CURRENT после удаления zlib 1.0.4 по завершении унификации zlib в ядре.
|1300042
|link:https://svnweb.freebsd.org/changeset/base/351522[351522]
-|August 27, 2019
-|13.0-CURRENT after addition of kernel-side support for in-kernel TLS.
+|27 августа 2019
+|13.0-CURRENT после добавления поддержки TLS внутри ядра на уровне ядра.
|1300043
|link:https://svnweb.freebsd.org/changeset/base/351698[351698]
-|September 2, 2019
-|13.0-CURRENT after removal of man:gets[3].
+|2 сентября 2019
+|13.0-CURRENT после удаления man:gets[3].
|1300044
|link:https://svnweb.freebsd.org/changeset/base/351701[351701]
-|September 2, 2019
-|13.0-CURRENT after adding sysfs create/remove functions that handles multiple files in one call to the LinuxKPI.
+|2 сентября 2019
+|13.0-CURRENT после добавления функций создания/удаления sysfs, обрабатывающих несколько файлов за один вызов, в LinuxKPI.
|1300045
|link:https://svnweb.freebsd.org/changeset/base/351729[351729]
-|September 3, 2019
-|13.0-CURRENT after adding sysctlbyname system call
+|3 сентября 2019
+|13.0-CURRENT после добавления системного вызова man:sysctlbyname[3].
|1300046
|link:https://svnweb.freebsd.org/changeset/base/351937[351937]
-|September 6, 2019
-|13.0-CURRENT after LinuxKPI sysfs improvements.
+|6 сентября 2019
+|13.0-CURRENT после улучшений LinuxKPI sysfs.
|1300047
|link:https://svnweb.freebsd.org/changeset/base/352110[352110]
-|September 9, 2019
-|13.0-CURRENT after changing the synchonization rules for vm_page reference counting..
+|9 сентября 2019
+|13.0-CURRENT после изменения правил синхронизации для подсчета ссылок `vm_page`.
|1300048
|link:https://svnweb.freebsd.org/changeset/base/352700[352700]
-|September 25, 2019
-|13.0-CURRENT after adding a shm_open2 syscall to support the upcoming memfd_create syscall.
+|25 сентября 2019
+|13.0-CURRENT после добавления системного вызова shm_open2 для поддержки готовящегося системного вызова man:memfd_create[2].
|1300049
|link:https://svnweb.freebsd.org/changeset/base/353274[353274]
-|October 7, 2019
-|13.0-CURRENT after factoring out the VNET shutdown check into an own vnet structure field.
+|7 октября 2019
+|13.0-CURRENT после вынесения проверки отключения VNET в отдельное поле структуры vnet.
|1300050
|link:https://svnweb.freebsd.org/changeset/base/353358[353358]
-|October 9, 2019
-|13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 9.0.0 final release r372316.
+|9 октября 2019
+|13.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до финального релиза 9.0.0 r372316.
|1300051
|link:https://svnweb.freebsd.org/changeset/base/353685[353685]
-|October 17, 2019
-|13.0-CURRENT after splitting out a more generic debugnet(4) from man:netdump[4].
+|17 октября 2019
+|13.0-CURRENT после выделения более универсального man:debugnet[4] из man:netdump[4].
|1300052
|link:https://svnweb.freebsd.org/changeset/base/353698[353698]
-|October 17, 2019
-|13.0-CURRENT after promoting the page busy field to a first class lock that no longer requires the object lock for consistency.
+|17 октября 2019
+|13.0-CURRENT после преобразования поля busy page в полноценную блокировку, которая больше не требует блокировки объекта для обеспечения согласованности.
|1300053
|link:https://svnweb.freebsd.org/changeset/base/353700[353700]
-|October 17, 2019
-|13.0-CURRENT after implementing NetGDB.
+|17 октября 2019
+|13.0-CURRENT после реализации NetGDB.
|1300054
|link:https://svnweb.freebsd.org/changeset/base/353868[353868]
-|October 21, 2019
-|13.0-CURRENT after removing obsoleted KPIs that were used to access interface address lists.
+|21 октября 2019
+|13.0-CURRENT после удаления устаревших KPIs, которые использовались для доступа к спискам адресов интерфейсов.
|1300055
|link:https://svnweb.freebsd.org/changeset/base/354335[354335]
-|November 4, 2019
-|13.0-CURRENT after enabling device class group attributes in the LinuxKPI.
+|4 ноября 2019
+|13.0-CURRENT после включения атрибутов группы классов устройств в LinuxKPI.
|1300056
|link:https://svnweb.freebsd.org/changeset/base/354460[354460]
-|November 7, 2019
-|13.0-CURRENT after fixing a potential OOB read security issue in libc++.
+|7 ноября 2019
+|13.0-CURRENT после исправления потенциальной проблемы безопасности с чтением за границами в libc++.
|1300057
|link:https://svnweb.freebsd.org/changeset/base/354694[354694]
-|November 13, 2019
-|13.0-CURRENT after adding support for AT_EXECPATH to elf_aux_info(3).
+|13 ноября 2019
+|13.0-CURRENT после добавления поддержки `AT_EXECPATH` в man:elf_aux_info[3].
|1300058
|link:https://svnweb.freebsd.org/changeset/base/354820[354820]
-|November 18, 2019
-|13.0-CURRENT after widening the vm_page aflags field to 16 bits.
+|18 ноября 2019
+|13.0-CURRENT после расширения поля `aflags` в `vm_page` до 16 бит.
|1300059
|link:https://svnweb.freebsd.org/changeset/base/354835[354835]
-|November 18, 2019
-|13.0-CURRENT after converting the in-tree sysent targets to use the new [.filename]#makesyscalls.lua#.
+|18 ноября 2019
+|13.0-CURRENT после преобразования встроенных целей `sysent` для использования нового [.filename]#makesyscalls.lua#.
|1300060
|link:https://svnweb.freebsd.org/changeset/base/354922[354922]
-|November 20, 2019
-|13.0-CURRENT after adding [.filename]#/etc/os-release# as a symbolic link to [.filename]#/var/run/os-release#.
+|20 ноября 2019
+|13.0-CURRENT после добавления символической ссылки [.filename]#/etc/os-release# на [.filename]#/var/run/os-release#.
|1300061
|link:https://svnweb.freebsd.org/changeset/base/354977[354977]
-|November 21, 2019
-|13.0-CURRENT after adding functions to man:bitstring[3] to find contiguous sequences of set or unset bits.
+|21 ноября 2019
+|13.0-CURRENT после добавления функций в man:bitstring[3] для поиска непрерывных последовательностей установленных или сброшенных битов.
|1300062
|link:https://svnweb.freebsd.org/changeset/base/355309[355309]
-|December 2, 2019
-|13.0-CURRENT after adding TCP_STATS support.
+|2 декабря 2019
+|13.0-CURRENT после добавления поддержки TCP_STATS.
|1300063
|link:https://svnweb.freebsd.org/changeset/base/355537[355537]
-|December 8, 2019
-|13.0-CURRENT after removal of VI_DOOMED (use VN_IS_DOOMED instead).
+|8 декабря 2019
+|13.0-CURRENT после удаления VI_DOOMED (используйте VN_IS_DOOMED вместо этого).
|1300064
|link:https://svnweb.freebsd.org/changeset/base/355658[355658]
-|December 9, 2019
-|13.0-CURRENT after correcting the C++ version check for declaring man:timespec_get[3].
+|9 декабря 2019
+|13.0-CURRENT после исправления проверки версии C++ для объявления man:timespec_get[3].
|1300065
|link:https://svnweb.freebsd.org/changeset/base/355643[355643]
-|December 12, 2019
-|13.0-CURRENT after adding sigsetop extensions commonly found in musl libc and glibc.
+|12 декабря 2019
+|13.0-CURRENT после добавления расширений `sigsetop`, которые обычно встречаются в musl libc и glibc.
|1300066
|link:https://svnweb.freebsd.org/changeset/base/355679[355679]
-|December 12, 2019
-|13.0-CURRENT after changing the internal interface between the NFS modules as part of the introduction of NFS 4.2.
+|12 декабря 2019
+|13.0-CURRENT после изменения внутреннего интерфейса между модулями NFS в рамках внедрения NFS 4.2.
|1300067
|link:https://svnweb.freebsd.org/changeset/base/355732[355732]
-|December 13, 2019
-|13.0-CURRENT after removing the deprecated `callout_handle_init`, `timeout`, and `untimeout` functions.
+|13 декабря 2019
+|13.0-CURRENT после удаления устаревших функций `callout_handle_init`, `timeout` и `untimeout`.
|1300068
|link:https://svnweb.freebsd.org/changeset/base/355828[355828]
-|December 16, 2019
-|13.0-CURRENT after doubling the value of `ARG_MAX`, for 64 bit platforms.
+|16 декабря 2019
+|13.0-CURRENT после удвоения значения `ARG_MAX` для 64-битных платформ.
|1300069
|link:https://svnweb.freebsd.org/changeset/base/356051[356051]
-|December 24, 2019
-|13.0-CURRENT after the addition of busdma templates.
+|24 декабря 2019
+|13.0-CURRENT после добавления шаблонов busdma.
|1300070
|link:https://svnweb.freebsd.org/changeset/base/356113[356113]
-|December 27, 2019
-|13.0-CURRENT after eliminating the last MI difference in AT_* definitions (for powerpc).
+|27 декабря 2019
+|13.0-CURRENT после устранения последнего различия MI в определениях AT_* (для powerpc).
|1300071
|link:https://svnweb.freebsd.org/changeset/base/356135[356135]
-|December 27, 2019
-|13.0-CURRENT after making USB statistics be per-device instead of per bus.
+|27 декабря 2019
+|13.0-CURRENT после изменения статистики USB для каждого устройства вместо каждой шины.
|1300072
|link:https://svnweb.freebsd.org/changeset/base/356185[356185]
-|December 29, 2019
-|13.0-CURRENT after removal of GEOM_SCHED class and gsched tool.
+|29 декабря 2019
+|13.0-CURRENT после удаления класса `GEOM_SCHED` и утилиты `gsched`.
|1300073
|link:https://svnweb.freebsd.org/changeset/base/356263[356263]
-|January 2, 2020
-|13.0-CURRENT after removing arm/arm as a valid target.
+|2 января 2020
+|13.0-CURRENT после удаления arm/arm как допустимой цели.
|1300074
|link:https://svnweb.freebsd.org/changeset/base/356337[356337]
-|January 3, 2020
-|13.0-CURRENT after removing flags argument from VOP_UNLOCK.
+|3 января 2020
+|13.0-CURRENT после удаления аргумента flags из `VOP_UNLOCK`.
|1300075
|link:https://svnweb.freebsd.org/changeset/base/356409[356409]
-|January 6, 2020
-|13.0-CURRENT after adding own counter for cancelled USB transfers.
+|6 января 2020
+|13.0-CURRENT после добавления собственного счетчика отмененных USB-передач.
|1300076
|link:https://svnweb.freebsd.org/changeset/base/356511[356511]
-|January 8, 2020
-|13.0-CURRENT after pushing vnop implementation into the fileop layer in posix_fallocate.
+|8 января 2020
+|13.0-CURRENT после внедрения реализации `vnop` в слой `fileop` в man:posix_fallocate[2].
-|(not changed)
+|(не изменено)
|link:https://svnweb.freebsd.org/changeset/base/357396[357396]
-|February 2, 2020
-|13.0-CURRENT after removal of armv5 architecture code from the src tree.
+|2 февраля 2020
+|13.0-CURRENT после удаления кода архитектуры armv5 из дерева src.
|1300077
|link:https://svnweb.freebsd.org/changeset/base/357455[357455]
-|February 3, 2020
-|13.0-CURRENT after removal of sparc64 architecture code from the src tree.
+|3 февраля 2020
+|13.0-CURRENT после удаления кода архитектуры sparc64 из дерева src.
|1300078
|link:https://svnweb.freebsd.org/changeset/base/358020[358020]
-|February 17, 2020
-|13.0-CURRENT after changing `struct vnet` and the VNET magic cookie.
+|17 февраля 2020
+|13.0-CURRENT после изменения `struct vnet` и волшебного cookie VNET.
|1300079
|link:https://svnweb.freebsd.org/changeset/base/358164[358164]
-|February 20, 2020
-|13.0-CURRENT after upgrading ncurses to 6.2.x
+|20 февраля 2020
+|13.0-CURRENT после обновления ncurses до версии 6.2.x
|1300080
|link:https://svnweb.freebsd.org/changeset/base/358172[358172]
-|February 20, 2020
-|13.0-CURRENT after adding realpathat syscall to VFS.
+|20 февраля 2020
+|13.0-CURRENT после добавления системного вызова `realpathat` в VFS.
|1300081
|link:https://svnweb.freebsd.org/changeset/base/358218[358218]
-|February 21, 2020
-|13.0-CURRENT after after recent linuxkpi changes.
+|21 февраля 2020
+|13.0-CURRENT после недавних изменений в linuxkpi.
|1300082
|link:https://svnweb.freebsd.org/changeset/base/358497[358497]
-|March 1, 2020
-|13.0-CURRENT after removal of man:bktr[4].
+|1 марта 2020
+|13.0-CURRENT после удаления man:bktr[4].
|1300083
|link:https://svnweb.freebsd.org/changeset/base/358834[358834]
-|March 10, 2020
-|13.0-CURRENT after removal of man:amd[8], r358821.
+|10 марта 2020
+|13.0-CURRENT после удаления man:amd[8], r358821.
|1300084
|link:https://svnweb.freebsd.org/changeset/base/358851[358851]
-|March 10, 2020
-|13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0-rc3 c290cb61fdc.
+|10 марта 2020
+|13.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.0-rc3 c290cb61fdc.
|1300085
|link:https://svnweb.freebsd.org/changeset/base/359261[359261]
-|March 23, 2020
-|13.0-CURRENT after the import of the kyua test framework.
+|23 марта 2020
+|13.0-CURRENT после импорта тестового фреймворка kyua.
|1300086
|link:https://svnweb.freebsd.org/changeset/base/359347[359347]
-|March 26, 2020
-|13.0-CURRENT after switching powerpc and powerpcspe to the lld linker.
+|26 марта 2020
+|13.0-CURRENT после переключения powerpc и powerpcspe на компоновщик lld.
|1300087
|link:https://svnweb.freebsd.org/changeset/base/359374[359374]
-|March 27, 2020
-|13.0-CURRENT after refactoring the driver and consumer interfaces for in-kernel cryptography.
+|27 марта 2020
+|13.0-CURRENT после рефакторинга интерфейсов драйвера и потребителя для внутриядерного шифрования.
|1300088
|link:https://svnweb.freebsd.org/changeset/base/359530[359530]
-|April 1, 2020
-|13.0-CURRENT after removing support for procfs process debugging.
+|1 апреля 2020
+|13.0-CURRENT после удаления поддержки отладки процессов через procfs.
|1300089
|link:https://svnweb.freebsd.org/changeset/base/359727[359727]
-|April 8, 2020
-|13.0-CURRENT after cloning the RCU interface into a sleepable and a non-sleepable part in the LinuxKPI.
+|8 апреля 2020
+|13.0-CURRENT после разделения интерфейса RCU на части с возможностью ожидания и без неё в LinuxKPI.
|1300090
|link:https://svnweb.freebsd.org/changeset/base/359747[359747]
-|April 9, 2020
-|13.0-CURRENT after removing the old NFS lock device driver that uses Giant.
+|9 апреля 2020
+|13.0-CURRENT после удаления старого драйвера устройства блокировки NFS, использующего Giant.
|1300091
|link:https://svnweb.freebsd.org/changeset/base/359839[359839]
-|April 12, 2020
-|13.0-CURRENT after implementing a close_range(2) syscall.
+|12 апреля 2020
+|13.0-CURRENT после реализации системного вызова man:close_range[2].
|1300092
|link:https://svnweb.freebsd.org/changeset/base/359920[359920]
-|April 14, 2020
-|13.0-CURRENT after reworking unmapped mbufs in KTLS to carry ext_pgs in the mbuf itself.
+|14 апреля 2020
+|13.0-CURRENT после переработки немэппированных mbuf в KTLS для хранения `ext_pgs` в самом mbuf.
|1300093
|link:https://svnweb.freebsd.org/changeset/base/360418[360418]
-|April 27, 2020
-|13.0-CURRENT after adding support for kernel TLS receive offload.
+|27 апреля 2020
+|13.0-CURRENT после добавления поддержки выгрузки приема TLS в ядре.
|1300094
|link:https://svnweb.freebsd.org/changeset/base/360796[360796]
-|May 7, 2020
-|13.0-CURRENT after linuxkpi changes.
+|7 мая 2020
+|13.0-CURRENT после изменений в linuxkpi.
|1300095
|link:https://svnweb.freebsd.org/changeset/base/361275[361275]
-|May 20, 2020
-|13.0-CURRENT after adding HyperV socket support for FreeBSD guests.
+|20 мая 2020
+|13.0-CURRENT после добавления поддержки сокетов HyperV для гостевых систем FreeBSD.
|1300096
|link:https://svnweb.freebsd.org/changeset/base/361410[361410]
-|May 23, 2020
-|13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.1 rc1 f79cd71e145.
+|23 мая 2020
+|13.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.1 rc1 f79cd71e145.
|1300097
|link:https://svnweb.freebsd.org/changeset/base/361724[361724]
-|June 2, 2020
-|13.0-CURRENT after implementing __is_constexpr() function macro in the LinuxKPI.
+|2 июня 2020
+|13.0-CURRENT после реализации макроса функции `__is_constexpr()` в LinuxKPI.
|1300098
|link:https://svnweb.freebsd.org/changeset/base/362159[362159]
-|June 14, 2020
-|13.0-CURRENT after changing the `export_args ex_flags` field so that is 64bits.
+|14 июня 2020
+|13.0-CURRENT после изменения поля `export_args ex_flags`, чтобы оно было 64-битным.
|1300099
|link:https://svnweb.freebsd.org/changeset/base/362453[362453]
-|June 20, 2020
-|13.0-CURRENT after making liblzma use libmd implementation of SHA256.
+|20 июня 2020
+|13.0-CURRENT после перевода liblzma на использование реализации SHA256 из libmd.
|1300100
|link:https://svnweb.freebsd.org/changeset/base/362640[362640]
|June 26, 2020
-|13.0-CURRENT after changing the internal API between the NFS kernel modules.
+|13.0-CURRENT после изменения внутреннего API между модулями ядра NFS.
|1300101
|link:https://svnweb.freebsd.org/changeset/base/363077[363077]
-|July 10, 2020
-|13.0-CURRENT after implementing the array_size() function in the LinuxKPI.
+|10 июля 2020
+|13.0-CURRENT после реализации функции `array_size()` в LinuxKPI.
|1300102
|link:https://svnweb.freebsd.org/changeset/base/363562[363562]
-|July 26, 2020
-|13.0-CURRENT after implementing lockless lookup in the VFS layer.
+|26 июля 2020
+|13.0-CURRENT после реализации бесблокировочного поиска в слое VFS.
|1300103
|link:https://svnweb.freebsd.org/changeset/base/363757[363757]
-|August 1, 2020
-|13.0-CURRENT after making rights mandatory for NDINIT_ALL.
+|1 августа 2020
+|13.0-CURRENT после того, как права для NDINIT_ALL стали обязательными.
|1300104
|link:https://svnweb.freebsd.org/changeset/base/363783[363783]
-|August 2, 2020
-|13.0-CURRENT after vnode layout changes.
+|2 августа 2020
+|13.0-CURRENT после изменений в структуре vnode.
|1300105
|link:https://svnweb.freebsd.org/changeset/base/363894[363894]
-|August 5, 2020
-|13.0-CURRENT after vaccess() change.
+|5 августа 2020
+|13.0-CURRENT после изменения `vaccess()`.
|1300106
|link:https://svnweb.freebsd.org/changeset/base/364092[364092]
-|August 11, 2020
-|13.0-CURRENT after adding an argument to newnfs_connect() that indicates use TLS for the connection.
+|11 августа 2020
+|13.0-CURRENT после добавления аргумента в `newnfs_connect()`, указывающего на использование TLS для соединения.
|1300107
|link:https://svnweb.freebsd.org/changeset/base/364109[364109]
-|August 11, 2020
-|13.0-CURRENT after change to clone the task struct fields related to RCU.
+|11 августа 2020
+|13.0-CURRENT после изменения для клонирования полей структуры задачи, связанных с RCU.
|1300108
|link:https://svnweb.freebsd.org/changeset/base/364233[364233]
-|August 14, 2020
-|13.0-CURRENT after adding a few wait_bit functions to the linuxkpi, which are needed for DRM from Linux v5.4.
+|14 августа 2020
+|13.0-CURRENT после добавления нескольких функций `wait_bit` в linuxkpi, которые необходимы для DRM из Linux v5.4.
|1300109
|link:https://svnweb.freebsd.org/changeset/base/364274[364274]
-|August 16, 2020
-|13.0-CURRENT after vget() argument removal and namei flags renumbering.
+|16 августа 2020
+|13.0-CURRENT после удаления аргумента `vget()` и перенумерации флагов `namei`.
-|(not changed)
+|(не изменено)
|link:https://svnweb.freebsd.org/changeset/base/364284[364284]
-|August 16, 2020
-|13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to release/11.x llvmorg-11.0.0-rc1-47-gff47911ddfc.
+|16 августа 2020
+|13.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии release/11.x llvmorg-11.0.0-rc1-47-gff47911ddfc.
|1300110
|link:https://svnweb.freebsd.org/changeset/base/364331[364331]
-|August 18, 2020
-|13.0-CURRENT after deleting the unused `use_ext` argument to `nfscl_reqstart()`.
+|18 августа 2020
+|13.0-CURRENT после удаления неиспользуемого аргумента `use_ext` в `nfscl_reqstart()`.
|1300111
|link:https://svnweb.freebsd.org/changeset/base/364476[364476]
-|August 22, 2020
-|13.0-CURRENT after adding TLS support to the kernel RPC.
+|22 августа 2020
+|13.0-CURRENT после добавления поддержки TLS в RPC ядра.
|1300112
|link:https://svnweb.freebsd.org/changeset/base/364747[364747]
|August 25, 2020
-|13.0-CURRENT after merging OpenZFS support.
+|13.0-CURRENT после объединения поддержки OpenZFS.
|1300113
|link:https://svnweb.freebsd.org/changeset/base/364753[364753]
|August 25, 2020
-|13.0-CURRENT after adding atomic and bswap functions to libcompiler_rt.
+|13.0-CURRENT после добавления атомарных функций и функций `bswap` в libcompiler_rt.
|1300114
|link:https://svnweb.freebsd.org/changeset/base/365459[365459]
-|September 8, 2020
-|13.0-CURRENT after changing arm64 AT_HWCAP definitions for elf_aux_info(3).
+|8 сентября 2020
+|13.0-CURRENT после изменения определений AT_HWCAP для arm64 в man:elf_aux_info[3].
|1300115
|link:https://svnweb.freebsd.org/changeset/base/365705[365705]
-|September 14, 2020
-|13.0-CURRENT after fixing man:crunchgen[1] application build with `WARNS=6`.
+|14 сентября 2020
+|13.0-CURRENT после исправления сборки приложения man:crunchgen[1] с `WARNS=6`.
+
+|1300116
+|link:https://svnweb.freebsd.org/changeset/base/366062[366062]
+|22 сентября 2020
+|13.0-CURRENT после введения архитектуры powerpc64le.
+
+|1300117
+|link:https://svnweb.freebsd.org/changeset/base/366070[366070]
+|23 сентября 2020
+|13.0-CURRENT после перереализации `purgevfs` для итерации по vnodes вместо всего хэша.
+
+|1300118
+|link:https://svnweb.freebsd.org/changeset/base/366374[366374]
+|2 октября 2020
+|13.0-CURRENT после добавления поддержки подсветки и функций `dmi_*` в linuxkpi.
+
+|1300119
+|link:https://svnweb.freebsd.org/changeset/base/366432[366432]
+|6 октября 2020
+|13.0-CURRENT после заполнения поля контекста получения `ww_mutex` в LinuxKPI.
+
+|1300120
+|link:https://svnweb.freebsd.org/changeset/base/366666[366666]
+|13 октября 2020
+|13.0-CURRENT после исправления отображений только для записи на arm64.
+
+|1300121
+|link:https://svnweb.freebsd.org/changeset/base/366719[366719]
+|15 октября 2020
+|13.0-CURRENT после добавления `VOP_EAGAIN`.
+
+|1300122
+|link:https://svnweb.freebsd.org/changeset/base/366782[366782]
+|17 октября 2020
+|13.0-CURRENT после добавления `ptsname_r`.
+
+|1300123
+|link:https://svnweb.freebsd.org/changeset/base/366871[366871]
+|20 октября 2020
+|13.0-CURRENT после изменений `VOP`, `VPTOCNP` и `INACTIVE`.
+
+|1300124
+|link:https://svnweb.freebsd.org/changeset/base/367162[367162]
+|30 октября 2020
+|13.0-CURRENT после добавления `cache_vop_mkdir` и переименования `cache_rename` в `cache_vop_rename`.
+
+|1300125
+|link:https://svnweb.freebsd.org/changeset/base/367347[367347]
+|4 ноября 2020
+|13.0-CURRENT после использования блокировки `rms` для обработки демонтажа в `zfs`.
+
+|1300126
+|link:https://svnweb.freebsd.org/changeset/base/367384[367384]
+|5 ноября 2020
+|13.0-CURRENT после оптимизации зон на каждый процессор.
+
+|1300127
+|link:https://svnweb.freebsd.org/changeset/base/367432[367432]
+|6 ноября 2020
+|13.0-CURRENT после перемещения `malloc_type_internal` в `malloc_type`.
+
+|1300128
+|link:https://svnweb.freebsd.org/changeset/base/367522[367522]
+|9 ноября 2020
+|13.0-CURRENT после добавлений LinuxKPI для реализации частей ACPI, необходимых `drm-kmod` в базовой системе.
+
+|1300129
+|link:https://svnweb.freebsd.org/changeset/base/367627[367627]
+|12 ноября 2020
+|13.0-CURRENT после удаления `malloc_last_fail`.
+
+|1300130
+|link:https://svnweb.freebsd.org/changeset/base/367777[367777]
+|17 ноября 2020
+|13.0-CURRENT после разделения `p_pd` / `pwddesc` и `p_fd` / filedesc.
+
+|1300131
+|link:https://svnweb.freebsd.org/changeset/base/368417[368417]
+|7 декабря 2020
+|13.0-CURRENT после удаления криптографических файловых дескрипторов.
+
+|1300132
+|link:https://svnweb.freebsd.org/changeset/base/368659[368659]
+|15 декабря 2020
+|13.0-CURRENT после улучшения обработки альтернативных настроек в стеке USB.
+
+|1300133
+|gitref:2ed0c8d801f5f72dbde7a7d30135c1cc361a1e90[repository="src",length=12]
+|23 декабря 2020
+|13.0-CURRENT после изменения внутреннего API между модулями NFS и RPC ядра.
+
+|1300134
+|gitref:a84b0e94cdbf1a17a798ab7f77375aacb4d400ff[repository="src",length=12]
+|7 января 2021
+|13.0-CURRENT после выделения аппаратно-независимой части поддержки USB HID в новый модуль.
+
+|1300135
+|gitref:35a39dc5b34962081eeda8dbcf0b99a31585499b[repository="src",length=12]
+|12 января 2021
+|13.0-CURRENT после добавления `kernel_fpu_begin`/`kernel_fpu_end` в LinuxKPI.
+
+|1300136
+|gitref:72c551930be195b5ea982c1b16767f54388424f2[repository="src",length=12]
+|17 января 2021
+|13.0-CURRENT после переработки очереди `irq_work` в LinuxKPI на основе быстрой `taskqueue`.
+
+|1300137
+|gitref:010196adcfaf2bb610725394d40691874b4ff2af[repository="src",length=12]
+|30 января 2021
+|13.0-CURRENT после исправления утверждения clang при сборке порта package:devel/onetbb[].
+
+|1300138
+|gitref:dcee9964238b12a8e55917f292139f074b1a80b2[repository="src",length=12]
+|1 февраля 2021
+|13.0-ALPHA3 после добавления блокировки при поиске символьных ссылок в кэше VFS.
+
+|1300139
+|gitref:91a07ed50ffca4dfada3e7f1f050ea746c1bac66[repository="src",length=12]
+|2 февраля 2021
+|13.0-ALPHA3 после добавления различных компонентов LinuxKPI, конфликтующих с drm-kmod.
+
+|1300500
+|gitref:3c6a89748a01869c18955d5e3bfcdf35f6705d26[repository="src",length=12]
+|5 февраля 2021
+|13.0-STABLE после ветвления releng/13.0.
+
+|1300501
+|gitref:c3f97dd75a1c294c4f60f42b604ee8bcda17be09[repository="src",length=12]
+|23 апреля 2021
+|13.0-STABLE после исправления `dl_iterate_phdr()` в rtld.
+
+|1300501
+|gitref:c3f97dd75a1c294c4f60f42b604ee8bcda17be09[repository="src",length=12]
+|23 апреля 2021
+|13.0-STABLE после исправления `dl_iterate_phdr()` в rtld.
+
+|1300502
+|gitref:da6a8ccfa293c3c831fdde51169754fcb9587657[repository="src",length=12]
+|23 апреля 2021
+|13.0-STABLE после реализации `atomic_dec_and_lock_irqsave()` в LinuxKPI.
+
+|1300503
+|gitref:d60c6dc8f69b1264c7af5e2479ea94f000fd2c6d[repository="src",length=12]
+|23 апреля 2021
+|13.0-STABLE после изменения внутреннего KAPI между krpc и NFS.
+
+|1300504
+|gitref:fb34817c686cc130449325499870e36979899801[repository="src",length=12]
+|30 апреля 2021
+|13.0-STABLE после обновления LinuxKPI для поддержки обновления drm-kmod 5.5.
+
+|1300505
+|gitref:8f81f190a640e211dd814bdde7811982b9491fb0[repository="src",length=12]
+|10 мая 2021
+|13.0-STABLE после изменения внутреннего KAPI между модулями nscl.ko и nfscommon.ko.
+
+|1300506
+|gitref:e31579b8558db508dfc3f8fc276611a7c3c93aa1[repository="src",length=12]
+|2 июня 2021
+|13.0-STABLE после добавления поддержки TCP LRO для VLAN и VxLAN.
+
+|1300507
+|gitref:c64d1bd7145b5d30c97d1cd99e584da529d95100[repository="src",length=12]
+|2 июня 2021
+|13.0-STABLE после добавления нового элемента в структуру отслеживания man:EPOCH[9].
+
+|1300508
+|gitref:658f5eed38c35f3f7d6695110b7dae8dc94d12c7[repository="src",length=12]
+|11 июня 2021
+|13.0-STABLE после добавления макросов для `might_lock_nested()` и `lockdep_(re/un/)pin_lock()` в LinuxKPI.
+
+|1300509
+|gitref:210349325af9920d1535ad76fa3b92847684f6e0[repository="src",length=12]
+|14 июня 2021
+|13.0-STABLE после добавления макроса `list_for_each_entry_lockless()` в LinuxKPI.
+
+|1300510
+|gitref:eb3397588e1b48043e166587ea454f60efea88d0[repository="src",length=12]
+|26 июня 2021
+|13.0-STABLE после изменения внутреннего KAPI между модулями krpc и nfsd.
+
+|1300511
+|gitref:2622570aeb3d162812d72f7ef192c322cd8b73ef[repository="src",length=12]
+|7 июля 2021
+|13.0-STABLE после изменения `softdep_prelink()` для выполнения синхронизации только в случае, если другой поток изменил метаданные vnode с момента предыдущего `prelink`.
+
+|1300512
+|gitref:f72db34d2295080f57a283858125aa906c0d409e[repository="src",length=12]
+|18 июля 2021
+|13.0-STABLE после различных слияний LinuxKPI, OFED, net80211 и драйверов.
+
+|1300513
+|gitref:af732203b8f7f006927528db5497f5cbc4c4742a[repository="src",length=12]
+|31 июля 2021
+|13.0-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-12.0.1-0-gfed41342a82f, также известной как релиз 12.0.1.
+
+|1300514
+|gitref:53d162819c20e5cf267cb91f7a19940e96e8bec4[repository="src",length=12]
+|3 августа 2021
+|Несовместимые изменения в KBI внутренних интерфейсов между NFS требуют пересборки модулей.
+
+|1300515
+|gitref:0437d10e359ea1cbefff8d17cd18ca491dbbd5d7[repository="src",length=12]
+|22 сентября 2021
+|13.0-STABLE возвращается к KBI 13.0 для linuxkpi.
+
+|1300518
+|gitref:a017868e281874261a560ba1e3069b4e14b7483e[repository="src",length=12]
+|21 октября 2021
+|13.0-STABLE после добавления `crypto_cursor_segment()`.
+
+|1300519
+|gitref:fe2827f1678b8ff0baf62a1529b2cc121a25b090[repository="src",length=12]
+|21 октября 2021
+|13.0-STABLE после расширения шифров AES-CCM и Chacha20-Poly1305 в OCF для поддержки нескольких длин одноразовых номеров.
+
+|1300521
+|gitref:29745cf91cfc22afa94da0ce43e07a6dc377f631[repository="src",length=12]
+|19 ноября 2021
+|13.0-STABLE после различных слияний с LinuxKPI и net80211.
+
+|1300522
+|gitref:0c8684ae20019b63c6672cc9fa40e1426708b007[repository="src",length=12]
+|24 ноября 2021
+|13.0-STABLE после изменения внутреннего KAPI между модулями NFS.
+
+|(не изменено)
+|gitref:7224d4125ab57bc1c4c799a6c286be42f8d37a83[repository="src",length=12]
+|6 декабря 2021
+|13.0-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-13.0.0-0-gd7b669b3a303, также известной как релиз 13.0.0.
+
+|1300523
+|gitref:690bcf605d84283c1f9d254885a3cac69c5e80a6[repository="src",length=12]
+|18 декабря 2021
+|13.0-STABLE после добавления двух аргументов в man:VOP_ALLOCATE[9].
+
+|1300524
+|gitref:dc4114875ef10618002d3eeb46f09dc42da56b30[repository="src",length=12]
+|14 января 2022
+|13.0-STABLE после обеспечения совместимости макросов CPU_SET с glibc.
+
+|1300525
+|gitref:dee0854a009cde7dcdb16ba39754237737022c8a[repository="src",length=12]
+|22 января 2022
+|13.0-STABLE после множества изменений LinuxKPI, необходимых для drm-kmod.
+
+|1300526
+|gitref:c39ff2415cb965b729fd16f9eae91e712313877b[repository="src",length=12]
+|20 февраля 2022
+|13.0-STABLE после нескольких изменений LinuxKPI, пересекающихся, но не конфликтующих с drm-kmod.
+
+|1301000
+|gitref:ad329796bdb29c69bce610ad332d08257d7157ac[repository="src",length=12]
+|10 марта 2022
+|Ветка releng/13.1 создана.
+
+|1301500
+|gitref:08523c8c63bbcdcd3f0d36787a544817cb5b8282[repository="src",length=12]
+|10 марта 2022
+|13.1-STABLE после ветвления releng/13.1.
+
+|1301501
+|gitref:6663718bb49635deac3f5dc55fa6f0f7cba593ba[repository="src",length=12]
+|27 марта 2022
+|13.1-STABLE после различных слияний с LinuxKPI и net80211.
+
+|1301502
+|gitref:2278cf4e48e7679b0a60008a83c764fe852174b2[repository="src",length=12]
+|27 апреля 2022
+|13.1-STABLE после различных слияний с LinuxKPI.
+
+|1301503
+|gitref:b2aa64d05bd8b04a1bdb63f2a5f9de39c600b463[repository="src",length=12]
+|19 мая 2022
+|13.1-STABLE после добавления альтернативных макросов DRIVER_MODULE без аргумента devclass.
+
+|1301504
+|gitref:a13b6fc61908fd6afa460b88f94e4a67be74bb9a[repository="src",length=12]
+|4 июня 2022
+|13.1-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-14.0.3-0-g1f9140064dfb, также известной как релиз 14.0.3.
+
+|1301505
+|gitref:6f93a76ffeabf7d4488edc73a0cca01436c2903b[repository="src",length=12]
+|21 июня 2022
+|13.1-STABLE после различных слияний с LinuxKPI.
+
+|1301506
+|gitref:8e6cfc632cf6f9fc906df9d825649443939b55c6[repository="src",length=12]
+|13 июля 2022
+|13.1-STABLE после добавления <crypto/chacha20_poly1305.h> и <crypto/curve25519.h>.
+
+|1301507
+|gitref:9cbba5950123f3afedcc5f24c43956e7a26f22f4[repository="src",length=12]
+|21 июня 2022
+|13.1-STABLE после различных слияний с LinuxKPI.
+
+|1301508
+|gitref:83ac15a799e348c391951f5877feecd4089bab80[repository="src",length=12]
+|17 октября 2022
+|13.1-STABLE после различных слияний в LinuxKPI и для удаления макросов из pause().
+
+|1301509
+|gitref:baa97013121a915057ee54dfcb2cb87e541f7d7f[repository="src",length=12]
+|19 октября 2022
+|13.1-STABLE после введения версии 2 функциональности выбора очереди TX.
+
+|1301510
+|gitref:6820a0512fa6616ee1da46cb0075da80478776f0[repository="src",length=12]
+|8 декабря 2022
+|13.1-STABLE после исправлений LinuxKPI dmi_matches().
+
+|1301511
+|gitref:17333d92643d998d1c6a2dc5f6b1508b6507ad31[repository="src",length=12]
+|17 декабря 2022
+|13.1-STABLE после добавления нового rc: `machine_id` для генерации `/etc/machine-id`.
+
+|1302500
+|gitref:c243de11cf7c4bb3d67bbc1655b149037e5b04f1[repository="src",length=12]
+|9 февраля 2023
+|13.2-STABLE после ветвления releng/13.2.
+
+|1302501
+|gitref:e3068d2655e2aea3e0b462a7298a68d344769ec6[repository="src",length=12]
+|16 февраля 2023
+|13.2-STABLE после добавления `totalram_pages()` в LinuxKPI.
+
+|1302502
+|gitref:5ca371f4f536f9ee9d6c9fb178bf1f7f6de33216[repository="src",length=12]
+|17 февраля 2023
+|13.2-STABLE после различных слияний с LinuxKPI.
+
+|1302503
+|gitref:aaca677fee21f202db4bb974fc5056f4dcbbb598[repository="src",length=12]
+|21 февраля 2023
+|13.2-STABLE после различных слияний с LinuxKPI.
+
+|1302504
+|gitref:d6852eed98ed32ad51120a22aa1ebdf0601917b3[repository="src",length=12]
+|12 марта 2023
+|13.2-STABLE после объединения machine-id в `hostid_save`.
+
+|1302505
+|gitref:85e32e957fcca01d50e29e543584909795c1acef[repository="src",length=12]
+|9 апреля 2023
+|13.2-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-15.0.7-0-g8dfdcc7b7bf6, также известного как релиз 15.0.7.
+
+|1302506
+|gitref:e982b1cf1fe1dc0b84dc24f03d1c21e3fe6bdef3[repository="src",length=12]
+|26 июня 2023
+|13.2-STABLE после различных слияний с LinuxKPI.
+
+|1302507
+|gitref:b2acc21dfbd6fab28b1715c775b43d4914b75e0c[repository="src",length=12]
+|23 июля 2023
+|13.2-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-16.0.6-0-g7cbf1a259152, также известного как релиз 16.0.6.
+
+|1302508
+|gitref:21ccba43f511cc4089899619b5a85e6d83a200dc[repository="src",length=12]
+|6 сентября 2023
+|13.2-STABLE после того, как ptrace начал очищать TDB_BORN во время PT_DETACH.
+
+|1302509
+|gitref:faedeaf7377ba7253c281cf3315b17e0cb979075[repository="src",length=12]
+|2 декабря 2023
+|13.2-STABLE после добавления новой функции VFS под названием `vfs_exjail_clone()`, которая будет использоваться модулем ZFS.
+
+|1302510
+|gitref:45758665781dd63dfa38bcb646d4f36b0a6a104f[repository="src",length=12]
+|7 января 2024
+|13.2-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-17.0.6-0-g6009708b4367, также известного как релиз 17.0.6.
+
+|1303001
+|gitref:a75a3d7afcc88dc0bc9b2797cce983056acadf10[repository="src",length=12]
+|19 февраля 2024
+|13.3-BETA3 после изменения внутренней структуры `struct ieee80211vap` в net80211.
+
+|1303501
+|gitref:a7e1fc7f620d3341549c1380f550aaafbdb45622[repository="src",length=12]
+|19 февраля 2024
+|13.3-STABLE после изменения внутренней структуры `struct ieee80211vap` в net80211.
+
+|1303502
+|gitref:07839ae99c06fcbebd5da6ead49c160c32046542[repository="src",length=12]
+|23 марта 2024
+|13.3-STABLE после исправления утверждения или падения clang при сборке последних библиотек boost.
+
+|1303503
+|gitref:055e875e6077ed1eb2256c3ab5de59a3f6fbce18[repository="src",length=12]
+|20 апреля 2024
+|13.3-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-18.1.3-0-gc13b7485b879, также известного как релиз 18.1.3.
+
+|1304500
+|gitref:77064cddb94875dc8d9693a93ac25019b7f62c59[repository="src",length=12]
+|1 августа 2024
+|13.4-STABLE после переименования из 13.4-PRERELEASE.
+
+|1304501
+|gitref:b802ab153dd24f468b9bfe33a96c61408e0d0565[repository="src",length=12]
+|1 декабря 2024
+|13.4-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-19.1.4-0-gaadaa00de76e, также известного как релиз 19.1.4.
+
|===
+////
+Template:
+
+|13XXXXX
+|gitref:XXXXXXXX[repository="src",length=12]
+|October 30, 2021
+|13.0-STABLE after XXXXXX.
+////
+
[[versions-12]]
-== FreeBSD 12 Versions
+== Версии FreeBSD 12
[[freebsd-versions-table-12]]
-.FreeBSD 12 `__FreeBSD_version` Values
+.FreeBSD 12 Значения `__FreeBSD_version`
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|1200000
|link:https://svnweb.freebsd.org/changeset/base/302409[302409]
-|July 7, 2016
+|7 июля 2016
|12.0-CURRENT.
|1200001
|link:https://svnweb.freebsd.org/changeset/base/302628[302628]
-|July 12, 2016
-|12.0-CURRENT after removing collation from `[a-z]`-type ranges.
+|12 июля 2016
+|12.0-CURRENT после удаления правил сортировки из диапазонов типа `[a-z]`.
|1200002
|link:https://svnweb.freebsd.org/changeset/base/304395[304395]
-|August 18, 2016
-|12.0-CURRENT after removing unused and obsolete `openbsd_poll` system call.
+|18 августа 2016
+|12.0-CURRENT после удаления неиспользуемого и устаревшего системного вызова `openbsd_poll`.
|1200003
|link:https://svnweb.freebsd.org/changeset/base/304608[304608]
-|August 22, 2016
-|12.0-CURRENT after adding C++11 `thread_local` support in rev link:https://svnweb.freebsd.org/changeset/base/303795[303795].
+|22 августа 2016
+|12.0-CURRENT после добавления поддержки `thread_local` из C++11 в ревизии link:https://svnweb.freebsd.org/changeset/base/303795[303795].
|1200004
|link:https://svnweb.freebsd.org/changeset/base/304752[304752]
-|August 24, 2016
-|12.0-CURRENT after fixing LC*MASK for man:newlocale[3] and man:querylocale[3] (rev link:https://svnweb.freebsd.org/changeset/base/304703[304703]).
+|24 августа 2016
+|12.0-CURRENT после исправления LC*MASK для man:newlocale[3] и man:querylocale[3] (rev link:https://svnweb.freebsd.org/changeset/base/304703[304703]).
|1200005
|link:https://svnweb.freebsd.org/changeset/base/304789[304789]
-|August 25, 2016
-|12.0-CURRENT after changing some ioctl interfaces in rev link:https://svnweb.freebsd.org/changeset/base/304787[304787] between the iSCSI userspace programs and the kernel.
+|25 августа 2016
+|12.0-CURRENT после изменения некоторых интерфейсов ioctl в ревизии link:https://svnweb.freebsd.org/changeset/base/304787[304787] между пользовательскими программами iSCSI и ядром.
|1200006
|link:https://svnweb.freebsd.org/changeset/base/305256[305256]
-|September 1, 2016
-|12.0-CURRENT after man:crunchgen[1] META_MODE fix in link:https://svnweb.freebsd.org/changeset/base/305254[305254].
+|1 сентября 2016
+|12.0-CURRENT после исправления META_MODE в man:crunchgen[1] в link:https://svnweb.freebsd.org/changeset/base/305254[305254].
|1200007
|link:https://svnweb.freebsd.org/changeset/base/305421[305421]
-|September 5, 2016
-|12.0-CURRENT after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+|5 сентября 2016
+|12.0-CURRENT после разрешения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9].
|1200008
|link:https://svnweb.freebsd.org/changeset/base/305833[305833]
-|September 15, 2016
-|12.0-CURRENT after removing the 4.3BSD compatible macro `m_copy()` in link:https://svnweb.freebsd.org/changeset/base/305824[305824].
+|15 сентября 2016
+|12.0-CURRENT после удаления совместимого с 4.3BSD макроса `m_copy()` в link:https://svnweb.freebsd.org/changeset/base/305824[305824].
|1200009
|link:https://svnweb.freebsd.org/changeset/base/306077[306077]
-|September 21, 2016
-|12.0-CURRENT after removing `bio_taskqueue()` in link:https://svnweb.freebsd.org/changeset/base/305988[305988].
+|21 сентября 2016
+|12.0-CURRENT после удаления `bio_taskqueue()` в link:https://svnweb.freebsd.org/changeset/base/305988[305988].
|1200010
|link:https://svnweb.freebsd.org/changeset/base/306276[306276]
-|September 23, 2016
-|12.0-CURRENT after mounting man:msdosfs[5] with longnames support by default.
+|23 сентября 2016
+|12.0-CURRENT после монтирования man:msdosfs[5] с поддержкой `longnames` по умолчанию.
|1200011
|link:https://svnweb.freebsd.org/changeset/base/306556[306556]
-|October 1, 2016
-|12.0-CURRENT after adding `fb_memattr` field to `fb_info` in link:https://svnweb.freebsd.org/changeset/base/306555[306555].
+|1 октября 2016
+|12.0-CURRENT после добавления поля `fb_memattr` в `fb_info` в link:https://svnweb.freebsd.org/changeset/base/306555[306555].
|1200012
|link:https://svnweb.freebsd.org/changeset/base/306592[306592]
-|October 2, 2016
-|12.0-CURRENT after man:net80211[4] changes (rev link:https://svnweb.freebsd.org/changeset/base/306590[306590], link:https://svnweb.freebsd.org/changeset/base/306591[306591]).
+|2 октября 2016
+|12.0-CURRENT после изменений в man:net80211[4] (rev link:https://svnweb.freebsd.org/changeset/base/306590[306590], link:https://svnweb.freebsd.org/changeset/base/306591[306591]).
|1200013
|link:https://svnweb.freebsd.org/changeset/base/307140[307140]
-|October 12, 2016
-|12.0-CURRENT after installing header files required development with libzfs_core.
+|12 октября 2016
+|12.0-CURRENT после установки заголовочных файлов, необходимых для разработки с `libzfs_core`.
|1200014
|link:https://svnweb.freebsd.org/changeset/base/307529[307529]
-|October 17, 2016
-|12.0-CURRENT after merging common code in man:rtwn[4] and man:urtwn[4], and adding support for 802.11ac devices.
+|17 октября 2016
+|12.0-CURRENT после объединения общего кода в man:rtwn[4] и man:urtwn[4], а также добавления поддержки устройств 802.11ac.
|1200015
|link:https://svnweb.freebsd.org/changeset/base/308874[308874]
-|November 20, 2016
-|12.0-CURRENT after some ABI change for unbreaking powerpc.
+|20 ноября 2016
+|12.0-CURRENT после некоторого изменения ABI для исправления powerpc.
|1200016
|link:https://svnweb.freebsd.org/changeset/base/309017[309017]
-|November 22, 2016
-|12.0-CURRENT after removing `PG_CACHED`-related fields from `vmmeter`.
+|22 ноября 2016
+|12.0-CURRENT после удаления полей, связанных с `PG_CACHED`, из `vmmeter`.
|1200017
|link:https://svnweb.freebsd.org/changeset/base/309124[309124]
-|November 25, 2016
-|12.0-CURRENT after upgrading our copies of clang, llvm, lldb, compiler-rt and libc++ to 3.9.0 release, and adding lld 3.9.0.
+|25 ноября 2016
+|12.0-CURRENT после обновления копий clang, llvm, lldb, compiler-rt и libc++ до версии 3.9.0 и добавления lld 3.9.0.
|1200018
|link:https://svnweb.freebsd.org/changeset/base/309676[309676]
-|December 7, 2016
-|12.0-CURRENT after adding the `ki_moretdname` member to `struct kinfo_proc` and `struct kinfo_proc32` to export the whole thread name to user-space utilities.
+|7 декабря 2016
+|12.0-CURRENT после добавления члена `ki_moretdname` в структуры `struct kinfo_proc` и `struct kinfo_proc32` для экспорта полного имени потока в пользовательские утилиты.
|1200019
|link:https://svnweb.freebsd.org/changeset/base/310149[310149]
-|December 16, 2016
-|12.0-CURRENT after starting to lay down the foundation for 11ac support.
+|16 декабря 2016
+|12.0-CURRENT после начала закладки основы для поддержки 11ac.
|1200020
|link:https://svnweb.freebsd.org/changeset/base/312087[312087]
-|January 13, 2017
-|12.0-CURRENT after removing `fgetsock` and `fputsock`.
+|13 января 2017
+|12.0-CURRENT после удаления `fgetsock` и `fputsock`.
|1200021
|link:https://svnweb.freebsd.org/changeset/base/313858[313858]
-|February 16, 2017
-|12.0-CURRENT after removing MCA and EISA support.
+|16 февраля 2017
+|12.0-CURRENT после удаления поддержки MCA и EISA.
|1200022
|link:https://svnweb.freebsd.org/changeset/base/314040[314040]
-|February 21, 2017
-|12.0-CURRENT after making the LinuxKPI task struct persistent across system calls.
+|21 февраля 2017
+|12.0-CURRENT после обеспечения сохранности структуры задач LinuxKPI между системными вызовами.
-|(not changed)
+|(не изменено)
|link:https://svnweb.freebsd.org/changeset/base/314373[314373]
-|March 2, 2017
-|12.0-CURRENT after removing System V Release 4 binary compatibility support.
+|2 марта 2017
+|12.0-CURRENT после удаления поддержки бинарной совместимости с System V Release 4.
|1200023
|link:https://svnweb.freebsd.org/changeset/base/314564[314564]
-|March 2, 2017
-|12.0-CURRENT after upgrading our copies of clang, llvm, lld, lldb, compiler-rt and libc++ to 4.0.0.
+|2 марта 2017
+|12.0-CURRENT после обновления копий clang, llvm, lld, lldb, compiler-rt и libc++ до версии 4.0.0.
|1200024
|link:https://svnweb.freebsd.org/changeset/base/314865[314865]
-|March 7, 2017
-|12.0-CURRENT after removal of [.filename]#pcap-int.h#
+|7 марта 2017
+|12.0-CURRENT после удаления [.filename]#pcap-int.h#
|1200025
|link:https://svnweb.freebsd.org/changeset/base/315430[315430]
-|March 16, 2017
-|12.0-CURRENT after addition of the [.filename]#<dev/mmc/mmc_ioctl.h># header.
+|16 марта 2017
+|12.0-CURRENT после добавления заголовочного файла [.filename]#<dev/mmc/mmc_ioctl.h>#.
|1200026
|link:https://svnweb.freebsd.org/changeset/base/315662[315662]
-|March 16, 2017
-|12.0-CURRENT after hiding `struct inpcb` and `struct tcpcb` from userland.
+|16 марта 2017
+|12.0-CURRENT после скрытия `struct inpcb` и `struct tcpcb` от пользовательского пространства.
|1200027
|link:https://svnweb.freebsd.org/changeset/base/315673[315673]
-|March 21, 2017
-|12.0-CURRENT after making CAM SIM lock optional.
+|21 марта 2017
+|12.0-CURRENT после того, как блокировка CAM SIM стала опциональной.
|1200028
|link:https://svnweb.freebsd.org/changeset/base/316683[316683]
-|April 10, 2017
-|12.0-CURRENT after renaming `smp_no_rendevous_barrier()` to `smp_no_rendezvous_barrier()` in link:https://svnweb.freebsd.org/changeset/base/316648[316648].
+|10 апреля 2017
+|12.0-CURRENT после переименования `smp_no_rendevous_barrier()` в `smp_no_rendezvous_barrier()` в link:https://svnweb.freebsd.org/changeset/base/316648[316648].
|1200029
|link:https://svnweb.freebsd.org/changeset/base/317176[317176]
|April 19, 2017
-|12.0-CURRENT after the removal of `struct vmmeter` from `struct pcpu` from link:https://svnweb.freebsd.org/changeset/base/317061[317061].
+|12.0-CURRENT после удаления `struct vmmeter` из `struct pcpu` в link:https://svnweb.freebsd.org/changeset/base/317061[317061].
|1200030
|link:https://svnweb.freebsd.org/changeset/base/317383[317383]
-|April 24, 2017
-|12.0-CURRENT after removing NATM support including man:en[4], man:fatm[4], man:hatm[4], and man:patm[4].
+|24 апреля 2017
+|12.0-CURRENT после удаления поддержки NATM, включая man:en[4], man:fatm[4], man:hatm[4] и man:patm[4].
|1200031
|link:https://svnweb.freebsd.org/changeset/base/318736[318736]
-|May 23, 2017
-|12.0-CURRENT after types `ino_t`, `dev_t`, `nlink_t` were extended to 64bit and `struct dirent` changed layout (also known as ino64).
+|23 мая 2017
+|12.0-CURRENT после расширения типов `ino_t`, `dev_t`, `nlink_t` до 64 бит и изменения структуры `struct dirent` (также известное как ino64).
|1200032
|link:https://svnweb.freebsd.org/changeset/base/319664[319664]
-|June 8, 2017
-|12.0-CURRENT after removal of `groff`.
+|8 июня 2017
+|12.0-CURRENT после удаления `groff`.
|1200033
|link:https://svnweb.freebsd.org/changeset/base/320043[320043]
-|June 17, 2017
-|12.0-CURRENT after the type of the `struct event` member `data` was increased to 64bit, and ext structure members added.
+|17 июня 2017
+|12.0-CURRENT после того, как тип члена `data` структуры `struct event` был увеличен до 64 бит, и добавлены члены расширенной структуры.
|1200034
|link:https://svnweb.freebsd.org/changeset/base/320085[320085]
-|June 19, 2017
-|12.0-CURRENT after the NFS client and server were changed so that they actually use the 64bit `ino_t`.
+|19 июня 2017
+|12.0-CURRENT после изменения клиента и сервера NFS для фактического использования 64-битного `ino_t`.
|1200035
|link:https://svnweb.freebsd.org/changeset/base/320317[320317]
|June 24, 2017
-|12.0-CURRENT after the `MAP_GUARD` man:mmap[2] flag was added.
+|12.0-CURRENT после добавления флага `MAP_GUARD` в man:mmap[2].
|1200036
|link:https://svnweb.freebsd.org/changeset/base/320347[320347]
-|June 26, 2017
-|12.0-CURRENT after changing `time_t` to 64 bits on powerpc (32-bit version).
+|26 июня 2017
+|12.0-CURRENT после изменения `time_t` на 64 бита на powerpc (32-битная версия).
|1200037
|link:https://svnweb.freebsd.org/changeset/base/320545[320545]
-|July 1, 2017
-|12.0-CURRENT after the cleanup and inlining of `bus_dmamap*` functions (link:https://svnweb.freebsd.org/changeset/base/320528[320528]).
+|1 июля 2017
+|12.0-CURRENT после очистки и встраивания функций `bus_dmamap*` (link:https://svnweb.freebsd.org/changeset/base/320528[320528]).
|1200038
|link:https://svnweb.freebsd.org/changeset/base/320879[320879]
-|July 10, 2017
-|12.0-CURRENT after MMC CAM committed. (link:https://svnweb.freebsd.org/changeset/base/320844[320844]).
+|10 июля 2017
+|12.0-CURRENT после коммита MMC CAM (link:https://svnweb.freebsd.org/changeset/base/320844[320844]).
|1200039
|link:https://svnweb.freebsd.org/changeset/base/321369[321369]
-|July 22, 2017
-|12.0-CURRENT after upgrade of copies of clang, llvm, lld, lldb, compiler-rt and libc++ to 5.0.0 (trunk r308421).
+|22 июля 2017
+|12.0-CURRENT после обновления копий clang, llvm, lld, lldb, compiler-rt и libc++ до версии 5.0.0 (trunk r308421).
|1200040
|link:https://svnweb.freebsd.org/changeset/base/321688[321688]
-|July 29, 2017
-|12.0-CURRENT after adding NFS client forced dismount support `umount -N`.
+|29 июля 2017
+|12.0-CURRENT после добавления поддержки принудительного демонтирования клиента NFS `umount -N`.
|1200041
|link:https://svnweb.freebsd.org/changeset/base/322762[322762]
-|August 21, 2017
-|12.0-CURRENT after WRFSBASE instruction become operational on amd64.
+|21 августа 2017
+|12.0-CURRENT после того, как инструкция WRFSBASE стала работоспособной на amd64.
|1200042
|link:https://svnweb.freebsd.org/changeset/base/322900[322900]
-|August 25, 2017
-|12.0-CURRENT after PLPMTUD counters were changed to use man:counter[9].
+|25 августа 2017
+|12.0-CURRENT после изменения счетчиков PLPMTUD для использования man:counter[9].
|1200043
|link:https://svnweb.freebsd.org/changeset/base/322989[322989]
-|August 28, 2017
-|12.0-CURRENT after dropping x86 CACHE_LINE_SIZE down to 64 bytes.
+|28 августа 2017
+|12.0-CURRENT после уменьшения CACHE_LINE_SIZE для x86 до 64 байт.
|1200044
|link:https://svnweb.freebsd.org/changeset/base/323349[323349]
-|September 8, 2017
-|12.0-CURRENT after implementing poll_wait() in the LinuxKPI.
+|8 сентября 2017
+|12.0-CURRENT после реализации `poll_wait()` в LinuxKPI.
|1200045
|link:https://svnweb.freebsd.org/changeset/base/323706[323706]
-|September 18, 2017
-|12.0-CURRENT after adding shared memory support to LinuxKPI. (link:https://svnweb.freebsd.org/changeset/base/323703[323703]).
+|18 сентября 2017
+|12.0-CURRENT после добавления поддержки разделяемой памяти в LinuxKPI. (link:https://svnweb.freebsd.org/changeset/base/323703[323703]).
|1200046
|link:https://svnweb.freebsd.org/changeset/base/323910[323910]
-|September 22, 2017
-|12.0-CURRENT after adding support for 32-bit compatibility IOCTLs to LinuxKPI.
+|22 сентября 2017
+|12.0-CURRENT после добавления поддержки 32-битных совместимых IOCTL в LinuxKPI.
|1200047
|link:https://svnweb.freebsd.org/changeset/base/324053[324053]
-|September 26, 2017
-|12.0-CURRENT after removing M_HASHTYPE_RSS_UDP_IPV4_EX. (link:https://svnweb.freebsd.org/changeset/base/324052[324052]).
+|26 сентября 2017
+|12.0-CURRENT после удаления M_HASHTYPE_RSS_UDP_IPV4_EX. (link:https://svnweb.freebsd.org/changeset/base/324052[324052]).
|1200048
|link:https://svnweb.freebsd.org/changeset/base/324227[324227]
-|October 2, 2017
-|12.0-CURRENT after hiding `struct socket` and `struct unpcb` from userland.
+|2 октября 2017
+|12.0-CURRENT после скрытия `struct socket` и `struct unpcb` из пользовательского пространства.
|1200049
|link:https://svnweb.freebsd.org/changeset/base/324281[324281]
-|October 4, 2017
-|12.0-CURRENT after adding the `value.u16` field to `struct diocgattr_arg`.
+|4 октября 2017
+|12.0-CURRENT после добавления поля `value.u16` в структуру `struct diocgattr_arg`.
|1200050
|link:https://svnweb.freebsd.org/changeset/base/324342[324342]
-|October 5, 2017
-|12.0-CURRENT after adding the `armv7 MACHINE_ARCH`. (link:https://svnweb.freebsd.org/changeset/base/324340[324340]).
+|5 октября 2017
+|12.0-CURRENT после добавления `armv7 MACHINE_ARCH`. (link:https://svnweb.freebsd.org/changeset/base/324340[324340]).
|1200051
|link:https://svnweb.freebsd.org/changeset/base/324455[324455]
-|October 9, 2017
-|12.0-CURRENT after removing [.filename]#libstand.a# as a public interface. (link:https://svnweb.freebsd.org/changeset/base/324454[324454]).
+|9 октября 2017
+|12.0-CURRENT после удаления [.filename]#libstand.a# как публичного интерфейса. (link:https://svnweb.freebsd.org/changeset/base/324454[324454]).
|1200052
|link:https://svnweb.freebsd.org/changeset/base/325028[325028]
-|October 26, 2017
-|12.0-CURRENT after fixing `ptrace()` to always clear the correct thread event when resuming.
+|26 октября 2017
+|12.0-CURRENT после исправления `ptrace()`, чтобы всегда очищать правильное событие потока при возобновлении.
|1200053
|link:https://svnweb.freebsd.org/changeset/base/325506[325506]
-|November 7, 2017
-|12.0-CURRENT after changing `struct mbuf` layout to add optional hardware timestamps for receive packets.
+|7 ноября 2017
+|12.0-CURRENT после изменения структуры `struct mbuf` для добавления опциональных аппаратных меток времени для принимаемых пакетов.
|1200054
|link:https://svnweb.freebsd.org/changeset/base/325852[325852]
-|November 15, 2017
-|12.0-CURRENT after changing the layout of `struct vmtotal` to allow for reporting large memory counters.
+|15 ноября 2017
+|12.0-CURRENT после изменения структуры `struct vmtotal` для поддержки отчёта больших счётчиков памяти.
|1200055
|link:https://svnweb.freebsd.org/changeset/base/327740[327740]
-|January 9, 2018
-|12.0-CURRENT after adding `cpucontrol -e` support.
+|9 января 2018
+|12.0-CURRENT после добавления поддержки `cpucontrol -e`.
|1200056
|link:https://svnweb.freebsd.org/changeset/base/327952[327952]
-|January 14, 2018
-|12.0-CURRENT after upgrading clang, llvm, lld, lldb, compiler-rt and libc++ to 6.0.0 (branches/release_60 r321788).
+|14 января 2018
+|12.0-CURRENT после обновления clang, llvm, lld, lldb, compiler-rt и libc++ до версии 6.0.0 (ветки/release_60 r321788).
|1200057
|link:https://svnweb.freebsd.org/changeset/base/329033[329033]
-|February 8, 2018
-|12.0-CURRENT after applying a clang 6.0.0 fix to make the wine ports build correctly.
+|8 февраля 2018
+|12.0-CURRENT после применения исправления в clang 6.0.0 для корректной сборки портов wine.
|1200058
|link:https://svnweb.freebsd.org/changeset/base/329166[329166]
-|February 12, 2018
-|12.0-CURRENT after the lua loader was committed.
+|12 февраля 2018
+|12.0-CURRENT после включения загрузчика Lua.
|1200059
|link:https://svnweb.freebsd.org/changeset/base/330299[330299]
-|March 2, 2018
-|12.0-CURRENT after removing the declaration of `union semun` unless `_WANT_SEMUN` is defined. Also the removal of `struct mymsg` and the renaming of kernel-only members of `struct semid_ds` and `struct msgid_ds`.
+|2 марта 2018
+|12.0-CURRENT после удаления объявления `union semun`, если не определено `_WANT_SEMUN`. Также удаление `struct mymsg` и переименование членов `struct semid_ds` и `struct msgid_ds`, предназначенных только для ядра.
|1200060
|link:https://svnweb.freebsd.org/changeset/base/330384[330384]
-|March 4, 2018
-|12.0-CURRENT after upgrading clang, llvm, lld, lldb, compiler-rt and libc++ to 6.0.0 release.
+|4 марта 2018
+|12.0-CURRENT после обновления clang, llvm, lld, lldb, compiler-rt и libc++ до версии 6.0.0.
|1200061
|link:https://svnweb.freebsd.org/changeset/base/332100[332100]
-|April 6, 2018
-|12.0-CURRENT after changing man:syslog[3] to emit RFC 5424 formatted messages.
+|6 апреля 2018
+|12.0-CURRENT после изменения man:syslog[3] для генерации сообщений в формате RFC 5424.
|1200062
|link:https://svnweb.freebsd.org/changeset/base/332423[332423]
-|April 12, 2018
-|12.0-CURRENT after changing the Netmap API.
+|12 апреля 2018
+|12.0-CURRENT после изменения API Netmap.
|1200063
|link:https://svnweb.freebsd.org/changeset/base/333446[333446]
-|May 10, 2018
-|12.0-CURRENT after reworking CTL frontend and backend options to use man:nv[3], allow creating multiple ioctl frontend ports.
+|10 мая 2018
+|12.0-CURRENT после переработки параметров интерфейса и внутренней части CTL для использования man:nv[3], разрешено создание нескольких портов ioctl интерфейса.
|1200064
|link:https://svnweb.freebsd.org/changeset/base/334074[334074]
-|May 22, 2018
-|12.0-CURRENT after changing the ifnet address and multicast address TAILQ to CK_STAILQ.
+|22 мая 2018
+|12.0-CURRENT после изменения ifnet address и multicast address TAILQ на CK_STAILQ.
|1200065
|link:https://svnweb.freebsd.org/changeset/base/334290[334290]
-|May 28, 2018
-|12.0-CURRENT after changing man:dwatch[1] to allow '-E code' to override profile EVENT_DETAILS.
+|28 мая 2018
+|12.0-CURRENT после изменения man:dwatch[1] для разрешения использования '-E code' для переопределения EVENT_DETAILS в профиле.
|1200066
|link:https://svnweb.freebsd.org/changeset/base/334466[334466]
-|June 1, 2018
-|12.0-CURRENT after removal of in-kernel pmc tables for Intel.
+|1 июня 2018
+|12.0-CURRENT после удаления внутриядерных таблиц pmc для Intel.
|1200067
|link:https://svnweb.freebsd.org/changeset/base/334892[334892]
-|June 9, 2018
-|12.0-CURRENT after adding DW_LANG constants to libdwarf.
+|9 июня 2018
+|12.0-CURRENT после добавления констант DW_LANG в libdwarf.
|1200068
|link:https://svnweb.freebsd.org/changeset/base/334930[334930]
-|June 12, 2018
-|12.0-CURRENT after changing the interface between the NFS modules.
+|12 июня 2018
+|12.0-CURRENT после изменения интерфейса между модулями NFS.
|1200069
|link:https://svnweb.freebsd.org/changeset/base/335237[335237]
-|June 15, 2018
-|12.0-CURRENT after changing `struct kerneldumpheader` to version 4 (similar to version 2 in 11-STABLE and previous).
+|15 июня 2018
+|12.0-CURRENT после изменения `struct kerneldumpheader` до версии 4 (аналогично версии 2 в 11-STABLE и более ранних).
|1200070
|link:https://svnweb.freebsd.org/changeset/base/335873[335873]
-|July 2, 2018
-|12.0-CURRENT after inlining man:atomic[9] in modules on amd64 and i386 requiring all modules of consumers to be rebuilt for these architectures.
+|2 июля 2018
+|12.0-CURRENT после встраивания man:atomic[9] в модули на amd64 и i386, что потребовало пересборки всех модулей потребителей для этих архитектур.
|1200071
|link:https://svnweb.freebsd.org/changeset/base/335930[335930]
-|July 4, 2018
-|12.0-CURRENT after changing the ABI and API of man:epoch[9] (link:https://svnweb.freebsd.org/changeset/base/335924[335924]) requiring modules of consumers to be rebuilt.
+|4 июля 2018
+|12.0-CURRENT после изменения ABI и API man:epoch[9] (link:https://svnweb.freebsd.org/changeset/base/335924[335924]), что потребовало пересборки модулей потребителей.
|1200072
|link:https://svnweb.freebsd.org/changeset/base/335979[335979]
-|July 5, 2018
-|12.0-CURRENT after changing the ABI and API of `struct xinpcb` and friends.
+|5 июля 2018
+|12.0-CURRENT после изменения ABI и API `struct xinpcb` и связанных структур.
|1200073
|link:https://svnweb.freebsd.org/changeset/base/336313[336313]
-|July 15, 2018
-|12.0-CURRENT after changing the ABI and API of `struct if_shared_ctx` and `struct if_softc_ctx` requiring modules of man:iflib[9] consumers to be rebuilt.
+|15 июля 2018
+|12.0-CURRENT после изменения ABI и API структур `struct if_shared_ctx` и `struct if_softc_ctx`, что потребовало пересборки модулей потребителей man:iflib[9].
|1200074
|link:https://svnweb.freebsd.org/changeset/base/336360[336360]
-|July 16, 2018
-|12.0-CURRENT after updating the configuration of libstdc++ to make use of C99 functions.
+|16 июля 2018
+|12.0-CURRENT после обновления конфигурации libstdc++ для использования функций C99.
|1200075
|link:https://svnweb.freebsd.org/changeset/base/336538[336538]
-|July 19, 2018
-|12.0-CURRENT after zfsloader being folded into loader, and after adding ntpd:ntpd as uid:gid 123:123, and after removing arm big-endian support (MACHINE_ARCH=armeb).
+|19 июля 2018
+|12.0-CURRENT после объединения `zfsloader` в `loader`, после добавления ntpd:ntpd как uid:gid 123:123 и после удаления поддержки big-endian для архитектуры arm (MACHINE_ARCH=armeb).
|1200076
|link:https://svnweb.freebsd.org/changeset/base/336914[336914]
-|July 30, 2018
-|12.0-CURRENT after KPI changes to timespecadd.
+|30 июля 2018
+|12.0-CURRENT после изменений KPI в `timespecadd`.
|1200077
|link:https://svnweb.freebsd.org/changeset/base/337576[337576]
-|August 10, 2018
-|12.0-CURRENT after man:timespec_get[3] was added to the system.
+|10 августа 2018
+|12.0-CURRENT после добавления в систему man:timespec_get[3].
|1200078
|link:https://svnweb.freebsd.org/changeset/base/337863[337863]
-|August 15, 2018
-|12.0-CURRENT after exec.created hook for jails.
+|15 августа 2018
+|12.0-CURRENT после выполнения хука exec.created для клеток.
|1200079
|link:https://svnweb.freebsd.org/changeset/base/338061[338061]
-|August 19, 2018
-|12.0-CURRENT after converting `arc4random` to using the Chacha20 algorithm and deprecating `arc4random_stir` and `arc4random_addrandom`.
+|19 августа 2018
+|12.0-CURRENT после перевода `arc4random` на использование алгоритма Chacha20 и устаревания `arc4random_stir` и `arc4random_addrandom`.
|1200080
|link:https://svnweb.freebsd.org/changeset/base/338172[338172]
-|August 22, 2018
-|12.0-CURRENT after removing the drm drivers.
+|22 августа 2018
+|12.0-CURRENT после удаления драйверов drm.
|1200081
|link:https://svnweb.freebsd.org/changeset/base/338182[338182]
-|August 21, 2018
-|12.0-CURRENT after KPI changes to NVMe.
+|21 августа 2018
+|12.0-CURRENT после изменений KPI для NVMe.
|1200082
|link:https://svnweb.freebsd.org/changeset/base/338285[338285]
-|August 24, 2018
-|12.0-CURRENT after reverting the removal of the drm drivers.
+|24 августа 2018
+|12.0-CURRENT после отмены удаления драйверов drm.
|1200083
|link:https://svnweb.freebsd.org/changeset/base/338331[338331]
-|August 26, 2018
-|12.0-CURRENT after removing `arc4random_stir` and `arc4random_addrandom`.
+|26 августа 2018
+|12.0-CURRENT после удаления `arc4random_stir` и `arc4random_addrandom`.
|1200084
|link:https://svnweb.freebsd.org/changeset/base/338478[338478]
-|September 5, 2018
-|12.0-CURRENT after updating man:objcopy[1] to properly handle little-endian MIPS64 object files.
+|5 сентября 2018
+|12.0-CURRENT после обновления man:objcopy[1] для корректной обработки little-endian MIPS64 объектных файлов.
|1200085
|link:https://svnweb.freebsd.org/changeset/base/339270[339270]
-|October 19, 2018
-|12.0-STABLE after updating OpenSSL to version 1.1.1.
+|19 октября 2018
+|12.0-STABLE после обновления OpenSSL до версии 1.1.1.
|1200086
|link:https://svnweb.freebsd.org/changeset/base/339732[339732]
-|October 25, 2018
-|12.0-STABLE after updating OpenSSL shared library version numbers.
+|25 октября 2018
+|12.0-STABLE после обновления номеров версий разделяемых библиотек OpenSSL.
|1200500
|link:https://svnweb.freebsd.org/changeset/base/340471[340471]
-|November 16, 2018
-|12-STABLE after releng/12.0 was branched.
+|16 ноября 2018
+|12-STABLE после ветвления releng/12.0.
|1200501
|link:https://svnweb.freebsd.org/changeset/base/342801[342801]
-|January 6, 2019
-|12-STABLE after merge of fixing linux_destroy_dev() behaviour when there are still files open from the destroying cdev.
+|6 января 2019
+|12-STABLE после слияния исправления поведения `linux_destroy_dev()`, когда остаются открытые файлы из уничтожаемого cdev.
|1200502
|link:https://svnweb.freebsd.org/changeset/base/343126[343126]
|January 17, 2019
-|12-STABLE after enabling sys/random.h #include from C++.
+|12-STABLE после включения #include <sys/random.h> в C++.
|1200503
|link:https://svnweb.freebsd.org/changeset/base/344152[344152]
-|Febrary 15, 2019
-|12-STABLE after merge of fixing man:renameat[2] for CAPABILITIES kernels.
+|15 февраля 2019
+|12-STABLE после слияния исправления man:renameat[2] для ядер с CAPABILITIES.
|1200504
|link:https://svnweb.freebsd.org/changeset/base/345169[345169]
-|March 15, 2019
-|12-STABLE after merging CCM for the benefit of the ZoF port.
+|15 марта 2019
+|12-STABLE после слияния CCM для работы с портом ZoF.
|1200505
|link:https://svnweb.freebsd.org/changeset/base/345327[345327]
-|March 20, 2019
-|12-STABLE after merging support for selectively disabling ZFS without disabling loader.
+|20 марта 2019
+|12-STABLE после объединения поддержки выборочного отключения ZFS без отключения загрузчика.
|1200506
|link:https://svnweb.freebsd.org/changeset/base/346168[346168]
-|April 12, 2019
-|12-STABLE after merging llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp 8.0.0 final release r356365.
+|12 апреля 2019
+|12-STABLE после слияния llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp 8.0.0 финальный релиз r356365.
|1200507
|link:https://svnweb.freebsd.org/changeset/base/346337[346337]
-|April 17, 2019
-|12-STABLE after MFC of iflib changes in link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] and partially of link:https://svnweb.freebsd.org/changeset/base/345305[345305].
+|17 апреля 2019
+|12-STABLE после слияния изменений iflib из ревизий link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] и частично из link:https://svnweb.freebsd.org/changeset/base/345305[345305].
|1200508
|link:https://svnweb.freebsd.org/changeset/base/346784[346784]
-|April 27, 2019
-|12-STABLE after ether_gen_addr availability.
+|27 апреля 2019
+|12-STABLE после появления `ether_gen_addr`.
|1200509
|link:https://svnweb.freebsd.org/changeset/base/347790[347790]
-|May 16, 2019
-|12-STABLE after bumping the Mellanox driver version numbers (man:mlx4en[4]; man:mlx5en[4]).
+|16 мая 2019
+|12-STABLE после обновления номеров версий драйверов Mellanox (man:mlx4en[4]; man:mlx5en[4]).
|1200510
|link:https://svnweb.freebsd.org/changeset/base/348036[348036]
-|May 21, 2019
-|12-STABLE after change to struct in linuxkpi from link:https://svnweb.freebsd.org/changeset/base/348035[348035].
+|21 мая 2019
+|12-STABLE после изменения структуры в linuxkpi из link:https://svnweb.freebsd.org/changeset/base/348035[348035].
|1200511
|link:https://svnweb.freebsd.org/changeset/base/348243[348243]
-|May 24, 2019
-|12-STABLE after MFC of link:https://svnweb.freebsd.org/changeset/base/347843[347843]: adding group_leader member to struct task_struct to the LinuxKPI.
+|24 мая 2019
+|12-STABLE после MFC изменения link:https://svnweb.freebsd.org/changeset/base/347843[347843]: добавление элемента `group_leader` в структуру `task_struct` для LinuxKPI.
|1200512
|link:https://svnweb.freebsd.org/changeset/base/348245[348245]
-|May 24, 2019
-|12-STABLE after adding context member to ww_mutex in LinuxKPI.
+|24 мая 2019
+|12-STABLE после добавления элемента контекста к ww_mutex в LinuxKPI.
|1200513
|link:https://svnweb.freebsd.org/changeset/base/349763[349763]
-|July 5, 2019
-|12-STABLE after MFC of man:epoch[9] changes: link:https://svnweb.freebsd.org/changeset/base/349763[349763], link:https://svnweb.freebsd.org/changeset/base/340404[340404], link:https://svnweb.freebsd.org/changeset/base/340415[340415], link:https://svnweb.freebsd.org/changeset/base/340417[340417], link:https://svnweb.freebsd.org/changeset/base/340419[340419], link:https://svnweb.freebsd.org/changeset/base/340420[340420].
+|5 июля 2019
+|12-STABLE после MFC man:epoch[9] изменил: link:https://svnweb.freebsd.org/changeset/base/349763[349763], link:https://svnweb.freebsd.org/changeset/base/340404[340404], link:https://svnweb.freebsd.org/changeset/base/340415[340415], link:https://svnweb.freebsd.org/changeset/base/340417[340417], link:https://svnweb.freebsd.org/changeset/base/340419[340419], link:https://svnweb.freebsd.org/changeset/base/340420[340420].
|1200514
|link:https://svnweb.freebsd.org/changeset/base/350083[350083]
-|July 17, 2019
-|12-STABLE after additions to LinuxKPI's rcu list.
+|17 июля 2019
+|12-STABLE после добавлений в список rcu LinuxKPI.
|1200515
|link:https://svnweb.freebsd.org/changeset/base/350877[350877]
-|August 11, 2019
-|12-STABLE after MFC of link:https://svnweb.freebsd.org/changeset/base/349891[349891] (reorganize the SRCS lists as one file per line, and then alphabetize them) and link:https://svnweb.freebsd.org/changeset/base/349972[349972] (add arm_sync_icache() and arm_drain_writebuf() sysarch syscall wrappers).
+|11 августа 2019
+|12-STABLE после слияния изменений link:https://svnweb.freebsd.org/changeset/base/349891[349891] (реорганизация списков SRCS в виде одного файла на строку с последующей сортировкой по алфавиту) и link:https://svnweb.freebsd.org/changeset/base/349972[349972] (добавление обёрток системных вызовов `arm_sync_icache()` и `arm_drain_writebuf()` для sysarch).
|1200516
|link:https://svnweb.freebsd.org/changeset/base/351276[351276]
-|August 20, 2019
-|12-STABLE after MFC of various changes to iflib link:https://svnweb.freebsd.org/changeset/base/351276[351276].
+|20 августа 2019
+|12-STABLE после слияния различных изменений в iflib (MFC) link:https://svnweb.freebsd.org/changeset/base/351276[351276].
|1200517
|link:https://svnweb.freebsd.org/changeset/base/352076[352076]
-|September 9, 2019
-|12-STABLE after adding sysfs create/remove functions that handles multiple files in one call to the LinuxKPI.
+|9 сентября 2019
+|12-STABLE после добавления функций создания/удаления sysfs, обрабатывающих несколько файлов за один вызов в LinuxKPI.
|1200518
|link:https://svnweb.freebsd.org/changeset/base/352114[352114]
-|September 10, 2019
-|12-STABLE after additional updates to LinuxKPI's sysfs.
+|10 сентября 2019
+|12-STABLE после дополнительных обновлений LinuxKPI в sysfs.
|1200519
|link:https://svnweb.freebsd.org/changeset/base/352351[352351]
-|September 15, 2019
-|12-STABLE after MFC of the new fusefs driver.
+|15 сентября 2019
+|12-STABLE после переноса (MFC) нового драйвера fusefs.
|1201000
|link:https://svnweb.freebsd.org/changeset/base/352546[352546]
-|September 20, 2019
-|releng/12.1 branched from stable/12@r352480.
+|20 сентября 2019
+|releng/12.1 ответвился от stable/12@r352480.
|1201500
|link:https://svnweb.freebsd.org/changeset/base/352547[352547]
-|September 20, 2019
-|12-STABLE after branching releng/12.1.
+|20 сентября 2019
+|12-STABLE после ветвления releng/12.1.
|1201501
|link:https://svnweb.freebsd.org/changeset/base/354598[354598]
-|November 10, 2019
-|12-STABLE after fixing a potential OOB read security issue in libc++.
+|10 ноября 2019
+|12-STABLE после исправления потенциальной проблемы безопасности OOB-чтения в libc++.
|1201502
|link:https://svnweb.freebsd.org/changeset/base/354613[354613]
-|November 11, 2019
-|12-STABLE after enabling device class group attributes in the LinuxKPI.
+|11 ноября 2019
+|12-STABLE после включения атрибутов группы классов устройств в LinuxKPI.
|1201503
|link:https://svnweb.freebsd.org/changeset/base/354928[354928]
-|November 21, 2019
-|12-STABLE after adding support for AT_EXECPATH to elf_aux_info(3).
+|21 ноября 2019
+|12-STABLE после добавления поддержки `AT_EXECPATH` в man:elf_aux_info[3].
|1201504
|link:https://svnweb.freebsd.org/changeset/base/355658[355658]
-|November 10, 2019
-|12-STABLE after correcting the C++ version check for declaring man:timespec_get[3].
+|10 ноября 2019
+|12-STABLE после исправления проверки версии C++ для объявления man:timespec_get[3].
|1201505
|link:https://svnweb.freebsd.org/changeset/base/355899[355899]
-|December 19, 2019
-|12-STABLE after adding sigsetop extensions commonly found in musl libc and glibc.
+|19 декабря 2019
+|12-STABLE после добавления расширений `sigsetop`, которые часто встречаются в musl libc и glibc.
|1201506
|link:https://svnweb.freebsd.org/changeset/base/355968[355968]
-|December 21, 2019
-|12-STABLE after doubling the value of `ARG_MAX`, for 64 bit platforms.
+|21 декабря 2019
+|12-STABLE после удвоения значения `ARG_MAX` для 64-битных платформ.
|1201507
|link:https://svnweb.freebsd.org/changeset/base/356306[356306]
-|January 2, 2020
-|12-STABLE after adding functions to man:bitstring[3] to find contiguous sequences of set or unset bits.
+|2 января 2020
+|12-STABLE после добавления функций в man:bitstring[3] для поиска непрерывных последовательностей установленных или сброшенных битов.
|1201508
|link:https://svnweb.freebsd.org/changeset/base/356394[356394]
-|January 6, 2020
-|12-STABLE after making USB statistics be per-device instead of per bus.
+|6 января 2020
+|12-STABLE после изменения статистики USB для каждого устройства вместо каждой шины.
|1201509
|link:https://svnweb.freebsd.org/changeset/base/356460[356460]
-|January 7, 2020
-|12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 9.0.0 final release r372316.
+|7 января 2020
+|12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до финального релиза 9.0.0 r372316.
|1201510
|link:https://svnweb.freebsd.org/changeset/base/356679[356679]
-|January 13, 2020
-|12-STABLE after adding own counter for cancelled USB transfers.
+|13 января 2020
+|12-STABLE после добавления собственного счётчика для отменённых USB-передач.
|1201511
|link:https://svnweb.freebsd.org/changeset/base/357333[357333]
-|January 31, 2020
-|12-STABLE after adding [.filename]#/etc/os-release# as a symbolic link to [.filename]#/var/run/os-release#.
+|31 января 2020
+|12-STABLE после добавления символической ссылки [.filename]#/etc/os-release# на [.filename]#/var/run/os-release#.
|1201512
|link:https://svnweb.freebsd.org/changeset/base/357612[357612]
-|February 6, 2020
-|12-STABLE after recent LinuxKPI changes.
+|6 февраля 2020
+|12-STABLE после недавних изменений в LinuxKPI.
|1201513
|link:https://svnweb.freebsd.org/changeset/base/359957[359957]
-|Apr 15, 2020
-|12-STABLE after cloning the RCU interface into a sleepable and a non-sleepable part in the LinuxKPI.
+|15 апреля 2020
+|12-STABLE после разделения интерфейса RCU на допускающий и не допускающий сон части в LinuxKPI.
|1201514
|link:https://svnweb.freebsd.org/changeset/base/360525[360525]
-|May 1, 2020
-|12-STABLE after implementing full man:bus_dma[9] support in the LinuxKPI and pulling in all dependencies.
+|1 мая 2020
+|12-STABLE после реализации полной поддержки man:bus_dma[9] в LinuxKPI и включения всех зависимостей.
|1201515
|link:https://svnweb.freebsd.org/changeset/base/360545[360545]
-|May 1, 2020
-|12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0 release.
+|1 мая 2020
+|12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.0.
|1201516
|link:https://svnweb.freebsd.org/changeset/base/360620[360620]
-|May 4, 2020
-|12-STABLE after moving `id_mapped` to end of `bus_dma_impl` structure to preserve KPI.
+|4 мая 2020
+|12-STABLE после перемещения `id_mapped` в конец структуры `bus_dma_impl` для сохранения KPI.
|1201517
|link:https://svnweb.freebsd.org/changeset/base/361350[361350]
-|May 21, 2020
-|12-STABLE after renaming `vm.max_wired` to `vm.max_user_wired` and changing its type.
+|21 мая 2020
+|12-STABLE после переименования `vm.max_wired` в `vm.max_user_wired` и изменения его типа.
|1201518
|link:https://svnweb.freebsd.org/changeset/base/362319[362319]
-|June 18, 2020
-|12-STABLE after implementing __is_constexpr() function macro in the LinuxKPI.
+|18 июня 2020
+|12-STABLE после реализации макроса функции `__is_constexpr()` в LinuxKPI.
|1201519
|link:https://svnweb.freebsd.org/changeset/base/362916[362916]
-|July 4, 2020
-|12-STABLE after making liblzma use libmd implementation of SHA256.
+|4 июля 2020
+|12-STABLE после перевода liblzma на использование реализации SHA256 из libmd.
|1201520
|link:https://svnweb.freebsd.org/changeset/base/363494[363494]
-|July 24, 2020
-|12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.1 release.
+|24 июля 2020
+|12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.1.
|1201521
|link:https://svnweb.freebsd.org/changeset/base/363790[363790]
-|August 3, 2020
-|12-STABLE after implementing the array_size() function in the LinuxKPI.
+|3 августа 2020
+|12-STABLE после реализации функции `array_size()` в LinuxKPI.
|1201522
|link:https://svnweb.freebsd.org/changeset/base/363832[363832]
-|August 4, 2020
-|12-STABLE after adding sysctlbyname system call.
+|4 августа 2020
+|12-STABLE после добавления системного вызова sysctlbyname.
|1201523
|link:https://svnweb.freebsd.org/changeset/base/364390[364390]
-|August 19, 2020
-|12-STABLE after change to clone the task struct fields related to RCU.
+|19 августа 2020
+|12-STABLE после изменения для клонирования полей структуры задачи, связанных с RCU.
|1201524
|link:https://svnweb.freebsd.org/changeset/base/365356[365356]
-|September 5, 2020
-|12-STABLE after splitting XDR off into a separate kernel module, to minimize ZFS dependencies.
+|5 сентября 2020
+|12-STABLE после выделения XDR в отдельный модуль ядра для минимизации зависимостей ZFS.
|1201525
|link:https://svnweb.freebsd.org/changeset/base/365471[365471]
-|September 8, 2020
-|12-STABLE after adding atomic and bswap functions to libcompiler_rt.
+|8 сентября 2020
+|12-STABLE после добавления атомарных функций и функций `bswap` в libcompiler_rt.
|1201526
|link:https://svnweb.freebsd.org/changeset/base/365608[365608]
-|September 10, 2020
-|12-STABLE after updating net80211 and kernel privilege checking API changes.
+|10 сентября 2020
+|12-STABLE после обновления net80211 и изменений API проверки привилегий ядра.
|1202000
|link:https://svnweb.freebsd.org/changeset/base/365618[365618]
-|September 11, 2020
-|releng/12.2 branched from stable/12@r365618.
+|11 сентября 2020
+|releng/12.2 ответвился от stable/12@r365618.
|1202500
|link:https://svnweb.freebsd.org/changeset/base/365619[365619]
-|September 11, 2020
-|12-STABLE after branching releng/12.2.
+|11 сентября 2020
+|12-STABLE после ветвления releng/12.2.
|1202501
|link:https://svnweb.freebsd.org/changeset/base/365661[365661]
-|September 12, 2020
-|12-STABLE after followup commits to libcompiler_rt.
+|12 сентября 2020
+|12-STABLE после последующих коммитов в libcompiler_rt.
|1202502
|link:https://svnweb.freebsd.org/changeset/base/365816[365816]
-|September 16, 2020
-|12-STABLE after fixing man:crunchgen[1] application build with `WARNS=6`.
+|16 сентября 2020
+|12-STABLE после исправления сборки приложения man:crunchgen[1] с `WARNS=6`.
+
+|1202503
+|link:https://svnweb.freebsd.org/changeset/base/366878[366878]
+|20 октября 2020
+|12-STABLE после заполнения поля контекста захвата `ww_mutex` в LinuxKPI.
+
+|1202504
+|link:https://svnweb.freebsd.org/changeset/base/367511[367511]
+|9 ноября 2020
+|12-STABLE после добавления man:ptsname_r[3].
+
+|1202505
+|gitref:f3d75bed5475b15f21edf4052665b1212b548bd0[repository="src",length=12]
+|28 декабря 2020
+|12-STABLE после улучшения обработки альтернативных настроек в стеке USB.
+
+|1202506
+|gitref:d36cc12ddfe3335ec8306bd4b393f11069551fa0[repository="src",length=12]
+|30 апреля 2021
+|12-STABLE после изменения внутреннего KAPI между krpc и NFS.
+
+|1202507
+|gitref:1e279fe9deaea1c5e3503117dd3077dcffb1276d[repository="src",length=12]
+|10 мая 2021
+|12-STABLE после изменения внутреннего KAPI между модулями nscl.ko и nfscommon.ko.
+
+|1202508
+|gitref:489236b0474857b0a7a2df77c302290e12be9e7b[repository="src",length=12]
+|26 июня 2021
+|12-STABLE после изменения внутреннего KAPI между модулями krpc и nfsd.
+
+|1203500
+|gitref:f2900e784cb024e55ec0f5cd6834af5fadcb9f9a[repository="src",length=12]
+|20 октября 2021
+|12-STABLE после ветвления releng/12.3.
+
+|1203501
+|gitref:b148c7b87148b653fdbef9c5aa591b9abcd99e26[repository="src",length=12]
+|22 декабря 2021
+|12-STABLE после добавления атомарных функций и функций `bswap` в libcompiler_rt.
+
+|1203502
+|gitref:4772e4135cb3fe7f25531894f3b02f35ec086bda[repository="src",length=12]
+|22 декабря 2021
+|12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 11.0.1.
+
+|1203503
+|gitref:e405b2dc913c99189aa9b923ed686a790253cc7e[repository="src",length=12]
+|25 декабря 2021
+|12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 12.0.0.
+
+|1203504
+|gitref:1a398266112e73f91a4f2e2701ceefd3f2948aac[repository="src",length=12]
+|25 декабря 2021
+|12-STABLE после добавления вспомогательных функций LSE атомарных операций вне строки в [.filename]#libcompiler_rt.a# для архитектуры aarch64.
+
+|1203505
+|gitref:0b7be89b329e0f862c25f34abfb13c75a4d45f2a[repository="src",length=12]
+|25 декабря 2021
+|12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 13.0.0.
+
+|1203506
+|gitref:f591279d9c93bc2ea9cd1a447c2df11d437fbc7b[repository="src",length=12]
+|12 февраля 2022
+|12-STABLE после восстановления компромисса доступности random(4).
+
+|1203507
+|gitref:180d95e04e938328de8f2a24d16fdb5049e15262[repository="src",length=12]
+|9 апреля 2022
+|12-STABLE после объединения zlib.
+
+|1203508
+|gitref:6c717a28505d3e77a0c3780ca1f65eb85b538eb9[repository="src",length=12]
+|19 октября 2022
+|12-STABLE после iflib: Разрешить драйверам определять, в какую очередь передавать данные.
+
+|1204000
+|gitref:fce871fe35204527a2ce08e43e1572ae9295cc00[repository="src",length=12]
+|20 октября 2022
+|releng/12.4 — ветка от stable/12.
+
+|1204500
+|gitref:6a9031c5e2ba5435aa4ea08ee05c351d5bef035d[repository="src",length=12]
+|20 октября 2022
+|12-STABLE после ветвления releng/12.4.
+
|===
+////
+Template:
+
+|12XXXXX
+|gitref:XXXXXXXX[repository="src",length=12]
+|October 30, 2021
+|12-STABLE after XXXXXX.
+////
+
[[versions-11]]
-== FreeBSD 11 Versions
+== FreeBSD 11 Версии
[[freebsd-versions-table-11]]
-.FreeBSD 11 `__FreeBSD_version` Values
+.FreeBSD 11 Значения `__FreeBSD_version`
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|1100000
|link:https://svnweb.freebsd.org/changeset/base/256284[256284]
-|October 10, 2013
+|10 октября 2013
|11.0-CURRENT.
|1100001
|link:https://svnweb.freebsd.org/changeset/base/256776[256776]
-|October 19, 2013
-|11.0-CURRENT after addition of support for "first boot" [.filename]#rc.d# scripts, so ports can make use of this.
+|19 октября 2013
+|11.0-CURRENT после добавления поддержки сценариев [.filename]#rc.d# для "первой загрузки", что позволяет портам использовать эту возможность.
|1100002
|link:https://svnweb.freebsd.org/changeset/base/257696[257696]
-|November 5, 2013
-|11.0-CURRENT after dropping support for historic ioctls.
+|5 ноября 2013
+|11.0-CURRENT после прекращения поддержки устаревших ioctl.
|1100003
|link:https://svnweb.freebsd.org/changeset/base/258284[258284]
-|November 17, 2013
-|11.0-CURRENT after iconv changes.
+|17 ноября 2013
+|11.0-CURRENT после изменений в iconv.
|1100004
|link:https://svnweb.freebsd.org/changeset/base/259424[259424]
-|December 15, 2013
-|11.0-CURRENT after the behavior change of `gss_pseudo_random` introduced in link:https://svnweb.freebsd.org/changeset/base/259286[259286].
+|15 декабря 2013
+|11.0-CURRENT после изменения поведения `gss_pseudo_random`, внесённого в link:https://svnweb.freebsd.org/changeset/base/259286[259286].
|1100005
|link:https://svnweb.freebsd.org/changeset/base/260010[260010]
-|December 28, 2013
-|11.0-CURRENT after link:https://svnweb.freebsd.org/changeset/base/259951[259951] - Do not coalesce entries in man:vm_map_stack[9].
+|28 декабря 2013
+|11.0-CURRENT после link:https://svnweb.freebsd.org/changeset/base/259951[259951] - Не объединять записи в man:vm_map_stack[9].
|1100006
|link:https://svnweb.freebsd.org/changeset/base/261246[261246]
-|January 28, 2014
-|11.0-CURRENT after upgrades of libelf and libdwarf.
+|28 января 2014
+|11.0-CURRENT после обновления libelf и libdwarf.
|1100007
|link:https://svnweb.freebsd.org/changeset/base/261283[261283]
-|January 30, 2014
-|11.0-CURRENT after upgrade of libc++ to 3.4 release.
+|30 января 2014
+|11.0-CURRENT после обновления libc++ до версии 3.4.
|1100008
|link:https://svnweb.freebsd.org/changeset/base/261881[261881]
|February 14, 2014
-|11.0-CURRENT after libc++ 3.4 ABI compatibility fix.
+|11.0-CURRENT после исправления совместимости ABI в libc++ 3.4.
|1100009
|link:https://svnweb.freebsd.org/changeset/base/261991[261991]
-|February 16, 2014
-|11.0-CURRENT after upgrade of llvm/clang to 3.4 release.
+|16 февраля 2014
+|11.0-CURRENT после обновления llvm/clang до версии 3.4.
|1100010
|link:https://svnweb.freebsd.org/changeset/base/262630[262630]
-|February 28, 2014
-|11.0-CURRENT after upgrade of ncurses to 5.9 release (rev link:https://svnweb.freebsd.org/changeset/base/262629[262629]).
+|28 февраля 2014
+|11.0-CURRENT после обновления ncurses до версии 5.9 (ревизия link:https://svnweb.freebsd.org/changeset/base/262629[262629]).
|1100011
|link:https://svnweb.freebsd.org/changeset/base/263102[263102]
-|March 13, 2014
-|11.0-CURRENT after ABI change in struct if_data.
+|13 марта 2014
+|11.0-CURRENT после изменения ABI в структуре `if_data`.
|1100012
|link:https://svnweb.freebsd.org/changeset/base/263140[263140]
-|March 14, 2014
-|11.0-CURRENT after removal of Novell IPX protocol support.
+|14 марта 2014
+|11.0-CURRENT после удаления поддержки протокола Novell IPX.
|1100013
|link:https://svnweb.freebsd.org/changeset/base/263152[263152]
-|March 14, 2014
-|11.0-CURRENT after removal of AppleTalk protocol support.
+|14 марта 2014
+|11.0-CURRENT после удаления поддержки протокола AppleTalk.
|1100014
|link:https://svnweb.freebsd.org/changeset/base/263235[263235]
|March 16, 2014
-|11.0-CURRENT after renaming [.filename]#<sys/capability.h># to [.filename]#<sys/capsicum.h># to avoid a clash with similarly named headers in other operating systems. A compatibility header is left in place to limit build breakage, but will be deprecated in due course.
+|11.0-CURRENT после переименования [.filename]#<sys/capability.h># в [.filename]#<sys/capsicum.h># во избежание конфликта с одноименными заголовочными файлами в других операционных системах. Совместимый заголовочный файл оставлен для уменьшения количества проблем при сборке, но в будущем будет устаревшим.
|1100015
|link:https://svnweb.freebsd.org/changeset/base/263620[263620]
-|March 22, 2014
-|11.0-CURRENT after `cnt` rename to `vm_cnt`.
+|22 марта 2014
+|11.0-CURRENT после переименования `cnt` в `vm_cnt`.
|1100016
|link:https://svnweb.freebsd.org/changeset/base/263660[263660]
-|March 23, 2014
-|11.0-CURRENT after addition of `armv6hf TARGET_ARCH`.
+|23 марта 2014
+|11.0-CURRENT после добавления `armv6hf TARGET_ARCH`.
|1100017
|link:https://svnweb.freebsd.org/changeset/base/264121[264121]
-|April 4, 2014
-|11.0-CURRENT after GCC support for `__block` definition.
+|4 апреля 2014
+|11.0-CURRENT после удаления поддержки GCC для определения `__block`.
|1100018
|link:https://svnweb.freebsd.org/changeset/base/264212[264212]
-|April 6, 2014
-|11.0-CURRENT after support for UDP-Lite protocol (RFC 3828).
+|6 апреля 2014
+|11.0-CURRENT после добавления поддержки протокола UDP-Lite (RFC 3828).
|1100019
|link:https://svnweb.freebsd.org/changeset/base/264289[264289]
-|April 8, 2014
-|11.0-CURRENT after FreeBSD-SA-14:06.openssl (rev link:https://svnweb.freebsd.org/changeset/base/264265[264265]).
+|8 апреля 2014
+|11.0-CURRENT после FreeBSD-SA-14:06.openssl (ревизия link:https://svnweb.freebsd.org/changeset/base/264265[264265]).
|1100020
|link:https://svnweb.freebsd.org/changeset/base/265215[265215]
-|May 1, 2014
-|11.0-CURRENT after removing lindev in favor of having /dev/full by default (rev link:https://svnweb.freebsd.org/changeset/base/265212[265212]).
+|1 мая 2014
+|11.0-CURRENT после удаления `lindev` в пользу наличия /dev/full по умолчанию (rev link:https://svnweb.freebsd.org/changeset/base/265212[265212]).
|1100021
|link:https://svnweb.freebsd.org/changeset/base/266151[266151]
-|May 6, 2014
-|11.0-CURRENT after [.filename]#src.opts.mk# changes, decoupling man:make.conf[5] from `buildworld` (rev link:https://svnweb.freebsd.org/changeset/base/265419[265419]).
+|6 мая 2014
+|11.0-CURRENT после изменений в [.filename]#src.opts.mk#, отделяющих man:make.conf[5] от `buildworld` (rev link:https://svnweb.freebsd.org/changeset/base/265419[265419]).
|1100022
|link:https://svnweb.freebsd.org/changeset/base/266904[266904]
-|May 30, 2014
-|11.0-CURRENT after changes to man:strcasecmp[3], moving man:strcasecmp_l[3] and man:strncasecmp_l[3] from [.filename]#<string.h># to [.filename]#<strings.h># for POSIX 2008 compliance (rev link:https://svnweb.freebsd.org/changeset/base/266865[266865]).
+|30 мая 2014
+|11.0-CURRENT после изменений в man:strcasecmp[3], перемещении man:strcasecmp_l[3] и man:strncasecmp_l[3] из [.filename]#<string.h># в [.filename]#<strings.h># для соответствия POSIX 2008 (rev link:https://svnweb.freebsd.org/changeset/base/266865[266865]).
|1100023
|link:https://svnweb.freebsd.org/changeset/base/267440[267440]
-|June 13, 2014
-|11.0-CURRENT after the CUSE library and kernel module have been attached to the build by default.
+|13 июня 2014
+|11.0-CURRENT после подключения библиотеки CUSE и модуля ядра к сборке по умолчанию.
|1100024
|link:https://svnweb.freebsd.org/changeset/base/267992[267992]
-|June 27, 2014
-|11.0-CURRENT after man:sysctl[3] API change.
+|27 июня 2014
+|11.0-CURRENT после изменения API man:sysctl[3].
|1100025
|link:https://svnweb.freebsd.org/changeset/base/268066[268066]
-|June 30, 2014
-|11.0-CURRENT after man:regex[3] library update to add ">" and "<" delimiters.
+|30 июня 2014
+|11.0-CURRENT после обновления библиотеки man:regex[3] для добавления разделителей ">" и "<".
|1100026
|link:https://svnweb.freebsd.org/changeset/base/268118[268118]
-|July 1, 2014
-|11.0-CURRENT after the internal interface between the NFS modules, including the krpc, was changed by (rev link:https://svnweb.freebsd.org/changeset/base/268115[268115]).
+|1 июля 2014
+|11.0-CURRENT после изменения внутреннего интерфейса между модулями NFS, включая krpc, в (rev link:https://svnweb.freebsd.org/changeset/base/268115[268115]).
|1100027
|link:https://svnweb.freebsd.org/changeset/base/268441[268441]
-|July 8, 2014
-|11.0-CURRENT after FreeBSD-SA-14:17.kmem (rev link:https://svnweb.freebsd.org/changeset/base/268431[268431]).
+|8 июля 2014
+|11.0-CURRENT после FreeBSD-SA-14:17.kmem (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/268431[268431]).
|1100028
|link:https://svnweb.freebsd.org/changeset/base/268945[268945]
-|July 21, 2014
-|11.0-CURRENT after man:hdestroy[3] compliance fix changed ABI.
+|21 июля 2014
+|11.0-CURRENT после исправления соответствия man:hdestroy[3] изменился ABI.
|1100029
|link:https://svnweb.freebsd.org/changeset/base/270173[270173]
-|August 3, 2014
-|11.0-CURRENT after `SOCK_DGRAM` bug fix (rev link:https://svnweb.freebsd.org/changeset/base/269489[269489]).
+|3 августа 2014
+|11.0-CURRENT после исправления ошибки `SOCK_DGRAM` (rev link:https://svnweb.freebsd.org/changeset/base/269489[269489]).
|1100030
|link:https://svnweb.freebsd.org/changeset/base/270929[270929]
-|September 1, 2014
-|11.0-CURRENT after `SOCK_RAW` sockets were changed to not modify packets at all.
+|1 сентября 2014
+|11.0-CURRENT после того, как сокеты `SOCK_RAW` были изменены так, чтобы вообще не модифицировать пакеты.
|1100031
|link:https://svnweb.freebsd.org/changeset/base/271341[271341]
-|September 9, 2014
-|11.0-CURRENT after FreeBSD-SA-14:18.openssl (rev link:https://svnweb.freebsd.org/changeset/base/269686[269686]).
+|9 сентября 2014
+|11.0-CURRENT после FreeBSD-SA-14:18.openssl (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/269686[269686]).
|1100032
|link:https://svnweb.freebsd.org/changeset/base/271438[271438]
-|September 11, 2014
-|11.0-CURRENT after API changes to `ifa_ifwithbroadaddr`, `ifa_ifwithdstaddr`, `ifa_ifwithnet`, and `ifa_ifwithroute`.
+|11 сентября 2014
+|11.0-CURRENT после изменений API в `ifa_ifwithbroadaddr`, `ifa_ifwithdstaddr`, `ifa_ifwithnet` и `ifa_ifwithroute`.
|1100033
|link:https://svnweb.freebsd.org/changeset/base/271657[271657]
-|September 9, 2014
-|11.0-CURRENT after changing `access`, `eaccess`, and `faccessat` to validate the mode argument.
+|9 сентября 2014
+|11.0-CURRENT после изменения `access`, `eaccess` и `faccessat` для проверки аргумента mode.
|1100034
|link:https://svnweb.freebsd.org/changeset/base/271686[271686]
-|September 16, 2014
-|11.0-CURRENT after FreeBSD-SA-14:19.tcp (rev link:https://svnweb.freebsd.org/changeset/base/271666[271666]).
+|16 сентября 2014
+|11.0-CURRENT после FreeBSD-SA-14:19.tcp (rev link:https://svnweb.freebsd.org/changeset/base/271666[271666]).
|1100035
|link:https://svnweb.freebsd.org/changeset/base/271705[271705]
-|September 17, 2014
-|11.0-CURRENT after i915 HW context support.
+|17 сентября 2014
+|11.0-CURRENT после добавления поддержки аппаратного контекста i915.
|1100036
|link:https://svnweb.freebsd.org/changeset/base/271724[271724]
-|September 17, 2014
-|Version bump to have ABI note distinguish binaries ready for strict man:mmap[2] flags checking (rev link:https://svnweb.freebsd.org/changeset/base/271724[271724]).
+|17 сентября 2014
+|Увеличение версии для различия в ABI-примечании бинарных файлов, готовых к строгой проверке флагов man:mmap[2] (изменение link:https://svnweb.freebsd.org/changeset/base/271724[271724]).
|1100037
|link:https://svnweb.freebsd.org/changeset/base/272674[272674]
-|October 6, 2014
-|11.0-CURRENT after addition of man:explicit_bzero[3] (rev link:https://svnweb.freebsd.org/changeset/base/272673[272673]).
+|6 октября 2014
+|11.0-CURRENT после добавления man:explicit_bzero[3] (изменение:https://svnweb.freebsd.org/changeset/base/272673[272673]).
|1100038
|link:https://svnweb.freebsd.org/changeset/base/272951[272951]
|October 11, 2014
-|11.0-CURRENT after cleanup of TCP wrapper headers.
+|11.0-CURRENT после очистки заголовков TCP wrapper.
|1100039
|link:https://svnweb.freebsd.org/changeset/base/273250[273250]
-|October 18, 2014
-|11.0-CURRENT after removal of `MAP_RENAME` and `MAP_NORESERVE`.
+|18 октября 2014
+|11.0-CURRENT после удаления `MAP_RENAME` и `MAP_NORESERVE`.
|1100040
|link:https://svnweb.freebsd.org/changeset/base/273432[273432]
-|October 21, 2014
-|11.0-CURRENT after FreeBSD-SA-14:23 (rev link:https://svnweb.freebsd.org/changeset/base/273146[273146]).
+|21 октября 2014
+|11.0-CURRENT после FreeBSD-SA-14:23 (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/273146[273146]).
|1100041
|link:https://svnweb.freebsd.org/changeset/base/273875[273875]
-|October 30, 2014
-|11.0-CURRENT after API changes to `syscall_register`, `syscall32_register`, `syscall_register_helper` and `syscall32_register_helper` (rev link:https://svnweb.freebsd.org/changeset/base/273707[273707]).
+|30 октября 2014
+|11.0-CURRENT после изменений API в `syscall_register`, `syscall32_register`, `syscall_register_helper` и `syscall32_register_helper` (rev link:https://svnweb.freebsd.org/changeset/base/273707[273707]).
|1100042
|link:https://svnweb.freebsd.org/changeset/base/274046[274046]
-|November 3, 2014
-|11.0-CURRENT after a change to `struct tcpcb`.
+|3 ноября 2014
+|11.0-CURRENT после изменения `struct tcpcb`.
|1100043
|link:https://svnweb.freebsd.org/changeset/base/274085[274085]
-|November 4, 2014
-|11.0-CURRENT after enabling man:vt[4] by default.
+|4 ноября 2014
+|11.0-CURRENT после включения man:vt[4] по умолчанию.
|1100044
|link:https://svnweb.freebsd.org/changeset/base/274116[274116]
-|November 4, 2014
-|11.0-CURRENT after adding new libraries/utilities (dpv and figpar) for data throughput visualization.
+|4 ноября 2014
+|11.0-CURRENT после добавления новых библиотек/утилит (`dpv` и `figpar`) для визуализации пропускной способности данных.
|1100045
|link:https://svnweb.freebsd.org/changeset/base/274162[274162]
-|November 4, 2014
-|11.0-CURRENT after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25.
+|4 ноября 2014
+|11.0-CURRENT после FreeBSD-SA-14:23, FreeBSD-SA-14:24 и FreeBSD-SA-14:25.
|1100046
|link:https://svnweb.freebsd.org/changeset/base/274470[274470]
-|November 13, 2014
-|11.0-CURRENT after `kern_poll` signature change (rev link:https://svnweb.freebsd.org/changeset/base/274462[274462]).
+|13 ноября 2014
+|11.0-CURRENT после изменения сигнатуры `kern_poll` (rev link:https://svnweb.freebsd.org/changeset/base/274462[274462]).
|1100047
|link:https://svnweb.freebsd.org/changeset/base/274476[274476]
-|November 13, 2014
-|11.0-CURRENT after removal of no-at version of VFS syscalls helpers, like `kern_open`.
+|13 ноября 2014
+|11.0-CURRENT после удаления no-at версий вспомогательных системных вызовов VFS, таких как `kern_open`.
|1100048
|link:https://svnweb.freebsd.org/changeset/base/275358[275358]
-|December 1, 2014
-|11.0-CURRENT after starting the process of removing the use of the deprecated "M_FLOWID" flag from the network code.
+|1 декабря 2014
+|11.0-CURRENT после начала процесса удаления использования устаревшего флага "M_FLOWID" из сетевого кода.
|1100049
|link:https://svnweb.freebsd.org/changeset/base/275633[275633]
-|December 9, 2014
-|11.0-CURRENT after importing an important fix to the LLVM vectorizer, which could lead to buffer overruns in some cases.
+|9 декабря 2014
+|11.0-CURRENT после импорта важного исправления в векторизатор LLVM, которое в некоторых случаях могло приводить к переполнению буфера.
|1100050
|link:https://svnweb.freebsd.org/changeset/base/275732[275732]
-|December 12, 2014
-|11.0-CURRENT after adding AES-ICM and AES-GCM to OpenCrypto.
+|12 декабря 2014
+|11.0-CURRENT после добавления AES-ICM и AES-GCM в OpenCrypto.
|1100051
|link:https://svnweb.freebsd.org/changeset/base/276096[276096]
|December 23, 2014
-|11.0-CURRENT after removing old NFS client and server code from the kernel.
+|11.0-CURRENT после удаления старого кода клиента и сервера NFS из ядра.
|1100052
|link:https://svnweb.freebsd.org/changeset/base/276479[276479]
-|December 31, 2014
-|11.0-CURRENT after upgrade of clang, llvm and lldb to 3.5.0 release.
+|31 декабря 2014
+|11.0-CURRENT после обновления clang, llvm и lldb до версии 3.5.0.
|1100053
|link:https://svnweb.freebsd.org/changeset/base/276781[276781]
-|January 7, 2015
-|11.0-CURRENT after man:MCLGET[9] gained a return value (rev link:https://svnweb.freebsd.org/changeset/base/276750[276750]).
+|7 января 2015
+|11.0-CURRENT после того, как man:MCLGET[9] получил возвращаемое значение (rev link:https://svnweb.freebsd.org/changeset/base/276750[276750]).
|1100054
|link:https://svnweb.freebsd.org/changeset/base/277213[277213]
-|January 15, 2015
-|11.0-CURRENT after rewrite of callout subsystem.
+|15 января 2015
+|11.0-CURRENT после переработки подсистемы вызовов.
|1100055
|link:https://svnweb.freebsd.org/changeset/base/277528[277528]
-|January 22, 2015
-|11.0-CURRENT after reverting callout changes in link:https://svnweb.freebsd.org/changeset/base/277213[277213].
+|22 января 2015
+|11.0-CURRENT после отмены изменений callout в link:https://svnweb.freebsd.org/changeset/base/277213[277213].
|1100056
|link:https://svnweb.freebsd.org/changeset/base/277610[277610]
-|January 23, 2015
-|11.0-CURRENT after addition of `futimens` and `utimensat` system calls.
+|23 января 2015
+|11.0-CURRENT после добавления системных вызовов `futimens` и `utimensat`.
|1100057
|link:https://svnweb.freebsd.org/changeset/base/277897[277897]
-|January 29, 2015
-|11.0-CURRENT after removal of d_thread_t.
+|29 января 2015
+|11.0-CURRENT после удаления `d_thread_t`.
|1100058
|link:https://svnweb.freebsd.org/changeset/base/278228[278228]
-|February 5, 2015
-|11.0-CURRENT after addition of support for probing the SCSI VPD Extended Inquiry page (0x86).
+|5 февраля 2015
+|11.0-CURRENT после добавления поддержки запроса страницы расширенного запроса SCSI VPD (0x86).
|1100059
|link:https://svnweb.freebsd.org/changeset/base/278442[278442]
-|February 9, 2015
-|11.0-CURRENT after import of xz 5.2.0, which added multi-threaded compression and lzma gained libthr dependency (rev link:https://svnweb.freebsd.org/changeset/base/278433[278433]).
+|9 февраля 2015
+|11.0-CURRENT после импорта xz 5.2.0, который добавил многопоточное сжатие, и lzma получила зависимость от libthr (rev link:https://svnweb.freebsd.org/changeset/base/278433[278433]).
|1100060
|link:https://svnweb.freebsd.org/changeset/base/278846[278846]
-|February 16, 2015
-|11.0-CURRENT after forwarding `FBIO_BLANK` to framebuffer clients.
+|16 февраля 2015
+|11.0-CURRENT после пересылки `FBIO_BLANK` клиентам фреймбуфера.
|1100061
|link:https://svnweb.freebsd.org/changeset/base/278964[278964]
-|February 18, 2015
-|11.0-CURRENT after `CDAI_FLAG_NONE` addition.
+|18 февраля 2015
+|11.0-CURRENT после добавления `CDAI_FLAG_NONE`.
|1100062
|link:https://svnweb.freebsd.org/changeset/base/279221[279221]
-|February 23, 2015
-|11.0-CURRENT after man:mtio[4] and man:sa[4] API and man:ioctl[2] additions.
+|23 февраля 2015
+|11.0-CURRENT после добавлений API man:mtio[4] и man:sa[4], а также man:ioctl[2].
|1100063
|link:https://svnweb.freebsd.org/changeset/base/279728[279728]
-|March 7, 2015
-|11.0-CURRENT after adding mutex support to the `pps_ioctl()` API in the kernel.
+|7 марта 2015
+|11.0-CURRENT после добавления поддержки мьютексов в API `pps_ioctl()` в ядре.
|1100064
|link:https://svnweb.freebsd.org/changeset/base/279729[279729]
-|March 7, 2015
-|11.0-CURRENT after adding PPS support to USB serial drivers.
+|7 марта 2015
+|11.0-CURRENT после добавления поддержки PPS в драйверы USB-последовательных портов.
|1100065
|link:https://svnweb.freebsd.org/changeset/base/280031[280031]
-|March 15, 2015
-|11.0-CURRENT after upgrading clang, llvm and lldb to 3.6.0.
+|15 марта 2015
+|11.0-CURRENT после обновления clang, llvm и lldb до версии 3.6.0.
|1100066
|link:https://svnweb.freebsd.org/changeset/base/280306[280306]
-|March 20, 2015
-|11.0-CURRENT after removal of SSLv2 support from OpenSSL.
+|20 марта 2015
+|11.0-CURRENT после удаления поддержки SSLv2 из OpenSSL.
|1100067
|link:https://svnweb.freebsd.org/changeset/base/280630[280630]
-|March 25, 2015
-|11.0-CURRENT after removal of SSLv2 support from man:fetch[1] and man:fetch[3].
+|25 марта 2015
+|11.0-CURRENT после удаления поддержки SSLv2 из man:fetch[1] и man:fetch[3].
|1100068
|link:https://svnweb.freebsd.org/changeset/base/281172[281172]
-|April 6, 2015
-|11.0-CURRENT after change to net.inet6.ip6.mif6table sysctl.
+|6 апреля 2015
+|11.0-CURRENT после изменения системной настройки net.inet6.ip6.mif6table.
|1100069
|link:https://svnweb.freebsd.org/changeset/base/281550[281550]
-|April 15, 2015
-|11.0-CURRENT after removal of const qualifier from man:iconv[3].
+|15 апреля 2015
+|11.0-CURRENT после удаления квалификатора const из man:iconv[3].
|1100070
|link:https://svnweb.freebsd.org/changeset/base/281613[281613]
-|April 16, 2015
-|11.0-CURRENT after moving ALTQ from [.filename]#contrib# to [.filename]#net/altq#.
+|16 апреля 2015
+|11.0-CURRENT после перемещения ALTQ из [.filename]#contrib# в [.filename]#net/altq#.
|1100071
|link:https://svnweb.freebsd.org/changeset/base/282256[282256]
-|April 29, 2015
-|11.0-CURRENT after API/ABI change to man:smb[4] (rev link:https://svnweb.freebsd.org/changeset/base/281985[281985]).
+|29 апреля 2015
+|11.0-CURRENT после изменения API/ABI в man:smb[4] (rev link:https://svnweb.freebsd.org/changeset/base/281985[281985]).
|1100072
|link:https://svnweb.freebsd.org/changeset/base/282319[282319]
-|May 1, 2015
-|11.0-CURRENT after adding man:reallocarray[3] in libc (rev link:https://svnweb.freebsd.org/changeset/base/282314[282314]).
+|1 мая 2015
+|11.0-CURRENT после добавления man:reallocarray[3] в libc (изменение link:https://svnweb.freebsd.org/changeset/base/282314[282314]).
|1100073
|link:https://svnweb.freebsd.org/changeset/base/282650[282650]
-|May 8, 2015
-|11.0-CURRENT after extending the maximum number of allowed PCM channels in a PCM stream to 127 and decreasing the maximum number of sub-channels to 1.
+|8 мая 2015
+|11.0-CURRENT после увеличения максимального количества разрешённых PCM-каналов в PCM-потоке до 127 и уменьшения максимального количества подканалов до 1.
|1100074
|link:https://svnweb.freebsd.org/changeset/base/283526[283526]
-|May 25, 2015
-|11.0-CURRENT after adding preliminary support for x86-64 Linux binaries (rev link:https://svnweb.freebsd.org/changeset/base/283424[283424]), and upgrading clang and llvm to 3.6.1.
+|25 мая 2015
+|11.0-CURRENT после добавления предварительной поддержки бинарных файлов Linux для x86-64 (rev link:https://svnweb.freebsd.org/changeset/base/283424[283424]) и обновления clang и llvm до версии 3.6.1.
|1100075
|link:https://svnweb.freebsd.org/changeset/base/283623[283623]
-|May 27, 2015
-|11.0-CURRENT after `dounmount()` requiring a reference on the passed struct mount (rev link:https://svnweb.freebsd.org/changeset/base/283602[283602]).
+|27 мая 2015
+|11.0-CURRENT после `dounmount()`, требующей ссылки на переданную структуру mount (изменение rev link:https://svnweb.freebsd.org/changeset/base/283602[283602]).
|1100076
|link:https://svnweb.freebsd.org/changeset/base/283983[283983]
-|June 4, 2015
-|11.0-CURRENT after disabled generation of legacy formatted password databases entries by default.
+|4 июня 2015
+|11.0-CURRENT после отключения генерации записей в устаревших форматах баз данных паролей по умолчанию.
|1100077
|link:https://svnweb.freebsd.org/changeset/base/284233[284233]
-|June 10, 2015
-|11.0-CURRENT after API changes to `lim_cur`, `lim_max`, and `lim_rlimit` (rev link:https://svnweb.freebsd.org/changeset/base/284215[284215]).
+|10 июня 2015
+|11.0-CURRENT после изменений API в `lim_cur`, `lim_max` и `lim_rlimit` (rev link:https://svnweb.freebsd.org/changeset/base/284215[284215]).
|1100078
|link:https://svnweb.freebsd.org/changeset/base/286672[286672]
-|August 12, 2015
-|11.0-CURRENT after man:crunchgen[1] changes from link:https://svnweb.freebsd.org/changeset/base/284356[284356] to link:https://svnweb.freebsd.org/changeset/base/285986[285986].
+|12 августа 2015
+|11.0-CURRENT после изменений man:crunchgen[1] в ревизиях link:https://svnweb.freebsd.org/changeset/base/284356[284356] до link:https://svnweb.freebsd.org/changeset/base/285986[285986].
|1100079
|link:https://svnweb.freebsd.org/changeset/base/286874[286874]
-|August 18, 2015
-|11.0-CURRENT after import of jemalloc 4.0.0 (rev link:https://svnweb.freebsd.org/changeset/base/286866[286866]).
+|18 августа 2015
+|11.0-CURRENT после импорта jemalloc 4.0.0 (ревизия link:https://svnweb.freebsd.org/changeset/base/286866[286866]).
|1100080
|link:https://svnweb.freebsd.org/changeset/base/288943[288943]
-|October 5, 2015
-|11.0-CURRENT after upgrading clang, llvm, lldb, compiler-rt and libc++ to 3.7.0.
+|5 октября 2015
+|11.0-CURRENT после обновления clang, llvm, lldb, compiler-rt и libc++ до версии 3.7.0.
|1100081
|link:https://svnweb.freebsd.org/changeset/base/289415[289415]
-|October 16, 2015
-|11.0-CURRENT after undating ZFS to support resumable send/receive (rev link:https://svnweb.freebsd.org/changeset/base/289362[289362]).
+|16 октября 2015
+|11.0-CURRENT после `обновления` ZFS для поддержки возобновляемой отправки/приёмки (rev link:https://svnweb.freebsd.org/changeset/base/289362[289362]).
|1100082
|link:https://svnweb.freebsd.org/changeset/base/289594[289594]
-|October 19, 2015
-|11.0-CURRENT after Linux KPI updates.
+|19 октября 2015
+|11.0-CURRENT после обновлений Linux KPI.
|1100083
|link:https://svnweb.freebsd.org/changeset/base/289749[289749]
|October 22, 2015
-|11.0-CURRENT after renaming [.filename]#linuxapi.ko# to [.filename]#linuxkpi.ko#.
+|11.0-CURRENT после переименования [.filename]#linuxapi.ko# в [.filename]#linuxkpi.ko#.
|1100084
|link:https://svnweb.freebsd.org/changeset/base/290135[290135]
-|October 29, 2015
-|11.0-CURRENT after moving the LinuxKPI module into the default kernel build.
+|29 октября 2015
+|11.0-CURRENT после перемещения модуля LinuxKPI в стандартную сборку ядра.
|1100085
|link:https://svnweb.freebsd.org/changeset/base/290207[290207]
-|October 30, 2015
-|11.0-CURRENT after import of OpenSSL 1.0.2d.
+|30 октября 2015
+|11.0-CURRENT после импорта OpenSSL 1.0.2d.
|1100086
|link:https://svnweb.freebsd.org/changeset/base/290275[290275]
-|November 2, 2015
-|11.0-CURRENT after making man:figpar[3] macros more unique.
+|2 ноября 2015
+|11.0-CURRENT после изменения макросов man:figpar[3] для большей уникальности.
|1100087
|link:https://svnweb.freebsd.org/changeset/base/290479[290479]
-|November 7, 2015
-|11.0-CURRENT after changing man:sysctl_add_oid[9]'s ABI.
+|7 ноября 2015
+|11.0-CURRENT после изменения ABI man:sysctl_add_oid[9].
|1100088
|link:https://svnweb.freebsd.org/changeset/base/290495[290495]
-|November 7, 2015
-|11.0-CURRENT after string collation and locales rework.
+|7 ноября 2015
+|11.0-CURRENT после переработки сортировки строк и локалей.
|1100089
|link:https://svnweb.freebsd.org/changeset/base/290505[290505]
-|November 7, 2015
-|11.0-CURRENT after API change to man:sysctl_add_oid[9] (rev link:https://svnweb.freebsd.org/changeset/base/290475[290475]).
+|7 ноября 2015
+|11.0-CURRENT после изменения API в man:sysctl_add_oid[9] (rev link:https://svnweb.freebsd.org/changeset/base/290475[290475]).
|1100090
|link:https://svnweb.freebsd.org/changeset/base/290715[290715]
-|November 10, 2015
-|11.0-CURRENT after API change to callout_stop macro; (rev link:https://svnweb.freebsd.org/changeset/base/290664[290664]).
+|10 ноября 2015
+|11.0-CURRENT после изменения API для макроса callout_stop; (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/290664[290664]).
|1100091
|link:https://svnweb.freebsd.org/changeset/base/291537[291537]
-|November 30, 2015
-|11.0-CURRENT after changing the interface between the [.filename]#nfsd.ko# and [.filename]#nfscommon.ko# modules in link:https://svnweb.freebsd.org/changeset/base/291527[291527].
+|30 ноября 2015
+|11.0-CURRENT после изменения интерфейса между модулями [.filename]#nfsd.ko# и [.filename]#nfscommon.ko# в link:https://svnweb.freebsd.org/changeset/base/291527[291527].
|1100092
|link:https://svnweb.freebsd.org/changeset/base/292499[292499]
-|December 19, 2015
-|11.0-CURRENT after removal of vm_pageout_grow_cache (rev link:https://svnweb.freebsd.org/changeset/base/292469[292469]).
+|19 декабря 2015
+|11.0-CURRENT после удаления `vm_pageout_grow_cache` (изменение:https://svnweb.freebsd.org/changeset/base/292469[292469]).
|1100093
|link:https://svnweb.freebsd.org/changeset/base/292966[292966]
-|December 30, 2015
-|11.0-CURRENT after removal of sys/crypto/sha2.h (rev link:https://svnweb.freebsd.org/changeset/base/292782[292782]).
+|30 декабря 2015
+|11.0-CURRENT после удаления sys/crypto/sha2.h (изменение link:https://svnweb.freebsd.org/changeset/base/292782[292782]).
|1100094
|link:https://svnweb.freebsd.org/changeset/base/294086[294086]
-|January 15, 2016
-|11.0-CURRENT after LinuxKPI PCI changes (rev link:https://svnweb.freebsd.org/changeset/base/294086[294086]).
+|15 января 2016
+|11.0-CURRENT после изменений LinuxKPI PCI (rev link:https://svnweb.freebsd.org/changeset/base/294086[294086]).
|1100095
|link:https://svnweb.freebsd.org/changeset/base/294327[294327]
-|January 19, 2016
-|11.0-CURRENT after LRO optimizations.
+|19 января 2016
+|11.0-CURRENT после оптимизаций LRO.
|1100096
|link:https://svnweb.freebsd.org/changeset/base/294505[294505]
-|January 21, 2016
-|11.0-CURRENT after LinuxKPI idr_* additions.
+|21 января 2016
+|11.0-CURRENT после добавления LinuxKPI idr_*.
|1100097
|link:https://svnweb.freebsd.org/changeset/base/294860[294860]
-|January 26, 2016
-|11.0-CURRENT after API change to man:dpv[3].
+|26 января 2016
+|11.0-CURRENT после изменения API в man:dpv[3].
|1100098
|link:https://svnweb.freebsd.org/changeset/base/295682[295682]
-|February 16, 2016
-|11.0-CURRENT after API change to rman (rev link:https://svnweb.freebsd.org/changeset/base/294883[294883]).
+|16 февраля 2016
+|11.0-CURRENT после изменения API в `rman` (rev link:https://svnweb.freebsd.org/changeset/base/294883[294883]).
|1100099
|link:https://svnweb.freebsd.org/changeset/base/295739[295739]
-|February 18, 2016
-|11.0-CURRENT after allowing drivers to set the TCP ACK/data segment aggregation limit.
+|18 февраля 2016
+|11.0-CURRENT после разрешения драйверам устанавливать лимит агрегации сегментов TCP ACK/данных.
|1100100
|link:https://svnweb.freebsd.org/changeset/base/296136[296136]
-|February 26, 2016
-|11.0-CURRENT after man:bus_alloc_resource_any[9] API addition.
+|26 февраля 2016
+|11.0-CURRENT после добавления API man:bus_alloc_resource_any[9].
|1100101
|link:https://svnweb.freebsd.org/changeset/base/296417[296417]
-|March 5, 2016
-|11.0-CURRENT after upgrading our copies of clang, llvm, lldb and compiler-rt to 3.8.0 release.
+|5 марта 2016
+|11.0-CURRENT после обновления копий clang, llvm, lldb и compiler-rt до релиза 3.8.0.
|1100102
|link:https://svnweb.freebsd.org/changeset/base/296749[296749]
-|March 12, 2016
-|11.0-CURRENT after libelf cross-endian fix in rev link:https://svnweb.freebsd.org/changeset/base/296685[296685].
+|12 марта 2016
+|11.0-CURRENT после исправления кросс-эндианности libelf в ревизии link:https://svnweb.freebsd.org/changeset/base/296685[296685].
|1100103
|link:https://svnweb.freebsd.org/changeset/base/297000[297000]
-|March 18, 2016
-|11.0-CURRENT after using uintmax_t for rman ranges.
+|18 марта 2016
+|11.0-CURRENT после использования `uintmax_t` для диапазонов `rman`.
|1100104
|link:https://svnweb.freebsd.org/changeset/base/297156[297156]
-|March 21, 2016
-|11.0-CURRENT after tracking filemon usage via a proc.p_filemon pointer rather than its own lists.
+|21 марта 2016
+|11.0-CURRENT после отслеживания использования `filemon` через указатель proc.p_filemon вместо собственных списков.
|1100105
|link:https://svnweb.freebsd.org/changeset/base/297602[297602]
-|April 6, 2016
-|11.0-CURRENT after fixing sed functions `i` and `a` from discarding leading white space.
+|6 апреля 2016
+|11.0-CURRENT после исправления функций `i` и `a` в sed, которые отбрасывали начальные пробелы.
|1100106
|link:https://svnweb.freebsd.org/changeset/base/298486[298486]
-|April 22, 2016
-|11.0-CURRENT after fixes for using IPv6 addresses with RDMA.
+|22 апреля 2016
+|11.0-CURRENT после исправлений для использования IPv6-адресов с RDMA.
|1100107
|link:https://svnweb.freebsd.org/changeset/base/299090[299090]
-|May 4, 2016
-|11.0-CURRENT after improving performance and functionality of the man:bitstring[3] api.
+|4 мая 2016
+|11.0-CURRENT после улучшения производительности и функциональности API man:bitstring[3].
|1100108
|link:https://svnweb.freebsd.org/changeset/base/299530[299530]
-|May 12, 2016
-|11.0-CURRENT after fixing handling of IOCTLs in the LinuxKPI.
+|12 мая 2016
+|11.0-CURRENT после исправления обработки IOCTL в LinuxKPI.
|1100109
|link:https://svnweb.freebsd.org/changeset/base/299933[299933]
-|May 16, 2016
-|11.0-CURRENT after implementing more Linux device related functions in the LinuxKPI.
+|16 мая 2016
+|11.0-CURRENT после реализации дополнительных функций, связанных с устройствами Linux, в LinuxKPI.
|1100110
|link:https://svnweb.freebsd.org/changeset/base/300207[300207]
-|May 19, 2016
-|11.0-CURRENT after adding support for managing Shingled Magnetic Recording (SMR) drives.
+|19 мая 2016
+|11.0-CURRENT после добавления поддержки управления дисками с черепичной магнитной записью (Shingled Magnetic Recording, SMR).
|1100111
|link:https://svnweb.freebsd.org/changeset/base/300303[300303]
-|May 20, 2016
-|11.0-CURRENT after removing brk and sbrk from arm64.
+|20 мая 2016
+|11.0-CURRENT после удаления `brk` и `sbrk` из arm64.
|1100112
|link:https://svnweb.freebsd.org/changeset/base/300539[300539]
-|May 23, 2016
-|11.0-CURRENT after adding bit_count to the man:bitstring[3] API.
+|23 мая 2016
+|11.0-CURRENT после добавления `bit_count` в man:bitstring[3] API.
|1100113
|link:https://svnweb.freebsd.org/changeset/base/300701[300701]
-|May 26, 2016
-|11.0-CURRENT after disabling alignment faults on armv6.
+|26 мая 2016
+|11.0-CURRENT после отключения ошибок выравнивания на armv6.
|1100114
|link:https://svnweb.freebsd.org/changeset/base/300806[300806]
-|May 26, 2016
-|11.0-CURRENT after fixing man:crunchgen[1] usage with `MAKEOBJDIRPREFIX`.
+|26 мая 2016
+|11.0-CURRENT после исправления использования man:crunchgen[1] с `MAKEOBJDIRPREFIX`.
|1100115
|link:https://svnweb.freebsd.org/changeset/base/300982[300982]
-|May 30, 2016
-|11.0-CURRENT after adding an mbuf flag for `M_HASHTYPE_`.
+|30 мая 2016
+|11.0-CURRENT после добавления флага mbuf для `M_HASHTYPE_`.
|1100116
|link:https://svnweb.freebsd.org/changeset/base/301011[301011]
-|May 31, 2016
-|11.0-CURRENT after SHA-512t256 (rev link:https://svnweb.freebsd.org/changeset/base/300903[300903]) and Skein (rev link:https://svnweb.freebsd.org/changeset/base/300966[300966]) where added to libmd, libcrypt, the kernel, and ZFS (rev link:https://svnweb.freebsd.org/changeset/base/301010[301010]).
+|31 мая 2016
+|11.0-CURRENT после добавления SHA-512t256 (ревизия link:https://svnweb.freebsd.org/changeset/base/300903[300903]) и Skein (ревизия link:https://svnweb.freebsd.org/changeset/base/300966[300966]) в libmd, libcrypt, ядро и ZFS (ревизия link:https://svnweb.freebsd.org/changeset/base/301010[301010]).
|1100117
|link:https://svnweb.freebsd.org/changeset/base/301892[301892]
-|June 6, 2016
-|11.0-CURRENT after libpam was synced with stock link:https://svnweb.freebsd.org/changeset/base/301602[301602], bumping library version.
+|6 июня 2016
+|11.0-CURRENT после синхронизации libpam с основной версией link:https://svnweb.freebsd.org/changeset/base/301602[301602], что привело к увеличению версии библиотеки.
|1100118
|link:https://svnweb.freebsd.org/changeset/base/302071[302071]
-|June 21, 2016
-|11.0-CURRENT after breaking binary compatibility of struct disk link:https://svnweb.freebsd.org/changeset/base/302069[302069].
+|21 июня 2016
+|11.0-CURRENT после нарушения бинарной совместимости структуры disk link:https://svnweb.freebsd.org/changeset/base/302069[302069].
|1100119
|link:https://svnweb.freebsd.org/changeset/base/302150[302150]
-|June 23, 2016
-|11.0-CURRENT after switching geom_disk to using a pool mutex.
+|23 июня 2016
+|11.0-CURRENT после перевода `geom_disk` на использование мьютекса пула.
|1100120
|link:https://svnweb.freebsd.org/changeset/base/302153[302153]
-|June 23, 2016
-|11.0-CURRENT after adding spares to struct ifnet.
+|23 июня 2016
+|11.0-CURRENT после добавления запасных элементов в struct ifnet.
|1100121
|link:https://svnweb.freebsd.org/changeset/base/303979[303979]
-|August 12, 2015
-|11-STABLE after `releng/11.0` branched from 11-STABLE (rev link:https://svnweb.freebsd.org/changeset/base/303975[303975]).
+|12 августа 2015
+|11-STABLE после того, как ветка `releng/11.0` отделилась от 11-STABLE (изменение:https://svnweb.freebsd.org/changeset/base/303975[303975]).
|1100500
|link:https://svnweb.freebsd.org/changeset/base/303979[303979]
-|August 12, 2016
-|11.0-STABLE adding branched link:https://svnweb.freebsd.org/changeset/base/303976[303976].
+|12 августа 2016
+|11.0-STABLE добавлена ветвленная link: https://svnweb.freebsd.org/changeset/base/303976[303976].
|1100501
|link:https://svnweb.freebsd.org/changeset/base/304609[304609]
-|August 22, 2016
-|11.0-STABLE after adding C++11 thread_local support.
+|22 августа 2016
+|11.0-STABLE после добавления поддержки `thread_local` в C++11.
|1100502
|link:https://svnweb.freebsd.org/changeset/base/304865[304865]
-|August 26, 2016
-|11.0-STABLE after `LC_*_MASK` fix.
+|26 августа 2016
+|11.0-STABLE после исправления `LC_*_MASK`.
|1100503
|link:https://svnweb.freebsd.org/changeset/base/305733[305733]
-|September 12, 2016
-|11.0-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+|12 сентября 2016
+|11.0-STABLE после устранения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9].
|1100504
|link:https://svnweb.freebsd.org/changeset/base/307330[307330]
-|October 14, 2016
-|11.0-STABLE after ZFS merges.
+|14 октября 2016
+|11.0-STABLE после объединения ZFS.
|1100505
|link:https://svnweb.freebsd.org/changeset/base/307590[307590]
-|October 19, 2016
-|11.0-STABLE after `struct fb_info` change.
+|19 октября 2016
+|11.0-STABLE после изменения `struct fb_info`.
|1100506
|link:https://svnweb.freebsd.org/changeset/base/308048[308048]
-|October 28, 2016
-|11.0-STABLE after installing header files required development with libzfs_core.
+|28 октября 2016
+|11.0-STABLE после установки заголовочных файлов, необходимых для разработки с `libzfs_core`.
|1100507
|link:https://svnweb.freebsd.org/changeset/base/310120[310120]
-|December 15, 2016
-|11.0-STABLE after adding the `ki_moretdname` member to `struct kinfo_proc` and `struct kinfo_proc32` to export the whole thread name to user-space utilities.
+|15 декабря 2016
+|11.0-STABLE после добавления члена `ki_moretdname` в структуры `struct kinfo_proc` и `struct kinfo_proc32` для экспорта полного имени потока в пользовательские утилиты.
|1100508
|link:https://svnweb.freebsd.org/changeset/base/310618[310618]
-|December 26, 2016
-|11.0-STABLE after upgrading our copies of clang, llvm, lldb, compiler-rt and libc++ to 3.9.1 release, and adding lld 3.9.1.
+|26 декабря 2016
+|11.0-STABLE после обновления копий clang, llvm, lldb, compiler-rt и libc++ до версии 3.9.1, а также добавления lld 3.9.1.
|1100509
|link:https://svnweb.freebsd.org/changeset/base/311186[311186]
-|January 3, 2017
-|11.0-STABLE after man:crunchgen[1] META_MODE fix (rev link:https://svnweb.freebsd.org/changeset/base/311185[311185]).
+|3 января 2017
+|11.0-STABLE после исправления META_MODE в man:crunchgen[1] (изменение link:https://svnweb.freebsd.org/changeset/base/311185[311185]).
|1100510
|link:https://svnweb.freebsd.org/changeset/base/315312[315312]
-|March 15, 2017
-|11.0-STABLE after MFC of `fget_cap`, `getsock_cap`, and related changes.
+|15 марта 2017
+|11.0-STABLE после MFC изменений, связанных с `fget_cap`, `getsock_cap` и другими.
|1100511
|link:https://svnweb.freebsd.org/changeset/base/316423[316423]
-|April 2, 2017
-|11.0-STABLE after multiple MFCs updating clang, llvm, lld, lldb, compiler-rt and libc++ to 4.0.0 release.
+|2 апреля 2017
+|11.0-STABLE после нескольких MFC, обновляющих clang, llvm, lld, lldb, compiler-rt и libc++ до версии 4.0.0.
|1100512
|link:https://svnweb.freebsd.org/changeset/base/316498[316498]
-|April 4, 2017
-|11.0-STABLE after making CAM SIM lock optional (revs link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674]).
+|4 апреля 2017
+|11.0-STABLE после того, как блокировка CAM SIM стала опциональной (ревизии link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674]).
|1100513
|link:https://svnweb.freebsd.org/changeset/base/318197[318197]
-|May 11, 2017
-|11.0-STABLE after merging the addition of the [.filename]#<dev/mmc/mmc_ioctl.h># header.
+|11 мая 2017
+|11.0-STABLE после объединения добавления заголовочного файла [.filename]#<dev/mmc/mmc_ioctl.h>#.
|1100514
|link:https://svnweb.freebsd.org/changeset/base/319279[319279]
-|May 31, 2017
-|11.0-STABLE after multiple MFCs of `libpcap`, `WITHOUT_INET6`, and a few other minor changes.
+|31 мая 2017
+|11.0-STABLE после нескольких MFC для `libpcap`, `WITHOUT_INET6` и нескольких других незначительных изменений.
|1101000
|link:https://svnweb.freebsd.org/changeset/base/320486[320486]
|June 30, 2017
-|`releng/11.1` branched from `stable/11`.
+|`releng/11.1` отделился от `stable/11`.
|1101001
|link:https://svnweb.freebsd.org/changeset/base/320763[320763]
|June 30, 2017
-|11.1-RC1 After merging the `MAP_GUARD` man:mmap[2] flag addition.
+|11.1-RC1 После объединения добавления флага `MAP_GUARD` в man:mmap[2].
|1101500
|link:https://svnweb.freebsd.org/changeset/base/320487[320487]
|June 30, 2017
-|11-STABLE after `releng/11.1` branched.
+|11-STABLE после ветвления `releng/11.1`.
|1101501
|link:https://svnweb.freebsd.org/changeset/base/320666[320666]
-|July 5, 2017
-|11-STABLE after merging the `MAP_GUARD` man:mmap[2] flag addition.
+|5 июля 2017
+|11-STABLE после объединения добавления флага `MAP_GUARD` в man:mmap[2].
|1101502
|link:https://svnweb.freebsd.org/changeset/base/321688[321688]
-|July 29, 2017
-|11-STABLE after merging the NFS client forced dismount support `umount -N` addition.
+|29 июля 2017
+|11-STABLE после объединения поддержки принудительного демонтирования клиента NFS с добавлением `umount -N`.
|1101503
|link:https://svnweb.freebsd.org/changeset/base/323431[323431]
-|September 11, 2017
-|11-STABLE after merging changes making the WRFSBASE instruction operational on amd64.
+|11 сентября 2017
+|11-STABLE после объединения изменений, сделавших инструкцию WRFSBASE работоспособной на amd64.
|1101504
|link:https://svnweb.freebsd.org/changeset/base/324006[324006]
-|September 26, 2017
-|11-STABLE after merging libm from head, which adds man:cacoshl[3], man:cacosl[3], man:casinhl[3], man:casinl[3], man:catanl[3], man:catanhl[3], man:sincos[3], man:sincosf[3], and man:sincosl[3].
+|26 сентября 2017
+|11-STABLE после слияния libm из head, что добавляет man:cacoshl[3], man:cacosl[3], man:casinhl[3], man:casinl[3], man:catanl[3], man:catanhl[3], man:sincos[3], man:sincosf[3] и man:sincosl[3].
|1101505
|link:https://svnweb.freebsd.org/changeset/base/324023[324023]
-|September 26, 2017
-|11-STABLE after merging clang, llvm, lld, lldb, compiler-rt and libc++ 5.0.0 release.
+|26 сентября 2017
+|11-STABLE после объединения clang, llvm, lld, lldb, compiler-rt и libc++ версии 5.0.0.
|1101506
|link:https://svnweb.freebsd.org/changeset/base/325003[325003]
-|October 25, 2017
-|11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/324281[324281], adding the `value.u16` field to `struct diocgattr_arg`.
+|25 октября 2017
+|11-STABLE после слияния link:https://svnweb.freebsd.org/changeset/base/324281[324281], добавления поля `value.u16` в структуру `struct diocgattr_arg`.
|1101507
|link:https://svnweb.freebsd.org/changeset/base/328379[328379]
-|January 24, 2018
-|11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/325028[325028], fixing `ptrace()` to always clear the correct thread event when resuming.
+|24 января 2018
+|11-STABLE после слияния с link:https://svnweb.freebsd.org/changeset/base/325028[325028], исправление `ptrace()` для корректной очистки события нужного потока при возобновлении.
|1101508
|link:https://svnweb.freebsd.org/changeset/base/328386[328386]
-|January 24, 2018
-|11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/316648[316648], renaming smp_no_rendevous_barrier() to smp_no_rendezvous_barrier().
+|24 января 2018
+|11-STABLE после объединения изменений link:https://svnweb.freebsd.org/changeset/base/316648[316648], переименование `smp_no_rendevous_barrier()` в `smp_no_rendezvous_barrier()`.
|1101509
|link:https://svnweb.freebsd.org/changeset/base/328653[328653]
-|February 1, 2018
-|11-STABLE after an overwrite merge backport of the LinuxKPI from FreeBSD-head.
+|1 февраля 2018
+|11-STABLE после обратного переноса (overwrite merge) LinuxKPI из FreeBSD-head.
|1101510
|link:https://svnweb.freebsd.org/changeset/base/329450[329450]
-|February 17, 2018
-|11-STABLE after the cmpxchg() macro is now fully functional in the LinuxKPI.
+|17 февраля 2018
+|11-STABLE после того, как макрос `cmpxchg()` стал полностью функциональным в LinuxKPI.
|1101511
|link:https://svnweb.freebsd.org/changeset/base/329981[329981]
-|February 25, 2018
-|11-STABLE after concluding the recent LinuxKPI related updates.
+|25 февраля 2018
+|11-STABLE после завершения недавних обновлений, связанных с LinuxKPI.
|1101512
|link:https://svnweb.freebsd.org/changeset/base/331219[331219]
-|March 19, 2018
-|11-STABLE after merging retpoline support from the upstream llvm, clang and lld 5.0 branches.
+|19 марта 2018
+|11-STABLE после объединения поддержки `retpoline` из вышестоящих веток llvm, clang и lld 5.0.
|1101513
|link:https://svnweb.freebsd.org/changeset/base/331838[331838]
-|March 31, 2018
-|11-STABLE after merging clang, llvm, lld, lldb, compiler-rt and libc++ 6.0.0 release, and several follow-up fixes.
+|31 марта 2018
+|11-STABLE после объединения clang, llvm, lld, lldb, compiler-rt и libc++ версии 6.0.0, а также нескольких последующих исправлений.
|1101514
|link:https://svnweb.freebsd.org/changeset/base/332089[332089]
-|April 5, 2018
-|11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/328331[328331], adding a new and incompatible interpretation of ${name}_limits in rc scripts.
+|5 апреля 2018
+|11-STABLE после объединения изменений link:https://svnweb.freebsd.org/changeset/base/328331[328331], добавляющего новую и несовместимую интерпретацию `${name}_limits` в rc-скриптах.
|1101515
|link:https://svnweb.freebsd.org/changeset/base/332363[332363]
-|April 10, 2018
-|11-STABLE after reverting link:https://svnweb.freebsd.org/changeset/base/331880[331880], removing the new and incompatible interpretation of ${name}_limits in rc scripts.
+|10 апреля 2018
+|11-STABLE после отмены изменений из link:https://svnweb.freebsd.org/changeset/base/331880[331880], удаляющих новую и несовместимую интерпретацию `${name}_limits` в rc-скриптах.
|1101516
|link:https://svnweb.freebsd.org/changeset/base/334392[334392]
-|May 30, 2018
-|11-STABLE after man:dwatch[1] touch-ups.
+|30 мая 2018
+|11-STABLE после доработок man:dwatch[1].
|1102000
|link:https://svnweb.freebsd.org/changeset/base/334459[334459]
-|June 1, 2018
-|`releng/11.2` branched from `stable/11`.
+|1 июня 2018
+|`releng/11.2` отделился от `stable/11`.
|1102500
|link:https://svnweb.freebsd.org/changeset/base/334461[334461]
-|June 1, 2018
-|11-STABLE after releng/11.2 branched.
+|1 июня 2018
+|11-STABLE после ветвления releng/11.2.
|1102501
|link:https://svnweb.freebsd.org/changeset/base/335436[335436]
|June 20, 2018
-|11-STABLE after LinuxKPI updates requiring recompilation of external kernel modules.
+|11-STABLE после обновлений LinuxKPI, требующих перекомпиляции внешних модулей ядра.
|1102502
|link:https://svnweb.freebsd.org/changeset/base/338617[338617]
-|September 12, 2018
-|11-STABLE after adding a socket option SO_TS_CLOCK and fixing recvmsg32() system call to properly down-convert layout of the 64-bit structures to match what 32-bit app(s) expect.
+|12 сентября 2018
+|11-STABLE после добавления сокет-опции SO_TS_CLOCK и исправления системного вызова `recvmsg32()` для корректного преобразования структуры 64-битных данных в формат, ожидаемый 32-битными приложениями.
|1102503
|link:https://svnweb.freebsd.org/changeset/base/338931[338931]
-|September 25, 2018
-|11-STABLE after merging a TCP checksum fix to man:iflib[9] and adding new media types to if_media.h
+|25 сентября 2018
+|11-STABLE после объединения исправления контрольной суммы TCP в man:iflib[9] и добавления новых типов носителей в if_media.h
|1102504
|link:https://svnweb.freebsd.org/changeset/base/340309[340309]
-|November 9, 2018
-|11-STABLE after several MFCs: updating man:objcopy[1] to properly handle little-endian MIPS64 object; correcting mips64el test to use ELF header; adding test for 64-bit ELF in _libelf_is_mips64el.
+|9 ноября 2018
+|11-STABLE после нескольких MFC: обновление man:objcopy[1] для корректной обработки little-endian MIPS64 объектов; исправление теста mips64el для использования заголовка ELF; добавление теста для 64-битного ELF в _libelf_is_mips64el.
|1102505
|link:https://svnweb.freebsd.org/changeset/base/342804[342804]
-|January 6, 2019
-|11-STABLE after merge of fixing linux_destroy_dev() behaviour when there are still files open from the destroying cdev.
+|6 января 2019
+|11-STABLE после слияния исправления поведения `linux_destroy_dev()`, когда остаются открытые файлы из уничтожаемого cdev.
|1102506
|link:https://svnweb.freebsd.org/changeset/base/344220[344220]
-|February 17, 2019
-|11-STABLE after merging multiple commits to lualoader.
+|17 февраля 2019
+|11-STABLE после объединения нескольких коммитов в lualoader.
|1102507
|link:https://svnweb.freebsd.org/changeset/base/346296[346296]
-|April 16, 2019
-|11-STABLE after merging llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp 8.0.0 final release r356365.
+|16 апреля 2019
+|11-STABLE после объединения llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp 8.0.0 финальный релиз r356365.
|1102508
|link:https://svnweb.freebsd.org/changeset/base/346784[346784]
-|April 27, 2019
-|11-STABLE after ether_gen_addr availability.
+|27 апреля 2019
+|11-STABLE после появления `ether_gen_addr`.
|1102509
|link:https://svnweb.freebsd.org/changeset/base/347212[347212]
-|May 6, 2019
-|11-STABLE after MFC of link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] and partially of link:https://svnweb.freebsd.org/changeset/base/345305[345305].
+|6 мая 2019
+|11-STABLE после слияния изменений link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] и частично link:https://svnweb.freebsd.org/changeset/base/345305[345305].
|1102510
|link:https://svnweb.freebsd.org/changeset/base/347883[347883]
-|May 16, 2019
-|11-STABLE after bumping the Mellanox driver version numbers (man:mlx4en[4]; man:mlx5en[4]).
+|16 мая 2019
+|11-STABLE после увеличения номеров версий драйверов Mellanox (man:mlx4en[4]; man:mlx5en[4]).
|1103000
|link:https://svnweb.freebsd.org/changeset/base/349026[349026]
-|June 14, 2019
-|`releng/11.3` branched from `stable/11`.
+|14 июня 2019
+|`releng/11.3` отделился от `stable/11`.
|1103500
|link:https://svnweb.freebsd.org/changeset/base/349027[349027]
-|June 14, 2019
-|11-STABLE after releng/11.3 branched.
+|14 июня 2019
+|11-STABLE после ветвления releng/11.3.
|1103501
|link:https://svnweb.freebsd.org/changeset/base/354598[354598]
-|November 10, 2019
-|11-STABLE after fixing a potential OOB read security issue in libc++.
+|10 ноября 2019
+|11-STABLE после исправления потенциальной проблемы безопасности OOB-чтения в libc++.
|1103502
|link:https://svnweb.freebsd.org/changeset/base/354614[354614]
-|November 11, 2019
-|11-STABLE after adding sysfs create/remove functions that handles multiple files in one call to the LinuxKPI.
+|11 ноября 2019
+|11-STABLE после добавления функций создания/удаления sysfs, обрабатывающих несколько файлов за один вызов в LinuxKPI.
|1103503
|link:https://svnweb.freebsd.org/changeset/base/354615[354615]
-|November 11, 2019
-|11-STABLE after LinuxKPI sysfs improvements.
+|11 ноября 2019
+|11-STABLE после улучшений LinuxKPI sysfs.
|1103504
|link:https://svnweb.freebsd.org/changeset/base/354616[354616]
-|November 11, 2019
-|11-STABLE after enabling device class group attributes in the LinuxKPI.
+|11 ноября 2019
+|11-STABLE после включения атрибутов группы классов устройств в LinuxKPI.
|1103505
|link:https://svnweb.freebsd.org/changeset/base/355899[355899]
-|December 19, 2019
-|11-STABLE after adding sigsetop extensions commonly found in musl libc and glibc.
+|19 декабря 2019
+|11-STABLE после добавления расширений `sigsetop`, которые часто встречаются в musl libc и glibc.
|1103506
|link:https://svnweb.freebsd.org/changeset/base/356395[356395]
-|January 6, 2020
-|11-STABLE after making USB statistics be per-device instead of per bus.
+|6 января 2020
+|11-STABLE после изменения статистики USB для каждого устройства вместо каждой шины.
|1103507
|link:https://svnweb.freebsd.org/changeset/base/356680[356680]
-|January 13, 2020
-|11-STABLE after adding own counter for cancelled USB transfers.
+|13 января 2020
+|11-STABLE после добавления собственного счетчика для отмененных USB-передач.
|1103508
|link:https://svnweb.freebsd.org/changeset/base/357613[357613]
-|February 6, 2020
-|11-STABLE after recent LinuxKPI changes.
+|6 февраля 2020
+|11-STABLE после недавних изменений в LinuxKPI.
|1103509
|link:https://svnweb.freebsd.org/changeset/base/359958[359958]
-|April 15, 2020
-|11-STABLE after moving `id_mapped` to end of `bus_dma_impl` structure to preserve KPI.
+|15 апреля 2020
+|11-STABLE после перемещения `id_mapped` в конец структуры `bus_dma_impl` для сохранения KPI.
|1103510
|link:https://svnweb.freebsd.org/changeset/base/360658[360658]
-|May 5, 2020
-|11-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 9.0.0 final release r372316.
+|5 мая 2020
+|11-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до финального релиза 9.0.0 r372316.
|1103511
|link:https://svnweb.freebsd.org/changeset/base/360784[360784]
-|May 7, 2020
-|11-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0 release.
+|7 мая 2020
+|11-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.0.
|1104000
|link:https://svnweb.freebsd.org/changeset/base/360804[360804]
-|May 8, 2020
-|`releng/11.4` branched from `stable/11`.
+|8 мая 2020
+|`releng/11.4` ответвился от `stable/11`.
|1104001
|link:https://svnweb.freebsd.org/changeset/base/360822[360822]
-|May 8, 2020
-|11.4-BETA1 after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0 release.
+|8 мая 2020
+|11.4-BETA1 после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.0.
|1104500
|link:https://svnweb.freebsd.org/changeset/base/360805[360805]
-|May 8, 2020
-|11-STABLE after releng/11.4 branched.
+|8 мая 2020
+|11-STABLE после ветвления releng/11.4.
|1104501
|link:https://svnweb.freebsd.org/changeset/base/362320[362320]
-|June 18, 2020
-|11-STABLE after implementing __is_constexpr() function macro in the LinuxKPI.
+|18 июня 2020
+|11-STABLE после реализации макроса функции `__is_constexpr()` в LinuxKPI.
|1104502
|link:https://svnweb.freebsd.org/changeset/base/362919[362919]
-|July 4, 2020
-|11-STABLE after making liblzma use libmd implementation of SHA256.
+|4 июля 2020
+|11-STABLE после перевода liblzma на использование реализации SHA256 из libmd.
|1104503
|link:https://svnweb.freebsd.org/changeset/base/363496[363496]
-|July 24, 2020
-|11-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.1 release.
+|24 июля 2020
+|11-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.1.
|1104504
|link:https://svnweb.freebsd.org/changeset/base/363792[363792]
-|August 3, 2020
-|11-STABLE after implementing the array_size() function in the LinuxKPI.
+|3 августа 2020
+|11-STABLE после реализации функции `array_size()` в LinuxKPI.
|1104505
|link:https://svnweb.freebsd.org/changeset/base/364391[364391]
-|August 19, 2020
-|11-STABLE after change to clone the task struct fields related to RCU.
+|19 августа 2020
+|11-STABLE после изменения для клонирования полей структуры задачи, связанных с RCU.
|1104506
|link:https://svnweb.freebsd.org/changeset/base/365471[365471]
-|September 8, 2020
-|11-STABLE after adding atomic and bswap functions to libcompiler_rt.
+|8 сентября 2020
+|11-STABLE после добавления атомарных функций и функций `bswap` в libcompiler_rt.
|1104507
|link:https://svnweb.freebsd.org/changeset/base/365661[365661]
-|September 12, 2020
-|11-STABLE after followup commits to libcompiler_rt.
+|12 сентября 2020
+|11-STABLE после последующих коммитов в libcompiler_rt.
+
+|1104508
+|link:https://svnweb.freebsd.org/changeset/base/366879[366879]
+|20 октября 2020
+|11-STABLE после заполнения поля контекста получения в `ww_mutex` в LinuxKPI.
+
+|1104509
+|link:https://svnweb.freebsd.org/changeset/base/366889[366889]
+|20 октября 2020
+|11-STABLE после добавлений в список `RCU` LinuxKPI.
+
+|1104510
+|link:https://svnweb.freebsd.org/changeset/base/367513[367513]
+|9 ноября 2020
+|11-STABLE после добавления `ptsname_r`.
|===
[[versions-10]]
-== FreeBSD 10 Versions
+== Версии FreeBSD 10
[[freebsd-versions-table-10]]
-.FreeBSD 10 `__FreeBSD_version` Values
+.Значения `__FreeBSD_version` в FreeBSD 10
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|1000000
|link:https://svnweb.freebsd.org/changeset/base/225757[225757]
-|September 26, 2011
+|26 сентября 2011
|10.0-CURRENT.
|1000001
|link:https://svnweb.freebsd.org/changeset/base/227070[227070]
-|November 4, 2011
-|10-CURRENT after addition of the man:posix_fadvise[2] system call.
+|4 ноября 2011
+|10-CURRENT после добавления системного вызова man:posix_fadvise[2].
|1000002
|link:https://svnweb.freebsd.org/changeset/base/228444[228444]
-|December 12, 2011
-|10-CURRENT after defining boolean true/false in sys/types.h, sizeof(bool) may have changed (rev link:https://svnweb.freebsd.org/changeset/base/228444[228444]). 10-CURRENT after xlocale.h was introduced (rev link:https://svnweb.freebsd.org/changeset/base/227753[227753]).
+|12 декабря 2011
+|10-CURRENT после определения булевых значений true/false в sys/types.h, размер sizeof(bool) мог измениться (ревизия link:https://svnweb.freebsd.org/changeset/base/228444[228444]). 10-CURRENT после введения xlocale.h (ревизия link:https://svnweb.freebsd.org/changeset/base/227753[227753]).
|1000003
|link:https://svnweb.freebsd.org/changeset/base/228571[228571]
-|December 16, 2011
-|10-CURRENT after major changes to man:carp[4], changing size of struct in_aliasreq, struct in6_aliasreq (rev link:https://svnweb.freebsd.org/changeset/base/228571[228571]) and straitening arguments check of SIOCAIFADDR (rev link:https://svnweb.freebsd.org/changeset/base/228574[228574]).
+|16 декабря 2011
+|10-CURRENT после значительных изменений в man:carp[4], изменения размера структур `in_aliasreq`, `in6_aliasreq` (rev link:https://svnweb.freebsd.org/changeset/base/228571[228571]) и упрощения проверки аргументов SIOCAIFADDR (rev link:https://svnweb.freebsd.org/changeset/base/228574[228574]).
|1000004
|link:https://svnweb.freebsd.org/changeset/base/229204[229204]
-|January 1, 2012
-|10-CURRENT after the removal of `skpc()` and the addition of man:memcchr[9] (rev link:https://svnweb.freebsd.org/changeset/base/229200[229200]).
+|1 января 2012
+|10-CURRENT после удаления `skpc()` и добавления man:memcchr[9] (изменение:https://svnweb.freebsd.org/changeset/base/229200[229200]).
|1000005
|link:https://svnweb.freebsd.org/changeset/base/230207[230207]
-|January 16, 2012
-|10-CURRENT after the removal of support for SIOCSIFADDR, SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFDSTADDR ioctls.
+|16 января 2012
+|10-CURRENT после удаления поддержки ioctls SIOCSIFADDR, SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFDSTADDR.
|1000006
|link:https://svnweb.freebsd.org/changeset/base/230590[230590]
-|January 26, 2012
-|10-CURRENT after introduction of read capacity data asynchronous notification in the man:cam[4] layer.
+|26 января 2012
+|10-CURRENT после внедрения асинхронного уведомления о данных пропускной способности чтения в слое man:cam[4].
|1000007
|link:https://svnweb.freebsd.org/changeset/base/231025[231025]
-|February 5, 2012
-|10-CURRENT after introduction of new man:tcp[4] socket options: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL, and TCP_KEEPCNT.
+|5 февраля 2012
+|10-CURRENT после введения новых параметров сокета man:tcp[4]: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL и TCP_KEEPCNT.
|1000008
|link:https://svnweb.freebsd.org/changeset/base/231505[231505]
-|February 11, 2012
-|10-CURRENT after introduction of the new extensible man:sysctl[3] interface NET_RT_IFLISTL to query address lists.
+|11 февраля 2012
+|10-CURRENT после введения нового расширяемого интерфейса man:sysctl[3] NET_RT_IFLISTL для запроса списков адресов.
|1000009
|link:https://svnweb.freebsd.org/changeset/base/232154[232154]
-|February 25, 2012
-|10-CURRENT after import of libarchive 3.0.3 (rev link:https://svnweb.freebsd.org/changeset/base/232153[232153]).
+|25 февраля 2012
+|10-CURRENT после импорта libarchive 3.0.3 (rev link:https://svnweb.freebsd.org/changeset/base/232153[232153]).
|1000010
|link:https://svnweb.freebsd.org/changeset/base/233757[233757]
-|March 31, 2012
-|10-CURRENT after xlocale cleanup.
+|31 марта 2012
+|10-CURRENT после очистки `xlocale`.
|1000011
|link:https://svnweb.freebsd.org/changeset/base/234355[234355]
-|April 16, 2012
-|10-CURRENT import of LLVM/Clang 3.1 trunk link:https://svnweb.freebsd.org/changeset/base/154661[154661] (rev link:https://svnweb.freebsd.org/changeset/base/234353[234353]).
+|16 апреля 2012
+|Импорт LLVM/Clang 3.1 из 10-CURRENT, ссылка на ревизию: link:https://svnweb.freebsd.org/changeset/base/154661[154661] (ревизия link:https://svnweb.freebsd.org/changeset/base/234353[234353]).
|1000012
|link:https://svnweb.freebsd.org/changeset/base/234924[234924]
-|May 2, 2012
-|10-CURRENT jemalloc import.
+|2 мая 2012
+|10-CURRENT импорт jemalloc.
|1000013
|link:https://svnweb.freebsd.org/changeset/base/235788[235788]
-|May 22, 2012
-|10-CURRENT after byacc import.
+|22 мая 2012
+|10-CURRENT после импорта `byacc`.
|1000014
|link:https://svnweb.freebsd.org/changeset/base/237631[237631]
-|June 27, 2012
-|10-CURRENT after BSD sort becoming the default sort (rev link:https://svnweb.freebsd.org/changeset/base/237629[237629]).
+|27 июня 2012
+|10-CURRENT после того, как BSD sort стал сортировкой по умолчанию (rev link:https://svnweb.freebsd.org/changeset/base/237629[237629]).
|1000015
|link:https://svnweb.freebsd.org/changeset/base/238405[238405]
-|July 12, 2012
-|10-CURRENT after import of OpenSSL 1.0.1c.
+|12 июля 2012
+|10-CURRENT после импорта OpenSSL 1.0.1c.
-|(not changed)
+|(не изменено)
|link:https://svnweb.freebsd.org/changeset/base/238429[238429]
|July 13, 2012
-|10-CURRENT after the fix for LLVM/Clang 3.1 regression.
+|10-CURRENT после исправления регрессии в LLVM/Clang 3.1.
|1000016
|link:https://svnweb.freebsd.org/changeset/base/239179[239179]
-|August 8, 2012
-|10-CURRENT after KBI change in man:ucom[4].
+|8 августа 2012
+|10-CURRENT после изменения KBI в man:ucom[4].
|1000017
|link:https://svnweb.freebsd.org/changeset/base/239214[239214]
-|August 8, 2012
-|10-CURRENT after adding streams feature to the USB stack.
+|8 августа 2012
+|10-CURRENT после добавления функции потоков в стек USB.
|1000018
|link:https://svnweb.freebsd.org/changeset/base/240233[240233]
-|September 8, 2012
-|10-CURRENT after major rewrite of man:pf[4].
+|8 сентября 2012
+|10-CURRENT после значительной переработки man:pf[4].
|1000019
|link:https://svnweb.freebsd.org/changeset/base/241245[241245]
-|October 6, 2012
-|10-CURRENT after man:pfil[9] KBI/KPI changed to supply packets in net byte order to AF_INET filter hooks.
+|6 октября 2012
+|10-CURRENT после изменения KBI/KPI в man:pfil[9] для передачи пакетов в порядке байтов сети к хукам фильтрации AF_INET.
|1000020
|link:https://svnweb.freebsd.org/changeset/base/241610[241610]
-|October 16, 2012
-|10-CURRENT after the network interface cloning KPI changed and struct if_clone becoming opaque.
+|16 октября 2012
+|10-CURRENT после изменения KPI клонирования сетевых интерфейсов и структура `if_clone` стала непрозрачной.
|1000021
|link:https://svnweb.freebsd.org/changeset/base/241897[241897]
-|October 22, 2012
-|10-CURRENT after removal of support for non-MPSAFE filesystems and addition of support for FUSEFS (rev link:https://svnweb.freebsd.org/changeset/base/241519[241519]).
+|22 октября 2012
+|10-CURRENT после удаления поддержки не-MPSAFE файловых систем и добавления поддержки FUSEFS (rev link:https://svnweb.freebsd.org/changeset/base/241519[241519]).
|1000022
|link:https://svnweb.freebsd.org/changeset/base/241913[241913]
-|October 22, 2012
-|10-CURRENT after the entire IPv4 stack switched to network byte order for IP packet header storage.
+|22 октября 2012
+|10-CURRENT после перевода всего стека IPv4 на сетевой порядок байтов для хранения заголовков IP-пакетов.
|1000023
|link:https://svnweb.freebsd.org/changeset/base/242619[242619]
-|November 5, 2012
-|10-CURRENT after jitter buffer in the common USB serial driver code, to temporarily store characters if the TTY buffer is full. Add flow stop and start signals when this happens.
+|5 ноября 2012
+|10-CURRENT после буфера джиттера в общем коде драйвера USB-последовательного порта, для временного хранения символов, если буфер TTY заполнен. Добавлены сигналы остановки и возобновления потока при возникновении такой ситуации.
|1000024
|link:https://svnweb.freebsd.org/changeset/base/242624[242624]
-|November 5, 2012
-|10-CURRENT after clang was made the default compiler on i386 and amd64.
+|5 ноября 2012
+|10-CURRENT после того, как clang стал компилятором по умолчанию для i386 и amd64.
|1000025
|link:https://svnweb.freebsd.org/changeset/base/243443[243443]
-|November 17, 2012
-|10-CURRENT after the sin6_scope_id member variable in struct sockaddr_in6 was changed to being filled by the kernel before passing the structure to the userland via sysctl or routing socket. This means the KAME-specific embedded scope id in sin6_addr.s6_addr[2] is always cleared in userland application.
+|17 ноября 2012
+|10-CURRENT после того, как переменная-член sin6_scope_id в структуре sockaddr_in6 была изменена таким образом, что ядро заполняет её перед передачей структуры в пользовательское пространство через sysctl или сокет маршрутизации. Это означает, что специфичный для KAME встроенный идентификатор области в sin6_addr.s6_addr[2] всегда очищается в пользовательских приложениях.
|1000026
|link:https://svnweb.freebsd.org/changeset/base/245313[245313]
-|January 11, 2013
-|10-CURRENT after install gained the -N flag. May also be used to indicate the presence of nmtree.
+|11 января 2013
+|10-CURRENT после установки получил флаг -N. Также может использоваться для указания наличия nmtree.
|1000027
|link:https://svnweb.freebsd.org/changeset/base/246084[246084]
-|January 29, 2013
-|10-CURRENT after cat gained the -l flag (rev link:https://svnweb.freebsd.org/changeset/base/246083[246083]).
+|29 января 2013
+|10-CURRENT после того, как команда `cat` получила флаг `-l` (rev link:https://svnweb.freebsd.org/changeset/base/246083[246083]).
|1000028
|link:https://svnweb.freebsd.org/changeset/base/246759[246759]
-|February 13, 2013
-|10-CURRENT after USB moved to the driver structure requiring a rebuild of all USB modules.
+|13 февраля 2013
+|10-CURRENT после перемещения USB в структуру драйверов, требующую пересборки всех модулей USB.
|1000029
|link:https://svnweb.freebsd.org/changeset/base/247821[247821]
-|March 4, 2013
-|10-CURRENT after the introduction of tickless callout facility which also changed the layout of struct callout (rev link:https://svnweb.freebsd.org/changeset/base/247777[247777]).
+|4 марта 2013
+|10-CURRENT после внедрения бестиковой системы отложенных вызовов, которая также изменила структуру struct callout (rev link:https://svnweb.freebsd.org/changeset/base/247777[247777]).
|1000030
|link:https://svnweb.freebsd.org/changeset/base/248210[248210]
-|March 12, 2013
-|10-CURRENT after KPI breakage introduced in the VM subsystem to support read/write locking (rev link:https://svnweb.freebsd.org/changeset/base/248084[248084]).
+|12 марта 2013
+|10-CURRENT после нарушения KPI, внесённого в подсистему VM для поддержки блокировок чтения/записи (rev link:https://svnweb.freebsd.org/changeset/base/248084[248084]).
|1000031
|link:https://svnweb.freebsd.org/changeset/base/249943[249943]
-|April 26, 2013
-|10-CURRENT after the dst parameter of the ifnet `if_output` method was changed to take const qualifier (rev link:https://svnweb.freebsd.org/changeset/base/249925[249925]).
+|26 апреля 2013
+|10-CURRENT после изменения параметра `dst` метода `if_output` в ifnet, чтобы он принимал квалификатор const (ревизия link:https://svnweb.freebsd.org/changeset/base/249925[249925]).
|1000032
|link:https://svnweb.freebsd.org/changeset/base/250163[250163]
-|May 1, 2013
-|10-CURRENT after the introduction of the man:accept4[2] (rev link:https://svnweb.freebsd.org/changeset/base/250154[250154]) and man:pipe2[2] (rev link:https://svnweb.freebsd.org/changeset/base/250159[250159]) system calls.
+|1 мая 2013
+|10-CURRENT после введения системных вызовов man:accept4[2] (rev link:https://svnweb.freebsd.org/changeset/base/250154[250154]) и man:pipe2[2] (rev link:https://svnweb.freebsd.org/changeset/base/250159[250159]).
|1000033
|link:https://svnweb.freebsd.org/changeset/base/250881[250881]
-|May 21, 2013
-|10-CURRENT after flex 2.5.37 import.
+|21 мая 2013
+|10-CURRENT после импорта flex 2.5.37.
|1000034
|link:https://svnweb.freebsd.org/changeset/base/251294[251294]
-|June 3, 2013
-|10-CURRENT after the addition of these functions to libm: man:cacos[3], man:cacosf[3], man:cacosh[3], man:cacoshf[3], man:casin[3], man:casinf[3], man:casinh[3], man:casinhf[3], man:catan[3], man:catanf[3], man:catanh[3], man:catanhf[3], man:logl[3], man:log2l[3], man:log10l[3], man:log1pl[3], man:expm1l[3].
+|3 июня 2013
+|10-CURRENT после добавления следующих функций в libm: man:cacos[3], man:cacosf[3], man:cacosh[3], man:cacoshf[3], man:casin[3], man:casinf[3], man:casinh[3], man:casinhf[3], man:catan[3], man:catanf[3], man:catanh[3], man:catanhf[3], man:logl[3], man:log2l[3], man:log10l[3], man:log1pl[3], man:expm1l[3].
|1000035
|link:https://svnweb.freebsd.org/changeset/base/251527[251527]
-|June 8, 2013
-|10-CURRENT after the introduction of the man:aio_mlock[2] system call (rev link:https://svnweb.freebsd.org/changeset/base/251526[251526]).
+|8 июня 2013
+|10-CURRENT после введения системного вызова man:aio_mlock[2] (изменение link:https://svnweb.freebsd.org/changeset/base/251526[251526]).
|1000036
|link:https://svnweb.freebsd.org/changeset/base/253049[253049]
-|July 9, 2013
-|10-CURRENT after the addition of a new function to the kernel GSSAPI module's function call interface.
+|9 июля 2013
+|10-CURRENT после добавления новой функции в интерфейс вызовов функций модуля ядра GSSAPI.
|1000037
|link:https://svnweb.freebsd.org/changeset/base/253089[253089]
-|July 9, 2013
-|10-CURRENT after the migration of statistics structures to PCPU counters. Changed structures include: `ahstat`, `arpstat`, `espstat`, `icmp6_ifstat`, `icmp6stat`, `in6_ifstat`, `ip6stat`, `ipcompstat`, `ipipstat`, `ipsecstat`, `mrt6stat`, `mrtstat`, `pfkeystat`, `pim6stat`, `pimstat`, `rip6stat`, `udpstat` (rev link:https://svnweb.freebsd.org/changeset/base/253081[253081]).
+|9 июля 2013
+|10-CURRENT после миграции структур статистики на PCPU-счетчики. Измененные структуры включают: `ahstat`, `arpstat`, `espstat`, `icmp6_ifstat`, `icmp6stat`, `in6_ifstat`, `ip6stat`, `ipcompstat`, `ipipstat`, `ipsecstat`, `mrt6stat`, `mrtstat`, `pfkeystat`, `pim6stat`, `pimstat`, `rip6stat`, `udpstat` (rev link:https://svnweb.freebsd.org/changeset/base/253081[253081]).
|1000038
|link:https://svnweb.freebsd.org/changeset/base/253396[253396]
-|July 16, 2013
-|10-CURRENT after making `ARM EABI` the default ABI on arm, armeb, armv6, and armv6eb architectures.
+|16 июля 2013
+|10-CURRENT после установки `ARM EABI` в качестве ABI по умолчанию для архитектур arm, armeb, armv6 и armv6eb.
|1000039
|link:https://svnweb.freebsd.org/changeset/base/253549[253549]
-|July 22, 2013
-|10-CURRENT after `CAM` and man:mps[4] driver scanning changes.
+|22 июля 2013
+|10-CURRENT после изменений в сканировании драйверов `CAM` и man:mps[4].
|1000040
|link:https://svnweb.freebsd.org/changeset/base/253638[253638]
-|July 24, 2013
-|10-CURRENT after addition of libusb pkgconf files.
+|24 июля 2013
+|10-CURRENT после добавления файлов `pkgconf` для libusb.
|1000041
|link:https://svnweb.freebsd.org/changeset/base/253970[253970]
-|August 5, 2013
-|10-CURRENT after change from `time_second` to `time_uptime` in `PF_INET6`.
+|5 августа 2013
+|10-CURRENT после изменения с `time_second` на `time_uptime` в `PF_INET6`.
|1000042
|link:https://svnweb.freebsd.org/changeset/base/254138[254138]
-|August 9, 2013
-|10-CURRENT after VM subsystem change to unify soft and hard busy mechanisms.
+|9 августа 2013
+|10-CURRENT после изменения подсистемы VM для объединения механизмов мягкой и жесткой занятости.
|1000043
|link:https://svnweb.freebsd.org/changeset/base/254273[254273]
-|August 13, 2013
-|10-CURRENT after `WITH_ICONV` is enabled by default. A new man:src.conf[5] option, `WITH_LIBICONV_COMPAT` (disabled by default) adds `libiconv_open` to provide compatibility with the package:libiconv[] port.
+|13 августа 2013
+|10-CURRENT после того, как `WITH_ICONV` включён по умолчанию. Новая опция man:src.conf[5], `WITH_LIBICONV_COMPAT` (выключена по умолчанию), добавляет `libiconv_open` для обеспечения совместимости с портом package:converters/libiconv[].
|1000044
|link:https://svnweb.freebsd.org/changeset/base/254358[254358]
-|August 15, 2013
-|10-CURRENT after `libc.so` conversion to an man:ld[1] script (rev link:https://svnweb.freebsd.org/changeset/base/251668[251668]).
+|15 августа 2013
+|10-CURRENT после преобразования [.filename]#libc.so# в скрипт man:ld[1] (изменение rev link:https://svnweb.freebsd.org/changeset/base/251668[251668]).
|1000045
|link:https://svnweb.freebsd.org/changeset/base/254389[254389]
-|August 15, 2013
-|10-CURRENT after devfs programming interface change by replacing the cdevsw flag `D_UNMAPPED_IO` with the struct cdev flag `SI_UNMAPPED`.
+|15 августа 2013
+|10-CURRENT после изменения программного интерфейса devfs путем замены флага `D_UNMAPPED_IO` в cdevsw на флаг `SI_UNMAPPED` в структуре cdev.
|1000046
|link:https://svnweb.freebsd.org/changeset/base/254537[254537]
-|August 19, 2013
-|10-CURRENT after addition of `M_PROTO[9-12]` and removal of `M_FRAG\|M_FIRSTFRAG\|M_LASTFRAG` mbuf flags (rev link:https://svnweb.freebsd.org/changeset/base/254524[254524], link:https://svnweb.freebsd.org/changeset/base/254526[254526]).
+|19 августа 2013
+|10-CURRENT после добавления `M_PROTO[9-12]` и удаления `M_FRAG`\|M_FIRSTFRAG\|M_LASTFRAG` флаги mbuf (версии link:https://svnweb.freebsd.org/changeset/base/254524[254524], link:https://svnweb.freebsd.org/changeset/base/254526[254526]).
|1000047
|link:https://svnweb.freebsd.org/changeset/base/254627[254627]
-|August 21, 2013
-|10-CURRENT after man:stat[2] update to allow storing some Windows/DOS and CIFS file attributes as man:stat[2] flags.
+|21 августа 2013
+|10-CURRENT после обновления man:stat[2], позволяющего сохранять некоторые атрибуты файлов Windows/DOS и CIFS в виде флагов man:stat[2].
|1000048
|link:https://svnweb.freebsd.org/changeset/base/254672[254672]
|August 22, 2013
-|10-CURRENT after modification of structure `xsctp_inpcb`.
+|10-CURRENT после изменения структуры `xsctp_inpcb`.
|1000049
|link:https://svnweb.freebsd.org/changeset/base/254760[254760]
-|August 24, 2013
-|10-CURRENT after man:physio[9] support for devices that do not function properly with split I/O, such as man:sa[4].
+|24 августа 2013
+|10-CURRENT после поддержки man:physio[9] для устройств, которые работают некорректно с разделённым вводом-выводом, таких как man:sa[4].
|1000050
|link:https://svnweb.freebsd.org/changeset/base/254844[254844]
-|August 24, 2013
-|10-CURRENT after modifications of structure `mbuf` (rev link:https://svnweb.freebsd.org/changeset/base/254780[254780], link:https://svnweb.freebsd.org/changeset/base/254799[254799], link:https://svnweb.freebsd.org/changeset/base/254804[254804], link:https://svnweb.freebsd.org/changeset/base/254807[254807]link:https://svnweb.freebsd.org/changeset/base/254842[254842]).
+|24 августа 2013
+|10-CURRENT после изменений структуры `mbuf` (rev link:https://svnweb.freebsd.org/changeset/base/254780[254780], link:https://svnweb.freebsd.org/changeset/base/254799[254799], link:https://svnweb.freebsd.org/changeset/base/254804[254804], link:https://svnweb.freebsd.org/changeset/base/254807[254807]link:https://svnweb.freebsd.org/changeset/base/254842[254842]).
|1000051
|link:https://svnweb.freebsd.org/changeset/base/254887[254887]
-|August 25, 2013
-|10-CURRENT after Radeon KMS driver import (rev link:https://svnweb.freebsd.org/changeset/base/254885[254885]).
+|25 августа 2013
+|10-CURRENT после импорта драйвера Radeon KMS (ревизия link:https://svnweb.freebsd.org/changeset/base/254885[254885]).
|1000052
|link:https://svnweb.freebsd.org/changeset/base/255180[255180]
-|September 3, 2013
-|10-CURRENT after import of NetBSD `libexecinfo` is connected to the build.
+|3 сентября 2013
+|10-CURRENT после импорта NetBSD `libexecinfo` подключен к сборке.
|1000053
|link:https://svnweb.freebsd.org/changeset/base/255305[255305]
-|September 6, 2013
-|10-CURRENT after API and ABI changes to the Capsicum framework.
+|6 сентября 2013
+|10-CURRENT после изменений API и ABI в рамках Capsicum.
|1000054
|link:https://svnweb.freebsd.org/changeset/base/255321[255321]
-|September 6, 2013
-|10-CURRENT after `gcc` and `libstdc++` are no longer built by default.
+|6 сентября 2013
+|10-CURRENT после того, как `gcc` и `libstdc++` больше не собираются по умолчанию.
|1000055
|link:https://svnweb.freebsd.org/changeset/base/255449[255449]
-|September 6, 2013
-|10-CURRENT after addition of `MMAP_32BIT` man:mmap[2] flag (rev link:https://svnweb.freebsd.org/changeset/base/255426[255426]).
+|6 сентября 2013
+|10-CURRENT после добавления флага `MMAP_32BIT` в man:mmap[2] (rev link:https://svnweb.freebsd.org/changeset/base/255426[255426]).
|1000100
|link:https://svnweb.freebsd.org/changeset/base/259065[259065]
|December 7, 2013
-|`releng/10.0` branched from `stable/10`.
+|`releng/10.0` ответвился от `stable/10`.
|1000500
|link:https://svnweb.freebsd.org/changeset/base/256283[256283]
-|October 10, 2013
-|10-STABLE after branch from `head/`.
+|10 октября 2013
+|10-STABLE после ветвления от `head/`.
|1000501
|link:https://svnweb.freebsd.org/changeset/base/256916[256916]
-|October 22, 2013
-|10-STABLE after addition of first-boot man:rc[8] support.
+|22 октября 2013
+|10-STABLE после добавления поддержки man:rc[8] при первой загрузке.
|1000502
|link:https://svnweb.freebsd.org/changeset/base/258398[258398]
-|November 20, 2013
-|10-STABLE after removal of iconv symbols from `libc.so.7`.
+|20 ноября 2013
+|10-STABLE после удаления символов iconv из `libc.so.7`.
|1000510
|link:https://svnweb.freebsd.org/changeset/base/259067[259067]
|December 7, 2013
-|`releng/10.0` __FreeBSD_version update to prevent the value from going backwards.
+|`releng/10.0` __FreeBSD_version обновлён, чтобы предотвратить уменьшение значения.
|1000700
|link:https://svnweb.freebsd.org/changeset/base/259069[259069]
|December 7, 2013
-|10-STABLE after `releng/10.0` branch.
+|10-STABLE после ветки `releng/10.0`.
|1000701
|link:https://svnweb.freebsd.org/changeset/base/259447[259447]
-|December 15, 2013
-|10.0-STABLE after Heimdal encoding fix.
+|15 декабря 2013
+|10.0-STABLE после исправления кодирования Heimdal.
|1000702
|link:https://svnweb.freebsd.org/changeset/base/260135[260135]
-|December 31, 2013
-|10-STABLE after MAP_STACK fixes.
+|31 декабря 2013
+|10-STABLE после исправлений MAP_STACK.
|1000703
|link:https://svnweb.freebsd.org/changeset/base/262801[262801]
-|March 5, 2014
-|10-STABLE after upgrade of libc++ to 3.4 release.
+|5 марта 2014
+|10-STABLE после обновления libc++ до версии 3.4.
|1000704
|link:https://svnweb.freebsd.org/changeset/base/262889[262889]
-|March 7, 2014
-|10-STABLE after MFC of the man:vt[4] driver (rev link:https://svnweb.freebsd.org/changeset/base/262861[262861]).
+|7 марта 2014
+|10-STABLE после слияния из ветки man:vt[4] драйвера (ревизия link:https://svnweb.freebsd.org/changeset/base/262861[262861]).
|1000705
|link:https://svnweb.freebsd.org/changeset/base/263508[263508]
-|March 21, 2014
-|10-STABLE after upgrade of llvm/clang to 3.4 release.
+|21 марта 2014
+|10-STABLE после обновления llvm/clang до версии 3.4.
|1000706
|link:https://svnweb.freebsd.org/changeset/base/264214[264214]
-|April 6, 2014
-|10-STABLE after GCC support for `__block` definition.
+|6 апреля 2014
+|10-STABLE после удаления поддержки GCC для определения `__block`.
|1000707
|link:https://svnweb.freebsd.org/changeset/base/264289[264289]
-|April 8, 2014
-|10-STABLE after FreeBSD-SA-14:06.openssl.
+|8 апреля 2014
+|10-STABLE после FreeBSD-SA-14:06.openssl.
|1000708
|link:https://svnweb.freebsd.org/changeset/base/265122[265122]
-|April 30, 2014
-|10-STABLE after FreeBSD-SA-14:07.devfs, FreeBSD-SA-14:08.tcp, and FreeBSD-SA-14:09.openssl.
+|30 апреля 2014
+|10-STABLE после FreeBSD-SA-14:07.devfs, FreeBSD-SA-14:08.tcp и FreeBSD-SA-14:09.openssl.
|1000709
|link:https://svnweb.freebsd.org/changeset/base/265946[265946]
-|May 13, 2014
-|10-STABLE after support for UDP-Lite protocol (RFC 3828).
+|13 мая 2014
+|10-STABLE после добавления поддержки протокола UDP-Lite (RFC 3828).
|1000710
|link:https://svnweb.freebsd.org/changeset/base/267465[267465]
-|June 13, 2014
-|10-STABLE after changes to man:strcasecmp[3], moving man:strcasecmp_l[3] and man:strncasecmp_l[3] from [.filename]#<string.h># to [.filename]#<strings.h># for POSIX 2008 compliance.
+|13 июня 2014
+|10-STABLE после изменений в man:strcasecmp[3], переноса man:strcasecmp_l[3] и man:strncasecmp_l[3] из [.filename]#<string.h># в [.filename]#<strings.h># для соответствия POSIX 2008.
|1000711
|link:https://svnweb.freebsd.org/changeset/base/268442[268442]
-|July 8, 2014
-|10-STABLE after FreeBSD-SA-14:17.kmem (rev link:https://svnweb.freebsd.org/changeset/base/268432[268432]).
+|8 июля 2014
+|10-STABLE после FreeBSD-SA-14:17.kmem (ревизия:https://svnweb.freebsd.org/changeset/base/268432[268432]).
|1000712
|link:https://svnweb.freebsd.org/changeset/base/269400[269400]
-|August 1, 2014
-|10-STABLE after man:nfsd[8] 4.1 merge (rev link:https://svnweb.freebsd.org/changeset/base/269398[269398]).
+|1 августа 2014
+|10-STABLE после слияния man:nfsd[8] 4.1 (rev link:https://svnweb.freebsd.org/changeset/base/269398[269398]).
|1000713
|link:https://svnweb.freebsd.org/changeset/base/269484[269484]
-|August 3, 2014
-|10-STABLE after man:regex[3] library update to add ">" and "<" delimiters.
+|3 августа 2014
+|10-STABLE после обновления библиотеки man:regex[3] для добавления разделителей ">" и "<".
|1000714
|link:https://svnweb.freebsd.org/changeset/base/270174[270174]
-|August 3, 2014
-|10-STABLE after `SOCK_DGRAM` bug fix (rev link:https://svnweb.freebsd.org/changeset/base/269490[269490]).
+|3 августа 2014
+|10-STABLE после исправления ошибки `SOCK_DGRAM` (rev link:https://svnweb.freebsd.org/changeset/base/269490[269490]).
|1000715
|link:https://svnweb.freebsd.org/changeset/base/271341[271341]
-|September 9, 2014
-|10-STABLE after FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/269686[269686]).
+|9 сентября 2014
+|10-STABLE после FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/269686[269686]).
|1000716
|link:https://svnweb.freebsd.org/changeset/base/271686[271686]
-|September 16, 2014
-|10-STABLE after FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271667[271667]).
+|16 сентября 2014
+|10-STABLE после FreeBSD-SA-14:19 (ревизия link:https://svnweb.freebsd.org/changeset/base/271667[271667]).
|1000717
|link:https://svnweb.freebsd.org/changeset/base/271816[271816]
-|September 18, 2014
-|10-STABLE after i915 HW context support.
+|18 сентября 2014
+|10-STABLE после добавления поддержки аппаратного контекста i915.
|1001000
|link:https://svnweb.freebsd.org/changeset/base/272463[272463]
-|October 2, 2014
-|10.1-RC1 after releng/10.1 branch.
+|2 октября 2014
+|10.1-RC1 после ветки releng/10.1.
|1001500
|link:https://svnweb.freebsd.org/changeset/base/272464[272464]
-|October 2, 2014
-|10-STABLE after releng/10.1 branch.
+|2 октября 2014
+|10-STABLE после ветки releng/10.1.
|1001501
|link:https://svnweb.freebsd.org/changeset/base/273432[273432]
-|October 21, 2014
-|10-STABLE after FreeBSD-SA-14:20, FreeBSD-SA-14:22, and FreeBSD-SA-14:23 (rev link:https://svnweb.freebsd.org/changeset/base/273411[273411]).
+|21 октября 2014
+|10-STABLE после исправлений уязвимостей FreeBSD-SA-14:20, FreeBSD-SA-14:22 и FreeBSD-SA-14:23 (ссылка на ревизию: https://svnweb.freebsd.org/changeset/base/273411[273411]).
|1001502
|link:https://svnweb.freebsd.org/changeset/base/274162[274162]
-|November 4, 2014
-|10-STABLE after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25.
+|4 ноября 2014
+|10-STABLE после FreeBSD-SA-14:23, FreeBSD-SA-14:24 и FreeBSD-SA-14:25.
|1001503
|link:https://svnweb.freebsd.org/changeset/base/275040[275040]
-|November 25, 2014
-|10-STABLE after merging new libraries/utilities (man:dpv[1] man:dpv[3], and man:figpar[3]) for data throughput visualization.
+|25 ноября 2014
+|10-STABLE после объединения новых библиотек/утилит (man:dpv[1], man:dpv[3] и man:figpar[3]) для визуализации пропускной способности данных.
|1001504
|link:https://svnweb.freebsd.org/changeset/base/275742[275742]
-|December 13, 2014
-|10-STABLE after merging an important fix to the LLVM vectorizer, which could lead to buffer overruns in some cases.
+|13 декабря 2014
+|10-STABLE после объединения важного исправления в векторизатор LLVM, которое в некоторых случаях могло приводить к переполнению буфера.
|1001505
|link:https://svnweb.freebsd.org/changeset/base/276633[276633]
-|January 3, 2015
-|10-STABLE after merging some arm constants in link:https://svnweb.freebsd.org/changeset/base/276312[276312].
+|3 января 2015
+|10-STABLE после объединения некоторых констант ARM в link:https://svnweb.freebsd.org/changeset/base/276312[276312].
|1001506
|link:https://svnweb.freebsd.org/changeset/base/277087[277087]
-|January 12, 2015
-|10-STABLE after merging max table size update for yacc.
+|12 января 2015
+|10-STABLE после объединения обновления максимального размера таблицы для yacc.
|1001507
|link:https://svnweb.freebsd.org/changeset/base/277790[277790]
-|January 27, 2015
-|10-STABLE after changes to the UDP tunneling callback to provide a context pointer and the source sockaddr.
+|27 января 2015
+|10-STABLE после изменений в обратном вызове туннелирования UDP для предоставления указателя контекста и исходного `sockaddr`.
|1001508
|link:https://svnweb.freebsd.org/changeset/base/278974[278974]
-|February 18, 2015
-|10-STABLE after addition of the `CDAI_TYPE_EXT_INQ` request type.
+|18 февраля 2015
+|10-STABLE после добавления типа запроса `CDAI_TYPE_EXT_INQ`.
|1001509
|link:https://svnweb.freebsd.org/changeset/base/279287[279287]
-|February 25, 2015
-|10-STABLE after FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp, and FreeBSD-SA-15:05.bind.
+|25 февраля 2015
+|10-STABLE после FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp и FreeBSD-SA-15:05.bind.
|1001510
|link:https://svnweb.freebsd.org/changeset/base/279329[279329]
-|February 26, 2015
-|10-STABLE after MFC of rev link:https://svnweb.freebsd.org/changeset/base/278964[278964].
+|26 февраля 2015
+|10-STABLE после MFC ревизии link:https://svnweb.freebsd.org/changeset/base/278964[278964].
|1001511
|link:https://svnweb.freebsd.org/changeset/base/280246[280246]
-|19 March, 2015
-|10-STABLE after [.filename]#sys/capability.h# is renamed to [.filename]#sys/capsicum.h# (rev link:https://svnweb.freebsd.org/changeset/base/280224/[280224/]).
+|19 марта 2015
+|10-STABLE после переименования [.filename]#sys/capability.h# в [.filename]#sys/capsicum.h# (изменение:https://svnweb.freebsd.org/changeset/base/280224/[280224/]).
|1001512
|link:https://svnweb.freebsd.org/changeset/base/280438[280438]
-|24 March, 2015
-|10-STABLE after addition of new man:mtio[4], man:sa[4] ioctls.
+|24 марта 2015
+|10-STABLE после добавления новых ioctl в man:mtio[4] и man:sa[4].
|1001513
|link:https://svnweb.freebsd.org/changeset/base/281955[281955]
-|24 April, 2015
-|10-STABLE after starting the process of removing the use of the deprecated "M_FLOWID" flag from the network code.
+|24 апреля 2015
+|10-STABLE после начала процесса удаления использования устаревшего флага "M_FLOWID" из сетевого кода.
|1001514
|link:https://svnweb.freebsd.org/changeset/base/282275[282275]
-|April 30, 2015
-|10-STABLE after MFC of man:iconv[3] fixes.
+|30 апреля 2015
+|10-STABLE после MFC исправлений man:iconv[3].
|1001515
|link:https://svnweb.freebsd.org/changeset/base/282781[282781]
-|May 11, 2015
-|10-STABLE after adding back `M_FLOWID`.
+|11 мая 2015
+|10-STABLE после возврата `M_FLOWID`.
|1001516
|link:https://svnweb.freebsd.org/changeset/base/283341[283341]
-|May 24, 2015
-|10-STABLE after MFC of many USB things.
+|24 мая 2015
+|10-STABLE после переноса (MFC) множества изменений, связанных с USB.
|1001517
|link:https://svnweb.freebsd.org/changeset/base/283950[283950]
-|June 3, 2015
-|10-STABLE after MFC of sound related things.
+|3 июня 2015
+|10-STABLE после слияния изменений, связанных со звуком.
|1001518
|link:https://svnweb.freebsd.org/changeset/base/284204[284204]
-|June 10, 2015
-|10-STABLE after MFC of zfs vfs fixes (rev link:https://svnweb.freebsd.org/changeset/base/284203[284203]).
+|10 июня 2015
+|10-STABLE после MFC исправлений vfs для zfs (rev link:https://svnweb.freebsd.org/changeset/base/284203[284203]).
|1001519
|link:https://svnweb.freebsd.org/changeset/base/284720[284720]
-|June 23, 2015
-|10-STABLE after reverting bumping `MAXCPU` on amd64.
+|23 июня 2015
+|10-STABLE после отмены увеличения `MAXCPU` на amd64.
|1002000
|link:https://svnweb.freebsd.org/changeset/base/285830[285830]
-|24 July, 2015
-|`releng/10.2` branched from 10-STABLE.
+|24 июля 2015
+|`releng/10.2` отделился от 10-STABLE.
|1002500
|link:https://svnweb.freebsd.org/changeset/base/285831[285831]
-|24 July, 2015
-|10-STABLE after `releng/10.2` branched from 10-STABLE.
+|24 июля 2015
+|10-STABLE после того, как ветка `releng/10.2` отделилась от 10-STABLE.
|1002501
|link:https://svnweb.freebsd.org/changeset/base/289005[289005]
-|8 October, 2015
-|10-STABLE after merge of ZFS changes that affected the internal interface of zfeature_info structure (rev link:https://svnweb.freebsd.org/changeset/base/288572[288572]).
+|8 октября 2015
+|10-STABLE после объединения изменений ZFS, затронувших внутренний интерфейс структуры `zfeature_info` (rev link:https://svnweb.freebsd.org/changeset/base/288572[288572]).
|1002502
|link:https://svnweb.freebsd.org/changeset/base/291243[291243]
-|24 November, 2015
-|10-STABLE after merge of dump device changes that affected the arguments of `g_dev_setdumpdev()`(rev link:https://svnweb.freebsd.org/changeset/base/291215[291215]).
+|24 ноября 2015
+|10-STABLE после объединения изменений устройств дампа, которые затронули аргументы `g_dev_setdumpdev()`(rev link:https://svnweb.freebsd.org/changeset/base/291215[291215]).
|1002503
|link:https://svnweb.freebsd.org/changeset/base/292224[292224]
-|14 December, 2015
-|10-STABLE after merge of changes to the internal interface between the nfsd.ko and nfscommon.ko modules, requiring them to be upgraded together (rev link:https://svnweb.freebsd.org/changeset/base/292223[292223]).
+|14 декабря 2015
+|10-STABLE после объединения изменений во внутренний интерфейс между модулями nfsd.ko и nfscommon.ko, что требует их совместного обновления (rev link:https://svnweb.freebsd.org/changeset/base/292223[292223]).
|1002504
|link:https://svnweb.freebsd.org/changeset/base/292589[292589]
-|22 December, 2015
-|10-STABLE after merge of xz 5.2.2 merge (multithread support) (rev link:https://svnweb.freebsd.org/changeset/base/292588[292588]).
+|22 декабря 2015
+|10-STABLE после слияния xz 5.2.2 (поддержка многопоточности) (rev link:https://svnweb.freebsd.org/changeset/base/292588[292588]).
|1002505
|link:https://svnweb.freebsd.org/changeset/base/292908[292908]
-|30 December, 2015
-|10-STABLE after merge of changes to man:pci[4] (rev link:https://svnweb.freebsd.org/changeset/base/292907[292907]).
+|30 декабря 2015
+|10-STABLE после объединения изменений в man:pci[4] (rev link:https://svnweb.freebsd.org/changeset/base/292907[292907]).
|1002506
|link:https://svnweb.freebsd.org/changeset/base/293476[293476]
-|9 January, 2016
-|10-STABLE after merge of man:utimensat[2] (rev link:https://svnweb.freebsd.org/changeset/base/293473[293473]).
+|9 января 2016
+|10-STABLE после объединения man:utimensat[2] (изменение link:https://svnweb.freebsd.org/changeset/base/293473[293473]).
|1002507
|link:https://svnweb.freebsd.org/changeset/base/293610[293610]
-|9 January, 2016
-|10-STABLE after merge of changes to man:linux[4] (rev link:https://svnweb.freebsd.org/changeset/base/293477[293477] through link:https://svnweb.freebsd.org/changeset/base/293609[293609]).
+|9 января 2016
+|10-STABLE после объединения изменений в man:linux[4] (rev link:https://svnweb.freebsd.org/changeset/base/293477[293477] через link:https://svnweb.freebsd.org/changeset/base/293609[293609]).
|1002508
|link:https://svnweb.freebsd.org/changeset/base/293619[293619]
-|9 January, 2016
-|10-STABLE after merge of changes to man:figpar[3] types/macros (rev link:https://svnweb.freebsd.org/changeset/base/290275[290275]).
+|9 января 2016
+|10-STABLE после объединения изменений в типы/макросы man:figpar[3] (rev link:https://svnweb.freebsd.org/changeset/base/290275[290275]).
|1002509
|link:https://svnweb.freebsd.org/changeset/base/295107[295107]
-|1 February, 2016
-|10-STABLE after merge of API change to man:dpv[3].
+|1 февраля 2016
+|10-STABLE после объединения изменения API в man:dpv[3].
|1003000
|link:https://svnweb.freebsd.org/changeset/base/296373[296373]
-|4 March, 2016
-|`releng/10.3` branched from 10-STABLE.
+|4 марта 2016
+|`releng/10.3` ответвился от 10-STABLE.
|1003500
|link:https://svnweb.freebsd.org/changeset/base/296374[296374]
-|4 March, 2016
-|10-STABLE after `releng/10.3` branched from 10-STABLE.
+|4 марта 2016
+|10-STABLE после того, как ветка `releng/10.3` отделилась от 10-STABLE.
|1003501
|link:https://svnweb.freebsd.org/changeset/base/298299[298299]
-|19 June, 2016
-|10-STABLE after adding kdbcontrol's -P option (rev link:https://svnweb.freebsd.org/changeset/base/298297[298297]).
+|19 июня 2016
+|10-STABLE после добавления опции -P для `kdbcontrol` (rev link:https://svnweb.freebsd.org/changeset/base/298297[298297]).
|1003502
|link:https://svnweb.freebsd.org/changeset/base/299966[299966]
-|19 June, 2016
-|10-STABLE after libcrypto.so was made position independent.
+|19 июня 2016
+|10-STABLE после того, как libcrypto.so стала позиционно-независимой.
|1003503
|link:https://svnweb.freebsd.org/changeset/base/300235[300235]
-|19 June, 2016
-|10-STABLE after allowing MK_ overrides (rev link:https://svnweb.freebsd.org/changeset/base/300233[300233]).
+|19 июня 2016
+|10-STABLE после разрешения переопределений `MK_` (изменение link:https://svnweb.freebsd.org/changeset/base/300233[300233]).
|1003504
|link:https://svnweb.freebsd.org/changeset/base/302066[302066]
-|21 June, 2016
-|10-STABLE after MFC of filemon changes from 11-CURRENT.
+|21 июня 2016
+|10-STABLE после переноса изменений `filemon` из 11-CURRENT.
|1003505
|link:https://svnweb.freebsd.org/changeset/base/302228[302228]
-|27 June, 2016
-|10-STABLE after converting sed to use REG_STARTEND, fixing a Mesa issue.
+|27 июня 2016
+|10-STABLE после замены в sed на использование REG_STARTEND, с исправлением проблемы в Mesa.
|1003506
|link:https://svnweb.freebsd.org/changeset/base/304611[304611]
-|August 22, 2016
-|10-STABLE after adding C++11 thread_local support.
+|22 августа 2016
+|10-STABLE после добавления поддержки `thread_local` в C++11.
|1003507
|link:https://svnweb.freebsd.org/changeset/base/304864[304864]
-|August 26, 2016
-|10-STABLE after `LC_*_MASK` fix.
+|26 августа 2016
+|10-STABLE после исправления `LC_*_MASK`.
|1003508
|link:https://svnweb.freebsd.org/changeset/base/305734[305734]
-|September 12, 2016
-|10-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+|12 сентября 2016
+|10-STABLE после устранения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9].
|1003509
|link:https://svnweb.freebsd.org/changeset/base/307331[307331]
-|October 14, 2016
-|10-STABLE after ZFS merges.
+|14 октября 2016
+|10-STABLE после слияния с ZFS.
|1003510
|link:https://svnweb.freebsd.org/changeset/base/308047[308047]
-|October 28, 2016
-|10-STABLE after installing header files required development with libzfs_core.
+|28 октября 2016
+|10-STABLE после установки заголовочных файлов, необходимых для разработки с libzfs_core.
|1003511
|link:https://svnweb.freebsd.org/changeset/base/310121[310121]
-|December 15, 2016
-|10-STABLE after exporting whole thread name in `kinfo_proc` (rev link:https://svnweb.freebsd.org/changeset/base/309676[309676]).
+|15 декабря 2016
+|10-STABLE после экспорта полного имени потока в `kinfo_proc` (rev link:https://svnweb.freebsd.org/changeset/base/309676[309676]).
|1003512
|link:https://svnweb.freebsd.org/changeset/base/315730[315730]
-|March 22, 2017
-|10-STABLE after libmd changes (rev link:https://svnweb.freebsd.org/changeset/base/314143[314143]).
+|22 марта 2017
+|10-STABLE после изменений в libmd (rev link:https://svnweb.freebsd.org/changeset/base/314143[314143]).
|1003513
|link:https://svnweb.freebsd.org/changeset/base/316499[316499]
-|April 4, 2017
-|10-STABLE after making CAM SIM lock optional (revs link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674]).
+|4 апреля 2017
+|10-STABLE после того, как блокировка CAM SIM стала опциональной (ревизии link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674]).
|1003514
|link:https://svnweb.freebsd.org/changeset/base/318198[318198]
-|May 11, 2017
-|10-STABLE after merging the addition of the [.filename]#<dev/mmc/mmc_ioctl.h># header.
+|11 мая 2017
+|10-STABLE после объединения добавления заголовочного файла [.filename]#<dev/mmc/mmc_ioctl.h>#.
|1003515
|link:https://svnweb.freebsd.org/changeset/base/321222[321222]
-|July 19, 2017
-|10-STABLE after adding C++14 sized deallocation functions to libc++.
+|19 июля 2017
+|10-STABLE после добавления функций освобождения памяти с указанием размера из C++14 в libc++.
|1003516
|link:https://svnweb.freebsd.org/changeset/base/321717[321717]
-|July 30, 2017
-|10-STABLE after merging the `MAP_GUARD` man:mmap[2] flag addition.
+|30 июля 2017
+|10-STABLE после объединения добавления флага `MAP_GUARD` в man:mmap[2].
|1004000
|link:https://svnweb.freebsd.org/changeset/base/323604[323604]
-|September 15, 2017
-|`releng/10.4` branched from 10-STABLE.
+|15 сентября 2017
+|`releng/10.4` ответвился от 10-STABLE.
|1004500
|link:https://svnweb.freebsd.org/changeset/base/323605[323605]
-|September 15, 2017
-|10-STABLE after `releng/10.4` branched from 10-STABLE.
+|15 сентября 2017
+|10-STABLE после того, как ветка `releng/10.4` отделилась от 10-STABLE.
|1004501
|link:https://svnweb.freebsd.org/changeset/base/328379[328379]
-|January 24, 2018
-|10-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/325028[325028], fixing `ptrace()` to always clear the correct thread event when resuming.
+|24 января 2018
+|10-STABLE после слияния изменений link:https://svnweb.freebsd.org/changeset/base/325028[325028], исправляющего `ptrace()`, чтобы всегда очищать правильное событие потока при возобновлении.
|1004502
|link:https://svnweb.freebsd.org/changeset/base/356396[356396]
-|January 6, 2020
-|10-STABLE after making USB statistics be per-device instead of per bus.
+|6 января 2020
+|10-STABLE после изменения статистики USB для каждого устройства вместо каждой шины.
|1004503
|link:https://svnweb.freebsd.org/changeset/base/356681[356681]
-|January 13, 2020
-|10-STABLE after adding own counter for cancelled USB transfers.
+|13 января 2020
+|10-STABLE после добавления собственного счетчика для отмененных USB-передач.
|===
[[versions-9]]
-== FreeBSD 9 Versions
+== Версии FreeBSD 9
[[freebsd-versions-table-9]]
-.FreeBSD 9 `__FreeBSD_version` Values
+.Значения `__FreeBSD_version` в FreeBSD 9
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|900000
|link:https://svnweb.freebsd.org/changeset/base/196432[196432]
-|August 22, 2009
+|22 августа 2009
|9.0-CURRENT.
|900001
|link:https://svnweb.freebsd.org/changeset/base/197019[197019]
-|September 8, 2009
-|9.0-CURRENT after importing x86emu, a software emulator for real mode x86 CPU from OpenBSD.
+|8 сентября 2009
+|9.0-CURRENT после импорта x86emu, программного эмулятора процессора x86 в реальном режиме из OpenBSD.
|900002
|link:https://svnweb.freebsd.org/changeset/base/197430[197430]
-|September 23, 2009
-|9.0-CURRENT after implementing the EVFILT_USER kevent filter functionality.
+|23 сентября 2009
+|9.0-CURRENT после реализации функциональности фильтра `kevent` `EVFILT_USER`.
|900003
|link:https://svnweb.freebsd.org/changeset/base/200039[200039]
-|December 2, 2009
-|9.0-CURRENT after addition of man:sigpause[2] and PIE support in csu.
+|2 декабря 2009
+|9.0-CURRENT после добавления man:sigpause[2] и поддержки PIE в `csu`.
|900004
|link:https://svnweb.freebsd.org/changeset/base/200185[200185]
-|December 6, 2009
-|9.0-CURRENT after addition of libulog and its libutempter compatibility interface.
+|6 декабря 2009
+|9.0-CURRENT после добавления libulog и его совместимого интерфейса libutempter.
|900005
|link:https://svnweb.freebsd.org/changeset/base/200447[200447]
|December 12, 2009
-|9.0-CURRENT after addition of man:sleepq_sleepcnt[9], which can be used to query the number of waiters on a specific waiting queue.
+|9.0-CURRENT после добавления man:sleepq_sleepcnt[9], который может использоваться для запроса количества ожидающих в конкретной очереди ожидания.
|900006
|link:https://svnweb.freebsd.org/changeset/base/201513[201513]
-|January 4, 2010
-|9.0-CURRENT after change of the man:scandir[3] and man:alphasort[3] prototypes to conform to SUSv4.
+|4 января 2010
+|9.0-CURRENT после изменения прототипов man:scandir[3] и man:alphasort[3] для соответствия SUSv4.
|900007
|link:https://svnweb.freebsd.org/changeset/base/202219[202219]
-|January 13, 2010
-|9.0-CURRENT after the removal of man:utmp[5] and the addition of utmpx (see man:getutxent[3]) for improved logging of user logins and system events.
+|13 января 2010
+|9.0-CURRENT после удаления man:utmp[5] и добавления `utmpx` (см. man:getutxent[3]) для улучшенного логирования входов пользователей и системных событий.
|900008
|link:https://svnweb.freebsd.org/changeset/base/202722[202722]
-|January 20, 2010
-|9.0-CURRENT after the import of BSDL bc/dc and the deprecation of GNU bc/dc.
+|20 января 2010
+|9.0-CURRENT после импорта BSDL bc/dc и устаревания GNU bc/dc.
|900009
|link:https://svnweb.freebsd.org/changeset/base/203052[203052]
-|January 26, 2010
-|9.0-CURRENT after the addition of SIOCGIFDESCR and SIOCSIFDESCR ioctls to network interfaces. These ioctl can be used to manipulate interface description, as inspired by OpenBSD.
+|26 января 2010
+|9.0-CURRENT после добавления ioctl SIOCGIFDESCR и SIOCSIFDESCR к сетевым интерфейсам. Эти ioctl могут использоваться для управления описанием интерфейса, по аналогии с OpenBSD.
|900010
|link:https://svnweb.freebsd.org/changeset/base/205471[205471]
-|March 22, 2010
-|9.0-CURRENT after the import of zlib 1.2.4.
+|22 марта 2010
+|9.0-CURRENT после импорта zlib 1.2.4.
|900011
|link:https://svnweb.freebsd.org/changeset/base/207410[207410]
|April 24, 2010
-|9.0-CURRENT after adding soft-updates journalling.
+|9.0-CURRENT после добавления журналирования soft-updates.
|900012
|link:https://svnweb.freebsd.org/changeset/base/207842[207842]
-|May 10, 2010
-|9.0-CURRENT after adding liblzma, xz, xzdec, and lzmainfo.
+|10 мая 2010
+|9.0-CURRENT после добавления liblzma, xz, xzdec и lzmainfo.
|900013
|link:https://svnweb.freebsd.org/changeset/base/208486[208486]
-|May 24, 2010
-|9.0-CURRENT after bringing in USB fixes for man:linux[4].
+|24 мая 2010
+|9.0-CURRENT после внесения исправлений для USB в man:linux[4].
|900014
|link:https://svnweb.freebsd.org/changeset/base/208973[208973]
-|June 10, 2010
-|9.0-CURRENT after adding Clang.
+|10 июня 2010
+|9.0-CURRENT после добавления Clang.
|900015
|link:https://svnweb.freebsd.org/changeset/base/210390[210390]
-|July 22, 2010
-|9.0-CURRENT after the import of BSD grep.
+|22 июля 2010
+|9.0-CURRENT после импорта BSD grep.
|900016
|link:https://svnweb.freebsd.org/changeset/base/210565[210565]
-|July 28, 2010
-|9.0-CURRENT after adding mti_zone to struct malloc_type_internal.
+|28 июля 2010
+|9.0-CURRENT после добавления `mti_zone` в структуру `malloc_type_internal`.
|900017
|link:https://svnweb.freebsd.org/changeset/base/211701[211701]
-|August 23, 2010
-|9.0-CURRENT after changing back default grep to GNU grep and adding WITH_BSD_GREP knob.
+|23 августа 2010
+|9.0-CURRENT после возврата к GNU grep по умолчанию и добавления параметра WITH_BSD_GREP.
|900018
|link:https://svnweb.freebsd.org/changeset/base/211735[211735]
-|August 24, 2010
-|9.0-CURRENT after the man:pthread_kill[3] -generated signal is identified as SI_LWP in si_code. Previously, si_code was SI_USER.
+|24 августа 2010
+|9.0-CURRENT после того, как сигнал, сгенерированный через man:pthread_kill[3], идентифицируется как SI_LWP в `si_code`. Ранее `si_code` имел значение SI_USER.
|900019
|link:https://svnweb.freebsd.org/changeset/base/211937[211937]
-|August 28, 2010
-|9.0-CURRENT after addition of the MAP_PREFAULT_READ flag to man:mmap[2].
+|28 августа 2010
+|9.0-CURRENT после добавления флага MAP_PREFAULT_READ в man:mmap[2].
|900020
|link:https://svnweb.freebsd.org/changeset/base/212381[212381]
-|September 9, 2010
-|9.0-CURRENT after adding drain functionality to sbufs, which also changed the layout of struct sbuf.
+|9 сентября 2010
+|9.0-CURRENT после добавления функциональности drain в `sbufs`, что также изменило структуру struct `sbuf`.
|900021
|link:https://svnweb.freebsd.org/changeset/base/212568[212568]
-|September 13, 2010
-|9.0-CURRENT after DTrace has grown support for userland tracing.
+|13 сентября 2010
+|9.0-CURRENT после того, как DTrace обзавелся поддержкой трассировки в пользовательском пространстве.
|900022
|link:https://svnweb.freebsd.org/changeset/base/213395[213395]
-|October 2, 2010
-|9.0-CURRENT after addition of the BSDL man utilities and retirement of GNU/GPL man utilities.
+|2 октября 2010
+|9.0-CURRENT после добавления утилит man под лицензией BSDL и удаления утилит man под лицензией GNU/GPL.
|900023
|link:https://svnweb.freebsd.org/changeset/base/213700[213700]
-|October 11, 2010
-|9.0-CURRENT after updating xz to git 20101010 snapshot.
+|11 октября 2010
+|9.0-CURRENT после обновления xz до снимка git 20101010.
|900024
|link:https://svnweb.freebsd.org/changeset/base/215127[215127]
-|November 11, 2010
-|9.0-CURRENT after libgcc.a was replaced by libcompiler_rt.a.
+|11 ноября 2010
+|9.0-CURRENT после замены libgcc.a на libcompiler_rt.a.
|900025
|link:https://svnweb.freebsd.org/changeset/base/215166[215166]
-|November 12, 2010
-|9.0-CURRENT after the introduction of the modularised congestion control.
+|12 ноября 2010
+|9.0-CURRENT после внедрения модульной системы управления перегрузкой.
|900026
|link:https://svnweb.freebsd.org/changeset/base/216088[216088]
-|November 30, 2010
-|9.0-CURRENT after the introduction of Serial Management Protocol (SMP) passthrough and the XPT_SMP_IO and XPT_GDEV_ADVINFO CAM CCBs.
+|30 ноября 2010
+|9.0-CURRENT после введения сквозной передачи Serial Management Protocol (SMP) и CAM `CCBs` XPT_SMP_IO и XPT_GDEV_ADVINFO.
|900027
|link:https://svnweb.freebsd.org/changeset/base/216212[216212]
-|December 5, 2010
-|9.0-CURRENT after the addition of log2 to libm.
+|5 декабря 2010
+|9.0-CURRENT после добавления log2 в libm.
|900028
|link:https://svnweb.freebsd.org/changeset/base/216615[216615]
-|December 21, 2010
-|9.0-CURRENT after the addition of the Hhook (Helper Hook), Khelp (Kernel Helpers) and Object Specific Data (OSD) KPIs.
+|21 декабря 2010
+|9.0-CURRENT после добавления Hhook (Helper Hook), Khelp (Kernel Helpers) и KPI Object Specific Data (OSD).
|900029
|link:https://svnweb.freebsd.org/changeset/base/216758[216758]
-|December 28, 2010
-|9.0-CURRENT after the modification of the TCP stack to allow Khelp modules to interact with it via helper hook points and store per-connection data in the TCP control block.
+|28 декабря 2010
+|9.0-CURRENT после модификации стека TCP для разрешения модулям Khelp взаимодействовать с ним через точки подключения вспомогательных функций и хранить данные для каждого соединения в блоке управления TCP.
|900030
|link:https://svnweb.freebsd.org/changeset/base/217309[217309]
-|January 12, 2011
-|9.0-CURRENT after the update of libdialog to version 20100428.
+|12 января 2011
+|9.0-CURRENT после обновления libdialog до версии 20100428.
|900031
|link:https://svnweb.freebsd.org/changeset/base/218414[218414]
-|February 7, 2011
-|9.0-CURRENT after the addition of man:pthread_getthreadid_np[3].
+|7 февраля 2011
+|9.0-CURRENT после добавления man:pthread_getthreadid_np[3].
|900032
|link:https://svnweb.freebsd.org/changeset/base/218425[218425]
-|February 8, 2011
-|9.0-CURRENT after the removal of the uio_yield prototype and symbol.
+|8 февраля 2011
+|9.0-CURRENT после удаления прототипа и символа `uio_yield`.
|900033
|link:https://svnweb.freebsd.org/changeset/base/218822[218822]
-|February 18, 2011
-|9.0-CURRENT after the update of binutils to version 2.17.50.
+|18 февраля 2011
+|9.0-CURRENT после обновления binutils до версии 2.17.50.
|900034
|link:https://svnweb.freebsd.org/changeset/base/219406[219406]
-|March 8, 2011
-|9.0-CURRENT after the struct sysvec (sv_schedtail) changes.
+|8 марта 2011
+|9.0-CURRENT после изменений в структуре `sysvec` (`sv_schedtail`).
|900035
|link:https://svnweb.freebsd.org/changeset/base/220150[220150]
-|March 29, 2011
-|9.0-CURRENT after the update of base gcc and libstdc++ to the last GPLv2 licensed revision.
+|29 марта 2011
+|9.0-CURRENT после обновления базового gcc и libstdc++ до последней ревизии, лицензированной под GPLv2.
|900036
|link:https://svnweb.freebsd.org/changeset/base/220770[220770]
-|April 18, 2011
-|9.0-CURRENT after the removal of libobjc and Objective-C support from the base system.
+|18 апреля 2011
+|9.0-CURRENT после удаления libobjc и поддержки Objective-C из базовой системы.
|900037
|link:https://svnweb.freebsd.org/changeset/base/221862[221862]
-|May 13, 2011
-|9.0-CURRENT after importing the man:libprocstat[3] library and man:fuser[1] utility to the base system.
+|13 мая 2011
+|9.0-CURRENT после импорта библиотеки man:libprocstat[3] и утилиты man:fuser[1] в базовую систему.
|900038
|link:https://svnweb.freebsd.org/changeset/base/222167[222167]
-|May 22, 2011
-|9.0-CURRENT after adding a lock flag argument to man:VFS_FHTOVP[9].
+|22 мая 2011
+|9.0-CURRENT после добавления аргумента флага блокировки к man:VFS_FHTOVP[9].
|900039
|link:https://svnweb.freebsd.org/changeset/base/223637[223637]
-|June 28, 2011
-|9.0-CURRENT after importing pf from OpenBSD 4.5.
+|28 июня 2011
+|9.0-CURRENT после импорта pf из OpenBSD 4.5.
|900040
|link:https://svnweb.freebsd.org/changeset/base/224217[224217]
-|July 19, 2011
-|Increase default MAXCPU for FreeBSD to 64 on amd64 and ia64 and to 128 for XLP (mips).
+|19 июля 2011
+|Увеличить значение MAXCPU по умолчанию для FreeBSD до 64 на amd64 и ia64 и до 128 для XLP (mips).
|900041
|link:https://svnweb.freebsd.org/changeset/base/224834[224834]
-|August 13, 2011
-|9.0-CURRENT after the implementation of Capsicum capabilities; fget(9) gains a rights argument.
+|13 августа 2011
+|Версия 9.0-CURRENT после реализации возможностей Capsicum; man:fget[9] получает аргумент rights.
|900042
|link:https://svnweb.freebsd.org/changeset/base/225350[225350]
-|August 28, 2011
-|Bump shared libraries' version numbers for libraries whose ABI has changed in preparation for 9.0.
+|28 августа 2011
+|Увеличьте номера версий общих библиотек для библиотек, чей ABI изменился в рамках подготовки к 9.0.
|900043
|link:https://svnweb.freebsd.org/changeset/base/225350[225350]
-|September 2, 2011
-|Add automatic detection of USB mass storage devices which do not support the no synchronize cache SCSI command.
+|2 сентября 2011
+|Добавить автоматическое обнаружение USB-накопителей, которые не поддерживают команду SCSI "no synchronize cache".
|900044
|link:https://svnweb.freebsd.org/changeset/base/225469[225469]
-|September 10, 2011
-|Re-factor auto-quirk. 9.0-RELEASE.
+|10 сентября 2011
+|Переработка автоматического определения особенностей оборудования (auto-quirk). 9.0-RELEASE.
|900045
|link:https://svnweb.freebsd.org/changeset/base/229285[229285]
-|January 2, 2012
-|9-STABLE after MFC of true/false from 1000002.
+|2 января 2012
+|9-STABLE после MFC значения true/false из 1000002.
|900500
|link:https://svnweb.freebsd.org/changeset/base/229318[229318]
-|January 2, 2012
+|2 января 2012
|9.0-STABLE.
|900501
|link:https://svnweb.freebsd.org/changeset/base/229723[229723]
-|January 6, 2012
-|9.0-STABLE after merging of addition of the man:posix_fadvise[2] system call.
+|6 января 2012
+|9.0-STABLE после объединения добавления системного вызова man:posix_fadvise[2].
|900502
|link:https://svnweb.freebsd.org/changeset/base/230237[230237]
-|January 16, 2012
-|9.0-STABLE after merging gperf 3.0.3
+|16 января 2012
+|9.0-STABLE после слияния gperf 3.0.3
|900503
|link:https://svnweb.freebsd.org/changeset/base/231768[231768]
-|February 15, 2012
-|9.0-STABLE after introduction of the new extensible man:sysctl[3] interface NET_RT_IFLISTL to query address lists.
+|15 февраля 2012
+|9.0-STABLE после введения нового расширяемого интерфейса man:sysctl[3] NET_RT_IFLISTL для запроса списков адресов.
|900504
|link:https://svnweb.freebsd.org/changeset/base/232728[232728]
-|March 3, 2012
-|9.0-STABLE after changes related to mounting of filesystem inside a jail.
+|3 марта 2012
+|9.0-STABLE после изменений, связанных с монтированием файловой системы внутри клетки.
|900505
|link:https://svnweb.freebsd.org/changeset/base/232945[232945]
-|March 13, 2012
-|9.0-STABLE after introduction of new man:tcp[4] socket options: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL, and TCP_KEEPCNT.
+|13 марта 2012
+|9.0-STABLE после введения новых параметров сокета man:tcp[4]: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL и TCP_KEEPCNT.
|900506
|link:https://svnweb.freebsd.org/changeset/base/235786[235786]
-|May 22, 2012
-|9.0-STABLE after introduction of the `quick_exit` function and related changes required for C++11.
+|22 мая 2012
+|9.0-STABLE после введения функции `quick_exit` и связанных изменений, необходимых для C++11.
|901000
|link:https://svnweb.freebsd.org/changeset/base/239082[239082]
-|August 5, 2012
+|5 августа 2012
|9.1-RELEASE.
|901500
|link:https://svnweb.freebsd.org/changeset/base/239081[239081]
-|August 6, 2012
-|9.1-STABLE after branching releng/9.1 (RELENG_9_1).
+|6 августа 2012
+|9.1-STABLE после ветвления releng/9.1 (RELENG_9_1).
|901501
|link:https://svnweb.freebsd.org/changeset/base/240659[240659]
-|November 11, 2012
-|9.1-STABLE after man:LIST_PREV[3] added to queue.h (rev link:https://svnweb.freebsd.org/changeset/base/242893[242893]) and KBI change in USB serial devices.
+|11 ноября 2012
+|9.1-STABLE после man:LIST_PREV[3] добавлен в queue.h (изменение rev link:https://svnweb.freebsd.org/changeset/base/242893[242893]) и изменения KBI в USB последовательных устройствах.
|901502
|link:https://svnweb.freebsd.org/changeset/base/243656[243656]
-|November 28, 2012
-|9.1-STABLE after USB serial jitter buffer requires rebuild of USB serial device modules.
+|28 ноября 2012
+|9.1-STABLE после того, как буфер дрожания USB serial требует пересборки модулей устройств USB serial.
|901503
|link:https://svnweb.freebsd.org/changeset/base/247090[247090]
-|February 21, 2013
-|9.1-STABLE after USB moved to the driver structure requiring a rebuild of all USB modules. Also indicates the presence of nmtree.
+|21 февраля 2013
+|9.1-STABLE после перемещения USB в структуру драйверов, что потребовало пересборки всех модулей USB. Также указывает на наличие nmtree.
|901504
|link:https://svnweb.freebsd.org/changeset/base/248338[248338]
-|March 15, 2013
-|9.1-STABLE after install gained -l, -M, -N and related flags and cat gained the -l option.
+|15 марта 2013
+|9.1-STABLE после установки получил флаги -l, -M, -N и связанные с ними, а cat получил опцию -l.
|901505
|link:https://svnweb.freebsd.org/changeset/base/251687[251687]
-|June 13, 2013
-|9.1-STABLE after fixes in ctfmerge bootstrapping (rev link:https://svnweb.freebsd.org/changeset/base/249243[249243]).
+|13 июня 2013
+|9.1-STABLE после исправлений в начальной загрузке `ctfmerge` (rev link:https://svnweb.freebsd.org/changeset/base/249243[249243]).
|902001
|link:https://svnweb.freebsd.org/changeset/base/253912[253912]
-|August 3, 2013
-|`releng/9.2` branched from `stable/9`.
+|3 августа 2013
+|`releng/9.2` ответвился от `stable/9`.
|902501
|link:https://svnweb.freebsd.org/changeset/base/253913[253913]
-|August 2, 2013
-|9.2-STABLE after creation of `releng/9.2` branch.
+|2 августа 2013
+|9.2-STABLE после создания ветки `releng/9.2`.
|902502
|link:https://svnweb.freebsd.org/changeset/base/254938[254938]
-|August 26, 2013
-|9.2-STABLE after inclusion of the `PIM_RESCAN` CAM path inquiry flag.
+|26 августа 2013
+|9.2-STABLE после включения флага запроса пути CAM `PIM_RESCAN`.
|902503
|link:https://svnweb.freebsd.org/changeset/base/254979[254979]
-|August 27, 2013
-|9.2-STABLE after inclusion of the `SI_UNMAPPED` cdev flag.
+|27 августа 2013
+|9.2-STABLE после включения флага `SI_UNMAPPED` для cdev.
|902504
|link:https://svnweb.freebsd.org/changeset/base/256917[256917]
-|October 22, 2013
-|9.2-STABLE after inclusion of support for "first boot" man:rc[8] scripts.
+|22 октября 2013
+|9.2-STABLE после добавления поддержки скриптов "первой загрузки" man:rc[8].
|902505
|link:https://svnweb.freebsd.org/changeset/base/259448[259448]
-|December 12, 2013
-|9.2-STABLE after Heimdal encoding fix.
+|12 декабря 2013
+|9.2-STABLE после исправления кодировки Heimdal.
|902506
|link:https://svnweb.freebsd.org/changeset/base/260136[260136]
-|December 31, 2013
-|9-STABLE after MAP_STACK fixes (rev link:https://svnweb.freebsd.org/changeset/base/260082[260082]).
+|31 декабря 2013
+|9-STABLE после исправлений MAP_STACK (rev link:https://svnweb.freebsd.org/changeset/base/260082[260082]).
|902507
|link:https://svnweb.freebsd.org/changeset/base/262801[262801]
-|March 5, 2014
-|9-STABLE after upgrade of libc++ to 3.4 release.
+|5 марта 2014
+|9-STABLE после обновления libc++ до версии 3.4.
|902508
|link:https://svnweb.freebsd.org/changeset/base/263171[263171]
-|March 14, 2014
-|9-STABLE after merge of the Radeon KMS driver (rev link:https://svnweb.freebsd.org/changeset/base/263170[263170]).
+|14 марта 2014
+|9-STABLE после объединения драйвера Radeon KMS (rev link:https://svnweb.freebsd.org/changeset/base/263170[263170]).
|902509
|link:https://svnweb.freebsd.org/changeset/base/263509[263509]
-|March 21, 2014
-|9-STABLE after upgrade of llvm/clang to 3.4 release.
+|21 марта 2014
+|9-STABLE после обновления llvm/clang до версии 3.4.
|902510
|link:https://svnweb.freebsd.org/changeset/base/263818[263818]
-|March 27, 2014
-|9-STABLE after merge of the man:vt[4] driver.
+|27 марта 2014
+|9-STABLE после слияния драйвера man:vt[4].
|902511
|link:https://svnweb.freebsd.org/changeset/base/264289[264289]
-|March 27, 2014
-|9-STABLE after FreeBSD-SA-14:06.openssl.
+|27 марта 2014
+|9-STABLE после FreeBSD-SA-14:06.openssl.
|902512
|link:https://svnweb.freebsd.org/changeset/base/265123[265123]
-|April 30, 2014
-|9-STABLE after FreeBSD-SA-14:08.tcp.
+|30 апреля 2014
+|9-STABLE после FreeBSD-SA-14:08.tcp.
|903000
|link:https://svnweb.freebsd.org/changeset/base/267656[267656]
-|June 20, 2014
-|9-RC1 `releng/9.3` branch.
+|20 июня 2014
+|9-RC1 ветка `releng/9.3`.
|903500
|link:https://svnweb.freebsd.org/changeset/base/267657[267657]
-|June 20, 2014
-|9.3-STABLE `releng/9.3` branch.
+|20 июня 2014
+|9.3-STABLE ветка `releng/9.3`.
|903501
|link:https://svnweb.freebsd.org/changeset/base/268443[268443]
-|July 8, 2014
-|9-STABLE after FreeBSD-SA-14:17.kmem (rev link:https://svnweb.freebsd.org/changeset/base/268433[268433]).
+|8 июля 2014
+|9-STABLE после FreeBSD-SA-14:17.kmem (изменение:https://svnweb.freebsd.org/changeset/base/268433[268433]).
|903502
|link:https://svnweb.freebsd.org/changeset/base/270175[270175]
-|August 19, 2014
-|9-STABLE after `SOCK_DGRAM` bug fix (rev link:https://svnweb.freebsd.org/changeset/base/269789[269789]).
+|19 августа 2014
+|9-STABLE после исправления ошибки `SOCK_DGRAM` (rev link:https://svnweb.freebsd.org/changeset/base/269789[269789]).
|903503
|link:https://svnweb.freebsd.org/changeset/base/271341[271341]
-|September 9, 2014
-|9-STABLE after FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/269687[269687]).
+|9 сентября 2014
+|9-STABLE после FreeBSD-SA-14:18 (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/269687[269687]).
|903504
|link:https://svnweb.freebsd.org/changeset/base/271686[271686]
-|September 16, 2014
-|9-STABLE after FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271668[271668]).
+|16 сентября 2014
+|9-STABLE после FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271668[271668]).
|903505
|link:https://svnweb.freebsd.org/changeset/base/273432[273432]
-|October 21, 2014
-|9-STABLE after FreeBSD-SA-14:20, FreeBSD-SA-14:21, and FreeBSD-SA-14:22 (rev link:https://svnweb.freebsd.org/changeset/base/273412[273412]).
+|21 октября 2014
+|9-STABLE после исправлений FreeBSD-SA-14:20, FreeBSD-SA-14:21 и FreeBSD-SA-14:22 (rev link:https://svnweb.freebsd.org/changeset/base/273412[273412]).
|903506
|link:https://svnweb.freebsd.org/changeset/base/274162[274162]
-|November 4, 2014
-|9-STABLE after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25.
+|4 ноября 2014
+|9-STABLE после FreeBSD-SA-14:23, FreeBSD-SA-14:24 и FreeBSD-SA-14:25.
|903507
|link:https://svnweb.freebsd.org/changeset/base/275742[275742]
-|December 13, 2014
-|9-STABLE after merging an important fix to the LLVM vectorizer, which could lead to buffer overruns in some cases.
+|13 декабря 2014
+|9-STABLE после объединения важного исправления в векторизатор LLVM, которое в некоторых случаях могло приводить к переполнению буфера.
|903508
|link:https://svnweb.freebsd.org/changeset/base/279287[279287]
-|February 25, 2015
-|9-STABLE after FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp, and FreeBSD-SA-15:05.bind.
+|25 февраля 2015
+|9-STABLE после FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp и FreeBSD-SA-15:05.bind.
|903509
|link:https://svnweb.freebsd.org/changeset/base/296219[296219]
-|February 29, 2016
-|9-STABLE after bumping the default value of `compat.linux.osrelease` to `2.6.18` to support the linux-c6-* ports out of the box.
+|29 февраля 2016
+|9-STABLE после увеличения значения по умолчанию `compat.linux.osrelease` до `2.6.18` для поддержки портов linux-c6-* без дополнительной настройки.
|903510
|link:https://svnweb.freebsd.org/changeset/base/300236[300236]
-|May 19, 2016
-|9-STABLE after System Binary Interface (SBI) page was moved in latest version of Berkeley Boot Loader (BBL) due to code size increase in link:https://svnweb.freebsd.org/changeset/base/300234[300234].
+|19 мая 2016
+|9-STABLE после того, как страница System Binary Interface (SBI) была перемещена в последней версии Berkeley Boot Loader (BBL) из-за увеличения размера кода в link:https://svnweb.freebsd.org/changeset/base/300234[300234].
|903511
|link:https://svnweb.freebsd.org/changeset/base/305735[305735]
-|September 12, 2016
-|9-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+|12 сентября 2016
+|9-STABLE после разрешения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9].
|===
[[versions-8]]
-== FreeBSD 8 Versions
+== Версии FreeBSD 8
[[freebsd-versions-table-8]]
-.FreeBSD 8 `__FreeBSD_version` Values
+.Значения `__FreeBSD_version` в FreeBSD 8
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|800000
|link:https://svnweb.freebsd.org/changeset/base/172531[172531]
-|October 11, 2007
-|8.0-CURRENT. Separating wide and single byte ctype.
+|11 октября 2007
+|8.0-CURRENT. Разделение `ctype` на широкие и однобайтовые символы.
|800001
|link:https://svnweb.freebsd.org/changeset/base/172688[172688]
-|October 16, 2007
-|8.0-CURRENT after libpcap 0.9.8 and tcpdump 3.9.8 import.
+|16 октября 2007
+|8.0-CURRENT после импорта libpcap 0.9.8 и tcpdump 3.9.8.
|800002
|link:https://svnweb.freebsd.org/changeset/base/172841[172841]
-|October 21, 2007
-|8.0-CURRENT after renaming man:kthread_create[9] and friends to man:kproc_create[9] etc.
+|21 октября 2007
+|8.0-CURRENT после переименования man:kthread_create[9] и связанных функций в man:kproc_create[9] и т.д.
|800003
|link:https://svnweb.freebsd.org/changeset/base/172932[172932]
-|October 24, 2007
-|8.0-CURRENT after ABI backwards compatibility to the FreeBSD 4/5/6 versions of the PCIOCGETCONF, PCIOCREAD and PCIOCWRITE IOCTLs was added, which required the ABI of the PCIOCGETCONF IOCTL to be broken again
+|24 октября 2007
+|8.0-CURRENT после того, как была добавлена обратная совместимость ABI с версиями FreeBSD 4/5/6 для IOCTL PCIOCGETCONF, PCIOCREAD и PCIOCWRITE, что потребовало снова нарушить ABI IOCTL PCIOCGETCONF
|800004
|link:https://svnweb.freebsd.org/changeset/base/173573[173573]
-|November 12, 2007
-|8.0-CURRENT after man:agp[4] driver moved from src/sys/pci to src/sys/dev/agp
+|12 ноября 2007
+|8.0-CURRENT после перемещения драйвера man:agp[4] из src/sys/pci в src/sys/dev/agp
|800005
|link:https://svnweb.freebsd.org/changeset/base/174261[174261]
-|December 4, 2007
-|8.0-CURRENT after changes to the jumbo frame allocator (rev link:https://svnweb.freebsd.org/changeset/base/174247[174247]).
+|4 декабря 2007
+|8.0-CURRENT после изменений в аллокаторе джамбо-фреймов (rev link:https://svnweb.freebsd.org/changeset/base/174247[174247]).
|800006
|link:https://svnweb.freebsd.org/changeset/base/174399[174399]
-|December 7, 2007
-|8.0-CURRENT after the addition of callgraph capture functionality to man:hwpmc[4].
+|7 декабря 2007
+|8.0-CURRENT после добавления функциональности захвата `callgraph` в man:hwpmc[4].
|800007
|link:https://svnweb.freebsd.org/changeset/base/174901[174901]
-|December 25, 2007
-|8.0-CURRENT after `kdb_enter()` gains a "why" argument.
+|25 декабря 2007
+|8.0-CURRENT после `kdb_enter()` получает аргумент "why".
|800008
|link:https://svnweb.freebsd.org/changeset/base/174951[174951]
-|December 28, 2007
-|8.0-CURRENT after LK_EXCLUPGRADE option removal.
+|28 декабря 2007
+|8.0-CURRENT после удаления опции LK_EXCLUPGRADE.
|800009
|link:https://svnweb.freebsd.org/changeset/base/175168[175168]
-|January 9, 2008
-|8.0-CURRENT after introduction of man:lockmgr_disown[9]
+|9 января 2008
+|8.0-CURRENT после введения man:lockmgr_disown[9]
|800010
|link:https://svnweb.freebsd.org/changeset/base/175204[175204]
-|January 10, 2008
-|8.0-CURRENT after the man:vn_lock[9] prototype change.
+|10 января 2008
+|8.0-CURRENT после изменения прототипа man:vn_lock[9].
|800011
|link:https://svnweb.freebsd.org/changeset/base/175295[175295]
-|January 13, 2008
-|8.0-CURRENT after the man:VOP_LOCK[9] and man:VOP_UNLOCK[9] prototype changes.
+|13 января 2008
+|8.0-CURRENT после изменений прототипов man:VOP_LOCK[9] и man:VOP_UNLOCK[9].
|800012
|link:https://svnweb.freebsd.org/changeset/base/175487[175487]
-|January 19, 2008
-|8.0-CURRENT after introduction of man:lockmgr_recursed[9], man:BUF_RECURSED[9] and man:BUF_ISLOCKED[9] and the removal of `BUF_REFCNT()`.
+|19 января 2008
+|8.0-CURRENT после введения man:lockmgr_recursed[9], man:BUF_RECURSED[9] и man:BUF_ISLOCKED[9], а также удаления `BUF_REFCNT()`.
|800013
|link:https://svnweb.freebsd.org/changeset/base/175581[175581]
-|January 23, 2008
-|8.0-CURRENT after introduction of the "ASCII" encoding.
+|23 января 2008
+|8.0-CURRENT после введения кодировки "ASCII".
|800014
|link:https://svnweb.freebsd.org/changeset/base/175636[175636]
-|January 24, 2008
-|8.0-CURRENT after changing the prototype of man:lockmgr[9] and removal of `lockcount()` and `LOCKMGR_ASSERT()`.
+|24 января 2008
+|8.0-CURRENT после изменения прототипа man:lockmgr[9] и удаления `lockcount()` и `LOCKMGR_ASSERT()`.
|800015
|link:https://svnweb.freebsd.org/changeset/base/175688[175688]
-|January 26, 2008
-|8.0-CURRENT after extending the types of the man:fts[3] structures.
+|26 января 2008
+|8.0-CURRENT после расширения типов структур man:fts[3].
|800016
|link:https://svnweb.freebsd.org/changeset/base/175872[175872]
-|February 1, 2008
-|8.0-CURRENT after adding an argument to man:MEXTADD[9]
+|1 февраля 2008
+|8.0-CURRENT после добавления аргумента в man:MEXTADD[9]
|800017
|link:https://svnweb.freebsd.org/changeset/base/176015[176015]
-|February 6, 2008
-|8.0-CURRENT after the introduction of LK_NODUP and LK_NOWITNESS options in the man:lockmgr[9] space.
+|6 февраля 2008
+|8.0-CURRENT после введения опций LK_NODUP и LK_NOWITNESS в пространстве man:lockmgr[9].
|800018
|link:https://svnweb.freebsd.org/changeset/base/176112[176112]
-|February 8, 2008
-|8.0-CURRENT after the addition of m_collapse.
+|8 февраля 2008
+|8.0-CURRENT после добавления `m_collapse`.
|800019
|link:https://svnweb.freebsd.org/changeset/base/176124[176124]
-|February 9, 2008
-|8.0-CURRENT after the addition of current working directory, root directory, and jail directory support to the kern.proc.filedesc sysctl.
+|9 февраля 2008
+|8.0-CURRENT после добавления поддержки текущего рабочего каталога, корневого каталога и каталога клетки в sysctl kern.proc.filedesc.
|800020
|link:https://svnweb.freebsd.org/changeset/base/176251[176251]
-|February 13, 2008
-|8.0-CURRENT after introduction of man:lockmgr_assert[9] and `BUF_ASSERT` functions.
+|13 февраля 2008
+|8.0-CURRENT после добавления man:lockmgr_assert[9] и функций `BUF_ASSERT`.
|800021
|link:https://svnweb.freebsd.org/changeset/base/176321[176321]
-|February 15, 2008
-|8.0-CURRENT after introduction of man:lockmgr_args[9] and LK_INTERNAL flag removal.
+|15 февраля 2008
+|8.0-CURRENT после введения man:lockmgr_args[9] и удаления флага LK_INTERNAL.
|800022
|link:https://svnweb.freebsd.org/changeset/base/176556[176556]
-|(backed out)
-|8.0-CURRENT after changing the default system ar to BSD man:ar[1].
+|(отменено)
+|8.0-CURRENT после изменения стандартной системной ar на BSD man:ar[1].
|800023
|link:https://svnweb.freebsd.org/changeset/base/176560[176560]
-|February 25, 2008
-|8.0-CURRENT after changing the prototypes of man:lockstatus[9] and man:VOP_ISLOCKED[9];, more specifically retiring the `struct thread` argument.
+|25 февраля 2008
+|8.0-CURRENT после изменения прототипов man:lockstatus[9] и man:VOP_ISLOCKED[9];, а именно удаления аргумента `struct thread`.
|800024
|link:https://svnweb.freebsd.org/changeset/base/176709[176709]
-|March 1, 2008
-|8.0-CURRENT after axing out the `lockwaiters` and `BUF_LOCKWAITERS` functions, changing the return value of `brelvp` from void to int and introducing new flags for man:lockinit[9].
+|1 марта 2008
+|8.0-CURRENT после удаления функций `lockwaiters` и `BUF_LOCKWAITERS`, изменения возвращаемого значения `brelvp` с void на int и добавления новых флагов для man:lockinit[9].
|800025
|link:https://svnweb.freebsd.org/changeset/base/176958[176958]
-|March 8, 2008
-|8.0-CURRENT after adding F_DUP2FD command to man:fcntl[2].
+|8 марта 2008
+|8.0-CURRENT после добавления команды F_DUP2FD в man:fcntl[2].
|800026
|link:https://svnweb.freebsd.org/changeset/base/177086[177086]
-|March 12, 2008
-|8.0-CURRENT after changing the priority parameter to cv_broadcastpri such that 0 means no priority.
+|12 марта 2008
+|8.0-CURRENT после изменения параметра приоритета на `cv_broadcastpri`, где 0 означает отсутствие приоритета.
|800027
|link:https://svnweb.freebsd.org/changeset/base/177551[177551]
-|March 24, 2008
-|8.0-CURRENT after changing the bpf monitoring ABI when zerocopy bpf buffers were added.
+|24 марта 2008
+|8.0-CURRENT после изменения ABI мониторинга bpf при добавлении буферов bpf с `zerocopy`.
|800028
|link:https://svnweb.freebsd.org/changeset/base/177637[177637]
-|March 26, 2008
-|8.0-CURRENT after adding l_sysid to struct flock.
+|26 марта 2008
+|8.0-CURRENT после добавления `l_sysid` в структуру flock.
|800029
|link:https://svnweb.freebsd.org/changeset/base/177688[177688]
|March 28, 2008
-|8.0-CURRENT after reintegration of the `BUF_LOCKWAITERS` function and the addition of man:lockmgr_waiters[9].
+|8.0-CURRENT после повторного включения функции `BUF_LOCKWAITERS` и добавления man:lockmgr_waiters[9].
|800030
|link:https://svnweb.freebsd.org/changeset/base/177844[177844]
-|April 1, 2008
-|8.0-CURRENT after the introduction of the man:rw_try_rlock[9] and man:rw_try_wlock[9] functions.
+|1 апреля 2008
+|8.0-CURRENT после введения функций man:rw_try_rlock[9] и man:rw_try_wlock[9].
|800031
|link:https://svnweb.freebsd.org/changeset/base/177958[177958]
-|April 6, 2008
-|8.0-CURRENT after the introduction of the `lockmgr_rw` and `lockmgr_args_rw` functions.
+|6 апреля 2008
+|8.0-CURRENT после введения функций `lockmgr_rw` и `lockmgr_args_rw`.
|800032
|link:https://svnweb.freebsd.org/changeset/base/178006[178006]
-|April 8, 2008
-|8.0-CURRENT after the implementation of the openat and related syscalls, introduction of the O_EXEC flag for the man:open[2], and providing the corresponding linux compatibility syscalls.
+|8 апреля 2008
+|8.0-CURRENT после реализации системных вызовов `openat` и связанных с ними, введения флага O_EXEC для man:open[2] и предоставления соответствующих системных вызовов совместимости с Linux.
|800033
|link:https://svnweb.freebsd.org/changeset/base/178017[178017]
-|April 8, 2008
-|8.0-CURRENT after added man:write[2] support for man:psm[4] in native operation level. Now arbitrary commands can be written to [.filename]#/dev/psm%d# and status can be read back from it.
+|8 апреля 2008
+|8.0-CURRENT после добавления поддержки man:write[2] для man:psm[4] на уровне нативной работы. Теперь произвольные команды можно записывать в [.filename]#/dev/psm%d#, а статус — считывать из него.
|800034
|link:https://svnweb.freebsd.org/changeset/base/178051[178051]
-|April 10, 2008
-|8.0-CURRENT after introduction of the `memrchr` function.
+|10 апреля 2008
+|8.0-CURRENT после введения функции `memrchr`.
|800035
|link:https://svnweb.freebsd.org/changeset/base/178256[178256]
-|April 16, 2008
-|8.0-CURRENT after introduction of the `fdopendir` function.
+|16 апреля 2008
+|8.0-CURRENT после введения функции `fdopendir`.
|800036
|link:https://svnweb.freebsd.org/changeset/base/178362[178362]
-|April 20, 2008
-|8.0-CURRENT after switchover of 802.11 wireless to multi-bss support (aka vaps).
+|20 апреля 2008
+|8.0-CURRENT после перехода на поддержку multi-bss в беспроводных сетях 802.11 (также известную как `vaps`).
|800037
|link:https://svnweb.freebsd.org/changeset/base/178892[178892]
-|May 9, 2008
-|8.0-CURRENT after addition of multi routing table support (aka man:setfib[1], man:setfib[2]).
+|9 мая 2008
+|8.0-CURRENT после добавления поддержки нескольких таблиц маршрутизации (также известных как man:setfib[1], man:setfib[2]).
|800038
|link:https://svnweb.freebsd.org/changeset/base/179316[179316]
-|May 26, 2008
-|8.0-CURRENT after removal of netatm and ISDN4BSD. Also, the addition of the Compact C Type (CTF) tools.
+|26 мая 2008
+|8.0-CURRENT после удаления `netatm` и ISDN4BSD. Также добавлены инструменты Compact C Type (CTF).
|800039
|link:https://svnweb.freebsd.org/changeset/base/179784[179784]
-|June 14, 2008
-|8.0-CURRENT after removal of sgtty.
+|14 июня 2008
+|8.0-CURRENT после удаления `sgtty`.
|800040
|link:https://svnweb.freebsd.org/changeset/base/180025[180025]
-|June 26, 2008
-|8.0-CURRENT with kernel NFS lockd client.
+|26 июня 2008
+|8.0-CURRENT с клиентом `lockd` для NFS в ядре.
|800041
|link:https://svnweb.freebsd.org/changeset/base/180691[180691]
-|July 22, 2008
-|8.0-CURRENT after addition of man:arc4random_buf[3] and man:arc4random_uniform[3].
+|22 июля 2008
+|8.0-CURRENT после добавления man:arc4random_buf[3] и man:arc4random_uniform[3].
|800042
|link:https://svnweb.freebsd.org/changeset/base/181439[181439]
-|August 8, 2008
-|8.0-CURRENT after addition of man:cpuctl[4].
+|8 августа 2008
+|8.0-CURRENT после добавления man:cpuctl[4].
|800043
|link:https://svnweb.freebsd.org/changeset/base/181694[181694]
-|August 13, 2008
-|8.0-CURRENT after changing man:bpf[4] to use a single device node, instead of device cloning.
+|13 августа 2008
+|8.0-CURRENT после изменения man:bpf[4] для использования единого узла устройства вместо клонирования устройств.
|800044
|link:https://svnweb.freebsd.org/changeset/base/181803[181803]
-|August 17, 2008
-|8.0-CURRENT after the commit of the first step of the vimage project renaming global variables to be virtualized with a V_ prefix with macros to map them back to their global names.
+|17 августа 2008
+|8.0-CURRENT после внесения изменений, связанных с первым этапом проекта VIMAGE, переименованы глобальные переменные, подлежащие виртуализации, с добавлением префикса `V_` и макросов для их обратного отображения на глобальные имена.
|800045
|link:https://svnweb.freebsd.org/changeset/base/181905[181905]
-|August 20, 2008
-|8.0-CURRENT after the integration of the MPSAFE TTY layer, including changes to various drivers and utilities that interact with it.
+|20 августа 2008
+|8.0-CURRENT после интеграции MPSAFE TTY слоя, включая изменения в различных драйверах и утилитах, взаимодействующих с ним.
|800046
|link:https://svnweb.freebsd.org/changeset/base/182869[182869]
-|September 8, 2008
-|8.0-CURRENT after the separation of the GDT per CPU on amd64 architecture.
+|8 сентября 2008
+|8.0-CURRENT после разделения GDT для каждого процессора на архитектуре amd64.
|800047
|link:https://svnweb.freebsd.org/changeset/base/182905[182905]
-|September 10, 2008
-|8.0-CURRENT after removal of VSVTX, VSGID and VSUID.
+|10 сентября 2008
+|8.0-CURRENT после удаления VSVTX, VSGID и VSUID.
|800048
|link:https://svnweb.freebsd.org/changeset/base/183091[183091]
-|September 16, 2008
-|8.0-CURRENT after converting the kernel NFS mount code to accept individual mount options in the man:nmount[2] iovec, not just one big struct nfs_args.
+|16 сентября 2008
+|8.0-CURRENT после преобразования кода монтирования ядра NFS для поддержки отдельных опций монтирования в `iovec` man:nmount[2], а не только одной большой структуры nfs_args.
|800049
|link:https://svnweb.freebsd.org/changeset/base/183114[183114]
-|September 17, 2008
-|8.0-CURRENT after the removal of man:suser[9] and man:suser_cred[9].
+|17 сентября 2008
+|8.0-CURRENT после удаления man:suser[9] и man:suser_cred[9].
|800050
|link:https://svnweb.freebsd.org/changeset/base/184099[184099]
-|October 20, 2008
-|8.0-CURRENT after buffer cache API change.
+|20 октября 2008
+|8.0-CURRENT после изменения API кэша буфера.
|800051
|link:https://svnweb.freebsd.org/changeset/base/184205[184205]
-|October 23, 2008
-|8.0-CURRENT after the removal of the man:MALLOC[9] and man:FREE[9] macros.
+|23 октября 2008
+|8.0-CURRENT после удаления макросов man:MALLOC[9] и man:FREE[9].
|800052
|link:https://svnweb.freebsd.org/changeset/base/184419[184419]
-|October 28, 2008
-|8.0-CURRENT after the introduction of accmode_t and renaming of VOP_ACCESS 'a_mode' argument to 'a_accmode'.
+|28 октября 2008
+|8.0-CURRENT после введения `accmode_t` и переименования аргумента `a_mode` в `a_accmode` в VOP_ACCESS.
|800053
|link:https://svnweb.freebsd.org/changeset/base/184555[184555]
-|November 2, 2008
-|8.0-CURRENT after the prototype change of man:vfs_busy[9] and the introduction of its MBF_NOWAIT and MBF_MNTLSTLOCK flags.
+|2 ноября 2008
+|8.0-CURRENT после изменения прототипа man:vfs_busy[9] и введения флагов MBF_NOWAIT и MBF_MNTLSTLOCK.
|800054
|link:https://svnweb.freebsd.org/changeset/base/185162[185162]
-|November 22, 2008
-|8.0-CURRENT after the addition of buf_ring, memory barriers and ifnet functions to facilitate multiple hardware transmit queues for cards that support them, and a lockless ring-buffer implementation to enable drivers to more efficiently manage queuing of packets.
+|22 ноября 2008
+|8.0-CURRENT после добавления `buf_ring`, барьеров памяти и функций ifnet для поддержки нескольких аппаратных очередей передачи для карт, которые их поддерживают, а также реализации кольцевого буфера без блокировок, чтобы позволить драйверам более эффективно управлять очередями пакетов.
|800055
|link:https://svnweb.freebsd.org/changeset/base/185363[185363]
-|November 27, 2008
-|8.0-CURRENT after the addition of Intel(TM) Core, Core2, and Atom support to man:hwpmc[4].
+|27 ноября 2008
+|8.0-CURRENT после добавления поддержки Intel(TM) Core, Core2 и Atom в man:hwpmc[4].
|800056
|link:https://svnweb.freebsd.org/changeset/base/185435[185435]
-|November 29, 2008
-|8.0-CURRENT after the introduction of multi-/no-IPv4/v6 jails.
+|29 ноября 2008
+|8.0-CURRENT после введения многопользовательских/без IPv4/v6 клеток.
|800057
|link:https://svnweb.freebsd.org/changeset/base/185522[185522]
-|December 1, 2008
-|8.0-CURRENT after the switch to the ath hal source code.
+|1 декабря 2008
+|8.0-CURRENT после перехода на исходный код `hal` для ath.
|800058
|link:https://svnweb.freebsd.org/changeset/base/185968[185968]
-|December 12, 2008
-|8.0-CURRENT after the introduction of the VOP_VPTOCNP operation.
+|12 декабря 2008
+|8.0-CURRENT после введения операции VOP_VPTOCNP.
|800059
|link:https://svnweb.freebsd.org/changeset/base/186119[186119]
-|December 15, 2008
-|8.0-CURRENT incorporates the new arp-v2 rewrite.
+|15 декабря 2008
+|8.0-CURRENT включает новую переработанную версию arp-v2.
|800060
|link:https://svnweb.freebsd.org/changeset/base/186344[186344]
-|December 19, 2008
-|8.0-CURRENT after the addition of makefs.
+|19 декабря 2008
+|8.0-CURRENT после добавления makefs.
|800061
|link:https://svnweb.freebsd.org/changeset/base/187289[187289]
-|January 15, 2009
-|8.0-CURRENT after TCP Appropriate Byte Counting.
+|15 января 2009
+|8.0-CURRENT после TCP Appropriate Byte Counting.
|800062
|link:https://svnweb.freebsd.org/changeset/base/187830[187830]
-|January 28, 2009
-|8.0-CURRENT after removal of minor(), minor2unit(), unit2minor(), etc.
+|28 января 2009
+|8.0-CURRENT после удаления `minor()`, `minor2unit()`, `unit2minor()` и т.д.
|800063
|link:https://svnweb.freebsd.org/changeset/base/188745[188745]
-|February 18, 2009
-|8.0-CURRENT after GENERIC config change to use the USB2 stack, but also the addition of man:fdevname[3].
+|18 февраля 2009
+|8.0-CURRENT после изменения конфигурации GENERIC для использования стека USB2, а также добавления man:fdevname[3].
|800064
|link:https://svnweb.freebsd.org/changeset/base/188946[188946]
-|February 23, 2009
-|8.0-CURRENT after the USB2 stack is moved to and replaces dev/usb.
+|23 февраля 2009
+|8.0-CURRENT после переноса стека USB2 и замены dev/usb.
|800065
|link:https://svnweb.freebsd.org/changeset/base/189092[189092]
-|February 26, 2009
-|8.0-CURRENT after the renaming of all functions in man:libmp[3].
+|26 февраля 2009
+|8.0-CURRENT после переименования всех функций в man:libmp[3].
|800066
|link:https://svnweb.freebsd.org/changeset/base/189110[189110]
-|February 27, 2009
-|8.0-CURRENT after changing USB devfs handling and layout.
+|27 февраля 2009
+|8.0-CURRENT после изменения обработки и структуры USB devfs.
|800067
|link:https://svnweb.freebsd.org/changeset/base/189136[189136]
-|February 28, 2009
-|8.0-CURRENT after adding getdelim(), getline(), stpncpy(), strnlen(), wcsnlen(), wcscasecmp(), and wcsncasecmp().
+|28 февраля 2009
+|8.0-CURRENT после добавления `getdelim()`, `getline()`, `stpncpy()`, `strnlen()`, `wcsnlen()`, `wcscasecmp()`, and `wcsncasecmp()`.
|800068
|link:https://svnweb.freebsd.org/changeset/base/189276[189276]
-|March 2, 2009
-|8.0-CURRENT after renaming the ushub devclass to uhub.
+|2 марта 2009
+|8.0-CURRENT после переименования класса устройств `ushub` в `uhub`.
|800069
|link:https://svnweb.freebsd.org/changeset/base/189585[189585]
-|March 9, 2009
-|8.0-CURRENT after libusb20.so.1 was renamed to libusb.so.1.
+|9 марта 2009
+|8.0-CURRENT после переименования libusb20.so.1 в libusb.so.1.
|800070
|link:https://svnweb.freebsd.org/changeset/base/189592[189592]
-|March 9, 2009
-|8.0-CURRENT after merging IGMPv3 and Source-Specific Multicast (SSM) to the IPv4 stack.
+|9 марта 2009
+|8.0-CURRENT после объединения IGMPv3 и Source-Specific Multicast (SSM) в стек IPv4.
|800071
|link:https://svnweb.freebsd.org/changeset/base/189825[189825]
-|March 14, 2009
-|8.0-CURRENT after gcc was patched to use C99 inline semantics in c99 and gnu99 mode.
+|14 марта 2009
+|8.0-CURRENT после того, как gcc был исправлен для использования семантики встраивания C99 в режимах c99 и gnu99.
|800072
|link:https://svnweb.freebsd.org/changeset/base/189853[189853]
|March 15, 2009
-|8.0-CURRENT after the IFF_NEEDSGIANT flag has been removed; non-MPSAFE network device drivers are no longer supported.
+|8.0-CURRENT после удаления флага IFF_NEEDSGIANT; неподдерживаемые MPSAFE драйверы сетевых устройств больше не поддерживаются.
|800073
|link:https://svnweb.freebsd.org/changeset/base/190265[190265]
-|March 18, 2009
-|8.0-CURRENT after the dynamic string token substitution has been implemented for rpath and needed paths.
+|18 марта 2009
+|8.0-CURRENT после реализации подстановки динамических строковых токенов для rpath и необходимых путей.
|800074
|link:https://svnweb.freebsd.org/changeset/base/190373[190373]
-|March 24, 2009
-|8.0-CURRENT after tcpdump 4.0.0 and libpcap 1.0.0 import.
+|24 марта 2009
+|8.0-CURRENT после импорта tcpdump 4.0.0 и libpcap 1.0.0.
|800075
|link:https://svnweb.freebsd.org/changeset/base/190787[190787]
-|April 6, 2009
-|8.0-CURRENT after layout of structs vnet_net, vnet_inet and vnet_ipfw has been changed.
+|6 апреля 2009
+|8.0-CURRENT после изменения структуры структур vnet_net, vnet_inet и vnet_ipfw.
|800076
|link:https://svnweb.freebsd.org/changeset/base/190866[190866]
-|April 9, 2009
-|8.0-CURRENT after adding delay profiles in dummynet.
+|9 апреля 2009
+|8.0-CURRENT после добавления профилей задержки в dummynet.
|800077
|link:https://svnweb.freebsd.org/changeset/base/190914[190914]
-|April 14, 2009
-|8.0-CURRENT after removing VOP_LEASE() and vop_vector.vop_lease.
+|14 апреля 2009
+|8.0-CURRENT после удаления `VOP_LEASE()` и vop_vector.vop_lease.
|800078
|link:https://svnweb.freebsd.org/changeset/base/191080[191080]
-|April 15, 2009
-|8.0-CURRENT after struct rt_weight fields have been added to struct rt_metrics and struct rt_metrics_lite, changing the layout of struct rt_metrics_lite. A bump to RTM_VERSION was made, but backed out.
+|15 апреля 2009
+|8.0-CURRENT после добавления полей `rt_weight` в структуры `rt_metrics` и `rt_metrics_lite`, что изменило расположение полей в структуре `rt_metrics_lite`. Версия RTM_VERSION была увеличена, но затем отменена.
|800079
|link:https://svnweb.freebsd.org/changeset/base/191117[191117]
-|April 15, 2009
-|8.0-CURRENT after struct llentry pointers are added to struct route and struct route_in6.
+|15 апреля 2009
+|8.0-CURRENT после добавления указателей на структуру `llentry` в структуры `route` и `route_in6`.
|800080
|link:https://svnweb.freebsd.org/changeset/base/191126[191126]
-|April 15, 2009
-|8.0-CURRENT after layout of struct inpcb has been changed.
+|15 апреля 2009
+|8.0-CURRENT после изменения структуры inpcb.
|800081
|link:https://svnweb.freebsd.org/changeset/base/191267[191267]
-|April 19, 2009
-|8.0-CURRENT after the layout of struct malloc_type has been changed.
+|19 апреля 2009
+|8.0-CURRENT после изменения структуры `malloc_type`.
|800082
|link:https://svnweb.freebsd.org/changeset/base/191368[191368]
-|April 21, 2009
-|8.0-CURRENT after the layout of struct ifnet has changed, and with if_ref() and if_rele() ifnet refcounting.
+|21 апреля 2009
+|8.0-CURRENT после изменения структуры struct ifnet и с `if_ref()` и `if_rele()` для подсчета ссылок (`refcounting`) ifnet.
|800083
|link:https://svnweb.freebsd.org/changeset/base/191389[191389]
-|April 22, 2009
-|8.0-CURRENT after the implementation of a low-level Bluetooth HCI API.
+|22 апреля 2009
+|8.0-CURRENT после реализации низкоуровневого API HCI Bluetooth.
|800084
|link:https://svnweb.freebsd.org/changeset/base/191672[191672]
-|April 29, 2009
-|8.0-CURRENT after IPv6 SSM and MLDv2 changes.
+|29 апреля 2009
+|8.0-CURRENT после изменений в IPv6 SSM и MLDv2.
|800085
|link:https://svnweb.freebsd.org/changeset/base/191688[191688]
-|April 30, 2009
-|8.0-CURRENT after enabling support for VIMAGE kernel builds with one active image.
+|30 апреля 2009
+|8.0-CURRENT после включения поддержки сборки ядра с VIMAGE с одним активным образом.
|800086
|link:https://svnweb.freebsd.org/changeset/base/191910[191910]
-|May 8, 2009
-|8.0-CURRENT after adding support for input lines of arbitrarily length in man:patch[1].
+|8 мая 2009
+|8.0-CURRENT после добавления поддержки строк ввода произвольной длины в man:patch[1].
|800087
|link:https://svnweb.freebsd.org/changeset/base/191990[191990]
-|May 11, 2009
-|8.0-CURRENT after some VFS KPI changes. The thread argument has been removed from the FSD parts of the VFS. `VFS_*` functions do not need the context any more because it always refers to `curthread`. In some special cases, the old behavior is retained.
+|11 мая 2009
+|8.0-CURRENT после некоторых изменений в VFS KPI. Аргумент потока был удален из частей FSD в VFS. Функциям `VFS_*` больше не нужен контекст, так как он всегда относится к `curthread`. В некоторых особых случаях старое поведение сохранено.
|800088
|link:https://svnweb.freebsd.org/changeset/base/192470[192470]
-|May 20, 2009
-|8.0-CURRENT after net80211 monitor mode changes.
+|20 мая 2009
+|8.0-CURRENT после изменений режима монитора в net80211.
|800089
|link:https://svnweb.freebsd.org/changeset/base/192649[192649]
-|May 23, 2009
-|8.0-CURRENT after adding UDP control block support.
+|23 мая 2009
+|8.0-CURRENT после добавления поддержки блока управления UDP.
|800090
|link:https://svnweb.freebsd.org/changeset/base/192669[192669]
-|May 23, 2009
-|8.0-CURRENT after virtualizing interface cloning.
+|23 мая 2009
+|8.0-CURRENT после виртуализации клонирования интерфейсов.
|800091
|link:https://svnweb.freebsd.org/changeset/base/192895[192895]
-|May 27, 2009
-|8.0-CURRENT after adding hierarchical jails and removing global securelevel.
+|27 мая 2009
+|8.0-CURRENT после добавления иерархических клеток и удаления глобального securelevel.
|800092
|link:https://svnweb.freebsd.org/changeset/base/193011[193011]
-|May 29, 2009
-|8.0-CURRENT after changing `sx_init_flags()` KPI. The `SX_ADAPTIVESPIN` is retired and a new `SX_NOADAPTIVE` flag is introduced to handle the reversed logic.
+|29 мая 2009
+|8.0-CURRENT после изменения KPI `sx_init_flags()`. `SX_ADAPTIVESPIN` упразднён, и введён новый флаг `SX_NOADAPTIVE` для обработки обратной логики.
|800093
|link:https://svnweb.freebsd.org/changeset/base/193047[193047]
-|May 29, 2009
-|8.0-CURRENT after adding mnt_xflag to struct mount.
+|29 мая 2009
+|8.0-CURRENT после добавления `mnt_xflag` в структуру mount.
|800094
|link:https://svnweb.freebsd.org/changeset/base/193093[193093]
-|May 30, 2009
-|8.0-CURRENT after adding man:VOP_ACCESSX[9].
+|30 мая 2009
+|8.0-CURRENT после добавления man:VOP_ACCESSX[9].
|800095
|link:https://svnweb.freebsd.org/changeset/base/193096[193096]
-|May 30, 2009
-|8.0-CURRENT after changing the polling KPI. The polling handlers now return the number of packets processed. A new `IFCAP_POLLING_NOCOUNT` is also introduced to specify that the return value is not significant and the counting should be skipped.
+|30 мая 2009
+|8.0-CURRENT после изменения KPI для polling. Обработчики polling теперь возвращают количество обработанных пакетов. Также введена новая возможность `IFCAP_POLLING_NOCOUNT`, которая указывает, что возвращаемое значение не является значимым и подсчёт следует пропустить.
|800096
|link:https://svnweb.freebsd.org/changeset/base/193219[193219]
-|June 1, 2009
-|8.0-CURRENT after updating to the new netisr implementation and after changing the way we store and access FIBs.
+|1 июня 2009
+|8.0-CURRENT после обновления до новой реализации netisr и после изменения способа хранения и доступа к FIB.
|800097
|link:https://svnweb.freebsd.org/changeset/base/193731[193731]
-|June 8, 2009
-|8.0-CURRENT after the introduction of vnet destructor hooks and infrastructure.
+|8 июня 2009
+|8.0-CURRENT после введения хуков и инфраструктуры деструктора vnet.
-|(not changed)
+|(не изменено)
|link:https://svnweb.freebsd.org/changeset/base/194012[194012]
-|June 11, 2009
-|8.0-CURRENT after the introduction of netgraph outbound to inbound path call detection and queuing, which also changed the layout of struct thread.
+|11 июня 2009
+|8.0-CURRENT после введения в netgraph обнаружения вызовов пути из исходящего во входящий и организации очередей, что также изменило структуру struct thread.
|800098
|link:https://svnweb.freebsd.org/changeset/base/194210[194210]
-|June 14, 2009
-|8.0-CURRENT after OpenSSL 0.9.8k import.
+|14 июня 2009
+|8.0-CURRENT после импорта OpenSSL 0.9.8k.
|800099
|link:https://svnweb.freebsd.org/changeset/base/194675[194675]
-|June 22, 2009
-|8.0-CURRENT after NGROUPS update and moving route virtualization into its own VImage module.
+|22 июня 2009
+|8.0-CURRENT после обновления NGROUPS и переноса виртуализации маршрутов в собственный модуль VImage.
|800100
|link:https://svnweb.freebsd.org/changeset/base/194920[194920]
-|June 24, 2009
-|8.0-CURRENT after SYSVIPC ABI change.
+|24 июня 2009
+|8.0-CURRENT после изменения ABI SYSVIPC.
|800101
|link:https://svnweb.freebsd.org/changeset/base/195175[195175]
-|June 29, 2009
-|8.0-CURRENT after the removal of the /dev/net/* per-interface character devices.
+|29 июня 2009
+|8.0-CURRENT после удаления символьных устройств /dev/net/* для каждого интерфейса.
|800102
|link:https://svnweb.freebsd.org/changeset/base/195634[195634]
-|July 12, 2009
-|8.0-CURRENT after padding was added to struct sackhint, struct tcpcb, and struct tcpstat.
+|12 июля 2009
+|8.0-CURRENT после добавления заполнения к структурам `sackhint`, `tcpcb` и `tcpstat`.
|800103
|link:https://svnweb.freebsd.org/changeset/base/195654[195654]
-|July 13, 2009
-|8.0-CURRENT after replacing struct tcpopt with struct toeopt in the TOE driver interface to the TCP syncache.
+|13 июля 2009
+|8.0-CURRENT после замены структуры `tcpopt` на структуру `toeopt` в интерфейсе драйвера TOE к `syncache` TCP.
|800104
|link:https://svnweb.freebsd.org/changeset/base/195699[195699]
-|July 14, 2009
-|8.0-CURRENT after the addition of the linker-set based per-vnet allocator.
+|14 июля 2009
+|8.0-CURRENT после добавления распределителя на основе наборов компоновщика для каждого vnet.
|800105
|link:https://svnweb.freebsd.org/changeset/base/195767[195767]
-|July 19, 2009
-|8.0-CURRENT after version bump for all shared libraries that do not have symbol versioning turned on.
+|19 июля 2009
+|8.0-CURRENT после увеличения версии для всех разделяемых библиотек, у которых не включено управление версиями символов.
|800106
|link:https://svnweb.freebsd.org/changeset/base/195852[195852]
-|July 24, 2009
-|8.0-CURRENT after introduction of OBJT_SG VM object type.
+|24 июля 2009
+|8.0-CURRENT после введения типа объекта VM OBJT_SG.
|800107
|link:https://svnweb.freebsd.org/changeset/base/196037[196037]
-|August 2, 2009
-|8.0-CURRENT after making the newbus subsystem Giant free by adding the newbus sxlock and 8.0-RELEASE.
+|2 августа 2009
+|8.0-CURRENT после освобождения подсистемы newbus от Giant путем добавления `sxlock` в newbus и 8.0-RELEASE.
|800108
|link:https://svnweb.freebsd.org/changeset/base/199627[199627]
-|November 21, 2009
-|8.0-STABLE after implementing EVFILT_USER kevent filter.
+|21 ноября 2009
+|8.0-STABLE после реализации фильтра `kevent` `EVFILT_USER`.
|800500
|link:https://svnweb.freebsd.org/changeset/base/201749[201749]
-|January 7, 2010
-|8.0-STABLE after `__FreeBSD_version` bump to make `pkg_add -r` use packages-8-stable.
+|7 января 2010
+|8.0-STABLE после увеличения `__FreeBSD_version`, чтобы `pkg_add -r` использовал пакеты-8-stable.
|800501
|link:https://svnweb.freebsd.org/changeset/base/202922[202922]
-|January 24, 2010
-|8.0-STABLE after change of the man:scandir[3] and man:alphasort[3] prototypes to conform to SUSv4.
+|24 января 2010
+|8.0-STABLE после изменения прототипов man:scandir[3] и man:alphasort[3] для соответствия SUSv4.
|800502
|link:https://svnweb.freebsd.org/changeset/base/203299[203299]
-|January 31, 2010
-|8.0-STABLE after addition of man:sigpause[2].
+|31 января 2010
+|8.0-STABLE после добавления man:sigpause[2].
|800503
|link:https://svnweb.freebsd.org/changeset/base/204344[204344]
-|February 25, 2010
-|8.0-STABLE after addition of SIOCGIFDESCR and SIOCSIFDESCR ioctls to network interfaces. These ioctl can be used to manipulate interface description, as inspired by OpenBSD.
+|25 февраля 2010
+|8.0-STABLE после добавления ioctl SIOCGIFDESCR и SIOCSIFDESCR к сетевым интерфейсам. Эти ioctl могут использоваться для управления описанием интерфейса, по аналогии с OpenBSD.
|800504
|link:https://svnweb.freebsd.org/changeset/base/204546[204546]
-|March 1, 2010
-|8.0-STABLE after MFC of importing x86emu, a software emulator for real mode x86 CPU from OpenBSD.
+|1 марта 2010
+|8.0-STABLE после MFC импорта x86emu, программного эмулятора реального режима x86 CPU из OpenBSD.
|800505
|link:https://svnweb.freebsd.org/changeset/base/208259[208259]
-|May 18, 2010
-|8.0-STABLE after MFC of adding liblzma, xz, xzdec, and lzmainfo.
+|18 мая 2010
+|8.0-STABLE после MFC добавления liblzma, xz, xzdec и lzmainfo.
|801000
|link:https://svnweb.freebsd.org/changeset/base/209150[209150]
-|June 14, 2010
+|14 июня 2010
|8.1-RELEASE
|801500
|link:https://svnweb.freebsd.org/changeset/base/209146[209146]
-|June 14, 2010
-|8.1-STABLE after 8.1-RELEASE.
+|14 июня 2010
+|8.1-STABLE после 8.1-RELEASE.
|801501
|link:https://svnweb.freebsd.org/changeset/base/214762[214762]
-|November 3, 2010
-|8.1-STABLE after KBI change in struct sysentvec, and implementation of PL_FLAG_SCE/SCX/EXEC/SI and pl_siginfo for ptrace(PT_LWPINFO) .
+|3 ноября 2010
+|8.1-STABLE после изменения KBI в структуре `sysentvec`, а также реализации PL_FLAG_SCE/SCX/EXEC/SI и `pl_siginfo` для ptrace(PT_LWPINFO).
|802000
|link:https://svnweb.freebsd.org/changeset/base/216639[216639]
-|December 22, 2010
+|22 декабря 2010
|8.2-RELEASE
|802500
|link:https://svnweb.freebsd.org/changeset/base/216654[216654]
-|December 22, 2010
-|8.2-STABLE after 8.2-RELEASE.
+|22 декабря 2010
+|8.2-STABLE после 8.2-RELEASE.
|802501
|link:https://svnweb.freebsd.org/changeset/base/219107[219107]
-|February 28, 2011
-|8.2-STABLE after merging DTrace changes, including support for userland tracing.
+|28 февраля 2011
+|8.2-STABLE после объединения изменений DTrace, включая поддержку трассировки пользовательского пространства.
|802502
|link:https://svnweb.freebsd.org/changeset/base/219324[219324]
-|March 6, 2011
-|8.2-STABLE after merging log2 and log2f into libm.
+|6 марта 2011
+|8.2-STABLE после объединения log2 и log2f в libm.
|802503
|link:https://svnweb.freebsd.org/changeset/base/221275[221275]
-|May 1, 2011
-|8.2-STABLE after upgrade of the gcc to the last GPLv2 version from the FSF gcc-4_2-branch.
+|1 мая 2011
+|8.2-STABLE после обновления gcc до последней версии GPLv2 из ветки FSF gcc-4_2-branch.
|802504
|link:https://svnweb.freebsd.org/changeset/base/222401[222401]
-|May 28, 2011
-|8.2-STABLE after introduction of the KPI and supporting infrastructure for modular congestion control.
+|28 мая 2011
+|8.2-STABLE после введения KPI и поддерживающей инфраструктуры для модульного управления перегрузкой.
|802505
|link:https://svnweb.freebsd.org/changeset/base/222406[222406]
-|May 28, 2011
-|8.2-STABLE after introduction of Hhook and Khelp KPIs.
+|28 мая 2011
+|8.2-STABLE после введения KPIs Hhook и Khelp.
|802506
|link:https://svnweb.freebsd.org/changeset/base/222408[222408]
-|May 28, 2011
-|8.2-STABLE after addition of OSD to struct tcpcb.
+|28 мая 2011
+|8.2-STABLE после добавления OSD в структуру tcpcb.
|802507
|link:https://svnweb.freebsd.org/changeset/base/222741[222741]
-|June 6, 2011
-|8.2-STABLE after ZFS v28 import.
+|6 июня 2011
+|8.2-STABLE после импорта ZFS v28.
|802508
|link:https://svnweb.freebsd.org/changeset/base/222846[222846]
-|June 8, 2011
-|8.2-STABLE after removal of the schedtail event handler and addition of the sv_schedtail method to struct sysvec.
+|8 июня 2011
+|8.2-STABLE после удаления обработчика событий `schedtail` и добавления метода `sv_schedtail` в структуру `sysvec`.
|802509
|link:https://svnweb.freebsd.org/changeset/base/224017[224017]
-|July 14, 2011
-|8.2-STABLE after merging the SSSE3 support into binutils.
+|14 июля 2011
+|8.2-STABLE после объединения поддержки SSSE3 в binutils.
|802510
|link:https://svnweb.freebsd.org/changeset/base/224214[224214]
-|July 19, 2011
-|8.2-STABLE after addition of RFTSIGZMB flag for man:rfork[2].
+|19 июля 2011
+|8.2-STABLE после добавления флага RFTSIGZMB для man:rfork[2].
|802511
|link:https://svnweb.freebsd.org/changeset/base/225458[225458]
-|September 9, 2011
-|8.2-STABLE after addition of automatic detection of USB mass storage devices which do not support the no synchronize cache SCSI command.
+|9 сентября 2011
+|8.2-STABLE после добавления автоматического обнаружения USB-накопителей, которые не поддерживают команду SCSI "no synchronize cache".
|802512
|link:https://svnweb.freebsd.org/changeset/base/225470[225470]
-|September 10, 2011
-|8.2-STABLE after merging of re-factoring of auto-quirk.
+|10 сентября 2011
+|8.2-STABLE после объединения рефакторинга auto-quirk.
|802513
|link:https://svnweb.freebsd.org/changeset/base/226763[226763]
-|October 25, 2011
-|8.2-STABLE after merging of the MAP_PREFAULT_READ flag to man:mmap[2].
+|25 октября 2011
+|8.2-STABLE после объединения флага MAP_PREFAULT_READ в man:mmap[2].
|802514
|link:https://svnweb.freebsd.org/changeset/base/227573[227573]
-|November 16, 2011
-|8.2-STABLE after merging of addition of man:posix_fallocate[2] syscall.
+|16 ноября 2011
+|8.2-STABLE после объединения добавления системного вызова man:posix_fallocate[2].
|802515
|link:https://svnweb.freebsd.org/changeset/base/229725[229725]
-|January 6, 2012
-|8.2-STABLE after merging of addition of the man:posix_fadvise[2] system call.
+|6 января 2012
+|8.2-STABLE после объединения добавления системного вызова man:posix_fadvise[2].
|802516
|link:https://svnweb.freebsd.org/changeset/base/230239[230239]
-|January 16, 2012
-|8.2-STABLE after merging gperf 3.0.3
+|16 января 2012
+|8.2-STABLE после объединения gperf 3.0.3
|802517
|link:https://svnweb.freebsd.org/changeset/base/231769[231769]
-|February 15, 2012
-|8.2-STABLE after introduction of the new extensible man:sysctl[3] interface NET_RT_IFLISTL to query address lists.
+|15 февраля 2012
+|8.2-STABLE после введения нового расширяемого интерфейса man:sysctl[3] NET_RT_IFLISTL для запроса списков адресов.
|803000
|link:https://svnweb.freebsd.org/changeset/base/232446[232446]
-|March 3, 2012
+|3 марта 2012
|8.3-RELEASE.
|803500
|link:https://svnweb.freebsd.org/changeset/base/232439[232439]
-|March 3, 2012
-|8.3-STABLE after branching releng/8.3 (RELENG_8_3).
+|3 марта 2012
+|8.3-STABLE после ветвления releng/8.3 (RELENG_8_3).
|803501
|link:https://svnweb.freebsd.org/changeset/base/247091[247091]
-|February 21, 2013
-|8.3-STABLE after MFC of two USB fixes (rev link:https://svnweb.freebsd.org/changeset/base/246616[246616] and link:https://svnweb.freebsd.org/changeset/base/246759[246759]).
+|21 февраля 2013
+|8.3-STABLE после слияния двух исправлений для USB (ссылки на ревизии: link:https://svnweb.freebsd.org/changeset/base/246616[246616] и link:https://svnweb.freebsd.org/changeset/base/246759[246759]).
|804000
|link:https://svnweb.freebsd.org/changeset/base/248850[248850]
-|March 28, 2013
+|28 марта 2013
|8.4-RELEASE.
|804500
|link:https://svnweb.freebsd.org/changeset/base/248819[248819]
-|March 28, 2013
-|8.4-STABLE after 8.4-RELEASE.
+|28 марта 2013
+|8.4-STABLE после 8.4-RELEASE.
|804501
|link:https://svnweb.freebsd.org/changeset/base/259449[259449]
-|December 16, 2013
-|8.4-STABLE after MFC of upstream Heimdal encoding fix.
+|16 декабря 2013
+|8.4-STABLE после MFC исправления кодировки из вышестоящего Heimdal.
|804502
|link:https://svnweb.freebsd.org/changeset/base/265123[265123]
-|April 30, 2014
-|8.4-STABLE after FreeBSD-SA-14:08.tcp.
+|30 апреля 2014
+|8.4-STABLE после FreeBSD-SA-14:08.tcp.
|804503
|link:https://svnweb.freebsd.org/changeset/base/268444[268444]
-|July 9, 2014
-|8.4-STABLE after FreeBSD-SA-14:17.kmem.
+|9 июля 2014
+|8.4-STABLE после FreeBSD-SA-14:17.kmem.
|804504
|link:https://svnweb.freebsd.org/changeset/base/271341[271341]
-|September 9, 2014
-|8.4-STABLE after FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/271305[271305]).
+|9 сентября 2014
+|8.4-STABLE после FreeBSD-SA-14:18 (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/271305[271305]).
|804505
|link:https://svnweb.freebsd.org/changeset/base/271686[271686]
-|September 16, 2014
-|8.4-STABLE after FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271668[271668]).
+|16 сентября 2014
+|8.4-STABLE после FreeBSD-SA-14:19 (ревизия link:https://svnweb.freebsd.org/changeset/base/271668[271668]).
|804506
|link:https://svnweb.freebsd.org/changeset/base/273432[273432]
-|October 21, 2014
-|8.4-STABLE after FreeBSD-SA-14:21 (rev link:https://svnweb.freebsd.org/changeset/base/273413[273413]).
+|21 октября 2014
+|8.4-STABLE после FreeBSD-SA-14:21 (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/273413[273413]).
|804507
|link:https://svnweb.freebsd.org/changeset/base/274162[274162]
-|November 4, 2014
-|8.4-STABLE after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25.
+|4 ноября 2014
+|8.4-STABLE после FreeBSD-SA-14:23, FreeBSD-SA-14:24 и FreeBSD-SA-14:25.
|804508
|link:https://svnweb.freebsd.org/changeset/base/279287[279287]
-|February 25, 2015
-|8-STABLE after FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp, and FreeBSD-SA-15:05.bind.
+|25 февраля 2015
+|8-STABLE после FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp и FreeBSD-SA-15:05.bind.
|804509
|link:https://svnweb.freebsd.org/changeset/base/305736[305736]
-|September 12, 2016
-|8-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9].
+|12 сентября 2016
+|8-STABLE после устранения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9].
|===
[[versions-7]]
-== FreeBSD 7 Versions
+== Версии FreeBSD 7
[[freebsd-versions-table-7]]
-.FreeBSD 7 `__FreeBSD_version` Values
+.Значения `__FreeBSD_version` для FreeBSD 7
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|700000
|link:https://svnweb.freebsd.org/changeset/base/147925[147925]
-|July 11, 2005
+|11 июля 2005
|7.0-CURRENT.
|700001
|link:https://svnweb.freebsd.org/changeset/base/148341[148341]
-|July 23, 2005
-|7.0-CURRENT after bump of all shared library versions that had not been changed since RELENG_5.
+|23 июля 2005
+|7.0-CURRENT после увеличения версий всех общих библиотек, которые не изменялись с RELENG_5.
|700002
|link:https://svnweb.freebsd.org/changeset/base/149039[149039]
-|August 13, 2005
-|7.0-CURRENT after credential argument is added to dev_clone event handler.
+|13 августа 2005
+|7.0-CURRENT после добавления аргумента учетных данных в обработчик события `dev_clone`.
|700003
|link:https://svnweb.freebsd.org/changeset/base/149470[149470]
-|August 25, 2005
-|7.0-CURRENT after man:memmem[3] is added to libc.
+|25 августа 2005
+|7.0-CURRENT после добавления man:memmem[3] в libc.
|700004
|link:https://svnweb.freebsd.org/changeset/base/151888[151888]
-|October 30, 2005
-|7.0-CURRENT after man:solisten[9] kernel arguments are modified to accept a backlog parameter.
+|30 октября 2005
+|7.0-CURRENT после изменения аргументов ядра man:solisten[9] для принятия параметра backlog.
|700005
|link:https://svnweb.freebsd.org/changeset/base/152296[152296]
-|November 11, 2005
-|7.0-CURRENT after IFP2ENADDR() was changed to return a pointer to IF_LLADDR().
+|11 ноября 2005
+|7.0-CURRENT после изменения `IFP2ENADDR()` для возврата указателя на `IF_LLADDR()`.
|700006
|link:https://svnweb.freebsd.org/changeset/base/152315[152315]
-|November 11, 2005
-|7.0-CURRENT after addition of `if_addr` member to `struct ifnet` and IFP2ENADDR() removal.
+|11 ноября 2005
+|7.0-CURRENT после добавления члена `if_addr` в `struct ifnet` и удаления `IFP2ENADDR()`.
|700007
|link:https://svnweb.freebsd.org/changeset/base/153027[153027]
-|December 2, 2005
-|7.0-CURRENT after incorporating scripts from the local_startup directories into the base man:rcorder[8].
+|2 декабря 2005
+|7.0-CURRENT после включения скриптов из каталогов `local_startup` в базовый man:rcorder[8].
|700008
|link:https://svnweb.freebsd.org/changeset/base/153107[153107]
-|December 5, 2005
-|7.0-CURRENT after removal of MNT_NODEV mount option.
+|5 декабря 2005
+|7.0-CURRENT после удаления опции монтирования MNT_NODEV.
|700009
|link:https://svnweb.freebsd.org/changeset/base/153519[153519]
-|December 19, 2005
-|7.0-CURRENT after ELF-64 type changes and symbol versioning.
+|19 декабря 2005
+|7.0-CURRENT после изменений типа ELF-64 и версионирования символов.
|700010
|link:https://svnweb.freebsd.org/changeset/base/153579[153579]
-|December 20, 2005
-|7.0-CURRENT after addition of hostb and vgapci drivers, addition of pci_find_extcap(), and changing the AGP drivers to no longer map the aperture.
+|20 декабря 2005
+|7.0-CURRENT после добавления драйверов `hostb` и `vgapci`, добавления `pci_find_extcap()` и изменения драйверов AGP, чтобы они больше не отображали апертуру.
|700011
|link:https://svnweb.freebsd.org/changeset/base/153936[153936]
-|December 31, 2005
-|7.0-CURRENT after tv_sec was made time_t on all platforms but Alpha.
+|31 декабря 2005
+|7.0-CURRENT после того, как `tv_sec` был изменён на `time_t` на всех платформах, кроме Alpha.
|700012
|link:https://svnweb.freebsd.org/changeset/base/154114[154114]
-|January 8, 2006
-|7.0-CURRENT after ldconfig_local_dirs change.
+|8 января 2006
+|7.0-CURRENT после изменения ldconfig_local_dirs.
|700013
|link:https://svnweb.freebsd.org/changeset/base/154269[154269]
-|January 12, 2006
-|7.0-CURRENT after changes to [.filename]#/etc/rc.d/abi# to support [.filename]#/compat/linux/etc/ld.so.cache# being a symlink in a readonly filesystem.
+|12 января 2006
+|7.0-CURRENT после изменений в [.filename]#/etc/rc.d/abi# для поддержки [.filename]#/compat/linux/etc/ld.so.cache# в виде символьной ссылки в файловой системе только для чтения.
|700014
|link:https://svnweb.freebsd.org/changeset/base/154863[154863]
-|January 26, 2006
-|7.0-CURRENT after pts import.
+|26 января 2006
+|7.0-CURRENT после импорта pts.
|700015
|link:https://svnweb.freebsd.org/changeset/base/157144[157144]
-|March 26, 2006
-|7.0-CURRENT after the introduction of version 2 of man:hwpmc[4]'s ABI.
+|26 марта 2006
+|7.0-CURRENT после введения версии 2 ABI man:hwpmc[4].
|700016
|link:https://svnweb.freebsd.org/changeset/base/157962[157962]
-|April 22, 2006
-|7.0-CURRENT after addition of man:fcloseall[3] to libc.
+|22 апреля 2006
+|7.0-CURRENT после добавления man:fcloseall[3] в libc.
|700017
|link:https://svnweb.freebsd.org/changeset/base/158513[158513]
-|May 13, 2006
-|7.0-CURRENT after removal of ip6fw.
+|13 мая 2006
+|7.0-CURRENT после удаления ip6fw.
|700018
|link:https://svnweb.freebsd.org/changeset/base/160386[160386]
-|July 15, 2006
-|7.0-CURRENT after import of snd_emu10kx.
+|15 июля 2006
+|7.0-CURRENT после импорта snd_emu10kx.
|700019
|link:https://svnweb.freebsd.org/changeset/base/160821[160821]
-|July 29, 2006
-|7.0-CURRENT after import of OpenSSL 0.9.8b.
+|29 июля 2006
+|7.0-CURRENT после импорта OpenSSL 0.9.8b.
|700020
|link:https://svnweb.freebsd.org/changeset/base/161931[161931]
-|September 3, 2006
-|7.0-CURRENT after addition of bus_dma_get_tag function
+|3 сентября 2006
+|7.0-CURRENT после добавления функции `bus_dma_get_tag`
|700021
|link:https://svnweb.freebsd.org/changeset/base/162023[162023]
-|September 4, 2006
-|7.0-CURRENT after libpcap 0.9.4 and tcpdump 3.9.4 import.
+|4 сентября 2006
+|7.0-CURRENT после импорта libpcap 0.9.4 и tcpdump 3.9.4.
|700022
|link:https://svnweb.freebsd.org/changeset/base/162170[162170]
-|September 9, 2006
-|7.0-CURRENT after dlsym change to look for a requested symbol both in specified dso and its implicit dependencies.
+|9 сентября 2006
+|7.0-CURRENT после изменения `dlsym`, чтобы искать запрошенный символ как в указанном DSO, так и в его неявных зависимостях.
|700023
|link:https://svnweb.freebsd.org/changeset/base/162588[162588]
-|September 23, 2006
-|7.0-CURRENT after adding new sound IOCTLs for the OSSv4 mixer API.
+|23 сентября 2006
+|7.0-CURRENT после добавления новых звуковых IOCTL для API микшера OSSv4.
|700024
|link:https://svnweb.freebsd.org/changeset/base/162919[162919]
-|September 28, 2006
-|7.0-CURRENT after import of OpenSSL 0.9.8d.
+|28 сентября 2006
+|7.0-CURRENT после импорта OpenSSL 0.9.8d.
|700025
|link:https://svnweb.freebsd.org/changeset/base/164190[164190]
-|November 11, 2006
-|7.0-CURRENT after the addition of libelf.
+|11 ноября 2006
+|7.0-CURRENT после добавления libelf.
|700026
|link:https://svnweb.freebsd.org/changeset/base/164614[164614]
-|November 26, 2006
-|7.0-CURRENT after major changes on sound sysctls.
+|26 ноября 2006
+|7.0-CURRENT после значительных изменений в звуковых sysctls.
|700027
|link:https://svnweb.freebsd.org/changeset/base/164770[164770]
-|November 30, 2006
-|7.0-CURRENT after the addition of Wi-Spy quirk.
+|30 ноября 2006
+|7.0-CURRENT после добавления особенности Wi-Spy.
|700028
|link:https://svnweb.freebsd.org/changeset/base/165242[165242]
-|December 15, 2006
-|7.0-CURRENT after the addition of sctp calls to libc
+|15 декабря 2006
+|7.0-CURRENT после добавления вызовов `sctp` в libc
|700029
|link:https://svnweb.freebsd.org/changeset/base/166259[166259]
-|January 26, 2007
-|7.0-CURRENT after the GNU man:gzip[1] implementation was replaced with a BSD licensed version ported from NetBSD.
+|26 января 2007
+|7.0-CURRENT после того, как реализация GNU man:gzip[1] была заменена на версию с лицензией BSD, портированную из NetBSD.
|700030
|link:https://svnweb.freebsd.org/changeset/base/166549[166549]
-|February 7, 2007
-|7.0-CURRENT after the removal of IPIP tunnel encapsulation (VIFF_TUNNEL) from the IPv4 multicast forwarding code.
+|7 февраля 2007
+|7.0-CURRENT после удаления инкапсуляции туннеля IPIP (VIFF_TUNNEL) из кода переадресации IPv4 multicast.
|700031
|link:https://svnweb.freebsd.org/changeset/base/166907[166907]
-|February 23, 2007
-|7.0-CURRENT after the modification of bus_setup_intr() (newbus).
+|23 февраля 2007
+|7.0-CURRENT после изменения `bus_setup_intr()` (newbus).
|700032
|link:https://svnweb.freebsd.org/changeset/base/167165[167165]
-|March 2, 2007
-|7.0-CURRENT after the inclusion of man:ipw[4] and man:iwi[4] firmware.
+|2 марта 2007
+|7.0-CURRENT после включения firmware для man:ipw[4] и man:iwi[4].
|700033
|link:https://svnweb.freebsd.org/changeset/base/167360[167360]
-|March 9, 2007
-|7.0-CURRENT after the inclusion of ncurses wide character support.
+|9 марта 2007
+|7.0-CURRENT после включения поддержки широких символов ncurses.
|700034
|link:https://svnweb.freebsd.org/changeset/base/167684[167684]
-|March 19, 2007
-|7.0-CURRENT after changes to how insmntque(), getnewvnode(), and vfs_hash_insert() work.
+|19 марта 2007
+|7.0-CURRENT после изменений в работе `insmntque()`, `getnewvnode()` и `vfs_hash_insert()`.
|700035
|link:https://svnweb.freebsd.org/changeset/base/167906[167906]
-|March 26, 2007
-|7.0-CURRENT after addition of a notify mechanism for CPU frequency changes.
+|26 марта 2007
+|7.0-CURRENT после добавления механизма уведомлений об изменениях частоты CPU.
|700036
|link:https://svnweb.freebsd.org/changeset/base/168413[168413]
-|April 6, 2007
-|7.0-CURRENT after import of the ZFS filesystem.
+|6 апреля 2007
+|7.0-CURRENT после импорта файловой системы ZFS.
|700037
|link:https://svnweb.freebsd.org/changeset/base/168504[168504]
-|April 8, 2007
-|7.0-CURRENT after addition of CAM 'SG' peripheral device, which implements a subset of Linux SCSI SG passthrough device API.
+|8 апреля 2007
+|7.0-CURRENT после добавления периферийного устройства CAM 'SG', реализующего подмножество API сквозного устройства SCSI SG в Linux.
|700038
|link:https://svnweb.freebsd.org/changeset/base/169151[169151]
-|April 30, 2007
-|7.0-CURRENT after changing man:getenv[3], man:putenv[3], man:setenv[3] and man:unsetenv[3] to be POSIX conformant.
+|30 апреля 2007
+|7.0-CURRENT после изменения man:getenv[3], man:putenv[3], man:setenv[3] и man:unsetenv[3] для соответствия стандарту POSIX.
|700039
|link:https://svnweb.freebsd.org/changeset/base/169190[169190]
-|May 1, 2007
-|7.0-CURRENT after the changes in 700038 were backed out.
+|1 мая 2007
+|7.0-CURRENT после отмены изменений в 700038.
|700040
|link:https://svnweb.freebsd.org/changeset/base/169453[169453]
-|May 10, 2007
-|7.0-CURRENT after the addition of man:flopen[3] to libutil.
+|10 мая 2007
+|7.0-CURRENT после добавления man:flopen[3] в libutil.
|700041
|link:https://svnweb.freebsd.org/changeset/base/169526[169526]
-|May 13, 2007
-|7.0-CURRENT after enabling symbol versioning, and changing the default thread library to libthr.
+|13 мая 2007
+|7.0-CURRENT после включения версионирования символов и изменения библиотеки потоков по умолчанию на libthr.
|700042
|link:https://svnweb.freebsd.org/changeset/base/169758[169758]
-|May 19, 2007
-|7.0-CURRENT after the import of gcc 4.2.0.
+|19 мая 2007
+|7.0-CURRENT после импорта gcc 4.2.0.
|700043
|link:https://svnweb.freebsd.org/changeset/base/169830[169830]
-|May 21, 2007
-|7.0-CURRENT after bump of all shared library versions that had not been changed since RELENG_6.
+|21 мая 2007
+|7.0-CURRENT после увеличения версий всех общих библиотек, которые не изменялись с RELENG_6.
|700044
|link:https://svnweb.freebsd.org/changeset/base/170395[170395]
-|June 7, 2007
-|7.0-CURRENT after changing the argument for vn_open()/VOP_OPEN() from file descriptor index to the struct file *.
+|7 июня 2007
+|7.0-CURRENT после изменения аргумента для `vn_open()`/`VOP_OPEN()` с индекса файлового дескриптора на указатель на структуру file *.
|700045
|link:https://svnweb.freebsd.org/changeset/base/170510[170510]
-|June 10, 2007
-|7.0-CURRENT after changing man:pam_nologin[8] to provide an account management function instead of an authentication function to the PAM framework.
+|10 июня 2007
+|7.0-CURRENT после изменения man:pam_nologin[8] для предоставления функции управления учетными записями вместо функции аутентификации в рамках PAM.
|700046
|link:https://svnweb.freebsd.org/changeset/base/170530[170530]
-|June 11, 2007
-|7.0-CURRENT after updated 802.11 wireless support.
+|11 июня 2007
+|7.0-CURRENT после обновления поддержки беспроводных сетей 802.11.
|700047
|link:https://svnweb.freebsd.org/changeset/base/170579[170579]
-|June 11, 2007
-|7.0-CURRENT after adding TCP LRO interface capabilities.
+|11 июня 2007
+|7.0-CURRENT после добавления возможностей интерфейса TCP LRO.
|700048
|link:https://svnweb.freebsd.org/changeset/base/170613[170613]
-|June 12, 2007
-|7.0-CURRENT after RFC 3678 API support added to the IPv4 stack. Legacy RFC 1724 behavior of the IP_MULTICAST_IF ioctl has now been removed; 0.0.0.0/8 may no longer be used to specify an interface index. Use struct ipmreqn instead.
+|12 июня 2007
+|7.0-CURRENT после добавления поддержки API RFC 3678 в стек IPv4. Устаревшее поведение RFC 1724 для ioctl IP_MULTICAST_IF теперь удалено; 0.0.0.0/8 больше нельзя использовать для указания индекса интерфейса. Вместо этого используйте структуру `ipmreqn`.
|700049
|link:https://svnweb.freebsd.org/changeset/base/171175[171175]
-|July 3, 2007
-|7.0-CURRENT after importing pf from OpenBSD 4.1
+|3 июля 2007
+|7.0-CURRENT после импорта pf из OpenBSD 4.1
-|(not changed)
+|(не изменено)
|link:https://svnweb.freebsd.org/changeset/base/171167[171167]
-|
-|7.0-CURRENT after adding IPv6 support for FAST_IPSEC, deleting KAME IPSEC, and renaming FAST_IPSEC to IPSEC.
+|
+|7.0-CURRENT после добавления поддержки IPv6 для FAST_IPSEC, удаления KAME IPSEC и переименования FAST_IPSEC в IPSEC.
|700050
|link:https://svnweb.freebsd.org/changeset/base/171195[171195]
-|July 4, 2007
-|7.0-CURRENT after converting setenv/putenv/etc. calls from traditional BSD to POSIX.
+|4 июля 2007
+|7.0-CURRENT после преобразования вызовов setenv/putenv/etc. из традиционного BSD в POSIX.
|700051
|link:https://svnweb.freebsd.org/changeset/base/171211[171211]
-|July 4, 2007
-|7.0-CURRENT after adding new mmap/lseek/etc syscalls.
+|4 июля 2007
+|7.0-CURRENT после добавления новых системных вызовов mmap/lseek и др.
|700052
|link:https://svnweb.freebsd.org/changeset/base/171275[171275]
-|July 6, 2007
-|7.0-CURRENT after moving I4B headers to include/i4b.
+|6 июля 2007
+|7.0-CURRENT после перемещения заголовков I4B в include/i4b.
|700053
|link:https://svnweb.freebsd.org/changeset/base/172394[172394]
-|September 30, 2007
-|7.0-CURRENT after the addition of support for PCI domains
+|30 сентября 2007
+|7.0-CURRENT после добавления поддержки доменов PCI
|700054
|link:https://svnweb.freebsd.org/changeset/base/172988[172988]
-|October 25, 2007
-|7.0-STABLE after MFC of wide and single byte ctype separation.
+|25 октября 2007
+|7.0-STABLE после переноса изменений (MFC) разделения широких и однобайтовых ctype.
|700055
|link:https://svnweb.freebsd.org/changeset/base/173104[173104]
-|October 28, 2007
-|7.0-RELEASE, and 7.0-CURRENT after ABI backwards compatibility to the FreeBSD 4/5/6 versions of the PCIOCGETCONF, PCIOCREAD and PCIOCWRITE IOCTLs was MFCed, which required the ABI of the PCIOCGETCONF IOCTL to be broken again
+|28 октября 2007
+|7.0-RELEASE и 7.0-CURRENT после того, как обратная совместимость ABI с версиями FreeBSD 4/5/6 для IOCTL PCIOCGETCONF, PCIOCREAD и PCIOCWRITE была перенесена в стабильную ветку (MFC), что потребовало снова нарушить ABI IOCTL PCIOCGETCONF
|700100
|link:https://svnweb.freebsd.org/changeset/base/174864[174864]
-|December 22, 2007
-|7.0-STABLE after 7.0-RELEASE
+|22 декабря 2007
+|7.0-STABLE после 7.0-RELEASE
|700101
|link:https://svnweb.freebsd.org/changeset/base/176111[176111]
-|February 8, 2008
-|7.0-STABLE after the MFC of m_collapse().
+|8 февраля 2008
+|7.0-STABLE после MFC `m_collapse()`.
|700102
|link:https://svnweb.freebsd.org/changeset/base/177735[177735]
-|March 30, 2008
-|7.0-STABLE after the MFC of kdb_enter_why().
+|30 марта 2008
+|7.0-STABLE после MFC `kdb_enter_why()`.
|700103
|link:https://svnweb.freebsd.org/changeset/base/178061[178061]
-|April 10, 2008
-|7.0-STABLE after adding l_sysid to struct flock.
+|10 апреля 2008
+|7.0-STABLE после добавления `l_sysid` в структуру flock.
|700104
|link:https://svnweb.freebsd.org/changeset/base/178108[178108]
-|April 11, 2008
-|7.0-STABLE after the MFC of man:procstat[1].
+|11 апреля 2008
+|7.0-STABLE после MFC man:procstat[1].
|700105
|link:https://svnweb.freebsd.org/changeset/base/178120[178120]
-|April 11, 2008
-|7.0-STABLE after the MFC of umtx features.
+|11 апреля 2008
+|7.0-STABLE после MFC функций `umtx`.
|700106
|link:https://svnweb.freebsd.org/changeset/base/178225[178225]
-|April 15, 2008
-|7.0-STABLE after the MFC of man:write[2] support to man:psm[4].
+|15 апреля 2008
+|7.0-STABLE после MFC поддержки man:write[2] в man:psm[4].
|700107
|link:https://svnweb.freebsd.org/changeset/base/178353[178353]
-|April 20, 2008
-|7.0-STABLE after the MFC of F_DUP2FD command to man:fcntl[2].
+|20 апреля 2008
+|7.0-STABLE после MFC команды F_DUP2FD в man:fcntl[2].
|700108
|link:https://svnweb.freebsd.org/changeset/base/178783[178783]
-|May 5, 2008
-|7.0-STABLE after some man:lockmgr[9] changes, which makes it necessary to include [.filename]#sys/lock.h# to use man:lockmgr[9].
+|5 мая 2008
+|7.0-STABLE после некоторых изменений в man:lockmgr[9], что делает необходимым включение [.filename]#sys/lock.h# для использования man:lockmgr[9].
|700109
|link:https://svnweb.freebsd.org/changeset/base/179367[179367]
-|May 27, 2008
-|7.0-STABLE after MFC of the man:memrchr[3] function.
+|27 мая 2008
+|7.0-STABLE после MFC функции man:memrchr[3].
|700110
|link:https://svnweb.freebsd.org/changeset/base/181328[181328]
-|August 5, 2008
-|7.0-STABLE after MFC of kernel NFS lockd client.
+|5 августа 2008
+|7.0-STABLE после MFC клиента `lockd` ядра NFS.
|700111
|link:https://svnweb.freebsd.org/changeset/base/181940[181940]
-|August 20, 2008
-|7.0-STABLE after addition of physically contiguous jumbo frame support.
+|20 августа 2008
+|7.0-STABLE после добавления поддержки физически непрерывных больших кадров (jumbo frame).
|700112
|link:https://svnweb.freebsd.org/changeset/base/182294[182294]
-|August 27, 2008
-|7.0-STABLE after MFC of kernel DTrace support.
+|27 августа 2008
+|7.0-STABLE после переноса изменений (MFC) поддержки DTrace в ядре.
|701000
|link:https://svnweb.freebsd.org/changeset/base/185315[185315]
-|November 25, 2008
+|25 ноября 2008
|7.1-RELEASE
|701100
|link:https://svnweb.freebsd.org/changeset/base/185302[185302]
-|November 25, 2008
-|7.1-STABLE after 7.1-RELEASE.
+|25 ноября 2008
+|7.1-STABLE после 7.1-RELEASE.
|701101
|link:https://svnweb.freebsd.org/changeset/base/187023[187023]
-|January 10, 2009
-|7.1-STABLE after man:strndup[3] merge.
+|10 января 2009
+|7.1-STABLE после слияния man:strndup[3].
|701102
|link:https://svnweb.freebsd.org/changeset/base/187370[187370]
-|January 17, 2009
-|7.1-STABLE after man:cpuctl[4] support added.
+|17 января 2009
+|7.1-STABLE после добавления поддержки man:cpuctl[4].
|701103
|link:https://svnweb.freebsd.org/changeset/base/188281[188281]
-|February 7, 2009
-|7.1-STABLE after the merge of multi-/no-IPv4/v6 jails.
+|7 февраля 2009
+|7.1-STABLE после объединения клеток с поддержкой multi-/no-IPv4/v6.
|701104
|link:https://svnweb.freebsd.org/changeset/base/188625[188625]
-|February 14, 2009
-|7.1-STABLE after the store of the suspension owner in the struct mount, and introduction of vfs_susp_clean method into the struct vfsops.
+|14 февраля 2009
+|7.1-STABLE после сохранения владельца приостановки в структуре mount и добавления метода vfs_susp_clean в структуру vfsops.
|701105
|link:https://svnweb.freebsd.org/changeset/base/189740[189740]
-|March 12, 2009
-|7.1-STABLE after the incompatible change to the kern.ipc.shmsegs sysctl to allow allocating larger SysV shared memory segments on 64bit architectures.
+|12 марта 2009
+|7.1-STABLE после несовместимого изменения sysctl kern.ipc.shmsegs для выделения больших сегментов разделяемой памяти SysV на 64-битных архитектурах.
|701106
|link:https://svnweb.freebsd.org/changeset/base/189786[189786]
-|March 14, 2009
-|7.1-STABLE after the merge of a fix for POSIX semaphore wait operations.
+|14 марта 2009
+|7.1-STABLE после объединения исправления для операций ожидания семафоров POSIX.
|702000
|link:https://svnweb.freebsd.org/changeset/base/191099[191099]
-|April 15, 2009
+|15 апреля 2009
|7.2-RELEASE
|702100
|link:https://svnweb.freebsd.org/changeset/base/191091[191091]
-|April 15, 2009
-|7.2-STABLE after 7.2-RELEASE.
+|15 апреля 2009
+|7.2-STABLE после 7.2-RELEASE.
|702101
|link:https://svnweb.freebsd.org/changeset/base/192149[192149]
-|May 15, 2009
-|7.2-STABLE after man:ichsmb[4] was changed to use left-adjusted slave addressing to match other SMBus controller drivers.
+|15 мая 2009
+|7.2-STABLE после изменения man:ichsmb[4] для использования выравнивания по левому краю вторичной адресации, чтобы соответствовать другим драйверам контроллеров SMBus.
|702102
|link:https://svnweb.freebsd.org/changeset/base/193020[193020]
-|May 28, 2009
-|7.2-STABLE after MFC of the man:fdopendir[3] function.
+|28 мая 2009
+|7.2-STABLE после слияния из ветки man функции fdopendir[3].
|702103
|link:https://svnweb.freebsd.org/changeset/base/193638[193638]
-|June 6, 2009
-|7.2-STABLE after MFC of PmcTools.
+|6 июня 2009
+|7.2-STABLE после MFC PmcTools.
|702104
|link:https://svnweb.freebsd.org/changeset/base/195694[195694]
-|July 14, 2009
-|7.2-STABLE after MFC of the man:closefrom[2] system call.
+|14 июля 2009
+|7.2-STABLE после MFC системного вызова man:closefrom[2].
|702105
|link:https://svnweb.freebsd.org/changeset/base/196006[196006]
-|July 31, 2009
-|7.2-STABLE after MFC of the SYSVIPC ABI change.
+|31 июля 2009
+|7.2-STABLE после слияния изменения ABI SYSVIPC.
|702106
|link:https://svnweb.freebsd.org/changeset/base/197198[197198]
-|September 14, 2009
-|7.2-STABLE after MFC of the x86 PAT enhancements and addition of d_mmap_single() and the scatter/gather list VM object type.
+|14 сентября 2009
+|7.2-STABLE после слияния изменений (MFC) улучшений PAT для x86 и добавления `d_mmap_single()` и типа объекта VM со списком scatter/gather.
|703000
|link:https://svnweb.freebsd.org/changeset/base/203740[203740]
-|February 9, 2010
+|9 февраля 2010
|7.3-RELEASE
|703100
|link:https://svnweb.freebsd.org/changeset/base/203742[203742]
-|February 9, 2010
-|7.3-STABLE after 7.3-RELEASE.
+|9 февраля 2010
+|7.3-STABLE после 7.3-RELEASE.
|704000
|link:https://svnweb.freebsd.org/changeset/base/216647[216647]
-|December 22, 2010
+|22 декабря 2010
|7.4-RELEASE
|704100
|link:https://svnweb.freebsd.org/changeset/base/216658[216658]
-|December 22, 2010
-|7.4-STABLE after 7.4-RELEASE.
+|22 декабря 2010
+|7.4-STABLE после 7.4-RELEASE.
|704101
|link:https://svnweb.freebsd.org/changeset/base/221318[221318]
-|May 2, 2011
-|7.4-STABLE after the gcc MFC in rev link:https://svnweb.freebsd.org/changeset/base/221317[221317].
+|2 мая 2011
+|7.4-STABLE после MFC gcc в ревизии link:https://svnweb.freebsd.org/changeset/base/221317[221317].
|===
[[versions-6]]
-== FreeBSD 6 Versions
+== Версии FreeBSD 6
[[freebsd-versions-table-6]]
-.FreeBSD 6 `__FreeBSD_version` Values
+.Значения `__FreeBSD_version` в FreeBSD 6
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|600000
|link:https://svnweb.freebsd.org/changeset/base/133921[133921]
-|August 18, 2004
+|18 августа 2004
|6.0-CURRENT
|600001
|link:https://svnweb.freebsd.org/changeset/base/134396[134396]
-|August 27, 2004
-|6.0-CURRENT after permanently enabling PFIL_HOOKS in the kernel.
+|27 августа 2004
+|6.0-CURRENT после постоянного включения PFIL_HOOKS в ядре.
|600002
|link:https://svnweb.freebsd.org/changeset/base/134514[134514]
-|August 30, 2004
-|6.0-CURRENT after initial addition of ifi_epoch to struct if_data. Backed out after a few days. Do not use this value.
+|30 августа 2004
+|6.0-CURRENT после первоначального добавления `ifi_epoch` в структуру `if_data`. Отменено через несколько дней. Не используйте это значение.
|600003
|link:https://svnweb.freebsd.org/changeset/base/134933[134933]
-|September 8, 2004
-|6.0-CURRENT after the re-addition of the ifi_epoch member of struct if_data.
+|8 сентября 2004
+|6.0-CURRENT после повторного добавления члена `ifi_epoch` в структуру `if_data`.
|600004
|link:https://svnweb.freebsd.org/changeset/base/135920[135920]
-|September 29, 2004
-|6.0-CURRENT after addition of the struct inpcb argument to the pfil API.
+|29 сентября 2004
+|6.0-CURRENT после добавления аргумента struct inpcb в API pfil.
|600005
|link:https://svnweb.freebsd.org/changeset/base/136172[136172]
-|October 5, 2004
-|6.0-CURRENT after addition of the "-d DESTDIR" argument to newsyslog.
+|5 октября 2004
+|6.0-CURRENT после добавления аргумента "-d DESTDIR" в newsyslog.
|600006
|link:https://svnweb.freebsd.org/changeset/base/137192[137192]
-|November 4, 2004
-|6.0-CURRENT after addition of glibc style man:strftime[3] padding options.
+|4 ноября 2004
+|6.0-CURRENT после добавления опций заполнения в стиле glibc для man:strftime[3].
|600007
|link:https://svnweb.freebsd.org/changeset/base/138760[138760]
-|December 12, 2004
-|6.0-CURRENT after addition of 802.11 framework updates.
+|12 декабря 2004
+|6.0-CURRENT после добавления обновлений для фреймворка 802.11.
|600008
|link:https://svnweb.freebsd.org/changeset/base/140809[140809]
-|January 25, 2005
-|6.0-CURRENT after changes to VOP_*VOBJECT() functions and introduction of MNTK_MPSAFE flag for Giantfree filesystems.
+|25 января 2005
+|6.0-CURRENT после изменений в функциях `VOP_*VOBJECT()` и введения флага `MNTK_MPSAFE` для файловых систем, работающих без Giant.
|600009
|link:https://svnweb.freebsd.org/changeset/base/141250[141250]
-|February 4, 2005
-|6.0-CURRENT after addition of the cpufreq framework and drivers.
+|4 февраля 2005
+|6.0-CURRENT после добавления фреймворка cpufreq и драйверов.
|600010
|link:https://svnweb.freebsd.org/changeset/base/141394[141394]
-|February 6, 2005
-|6.0-CURRENT after importing OpenBSD's man:nc[1].
+|6 февраля 2005
+|6.0-CURRENT после импорта man:nc[1] из OpenBSD.
|600011
|link:https://svnweb.freebsd.org/changeset/base/141727[141727]
-|February 12, 2005
-|6.0-CURRENT after removing semblance of SVID2 `matherr()` support.
+|12 февраля 2005
+|6.0-CURRENT после удаления подобия поддержки `matherr()` из SVID2.
|600012
|link:https://svnweb.freebsd.org/changeset/base/141940[141940]
-|February 15, 2005
-|6.0-CURRENT after increase of default thread stacks' size.
+|15 февраля 2005
+|6.0-CURRENT после увеличения размера стеков потоков по умолчанию.
|600013
|link:https://svnweb.freebsd.org/changeset/base/142089[142089]
-|February 19, 2005
-|6.0-CURRENT after fixes in [.filename]#<src/include/stdbool.h># and [.filename]#<src/sys/i386/include/_types.h># for using the GCC-compatibility of the Intel C/C++ compiler.
+|19 февраля 2005
+|6.0-CURRENT после исправлений в [.filename]#<src/include/stdbool.h># и [.filename]#<src/sys/i386/include/_types.h># для обеспечения совместимости с GCC компилятора Intel C/C++.
|600014
|link:https://svnweb.freebsd.org/changeset/base/142184[142184]
-|February 21, 2005
-|6.0-CURRENT after EOVERFLOW checks in man:vswprintf[3] fixed.
+|21 февраля 2005
+|6.0-CURRENT после исправления проверок EOVERFLOW в man:vswprintf[3].
|600015
|link:https://svnweb.freebsd.org/changeset/base/142501[142501]
-|February 25, 2005
-|6.0-CURRENT after changing the struct if_data member, ifi_epoch, from wall clock time to uptime.
+|25 февраля 2005
+|6.0-CURRENT после изменения члена структуры `if_data`, `ifi_epoch`, с времени настенных часов на время работы системы.
|600016
|link:https://svnweb.freebsd.org/changeset/base/142582[142582]
-|February 26, 2005
-|6.0-CURRENT after LC_CTYPE disk format changed.
+|26 февраля 2005
+|6.0-CURRENT после изменения формата диска LC_CTYPE.
|600017
|link:https://svnweb.freebsd.org/changeset/base/142683[142683]
-|February 27, 2005
-|6.0-CURRENT after NLS catalogs disk format changed.
+|27 февраля 2005
+|6.0-CURRENT после изменения формата диска каталогов NLS.
|600018
|link:https://svnweb.freebsd.org/changeset/base/142686[142686]
-|February 27, 2005
-|6.0-CURRENT after LC_COLLATE disk format changed.
+|27 февраля 2005
+|6.0-CURRENT после изменения формата диска LC_COLLATE.
|600019
|link:https://svnweb.freebsd.org/changeset/base/142752[142752]
-|February 28, 2005
-|Installation of acpica includes into /usr/include.
+|28 февраля 2005
+|Установка `acpica` включает файлы в /usr/include.
|600020
|link:https://svnweb.freebsd.org/changeset/base/143308[143308]
-|March 9, 2005
-|Addition of MSG_NOSIGNAL flag to man:send[2] API.
+|9 марта 2005
+|Добавление флага MSG_NOSIGNAL в API man:send[2].
|600021
|link:https://svnweb.freebsd.org/changeset/base/143746[143746]
-|March 17, 2005
-|Addition of fields to cdevsw
+|17 марта 2005
+|Добавление полей в cdevsw
|600022
|link:https://svnweb.freebsd.org/changeset/base/143901[143901]
-|March 21, 2005
-|Removed gtar from base system.
+|21 марта 2005
+|Удален gtar из базовой системы.
|600023
|link:https://svnweb.freebsd.org/changeset/base/144980[144980]
-|April 13, 2005
-|LOCAL_CREDS, LOCAL_CONNWAIT socket options added to man:unix[4].
+|13 апреля 2005
+|Добавлены параметры сокета LOCAL_CREDS, LOCAL_CONNWAIT в man:unix[4].
|600024
|link:https://svnweb.freebsd.org/changeset/base/145565[145565]
-|April 19, 2005
-|man:hwpmc[4] and related tools added to 6.0-CURRENT.
+|19 апреля 2005
+|man:hwpmc[4] и связанные инструменты добавлены в 6.0-CURRENT.
|600025
|link:https://svnweb.freebsd.org/changeset/base/145565[145565]
-|April 26, 2005
-|struct icmphdr added to 6.0-CURRENT.
+|26 апреля 2005
+|Структура `icmphdr` добавлена в 6.0-CURRENT.
|600026
|link:https://svnweb.freebsd.org/changeset/base/145843[145843]
-|May 3, 2005
-|pf updated to 3.7.
+|3 мая 2005
+|pf обновлен до версии 3.7.
|600027
|link:https://svnweb.freebsd.org/changeset/base/145966[145966]
-|May 6, 2005
-|Kernel libalias and ng_nat introduced.
+|6 мая 2005
+|Добавлены libalias в ядре и `ng_nat`.
|600028
|link:https://svnweb.freebsd.org/changeset/base/146191[146191]
-|May 13, 2005
-|POSIX man:ttyname_r[3] made available through unistd.h and libc.
+|13 мая 2005
+|POSIX man:ttyname_r[3], доступный через unistd.h и libc.
|600029
|link:https://svnweb.freebsd.org/changeset/base/146780[146780]
-|May 29, 2005
-|6.0-CURRENT after libpcap updated to v0.9.1 alpha 096.
+|29 мая 2005
+|6.0-CURRENT после обновления libpcap до v0.9.1 alpha 096.
|600030
|link:https://svnweb.freebsd.org/changeset/base/146988[146988]
-|June 5, 2005
-|6.0-CURRENT after importing NetBSD's man:if_bridge[4].
+|5 июня 2005
+|6.0-CURRENT после импорта man:if_bridge[4] из NetBSD.
|600031
|link:https://svnweb.freebsd.org/changeset/base/147256[147256]
-|June 10, 2005
-|6.0-CURRENT after struct ifnet was broken out of the driver softcs.
+|10 июня 2005
+|6.0-CURRENT после того, как структура ifnet была вынесена из `softcs` драйвера.
|600032
|link:https://svnweb.freebsd.org/changeset/base/147898[147898]
-|July 11, 2005
-|6.0-CURRENT after the import of libpcap v0.9.1.
+|11 июля 2005
+|6.0-CURRENT после импорта libpcap v0.9.1.
|600033
|link:https://svnweb.freebsd.org/changeset/base/148388[148388]
-|July 25, 2005
-|6.0-STABLE after bump of all shared library versions that had not been changed since RELENG_5.
+|25 июля 2005
+|6.0-STABLE после увеличения версий всех общих библиотек, которые не изменялись с RELENG_5.
|600034
|link:https://svnweb.freebsd.org/changeset/base/149040[149040]
-|August 13, 2005
-|6.0-STABLE after credential argument is added to dev_clone event handler. 6.0-RELEASE.
+|13 августа 2005
+|6.0-STABLE после добавления аргумента credential в обработчик события `dev_clone`. 6.0-RELEASE.
|600100
|link:https://svnweb.freebsd.org/changeset/base/151958[151958]
-|November 1, 2005
-|6.0-STABLE after 6.0-RELEASE
+|1 ноября 2005
+|6.0-STABLE после 6.0-RELEASE
|600101
|link:https://svnweb.freebsd.org/changeset/base/153601[153601]
-|December 21, 2005
-|6.0-STABLE after incorporating scripts from the local_startup directories into the base man:rcorder[8].
+|21 декабря 2005
+|6.0-STABLE после включения скриптов из каталогов `local_startup` в базовый man:rcorder[8].
|600102
|link:https://svnweb.freebsd.org/changeset/base/153912[153912]
-|December 30, 2005
-|6.0-STABLE after updating the ELF types and constants.
+|30 декабря 2005
+|6.0-STABLE после обновления типов и констант ELF.
|600103
|link:https://svnweb.freebsd.org/changeset/base/154396[154396]
-|January 15, 2006
-|6.0-STABLE after MFC of man:pidfile[3] API.
+|15 января 2006
+|6.0-STABLE после переноса изменений (MFC) API man:pidfile[3].
|600104
|link:https://svnweb.freebsd.org/changeset/base/154453[154453]
-|January 17, 2006
-|6.0-STABLE after MFC of ldconfig_local_dirs change.
+|17 января 2006
+|6.0-STABLE после MFC изменений ldconfig_local_dirs.
|600105
|link:https://svnweb.freebsd.org/changeset/base/156019[156019]
-|February 26, 2006
-|6.0-STABLE after NLS catalog support of man:csh[1].
+|26 февраля 2006
+|6.0-STABLE после поддержки каталога NLS в man:csh[1].
|601000
|link:https://svnweb.freebsd.org/changeset/base/158330[158330]
-|May 6, 2006
+|6 мая 2006
|6.1-RELEASE
|601100
|link:https://svnweb.freebsd.org/changeset/base/158331[158331]
-|May 6, 2006
-|6.1-STABLE after 6.1-RELEASE.
+|6 мая 2006
+|6.1-STABLE после 6.1-RELEASE.
|601101
|link:https://svnweb.freebsd.org/changeset/base/159861[159861]
-|June 22, 2006
-|6.1-STABLE after the import of csup.
+|22 июня 2006
+|6.1-STABLE после импорта `csup`.
|601102
|link:https://svnweb.freebsd.org/changeset/base/160253[160253]
-|July 11, 2006
-|6.1-STABLE after the man:iwi[4] update.
+|11 июля 2006
+|6.1-STABLE после обновления man:iwi[4].
|601103
|link:https://svnweb.freebsd.org/changeset/base/160429[160429]
-|July 17, 2006
-|6.1-STABLE after the resolver update to BIND9, and exposure of reentrant version of netdb functions.
+|17 июля 2006
+|6.1-STABLE после обновления резолвера до BIND9 и добавления реентерабельной версии функций `netdb`.
|601104
|link:https://svnweb.freebsd.org/changeset/base/161098[161098]
-|August 8, 2006
-|6.1-STABLE after DSO (dynamic shared objects) support has been enabled in OpenSSL.
+|8 августа 2006
+|6.1-STABLE после включения поддержки DSO (динамически разделяемых объектов) в OpenSSL.
|601105
|link:https://svnweb.freebsd.org/changeset/base/161900[161900]
-|September 2, 2006
-|6.1-STABLE after 802.11 fixups changed the api for the IEEE80211_IOC_STA_INFO ioctl.
+|2 сентября 2006
+|6.1-STABLE после исправлений 802.11 изменил API для ioctl IEEE80211_IOC_STA_INFO.
|602000
|link:https://svnweb.freebsd.org/changeset/base/164312[164312]
-|November 15, 2006
+|15 ноября 2006
|6.2-RELEASE
|602100
|link:https://svnweb.freebsd.org/changeset/base/162329[162329]
-|September 15, 2006
-|6.2-STABLE after 6.2-RELEASE.
+|15 сентября 2006
+|6.2-STABLE после 6.2-RELEASE.
|602101
|link:https://svnweb.freebsd.org/changeset/base/165122[165122]
-|December 12, 2006
-|6.2-STABLE after the addition of Wi-Spy quirk.
+|12 декабря 2006
+|6.2-STABLE после добавления особенности Wi-Spy.
|602102
|link:https://svnweb.freebsd.org/changeset/base/165596[165596]
-|December 28, 2006
-|6.2-STABLE after pci_find_extcap() addition.
+|28 декабря 2006
+|6.2-STABLE после добавления `pci_find_extcap()`.
|602103
|link:https://svnweb.freebsd.org/changeset/base/166039[166039]
-|January 16, 2007
-|6.2-STABLE after MFC of dlsym change to look for a requested symbol both in specified dso and its implicit dependencies.
+|16 января 2007
+|6.2-STABLE после MFC изменения `dlsym` для поиска запрошенного символа как в указанном DSO, так и в его неявных зависимостях.
|602104
|link:https://svnweb.freebsd.org/changeset/base/166314[166314]
-|January 28, 2007
-|6.2-STABLE after MFC of man:ng_deflate[4] and man:ng_pred1[4] netgraph nodes and new compression and encryption modes for man:ng_ppp[4] node.
+|28 января 2007
+|6.2-STABLE после слияния изменений (MFC) узлов netgraph man:ng_deflate[4] и man:ng_pred1[4], а также новых режимов сжатия и шифрования для узла man:ng_ppp[4].
|602105
|link:https://svnweb.freebsd.org/changeset/base/166840[166840]
-|February 20, 2007
-|6.2-STABLE after MFC of BSD licensed version of man:gzip[1] ported from NetBSD.
+|20 февраля 2007
+|6.2-STABLE после переноса (MFC) версии man:gzip[1] под лицензией BSD из NetBSD.
|602106
|link:https://svnweb.freebsd.org/changeset/base/168133[168133]
-|March 31, 2007
-|6.2-STABLE after MFC of PCI MSI and MSI-X support.
+|31 марта 2007
+|6.2-STABLE после слияния изменений (MFC) поддержки PCI MSI и MSI-X.
|602107
|link:https://svnweb.freebsd.org/changeset/base/168438[168438]
-|April 6, 2007
-|6.2-STABLE after MFC of ncurses 5.6 and wide character support.
+|6 апреля 2007
+|6.2-STABLE после слияния изменений (MFC) ncurses 5.6 с поддержкой широких символов.
|602108
|link:https://svnweb.freebsd.org/changeset/base/168611[168611]
-|April 11, 2007
-|6.2-STABLE after MFC of CAM 'SG' peripheral device, which implements a subset of Linux SCSI SG passthrough device API.
+|11 апреля 2007
+|6.2-STABLE после слияния изменений (MFC) для периферийного устройства CAM 'SG', реализующего подмножество API сквозного устройства SCSI SG в Linux.
|602109
|link:https://svnweb.freebsd.org/changeset/base/168805[168805]
-|April 17, 2007
-|6.2-STABLE after MFC of readline 5.2 patchset 002.
+|17 апреля 2007
+|6.2-STABLE после MFC набора исправлений readline 5.2 patch-set 002.
|602110
|link:https://svnweb.freebsd.org/changeset/base/169222[169222]
-|May 2, 2007
-|6.2-STABLE after MFC of pmap_invalidate_cache(), pmap_change_attr(), pmap_mapbios(), pmap_mapdev_attr(), and pmap_unmapbios() for amd64 and i386.
+|2 мая 2007
+|6.2-STABLE после слияния изменений (MFC) функций `pmap_invalidate_cache()`, `pmap_change_attr()`, `pmap_mapbios()`, `pmap_mapdev_attr()` и `pmap_unmapbios()` для архитектур amd64 и i386.
|602111
|link:https://svnweb.freebsd.org/changeset/base/170556[170556]
-|June 11, 2007
-|6.2-STABLE after MFC of BOP_BDFLUSH and caused breakage of the filesystem modules KBI.
+|11 июня 2007
+|6.2-STABLE после слияния изменений BOP_BDFLUSH, что привело к нарушению KBI модулей файловой системы.
|602112
|link:https://svnweb.freebsd.org/changeset/base/172284[172284]
-|September 21, 2007
-|6.2-STABLE after libutil(3) MFC's.
+|21 сентября 2007
+|6.2-STABLE после man:libutil[3] MFC's.
|602113
|link:https://svnweb.freebsd.org/changeset/base/172986[172986]
-|October 25, 2007
-|6.2-STABLE after MFC of wide and single byte ctype separation. Newly compiled binary that references to ctype.h may require a new symbol, __mb_sb_limit, which is not available on older systems.
+|25 октября 2007
+|6.2-STABLE после слияния изменений (MFC) разделения широких и однобайтовых символов ctype. Вновь скомпилированные двоичные файлы, ссылающиеся на ctype.h, могут требовать новый символ `__mb_sb_limit`, который недоступен в старых системах.
|602114
|link:https://svnweb.freebsd.org/changeset/base/173170[173170]
-|October 30, 2007
-|6.2-STABLE after ctype ABI forward compatibility restored.
+|30 октября 2007
+|6.2-STABLE после восстановления прямой совместимости ABI ctype.
|602115
|link:https://svnweb.freebsd.org/changeset/base/173794[173794]
-|November 21, 2007
-|6.2-STABLE after back out of wide and single byte ctype separation.
+|21 ноября 2007
+|6.2-STABLE после отмены разделения широких и однобайтовых символов ctype.
|603000
|link:https://svnweb.freebsd.org/changeset/base/173897[173897]
-|November 25, 2007
+|25 ноября 2007
|6.3-RELEASE
|603100
|link:https://svnweb.freebsd.org/changeset/base/173891[173891]
-|November 25, 2007
-|6.3-STABLE after 6.3-RELEASE.
+|25 ноября 2007
+|6.3-STABLE после 6.3-RELEASE.
-|(not changed)
+|(не изменено)
|link:https://svnweb.freebsd.org/changeset/base/174434[174434]
-|December 7, 2007
-|6.3-STABLE after fixing multibyte type support in bit macro.
+|7 декабря 2007
+|6.3-STABLE после исправления поддержки многобайтовых типов в макросе bit.
|603102
|link:https://svnweb.freebsd.org/changeset/base/178459[178459]
-|April 24, 2008
-|6.3-STABLE after adding l_sysid to struct flock.
+|24 апреля 2008
+|6.3-STABLE после добавления `l_sysid` в структуру flock.
|603103
|link:https://svnweb.freebsd.org/changeset/base/179367[179367]
-|May 27, 2008
-|6.3-STABLE after MFC of the man:memrchr[3] function.
+|27 мая 2008
+|6.3-STABLE после MFC функции man:memrchr[3].
|603104
|link:https://svnweb.freebsd.org/changeset/base/179810[179810]
-|June 15, 2008
-|6.3-STABLE after MFC of support for `:u` variable modifier in man:make[1].
+|15 июня 2008
+|6.3-STABLE после MFC поддержки модификатора переменной `:u` в man:make[1].
|604000
|link:https://svnweb.freebsd.org/changeset/base/183583[183583]
-|October 4, 2008
+|4 октября 2008
|6.4-RELEASE
|604100
|link:https://svnweb.freebsd.org/changeset/base/183584[183584]
-|October 4, 2008
-|6.4-STABLE after 6.4-RELEASE.
+|4 октября 2008
+|6.4-STABLE после 6.4-RELEASE.
|===
[[versions-5]]
-== FreeBSD 5 Versions
+== Версии FreeBSD 5
[[freebsd-versions-table-5]]
-.FreeBSD 5 `__FreeBSD_version` Values
+.Значения `__FreeBSD_version` в FreeBSD 5
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|500000
|link:https://svnweb.freebsd.org/changeset/base/58009[58009]
-|March 13, 2000
+|13 марта 2000
|5.0-CURRENT
|500001
|link:https://svnweb.freebsd.org/changeset/base/59348[59348]
-|April 18, 2000
-|5.0-CURRENT after adding addition ELF header fields, and changing our ELF binary branding method.
+|18 апреля 2000
+|5.0-CURRENT после добавления дополнительных полей заголовка ELF и изменения метода маркировки ELF-бинарников.
|500002
|link:https://svnweb.freebsd.org/changeset/base/59906[59906]
-|May 2, 2000
-|5.0-CURRENT after kld metadata changes.
+|2 мая 2000
+|5.0-CURRENT после изменений метаданных kld.
|500003
|link:https://svnweb.freebsd.org/changeset/base/60688[60688]
-|May 18, 2000
-|5.0-CURRENT after buf/bio changes.
+|18 мая 2000
+|5.0-CURRENT после изменений в buf/bio.
|500004
|link:https://svnweb.freebsd.org/changeset/base/60936[60936]
-|May 26, 2000
-|5.0-CURRENT after binutils upgrade.
+|26 мая 2000
+|5.0-CURRENT после обновления binutils.
|500005
|link:https://svnweb.freebsd.org/changeset/base/61221[61221]
-|June 3, 2000
-|5.0-CURRENT after merging libxpg4 code into libc and after TASKQ interface introduction.
+|3 июня 2000
+|5.0-CURRENT после объединения кода libxpg4 с libc и после введения интерфейса TASKQ.
|500006
|link:https://svnweb.freebsd.org/changeset/base/61500[61500]
-|June 10, 2000
-|5.0-CURRENT after the addition of AGP interfaces.
+|10 июня 2000
+|5.0-CURRENT после добавления интерфейсов AGP.
|500007
|link:https://svnweb.freebsd.org/changeset/base/62235[62235]
-|June 29, 2000
-|5.0-CURRENT after Perl upgrade to 5.6.0
+|29 июня 2000
+|5.0-CURRENT после обновления Perl до версии 5.6.0
|500008
|link:https://svnweb.freebsd.org/changeset/base/62764[62764]
-|July 7, 2000
-|5.0-CURRENT after the update of KAME code to 2000/07 sources.
+|7 июля 2000
+|5.0-CURRENT после обновления кода KAME до исходников от 2000/07.
|500009
|link:https://svnweb.freebsd.org/changeset/base/63154[63154]
-|July 14, 2000
-|5.0-CURRENT after ether_ifattach() and ether_ifdetach() changes.
+|14 июля 2000
+|5.0-CURRENT после изменений в `ether_ifattach()` и `ether_ifdetach()`.
|500010
|link:https://svnweb.freebsd.org/changeset/base/63265[63265]
-|July 16, 2000
-|5.0-CURRENT after changing mtree defaults back to original variant, adding -L to follow symlinks.
+|16 июля 2000
+|5.0-CURRENT после изменения настроек mtree обратно на исходный вариант, с добавлением -L для следования по символьным ссылкам.
|500011
|link:https://svnweb.freebsd.org/changeset/base/63459[63459]
-|July 18, 2000
-|5.0-CURRENT after kqueue API changed.
+|18 июля 2000
+|5.0-CURRENT после изменения API kqueue.
|500012
|link:https://svnweb.freebsd.org/changeset/base/65353[65353]
-|September 2, 2000
-|5.0-CURRENT after man:setproctitle[3] moved from libutil to libc.
+|2 сентября 2000
+|5.0-CURRENT после переноса man:setproctitle[3] из libutil в libc.
|500013
|link:https://svnweb.freebsd.org/changeset/base/65671[65671]
-|September 10, 2000
-|5.0-CURRENT after the first SMPng commit.
+|10 сентября 2000
+|5.0-CURRENT после первого коммита SMPng.
|500014
|link:https://svnweb.freebsd.org/changeset/base/70650[70650]
-|January 4, 2001
-|5.0-CURRENT after <sys/select.h> moved to <sys/selinfo.h>.
+|4 января 2001
+|5.0-CURRENT после перемещения <sys/select.h> в <sys/selinfo.h>.
|500015
|link:https://svnweb.freebsd.org/changeset/base/70894[70894]
-|January 10, 2001
-|5.0-CURRENT after combining libgcc.a and libgcc_r.a, and associated GCC linkage changes.
+|10 января 2001
+|5.0-CURRENT после объединения libgcc.a и libgcc_r.a, а также связанных изменений в компоновке GCC.
|500016
|link:https://svnweb.freebsd.org/changeset/base/71583[71583]
-|January 24, 2001
-|5.0-CURRENT after change allowing libc and libc_r to be linked together, deprecating -pthread option.
+|24 января 2001
+|5.0-CURRENT после изменения, разрешающего совместную линковку libc и libc_r, с объявлением устаревшим параметра -pthread.
|500017
|link:https://svnweb.freebsd.org/changeset/base/72650[72650]
-|February 18, 2001
-|5.0-CURRENT after switch from struct ucred to struct xucred to stabilize kernel-exported API for mountd et al.
+|18 февраля 2001
+|5.0-CURRENT после перехода со структуры `ucred` на структуру `xucred` для стабилизации API, экспортируемого ядром, для mountd и других.
|500018
|link:https://svnweb.freebsd.org/changeset/base/72975[72975]
-|February 24, 2001
-|5.0-CURRENT after addition of CPUTYPE make variable for controlling CPU-specific optimizations.
+|24 февраля 2001
+|5.0-CURRENT после добавления переменной сборки CPUTYPE для управления оптимизациями под конкретный процессор.
|500019
|link:https://svnweb.freebsd.org/changeset/base/77937[77937]
-|June 9, 2001
-|5.0-CURRENT after moving machine/ioctl_fd.h to sys/fdcio.h
+|9 июня 2001
+|5.0-CURRENT после перемещения machine/ioctl_fd.h в sys/fdcio.h
|500020
|link:https://svnweb.freebsd.org/changeset/base/78304[78304]
-|June 15, 2001
-|5.0-CURRENT after locale names renaming.
+|15 июня 2001
+|5.0-CURRENT после переименования названий локалей.
|500021
|link:https://svnweb.freebsd.org/changeset/base/78632[78632]
-|June 22, 2001
-|5.0-CURRENT after Bzip2 import. Also signifies removal of S/Key.
+|22 июня 2001
+|5.0-CURRENT после импорта Bzip2. Также означает удаление S/Key.
|500022
|link:https://svnweb.freebsd.org/changeset/base/83435[83435]
-|July 12, 2001
-|5.0-CURRENT after SSE support.
+|12 июля 2001
+|5.0-CURRENT после поддержки SSE.
|500023
|link:https://svnweb.freebsd.org/changeset/base/83435[83435]
-|September 14, 2001
-|5.0-CURRENT after KSE Milestone 2.
+|14 сентября 2001
+|5.0-CURRENT после второго этапа KSE.
|500024
|link:https://svnweb.freebsd.org/changeset/base/84324[84324]
-|October 1, 2001
-|5.0-CURRENT after d_thread_t, and moving UUCP to ports.
+|1 октября 2001
+|5.0-CURRENT после `d_thread_t` и перемещение UUCP в порты.
|500025
|link:https://svnweb.freebsd.org/changeset/base/84481[84481]
-|October 4, 2001
-|5.0-CURRENT after ABI change for descriptor and creds passing on 64 bit platforms.
+|4 октября 2001
+|5.0-CURRENT после изменения ABI для передачи дескрипторов и `creds` на 64-битных платформах.
|500026
|link:https://svnweb.freebsd.org/changeset/base/84710[84710]
-|October 9, 2001
-|5.0-CURRENT after moving to XFree86 4 by default for package builds, and after the new libc strnstr() function was added.
+|9 октября 2001
+|5.0-CURRENT после перехода на XFree86 4 по умолчанию для сборки пакетов и после добавления новой функции `strnstr()` в библиотеку libc.
|500027
|link:https://svnweb.freebsd.org/changeset/base/84743[84743]
-|October 10, 2001
-|5.0-CURRENT after the new libc strcasestr() function was added.
+|10 октября 2001
+|5.0-CURRENT после добавления новой функции `strcasestr()` в библиотеку libc.
|500028
|link:https://svnweb.freebsd.org/changeset/base/87879[87879]
-|December 14, 2001
-|5.0-CURRENT after the userland components of smbfs were imported.
+|14 декабря 2001
+|5.0-CURRENT после импорта компонентов пользовательского пространства smbfs.
-|(not changed)
-|
-|
-|5.0-CURRENT after the new C99 specific-width integer types were added.
+|(не изменено)
+|
+|
+|5.0-CURRENT после добавления новых целочисленных типов фиксированной ширины C99.
|500029
|link:https://svnweb.freebsd.org/changeset/base/89938[89938]
-|January 29, 2002
-|5.0-CURRENT after a change was made in the return value of man:sendfile[2].
+|29 января 2002
+|5.0-CURRENT после изменения возвращаемого значения man:sendfile[2].
|500030
|link:https://svnweb.freebsd.org/changeset/base/90711[90711]
-|February 15, 2002
-|5.0-CURRENT after the introduction of the type `fflags_t`, which is the appropriate size for file flags.
+|15 февраля 2002
+|5.0-CURRENT после введения типа `fflags_t`, который имеет подходящий размер для флагов файлов.
|500031
|link:https://svnweb.freebsd.org/changeset/base/91203[91203]
-|February 24, 2002
-|5.0-CURRENT after the usb structure element rename.
+|24 февраля 2002
+|5.0-CURRENT после переименования элемента структуры usb.
|500032
|link:https://svnweb.freebsd.org/changeset/base/92453[92453]
-|March 16, 2002
-|5.0-CURRENT after the introduction of Perl 5.6.1.
+|16 марта 2002
+|5.0-CURRENT после внедрения Perl 5.6.1.
|500033
|link:https://svnweb.freebsd.org/changeset/base/93722[93722]
-|April 3, 2002
-|5.0-CURRENT after the `sendmail_enable` man:rc.conf[5] variable was made to take the value `NONE`.
+|3 апреля 2002
+|5.0-CURRENT после того, как переменная `sendmail_enable` из man:rc.conf[5] стала принимать значение `NONE`.
|500034
|link:https://svnweb.freebsd.org/changeset/base/95831[95831]
-|April 30, 2002
-|5.0-CURRENT after mtx_init() grew a third argument.
+|30 апреля 2002
+|5.0-CURRENT после того, как `mtx_init()` получил третий аргумент.
|500035
|link:https://svnweb.freebsd.org/changeset/base/96498[96498]
-|May 13, 2002
-|5.0-CURRENT with Gcc 3.1.
+|13 мая 2002
+|5.0-CURRENT с Gcc 3.1.
|500036
|link:https://svnweb.freebsd.org/changeset/base/96781[96781]
-|May 17, 2002
-|5.0-CURRENT without Perl in /usr/src
+|17 мая 2002
+|5.0-CURRENT без Perl в /usr/src
|500037
|link:https://svnweb.freebsd.org/changeset/base/97516[97516]
-|May 29, 2002
-|5.0-CURRENT after the addition of man:dlfunc[3]
+|29 мая 2002
+|5.0-CURRENT после добавления man:dlfunc[3]
|500038
|link:https://svnweb.freebsd.org/changeset/base/100591[100591]
-|July 24, 2002
-|5.0-CURRENT after the types of some struct sockbuf members were changed and the structure was reordered.
+|24 июля 2002
+|5.0-CURRENT после изменения типов некоторых членов структуры `sockbuf` и её переупорядочивания.
|500039
|link:https://svnweb.freebsd.org/changeset/base/102757[102757]
-|September 1, 2002
-|5.0-CURRENT after GCC 3.2.1 import. Also after headers stopped using _BSD_FOO_T_ and started using _FOO_T_DECLARED. This value can also be used as a conservative estimate of the start of man:bzip2[1] package support.
+|1 сентября 2002
+|5.0-CURRENT после импорта GCC 3.2.1. Также после того, как заголовки перестали использовать _BSD_FOO_T_ и начали использовать _FOO_T_DECLARED. Это значение также можно использовать как консервативную оценку начала поддержки пакета man:bzip2[1].
|500040
|link:https://svnweb.freebsd.org/changeset/base/103675[103675]
-|September 20, 2002
-|5.0-CURRENT after various changes to disk functions were made in the name of removing dependency on disklabel structure internals.
+|20 сентября 2002
+|5.0-CURRENT после внесения различных изменений в функции работы с дисками, направленных на устранение зависимости от внутренней структуры disklabel.
|500041
|link:https://svnweb.freebsd.org/changeset/base/104250[104250]
-|October 1, 2002
-|5.0-CURRENT after the addition of man:getopt_long[3] to libc.
+|1 октября 2002
+|5.0-CURRENT после добавления man:getopt_long[3] в libc.
|500042
|link:https://svnweb.freebsd.org/changeset/base/105178[105178]
-|October 15, 2002
-|5.0-CURRENT after Binutils 2.13 upgrade, which included new FreeBSD emulation, vec, and output format.
+|15 октября 2002
+|5.0-CURRENT после обновления Binutils 2.13, которое включило новую эмуляцию FreeBSD, `vec` и формат вывода.
|500043
|link:https://svnweb.freebsd.org/changeset/base/106289[106289]
-|November 1, 2002
-|5.0-CURRENT after adding weak pthread_XXX stubs to libc, obsoleting libXThrStub.so. 5.0-RELEASE.
+|1 ноября 2002
+|5.0-CURRENT после добавления слабых заглушек pthread_XXX в libc, что сделало устаревшей libXThrStub.so. 5.0-RELEASE.
|500100
|link:https://svnweb.freebsd.org/changeset/base/109405[109405]
-|January 17, 2003
-|5.0-CURRENT after branching for RELENG_5_0
+|17 января 2003
+|5.0-CURRENT после ветвления для RELENG_5_0
|500101
|link:https://svnweb.freebsd.org/changeset/base/111120[111120]
-|February 19, 2003
-|<sys/dkstat.h> is empty. Do not include it.
+|19 февраля 2003
+|<sys/dkstat.h> пустой. Не включайте его.
|500102
|link:https://svnweb.freebsd.org/changeset/base/111482[111482]
-|February 25, 2003
-|5.0-CURRENT after the d_mmap_t interface change.
+|25 февраля 2003
+|5.0-CURRENT после изменения интерфейса d_mmap_t.
|500103
|link:https://svnweb.freebsd.org/changeset/base/111540[111540]
-|February 26, 2003
-|5.0-CURRENT after taskqueue_swi changed to run without Giant, and taskqueue_swi_giant added to run with Giant.
+|26 февраля 2003
+|5.0-CURRENT после изменения `taskqueue_swi` для работы без Giant и добавления `taskqueue_swi_giant` для работы с Giant.
|500104
|link:https://svnweb.freebsd.org/changeset/base/111600[111600]
-|February 27, 2003
-|cdevsw_add() and cdevsw_remove() no longer exists. Appearance of MAJOR_AUTO allocation facility.
+|27 февраля 2003
+|`cdevsw_add()` и `cdevsw_remove()` больше не существуют. Появление средства выделения `MAJOR_AUTO`.
|500105
|link:https://svnweb.freebsd.org/changeset/base/111864[111864]
-|March 4, 2003
-|5.0-CURRENT after new cdevsw initialization method.
+|4 марта 2003
+|5.0-CURRENT после новой инициализации метода cdevsw.
|500106
|link:https://svnweb.freebsd.org/changeset/base/112007[112007]
-|March 8, 2003
-|devstat_add_entry() has been replaced by devstat_new_entry()
+|8 марта 2003
+|`devstat_add_entry()` был заменён на `devstat_new_entry()`
|500107
|link:https://svnweb.freebsd.org/changeset/base/112288[112288]
-|March 15, 2003
-|Devstat interface change; see sys/sys/param.h 1.149
+|15 марта 2003
+|Изменение интерфейса `devstat`; см. sys/sys/param.h 1.149
|500108
|link:https://svnweb.freebsd.org/changeset/base/112300[112300]
-|March 15, 2003
-|Token-Ring interface changes.
+|15 марта 2003
+|Изменения в интерфейсе Token-Ring.
|500109
|link:https://svnweb.freebsd.org/changeset/base/112571[112571]
-|March 25, 2003
-|Addition of vm_paddr_t.
+|25 марта 2003
+|Добавление `vm_paddr_t`.
|500110
|link:https://svnweb.freebsd.org/changeset/base/112741[112741]
-|March 28, 2003
-|5.0-CURRENT after man:realpath[3] has been made thread-safe
+|28 марта 2003
+|5.0-CURRENT после того, как man:realpath[3] стал потокобезопасным
|500111
|link:https://svnweb.freebsd.org/changeset/base/113273[113273]
-|April 9, 2003
-|5.0-CURRENT after man:usbhid[3] has been synced with NetBSD
+|9 апреля 2003
+|5.0-CURRENT после синхронизации man:usbhid[3] с NetBSD
|500112
|link:https://svnweb.freebsd.org/changeset/base/113597[113597]
-|April 17, 2003
-|5.0-CURRENT after new NSS implementation and addition of POSIX.1 getpw*_r, getgr*_r functions
+|17 апреля 2003
+|5.0-CURRENT после новой реализации NSS и добавления функций POSIX.1 getpw*_r, getgr*_r
|500113
|link:https://svnweb.freebsd.org/changeset/base/114492[114492]
-|May 2, 2003
-|5.0-CURRENT after removal of the old rc system.
+|2 мая 2003
+|5.0-CURRENT после удаления старой системы rc.
|501000
|link:https://svnweb.freebsd.org/changeset/base/115816[115816]
-|June 4, 2003
+|4 июня 2003
|5.1-RELEASE.
|501100
|link:https://svnweb.freebsd.org/changeset/base/115710[115710]
-|June 2, 2003
-|5.1-CURRENT after branching for RELENG_5_1.
+|2 июня 2003
+|5.1-CURRENT после ветвления для RELENG_5_1.
|501101
|link:https://svnweb.freebsd.org/changeset/base/117025[117025]
-|June 29, 2003
-|5.1-CURRENT after correcting the semantics of man:sigtimedwait[2] and man:sigwaitinfo[2].
+|29 июня 2003
+|5.1-CURRENT после исправления семантики man:sigtimedwait[2] и man:sigwaitinfo[2].
|501102
|link:https://svnweb.freebsd.org/changeset/base/117191[117191]
-|July 3, 2003
-|5.1-CURRENT after adding the lockfunc and lockfuncarg fields to man:bus_dma_tag_create[9].
+|3 июля 2003
+|5.1-CURRENT после добавления полей `lockfunc` и `lockfuncarg` в man:bus_dma_tag_create[9].
|501103
|link:https://svnweb.freebsd.org/changeset/base/118241[118241]
-|July 31, 2003
-|5.1-CURRENT after GCC 3.3.1-pre 20030711 snapshot integration.
+|31 июля 2003
+|5.1-CURRENT после интеграции снимка GCC 3.3.1-pre 20030711.
|501104
|link:https://svnweb.freebsd.org/changeset/base/118511[118511]
-|August 5, 2003
-|5.1-CURRENT 3ware API changes to twe.
+|5 августа 2003
+|5.1-CURRENT Изменения API 3ware в twe.
|501105
|link:https://svnweb.freebsd.org/changeset/base/119021[119021]
-|August 17, 2003
-|5.1-CURRENT dynamically-linked /bin and /sbin support and movement of libraries to /lib.
+|17 августа 2003
+|5.1-CURRENT динамически связанные /bin и /sbin поддержка и перемещение библиотек в /lib.
|501106
|link:https://svnweb.freebsd.org/changeset/base/119881[119881]
-|September 8, 2003
-|5.1-CURRENT after adding kernel support for Coda 6.x.
+|8 сентября 2003
+|5.1-CURRENT после добавления поддержки ядра для Coda 6.x.
|501107
|link:https://svnweb.freebsd.org/changeset/base/120180[120180]
-|September 17, 2003
-|5.1-CURRENT after 16550 UART constants moved from [.filename]#<dev/sio/sioreg.h># to [.filename]#<dev/ic/ns16550.h>#. Also when libmap functionality was unconditionally supported by rtld.
+|17 сентября 2003
+|5.1-CURRENT после того, как константы UART 16550 были перемещены из [.filename]#<dev/sio/sioreg.h># в [.filename]#<dev/ic/ns16550.h>#. Также когда функциональность libmap стала безусловно поддерживаться rtld.
|501108
|link:https://svnweb.freebsd.org/changeset/base/120386[120386]
-|September 23, 2003
-|5.1-CURRENT after PFIL_HOOKS API update
+|23 сентября 2003
+|5.1-CURRENT после обновления API PFIL_HOOKS
|501109
|link:https://svnweb.freebsd.org/changeset/base/120503[120503]
-|September 27, 2003
-|5.1-CURRENT after adding man:kiconv[3]
+|27 сентября 2003
+|5.1-CURRENT после добавления man:kiconv[3]
|501110
|link:https://svnweb.freebsd.org/changeset/base/120556[120556]
-|September 28, 2003
-|5.1-CURRENT after changing default operations for open and close in cdevsw
+|28 сентября 2003
+|5.1-CURRENT после изменения операций по умолчанию для open и close в cdevsw
|501111
|link:https://svnweb.freebsd.org/changeset/base/121125[121125]
-|October 16, 2003
-|5.1-CURRENT after changed layout of cdevsw
+|16 октября 2003
+|5.1-CURRENT после изменения структуры cdevsw
|501112
|link:https://svnweb.freebsd.org/changeset/base/121129[121129]
-|October 16, 2003
-| 5.1-CURRENT after adding kobj multiple inheritance
+|16 октября 2003
+| 5.1-CURRENT после добавления множественного наследования kobj
|501113
|link:https://svnweb.freebsd.org/changeset/base/121816[121816]
-|October 31, 2003
-| 5.1-CURRENT after the if_xname change in struct ifnet
+|31 октября 2003
+| 5.1-CURRENT после изменения `if_xname` в структуре ifnet
|501114
|link:https://svnweb.freebsd.org/changeset/base/122779[122779]
-|November 16, 2003
-| 5.1-CURRENT after changing /bin and /sbin to be dynamically linked
+|16 ноября 2003
+| 5.1-CURRENT после изменения /bin и /sbin на динамически линкуемые
|502000
|link:https://svnweb.freebsd.org/changeset/base/123198[123198]
-|December 7, 2003
+|7 декабря 2003
|5.2-RELEASE
|502010
|link:https://svnweb.freebsd.org/changeset/base/126150[126150]
-|February 23, 2004
+|23 февраля 2004
|5.2.1-RELEASE
|502100
|link:https://svnweb.freebsd.org/changeset/base/123196[123196]
-|December 7, 2003
-|5.2-CURRENT after branching for RELENG_5_2
+|7 декабря 2003
+|5.2-CURRENT после ветвления для RELENG_5_2
|502101
|link:https://svnweb.freebsd.org/changeset/base/123677[123677]
-|December 19, 2003
-|5.2-CURRENT after __cxa_atexit/__cxa_finalize functions were added to libc.
+|19 декабря 2003
+|5.2-CURRENT после добавления функций `__cxa_atexit`/`__cxa_finalize` в libc.
|502102
|link:https://svnweb.freebsd.org/changeset/base/125236[125236]
-|January 30, 2004
-|5.2-CURRENT after change of default thread library from libc_r to libpthread.
+|30 января 2004
+|5.2-CURRENT после изменения стандартной библиотеки потоков с libc_r на libpthread.
|502103
|link:https://svnweb.freebsd.org/changeset/base/126083[126083]
-|February 21, 2004
-|5.2-CURRENT after device driver API megapatch.
+|21 февраля 2004
+|5.2-CURRENT после масштабного патча API драйверов устройств.
|502104
|link:https://svnweb.freebsd.org/changeset/base/126208[126208]
-|February 25, 2004
-|5.2-CURRENT after getopt_long_only() addition.
+|25 февраля 2004
+|5.2-CURRENT после добавления `getopt_long_only()`.
|502105
|link:https://svnweb.freebsd.org/changeset/base/126644[126644]
-|March 5, 2004
-|5.2-CURRENT after NULL is made into ((void *)0) for C, creating more warnings.
+|5 марта 2004
+|5.2-CURRENT после того, как NULL заменён на ((void *)0) для C, что вызывает больше предупреждений.
|502106
|link:https://svnweb.freebsd.org/changeset/base/126757[126757]
-|March 8, 2004
-|5.2-CURRENT after pf is linked to the build and install.
+|8 марта 2004
+|5.2-CURRENT после подключения pf к сборке и установке.
|502107
|link:https://svnweb.freebsd.org/changeset/base/126819[126819]
-|March 10, 2004
-|5.2-CURRENT after time_t is changed to a 64-bit value on sparc64.
+|10 марта 2004
+|5.2-CURRENT после изменения `time_t` на 64-битное значение на sparc64.
|502108
|link:https://svnweb.freebsd.org/changeset/base/126891[126891]
-|March 12, 2004
-|5.2-CURRENT after Intel C/C++ compiler support in some headers and man:execve[2] changes to be more strictly conforming to POSIX.
+|12 марта 2004
+|5.2-CURRENT после поддержки компилятора Intel C/C++ в некоторых заголовочных файлах и изменений в man:execve[2] для более строгого соответствия POSIX.
|502109
|link:https://svnweb.freebsd.org/changeset/base/127312[127312]
-|March 22, 2004
-|5.2-CURRENT after the introduction of the bus_alloc_resource_any API
+|22 марта 2004
+|5.2-CURRENT после введения API `bus_alloc_resource_any`
|502110
|link:https://svnweb.freebsd.org/changeset/base/127475[127475]
-|March 27, 2004
-|5.2-CURRENT after the addition of UTF-8 locales
+|27 марта 2004
+|5.2-CURRENT после добавления локалей UTF-8
|502111
|link:https://svnweb.freebsd.org/changeset/base/128144[128144]
-|April 11, 2004
-|5.2-CURRENT after the removal of the man:getvfsent[3] API
+|11 апреля 2004
+|5.2-CURRENT после удаления API man:getvfsent[3]
|502112
|link:https://svnweb.freebsd.org/changeset/base/128182[128182]
-|April 13, 2004
-|5.2-CURRENT after the addition of the .warning directive for make.
+|13 апреля 2004
+|5.2-CURRENT после добавления директивы .warning для make.
|502113
|link:https://svnweb.freebsd.org/changeset/base/130057[130057]
-|June 4, 2004
-|5.2-CURRENT after ttyioctl() was made mandatory for serial drivers.
+|4 июня 2004
+|5.2-CURRENT после того, как `ttyioctl()` стал обязательным для драйверов последовательных портов.
|502114
|link:https://svnweb.freebsd.org/changeset/base/130418[130418]
-|June 13, 2004
-|5.2-CURRENT after import of the ALTQ framework.
+|13 июня 2004
+|5.2-CURRENT после импорта инфраструктуры ALTQ.
|502115
|link:https://svnweb.freebsd.org/changeset/base/130481[130481]
-|June 14, 2004
-|5.2-CURRENT after changing man:sema_timedwait[9] to return 0 on success and a non-zero error code on failure.
+|14 июня 2004
+|5.2-CURRENT после изменения man:sema_timedwait[9] для возврата 0 при успехе и ненулевого кода ошибки при сбое.
|502116
|link:https://svnweb.freebsd.org/changeset/base/130585[130585]
-|June 16, 2004
-|5.2-CURRENT after changing kernel dev_t to be pointer to struct cdev *.
+|16 июня 2004
+|5.2-CURRENT после изменения типа `dev_t` в ядре на указатель на структуру cdev *.
|502117
|link:https://svnweb.freebsd.org/changeset/base/130640[130640]
-|June 17, 2004
-|5.2-CURRENT after changing kernel udev_t to dev_t.
+|17 июня 2004
+|5.2-CURRENT после изменения ядра `udev_t` на `dev_t`.
|502118
|link:https://svnweb.freebsd.org/changeset/base/130656[130656]
-|June 17, 2004
-|5.2-CURRENT after adding support for CLOCK_VIRTUAL and CLOCK_PROF to man:clock_gettime[2] and man:clock_getres[2].
+|17 июня 2004
+|5.2-CURRENT после добавления поддержки CLOCK_VIRTUAL и CLOCK_PROF в man:clock_gettime[2] и man:clock_getres[2].
|502119
|link:https://svnweb.freebsd.org/changeset/base/130934[130934]
-|June 22, 2004
-|5.2-CURRENT after changing network interface cloning overhaul.
+|22 июня 2004
+|5.2-CURRENT после изменения переработки клонирования сетевых интерфейсов.
|502120
|link:https://svnweb.freebsd.org/changeset/base/131429[131429]
-|July 2, 2004
-|5.2-CURRENT after the update of the package tools to revision 20040629.
+|2 июля 2004
+|5.2-CURRENT после обновления инструментов пакетов до ревизии 20040629.
|502121
|link:https://svnweb.freebsd.org/changeset/base/131883[131883]
-|July 9, 2004
-|5.2-CURRENT after marking Bluetooth code as non-i386 specific.
+|9 июля 2004
+|5.2-CURRENT после пометки кода Bluetooth как не специфичного для i386.
|502122
|link:https://svnweb.freebsd.org/changeset/base/131971[131971]
-|July 11, 2004
-|5.2-CURRENT after the introduction of the KDB debugger framework, the conversion of DDB into a backend and the introduction of the GDB backend.
+|11 июля 2004
+|5.2-CURRENT после внедрения фреймворка отладчика KDB, преобразования DDB в бэкенд и добавления бэкенда GDB.
|502123
|link:https://svnweb.freebsd.org/changeset/base/132025[132025]
-|July 12, 2004
-|5.2-CURRENT after change to make VFS_ROOT take a struct thread argument as does vflush. Struct kinfo_proc now has a user data pointer. The switch of the default X implementation to `xorg` was also made at this time.
+|12 июля 2004
+|5.2-CURRENT после изменения, чтобы VFS_ROOT принимал аргумент struct thread, как и vflush. Структура `kinfo_proc` теперь содержит указатель на пользовательские данные. Переключение реализации X по умолчанию на `xorg` также произошло в это время.
|502124
|link:https://svnweb.freebsd.org/changeset/base/132597[132597]
-|July 24, 2004
-|5.2-CURRENT after the change to separate the way ports rc.d and legacy scripts are started.
+|24 июля 2004
+|5.2-CURRENT после изменения, разделяющего способ запуска rc.d портов и устаревших скриптов.
|502125
|link:https://svnweb.freebsd.org/changeset/base/132726[132726]
-|July 28, 2004
-|5.2-CURRENT after the backout of the previous change.
+|28 июля 2004
+|5.2-CURRENT после отмены предыдущего изменения.
|502126
|link:https://svnweb.freebsd.org/changeset/base/132914[132914]
-|July 31, 2004
-|5.2-CURRENT after the removal of kmem_alloc_pageable() and the import of gcc 3.4.2.
+|31 июля 2004
+|5.2-CURRENT после удаления `kmem_alloc_pageable()` и импорта gcc 3.4.2.
|502127
|link:https://svnweb.freebsd.org/changeset/base/132991[132991]
-|August 2, 2004
-|5.2-CURRENT after changing the UMA kernel API to allow ctors/inits to fail.
+|2 августа 2004
+|5.2-CURRENT после изменения UMA API ядра для разрешения ошибок в ctors/inits.
|502128
|link:https://svnweb.freebsd.org/changeset/base/133306[133306]
-|August 8, 2004
-|5.2-CURRENT after the change of the vfs_mount signature as well as global replacement of PRISON_ROOT with SUSER_ALLOWJAIL for the man:suser[9] API.
+|8 августа 2004
+|5.2-CURRENT после изменения сигнатуры vfs_mount, а также глобальной замены PRISON_ROOT на SUSER_ALLOWJAIL для API man:suser[9].
|503000
|link:https://svnweb.freebsd.org/changeset/base/134189[134189]
-|August 23, 2004
-|5.3-BETA/RC before the pfil API change
+|23 августа 2004
+|5.3-BETA/RC до изменения API pfil
|503001
|link:https://svnweb.freebsd.org/changeset/base/135580[135580]
-|September 22, 2004
+|22 сентября 2004
|5.3-RELEASE
|503100
|link:https://svnweb.freebsd.org/changeset/base/136595[136595]
-|October 16, 2004
-|5.3-STABLE after branching for RELENG_5_3
+|16 октября 2004
+|5.3-STABLE после ветвления для RELENG_5_3
|503101
|link:https://svnweb.freebsd.org/changeset/base/138459[138459]
-|December 3, 2004
-|5.3-STABLE after addition of glibc style man:strftime[3] padding options.
+|3 декабря 2004
+|5.3-STABLE после добавления опций заполнения man:strftime[3] в стиле glibc.
|503102
|link:https://svnweb.freebsd.org/changeset/base/141788[141788]
-|February 13, 2005
-|5.3-STABLE after OpenBSD's man:nc[1] import MFC.
+|13 февраля 2005
+|5.3-STABLE после импорта man:nc[1] из OpenBSD MFC.
|503103
|link:https://svnweb.freebsd.org/changeset/base/142639[142639]
-|February 27, 2005
-|5.4-PRERELEASE after the MFC of the fixes in [.filename]#<src/include/stdbool.h># and [.filename]#<src/sys/i386/include/_types.h># for using the GCC-compatibility of the Intel C/C++ compiler.
+|27 февраля 2005
+|5.4-PRERELEASE после MFC исправлений в [.filename]#<src/include/stdbool.h># и [.filename]#<src/sys/i386/include/_types.h># для обеспечения совместимости с GCC компилятора Intel C/C++.
|503104
|link:https://svnweb.freebsd.org/changeset/base/142835[142835]
-|February 28, 2005
-|5.4-PRERELEASE after the MFC of the change of ifi_epoch from wall clock time to uptime.
+|28 февраля 2005
+|5.4-PRERELEASE после MFC изменения `ifi_epoch` с времени реального мира на время работы системы.
|503105
|link:https://svnweb.freebsd.org/changeset/base/143029[143029]
-|March 2, 2005
-|5.4-PRERELEASE after the MFC of the fix of EOVERFLOW check in man:vswprintf[3].
+|2 марта 2005
+|5.4-PRERELEASE после переноса исправления проверки EOVERFLOW в man:vswprintf[3].
|504000
|link:https://svnweb.freebsd.org/changeset/base/144575[144575]
-|April 3, 2005
+|3 апреля 2005
|5.4-RELEASE.
|504100
|link:https://svnweb.freebsd.org/changeset/base/144581[144581]
-|April 3, 2005
-|5.4-STABLE after branching for RELENG_5_4
+|3 апреля 2005
+|5.4-STABLE после ветвления для RELENG_5_4
|504101
|link:https://svnweb.freebsd.org/changeset/base/146105[146105]
-|May 11, 2005
-|5.4-STABLE after increasing the default thread stacksizes
+|11 мая 2005
+|5.4-STABLE после увеличения размеров стеков потоков по умолчанию
|504102
|link:https://svnweb.freebsd.org/changeset/base/504101[504101]
-|June 24, 2005
-|5.4-STABLE after the addition of sha256
+|24 июня 2005
+|5.4-STABLE после добавления sha256
|504103
|link:https://svnweb.freebsd.org/changeset/base/150892[150892]
-|October 3, 2005
-|5.4-STABLE after the MFC of if_bridge
+|3 октября 2005
+|5.4-STABLE после слияния изменений (MFC) if_bridge
|504104
|link:https://svnweb.freebsd.org/changeset/base/152370[152370]
-|November 13, 2005
-|5.4-STABLE after the MFC of bsdiff and portsnap
+|13 ноября 2005
+|5.4-STABLE после слияния изменений (MFC) bsdiff и portsnap
|504105
|link:https://svnweb.freebsd.org/changeset/base/154464[154464]
-|January 17, 2006
-|5.4-STABLE after MFC of ldconfig_local_dirs change.
+|17 января 2006
+|5.4-STABLE после MFC изменений ldconfig_local_dirs.
|505000
|link:https://svnweb.freebsd.org/changeset/base/158481[158481]
-|May 12, 2006
+|12 мая 2006
|5.5-RELEASE.
|505100
|link:https://svnweb.freebsd.org/changeset/base/158482[158482]
-|May 12, 2006
-|5.5-STABLE after branching for RELENG_5_5
+|12 мая 2006
+|5.5-STABLE после ветвления для RELENG_5_5
|===
[[versions-4]]
-== FreeBSD 4 Versions
+== Версии FreeBSD 4
[[freebsd-versions-table-4]]
-.FreeBSD 4 `__FreeBSD_version` Values
+.Значения `__FreeBSD_version` в FreeBSD 4
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|400000
|link:https://svnweb.freebsd.org/changeset/base/43041[43041]
-|January 22, 1999
-|4.0-CURRENT after 3.4 branch
+|22 января 1999
+|4.0-CURRENT после ветки 3.4
|400001
|link:https://svnweb.freebsd.org/changeset/base/44177[44177]
-|February 20, 1999
-|4.0-CURRENT after change in dynamic linker handling
+|20 февраля 1999
+|4.0-CURRENT после изменения в обработке динамического компоновщика
|400002
|link:https://svnweb.freebsd.org/changeset/base/44699[44699]
-|March 13, 1999
-|4.0-CURRENT after C++ constructor/destructor order change
+|13 марта 1999
+|4.0-CURRENT после изменения порядка конструкторов/деструкторов C++
|400003
|link:https://svnweb.freebsd.org/changeset/base/45059[45059]
-|March 27, 1999
-|4.0-CURRENT after functioning man:dladdr[3]
+|27 марта 1999
+|4.0-CURRENT после функционирования man:dladdr[3]
|400004
|link:https://svnweb.freebsd.org/changeset/base/45321[45321]
-|April 5, 1999
-|4.0-CURRENT after __deregister_frame_info dynamic linker bug fix (also 4.0-CURRENT after EGCS 1.1.2 integration)
+|5 апреля 1999
+|4.0-CURRENT после исправления ошибки динамического компоновщика `__deregister_frame_info` (также 4.0-CURRENT после интеграции EGCS 1.1.2)
|400005
|link:https://svnweb.freebsd.org/changeset/base/46113[46113]
-|April 27, 1999
-|4.0-CURRENT after man:suser[9] API change (also 4.0-CURRENT after newbus)
+|27 апреля 1999
+|4.0-CURRENT после изменения API man:suser[9] (также 4.0-CURRENT после newbus)
|400006
|link:https://svnweb.freebsd.org/changeset/base/47640[47640]
-|May 31, 1999
-|4.0-CURRENT after cdevsw registration change
+|31 мая 1999
+|4.0-CURRENT после изменения регистрации cdevsw
|400007
|link:https://svnweb.freebsd.org/changeset/base/47992[47992]
-|June 17, 1999
-|4.0-CURRENT after the addition of so_cred for socket level credentials
+|17 июня 1999
+|4.0-CURRENT после добавления `so_cred` для учётных данных на уровне сокета
|400008
|link:https://svnweb.freebsd.org/changeset/base/48048[48048]
-|June 20, 1999
-|4.0-CURRENT after the addition of a poll syscall wrapper to libc_r
+|20 июня 1999
+|4.0-CURRENT после добавления обёртки системного вызова poll в libc_r
|400009
|link:https://svnweb.freebsd.org/changeset/base/48936[48936]
-|July 20, 1999
-|4.0-CURRENT after the change of the kernel's `dev_t` type to `struct specinfo` pointer
+|20 июля 1999
+|4.0-CURRENT после изменения типа `dev_t` ядра на указатель `struct specinfo`
|400010
|link:https://svnweb.freebsd.org/changeset/base/51649[51649]
-|September 25, 1999
-|4.0-CURRENT after fixing a hole in man:jail[2]
+|25 сентября 1999
+|4.0-CURRENT после исправления уязвимости в man:jail[2]
|400011
|link:https://svnweb.freebsd.org/changeset/base/51791[51791]
-|September 29, 1999
-|4.0-CURRENT after the `sigset_t` datatype change
+|29 сентября 1999
+|4.0-CURRENT после изменения типа данных `sigset_t`
|400012
|link:https://svnweb.freebsd.org/changeset/base/53164[53164]
-|November 15, 1999
-|4.0-CURRENT after the cutover to the GCC 2.95.2 compiler
+|15 ноября 1999
+|4.0-CURRENT после перехода на компилятор GCC 2.95.2
|400013
|link:https://svnweb.freebsd.org/changeset/base/54123[54123]
-|December 4, 1999
-|4.0-CURRENT after adding pluggable linux-mode ioctl handlers
+|4 декабря 1999
+|4.0-CURRENT после добавления подключаемых обработчиков ioctl в режиме linux
|400014
|link:https://svnweb.freebsd.org/changeset/base/56216[56216]
-|January 18, 2000
-|4.0-CURRENT after importing OpenSSL
+|18 января 2000
+|4.0-CURRENT после импорта OpenSSL
|400015
|link:https://svnweb.freebsd.org/changeset/base/56700[56700]
-|January 27, 2000
-|4.0-CURRENT after the C++ ABI change in GCC 2.95.2 from -fvtable-thunks to -fno-vtable-thunks by default
+|27 января 2000
+|4.0-CURRENT после изменения ABI C++ в GCC 2.95.2 с -fvtable-thunks на -fno-vtable-thunks по умолчанию
|400016
|link:https://svnweb.freebsd.org/changeset/base/57529[57529]
-|February 27, 2000
-|4.0-CURRENT after importing OpenSSH
+|27 февраля 2000
+|4.0-CURRENT после импорта OpenSSH
|400017
|link:https://svnweb.freebsd.org/changeset/base/58005[58005]
-|March 13, 2000
+|13 марта 2000
|4.0-RELEASE
|400018
|link:https://svnweb.freebsd.org/changeset/base/58170[58170]
-|March 17, 2000
-|4.0-STABLE after 4.0-RELEASE
+|17 марта 2000
+|4.0-STABLE после 4.0-RELEASE
|400019
|link:https://svnweb.freebsd.org/changeset/base/60047[60047]
-|May 5, 2000
-|4.0-STABLE after the introduction of delayed checksums.
+|5 мая 2000
+|4.0-STABLE после введения отложенных контрольных сумм.
|400020
|link:https://svnweb.freebsd.org/changeset/base/61262[61262]
-|June 4, 2000
-|4.0-STABLE after merging libxpg4 code into libc.
+|4 июня 2000
+|4.0-STABLE после объединения кода libxpg4 в libc.
|400021
|link:https://svnweb.freebsd.org/changeset/base/62820[62820]
-|July 8, 2000
-|4.0-STABLE after upgrading Binutils to 2.10.0, ELF branding changes, and tcsh in the base system.
+|8 июля 2000
+|4.0-STABLE после обновления Binutils до 2.10.0, изменения маркировки ELF и tcsh в базовой системе.
|410000
|link:https://svnweb.freebsd.org/changeset/base/63095[63095]
-|July 14, 2000
+|14 июля 2000
|4.1-RELEASE
|410001
|link:https://svnweb.freebsd.org/changeset/base/64012[64012]
-|July 29, 2000
-|4.1-STABLE after 4.1-RELEASE
+|29 июля 2000
+|4.1-STABLE после 4.1-RELEASE
|410002
|link:https://svnweb.freebsd.org/changeset/base/65962[65962]
-|September 16, 2000
-|4.1-STABLE after man:setproctitle[3] moved from libutil to libc.
+|16 сентября 2000
+|4.1-STABLE после перемещения man:setproctitle[3] из libutil в libc.
|411000
|link:https://svnweb.freebsd.org/changeset/base/66336[66336]
-|September 25, 2000
+|25 сентября 2000
|4.1.1-RELEASE
|411001
-|
-|
-|4.1.1-STABLE after 4.1.1-RELEASE
+|
+|
+|4.1.1-STABLE после 4.1.1-RELEASE
|420000
|link:https://svnweb.freebsd.org/changeset/base/68066[68066]
-|October 31, 2000
+|31 октября 2000
|4.2-RELEASE
|420001
|link:https://svnweb.freebsd.org/changeset/base/70895[70895]
-|January 10, 2001
-|4.2-STABLE after combining libgcc.a and libgcc_r.a, and associated GCC linkage changes.
+|10 января 2001
+|4.2-STABLE после объединения libgcc.a и libgcc_r.a, а также связанных изменений в компоновке GCC.
|430000
|link:https://svnweb.freebsd.org/changeset/base/73800[73800]
-|March 6, 2001
+|6 марта 2001
|4.3-RELEASE
|430001
|link:https://svnweb.freebsd.org/changeset/base/76779[76779]
-|May 18, 2001
-|4.3-STABLE after wint_t introduction.
+|18 мая 2001
+|4.3-STABLE после введения `wint_t`.
|430002
|link:https://svnweb.freebsd.org/changeset/base/80157[80157]
-|July 22, 2001
-|4.3-STABLE after PCI powerstate API merge.
+|22 июля 2001
+|4.3-STABLE после объединения API управления состоянием питания PCI.
|440000
|link:https://svnweb.freebsd.org/changeset/base/80923[80923]
-|August 1, 2001
+|1 августа 2001
|4.4-RELEASE
|440001
|link:https://svnweb.freebsd.org/changeset/base/85341[85341]
-|October 23, 2001
-|4.4-STABLE after d_thread_t introduction.
+|23 октября 2001
+|4.4-STABLE после введения `d_thread_t`.
|440002
|link:https://svnweb.freebsd.org/changeset/base/86038[86038]
-|November 4, 2001
-|4.4-STABLE after mount structure changes (affects filesystem klds).
+|4 ноября 2001
+|4.4-STABLE после изменений в структуре монтирования (затрагивает модули файловых систем klds).
|440003
|link:https://svnweb.freebsd.org/changeset/base/88130[88130]
-|December 18, 2001
-|4.4-STABLE after the userland components of smbfs were imported.
+|18 декабря 2001
+|4.4-STABLE после импорта компонентов пользовательского пространства smbfs.
|450000
|link:https://svnweb.freebsd.org/changeset/base/88271[88271]
-|December 20, 2001
+|20 декабря 2001
|4.5-RELEASE
|450001
|link:https://svnweb.freebsd.org/changeset/base/91203[91203]
-|February 24, 2002
-|4.5-STABLE after the usb structure element rename.
+|24 февраля 2002
+|4.5-STABLE после переименования элемента структуры usb.
|450002
|link:https://svnweb.freebsd.org/changeset/base/92151[92151]
-|March 12, 2002
-|4.5-STABLE after locale changes.
+|12 марта 2002
+|4.5-STABLE после изменений локали.
|450003
-|
-|
-|(Never created)
+|
+|
+|(Никогда не создавался)
|450004
|link:https://svnweb.freebsd.org/changeset/base/94840[94840]
-|April 16, 2002
-|4.5-STABLE after the `sendmail_enable` man:rc.conf[5] variable was made to take the value `NONE`.
+|16 апреля 2002
+|4.5-STABLE после того, как переменная `sendmail_enable` из man:rc.conf[5] стала принимать значение `NONE`.
|450005
|link:https://svnweb.freebsd.org/changeset/base/95555[95555]
-|April 27, 2002
-|4.5-STABLE after moving to XFree86 4 by default for package builds.
+|27 апреля 2002
+|4.5-STABLE после перехода на XFree86 4 по умолчанию для сборки пакетов.
|450006
|link:https://svnweb.freebsd.org/changeset/base/95846[95846]
-|May 1, 2002
-|4.5-STABLE after accept filtering was fixed so that is no longer susceptible to an easy DoS.
+|1 мая 2002
+|4.5-STABLE после исправления фильтрации accept, чтобы он больше не был подвержен простой DoS-атаке.
|460000
|link:https://svnweb.freebsd.org/changeset/base/97923[97923]
-|June 21, 2002
+|21 июня 2002
|4.6-RELEASE
|460001
|link:https://svnweb.freebsd.org/changeset/base/98730[98730]
-|June 21, 2002
-|4.6-STABLE man:sendfile[2] fixed to comply with documentation, not to count any headers sent against the amount of data to be sent from the file.
+|21 июня 2002
+|4.6-STABLE man:sendfile[2] исправлен для соответствия документации, чтобы не учитывать отправленные заголовки в объеме данных, отправляемых из файла.
|460002
|link:https://svnweb.freebsd.org/changeset/base/100366[100366]
-|July 19, 2002
+|19 июля 2002
|4.6.2-RELEASE
|460100
|link:https://svnweb.freebsd.org/changeset/base/98857[98857]
-|June 26, 2002
+|26 июня 2002
|4.6-STABLE
|460101
|link:https://svnweb.freebsd.org/changeset/base/98880[98880]
-|June 26, 2002
-|4.6-STABLE after MFC of `sed -i`.
+|26 июня 2002
+|4.6-STABLE после MFC `sed -i`.
|460102
|link:https://svnweb.freebsd.org/changeset/base/102759[102759]
-|September 1, 2002
-|4.6-STABLE after MFC of many new pkg_install features from the HEAD.
+|1 сентября 2002
+|4.6-STABLE после MFC множества новых функций pkg_install из HEAD.
|470000
|link:https://svnweb.freebsd.org/changeset/base/104655[104655]
-|October 8, 2002
+|8 октября 2002
|4.7-RELEASE
|470100
|link:https://svnweb.freebsd.org/changeset/base/104717[104717]
-|October 9, 2002
+|9 октября 2002
|4.7-STABLE
|470101
|link:https://svnweb.freebsd.org/changeset/base/106732[106732]
-|November 10, 2002
-|Start generated __std{in,out,err}p references rather than __sF. This changes std{in,out,err} from a compile time expression to a runtime one.
+|10 ноября 2002
+|Начинать генерировать ссылки `__std{in,out,err}p` вместо `__sF`. Это изменяет `std{in,out,err}` с выражения времени компиляции на выражение времени выполнения.
|470102
|link:https://svnweb.freebsd.org/changeset/base/109753[109753]
-|January 23, 2003
-|4.7-STABLE after MFC of mbuf changes to replace m_aux mbufs by m_tag's
+|23 января 2003
+|4.7-STABLE после MFC изменений mbuf для замены `m_aux` mbuf на `m_tag`
|470103
|link:https://svnweb.freebsd.org/changeset/base/110887[110887]
-|February 14, 2003
-|4.7-STABLE gets OpenSSL 0.9.7
+|14 февраля 2003
+|4.7-STABLE получает OpenSSL 0.9.7
|480000
|link:https://svnweb.freebsd.org/changeset/base/112852[112852]
-|March 30, 2003
+|30 марта 2003
|4.8-RELEASE
|480100
|link:https://svnweb.freebsd.org/changeset/base/113107[113107]
-|April 5, 2003
+|5 апреля 2003
|4.8-STABLE
|480101
|link:https://svnweb.freebsd.org/changeset/base/115232[115232]
-|May 22, 2003
-|4.8-STABLE after man:realpath[3] has been made thread-safe
+|22 мая 2003
+|4.8-STABLE после того, как man:realpath[3] стал потокобезопасным
|480102
|link:https://svnweb.freebsd.org/changeset/base/118737[118737]
-|August 10, 2003
-|4.8-STABLE 3ware API changes to twe.
+|10 августа 2003
+|4.8-STABLE Изменения API 3ware в twe.
|490000
|link:https://svnweb.freebsd.org/changeset/base/121592[121592]
-|October 27, 2003
+|27 октября 2003
|4.9-RELEASE
|490100
|link:https://svnweb.freebsd.org/changeset/base/121593[121593]
-|October 27, 2003
+|27 октября 2003
|4.9-STABLE
|490101
|link:https://svnweb.freebsd.org/changeset/base/124264[124264]
-|January 8, 2004
-|4.9-STABLE after e_sid was added to struct kinfo_eproc.
+|8 января 2004
+|4.9-STABLE после добавления `e_sid` в структуру `kinfo_eproc`.
|490102
|link:https://svnweb.freebsd.org/changeset/base/125417[125417]
-|February 4, 2004
-|4.9-STABLE after MFC of libmap functionality for rtld.
+|4 февраля 2004
+|4.9-STABLE после MFC функциональности libmap для rtld.
|491000
|link:https://svnweb.freebsd.org/changeset/base/129700[129700]
-|May 25, 2004
+|25 мая 2004
|4.10-RELEASE
|491100
|link:https://svnweb.freebsd.org/changeset/base/129918[129918]
-|June 1, 2004
+|1 июня 2004
|4.10-STABLE
|491101
|link:https://svnweb.freebsd.org/changeset/base/133506[133506]
-|August 11, 2004
-|4.10-STABLE after MFC of revision 20040629 of the package tools
+|11 августа 2004
+|4.10-STABLE после слияния изменения из ревизии 20040629 пакета tools
|491102
|link:https://svnweb.freebsd.org/changeset/base/137786[137786]
-|November 16, 2004
-|4.10-STABLE after VM fix dealing with unwiring of fictitious pages
+|16 ноября 2004
+|4.10-STABLE после исправления VM, связанного с обработкой размонтирования фиктивных страниц
|492000
|link:https://svnweb.freebsd.org/changeset/base/138960[138960]
-|December 17, 2004
+|17 декабря 2004
|4.11-RELEASE
|492100
|link:https://svnweb.freebsd.org/changeset/base/138959[138959]
-|December 17, 2004
+|17 декабря 2004
|4.11-STABLE
|492101
|link:https://svnweb.freebsd.org/changeset/base/157843[157843]
-|April 18, 2006
-|4.11-STABLE after adding libdata/ldconfig directories to mtree files.
+|18 апреля 2006
+|4.11-STABLE после добавления каталогов libdata/ldconfig в файлы mtree.
|===
[[versions-3]]
-== FreeBSD 3 Versions
+== Версии FreeBSD 3
[[freebsd-versions-table-3]]
-.FreeBSD 3 `__FreeBSD_version` Values
+.Значения `__FreeBSD_version` для FreeBSD 3
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|300000
|link:https://svnweb.freebsd.org/changeset/base/22917[22917]
-|February 19, 1996
-|3.0-CURRENT before man:mount[2] change
+|19 февраля 1996
+|3.0-CURRENT до изменения man:mount[2]
|300001
|link:https://svnweb.freebsd.org/changeset/base/36283[36283]
-|September 24, 1997
-|3.0-CURRENT after man:mount[2] change
+|24 сентября 1997
+|3.0-CURRENT после изменения man:mount[2]
|300002
|link:https://svnweb.freebsd.org/changeset/base/36592[36592]
-|June 2, 1998
-|3.0-CURRENT after man:semctl[2] change
+|2 июня 1998
+|3.0-CURRENT после изменения man:semctl[2]
|300003
|link:https://svnweb.freebsd.org/changeset/base/36735[36735]
-|June 7, 1998
-|3.0-CURRENT after ioctl arg changes
+|7 июня 1998
+|3.0-CURRENT после изменений аргументов ioctl
|300004
|link:https://svnweb.freebsd.org/changeset/base/38768[38768]
-|September 3, 1998
-|3.0-CURRENT after ELF conversion
+|3 сентября 1998
+|3.0-CURRENT после преобразования в ELF
|300005
|link:https://svnweb.freebsd.org/changeset/base/40438[40438]
-|October 16, 1998
+|16 октября 1998
|3.0-RELEASE
|300006
|link:https://svnweb.freebsd.org/changeset/base/40445[40445]
-|October 16, 1998
-|3.0-CURRENT after 3.0-RELEASE
+|16 октября 1998
+|3.0-CURRENT после 3.0-RELEASE
|300007
|link:https://svnweb.freebsd.org/changeset/base/43042[43042]
-|January 22, 1999
-|3.0-STABLE after 3/4 branch
+|22 января 1999
+|3.0-STABLE после ветвления 3/4
|310000
|link:https://svnweb.freebsd.org/changeset/base/43807[43807]
-|February 9, 1999
+|9 февраля 1999
|3.1-RELEASE
|310001
|link:https://svnweb.freebsd.org/changeset/base/45060[45060]
-|March 27, 1999
-|3.1-STABLE after 3.1-RELEASE
+|27 марта 1999
+|3.1-STABLE после 3.1-RELEASE
|310002
|link:https://svnweb.freebsd.org/changeset/base/45689[45689]
-|April 14, 1999
-|3.1-STABLE after C++ constructor/destructor order change
+|14 апреля 1999
+|3.1-STABLE после изменения порядка конструкторов/деструкторов C++
|320000
-|
-|
+|
+|
|3.2-RELEASE
|320001
|link:https://svnweb.freebsd.org/changeset/base/46742[46742]
-|May 8, 1999
+|8 мая 1999
|3.2-STABLE
|320002
|link:https://svnweb.freebsd.org/changeset/base/50563[50563]
-|August 29, 1999
-|3.2-STABLE after binary-incompatible IPFW and socket changes
+|29 августа 1999
+|3.2-STABLE после бинарно-несовместимых изменений в IPFW и сокетах
|330000
|link:https://svnweb.freebsd.org/changeset/base/50813[50813]
-|September 2, 1999
+|2 сентября 1999
|3.3-RELEASE
|330001
|link:https://svnweb.freebsd.org/changeset/base/51328[51328]
-|September 16, 1999
+|16 сентября 1999
|3.3-STABLE
|330002
|link:https://svnweb.freebsd.org/changeset/base/53671[53671]
-|November 24, 1999
-|3.3-STABLE after adding man:mkstemp[3] to libc
+|24 ноября 1999
+|3.3-STABLE после добавления man:mkstemp[3] в libc
|340000
|link:https://svnweb.freebsd.org/changeset/base/54166[54166]
-|December 5, 1999
+|5 декабря 1999
|3.4-RELEASE
|340001
|link:https://svnweb.freebsd.org/changeset/base/54730[54730]
-|December 17, 1999
+|17 декабря 1999
|3.4-STABLE
|350000
|link:https://svnweb.freebsd.org/changeset/base/61876[61876]
-|June 20, 2000
+|20 июня 2000
|3.5-RELEASE
|350001
|link:https://svnweb.freebsd.org/changeset/base/63043[63043]
-|July 12, 2000
+|12 июля 2000
|3.5-STABLE
|===
[[versions-2.2]]
-== FreeBSD 2.2 Versions
+== Версии FreeBSD 2.2
[[freebsd-versions-table-2.2]]
-.FreeBSD 2.2 `__FreeBSD_version` Values
+.Значения `__FreeBSD_version` в FreeBSD 2.2
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|220000
|link:https://svnweb.freebsd.org/changeset/base/22918[22918]
-|February 19, 1997
+|19 февраля 1997
|2.2-RELEASE
-|(not changed)
-|
-|
+|(не изменено)
+|
+|
|2.2.1-RELEASE
-|(not changed)
-|
-|
-|2.2-STABLE after 2.2.1-RELEASE
+|(не изменено)
+|
+|
+|2.2-STABLE после 2.2.1-RELEASE
|221001
|link:https://svnweb.freebsd.org/changeset/base/24941[24941]
-|April 15, 1997
-|2.2-STABLE after texinfo-3.9
+|15 апреля 1997
+|2.2-STABLE после texinfo-3.9
|221002
|link:https://svnweb.freebsd.org/changeset/base/25325[25325]
-|April 30, 1997
-|2.2-STABLE after top
+|30 апреля 1997
+|2.2-STABLE после обновления
|222000
|link:https://svnweb.freebsd.org/changeset/base/25851[25851]
-|May 16, 1997
+|16 мая 1997
|2.2.2-RELEASE
|222001
|link:https://svnweb.freebsd.org/changeset/base/25921[25921]
-|May 19, 1997
-|2.2-STABLE after 2.2.2-RELEASE
+|19 мая 1997
+|2.2-STABLE после 2.2.2-RELEASE
|225000
|link:https://svnweb.freebsd.org/changeset/base/30053[30053]
-|October 2, 1997
+|2 октября 1997
|2.2.5-RELEASE
|225001
|link:https://svnweb.freebsd.org/changeset/base/31300[31300]
-|November 20, 1997
-|2.2-STABLE after 2.2.5-RELEASE
+|20 ноября 1997
+|2.2-STABLE после 2.2.5-RELEASE
|225002
|link:https://svnweb.freebsd.org/changeset/base/32019[32019]
-|December 27, 1997
-|2.2-STABLE after ldconfig -R merge
+|27 декабря 1997
+|2.2-STABLE после слияния ldconfig -R
|226000
|link:https://svnweb.freebsd.org/changeset/base/34445[34445]
-|March 24, 1998
+|24 марта 1998
|2.2.6-RELEASE
|227000
|link:https://svnweb.freebsd.org/changeset/base/37803[37803]
-|July 21, 1998
+|21 июля 1998
|2.2.7-RELEASE
|227001
|link:https://svnweb.freebsd.org/changeset/base/37809[37809]
-|July 21, 1998
-|2.2-STABLE after 2.2.7-RELEASE
+|21 июля 1998
+|2.2-STABLE после 2.2.7-RELEASE
|227002
|link:https://svnweb.freebsd.org/changeset/base/39489[39489]
-|September 19, 1998
-|2.2-STABLE after man:semctl[2] change
+|19 сентября 1998
+|2.2-STABLE после изменения man:semctl[2]
|228000
|link:https://svnweb.freebsd.org/changeset/base/41403[41403]
-|November 29, 1998
+|29 ноября 1998
|2.2.8-RELEASE
|228001
|link:https://svnweb.freebsd.org/changeset/base/41418[41418]
-|November 29, 1998
-|2.2-STABLE after 2.2.8-RELEASE
+|29 ноября 1998
+|2.2-STABLE после 2.2.8-RELEASE
|===
[NOTE]
====
-Note that 2.2-STABLE sometimes identifies itself as "2.2.5-STABLE" after the 2.2.5-RELEASE. The pattern used to be year followed by the month, but we decided to change it to a more straightforward major/minor system starting from 2.2. This is because the parallel development on several branches made it infeasible to classify the releases merely by their real release dates. Do not worry about old -CURRENTs; they are listed here just for reference.
+Обратите внимание, что 2.2-STABLE иногда идентифицирует себя как "2.2.5-STABLE" после выпуска 2.2.5-RELEASE. Ранее использовался шаблон "год-месяц", но сообщество решило изменить его на более простую систему "основной/второстепенный", начиная с версии 2.2. Это связано с тем, что параллельная разработка нескольких веток сделала невозможным классифицировать выпуски только по датам их фактического выхода. Не беспокойтесь о старых версиях -CURRENT; они приведены здесь только для справки.
====
[[versions-2]]
-== FreeBSD 2 Before 2.2-RELEASE Versions
+== FreeBSD 2 Версии до 2.2-RELEASE
[[freebsd-versions-table-2]]
-.FreeBSD 2 Before 2.2-RELEASE `__FreeBSD_version` Values
+.FreeBSD 2 До версии 2.2-RELEASE Значения `__FreeBSD_version`
[cols="1,1,1,1", frame="none", options="header"]
|===
-| Value
-| Revision
-| Date
-| Release
+| Значение
+| Версия
+| Дата
+| Релиз
|119411
-|
-|
+|
+|
|2.0-RELEASE
|199501
|link:https://svnweb.freebsd.org/changeset/base/7153[7153]
-|March 19, 1995
+|19 марта 1995
|2.1-CURRENT
|199503
|link:https://svnweb.freebsd.org/changeset/base/7310[7310]
-|March 24, 1995
+|24 марта 1995
|2.1-CURRENT
|199504
|link:https://svnweb.freebsd.org/changeset/base/7704[7704]
-|April 9, 1995
+|9 апреля 1995
|2.0.5-RELEASE
|199508
|link:https://svnweb.freebsd.org/changeset/base/10297[10297]
-|August 26, 1995
-|2.2-CURRENT before 2.1
+|26 августа 1995
+|2.2-CURRENT до 2.1
|199511
|link:https://svnweb.freebsd.org/changeset/base/12189[12189]
-|November 10, 1995
+|10 ноября 1995
|2.1.0-RELEASE
|199512
|link:https://svnweb.freebsd.org/changeset/base/12196[12196]
-|November 10, 1995
-|2.2-CURRENT before 2.1.5
+|10 ноября 1995
+|2.2-CURRENT до 2.1.5
|199607
|link:https://svnweb.freebsd.org/changeset/base/17067[17067]
-|July 10, 1996
+|10 июля 1996
|2.1.5-RELEASE
|199608
|link:https://svnweb.freebsd.org/changeset/base/17127[17127]
-|July 12, 1996
-|2.2-CURRENT before 2.1.6
+|12 июля 1996
+|2.2-CURRENT до 2.1.6
|199612
|link:https://svnweb.freebsd.org/changeset/base/19358[19358]
-|November 15, 1996
+|15 ноября 1996
|2.1.6-RELEASE
|199612
-|
-|
+|
+|
|2.1.7-RELEASE
|===
diff --git a/documentation/content/ru/books/porters-handbook/versions/_index.po b/documentation/content/ru/books/porters-handbook/versions/_index.po
new file mode 100644
index 0000000000..cd5d88613c
--- /dev/null
+++ b/documentation/content/ru/books/porters-handbook/versions/_index.po
@@ -0,0 +1,33861 @@
+# SOME DESCRIPTIVE TITLE
+# Copyright (C) YEAR The FreeBSD Project
+# This file is distributed under the same license as the FreeBSD Documentation package.
+# Vladlen Popolitov <vladlenpopolitov@list.ru>, 2025.
+msgid ""
+msgstr ""
+"Project-Id-Version: FreeBSD Documentation VERSION\n"
+"POT-Creation-Date: 2025-09-18 22:05+0300\n"
+"PO-Revision-Date: 2025-08-19 04:45+0000\n"
+"Last-Translator: Vladlen Popolitov <vladlenpopolitov@list.ru>\n"
+"Language-Team: Russian <https://translate-dev.freebsd.org/projects/"
+"documentation/booksporters-handbookversions_index/ru/>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
+"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
+"X-Generator: Weblate 4.17\n"
+
+#. type: Yaml Front Matter Hash Value: description
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1
+#, no-wrap
+msgid "A list of changes to the sys/param.h file"
+msgstr "Список изменений файла sys/param.h"
+
+#. type: Yaml Front Matter Hash Value: title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1
+#, no-wrap
+msgid "Chapter 18. __FreeBSD_version Values"
+msgstr "Глава 18. Значения __FreeBSD_version"
+
+#. type: Title =
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:13
+#, no-wrap
+msgid "`__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version`"
+
+#. type: Plain text
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:51
+msgid ""
+"Here is a convenient list of `__FreeBSD_version` values as defined in "
+"https://cgit.freebsd.org/src/tree/sys/sys/param.h[sys/param.h]:"
+msgstr ""
+"Здесь удобный список значений `__FreeBSD_version` как определено в https://"
+"cgit.freebsd.org/src/tree/sys/sys/param.h[sys/param.h]:"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:53
+#, no-wrap
+msgid "FreeBSD 15 Versions"
+msgstr "Версии FreeBSD 15"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:56
+#, no-wrap
+msgid "FreeBSD 15 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` в FreeBSD 15"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:60
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:259
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:802
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1820
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2628
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3611
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4299
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4742
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5515
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5983
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6361
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6989
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7347
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7465
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7563
+#, no-wrap
+msgid "Value"
+msgstr "Значение"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:61
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:260
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:803
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1821
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2629
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3612
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4300
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4743
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5516
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5984
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6362
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6990
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7348
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7466
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7564
+#, no-wrap
+msgid "Revision"
+msgstr "Версия"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:62
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:261
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:804
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1822
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2630
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3613
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4301
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4744
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5517
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5985
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6363
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6991
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7349
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7467
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7565
+#, no-wrap
+msgid "Date"
+msgstr "Дата"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:64
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:263
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:806
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1824
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2632
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3615
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4303
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4746
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5519
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5987
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6365
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6993
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7351
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7469
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7567
+#, no-wrap
+msgid "Release"
+msgstr "Релиз"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:65
+#, no-wrap
+msgid "1500000"
+msgstr "1500000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:66
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:670
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:675
+#, no-wrap
+msgid "gitref:29a16ce065dbc28bc9e87c9bfadb08bb58b137e4[repository=\"src\",length=12]"
+msgstr "gitref:29a16ce065dbc28bc9e87c9bfadb08bb58b137e4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:67
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:671
+#, no-wrap
+msgid "August 24, 2023"
+msgstr "24 августа 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:69
+#, no-wrap
+msgid "15.0-CURRENT."
+msgstr "15.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:70
+#, no-wrap
+msgid "1500001"
+msgstr "1500001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:71
+#, no-wrap
+msgid "gitref:a6662c37b6ffee46e18be5f7570149edc64c1d0b[repository=\"src\",length=12]"
+msgstr "gitref:a6662c37b6ffee46e18be5f7570149edc64c1d0b[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:72
+#, no-wrap
+msgid "September 17, 2023"
+msgstr "17 сентября 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:74
+#, no-wrap
+msgid "15.0-CURRENT after implementing `fpu_kern_enter` and `fpu_kern_leave` for powerpc."
+msgstr "15.0-CURRENT после реализации `fpu_kern_enter` и `fpu_kern_leave` для powerpc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:75
+#, no-wrap
+msgid "1500002"
+msgstr "1500002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:76
+#, no-wrap
+msgid "gitref:17f5e2b904aff8e4863199a137ee21ef0939bcf4[repository=\"src\",length=12]"
+msgstr "gitref:17f5e2b904aff8e4863199a137ee21ef0939bcf4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:77
+#, no-wrap
+msgid "October 18, 2023"
+msgstr "18 октября 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:79
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:119
+#, no-wrap
+msgid "15.0-CURRENT after changing the internal KAPI between the nfscommon and nfscl modules."
+msgstr "15.0-CURRENT после изменения внутреннего KAPI между модулями nfscommon и nfscl."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:80
+#, no-wrap
+msgid "1500003"
+msgstr "1500003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:81
+#, no-wrap
+msgid "gitref:ef85fd507e6e1784a726bccd485129e00bb63311[repository=\"src\",length=12]"
+msgstr "gitref:ef85fd507e6e1784a726bccd485129e00bb63311[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:82
+#, no-wrap
+msgid "November 1, 2023"
+msgstr "1 ноября 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:84
+#, no-wrap
+msgid "15.0-CURRENT after removal of the forward compat code for the inode64 conversion."
+msgstr "15.0-CURRENT после удаления кода обратной совместимости для преобразования inode64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:85
+#, no-wrap
+msgid "1500004"
+msgstr "1500004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:86
+#, no-wrap
+msgid "gitref:7fabea328fed60d5207b262d2372e85a7f731eef[repository=\"src\",length=12]"
+msgstr "gitref:7fabea328fed60d5207b262d2372e85a7f731eef[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:87
+#, no-wrap
+msgid "November 23, 2023"
+msgstr "23 ноября 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:89
+#, no-wrap
+msgid "15.0-CURRENT after adding a new VFS function called `vfs_exjail_clone()`, which will be used by the ZFS module."
+msgstr "15.0-CURRENT после добавления новой функции VFS под названием `vfs_exjail_clone()`, которая будет использоваться модулем ZFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:90
+#, no-wrap
+msgid "1500005"
+msgstr "1500005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:91
+#, no-wrap
+msgid "gitref:21fce617d1de231a30833cdd9819ef61277b08d8[repository=\"src\",length=12]"
+msgstr "gitref:21fce617d1de231a30833cdd9819ef61277b08d8[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:92
+#, no-wrap
+msgid "November 27, 2023"
+msgstr "27 ноября 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:94
+#, no-wrap
+msgid "15.0-CURRENT after a string of mechanical changes to the tree: SCCS IDs removed, &#35;if 0'd copyright strings removed, mechanical style fix after this churn and some macros removed from [.filename]#sys/cdefs.h#."
+msgstr "15.0-CURRENT после серии механических изменений в дереве: идентификаторы SCCS удалены, закомментированные строки с авторскими правами удалены с помощью `#if 0`, механические исправления стиля после этих изменений и удаление некоторых макросов из [.filename]#sys/cdefs.h#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:95
+#, no-wrap
+msgid "1500006"
+msgstr "1500006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:96
+#, no-wrap
+msgid "gitref:c711af7727824da79d87f375f3d6829feec3799a[repository=\"src\",length=12]"
+msgstr "gitref:c711af7727824da79d87f375f3d6829feec3799a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:97
+#, no-wrap
+msgid "December 8, 2023"
+msgstr "8 декабря 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:99
+#, no-wrap
+msgid "15.0-CURRENT after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-17.0.6-0-g6009708b4367, a.k.a. 17.0.6 release."
+msgstr "15.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-17.0.6-0-g6009708b4367, также известного как релиз 17.0.6."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:100
+#, no-wrap
+msgid "1500007"
+msgstr "1500007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:101
+#, no-wrap
+msgid "gitref:8ccd0b876e67fda6249f294ff484798cc1e1569f[repository=\"src\",length=12]"
+msgstr "gitref:8ccd0b876e67fda6249f294ff484798cc1e1569f[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:102
+#, no-wrap
+msgid "December 11, 2023"
+msgstr "11 декабря 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:104
+#, no-wrap
+msgid "15.0-CURRENT after exposing execvpe for Linux compat in libc."
+msgstr "15.0-CURRENT после предоставления доступа к execvpe для совместимости с Linux в libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:105
+#, no-wrap
+msgid "1500008"
+msgstr "1500008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:106
+#, no-wrap
+msgid "gitref:9bf957fc9b378e0f9e65eb97e84c2166b450fccc[repository=\"src\",length=12]"
+msgstr "gitref:9bf957fc9b378e0f9e65eb97e84c2166b450fccc[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:107
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:686
+#, no-wrap
+msgid "December 24, 2023"
+msgstr "24 декабря 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:109
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:174
+#, no-wrap
+msgid "15.0-CURRENT after LinuxKPI changes."
+msgstr "15.0-CURRENT после изменений в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:110
+#, no-wrap
+msgid "1500009"
+msgstr "1500009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:111
+#, no-wrap
+msgid "gitref:b068bb09a1a82d9fef0e939ad6135443a959e290[repository=\"src\",length=12]"
+msgstr "gitref:b068bb09a1a82d9fef0e939ad6135443a959e290[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:112
+#, no-wrap
+msgid "January 11, 2024"
+msgstr "11 января 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:114
+#, no-wrap
+msgid "15.0-CURRENT after adding man:vnode_pager_clean_async[9] and man:vnode_pager_clean_sync[9]."
+msgstr "15.0-CURRENT после добавления man:vnode_pager_clean_async[9] и man:vnode_pager_clean_sync[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:115
+#, no-wrap
+msgid "1500010"
+msgstr "1500010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:116
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:121
+#, no-wrap
+msgid "gitref:a2da1bdb61bc2d9db0b4268f53281e7c0bbce0bc[repository=\"src\",length=12]"
+msgstr "gitref:a2da1bdb61bc2d9db0b4268f53281e7c0bbce0bc[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:117
+#, no-wrap
+msgid "January 12, 2024"
+msgstr "12 января 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:120
+#, no-wrap
+msgid "1500011"
+msgstr "1500011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:122
+#, no-wrap
+msgid "January 17, 2024"
+msgstr "17 января 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:124
+#, no-wrap
+msgid "15.0-CURRENT after adding zfs.dataset support to man:jail[8]."
+msgstr "15.0-CURRENT после добавления поддержки zfs.dataset в man:jail[8]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:125
+#, no-wrap
+msgid "1500012"
+msgstr "1500012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:126
+#, no-wrap
+msgid "gitref:120ceebab5d4947dfc80d7492effa034a925d43e[repository=\"src\",length=12]"
+msgstr "gitref:120ceebab5d4947dfc80d7492effa034a925d43e[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:127
+#, no-wrap
+msgid "January 24, 2024"
+msgstr "24 января 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:129
+#, no-wrap
+msgid "15.0-CURRENT after adding man:kern_openatfp[9] and man:kcmp[2]."
+msgstr "15.0-CURRENT после добавления man:kern_openatfp[9] и man:kcmp[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:130
+#, no-wrap
+msgid "1500013"
+msgstr "1500013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:131
+#, no-wrap
+msgid "gitref:d04abb05375d3525132f1e9f78090db3d0d27f14[repository=\"src\",length=12]"
+msgstr "gitref:d04abb05375d3525132f1e9f78090db3d0d27f14[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:132
+#, no-wrap
+msgid "February 7, 2024"
+msgstr "7 февраля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:134
+#, no-wrap
+msgid "15.0-CURRENT after adding libsys."
+msgstr "15.0-CURRENT после добавления libsys."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:135
+#, no-wrap
+msgid "1500014"
+msgstr "1500014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:136
+#, no-wrap
+msgid "gitref:ed27ae8df4b10f67289a32458d89d143e758f6d4[repository=\"src\",length=12]"
+msgstr "gitref:ed27ae8df4b10f67289a32458d89d143e758f6d4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:137
+#, no-wrap
+msgid "February 11, 2024"
+msgstr "11 февраля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:139
+#, no-wrap
+msgid "15.0-CURRENT after switching clang and other LLVM executables to build as PIE."
+msgstr "15.0-CURRENT после переключения clang и других исполняемых файлов LLVM на сборку как PIE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:140
+#, no-wrap
+msgid "1500015"
+msgstr "1500015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:141
+#, no-wrap
+msgid "gitref:a7b9f4d96e8bdc30db27ec7a193a8d8fdf7c652c[repository=\"src\",length=12]"
+msgstr "gitref:a7b9f4d96e8bdc30db27ec7a193a8d8fdf7c652c[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:142
+#, no-wrap
+msgid "March 13, 2024"
+msgstr "13 марта 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:144
+#, no-wrap
+msgid "15.0-CURRENT after removing redundant `type` and `rid` arguments from several functions in the new-bus resource API."
+msgstr "15.0-CURRENT после удаления избыточных аргументов `type` и `rid` из нескольких функций в API ресурсов new-bus."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:145
+#, no-wrap
+msgid "1500016"
+msgstr "1500016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:146
+#, no-wrap
+msgid "gitref:60bc9617e79e99bdf670304923f3baed4b749ad3[repository=\"src\",length=12]"
+msgstr "gitref:60bc9617e79e99bdf670304923f3baed4b749ad3[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:147
+#, no-wrap
+msgid "March 18, 2024"
+msgstr "18 марта 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:149
+#, no-wrap
+msgid "15.0-CURRENT after introducing man:livedump_start_vnode[9]."
+msgstr "15.0-CURRENT после введения man:livedump_start_vnode[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:150
+#, no-wrap
+msgid "1500017"
+msgstr "1500017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:151
+#, no-wrap
+msgid "gitref:bcd401b5a39c6186bb1fe450286299f2a481244c[repository=\"src\",length=12]"
+msgstr "gitref:bcd401b5a39c6186bb1fe450286299f2a481244c[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:152
+#, no-wrap
+msgid "March 20, 2024"
+msgstr "20 марта 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:154
+#, no-wrap
+msgid "15.0-CURRENT after fixing a clang assertion or crash when building recent boost libraries."
+msgstr "15.0-CURRENT после исправления утверждения или сбоя clang при сборке последних библиотек boost."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:155
+#, no-wrap
+msgid "1500018"
+msgstr "1500018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:156
+#, no-wrap
+msgid "gitref:0192eda105b367d4670205547e8e830e3716bea3[repository=\"src\",length=12]"
+msgstr "gitref:0192eda105b367d4670205547e8e830e3716bea3[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:157
+#, no-wrap
+msgid "April 6, 2024"
+msgstr "6 апреля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:159
+#, no-wrap
+msgid "15.0-CURRENT after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-18.1.3-0-gc13b7485b879, a.k.a. 18.1.3 release."
+msgstr "15.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-18.1.3-0-gc13b7485b879, также известной как релиз 18.1.3."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:160
+#, no-wrap
+msgid "1500019"
+msgstr "1500019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:161
+#, no-wrap
+msgid "gitref:e03e8b07743385e5b199409074fb60b1a9ed1fac[repository=\"src\",length=12]"
+msgstr "gitref:e03e8b07743385e5b199409074fb60b1a9ed1fac[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:162
+#, no-wrap
+msgid "May 31, 2024"
+msgstr "31 мая 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:164
+#, no-wrap
+msgid "15.0-CURRENT after redefining `CLOCK_BOOTTIME` to alias `CLOCK_MONOTONIC` instead of `CLOCK_UPTIME`."
+msgstr "15.0-CURRENT после переопределения `CLOCK_BOOTTIME` как псевдонима для `CLOCK_MONOTONIC` вместо `CLOCK_UPTIME`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:165
+#, no-wrap
+msgid "1500020"
+msgstr "1500020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:166
+#, no-wrap
+msgid "gitref:7818c2d37c2c600fc9ad6f2a0951e50dd21b17c8[repository=\"src\",length=12]"
+msgstr "gitref:7818c2d37c2c600fc9ad6f2a0951e50dd21b17c8[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:167
+#, no-wrap
+msgid "July 12, 2024"
+msgstr "12 июля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:169
+#, no-wrap
+msgid "15.0-CURRENT after removing support for building armv6."
+msgstr "15.0-CURRENT после удаления поддержки сборки armv6."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:170
+#, no-wrap
+msgid "1500021"
+msgstr "1500021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:171
+#, no-wrap
+msgid "gitref:24388fccd551f79f64e54099a7d78196535c0a29[repository=\"src\",length=12]"
+msgstr "gitref:24388fccd551f79f64e54099a7d78196535c0a29[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:172
+#, no-wrap
+msgid "July 21, 2024"
+msgstr "21 июля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:175
+#, no-wrap
+msgid "1500022"
+msgstr "1500022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:176
+#, no-wrap
+msgid "gitref:a1740cb93639648b41055958ad8c7f6083efdc96[repository=\"src\",length=12]"
+msgstr "gitref:a1740cb93639648b41055958ad8c7f6083efdc96[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:177
+#, no-wrap
+msgid "July 29, 2024"
+msgstr "29 июля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:179
+#, no-wrap
+msgid "15.0-CURRENT after removing kernel stack swapping support."
+msgstr "15.0-CURRENT после удаления поддержки подкачки стека ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:180
+#, no-wrap
+msgid "1500023"
+msgstr "1500023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:181
+#, no-wrap
+msgid "gitref:1206cf04a717a55bc15255ed043b066941cb43f2[repository=\"src\",length=12]"
+msgstr "gitref:1206cf04a717a55bc15255ed043b066941cb43f2[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:182
+#, no-wrap
+msgid "July 30, 2024"
+msgstr "30 июля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:184
+#, no-wrap
+msgid "15.0-CURRENT after adding new flags to man:malloc[9]."
+msgstr "15.0-CURRENT после добавления новых флагов в man:malloc[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:185
+#, no-wrap
+msgid "1500024"
+msgstr "1500024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:186
+#, no-wrap
+msgid "gitref:e3953c036f9d66c85b8e19f99f0710b3288ce5fb[repository=\"src\",length=12]"
+msgstr "gitref:e3953c036f9d66c85b8e19f99f0710b3288ce5fb[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:187
+#, no-wrap
+msgid "October 2, 2024"
+msgstr "2 октября 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:189
+#, no-wrap
+msgid "15.0-CURRENT after bumping [.filename]#libmd.so.6# to [.filename]#libmd.so.7#."
+msgstr "15.0-CURRENT после увеличения версии [.filename]#libmd.so.6# до [.filename]#libmd.so.7#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:190
+#, no-wrap
+msgid "1500025"
+msgstr "1500025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:191
+#, no-wrap
+msgid "gitref:9d52823bf1dfac237e58b5208299aaa5e2df42e9[repository=\"src\",length=12]"
+msgstr "gitref:9d52823bf1dfac237e58b5208299aaa5e2df42e9[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:192
+#, no-wrap
+msgid "October 6, 2024"
+msgstr "6 октября 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:194
+#, no-wrap
+msgid "15.0-CURRENT after widening the `flags` field in `vm_object`."
+msgstr "15.0-CURRENT после расширения поля `flags` в `vm_object`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:195
+#, no-wrap
+msgid "1500026"
+msgstr "1500026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:196
+#, no-wrap
+msgid "gitref:f3dbef108212460489ae68b4c47e20b73984f433[repository=\"src\",length=12]"
+msgstr "gitref:f3dbef108212460489ae68b4c47e20b73984f433[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:197
+#, no-wrap
+msgid "October 23, 2024"
+msgstr "23 октября 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:199
+#, no-wrap
+msgid "15.0-CURRENT after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-19.1.2-0-g7ba7d8e2f7b6, a.k.a. 19.1.2 release."
+msgstr "15.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-19.1.2-0-g7ba7d8e2f7b6, также известной как релиз 19.1.2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:200
+#, no-wrap
+msgid "1500027"
+msgstr "1500027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:201
+#, no-wrap
+msgid "gitref:893d044346d5ae5fe10cc188b8b0762efd2a5b27[repository=\"src\",length=12]"
+msgstr "gitref:893d044346d5ae5fe10cc188b8b0762efd2a5b27[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:202
+#, no-wrap
+msgid "November 14, 2024"
+msgstr "14 ноября 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:204
+#, no-wrap
+msgid "15.0-CURRENT after hiding `struct ifnet` and changing man:sound[4]'s device registration KPI."
+msgstr "15.0-CURRENT после скрытия `struct ifnet` и изменения KPI регистрации устройств man:sound[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:205
+#, no-wrap
+msgid "1500028"
+msgstr "1500028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:206
+#, no-wrap
+msgid "gitref:cab31f5633c1ffdd8b24749a3c9dd22c59568503[repository=\"src\",length=12]"
+msgstr "gitref:cab31f5633c1ffdd8b24749a3c9dd22c59568503[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:207
+#, no-wrap
+msgid "November 25, 2024"
+msgstr "25 ноября 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:209
+#, no-wrap
+msgid "15.0-CURRENT after adding a `TDA_PSELECT` flag for early restoration of signal masks."
+msgstr "15.0-CURRENT после добавления флага `TDA_PSELECT` для раннего восстановления масок сигналов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:210
+#, no-wrap
+msgid "1500029"
+msgstr "1500029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:211
+#, no-wrap
+msgid "gitref:46297859a74563dde6fc5bff9f9ecded9fb61ba6[repository=\"src\",length=12]"
+msgstr "gitref:46297859a74563dde6fc5bff9f9ecded9fb61ba6[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:212
+#, no-wrap
+msgid "December 6, 2024"
+msgstr "6 декабря 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:214
+#, no-wrap
+msgid "15.0-CURRENT after adding `bus_attach_children`, `bus_detach_children`, and `bus_identify_children`."
+msgstr "15.0-CURRENT после добавления `bus_attach_children`, `bus_detach_children` и `bus_identify_children`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:215
+#, no-wrap
+msgid "1500030"
+msgstr "1500030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:216
+#, no-wrap
+msgid "gitref:b196276c20b577b364372f1aa1a646b9ce34bf5c[repository=\"src\",length=12]"
+msgstr "gitref:b196276c20b577b364372f1aa1a646b9ce34bf5c[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:217
+#, no-wrap
+msgid "January 2, 2025"
+msgstr "2 января 2025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:219
+#, no-wrap
+msgid "15.0-CURRENT after changing `bus_generic_detach` to delete child devices after detaching them."
+msgstr "15.0-CURRENT после изменения `bus_generic_detach` для удаления дочерних устройств после их отключения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:220
+#, no-wrap
+msgid "1500037"
+msgstr "1500037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:221
+#, no-wrap
+msgid "gitref:7acd5af48cf1870ec48d5910dff1a26466d98074[repository=\"src\",length=12]"
+msgstr "gitref:7acd5af48cf1870ec48d5910dff1a26466d98074[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:222
+#, no-wrap
+msgid "April 12, 2025"
+msgstr "12 апреля 2025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:224
+#, no-wrap
+msgid "15.0-CURRENT after changing alloc changes to LinuxKPI."
+msgstr "15.0-CURRENT после внесения изменений в alloc в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:225
+#, no-wrap
+msgid "1500038"
+msgstr "1500038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:226
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:231
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:236
+#, no-wrap
+msgid "gitref:[repository=\"src\",length=12]"
+msgstr "gitref:[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:227
+#, no-wrap
+msgid "April 19, 2025"
+msgstr "19 апреля 2025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:229
+#, no-wrap
+msgid "15.0-CURRENT after removal of vm_page_next() and _prev."
+msgstr "15.0-CURRENT после удаления vm_page_next() и _prev."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:230
+#, no-wrap
+msgid "1500039"
+msgstr "1500039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:232
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:237
+#, no-wrap
+msgid "May 4, 2025"
+msgstr "4 мая 2025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:234
+#, no-wrap
+msgid "15.0-CURRENT after introducing a properly typed jiffies."
+msgstr "15.0-CURRENT после введения правильно типизированных jiffies."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:235
+#, no-wrap
+msgid "1500040"
+msgstr "1500040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:239
+#, no-wrap
+msgid "15.0-CURRENT after the internal API between the nfscommon and nfscl modules changed."
+msgstr "15.0-CURRENT после изменения внутреннего API между модулями nfscommon и nfscl."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:240
+#, no-wrap
+msgid "1500045"
+msgstr "1500045"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:241
+#, no-wrap
+msgid "gitref:a02180cf60a6a0102669b678e9c81ad9f1aa4d91[repository=\"src\",length=12]"
+msgstr "gitref:a02180cf60a6a0102669b678e9c81ad9f1aa4d91[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:242
+#, no-wrap
+msgid "June 3, 2025"
+msgstr "3 июня 2025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:244
+#, no-wrap
+msgid "15.0-CURRENT after pulling in dma-mapping.h changes from drm-kmod to LinuxKPI."
+msgstr "15.0-CURRENT после внесения изменений dma-mapping.h из drm-kmod в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:245
+#, no-wrap
+msgid "1500062"
+msgstr "1500062"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:246
+#, no-wrap
+msgid "gitref:567e6250c003eeb251b4bc8dbe60d2adabab2988[repository=\"src\",length=12]"
+msgstr "gitref:567e6250c003eeb251b4bc8dbe60d2adabab2988[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:247
+#, no-wrap
+msgid "August 17, 2025"
+msgstr "17 августа 2025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:249
+#, no-wrap
+msgid "15.0-CURRENT after introduction of VTYPE_ISDEV(), VN_ISDEV(), and VATTR_ISDEV()."
+msgstr "15.0-CURRENT после добавления VTYPE_ISDEV(), VN_ISDEV() и VATTR_ISDEV()."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:252
+#, no-wrap
+msgid "FreeBSD 14 Versions"
+msgstr "Версии FreeBSD 14"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:255
+#, no-wrap
+msgid "FreeBSD 14 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` в FreeBSD 14"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:264
+#, no-wrap
+msgid "1400000"
+msgstr "1400000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:265
+#, no-wrap
+msgid "gitref:a53ce3fc4938e37d5ec89304846203d2083c61a2[repository=\"src\",length=12]"
+msgstr "gitref:a53ce3fc4938e37d5ec89304846203d2083c61a2[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:266
+#, no-wrap
+msgid "January 22, 2021"
+msgstr "22 января 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:268
+#, no-wrap
+msgid "14.0-CURRENT."
+msgstr "14.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:269
+#, no-wrap
+msgid "1400001"
+msgstr "1400001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:270
+#, no-wrap
+msgid "gitref:739ecbcf1c4fd22b5f6ee0bb180a67644046a3e0[repository=\"src\",length=12]"
+msgstr "gitref:739ecbcf1c4fd22b5f6ee0bb180a67644046a3e0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:271
+#, no-wrap
+msgid "January 23, 2021"
+msgstr "23 января 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:273
+#, no-wrap
+msgid "14.0-CURRENT after adding symlink support to lockless lookup."
+msgstr "14.0-CURRENT после добавления поддержки символьных ссылок к бесблокировочному поиску."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:274
+#, no-wrap
+msgid "1400002"
+msgstr "1400002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:275
+#, no-wrap
+msgid "gitref:2cf84258922f306a3f84866685d2f5346f67db58[repository=\"src\",length=12]"
+msgstr "gitref:2cf84258922f306a3f84866685d2f5346f67db58[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:276
+#, no-wrap
+msgid "January 26, 2021"
+msgstr "26 января 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:278
+#, no-wrap
+msgid "14.0-CURRENT after fixing a clang assertion when building the package:devel/onetbb[] port."
+msgstr "14.0-CURRENT после исправления утверждения clang при сборке порта package:devel/onetbb[]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:279
+#, no-wrap
+msgid "1400003"
+msgstr "1400003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:280
+#, no-wrap
+msgid "gitref:d386f3a3c32f0396aa7995349dd65d6c59711393[repository=\"src\",length=12]"
+msgstr "gitref:d386f3a3c32f0396aa7995349dd65d6c59711393[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:281
+#, no-wrap
+msgid "January 28, 2021"
+msgstr "28 января 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:283
+#, no-wrap
+msgid "14.0-CURRENT after adding various LinuxKPI bits conflicting with drm-kmod."
+msgstr "14.0-CURRENT после добавления различных компонентов LinuxKPI, конфликтующих с drm-kmod."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:284
+#, no-wrap
+msgid "1400004"
+msgstr "1400004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:285
+#, no-wrap
+msgid "gitref:68f6800ce05c386ff045b4416d8595d09c4d8fdd[repository=\"src\",length=12]"
+msgstr "gitref:68f6800ce05c386ff045b4416d8595d09c4d8fdd[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:286
+#, no-wrap
+msgid "February 8, 2021"
+msgstr "8 февраля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:288
+#, no-wrap
+msgid "14.0-CURRENT after kernel interfaces for dispatching cryptographic operations were changed."
+msgstr "14.0-CURRENT после изменения интерфейсов ядра для диспетчеризации криптографических операций."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:289
+#, no-wrap
+msgid "1400005"
+msgstr "1400005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:290
+#, no-wrap
+msgid "gitref:45eabf5754ac1d291bd677fdf29f59ce4bbc2c8f[repository=\"src\",length=12]"
+msgstr "gitref:45eabf5754ac1d291bd677fdf29f59ce4bbc2c8f[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:291
+#, no-wrap
+msgid "February 17, 2021"
+msgstr "17 февраля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:293
+#, no-wrap
+msgid "14.0-CURRENT after changing the API of man:ptrace[2] `PT_GETDBREGS`/`PT_SETDBREGS` on arm64."
+msgstr "14.0-CURRENT после изменения API man:ptrace[2] `PT_GETDBREGS`/`PT_SETDBREGS` на arm64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:294
+#, no-wrap
+msgid "1400006"
+msgstr "1400006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:295
+#, no-wrap
+msgid "gitref:c96151d33509655efb7fb26768cb56a041c176f1[repository=\"src\",length=12]"
+msgstr "gitref:c96151d33509655efb7fb26768cb56a041c176f1[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:296
+#, no-wrap
+msgid "March 17, 2021"
+msgstr "17 марта 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:298
+#, no-wrap
+msgid "14.0-CURRENT after adding man:sndstat[4] enumeration ioctls."
+msgstr "14.0-CURRENT после добавления перечисляющих ioctl в man:sndstat[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:299
+#, no-wrap
+msgid "1400007"
+msgstr "1400007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:300
+#, no-wrap
+msgid "gitref:d36d6816151705907393889d661cbfd25c630ca8[repository=\"src\",length=12]"
+msgstr "gitref:d36d6816151705907393889d661cbfd25c630ca8[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:301
+#, no-wrap
+msgid "April 6, 2021"
+msgstr "6 апреля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:303
+#, no-wrap
+msgid "14.0-CURRENT after fixing wrong `dlpi_tls_data`."
+msgstr "14.0-CURRENT после исправления некорректного `dlpi_tls_data`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:304
+#, no-wrap
+msgid "1400008"
+msgstr "1400008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:305
+#, no-wrap
+msgid "gitref:e152bbecb221a592e7dbcabe3d1170a60f0d0dfe[repository=\"src\",length=12]"
+msgstr "gitref:e152bbecb221a592e7dbcabe3d1170a60f0d0dfe[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:306
+#, no-wrap
+msgid "April 11, 2021"
+msgstr "11 апреля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:308
+#, no-wrap
+msgid "14.0-CURRENT after changing the internal KAPI between the `krpc` and NFS modules."
+msgstr "14.0-CURRENT после изменения внутреннего KAPI между модулями `krpc` и NFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:309
+#, no-wrap
+msgid "1400009"
+msgstr "1400009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:310
+#, no-wrap
+msgid "gitref:9ca874cf740ee68c5742df8b5f9e20910085c011[repository=\"src\",length=12]"
+msgstr "gitref:9ca874cf740ee68c5742df8b5f9e20910085c011[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:311
+#, no-wrap
+msgid "April 20, 2021"
+msgstr "20 апреля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:313
+#, no-wrap
+msgid "14.0-CURRENT after adding TCP LRO support for VLAN and VxLAN."
+msgstr "14.0-CURRENT после добавления поддержки TCP LRO для VLAN и VxLAN."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:314
+#, no-wrap
+msgid "1400010"
+msgstr "1400010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:315
+#, no-wrap
+msgid "gitref:a3a02acde1009f03dc78e979e051acee9f9247c2[repository=\"src\",length=12]"
+msgstr "gitref:a3a02acde1009f03dc78e979e051acee9f9247c2[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:316
+#, no-wrap
+msgid "April 21, 2021"
+msgstr "21 апреля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:318
+#, no-wrap
+msgid "14.0-CURRENT after changing the man:sndstat[4] ioctls `nvlist` schema and definitions."
+msgstr "14.0-CURRENT после изменения схемы и определений `nvlist` для ioctl man:sndstat[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:319
+#, no-wrap
+msgid "1400015"
+msgstr "1400015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:320
+#, no-wrap
+msgid "gitref:d72cd275187c6399caf0ca4125292dc7e55fa478[repository=\"src\",length=12]"
+msgstr "gitref:d72cd275187c6399caf0ca4125292dc7e55fa478[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:321
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:326
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:331
+#, no-wrap
+msgid "May 25, 2021"
+msgstr "25 мая 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:323
+#, no-wrap
+msgid "14.0-CURRENT after adding more LinuxKPI changes needing adjustments to drm-kmod."
+msgstr "14.0-CURRENT после добавления дополнительных изменений LinuxKPI, требующих корректировки drm-kmod."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:324
+#, no-wrap
+msgid "1400016"
+msgstr "1400016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:325
+#, no-wrap
+msgid "gitref:21e3c1fbe2460f144f6d4dfd61c3346b2de59667[repository=\"src\",length=12]"
+msgstr "gitref:21e3c1fbe2460f144f6d4dfd61c3346b2de59667[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:328
+#, no-wrap
+msgid "14.0-CURRENT after removing support for KTLS software backends."
+msgstr "14.0-CURRENT после удаления поддержки программных бэкендов KTLS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:329
+#, no-wrap
+msgid "1400017"
+msgstr "1400017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:330
+#, no-wrap
+msgid "gitref:beb817edfe22cdea91e19a60c42caabd9404da48[repository=\"src\",length=12]"
+msgstr "gitref:beb817edfe22cdea91e19a60c42caabd9404da48[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:333
+#, no-wrap
+msgid "14.0-CURRENT after adding `crypto_cursor_segment()`."
+msgstr "14.0-CURRENT после добавления `crypto_cursor_segment()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:334
+#, no-wrap
+msgid "1400018"
+msgstr "1400018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:335
+#, no-wrap
+msgid "gitref:a4b07a2701f568c2c0f0c0426091f1489244a92d[repository=\"src\",length=12]"
+msgstr "gitref:a4b07a2701f568c2c0f0c0426091f1489244a92d[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:336
+#, no-wrap
+msgid "May 30, 2021"
+msgstr "30 мая 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:338
+#, no-wrap
+msgid "14.0-CURRENT after allowing the man:VFS_QUOTACTL[9] implementation to indicate busy state changes."
+msgstr "14.0-CURRENT после разрешения реализации man:VFS_QUOTACTL[9] указывать изменения состояния занятости."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:339
+#, no-wrap
+msgid "1400019"
+msgstr "1400019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:340
+#, no-wrap
+msgid "gitref:37d64dcdfa519157aff9711f1f226ad7bd778f46[repository=\"src\",length=12]"
+msgstr "gitref:37d64dcdfa519157aff9711f1f226ad7bd778f46[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:341
+#, no-wrap
+msgid "June 7, 2021"
+msgstr "7 июня 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:343
+#, no-wrap
+msgid "14.0-CURRENT after including `pr_err_once()` in the LinuxKPI [.filename]#printk.h#."
+msgstr "14.0-CURRENT после включения `pr_err_once()` в LinuxKPI [.filename]#printk.h#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:344
+#, no-wrap
+msgid "1400020"
+msgstr "1400020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:345
+#, no-wrap
+msgid "gitref:8a1a42b2a7a428fb97fda9f19fd0d67a4eec7535[repository=\"src\",length=12]"
+msgstr "gitref:8a1a42b2a7a428fb97fda9f19fd0d67a4eec7535[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:346
+#, no-wrap
+msgid "June 9, 2021"
+msgstr "9 июня 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:348
+#, no-wrap
+msgid "14.0-CURRENT after adding macros for `might_lock_nested()` and `lockdep_(re/un/)pin_lock()` to the LinuxKPI."
+msgstr "14.0-CURRENT после добавления макросов для `might_lock_nested()` и `lockdep_(re/un/)pin_lock()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:349
+#, no-wrap
+msgid "1400021"
+msgstr "1400021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:350
+#, no-wrap
+msgid "gitref:b47f461c8e67253fdb394968428b760e880baa08[repository=\"src\",length=12]"
+msgstr "gitref:b47f461c8e67253fdb394968428b760e880baa08[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:351
+#, no-wrap
+msgid "June 10, 2021"
+msgstr "10 июня 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:353
+#, no-wrap
+msgid "14.0-CURRENT after adding a `list_for_each_entry_lockless()` macro to the LinuxKPI."
+msgstr "14.0-CURRENT после добавления макроса `list_for_each_entry_lockless()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:354
+#, no-wrap
+msgid "1400022"
+msgstr "1400022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:355
+#, no-wrap
+msgid "gitref:40cc9a3a6b81a65a03712dfd93bbed48552a97ad[repository=\"src\",length=12]"
+msgstr "gitref:40cc9a3a6b81a65a03712dfd93bbed48552a97ad[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:356
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1569
+#, no-wrap
+msgid "June 11, 2021"
+msgstr "11 июня 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:358
+#, no-wrap
+msgid "14.0-CURRENT after commit gitref:e1a907a25cfa422c0d1acaf9f91352ada04f4bca[repository=\"src\",length=12] changed the internal KAPI between the `krpc` and nfsserver modules."
+msgstr "14.0-CURRENT после коммита gitref:e1a907a25cfa422c0d1acaf9f91352ada04f4bca[repository=\"src\",length=12] изменил внутренний KAPI между модулями `krpc` и nfsserver."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:359
+#, no-wrap
+msgid "1400023"
+msgstr "1400023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:360
+#, no-wrap
+msgid "gitref:d409305fa3838fb39b38c26fc085fb729b8766d5[repository=\"src\",length=12]"
+msgstr "gitref:d409305fa3838fb39b38c26fc085fb729b8766d5[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:361
+#, no-wrap
+msgid "June 13, 2021"
+msgstr "13 июня 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:363
+#, no-wrap
+msgid "14.0-CURRENT after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-12.0.0-0-gd28af7c654d8, a.k.a. 12.0.0 release."
+msgstr "14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-12.0.0-0-gd28af7c654d8, также известной как релиз 12.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:364
+#, no-wrap
+msgid "1400024"
+msgstr "1400024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:365
+#, no-wrap
+msgid "gitref:41dfd8bd6466fd39957dee2614d88c81cdf420a7[repository=\"src\",length=12]"
+msgstr "gitref:41dfd8bd6466fd39957dee2614d88c81cdf420a7[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:366
+#, no-wrap
+msgid "June 18, 2021"
+msgstr "18 июня 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:368
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:373
+#, no-wrap
+msgid "14.0-CURRENT after various additions to LinuxKPI."
+msgstr "14.0-CURRENT после различных добавлений в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:369
+#, no-wrap
+msgid "1400025"
+msgstr "1400025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:370
+#, no-wrap
+msgid "gitref:5fa1eb1cd927219070b5753b64114a9240d76bf8[repository=\"src\",length=12]"
+msgstr "gitref:5fa1eb1cd927219070b5753b64114a9240d76bf8[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:371
+#, no-wrap
+msgid "July 5, 2021"
+msgstr "5 июля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:374
+#, no-wrap
+msgid "1400026"
+msgstr "1400026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:375
+#, no-wrap
+msgid "gitref:fad3f322efb53d4924fdda34f9f23f881659c269[repository=\"src\",length=12]"
+msgstr "gitref:fad3f322efb53d4924fdda34f9f23f881659c269[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:376
+#, no-wrap
+msgid "July 16, 2021"
+msgstr "16 июля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:378
+#, no-wrap
+msgid "14.0-CURRENT after changing the internal KAPI between the nfscommon and nfsd modules."
+msgstr "14.0-CURRENT после изменения внутреннего KAPI между модулями nfscommon и nfsd."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:379
+#, no-wrap
+msgid "1400027"
+msgstr "1400027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:380
+#, no-wrap
+msgid "gitref:cc55ee8009a550810d38777fd6ace9abf3a2f6b4[repository=\"src\",length=12]"
+msgstr "gitref:cc55ee8009a550810d38777fd6ace9abf3a2f6b4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:381
+#, no-wrap
+msgid "July 28, 2021"
+msgstr "28 июля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:383
+#, no-wrap
+msgid "14.0-CURRENT after adding out-of-line LSE atomics helpers to [.filename]#libcompiler_rt.a# on aarch64."
+msgstr "14.0-CURRENT после добавления вспомогательных функций LSE атомарных операций вне строки в [.filename]#libcompiler_rt.a# для архитектуры aarch64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:384
+#, no-wrap
+msgid "1400028"
+msgstr "1400028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:385
+#, no-wrap
+msgid "gitref:792b602a337ddc5efaa5e5326d9433fe3da7f303[repository=\"src\",length=12]"
+msgstr "gitref:792b602a337ddc5efaa5e5326d9433fe3da7f303[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:386
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1594
+#, no-wrap
+msgid "July 31, 2021"
+msgstr "31 июля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:388
+#, no-wrap
+msgid "14.0-CURRENT after making FPU sections thread-safe in the LinuxKPI."
+msgstr "14.0-CURRENT после обеспечения потокобезопасности разделов FPU в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:389
+#, no-wrap
+msgid "1400029"
+msgstr "1400029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:390
+#, no-wrap
+msgid "gitref:245ec7651e4221043d1032fb3f82f335dc65fc7f[repository=\"src\",length=12]"
+msgstr "gitref:245ec7651e4221043d1032fb3f82f335dc65fc7f[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:391
+#, no-wrap
+msgid "August 5, 2021"
+msgstr "5 августа 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:393
+#, no-wrap
+msgid "14.0-CURRENT after adding man:fspacectl[2], man:vn_deallocate[9] and man:VOP_DEALLOCATE[9]."
+msgstr "14.0-CURRENT после добавления man:fspacectl[2], man:vn_deallocate[9] и man:VOP_DEALLOCATE[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:394
+#, no-wrap
+msgid "1400030"
+msgstr "1400030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:395
+#, no-wrap
+msgid "gitref:95941b963606f6e03282cd6f866f3166dcedfa5b[repository=\"src\",length=12]"
+msgstr "gitref:95941b963606f6e03282cd6f866f3166dcedfa5b[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:396
+#, no-wrap
+msgid "August 12, 2021"
+msgstr "12 августа 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:398
+#, no-wrap
+msgid "14.0-CURRENT after man:VOP_DEALLOCATE[9] parameter changes and addition of man:fspacectl[2] support to POSIX shared memory."
+msgstr "14.0-CURRENT после изменений параметров man:VOP_DEALLOCATE[9] и добавления поддержки man:fspacectl[2] для POSIX разделяемой памяти."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:399
+#, no-wrap
+msgid "1400031"
+msgstr "1400031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:400
+#, no-wrap
+msgid "gitref:1a4c5061fc5ba8f2eee41456a6873547915f268a[repository=\"src\",length=12]"
+msgstr "gitref:1a4c5061fc5ba8f2eee41456a6873547915f268a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:401
+#, no-wrap
+msgid "August 24, 2021"
+msgstr "24 августа 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:403
+#, no-wrap
+msgid "14.0-CURRENT after changing man:fspacectl[2], man:vn_deallocate[9] and man:VOP_DEALLOCATE[9] to update rmsr.r_offset to a meaningful value."
+msgstr "14.0-CURRENT после изменения man:fspacectl[2], man:vn_deallocate[9] и man:VOP_DEALLOCATE[9] для обновления rmsr.r_offset до значимого значения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:404
+#, no-wrap
+msgid "1400032"
+msgstr "1400032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:405
+#, no-wrap
+msgid "gitref:76321d2d432ed270d93b282e54e59b708c0cf3b4[repository=\"src\",length=12]"
+msgstr "gitref:76321d2d432ed270d93b282e54e59b708c0cf3b4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:406
+#, no-wrap
+msgid "August 25, 2021"
+msgstr "25 августа 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:408
+#, no-wrap
+msgid "14.0-CURRENT after changing man:fspacectl[2], man:vn_deallocate[9] and man:VOP_DEALLOCATE[9] to make calculating the number of bytes zeroed easier."
+msgstr "14.0-CURRENT после изменения man:fspacectl[2], man:vn_deallocate[9] и man:VOP_DEALLOCATE[9] для упрощения подсчёта количества обнулённых байт."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:409
+#, no-wrap
+msgid "1400033"
+msgstr "1400033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:410
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:415
+#, no-wrap
+msgid "gitref:c751d067c166db71ce8bf3a323c62ac3428bd32a[repository=\"src\",length=12]"
+msgstr "gitref:c751d067c166db71ce8bf3a323c62ac3428bd32a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:411
+#, no-wrap
+msgid "September 7, 2021"
+msgstr "7 сентября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:413
+#, no-wrap
+msgid "14.0-CURRENT after moving the socket buffer locks into the containing socket and renaming sb(un)lock to SOCK_IO_RECV_LOCK, SOCK_IO_RECV_UNLOCK, SOCK_IO_SEND_LOCK, and SOCK_IO_SEND_UNLOCK."
+msgstr "14.0-CURRENT после перемещения блокировок буфера сокета в содержащий сокет и переименования sb(un)lock в SOCK_IO_RECV_LOCK, SOCK_IO_RECV_UNLOCK, SOCK_IO_SEND_LOCK и SOCK_IO_SEND_UNLOCK."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:414
+#, no-wrap
+msgid "1400034"
+msgstr "1400034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:416
+#, no-wrap
+msgid "September 29, 2021"
+msgstr "29 сентября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:418
+#, no-wrap
+msgid "14.0-CURRENT after LinuxKPI changes."
+msgstr "14.0-CURRENT после изменений в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:419
+#, no-wrap
+msgid "1400035"
+msgstr "1400035"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:420
+#, no-wrap
+msgid "gitref:16f1ee11e6574d7f8d8a9dc6ebc9be3036ff9fd0[repository=\"src\",length=12]"
+msgstr "gitref:16f1ee11e6574d7f8d8a9dc6ebc9be3036ff9fd0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:421
+#, no-wrap
+msgid "October 4, 2021"
+msgstr "4 октября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:423
+#, no-wrap
+msgid "14.0-CURRENT after splitting libtinfow from libncurses."
+msgstr "14.0-CURRENT после разделения libtinfow и libncurses."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:424
+#, no-wrap
+msgid "1400036"
+msgstr "1400036"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:425
+#, no-wrap
+msgid "gitref:ac847dbf73685a5df9f70bbcdefa9fdeb559071d[repository=\"src\",length=12]"
+msgstr "gitref:ac847dbf73685a5df9f70bbcdefa9fdeb559071d[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:426
+#, no-wrap
+msgid "October 6, 2021"
+msgstr "6 октября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:428
+#, no-wrap
+msgid "14.0-CURRENT after extending the AES-CCM and Chacha20-Poly1305 ciphers in OCF to support multiple nonce lengths."
+msgstr "14.0-CURRENT после расширения шифров AES-CCM и Chacha20-Poly1305 в OCF для поддержки нескольких длин одноразовых номеров."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:429
+#, no-wrap
+msgid "1400037"
+msgstr "1400037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:430
+#, no-wrap
+msgid "gitref:2b68eb8e1dbbdaf6a0df1c83b26f5403ca52d4c3[repository=\"src\",length=12]"
+msgstr "gitref:2b68eb8e1dbbdaf6a0df1c83b26f5403ca52d4c3[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:431
+#, no-wrap
+msgid "October 11, 2021"
+msgstr "11 октября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:433
+#, no-wrap
+msgid "14.0-CURRENT after removal of thread argument from man:VOP_STAT[9] and `fo_stat`."
+msgstr "14.0-CURRENT после удаления аргумента thread из man:VOP_STAT[9] и `fo_stat`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:434
+#, no-wrap
+msgid "1400038"
+msgstr "1400038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:435
+#, no-wrap
+msgid "gitref:0d6516b453469ce1d92ec903c4c4df9ee08be0f9[repository=\"src\",length=12]"
+msgstr "gitref:0d6516b453469ce1d92ec903c4c4df9ee08be0f9[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:436
+#, no-wrap
+msgid "October 17, 2021"
+msgstr "17 октября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:438
+#, no-wrap
+msgid "14.0-CURRENT after LinuxKPI gained support of lazy BAR allocation."
+msgstr "14.0-CURRENT после того, как LinuxKPI получил поддержку отложенного выделения BAR."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:439
+#, no-wrap
+msgid "1400039"
+msgstr "1400039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:440
+#, no-wrap
+msgid "gitref:bd49c454ca62170506a98959c1acab7ad50c3276[repository=\"src\",length=12]"
+msgstr "gitref:bd49c454ca62170506a98959c1acab7ad50c3276[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:441
+#, no-wrap
+msgid "October 19, 2021"
+msgstr "19 октября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:443
+#, no-wrap
+msgid "14.0-CURRENT after page allocator changes."
+msgstr "14.0-CURRENT после изменений в аллокаторе страниц."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:444
+#, no-wrap
+msgid "1400040"
+msgstr "1400040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:445
+#, no-wrap
+msgid "gitref:f38bef2ce417d6270f32b4ed17cec84bfd95d548[repository=\"src\",length=12]"
+msgstr "gitref:f38bef2ce417d6270f32b4ed17cec84bfd95d548[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:446
+#, no-wrap
+msgid "October 30, 2021"
+msgstr "30 октября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:448
+#, no-wrap
+msgid "14.0-CURRENT after libdialog shared library version number bump."
+msgstr "14.0-CURRENT после увеличения номера версии разделяемой библиотеки libdialog."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:449
+#, no-wrap
+msgid "1400041"
+msgstr "1400041"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:450
+#, no-wrap
+msgid "gitref:0c276dee030b241e12e1ceb1b2ab619004f08ce1[repository=\"src\",length=12]"
+msgstr "gitref:0c276dee030b241e12e1ceb1b2ab619004f08ce1[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:451
+#, no-wrap
+msgid "November 6, 2021"
+msgstr "6 ноября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:453
+#, no-wrap
+msgid "14.0-CURRENT after changing the arguments for man:VOP_ALLOCATE[9]."
+msgstr "14.0-CURRENT после изменения аргументов для man:VOP_ALLOCATE[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:454
+#, no-wrap
+msgid "1400042"
+msgstr "1400042"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:455
+#, no-wrap
+msgid "gitref:20aa359773befc8182f6b5dcb5aad7390cab6c26[repository=\"src\",length=12]"
+msgstr "gitref:20aa359773befc8182f6b5dcb5aad7390cab6c26[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:456
+#, no-wrap
+msgid "November 13, 2021"
+msgstr "13 ноября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:458
+#, no-wrap
+msgid "14.0-CURRENT after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-13.0.0-0-gd7b669b3a303, a.k.a. 13.0.0 release."
+msgstr "14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-13.0.0-0-gd7b669b3a303, также известного как релиз 13.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:459
+#, no-wrap
+msgid "1400043"
+msgstr "1400043"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:460
+#, no-wrap
+msgid "gitref:7e1d3eefd410ca0fbae5a217422821244c3eeee4[repository=\"src\",length=12]"
+msgstr "gitref:7e1d3eefd410ca0fbae5a217422821244c3eeee4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:461
+#, no-wrap
+msgid "November 25, 2021"
+msgstr "25 ноября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:463
+#, no-wrap
+msgid "14.0-CURRENT after removing the unused thread argument from man:NDINIT[9]*."
+msgstr "14.0-CURRENT после удаления неиспользуемого аргумента потока из man:NDINIT[9]*."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:464
+#, no-wrap
+msgid "1400044"
+msgstr "1400044"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:465
+#, no-wrap
+msgid "gitref:ec434c85b46dd715da1940e2a8911bf476b0e477[repository=\"src\",length=12]"
+msgstr "gitref:ec434c85b46dd715da1940e2a8911bf476b0e477[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:466
+#, no-wrap
+msgid "December 9, 2021"
+msgstr "9 декабря 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:468
+#, no-wrap
+msgid "14.0-CURRENT after changing in-kernel software crypto ciphers transforms to support AEAD ciphers and changing the Blake-2S/B auth transforms to support Init before Setkey like other auth transforms."
+msgstr "14.0-CURRENT после изменения встроенных программных криптографических преобразований для поддержки AEAD-шифров и изменения аутентификационных преобразований Blake-2S/B для поддержки Init перед Setkey, как в других аутентификационных преобразованиях."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:469
+#, no-wrap
+msgid "1400045"
+msgstr "1400045"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:470
+#, no-wrap
+msgid "gitref:b214fcceacad6b842545150664bd2695c1c2b34f[repository=\"src\",length=12]"
+msgstr "gitref:b214fcceacad6b842545150664bd2695c1c2b34f[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:471
+#, no-wrap
+msgid "December 15, 2021"
+msgstr "15 декабря 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:473
+#, no-wrap
+msgid "14.0-CURRENT after changing man:VOP_READDIR[9]'s cookies argument to a `**uint64_t`."
+msgstr "14.0-CURRENT после изменения аргумента cookies в man:VOP_READDIR[9] на `**uint64_t`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:474
+#, no-wrap
+msgid "1400046"
+msgstr "1400046"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:475
+#, no-wrap
+msgid "gitref:e2650af157bc7489deaf2c9054995f0f88a6e5da[repository=\"src\",length=12]"
+msgstr "gitref:e2650af157bc7489deaf2c9054995f0f88a6e5da[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:476
+#, no-wrap
+msgid "December 30, 2021"
+msgstr "30 декабря 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:478
+#, no-wrap
+msgid "14.0-CURRENT after making the CPU_SET macros compatible with glibc."
+msgstr "14.0-CURRENT после приведения макросов CPU_SET в соответствие с glibc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:479
+#, no-wrap
+msgid "1400047"
+msgstr "1400047"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:480
+#, no-wrap
+msgid "gitref:ed6417cd8d0bb5a2c175fce9d8e4a495fae9e9f4[repository=\"src\",length=12]"
+msgstr "gitref:ed6417cd8d0bb5a2c175fce9d8e4a495fae9e9f4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:481
+#, no-wrap
+msgid "January 17, 2022"
+msgstr "January 17, 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:483
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:563
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:573
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:578
+#, no-wrap
+msgid "14.0-CURRENT after multiple LinuxKPI changes required by drm-kmod."
+msgstr "14.0-CURRENT после множества изменений LinuxKPI, необходимых для drm-kmod."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:484
+#, no-wrap
+msgid "1400048"
+msgstr "1400048"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:485
+#, no-wrap
+msgid "gitref:dd2f7a4b45eb1285e710cfce60cb77f7c11f8075[repository=\"src\",length=12]"
+msgstr "gitref:dd2f7a4b45eb1285e710cfce60cb77f7c11f8075[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:486
+#, no-wrap
+msgid "January 18, 2022"
+msgstr "18 января 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:488
+#, no-wrap
+msgid "14.0-CURRENT after adding <crypto/chacha20_poly1305.h>."
+msgstr "14.0-CURRENT после добавления <crypto/chacha20_poly1305.h>."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:489
+#, no-wrap
+msgid "1400049"
+msgstr "1400049"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:490
+#, no-wrap
+msgid "gitref:2c4b65cc3d227f31864e183c15f6c42e2c596cd9[repository=\"src\",length=12]"
+msgstr "gitref:2c4b65cc3d227f31864e183c15f6c42e2c596cd9[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:491
+#, no-wrap
+msgid "January 24, 2022"
+msgstr "January 24, 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:493
+#, no-wrap
+msgid "14.0-CURRENT after adding <crypto/curve25519.h>."
+msgstr "14.0-CURRENT after adding <crypto/curve25519.h>."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:494
+#, no-wrap
+msgid "1400050"
+msgstr "1400050"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:495
+#, no-wrap
+msgid "gitref:213e91399b7998554d787bb290109ebe602aa279[repository=\"src\",length=12]"
+msgstr "gitref:213e91399b7998554d787bb290109ebe602aa279[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:496
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:501
+#, no-wrap
+msgid "January 25, 2022"
+msgstr "25 января 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:498
+#, no-wrap
+msgid "14.0-CURRENT after iflib adds the feature that a driver can set its own TX queue selection function as `ift_txq_select` in struct `if_txrx`."
+msgstr "14.0-CURRENT после iflib добавляет возможность, при которой драйвер может установить свою собственную функцию выбора TX-очереди как `ift_txq_select` в структуре `if_txrx`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:499
+#, no-wrap
+msgid "1400051"
+msgstr "1400051"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:500
+#, no-wrap
+msgid "gitref:59d465e200bb7058dfdb183c061730c10dd5bc03[repository=\"src\",length=12]"
+msgstr "gitref:59d465e200bb7058dfdb183c061730c10dd5bc03[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:503
+#, no-wrap
+msgid "14.0-CURRENT after adding i2c support for LinuxKPI."
+msgstr "14.0-CURRENT после добавления поддержки i2c для LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:504
+#, no-wrap
+msgid "1400052"
+msgstr "1400052"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:505
+#, no-wrap
+msgid "gitref:05f0b24bfb3416606c8ea02bc1bdb9bcee7aee0c[repository=\"src\",length=12]"
+msgstr "gitref:05f0b24bfb3416606c8ea02bc1bdb9bcee7aee0c[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:506
+#, no-wrap
+msgid "February 14, 2022"
+msgstr "February 14, 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:508
+#, no-wrap
+msgid "14.0-CURRENT after adding GUID_INIT and pm_qos.h support for LinuxKPI."
+msgstr "14.0-CURRENT после добавления поддержки GUID_INIT и pm_qos.h для LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:509
+#, no-wrap
+msgid "1400053"
+msgstr "1400053"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:510
+#, no-wrap
+msgid "gitref:ba87e9bf74202b08b8e3b0a297b9b88f6869fbfb[repository=\"src\",length=12]"
+msgstr "gitref:ba87e9bf74202b08b8e3b0a297b9b88f6869fbfb[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:511
+#, no-wrap
+msgid "February 17, 2022"
+msgstr "February 17, 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:513
+#, no-wrap
+msgid "14.0-CURRENT after adding mmap_lock.h to LinuxKPI."
+msgstr "14.0-CURRENT после добавления mmap_lock.h в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:514
+#, no-wrap
+msgid "1400054"
+msgstr "1400054"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:515
+#, no-wrap
+msgid "gitref:50bb3a33d879536e86e8a23365f070ef00b5cb32[repository=\"src\",length=12]"
+msgstr "gitref:50bb3a33d879536e86e8a23365f070ef00b5cb32[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:516
+#, no-wrap
+msgid "March 28, 2022"
+msgstr "28 марта 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:518
+#, no-wrap
+msgid "14.0-CURRENT after changing `irq_work_queue` to return a bool in LinuxKPI to match 5.10 API."
+msgstr "14.0-CURRENT после изменения `irq_work_queue` для возврата типа bool в LinuxKPI в соответствии с API 5.10."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:519
+#, no-wrap
+msgid "1400055"
+msgstr "1400055"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:520
+#, no-wrap
+msgid "gitref:d69af4758be912625ec08656ba64eb90a98c9a7f[repository=\"src\",length=12]"
+msgstr "gitref:d69af4758be912625ec08656ba64eb90a98c9a7f[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:521
+#, no-wrap
+msgid "March 29, 2022"
+msgstr "29 марта 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:523
+#, no-wrap
+msgid "14.0-CURRENT after adding `for_each_sgtable_dma_sg` and `for_each_sgtable_dma_page` to LinuxKPI"
+msgstr "14.0-CURRENT после добавления `for_each_sgtable_dma_sg` и `for_each_sgtable_dma_page` в LinuxKPI"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:524
+#, no-wrap
+msgid "1400056"
+msgstr "1400056"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:525
+#, no-wrap
+msgid "gitref:ab8ac4c28574a42a2891b2e2341f802949c1fb57[repository=\"src\",length=12]"
+msgstr "gitref:ab8ac4c28574a42a2891b2e2341f802949c1fb57[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:526
+#, no-wrap
+msgid "March 31, 2022"
+msgstr "31 марта 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:528
+#, no-wrap
+msgid "14.0-CURRENT after zlib upgrade to 1.2.12"
+msgstr "14.0-CURRENT после обновления zlib до версии 1.2.12"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:529
+#, no-wrap
+msgid "1400057"
+msgstr "1400057"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:530
+#, no-wrap
+msgid "gitref:e68b35e40881a1bd858e1b4b5003123a484fd7cd[repository=\"src\",length=12]"
+msgstr "gitref:e68b35e40881a1bd858e1b4b5003123a484fd7cd[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:531
+#, no-wrap
+msgid "April 22, 2022"
+msgstr "22 апреля 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:533
+#, no-wrap
+msgid "14.0-CURRENT after changing udp_tun_func_t() prototype."
+msgstr "14.0-CURRENT после изменения прототипа udp_tun_func_t()."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:534
+#, no-wrap
+msgid "1400058"
+msgstr "1400058"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:535
+#, no-wrap
+msgid "gitref:2e32d4e41d205d6f14834f87306a77ff77b9c0bd[repository=\"src\",length=12]"
+msgstr "gitref:2e32d4e41d205d6f14834f87306a77ff77b9c0bd[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:536
+#, no-wrap
+msgid "May 7, 2022"
+msgstr "7 мая 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:538
+#, no-wrap
+msgid "14.0-CURRENT after newbus changes to remove devclass arguments."
+msgstr "14.0-CURRENT после изменений в newbus для удаления аргументов devclass."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:539
+#, no-wrap
+msgid "1400059"
+msgstr "1400059"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:540
+#, no-wrap
+msgid "gitref:3a9a9c0ca44ec535dcf73fe8462bee458e54814b[repository=\"src\",length=12]"
+msgstr "gitref:3a9a9c0ca44ec535dcf73fe8462bee458e54814b[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:541
+#, no-wrap
+msgid "May 14, 2022"
+msgstr "14 мая 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:543
+#, no-wrap
+msgid "14.0-CURRENT after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-14.0.3-0-g1f9140064dfb, a.k.a. 14.0.3 release."
+msgstr "14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-14.0.3-0-g1f9140064dfb, также известной как релиз 14.0.3."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:544
+#, no-wrap
+msgid "1400060"
+msgstr "1400060"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:545
+#, no-wrap
+msgid "gitref:85d7875d42913c2cb10a007a1be05b210dc6aab2[repository=\"src\",length=12]"
+msgstr "gitref:85d7875d42913c2cb10a007a1be05b210dc6aab2[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:546
+#, no-wrap
+msgid "June 6, 2022"
+msgstr "6 июня 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:548
+#, no-wrap
+msgid "14.0-CURRENT after LinuxKPI dmi_matches() fixes."
+msgstr "14.0-CURRENT после исправлений LinuxKPI dmi_matches()."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:549
+#, no-wrap
+msgid "1400061"
+msgstr "1400061"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:550
+#, no-wrap
+msgid "gitref:c4c5981c14d5bd69e9df9ae691069ec4c2e92174[repository=\"src\",length=12]"
+msgstr "gitref:c4c5981c14d5bd69e9df9ae691069ec4c2e92174[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:551
+#, no-wrap
+msgid "June 8, 2022"
+msgstr "8 июня 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:553
+#, no-wrap
+msgid "14.0-CURRENT after man:mbuf[9] structure changes."
+msgstr "14.0-CURRENT после изменений структуры man:mbuf[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:554
+#, no-wrap
+msgid "1400062"
+msgstr "1400062"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:555
+#, no-wrap
+msgid "gitref:8c309d48aabf1cb469334c7716033f177a2715c0[repository=\"src\",length=12]"
+msgstr "gitref:8c309d48aabf1cb469334c7716033f177a2715c0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:556
+#, no-wrap
+msgid "June 18, 2022"
+msgstr "18 июня 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:558
+#, no-wrap
+msgid "14.0-CURRENT after struct `kinfo_file` changes."
+msgstr "14.0-CURRENT после изменений структуры `kinfo_file`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:559
+#, no-wrap
+msgid "1400063"
+msgstr "1400063"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:560
+#, no-wrap
+msgid "gitref:8cff8e6e13a6d3ccff40fc0d8d97f5aef22a8f4d[repository=\"src\",length=12]"
+msgstr "gitref:8cff8e6e13a6d3ccff40fc0d8d97f5aef22a8f4d[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:561
+#, no-wrap
+msgid "June 29, 2022"
+msgstr "29 июня 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:564
+#, no-wrap
+msgid "1400064"
+msgstr "1400064"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:565
+#, no-wrap
+msgid "gitref:ddd9004e7a5dbf02c34ef0effcef90f7d5df357d[repository=\"src\",length=12]"
+msgstr "gitref:ddd9004e7a5dbf02c34ef0effcef90f7d5df357d[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:566
+#, no-wrap
+msgid "July 18, 2022"
+msgstr "18 июля 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:568
+#, no-wrap
+msgid "14.0-CURRENT after the removal of OBJT_DEFAULT."
+msgstr "14.0-CURRENT после удаления OBJT_DEFAULT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:569
+#, no-wrap
+msgid "1400065"
+msgstr "1400065"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:570
+#, no-wrap
+msgid "gitref:b273f93657cf0e6f2c6ee4d0f40a43656233c6d0[repository=\"src\",length=12]"
+msgstr "gitref:b273f93657cf0e6f2c6ee4d0f40a43656233c6d0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:571
+#, no-wrap
+msgid "August 8, 2022"
+msgstr "8 августа 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:574
+#, no-wrap
+msgid "1400066"
+msgstr "1400066"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:575
+#, no-wrap
+msgid "gitref:ff7812ee7d444b738a454064f9639c3feb5743e8[repository=\"src\",length=12]"
+msgstr "gitref:ff7812ee7d444b738a454064f9639c3feb5743e8[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:576
+#, no-wrap
+msgid "August 18, 2022"
+msgstr "18 августа 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:579
+#, no-wrap
+msgid "1400069"
+msgstr "1400069"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:580
+#, no-wrap
+msgid "gitref:f95c0bc89ea4fcde04b0990d57e842ef387ea896[repository=\"src\",length=12]"
+msgstr "gitref:f95c0bc89ea4fcde04b0990d57e842ef387ea896[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:581
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:586
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:596
+#, no-wrap
+msgid "September 22, 2022"
+msgstr "22 сентября 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:583
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:628
+#, no-wrap
+msgid "14.0-CURRENT after multiple LinuxKPI changes."
+msgstr "14.0-CURRENT после нескольких изменений в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:584
+#, no-wrap
+msgid "1400070"
+msgstr "1400070"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:585
+#, no-wrap
+msgid "gitref:6bddde307e21eba297ac3f3e534b4cf3be81dfe2[repository=\"src\",length=12]"
+msgstr "gitref:6bddde307e21eba297ac3f3e534b4cf3be81dfe2[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:588
+#, no-wrap
+msgid "14.0-CURRENT after KPI changes to pmap_unmapdev() and kmem_*()."
+msgstr "14.0-CURRENT после изменений KPI в pmap_unmapdev() и kmem_*()."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:589
+#, no-wrap
+msgid "1400071"
+msgstr "1400071"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:590
+#, no-wrap
+msgid "gitref:d3f96f661050e9bd21fe29931992a8b9e67ff189[repository=\"src\",length=12]"
+msgstr "gitref:d3f96f661050e9bd21fe29931992a8b9e67ff189[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:591
+#, no-wrap
+msgid "September 26, 2022"
+msgstr "26 сентября 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:593
+#, no-wrap
+msgid "14.0-CURRENT after KPI changes that sysctl OIDs lists converted to RB trees."
+msgstr "14.0-CURRENT после изменений KPI, когда списки OID sysctl были преобразованы в RB-деревья."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:594
+#, no-wrap
+msgid "1400072"
+msgstr "1400072"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:595
+#, no-wrap
+msgid "gitref:8a96874eeeee5195b0b0952b77227bef6a26d1a6[repository=\"src\",length=12]"
+msgstr "gitref:8a96874eeeee5195b0b0952b77227bef6a26d1a6[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:598
+#, no-wrap
+msgid "14.0-CURRENT after `qsort_r` prototype modified to match POSIX."
+msgstr "14.0-CURRENT после изменения прототипа `qsort_r` для соответствия POSIX."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:599
+#, no-wrap
+msgid "1400073"
+msgstr "1400073"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:600
+#, no-wrap
+msgid "gitref:9c950139051298831ce19d01ea5fb33ec6ea7f89[repository=\"src\",length=12]"
+msgstr "gitref:9c950139051298831ce19d01ea5fb33ec6ea7f89[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:601
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1699
+#, no-wrap
+msgid "October 17, 2022"
+msgstr "17 октября 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:603
+#, no-wrap
+msgid "14.0-CURRENT after introduction of v2 of TX Queue Select Functionality."
+msgstr "14.0-CURRENT after introduction of v2 of TX Queue Select Functionality."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:604
+#, no-wrap
+msgid "1400074"
+msgstr "1400074"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:605
+#, no-wrap
+msgid "gitref:e28932c643e891294a49f386ba65322cf8410225[repository=\"src\",length=12]"
+msgstr "gitref:e28932c643e891294a49f386ba65322cf8410225[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:606
+#, no-wrap
+msgid "December 9, 2022"
+msgstr "9 декабря 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:608
+#, no-wrap
+msgid "14.0-CURRENT after adding spare fops slots in fileops."
+msgstr "14.0-CURRENT после добавления запасных слотов fops в fileops."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:609
+#, no-wrap
+msgid "1400078"
+msgstr "1400078"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:610
+#, no-wrap
+msgid "gitref:4b56afaf7bf4fa37bae5b26fd93ee1ff5969c1bb[repository=\"src\",length=12]"
+msgstr "gitref:4b56afaf7bf4fa37bae5b26fd93ee1ff5969c1bb[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:611
+#, no-wrap
+msgid "January 13, 2023"
+msgstr "13 января 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:613
+#, no-wrap
+msgid "14.0-CURRENT after changing LinuxKPI pci.h."
+msgstr "14.0-CURRENT после изменения LinuxKPI pci.h."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:614
+#, no-wrap
+msgid "1400079"
+msgstr "1400079"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:615
+#, no-wrap
+msgid "gitref:3264f6b88fce7c5437d205685863617d8f6a22dd[repository=\"src\",length=12]"
+msgstr "gitref:3264f6b88fce7c5437d205685863617d8f6a22dd[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:616
+#, no-wrap
+msgid "February 8, 2023"
+msgstr "8 февраля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:618
+#, no-wrap
+msgid "14.0-CURRENT after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-15.0.7-0-g8dfdcc7b7bf6, a.k.a. 15.0.7 release."
+msgstr "14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-15.0.7-0-g8dfdcc7b7bf6, также известного как релиз 15.0.7."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:619
+#, no-wrap
+msgid "1400084"
+msgstr "1400084"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:620
+#, no-wrap
+msgid "gitref:ea3061526e9ce5d3b65932c1d3e4437abd556d65[repository=\"src\",length=12]"
+msgstr "gitref:ea3061526e9ce5d3b65932c1d3e4437abd556d65[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:621
+#, no-wrap
+msgid "March 23, 2023"
+msgstr "23 марта 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:623
+#, no-wrap
+msgid "14.0-CURRENT after changing the arm64 struct reg, struct gpreg, struct trapframe, and struct pcb."
+msgstr "14.0-CURRENT после изменения структур reg, gpreg, trapframe и pcb для архитектуры arm64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:624
+#, no-wrap
+msgid "1400085"
+msgstr "1400085"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:625
+#, no-wrap
+msgid "gitref:1cebc9298cf2272da46c3c574d06a80ce59854aa[repository=\"src\",length=12]"
+msgstr "gitref:1cebc9298cf2272da46c3c574d06a80ce59854aa[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:626
+#, no-wrap
+msgid "March 28, 2023"
+msgstr "28 марта 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:629
+#, no-wrap
+msgid "1400086"
+msgstr "1400086"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:630
+#, no-wrap
+msgid "gitref:c17eb99a66e7d1e8a64458a969eeb7649f827493[repository=\"src\",length=12]"
+msgstr "gitref:c17eb99a66e7d1e8a64458a969eeb7649f827493[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:631
+#, no-wrap
+msgid "April 8, 2023"
+msgstr "8 апреля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:633
+#, no-wrap
+msgid "14.0-CURRENT after vn_lock_pair() argument changes."
+msgstr "14.0-CURRENT после изменений аргументов vn_lock_pair()."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:634
+#, no-wrap
+msgid "1400087"
+msgstr "1400087"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:635
+#, no-wrap
+msgid "gitref:af22da75a035e25cb47cd3f2eabe5a84d8a5cb34[repository=\"src\",length=12]"
+msgstr "gitref:af22da75a035e25cb47cd3f2eabe5a84d8a5cb34[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:636
+#, no-wrap
+msgid "April 22, 2023"
+msgstr "22 апреля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:638
+#, no-wrap
+msgid "14.0-CURRENT after LinuxKPI updates."
+msgstr "14.0-CURRENT после обновлений LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:639
+#, no-wrap
+msgid "1400088"
+msgstr "1400088"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:640
+#, no-wrap
+msgid "gitref:97583aa2567589cb83540d2d9de1980b76db9a99[repository=\"src\",length=12]"
+msgstr "gitref:97583aa2567589cb83540d2d9de1980b76db9a99[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:641
+#, no-wrap
+msgid "April 24, 2023"
+msgstr "24 апреля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:643
+#, no-wrap
+msgid "14.0-CURRENT after migrating the LinuxKPI to IfAPI."
+msgstr "14.0-CURRENT после миграции LinuxKPI на IfAPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:644
+#, no-wrap
+msgid "1400089"
+msgstr "1400089"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:645
+#, no-wrap
+msgid "gitref:9fb6718d1b180c341373b25c03dbfc221ddee311[repository=\"src\",length=12]"
+msgstr "gitref:9fb6718d1b180c341373b25c03dbfc221ddee311[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:646
+#, no-wrap
+msgid "April 25, 2023"
+msgstr "25 апреля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:648
+#, no-wrap
+msgid "14.0-CURRENT after dynamically allocating the stoppcbs array in smp."
+msgstr "14.0-CURRENT после динамического выделения массива stoppcbs в smp."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:649
+#, no-wrap
+msgid "1400090"
+msgstr "1400090"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:650
+#, no-wrap
+msgid "gitref:653738e895ba022be1179a95a85089e7bc66dbbe[repository=\"src\",length=12]"
+msgstr "gitref:653738e895ba022be1179a95a85089e7bc66dbbe[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:651
+#, no-wrap
+msgid "June 7, 2023"
+msgstr "7 июня 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:653
+#, no-wrap
+msgid "14.0-CURRENT after ptrace started clearing TDB_BORN during PT_DETACH."
+msgstr "14.0-CURRENT после того, как ptrace начал очищать TDB_BORN во время PT_DETACH."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:654
+#, no-wrap
+msgid "1400091"
+msgstr "1400091"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:655
+#, no-wrap
+msgid "gitref:a681cba16d8967651a2146385ce44a2bfeb1c4c3[repository=\"src\",length=12]"
+msgstr "gitref:a681cba16d8967651a2146385ce44a2bfeb1c4c3[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:656
+#, no-wrap
+msgid "June 22, 2023"
+msgstr "22 июня 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:658
+#, no-wrap
+msgid "14.0-CURRENT after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-16.0.6-0-g7cbf1a259152, a.k.a. 16.0.6 release."
+msgstr "14.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-16.0.6-0-g7cbf1a259152, также известного как релиз 16.0.6."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:659
+#, no-wrap
+msgid "1400092"
+msgstr "1400092"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:660
+#, no-wrap
+msgid "gitref:9ead001d5b42ef9cba04757c9e7ee74c06037139[repository=\"src\",length=12]"
+msgstr "gitref:9ead001d5b42ef9cba04757c9e7ee74c06037139[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:661
+#, no-wrap
+msgid "June 24, 2023"
+msgstr "24 июня 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:663
+#, no-wrap
+msgid "14.0-CURRENT after importing OpenSSL 3.0.9 into base."
+msgstr "14.0-CURRENT после импорта OpenSSL 3.0.9 в базовую систему."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:664
+#, no-wrap
+msgid "1400093"
+msgstr "1400093"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:665
+#, no-wrap
+msgid "gitref:ba8cc6d7271a50fec978a1d3a088aec7985fae48[repository=\"src\",length=12]"
+msgstr "gitref:ba8cc6d7271a50fec978a1d3a088aec7985fae48[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:666
+#, no-wrap
+msgid "July 5, 2023"
+msgstr "5 июля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:668
+#, no-wrap
+msgid "14.0-CURRENT after using __enum_uint8 for vtype and vstate in VFS"
+msgstr "14.0-CURRENT после использования __enum_uint8 для vtype и vstate в VFS"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:669
+#, no-wrap
+msgid "1400097"
+msgstr "1400097"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:673
+#, no-wrap
+msgid "14.0-STABLE after branching stable/14"
+msgstr "14.0-STABLE после ветвления stable/14"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:674
+#, no-wrap
+msgid "1400500"
+msgstr "1400500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:676
+#, no-wrap
+msgid "September 8, 2023"
+msgstr "8 сентября 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:678
+#, no-wrap
+msgid "14.0-STABLE after branching releng/14.0"
+msgstr "14.0-STABLE после ветвления releng/14.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:679
+#, no-wrap
+msgid "1400501"
+msgstr "1400501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:680
+#, no-wrap
+msgid "gitref:91e53779b4fc39e755a03190f785ce0cf3f83eb7[repository=\"src\",length=12]"
+msgstr "gitref:91e53779b4fc39e755a03190f785ce0cf3f83eb7[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:681
+#, no-wrap
+msgid "November 19, 2023"
+msgstr "19 ноября 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:683
+#, no-wrap
+msgid "14.0-STABLE after implementing `fpu_kern_enter` and `fpu_kern_leave` for powerpc."
+msgstr "14.0-STABLE после реализации `fpu_kern_enter` и `fpu_kern_leave` для powerpc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:684
+#, no-wrap
+msgid "1400502"
+msgstr "1400502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:685
+#, no-wrap
+msgid "gitref:092abb839d1d2826533bb9c4c93d713f8b5043f9[repository=\"src\",length=12]"
+msgstr "gitref:092abb839d1d2826533bb9c4c93d713f8b5043f9[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:688
+#, no-wrap
+msgid "14.0-STABLE after modifying the internal API between the kgssapi and krpc modules."
+msgstr "14.0-STABLE после изменения внутреннего API между модулями kgssapi и krpc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:689
+#, no-wrap
+msgid "1400503"
+msgstr "1400503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:690
+#, no-wrap
+msgid "gitref:ba99d960884d50eb7d36146914206644ee132aa4[repository=\"src\",length=12]"
+msgstr "gitref:ba99d960884d50eb7d36146914206644ee132aa4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:691
+#, no-wrap
+msgid "December 29, 2023"
+msgstr "29 декабря 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:693
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:708
+#, no-wrap
+msgid "14.0-STABLE after changing the internal KAPI between the nfscommon and nfscl modules."
+msgstr "14.0-STABLE после изменения внутреннего KAPI между модулями nfscommon и nfscl."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:694
+#, no-wrap
+msgid "1400504"
+msgstr "1400504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:695
+#, no-wrap
+msgid "gitref:68584c97ecfb3046de7fb1b16c2caa785392237c[repository=\"src\",length=12]"
+msgstr "gitref:68584c97ecfb3046de7fb1b16c2caa785392237c[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:696
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:701
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1769
+#, no-wrap
+msgid "January 7, 2024"
+msgstr "7 января 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:698
+#, no-wrap
+msgid "14.0-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-17.0.6-0-g6009708b4367, a.k.a. 17.0.6 release."
+msgstr "14.0-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-17.0.6-0-g6009708b4367, также известного как релиз 17.0.6."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:699
+#, no-wrap
+msgid "1400505"
+msgstr "1400505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:700
+#, no-wrap
+msgid "gitref:64e869e9b93c8ce47f874b770df696c06bcba0d3[repository=\"src\",length=12]"
+msgstr "gitref:64e869e9b93c8ce47f874b770df696c06bcba0d3[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:703
+#, no-wrap
+msgid "14.0-STABLE after adding man:vnode_pager_clean_async[9] and man:vnode_pager_clean_sync[9]."
+msgstr "14.0-STABLE после добавления man:vnode_pager_clean_async[9] и man:vnode_pager_clean_sync[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:704
+#, no-wrap
+msgid "1400506"
+msgstr "1400506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:705
+#, no-wrap
+msgid "gitref:d9041710958227194c5e34b169ae73d7ad411017[repository=\"src\",length=12]"
+msgstr "gitref:d9041710958227194c5e34b169ae73d7ad411017[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:706
+#, no-wrap
+msgid "January 19, 2024"
+msgstr "19 января 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:709
+#, no-wrap
+msgid "1400507"
+msgstr "1400507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:710
+#, no-wrap
+msgid "gitref:b566e44b2b88eb9f1b3b658998c7418cccab9e2f[repository=\"src\",length=12]"
+msgstr "gitref:b566e44b2b88eb9f1b3b658998c7418cccab9e2f[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:711
+#, no-wrap
+msgid "January 31, 2024"
+msgstr "31 января 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:713
+#, no-wrap
+msgid "14.0-STABLE after adding man:kern_openatfp[9] and man:kcmp[2]."
+msgstr "14.0-STABLE после добавления man:kern_openatfp[9] и man:kcmp[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:714
+#, no-wrap
+msgid "1400508"
+msgstr "1400508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:715
+#, no-wrap
+msgid "gitref:2d120981e26dfef5c9cb9eb9936bb46cb6918136[repository=\"src\",length=12]"
+msgstr "gitref:2d120981e26dfef5c9cb9eb9936bb46cb6918136[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:716
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:721
+#, no-wrap
+msgid "February 18, 2024"
+msgstr "18 февраля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:718
+#, no-wrap
+msgid "14.0-STABLE after LinuxKPI updates."
+msgstr "14.0-STABLE после обновлений LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:719
+#, no-wrap
+msgid "1400509"
+msgstr "1400509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:720
+#, no-wrap
+msgid "gitref:b392b36d3776b696601ce0253256803276d24ea2[repository=\"src\",length=12]"
+msgstr "gitref:b392b36d3776b696601ce0253256803276d24ea2[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:723
+#, no-wrap
+msgid "14.0-STABLE after changing net80211 `struct ieee80211vap` internals."
+msgstr "14.0-STABLE после изменения внутренней структуры `struct ieee80211vap` в net80211."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:724
+#, no-wrap
+msgid "1400510"
+msgstr "1400510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:725
+#, no-wrap
+msgid "gitref:69da6e0879831f1ccc5c60135ed43fcea10a933b[repository=\"src\",length=12]"
+msgstr "gitref:69da6e0879831f1ccc5c60135ed43fcea10a933b[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:726
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1784
+#, no-wrap
+msgid "March 23, 2024"
+msgstr "23 марта 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:728
+#, no-wrap
+msgid "14.0-STABLE after fixing a clang assertion or crash when building recent boost libraries."
+msgstr "14.0-STABLE после исправления утверждения или падения clang при сборке последних библиотек boost."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:729
+#, no-wrap
+msgid "1400511"
+msgstr "1400511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:730
+#, no-wrap
+msgid "gitref:7c41358a2b0a2e70a2b61ec347354f3452e4d2f3[repository=\"src\",length=12]"
+msgstr "gitref:7c41358a2b0a2e70a2b61ec347354f3452e4d2f3[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:731
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1789
+#, no-wrap
+msgid "April 20, 2024"
+msgstr "20 апреля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:733
+#, no-wrap
+msgid "14.0-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-18.1.3-0-gc13b7485b879, a.k.a. 18.1.3 release."
+msgstr "14.0-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-18.1.3-0-gc13b7485b879, также известной как релиз 18.1.3."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:734
+#, no-wrap
+msgid "1401500"
+msgstr "1401500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:735
+#, no-wrap
+msgid "gitref:7b082bdf72e65f94b9b17d9fa1d0c1c202e4eb49[repository=\"src\",length=12]"
+msgstr "gitref:7b082bdf72e65f94b9b17d9fa1d0c1c202e4eb49[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:736
+#, no-wrap
+msgid "May 2, 2024"
+msgstr "2 мая 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:738
+#, no-wrap
+msgid "14.1-STABLE after it was renamed from 14.1-PRERELEASE."
+msgstr "14.1-STABLE после переименования из 14.1-PRERELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:739
+#, no-wrap
+msgid "1401501"
+msgstr "1401501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:740
+#, no-wrap
+msgid "gitref:f285eabc89ce8ccf3aaf563401df942e406c2b5f[repository=\"src\",length=12]"
+msgstr "gitref:f285eabc89ce8ccf3aaf563401df942e406c2b5f[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:741
+#, no-wrap
+msgid "June 6, 2024"
+msgstr "6 июня 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:743
+#, no-wrap
+msgid "14.1-STABLE after adding the linuxkpi_video module."
+msgstr "14.1-STABLE после добавления модуля linuxkpi_video."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:744
+#, no-wrap
+msgid "1401502"
+msgstr "1401502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:745
+#, no-wrap
+msgid "gitref:b37a6d41a046dbb46ee1d6bf00c710c03c944a24[repository=\"src\",length=12]"
+msgstr "gitref:b37a6d41a046dbb46ee1d6bf00c710c03c944a24[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:746
+#, no-wrap
+msgid "August 2, 2024"
+msgstr "2 августа 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:748
+#, no-wrap
+msgid "14.1-STABLE after LinuxKPI changes."
+msgstr "14.1-STABLE после изменений в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:749
+#, no-wrap
+msgid "1401503"
+msgstr "1401503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:750
+#, no-wrap
+msgid "gitref:8a5a9dbf389e86d278764ababf2f1eb8ee276680[repository=\"src\",length=12]"
+msgstr "gitref:8a5a9dbf389e86d278764ababf2f1eb8ee276680[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:751
+#, no-wrap
+msgid "October 15, 2024"
+msgstr "15 октября 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:753
+#, no-wrap
+msgid "14.1-STABLE after widening the `flags` field in `vm_object`."
+msgstr "14.1-STABLE после расширения поля `flags` в `vm_object`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:754
+#, no-wrap
+msgid "1402500"
+msgstr "1402500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:755
+#, no-wrap
+msgid "gitref:4e8444d5750a5d9da9c812e8f6caf6d62862be0a[repository=\"src\",length=12]"
+msgstr "gitref:4e8444d5750a5d9da9c812e8f6caf6d62862be0a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:756
+#, no-wrap
+msgid "October 31, 2024"
+msgstr "31 октября 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:758
+#, no-wrap
+msgid "14.2-STABLE after it was renamed from 14.2-PRERELEASE."
+msgstr "14.2-STABLE после переименования из 14.2-PRERELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:759
+#, no-wrap
+msgid "1402501"
+msgstr "1402501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:760
+#, no-wrap
+msgid "gitref:35d2f335e855af816d0a7fe5baf6a3facba84562[repository=\"src\",length=12]"
+msgstr "gitref:35d2f335e855af816d0a7fe5baf6a3facba84562[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:761
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1799
+#, no-wrap
+msgid "December 1, 2024"
+msgstr "1 декабря 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:763
+#, no-wrap
+msgid "14.2-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-19.1.4-0-gaadaa00de76e, a.k.a. 19.1.4 release."
+msgstr "14.2-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-19.1.4-0-gaadaa00de76e, также известного как релиз 19.1.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:764
+#, no-wrap
+msgid "1402502"
+msgstr "1402502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:765
+#, no-wrap
+msgid "gitref:d172f42e4ba7ba8542ae0866aaba56e329b4ea2c[repository=\"src\",length=12]"
+msgstr "gitref:d172f42e4ba7ba8542ae0866aaba56e329b4ea2c[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:766
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:771
+#, no-wrap
+msgid "February 27, 2025"
+msgstr "27 февраля 2025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:768
+#, no-wrap
+msgid "14.2-STABLE after removing redundant `type` and `rid` arguments from several functions in the new-bus resource API."
+msgstr "14.2-STABLE после удаления избыточных аргументов `type` и `rid` из нескольких функций в API ресурсов new-bus."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:769
+#, no-wrap
+msgid "1402503"
+msgstr "1402503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:770
+#, no-wrap
+msgid "gitref:4aed8b3b613c5e1499336e4d7ec7e9a3ac3d9a12[repository=\"src\",length=12]"
+msgstr "gitref:4aed8b3b613c5e1499336e4d7ec7e9a3ac3d9a12[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:773
+#, no-wrap
+msgid "14.2-STABLE after adding `bus_attach_children`, `bus_detach_children`, and `bus_identify_children`."
+msgstr "14.2-STABLE после добавления `bus_attach_children`, `bus_detach_children` и `bus_identify_children`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:774
+#, no-wrap
+msgid "1402505"
+msgstr "1402505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:775
+#, no-wrap
+msgid "gitref:a3b2d8e360c37853035f9cede6064c4602312bfc[repository=\"src\",length=12]"
+msgstr "gitref:a3b2d8e360c37853035f9cede6064c4602312bfc[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:776
+#, no-wrap
+msgid "April 18, 2025"
+msgstr "18 апреля 2025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:778
+#, no-wrap
+msgid "14.2-STABLE after changing alloc changes to LinuxKPI and removing iwlwifi firmware."
+msgstr "14.2-STABLE после изменения аллокации в LinuxKPI и удаления микропрограммы iwlwifi."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:779
+#, no-wrap
+msgid "1403503"
+msgstr "1403503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:780
+#, no-wrap
+msgid "gitref:6cdcf08c9c5eda6dc3b8395cefd9d30a4f5e2f1a[repository=\"src\",length=12]"
+msgstr "gitref:6cdcf08c9c5eda6dc3b8395cefd9d30a4f5e2f1a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:781
+#, no-wrap
+msgid "July 13, 2025"
+msgstr "13 июля 2025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:783
+#, no-wrap
+msgid "14.3-STABLE after LinuxKPI dma-mapping.h and acpi changes."
+msgstr "14.3-STABLE после изменений в LinuxKPI dma-mapping.h and acpi."
+
+#. Template:
+#. |14XXXXX
+#. |gitref:XXXXXXXX[repository="src",length=12]
+#. |October 30, 2021
+#. |14.0-CURRENT after XXXXXX.
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:795
+#, no-wrap
+msgid "FreeBSD 13 Versions"
+msgstr "FreeBSD 13 Версии"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:798
+#, no-wrap
+msgid "FreeBSD 13 `__FreeBSD_version` Values"
+msgstr "FreeBSD 13 Значения `__FreeBSD_version`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:807
+#, no-wrap
+msgid "1300000"
+msgstr "1300000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:808
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/339436[339436]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/339436[339436]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:809
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2257
+#, no-wrap
+msgid "October 19, 2018"
+msgstr "19 октября 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:811
+#, no-wrap
+msgid "13.0-CURRENT."
+msgstr "13.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:812
+#, no-wrap
+msgid "1300001"
+msgstr "1300001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:813
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/339730[339730]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/339730[339730]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:814
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:819
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2262
+#, no-wrap
+msgid "October 25, 2018"
+msgstr "25 октября 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:816
+#, no-wrap
+msgid "13.0-CURRENT after bumping OpenSSL shared library version numbers."
+msgstr "13.0-CURRENT после увеличения номеров версий разделяемых библиотек OpenSSL."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:817
+#, no-wrap
+msgid "1300002"
+msgstr "1300002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:818
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/339765[339765]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/339765[339765]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:821
+#, no-wrap
+msgid "13.0-CURRENT after restoration of [.filename]#sys/joystick.h#."
+msgstr "13.0-CURRENT после восстановления [.filename]#sys/joystick.h#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:822
+#, no-wrap
+msgid "1300003"
+msgstr "1300003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:823
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/340055[340055]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/340055[340055]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:824
+#, no-wrap
+msgid "November 2, 2018"
+msgstr "2 ноября 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:826
+#, no-wrap
+msgid "13.0-CURRENT after `vop_symlink` API change (`a_target` is now `const`.)"
+msgstr "13.0-CURRENT после изменения API `vop_symlink` (параметр `a_target` теперь объявлен как `const`.)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:827
+#, no-wrap
+msgid "1300004"
+msgstr "1300004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:828
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/340841[340841]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/340841[340841]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:829
+#, no-wrap
+msgid "November 23, 2018"
+msgstr "23 ноября 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:831
+#, no-wrap
+msgid "13.0-CURRENT after enabling crtbegin and crtend code."
+msgstr "13.0-CURRENT после включения кода crtbegin и crtend."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:832
+#, no-wrap
+msgid "1300005"
+msgstr "1300005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:833
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/341836[341836]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/341836[341836]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:834
+#, no-wrap
+msgid "December 11, 2018"
+msgstr "11 декабря 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:836
+#, no-wrap
+msgid "13.0-CURRENT after enabling UFS inode checksums."
+msgstr "13.0-CURRENT после включения контрольных сумм inode в UFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:837
+#, no-wrap
+msgid "1300006"
+msgstr "1300006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:838
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/342398[342398]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/342398[342398]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:839
+#, no-wrap
+msgid "December 24, 2018"
+msgstr "24 декабря 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:841
+#, no-wrap
+msgid "13.0-CURRENT after fixing [.filename]#sys/random.h# include to be usable from C++."
+msgstr "13.0-CURRENT после исправления включения [.filename]#sys/random.h# для использования из C++."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:842
+#, no-wrap
+msgid "1300007"
+msgstr "1300007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:843
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/342629[342629]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/342629[342629]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:844
+#, no-wrap
+msgid "December 30, 2018"
+msgstr "30 декабря 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:846
+#, no-wrap
+msgid "13.0-CURRENT after changing the size of `struct linux_cdev` on 32-bit platforms."
+msgstr "13.0-CURRENT после изменения размера `struct linux_cdev` на 32-битных платформах."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:847
+#, no-wrap
+msgid "1300008"
+msgstr "1300008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:848
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/342772[342772]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/342772[342772]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:849
+#, no-wrap
+msgid "January 4, 2019"
+msgstr "4 января 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:851
+#, no-wrap
+msgid "13.0-CURRENT after adding `kern.smp.threads_per_core` and `kern.smp.cores` sysctls."
+msgstr "13.0-CURRENT после добавления системных переменных `kern.smp.threads_per_core` и `kern.smp.cores`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:852
+#, no-wrap
+msgid "1300009"
+msgstr "1300009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:853
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/343213[343213]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/343213[343213]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:854
+#, no-wrap
+msgid "January 20, 2019"
+msgstr "20 января 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:856
+#, no-wrap
+msgid "13.0-CURRENT after `struct ieee80211vap` structure change to resolve ioctl/detach race for ieee80211com structure."
+msgstr "13.0-CURRENT после изменения структуры `struct ieee80211vap` для устранения состояния гонки между ioctl и detach в структуре ieee80211com."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:857
+#, no-wrap
+msgid "1300010"
+msgstr "1300010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:858
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/343485[343485]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/343485[343485]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:859
+#, no-wrap
+msgid "January 27, 2019"
+msgstr "27 января 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:861
+#, no-wrap
+msgid "13.0-CURRENT after increasing `SPECNAMELEN` from 63 to `MAXNAMELEN` (255)."
+msgstr "13.0-CURRENT после увеличения `SPECNAMELEN` с 63 до `MAXNAMELEN` (255)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:862
+#, no-wrap
+msgid "1300011"
+msgstr "1300011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:863
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/344041[344041]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/344041[344041]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:864
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:869
+#, no-wrap
+msgid "February 12, 2019"
+msgstr "12 февраля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:866
+#, no-wrap
+msgid "13.0-CURRENT after man:renameat[2] has been corrected to work with kernels built with the `CAPABILITIES` option."
+msgstr "13.0-CURRENT после исправления man:renameat[2] для работы с ядрами, собранными с опцией `CAPABILITIES`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:867
+#, no-wrap
+msgid "1300012"
+msgstr "1300012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:868
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/344062[344062]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/344062[344062]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:871
+#, no-wrap
+msgid "13.0-CURRENT after `taskqgroup_attach()` and `taskqgroup_attach_cpu()` take a `device_t` and a struct resource pointer as arguments for denoting device interrupts."
+msgstr "13.0-CURRENT после того, как `taskqgroup_attach()` и `taskqgroup_attach_cpu()` принимают аргументы `device_t` и указатель на структуру resource для обозначения прерываний устройства."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:872
+#, no-wrap
+msgid "1300013"
+msgstr "1300013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:873
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/344300[344300]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/344300[344300]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:874
+#, no-wrap
+msgid "February 19, 2019"
+msgstr "19 февраля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:876
+#, no-wrap
+msgid "13.0-CURRENT after the removal of drm and drm2."
+msgstr "13.0-CURRENT после удаления drm и drm2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:877
+#, no-wrap
+msgid "1300014"
+msgstr "1300014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:878
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/344779[344779]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/344779[344779]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:879
+#, no-wrap
+msgid "March 4, 2019"
+msgstr "4 марта 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:881
+#, no-wrap
+msgid "13.0-CURRENT after upgrading clang, llvm, lld, lldb, compiler-rt and libc++ to 8.0.0 rc3."
+msgstr "13.0-CURRENT после обновления clang, llvm, lld, lldb, compiler-rt и libc++ до версии 8.0.0 rc3."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:882
+#, no-wrap
+msgid "1300015"
+msgstr "1300015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:883
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/345196[345196]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/345196[345196]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:884
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2287
+#, no-wrap
+msgid "March 15, 2019"
+msgstr "15 марта 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:886
+#, no-wrap
+msgid "13.0-CURRENT after deanonymizing thread and proc state enums, so userland applications can use them without redefining the value names."
+msgstr "13.0-CURRENT после деанонимизации перечислений состояний потоков и процессов, что позволяет приложениям пользовательского пространства использовать их без переопределения имен значений."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:887
+#, no-wrap
+msgid "1300016"
+msgstr "1300016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:888
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/345236[345236]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/345236[345236]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:889
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:899
+#, no-wrap
+msgid "March 16, 2019"
+msgstr "16 марта 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:891
+#, no-wrap
+msgid "13.0-CURRENT after enabling LLVM OpenMP 8.0.0 rc5 on amd64 by default."
+msgstr "13.0-CURRENT после включения LLVM OpenMP 8.0.0 rc5 на amd64 по умолчанию."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:892
+#, no-wrap
+msgid "1300017"
+msgstr "1300017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:893
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/345305[345305]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/345305[345305]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:894
+#, no-wrap
+msgid "March 19, 2019"
+msgstr "19 марта 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:896
+#, no-wrap
+msgid "13.0-CURRENT after exposing the Rx mbuf buffer size to drivers in iflib."
+msgstr "13.0-CURRENT после раскрытия размера буфера Rx mbuf для драйверов в iflib."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:897
+#, no-wrap
+msgid "1300018"
+msgstr "1300018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:898
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/346012[346012]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/346012[346012]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:901
+#, no-wrap
+msgid "13.0-CURRENT after introduction of `funlinkat` syscall in link:https://svnweb.freebsd.org/changeset/base/345982[345982]."
+msgstr "13.0-CURRENT после введения системного вызова `funlinkat` в link:https://svnweb.freebsd.org/changeset/base/345982[345982]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:902
+#, no-wrap
+msgid "1300019"
+msgstr "1300019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:903
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/346282[346282]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/346282[346282]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:904
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3455
+#, no-wrap
+msgid "April 16, 2019"
+msgstr "16 апреля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:906
+#, no-wrap
+msgid "13.0-CURRENT after addition of man:is_random_seeded[9] to man:random[4]."
+msgstr "13.0-CURRENT после добавления man:is_random_seeded[9] в man:random[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:907
+#, no-wrap
+msgid "1300020"
+msgstr "1300020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:908
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/346358[346358]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/346358[346358]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:909
+#, no-wrap
+msgid "April 18, 2019"
+msgstr "18 апреля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:911
+#, no-wrap
+msgid "13.0-CURRENT after restoring man:random[4] availability tradeoff prior to link:https://svnweb.freebsd.org/changeset/base/346250[346250] and adding new tunables and diagnostic sysctls for programmatically discovering early seeding problems after boot."
+msgstr "13.0-CURRENT после восстановления доступности man:random[4] с учетом компромиссов до link:https://svnweb.freebsd.org/changeset/base/346250[346250] и добавления новых настроек и диагностических sysctl для программного обнаружения проблем с ранней инициализацией семени после загрузки."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:912
+#, no-wrap
+msgid "1300021"
+msgstr "1300021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:913
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/346645[346645]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/346645[346645]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:914
+#, no-wrap
+msgid "April 24, 2019"
+msgstr "24 апреля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:916
+#, no-wrap
+msgid "13.0-CURRENT after LinuxKPI uses man:bus_dma[9] to be compatible with an IOMMU."
+msgstr "13.0-CURRENT после того, как LinuxKPI использует man:bus_dma[9] для совместимости с IOMMU."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:917
+#, no-wrap
+msgid "1300022"
+msgstr "1300022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:918
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347089[347089]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347089[347089]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:919
+#, no-wrap
+msgid "May 4, 2019"
+msgstr "4 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:921
+#, no-wrap
+msgid "13.0-CURRENT after fixing regression issue after link:https://svnweb.freebsd.org/changeset/base/346645[346645] in the LinuxKPI."
+msgstr "13.0-CURRENT после исправления регрессии, возникшей после link:https://svnweb.freebsd.org/changeset/base/346645[346645] в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:922
+#, no-wrap
+msgid "1300023"
+msgstr "1300023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:923
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347192[347192]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347192[347192]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:924
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3465
+#, no-wrap
+msgid "May 6, 2019"
+msgstr "6 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:926
+#, no-wrap
+msgid "13.0-CURRENT after list-ifying kernel dump device configuration."
+msgstr "13.0-CURRENT после преобразования конфигурации устройства дампа ядра в список."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:927
+#, no-wrap
+msgid "1300024"
+msgstr "1300024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:928
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347325[347325]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347325[347325]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:929
+#, no-wrap
+msgid "May 8, 2019"
+msgstr "8 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:931
+#, no-wrap
+msgid "13.0-CURRENT after bumping the Mellanox driver version numbers (man:mlx4en[4]; man:mlx5en[4])."
+msgstr "13.0-CURRENT после увеличения номеров версий драйверов Mellanox (man:mlx4en[4]; man:mlx5en[4])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:932
+#, no-wrap
+msgid "1300025"
+msgstr "1300025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:933
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347532[347532]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347532[347532]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:934
+#, no-wrap
+msgid "May 13, 2019"
+msgstr "13 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:936
+#, no-wrap
+msgid "13.0-CURRENT after renaming `vm.max_wired` to `vm.max_user_wired` and changing its type."
+msgstr "13.0-CURRENT после переименования `vm.max_wired` в `vm.max_user_wired` и изменения его типа."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:937
+#, no-wrap
+msgid "1300026"
+msgstr "1300026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:938
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347596[347596]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347596[347596]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:939
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:944
+#, no-wrap
+msgid "May 14, 2019"
+msgstr "14 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:941
+#, no-wrap
+msgid "13.0-CURRENT after adding context member to ww_mutex in LinuxKPI."
+msgstr "13.0-CURRENT после добавления члена контекста к ww_mutex в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:942
+#, no-wrap
+msgid "1300027"
+msgstr "1300027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:943
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347601[347601]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347601[347601]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:946
+#, no-wrap
+msgid "13.0-CURRENT after adding prepare to `pm_ops` in LinuxKPI."
+msgstr "13.0-CURRENT после добавления prepare в `pm_ops` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:947
+#, no-wrap
+msgid "1300028"
+msgstr "1300028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:948
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347925[347925]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347925[347925]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:949
+#, no-wrap
+msgid "May 17, 2019"
+msgstr "17 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:951
+#, no-wrap
+msgid "13.0-CURRENT after removal of `bm`, `cs`, de, ed, `ep`, ex, `fe`, `pcn`, sf, `sn`, `tl`, `tx`, `txp`, `vx`, `wb`, and xe drivers."
+msgstr "13.0-CURRENT после удаления драйверов `bm`, `cs`, de, ed, `ep`, ex, `fe`, `pcn`, sf, `sn`, `tl`, `tx`, `txp`, `vx`, `wb` и xe."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:952
+#, no-wrap
+msgid "1300029"
+msgstr "1300029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:953
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347984[347984]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347984[347984]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:954
+#, no-wrap
+msgid "May 20, 2019"
+msgstr "20 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:956
+#, no-wrap
+msgid "13.0-CURRENT after removing some header pollution due to [.filename]#sys/eventhandler.h#. Affected files may now need to explicitly include one or more of [.filename]#sys/eventhandler.h#, [.filename]#sys/ktr.h#, [.filename]#sys/lock.h#, or [.filename]#sys/mutex.h#, when the missing header may have been included implicitly prior to 1300029."
+msgstr "13.0-CURRENT после удаления некоторых загрязнений заголовков из-за [.filename]#sys/eventhandler.h#. Затронутые файлы теперь могут требовать явного включения одного или нескольких заголовков: [.filename]#sys/eventhandler.h#, [.filename]#sys/ktr.h#, [.filename]#sys/lock.h# или [.filename]#sys/mutex.h#, тогда как ранее они могли включаться неявно до версии 1300029."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:957
+#, no-wrap
+msgid "1300030"
+msgstr "1300030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:958
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/348350[348350]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/348350[348350]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:959
+#, no-wrap
+msgid "May 29, 2019"
+msgstr "29 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:961
+#, no-wrap
+msgid "13.0-CURRENT after adding relocation support to libdwarf on powerpc64 to fix handling of DWARF information on unlinked objects. Original commit in link:https://svnweb.freebsd.org/changeset/base/348347[348347]."
+msgstr "13.0-CURRENT после добавления поддержки перемещения в libdwarf на powerpc64 для исправления обработки DWARF-информации в несвязанных объектах. Оригинальный коммит в ссылке:https://svnweb.freebsd.org/changeset/base/348347[348347]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:962
+#, no-wrap
+msgid "1300031"
+msgstr "1300031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:963
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/348808[348808]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/348808[348808]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:964
+#, no-wrap
+msgid "June 8, 2019"
+msgstr "8 июня 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:966
+#, no-wrap
+msgid "13.0-CURRENT after adding dpcpu and vnet section fixes to i386 kernel modules to avoid panics in certain conditions. i386 kernel modules need to be recompiled with the linker script magic in place or they will refuse to load."
+msgstr "13.0-CURRENT после добавления исправлений разделов dpcpu и vnet в модули ядра i386 для предотвращения паники в определённых условиях. Модули ядра i386 необходимо перекомпилировать с включёнными изменениями в скрипт компоновщика, иначе они откажутся загружаться."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:967
+#, no-wrap
+msgid "1300032"
+msgstr "1300032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:968
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/349151[349151]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/349151[349151]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:969
+#, no-wrap
+msgid "June 17, 2019"
+msgstr "17 июня 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:971
+#, no-wrap
+msgid "13.0-CURRENT after separating kernel `crc32()` implementation to its own header ([.filename]#gsb_crc32.h#) and renaming the source to [.filename]#gsb_crc32.c#."
+msgstr "13.0-CURRENT после выделения реализации `crc32()` ядра в отдельный заголовочный файл ([.filename]#gsb_crc32.h#) и переименования исходного файла в [.filename]#gsb_crc32.c#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:972
+#, no-wrap
+msgid "1300033"
+msgstr "1300033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:973
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/349277[349277]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/349277[349277]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:974
+#, no-wrap
+msgid "June 21, 2019"
+msgstr "June 21, 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:976
+#, no-wrap
+msgid "13.0-CURRENT after additions to LinuxKPI's `rcu` list."
+msgstr "13.0-CURRENT после добавлений в список `rcu` LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:977
+#, no-wrap
+msgid "1300034"
+msgstr "1300034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:978
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/349352[349352]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/349352[349352]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:979
+#, no-wrap
+msgid "June 24, 2019"
+msgstr "24 июня 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:981
+#, no-wrap
+msgid "13.0-CURRENT after NAND and NANDFS removal."
+msgstr "13.0-CURRENT после удаления NAND и NANDFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:982
+#, no-wrap
+msgid "1300035"
+msgstr "1300035"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:983
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/349846[349846]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/349846[349846]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:984
+#, no-wrap
+msgid "July 8, 2019"
+msgstr "8 июля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:986
+#, no-wrap
+msgid "13.0-CURRENT after merging the `vm_page` hold and wire mechanisms."
+msgstr "13.0-CURRENT после объединения механизмов удержания и фиксации `vm_page`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:987
+#, no-wrap
+msgid "1300036"
+msgstr "1300036"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:988
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/349972[349972]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/349972[349972]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:989
+#, no-wrap
+msgid "July 13, 2019"
+msgstr "13 июля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:991
+#, no-wrap
+msgid "13.0-CURRENT after adding `arm_drain_writebuf()` and `arm_sync_icache()` for compatibility with NetBSD and OpenBSD."
+msgstr "13.0-CURRENT после добавления `arm_drain_writebuf()` и `arm_sync_icache()` для совместимости с NetBSD и OpenBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:992
+#, no-wrap
+msgid "1300037"
+msgstr "1300037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:993
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/350307[350307]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/350307[350307]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:994
+#, no-wrap
+msgid "July 24, 2019"
+msgstr "24 июля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:996
+#, no-wrap
+msgid "13.0-CURRENT after removal of man:libcap_random[3]."
+msgstr "13.0-CURRENT после удаления man:libcap_random[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:997
+#, no-wrap
+msgid "1300038"
+msgstr "1300038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:998
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/350437[350437]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/350437[350437]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:999
+#, no-wrap
+msgid "July 30, 2019"
+msgstr "30 июля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1001
+#, no-wrap
+msgid "13.0-CURRENT after removal of gzip'ed a.out support."
+msgstr "13.0-CURRENT после удаления поддержки gzip'ed a.out."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1002
+#, no-wrap
+msgid "1300039"
+msgstr "1300039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1003
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/350665[350665]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/350665[350665]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1004
+#, no-wrap
+msgid "August 7, 2019"
+msgstr "7 августа 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1006
+#, no-wrap
+msgid "13.0-CURRENT after merge of fusefs from projects/fuse2."
+msgstr "13.0-CURRENT после объединения fusefs из projects/fuse2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1007
+#, no-wrap
+msgid "1300040"
+msgstr "1300040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1008
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/351140[351140]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/351140[351140]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1009
+#, no-wrap
+msgid "August 16, 2019"
+msgstr "16 августа 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1011
+#, no-wrap
+msgid "13.0-CURRENT after deletion of [.filename]#sys/dir.h# which has been deprecated since 1997."
+msgstr "13.0-CURRENT после удаления [.filename]#sys/dir.h#, который был устаревшим с 1997 года."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1012
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1197
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1367
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1627
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1940
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3696
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5237
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5770
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6323
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6511
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7475
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7480
+#, no-wrap
+msgid "(not changed)"
+msgstr "(не изменено)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1013
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/351423[351423]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/351423[351423]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1014
+#, no-wrap
+msgid "August 23, 2019"
+msgstr "23 августа 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1016
+#, no-wrap
+msgid "13.0-CURRENT after changing most arguments to man:ping6[8]."
+msgstr "13.0-CURRENT после изменения большинства аргументов в man:ping6[8]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1017
+#, no-wrap
+msgid "1300041"
+msgstr "1300041"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1018
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/351480[351480]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/351480[351480]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1019
+#, no-wrap
+msgid "August 25, 2019"
+msgstr "25 августа 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1021
+#, no-wrap
+msgid "13.0-CURRENT after removal of zlib 1.0.4 after the completion of kernel zlib unification."
+msgstr "13.0-CURRENT после удаления zlib 1.0.4 по завершении унификации zlib в ядре."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1022
+#, no-wrap
+msgid "1300042"
+msgstr "1300042"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1023
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/351522[351522]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/351522[351522]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1024
+#, no-wrap
+msgid "August 27, 2019"
+msgstr "27 августа 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1026
+#, no-wrap
+msgid "13.0-CURRENT after addition of kernel-side support for in-kernel TLS."
+msgstr "13.0-CURRENT после добавления поддержки TLS внутри ядра на уровне ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1027
+#, no-wrap
+msgid "1300043"
+msgstr "1300043"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1028
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/351698[351698]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/351698[351698]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1029
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1034
+#, no-wrap
+msgid "September 2, 2019"
+msgstr "2 сентября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1031
+#, no-wrap
+msgid "13.0-CURRENT after removal of man:gets[3]."
+msgstr "13.0-CURRENT после удаления man:gets[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1032
+#, no-wrap
+msgid "1300044"
+msgstr "1300044"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1033
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/351701[351701]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/351701[351701]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1036
+#, no-wrap
+msgid "13.0-CURRENT after adding sysfs create/remove functions that handles multiple files in one call to the LinuxKPI."
+msgstr "13.0-CURRENT после добавления функций создания/удаления sysfs, обрабатывающих несколько файлов за один вызов, в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1037
+#, no-wrap
+msgid "1300045"
+msgstr "1300045"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1038
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/351729[351729]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/351729[351729]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1039
+#, no-wrap
+msgid "September 3, 2019"
+msgstr "3 сентября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1041
+#, no-wrap
+msgid "13.0-CURRENT after adding man:sysctlbyname[3] system call."
+msgstr "13.0-CURRENT после добавления системного вызова man:sysctlbyname[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1042
+#, no-wrap
+msgid "1300046"
+msgstr "1300046"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1043
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/351937[351937]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/351937[351937]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1044
+#, no-wrap
+msgid "September 6, 2019"
+msgstr "6 сентября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1046
+#, no-wrap
+msgid "13.0-CURRENT after LinuxKPI sysfs improvements."
+msgstr "13.0-CURRENT после улучшений LinuxKPI sysfs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1047
+#, no-wrap
+msgid "1300047"
+msgstr "1300047"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1048
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/352110[352110]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/352110[352110]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1049
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2352
+#, no-wrap
+msgid "September 9, 2019"
+msgstr "9 сентября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1051
+#, no-wrap
+msgid "13.0-CURRENT after changing the synchronization rules for `vm_page` reference counting.."
+msgstr "13.0-CURRENT после изменения правил синхронизации для подсчета ссылок `vm_page`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1052
+#, no-wrap
+msgid "1300048"
+msgstr "1300048"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1053
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/352700[352700]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/352700[352700]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1054
+#, no-wrap
+msgid "September 25, 2019"
+msgstr "25 сентября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1056
+#, no-wrap
+msgid "13.0-CURRENT after adding a shm_open2 syscall to support the upcoming man:memfd_create[2] syscall."
+msgstr "13.0-CURRENT после добавления системного вызова shm_open2 для поддержки готовящегося системного вызова man:memfd_create[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1057
+#, no-wrap
+msgid "1300049"
+msgstr "1300049"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1058
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/353274[353274]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/353274[353274]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1059
+#, no-wrap
+msgid "October 7, 2019"
+msgstr "7 октября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1061
+#, no-wrap
+msgid "13.0-CURRENT after factoring out the VNET shutdown check into an own vnet structure field."
+msgstr "13.0-CURRENT после вынесения проверки отключения VNET в отдельное поле структуры vnet."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1062
+#, no-wrap
+msgid "1300050"
+msgstr "1300050"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1063
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/353358[353358]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/353358[353358]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1064
+#, no-wrap
+msgid "October 9, 2019"
+msgstr "9 октября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1066
+#, no-wrap
+msgid "13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 9.0.0 final release r372316."
+msgstr "13.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до финального релиза 9.0.0 r372316."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1067
+#, no-wrap
+msgid "1300051"
+msgstr "1300051"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1068
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/353685[353685]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/353685[353685]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1069
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1074
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1079
+#, no-wrap
+msgid "October 17, 2019"
+msgstr "17 октября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1071
+#, no-wrap
+msgid "13.0-CURRENT after splitting out a more generic man:debugnet[4] from man:netdump[4]."
+msgstr "13.0-CURRENT после выделения более универсального man:debugnet[4] из man:netdump[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1072
+#, no-wrap
+msgid "1300052"
+msgstr "1300052"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1073
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/353698[353698]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/353698[353698]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1076
+#, no-wrap
+msgid "13.0-CURRENT after promoting the page busy field to a first class lock that no longer requires the object lock for consistency."
+msgstr "13.0-CURRENT после преобразования поля busy page в полноценную блокировку, которая больше не требует блокировки объекта для обеспечения согласованности."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1077
+#, no-wrap
+msgid "1300053"
+msgstr "1300053"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1078
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/353700[353700]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/353700[353700]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1081
+#, no-wrap
+msgid "13.0-CURRENT after implementing NetGDB."
+msgstr "13.0-CURRENT после реализации NetGDB."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1082
+#, no-wrap
+msgid "1300054"
+msgstr "1300054"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1083
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/353868[353868]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/353868[353868]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1084
+#, no-wrap
+msgid "October 21, 2019"
+msgstr "21 октября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1086
+#, no-wrap
+msgid "13.0-CURRENT after removing obsoleted KPIs that were used to access interface address lists."
+msgstr "13.0-CURRENT после удаления устаревших KPIs, которые использовались для доступа к спискам адресов интерфейсов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1087
+#, no-wrap
+msgid "1300055"
+msgstr "1300055"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1088
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354335[354335]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354335[354335]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1089
+#, no-wrap
+msgid "November 4, 2019"
+msgstr "4 ноября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1091
+#, no-wrap
+msgid "13.0-CURRENT after enabling device class group attributes in the LinuxKPI."
+msgstr "13.0-CURRENT после включения атрибутов группы классов устройств в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1092
+#, no-wrap
+msgid "1300056"
+msgstr "1300056"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1093
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354460[354460]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354460[354460]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1094
+#, no-wrap
+msgid "November 7, 2019"
+msgstr "7 ноября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1096
+#, no-wrap
+msgid "13.0-CURRENT after fixing a potential OOB read security issue in libc++."
+msgstr "13.0-CURRENT после исправления потенциальной проблемы безопасности с чтением за границами в libc++."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1097
+#, no-wrap
+msgid "1300057"
+msgstr "1300057"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1098
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354694[354694]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354694[354694]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1099
+#, no-wrap
+msgid "November 13, 2019"
+msgstr "13 ноября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1101
+#, no-wrap
+msgid "13.0-CURRENT after adding support for `AT_EXECPATH` to man:elf_aux_info[3]."
+msgstr "13.0-CURRENT после добавления поддержки `AT_EXECPATH` в man:elf_aux_info[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1102
+#, no-wrap
+msgid "1300058"
+msgstr "1300058"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1103
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354820[354820]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354820[354820]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1104
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1109
+#, no-wrap
+msgid "November 18, 2019"
+msgstr "18 ноября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1106
+#, no-wrap
+msgid "13.0-CURRENT after widening the `vm_page` `aflags` field to 16 bits."
+msgstr "13.0-CURRENT после расширения поля `aflags` в `vm_page` до 16 бит."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1107
+#, no-wrap
+msgid "1300059"
+msgstr "1300059"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1108
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354835[354835]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354835[354835]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1111
+#, no-wrap
+msgid "13.0-CURRENT after converting the in-tree `sysent` targets to use the new [.filename]#makesyscalls.lua#."
+msgstr "13.0-CURRENT после преобразования встроенных целей `sysent` для использования нового [.filename]#makesyscalls.lua#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1112
+#, no-wrap
+msgid "1300060"
+msgstr "1300060"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1113
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354922[354922]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354922[354922]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1114
+#, no-wrap
+msgid "November 20, 2019"
+msgstr "20 ноября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1116
+#, no-wrap
+msgid "13.0-CURRENT after adding [.filename]#/etc/os-release# as a symbolic link to [.filename]#/var/run/os-release#."
+msgstr "13.0-CURRENT после добавления символической ссылки [.filename]#/etc/os-release# на [.filename]#/var/run/os-release#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1117
+#, no-wrap
+msgid "1300061"
+msgstr "1300061"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1118
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354977[354977]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354977[354977]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1119
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2387
+#, no-wrap
+msgid "November 21, 2019"
+msgstr "21 ноября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1121
+#, no-wrap
+msgid "13.0-CURRENT after adding functions to man:bitstring[3] to find contiguous sequences of set or unset bits."
+msgstr "13.0-CURRENT после добавления функций в man:bitstring[3] для поиска непрерывных последовательностей установленных или сброшенных битов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1122
+#, no-wrap
+msgid "1300062"
+msgstr "1300062"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1123
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/355309[355309]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/355309[355309]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1124
+#, no-wrap
+msgid "December 2, 2019"
+msgstr "2 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1126
+#, no-wrap
+msgid "13.0-CURRENT after adding TCP_STATS support."
+msgstr "13.0-CURRENT после добавления поддержки TCP_STATS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1127
+#, no-wrap
+msgid "1300063"
+msgstr "1300063"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1128
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/355537[355537]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/355537[355537]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1129
+#, no-wrap
+msgid "December 8, 2019"
+msgstr "8 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1131
+#, no-wrap
+msgid "13.0-CURRENT after removal of VI_DOOMED (use VN_IS_DOOMED instead)."
+msgstr "13.0-CURRENT после удаления VI_DOOMED (используйте VN_IS_DOOMED вместо этого)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1132
+#, no-wrap
+msgid "1300064"
+msgstr "1300064"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1133
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2391
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/355658[355658]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/355658[355658]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1134
+#, no-wrap
+msgid "December 9, 2019"
+msgstr "9 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1136
+#, no-wrap
+msgid "13.0-CURRENT after correcting the C++ version check for declaring man:timespec_get[3]."
+msgstr "13.0-CURRENT после исправления проверки версии C++ для объявления man:timespec_get[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1137
+#, no-wrap
+msgid "1300065"
+msgstr "1300065"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1138
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/355643[355643]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/355643[355643]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1139
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1144
+#, no-wrap
+msgid "December 12, 2019"
+msgstr "12 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1141
+#, no-wrap
+msgid "13.0-CURRENT after adding `sigsetop` extensions commonly found in musl libc and glibc."
+msgstr "13.0-CURRENT после добавления расширений `sigsetop`, которые обычно встречаются в musl libc и glibc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1142
+#, no-wrap
+msgid "1300066"
+msgstr "1300066"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1143
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/355679[355679]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/355679[355679]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1146
+#, no-wrap
+msgid "13.0-CURRENT after changing the internal interface between the NFS modules as part of the introduction of NFS 4.2."
+msgstr "13.0-CURRENT после изменения внутреннего интерфейса между модулями NFS в рамках внедрения NFS 4.2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1147
+#, no-wrap
+msgid "1300067"
+msgstr "1300067"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1148
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/355732[355732]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/355732[355732]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1149
+#, no-wrap
+msgid "December 13, 2019"
+msgstr "13 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1151
+#, no-wrap
+msgid "13.0-CURRENT after removing the deprecated `callout_handle_init`, `timeout`, and `untimeout` functions."
+msgstr "13.0-CURRENT после удаления устаревших функций `callout_handle_init`, `timeout` и `untimeout`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1152
+#, no-wrap
+msgid "1300068"
+msgstr "1300068"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1153
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/355828[355828]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/355828[355828]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1154
+#, no-wrap
+msgid "December 16, 2019"
+msgstr "16 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1156
+#, no-wrap
+msgid "13.0-CURRENT after doubling the value of `ARG_MAX`, for 64 bit platforms."
+msgstr "13.0-CURRENT после удвоения значения `ARG_MAX` для 64-битных платформ."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1157
+#, no-wrap
+msgid "1300069"
+msgstr "1300069"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1158
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356051[356051]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356051[356051]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1159
+#, no-wrap
+msgid "December 24, 2019"
+msgstr "24 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1161
+#, no-wrap
+msgid "13.0-CURRENT after the addition of busdma templates."
+msgstr "13.0-CURRENT после добавления шаблонов busdma."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1162
+#, no-wrap
+msgid "1300070"
+msgstr "1300070"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1163
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356113[356113]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356113[356113]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1164
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1169
+#, no-wrap
+msgid "December 27, 2019"
+msgstr "27 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1166
+#, no-wrap
+msgid "13.0-CURRENT after eliminating the last MI difference in AT_* definitions (for powerpc)."
+msgstr "13.0-CURRENT после устранения последнего различия MI в определениях AT_* (для powerpc)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1167
+#, no-wrap
+msgid "1300071"
+msgstr "1300071"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1168
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356135[356135]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356135[356135]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1171
+#, no-wrap
+msgid "13.0-CURRENT after making USB statistics be per-device instead of per bus."
+msgstr "13.0-CURRENT после изменения статистики USB для каждого устройства вместо каждой шины."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1172
+#, no-wrap
+msgid "1300072"
+msgstr "1300072"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1173
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356185[356185]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356185[356185]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1174
+#, no-wrap
+msgid "December 29, 2019"
+msgstr "29 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1176
+#, no-wrap
+msgid "13.0-CURRENT after removal of `GEOM_SCHED` class and `gsched` tool."
+msgstr "13.0-CURRENT после удаления класса `GEOM_SCHED` и утилиты `gsched`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1177
+#, no-wrap
+msgid "1300073"
+msgstr "1300073"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1178
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356263[356263]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356263[356263]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1179
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2407
+#, no-wrap
+msgid "January 2, 2020"
+msgstr "2 января 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1181
+#, no-wrap
+msgid "13.0-CURRENT after removing arm/arm as a valid target."
+msgstr "13.0-CURRENT после удаления arm/arm как допустимой цели."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1182
+#, no-wrap
+msgid "1300074"
+msgstr "1300074"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1183
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356337[356337]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356337[356337]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1184
+#, no-wrap
+msgid "January 3, 2020"
+msgstr "3 января 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1186
+#, no-wrap
+msgid "13.0-CURRENT after removing flags argument from `VOP_UNLOCK`."
+msgstr "13.0-CURRENT после удаления аргумента flags из `VOP_UNLOCK`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1187
+#, no-wrap
+msgid "1300075"
+msgstr "1300075"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1188
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356409[356409]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356409[356409]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1189
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2412
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3510
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4283
+#, no-wrap
+msgid "January 6, 2020"
+msgstr "6 января 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1191
+#, no-wrap
+msgid "13.0-CURRENT after adding own counter for cancelled USB transfers."
+msgstr "13.0-CURRENT после добавления собственного счетчика отмененных USB-передач."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1192
+#, no-wrap
+msgid "1300076"
+msgstr "1300076"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1193
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356511[356511]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356511[356511]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1194
+#, no-wrap
+msgid "January 8, 2020"
+msgstr "8 января 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1196
+#, no-wrap
+msgid "13.0-CURRENT after pushing `vnop` implementation into the `fileop` layer in man:posix_fallocate[2]."
+msgstr "13.0-CURRENT после внедрения реализации `vnop` в слой `fileop` в man:posix_fallocate[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1198
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/357396[357396]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/357396[357396]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1199
+#, no-wrap
+msgid "February 2, 2020"
+msgstr "2 февраля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1201
+#, no-wrap
+msgid "13.0-CURRENT after removal of armv5 architecture code from the src tree."
+msgstr "13.0-CURRENT после удаления кода архитектуры armv5 из дерева src."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1202
+#, no-wrap
+msgid "1300077"
+msgstr "1300077"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1203
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/357455[357455]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/357455[357455]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1204
+#, no-wrap
+msgid "February 3, 2020"
+msgstr "3 февраля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1206
+#, no-wrap
+msgid "13.0-CURRENT after removal of sparc64 architecture code from the src tree."
+msgstr "13.0-CURRENT после удаления кода архитектуры sparc64 из дерева src."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1207
+#, no-wrap
+msgid "1300078"
+msgstr "1300078"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1208
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/358020[358020]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/358020[358020]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1209
+#, no-wrap
+msgid "February 17, 2020"
+msgstr "17 февраля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1211
+#, no-wrap
+msgid "13.0-CURRENT after changing `struct vnet` and the VNET magic cookie."
+msgstr "13.0-CURRENT после изменения `struct vnet` и волшебного cookie VNET."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1212
+#, no-wrap
+msgid "1300079"
+msgstr "1300079"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1213
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/358164[358164]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/358164[358164]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1214
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1219
+#, no-wrap
+msgid "February 20, 2020"
+msgstr "20 февраля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1216
+#, no-wrap
+msgid "13.0-CURRENT after upgrading ncurses to 6.2.x"
+msgstr "13.0-CURRENT после обновления ncurses до версии 6.2.x"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1217
+#, no-wrap
+msgid "1300080"
+msgstr "1300080"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1218
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/358172[358172]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/358172[358172]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1221
+#, no-wrap
+msgid "13.0-CURRENT after adding `realpathat` syscall to VFS."
+msgstr "13.0-CURRENT после добавления системного вызова `realpathat` в VFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1222
+#, no-wrap
+msgid "1300081"
+msgstr "1300081"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1223
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/358218[358218]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/358218[358218]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1224
+#, no-wrap
+msgid "February 21, 2020"
+msgstr "21 февраля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1226
+#, no-wrap
+msgid "13.0-CURRENT after recent linuxkpi changes."
+msgstr "13.0-CURRENT после недавних изменений в linuxkpi."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1227
+#, no-wrap
+msgid "1300082"
+msgstr "1300082"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1228
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/358497[358497]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/358497[358497]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1229
+#, no-wrap
+msgid "March 1, 2020"
+msgstr "1 марта 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1231
+#, no-wrap
+msgid "13.0-CURRENT after removal of man:bktr[4]."
+msgstr "13.0-CURRENT после удаления man:bktr[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1232
+#, no-wrap
+msgid "1300083"
+msgstr "1300083"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1233
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/358834[358834]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/358834[358834]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1234
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1239
+#, no-wrap
+msgid "March 10, 2020"
+msgstr "10 марта 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1236
+#, no-wrap
+msgid "13.0-CURRENT after removal of man:amd[8], r358821."
+msgstr "13.0-CURRENT после удаления man:amd[8], r358821."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1237
+#, no-wrap
+msgid "1300084"
+msgstr "1300084"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1238
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/358851[358851]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/358851[358851]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1241
+#, no-wrap
+msgid "13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0-rc3 c290cb61fdc."
+msgstr "13.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.0-rc3 c290cb61fdc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1242
+#, no-wrap
+msgid "1300085"
+msgstr "1300085"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1243
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359261[359261]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359261[359261]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1244
+#, no-wrap
+msgid "March 23, 2020"
+msgstr "23 марта 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1246
+#, no-wrap
+msgid "13.0-CURRENT after the import of the kyua test framework."
+msgstr "13.0-CURRENT после импорта тестового фреймворка kyua."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1247
+#, no-wrap
+msgid "1300086"
+msgstr "1300086"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1248
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359347[359347]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359347[359347]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1249
+#, no-wrap
+msgid "March 26, 2020"
+msgstr "26 марта 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1251
+#, no-wrap
+msgid "13.0-CURRENT after switching powerpc and powerpcspe to the lld linker."
+msgstr "13.0-CURRENT после переключения powerpc и powerpcspe на компоновщик lld."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1252
+#, no-wrap
+msgid "1300087"
+msgstr "1300087"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1253
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359374[359374]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359374[359374]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1254
+#, no-wrap
+msgid "March 27, 2020"
+msgstr "27 марта 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1256
+#, no-wrap
+msgid "13.0-CURRENT after refactoring the driver and consumer interfaces for in-kernel cryptography."
+msgstr "13.0-CURRENT после рефакторинга интерфейсов драйвера и потребителя для внутриядерного шифрования."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1257
+#, no-wrap
+msgid "1300088"
+msgstr "1300088"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1258
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359530[359530]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359530[359530]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1259
+#, no-wrap
+msgid "April 1, 2020"
+msgstr "1 апреля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1261
+#, no-wrap
+msgid "13.0-CURRENT after removing support for procfs process debugging."
+msgstr "13.0-CURRENT после удаления поддержки отладки процессов через procfs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1262
+#, no-wrap
+msgid "1300089"
+msgstr "1300089"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1263
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359727[359727]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359727[359727]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1264
+#, no-wrap
+msgid "April 8, 2020"
+msgstr "8 апреля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1266
+#, no-wrap
+msgid "13.0-CURRENT after cloning the RCU interface into a sleepable and a non-sleepable part in the LinuxKPI."
+msgstr "13.0-CURRENT после разделения интерфейса RCU на части с возможностью ожидания и без неё в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1267
+#, no-wrap
+msgid "1300090"
+msgstr "1300090"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1268
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359747[359747]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359747[359747]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1269
+#, no-wrap
+msgid "April 9, 2020"
+msgstr "9 апреля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1271
+#, no-wrap
+msgid "13.0-CURRENT after removing the old NFS lock device driver that uses Giant."
+msgstr "13.0-CURRENT после удаления старого драйвера устройства блокировки NFS, использующего Giant."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1272
+#, no-wrap
+msgid "1300091"
+msgstr "1300091"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1273
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359839[359839]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359839[359839]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1274
+#, no-wrap
+msgid "April 12, 2020"
+msgstr "12 апреля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1276
+#, no-wrap
+msgid "13.0-CURRENT after implementing a man:close_range[2] syscall."
+msgstr "13.0-CURRENT после реализации системного вызова man:close_range[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1277
+#, no-wrap
+msgid "1300092"
+msgstr "1300092"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1278
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359920[359920]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359920[359920]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1279
+#, no-wrap
+msgid "April 14, 2020"
+msgstr "14 апреля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1281
+#, no-wrap
+msgid "13.0-CURRENT after reworking unmapped mbufs in KTLS to carry `ext_pgs` in the mbuf itself."
+msgstr "13.0-CURRENT после переработки немэппированных mbuf в KTLS для хранения `ext_pgs` в самом mbuf."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1282
+#, no-wrap
+msgid "1300093"
+msgstr "1300093"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1283
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360418[360418]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360418[360418]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1284
+#, no-wrap
+msgid "April 27, 2020"
+msgstr "27 апреля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1286
+#, no-wrap
+msgid "13.0-CURRENT after adding support for kernel TLS receive offload."
+msgstr "13.0-CURRENT после добавления поддержки выгрузки приема TLS в ядре."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1287
+#, no-wrap
+msgid "1300094"
+msgstr "1300094"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1288
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360796[360796]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360796[360796]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1289
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3535
+#, no-wrap
+msgid "May 7, 2020"
+msgstr "7 мая 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1291
+#, no-wrap
+msgid "13.0-CURRENT after linuxkpi changes."
+msgstr "13.0-CURRENT после изменений в linuxkpi."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1292
+#, no-wrap
+msgid "1300095"
+msgstr "1300095"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1293
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/361275[361275]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/361275[361275]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1294
+#, no-wrap
+msgid "May 20, 2020"
+msgstr "20 мая 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1296
+#, no-wrap
+msgid "13.0-CURRENT after adding HyperV socket support for FreeBSD guests."
+msgstr "13.0-CURRENT после добавления поддержки сокетов HyperV для гостевых систем FreeBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1297
+#, no-wrap
+msgid "1300096"
+msgstr "1300096"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1298
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/361410[361410]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/361410[361410]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1299
+#, no-wrap
+msgid "May 23, 2020"
+msgstr "23 мая 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1301
+#, no-wrap
+msgid "13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.1 rc1 f79cd71e145."
+msgstr "13.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.1 rc1 f79cd71e145."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1302
+#, no-wrap
+msgid "1300097"
+msgstr "1300097"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1303
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/361724[361724]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/361724[361724]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1304
+#, no-wrap
+msgid "June 2, 2020"
+msgstr "2 июня 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1306
+#, no-wrap
+msgid "13.0-CURRENT after implementing `__is_constexpr()` function macro in the LinuxKPI."
+msgstr "13.0-CURRENT после реализации макроса функции `__is_constexpr()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1307
+#, no-wrap
+msgid "1300098"
+msgstr "1300098"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1308
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/362159[362159]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/362159[362159]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1309
+#, no-wrap
+msgid "June 14, 2020"
+msgstr "14 июня 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1311
+#, no-wrap
+msgid "13.0-CURRENT after changing the `export_args ex_flags` field so that is 64bits."
+msgstr "13.0-CURRENT после изменения поля `export_args ex_flags`, чтобы оно было 64-битным."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1312
+#, no-wrap
+msgid "1300099"
+msgstr "1300099"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1313
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/362453[362453]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/362453[362453]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1314
+#, no-wrap
+msgid "June 20, 2020"
+msgstr "20 июня 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1316
+#, no-wrap
+msgid "13.0-CURRENT after making liblzma use libmd implementation of SHA256."
+msgstr "13.0-CURRENT после перевода liblzma на использование реализации SHA256 из libmd."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1317
+#, no-wrap
+msgid "1300100"
+msgstr "1300100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1318
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/362640[362640]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/362640[362640]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1319
+#, no-wrap
+msgid "June 26, 2020"
+msgstr "June 26, 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1321
+#, no-wrap
+msgid "13.0-CURRENT after changing the internal API between the NFS kernel modules."
+msgstr "13.0-CURRENT после изменения внутреннего API между модулями ядра NFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1322
+#, no-wrap
+msgid "1300101"
+msgstr "1300101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1323
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363077[363077]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363077[363077]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1324
+#, no-wrap
+msgid "July 10, 2020"
+msgstr "10 июля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1326
+#, no-wrap
+msgid "13.0-CURRENT after implementing the `array_size()` function in the LinuxKPI."
+msgstr "13.0-CURRENT после реализации функции `array_size()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1327
+#, no-wrap
+msgid "1300102"
+msgstr "1300102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1328
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363562[363562]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363562[363562]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1329
+#, no-wrap
+msgid "July 26, 2020"
+msgstr "26 июля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1331
+#, no-wrap
+msgid "13.0-CURRENT after implementing lockless lookup in the VFS layer."
+msgstr "13.0-CURRENT после реализации бесблокировочного поиска в слое VFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1332
+#, no-wrap
+msgid "1300103"
+msgstr "1300103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1333
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363757[363757]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363757[363757]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1334
+#, no-wrap
+msgid "August 1, 2020"
+msgstr "1 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1336
+#, no-wrap
+msgid "13.0-CURRENT after making rights mandatory for NDINIT_ALL."
+msgstr "13.0-CURRENT после того, как права для NDINIT_ALL стали обязательными."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1337
+#, no-wrap
+msgid "1300104"
+msgstr "1300104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1338
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363783[363783]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363783[363783]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1339
+#, no-wrap
+msgid "August 2, 2020"
+msgstr "2 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1341
+#, no-wrap
+msgid "13.0-CURRENT after vnode layout changes."
+msgstr "13.0-CURRENT после изменений в структуре vnode."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1342
+#, no-wrap
+msgid "1300105"
+msgstr "1300105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1343
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363894[363894]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363894[363894]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1344
+#, no-wrap
+msgid "August 5, 2020"
+msgstr "5 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1346
+#, no-wrap
+msgid "13.0-CURRENT after `vaccess()` change."
+msgstr "13.0-CURRENT после изменения `vaccess()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1347
+#, no-wrap
+msgid "1300106"
+msgstr "1300106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1348
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364092[364092]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364092[364092]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1349
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1354
+#, no-wrap
+msgid "August 11, 2020"
+msgstr "11 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1351
+#, no-wrap
+msgid "13.0-CURRENT after adding an argument to `newnfs_connect()` that indicates use TLS for the connection."
+msgstr "13.0-CURRENT после добавления аргумента в `newnfs_connect()`, указывающего на использование TLS для соединения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1352
+#, no-wrap
+msgid "1300107"
+msgstr "1300107"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1353
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364109[364109]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364109[364109]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1356
+#, no-wrap
+msgid "13.0-CURRENT after change to clone the task struct fields related to RCU."
+msgstr "13.0-CURRENT после изменения для клонирования полей структуры задачи, связанных с RCU."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1357
+#, no-wrap
+msgid "1300108"
+msgstr "1300108"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1358
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364233[364233]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364233[364233]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1359
+#, no-wrap
+msgid "August 14, 2020"
+msgstr "14 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1361
+#, no-wrap
+msgid "13.0-CURRENT after adding a few `wait_bit` functions to the linuxkpi, which are needed for DRM from Linux v5.4."
+msgstr "13.0-CURRENT после добавления нескольких функций `wait_bit` в linuxkpi, которые необходимы для DRM из Linux v5.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1362
+#, no-wrap
+msgid "1300109"
+msgstr "1300109"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1363
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364274[364274]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364274[364274]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1364
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1369
+#, no-wrap
+msgid "August 16, 2020"
+msgstr "16 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1366
+#, no-wrap
+msgid "13.0-CURRENT after `vget()` argument removal and `namei` flags renumbering."
+msgstr "13.0-CURRENT после удаления аргумента `vget()` и перенумерации флагов `namei`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1368
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364284[364284]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364284[364284]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1371
+#, no-wrap
+msgid "13.0-CURRENT after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to release/11.x llvmorg-11.0.0-rc1-47-gff47911ddfc."
+msgstr "13.0-CURRENT после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии release/11.x llvmorg-11.0.0-rc1-47-gff47911ddfc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1372
+#, no-wrap
+msgid "1300110"
+msgstr "1300110"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1373
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364331[364331]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364331[364331]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1374
+#, no-wrap
+msgid "August 18, 2020"
+msgstr "18 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1376
+#, no-wrap
+msgid "13.0-CURRENT after deleting the unused `use_ext` argument to `nfscl_reqstart()`."
+msgstr "13.0-CURRENT после удаления неиспользуемого аргумента `use_ext` в `nfscl_reqstart()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1377
+#, no-wrap
+msgid "1300111"
+msgstr "1300111"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1378
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364476[364476]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364476[364476]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1379
+#, no-wrap
+msgid "August 22, 2020"
+msgstr "22 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1381
+#, no-wrap
+msgid "13.0-CURRENT after adding TLS support to the kernel RPC."
+msgstr "13.0-CURRENT после добавления поддержки TLS в RPC ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1382
+#, no-wrap
+msgid "1300112"
+msgstr "1300112"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1383
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364747[364747]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364747[364747]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1384
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1389
+#, no-wrap
+msgid "August 25, 2020"
+msgstr "August 25, 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1386
+#, no-wrap
+msgid "13.0-CURRENT after merging OpenZFS support."
+msgstr "13.0-CURRENT после объединения поддержки OpenZFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1387
+#, no-wrap
+msgid "1300113"
+msgstr "1300113"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1388
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364753[364753]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364753[364753]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1391
+#, no-wrap
+msgid "13.0-CURRENT after adding atomic and `bswap` functions to libcompiler_rt."
+msgstr "13.0-CURRENT после добавления атомарных функций и функций `bswap` в libcompiler_rt."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1392
+#, no-wrap
+msgid "1300114"
+msgstr "1300114"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1393
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/365459[365459]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/365459[365459]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1394
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2497
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3580
+#, no-wrap
+msgid "September 8, 2020"
+msgstr "8 сентября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1396
+#, no-wrap
+msgid "13.0-CURRENT after changing arm64 AT_HWCAP definitions for man:elf_aux_info[3]."
+msgstr "13.0-CURRENT после изменения определений AT_HWCAP для arm64 в man:elf_aux_info[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1397
+#, no-wrap
+msgid "1300115"
+msgstr "1300115"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1398
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/365705[365705]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/365705[365705]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1399
+#, no-wrap
+msgid "September 14, 2020"
+msgstr "14 сентября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1401
+#, no-wrap
+msgid "13.0-CURRENT after fixing man:crunchgen[1] application build with `WARNS=6`."
+msgstr "13.0-CURRENT после исправления сборки приложения man:crunchgen[1] с `WARNS=6`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1402
+#, no-wrap
+msgid "1300116"
+msgstr "1300116"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1403
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366062[366062]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366062[366062]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1404
+#, no-wrap
+msgid "September 22, 2020"
+msgstr "22 сентября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1406
+#, no-wrap
+msgid "13.0-CURRENT after the introduction of the powerpc64le ARCH."
+msgstr "13.0-CURRENT после введения архитектуры powerpc64le."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1407
+#, no-wrap
+msgid "1300117"
+msgstr "1300117"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1408
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366070[366070]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366070[366070]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1409
+#, no-wrap
+msgid "September 23, 2020"
+msgstr "23 сентября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1411
+#, no-wrap
+msgid "13.0-CURRENT after reimplementing `purgevfs` to iterate vnodes instead of the entire hash."
+msgstr "13.0-CURRENT после перереализации `purgevfs` для итерации по vnodes вместо всего хэша."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1412
+#, no-wrap
+msgid "1300118"
+msgstr "1300118"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1413
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366374[366374]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366374[366374]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1414
+#, no-wrap
+msgid "October 2, 2020"
+msgstr "2 октября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1416
+#, no-wrap
+msgid "13.0-CURRENT after adding backlight support and `dmi_*` functions to the linuxkpi."
+msgstr "13.0-CURRENT после добавления поддержки подсветки и функций `dmi_*` в linuxkpi."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1417
+#, no-wrap
+msgid "1300119"
+msgstr "1300119"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1418
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366432[366432]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366432[366432]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1419
+#, no-wrap
+msgid "October 6, 2020"
+msgstr "6 октября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1421
+#, no-wrap
+msgid "13.0-CURRENT after populating the acquire context field of a `ww_mutex` in the LinuxKPI."
+msgstr "13.0-CURRENT после заполнения поля контекста получения `ww_mutex` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1422
+#, no-wrap
+msgid "1300120"
+msgstr "1300120"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1423
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366666[366666]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366666[366666]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1424
+#, no-wrap
+msgid "October 13, 2020"
+msgstr "13 октября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1426
+#, no-wrap
+msgid "13.0-CURRENT after the fix to arm64 write-only mappings."
+msgstr "13.0-CURRENT после исправления отображений только для записи на arm64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1427
+#, no-wrap
+msgid "1300121"
+msgstr "1300121"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1428
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366719[366719]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366719[366719]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1429
+#, no-wrap
+msgid "October 15, 2020"
+msgstr "15 октября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1431
+#, no-wrap
+msgid "13.0-CURRENT after the addition of `VOP_EAGAIN`."
+msgstr "13.0-CURRENT после добавления `VOP_EAGAIN`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1432
+#, no-wrap
+msgid "1300122"
+msgstr "1300122"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1433
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366782[366782]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366782[366782]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1434
+#, no-wrap
+msgid "October 17, 2020"
+msgstr "17 октября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1436
+#, no-wrap
+msgid "13.0-CURRENT after the addition of `ptsname_r`."
+msgstr "13.0-CURRENT после добавления `ptsname_r`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1437
+#, no-wrap
+msgid "1300123"
+msgstr "1300123"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1438
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366871[366871]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366871[366871]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1439
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2527
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3590
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3595
+#, no-wrap
+msgid "October 20, 2020"
+msgstr "20 октября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1441
+#, no-wrap
+msgid "13.0-CURRENT after `VOP`, `VPTOCNP`, and `INACTIVE` changes."
+msgstr "13.0-CURRENT после изменений `VOP`, `VPTOCNP` и `INACTIVE`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1442
+#, no-wrap
+msgid "1300124"
+msgstr "1300124"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1443
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/367162[367162]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/367162[367162]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1444
+#, no-wrap
+msgid "October 30, 2020"
+msgstr "30 октября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1446
+#, no-wrap
+msgid "13.0-CURRENT after adding `cache_vop_mkdir` and renaming `cache_rename` to `cache_vop_rename`."
+msgstr "13.0-CURRENT после добавления `cache_vop_mkdir` и переименования `cache_rename` в `cache_vop_rename`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1447
+#, no-wrap
+msgid "1300125"
+msgstr "1300125"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1448
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/367347[367347]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/367347[367347]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1449
+#, no-wrap
+msgid "November 4, 2020"
+msgstr "4 ноября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1451
+#, no-wrap
+msgid "13.0-CURRENT after using a `rms` lock for teardown handling in `zfs`."
+msgstr "13.0-CURRENT после использования блокировки `rms` для обработки демонтажа в `zfs`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1452
+#, no-wrap
+msgid "1300126"
+msgstr "1300126"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1453
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/367384[367384]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/367384[367384]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1454
+#, no-wrap
+msgid "November 5, 2020"
+msgstr "5 ноября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1456
+#, no-wrap
+msgid "13.0-CURRENT after rationalizing per-cpu zones."
+msgstr "13.0-CURRENT после оптимизации зон на каждый процессор."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1457
+#, no-wrap
+msgid "1300127"
+msgstr "1300127"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1458
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/367432[367432]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/367432[367432]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1459
+#, no-wrap
+msgid "November 6, 2020"
+msgstr "6 ноября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1461
+#, no-wrap
+msgid "13.0-CURRENT after moving `malloc_type_internal` into `malloc_type`."
+msgstr "13.0-CURRENT после перемещения `malloc_type_internal` в `malloc_type`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1462
+#, no-wrap
+msgid "1300128"
+msgstr "1300128"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1463
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/367522[367522]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/367522[367522]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1464
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2532
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3600
+#, no-wrap
+msgid "November 9, 2020"
+msgstr "9 ноября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1466
+#, no-wrap
+msgid "13.0-CURRENT after LinuxKPI additions to implement ACPI bits required by `drm-kmod` in the base system."
+msgstr "13.0-CURRENT после добавлений LinuxKPI для реализации частей ACPI, необходимых `drm-kmod` в базовой системе."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1467
+#, no-wrap
+msgid "1300129"
+msgstr "1300129"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1468
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/367627[367627]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/367627[367627]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1469
+#, no-wrap
+msgid "November 12, 2020"
+msgstr "12 ноября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1471
+#, no-wrap
+msgid "13.0-CURRENT after retiring `malloc_last_fail`."
+msgstr "13.0-CURRENT после удаления `malloc_last_fail`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1472
+#, no-wrap
+msgid "1300130"
+msgstr "1300130"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1473
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/367777[367777]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/367777[367777]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1474
+#, no-wrap
+msgid "November 17, 2020"
+msgstr "17 ноября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1476
+#, no-wrap
+msgid "13.0-CURRENT after `p_pd` / `pwddesc` split from `p_fd` / filedesc."
+msgstr "13.0-CURRENT после разделения `p_pd` / `pwddesc` и `p_fd` / filedesc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1477
+#, no-wrap
+msgid "1300131"
+msgstr "1300131"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1478
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/368417[368417]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/368417[368417]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1479
+#, no-wrap
+msgid "December 7, 2020"
+msgstr "7 декабря 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1481
+#, no-wrap
+msgid "13.0-CURRENT after removal of crypto file descriptors."
+msgstr "13.0-CURRENT после удаления криптографических файловых дескрипторов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1482
+#, no-wrap
+msgid "1300132"
+msgstr "1300132"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1483
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/368659[368659]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/368659[368659]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1484
+#, no-wrap
+msgid "December 15, 2020"
+msgstr "15 декабря 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1486
+#, no-wrap
+msgid "13.0-CURRENT after improving handling of alternate settings in the USB stack."
+msgstr "13.0-CURRENT после улучшения обработки альтернативных настроек в стеке USB."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1487
+#, no-wrap
+msgid "1300133"
+msgstr "1300133"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1488
+#, no-wrap
+msgid "gitref:2ed0c8d801f5f72dbde7a7d30135c1cc361a1e90[repository=\"src\",length=12]"
+msgstr "gitref:2ed0c8d801f5f72dbde7a7d30135c1cc361a1e90[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1489
+#, no-wrap
+msgid "December 23, 2020"
+msgstr "23 декабря 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1491
+#, no-wrap
+msgid "13.0-CURRENT after changing the internal API between the NFS and kernel RPC modules."
+msgstr "13.0-CURRENT после изменения внутреннего API между модулями NFS и RPC ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1492
+#, no-wrap
+msgid "1300134"
+msgstr "1300134"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1493
+#, no-wrap
+msgid "gitref:a84b0e94cdbf1a17a798ab7f77375aacb4d400ff[repository=\"src\",length=12]"
+msgstr "gitref:a84b0e94cdbf1a17a798ab7f77375aacb4d400ff[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1494
+#, no-wrap
+msgid "January 7, 2021"
+msgstr "7 января 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1496
+#, no-wrap
+msgid "13.0-CURRENT after factoring out the hardware-independent part of USB HID support to a new module."
+msgstr "13.0-CURRENT после выделения аппаратно-независимой части поддержки USB HID в новый модуль."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1497
+#, no-wrap
+msgid "1300135"
+msgstr "1300135"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1498
+#, no-wrap
+msgid "gitref:35a39dc5b34962081eeda8dbcf0b99a31585499b[repository=\"src\",length=12]"
+msgstr "gitref:35a39dc5b34962081eeda8dbcf0b99a31585499b[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1499
+#, no-wrap
+msgid "January 12, 2021"
+msgstr "12 января 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1501
+#, no-wrap
+msgid "13.0-CURRENT after adding `kernel_fpu_begin`/`kernel_fpu_end` to the LinuxKPI."
+msgstr "13.0-CURRENT после добавления `kernel_fpu_begin`/`kernel_fpu_end` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1502
+#, no-wrap
+msgid "1300136"
+msgstr "1300136"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1503
+#, no-wrap
+msgid "gitref:72c551930be195b5ea982c1b16767f54388424f2[repository=\"src\",length=12]"
+msgstr "gitref:72c551930be195b5ea982c1b16767f54388424f2[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1504
+#, no-wrap
+msgid "January 17, 2021"
+msgstr "17 января 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1506
+#, no-wrap
+msgid "13.0-CURRENT after reimplementing LinuxKPI's `irq_work` queue on top of fast `taskqueue`."
+msgstr "13.0-CURRENT после переработки очереди `irq_work` в LinuxKPI на основе быстрой `taskqueue`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1507
+#, no-wrap
+msgid "1300137"
+msgstr "1300137"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1508
+#, no-wrap
+msgid "gitref:010196adcfaf2bb610725394d40691874b4ff2af[repository=\"src\",length=12]"
+msgstr "gitref:010196adcfaf2bb610725394d40691874b4ff2af[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1509
+#, no-wrap
+msgid "January 30, 2021"
+msgstr "30 января 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1511
+#, no-wrap
+msgid "13.0-CURRENT after fixing a clang assertion when building the package:devel/onetbb[] port."
+msgstr "13.0-CURRENT после исправления утверждения clang при сборке порта package:devel/onetbb[]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1512
+#, no-wrap
+msgid "1300138"
+msgstr "1300138"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1513
+#, no-wrap
+msgid "gitref:dcee9964238b12a8e55917f292139f074b1a80b2[repository=\"src\",length=12]"
+msgstr "gitref:dcee9964238b12a8e55917f292139f074b1a80b2[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1514
+#, no-wrap
+msgid "February 1, 2021"
+msgstr "1 февраля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1516
+#, no-wrap
+msgid "13.0-ALPHA3 after adding lockless symlink lookup to vfs cache."
+msgstr "13.0-ALPHA3 после добавления блокировки при поиске символьных ссылок в кэше VFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1517
+#, no-wrap
+msgid "1300139"
+msgstr "1300139"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1518
+#, no-wrap
+msgid "gitref:91a07ed50ffca4dfada3e7f1f050ea746c1bac66[repository=\"src\",length=12]"
+msgstr "gitref:91a07ed50ffca4dfada3e7f1f050ea746c1bac66[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1519
+#, no-wrap
+msgid "February 2, 2021"
+msgstr "2 февраля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1521
+#, no-wrap
+msgid "13.0-ALPHA3 after adding various LinuxKPI bits conflicting with drm-kmod."
+msgstr "13.0-ALPHA3 после добавления различных компонентов LinuxKPI, конфликтующих с drm-kmod."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1522
+#, no-wrap
+msgid "1300500"
+msgstr "1300500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1523
+#, no-wrap
+msgid "gitref:3c6a89748a01869c18955d5e3bfcdf35f6705d26[repository=\"src\",length=12]"
+msgstr "gitref:3c6a89748a01869c18955d5e3bfcdf35f6705d26[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1524
+#, no-wrap
+msgid "February 5, 2021"
+msgstr "5 февраля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1526
+#, no-wrap
+msgid "13.0-STABLE after releng/13.0 was branched."
+msgstr "13.0-STABLE после ветвления releng/13.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1527
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1532
+#, no-wrap
+msgid "1300501"
+msgstr "1300501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1528
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1533
+#, no-wrap
+msgid "gitref:c3f97dd75a1c294c4f60f42b604ee8bcda17be09[repository=\"src\",length=12]"
+msgstr "gitref:c3f97dd75a1c294c4f60f42b604ee8bcda17be09[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1529
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1534
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1539
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1544
+#, no-wrap
+msgid "April 23, 2021"
+msgstr "23 апреля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1531
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1536
+#, no-wrap
+msgid "13.0-STABLE after fixing rtld's `dl_iterate_phdr()`."
+msgstr "13.0-STABLE после исправления `dl_iterate_phdr()` в rtld."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1537
+#, no-wrap
+msgid "1300502"
+msgstr "1300502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1538
+#, no-wrap
+msgid "gitref:da6a8ccfa293c3c831fdde51169754fcb9587657[repository=\"src\",length=12]"
+msgstr "gitref:da6a8ccfa293c3c831fdde51169754fcb9587657[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1541
+#, no-wrap
+msgid "13.0-STABLE after implementing `atomic_dec_and_lock_irqsave()` in the LinuxKPI."
+msgstr "13.0-STABLE после реализации `atomic_dec_and_lock_irqsave()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1542
+#, no-wrap
+msgid "1300503"
+msgstr "1300503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1543
+#, no-wrap
+msgid "gitref:d60c6dc8f69b1264c7af5e2479ea94f000fd2c6d[repository=\"src\",length=12]"
+msgstr "gitref:d60c6dc8f69b1264c7af5e2479ea94f000fd2c6d[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1546
+#, no-wrap
+msgid "13.0-STABLE after changing the internal KAPI between the krpc and NFS."
+msgstr "13.0-STABLE после изменения внутреннего KAPI между krpc и NFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1547
+#, no-wrap
+msgid "1300504"
+msgstr "1300504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1548
+#, no-wrap
+msgid "gitref:fb34817c686cc130449325499870e36979899801[repository=\"src\",length=12]"
+msgstr "gitref:fb34817c686cc130449325499870e36979899801[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1549
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2542
+#, no-wrap
+msgid "April 30, 2021"
+msgstr "30 апреля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1551
+#, no-wrap
+msgid "13.0-STABLE after updating the LinuxKPI to accommodate the drm-kmod 5.5 update."
+msgstr "13.0-STABLE после обновления LinuxKPI для поддержки обновления drm-kmod 5.5."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1552
+#, no-wrap
+msgid "1300505"
+msgstr "1300505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1553
+#, no-wrap
+msgid "gitref:8f81f190a640e211dd814bdde7811982b9491fb0[repository=\"src\",length=12]"
+msgstr "gitref:8f81f190a640e211dd814bdde7811982b9491fb0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1554
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2547
+#, no-wrap
+msgid "May 10, 2021"
+msgstr "10 мая 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1556
+#, no-wrap
+msgid "13.0-STABLE after changing the internal KAPI between the nscl.ko and nfscommon.ko modules."
+msgstr "13.0-STABLE после изменения внутреннего KAPI между модулями nscl.ko и nfscommon.ko."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1557
+#, no-wrap
+msgid "1300506"
+msgstr "1300506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1558
+#, no-wrap
+msgid "gitref:e31579b8558db508dfc3f8fc276611a7c3c93aa1[repository=\"src\",length=12]"
+msgstr "gitref:e31579b8558db508dfc3f8fc276611a7c3c93aa1[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1559
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1564
+#, no-wrap
+msgid "June 2, 2021"
+msgstr "2 июня 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1561
+#, no-wrap
+msgid "13.0-STABLE after adding TCP LRO support for VLAN and VxLAN."
+msgstr "13.0-STABLE после добавления поддержки TCP LRO для VLAN и VxLAN."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1562
+#, no-wrap
+msgid "1300507"
+msgstr "1300507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1563
+#, no-wrap
+msgid "gitref:c64d1bd7145b5d30c97d1cd99e584da529d95100[repository=\"src\",length=12]"
+msgstr "gitref:c64d1bd7145b5d30c97d1cd99e584da529d95100[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1566
+#, no-wrap
+msgid "13.0-STABLE after adding a new member to the man:EPOCH[9] tracker structure."
+msgstr "13.0-STABLE после добавления нового элемента в структуру отслеживания man:EPOCH[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1567
+#, no-wrap
+msgid "1300508"
+msgstr "1300508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1568
+#, no-wrap
+msgid "gitref:658f5eed38c35f3f7d6695110b7dae8dc94d12c7[repository=\"src\",length=12]"
+msgstr "gitref:658f5eed38c35f3f7d6695110b7dae8dc94d12c7[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1571
+#, no-wrap
+msgid "13.0-STABLE after adding macros for `might_lock_nested()` and `lockdep_(re/un/)pin_lock()` to the LinuxKPI."
+msgstr "13.0-STABLE после добавления макросов для `might_lock_nested()` и `lockdep_(re/un/)pin_lock()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1572
+#, no-wrap
+msgid "1300509"
+msgstr "1300509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1573
+#, no-wrap
+msgid "gitref:210349325af9920d1535ad76fa3b92847684f6e0[repository=\"src\",length=12]"
+msgstr "gitref:210349325af9920d1535ad76fa3b92847684f6e0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1574
+#, no-wrap
+msgid "June 14, 2021"
+msgstr "14 июня 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1576
+#, no-wrap
+msgid "13.0-STABLE after adding a macro for `list_for_each_entry_lockless()` to the LinuxKPI."
+msgstr "13.0-STABLE после добавления макроса `list_for_each_entry_lockless()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1577
+#, no-wrap
+msgid "1300510"
+msgstr "1300510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1578
+#, no-wrap
+msgid "gitref:eb3397588e1b48043e166587ea454f60efea88d0[repository=\"src\",length=12]"
+msgstr "gitref:eb3397588e1b48043e166587ea454f60efea88d0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1579
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2552
+#, no-wrap
+msgid "June 26, 2021"
+msgstr "26 июня 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1581
+#, no-wrap
+msgid "13.0-STABLE after changing the internal KAPI between the krpc and nfsd modules."
+msgstr "13.0-STABLE после изменения внутреннего KAPI между модулями krpc и nfsd."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1582
+#, no-wrap
+msgid "1300511"
+msgstr "1300511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1583
+#, no-wrap
+msgid "gitref:2622570aeb3d162812d72f7ef192c322cd8b73ef[repository=\"src\",length=12]"
+msgstr "gitref:2622570aeb3d162812d72f7ef192c322cd8b73ef[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1584
+#, no-wrap
+msgid "July 7, 2021"
+msgstr "7 июля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1586
+#, no-wrap
+msgid "13.0-STABLE after changing `softdep_prelink()` to only do sync if another thread changed the vnode metadata since previous `prelink`."
+msgstr "13.0-STABLE после изменения `softdep_prelink()` для выполнения синхронизации только в случае, если другой поток изменил метаданные vnode с момента предыдущего `prelink`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1587
+#, no-wrap
+msgid "1300512"
+msgstr "1300512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1588
+#, no-wrap
+msgid "gitref:f72db34d2295080f57a283858125aa906c0d409e[repository=\"src\",length=12]"
+msgstr "gitref:f72db34d2295080f57a283858125aa906c0d409e[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1589
+#, no-wrap
+msgid "July 18, 2021"
+msgstr "18 июля 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1591
+#, no-wrap
+msgid "13.0-STABLE after various merges to LinuxKPI, OFED, net80211, and drivers."
+msgstr "13.0-STABLE после различных слияний LinuxKPI, OFED, net80211 и драйверов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1592
+#, no-wrap
+msgid "1300513"
+msgstr "1300513"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1593
+#, no-wrap
+msgid "gitref:af732203b8f7f006927528db5497f5cbc4c4742a[repository=\"src\",length=12]"
+msgstr "gitref:af732203b8f7f006927528db5497f5cbc4c4742a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1596
+#, no-wrap
+msgid "13.0-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-12.0.1-0-gfed41342a82f, a.k.a. 12.0.1 release."
+msgstr "13.0-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-12.0.1-0-gfed41342a82f, также известной как релиз 12.0.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1597
+#, no-wrap
+msgid "1300514"
+msgstr "1300514"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1598
+#, no-wrap
+msgid "gitref:53d162819c20e5cf267cb91f7a19940e96e8bec4[repository=\"src\",length=12]"
+msgstr "gitref:53d162819c20e5cf267cb91f7a19940e96e8bec4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1599
+#, no-wrap
+msgid "August 3, 2021"
+msgstr "3 августа 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1601
+#, no-wrap
+msgid "Incompatible changes to the KBI of internal interfaces between NFS requires rebuilding modules."
+msgstr "Несовместимые изменения в KBI внутренних интерфейсов между NFS требуют пересборки модулей."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1602
+#, no-wrap
+msgid "1300515"
+msgstr "1300515"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1603
+#, no-wrap
+msgid "gitref:0437d10e359ea1cbefff8d17cd18ca491dbbd5d7[repository=\"src\",length=12]"
+msgstr "gitref:0437d10e359ea1cbefff8d17cd18ca491dbbd5d7[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1604
+#, no-wrap
+msgid "September 22, 2021"
+msgstr "22 сентября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1606
+#, no-wrap
+msgid "13.0-STABLE returning to 13.0 KBI for linuxkpi."
+msgstr "13.0-STABLE возвращается к KBI 13.0 для linuxkpi."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1607
+#, no-wrap
+msgid "1300518"
+msgstr "1300518"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1608
+#, no-wrap
+msgid "gitref:a017868e281874261a560ba1e3069b4e14b7483e[repository=\"src\",length=12]"
+msgstr "gitref:a017868e281874261a560ba1e3069b4e14b7483e[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1609
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1614
+#, no-wrap
+msgid "October 21, 2021"
+msgstr "21 октября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1611
+#, no-wrap
+msgid "13.0-STABLE after adding `crypto_cursor_segment()`."
+msgstr "13.0-STABLE после добавления `crypto_cursor_segment()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1612
+#, no-wrap
+msgid "1300519"
+msgstr "1300519"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1613
+#, no-wrap
+msgid "gitref:fe2827f1678b8ff0baf62a1529b2cc121a25b090[repository=\"src\",length=12]"
+msgstr "gitref:fe2827f1678b8ff0baf62a1529b2cc121a25b090[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1616
+#, no-wrap
+msgid "13.0-STABLE after extending the AES-CCM and Chacha20-Poly1305 ciphers in OCF to support multiple nonce lengths."
+msgstr "13.0-STABLE после расширения шифров AES-CCM и Chacha20-Poly1305 в OCF для поддержки нескольких длин одноразовых номеров."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1617
+#, no-wrap
+msgid "1300521"
+msgstr "1300521"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1618
+#, no-wrap
+msgid "gitref:29745cf91cfc22afa94da0ce43e07a6dc377f631[repository=\"src\",length=12]"
+msgstr "gitref:29745cf91cfc22afa94da0ce43e07a6dc377f631[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1619
+#, no-wrap
+msgid "November 19, 2021"
+msgstr "19 ноября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1621
+#, no-wrap
+msgid "13.0-STABLE after various merges to LinuxKPI and net80211."
+msgstr "13.0-STABLE после различных слияний с LinuxKPI и net80211."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1622
+#, no-wrap
+msgid "1300522"
+msgstr "1300522"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1623
+#, no-wrap
+msgid "gitref:0c8684ae20019b63c6672cc9fa40e1426708b007[repository=\"src\",length=12]"
+msgstr "gitref:0c8684ae20019b63c6672cc9fa40e1426708b007[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1624
+#, no-wrap
+msgid "November 24, 2021"
+msgstr "24 ноября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1626
+#, no-wrap
+msgid "13.0-STABLE after changing the internal KAPI between the NFS modules."
+msgstr "13.0-STABLE после изменения внутреннего KAPI между модулями NFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1628
+#, no-wrap
+msgid "gitref:7224d4125ab57bc1c4c799a6c286be42f8d37a83[repository=\"src\",length=12]"
+msgstr "gitref:7224d4125ab57bc1c4c799a6c286be42f8d37a83[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1629
+#, no-wrap
+msgid "December 6, 2021"
+msgstr "6 декабря 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1631
+#, no-wrap
+msgid "13.0-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-13.0.0-0-gd7b669b3a303, a.k.a. 13.0.0 release."
+msgstr "13.0-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-13.0.0-0-gd7b669b3a303, также известной как релиз 13.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1632
+#, no-wrap
+msgid "1300523"
+msgstr "1300523"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1633
+#, no-wrap
+msgid "gitref:690bcf605d84283c1f9d254885a3cac69c5e80a6[repository=\"src\",length=12]"
+msgstr "gitref:690bcf605d84283c1f9d254885a3cac69c5e80a6[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1634
+#, no-wrap
+msgid "December 18, 2021"
+msgstr "18 декабря 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1636
+#, no-wrap
+msgid "13.0-STABLE after adding two arguments to man:VOP_ALLOCATE[9]."
+msgstr "13.0-STABLE после добавления двух аргументов в man:VOP_ALLOCATE[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1637
+#, no-wrap
+msgid "1300524"
+msgstr "1300524"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1638
+#, no-wrap
+msgid "gitref:dc4114875ef10618002d3eeb46f09dc42da56b30[repository=\"src\",length=12]"
+msgstr "gitref:dc4114875ef10618002d3eeb46f09dc42da56b30[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1639
+#, no-wrap
+msgid "January 14, 2022"
+msgstr "14 января 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1641
+#, no-wrap
+msgid "13.0-STABLE after making the CPU_SET macros compatible with glibc."
+msgstr "13.0-STABLE после обеспечения совместимости макросов CPU_SET с glibc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1642
+#, no-wrap
+msgid "1300525"
+msgstr "1300525"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1643
+#, no-wrap
+msgid "gitref:dee0854a009cde7dcdb16ba39754237737022c8a[repository=\"src\",length=12]"
+msgstr "gitref:dee0854a009cde7dcdb16ba39754237737022c8a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1644
+#, no-wrap
+msgid "January 22, 2022"
+msgstr "22 января 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1646
+#, no-wrap
+msgid "13.0-STABLE after multiple LinuxKPI changes required by drm-kmod."
+msgstr "13.0-STABLE после множества изменений LinuxKPI, необходимых для drm-kmod."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1647
+#, no-wrap
+msgid "1300526"
+msgstr "1300526"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1648
+#, no-wrap
+msgid "gitref:c39ff2415cb965b729fd16f9eae91e712313877b[repository=\"src\",length=12]"
+msgstr "gitref:c39ff2415cb965b729fd16f9eae91e712313877b[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1649
+#, no-wrap
+msgid "February 20, 2022"
+msgstr "20 февраля 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1651
+#, no-wrap
+msgid "13.0-STABLE after multiple LinuxKPI changes overlapping but not conflicting with drm-kmod."
+msgstr "13.0-STABLE после нескольких изменений LinuxKPI, пересекающихся, но не конфликтующих с drm-kmod."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1652
+#, no-wrap
+msgid "1301000"
+msgstr "1301000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1653
+#, no-wrap
+msgid "gitref:ad329796bdb29c69bce610ad332d08257d7157ac[repository=\"src\",length=12]"
+msgstr "gitref:ad329796bdb29c69bce610ad332d08257d7157ac[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1654
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1659
+#, no-wrap
+msgid "March 10, 2022"
+msgstr "10 марта 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1656
+#, no-wrap
+msgid "releng/13.1 branched."
+msgstr "Ветка releng/13.1 создана."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1657
+#, no-wrap
+msgid "1301500"
+msgstr "1301500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1658
+#, no-wrap
+msgid "gitref:08523c8c63bbcdcd3f0d36787a544817cb5b8282[repository=\"src\",length=12]"
+msgstr "gitref:08523c8c63bbcdcd3f0d36787a544817cb5b8282[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1661
+#, no-wrap
+msgid "13.1-STABLE after releng/13.1 branched."
+msgstr "13.1-STABLE после ветвления releng/13.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1662
+#, no-wrap
+msgid "1301501"
+msgstr "1301501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1663
+#, no-wrap
+msgid "gitref:6663718bb49635deac3f5dc55fa6f0f7cba593ba[repository=\"src\",length=12]"
+msgstr "gitref:6663718bb49635deac3f5dc55fa6f0f7cba593ba[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1664
+#, no-wrap
+msgid "March 27, 2022"
+msgstr "27 марта 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1666
+#, no-wrap
+msgid "13.1-STABLE after various merges to LinuxKPI and net80211."
+msgstr "13.1-STABLE после различных слияний с LinuxKPI и net80211."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1667
+#, no-wrap
+msgid "1301502"
+msgstr "1301502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1668
+#, no-wrap
+msgid "gitref:2278cf4e48e7679b0a60008a83c764fe852174b2[repository=\"src\",length=12]"
+msgstr "gitref:2278cf4e48e7679b0a60008a83c764fe852174b2[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1669
+#, no-wrap
+msgid "April 27, 2022"
+msgstr "27 апреля 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1671
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1686
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1696
+#, no-wrap
+msgid "13.1-STABLE after various merges to LinuxKPI."
+msgstr "13.1-STABLE после различных слияний с LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1672
+#, no-wrap
+msgid "1301503"
+msgstr "1301503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1673
+#, no-wrap
+msgid "gitref:b2aa64d05bd8b04a1bdb63f2a5f9de39c600b463[repository=\"src\",length=12]"
+msgstr "gitref:b2aa64d05bd8b04a1bdb63f2a5f9de39c600b463[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1674
+#, no-wrap
+msgid "May 19, 2022"
+msgstr "19 мая 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1676
+#, no-wrap
+msgid "13.1-STABLE after adding alternate DRIVER_MODULE macros without a devclass argument."
+msgstr "13.1-STABLE после добавления альтернативных макросов DRIVER_MODULE без аргумента devclass."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1677
+#, no-wrap
+msgid "1301504"
+msgstr "1301504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1678
+#, no-wrap
+msgid "gitref:a13b6fc61908fd6afa460b88f94e4a67be74bb9a[repository=\"src\",length=12]"
+msgstr "gitref:a13b6fc61908fd6afa460b88f94e4a67be74bb9a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1679
+#, no-wrap
+msgid "June 4, 2022"
+msgstr "4 июня 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1681
+#, no-wrap
+msgid "13.1-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-14.0.3-0-g1f9140064dfb, a.k.a. 14.0.3 release."
+msgstr "13.1-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии llvmorg-14.0.3-0-g1f9140064dfb, также известной как релиз 14.0.3."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1682
+#, no-wrap
+msgid "1301505"
+msgstr "1301505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1683
+#, no-wrap
+msgid "gitref:6f93a76ffeabf7d4488edc73a0cca01436c2903b[repository=\"src\",length=12]"
+msgstr "gitref:6f93a76ffeabf7d4488edc73a0cca01436c2903b[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1684
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1694
+#, no-wrap
+msgid "June 21, 2022"
+msgstr "21 июня 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1687
+#, no-wrap
+msgid "1301506"
+msgstr "1301506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1688
+#, no-wrap
+msgid "gitref:8e6cfc632cf6f9fc906df9d825649443939b55c6[repository=\"src\",length=12]"
+msgstr "gitref:8e6cfc632cf6f9fc906df9d825649443939b55c6[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1689
+#, no-wrap
+msgid "July 13, 2022"
+msgstr "13 июля 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1691
+#, no-wrap
+msgid "13.1-STABLE after adding <crypto/chacha20_poly1305.h> and <crypto/curve25519.h>."
+msgstr "13.1-STABLE после добавления <crypto/chacha20_poly1305.h> и <crypto/curve25519.h>."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1692
+#, no-wrap
+msgid "1301507"
+msgstr "1301507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1693
+#, no-wrap
+msgid "gitref:9cbba5950123f3afedcc5f24c43956e7a26f22f4[repository=\"src\",length=12]"
+msgstr "gitref:9cbba5950123f3afedcc5f24c43956e7a26f22f4[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1697
+#, no-wrap
+msgid "1301508"
+msgstr "1301508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1698
+#, no-wrap
+msgid "gitref:83ac15a799e348c391951f5877feecd4089bab80[repository=\"src\",length=12]"
+msgstr "gitref:83ac15a799e348c391951f5877feecd4089bab80[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1701
+#, no-wrap
+msgid "13.1-STABLE after various merges to LinuxKPI, and for de-macrofying pause()."
+msgstr "13.1-STABLE после различных слияний в LinuxKPI и для удаления макросов из pause()."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1702
+#, no-wrap
+msgid "1301509"
+msgstr "1301509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1703
+#, no-wrap
+msgid "gitref:baa97013121a915057ee54dfcb2cb87e541f7d7f[repository=\"src\",length=12]"
+msgstr "gitref:baa97013121a915057ee54dfcb2cb87e541f7d7f[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1704
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2597
+#, no-wrap
+msgid "October 19, 2022"
+msgstr "19 октября 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1706
+#, no-wrap
+msgid "13.1-STABLE after introduction of v2 of TX Queue Select Functionality."
+msgstr "13.1-STABLE после введения версии 2 функциональности выбора очереди TX."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1707
+#, no-wrap
+msgid "1301510"
+msgstr "1301510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1708
+#, no-wrap
+msgid "gitref:6820a0512fa6616ee1da46cb0075da80478776f0[repository=\"src\",length=12]"
+msgstr "gitref:6820a0512fa6616ee1da46cb0075da80478776f0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1709
+#, no-wrap
+msgid "December 8, 2022"
+msgstr "8 декабря 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1711
+#, no-wrap
+msgid "13.1-STABLE after LinuxKPI dmi_matches() fixes."
+msgstr "13.1-STABLE после исправлений LinuxKPI dmi_matches()."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1712
+#, no-wrap
+msgid "1301511"
+msgstr "1301511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1713
+#, no-wrap
+msgid "gitref:17333d92643d998d1c6a2dc5f6b1508b6507ad31[repository=\"src\",length=12]"
+msgstr "gitref:17333d92643d998d1c6a2dc5f6b1508b6507ad31[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1714
+#, no-wrap
+msgid "December 17, 2022"
+msgstr "17 декабря 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1716
+#, no-wrap
+msgid "13.1-STABLE after adding a new rc: `machine_id` to generate `/etc/machine-id`."
+msgstr "13.1-STABLE после добавления нового rc: `machine_id` для генерации `/etc/machine-id`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1717
+#, no-wrap
+msgid "1302500"
+msgstr "1302500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1718
+#, no-wrap
+msgid "gitref:c243de11cf7c4bb3d67bbc1655b149037e5b04f1[repository=\"src\",length=12]"
+msgstr "gitref:c243de11cf7c4bb3d67bbc1655b149037e5b04f1[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1719
+#, no-wrap
+msgid "February 9, 2023"
+msgstr "9 февраля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1721
+#, no-wrap
+msgid "13.2-STABLE after releng/13.2 was branched."
+msgstr "13.2-STABLE после ветвления releng/13.2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1722
+#, no-wrap
+msgid "1302501"
+msgstr "1302501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1723
+#, no-wrap
+msgid "gitref:e3068d2655e2aea3e0b462a7298a68d344769ec6[repository=\"src\",length=12]"
+msgstr "gitref:e3068d2655e2aea3e0b462a7298a68d344769ec6[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1724
+#, no-wrap
+msgid "February 16, 2023"
+msgstr "16 февраля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1726
+#, no-wrap
+msgid "13.2-STABLE after adding `totalram_pages()` to the LinuxKPI."
+msgstr "13.2-STABLE после добавления `totalram_pages()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1727
+#, no-wrap
+msgid "1302502"
+msgstr "1302502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1728
+#, no-wrap
+msgid "gitref:5ca371f4f536f9ee9d6c9fb178bf1f7f6de33216[repository=\"src\",length=12]"
+msgstr "gitref:5ca371f4f536f9ee9d6c9fb178bf1f7f6de33216[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1729
+#, no-wrap
+msgid "February 17, 2023"
+msgstr "17 февраля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1731
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1736
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1751
+#, no-wrap
+msgid "13.2-STABLE after various merges to LinuxKPI."
+msgstr "13.2-STABLE после различных слияний с LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1732
+#, no-wrap
+msgid "1302503"
+msgstr "1302503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1733
+#, no-wrap
+msgid "gitref:aaca677fee21f202db4bb974fc5056f4dcbbb598[repository=\"src\",length=12]"
+msgstr "gitref:aaca677fee21f202db4bb974fc5056f4dcbbb598[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1734
+#, no-wrap
+msgid "February 21, 2023"
+msgstr "21 февраля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1737
+#, no-wrap
+msgid "1302504"
+msgstr "1302504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1738
+#, no-wrap
+msgid "gitref:d6852eed98ed32ad51120a22aa1ebdf0601917b3[repository=\"src\",length=12]"
+msgstr "gitref:d6852eed98ed32ad51120a22aa1ebdf0601917b3[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1739
+#, no-wrap
+msgid "March 12, 2023"
+msgstr "12 марта 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1741
+#, no-wrap
+msgid "13.2-STABLE after merging machine-id into `hostid_save`."
+msgstr "13.2-STABLE после объединения machine-id в `hostid_save`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1742
+#, no-wrap
+msgid "1302505"
+msgstr "1302505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1743
+#, no-wrap
+msgid "gitref:85e32e957fcca01d50e29e543584909795c1acef[repository=\"src\",length=12]"
+msgstr "gitref:85e32e957fcca01d50e29e543584909795c1acef[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1744
+#, no-wrap
+msgid "April 9, 2023"
+msgstr "9 апреля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1746
+#, no-wrap
+msgid "13.2-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-15.0.7-0-g8dfdcc7b7bf6, a.k.a. 15.0.7 release."
+msgstr "13.2-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-15.0.7-0-g8dfdcc7b7bf6, также известного как релиз 15.0.7."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1747
+#, no-wrap
+msgid "1302506"
+msgstr "1302506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1748
+#, no-wrap
+msgid "gitref:e982b1cf1fe1dc0b84dc24f03d1c21e3fe6bdef3[repository=\"src\",length=12]"
+msgstr "gitref:e982b1cf1fe1dc0b84dc24f03d1c21e3fe6bdef3[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1749
+#, no-wrap
+msgid "June 26, 2023"
+msgstr "26 июня 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1752
+#, no-wrap
+msgid "1302507"
+msgstr "1302507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1753
+#, no-wrap
+msgid "gitref:b2acc21dfbd6fab28b1715c775b43d4914b75e0c[repository=\"src\",length=12]"
+msgstr "gitref:b2acc21dfbd6fab28b1715c775b43d4914b75e0c[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1754
+#, no-wrap
+msgid "July 23, 2023"
+msgstr "23 июля 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1756
+#, no-wrap
+msgid "13.2-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-16.0.6-0-g7cbf1a259152, a.k.a. 16.0.6 release."
+msgstr "13.2-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-16.0.6-0-g7cbf1a259152, также известного как релиз 16.0.6."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1757
+#, no-wrap
+msgid "1302508"
+msgstr "1302508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1758
+#, no-wrap
+msgid "gitref:21ccba43f511cc4089899619b5a85e6d83a200dc[repository=\"src\",length=12]"
+msgstr "gitref:21ccba43f511cc4089899619b5a85e6d83a200dc[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1759
+#, no-wrap
+msgid "September 6, 2023"
+msgstr "6 сентября 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1761
+#, no-wrap
+msgid "13.2-STABLE after ptrace started clearing TDB_BORN during PT_DETACH."
+msgstr "13.2-STABLE после того, как ptrace начал очищать TDB_BORN во время PT_DETACH."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1762
+#, no-wrap
+msgid "1302509"
+msgstr "1302509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1763
+#, no-wrap
+msgid "gitref:faedeaf7377ba7253c281cf3315b17e0cb979075[repository=\"src\",length=12]"
+msgstr "gitref:faedeaf7377ba7253c281cf3315b17e0cb979075[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1764
+#, no-wrap
+msgid "December 2, 2023"
+msgstr "2 декабря 2023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1766
+#, no-wrap
+msgid "13.2-STABLE after adding a new VFS function called `vfs_exjail_clone()`, which will be used by the ZFS module."
+msgstr "13.2-STABLE после добавления новой функции VFS под названием `vfs_exjail_clone()`, которая будет использоваться модулем ZFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1767
+#, no-wrap
+msgid "1302510"
+msgstr "1302510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1768
+#, no-wrap
+msgid "gitref:45758665781dd63dfa38bcb646d4f36b0a6a104f[repository=\"src\",length=12]"
+msgstr "gitref:45758665781dd63dfa38bcb646d4f36b0a6a104f[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1771
+#, no-wrap
+msgid "13.2-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-17.0.6-0-g6009708b4367, a.k.a. 17.0.6 release."
+msgstr "13.2-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-17.0.6-0-g6009708b4367, также известного как релиз 17.0.6."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1772
+#, no-wrap
+msgid "1303001"
+msgstr "1303001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1773
+#, no-wrap
+msgid "gitref:a75a3d7afcc88dc0bc9b2797cce983056acadf10[repository=\"src\",length=12]"
+msgstr "gitref:a75a3d7afcc88dc0bc9b2797cce983056acadf10[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1774
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1779
+#, no-wrap
+msgid "February 19, 2024"
+msgstr "19 февраля 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1776
+#, no-wrap
+msgid "13.3-BETA3 after changing net80211 `struct ieee80211vap` internals."
+msgstr "13.3-BETA3 после изменения внутренней структуры `struct ieee80211vap` в net80211."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1777
+#, no-wrap
+msgid "1303501"
+msgstr "1303501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1778
+#, no-wrap
+msgid "gitref:a7e1fc7f620d3341549c1380f550aaafbdb45622[repository=\"src\",length=12]"
+msgstr "gitref:a7e1fc7f620d3341549c1380f550aaafbdb45622[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1781
+#, no-wrap
+msgid "13.3-STABLE after changing net80211 `struct ieee80211vap` internals."
+msgstr "13.3-STABLE после изменения внутренней структуры `struct ieee80211vap` в net80211."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1782
+#, no-wrap
+msgid "1303502"
+msgstr "1303502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1783
+#, no-wrap
+msgid "gitref:07839ae99c06fcbebd5da6ead49c160c32046542[repository=\"src\",length=12]"
+msgstr "gitref:07839ae99c06fcbebd5da6ead49c160c32046542[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1786
+#, no-wrap
+msgid "13.3-STABLE after fixing a clang assertion or crash when building recent boost libraries."
+msgstr "13.3-STABLE после исправления утверждения или падения clang при сборке последних библиотек boost."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1787
+#, no-wrap
+msgid "1303503"
+msgstr "1303503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1788
+#, no-wrap
+msgid "gitref:055e875e6077ed1eb2256c3ab5de59a3f6fbce18[repository=\"src\",length=12]"
+msgstr "gitref:055e875e6077ed1eb2256c3ab5de59a3f6fbce18[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1791
+#, no-wrap
+msgid "13.3-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-18.1.3-0-gc13b7485b879, a.k.a. 18.1.3 release."
+msgstr "13.3-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-18.1.3-0-gc13b7485b879, также известного как релиз 18.1.3."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1792
+#, no-wrap
+msgid "1304500"
+msgstr "1304500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1793
+#, no-wrap
+msgid "gitref:77064cddb94875dc8d9693a93ac25019b7f62c59[repository=\"src\",length=12]"
+msgstr "gitref:77064cddb94875dc8d9693a93ac25019b7f62c59[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1794
+#, no-wrap
+msgid "August 1, 2024"
+msgstr "1 августа 2024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1796
+#, no-wrap
+msgid "13.4-STABLE after it was renamed from 13.4-PRERELEASE."
+msgstr "13.4-STABLE после переименования из 13.4-PRERELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1797
+#, no-wrap
+msgid "1304501"
+msgstr "1304501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1798
+#, no-wrap
+msgid "gitref:b802ab153dd24f468b9bfe33a96c61408e0d0565[repository=\"src\",length=12]"
+msgstr "gitref:b802ab153dd24f468b9bfe33a96c61408e0d0565[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1801
+#, no-wrap
+msgid "13.4-STABLE after upgrading llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-19.1.4-0-gaadaa00de76e, a.k.a. 19.1.4 release."
+msgstr "13.4-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до llvmorg-19.1.4-0-gaadaa00de76e, также известного как релиз 19.1.4."
+
+#. Template:
+#. |13XXXXX
+#. |gitref:XXXXXXXX[repository="src",length=12]
+#. |October 30, 2021
+#. |13.0-STABLE after XXXXXX.
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1813
+#, no-wrap
+msgid "FreeBSD 12 Versions"
+msgstr "Версии FreeBSD 12"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1816
+#, no-wrap
+msgid "FreeBSD 12 `__FreeBSD_version` Values"
+msgstr "FreeBSD 12 Значения `__FreeBSD_version`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1825
+#, no-wrap
+msgid "1200000"
+msgstr "1200000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1826
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/302409[302409]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/302409[302409]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1827
+#, no-wrap
+msgid "July 7, 2016"
+msgstr "7 июля 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1829
+#, no-wrap
+msgid "12.0-CURRENT."
+msgstr "12.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1830
+#, no-wrap
+msgid "1200001"
+msgstr "1200001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1831
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/302628[302628]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/302628[302628]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1832
+#, no-wrap
+msgid "July 12, 2016"
+msgstr "12 июля 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1834
+#, no-wrap
+msgid "12.0-CURRENT after removing collation from `[a-z]`-type ranges."
+msgstr "12.0-CURRENT после удаления правил сортировки из диапазонов типа `[a-z]`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1835
+#, no-wrap
+msgid "1200002"
+msgstr "1200002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1836
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/304395[304395]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/304395[304395]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1837
+#, no-wrap
+msgid "August 18, 2016"
+msgstr "18 августа 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1839
+#, no-wrap
+msgid "12.0-CURRENT after removing unused and obsolete `openbsd_poll` system call."
+msgstr "12.0-CURRENT после удаления неиспользуемого и устаревшего системного вызова `openbsd_poll`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1840
+#, no-wrap
+msgid "1200003"
+msgstr "1200003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1841
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/304608[304608]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/304608[304608]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1842
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3250
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4213
+#, no-wrap
+msgid "August 22, 2016"
+msgstr "22 августа 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1844
+#, no-wrap
+msgid "12.0-CURRENT after adding C++11 `thread_local` support in rev link:https://svnweb.freebsd.org/changeset/base/303795[303795]."
+msgstr "12.0-CURRENT после добавления поддержки `thread_local` из C++11 в ревизии link:https://svnweb.freebsd.org/changeset/base/303795[303795]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1845
+#, no-wrap
+msgid "1200004"
+msgstr "1200004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1846
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/304752[304752]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/304752[304752]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1847
+#, no-wrap
+msgid "August 24, 2016"
+msgstr "24 августа 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1849
+#, no-wrap
+msgid "12.0-CURRENT after fixing LC*MASK for man:newlocale[3] and man:querylocale[3] (rev link:https://svnweb.freebsd.org/changeset/base/304703[304703])."
+msgstr "12.0-CURRENT после исправления LC*MASK для man:newlocale[3] и man:querylocale[3] (rev link:https://svnweb.freebsd.org/changeset/base/304703[304703])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1850
+#, no-wrap
+msgid "1200005"
+msgstr "1200005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1851
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/304789[304789]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/304789[304789]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1852
+#, no-wrap
+msgid "August 25, 2016"
+msgstr "25 августа 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1854
+#, no-wrap
+msgid "12.0-CURRENT after changing some ioctl interfaces in rev link:https://svnweb.freebsd.org/changeset/base/304787[304787] between the iSCSI userspace programs and the kernel."
+msgstr "12.0-CURRENT после изменения некоторых интерфейсов ioctl в ревизии link:https://svnweb.freebsd.org/changeset/base/304787[304787] между пользовательскими программами iSCSI и ядром."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1855
+#, no-wrap
+msgid "1200006"
+msgstr "1200006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1856
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/305256[305256]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/305256[305256]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1857
+#, no-wrap
+msgid "September 1, 2016"
+msgstr "1 сентября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1859
+#, no-wrap
+msgid "12.0-CURRENT after man:crunchgen[1] META_MODE fix in link:https://svnweb.freebsd.org/changeset/base/305254[305254]."
+msgstr "12.0-CURRENT после исправления META_MODE в man:crunchgen[1] в link:https://svnweb.freebsd.org/changeset/base/305254[305254]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1860
+#, no-wrap
+msgid "1200007"
+msgstr "1200007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1861
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/305421[305421]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/305421[305421]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1862
+#, no-wrap
+msgid "September 5, 2016"
+msgstr "5 сентября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1864
+#, no-wrap
+msgid "12.0-CURRENT after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9]."
+msgstr "12.0-CURRENT после разрешения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1865
+#, no-wrap
+msgid "1200008"
+msgstr "1200008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1866
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/305833[305833]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/305833[305833]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1867
+#, no-wrap
+msgid "September 15, 2016"
+msgstr "15 сентября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1869
+#, no-wrap
+msgid "12.0-CURRENT after removing the 4.3BSD compatible macro `m_copy()` in link:https://svnweb.freebsd.org/changeset/base/305824[305824]."
+msgstr "12.0-CURRENT после удаления совместимого с 4.3BSD макроса `m_copy()` в link:https://svnweb.freebsd.org/changeset/base/305824[305824]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1870
+#, no-wrap
+msgid "1200009"
+msgstr "1200009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1871
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/306077[306077]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/306077[306077]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1872
+#, no-wrap
+msgid "September 21, 2016"
+msgstr "21 сентября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1874
+#, no-wrap
+msgid "12.0-CURRENT after removing `bio_taskqueue()` in link:https://svnweb.freebsd.org/changeset/base/305988[305988]."
+msgstr "12.0-CURRENT после удаления `bio_taskqueue()` в link:https://svnweb.freebsd.org/changeset/base/305988[305988]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1875
+#, no-wrap
+msgid "1200010"
+msgstr "1200010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1876
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/306276[306276]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/306276[306276]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1877
+#, no-wrap
+msgid "September 23, 2016"
+msgstr "23 сентября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1879
+#, no-wrap
+msgid "12.0-CURRENT after mounting man:msdosfs[5] with `longnames` support by default."
+msgstr "12.0-CURRENT после монтирования man:msdosfs[5] с поддержкой `longnames` по умолчанию."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1880
+#, no-wrap
+msgid "1200011"
+msgstr "1200011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1881
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/306556[306556]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/306556[306556]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1882
+#, no-wrap
+msgid "October 1, 2016"
+msgstr "1 октября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1884
+#, no-wrap
+msgid "12.0-CURRENT after adding `fb_memattr` field to `fb_info` in link:https://svnweb.freebsd.org/changeset/base/306555[306555]."
+msgstr "12.0-CURRENT после добавления поля `fb_memattr` в `fb_info` в link:https://svnweb.freebsd.org/changeset/base/306555[306555]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1885
+#, no-wrap
+msgid "1200012"
+msgstr "1200012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1886
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/306592[306592]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/306592[306592]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1887
+#, no-wrap
+msgid "October 2, 2016"
+msgstr "2 октября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1889
+#, no-wrap
+msgid "12.0-CURRENT after man:net80211[4] changes (rev link:https://svnweb.freebsd.org/changeset/base/306590[306590], link:https://svnweb.freebsd.org/changeset/base/306591[306591])."
+msgstr "12.0-CURRENT после изменений в man:net80211[4] (rev link:https://svnweb.freebsd.org/changeset/base/306590[306590], link:https://svnweb.freebsd.org/changeset/base/306591[306591])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1890
+#, no-wrap
+msgid "1200013"
+msgstr "1200013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1891
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/307140[307140]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/307140[307140]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1892
+#, no-wrap
+msgid "October 12, 2016"
+msgstr "12 октября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1894
+#, no-wrap
+msgid "12.0-CURRENT after installing header files required development with `libzfs_core`."
+msgstr "12.0-CURRENT после установки заголовочных файлов, необходимых для разработки с `libzfs_core`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1895
+#, no-wrap
+msgid "1200014"
+msgstr "1200014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1896
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/307529[307529]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/307529[307529]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1897
+#, no-wrap
+msgid "October 17, 2016"
+msgstr "17 октября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1899
+#, no-wrap
+msgid "12.0-CURRENT after merging common code in man:rtwn[4] and man:urtwn[4], and adding support for 802.11ac devices."
+msgstr "12.0-CURRENT после объединения общего кода в man:rtwn[4] и man:urtwn[4], а также добавления поддержки устройств 802.11ac."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1900
+#, no-wrap
+msgid "1200015"
+msgstr "1200015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1901
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/308874[308874]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/308874[308874]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1902
+#, no-wrap
+msgid "November 20, 2016"
+msgstr "20 ноября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1904
+#, no-wrap
+msgid "12.0-CURRENT after some ABI change for unbreaking powerpc."
+msgstr "12.0-CURRENT после некоторого изменения ABI для исправления powerpc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1905
+#, no-wrap
+msgid "1200016"
+msgstr "1200016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1906
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/309017[309017]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/309017[309017]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1907
+#, no-wrap
+msgid "November 22, 2016"
+msgstr "22 ноября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1909
+#, no-wrap
+msgid "12.0-CURRENT after removing `PG_CACHED`-related fields from `vmmeter`."
+msgstr "12.0-CURRENT после удаления полей, связанных с `PG_CACHED`, из `vmmeter`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1910
+#, no-wrap
+msgid "1200017"
+msgstr "1200017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1911
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/309124[309124]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/309124[309124]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1912
+#, no-wrap
+msgid "November 25, 2016"
+msgstr "25 ноября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1914
+#, no-wrap
+msgid "12.0-CURRENT after upgrading copies of clang, llvm, lldb, compiler-rt and libc++ to 3.9.0 release, and adding lld 3.9.0."
+msgstr "12.0-CURRENT после обновления копий clang, llvm, lldb, compiler-rt и libc++ до версии 3.9.0 и добавления lld 3.9.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1915
+#, no-wrap
+msgid "1200018"
+msgstr "1200018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1916
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/309676[309676]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/309676[309676]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1917
+#, no-wrap
+msgid "December 7, 2016"
+msgstr "7 декабря 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1919
+#, no-wrap
+msgid "12.0-CURRENT after adding the `ki_moretdname` member to `struct kinfo_proc` and `struct kinfo_proc32` to export the whole thread name to user-space utilities."
+msgstr "12.0-CURRENT после добавления члена `ki_moretdname` в структуры `struct kinfo_proc` и `struct kinfo_proc32` для экспорта полного имени потока в пользовательские утилиты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1920
+#, no-wrap
+msgid "1200019"
+msgstr "1200019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1921
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/310149[310149]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/310149[310149]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1922
+#, no-wrap
+msgid "December 16, 2016"
+msgstr "16 декабря 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1924
+#, no-wrap
+msgid "12.0-CURRENT after starting to lay down the foundation for 11ac support."
+msgstr "12.0-CURRENT после начала закладки основы для поддержки 11ac."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1925
+#, no-wrap
+msgid "1200020"
+msgstr "1200020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1926
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/312087[312087]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/312087[312087]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1927
+#, no-wrap
+msgid "January 13, 2017"
+msgstr "13 января 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1929
+#, no-wrap
+msgid "12.0-CURRENT after removing `fgetsock` and `fputsock`."
+msgstr "12.0-CURRENT после удаления `fgetsock` и `fputsock`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1930
+#, no-wrap
+msgid "1200021"
+msgstr "1200021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1931
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/313858[313858]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/313858[313858]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1932
+#, no-wrap
+msgid "February 16, 2017"
+msgstr "16 февраля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1934
+#, no-wrap
+msgid "12.0-CURRENT after removing MCA and EISA support."
+msgstr "12.0-CURRENT после удаления поддержки MCA и EISA."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1935
+#, no-wrap
+msgid "1200022"
+msgstr "1200022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1936
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/314040[314040]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/314040[314040]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1937
+#, no-wrap
+msgid "February 21, 2017"
+msgstr "21 февраля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1939
+#, no-wrap
+msgid "12.0-CURRENT after making the LinuxKPI task struct persistent across system calls."
+msgstr "12.0-CURRENT после обеспечения сохранности структуры задач LinuxKPI между системными вызовами."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1941
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/314373[314373]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/314373[314373]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1942
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1947
+#, no-wrap
+msgid "March 2, 2017"
+msgstr "2 марта 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1944
+#, no-wrap
+msgid "12.0-CURRENT after removing System V Release 4 binary compatibility support."
+msgstr "12.0-CURRENT после удаления поддержки бинарной совместимости с System V Release 4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1945
+#, no-wrap
+msgid "1200023"
+msgstr "1200023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1946
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/314564[314564]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/314564[314564]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1949
+#, no-wrap
+msgid "12.0-CURRENT after upgrading copies of clang, llvm, lld, lldb, compiler-rt and libc++ to 4.0.0."
+msgstr "12.0-CURRENT после обновления копий clang, llvm, lld, lldb, compiler-rt и libc++ до версии 4.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1950
+#, no-wrap
+msgid "1200024"
+msgstr "1200024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1951
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/314865[314865]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/314865[314865]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1952
+#, no-wrap
+msgid "March 7, 2017"
+msgstr "7 марта 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1954
+#, no-wrap
+msgid "12.0-CURRENT after removal of [.filename]#pcap-int.h#"
+msgstr "12.0-CURRENT после удаления [.filename]#pcap-int.h#"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1955
+#, no-wrap
+msgid "1200025"
+msgstr "1200025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1956
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/315430[315430]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/315430[315430]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1957
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1962
+#, no-wrap
+msgid "March 16, 2017"
+msgstr "16 марта 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1959
+#, no-wrap
+msgid "12.0-CURRENT after addition of the [.filename]#<dev/mmc/mmc_ioctl.h># header."
+msgstr "12.0-CURRENT после добавления заголовочного файла [.filename]#<dev/mmc/mmc_ioctl.h>#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1960
+#, no-wrap
+msgid "1200026"
+msgstr "1200026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1961
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/315662[315662]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/315662[315662]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1964
+#, no-wrap
+msgid "12.0-CURRENT after hiding `struct inpcb` and `struct tcpcb` from userland."
+msgstr "12.0-CURRENT после скрытия `struct inpcb` и `struct tcpcb` от пользовательского пространства."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1965
+#, no-wrap
+msgid "1200027"
+msgstr "1200027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1966
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/315673[315673]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/315673[315673]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1967
+#, no-wrap
+msgid "March 21, 2017"
+msgstr "21 марта 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1969
+#, no-wrap
+msgid "12.0-CURRENT after making CAM SIM lock optional."
+msgstr "12.0-CURRENT после того, как блокировка CAM SIM стала опциональной."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1970
+#, no-wrap
+msgid "1200028"
+msgstr "1200028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1971
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/316683[316683]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/316683[316683]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1972
+#, no-wrap
+msgid "April 10, 2017"
+msgstr "10 апреля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1974
+#, no-wrap
+msgid "12.0-CURRENT after renaming `smp_no_rendevous_barrier()` to `smp_no_rendezvous_barrier()` in link:https://svnweb.freebsd.org/changeset/base/316648[316648]."
+msgstr "12.0-CURRENT после переименования `smp_no_rendevous_barrier()` в `smp_no_rendezvous_barrier()` в link:https://svnweb.freebsd.org/changeset/base/316648[316648]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1975
+#, no-wrap
+msgid "1200029"
+msgstr "1200029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1976
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/317176[317176]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/317176[317176]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1977
+#, no-wrap
+msgid "April 19, 2017"
+msgstr "April 19, 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1979
+#, no-wrap
+msgid "12.0-CURRENT after the removal of `struct vmmeter` from `struct pcpu` from link:https://svnweb.freebsd.org/changeset/base/317061[317061]."
+msgstr "12.0-CURRENT после удаления `struct vmmeter` из `struct pcpu` в link:https://svnweb.freebsd.org/changeset/base/317061[317061]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1980
+#, no-wrap
+msgid "1200030"
+msgstr "1200030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1981
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/317383[317383]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/317383[317383]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1982
+#, no-wrap
+msgid "April 24, 2017"
+msgstr "24 апреля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1984
+#, no-wrap
+msgid "12.0-CURRENT after removing NATM support including man:en[4], man:fatm[4], man:hatm[4], and man:patm[4]."
+msgstr "12.0-CURRENT после удаления поддержки NATM, включая man:en[4], man:fatm[4], man:hatm[4] и man:patm[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1985
+#, no-wrap
+msgid "1200031"
+msgstr "1200031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1986
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/318736[318736]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/318736[318736]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1987
+#, no-wrap
+msgid "May 23, 2017"
+msgstr "23 мая 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1989
+#, no-wrap
+msgid "12.0-CURRENT after types `ino_t`, `dev_t`, `nlink_t` were extended to 64bit and `struct dirent` changed layout (also known as ino64)."
+msgstr "12.0-CURRENT после расширения типов `ino_t`, `dev_t`, `nlink_t` до 64 бит и изменения структуры `struct dirent` (также известное как ino64)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1990
+#, no-wrap
+msgid "1200032"
+msgstr "1200032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1991
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/319664[319664]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/319664[319664]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1992
+#, no-wrap
+msgid "June 8, 2017"
+msgstr "8 июня 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1994
+#, no-wrap
+msgid "12.0-CURRENT after removal of `groff`."
+msgstr "12.0-CURRENT после удаления `groff`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1995
+#, no-wrap
+msgid "1200033"
+msgstr "1200033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1996
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320043[320043]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320043[320043]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1997
+#, no-wrap
+msgid "June 17, 2017"
+msgstr "17 июня 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:1999
+#, no-wrap
+msgid "12.0-CURRENT after the type of the `struct event` member `data` was increased to 64bit, and ext structure members added."
+msgstr "12.0-CURRENT после того, как тип члена `data` структуры `struct event` был увеличен до 64 бит, и добавлены члены расширенной структуры."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2000
+#, no-wrap
+msgid "1200034"
+msgstr "1200034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2001
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320085[320085]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320085[320085]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2002
+#, no-wrap
+msgid "June 19, 2017"
+msgstr "19 июня 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2004
+#, no-wrap
+msgid "12.0-CURRENT after the NFS client and server were changed so that they actually use the 64bit `ino_t`."
+msgstr "12.0-CURRENT после изменения клиента и сервера NFS для фактического использования 64-битного `ino_t`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2005
+#, no-wrap
+msgid "1200035"
+msgstr "1200035"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2006
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320317[320317]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320317[320317]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2007
+#, no-wrap
+msgid "June 24, 2017"
+msgstr "June 24, 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2009
+#, no-wrap
+msgid "12.0-CURRENT after the `MAP_GUARD` man:mmap[2] flag was added."
+msgstr "12.0-CURRENT после добавления флага `MAP_GUARD` в man:mmap[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2010
+#, no-wrap
+msgid "1200036"
+msgstr "1200036"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2011
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320347[320347]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320347[320347]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2012
+#, no-wrap
+msgid "June 26, 2017"
+msgstr "26 июня 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2014
+#, no-wrap
+msgid "12.0-CURRENT after changing `time_t` to 64 bits on powerpc (32-bit version)."
+msgstr "12.0-CURRENT после изменения `time_t` на 64 бита на powerpc (32-битная версия)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2015
+#, no-wrap
+msgid "1200037"
+msgstr "1200037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2016
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320545[320545]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320545[320545]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2017
+#, no-wrap
+msgid "July 1, 2017"
+msgstr "1 июля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2019
+#, no-wrap
+msgid "12.0-CURRENT after the cleanup and inlining of `bus_dmamap*` functions (link:https://svnweb.freebsd.org/changeset/base/320528[320528])."
+msgstr "12.0-CURRENT после очистки и встраивания функций `bus_dmamap*` (link:https://svnweb.freebsd.org/changeset/base/320528[320528])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2020
+#, no-wrap
+msgid "1200038"
+msgstr "1200038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2021
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320879[320879]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320879[320879]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2022
+#, no-wrap
+msgid "July 10, 2017"
+msgstr "10 июля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2024
+#, no-wrap
+msgid "12.0-CURRENT after MMC CAM committed. (link:https://svnweb.freebsd.org/changeset/base/320844[320844])."
+msgstr "12.0-CURRENT после коммита MMC CAM (link:https://svnweb.freebsd.org/changeset/base/320844[320844])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2025
+#, no-wrap
+msgid "1200039"
+msgstr "1200039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2026
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/321369[321369]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/321369[321369]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2027
+#, no-wrap
+msgid "July 22, 2017"
+msgstr "22 июля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2029
+#, no-wrap
+msgid "12.0-CURRENT after upgrade of copies of clang, llvm, lld, lldb, compiler-rt and libc++ to 5.0.0 (trunk r308421)."
+msgstr "12.0-CURRENT после обновления копий clang, llvm, lld, lldb, compiler-rt и libc++ до версии 5.0.0 (trunk r308421)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2030
+#, no-wrap
+msgid "1200040"
+msgstr "1200040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2031
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3339
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/321688[321688]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/321688[321688]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2032
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3340
+#, no-wrap
+msgid "July 29, 2017"
+msgstr "29 июля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2034
+#, no-wrap
+msgid "12.0-CURRENT after adding NFS client forced dismount support `umount -N`."
+msgstr "12.0-CURRENT после добавления поддержки принудительного демонтирования клиента NFS `umount -N`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2035
+#, no-wrap
+msgid "1200041"
+msgstr "1200041"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2036
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/322762[322762]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/322762[322762]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2037
+#, no-wrap
+msgid "August 21, 2017"
+msgstr "21 августа 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2039
+#, no-wrap
+msgid "12.0-CURRENT after WRFSBASE instruction become operational on amd64."
+msgstr "12.0-CURRENT после того, как инструкция WRFSBASE стала работоспособной на amd64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2040
+#, no-wrap
+msgid "1200042"
+msgstr "1200042"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2041
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/322900[322900]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/322900[322900]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2042
+#, no-wrap
+msgid "August 25, 2017"
+msgstr "25 августа 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2044
+#, no-wrap
+msgid "12.0-CURRENT after PLPMTUD counters were changed to use man:counter[9]."
+msgstr "12.0-CURRENT после изменения счетчиков PLPMTUD для использования man:counter[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2045
+#, no-wrap
+msgid "1200043"
+msgstr "1200043"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2046
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/322989[322989]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/322989[322989]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2047
+#, no-wrap
+msgid "August 28, 2017"
+msgstr "28 августа 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2049
+#, no-wrap
+msgid "12.0-CURRENT after dropping x86 CACHE_LINE_SIZE down to 64 bytes."
+msgstr "12.0-CURRENT после уменьшения CACHE_LINE_SIZE для x86 до 64 байт."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2050
+#, no-wrap
+msgid "1200044"
+msgstr "1200044"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2051
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/323349[323349]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/323349[323349]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2052
+#, no-wrap
+msgid "September 8, 2017"
+msgstr "8 сентября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2054
+#, no-wrap
+msgid "12.0-CURRENT after implementing `poll_wait()` in the LinuxKPI."
+msgstr "12.0-CURRENT после реализации `poll_wait()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2055
+#, no-wrap
+msgid "1200045"
+msgstr "1200045"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2056
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/323706[323706]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/323706[323706]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2057
+#, no-wrap
+msgid "September 18, 2017"
+msgstr "18 сентября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2059
+#, no-wrap
+msgid "12.0-CURRENT after adding shared memory support to LinuxKPI. (link:https://svnweb.freebsd.org/changeset/base/323703[323703])."
+msgstr "12.0-CURRENT после добавления поддержки разделяемой памяти в LinuxKPI. (link:https://svnweb.freebsd.org/changeset/base/323703[323703])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2060
+#, no-wrap
+msgid "1200046"
+msgstr "1200046"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2061
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/323910[323910]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/323910[323910]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2062
+#, no-wrap
+msgid "September 22, 2017"
+msgstr "22 сентября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2064
+#, no-wrap
+msgid "12.0-CURRENT after adding support for 32-bit compatibility IOCTLs to LinuxKPI."
+msgstr "12.0-CURRENT после добавления поддержки 32-битных совместимых IOCTL в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2065
+#, no-wrap
+msgid "1200047"
+msgstr "1200047"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2066
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/324053[324053]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/324053[324053]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2067
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3350
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3355
+#, no-wrap
+msgid "September 26, 2017"
+msgstr "26 сентября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2069
+#, no-wrap
+msgid "12.0-CURRENT after removing M_HASHTYPE_RSS_UDP_IPV4_EX. (link:https://svnweb.freebsd.org/changeset/base/324052[324052])."
+msgstr "12.0-CURRENT после удаления M_HASHTYPE_RSS_UDP_IPV4_EX. (link:https://svnweb.freebsd.org/changeset/base/324052[324052])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2070
+#, no-wrap
+msgid "1200048"
+msgstr "1200048"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2071
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/324227[324227]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/324227[324227]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2072
+#, no-wrap
+msgid "October 2, 2017"
+msgstr "2 октября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2074
+#, no-wrap
+msgid "12.0-CURRENT after hiding `struct socket` and `struct unpcb` from userland."
+msgstr "12.0-CURRENT после скрытия `struct socket` и `struct unpcb` из пользовательского пространства."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2075
+#, no-wrap
+msgid "1200049"
+msgstr "1200049"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2076
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/324281[324281]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/324281[324281]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2077
+#, no-wrap
+msgid "October 4, 2017"
+msgstr "4 октября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2079
+#, no-wrap
+msgid "12.0-CURRENT after adding the `value.u16` field to `struct diocgattr_arg`."
+msgstr "12.0-CURRENT после добавления поля `value.u16` в структуру `struct diocgattr_arg`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2080
+#, no-wrap
+msgid "1200050"
+msgstr "1200050"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2081
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/324342[324342]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/324342[324342]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2082
+#, no-wrap
+msgid "October 5, 2017"
+msgstr "5 октября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2084
+#, no-wrap
+msgid "12.0-CURRENT after adding the `armv7 MACHINE_ARCH`. (link:https://svnweb.freebsd.org/changeset/base/324340[324340])."
+msgstr "12.0-CURRENT после добавления `armv7 MACHINE_ARCH`. (link:https://svnweb.freebsd.org/changeset/base/324340[324340])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2085
+#, no-wrap
+msgid "1200051"
+msgstr "1200051"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2086
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/324455[324455]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/324455[324455]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2087
+#, no-wrap
+msgid "October 9, 2017"
+msgstr "9 октября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2089
+#, no-wrap
+msgid "12.0-CURRENT after removing [.filename]#libstand.a# as a public interface. (link:https://svnweb.freebsd.org/changeset/base/324454[324454])."
+msgstr "12.0-CURRENT после удаления [.filename]#libstand.a# как публичного интерфейса. (link:https://svnweb.freebsd.org/changeset/base/324454[324454])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2090
+#, no-wrap
+msgid "1200052"
+msgstr "1200052"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2091
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/325028[325028]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/325028[325028]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2092
+#, no-wrap
+msgid "October 26, 2017"
+msgstr "26 октября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2094
+#, no-wrap
+msgid "12.0-CURRENT after fixing `ptrace()` to always clear the correct thread event when resuming."
+msgstr "12.0-CURRENT после исправления `ptrace()`, чтобы всегда очищать правильное событие потока при возобновлении."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2095
+#, no-wrap
+msgid "1200053"
+msgstr "1200053"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2096
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/325506[325506]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/325506[325506]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2097
+#, no-wrap
+msgid "November 7, 2017"
+msgstr "7 ноября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2099
+#, no-wrap
+msgid "12.0-CURRENT after changing `struct mbuf` layout to add optional hardware timestamps for receive packets."
+msgstr "12.0-CURRENT после изменения структуры `struct mbuf` для добавления опциональных аппаратных меток времени для принимаемых пакетов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2100
+#, no-wrap
+msgid "1200054"
+msgstr "1200054"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2101
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/325852[325852]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/325852[325852]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2102
+#, no-wrap
+msgid "November 15, 2017"
+msgstr "15 ноября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2104
+#, no-wrap
+msgid "12.0-CURRENT after changing the layout of `struct vmtotal` to allow for reporting large memory counters."
+msgstr "12.0-CURRENT после изменения структуры `struct vmtotal` для поддержки отчёта больших счётчиков памяти."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2105
+#, no-wrap
+msgid "1200055"
+msgstr "1200055"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2106
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/327740[327740]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/327740[327740]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2107
+#, no-wrap
+msgid "January 9, 2018"
+msgstr "9 января 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2109
+#, no-wrap
+msgid "12.0-CURRENT after adding `cpucontrol -e` support."
+msgstr "12.0-CURRENT после добавления поддержки `cpucontrol -e`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2110
+#, no-wrap
+msgid "1200056"
+msgstr "1200056"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2111
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/327952[327952]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/327952[327952]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2112
+#, no-wrap
+msgid "January 14, 2018"
+msgstr "14 января 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2114
+#, no-wrap
+msgid "12.0-CURRENT after upgrading clang, llvm, lld, lldb, compiler-rt and libc++ to 6.0.0 (branches/release_60 r321788)."
+msgstr "12.0-CURRENT после обновления clang, llvm, lld, lldb, compiler-rt и libc++ до версии 6.0.0 (ветки/release_60 r321788)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2115
+#, no-wrap
+msgid "1200057"
+msgstr "1200057"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2116
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/329033[329033]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/329033[329033]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2117
+#, no-wrap
+msgid "February 8, 2018"
+msgstr "8 февраля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2119
+#, no-wrap
+msgid "12.0-CURRENT after applying a clang 6.0.0 fix to make the wine ports build correctly."
+msgstr "12.0-CURRENT после применения исправления в clang 6.0.0 для корректной сборки портов wine."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2120
+#, no-wrap
+msgid "1200058"
+msgstr "1200058"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2121
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/329166[329166]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/329166[329166]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2122
+#, no-wrap
+msgid "February 12, 2018"
+msgstr "12 февраля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2124
+#, no-wrap
+msgid "12.0-CURRENT after the Lua loader was committed."
+msgstr "12.0-CURRENT после включения загрузчика Lua."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2125
+#, no-wrap
+msgid "1200059"
+msgstr "1200059"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2126
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/330299[330299]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/330299[330299]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2127
+#, no-wrap
+msgid "March 2, 2018"
+msgstr "2 марта 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2129
+#, no-wrap
+msgid "12.0-CURRENT after removing the declaration of `union semun` unless `_WANT_SEMUN` is defined. Also the removal of `struct mymsg` and the renaming of kernel-only members of `struct semid_ds` and `struct msgid_ds`."
+msgstr "12.0-CURRENT после удаления объявления `union semun`, если не определено `_WANT_SEMUN`. Также удаление `struct mymsg` и переименование членов `struct semid_ds` и `struct msgid_ds`, предназначенных только для ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2130
+#, no-wrap
+msgid "1200060"
+msgstr "1200060"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2131
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/330384[330384]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/330384[330384]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2132
+#, no-wrap
+msgid "March 4, 2018"
+msgstr "4 марта 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2134
+#, no-wrap
+msgid "12.0-CURRENT after upgrading clang, llvm, lld, lldb, compiler-rt and libc++ to 6.0.0 release."
+msgstr "12.0-CURRENT после обновления clang, llvm, lld, lldb, compiler-rt и libc++ до версии 6.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2135
+#, no-wrap
+msgid "1200061"
+msgstr "1200061"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2136
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/332100[332100]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/332100[332100]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2137
+#, no-wrap
+msgid "April 6, 2018"
+msgstr "6 апреля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2139
+#, no-wrap
+msgid "12.0-CURRENT after changing man:syslog[3] to emit RFC 5424 formatted messages."
+msgstr "12.0-CURRENT после изменения man:syslog[3] для генерации сообщений в формате RFC 5424."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2140
+#, no-wrap
+msgid "1200062"
+msgstr "1200062"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2141
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/332423[332423]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/332423[332423]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2142
+#, no-wrap
+msgid "April 12, 2018"
+msgstr "12 апреля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2144
+#, no-wrap
+msgid "12.0-CURRENT after changing the Netmap API."
+msgstr "12.0-CURRENT после изменения API Netmap."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2145
+#, no-wrap
+msgid "1200063"
+msgstr "1200063"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2146
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/333446[333446]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/333446[333446]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2147
+#, no-wrap
+msgid "May 10, 2018"
+msgstr "10 мая 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2149
+#, no-wrap
+msgid "12.0-CURRENT after reworking CTL frontend and backend options to use man:nv[3], allow creating multiple ioctl frontend ports."
+msgstr "12.0-CURRENT после переработки параметров интерфейса и внутренней части CTL для использования man:nv[3], разрешено создание нескольких портов ioctl интерфейса."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2150
+#, no-wrap
+msgid "1200064"
+msgstr "1200064"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2151
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/334074[334074]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/334074[334074]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2152
+#, no-wrap
+msgid "May 22, 2018"
+msgstr "22 мая 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2154
+#, no-wrap
+msgid "12.0-CURRENT after changing the ifnet address and multicast address TAILQ to CK_STAILQ."
+msgstr "12.0-CURRENT после изменения ifnet address и multicast address TAILQ на CK_STAILQ."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2155
+#, no-wrap
+msgid "1200065"
+msgstr "1200065"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2156
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/334290[334290]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/334290[334290]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2157
+#, no-wrap
+msgid "May 28, 2018"
+msgstr "28 мая 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2159
+#, no-wrap
+msgid "12.0-CURRENT after changing man:dwatch[1] to allow '-E code' to override profile EVENT_DETAILS."
+msgstr "12.0-CURRENT после изменения man:dwatch[1] для разрешения использования '-E code' для переопределения EVENT_DETAILS в профиле."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2160
+#, no-wrap
+msgid "1200066"
+msgstr "1200066"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2161
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/334466[334466]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/334466[334466]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2162
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3415
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3420
+#, no-wrap
+msgid "June 1, 2018"
+msgstr "1 июня 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2164
+#, no-wrap
+msgid "12.0-CURRENT after removal of in-kernel pmc tables for Intel."
+msgstr "12.0-CURRENT после удаления внутриядерных таблиц pmc для Intel."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2165
+#, no-wrap
+msgid "1200067"
+msgstr "1200067"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2166
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/334892[334892]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/334892[334892]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2167
+#, no-wrap
+msgid "June 9, 2018"
+msgstr "9 июня 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2169
+#, no-wrap
+msgid "12.0-CURRENT after adding DW_LANG constants to libdwarf."
+msgstr "12.0-CURRENT после добавления констант DW_LANG в libdwarf."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2170
+#, no-wrap
+msgid "1200068"
+msgstr "1200068"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2171
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/334930[334930]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/334930[334930]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2172
+#, no-wrap
+msgid "June 12, 2018"
+msgstr "12 июня 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2174
+#, no-wrap
+msgid "12.0-CURRENT after changing the interface between the NFS modules."
+msgstr "12.0-CURRENT после изменения интерфейса между модулями NFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2175
+#, no-wrap
+msgid "1200069"
+msgstr "1200069"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2176
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/335237[335237]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/335237[335237]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2177
+#, no-wrap
+msgid "June 15, 2018"
+msgstr "15 июня 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2179
+#, no-wrap
+msgid "12.0-CURRENT after changing `struct kerneldumpheader` to version 4 (similar to version 2 in 11-STABLE and previous)."
+msgstr "12.0-CURRENT после изменения `struct kerneldumpheader` до версии 4 (аналогично версии 2 в 11-STABLE и более ранних)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2180
+#, no-wrap
+msgid "1200070"
+msgstr "1200070"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2181
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/335873[335873]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/335873[335873]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2182
+#, no-wrap
+msgid "July 2, 2018"
+msgstr "2 июля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2184
+#, no-wrap
+msgid "12.0-CURRENT after inlining man:atomic[9] in modules on amd64 and i386 requiring all modules of consumers to be rebuilt for these architectures."
+msgstr "12.0-CURRENT после встраивания man:atomic[9] в модули на amd64 и i386, что потребовало пересборки всех модулей потребителей для этих архитектур."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2185
+#, no-wrap
+msgid "1200071"
+msgstr "1200071"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2186
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/335930[335930]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/335930[335930]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2187
+#, no-wrap
+msgid "July 4, 2018"
+msgstr "4 июля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2189
+#, no-wrap
+msgid "12.0-CURRENT after changing the ABI and API of man:epoch[9] (link:https://svnweb.freebsd.org/changeset/base/335924[335924]) requiring modules of consumers to be rebuilt."
+msgstr "12.0-CURRENT после изменения ABI и API man:epoch[9] (link:https://svnweb.freebsd.org/changeset/base/335924[335924]), что потребовало пересборки модулей потребителей."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2190
+#, no-wrap
+msgid "1200072"
+msgstr "1200072"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2191
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/335979[335979]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/335979[335979]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2192
+#, no-wrap
+msgid "July 5, 2018"
+msgstr "5 июля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2194
+#, no-wrap
+msgid "12.0-CURRENT after changing the ABI and API of `struct xinpcb` and friends."
+msgstr "12.0-CURRENT после изменения ABI и API `struct xinpcb` и связанных структур."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2195
+#, no-wrap
+msgid "1200073"
+msgstr "1200073"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2196
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/336313[336313]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/336313[336313]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2197
+#, no-wrap
+msgid "July 15, 2018"
+msgstr "15 июля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2199
+#, no-wrap
+msgid "12.0-CURRENT after changing the ABI and API of `struct if_shared_ctx` and `struct if_softc_ctx` requiring modules of man:iflib[9] consumers to be rebuilt."
+msgstr "12.0-CURRENT после изменения ABI и API структур `struct if_shared_ctx` и `struct if_softc_ctx`, что потребовало пересборки модулей потребителей man:iflib[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2200
+#, no-wrap
+msgid "1200074"
+msgstr "1200074"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2201
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/336360[336360]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/336360[336360]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2202
+#, no-wrap
+msgid "July 16, 2018"
+msgstr "16 июля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2204
+#, no-wrap
+msgid "12.0-CURRENT after updating the configuration of libstdc++ to make use of C99 functions."
+msgstr "12.0-CURRENT после обновления конфигурации libstdc++ для использования функций C99."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2205
+#, no-wrap
+msgid "1200075"
+msgstr "1200075"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2206
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/336538[336538]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/336538[336538]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2207
+#, no-wrap
+msgid "July 19, 2018"
+msgstr "19 июля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2209
+#, no-wrap
+msgid "12.0-CURRENT after `zfsloader` being folded into loader, and after adding ntpd:ntpd as uid:gid 123:123, and after removing arm big-endian support (MACHINE_ARCH=armeb)."
+msgstr "12.0-CURRENT после объединения `zfsloader` в `loader`, после добавления ntpd:ntpd как uid:gid 123:123 и после удаления поддержки big-endian для архитектуры arm (MACHINE_ARCH=armeb)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2210
+#, no-wrap
+msgid "1200076"
+msgstr "1200076"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2211
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/336914[336914]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/336914[336914]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2212
+#, no-wrap
+msgid "July 30, 2018"
+msgstr "30 июля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2214
+#, no-wrap
+msgid "12.0-CURRENT after KPI changes to `timespecadd`."
+msgstr "12.0-CURRENT после изменений KPI в `timespecadd`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2215
+#, no-wrap
+msgid "1200077"
+msgstr "1200077"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2216
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/337576[337576]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/337576[337576]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2217
+#, no-wrap
+msgid "August 10, 2018"
+msgstr "10 августа 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2219
+#, no-wrap
+msgid "12.0-CURRENT after man:timespec_get[3] was added to the system."
+msgstr "12.0-CURRENT после добавления в систему man:timespec_get[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2220
+#, no-wrap
+msgid "1200078"
+msgstr "1200078"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2221
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/337863[337863]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/337863[337863]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2222
+#, no-wrap
+msgid "August 15, 2018"
+msgstr "15 августа 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2224
+#, no-wrap
+msgid "12.0-CURRENT after exec.created hook for jails."
+msgstr "12.0-CURRENT после выполнения хука exec.created для клеток."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2225
+#, no-wrap
+msgid "1200079"
+msgstr "1200079"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2226
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/338061[338061]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/338061[338061]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2227
+#, no-wrap
+msgid "August 19, 2018"
+msgstr "19 августа 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2229
+#, no-wrap
+msgid "12.0-CURRENT after converting `arc4random` to using the Chacha20 algorithm and deprecating `arc4random_stir` and `arc4random_addrandom`."
+msgstr "12.0-CURRENT после перевода `arc4random` на использование алгоритма Chacha20 и устаревания `arc4random_stir` и `arc4random_addrandom`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2230
+#, no-wrap
+msgid "1200080"
+msgstr "1200080"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2231
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/338172[338172]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/338172[338172]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2232
+#, no-wrap
+msgid "August 22, 2018"
+msgstr "22 августа 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2234
+#, no-wrap
+msgid "12.0-CURRENT after removing the drm drivers."
+msgstr "12.0-CURRENT после удаления драйверов drm."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2235
+#, no-wrap
+msgid "1200081"
+msgstr "1200081"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2236
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/338182[338182]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/338182[338182]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2237
+#, no-wrap
+msgid "August 21, 2018"
+msgstr "21 августа 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2239
+#, no-wrap
+msgid "12.0-CURRENT after KPI changes to NVMe."
+msgstr "12.0-CURRENT после изменений KPI для NVMe."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2240
+#, no-wrap
+msgid "1200082"
+msgstr "1200082"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2241
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/338285[338285]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/338285[338285]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2242
+#, no-wrap
+msgid "August 24, 2018"
+msgstr "24 августа 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2244
+#, no-wrap
+msgid "12.0-CURRENT after reverting the removal of the drm drivers."
+msgstr "12.0-CURRENT после отмены удаления драйверов drm."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2245
+#, no-wrap
+msgid "1200083"
+msgstr "1200083"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2246
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/338331[338331]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/338331[338331]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2247
+#, no-wrap
+msgid "August 26, 2018"
+msgstr "26 августа 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2249
+#, no-wrap
+msgid "12.0-CURRENT after removing `arc4random_stir` and `arc4random_addrandom`."
+msgstr "12.0-CURRENT после удаления `arc4random_stir` и `arc4random_addrandom`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2250
+#, no-wrap
+msgid "1200084"
+msgstr "1200084"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2251
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/338478[338478]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/338478[338478]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2252
+#, no-wrap
+msgid "September 5, 2018"
+msgstr "5 сентября 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2254
+#, no-wrap
+msgid "12.0-CURRENT after updating man:objcopy[1] to properly handle little-endian MIPS64 object files."
+msgstr "12.0-CURRENT после обновления man:objcopy[1] для корректной обработки little-endian MIPS64 объектных файлов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2255
+#, no-wrap
+msgid "1200085"
+msgstr "1200085"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2256
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/339270[339270]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/339270[339270]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2259
+#, no-wrap
+msgid "12.0-STABLE after updating OpenSSL to version 1.1.1."
+msgstr "12.0-STABLE после обновления OpenSSL до версии 1.1.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2260
+#, no-wrap
+msgid "1200086"
+msgstr "1200086"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2261
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/339732[339732]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/339732[339732]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2264
+#, no-wrap
+msgid "12.0-STABLE after updating OpenSSL shared library version numbers."
+msgstr "12.0-STABLE после обновления номеров версий разделяемых библиотек OpenSSL."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2265
+#, no-wrap
+msgid "1200500"
+msgstr "1200500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2266
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/340471[340471]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/340471[340471]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2267
+#, no-wrap
+msgid "November 16, 2018"
+msgstr "16 ноября 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2269
+#, no-wrap
+msgid "12-STABLE after releng/12.0 was branched."
+msgstr "12-STABLE после ветвления releng/12.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2270
+#, no-wrap
+msgid "1200501"
+msgstr "1200501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2271
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/342801[342801]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/342801[342801]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2272
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3445
+#, no-wrap
+msgid "January 6, 2019"
+msgstr "6 января 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2274
+#, no-wrap
+msgid "12-STABLE after merge of fixing `linux_destroy_dev()` behaviour when there are still files open from the destroying cdev."
+msgstr "12-STABLE после слияния исправления поведения `linux_destroy_dev()`, когда остаются открытые файлы из уничтожаемого cdev."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2275
+#, no-wrap
+msgid "1200502"
+msgstr "1200502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2276
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/343126[343126]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/343126[343126]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2277
+#, no-wrap
+msgid "January 17, 2019"
+msgstr "January 17, 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2279
+#, no-wrap
+msgid "12-STABLE after enabling sys/random.h #include from C++."
+msgstr "12-STABLE после включения #include <sys/random.h> в C++."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2280
+#, no-wrap
+msgid "1200503"
+msgstr "1200503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2281
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/344152[344152]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/344152[344152]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2282
+#, no-wrap
+msgid "February 15, 2019"
+msgstr "15 февраля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2284
+#, no-wrap
+msgid "12-STABLE after merge of fixing man:renameat[2] for CAPABILITIES kernels."
+msgstr "12-STABLE после слияния исправления man:renameat[2] для ядер с CAPABILITIES."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2285
+#, no-wrap
+msgid "1200504"
+msgstr "1200504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2286
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/345169[345169]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/345169[345169]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2289
+#, no-wrap
+msgid "12-STABLE after merging CCM for the benefit of the ZoF port."
+msgstr "12-STABLE после слияния CCM для работы с портом ZoF."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2290
+#, no-wrap
+msgid "1200505"
+msgstr "1200505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2291
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/345327[345327]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/345327[345327]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2292
+#, no-wrap
+msgid "March 20, 2019"
+msgstr "20 марта 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2294
+#, no-wrap
+msgid "12-STABLE after merging support for selectively disabling ZFS without disabling loader."
+msgstr "12-STABLE после объединения поддержки выборочного отключения ZFS без отключения загрузчика."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2295
+#, no-wrap
+msgid "1200506"
+msgstr "1200506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2296
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/346168[346168]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/346168[346168]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2297
+#, no-wrap
+msgid "April 12, 2019"
+msgstr "12 апреля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2299
+#, no-wrap
+msgid "12-STABLE after merging llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp 8.0.0 final release r356365."
+msgstr "12-STABLE после слияния llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp 8.0.0 финальный релиз r356365."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2300
+#, no-wrap
+msgid "1200507"
+msgstr "1200507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2301
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/346337[346337]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/346337[346337]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2302
+#, no-wrap
+msgid "April 17, 2019"
+msgstr "17 апреля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2304
+#, no-wrap
+msgid "12-STABLE after MFC of iflib changes in link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] and partially of link:https://svnweb.freebsd.org/changeset/base/345305[345305]."
+msgstr "12-STABLE после слияния изменений iflib из ревизий link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] и частично из link:https://svnweb.freebsd.org/changeset/base/345305[345305]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2305
+#, no-wrap
+msgid "1200508"
+msgstr "1200508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2306
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3459
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/346784[346784]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/346784[346784]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2307
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3460
+#, no-wrap
+msgid "April 27, 2019"
+msgstr "27 апреля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2309
+#, no-wrap
+msgid "12-STABLE after `ether_gen_addr` availability."
+msgstr "12-STABLE после появления `ether_gen_addr`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2310
+#, no-wrap
+msgid "1200509"
+msgstr "1200509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2311
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347790[347790]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347790[347790]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2312
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3470
+#, no-wrap
+msgid "May 16, 2019"
+msgstr "16 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2314
+#, no-wrap
+msgid "12-STABLE after bumping the Mellanox driver version numbers (man:mlx4en[4]; man:mlx5en[4])."
+msgstr "12-STABLE после обновления номеров версий драйверов Mellanox (man:mlx4en[4]; man:mlx5en[4])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2315
+#, no-wrap
+msgid "1200510"
+msgstr "1200510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2316
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/348036[348036]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/348036[348036]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2317
+#, no-wrap
+msgid "May 21, 2019"
+msgstr "21 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2319
+#, no-wrap
+msgid "12-STABLE after change to struct in linuxkpi from link:https://svnweb.freebsd.org/changeset/base/348035[348035]."
+msgstr "12-STABLE после изменения структуры в linuxkpi из link:https://svnweb.freebsd.org/changeset/base/348035[348035]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2320
+#, no-wrap
+msgid "1200511"
+msgstr "1200511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2321
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/348243[348243]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/348243[348243]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2322
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2327
+#, no-wrap
+msgid "May 24, 2019"
+msgstr "24 мая 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2324
+#, no-wrap
+msgid "12-STABLE after MFC of link:https://svnweb.freebsd.org/changeset/base/347843[347843]: adding `group_leader` member to struct `task_struct` to the LinuxKPI."
+msgstr "12-STABLE после MFC изменения link:https://svnweb.freebsd.org/changeset/base/347843[347843]: добавление элемента `group_leader` в структуру `task_struct` для LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2325
+#, no-wrap
+msgid "1200512"
+msgstr "1200512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2326
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/348245[348245]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/348245[348245]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2329
+#, no-wrap
+msgid "12-STABLE after adding context member to ww_mutex in LinuxKPI."
+msgstr "12-STABLE после добавления элемента контекста к ww_mutex в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2330
+#, no-wrap
+msgid "1200513"
+msgstr "1200513"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2331
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/349763[349763]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/349763[349763]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2332
+#, no-wrap
+msgid "July 5, 2019"
+msgstr "5 июля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2334
+#, no-wrap
+msgid "12-STABLE after MFC of man:epoch[9] changes: link:https://svnweb.freebsd.org/changeset/base/349763[349763], link:https://svnweb.freebsd.org/changeset/base/340404[340404], link:https://svnweb.freebsd.org/changeset/base/340415[340415], link:https://svnweb.freebsd.org/changeset/base/340417[340417], link:https://svnweb.freebsd.org/changeset/base/340419[340419], link:https://svnweb.freebsd.org/changeset/base/340420[340420]."
+msgstr "12-STABLE после MFC man:epoch[9] изменил: link:https://svnweb.freebsd.org/changeset/base/349763[349763], link:https://svnweb.freebsd.org/changeset/base/340404[340404], link:https://svnweb.freebsd.org/changeset/base/340415[340415], link:https://svnweb.freebsd.org/changeset/base/340417[340417], link:https://svnweb.freebsd.org/changeset/base/340419[340419], link:https://svnweb.freebsd.org/changeset/base/340420[340420]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2335
+#, no-wrap
+msgid "1200514"
+msgstr "1200514"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2336
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/350083[350083]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/350083[350083]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2337
+#, no-wrap
+msgid "July 17, 2019"
+msgstr "17 июля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2339
+#, no-wrap
+msgid "12-STABLE after additions to LinuxKPI's rcu list."
+msgstr "12-STABLE после добавлений в список rcu LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2340
+#, no-wrap
+msgid "1200515"
+msgstr "1200515"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2341
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/350877[350877]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/350877[350877]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2342
+#, no-wrap
+msgid "August 11, 2019"
+msgstr "11 августа 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2344
+#, no-wrap
+msgid "12-STABLE after MFC of link:https://svnweb.freebsd.org/changeset/base/349891[349891] (reorganize the SRCS lists as one file per line, and then alphabetize them) and link:https://svnweb.freebsd.org/changeset/base/349972[349972] (add `arm_sync_icache()` and `arm_drain_writebuf()` sysarch syscall wrappers)."
+msgstr "12-STABLE после слияния изменений link:https://svnweb.freebsd.org/changeset/base/349891[349891] (реорганизация списков SRCS в виде одного файла на строку с последующей сортировкой по алфавиту) и link:https://svnweb.freebsd.org/changeset/base/349972[349972] (добавление обёрток системных вызовов `arm_sync_icache()` и `arm_drain_writebuf()` для sysarch)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2345
+#, no-wrap
+msgid "1200516"
+msgstr "1200516"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2346
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/351276[351276]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/351276[351276]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2347
+#, no-wrap
+msgid "August 20, 2019"
+msgstr "20 августа 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2349
+#, no-wrap
+msgid "12-STABLE after MFC of various changes to iflib link:https://svnweb.freebsd.org/changeset/base/351276[351276]."
+msgstr "12-STABLE после слияния различных изменений в iflib (MFC) link:https://svnweb.freebsd.org/changeset/base/351276[351276]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2350
+#, no-wrap
+msgid "1200517"
+msgstr "1200517"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2351
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/352076[352076]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/352076[352076]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2354
+#, no-wrap
+msgid "12-STABLE after adding sysfs create/remove functions that handles multiple files in one call to the LinuxKPI."
+msgstr "12-STABLE после добавления функций создания/удаления sysfs, обрабатывающих несколько файлов за один вызов в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2355
+#, no-wrap
+msgid "1200518"
+msgstr "1200518"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2356
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/352114[352114]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/352114[352114]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2357
+#, no-wrap
+msgid "September 10, 2019"
+msgstr "10 сентября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2359
+#, no-wrap
+msgid "12-STABLE after additional updates to LinuxKPI's sysfs."
+msgstr "12-STABLE после дополнительных обновлений LinuxKPI в sysfs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2360
+#, no-wrap
+msgid "1200519"
+msgstr "1200519"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2361
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/352351[352351]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/352351[352351]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2362
+#, no-wrap
+msgid "September 15, 2019"
+msgstr "15 сентября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2364
+#, no-wrap
+msgid "12-STABLE after MFC of the new fusefs driver."
+msgstr "12-STABLE после переноса (MFC) нового драйвера fusefs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2365
+#, no-wrap
+msgid "1201000"
+msgstr "1201000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2366
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/352546[352546]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/352546[352546]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2367
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2372
+#, no-wrap
+msgid "September 20, 2019"
+msgstr "20 сентября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2369
+#, no-wrap
+msgid "releng/12.1 branched from stable/12@r352480."
+msgstr "releng/12.1 ответвился от stable/12@r352480."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2370
+#, no-wrap
+msgid "1201500"
+msgstr "1201500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2371
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/352547[352547]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/352547[352547]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2374
+#, no-wrap
+msgid "12-STABLE after branching releng/12.1."
+msgstr "12-STABLE после ветвления releng/12.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2375
+#, no-wrap
+msgid "1201501"
+msgstr "1201501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2376
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3484
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354598[354598]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354598[354598]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2377
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2392
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3485
+#, no-wrap
+msgid "November 10, 2019"
+msgstr "10 ноября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2379
+#, no-wrap
+msgid "12-STABLE after fixing a potential OOB read security issue in libc++."
+msgstr "12-STABLE после исправления потенциальной проблемы безопасности OOB-чтения в libc++."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2380
+#, no-wrap
+msgid "1201502"
+msgstr "1201502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2381
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354613[354613]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354613[354613]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2382
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3490
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3495
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3500
+#, no-wrap
+msgid "November 11, 2019"
+msgstr "11 ноября 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2384
+#, no-wrap
+msgid "12-STABLE after enabling device class group attributes in the LinuxKPI."
+msgstr "12-STABLE после включения атрибутов группы классов устройств в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2385
+#, no-wrap
+msgid "1201503"
+msgstr "1201503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2386
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354928[354928]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354928[354928]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2389
+#, no-wrap
+msgid "12-STABLE after adding support for `AT_EXECPATH` to man:elf_aux_info[3]."
+msgstr "12-STABLE после добавления поддержки `AT_EXECPATH` в man:elf_aux_info[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2390
+#, no-wrap
+msgid "1201504"
+msgstr "1201504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2394
+#, no-wrap
+msgid "12-STABLE after correcting the C++ version check for declaring man:timespec_get[3]."
+msgstr "12-STABLE после исправления проверки версии C++ для объявления man:timespec_get[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2395
+#, no-wrap
+msgid "1201505"
+msgstr "1201505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2396
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3504
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/355899[355899]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/355899[355899]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2397
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3505
+#, no-wrap
+msgid "December 19, 2019"
+msgstr "19 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2399
+#, no-wrap
+msgid "12-STABLE after adding `sigsetop` extensions commonly found in musl libc and glibc."
+msgstr "12-STABLE после добавления расширений `sigsetop`, которые часто встречаются в musl libc и glibc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2400
+#, no-wrap
+msgid "1201506"
+msgstr "1201506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2401
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/355968[355968]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/355968[355968]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2402
+#, no-wrap
+msgid "December 21, 2019"
+msgstr "21 декабря 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2404
+#, no-wrap
+msgid "12-STABLE after doubling the value of `ARG_MAX`, for 64 bit platforms."
+msgstr "12-STABLE после удвоения значения `ARG_MAX` для 64-битных платформ."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2405
+#, no-wrap
+msgid "1201507"
+msgstr "1201507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2406
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356306[356306]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356306[356306]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2409
+#, no-wrap
+msgid "12-STABLE after adding functions to man:bitstring[3] to find contiguous sequences of set or unset bits."
+msgstr "12-STABLE после добавления функций в man:bitstring[3] для поиска непрерывных последовательностей установленных или сброшенных битов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2410
+#, no-wrap
+msgid "1201508"
+msgstr "1201508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2411
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356394[356394]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356394[356394]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2414
+#, no-wrap
+msgid "12-STABLE after making USB statistics be per-device instead of per bus."
+msgstr "12-STABLE после изменения статистики USB для каждого устройства вместо каждой шины."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2415
+#, no-wrap
+msgid "1201509"
+msgstr "1201509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2416
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356460[356460]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356460[356460]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2417
+#, no-wrap
+msgid "January 7, 2020"
+msgstr "7 января 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2419
+#, no-wrap
+msgid "12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 9.0.0 final release r372316."
+msgstr "12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до финального релиза 9.0.0 r372316."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2420
+#, no-wrap
+msgid "1201510"
+msgstr "1201510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2421
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356679[356679]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356679[356679]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2422
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3515
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4288
+#, no-wrap
+msgid "January 13, 2020"
+msgstr "13 января 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2424
+#, no-wrap
+msgid "12-STABLE after adding own counter for cancelled USB transfers."
+msgstr "12-STABLE после добавления собственного счётчика для отменённых USB-передач."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2425
+#, no-wrap
+msgid "1201511"
+msgstr "1201511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2426
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/357333[357333]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/357333[357333]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2427
+#, no-wrap
+msgid "January 31, 2020"
+msgstr "31 января 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2429
+#, no-wrap
+msgid "12-STABLE after adding [.filename]#/etc/os-release# as a symbolic link to [.filename]#/var/run/os-release#."
+msgstr "12-STABLE после добавления символической ссылки [.filename]#/etc/os-release# на [.filename]#/var/run/os-release#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2430
+#, no-wrap
+msgid "1201512"
+msgstr "1201512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2431
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/357612[357612]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/357612[357612]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2432
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3520
+#, no-wrap
+msgid "February 6, 2020"
+msgstr "6 февраля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2434
+#, no-wrap
+msgid "12-STABLE after recent LinuxKPI changes."
+msgstr "12-STABLE после недавних изменений в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2435
+#, no-wrap
+msgid "1201513"
+msgstr "1201513"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2436
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359957[359957]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359957[359957]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2437
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3525
+#, no-wrap
+msgid "April 15, 2020"
+msgstr "15 апреля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2439
+#, no-wrap
+msgid "12-STABLE after cloning the RCU interface into a sleepable and a non-sleepable part in the LinuxKPI."
+msgstr "12-STABLE после разделения интерфейса RCU на допускающий и не допускающий сон части в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2440
+#, no-wrap
+msgid "1201514"
+msgstr "1201514"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2441
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360525[360525]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360525[360525]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2442
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2447
+#, no-wrap
+msgid "May 1, 2020"
+msgstr "1 мая 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2444
+#, no-wrap
+msgid "12-STABLE after implementing full man:bus_dma[9] support in the LinuxKPI and pulling in all dependencies."
+msgstr "12-STABLE после реализации полной поддержки man:bus_dma[9] в LinuxKPI и включения всех зависимостей."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2445
+#, no-wrap
+msgid "1201515"
+msgstr "1201515"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2446
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360545[360545]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360545[360545]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2449
+#, no-wrap
+msgid "12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0 release."
+msgstr "12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2450
+#, no-wrap
+msgid "1201516"
+msgstr "1201516"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2451
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360620[360620]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360620[360620]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2452
+#, no-wrap
+msgid "May 4, 2020"
+msgstr "4 мая 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2454
+#, no-wrap
+msgid "12-STABLE after moving `id_mapped` to end of `bus_dma_impl` structure to preserve KPI."
+msgstr "12-STABLE после перемещения `id_mapped` в конец структуры `bus_dma_impl` для сохранения KPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2455
+#, no-wrap
+msgid "1201517"
+msgstr "1201517"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2456
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/361350[361350]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/361350[361350]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2457
+#, no-wrap
+msgid "May 21, 2020"
+msgstr "21 мая 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2459
+#, no-wrap
+msgid "12-STABLE after renaming `vm.max_wired` to `vm.max_user_wired` and changing its type."
+msgstr "12-STABLE после переименования `vm.max_wired` в `vm.max_user_wired` и изменения его типа."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2460
+#, no-wrap
+msgid "1201518"
+msgstr "1201518"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2461
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/362319[362319]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/362319[362319]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2462
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3555
+#, no-wrap
+msgid "June 18, 2020"
+msgstr "18 июня 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2464
+#, no-wrap
+msgid "12-STABLE after implementing `__is_constexpr()` function macro in the LinuxKPI."
+msgstr "12-STABLE после реализации макроса функции `__is_constexpr()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2465
+#, no-wrap
+msgid "1201519"
+msgstr "1201519"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2466
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/362916[362916]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/362916[362916]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2467
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3560
+#, no-wrap
+msgid "July 4, 2020"
+msgstr "4 июля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2469
+#, no-wrap
+msgid "12-STABLE after making liblzma use libmd implementation of SHA256."
+msgstr "12-STABLE после перевода liblzma на использование реализации SHA256 из libmd."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2470
+#, no-wrap
+msgid "1201520"
+msgstr "1201520"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2471
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363494[363494]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363494[363494]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2472
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3565
+#, no-wrap
+msgid "July 24, 2020"
+msgstr "24 июля 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2474
+#, no-wrap
+msgid "12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.1 release."
+msgstr "12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2475
+#, no-wrap
+msgid "1201521"
+msgstr "1201521"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2476
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363790[363790]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363790[363790]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2477
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3570
+#, no-wrap
+msgid "August 3, 2020"
+msgstr "3 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2479
+#, no-wrap
+msgid "12-STABLE after implementing the `array_size()` function in the LinuxKPI."
+msgstr "12-STABLE после реализации функции `array_size()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2480
+#, no-wrap
+msgid "1201522"
+msgstr "1201522"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2481
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363832[363832]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363832[363832]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2482
+#, no-wrap
+msgid "August 4, 2020"
+msgstr "4 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2484
+#, no-wrap
+msgid "12-STABLE after adding sysctlbyname system call."
+msgstr "12-STABLE после добавления системного вызова sysctlbyname."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2485
+#, no-wrap
+msgid "1201523"
+msgstr "1201523"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2486
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364390[364390]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364390[364390]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2487
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3575
+#, no-wrap
+msgid "August 19, 2020"
+msgstr "19 августа 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2489
+#, no-wrap
+msgid "12-STABLE after change to clone the task struct fields related to RCU."
+msgstr "12-STABLE после изменения для клонирования полей структуры задачи, связанных с RCU."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2490
+#, no-wrap
+msgid "1201524"
+msgstr "1201524"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2491
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/365356[365356]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/365356[365356]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2492
+#, no-wrap
+msgid "September 5, 2020"
+msgstr "5 сентября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2494
+#, no-wrap
+msgid "12-STABLE after splitting XDR off into a separate kernel module, to minimize ZFS dependencies."
+msgstr "12-STABLE после выделения XDR в отдельный модуль ядра для минимизации зависимостей ZFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2495
+#, no-wrap
+msgid "1201525"
+msgstr "1201525"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2496
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3579
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/365471[365471]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/365471[365471]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2499
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2564
+#, no-wrap
+msgid "12-STABLE after adding atomic and `bswap` functions to libcompiler_rt."
+msgstr "12-STABLE после добавления атомарных функций и функций `bswap` в libcompiler_rt."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2500
+#, no-wrap
+msgid "1201526"
+msgstr "1201526"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2501
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/365608[365608]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/365608[365608]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2502
+#, no-wrap
+msgid "September 10, 2020"
+msgstr "10 сентября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2504
+#, no-wrap
+msgid "12-STABLE after updating net80211 and kernel privilege checking API changes."
+msgstr "12-STABLE после обновления net80211 и изменений API проверки привилегий ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2505
+#, no-wrap
+msgid "1202000"
+msgstr "1202000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2506
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/365618[365618]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/365618[365618]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2507
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2512
+#, no-wrap
+msgid "September 11, 2020"
+msgstr "11 сентября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2509
+#, no-wrap
+msgid "releng/12.2 branched from stable/12@r365618."
+msgstr "releng/12.2 ответвился от stable/12@r365618."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2510
+#, no-wrap
+msgid "1202500"
+msgstr "1202500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2511
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/365619[365619]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/365619[365619]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2514
+#, no-wrap
+msgid "12-STABLE after branching releng/12.2."
+msgstr "12-STABLE после ветвления releng/12.2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2515
+#, no-wrap
+msgid "1202501"
+msgstr "1202501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2516
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3584
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/365661[365661]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/365661[365661]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2517
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3585
+#, no-wrap
+msgid "September 12, 2020"
+msgstr "12 сентября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2519
+#, no-wrap
+msgid "12-STABLE after followup commits to libcompiler_rt."
+msgstr "12-STABLE после последующих коммитов в libcompiler_rt."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2520
+#, no-wrap
+msgid "1202502"
+msgstr "1202502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2521
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/365816[365816]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/365816[365816]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2522
+#, no-wrap
+msgid "September 16, 2020"
+msgstr "16 сентября 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2524
+#, no-wrap
+msgid "12-STABLE after fixing man:crunchgen[1] application build with `WARNS=6`."
+msgstr "12-STABLE после исправления сборки приложения man:crunchgen[1] с `WARNS=6`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2525
+#, no-wrap
+msgid "1202503"
+msgstr "1202503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2526
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366878[366878]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366878[366878]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2529
+#, no-wrap
+msgid "12-STABLE after populating the acquire context field of a `ww_mutex` in the LinuxKPI."
+msgstr "12-STABLE после заполнения поля контекста захвата `ww_mutex` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2530
+#, no-wrap
+msgid "1202504"
+msgstr "1202504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2531
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/367511[367511]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/367511[367511]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2534
+#, no-wrap
+msgid "12-STABLE after the addition of man:ptsname_r[3]."
+msgstr "12-STABLE после добавления man:ptsname_r[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2535
+#, no-wrap
+msgid "1202505"
+msgstr "1202505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2536
+#, no-wrap
+msgid "gitref:f3d75bed5475b15f21edf4052665b1212b548bd0[repository=\"src\",length=12]"
+msgstr "gitref:f3d75bed5475b15f21edf4052665b1212b548bd0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2537
+#, no-wrap
+msgid "December 28, 2020"
+msgstr "28 декабря 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2539
+#, no-wrap
+msgid "12-STABLE after improving handling of alternate settings in the USB stack."
+msgstr "12-STABLE после улучшения обработки альтернативных настроек в стеке USB."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2540
+#, no-wrap
+msgid "1202506"
+msgstr "1202506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2541
+#, no-wrap
+msgid "gitref:d36cc12ddfe3335ec8306bd4b393f11069551fa0[repository=\"src\",length=12]"
+msgstr "gitref:d36cc12ddfe3335ec8306bd4b393f11069551fa0[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2544
+#, no-wrap
+msgid "12-STABLE after changing the internal KAPI between the krpc and NFS."
+msgstr "12-STABLE после изменения внутреннего KAPI между krpc и NFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2545
+#, no-wrap
+msgid "1202507"
+msgstr "1202507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2546
+#, no-wrap
+msgid "gitref:1e279fe9deaea1c5e3503117dd3077dcffb1276d[repository=\"src\",length=12]"
+msgstr "gitref:1e279fe9deaea1c5e3503117dd3077dcffb1276d[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2549
+#, no-wrap
+msgid "12-STABLE after changing the internal KAPI between the nscl.ko and nfscommon.ko modules."
+msgstr "12-STABLE после изменения внутреннего KAPI между модулями nscl.ko и nfscommon.ko."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2550
+#, no-wrap
+msgid "1202508"
+msgstr "1202508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2551
+#, no-wrap
+msgid "gitref:489236b0474857b0a7a2df77c302290e12be9e7b[repository=\"src\",length=12]"
+msgstr "gitref:489236b0474857b0a7a2df77c302290e12be9e7b[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2554
+#, no-wrap
+msgid "12-STABLE after changing the internal KAPI between the krpc and nfsd modules."
+msgstr "12-STABLE после изменения внутреннего KAPI между модулями krpc и nfsd."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2555
+#, no-wrap
+msgid "1203500"
+msgstr "1203500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2556
+#, no-wrap
+msgid "gitref:f2900e784cb024e55ec0f5cd6834af5fadcb9f9a[repository=\"src\",length=12]"
+msgstr "gitref:f2900e784cb024e55ec0f5cd6834af5fadcb9f9a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2557
+#, no-wrap
+msgid "October 20, 2021"
+msgstr "20 октября 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2559
+#, no-wrap
+msgid "12-STABLE after branching releng/12.3."
+msgstr "12-STABLE после ветвления releng/12.3."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2560
+#, no-wrap
+msgid "1203501"
+msgstr "1203501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2561
+#, no-wrap
+msgid "gitref:b148c7b87148b653fdbef9c5aa591b9abcd99e26[repository=\"src\",length=12]"
+msgstr "gitref:b148c7b87148b653fdbef9c5aa591b9abcd99e26[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2562
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2567
+#, no-wrap
+msgid "December 22, 2021"
+msgstr "22 декабря 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2565
+#, no-wrap
+msgid "1203502"
+msgstr "1203502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2566
+#, no-wrap
+msgid "gitref:4772e4135cb3fe7f25531894f3b02f35ec086bda[repository=\"src\",length=12]"
+msgstr "gitref:4772e4135cb3fe7f25531894f3b02f35ec086bda[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2569
+#, no-wrap
+msgid "12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 11.0.1."
+msgstr "12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 11.0.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2570
+#, no-wrap
+msgid "1203503"
+msgstr "1203503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2571
+#, no-wrap
+msgid "gitref:e405b2dc913c99189aa9b923ed686a790253cc7e[repository=\"src\",length=12]"
+msgstr "gitref:e405b2dc913c99189aa9b923ed686a790253cc7e[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2572
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2577
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2582
+#, no-wrap
+msgid "December 25, 2021"
+msgstr "25 декабря 2021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2574
+#, no-wrap
+msgid "12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 12.0.0."
+msgstr "12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 12.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2575
+#, no-wrap
+msgid "1203504"
+msgstr "1203504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2576
+#, no-wrap
+msgid "gitref:1a398266112e73f91a4f2e2701ceefd3f2948aac[repository=\"src\",length=12]"
+msgstr "gitref:1a398266112e73f91a4f2e2701ceefd3f2948aac[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2579
+#, no-wrap
+msgid "12-STABLE after adding out-of-line LSE atomics helpers to [.filename]#libcompiler_rt.a# on aarch64."
+msgstr "12-STABLE после добавления вспомогательных функций LSE атомарных операций вне строки в [.filename]#libcompiler_rt.a# для архитектуры aarch64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2580
+#, no-wrap
+msgid "1203505"
+msgstr "1203505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2581
+#, no-wrap
+msgid "gitref:0b7be89b329e0f862c25f34abfb13c75a4d45f2a[repository=\"src\",length=12]"
+msgstr "gitref:0b7be89b329e0f862c25f34abfb13c75a4d45f2a[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2584
+#, no-wrap
+msgid "12-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 13.0.0."
+msgstr "12-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 13.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2585
+#, no-wrap
+msgid "1203506"
+msgstr "1203506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2586
+#, no-wrap
+msgid "gitref:f591279d9c93bc2ea9cd1a447c2df11d437fbc7b[repository=\"src\",length=12]"
+msgstr "gitref:f591279d9c93bc2ea9cd1a447c2df11d437fbc7b[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2587
+#, no-wrap
+msgid "February 12, 2022"
+msgstr "12 февраля 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2589
+#, no-wrap
+msgid "12-STABLE after restoring availability tradeoff of random(4)."
+msgstr "12-STABLE после восстановления компромисса доступности random(4)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2590
+#, no-wrap
+msgid "1203507"
+msgstr "1203507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2591
+#, no-wrap
+msgid "gitref:180d95e04e938328de8f2a24d16fdb5049e15262[repository=\"src\",length=12]"
+msgstr "gitref:180d95e04e938328de8f2a24d16fdb5049e15262[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2592
+#, no-wrap
+msgid "April 9, 2022"
+msgstr "9 апреля 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2594
+#, no-wrap
+msgid "12-STABLE after zlib unification."
+msgstr "12-STABLE после объединения zlib."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2595
+#, no-wrap
+msgid "1203508"
+msgstr "1203508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2596
+#, no-wrap
+msgid "gitref:6c717a28505d3e77a0c3780ca1f65eb85b538eb9[repository=\"src\",length=12]"
+msgstr "gitref:6c717a28505d3e77a0c3780ca1f65eb85b538eb9[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2599
+#, no-wrap
+msgid "12-STABLE after iflib: Allow drivers to determine which queue to TX on."
+msgstr "12-STABLE после iflib: Разрешить драйверам определять, в какую очередь передавать данные."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2600
+#, no-wrap
+msgid "1204000"
+msgstr "1204000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2601
+#, no-wrap
+msgid "gitref:fce871fe35204527a2ce08e43e1572ae9295cc00[repository=\"src\",length=12]"
+msgstr "gitref:fce871fe35204527a2ce08e43e1572ae9295cc00[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2602
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2607
+#, no-wrap
+msgid "October 20, 2022"
+msgstr "20 октября 2022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2604
+#, no-wrap
+msgid "releng/12.4 branched from stable/12."
+msgstr "releng/12.4 — ветка от stable/12."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2605
+#, no-wrap
+msgid "1204500"
+msgstr "1204500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2606
+#, no-wrap
+msgid "gitref:6a9031c5e2ba5435aa4ea08ee05c351d5bef035d[repository=\"src\",length=12]"
+msgstr "gitref:6a9031c5e2ba5435aa4ea08ee05c351d5bef035d[repository=\"src\",length=12]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2609
+#, no-wrap
+msgid "12-STABLE after branching releng/12.4."
+msgstr "12-STABLE после ветвления releng/12.4."
+
+#. Template:
+#. |12XXXXX
+#. |gitref:XXXXXXXX[repository="src",length=12]
+#. |October 30, 2021
+#. |12-STABLE after XXXXXX.
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2621
+#, no-wrap
+msgid "FreeBSD 11 Versions"
+msgstr "FreeBSD 11 Версии"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2624
+#, no-wrap
+msgid "FreeBSD 11 `__FreeBSD_version` Values"
+msgstr "FreeBSD 11 Значения `__FreeBSD_version`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2633
+#, no-wrap
+msgid "1100000"
+msgstr "1100000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2634
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/256284[256284]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/256284[256284]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2635
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3908
+#, no-wrap
+msgid "October 10, 2013"
+msgstr "10 октября 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2637
+#, no-wrap
+msgid "11.0-CURRENT."
+msgstr "11.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2638
+#, no-wrap
+msgid "1100001"
+msgstr "1100001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2639
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/256776[256776]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/256776[256776]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2640
+#, no-wrap
+msgid "October 19, 2013"
+msgstr "19 октября 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2642
+#, no-wrap
+msgid "11.0-CURRENT after addition of support for \"first boot\" [.filename]#rc.d# scripts, so ports can make use of this."
+msgstr "11.0-CURRENT после добавления поддержки сценариев [.filename]#rc.d# для \"первой загрузки\", что позволяет портам использовать эту возможность."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2643
+#, no-wrap
+msgid "1100002"
+msgstr "1100002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2644
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/257696[257696]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/257696[257696]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2645
+#, no-wrap
+msgid "November 5, 2013"
+msgstr "5 ноября 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2647
+#, no-wrap
+msgid "11.0-CURRENT after dropping support for historic ioctls."
+msgstr "11.0-CURRENT после прекращения поддержки устаревших ioctl."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2648
+#, no-wrap
+msgid "1100003"
+msgstr "1100003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2649
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/258284[258284]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/258284[258284]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2650
+#, no-wrap
+msgid "November 17, 2013"
+msgstr "17 ноября 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2652
+#, no-wrap
+msgid "11.0-CURRENT after iconv changes."
+msgstr "11.0-CURRENT после изменений в iconv."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2653
+#, no-wrap
+msgid "1100004"
+msgstr "1100004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2654
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/259424[259424]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/259424[259424]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2655
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3933
+#, no-wrap
+msgid "December 15, 2013"
+msgstr "15 декабря 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2657
+#, no-wrap
+msgid "11.0-CURRENT after the behavior change of `gss_pseudo_random` introduced in link:https://svnweb.freebsd.org/changeset/base/259286[259286]."
+msgstr "11.0-CURRENT после изменения поведения `gss_pseudo_random`, внесённого в link:https://svnweb.freebsd.org/changeset/base/259286[259286]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2658
+#, no-wrap
+msgid "1100005"
+msgstr "1100005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2659
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/260010[260010]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/260010[260010]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2660
+#, no-wrap
+msgid "December 28, 2013"
+msgstr "28 декабря 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2662
+#, no-wrap
+msgid "11.0-CURRENT after link:https://svnweb.freebsd.org/changeset/base/259951[259951] - Do not coalesce entries in man:vm_map_stack[9]."
+msgstr "11.0-CURRENT после link:https://svnweb.freebsd.org/changeset/base/259951[259951] - Не объединять записи в man:vm_map_stack[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2663
+#, no-wrap
+msgid "1100006"
+msgstr "1100006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2664
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/261246[261246]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/261246[261246]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2665
+#, no-wrap
+msgid "January 28, 2014"
+msgstr "28 января 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2667
+#, no-wrap
+msgid "11.0-CURRENT after upgrades of libelf and libdwarf."
+msgstr "11.0-CURRENT после обновления libelf и libdwarf."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2668
+#, no-wrap
+msgid "1100007"
+msgstr "1100007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2669
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/261283[261283]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/261283[261283]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2670
+#, no-wrap
+msgid "January 30, 2014"
+msgstr "30 января 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2672
+#, no-wrap
+msgid "11.0-CURRENT after upgrade of libc++ to 3.4 release."
+msgstr "11.0-CURRENT после обновления libc++ до версии 3.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2673
+#, no-wrap
+msgid "1100008"
+msgstr "1100008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2674
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/261881[261881]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/261881[261881]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2675
+#, no-wrap
+msgid "February 14, 2014"
+msgstr "February 14, 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2677
+#, no-wrap
+msgid "11.0-CURRENT after libc++ 3.4 ABI compatibility fix."
+msgstr "11.0-CURRENT после исправления совместимости ABI в libc++ 3.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2678
+#, no-wrap
+msgid "1100009"
+msgstr "1100009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2679
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/261991[261991]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/261991[261991]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2680
+#, no-wrap
+msgid "February 16, 2014"
+msgstr "16 февраля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2682
+#, no-wrap
+msgid "11.0-CURRENT after upgrade of llvm/clang to 3.4 release."
+msgstr "11.0-CURRENT после обновления llvm/clang до версии 3.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2683
+#, no-wrap
+msgid "1100010"
+msgstr "1100010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2684
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/262630[262630]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/262630[262630]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2685
+#, no-wrap
+msgid "February 28, 2014"
+msgstr "28 февраля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2687
+#, no-wrap
+msgid "11.0-CURRENT after upgrade of ncurses to 5.9 release (rev link:https://svnweb.freebsd.org/changeset/base/262629[262629])."
+msgstr "11.0-CURRENT после обновления ncurses до версии 5.9 (ревизия link:https://svnweb.freebsd.org/changeset/base/262629[262629])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2688
+#, no-wrap
+msgid "1100011"
+msgstr "1100011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2689
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263102[263102]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263102[263102]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2690
+#, no-wrap
+msgid "March 13, 2014"
+msgstr "13 марта 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2692
+#, no-wrap
+msgid "11.0-CURRENT after ABI change in struct `if_data`."
+msgstr "11.0-CURRENT после изменения ABI в структуре `if_data`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2693
+#, no-wrap
+msgid "1100012"
+msgstr "1100012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2694
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263140[263140]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263140[263140]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2695
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2700
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4646
+#, no-wrap
+msgid "March 14, 2014"
+msgstr "14 марта 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2697
+#, no-wrap
+msgid "11.0-CURRENT after removal of Novell IPX protocol support."
+msgstr "11.0-CURRENT после удаления поддержки протокола Novell IPX."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2698
+#, no-wrap
+msgid "1100013"
+msgstr "1100013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2699
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263152[263152]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263152[263152]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2702
+#, no-wrap
+msgid "11.0-CURRENT after removal of AppleTalk protocol support."
+msgstr "11.0-CURRENT после удаления поддержки протокола AppleTalk."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2703
+#, no-wrap
+msgid "1100014"
+msgstr "1100014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2704
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263235[263235]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263235[263235]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2705
+#, no-wrap
+msgid "March 16, 2014"
+msgstr "March 16, 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2707
+#, no-wrap
+msgid "11.0-CURRENT after renaming [.filename]#<sys/capability.h># to [.filename]#<sys/capsicum.h># to avoid a clash with similarly named headers in other operating systems. A compatibility header is left in place to limit build breakage, but will be deprecated in due course."
+msgstr "11.0-CURRENT после переименования [.filename]#<sys/capability.h># в [.filename]#<sys/capsicum.h># во избежание конфликта с одноименными заголовочными файлами в других операционных системах. Совместимый заголовочный файл оставлен для уменьшения количества проблем при сборке, но в будущем будет устаревшим."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2708
+#, no-wrap
+msgid "1100015"
+msgstr "1100015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2709
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263620[263620]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263620[263620]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2710
+#, no-wrap
+msgid "March 22, 2014"
+msgstr "22 марта 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2712
+#, no-wrap
+msgid "11.0-CURRENT after `cnt` rename to `vm_cnt`."
+msgstr "11.0-CURRENT после переименования `cnt` в `vm_cnt`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2713
+#, no-wrap
+msgid "1100016"
+msgstr "1100016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2714
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263660[263660]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263660[263660]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2715
+#, no-wrap
+msgid "March 23, 2014"
+msgstr "23 марта 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2717
+#, no-wrap
+msgid "11.0-CURRENT after addition of `armv6hf TARGET_ARCH`."
+msgstr "11.0-CURRENT после добавления `armv6hf TARGET_ARCH`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2718
+#, no-wrap
+msgid "1100017"
+msgstr "1100017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2719
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/264121[264121]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/264121[264121]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2720
+#, no-wrap
+msgid "April 4, 2014"
+msgstr "4 апреля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2722
+#, no-wrap
+msgid "11.0-CURRENT after GCC support for `__block` definition."
+msgstr "11.0-CURRENT после удаления поддержки GCC для определения `__block`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2723
+#, no-wrap
+msgid "1100018"
+msgstr "1100018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2724
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/264212[264212]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/264212[264212]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2725
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3958
+#, no-wrap
+msgid "April 6, 2014"
+msgstr "6 апреля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2727
+#, no-wrap
+msgid "11.0-CURRENT after support for UDP-Lite protocol (RFC 3828)."
+msgstr "11.0-CURRENT после добавления поддержки протокола UDP-Lite (RFC 3828)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2728
+#, no-wrap
+msgid "1100019"
+msgstr "1100019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2729
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3962
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4660
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/264289[264289]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/264289[264289]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2730
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3963
+#, no-wrap
+msgid "April 8, 2014"
+msgstr "8 апреля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2732
+#, no-wrap
+msgid "11.0-CURRENT after FreeBSD-SA-14:06.openssl (rev link:https://svnweb.freebsd.org/changeset/base/264265[264265])."
+msgstr "11.0-CURRENT после FreeBSD-SA-14:06.openssl (ревизия link:https://svnweb.freebsd.org/changeset/base/264265[264265])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2733
+#, no-wrap
+msgid "1100020"
+msgstr "1100020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2734
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/265215[265215]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/265215[265215]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2735
+#, no-wrap
+msgid "May 1, 2014"
+msgstr "1 мая 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2737
+#, no-wrap
+msgid "11.0-CURRENT after removing `lindev` in favor of having /dev/full by default (rev link:https://svnweb.freebsd.org/changeset/base/265212[265212])."
+msgstr "11.0-CURRENT после удаления `lindev` в пользу наличия /dev/full по умолчанию (rev link:https://svnweb.freebsd.org/changeset/base/265212[265212])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2738
+#, no-wrap
+msgid "1100021"
+msgstr "1100021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2739
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/266151[266151]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/266151[266151]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2740
+#, no-wrap
+msgid "May 6, 2014"
+msgstr "6 мая 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2742
+#, no-wrap
+msgid "11.0-CURRENT after [.filename]#src.opts.mk# changes, decoupling man:make.conf[5] from `buildworld` (rev link:https://svnweb.freebsd.org/changeset/base/265419[265419])."
+msgstr "11.0-CURRENT после изменений в [.filename]#src.opts.mk#, отделяющих man:make.conf[5] от `buildworld` (rev link:https://svnweb.freebsd.org/changeset/base/265419[265419])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2743
+#, no-wrap
+msgid "1100022"
+msgstr "1100022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2744
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/266904[266904]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/266904[266904]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2745
+#, no-wrap
+msgid "May 30, 2014"
+msgstr "30 мая 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2747
+#, no-wrap
+msgid "11.0-CURRENT after changes to man:strcasecmp[3], moving man:strcasecmp_l[3] and man:strncasecmp_l[3] from [.filename]#<string.h># to [.filename]#<strings.h># for POSIX 2008 compliance (rev link:https://svnweb.freebsd.org/changeset/base/266865[266865])."
+msgstr "11.0-CURRENT после изменений в man:strcasecmp[3], перемещении man:strcasecmp_l[3] и man:strncasecmp_l[3] из [.filename]#<string.h># в [.filename]#<strings.h># для соответствия POSIX 2008 (rev link:https://svnweb.freebsd.org/changeset/base/266865[266865])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2748
+#, no-wrap
+msgid "1100023"
+msgstr "1100023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2749
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/267440[267440]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/267440[267440]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2750
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3978
+#, no-wrap
+msgid "June 13, 2014"
+msgstr "13 июня 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2752
+#, no-wrap
+msgid "11.0-CURRENT after the CUSE library and kernel module have been attached to the build by default."
+msgstr "11.0-CURRENT после подключения библиотеки CUSE и модуля ядра к сборке по умолчанию."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2753
+#, no-wrap
+msgid "1100024"
+msgstr "1100024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2754
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/267992[267992]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/267992[267992]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2755
+#, no-wrap
+msgid "June 27, 2014"
+msgstr "27 июня 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2757
+#, no-wrap
+msgid "11.0-CURRENT after man:sysctl[3] API change."
+msgstr "11.0-CURRENT после изменения API man:sysctl[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2758
+#, no-wrap
+msgid "1100025"
+msgstr "1100025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2759
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/268066[268066]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/268066[268066]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2760
+#, no-wrap
+msgid "June 30, 2014"
+msgstr "30 июня 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2762
+#, no-wrap
+msgid "11.0-CURRENT after man:regex[3] library update to add \">\" and \"<\" delimiters."
+msgstr "11.0-CURRENT после обновления библиотеки man:regex[3] для добавления разделителей \">\" и \"<\"."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2763
+#, no-wrap
+msgid "1100026"
+msgstr "1100026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2764
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/268118[268118]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/268118[268118]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2765
+#, no-wrap
+msgid "July 1, 2014"
+msgstr "1 июля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2767
+#, no-wrap
+msgid "11.0-CURRENT after the internal interface between the NFS modules, including the krpc, was changed by (rev link:https://svnweb.freebsd.org/changeset/base/268115[268115])."
+msgstr "11.0-CURRENT после изменения внутреннего интерфейса между модулями NFS, включая krpc, в (rev link:https://svnweb.freebsd.org/changeset/base/268115[268115])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2768
+#, no-wrap
+msgid "1100027"
+msgstr "1100027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2769
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/268441[268441]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/268441[268441]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2770
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3983
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4681
+#, no-wrap
+msgid "July 8, 2014"
+msgstr "8 июля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2772
+#, no-wrap
+msgid "11.0-CURRENT after FreeBSD-SA-14:17.kmem (rev link:https://svnweb.freebsd.org/changeset/base/268431[268431])."
+msgstr "11.0-CURRENT после FreeBSD-SA-14:17.kmem (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/268431[268431])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2773
+#, no-wrap
+msgid "1100028"
+msgstr "1100028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2774
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/268945[268945]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/268945[268945]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2775
+#, no-wrap
+msgid "July 21, 2014"
+msgstr "21 июля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2777
+#, no-wrap
+msgid "11.0-CURRENT after man:hdestroy[3] compliance fix changed ABI."
+msgstr "11.0-CURRENT после исправления соответствия man:hdestroy[3] изменился ABI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2778
+#, no-wrap
+msgid "1100029"
+msgstr "1100029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2779
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/270173[270173]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/270173[270173]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2780
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3993
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3998
+#, no-wrap
+msgid "August 3, 2014"
+msgstr "3 августа 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2782
+#, no-wrap
+msgid "11.0-CURRENT after `SOCK_DGRAM` bug fix (rev link:https://svnweb.freebsd.org/changeset/base/269489[269489])."
+msgstr "11.0-CURRENT после исправления ошибки `SOCK_DGRAM` (rev link:https://svnweb.freebsd.org/changeset/base/269489[269489])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2783
+#, no-wrap
+msgid "1100030"
+msgstr "1100030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2784
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/270929[270929]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/270929[270929]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2785
+#, no-wrap
+msgid "September 1, 2014"
+msgstr "1 сентября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2787
+#, no-wrap
+msgid "11.0-CURRENT after `SOCK_RAW` sockets were changed to not modify packets at all."
+msgstr "11.0-CURRENT после того, как сокеты `SOCK_RAW` были изменены так, чтобы вообще не модифицировать пакеты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2788
+#, no-wrap
+msgid "1100031"
+msgstr "1100031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2789
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4002
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4690
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5478
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/271341[271341]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/271341[271341]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2790
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2800
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4003
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4691
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5479
+#, no-wrap
+msgid "September 9, 2014"
+msgstr "9 сентября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2792
+#, no-wrap
+msgid "11.0-CURRENT after FreeBSD-SA-14:18.openssl (rev link:https://svnweb.freebsd.org/changeset/base/269686[269686])."
+msgstr "11.0-CURRENT после FreeBSD-SA-14:18.openssl (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/269686[269686])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2793
+#, no-wrap
+msgid "1100032"
+msgstr "1100032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2794
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/271438[271438]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/271438[271438]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2795
+#, no-wrap
+msgid "September 11, 2014"
+msgstr "11 сентября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2797
+#, no-wrap
+msgid "11.0-CURRENT after API changes to `ifa_ifwithbroadaddr`, `ifa_ifwithdstaddr`, `ifa_ifwithnet`, and `ifa_ifwithroute`."
+msgstr "11.0-CURRENT после изменений API в `ifa_ifwithbroadaddr`, `ifa_ifwithdstaddr`, `ifa_ifwithnet` и `ifa_ifwithroute`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2798
+#, no-wrap
+msgid "1100033"
+msgstr "1100033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2799
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/271657[271657]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/271657[271657]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2802
+#, no-wrap
+msgid "11.0-CURRENT after changing `access`, `eaccess`, and `faccessat` to validate the mode argument."
+msgstr "11.0-CURRENT после изменения `access`, `eaccess` и `faccessat` для проверки аргумента mode."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2803
+#, no-wrap
+msgid "1100034"
+msgstr "1100034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2804
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4007
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4695
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5483
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/271686[271686]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/271686[271686]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2805
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4008
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4696
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5484
+#, no-wrap
+msgid "September 16, 2014"
+msgstr "16 сентября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2807
+#, no-wrap
+msgid "11.0-CURRENT after FreeBSD-SA-14:19.tcp (rev link:https://svnweb.freebsd.org/changeset/base/271666[271666])."
+msgstr "11.0-CURRENT после FreeBSD-SA-14:19.tcp (rev link:https://svnweb.freebsd.org/changeset/base/271666[271666])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2808
+#, no-wrap
+msgid "1100035"
+msgstr "1100035"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2809
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/271705[271705]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/271705[271705]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2810
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2815
+#, no-wrap
+msgid "September 17, 2014"
+msgstr "17 сентября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2812
+#, no-wrap
+msgid "11.0-CURRENT after i915 HW context support."
+msgstr "11.0-CURRENT после добавления поддержки аппаратного контекста i915."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2813
+#, no-wrap
+msgid "1100036"
+msgstr "1100036"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2814
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/271724[271724]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/271724[271724]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2817
+#, no-wrap
+msgid "Version bump to have ABI note distinguish binaries ready for strict man:mmap[2] flags checking (rev link:https://svnweb.freebsd.org/changeset/base/271724[271724])."
+msgstr "Увеличение версии для различия в ABI-примечании бинарных файлов, готовых к строгой проверке флагов man:mmap[2] (изменение link:https://svnweb.freebsd.org/changeset/base/271724[271724])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2818
+#, no-wrap
+msgid "1100037"
+msgstr "1100037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2819
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/272674[272674]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/272674[272674]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2820
+#, no-wrap
+msgid "October 6, 2014"
+msgstr "6 октября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2822
+#, no-wrap
+msgid "11.0-CURRENT after addition of man:explicit_bzero[3] (rev link:https://svnweb.freebsd.org/changeset/base/272673[272673])."
+msgstr "11.0-CURRENT после добавления man:explicit_bzero[3] (изменение:https://svnweb.freebsd.org/changeset/base/272673[272673])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2823
+#, no-wrap
+msgid "1100038"
+msgstr "1100038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2824
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/272951[272951]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/272951[272951]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2825
+#, no-wrap
+msgid "October 11, 2014"
+msgstr "October 11, 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2827
+#, no-wrap
+msgid "11.0-CURRENT after cleanup of TCP wrapper headers."
+msgstr "11.0-CURRENT после очистки заголовков TCP wrapper."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2828
+#, no-wrap
+msgid "1100039"
+msgstr "1100039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2829
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/273250[273250]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/273250[273250]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2830
+#, no-wrap
+msgid "October 18, 2014"
+msgstr "18 октября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2832
+#, no-wrap
+msgid "11.0-CURRENT after removal of `MAP_RENAME` and `MAP_NORESERVE`."
+msgstr "11.0-CURRENT после удаления `MAP_RENAME` и `MAP_NORESERVE`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2833
+#, no-wrap
+msgid "1100040"
+msgstr "1100040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2834
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4027
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4700
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5488
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/273432[273432]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/273432[273432]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2835
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4028
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4701
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5489
+#, no-wrap
+msgid "October 21, 2014"
+msgstr "21 октября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2837
+#, no-wrap
+msgid "11.0-CURRENT after FreeBSD-SA-14:23 (rev link:https://svnweb.freebsd.org/changeset/base/273146[273146])."
+msgstr "11.0-CURRENT после FreeBSD-SA-14:23 (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/273146[273146])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2838
+#, no-wrap
+msgid "1100041"
+msgstr "1100041"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2839
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/273875[273875]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/273875[273875]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2840
+#, no-wrap
+msgid "October 30, 2014"
+msgstr "30 октября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2842
+#, no-wrap
+msgid "11.0-CURRENT after API changes to `syscall_register`, `syscall32_register`, `syscall_register_helper` and `syscall32_register_helper` (rev link:https://svnweb.freebsd.org/changeset/base/273707[273707])."
+msgstr "11.0-CURRENT после изменений API в `syscall_register`, `syscall32_register`, `syscall_register_helper` и `syscall32_register_helper` (rev link:https://svnweb.freebsd.org/changeset/base/273707[273707])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2843
+#, no-wrap
+msgid "1100042"
+msgstr "1100042"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2844
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/274046[274046]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/274046[274046]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2845
+#, no-wrap
+msgid "November 3, 2014"
+msgstr "3 ноября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2847
+#, no-wrap
+msgid "11.0-CURRENT after a change to `struct tcpcb`."
+msgstr "11.0-CURRENT после изменения `struct tcpcb`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2848
+#, no-wrap
+msgid "1100043"
+msgstr "1100043"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2849
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/274085[274085]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/274085[274085]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2850
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2855
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2860
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4033
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4706
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5494
+#, no-wrap
+msgid "November 4, 2014"
+msgstr "4 ноября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2852
+#, no-wrap
+msgid "11.0-CURRENT after enabling man:vt[4] by default."
+msgstr "11.0-CURRENT после включения man:vt[4] по умолчанию."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2853
+#, no-wrap
+msgid "1100044"
+msgstr "1100044"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2854
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/274116[274116]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/274116[274116]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2857
+#, no-wrap
+msgid "11.0-CURRENT after adding new libraries/utilities (`dpv` and `figpar`) for data throughput visualization."
+msgstr "11.0-CURRENT после добавления новых библиотек/утилит (`dpv` и `figpar`) для визуализации пропускной способности данных."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2858
+#, no-wrap
+msgid "1100045"
+msgstr "1100045"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2859
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4032
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4705
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5493
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/274162[274162]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/274162[274162]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2862
+#, no-wrap
+msgid "11.0-CURRENT after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25."
+msgstr "11.0-CURRENT после FreeBSD-SA-14:23, FreeBSD-SA-14:24 и FreeBSD-SA-14:25."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2863
+#, no-wrap
+msgid "1100046"
+msgstr "1100046"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2864
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/274470[274470]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/274470[274470]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2865
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2870
+#, no-wrap
+msgid "November 13, 2014"
+msgstr "13 ноября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2867
+#, no-wrap
+msgid "11.0-CURRENT after `kern_poll` signature change (rev link:https://svnweb.freebsd.org/changeset/base/274462[274462])."
+msgstr "11.0-CURRENT после изменения сигнатуры `kern_poll` (rev link:https://svnweb.freebsd.org/changeset/base/274462[274462])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2868
+#, no-wrap
+msgid "1100047"
+msgstr "1100047"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2869
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/274476[274476]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/274476[274476]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2872
+#, no-wrap
+msgid "11.0-CURRENT after removal of no-at version of VFS syscalls helpers, like `kern_open`."
+msgstr "11.0-CURRENT после удаления no-at версий вспомогательных системных вызовов VFS, таких как `kern_open`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2873
+#, no-wrap
+msgid "1100048"
+msgstr "1100048"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2874
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/275358[275358]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/275358[275358]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2875
+#, no-wrap
+msgid "December 1, 2014"
+msgstr "1 декабря 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2877
+#, no-wrap
+msgid "11.0-CURRENT after starting the process of removing the use of the deprecated \"M_FLOWID\" flag from the network code."
+msgstr "11.0-CURRENT после начала процесса удаления использования устаревшего флага \"M_FLOWID\" из сетевого кода."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2878
+#, no-wrap
+msgid "1100049"
+msgstr "1100049"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2879
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/275633[275633]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/275633[275633]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2880
+#, no-wrap
+msgid "December 9, 2014"
+msgstr "9 декабря 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2882
+#, no-wrap
+msgid "11.0-CURRENT after importing an important fix to the LLVM vectorizer, which could lead to buffer overruns in some cases."
+msgstr "11.0-CURRENT после импорта важного исправления в векторизатор LLVM, которое в некоторых случаях могло приводить к переполнению буфера."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2883
+#, no-wrap
+msgid "1100050"
+msgstr "1100050"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2884
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/275732[275732]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/275732[275732]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2885
+#, no-wrap
+msgid "December 12, 2014"
+msgstr "12 декабря 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2887
+#, no-wrap
+msgid "11.0-CURRENT after adding AES-ICM and AES-GCM to OpenCrypto."
+msgstr "11.0-CURRENT после добавления AES-ICM и AES-GCM в OpenCrypto."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2888
+#, no-wrap
+msgid "1100051"
+msgstr "1100051"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2889
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/276096[276096]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/276096[276096]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2890
+#, no-wrap
+msgid "December 23, 2014"
+msgstr "December 23, 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2892
+#, no-wrap
+msgid "11.0-CURRENT after removing old NFS client and server code from the kernel."
+msgstr "11.0-CURRENT после удаления старого кода клиента и сервера NFS из ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2893
+#, no-wrap
+msgid "1100052"
+msgstr "1100052"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2894
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/276479[276479]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/276479[276479]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2895
+#, no-wrap
+msgid "December 31, 2014"
+msgstr "31 декабря 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2897
+#, no-wrap
+msgid "11.0-CURRENT after upgrade of clang, llvm and lldb to 3.5.0 release."
+msgstr "11.0-CURRENT после обновления clang, llvm и lldb до версии 3.5.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2898
+#, no-wrap
+msgid "1100053"
+msgstr "1100053"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2899
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/276781[276781]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/276781[276781]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2900
+#, no-wrap
+msgid "January 7, 2015"
+msgstr "7 января 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2902
+#, no-wrap
+msgid "11.0-CURRENT after man:MCLGET[9] gained a return value (rev link:https://svnweb.freebsd.org/changeset/base/276750[276750])."
+msgstr "11.0-CURRENT после того, как man:MCLGET[9] получил возвращаемое значение (rev link:https://svnweb.freebsd.org/changeset/base/276750[276750])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2903
+#, no-wrap
+msgid "1100054"
+msgstr "1100054"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2904
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/277213[277213]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/277213[277213]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2905
+#, no-wrap
+msgid "January 15, 2015"
+msgstr "15 января 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2907
+#, no-wrap
+msgid "11.0-CURRENT after rewrite of callout subsystem."
+msgstr "11.0-CURRENT после переработки подсистемы вызовов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2908
+#, no-wrap
+msgid "1100055"
+msgstr "1100055"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2909
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/277528[277528]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/277528[277528]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2910
+#, no-wrap
+msgid "January 22, 2015"
+msgstr "22 января 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2912
+#, no-wrap
+msgid "11.0-CURRENT after reverting callout changes in link:https://svnweb.freebsd.org/changeset/base/277213[277213]."
+msgstr "11.0-CURRENT после отмены изменений callout в link:https://svnweb.freebsd.org/changeset/base/277213[277213]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2913
+#, no-wrap
+msgid "1100056"
+msgstr "1100056"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2914
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/277610[277610]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/277610[277610]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2915
+#, no-wrap
+msgid "January 23, 2015"
+msgstr "23 января 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2917
+#, no-wrap
+msgid "11.0-CURRENT after addition of `futimens` and `utimensat` system calls."
+msgstr "11.0-CURRENT после добавления системных вызовов `futimens` и `utimensat`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2918
+#, no-wrap
+msgid "1100057"
+msgstr "1100057"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2919
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/277897[277897]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/277897[277897]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2920
+#, no-wrap
+msgid "January 29, 2015"
+msgstr "29 января 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2922
+#, no-wrap
+msgid "11.0-CURRENT after removal of `d_thread_t`."
+msgstr "11.0-CURRENT после удаления `d_thread_t`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2923
+#, no-wrap
+msgid "1100058"
+msgstr "1100058"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2924
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/278228[278228]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/278228[278228]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2925
+#, no-wrap
+msgid "February 5, 2015"
+msgstr "5 февраля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2927
+#, no-wrap
+msgid "11.0-CURRENT after addition of support for probing the SCSI VPD Extended Inquiry page (0x86)."
+msgstr "11.0-CURRENT после добавления поддержки запроса страницы расширенного запроса SCSI VPD (0x86)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2928
+#, no-wrap
+msgid "1100059"
+msgstr "1100059"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2929
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/278442[278442]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/278442[278442]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2930
+#, no-wrap
+msgid "February 9, 2015"
+msgstr "9 февраля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2932
+#, no-wrap
+msgid "11.0-CURRENT after import of xz 5.2.0, which added multi-threaded compression and lzma gained libthr dependency (rev link:https://svnweb.freebsd.org/changeset/base/278433[278433])."
+msgstr "11.0-CURRENT после импорта xz 5.2.0, который добавил многопоточное сжатие, и lzma получила зависимость от libthr (rev link:https://svnweb.freebsd.org/changeset/base/278433[278433])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2933
+#, no-wrap
+msgid "1100060"
+msgstr "1100060"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2934
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/278846[278846]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/278846[278846]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2935
+#, no-wrap
+msgid "February 16, 2015"
+msgstr "16 февраля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2937
+#, no-wrap
+msgid "11.0-CURRENT after forwarding `FBIO_BLANK` to framebuffer clients."
+msgstr "11.0-CURRENT после пересылки `FBIO_BLANK` клиентам фреймбуфера."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2938
+#, no-wrap
+msgid "1100061"
+msgstr "1100061"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2939
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/278964[278964]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/278964[278964]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2940
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4063
+#, no-wrap
+msgid "February 18, 2015"
+msgstr "18 февраля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2942
+#, no-wrap
+msgid "11.0-CURRENT after `CDAI_FLAG_NONE` addition."
+msgstr "11.0-CURRENT после добавления `CDAI_FLAG_NONE`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2943
+#, no-wrap
+msgid "1100062"
+msgstr "1100062"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2944
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/279221[279221]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/279221[279221]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2945
+#, no-wrap
+msgid "February 23, 2015"
+msgstr "23 февраля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2947
+#, no-wrap
+msgid "11.0-CURRENT after man:mtio[4] and man:sa[4] API and man:ioctl[2] additions."
+msgstr "11.0-CURRENT после добавлений API man:mtio[4] и man:sa[4], а также man:ioctl[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2948
+#, no-wrap
+msgid "1100063"
+msgstr "1100063"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2949
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/279728[279728]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/279728[279728]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2950
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2955
+#, no-wrap
+msgid "March 7, 2015"
+msgstr "7 марта 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2952
+#, no-wrap
+msgid "11.0-CURRENT after adding mutex support to the `pps_ioctl()` API in the kernel."
+msgstr "11.0-CURRENT после добавления поддержки мьютексов в API `pps_ioctl()` в ядре."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2953
+#, no-wrap
+msgid "1100064"
+msgstr "1100064"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2954
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/279729[279729]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/279729[279729]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2957
+#, no-wrap
+msgid "11.0-CURRENT after adding PPS support to USB serial drivers."
+msgstr "11.0-CURRENT после добавления поддержки PPS в драйверы USB-последовательных портов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2958
+#, no-wrap
+msgid "1100065"
+msgstr "1100065"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2959
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/280031[280031]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/280031[280031]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2960
+#, no-wrap
+msgid "March 15, 2015"
+msgstr "15 марта 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2962
+#, no-wrap
+msgid "11.0-CURRENT after upgrading clang, llvm and lldb to 3.6.0."
+msgstr "11.0-CURRENT после обновления clang, llvm и lldb до версии 3.6.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2963
+#, no-wrap
+msgid "1100066"
+msgstr "1100066"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2964
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/280306[280306]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/280306[280306]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2965
+#, no-wrap
+msgid "March 20, 2015"
+msgstr "20 марта 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2967
+#, no-wrap
+msgid "11.0-CURRENT after removal of SSLv2 support from OpenSSL."
+msgstr "11.0-CURRENT после удаления поддержки SSLv2 из OpenSSL."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2968
+#, no-wrap
+msgid "1100067"
+msgstr "1100067"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2969
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/280630[280630]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/280630[280630]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2970
+#, no-wrap
+msgid "March 25, 2015"
+msgstr "25 марта 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2972
+#, no-wrap
+msgid "11.0-CURRENT after removal of SSLv2 support from man:fetch[1] and man:fetch[3]."
+msgstr "11.0-CURRENT после удаления поддержки SSLv2 из man:fetch[1] и man:fetch[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2973
+#, no-wrap
+msgid "1100068"
+msgstr "1100068"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2974
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/281172[281172]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/281172[281172]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2975
+#, no-wrap
+msgid "April 6, 2015"
+msgstr "6 апреля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2977
+#, no-wrap
+msgid "11.0-CURRENT after change to net.inet6.ip6.mif6table sysctl."
+msgstr "11.0-CURRENT после изменения системной настройки net.inet6.ip6.mif6table."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2978
+#, no-wrap
+msgid "1100069"
+msgstr "1100069"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2979
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/281550[281550]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/281550[281550]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2980
+#, no-wrap
+msgid "April 15, 2015"
+msgstr "15 апреля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2982
+#, no-wrap
+msgid "11.0-CURRENT after removal of const qualifier from man:iconv[3]."
+msgstr "11.0-CURRENT после удаления квалификатора const из man:iconv[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2983
+#, no-wrap
+msgid "1100070"
+msgstr "1100070"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2984
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/281613[281613]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/281613[281613]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2985
+#, no-wrap
+msgid "April 16, 2015"
+msgstr "16 апреля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2987
+#, no-wrap
+msgid "11.0-CURRENT after moving ALTQ from [.filename]#contrib# to [.filename]#net/altq#."
+msgstr "11.0-CURRENT после перемещения ALTQ из [.filename]#contrib# в [.filename]#net/altq#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2988
+#, no-wrap
+msgid "1100071"
+msgstr "1100071"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2989
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/282256[282256]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/282256[282256]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2990
+#, no-wrap
+msgid "April 29, 2015"
+msgstr "29 апреля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2992
+#, no-wrap
+msgid "11.0-CURRENT after API/ABI change to man:smb[4] (rev link:https://svnweb.freebsd.org/changeset/base/281985[281985])."
+msgstr "11.0-CURRENT после изменения API/ABI в man:smb[4] (rev link:https://svnweb.freebsd.org/changeset/base/281985[281985])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2993
+#, no-wrap
+msgid "1100072"
+msgstr "1100072"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2994
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/282319[282319]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/282319[282319]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2995
+#, no-wrap
+msgid "May 1, 2015"
+msgstr "1 мая 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2997
+#, no-wrap
+msgid "11.0-CURRENT after adding man:reallocarray[3] in libc (rev link:https://svnweb.freebsd.org/changeset/base/282314[282314])."
+msgstr "11.0-CURRENT после добавления man:reallocarray[3] в libc (изменение link:https://svnweb.freebsd.org/changeset/base/282314[282314])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2998
+#, no-wrap
+msgid "1100073"
+msgstr "1100073"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:2999
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/282650[282650]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/282650[282650]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3000
+#, no-wrap
+msgid "May 8, 2015"
+msgstr "8 мая 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3002
+#, no-wrap
+msgid "11.0-CURRENT after extending the maximum number of allowed PCM channels in a PCM stream to 127 and decreasing the maximum number of sub-channels to 1."
+msgstr "11.0-CURRENT после увеличения максимального количества разрешённых PCM-каналов в PCM-потоке до 127 и уменьшения максимального количества подканалов до 1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3003
+#, no-wrap
+msgid "1100074"
+msgstr "1100074"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3004
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/283526[283526]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/283526[283526]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3005
+#, no-wrap
+msgid "May 25, 2015"
+msgstr "25 мая 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3007
+#, no-wrap
+msgid "11.0-CURRENT after adding preliminary support for x86-64 Linux binaries (rev link:https://svnweb.freebsd.org/changeset/base/283424[283424]), and upgrading clang and llvm to 3.6.1."
+msgstr "11.0-CURRENT после добавления предварительной поддержки бинарных файлов Linux для x86-64 (rev link:https://svnweb.freebsd.org/changeset/base/283424[283424]) и обновления clang и llvm до версии 3.6.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3008
+#, no-wrap
+msgid "1100075"
+msgstr "1100075"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3009
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/283623[283623]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/283623[283623]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3010
+#, no-wrap
+msgid "May 27, 2015"
+msgstr "27 мая 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3012
+#, no-wrap
+msgid "11.0-CURRENT after `dounmount()` requiring a reference on the passed struct mount (rev link:https://svnweb.freebsd.org/changeset/base/283602[283602])."
+msgstr "11.0-CURRENT после `dounmount()`, требующей ссылки на переданную структуру mount (изменение rev link:https://svnweb.freebsd.org/changeset/base/283602[283602])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3013
+#, no-wrap
+msgid "1100076"
+msgstr "1100076"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3014
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/283983[283983]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/283983[283983]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3015
+#, no-wrap
+msgid "June 4, 2015"
+msgstr "4 июня 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3017
+#, no-wrap
+msgid "11.0-CURRENT after disabled generation of legacy formatted password databases entries by default."
+msgstr "11.0-CURRENT после отключения генерации записей в устаревших форматах баз данных паролей по умолчанию."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3018
+#, no-wrap
+msgid "1100077"
+msgstr "1100077"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3019
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/284233[284233]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/284233[284233]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3020
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4113
+#, no-wrap
+msgid "June 10, 2015"
+msgstr "10 июня 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3022
+#, no-wrap
+msgid "11.0-CURRENT after API changes to `lim_cur`, `lim_max`, and `lim_rlimit` (rev link:https://svnweb.freebsd.org/changeset/base/284215[284215])."
+msgstr "11.0-CURRENT после изменений API в `lim_cur`, `lim_max` и `lim_rlimit` (rev link:https://svnweb.freebsd.org/changeset/base/284215[284215])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3023
+#, no-wrap
+msgid "1100078"
+msgstr "1100078"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3024
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/286672[286672]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/286672[286672]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3025
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3240
+#, no-wrap
+msgid "August 12, 2015"
+msgstr "12 августа 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3027
+#, no-wrap
+msgid "11.0-CURRENT after man:crunchgen[1] changes from link:https://svnweb.freebsd.org/changeset/base/284356[284356] to link:https://svnweb.freebsd.org/changeset/base/285986[285986]."
+msgstr "11.0-CURRENT после изменений man:crunchgen[1] в ревизиях link:https://svnweb.freebsd.org/changeset/base/284356[284356] до link:https://svnweb.freebsd.org/changeset/base/285986[285986]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3028
+#, no-wrap
+msgid "1100079"
+msgstr "1100079"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3029
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/286874[286874]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/286874[286874]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3030
+#, no-wrap
+msgid "August 18, 2015"
+msgstr "18 августа 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3032
+#, no-wrap
+msgid "11.0-CURRENT after import of jemalloc 4.0.0 (rev link:https://svnweb.freebsd.org/changeset/base/286866[286866])."
+msgstr "11.0-CURRENT после импорта jemalloc 4.0.0 (ревизия link:https://svnweb.freebsd.org/changeset/base/286866[286866])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3033
+#, no-wrap
+msgid "1100080"
+msgstr "1100080"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3034
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/288943[288943]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/288943[288943]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3035
+#, no-wrap
+msgid "October 5, 2015"
+msgstr "5 октября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3037
+#, no-wrap
+msgid "11.0-CURRENT after upgrading clang, llvm, lldb, compiler-rt and libc++ to 3.7.0."
+msgstr "11.0-CURRENT после обновления clang, llvm, lldb, compiler-rt и libc++ до версии 3.7.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3038
+#, no-wrap
+msgid "1100081"
+msgstr "1100081"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3039
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/289415[289415]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/289415[289415]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3040
+#, no-wrap
+msgid "October 16, 2015"
+msgstr "16 октября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3042
+#, no-wrap
+msgid "11.0-CURRENT after `undating` ZFS to support resumable send/receive (rev link:https://svnweb.freebsd.org/changeset/base/289362[289362])."
+msgstr "11.0-CURRENT после `обновления` ZFS для поддержки возобновляемой отправки/приёмки (rev link:https://svnweb.freebsd.org/changeset/base/289362[289362])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3043
+#, no-wrap
+msgid "1100082"
+msgstr "1100082"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3044
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/289594[289594]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/289594[289594]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3045
+#, no-wrap
+msgid "October 19, 2015"
+msgstr "19 октября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3047
+#, no-wrap
+msgid "11.0-CURRENT after Linux KPI updates."
+msgstr "11.0-CURRENT после обновлений Linux KPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3048
+#, no-wrap
+msgid "1100083"
+msgstr "1100083"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3049
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/289749[289749]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/289749[289749]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3050
+#, no-wrap
+msgid "October 22, 2015"
+msgstr "October 22, 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3052
+#, no-wrap
+msgid "11.0-CURRENT after renaming [.filename]#linuxapi.ko# to [.filename]#linuxkpi.ko#."
+msgstr "11.0-CURRENT после переименования [.filename]#linuxapi.ko# в [.filename]#linuxkpi.ko#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3053
+#, no-wrap
+msgid "1100084"
+msgstr "1100084"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3054
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/290135[290135]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/290135[290135]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3055
+#, no-wrap
+msgid "October 29, 2015"
+msgstr "29 октября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3057
+#, no-wrap
+msgid "11.0-CURRENT after moving the LinuxKPI module into the default kernel build."
+msgstr "11.0-CURRENT после перемещения модуля LinuxKPI в стандартную сборку ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3058
+#, no-wrap
+msgid "1100085"
+msgstr "1100085"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3059
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/290207[290207]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/290207[290207]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3060
+#, no-wrap
+msgid "October 30, 2015"
+msgstr "30 октября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3062
+#, no-wrap
+msgid "11.0-CURRENT after import of OpenSSL 1.0.2d."
+msgstr "11.0-CURRENT после импорта OpenSSL 1.0.2d."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3063
+#, no-wrap
+msgid "1100086"
+msgstr "1100086"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3064
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/290275[290275]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/290275[290275]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3065
+#, no-wrap
+msgid "November 2, 2015"
+msgstr "2 ноября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3067
+#, no-wrap
+msgid "11.0-CURRENT after making man:figpar[3] macros more unique."
+msgstr "11.0-CURRENT после изменения макросов man:figpar[3] для большей уникальности."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3068
+#, no-wrap
+msgid "1100087"
+msgstr "1100087"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3069
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/290479[290479]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/290479[290479]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3070
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3075
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3080
+#, no-wrap
+msgid "November 7, 2015"
+msgstr "7 ноября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3072
+#, no-wrap
+msgid "11.0-CURRENT after changing man:sysctl_add_oid[9]'s ABI."
+msgstr "11.0-CURRENT после изменения ABI man:sysctl_add_oid[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3073
+#, no-wrap
+msgid "1100088"
+msgstr "1100088"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3074
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/290495[290495]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/290495[290495]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3077
+#, no-wrap
+msgid "11.0-CURRENT after string collation and locales rework."
+msgstr "11.0-CURRENT после переработки сортировки строк и локалей."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3078
+#, no-wrap
+msgid "1100089"
+msgstr "1100089"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3079
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/290505[290505]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/290505[290505]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3082
+#, no-wrap
+msgid "11.0-CURRENT after API change to man:sysctl_add_oid[9] (rev link:https://svnweb.freebsd.org/changeset/base/290475[290475])."
+msgstr "11.0-CURRENT после изменения API в man:sysctl_add_oid[9] (rev link:https://svnweb.freebsd.org/changeset/base/290475[290475])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3083
+#, no-wrap
+msgid "1100090"
+msgstr "1100090"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3084
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/290715[290715]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/290715[290715]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3085
+#, no-wrap
+msgid "November 10, 2015"
+msgstr "10 ноября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3087
+#, no-wrap
+msgid "11.0-CURRENT after API change to callout_stop macro; (rev link:https://svnweb.freebsd.org/changeset/base/290664[290664])."
+msgstr "11.0-CURRENT после изменения API для макроса callout_stop; (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/290664[290664])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3088
+#, no-wrap
+msgid "1100091"
+msgstr "1100091"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3089
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/291537[291537]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/291537[291537]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3090
+#, no-wrap
+msgid "November 30, 2015"
+msgstr "30 ноября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3092
+#, no-wrap
+msgid "11.0-CURRENT after changing the interface between the [.filename]#nfsd.ko# and [.filename]#nfscommon.ko# modules in link:https://svnweb.freebsd.org/changeset/base/291527[291527]."
+msgstr "11.0-CURRENT после изменения интерфейса между модулями [.filename]#nfsd.ko# и [.filename]#nfscommon.ko# в link:https://svnweb.freebsd.org/changeset/base/291527[291527]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3093
+#, no-wrap
+msgid "1100092"
+msgstr "1100092"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3094
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/292499[292499]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/292499[292499]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3095
+#, no-wrap
+msgid "December 19, 2015"
+msgstr "19 декабря 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3097
+#, no-wrap
+msgid "11.0-CURRENT after removal of `vm_pageout_grow_cache` (rev link:https://svnweb.freebsd.org/changeset/base/292469[292469])."
+msgstr "11.0-CURRENT после удаления `vm_pageout_grow_cache` (изменение:https://svnweb.freebsd.org/changeset/base/292469[292469])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3098
+#, no-wrap
+msgid "1100093"
+msgstr "1100093"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3099
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/292966[292966]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/292966[292966]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3100
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4153
+#, no-wrap
+msgid "December 30, 2015"
+msgstr "30 декабря 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3102
+#, no-wrap
+msgid "11.0-CURRENT after removal of sys/crypto/sha2.h (rev link:https://svnweb.freebsd.org/changeset/base/292782[292782])."
+msgstr "11.0-CURRENT после удаления sys/crypto/sha2.h (изменение link:https://svnweb.freebsd.org/changeset/base/292782[292782])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3103
+#, no-wrap
+msgid "1100094"
+msgstr "1100094"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3104
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/294086[294086]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/294086[294086]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3105
+#, no-wrap
+msgid "January 15, 2016"
+msgstr "15 января 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3107
+#, no-wrap
+msgid "11.0-CURRENT after LinuxKPI PCI changes (rev link:https://svnweb.freebsd.org/changeset/base/294086[294086])."
+msgstr "11.0-CURRENT после изменений LinuxKPI PCI (rev link:https://svnweb.freebsd.org/changeset/base/294086[294086])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3108
+#, no-wrap
+msgid "1100095"
+msgstr "1100095"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3109
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/294327[294327]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/294327[294327]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3110
+#, no-wrap
+msgid "January 19, 2016"
+msgstr "19 января 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3112
+#, no-wrap
+msgid "11.0-CURRENT after LRO optimizations."
+msgstr "11.0-CURRENT после оптимизаций LRO."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3113
+#, no-wrap
+msgid "1100096"
+msgstr "1100096"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3114
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/294505[294505]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/294505[294505]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3115
+#, no-wrap
+msgid "January 21, 2016"
+msgstr "21 января 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3117
+#, no-wrap
+msgid "11.0-CURRENT after LinuxKPI idr_* additions."
+msgstr "11.0-CURRENT после добавления LinuxKPI idr_*."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3118
+#, no-wrap
+msgid "1100097"
+msgstr "1100097"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3119
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/294860[294860]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/294860[294860]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3120
+#, no-wrap
+msgid "January 26, 2016"
+msgstr "26 января 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3122
+#, no-wrap
+msgid "11.0-CURRENT after API change to man:dpv[3]."
+msgstr "11.0-CURRENT после изменения API в man:dpv[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3123
+#, no-wrap
+msgid "1100098"
+msgstr "1100098"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3124
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/295682[295682]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/295682[295682]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3125
+#, no-wrap
+msgid "February 16, 2016"
+msgstr "16 февраля 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3127
+#, no-wrap
+msgid "11.0-CURRENT after API change to `rman` (rev link:https://svnweb.freebsd.org/changeset/base/294883[294883])."
+msgstr "11.0-CURRENT после изменения API в `rman` (rev link:https://svnweb.freebsd.org/changeset/base/294883[294883])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3128
+#, no-wrap
+msgid "1100099"
+msgstr "1100099"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3129
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/295739[295739]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/295739[295739]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3130
+#, no-wrap
+msgid "February 18, 2016"
+msgstr "18 февраля 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3132
+#, no-wrap
+msgid "11.0-CURRENT after allowing drivers to set the TCP ACK/data segment aggregation limit."
+msgstr "11.0-CURRENT после разрешения драйверам устанавливать лимит агрегации сегментов TCP ACK/данных."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3133
+#, no-wrap
+msgid "1100100"
+msgstr "1100100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3134
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/296136[296136]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/296136[296136]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3135
+#, no-wrap
+msgid "February 26, 2016"
+msgstr "26 февраля 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3137
+#, no-wrap
+msgid "11.0-CURRENT after man:bus_alloc_resource_any[9] API addition."
+msgstr "11.0-CURRENT после добавления API man:bus_alloc_resource_any[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3138
+#, no-wrap
+msgid "1100101"
+msgstr "1100101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3139
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/296417[296417]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/296417[296417]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3140
+#, no-wrap
+msgid "March 5, 2016"
+msgstr "5 марта 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3142
+#, no-wrap
+msgid "11.0-CURRENT after upgrading copies of clang, llvm, lldb and compiler-rt to 3.8.0 release."
+msgstr "11.0-CURRENT после обновления копий clang, llvm, lldb и compiler-rt до релиза 3.8.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3143
+#, no-wrap
+msgid "1100102"
+msgstr "1100102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3144
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/296749[296749]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/296749[296749]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3145
+#, no-wrap
+msgid "March 12, 2016"
+msgstr "12 марта 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3147
+#, no-wrap
+msgid "11.0-CURRENT after libelf cross-endian fix in rev link:https://svnweb.freebsd.org/changeset/base/296685[296685]."
+msgstr "11.0-CURRENT после исправления кросс-эндианности libelf в ревизии link:https://svnweb.freebsd.org/changeset/base/296685[296685]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3148
+#, no-wrap
+msgid "1100103"
+msgstr "1100103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3149
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/297000[297000]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/297000[297000]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3150
+#, no-wrap
+msgid "March 18, 2016"
+msgstr "18 марта 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3152
+#, no-wrap
+msgid "11.0-CURRENT after using `uintmax_t` for `rman` ranges."
+msgstr "11.0-CURRENT после использования `uintmax_t` для диапазонов `rman`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3153
+#, no-wrap
+msgid "1100104"
+msgstr "1100104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3154
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/297156[297156]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/297156[297156]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3155
+#, no-wrap
+msgid "March 21, 2016"
+msgstr "21 марта 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3157
+#, no-wrap
+msgid "11.0-CURRENT after tracking `filemon` usage via a proc.p_filemon pointer rather than its own lists."
+msgstr "11.0-CURRENT после отслеживания использования `filemon` через указатель proc.p_filemon вместо собственных списков."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3158
+#, no-wrap
+msgid "1100105"
+msgstr "1100105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3159
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/297602[297602]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/297602[297602]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3160
+#, no-wrap
+msgid "April 6, 2016"
+msgstr "6 апреля 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3162
+#, no-wrap
+msgid "11.0-CURRENT after fixing sed functions `i` and `a` from discarding leading space."
+msgstr "11.0-CURRENT после исправления функций `i` и `a` в sed, которые отбрасывали начальные пробелы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3163
+#, no-wrap
+msgid "1100106"
+msgstr "1100106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3164
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/298486[298486]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/298486[298486]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3165
+#, no-wrap
+msgid "April 22, 2016"
+msgstr "22 апреля 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3167
+#, no-wrap
+msgid "11.0-CURRENT after fixes for using IPv6 addresses with RDMA."
+msgstr "11.0-CURRENT после исправлений для использования IPv6-адресов с RDMA."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3168
+#, no-wrap
+msgid "1100107"
+msgstr "1100107"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3169
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/299090[299090]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/299090[299090]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3170
+#, no-wrap
+msgid "May 4, 2016"
+msgstr "4 мая 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3172
+#, no-wrap
+msgid "11.0-CURRENT after improving performance and functionality of the man:bitstring[3] API."
+msgstr "11.0-CURRENT после улучшения производительности и функциональности API man:bitstring[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3173
+#, no-wrap
+msgid "1100108"
+msgstr "1100108"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3174
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/299530[299530]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/299530[299530]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3175
+#, no-wrap
+msgid "May 12, 2016"
+msgstr "12 мая 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3177
+#, no-wrap
+msgid "11.0-CURRENT after fixing handling of IOCTLs in the LinuxKPI."
+msgstr "11.0-CURRENT после исправления обработки IOCTL в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3178
+#, no-wrap
+msgid "1100109"
+msgstr "1100109"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3179
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/299933[299933]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/299933[299933]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3180
+#, no-wrap
+msgid "May 16, 2016"
+msgstr "16 мая 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3182
+#, no-wrap
+msgid "11.0-CURRENT after implementing more Linux device related functions in the LinuxKPI."
+msgstr "11.0-CURRENT после реализации дополнительных функций, связанных с устройствами Linux, в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3183
+#, no-wrap
+msgid "1100110"
+msgstr "1100110"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3184
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/300207[300207]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/300207[300207]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3185
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4726
+#, no-wrap
+msgid "May 19, 2016"
+msgstr "19 мая 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3187
+#, no-wrap
+msgid "11.0-CURRENT after adding support for managing Shingled Magnetic Recording (SMR) drives."
+msgstr "11.0-CURRENT после добавления поддержки управления дисками с черепичной магнитной записью (Shingled Magnetic Recording, SMR)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3188
+#, no-wrap
+msgid "1100111"
+msgstr "1100111"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3189
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/300303[300303]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/300303[300303]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3190
+#, no-wrap
+msgid "May 20, 2016"
+msgstr "20 мая 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3192
+#, no-wrap
+msgid "11.0-CURRENT after removing `brk` and `sbrk` from arm64."
+msgstr "11.0-CURRENT после удаления `brk` и `sbrk` из arm64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3193
+#, no-wrap
+msgid "1100112"
+msgstr "1100112"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3194
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/300539[300539]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/300539[300539]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3195
+#, no-wrap
+msgid "May 23, 2016"
+msgstr "23 мая 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3197
+#, no-wrap
+msgid "11.0-CURRENT after adding `bit_count` to the man:bitstring[3] API."
+msgstr "11.0-CURRENT после добавления `bit_count` в man:bitstring[3] API."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3198
+#, no-wrap
+msgid "1100113"
+msgstr "1100113"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3199
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/300701[300701]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/300701[300701]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3200
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3205
+#, no-wrap
+msgid "May 26, 2016"
+msgstr "26 мая 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3202
+#, no-wrap
+msgid "11.0-CURRENT after disabling alignment faults on armv6."
+msgstr "11.0-CURRENT после отключения ошибок выравнивания на armv6."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3203
+#, no-wrap
+msgid "1100114"
+msgstr "1100114"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3204
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/300806[300806]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/300806[300806]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3207
+#, no-wrap
+msgid "11.0-CURRENT after fixing man:crunchgen[1] usage with `MAKEOBJDIRPREFIX`."
+msgstr "11.0-CURRENT после исправления использования man:crunchgen[1] с `MAKEOBJDIRPREFIX`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3208
+#, no-wrap
+msgid "1100115"
+msgstr "1100115"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3209
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/300982[300982]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/300982[300982]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3210
+#, no-wrap
+msgid "May 30, 2016"
+msgstr "30 мая 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3212
+#, no-wrap
+msgid "11.0-CURRENT after adding an mbuf flag for `M_HASHTYPE_`."
+msgstr "11.0-CURRENT после добавления флага mbuf для `M_HASHTYPE_`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3213
+#, no-wrap
+msgid "1100116"
+msgstr "1100116"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3214
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/301011[301011]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/301011[301011]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3215
+#, no-wrap
+msgid "May 31, 2016"
+msgstr "31 мая 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3217
+#, no-wrap
+msgid "11.0-CURRENT after SHA-512t256 (rev link:https://svnweb.freebsd.org/changeset/base/300903[300903]) and Skein (rev link:https://svnweb.freebsd.org/changeset/base/300966[300966]) where added to libmd, libcrypt, the kernel, and ZFS (rev link:https://svnweb.freebsd.org/changeset/base/301010[301010])."
+msgstr "11.0-CURRENT после добавления SHA-512t256 (ревизия link:https://svnweb.freebsd.org/changeset/base/300903[300903]) и Skein (ревизия link:https://svnweb.freebsd.org/changeset/base/300966[300966]) в libmd, libcrypt, ядро и ZFS (ревизия link:https://svnweb.freebsd.org/changeset/base/301010[301010])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3218
+#, no-wrap
+msgid "1100117"
+msgstr "1100117"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3219
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/301892[301892]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/301892[301892]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3220
+#, no-wrap
+msgid "June 6, 2016"
+msgstr "6 июня 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3222
+#, no-wrap
+msgid "11.0-CURRENT after libpam was synced with stock link:https://svnweb.freebsd.org/changeset/base/301602[301602], bumping library version."
+msgstr "11.0-CURRENT после синхронизации libpam с основной версией link:https://svnweb.freebsd.org/changeset/base/301602[301602], что привело к увеличению версии библиотеки."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3223
+#, no-wrap
+msgid "1100118"
+msgstr "1100118"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3224
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/302071[302071]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/302071[302071]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3225
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4203
+#, no-wrap
+msgid "June 21, 2016"
+msgstr "21 июня 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3227
+#, no-wrap
+msgid "11.0-CURRENT after breaking binary compatibility of struct disk link:https://svnweb.freebsd.org/changeset/base/302069[302069]."
+msgstr "11.0-CURRENT после нарушения бинарной совместимости структуры disk link:https://svnweb.freebsd.org/changeset/base/302069[302069]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3228
+#, no-wrap
+msgid "1100119"
+msgstr "1100119"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3229
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/302150[302150]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/302150[302150]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3230
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3235
+#, no-wrap
+msgid "June 23, 2016"
+msgstr "23 июня 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3232
+#, no-wrap
+msgid "11.0-CURRENT after switching `geom_disk` to using a pool mutex."
+msgstr "11.0-CURRENT после перевода `geom_disk` на использование мьютекса пула."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3233
+#, no-wrap
+msgid "1100120"
+msgstr "1100120"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3234
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/302153[302153]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/302153[302153]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3237
+#, no-wrap
+msgid "11.0-CURRENT after adding spares to struct ifnet."
+msgstr "11.0-CURRENT после добавления запасных элементов в struct ifnet."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3238
+#, no-wrap
+msgid "1100121"
+msgstr "1100121"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3239
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3244
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/303979[303979]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/303979[303979]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3242
+#, no-wrap
+msgid "11-STABLE after `releng/11.0` branched from 11-STABLE (rev link:https://svnweb.freebsd.org/changeset/base/303975[303975])."
+msgstr "11-STABLE после того, как ветка `releng/11.0` отделилась от 11-STABLE (изменение:https://svnweb.freebsd.org/changeset/base/303975[303975])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3243
+#, no-wrap
+msgid "1100500"
+msgstr "1100500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3245
+#, no-wrap
+msgid "August 12, 2016"
+msgstr "12 августа 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3247
+#, no-wrap
+msgid "11.0-STABLE adding branched link:https://svnweb.freebsd.org/changeset/base/303976[303976]."
+msgstr "11.0-STABLE добавлена ветвленная link: https://svnweb.freebsd.org/changeset/base/303976[303976]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3248
+#, no-wrap
+msgid "1100501"
+msgstr "1100501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3249
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/304609[304609]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/304609[304609]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3252
+#, no-wrap
+msgid "11.0-STABLE after adding C++11 `thread_local` support."
+msgstr "11.0-STABLE после добавления поддержки `thread_local` в C++11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3253
+#, no-wrap
+msgid "1100502"
+msgstr "1100502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3254
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/304865[304865]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/304865[304865]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3255
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4218
+#, no-wrap
+msgid "August 26, 2016"
+msgstr "26 августа 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3257
+#, no-wrap
+msgid "11.0-STABLE after `LC_*_MASK` fix."
+msgstr "11.0-STABLE после исправления `LC_*_MASK`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3258
+#, no-wrap
+msgid "1100503"
+msgstr "1100503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3259
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/305733[305733]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/305733[305733]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3260
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4223
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4731
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5504
+#, no-wrap
+msgid "September 12, 2016"
+msgstr "12 сентября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3262
+#, no-wrap
+msgid "11.0-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9]."
+msgstr "11.0-STABLE после устранения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3263
+#, no-wrap
+msgid "1100504"
+msgstr "1100504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3264
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/307330[307330]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/307330[307330]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3265
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4228
+#, no-wrap
+msgid "October 14, 2016"
+msgstr "14 октября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3267
+#, no-wrap
+msgid "11.0-STABLE after ZFS merges."
+msgstr "11.0-STABLE после объединения ZFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3268
+#, no-wrap
+msgid "1100505"
+msgstr "1100505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3269
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/307590[307590]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/307590[307590]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3270
+#, no-wrap
+msgid "October 19, 2016"
+msgstr "19 октября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3272
+#, no-wrap
+msgid "11.0-STABLE after `struct fb_info` change."
+msgstr "11.0-STABLE после изменения `struct fb_info`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3273
+#, no-wrap
+msgid "1100506"
+msgstr "1100506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3274
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/308048[308048]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/308048[308048]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3275
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4233
+#, no-wrap
+msgid "October 28, 2016"
+msgstr "28 октября 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3277
+#, no-wrap
+msgid "11.0-STABLE after installing header files required development with `libzfs_core`."
+msgstr "11.0-STABLE после установки заголовочных файлов, необходимых для разработки с `libzfs_core`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3278
+#, no-wrap
+msgid "1100507"
+msgstr "1100507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3279
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/310120[310120]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/310120[310120]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3280
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4238
+#, no-wrap
+msgid "December 15, 2016"
+msgstr "15 декабря 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3282
+#, no-wrap
+msgid "11.0-STABLE after adding the `ki_moretdname` member to `struct kinfo_proc` and `struct kinfo_proc32` to export the whole thread name to user-space utilities."
+msgstr "11.0-STABLE после добавления члена `ki_moretdname` в структуры `struct kinfo_proc` и `struct kinfo_proc32` для экспорта полного имени потока в пользовательские утилиты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3283
+#, no-wrap
+msgid "1100508"
+msgstr "1100508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3284
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/310618[310618]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/310618[310618]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3285
+#, no-wrap
+msgid "December 26, 2016"
+msgstr "26 декабря 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3287
+#, no-wrap
+msgid "11.0-STABLE after upgrading copies of clang, llvm, lldb, compiler-rt and libc++ to 3.9.1 release, and adding lld 3.9.1."
+msgstr "11.0-STABLE после обновления копий clang, llvm, lldb, compiler-rt и libc++ до версии 3.9.1, а также добавления lld 3.9.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3288
+#, no-wrap
+msgid "1100509"
+msgstr "1100509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3289
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/311186[311186]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/311186[311186]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3290
+#, no-wrap
+msgid "January 3, 2017"
+msgstr "3 января 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3292
+#, no-wrap
+msgid "11.0-STABLE after man:crunchgen[1] META_MODE fix (rev link:https://svnweb.freebsd.org/changeset/base/311185[311185])."
+msgstr "11.0-STABLE после исправления META_MODE в man:crunchgen[1] (изменение link:https://svnweb.freebsd.org/changeset/base/311185[311185])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3293
+#, no-wrap
+msgid "1100510"
+msgstr "1100510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3294
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/315312[315312]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/315312[315312]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3295
+#, no-wrap
+msgid "March 15, 2017"
+msgstr "15 марта 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3297
+#, no-wrap
+msgid "11.0-STABLE after MFC of `fget_cap`, `getsock_cap`, and related changes."
+msgstr "11.0-STABLE после MFC изменений, связанных с `fget_cap`, `getsock_cap` и другими."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3298
+#, no-wrap
+msgid "1100511"
+msgstr "1100511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3299
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/316423[316423]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/316423[316423]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3300
+#, no-wrap
+msgid "April 2, 2017"
+msgstr "2 апреля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3302
+#, no-wrap
+msgid "11.0-STABLE after multiple MFCs updating clang, llvm, lld, lldb, compiler-rt and libc++ to 4.0.0 release."
+msgstr "11.0-STABLE после нескольких MFC, обновляющих clang, llvm, lld, lldb, compiler-rt и libc++ до версии 4.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3303
+#, no-wrap
+msgid "1100512"
+msgstr "1100512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3304
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/316498[316498]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/316498[316498]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3305
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4248
+#, no-wrap
+msgid "April 4, 2017"
+msgstr "4 апреля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3307
+#, no-wrap
+msgid "11.0-STABLE after making CAM SIM lock optional (revs link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674])."
+msgstr "11.0-STABLE после того, как блокировка CAM SIM стала опциональной (ревизии link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3308
+#, no-wrap
+msgid "1100513"
+msgstr "1100513"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3309
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/318197[318197]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/318197[318197]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3310
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4253
+#, no-wrap
+msgid "May 11, 2017"
+msgstr "11 мая 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3312
+#, no-wrap
+msgid "11.0-STABLE after merging the addition of the [.filename]#<dev/mmc/mmc_ioctl.h># header."
+msgstr "11.0-STABLE после объединения добавления заголовочного файла [.filename]#<dev/mmc/mmc_ioctl.h>#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3313
+#, no-wrap
+msgid "1100514"
+msgstr "1100514"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3314
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/319279[319279]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/319279[319279]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3315
+#, no-wrap
+msgid "May 31, 2017"
+msgstr "31 мая 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3317
+#, no-wrap
+msgid "11.0-STABLE after multiple MFCs of `libpcap`, `WITHOUT_INET6`, and a few other minor changes."
+msgstr "11.0-STABLE после нескольких MFC для `libpcap`, `WITHOUT_INET6` и нескольких других незначительных изменений."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3318
+#, no-wrap
+msgid "1101000"
+msgstr "1101000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3319
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320486[320486]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320486[320486]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3320
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3325
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3330
+#, no-wrap
+msgid "June 30, 2017"
+msgstr "June 30, 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3322
+#, no-wrap
+msgid "`releng/11.1` branched from `stable/11`."
+msgstr "`releng/11.1` отделился от `stable/11`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3323
+#, no-wrap
+msgid "1101001"
+msgstr "1101001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3324
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320763[320763]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320763[320763]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3327
+#, no-wrap
+msgid "11.1-RC1 After merging the `MAP_GUARD` man:mmap[2] flag addition."
+msgstr "11.1-RC1 После объединения добавления флага `MAP_GUARD` в man:mmap[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3328
+#, no-wrap
+msgid "1101500"
+msgstr "1101500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3329
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320487[320487]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320487[320487]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3332
+#, no-wrap
+msgid "11-STABLE after `releng/11.1` branched."
+msgstr "11-STABLE после ветвления `releng/11.1`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3333
+#, no-wrap
+msgid "1101501"
+msgstr "1101501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3334
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/320666[320666]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/320666[320666]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3335
+#, no-wrap
+msgid "July 5, 2017"
+msgstr "5 июля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3337
+#, no-wrap
+msgid "11-STABLE after merging the `MAP_GUARD` man:mmap[2] flag addition."
+msgstr "11-STABLE после объединения добавления флага `MAP_GUARD` в man:mmap[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3338
+#, no-wrap
+msgid "1101502"
+msgstr "1101502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3342
+#, no-wrap
+msgid "11-STABLE after merging the NFS client forced dismount support `umount -N` addition."
+msgstr "11-STABLE после объединения поддержки принудительного демонтирования клиента NFS с добавлением `umount -N`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3343
+#, no-wrap
+msgid "1101503"
+msgstr "1101503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3344
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/323431[323431]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/323431[323431]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3345
+#, no-wrap
+msgid "September 11, 2017"
+msgstr "11 сентября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3347
+#, no-wrap
+msgid "11-STABLE after merging changes making the WRFSBASE instruction operational on amd64."
+msgstr "11-STABLE после объединения изменений, сделавших инструкцию WRFSBASE работоспособной на amd64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3348
+#, no-wrap
+msgid "1101504"
+msgstr "1101504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3349
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/324006[324006]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/324006[324006]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3352
+#, no-wrap
+msgid "11-STABLE after merging libm from head, which adds man:cacoshl[3], man:cacosl[3], man:casinhl[3], man:casinl[3], man:catanl[3], man:catanhl[3], man:sincos[3], man:sincosf[3], and man:sincosl[3]."
+msgstr "11-STABLE после слияния libm из head, что добавляет man:cacoshl[3], man:cacosl[3], man:casinhl[3], man:casinl[3], man:catanl[3], man:catanhl[3], man:sincos[3], man:sincosf[3] и man:sincosl[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3353
+#, no-wrap
+msgid "1101505"
+msgstr "1101505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3354
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/324023[324023]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/324023[324023]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3357
+#, no-wrap
+msgid "11-STABLE after merging clang, llvm, lld, lldb, compiler-rt and libc++ 5.0.0 release."
+msgstr "11-STABLE после объединения clang, llvm, lld, lldb, compiler-rt и libc++ версии 5.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3358
+#, no-wrap
+msgid "1101506"
+msgstr "1101506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3359
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/325003[325003]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/325003[325003]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3360
+#, no-wrap
+msgid "October 25, 2017"
+msgstr "25 октября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3362
+#, no-wrap
+msgid "11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/324281[324281], adding the `value.u16` field to `struct diocgattr_arg`."
+msgstr "11-STABLE после слияния link:https://svnweb.freebsd.org/changeset/base/324281[324281], добавления поля `value.u16` в структуру `struct diocgattr_arg`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3363
+#, no-wrap
+msgid "1101507"
+msgstr "1101507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3364
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4277
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/328379[328379]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/328379[328379]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3365
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3370
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4278
+#, no-wrap
+msgid "January 24, 2018"
+msgstr "24 января 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3367
+#, no-wrap
+msgid "11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/325028[325028], fixing `ptrace()` to always clear the correct thread event when resuming."
+msgstr "11-STABLE после слияния с link:https://svnweb.freebsd.org/changeset/base/325028[325028], исправление `ptrace()` для корректной очистки события нужного потока при возобновлении."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3368
+#, no-wrap
+msgid "1101508"
+msgstr "1101508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3369
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/328386[328386]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/328386[328386]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3372
+#, no-wrap
+msgid "11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/316648[316648], renaming `smp_no_rendevous_barrier()` to `smp_no_rendezvous_barrier()`."
+msgstr "11-STABLE после объединения изменений link:https://svnweb.freebsd.org/changeset/base/316648[316648], переименование `smp_no_rendevous_barrier()` в `smp_no_rendezvous_barrier()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3373
+#, no-wrap
+msgid "1101509"
+msgstr "1101509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3374
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/328653[328653]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/328653[328653]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3375
+#, no-wrap
+msgid "February 1, 2018"
+msgstr "1 февраля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3377
+#, no-wrap
+msgid "11-STABLE after an overwrite merge backport of the LinuxKPI from FreeBSD-head."
+msgstr "11-STABLE после обратного переноса (overwrite merge) LinuxKPI из FreeBSD-head."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3378
+#, no-wrap
+msgid "1101510"
+msgstr "1101510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3379
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/329450[329450]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/329450[329450]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3380
+#, no-wrap
+msgid "February 17, 2018"
+msgstr "17 февраля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3382
+#, no-wrap
+msgid "11-STABLE after the `cmpxchg()` macro is now fully functional in the LinuxKPI."
+msgstr "11-STABLE после того, как макрос `cmpxchg()` стал полностью функциональным в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3383
+#, no-wrap
+msgid "1101511"
+msgstr "1101511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3384
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/329981[329981]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/329981[329981]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3385
+#, no-wrap
+msgid "February 25, 2018"
+msgstr "25 февраля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3387
+#, no-wrap
+msgid "11-STABLE after concluding the recent LinuxKPI related updates."
+msgstr "11-STABLE после завершения недавних обновлений, связанных с LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3388
+#, no-wrap
+msgid "1101512"
+msgstr "1101512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3389
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/331219[331219]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/331219[331219]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3390
+#, no-wrap
+msgid "March 19, 2018"
+msgstr "19 марта 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3392
+#, no-wrap
+msgid "11-STABLE after merging `retpoline` support from the upstream llvm, clang and lld 5.0 branches."
+msgstr "11-STABLE после объединения поддержки `retpoline` из вышестоящих веток llvm, clang и lld 5.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3393
+#, no-wrap
+msgid "1101513"
+msgstr "1101513"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3394
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/331838[331838]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/331838[331838]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3395
+#, no-wrap
+msgid "March 31, 2018"
+msgstr "31 марта 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3397
+#, no-wrap
+msgid "11-STABLE after merging clang, llvm, lld, lldb, compiler-rt and libc++ 6.0.0 release, and several follow-up fixes."
+msgstr "11-STABLE после объединения clang, llvm, lld, lldb, compiler-rt и libc++ версии 6.0.0, а также нескольких последующих исправлений."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3398
+#, no-wrap
+msgid "1101514"
+msgstr "1101514"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3399
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/332089[332089]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/332089[332089]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3400
+#, no-wrap
+msgid "April 5, 2018"
+msgstr "5 апреля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3402
+#, no-wrap
+msgid "11-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/328331[328331], adding a new and incompatible interpretation of `${name}_limits` in rc scripts."
+msgstr "11-STABLE после объединения изменений link:https://svnweb.freebsd.org/changeset/base/328331[328331], добавляющего новую и несовместимую интерпретацию `${name}_limits` в rc-скриптах."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3403
+#, no-wrap
+msgid "1101515"
+msgstr "1101515"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3404
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/332363[332363]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/332363[332363]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3405
+#, no-wrap
+msgid "April 10, 2018"
+msgstr "10 апреля 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3407
+#, no-wrap
+msgid "11-STABLE after reverting link:https://svnweb.freebsd.org/changeset/base/331880[331880], removing the new and incompatible interpretation of `${name}_limits` in rc scripts."
+msgstr "11-STABLE после отмены изменений из link:https://svnweb.freebsd.org/changeset/base/331880[331880], удаляющих новую и несовместимую интерпретацию `${name}_limits` в rc-скриптах."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3408
+#, no-wrap
+msgid "1101516"
+msgstr "1101516"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3409
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/334392[334392]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/334392[334392]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3410
+#, no-wrap
+msgid "May 30, 2018"
+msgstr "30 мая 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3412
+#, no-wrap
+msgid "11-STABLE after man:dwatch[1] touch-ups."
+msgstr "11-STABLE после доработок man:dwatch[1]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3413
+#, no-wrap
+msgid "1102000"
+msgstr "1102000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3414
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/334459[334459]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/334459[334459]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3417
+#, no-wrap
+msgid "`releng/11.2` branched from `stable/11`."
+msgstr "`releng/11.2` отделился от `stable/11`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3418
+#, no-wrap
+msgid "1102500"
+msgstr "1102500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3419
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/334461[334461]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/334461[334461]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3422
+#, no-wrap
+msgid "11-STABLE after releng/11.2 branched."
+msgstr "11-STABLE после ветвления releng/11.2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3423
+#, no-wrap
+msgid "1102501"
+msgstr "1102501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3424
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/335436[335436]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/335436[335436]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3425
+#, no-wrap
+msgid "June 20, 2018"
+msgstr "June 20, 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3427
+#, no-wrap
+msgid "11-STABLE after LinuxKPI updates requiring recompilation of external kernel modules."
+msgstr "11-STABLE после обновлений LinuxKPI, требующих перекомпиляции внешних модулей ядра."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3428
+#, no-wrap
+msgid "1102502"
+msgstr "1102502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3429
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/338617[338617]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/338617[338617]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3430
+#, no-wrap
+msgid "September 12, 2018"
+msgstr "12 сентября 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3432
+#, no-wrap
+msgid "11-STABLE after adding a socket option SO_TS_CLOCK and fixing `recvmsg32()` system call to properly down-convert layout of the 64-bit structures to match what 32-bit app(s) expect."
+msgstr "11-STABLE после добавления сокет-опции SO_TS_CLOCK и исправления системного вызова `recvmsg32()` для корректного преобразования структуры 64-битных данных в формат, ожидаемый 32-битными приложениями."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3433
+#, no-wrap
+msgid "1102503"
+msgstr "1102503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3434
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/338931[338931]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/338931[338931]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3435
+#, no-wrap
+msgid "September 25, 2018"
+msgstr "25 сентября 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3437
+#, no-wrap
+msgid "11-STABLE after merging a TCP checksum fix to man:iflib[9] and adding new media types to if_media.h"
+msgstr "11-STABLE после объединения исправления контрольной суммы TCP в man:iflib[9] и добавления новых типов носителей в if_media.h"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3438
+#, no-wrap
+msgid "1102504"
+msgstr "1102504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3439
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/340309[340309]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/340309[340309]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3440
+#, no-wrap
+msgid "November 9, 2018"
+msgstr "9 ноября 2018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3442
+#, no-wrap
+msgid "11-STABLE after several MFCs: updating man:objcopy[1] to properly handle little-endian MIPS64 object; correcting mips64el test to use ELF header; adding test for 64-bit ELF in _libelf_is_mips64el."
+msgstr "11-STABLE после нескольких MFC: обновление man:objcopy[1] для корректной обработки little-endian MIPS64 объектов; исправление теста mips64el для использования заголовка ELF; добавление теста для 64-битного ELF в _libelf_is_mips64el."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3443
+#, no-wrap
+msgid "1102505"
+msgstr "1102505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3444
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/342804[342804]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/342804[342804]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3447
+#, no-wrap
+msgid "11-STABLE after merge of fixing `linux_destroy_dev()` behaviour when there are still files open from the destroying cdev."
+msgstr "11-STABLE после слияния исправления поведения `linux_destroy_dev()`, когда остаются открытые файлы из уничтожаемого cdev."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3448
+#, no-wrap
+msgid "1102506"
+msgstr "1102506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3449
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/344220[344220]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/344220[344220]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3450
+#, no-wrap
+msgid "February 17, 2019"
+msgstr "17 февраля 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3452
+#, no-wrap
+msgid "11-STABLE after merging multiple commits to lualoader."
+msgstr "11-STABLE после объединения нескольких коммитов в lualoader."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3453
+#, no-wrap
+msgid "1102507"
+msgstr "1102507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3454
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/346296[346296]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/346296[346296]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3457
+#, no-wrap
+msgid "11-STABLE after merging llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp 8.0.0 final release r356365."
+msgstr "11-STABLE после объединения llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp 8.0.0 финальный релиз r356365."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3458
+#, no-wrap
+msgid "1102508"
+msgstr "1102508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3462
+#, no-wrap
+msgid "11-STABLE after `ether_gen_addr` availability."
+msgstr "11-STABLE после появления `ether_gen_addr`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3463
+#, no-wrap
+msgid "1102509"
+msgstr "1102509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3464
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347212[347212]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347212[347212]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3467
+#, no-wrap
+msgid "11-STABLE after MFC of link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] and partially of link:https://svnweb.freebsd.org/changeset/base/345305[345305]."
+msgstr "11-STABLE после слияния изменений link:https://svnweb.freebsd.org/changeset/base/345303[345303], link:https://svnweb.freebsd.org/changeset/base/345658,[345658,] и частично link:https://svnweb.freebsd.org/changeset/base/345305[345305]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3468
+#, no-wrap
+msgid "1102510"
+msgstr "1102510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3469
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/347883[347883]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/347883[347883]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3472
+#, no-wrap
+msgid "11-STABLE after bumping the Mellanox driver version numbers (man:mlx4en[4]; man:mlx5en[4])."
+msgstr "11-STABLE после увеличения номеров версий драйверов Mellanox (man:mlx4en[4]; man:mlx5en[4])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3473
+#, no-wrap
+msgid "1103000"
+msgstr "1103000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3474
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/349026[349026]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/349026[349026]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3475
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3480
+#, no-wrap
+msgid "June 14, 2019"
+msgstr "14 июня 2019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3477
+#, no-wrap
+msgid "`releng/11.3` branched from `stable/11`."
+msgstr "`releng/11.3` отделился от `stable/11`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3478
+#, no-wrap
+msgid "1103500"
+msgstr "1103500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3479
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/349027[349027]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/349027[349027]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3482
+#, no-wrap
+msgid "11-STABLE after releng/11.3 branched."
+msgstr "11-STABLE после ветвления releng/11.3."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3483
+#, no-wrap
+msgid "1103501"
+msgstr "1103501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3487
+#, no-wrap
+msgid "11-STABLE after fixing a potential OOB read security issue in libc++."
+msgstr "11-STABLE после исправления потенциальной проблемы безопасности OOB-чтения в libc++."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3488
+#, no-wrap
+msgid "1103502"
+msgstr "1103502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3489
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354614[354614]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354614[354614]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3492
+#, no-wrap
+msgid "11-STABLE after adding sysfs create/remove functions that handles multiple files in one call to the LinuxKPI."
+msgstr "11-STABLE после добавления функций создания/удаления sysfs, обрабатывающих несколько файлов за один вызов в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3493
+#, no-wrap
+msgid "1103503"
+msgstr "1103503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3494
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354615[354615]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354615[354615]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3497
+#, no-wrap
+msgid "11-STABLE after LinuxKPI sysfs improvements."
+msgstr "11-STABLE после улучшений LinuxKPI sysfs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3498
+#, no-wrap
+msgid "1103504"
+msgstr "1103504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3499
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/354616[354616]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/354616[354616]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3502
+#, no-wrap
+msgid "11-STABLE after enabling device class group attributes in the LinuxKPI."
+msgstr "11-STABLE после включения атрибутов группы классов устройств в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3503
+#, no-wrap
+msgid "1103505"
+msgstr "1103505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3507
+#, no-wrap
+msgid "11-STABLE after adding `sigsetop` extensions commonly found in musl libc and glibc."
+msgstr "11-STABLE после добавления расширений `sigsetop`, которые часто встречаются в musl libc и glibc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3508
+#, no-wrap
+msgid "1103506"
+msgstr "1103506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3509
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356395[356395]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356395[356395]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3512
+#, no-wrap
+msgid "11-STABLE after making USB statistics be per-device instead of per bus."
+msgstr "11-STABLE после изменения статистики USB для каждого устройства вместо каждой шины."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3513
+#, no-wrap
+msgid "1103507"
+msgstr "1103507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3514
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356680[356680]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356680[356680]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3517
+#, no-wrap
+msgid "11-STABLE after adding own counter for cancelled USB transfers."
+msgstr "11-STABLE после добавления собственного счетчика для отмененных USB-передач."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3518
+#, no-wrap
+msgid "1103508"
+msgstr "1103508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3519
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/357613[357613]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/357613[357613]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3522
+#, no-wrap
+msgid "11-STABLE after recent LinuxKPI changes."
+msgstr "11-STABLE после недавних изменений в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3523
+#, no-wrap
+msgid "1103509"
+msgstr "1103509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3524
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/359958[359958]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/359958[359958]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3527
+#, no-wrap
+msgid "11-STABLE after moving `id_mapped` to end of `bus_dma_impl` structure to preserve KPI."
+msgstr "11-STABLE после перемещения `id_mapped` в конец структуры `bus_dma_impl` для сохранения KPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3528
+#, no-wrap
+msgid "1103510"
+msgstr "1103510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3529
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360658[360658]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360658[360658]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3530
+#, no-wrap
+msgid "May 5, 2020"
+msgstr "5 мая 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3532
+#, no-wrap
+msgid "11-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 9.0.0 final release r372316."
+msgstr "11-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до финального релиза 9.0.0 r372316."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3533
+#, no-wrap
+msgid "1103511"
+msgstr "1103511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3534
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360784[360784]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360784[360784]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3537
+#, no-wrap
+msgid "11-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0 release."
+msgstr "11-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3538
+#, no-wrap
+msgid "1104000"
+msgstr "1104000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3539
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360804[360804]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360804[360804]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3540
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3545
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3550
+#, no-wrap
+msgid "May 8, 2020"
+msgstr "8 мая 2020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3542
+#, no-wrap
+msgid "`releng/11.4` branched from `stable/11`."
+msgstr "`releng/11.4` ответвился от `stable/11`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3543
+#, no-wrap
+msgid "1104001"
+msgstr "1104001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3544
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360822[360822]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360822[360822]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3547
+#, no-wrap
+msgid "11.4-BETA1 after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.0 release."
+msgstr "11.4-BETA1 после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3548
+#, no-wrap
+msgid "1104500"
+msgstr "1104500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3549
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/360805[360805]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/360805[360805]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3552
+#, no-wrap
+msgid "11-STABLE after releng/11.4 branched."
+msgstr "11-STABLE после ветвления releng/11.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3553
+#, no-wrap
+msgid "1104501"
+msgstr "1104501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3554
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/362320[362320]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/362320[362320]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3557
+#, no-wrap
+msgid "11-STABLE after implementing `__is_constexpr()` function macro in the LinuxKPI."
+msgstr "11-STABLE после реализации макроса функции `__is_constexpr()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3558
+#, no-wrap
+msgid "1104502"
+msgstr "1104502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3559
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/362919[362919]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/362919[362919]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3562
+#, no-wrap
+msgid "11-STABLE after making liblzma use libmd implementation of SHA256."
+msgstr "11-STABLE после перевода liblzma на использование реализации SHA256 из libmd."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3563
+#, no-wrap
+msgid "1104503"
+msgstr "1104503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3564
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363496[363496]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363496[363496]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3567
+#, no-wrap
+msgid "11-STABLE after updating llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to 10.0.1 release."
+msgstr "11-STABLE после обновления llvm, clang, compiler-rt, libc++, libunwind, lld, lldb и openmp до версии 10.0.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3568
+#, no-wrap
+msgid "1104504"
+msgstr "1104504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3569
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/363792[363792]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/363792[363792]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3572
+#, no-wrap
+msgid "11-STABLE after implementing the `array_size()` function in the LinuxKPI."
+msgstr "11-STABLE после реализации функции `array_size()` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3573
+#, no-wrap
+msgid "1104505"
+msgstr "1104505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3574
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/364391[364391]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/364391[364391]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3577
+#, no-wrap
+msgid "11-STABLE after change to clone the task struct fields related to RCU."
+msgstr "11-STABLE после изменения для клонирования полей структуры задачи, связанных с RCU."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3578
+#, no-wrap
+msgid "1104506"
+msgstr "1104506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3582
+#, no-wrap
+msgid "11-STABLE after adding atomic and `bswap` functions to libcompiler_rt."
+msgstr "11-STABLE после добавления атомарных функций и функций `bswap` в libcompiler_rt."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3583
+#, no-wrap
+msgid "1104507"
+msgstr "1104507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3587
+#, no-wrap
+msgid "11-STABLE after followup commits to libcompiler_rt."
+msgstr "11-STABLE после последующих коммитов в libcompiler_rt."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3588
+#, no-wrap
+msgid "1104508"
+msgstr "1104508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3589
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366879[366879]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366879[366879]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3592
+#, no-wrap
+msgid "11-STABLE after populating the acquire context field of a `ww_mutex` in the LinuxKPI."
+msgstr "11-STABLE после заполнения поля контекста получения в `ww_mutex` в LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3593
+#, no-wrap
+msgid "1104509"
+msgstr "1104509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3594
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/366889[366889]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/366889[366889]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3597
+#, no-wrap
+msgid "11-STABLE after additions to LinuxKPI's `RCU` list."
+msgstr "11-STABLE после добавлений в список `RCU` LinuxKPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3598
+#, no-wrap
+msgid "1104510"
+msgstr "1104510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3599
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/367513[367513]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/367513[367513]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3601
+#, no-wrap
+msgid "11-STABLE after the addition of `ptsname_r`."
+msgstr "11-STABLE после добавления `ptsname_r`."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3604
+#, no-wrap
+msgid "FreeBSD 10 Versions"
+msgstr "Версии FreeBSD 10"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3607
+#, no-wrap
+msgid "FreeBSD 10 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` в FreeBSD 10"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3616
+#, no-wrap
+msgid "1000000"
+msgstr "1000000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3617
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/225757[225757]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/225757[225757]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3618
+#, no-wrap
+msgid "September 26, 2011"
+msgstr "26 сентября 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3620
+#, no-wrap
+msgid "10.0-CURRENT."
+msgstr "10.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3621
+#, no-wrap
+msgid "1000001"
+msgstr "1000001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3622
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/227070[227070]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/227070[227070]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3623
+#, no-wrap
+msgid "November 4, 2011"
+msgstr "4 ноября 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3625
+#, no-wrap
+msgid "10-CURRENT after addition of the man:posix_fadvise[2] system call."
+msgstr "10-CURRENT после добавления системного вызова man:posix_fadvise[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3626
+#, no-wrap
+msgid "1000002"
+msgstr "1000002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3627
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/228444[228444]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/228444[228444]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3628
+#, no-wrap
+msgid "December 12, 2011"
+msgstr "12 декабря 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3630
+#, no-wrap
+msgid "10-CURRENT after defining boolean true/false in sys/types.h, sizeof(bool) may have changed (rev link:https://svnweb.freebsd.org/changeset/base/228444[228444]). 10-CURRENT after xlocale.h was introduced (rev link:https://svnweb.freebsd.org/changeset/base/227753[227753])."
+msgstr "10-CURRENT после определения булевых значений true/false в sys/types.h, размер sizeof(bool) мог измениться (ревизия link:https://svnweb.freebsd.org/changeset/base/228444[228444]). 10-CURRENT после введения xlocale.h (ревизия link:https://svnweb.freebsd.org/changeset/base/227753[227753])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3631
+#, no-wrap
+msgid "1000003"
+msgstr "1000003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3632
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/228571[228571]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/228571[228571]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3633
+#, no-wrap
+msgid "December 16, 2011"
+msgstr "16 декабря 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3635
+#, no-wrap
+msgid "10-CURRENT after major changes to man:carp[4], changing size of struct `in_aliasreq`, struct in6_aliasreq (rev link:https://svnweb.freebsd.org/changeset/base/228571[228571]) and straitening arguments check of SIOCAIFADDR (rev link:https://svnweb.freebsd.org/changeset/base/228574[228574])."
+msgstr "10-CURRENT после значительных изменений в man:carp[4], изменения размера структур `in_aliasreq`, `in6_aliasreq` (rev link:https://svnweb.freebsd.org/changeset/base/228571[228571]) и упрощения проверки аргументов SIOCAIFADDR (rev link:https://svnweb.freebsd.org/changeset/base/228574[228574])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3636
+#, no-wrap
+msgid "1000004"
+msgstr "1000004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3637
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/229204[229204]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/229204[229204]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3638
+#, no-wrap
+msgid "January 1, 2012"
+msgstr "1 января 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3640
+#, no-wrap
+msgid "10-CURRENT after the removal of `skpc()` and the addition of man:memcchr[9] (rev link:https://svnweb.freebsd.org/changeset/base/229200[229200])."
+msgstr "10-CURRENT после удаления `skpc()` и добавления man:memcchr[9] (изменение:https://svnweb.freebsd.org/changeset/base/229200[229200])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3641
+#, no-wrap
+msgid "1000005"
+msgstr "1000005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3642
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/230207[230207]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/230207[230207]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3643
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4546
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5429
+#, no-wrap
+msgid "January 16, 2012"
+msgstr "16 января 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3645
+#, no-wrap
+msgid "10-CURRENT after the removal of support for SIOCSIFADDR, SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFDSTADDR ioctls."
+msgstr "10-CURRENT после удаления поддержки ioctls SIOCSIFADDR, SIOCSIFNETMASK, SIOCSIFBRDADDR, SIOCSIFDSTADDR."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3646
+#, no-wrap
+msgid "1000006"
+msgstr "1000006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3647
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/230590[230590]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/230590[230590]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3648
+#, no-wrap
+msgid "January 26, 2012"
+msgstr "26 января 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3650
+#, no-wrap
+msgid "10-CURRENT after introduction of read capacity data asynchronous notification in the man:cam[4] layer."
+msgstr "10-CURRENT после внедрения асинхронного уведомления о данных пропускной способности чтения в слое man:cam[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3651
+#, no-wrap
+msgid "1000007"
+msgstr "1000007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3652
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/231025[231025]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/231025[231025]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3653
+#, no-wrap
+msgid "February 5, 2012"
+msgstr "5 февраля 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3655
+#, no-wrap
+msgid "10-CURRENT after introduction of new man:tcp[4] socket options: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL, and TCP_KEEPCNT."
+msgstr "10-CURRENT после введения новых параметров сокета man:tcp[4]: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL и TCP_KEEPCNT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3656
+#, no-wrap
+msgid "1000008"
+msgstr "1000008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3657
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/231505[231505]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/231505[231505]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3658
+#, no-wrap
+msgid "February 11, 2012"
+msgstr "11 февраля 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3660
+#, no-wrap
+msgid "10-CURRENT after introduction of the new extensible man:sysctl[3] interface NET_RT_IFLISTL to query address lists."
+msgstr "10-CURRENT после введения нового расширяемого интерфейса man:sysctl[3] NET_RT_IFLISTL для запроса списков адресов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3661
+#, no-wrap
+msgid "1000009"
+msgstr "1000009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3662
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/232154[232154]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/232154[232154]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3663
+#, no-wrap
+msgid "February 25, 2012"
+msgstr "25 февраля 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3665
+#, no-wrap
+msgid "10-CURRENT after import of libarchive 3.0.3 (rev link:https://svnweb.freebsd.org/changeset/base/232153[232153])."
+msgstr "10-CURRENT после импорта libarchive 3.0.3 (rev link:https://svnweb.freebsd.org/changeset/base/232153[232153])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3666
+#, no-wrap
+msgid "1000010"
+msgstr "1000010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3667
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/233757[233757]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/233757[233757]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3668
+#, no-wrap
+msgid "March 31, 2012"
+msgstr "31 марта 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3670
+#, no-wrap
+msgid "10-CURRENT after `xlocale` cleanup."
+msgstr "10-CURRENT после очистки `xlocale`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3671
+#, no-wrap
+msgid "1000011"
+msgstr "1000011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3672
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/234355[234355]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/234355[234355]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3673
+#, no-wrap
+msgid "April 16, 2012"
+msgstr "16 апреля 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3675
+#, no-wrap
+msgid "10-CURRENT import of LLVM/Clang 3.1 trunk link:https://svnweb.freebsd.org/changeset/base/154661[154661] (rev link:https://svnweb.freebsd.org/changeset/base/234353[234353])."
+msgstr "Импорт LLVM/Clang 3.1 из 10-CURRENT, ссылка на ревизию: link:https://svnweb.freebsd.org/changeset/base/154661[154661] (ревизия link:https://svnweb.freebsd.org/changeset/base/234353[234353])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3676
+#, no-wrap
+msgid "1000012"
+msgstr "1000012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3677
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/234924[234924]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/234924[234924]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3678
+#, no-wrap
+msgid "May 2, 2012"
+msgstr "2 мая 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3680
+#, no-wrap
+msgid "10-CURRENT jemalloc import."
+msgstr "10-CURRENT импорт jemalloc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3681
+#, no-wrap
+msgid "1000013"
+msgstr "1000013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3682
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/235788[235788]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/235788[235788]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3683
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4566
+#, no-wrap
+msgid "May 22, 2012"
+msgstr "22 мая 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3685
+#, no-wrap
+msgid "10-CURRENT after `byacc` import."
+msgstr "10-CURRENT после импорта `byacc`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3686
+#, no-wrap
+msgid "1000014"
+msgstr "1000014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3687
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/237631[237631]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/237631[237631]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3688
+#, no-wrap
+msgid "June 27, 2012"
+msgstr "27 июня 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3690
+#, no-wrap
+msgid "10-CURRENT after BSD sort becoming the default sort (rev link:https://svnweb.freebsd.org/changeset/base/237629[237629])."
+msgstr "10-CURRENT после того, как BSD sort стал сортировкой по умолчанию (rev link:https://svnweb.freebsd.org/changeset/base/237629[237629])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3691
+#, no-wrap
+msgid "1000015"
+msgstr "1000015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3692
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/238405[238405]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/238405[238405]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3693
+#, no-wrap
+msgid "July 12, 2012"
+msgstr "12 июля 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3695
+#, no-wrap
+msgid "10-CURRENT after import of OpenSSL 1.0.1c."
+msgstr "10-CURRENT после импорта OpenSSL 1.0.1c."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3697
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/238429[238429]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/238429[238429]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3698
+#, no-wrap
+msgid "July 13, 2012"
+msgstr "July 13, 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3700
+#, no-wrap
+msgid "10-CURRENT after the fix for LLVM/Clang 3.1 regression."
+msgstr "10-CURRENT после исправления регрессии в LLVM/Clang 3.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3701
+#, no-wrap
+msgid "1000016"
+msgstr "1000016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3702
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/239179[239179]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/239179[239179]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3703
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3708
+#, no-wrap
+msgid "August 8, 2012"
+msgstr "8 августа 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3705
+#, no-wrap
+msgid "10-CURRENT after KBI change in man:ucom[4]."
+msgstr "10-CURRENT после изменения KBI в man:ucom[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3706
+#, no-wrap
+msgid "1000017"
+msgstr "1000017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3707
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/239214[239214]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/239214[239214]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3710
+#, no-wrap
+msgid "10-CURRENT after adding streams feature to the USB stack."
+msgstr "10-CURRENT после добавления функции потоков в стек USB."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3711
+#, no-wrap
+msgid "1000018"
+msgstr "1000018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3712
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/240233[240233]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/240233[240233]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3713
+#, no-wrap
+msgid "September 8, 2012"
+msgstr "8 сентября 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3715
+#, no-wrap
+msgid "10-CURRENT after major rewrite of man:pf[4]."
+msgstr "10-CURRENT после значительной переработки man:pf[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3716
+#, no-wrap
+msgid "1000019"
+msgstr "1000019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3717
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/241245[241245]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/241245[241245]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3718
+#, no-wrap
+msgid "October 6, 2012"
+msgstr "6 октября 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3720
+#, no-wrap
+msgid "10-CURRENT after man:pfil[9] KBI/KPI changed to supply packets in net byte order to AF_INET filter hooks."
+msgstr "10-CURRENT после изменения KBI/KPI в man:pfil[9] для передачи пакетов в порядке байтов сети к хукам фильтрации AF_INET."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3721
+#, no-wrap
+msgid "1000020"
+msgstr "1000020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3722
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/241610[241610]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/241610[241610]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3723
+#, no-wrap
+msgid "October 16, 2012"
+msgstr "16 октября 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3725
+#, no-wrap
+msgid "10-CURRENT after the network interface cloning KPI changed and struct `if_clone` becoming opaque."
+msgstr "10-CURRENT после изменения KPI клонирования сетевых интерфейсов и структура `if_clone` стала непрозрачной."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3726
+#, no-wrap
+msgid "1000021"
+msgstr "1000021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3727
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/241897[241897]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/241897[241897]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3728
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3733
+#, no-wrap
+msgid "October 22, 2012"
+msgstr "22 октября 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3730
+#, no-wrap
+msgid "10-CURRENT after removal of support for non-MPSAFE filesystems and addition of support for FUSEFS (rev link:https://svnweb.freebsd.org/changeset/base/241519[241519])."
+msgstr "10-CURRENT после удаления поддержки не-MPSAFE файловых систем и добавления поддержки FUSEFS (rev link:https://svnweb.freebsd.org/changeset/base/241519[241519])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3731
+#, no-wrap
+msgid "1000022"
+msgstr "1000022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3732
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/241913[241913]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/241913[241913]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3735
+#, no-wrap
+msgid "10-CURRENT after the entire IPv4 stack switched to network byte order for IP packet header storage."
+msgstr "10-CURRENT после перевода всего стека IPv4 на сетевой порядок байтов для хранения заголовков IP-пакетов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3736
+#, no-wrap
+msgid "1000023"
+msgstr "1000023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3737
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/242619[242619]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/242619[242619]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3738
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3743
+#, no-wrap
+msgid "November 5, 2012"
+msgstr "5 ноября 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3740
+#, no-wrap
+msgid "10-CURRENT after jitter buffer in the common USB serial driver code, to temporarily store characters if the TTY buffer is full. Add flow stop and start signals when this happens."
+msgstr "10-CURRENT после буфера джиттера в общем коде драйвера USB-последовательного порта, для временного хранения символов, если буфер TTY заполнен. Добавлены сигналы остановки и возобновления потока при возникновении такой ситуации."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3741
+#, no-wrap
+msgid "1000024"
+msgstr "1000024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3742
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/242624[242624]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/242624[242624]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3745
+#, no-wrap
+msgid "10-CURRENT after clang was made the default compiler on i386 and amd64."
+msgstr "10-CURRENT после того, как clang стал компилятором по умолчанию для i386 и amd64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3746
+#, no-wrap
+msgid "1000025"
+msgstr "1000025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3747
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/243443[243443]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/243443[243443]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3748
+#, no-wrap
+msgid "November 17, 2012"
+msgstr "17 ноября 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3750
+#, no-wrap
+msgid "10-CURRENT after the sin6_scope_id member variable in struct sockaddr_in6 was changed to being filled by the kernel before passing the structure to the userland via sysctl or routing socket. This means the KAME-specific embedded scope id in sin6_addr.s6_addr[2] is always cleared in userland application."
+msgstr "10-CURRENT после того, как переменная-член sin6_scope_id в структуре sockaddr_in6 была изменена таким образом, что ядро заполняет её перед передачей структуры в пользовательское пространство через sysctl или сокет маршрутизации. Это означает, что специфичный для KAME встроенный идентификатор области в sin6_addr.s6_addr[2] всегда очищается в пользовательских приложениях."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3751
+#, no-wrap
+msgid "1000026"
+msgstr "1000026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3752
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/245313[245313]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/245313[245313]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3753
+#, no-wrap
+msgid "January 11, 2013"
+msgstr "11 января 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3755
+#, no-wrap
+msgid "10-CURRENT after install gained the -N flag. May also be used to indicate the presence of nmtree."
+msgstr "10-CURRENT после установки получил флаг -N. Также может использоваться для указания наличия nmtree."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3756
+#, no-wrap
+msgid "1000027"
+msgstr "1000027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3757
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/246084[246084]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/246084[246084]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3758
+#, no-wrap
+msgid "January 29, 2013"
+msgstr "29 января 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3760
+#, no-wrap
+msgid "10-CURRENT after cat gained the -l flag (rev link:https://svnweb.freebsd.org/changeset/base/246083[246083])."
+msgstr "10-CURRENT после того, как команда `cat` получила флаг `-l` (rev link:https://svnweb.freebsd.org/changeset/base/246083[246083])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3761
+#, no-wrap
+msgid "1000028"
+msgstr "1000028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3762
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/246759[246759]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/246759[246759]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3763
+#, no-wrap
+msgid "February 13, 2013"
+msgstr "13 февраля 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3765
+#, no-wrap
+msgid "10-CURRENT after USB moved to the driver structure requiring a rebuild of all USB modules."
+msgstr "10-CURRENT после перемещения USB в структуру драйверов, требующую пересборки всех модулей USB."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3766
+#, no-wrap
+msgid "1000029"
+msgstr "1000029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3767
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/247821[247821]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/247821[247821]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3768
+#, no-wrap
+msgid "March 4, 2013"
+msgstr "4 марта 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3770
+#, no-wrap
+msgid "10-CURRENT after the introduction of tickless callout facility which also changed the layout of struct callout (rev link:https://svnweb.freebsd.org/changeset/base/247777[247777])."
+msgstr "10-CURRENT после внедрения бестиковой системы отложенных вызовов, которая также изменила структуру struct callout (rev link:https://svnweb.freebsd.org/changeset/base/247777[247777])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3771
+#, no-wrap
+msgid "1000030"
+msgstr "1000030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3772
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/248210[248210]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/248210[248210]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3773
+#, no-wrap
+msgid "March 12, 2013"
+msgstr "12 марта 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3775
+#, no-wrap
+msgid "10-CURRENT after KPI breakage introduced in the VM subsystem to support read/write locking (rev link:https://svnweb.freebsd.org/changeset/base/248084[248084])."
+msgstr "10-CURRENT после нарушения KPI, внесённого в подсистему VM для поддержки блокировок чтения/записи (rev link:https://svnweb.freebsd.org/changeset/base/248084[248084])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3776
+#, no-wrap
+msgid "1000031"
+msgstr "1000031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3777
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/249943[249943]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/249943[249943]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3778
+#, no-wrap
+msgid "April 26, 2013"
+msgstr "26 апреля 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3780
+#, no-wrap
+msgid "10-CURRENT after the `dst` parameter of the ifnet `if_output` method was changed to take const qualifier (rev link:https://svnweb.freebsd.org/changeset/base/249925[249925])."
+msgstr "10-CURRENT после изменения параметра `dst` метода `if_output` в ifnet, чтобы он принимал квалификатор const (ревизия link:https://svnweb.freebsd.org/changeset/base/249925[249925])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3781
+#, no-wrap
+msgid "1000032"
+msgstr "1000032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3782
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/250163[250163]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/250163[250163]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3783
+#, no-wrap
+msgid "May 1, 2013"
+msgstr "1 мая 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3785
+#, no-wrap
+msgid "10-CURRENT after the introduction of the man:accept4[2] (rev link:https://svnweb.freebsd.org/changeset/base/250154[250154]) and man:pipe2[2] (rev link:https://svnweb.freebsd.org/changeset/base/250159[250159]) system calls."
+msgstr "10-CURRENT после введения системных вызовов man:accept4[2] (rev link:https://svnweb.freebsd.org/changeset/base/250154[250154]) и man:pipe2[2] (rev link:https://svnweb.freebsd.org/changeset/base/250159[250159])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3786
+#, no-wrap
+msgid "1000033"
+msgstr "1000033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3787
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/250881[250881]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/250881[250881]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3788
+#, no-wrap
+msgid "May 21, 2013"
+msgstr "21 мая 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3790
+#, no-wrap
+msgid "10-CURRENT after flex 2.5.37 import."
+msgstr "10-CURRENT после импорта flex 2.5.37."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3791
+#, no-wrap
+msgid "1000034"
+msgstr "1000034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3792
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/251294[251294]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/251294[251294]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3793
+#, no-wrap
+msgid "June 3, 2013"
+msgstr "3 июня 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3795
+#, no-wrap
+msgid "10-CURRENT after the addition of these functions to libm: man:cacos[3], man:cacosf[3], man:cacosh[3], man:cacoshf[3], man:casin[3], man:casinf[3], man:casinh[3], man:casinhf[3], man:catan[3], man:catanf[3], man:catanh[3], man:catanhf[3], man:logl[3], man:log2l[3], man:log10l[3], man:log1pl[3], man:expm1l[3]."
+msgstr "10-CURRENT после добавления следующих функций в libm: man:cacos[3], man:cacosf[3], man:cacosh[3], man:cacoshf[3], man:casin[3], man:casinf[3], man:casinh[3], man:casinhf[3], man:catan[3], man:catanf[3], man:catanh[3], man:catanhf[3], man:logl[3], man:log2l[3], man:log10l[3], man:log1pl[3], man:expm1l[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3796
+#, no-wrap
+msgid "1000035"
+msgstr "1000035"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3797
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/251527[251527]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/251527[251527]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3798
+#, no-wrap
+msgid "June 8, 2013"
+msgstr "8 июня 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3800
+#, no-wrap
+msgid "10-CURRENT after the introduction of the man:aio_mlock[2] system call (rev link:https://svnweb.freebsd.org/changeset/base/251526[251526])."
+msgstr "10-CURRENT после введения системного вызова man:aio_mlock[2] (изменение link:https://svnweb.freebsd.org/changeset/base/251526[251526])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3801
+#, no-wrap
+msgid "1000036"
+msgstr "1000036"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3802
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/253049[253049]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/253049[253049]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3803
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3808
+#, no-wrap
+msgid "July 9, 2013"
+msgstr "9 июля 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3805
+#, no-wrap
+msgid "10-CURRENT after the addition of a new function to the kernel GSSAPI module's function call interface."
+msgstr "10-CURRENT после добавления новой функции в интерфейс вызовов функций модуля ядра GSSAPI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3806
+#, no-wrap
+msgid "1000037"
+msgstr "1000037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3807
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/253089[253089]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/253089[253089]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3810
+#, no-wrap
+msgid "10-CURRENT after the migration of statistics structures to PCPU counters. Changed structures include: `ahstat`, `arpstat`, `espstat`, `icmp6_ifstat`, `icmp6stat`, `in6_ifstat`, `ip6stat`, `ipcompstat`, `ipipstat`, `ipsecstat`, `mrt6stat`, `mrtstat`, `pfkeystat`, `pim6stat`, `pimstat`, `rip6stat`, `udpstat` (rev link:https://svnweb.freebsd.org/changeset/base/253081[253081])."
+msgstr "10-CURRENT после миграции структур статистики на PCPU-счетчики. Измененные структуры включают: `ahstat`, `arpstat`, `espstat`, `icmp6_ifstat`, `icmp6stat`, `in6_ifstat`, `ip6stat`, `ipcompstat`, `ipipstat`, `ipsecstat`, `mrt6stat`, `mrtstat`, `pfkeystat`, `pim6stat`, `pimstat`, `rip6stat`, `udpstat` (rev link:https://svnweb.freebsd.org/changeset/base/253081[253081])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3811
+#, no-wrap
+msgid "1000038"
+msgstr "1000038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3812
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/253396[253396]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/253396[253396]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3813
+#, no-wrap
+msgid "July 16, 2013"
+msgstr "16 июля 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3815
+#, no-wrap
+msgid "10-CURRENT after making `ARM EABI` the default ABI on arm, armeb, armv6, and armv6eb architectures."
+msgstr "10-CURRENT после установки `ARM EABI` в качестве ABI по умолчанию для архитектур arm, armeb, armv6 и armv6eb."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3816
+#, no-wrap
+msgid "1000039"
+msgstr "1000039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3817
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/253549[253549]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/253549[253549]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3818
+#, no-wrap
+msgid "July 22, 2013"
+msgstr "22 июля 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3820
+#, no-wrap
+msgid "10-CURRENT after `CAM` and man:mps[4] driver scanning changes."
+msgstr "10-CURRENT после изменений в сканировании драйверов `CAM` и man:mps[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3821
+#, no-wrap
+msgid "1000040"
+msgstr "1000040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3822
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/253638[253638]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/253638[253638]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3823
+#, no-wrap
+msgid "July 24, 2013"
+msgstr "24 июля 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3825
+#, no-wrap
+msgid "10-CURRENT after addition of libusb `pkgconf` files."
+msgstr "10-CURRENT после добавления файлов `pkgconf` для libusb."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3826
+#, no-wrap
+msgid "1000041"
+msgstr "1000041"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3827
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/253970[253970]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/253970[253970]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3828
+#, no-wrap
+msgid "August 5, 2013"
+msgstr "5 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3830
+#, no-wrap
+msgid "10-CURRENT after change from `time_second` to `time_uptime` in `PF_INET6`."
+msgstr "10-CURRENT после изменения с `time_second` на `time_uptime` в `PF_INET6`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3831
+#, no-wrap
+msgid "1000042"
+msgstr "1000042"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3832
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254138[254138]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254138[254138]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3833
+#, no-wrap
+msgid "August 9, 2013"
+msgstr "9 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3835
+#, no-wrap
+msgid "10-CURRENT after VM subsystem change to unify soft and hard busy mechanisms."
+msgstr "10-CURRENT после изменения подсистемы VM для объединения механизмов мягкой и жесткой занятости."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3836
+#, no-wrap
+msgid "1000043"
+msgstr "1000043"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3837
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254273[254273]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254273[254273]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3838
+#, no-wrap
+msgid "August 13, 2013"
+msgstr "13 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3840
+#, no-wrap
+msgid "10-CURRENT after `WITH_ICONV` is enabled by default. A new man:src.conf[5] option, `WITH_LIBICONV_COMPAT` (disabled by default) adds `libiconv_open` to provide compatibility with the package:converters/libiconv[] port."
+msgstr "10-CURRENT после того, как `WITH_ICONV` включён по умолчанию. Новая опция man:src.conf[5], `WITH_LIBICONV_COMPAT` (выключена по умолчанию), добавляет `libiconv_open` для обеспечения совместимости с портом package:converters/libiconv[]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3841
+#, no-wrap
+msgid "1000044"
+msgstr "1000044"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3842
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254358[254358]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254358[254358]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3843
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3848
+#, no-wrap
+msgid "August 15, 2013"
+msgstr "15 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3845
+#, no-wrap
+msgid "10-CURRENT after [.filename]#libc.so# conversion to an man:ld[1] script (rev link:https://svnweb.freebsd.org/changeset/base/251668[251668])."
+msgstr "10-CURRENT после преобразования [.filename]#libc.so# в скрипт man:ld[1] (изменение rev link:https://svnweb.freebsd.org/changeset/base/251668[251668])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3846
+#, no-wrap
+msgid "1000045"
+msgstr "1000045"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3847
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254389[254389]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254389[254389]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3850
+#, no-wrap
+msgid "10-CURRENT after devfs programming interface change by replacing the cdevsw flag `D_UNMAPPED_IO` with the struct cdev flag `SI_UNMAPPED`."
+msgstr "10-CURRENT после изменения программного интерфейса devfs путем замены флага `D_UNMAPPED_IO` в cdevsw на флаг `SI_UNMAPPED` в структуре cdev."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3851
+#, no-wrap
+msgid "1000046"
+msgstr "1000046"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3852
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254537[254537]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254537[254537]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3853
+#, no-wrap
+msgid "August 19, 2013"
+msgstr "19 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3853
+#, no-wrap
+msgid "10-CURRENT after addition of `M_PROTO[9-12]` and removal of `M_FRAG\\"
+msgstr "10-CURRENT после добавления `M_PROTO[9-12]` и удаления `M_FRAG`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3853
+#, no-wrap
+msgid "M_FIRSTFRAG\\"
+msgstr "M_FIRSTFRAG\\"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3855
+#, no-wrap
+msgid "M_LASTFRAG` mbuf flags (rev link:https://svnweb.freebsd.org/changeset/base/254524[254524], link:https://svnweb.freebsd.org/changeset/base/254526[254526])."
+msgstr "M_LASTFRAG` флаги mbuf (версии link:https://svnweb.freebsd.org/changeset/base/254524[254524], link:https://svnweb.freebsd.org/changeset/base/254526[254526])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3856
+#, no-wrap
+msgid "1000047"
+msgstr "1000047"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3857
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254627[254627]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254627[254627]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3858
+#, no-wrap
+msgid "August 21, 2013"
+msgstr "21 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3860
+#, no-wrap
+msgid "10-CURRENT after man:stat[2] update to allow storing some Windows/DOS and CIFS file attributes as man:stat[2] flags."
+msgstr "10-CURRENT после обновления man:stat[2], позволяющего сохранять некоторые атрибуты файлов Windows/DOS и CIFS в виде флагов man:stat[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3861
+#, no-wrap
+msgid "1000048"
+msgstr "1000048"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3862
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254672[254672]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254672[254672]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3863
+#, no-wrap
+msgid "August 22, 2013"
+msgstr "August 22, 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3865
+#, no-wrap
+msgid "10-CURRENT after modification of structure `xsctp_inpcb`."
+msgstr "10-CURRENT после изменения структуры `xsctp_inpcb`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3866
+#, no-wrap
+msgid "1000049"
+msgstr "1000049"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3867
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254760[254760]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254760[254760]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3868
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3873
+#, no-wrap
+msgid "August 24, 2013"
+msgstr "24 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3870
+#, no-wrap
+msgid "10-CURRENT after man:physio[9] support for devices that do not function properly with split I/O, such as man:sa[4]."
+msgstr "10-CURRENT после поддержки man:physio[9] для устройств, которые работают некорректно с разделённым вводом-выводом, таких как man:sa[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3871
+#, no-wrap
+msgid "1000050"
+msgstr "1000050"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3872
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254844[254844]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254844[254844]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3875
+#, no-wrap
+msgid "10-CURRENT after modifications of structure `mbuf` (rev link:https://svnweb.freebsd.org/changeset/base/254780[254780], link:https://svnweb.freebsd.org/changeset/base/254799[254799], link:https://svnweb.freebsd.org/changeset/base/254804[254804], link:https://svnweb.freebsd.org/changeset/base/254807[254807]link:https://svnweb.freebsd.org/changeset/base/254842[254842])."
+msgstr "10-CURRENT после изменений структуры `mbuf` (rev link:https://svnweb.freebsd.org/changeset/base/254780[254780], link:https://svnweb.freebsd.org/changeset/base/254799[254799], link:https://svnweb.freebsd.org/changeset/base/254804[254804], link:https://svnweb.freebsd.org/changeset/base/254807[254807]link:https://svnweb.freebsd.org/changeset/base/254842[254842])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3876
+#, no-wrap
+msgid "1000051"
+msgstr "1000051"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3877
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254887[254887]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254887[254887]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3878
+#, no-wrap
+msgid "August 25, 2013"
+msgstr "25 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3880
+#, no-wrap
+msgid "10-CURRENT after Radeon KMS driver import (rev link:https://svnweb.freebsd.org/changeset/base/254885[254885])."
+msgstr "10-CURRENT после импорта драйвера Radeon KMS (ревизия link:https://svnweb.freebsd.org/changeset/base/254885[254885])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3881
+#, no-wrap
+msgid "1000052"
+msgstr "1000052"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3882
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/255180[255180]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/255180[255180]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3883
+#, no-wrap
+msgid "September 3, 2013"
+msgstr "3 сентября 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3885
+#, no-wrap
+msgid "10-CURRENT after import of NetBSD `libexecinfo` is connected to the build."
+msgstr "10-CURRENT после импорта NetBSD `libexecinfo` подключен к сборке."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3886
+#, no-wrap
+msgid "1000053"
+msgstr "1000053"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3887
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/255305[255305]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/255305[255305]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3888
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3893
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3898
+#, no-wrap
+msgid "September 6, 2013"
+msgstr "6 сентября 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3890
+#, no-wrap
+msgid "10-CURRENT after API and ABI changes to the Capsicum framework."
+msgstr "10-CURRENT после изменений API и ABI в рамках Capsicum."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3891
+#, no-wrap
+msgid "1000054"
+msgstr "1000054"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3892
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/255321[255321]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/255321[255321]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3895
+#, no-wrap
+msgid "10-CURRENT after `gcc` and `libstdc++` are no longer built by default."
+msgstr "10-CURRENT после того, как `gcc` и `libstdc++` больше не собираются по умолчанию."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3896
+#, no-wrap
+msgid "1000055"
+msgstr "1000055"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3897
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/255449[255449]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/255449[255449]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3900
+#, no-wrap
+msgid "10-CURRENT after addition of `MMAP_32BIT` man:mmap[2] flag (rev link:https://svnweb.freebsd.org/changeset/base/255426[255426])."
+msgstr "10-CURRENT после добавления флага `MMAP_32BIT` в man:mmap[2] (rev link:https://svnweb.freebsd.org/changeset/base/255426[255426])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3901
+#, no-wrap
+msgid "1000100"
+msgstr "1000100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3902
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/259065[259065]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/259065[259065]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3903
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3923
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3928
+#, no-wrap
+msgid "December 7, 2013"
+msgstr "December 7, 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3905
+#, no-wrap
+msgid "`releng/10.0` branched from `stable/10`."
+msgstr "`releng/10.0` ответвился от `stable/10`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3906
+#, no-wrap
+msgid "1000500"
+msgstr "1000500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3907
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/256283[256283]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/256283[256283]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3910
+#, no-wrap
+msgid "10-STABLE after branch from `head/`."
+msgstr "10-STABLE после ветвления от `head/`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3911
+#, no-wrap
+msgid "1000501"
+msgstr "1000501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3912
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/256916[256916]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/256916[256916]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3913
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4626
+#, no-wrap
+msgid "October 22, 2013"
+msgstr "22 октября 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3915
+#, no-wrap
+msgid "10-STABLE after addition of first-boot man:rc[8] support."
+msgstr "10-STABLE после добавления поддержки man:rc[8] при первой загрузке."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3916
+#, no-wrap
+msgid "1000502"
+msgstr "1000502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3917
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/258398[258398]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/258398[258398]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3918
+#, no-wrap
+msgid "November 20, 2013"
+msgstr "20 ноября 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3920
+#, no-wrap
+msgid "10-STABLE after removal of iconv symbols from `libc.so.7`."
+msgstr "10-STABLE после удаления символов iconv из `libc.so.7`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3921
+#, no-wrap
+msgid "1000510"
+msgstr "1000510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3922
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/259067[259067]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/259067[259067]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3925
+#, no-wrap
+msgid "`releng/10.0` __FreeBSD_version update to prevent the value from going backwards."
+msgstr "`releng/10.0` __FreeBSD_version обновлён, чтобы предотвратить уменьшение значения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3926
+#, no-wrap
+msgid "1000700"
+msgstr "1000700"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3927
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/259069[259069]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/259069[259069]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3930
+#, no-wrap
+msgid "10-STABLE after `releng/10.0` branch."
+msgstr "10-STABLE после ветки `releng/10.0`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3931
+#, no-wrap
+msgid "1000701"
+msgstr "1000701"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3932
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/259447[259447]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/259447[259447]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3935
+#, no-wrap
+msgid "10.0-STABLE after Heimdal encoding fix."
+msgstr "10.0-STABLE после исправления кодирования Heimdal."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3936
+#, no-wrap
+msgid "1000702"
+msgstr "1000702"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3937
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/260135[260135]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/260135[260135]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3938
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4636
+#, no-wrap
+msgid "December 31, 2013"
+msgstr "31 декабря 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3940
+#, no-wrap
+msgid "10-STABLE after MAP_STACK fixes."
+msgstr "10-STABLE после исправлений MAP_STACK."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3941
+#, no-wrap
+msgid "1000703"
+msgstr "1000703"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3942
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4640
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/262801[262801]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/262801[262801]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3943
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4641
+#, no-wrap
+msgid "March 5, 2014"
+msgstr "5 марта 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3945
+#, no-wrap
+msgid "10-STABLE after upgrade of libc++ to 3.4 release."
+msgstr "10-STABLE после обновления libc++ до версии 3.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3946
+#, no-wrap
+msgid "1000704"
+msgstr "1000704"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3947
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/262889[262889]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/262889[262889]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3948
+#, no-wrap
+msgid "March 7, 2014"
+msgstr "7 марта 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3950
+#, no-wrap
+msgid "10-STABLE after MFC of the man:vt[4] driver (rev link:https://svnweb.freebsd.org/changeset/base/262861[262861])."
+msgstr "10-STABLE после слияния из ветки man:vt[4] драйвера (ревизия link:https://svnweb.freebsd.org/changeset/base/262861[262861])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3951
+#, no-wrap
+msgid "1000705"
+msgstr "1000705"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3952
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263508[263508]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263508[263508]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3953
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4651
+#, no-wrap
+msgid "March 21, 2014"
+msgstr "21 марта 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3955
+#, no-wrap
+msgid "10-STABLE after upgrade of llvm/clang to 3.4 release."
+msgstr "10-STABLE после обновления llvm/clang до версии 3.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3956
+#, no-wrap
+msgid "1000706"
+msgstr "1000706"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3957
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/264214[264214]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/264214[264214]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3960
+#, no-wrap
+msgid "10-STABLE after GCC support for `__block` definition."
+msgstr "10-STABLE после удаления поддержки GCC для определения `__block`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3961
+#, no-wrap
+msgid "1000707"
+msgstr "1000707"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3965
+#, no-wrap
+msgid "10-STABLE after FreeBSD-SA-14:06.openssl."
+msgstr "10-STABLE после FreeBSD-SA-14:06.openssl."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3966
+#, no-wrap
+msgid "1000708"
+msgstr "1000708"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3967
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/265122[265122]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/265122[265122]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3968
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4666
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5469
+#, no-wrap
+msgid "April 30, 2014"
+msgstr "30 апреля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3970
+#, no-wrap
+msgid "10-STABLE after FreeBSD-SA-14:07.devfs, FreeBSD-SA-14:08.tcp, and FreeBSD-SA-14:09.openssl."
+msgstr "10-STABLE после FreeBSD-SA-14:07.devfs, FreeBSD-SA-14:08.tcp и FreeBSD-SA-14:09.openssl."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3971
+#, no-wrap
+msgid "1000709"
+msgstr "1000709"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3972
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/265946[265946]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/265946[265946]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3973
+#, no-wrap
+msgid "May 13, 2014"
+msgstr "13 мая 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3975
+#, no-wrap
+msgid "10-STABLE after support for UDP-Lite protocol (RFC 3828)."
+msgstr "10-STABLE после добавления поддержки протокола UDP-Lite (RFC 3828)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3976
+#, no-wrap
+msgid "1000710"
+msgstr "1000710"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3977
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/267465[267465]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/267465[267465]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3980
+#, no-wrap
+msgid "10-STABLE after changes to man:strcasecmp[3], moving man:strcasecmp_l[3] and man:strncasecmp_l[3] from [.filename]#<string.h># to [.filename]#<strings.h># for POSIX 2008 compliance."
+msgstr "10-STABLE после изменений в man:strcasecmp[3], переноса man:strcasecmp_l[3] и man:strncasecmp_l[3] из [.filename]#<string.h># в [.filename]#<strings.h># для соответствия POSIX 2008."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3981
+#, no-wrap
+msgid "1000711"
+msgstr "1000711"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3982
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/268442[268442]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/268442[268442]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3985
+#, no-wrap
+msgid "10-STABLE after FreeBSD-SA-14:17.kmem (rev link:https://svnweb.freebsd.org/changeset/base/268432[268432])."
+msgstr "10-STABLE после FreeBSD-SA-14:17.kmem (ревизия:https://svnweb.freebsd.org/changeset/base/268432[268432])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3986
+#, no-wrap
+msgid "1000712"
+msgstr "1000712"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3987
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/269400[269400]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/269400[269400]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3988
+#, no-wrap
+msgid "August 1, 2014"
+msgstr "1 августа 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3990
+#, no-wrap
+msgid "10-STABLE after man:nfsd[8] 4.1 merge (rev link:https://svnweb.freebsd.org/changeset/base/269398[269398])."
+msgstr "10-STABLE после слияния man:nfsd[8] 4.1 (rev link:https://svnweb.freebsd.org/changeset/base/269398[269398])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3991
+#, no-wrap
+msgid "1000713"
+msgstr "1000713"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3992
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/269484[269484]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/269484[269484]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3995
+#, no-wrap
+msgid "10-STABLE after man:regex[3] library update to add \">\" and \"<\" delimiters."
+msgstr "10-STABLE после обновления библиотеки man:regex[3] для добавления разделителей \">\" и \"<\"."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3996
+#, no-wrap
+msgid "1000714"
+msgstr "1000714"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:3997
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/270174[270174]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/270174[270174]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4000
+#, no-wrap
+msgid "10-STABLE after `SOCK_DGRAM` bug fix (rev link:https://svnweb.freebsd.org/changeset/base/269490[269490])."
+msgstr "10-STABLE после исправления ошибки `SOCK_DGRAM` (rev link:https://svnweb.freebsd.org/changeset/base/269490[269490])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4001
+#, no-wrap
+msgid "1000715"
+msgstr "1000715"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4005
+#, no-wrap
+msgid "10-STABLE after FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/269686[269686])."
+msgstr "10-STABLE после FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/269686[269686])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4006
+#, no-wrap
+msgid "1000716"
+msgstr "1000716"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4010
+#, no-wrap
+msgid "10-STABLE after FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271667[271667])."
+msgstr "10-STABLE после FreeBSD-SA-14:19 (ревизия link:https://svnweb.freebsd.org/changeset/base/271667[271667])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4011
+#, no-wrap
+msgid "1000717"
+msgstr "1000717"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4012
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/271816[271816]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/271816[271816]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4013
+#, no-wrap
+msgid "September 18, 2014"
+msgstr "18 сентября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4015
+#, no-wrap
+msgid "10-STABLE after i915 HW context support."
+msgstr "10-STABLE после добавления поддержки аппаратного контекста i915."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4016
+#, no-wrap
+msgid "1001000"
+msgstr "1001000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4017
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/272463[272463]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/272463[272463]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4018
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4023
+#, no-wrap
+msgid "October 2, 2014"
+msgstr "2 октября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4020
+#, no-wrap
+msgid "10.1-RC1 after releng/10.1 branch."
+msgstr "10.1-RC1 после ветки releng/10.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4021
+#, no-wrap
+msgid "1001500"
+msgstr "1001500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4022
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/272464[272464]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/272464[272464]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4025
+#, no-wrap
+msgid "10-STABLE after releng/10.1 branch."
+msgstr "10-STABLE после ветки releng/10.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4026
+#, no-wrap
+msgid "1001501"
+msgstr "1001501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4030
+#, no-wrap
+msgid "10-STABLE after FreeBSD-SA-14:20, FreeBSD-SA-14:22, and FreeBSD-SA-14:23 (rev link:https://svnweb.freebsd.org/changeset/base/273411[273411])."
+msgstr "10-STABLE после исправлений уязвимостей FreeBSD-SA-14:20, FreeBSD-SA-14:22 и FreeBSD-SA-14:23 (ссылка на ревизию: https://svnweb.freebsd.org/changeset/base/273411[273411])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4031
+#, no-wrap
+msgid "1001502"
+msgstr "1001502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4035
+#, no-wrap
+msgid "10-STABLE after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25."
+msgstr "10-STABLE после FreeBSD-SA-14:23, FreeBSD-SA-14:24 и FreeBSD-SA-14:25."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4036
+#, no-wrap
+msgid "1001503"
+msgstr "1001503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4037
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/275040[275040]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/275040[275040]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4038
+#, no-wrap
+msgid "November 25, 2014"
+msgstr "25 ноября 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4040
+#, no-wrap
+msgid "10-STABLE after merging new libraries/utilities (man:dpv[1] man:dpv[3], and man:figpar[3]) for data throughput visualization."
+msgstr "10-STABLE после объединения новых библиотек/утилит (man:dpv[1], man:dpv[3] и man:figpar[3]) для визуализации пропускной способности данных."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4041
+#, no-wrap
+msgid "1001504"
+msgstr "1001504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4042
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4710
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/275742[275742]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/275742[275742]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4043
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4711
+#, no-wrap
+msgid "December 13, 2014"
+msgstr "13 декабря 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4045
+#, no-wrap
+msgid "10-STABLE after merging an important fix to the LLVM vectorizer, which could lead to buffer overruns in some cases."
+msgstr "10-STABLE после объединения важного исправления в векторизатор LLVM, которое в некоторых случаях могло приводить к переполнению буфера."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4046
+#, no-wrap
+msgid "1001505"
+msgstr "1001505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4047
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/276633[276633]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/276633[276633]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4048
+#, no-wrap
+msgid "January 3, 2015"
+msgstr "3 января 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4050
+#, no-wrap
+msgid "10-STABLE after merging some arm constants in link:https://svnweb.freebsd.org/changeset/base/276312[276312]."
+msgstr "10-STABLE после объединения некоторых констант ARM в link:https://svnweb.freebsd.org/changeset/base/276312[276312]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4051
+#, no-wrap
+msgid "1001506"
+msgstr "1001506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4052
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/277087[277087]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/277087[277087]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4053
+#, no-wrap
+msgid "January 12, 2015"
+msgstr "12 января 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4055
+#, no-wrap
+msgid "10-STABLE after merging max table size update for yacc."
+msgstr "10-STABLE после объединения обновления максимального размера таблицы для yacc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4056
+#, no-wrap
+msgid "1001507"
+msgstr "1001507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4057
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/277790[277790]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/277790[277790]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4058
+#, no-wrap
+msgid "January 27, 2015"
+msgstr "27 января 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4060
+#, no-wrap
+msgid "10-STABLE after changes to the UDP tunneling callback to provide a context pointer and the source `sockaddr`."
+msgstr "10-STABLE после изменений в обратном вызове туннелирования UDP для предоставления указателя контекста и исходного `sockaddr`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4061
+#, no-wrap
+msgid "1001508"
+msgstr "1001508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4062
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/278974[278974]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/278974[278974]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4065
+#, no-wrap
+msgid "10-STABLE after addition of the `CDAI_TYPE_EXT_INQ` request type."
+msgstr "10-STABLE после добавления типа запроса `CDAI_TYPE_EXT_INQ`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4066
+#, no-wrap
+msgid "1001509"
+msgstr "1001509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4067
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4715
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5498
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/279287[279287]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/279287[279287]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4068
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4716
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5499
+#, no-wrap
+msgid "February 25, 2015"
+msgstr "25 февраля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4070
+#, no-wrap
+msgid "10-STABLE after FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp, and FreeBSD-SA-15:05.bind."
+msgstr "10-STABLE после FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp и FreeBSD-SA-15:05.bind."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4071
+#, no-wrap
+msgid "1001510"
+msgstr "1001510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4072
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/279329[279329]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/279329[279329]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4073
+#, no-wrap
+msgid "February 26, 2015"
+msgstr "26 февраля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4075
+#, no-wrap
+msgid "10-STABLE after MFC of rev link:https://svnweb.freebsd.org/changeset/base/278964[278964]."
+msgstr "10-STABLE после MFC ревизии link:https://svnweb.freebsd.org/changeset/base/278964[278964]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4076
+#, no-wrap
+msgid "1001511"
+msgstr "1001511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4077
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/280246[280246]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/280246[280246]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4078
+#, no-wrap
+msgid "March 19, 2015"
+msgstr "19 марта 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4080
+#, no-wrap
+msgid "10-STABLE after [.filename]#sys/capability.h# is renamed to [.filename]#sys/capsicum.h# (rev link:https://svnweb.freebsd.org/changeset/base/280224/[280224/])."
+msgstr "10-STABLE после переименования [.filename]#sys/capability.h# в [.filename]#sys/capsicum.h# (изменение:https://svnweb.freebsd.org/changeset/base/280224/[280224/])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4081
+#, no-wrap
+msgid "1001512"
+msgstr "1001512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4082
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/280438[280438]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/280438[280438]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4083
+#, no-wrap
+msgid "March 24, 2015"
+msgstr "24 марта 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4085
+#, no-wrap
+msgid "10-STABLE after addition of new man:mtio[4], man:sa[4] ioctls."
+msgstr "10-STABLE после добавления новых ioctl в man:mtio[4] и man:sa[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4086
+#, no-wrap
+msgid "1001513"
+msgstr "1001513"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4087
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/281955[281955]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/281955[281955]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4088
+#, no-wrap
+msgid "April 24, 2015"
+msgstr "24 апреля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4090
+#, no-wrap
+msgid "10-STABLE after starting the process of removing the use of the deprecated \"M_FLOWID\" flag from the network code."
+msgstr "10-STABLE после начала процесса удаления использования устаревшего флага \"M_FLOWID\" из сетевого кода."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4091
+#, no-wrap
+msgid "1001514"
+msgstr "1001514"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4092
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/282275[282275]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/282275[282275]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4093
+#, no-wrap
+msgid "April 30, 2015"
+msgstr "30 апреля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4095
+#, no-wrap
+msgid "10-STABLE after MFC of man:iconv[3] fixes."
+msgstr "10-STABLE после MFC исправлений man:iconv[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4096
+#, no-wrap
+msgid "1001515"
+msgstr "1001515"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4097
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/282781[282781]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/282781[282781]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4098
+#, no-wrap
+msgid "May 11, 2015"
+msgstr "11 мая 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4100
+#, no-wrap
+msgid "10-STABLE after adding back `M_FLOWID`."
+msgstr "10-STABLE после возврата `M_FLOWID`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4101
+#, no-wrap
+msgid "1001516"
+msgstr "1001516"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4102
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/283341[283341]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/283341[283341]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4103
+#, no-wrap
+msgid "May 24, 2015"
+msgstr "24 мая 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4105
+#, no-wrap
+msgid "10-STABLE after MFC of many USB things."
+msgstr "10-STABLE после переноса (MFC) множества изменений, связанных с USB."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4106
+#, no-wrap
+msgid "1001517"
+msgstr "1001517"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4107
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/283950[283950]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/283950[283950]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4108
+#, no-wrap
+msgid "June 3, 2015"
+msgstr "3 июня 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4110
+#, no-wrap
+msgid "10-STABLE after MFC of sound related things."
+msgstr "10-STABLE после слияния изменений, связанных со звуком."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4111
+#, no-wrap
+msgid "1001518"
+msgstr "1001518"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4112
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/284204[284204]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/284204[284204]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4115
+#, no-wrap
+msgid "10-STABLE after MFC of zfs vfs fixes (rev link:https://svnweb.freebsd.org/changeset/base/284203[284203])."
+msgstr "10-STABLE после MFC исправлений vfs для zfs (rev link:https://svnweb.freebsd.org/changeset/base/284203[284203])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4116
+#, no-wrap
+msgid "1001519"
+msgstr "1001519"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4117
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/284720[284720]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/284720[284720]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4118
+#, no-wrap
+msgid "June 23, 2015"
+msgstr "23 июня 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4120
+#, no-wrap
+msgid "10-STABLE after reverting bumping `MAXCPU` on amd64."
+msgstr "10-STABLE после отмены увеличения `MAXCPU` на amd64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4121
+#, no-wrap
+msgid "1002000"
+msgstr "1002000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4122
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/285830[285830]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/285830[285830]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4123
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4128
+#, no-wrap
+msgid "July 24, 2015"
+msgstr "24 июля 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4125
+#, no-wrap
+msgid "`releng/10.2` branched from 10-STABLE."
+msgstr "`releng/10.2` отделился от 10-STABLE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4126
+#, no-wrap
+msgid "1002500"
+msgstr "1002500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4127
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/285831[285831]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/285831[285831]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4130
+#, no-wrap
+msgid "10-STABLE after `releng/10.2` branched from 10-STABLE."
+msgstr "10-STABLE после того, как ветка `releng/10.2` отделилась от 10-STABLE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4131
+#, no-wrap
+msgid "1002501"
+msgstr "1002501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4132
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/289005[289005]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/289005[289005]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4133
+#, no-wrap
+msgid "October 8, 2015"
+msgstr "8 октября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4135
+#, no-wrap
+msgid "10-STABLE after merge of ZFS changes that affected the internal interface of `zfeature_info` structure (rev link:https://svnweb.freebsd.org/changeset/base/288572[288572])."
+msgstr "10-STABLE после объединения изменений ZFS, затронувших внутренний интерфейс структуры `zfeature_info` (rev link:https://svnweb.freebsd.org/changeset/base/288572[288572])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4136
+#, no-wrap
+msgid "1002502"
+msgstr "1002502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4137
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/291243[291243]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/291243[291243]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4138
+#, no-wrap
+msgid "November 24, 2015"
+msgstr "24 ноября 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4140
+#, no-wrap
+msgid "10-STABLE after merge of dump device changes that affected the arguments of `g_dev_setdumpdev()`(rev link:https://svnweb.freebsd.org/changeset/base/291215[291215])."
+msgstr "10-STABLE после объединения изменений устройств дампа, которые затронули аргументы `g_dev_setdumpdev()`(rev link:https://svnweb.freebsd.org/changeset/base/291215[291215])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4141
+#, no-wrap
+msgid "1002503"
+msgstr "1002503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4142
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/292224[292224]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/292224[292224]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4143
+#, no-wrap
+msgid "December 14, 2015"
+msgstr "14 декабря 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4145
+#, no-wrap
+msgid "10-STABLE after merge of changes to the internal interface between the nfsd.ko and nfscommon.ko modules, requiring them to be upgraded together (rev link:https://svnweb.freebsd.org/changeset/base/292223[292223])."
+msgstr "10-STABLE после объединения изменений во внутренний интерфейс между модулями nfsd.ko и nfscommon.ko, что требует их совместного обновления (rev link:https://svnweb.freebsd.org/changeset/base/292223[292223])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4146
+#, no-wrap
+msgid "1002504"
+msgstr "1002504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4147
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/292589[292589]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/292589[292589]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4148
+#, no-wrap
+msgid "December 22, 2015"
+msgstr "22 декабря 2015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4150
+#, no-wrap
+msgid "10-STABLE after merge of xz 5.2.2 merge (multithread support) (rev link:https://svnweb.freebsd.org/changeset/base/292588[292588])."
+msgstr "10-STABLE после слияния xz 5.2.2 (поддержка многопоточности) (rev link:https://svnweb.freebsd.org/changeset/base/292588[292588])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4151
+#, no-wrap
+msgid "1002505"
+msgstr "1002505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4152
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/292908[292908]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/292908[292908]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4155
+#, no-wrap
+msgid "10-STABLE after merge of changes to man:pci[4] (rev link:https://svnweb.freebsd.org/changeset/base/292907[292907])."
+msgstr "10-STABLE после объединения изменений в man:pci[4] (rev link:https://svnweb.freebsd.org/changeset/base/292907[292907])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4156
+#, no-wrap
+msgid "1002506"
+msgstr "1002506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4157
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/293476[293476]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/293476[293476]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4158
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4163
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4168
+#, no-wrap
+msgid "January 9, 2016"
+msgstr "9 января 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4160
+#, no-wrap
+msgid "10-STABLE after merge of man:utimensat[2] (rev link:https://svnweb.freebsd.org/changeset/base/293473[293473])."
+msgstr "10-STABLE после объединения man:utimensat[2] (изменение link:https://svnweb.freebsd.org/changeset/base/293473[293473])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4161
+#, no-wrap
+msgid "1002507"
+msgstr "1002507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4162
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/293610[293610]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/293610[293610]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4165
+#, no-wrap
+msgid "10-STABLE after merge of changes to man:linux[4] (rev link:https://svnweb.freebsd.org/changeset/base/293477[293477] through link:https://svnweb.freebsd.org/changeset/base/293609[293609])."
+msgstr "10-STABLE после объединения изменений в man:linux[4] (rev link:https://svnweb.freebsd.org/changeset/base/293477[293477] через link:https://svnweb.freebsd.org/changeset/base/293609[293609])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4166
+#, no-wrap
+msgid "1002508"
+msgstr "1002508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4167
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/293619[293619]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/293619[293619]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4170
+#, no-wrap
+msgid "10-STABLE after merge of changes to man:figpar[3] types/macros (rev link:https://svnweb.freebsd.org/changeset/base/290275[290275])."
+msgstr "10-STABLE после объединения изменений в типы/макросы man:figpar[3] (rev link:https://svnweb.freebsd.org/changeset/base/290275[290275])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4171
+#, no-wrap
+msgid "1002509"
+msgstr "1002509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4172
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/295107[295107]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/295107[295107]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4173
+#, no-wrap
+msgid "February 1, 2016"
+msgstr "1 февраля 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4175
+#, no-wrap
+msgid "10-STABLE after merge of API change to man:dpv[3]."
+msgstr "10-STABLE после объединения изменения API в man:dpv[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4176
+#, no-wrap
+msgid "1003000"
+msgstr "1003000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4177
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/296373[296373]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/296373[296373]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4178
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4183
+#, no-wrap
+msgid "March 4, 2016"
+msgstr "4 марта 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4180
+#, no-wrap
+msgid "`releng/10.3` branched from 10-STABLE."
+msgstr "`releng/10.3` ответвился от 10-STABLE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4181
+#, no-wrap
+msgid "1003500"
+msgstr "1003500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4182
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/296374[296374]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/296374[296374]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4185
+#, no-wrap
+msgid "10-STABLE after `releng/10.3` branched from 10-STABLE."
+msgstr "10-STABLE после того, как ветка `releng/10.3` отделилась от 10-STABLE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4186
+#, no-wrap
+msgid "1003501"
+msgstr "1003501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4187
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/298299[298299]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/298299[298299]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4188
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4193
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4198
+#, no-wrap
+msgid "June 19, 2016"
+msgstr "19 июня 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4190
+#, no-wrap
+msgid "10-STABLE after adding -P option for `kdbcontrol` (rev link:https://svnweb.freebsd.org/changeset/base/298297[298297])."
+msgstr "10-STABLE после добавления опции -P для `kdbcontrol` (rev link:https://svnweb.freebsd.org/changeset/base/298297[298297])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4191
+#, no-wrap
+msgid "1003502"
+msgstr "1003502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4192
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/299966[299966]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/299966[299966]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4195
+#, no-wrap
+msgid "10-STABLE after libcrypto.so was made position independent."
+msgstr "10-STABLE после того, как libcrypto.so стала позиционно-независимой."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4196
+#, no-wrap
+msgid "1003503"
+msgstr "1003503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4197
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/300235[300235]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/300235[300235]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4200
+#, no-wrap
+msgid "10-STABLE after allowing `MK_` overrides (rev link:https://svnweb.freebsd.org/changeset/base/300233[300233])."
+msgstr "10-STABLE после разрешения переопределений `MK_` (изменение link:https://svnweb.freebsd.org/changeset/base/300233[300233])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4201
+#, no-wrap
+msgid "1003504"
+msgstr "1003504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4202
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/302066[302066]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/302066[302066]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4205
+#, no-wrap
+msgid "10-STABLE after MFC of `filemon` changes from 11-CURRENT."
+msgstr "10-STABLE после переноса изменений `filemon` из 11-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4206
+#, no-wrap
+msgid "1003505"
+msgstr "1003505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4207
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/302228[302228]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/302228[302228]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4208
+#, no-wrap
+msgid "June 27, 2016"
+msgstr "27 июня 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4210
+#, no-wrap
+msgid "10-STABLE after converting sed to use REG_STARTEND, fixing a Mesa issue."
+msgstr "10-STABLE после замены в sed на использование REG_STARTEND, с исправлением проблемы в Mesa."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4211
+#, no-wrap
+msgid "1003506"
+msgstr "1003506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4212
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/304611[304611]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/304611[304611]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4215
+#, no-wrap
+msgid "10-STABLE after adding C++11 `thread_local` support."
+msgstr "10-STABLE после добавления поддержки `thread_local` в C++11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4216
+#, no-wrap
+msgid "1003507"
+msgstr "1003507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4217
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/304864[304864]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/304864[304864]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4220
+#, no-wrap
+msgid "10-STABLE after `LC_*_MASK` fix."
+msgstr "10-STABLE после исправления `LC_*_MASK`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4221
+#, no-wrap
+msgid "1003508"
+msgstr "1003508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4222
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/305734[305734]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/305734[305734]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4225
+#, no-wrap
+msgid "10-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9]."
+msgstr "10-STABLE после устранения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4226
+#, no-wrap
+msgid "1003509"
+msgstr "1003509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4227
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/307331[307331]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/307331[307331]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4230
+#, no-wrap
+msgid "10-STABLE after ZFS merges."
+msgstr "10-STABLE после слияния с ZFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4231
+#, no-wrap
+msgid "1003510"
+msgstr "1003510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4232
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/308047[308047]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/308047[308047]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4235
+#, no-wrap
+msgid "10-STABLE after installing header files required development with libzfs_core."
+msgstr "10-STABLE после установки заголовочных файлов, необходимых для разработки с libzfs_core."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4236
+#, no-wrap
+msgid "1003511"
+msgstr "1003511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4237
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/310121[310121]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/310121[310121]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4240
+#, no-wrap
+msgid "10-STABLE after exporting whole thread name in `kinfo_proc` (rev link:https://svnweb.freebsd.org/changeset/base/309676[309676])."
+msgstr "10-STABLE после экспорта полного имени потока в `kinfo_proc` (rev link:https://svnweb.freebsd.org/changeset/base/309676[309676])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4241
+#, no-wrap
+msgid "1003512"
+msgstr "1003512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4242
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/315730[315730]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/315730[315730]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4243
+#, no-wrap
+msgid "March 22, 2017"
+msgstr "22 марта 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4245
+#, no-wrap
+msgid "10-STABLE after libmd changes (rev link:https://svnweb.freebsd.org/changeset/base/314143[314143])."
+msgstr "10-STABLE после изменений в libmd (rev link:https://svnweb.freebsd.org/changeset/base/314143[314143])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4246
+#, no-wrap
+msgid "1003513"
+msgstr "1003513"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4247
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/316499[316499]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/316499[316499]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4250
+#, no-wrap
+msgid "10-STABLE after making CAM SIM lock optional (revs link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674])."
+msgstr "10-STABLE после того, как блокировка CAM SIM стала опциональной (ревизии link:https://svnweb.freebsd.org/changeset/base/315673[315673], link:https://svnweb.freebsd.org/changeset/base/315674[315674])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4251
+#, no-wrap
+msgid "1003514"
+msgstr "1003514"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4252
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/318198[318198]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/318198[318198]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4255
+#, no-wrap
+msgid "10-STABLE after merging the addition of the [.filename]#<dev/mmc/mmc_ioctl.h># header."
+msgstr "10-STABLE после объединения добавления заголовочного файла [.filename]#<dev/mmc/mmc_ioctl.h>#."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4256
+#, no-wrap
+msgid "1003515"
+msgstr "1003515"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4257
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/321222[321222]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/321222[321222]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4258
+#, no-wrap
+msgid "July 19, 2017"
+msgstr "19 июля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4260
+#, no-wrap
+msgid "10-STABLE after adding C++14 sized deallocation functions to libc++."
+msgstr "10-STABLE после добавления функций освобождения памяти с указанием размера из C++14 в libc++."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4261
+#, no-wrap
+msgid "1003516"
+msgstr "1003516"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4262
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/321717[321717]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/321717[321717]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4263
+#, no-wrap
+msgid "July 30, 2017"
+msgstr "30 июля 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4265
+#, no-wrap
+msgid "10-STABLE after merging the `MAP_GUARD` man:mmap[2] flag addition."
+msgstr "10-STABLE после объединения добавления флага `MAP_GUARD` в man:mmap[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4266
+#, no-wrap
+msgid "1004000"
+msgstr "1004000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4267
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/323604[323604]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/323604[323604]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4268
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4273
+#, no-wrap
+msgid "September 15, 2017"
+msgstr "15 сентября 2017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4270
+#, no-wrap
+msgid "`releng/10.4` branched from 10-STABLE."
+msgstr "`releng/10.4` ответвился от 10-STABLE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4271
+#, no-wrap
+msgid "1004500"
+msgstr "1004500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4272
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/323605[323605]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/323605[323605]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4275
+#, no-wrap
+msgid "10-STABLE after `releng/10.4` branched from 10-STABLE."
+msgstr "10-STABLE после того, как ветка `releng/10.4` отделилась от 10-STABLE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4276
+#, no-wrap
+msgid "1004501"
+msgstr "1004501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4280
+#, no-wrap
+msgid "10-STABLE after merging link:https://svnweb.freebsd.org/changeset/base/325028[325028], fixing `ptrace()` to always clear the correct thread event when resuming."
+msgstr "10-STABLE после слияния изменений link:https://svnweb.freebsd.org/changeset/base/325028[325028], исправляющего `ptrace()`, чтобы всегда очищать правильное событие потока при возобновлении."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4281
+#, no-wrap
+msgid "1004502"
+msgstr "1004502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4282
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356396[356396]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356396[356396]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4285
+#, no-wrap
+msgid "10-STABLE after making USB statistics be per-device instead of per bus."
+msgstr "10-STABLE после изменения статистики USB для каждого устройства вместо каждой шины."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4286
+#, no-wrap
+msgid "1004503"
+msgstr "1004503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4287
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/356681[356681]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/356681[356681]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4289
+#, no-wrap
+msgid "10-STABLE after adding own counter for cancelled USB transfers."
+msgstr "10-STABLE после добавления собственного счетчика для отмененных USB-передач."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4292
+#, no-wrap
+msgid "FreeBSD 9 Versions"
+msgstr "Версии FreeBSD 9"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4295
+#, no-wrap
+msgid "FreeBSD 9 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` в FreeBSD 9"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4304
+#, no-wrap
+msgid "900000"
+msgstr "900000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4305
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/196432[196432]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/196432[196432]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4306
+#, no-wrap
+msgid "August 22, 2009"
+msgstr "22 августа 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4308
+#, no-wrap
+msgid "9.0-CURRENT."
+msgstr "9.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4309
+#, no-wrap
+msgid "900001"
+msgstr "900001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4310
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/197019[197019]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/197019[197019]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4311
+#, no-wrap
+msgid "September 8, 2009"
+msgstr "8 сентября 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4313
+#, no-wrap
+msgid "9.0-CURRENT after importing x86emu, a software emulator for real mode x86 CPU from OpenBSD."
+msgstr "9.0-CURRENT после импорта x86emu, программного эмулятора процессора x86 в реальном режиме из OpenBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4314
+#, no-wrap
+msgid "900002"
+msgstr "900002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4315
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/197430[197430]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/197430[197430]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4316
+#, no-wrap
+msgid "September 23, 2009"
+msgstr "23 сентября 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4318
+#, no-wrap
+msgid "9.0-CURRENT after implementing the EVFILT_USER `kevent` filter functionality."
+msgstr "9.0-CURRENT после реализации функциональности фильтра `kevent` `EVFILT_USER`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4319
+#, no-wrap
+msgid "900003"
+msgstr "900003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4320
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/200039[200039]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/200039[200039]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4321
+#, no-wrap
+msgid "December 2, 2009"
+msgstr "2 декабря 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4323
+#, no-wrap
+msgid "9.0-CURRENT after addition of man:sigpause[2] and PIE support in `csu`."
+msgstr "9.0-CURRENT после добавления man:sigpause[2] и поддержки PIE в `csu`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4324
+#, no-wrap
+msgid "900004"
+msgstr "900004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4325
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/200185[200185]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/200185[200185]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4326
+#, no-wrap
+msgid "December 6, 2009"
+msgstr "6 декабря 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4328
+#, no-wrap
+msgid "9.0-CURRENT after addition of libulog and its libutempter compatibility interface."
+msgstr "9.0-CURRENT после добавления libulog и его совместимого интерфейса libutempter."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4329
+#, no-wrap
+msgid "900005"
+msgstr "900005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4330
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/200447[200447]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/200447[200447]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4331
+#, no-wrap
+msgid "December 12, 2009"
+msgstr "December 12, 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4333
+#, no-wrap
+msgid "9.0-CURRENT after addition of man:sleepq_sleepcnt[9], which can be used to query the number of waiters on a specific waiting queue."
+msgstr "9.0-CURRENT после добавления man:sleepq_sleepcnt[9], который может использоваться для запроса количества ожидающих в конкретной очереди ожидания."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4334
+#, no-wrap
+msgid "900006"
+msgstr "900006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4335
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/201513[201513]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/201513[201513]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4336
+#, no-wrap
+msgid "January 4, 2010"
+msgstr "4 января 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4338
+#, no-wrap
+msgid "9.0-CURRENT after change of the man:scandir[3] and man:alphasort[3] prototypes to conform to SUSv4."
+msgstr "9.0-CURRENT после изменения прототипов man:scandir[3] и man:alphasort[3] для соответствия SUSv4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4339
+#, no-wrap
+msgid "900007"
+msgstr "900007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4340
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/202219[202219]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/202219[202219]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4341
+#, no-wrap
+msgid "January 13, 2010"
+msgstr "13 января 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4343
+#, no-wrap
+msgid "9.0-CURRENT after the removal of man:utmp[5] and the addition of `utmpx` (see man:getutxent[3]) for improved logging of user logins and system events."
+msgstr "9.0-CURRENT после удаления man:utmp[5] и добавления `utmpx` (см. man:getutxent[3]) для улучшенного логирования входов пользователей и системных событий."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4344
+#, no-wrap
+msgid "900008"
+msgstr "900008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4345
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/202722[202722]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/202722[202722]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4346
+#, no-wrap
+msgid "January 20, 2010"
+msgstr "20 января 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4348
+#, no-wrap
+msgid "9.0-CURRENT after the import of BSDL bc/dc and the deprecation of GNU bc/dc."
+msgstr "9.0-CURRENT после импорта BSDL bc/dc и устаревания GNU bc/dc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4349
+#, no-wrap
+msgid "900009"
+msgstr "900009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4350
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/203052[203052]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/203052[203052]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4351
+#, no-wrap
+msgid "January 26, 2010"
+msgstr "26 января 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4353
+#, no-wrap
+msgid "9.0-CURRENT after the addition of SIOCGIFDESCR and SIOCSIFDESCR ioctls to network interfaces. These ioctl can be used to manipulate interface description, as inspired by OpenBSD."
+msgstr "9.0-CURRENT после добавления ioctl SIOCGIFDESCR и SIOCSIFDESCR к сетевым интерфейсам. Эти ioctl могут использоваться для управления описанием интерфейса, по аналогии с OpenBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4354
+#, no-wrap
+msgid "900010"
+msgstr "900010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4355
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/205471[205471]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/205471[205471]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4356
+#, no-wrap
+msgid "March 22, 2010"
+msgstr "22 марта 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4358
+#, no-wrap
+msgid "9.0-CURRENT after the import of zlib 1.2.4."
+msgstr "9.0-CURRENT после импорта zlib 1.2.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4359
+#, no-wrap
+msgid "900011"
+msgstr "900011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4360
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/207410[207410]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/207410[207410]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4361
+#, no-wrap
+msgid "April 24, 2010"
+msgstr "April 24, 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4363
+#, no-wrap
+msgid "9.0-CURRENT after adding soft-updates journaling."
+msgstr "9.0-CURRENT после добавления журналирования soft-updates."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4364
+#, no-wrap
+msgid "900012"
+msgstr "900012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4365
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/207842[207842]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/207842[207842]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4366
+#, no-wrap
+msgid "May 10, 2010"
+msgstr "10 мая 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4368
+#, no-wrap
+msgid "9.0-CURRENT after adding liblzma, xz, xzdec, and lzmainfo."
+msgstr "9.0-CURRENT после добавления liblzma, xz, xzdec и lzmainfo."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4369
+#, no-wrap
+msgid "900013"
+msgstr "900013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4370
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/208486[208486]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/208486[208486]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4371
+#, no-wrap
+msgid "May 24, 2010"
+msgstr "24 мая 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4373
+#, no-wrap
+msgid "9.0-CURRENT after bringing in USB fixes for man:linux[4]."
+msgstr "9.0-CURRENT после внесения исправлений для USB в man:linux[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4374
+#, no-wrap
+msgid "900014"
+msgstr "900014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4375
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/208973[208973]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/208973[208973]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4376
+#, no-wrap
+msgid "June 10, 2010"
+msgstr "10 июня 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4378
+#, no-wrap
+msgid "9.0-CURRENT after adding Clang."
+msgstr "9.0-CURRENT после добавления Clang."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4379
+#, no-wrap
+msgid "900015"
+msgstr "900015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4380
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/210390[210390]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/210390[210390]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4381
+#, no-wrap
+msgid "July 22, 2010"
+msgstr "22 июля 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4383
+#, no-wrap
+msgid "9.0-CURRENT after the import of BSD grep."
+msgstr "9.0-CURRENT после импорта BSD grep."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4384
+#, no-wrap
+msgid "900016"
+msgstr "900016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4385
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/210565[210565]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/210565[210565]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4386
+#, no-wrap
+msgid "July 28, 2010"
+msgstr "28 июля 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4388
+#, no-wrap
+msgid "9.0-CURRENT after adding `mti_zone` to struct `malloc_type_internal`."
+msgstr "9.0-CURRENT после добавления `mti_zone` в структуру `malloc_type_internal`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4389
+#, no-wrap
+msgid "900017"
+msgstr "900017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4390
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/211701[211701]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/211701[211701]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4391
+#, no-wrap
+msgid "August 23, 2010"
+msgstr "23 августа 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4393
+#, no-wrap
+msgid "9.0-CURRENT after changing back default grep to GNU grep and adding WITH_BSD_GREP knob."
+msgstr "9.0-CURRENT после возврата к GNU grep по умолчанию и добавления параметра WITH_BSD_GREP."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4394
+#, no-wrap
+msgid "900018"
+msgstr "900018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4395
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/211735[211735]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/211735[211735]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4396
+#, no-wrap
+msgid "August 24, 2010"
+msgstr "24 августа 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4398
+#, no-wrap
+msgid "9.0-CURRENT after the man:pthread_kill[3] -generated signal is identified as SI_LWP in `si_code`. Previously, `si_code` was SI_USER."
+msgstr "9.0-CURRENT после того, как сигнал, сгенерированный через man:pthread_kill[3], идентифицируется как SI_LWP в `si_code`. Ранее `si_code` имел значение SI_USER."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4399
+#, no-wrap
+msgid "900019"
+msgstr "900019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4400
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/211937[211937]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/211937[211937]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4401
+#, no-wrap
+msgid "August 28, 2010"
+msgstr "28 августа 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4403
+#, no-wrap
+msgid "9.0-CURRENT after addition of the MAP_PREFAULT_READ flag to man:mmap[2]."
+msgstr "9.0-CURRENT после добавления флага MAP_PREFAULT_READ в man:mmap[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4404
+#, no-wrap
+msgid "900020"
+msgstr "900020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4405
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/212381[212381]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/212381[212381]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4406
+#, no-wrap
+msgid "September 9, 2010"
+msgstr "9 сентября 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4408
+#, no-wrap
+msgid "9.0-CURRENT after adding drain functionality to `sbufs`, which also changed the layout of struct `sbuf`."
+msgstr "9.0-CURRENT после добавления функциональности drain в `sbufs`, что также изменило структуру struct `sbuf`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4409
+#, no-wrap
+msgid "900021"
+msgstr "900021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4410
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/212568[212568]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/212568[212568]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4411
+#, no-wrap
+msgid "September 13, 2010"
+msgstr "13 сентября 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4413
+#, no-wrap
+msgid "9.0-CURRENT after DTrace has grown support for userland tracing."
+msgstr "9.0-CURRENT после того, как DTrace обзавелся поддержкой трассировки в пользовательском пространстве."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4414
+#, no-wrap
+msgid "900022"
+msgstr "900022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4415
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/213395[213395]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/213395[213395]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4416
+#, no-wrap
+msgid "October 2, 2010"
+msgstr "2 октября 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4418
+#, no-wrap
+msgid "9.0-CURRENT after addition of the BSDL man utilities and retirement of GNU/GPL man utilities."
+msgstr "9.0-CURRENT после добавления утилит man под лицензией BSDL и удаления утилит man под лицензией GNU/GPL."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4419
+#, no-wrap
+msgid "900023"
+msgstr "900023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4420
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/213700[213700]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/213700[213700]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4421
+#, no-wrap
+msgid "October 11, 2010"
+msgstr "11 октября 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4423
+#, no-wrap
+msgid "9.0-CURRENT after updating xz to git 20101010 snapshot."
+msgstr "9.0-CURRENT после обновления xz до снимка git 20101010."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4424
+#, no-wrap
+msgid "900024"
+msgstr "900024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4425
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/215127[215127]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/215127[215127]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4426
+#, no-wrap
+msgid "November 11, 2010"
+msgstr "11 ноября 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4428
+#, no-wrap
+msgid "9.0-CURRENT after libgcc.a was replaced by libcompiler_rt.a."
+msgstr "9.0-CURRENT после замены libgcc.a на libcompiler_rt.a."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4429
+#, no-wrap
+msgid "900025"
+msgstr "900025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4430
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/215166[215166]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/215166[215166]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4431
+#, no-wrap
+msgid "November 12, 2010"
+msgstr "12 ноября 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4433
+#, no-wrap
+msgid "9.0-CURRENT after the introduction of the modularised congestion control."
+msgstr "9.0-CURRENT после внедрения модульной системы управления перегрузкой."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4434
+#, no-wrap
+msgid "900026"
+msgstr "900026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4435
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/216088[216088]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/216088[216088]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4436
+#, no-wrap
+msgid "November 30, 2010"
+msgstr "30 ноября 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4438
+#, no-wrap
+msgid "9.0-CURRENT after the introduction of Serial Management Protocol (SMP) passthrough and the XPT_SMP_IO and XPT_GDEV_ADVINFO CAM `CCBs`."
+msgstr "9.0-CURRENT после введения сквозной передачи Serial Management Protocol (SMP) и CAM `CCBs` XPT_SMP_IO и XPT_GDEV_ADVINFO."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4439
+#, no-wrap
+msgid "900027"
+msgstr "900027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4440
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/216212[216212]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/216212[216212]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4441
+#, no-wrap
+msgid "December 5, 2010"
+msgstr "5 декабря 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4443
+#, no-wrap
+msgid "9.0-CURRENT after the addition of log2 to libm."
+msgstr "9.0-CURRENT после добавления log2 в libm."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4444
+#, no-wrap
+msgid "900028"
+msgstr "900028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4445
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/216615[216615]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/216615[216615]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4446
+#, no-wrap
+msgid "December 21, 2010"
+msgstr "21 декабря 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4448
+#, no-wrap
+msgid "9.0-CURRENT after the addition of the Hhook (Helper Hook), Khelp (Kernel Helpers) and Object Specific Data (OSD) KPIs."
+msgstr "9.0-CURRENT после добавления Hhook (Helper Hook), Khelp (Kernel Helpers) и KPI Object Specific Data (OSD)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4449
+#, no-wrap
+msgid "900029"
+msgstr "900029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4450
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/216758[216758]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/216758[216758]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4451
+#, no-wrap
+msgid "December 28, 2010"
+msgstr "28 декабря 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4453
+#, no-wrap
+msgid "9.0-CURRENT after the modification of the TCP stack to allow Khelp modules to interact with it via helper hook points and store per-connection data in the TCP control block."
+msgstr "9.0-CURRENT после модификации стека TCP для разрешения модулям Khelp взаимодействовать с ним через точки подключения вспомогательных функций и хранить данные для каждого соединения в блоке управления TCP."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4454
+#, no-wrap
+msgid "900030"
+msgstr "900030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4455
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/217309[217309]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/217309[217309]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4456
+#, no-wrap
+msgid "January 12, 2011"
+msgstr "12 января 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4458
+#, no-wrap
+msgid "9.0-CURRENT after the update of libdialog to version 20100428."
+msgstr "9.0-CURRENT после обновления libdialog до версии 20100428."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4459
+#, no-wrap
+msgid "900031"
+msgstr "900031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4460
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/218414[218414]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/218414[218414]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4461
+#, no-wrap
+msgid "February 7, 2011"
+msgstr "7 февраля 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4463
+#, no-wrap
+msgid "9.0-CURRENT after the addition of man:pthread_getthreadid_np[3]."
+msgstr "9.0-CURRENT после добавления man:pthread_getthreadid_np[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4464
+#, no-wrap
+msgid "900032"
+msgstr "900032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4465
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/218425[218425]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/218425[218425]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4466
+#, no-wrap
+msgid "February 8, 2011"
+msgstr "8 февраля 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4468
+#, no-wrap
+msgid "9.0-CURRENT after the removal of the `uio_yield` prototype and symbol."
+msgstr "9.0-CURRENT после удаления прототипа и символа `uio_yield`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4469
+#, no-wrap
+msgid "900033"
+msgstr "900033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4470
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/218822[218822]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/218822[218822]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4471
+#, no-wrap
+msgid "February 18, 2011"
+msgstr "18 февраля 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4473
+#, no-wrap
+msgid "9.0-CURRENT after the update of binutils to version 2.17.50."
+msgstr "9.0-CURRENT после обновления binutils до версии 2.17.50."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4474
+#, no-wrap
+msgid "900034"
+msgstr "900034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4475
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/219406[219406]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/219406[219406]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4476
+#, no-wrap
+msgid "March 8, 2011"
+msgstr "8 марта 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4478
+#, no-wrap
+msgid "9.0-CURRENT after the struct `sysvec` (`sv_schedtail`) changes."
+msgstr "9.0-CURRENT после изменений в структуре `sysvec` (`sv_schedtail`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4479
+#, no-wrap
+msgid "900035"
+msgstr "900035"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4480
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/220150[220150]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/220150[220150]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4481
+#, no-wrap
+msgid "March 29, 2011"
+msgstr "29 марта 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4483
+#, no-wrap
+msgid "9.0-CURRENT after the update of base gcc and libstdc++ to the last GPLv2 licensed revision."
+msgstr "9.0-CURRENT после обновления базового gcc и libstdc++ до последней ревизии, лицензированной под GPLv2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4484
+#, no-wrap
+msgid "900036"
+msgstr "900036"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4485
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/220770[220770]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/220770[220770]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4486
+#, no-wrap
+msgid "April 18, 2011"
+msgstr "18 апреля 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4488
+#, no-wrap
+msgid "9.0-CURRENT after the removal of libobjc and Objective-C support from the base system."
+msgstr "9.0-CURRENT после удаления libobjc и поддержки Objective-C из базовой системы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4489
+#, no-wrap
+msgid "900037"
+msgstr "900037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4490
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/221862[221862]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/221862[221862]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4491
+#, no-wrap
+msgid "May 13, 2011"
+msgstr "13 мая 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4493
+#, no-wrap
+msgid "9.0-CURRENT after importing the man:libprocstat[3] library and man:fuser[1] utility to the base system."
+msgstr "9.0-CURRENT после импорта библиотеки man:libprocstat[3] и утилиты man:fuser[1] в базовую систему."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4494
+#, no-wrap
+msgid "900038"
+msgstr "900038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4495
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/222167[222167]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/222167[222167]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4496
+#, no-wrap
+msgid "May 22, 2011"
+msgstr "22 мая 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4498
+#, no-wrap
+msgid "9.0-CURRENT after adding a lock flag argument to man:VFS_FHTOVP[9]."
+msgstr "9.0-CURRENT после добавления аргумента флага блокировки к man:VFS_FHTOVP[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4499
+#, no-wrap
+msgid "900039"
+msgstr "900039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4500
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/223637[223637]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/223637[223637]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4501
+#, no-wrap
+msgid "June 28, 2011"
+msgstr "28 июня 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4503
+#, no-wrap
+msgid "9.0-CURRENT after importing pf from OpenBSD 4.5."
+msgstr "9.0-CURRENT после импорта pf из OpenBSD 4.5."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4504
+#, no-wrap
+msgid "900040"
+msgstr "900040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4505
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/224217[224217]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/224217[224217]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4506
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5399
+#, no-wrap
+msgid "July 19, 2011"
+msgstr "19 июля 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4508
+#, no-wrap
+msgid "Increase default MAXCPU for FreeBSD to 64 on amd64 and ia64 and to 128 for XLP (mips)."
+msgstr "Увеличить значение MAXCPU по умолчанию для FreeBSD до 64 на amd64 и ia64 и до 128 для XLP (mips)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4509
+#, no-wrap
+msgid "900041"
+msgstr "900041"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4510
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/224834[224834]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/224834[224834]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4511
+#, no-wrap
+msgid "August 13, 2011"
+msgstr "13 августа 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4513
+#, no-wrap
+msgid "9.0-CURRENT after the implementation of Capsicum capabilities; man:fget[9] gains a rights argument."
+msgstr "Версия 9.0-CURRENT после реализации возможностей Capsicum; man:fget[9] получает аргумент rights."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4514
+#, no-wrap
+msgid "900042"
+msgstr "900042"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4515
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4520
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/225350[225350]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/225350[225350]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4516
+#, no-wrap
+msgid "August 28, 2011"
+msgstr "28 августа 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4518
+#, no-wrap
+msgid "Bump shared libraries' version numbers for libraries whose ABI has changed in preparation for 9.0."
+msgstr "Увеличьте номера версий общих библиотек для библиотек, чей ABI изменился в рамках подготовки к 9.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4519
+#, no-wrap
+msgid "900043"
+msgstr "900043"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4521
+#, no-wrap
+msgid "September 2, 2011"
+msgstr "2 сентября 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4523
+#, no-wrap
+msgid "Add automatic detection of USB mass storage devices which do not support the no synchronize cache SCSI command."
+msgstr "Добавить автоматическое обнаружение USB-накопителей, которые не поддерживают команду SCSI \"no synchronize cache\"."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4524
+#, no-wrap
+msgid "900044"
+msgstr "900044"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4525
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/225469[225469]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/225469[225469]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4526
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5409
+#, no-wrap
+msgid "September 10, 2011"
+msgstr "10 сентября 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4528
+#, no-wrap
+msgid "Re-factor auto-quirk. 9.0-RELEASE."
+msgstr "Переработка автоматического определения особенностей оборудования (auto-quirk). 9.0-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4529
+#, no-wrap
+msgid "900045"
+msgstr "900045"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4530
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/229285[229285]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/229285[229285]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4531
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4536
+#, no-wrap
+msgid "January 2, 2012"
+msgstr "2 января 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4533
+#, no-wrap
+msgid "9-STABLE after MFC of true/false from 1000002."
+msgstr "9-STABLE после MFC значения true/false из 1000002."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4534
+#, no-wrap
+msgid "900500"
+msgstr "900500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4535
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/229318[229318]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/229318[229318]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4538
+#, no-wrap
+msgid "9.0-STABLE."
+msgstr "9.0-STABLE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4539
+#, no-wrap
+msgid "900501"
+msgstr "900501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4540
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/229723[229723]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/229723[229723]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4541
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5424
+#, no-wrap
+msgid "January 6, 2012"
+msgstr "6 января 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4543
+#, no-wrap
+msgid "9.0-STABLE after merging of addition of the man:posix_fadvise[2] system call."
+msgstr "9.0-STABLE после объединения добавления системного вызова man:posix_fadvise[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4544
+#, no-wrap
+msgid "900502"
+msgstr "900502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4545
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/230237[230237]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/230237[230237]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4548
+#, no-wrap
+msgid "9.0-STABLE after merging gperf 3.0.3"
+msgstr "9.0-STABLE после слияния gperf 3.0.3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4549
+#, no-wrap
+msgid "900503"
+msgstr "900503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4550
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/231768[231768]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/231768[231768]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4551
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5434
+#, no-wrap
+msgid "February 15, 2012"
+msgstr "15 февраля 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4553
+#, no-wrap
+msgid "9.0-STABLE after introduction of the new extensible man:sysctl[3] interface NET_RT_IFLISTL to query address lists."
+msgstr "9.0-STABLE после введения нового расширяемого интерфейса man:sysctl[3] NET_RT_IFLISTL для запроса списков адресов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4554
+#, no-wrap
+msgid "900504"
+msgstr "900504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4555
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/232728[232728]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/232728[232728]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4556
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5439
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5444
+#, no-wrap
+msgid "March 3, 2012"
+msgstr "3 марта 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4558
+#, no-wrap
+msgid "9.0-STABLE after changes related to mounting of filesystem inside a jail."
+msgstr "9.0-STABLE после изменений, связанных с монтированием файловой системы внутри клетки."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4559
+#, no-wrap
+msgid "900505"
+msgstr "900505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4560
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/232945[232945]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/232945[232945]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4561
+#, no-wrap
+msgid "March 13, 2012"
+msgstr "13 марта 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4563
+#, no-wrap
+msgid "9.0-STABLE after introduction of new man:tcp[4] socket options: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL, and TCP_KEEPCNT."
+msgstr "9.0-STABLE после введения новых параметров сокета man:tcp[4]: TCP_KEEPINIT, TCP_KEEPIDLE, TCP_KEEPINTVL и TCP_KEEPCNT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4564
+#, no-wrap
+msgid "900506"
+msgstr "900506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4565
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/235786[235786]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/235786[235786]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4568
+#, no-wrap
+msgid "9.0-STABLE after introduction of the `quick_exit` function and related changes required for C++11."
+msgstr "9.0-STABLE после введения функции `quick_exit` и связанных изменений, необходимых для C++11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4569
+#, no-wrap
+msgid "901000"
+msgstr "901000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4570
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/239082[239082]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/239082[239082]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4571
+#, no-wrap
+msgid "August 5, 2012"
+msgstr "5 августа 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4573
+#, no-wrap
+msgid "9.1-RELEASE."
+msgstr "9.1-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4574
+#, no-wrap
+msgid "901500"
+msgstr "901500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4575
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/239081[239081]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/239081[239081]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4576
+#, no-wrap
+msgid "August 6, 2012"
+msgstr "6 августа 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4578
+#, no-wrap
+msgid "9.1-STABLE after branching releng/9.1 (RELENG_9_1)."
+msgstr "9.1-STABLE после ветвления releng/9.1 (RELENG_9_1)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4579
+#, no-wrap
+msgid "901501"
+msgstr "901501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4580
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/240659[240659]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/240659[240659]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4581
+#, no-wrap
+msgid "November 11, 2012"
+msgstr "11 ноября 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4583
+#, no-wrap
+msgid "9.1-STABLE after man:LIST_PREV[3] added to queue.h (rev link:https://svnweb.freebsd.org/changeset/base/242893[242893]) and KBI change in USB serial devices."
+msgstr "9.1-STABLE после man:LIST_PREV[3] добавлен в queue.h (изменение rev link:https://svnweb.freebsd.org/changeset/base/242893[242893]) и изменения KBI в USB последовательных устройствах."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4584
+#, no-wrap
+msgid "901502"
+msgstr "901502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4585
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/243656[243656]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/243656[243656]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4586
+#, no-wrap
+msgid "November 28, 2012"
+msgstr "28 ноября 2012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4588
+#, no-wrap
+msgid "9.1-STABLE after USB serial jitter buffer requires rebuild of USB serial device modules."
+msgstr "9.1-STABLE после того, как буфер дрожания USB serial требует пересборки модулей устройств USB serial."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4589
+#, no-wrap
+msgid "901503"
+msgstr "901503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4590
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/247090[247090]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/247090[247090]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4591
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5449
+#, no-wrap
+msgid "February 21, 2013"
+msgstr "21 февраля 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4593
+#, no-wrap
+msgid "9.1-STABLE after USB moved to the driver structure requiring a rebuild of all USB modules. Also indicates the presence of nmtree."
+msgstr "9.1-STABLE после перемещения USB в структуру драйверов, что потребовало пересборки всех модулей USB. Также указывает на наличие nmtree."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4594
+#, no-wrap
+msgid "901504"
+msgstr "901504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4595
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/248338[248338]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/248338[248338]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4596
+#, no-wrap
+msgid "March 15, 2013"
+msgstr "15 марта 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4598
+#, no-wrap
+msgid "9.1-STABLE after install gained -l, -M, -N and related flags and cat gained the -l option."
+msgstr "9.1-STABLE после установки получил флаги -l, -M, -N и связанные с ними, а cat получил опцию -l."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4599
+#, no-wrap
+msgid "901505"
+msgstr "901505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4600
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/251687[251687]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/251687[251687]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4601
+#, no-wrap
+msgid "June 13, 2013"
+msgstr "13 июня 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4603
+#, no-wrap
+msgid "9.1-STABLE after fixes in `ctfmerge` bootstrapping (rev link:https://svnweb.freebsd.org/changeset/base/249243[249243])."
+msgstr "9.1-STABLE после исправлений в начальной загрузке `ctfmerge` (rev link:https://svnweb.freebsd.org/changeset/base/249243[249243])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4604
+#, no-wrap
+msgid "902001"
+msgstr "902001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4605
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/253912[253912]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/253912[253912]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4606
+#, no-wrap
+msgid "August 3, 2013"
+msgstr "3 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4608
+#, no-wrap
+msgid "`releng/9.2` branched from `stable/9`."
+msgstr "`releng/9.2` ответвился от `stable/9`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4609
+#, no-wrap
+msgid "902501"
+msgstr "902501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4610
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/253913[253913]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/253913[253913]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4611
+#, no-wrap
+msgid "August 2, 2013"
+msgstr "2 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4613
+#, no-wrap
+msgid "9.2-STABLE after creation of `releng/9.2` branch."
+msgstr "9.2-STABLE после создания ветки `releng/9.2`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4614
+#, no-wrap
+msgid "902502"
+msgstr "902502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4615
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254938[254938]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254938[254938]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4616
+#, no-wrap
+msgid "August 26, 2013"
+msgstr "26 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4618
+#, no-wrap
+msgid "9.2-STABLE after inclusion of the `PIM_RESCAN` CAM path inquiry flag."
+msgstr "9.2-STABLE после включения флага запроса пути CAM `PIM_RESCAN`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4619
+#, no-wrap
+msgid "902503"
+msgstr "902503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4620
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/254979[254979]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/254979[254979]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4621
+#, no-wrap
+msgid "August 27, 2013"
+msgstr "27 августа 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4623
+#, no-wrap
+msgid "9.2-STABLE after inclusion of the `SI_UNMAPPED` cdev flag."
+msgstr "9.2-STABLE после включения флага `SI_UNMAPPED` для cdev."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4624
+#, no-wrap
+msgid "902504"
+msgstr "902504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4625
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/256917[256917]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/256917[256917]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4628
+#, no-wrap
+msgid "9.2-STABLE after inclusion of support for \"first boot\" man:rc[8] scripts."
+msgstr "9.2-STABLE после добавления поддержки скриптов \"первой загрузки\" man:rc[8]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4629
+#, no-wrap
+msgid "902505"
+msgstr "902505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4630
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/259448[259448]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/259448[259448]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4631
+#, no-wrap
+msgid "December 12, 2013"
+msgstr "12 декабря 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4633
+#, no-wrap
+msgid "9.2-STABLE after Heimdal encoding fix."
+msgstr "9.2-STABLE после исправления кодировки Heimdal."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4634
+#, no-wrap
+msgid "902506"
+msgstr "902506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4635
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/260136[260136]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/260136[260136]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4638
+#, no-wrap
+msgid "9-STABLE after MAP_STACK fixes (rev link:https://svnweb.freebsd.org/changeset/base/260082[260082])."
+msgstr "9-STABLE после исправлений MAP_STACK (rev link:https://svnweb.freebsd.org/changeset/base/260082[260082])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4639
+#, no-wrap
+msgid "902507"
+msgstr "902507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4643
+#, no-wrap
+msgid "9-STABLE after upgrade of libc++ to 3.4 release."
+msgstr "9-STABLE после обновления libc++ до версии 3.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4644
+#, no-wrap
+msgid "902508"
+msgstr "902508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4645
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263171[263171]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263171[263171]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4648
+#, no-wrap
+msgid "9-STABLE after merge of the Radeon KMS driver (rev link:https://svnweb.freebsd.org/changeset/base/263170[263170])."
+msgstr "9-STABLE после объединения драйвера Radeon KMS (rev link:https://svnweb.freebsd.org/changeset/base/263170[263170])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4649
+#, no-wrap
+msgid "902509"
+msgstr "902509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4650
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263509[263509]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263509[263509]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4653
+#, no-wrap
+msgid "9-STABLE after upgrade of llvm/clang to 3.4 release."
+msgstr "9-STABLE после обновления llvm/clang до версии 3.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4654
+#, no-wrap
+msgid "902510"
+msgstr "902510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4655
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/263818[263818]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/263818[263818]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4656
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4661
+#, no-wrap
+msgid "March 27, 2014"
+msgstr "27 марта 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4658
+#, no-wrap
+msgid "9-STABLE after merge of the man:vt[4] driver."
+msgstr "9-STABLE после слияния драйвера man:vt[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4659
+#, no-wrap
+msgid "902511"
+msgstr "902511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4663
+#, no-wrap
+msgid "9-STABLE after FreeBSD-SA-14:06.openssl."
+msgstr "9-STABLE после FreeBSD-SA-14:06.openssl."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4664
+#, no-wrap
+msgid "902512"
+msgstr "902512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4665
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5468
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/265123[265123]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/265123[265123]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4668
+#, no-wrap
+msgid "9-STABLE after FreeBSD-SA-14:08.tcp."
+msgstr "9-STABLE после FreeBSD-SA-14:08.tcp."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4669
+#, no-wrap
+msgid "903000"
+msgstr "903000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4670
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/267656[267656]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/267656[267656]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4671
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4676
+#, no-wrap
+msgid "June 20, 2014"
+msgstr "20 июня 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4673
+#, no-wrap
+msgid "9-RC1 `releng/9.3` branch."
+msgstr "9-RC1 ветка `releng/9.3`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4674
+#, no-wrap
+msgid "903500"
+msgstr "903500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4675
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/267657[267657]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/267657[267657]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4678
+#, no-wrap
+msgid "9.3-STABLE `releng/9.3` branch."
+msgstr "9.3-STABLE ветка `releng/9.3`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4679
+#, no-wrap
+msgid "903501"
+msgstr "903501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4680
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/268443[268443]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/268443[268443]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4683
+#, no-wrap
+msgid "9-STABLE after FreeBSD-SA-14:17.kmem (rev link:https://svnweb.freebsd.org/changeset/base/268433[268433])."
+msgstr "9-STABLE после FreeBSD-SA-14:17.kmem (изменение:https://svnweb.freebsd.org/changeset/base/268433[268433])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4684
+#, no-wrap
+msgid "903502"
+msgstr "903502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4685
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/270175[270175]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/270175[270175]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4686
+#, no-wrap
+msgid "August 19, 2014"
+msgstr "19 августа 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4688
+#, no-wrap
+msgid "9-STABLE after `SOCK_DGRAM` bug fix (rev link:https://svnweb.freebsd.org/changeset/base/269789[269789])."
+msgstr "9-STABLE после исправления ошибки `SOCK_DGRAM` (rev link:https://svnweb.freebsd.org/changeset/base/269789[269789])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4689
+#, no-wrap
+msgid "903503"
+msgstr "903503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4693
+#, no-wrap
+msgid "9-STABLE after FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/269687[269687])."
+msgstr "9-STABLE после FreeBSD-SA-14:18 (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/269687[269687])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4694
+#, no-wrap
+msgid "903504"
+msgstr "903504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4698
+#, no-wrap
+msgid "9-STABLE after FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271668[271668])."
+msgstr "9-STABLE после FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271668[271668])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4699
+#, no-wrap
+msgid "903505"
+msgstr "903505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4703
+#, no-wrap
+msgid "9-STABLE after FreeBSD-SA-14:20, FreeBSD-SA-14:21, and FreeBSD-SA-14:22 (rev link:https://svnweb.freebsd.org/changeset/base/273412[273412])."
+msgstr "9-STABLE после исправлений FreeBSD-SA-14:20, FreeBSD-SA-14:21 и FreeBSD-SA-14:22 (rev link:https://svnweb.freebsd.org/changeset/base/273412[273412])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4704
+#, no-wrap
+msgid "903506"
+msgstr "903506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4708
+#, no-wrap
+msgid "9-STABLE after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25."
+msgstr "9-STABLE после FreeBSD-SA-14:23, FreeBSD-SA-14:24 и FreeBSD-SA-14:25."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4709
+#, no-wrap
+msgid "903507"
+msgstr "903507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4713
+#, no-wrap
+msgid "9-STABLE after merging an important fix to the LLVM vectorizer, which could lead to buffer overruns in some cases."
+msgstr "9-STABLE после объединения важного исправления в векторизатор LLVM, которое в некоторых случаях могло приводить к переполнению буфера."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4714
+#, no-wrap
+msgid "903508"
+msgstr "903508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4718
+#, no-wrap
+msgid "9-STABLE after FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp, and FreeBSD-SA-15:05.bind."
+msgstr "9-STABLE после FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp и FreeBSD-SA-15:05.bind."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4719
+#, no-wrap
+msgid "903509"
+msgstr "903509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4720
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/296219[296219]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/296219[296219]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4721
+#, no-wrap
+msgid "February 29, 2016"
+msgstr "29 февраля 2016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4723
+#, no-wrap
+msgid "9-STABLE after bumping the default value of `compat.linux.osrelease` to `2.6.18` to support the linux-c6-* ports out of the box."
+msgstr "9-STABLE после увеличения значения по умолчанию `compat.linux.osrelease` до `2.6.18` для поддержки портов linux-c6-* без дополнительной настройки."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4724
+#, no-wrap
+msgid "903510"
+msgstr "903510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4725
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/300236[300236]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/300236[300236]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4728
+#, no-wrap
+msgid "9-STABLE after System Binary Interface (SBI) page was moved in latest version of Berkeley Boot Loader (BBL) due to code size increase in link:https://svnweb.freebsd.org/changeset/base/300234[300234]."
+msgstr "9-STABLE после того, как страница System Binary Interface (SBI) была перемещена в последней версии Berkeley Boot Loader (BBL) из-за увеличения размера кода в link:https://svnweb.freebsd.org/changeset/base/300234[300234]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4729
+#, no-wrap
+msgid "903511"
+msgstr "903511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4730
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/305735[305735]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/305735[305735]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4732
+#, no-wrap
+msgid "9-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9]."
+msgstr "9-STABLE после разрешения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4735
+#, no-wrap
+msgid "FreeBSD 8 Versions"
+msgstr "Версии FreeBSD 8"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4738
+#, no-wrap
+msgid "FreeBSD 8 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` в FreeBSD 8"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4747
+#, no-wrap
+msgid "800000"
+msgstr "800000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4748
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/172531[172531]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/172531[172531]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4749
+#, no-wrap
+msgid "October 11, 2007"
+msgstr "11 октября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4751
+#, no-wrap
+msgid "8.0-CURRENT. Separating wide and single byte `ctype`."
+msgstr "8.0-CURRENT. Разделение `ctype` на широкие и однобайтовые символы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4752
+#, no-wrap
+msgid "800001"
+msgstr "800001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4753
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/172688[172688]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/172688[172688]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4754
+#, no-wrap
+msgid "October 16, 2007"
+msgstr "16 октября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4756
+#, no-wrap
+msgid "8.0-CURRENT after libpcap 0.9.8 and tcpdump 3.9.8 import."
+msgstr "8.0-CURRENT после импорта libpcap 0.9.8 и tcpdump 3.9.8."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4757
+#, no-wrap
+msgid "800002"
+msgstr "800002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4758
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/172841[172841]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/172841[172841]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4759
+#, no-wrap
+msgid "October 21, 2007"
+msgstr "21 октября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4761
+#, no-wrap
+msgid "8.0-CURRENT after renaming man:kthread_create[9] and friends to man:kproc_create[9] etc."
+msgstr "8.0-CURRENT после переименования man:kthread_create[9] и связанных функций в man:kproc_create[9] и т.д."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4762
+#, no-wrap
+msgid "800003"
+msgstr "800003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4763
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/172932[172932]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/172932[172932]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4764
+#, no-wrap
+msgid "October 24, 2007"
+msgstr "24 октября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4766
+#, no-wrap
+msgid "8.0-CURRENT after ABI backwards compatibility to the FreeBSD 4/5/6 versions of the PCIOCGETCONF, PCIOCREAD and PCIOCWRITE IOCTLs was added, which required the ABI of the PCIOCGETCONF IOCTL to be broken again"
+msgstr "8.0-CURRENT после того, как была добавлена обратная совместимость ABI с версиями FreeBSD 4/5/6 для IOCTL PCIOCGETCONF, PCIOCREAD и PCIOCWRITE, что потребовало снова нарушить ABI IOCTL PCIOCGETCONF"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4767
+#, no-wrap
+msgid "800004"
+msgstr "800004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4768
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/173573[173573]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/173573[173573]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4769
+#, no-wrap
+msgid "November 12, 2007"
+msgstr "12 ноября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4771
+#, no-wrap
+msgid "8.0-CURRENT after man:agp[4] driver moved from src/sys/pci to src/sys/dev/agp"
+msgstr "8.0-CURRENT после перемещения драйвера man:agp[4] из src/sys/pci в src/sys/dev/agp"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4772
+#, no-wrap
+msgid "800005"
+msgstr "800005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4773
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/174261[174261]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/174261[174261]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4774
+#, no-wrap
+msgid "December 4, 2007"
+msgstr "4 декабря 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4776
+#, no-wrap
+msgid "8.0-CURRENT after changes to the jumbo frame allocator (rev link:https://svnweb.freebsd.org/changeset/base/174247[174247])."
+msgstr "8.0-CURRENT после изменений в аллокаторе джамбо-фреймов (rev link:https://svnweb.freebsd.org/changeset/base/174247[174247])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4777
+#, no-wrap
+msgid "800006"
+msgstr "800006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4778
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/174399[174399]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/174399[174399]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4779
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6325
+#, no-wrap
+msgid "December 7, 2007"
+msgstr "7 декабря 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4781
+#, no-wrap
+msgid "8.0-CURRENT after the addition of `callgraph` capture functionality to man:hwpmc[4]."
+msgstr "8.0-CURRENT после добавления функциональности захвата `callgraph` в man:hwpmc[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4782
+#, no-wrap
+msgid "800007"
+msgstr "800007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4783
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/174901[174901]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/174901[174901]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4784
+#, no-wrap
+msgid "December 25, 2007"
+msgstr "25 декабря 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4786
+#, no-wrap
+msgid "8.0-CURRENT after `kdb_enter()` gains a \"why\" argument."
+msgstr "8.0-CURRENT после `kdb_enter()` получает аргумент \"why\"."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4787
+#, no-wrap
+msgid "800008"
+msgstr "800008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4788
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/174951[174951]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/174951[174951]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4789
+#, no-wrap
+msgid "December 28, 2007"
+msgstr "28 декабря 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4791
+#, no-wrap
+msgid "8.0-CURRENT after LK_EXCLUPGRADE option removal."
+msgstr "8.0-CURRENT после удаления опции LK_EXCLUPGRADE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4792
+#, no-wrap
+msgid "800009"
+msgstr "800009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4793
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/175168[175168]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/175168[175168]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4794
+#, no-wrap
+msgid "January 9, 2008"
+msgstr "9 января 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4796
+#, no-wrap
+msgid "8.0-CURRENT after introduction of man:lockmgr_disown[9]"
+msgstr "8.0-CURRENT после введения man:lockmgr_disown[9]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4797
+#, no-wrap
+msgid "800010"
+msgstr "800010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4798
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/175204[175204]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/175204[175204]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4799
+#, no-wrap
+msgid "January 10, 2008"
+msgstr "10 января 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4801
+#, no-wrap
+msgid "8.0-CURRENT after the man:vn_lock[9] prototype change."
+msgstr "8.0-CURRENT после изменения прототипа man:vn_lock[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4802
+#, no-wrap
+msgid "800011"
+msgstr "800011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4803
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/175295[175295]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/175295[175295]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4804
+#, no-wrap
+msgid "January 13, 2008"
+msgstr "13 января 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4806
+#, no-wrap
+msgid "8.0-CURRENT after the man:VOP_LOCK[9] and man:VOP_UNLOCK[9] prototype changes."
+msgstr "8.0-CURRENT после изменений прототипов man:VOP_LOCK[9] и man:VOP_UNLOCK[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4807
+#, no-wrap
+msgid "800012"
+msgstr "800012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4808
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/175487[175487]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/175487[175487]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4809
+#, no-wrap
+msgid "January 19, 2008"
+msgstr "19 января 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4811
+#, no-wrap
+msgid "8.0-CURRENT after introduction of man:lockmgr_recursed[9], man:BUF_RECURSED[9] and man:BUF_ISLOCKED[9] and the removal of `BUF_REFCNT()`."
+msgstr "8.0-CURRENT после введения man:lockmgr_recursed[9], man:BUF_RECURSED[9] и man:BUF_ISLOCKED[9], а также удаления `BUF_REFCNT()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4812
+#, no-wrap
+msgid "800013"
+msgstr "800013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4813
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/175581[175581]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/175581[175581]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4814
+#, no-wrap
+msgid "January 23, 2008"
+msgstr "23 января 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4816
+#, no-wrap
+msgid "8.0-CURRENT after introduction of the \"ASCII\" encoding."
+msgstr "8.0-CURRENT после введения кодировки \"ASCII\"."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4817
+#, no-wrap
+msgid "800014"
+msgstr "800014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4818
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/175636[175636]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/175636[175636]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4819
+#, no-wrap
+msgid "January 24, 2008"
+msgstr "24 января 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4821
+#, no-wrap
+msgid "8.0-CURRENT after changing the prototype of man:lockmgr[9] and removal of `lockcount()` and `LOCKMGR_ASSERT()`."
+msgstr "8.0-CURRENT после изменения прототипа man:lockmgr[9] и удаления `lockcount()` и `LOCKMGR_ASSERT()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4822
+#, no-wrap
+msgid "800015"
+msgstr "800015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4823
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/175688[175688]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/175688[175688]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4824
+#, no-wrap
+msgid "January 26, 2008"
+msgstr "26 января 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4826
+#, no-wrap
+msgid "8.0-CURRENT after extending the types of the man:fts[3] structures."
+msgstr "8.0-CURRENT после расширения типов структур man:fts[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4827
+#, no-wrap
+msgid "800016"
+msgstr "800016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4828
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/175872[175872]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/175872[175872]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4829
+#, no-wrap
+msgid "February 1, 2008"
+msgstr "1 февраля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4831
+#, no-wrap
+msgid "8.0-CURRENT after adding an argument to man:MEXTADD[9]"
+msgstr "8.0-CURRENT после добавления аргумента в man:MEXTADD[9]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4832
+#, no-wrap
+msgid "800017"
+msgstr "800017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4833
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176015[176015]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176015[176015]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4834
+#, no-wrap
+msgid "February 6, 2008"
+msgstr "6 февраля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4836
+#, no-wrap
+msgid "8.0-CURRENT after the introduction of LK_NODUP and LK_NOWITNESS options in the man:lockmgr[9] space."
+msgstr "8.0-CURRENT после введения опций LK_NODUP и LK_NOWITNESS в пространстве man:lockmgr[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4837
+#, no-wrap
+msgid "800018"
+msgstr "800018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4838
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176112[176112]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176112[176112]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4839
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5812
+#, no-wrap
+msgid "February 8, 2008"
+msgstr "8 февраля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4841
+#, no-wrap
+msgid "8.0-CURRENT after the addition of `m_collapse`."
+msgstr "8.0-CURRENT после добавления `m_collapse`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4842
+#, no-wrap
+msgid "800019"
+msgstr "800019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4843
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176124[176124]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176124[176124]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4844
+#, no-wrap
+msgid "February 9, 2008"
+msgstr "9 февраля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4846
+#, no-wrap
+msgid "8.0-CURRENT after the addition of current working directory, root directory, and jail directory support to the kern.proc.filedesc sysctl."
+msgstr "8.0-CURRENT после добавления поддержки текущего рабочего каталога, корневого каталога и каталога клетки в sysctl kern.proc.filedesc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4847
+#, no-wrap
+msgid "800020"
+msgstr "800020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4848
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176251[176251]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176251[176251]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4849
+#, no-wrap
+msgid "February 13, 2008"
+msgstr "13 февраля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4851
+#, no-wrap
+msgid "8.0-CURRENT after introduction of man:lockmgr_assert[9] and `BUF_ASSERT` functions."
+msgstr "8.0-CURRENT после добавления man:lockmgr_assert[9] и функций `BUF_ASSERT`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4852
+#, no-wrap
+msgid "800021"
+msgstr "800021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4853
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176321[176321]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176321[176321]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4854
+#, no-wrap
+msgid "February 15, 2008"
+msgstr "15 февраля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4856
+#, no-wrap
+msgid "8.0-CURRENT after introduction of man:lockmgr_args[9] and LK_INTERNAL flag removal."
+msgstr "8.0-CURRENT после введения man:lockmgr_args[9] и удаления флага LK_INTERNAL."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4857
+#, no-wrap
+msgid "800022"
+msgstr "800022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4858
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176556[176556]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176556[176556]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4859
+#, no-wrap
+msgid "(backed out)"
+msgstr "(отменено)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4861
+#, no-wrap
+msgid "8.0-CURRENT after changing the default system ar to BSD man:ar[1]."
+msgstr "8.0-CURRENT после изменения стандартной системной ar на BSD man:ar[1]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4862
+#, no-wrap
+msgid "800023"
+msgstr "800023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4863
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176560[176560]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176560[176560]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4864
+#, no-wrap
+msgid "February 25, 2008"
+msgstr "25 февраля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4866
+#, no-wrap
+msgid "8.0-CURRENT after changing the prototypes of man:lockstatus[9] and man:VOP_ISLOCKED[9];, more specifically retiring the `struct thread` argument."
+msgstr "8.0-CURRENT после изменения прототипов man:lockstatus[9] и man:VOP_ISLOCKED[9];, а именно удаления аргумента `struct thread`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4867
+#, no-wrap
+msgid "800024"
+msgstr "800024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4868
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176709[176709]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176709[176709]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4869
+#, no-wrap
+msgid "March 1, 2008"
+msgstr "1 марта 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4871
+#, no-wrap
+msgid "8.0-CURRENT after axing out the `lockwaiters` and `BUF_LOCKWAITERS` functions, changing the return value of `brelvp` from void to int and introducing new flags for man:lockinit[9]."
+msgstr "8.0-CURRENT после удаления функций `lockwaiters` и `BUF_LOCKWAITERS`, изменения возвращаемого значения `brelvp` с void на int и добавления новых флагов для man:lockinit[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4872
+#, no-wrap
+msgid "800025"
+msgstr "800025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4873
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176958[176958]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176958[176958]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4874
+#, no-wrap
+msgid "March 8, 2008"
+msgstr "8 марта 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4876
+#, no-wrap
+msgid "8.0-CURRENT after adding F_DUP2FD command to man:fcntl[2]."
+msgstr "8.0-CURRENT после добавления команды F_DUP2FD в man:fcntl[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4877
+#, no-wrap
+msgid "800026"
+msgstr "800026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4878
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/177086[177086]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/177086[177086]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4879
+#, no-wrap
+msgid "March 12, 2008"
+msgstr "12 марта 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4881
+#, no-wrap
+msgid "8.0-CURRENT after changing the priority parameter to `cv_broadcastpri` such that 0 means no priority."
+msgstr "8.0-CURRENT после изменения параметра приоритета на `cv_broadcastpri`, где 0 означает отсутствие приоритета."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4882
+#, no-wrap
+msgid "800027"
+msgstr "800027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4883
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/177551[177551]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/177551[177551]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4884
+#, no-wrap
+msgid "March 24, 2008"
+msgstr "24 марта 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4886
+#, no-wrap
+msgid "8.0-CURRENT after changing the bpf monitoring ABI when `zerocopy` bpf buffers were added."
+msgstr "8.0-CURRENT после изменения ABI мониторинга bpf при добавлении буферов bpf с `zerocopy`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4887
+#, no-wrap
+msgid "800028"
+msgstr "800028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4888
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/177637[177637]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/177637[177637]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4889
+#, no-wrap
+msgid "March 26, 2008"
+msgstr "26 марта 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4891
+#, no-wrap
+msgid "8.0-CURRENT after adding `l_sysid` to struct flock."
+msgstr "8.0-CURRENT после добавления `l_sysid` в структуру flock."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4892
+#, no-wrap
+msgid "800029"
+msgstr "800029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4893
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/177688[177688]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/177688[177688]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4894
+#, no-wrap
+msgid "March 28, 2008"
+msgstr "March 28, 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4896
+#, no-wrap
+msgid "8.0-CURRENT after reintegration of the `BUF_LOCKWAITERS` function and the addition of man:lockmgr_waiters[9]."
+msgstr "8.0-CURRENT после повторного включения функции `BUF_LOCKWAITERS` и добавления man:lockmgr_waiters[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4897
+#, no-wrap
+msgid "800030"
+msgstr "800030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4898
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/177844[177844]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/177844[177844]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4899
+#, no-wrap
+msgid "April 1, 2008"
+msgstr "1 апреля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4901
+#, no-wrap
+msgid "8.0-CURRENT after the introduction of the man:rw_try_rlock[9] and man:rw_try_wlock[9] functions."
+msgstr "8.0-CURRENT после введения функций man:rw_try_rlock[9] и man:rw_try_wlock[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4902
+#, no-wrap
+msgid "800031"
+msgstr "800031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4903
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/177958[177958]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/177958[177958]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4904
+#, no-wrap
+msgid "April 6, 2008"
+msgstr "6 апреля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4906
+#, no-wrap
+msgid "8.0-CURRENT after the introduction of the `lockmgr_rw` and `lockmgr_args_rw` functions."
+msgstr "8.0-CURRENT после введения функций `lockmgr_rw` и `lockmgr_args_rw`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4907
+#, no-wrap
+msgid "800032"
+msgstr "800032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4908
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178006[178006]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178006[178006]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4909
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4914
+#, no-wrap
+msgid "April 8, 2008"
+msgstr "8 апреля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4911
+#, no-wrap
+msgid "8.0-CURRENT after the implementation of the `openat` and related syscalls, introduction of the O_EXEC flag for the man:open[2], and providing the corresponding Linux compatibility syscalls."
+msgstr "8.0-CURRENT после реализации системных вызовов `openat` и связанных с ними, введения флага O_EXEC для man:open[2] и предоставления соответствующих системных вызовов совместимости с Linux."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4912
+#, no-wrap
+msgid "800033"
+msgstr "800033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4913
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178017[178017]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178017[178017]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4916
+#, no-wrap
+msgid "8.0-CURRENT after added man:write[2] support for man:psm[4] in native operation level. Now arbitrary commands can be written to [.filename]#/dev/psm%d# and status can be read back from it."
+msgstr "8.0-CURRENT после добавления поддержки man:write[2] для man:psm[4] на уровне нативной работы. Теперь произвольные команды можно записывать в [.filename]#/dev/psm%d#, а статус — считывать из него."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4917
+#, no-wrap
+msgid "800034"
+msgstr "800034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4918
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178051[178051]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178051[178051]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4919
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5822
+#, no-wrap
+msgid "April 10, 2008"
+msgstr "10 апреля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4921
+#, no-wrap
+msgid "8.0-CURRENT after introduction of the `memrchr` function."
+msgstr "8.0-CURRENT после введения функции `memrchr`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4922
+#, no-wrap
+msgid "800035"
+msgstr "800035"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4923
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178256[178256]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178256[178256]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4924
+#, no-wrap
+msgid "April 16, 2008"
+msgstr "16 апреля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4926
+#, no-wrap
+msgid "8.0-CURRENT after introduction of the `fdopendir` function."
+msgstr "8.0-CURRENT после введения функции `fdopendir`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4927
+#, no-wrap
+msgid "800036"
+msgstr "800036"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4928
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178362[178362]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178362[178362]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4929
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5842
+#, no-wrap
+msgid "April 20, 2008"
+msgstr "20 апреля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4931
+#, no-wrap
+msgid "8.0-CURRENT after switchover of 802.11 wireless to multi-bss support (aka `vaps`)."
+msgstr "8.0-CURRENT после перехода на поддержку multi-bss в беспроводных сетях 802.11 (также известную как `vaps`)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4932
+#, no-wrap
+msgid "800037"
+msgstr "800037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4933
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178892[178892]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178892[178892]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4934
+#, no-wrap
+msgid "May 9, 2008"
+msgstr "9 мая 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4936
+#, no-wrap
+msgid "8.0-CURRENT after addition of multi routing table support (aka man:setfib[1], man:setfib[2])."
+msgstr "8.0-CURRENT после добавления поддержки нескольких таблиц маршрутизации (также известных как man:setfib[1], man:setfib[2])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4937
+#, no-wrap
+msgid "800038"
+msgstr "800038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4938
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/179316[179316]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/179316[179316]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4939
+#, no-wrap
+msgid "May 26, 2008"
+msgstr "26 мая 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4941
+#, no-wrap
+msgid "8.0-CURRENT after removal of `netatm` and ISDN4BSD. Also, the addition of the Compact C Type (CTF) tools."
+msgstr "8.0-CURRENT после удаления `netatm` и ISDN4BSD. Также добавлены инструменты Compact C Type (CTF)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4942
+#, no-wrap
+msgid "800039"
+msgstr "800039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4943
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/179784[179784]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/179784[179784]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4944
+#, no-wrap
+msgid "June 14, 2008"
+msgstr "14 июня 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4946
+#, no-wrap
+msgid "8.0-CURRENT after removal of `sgtty`."
+msgstr "8.0-CURRENT после удаления `sgtty`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4947
+#, no-wrap
+msgid "800040"
+msgstr "800040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4948
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/180025[180025]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/180025[180025]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4949
+#, no-wrap
+msgid "June 26, 2008"
+msgstr "26 июня 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4951
+#, no-wrap
+msgid "8.0-CURRENT with kernel NFS `lockd` client."
+msgstr "8.0-CURRENT с клиентом `lockd` для NFS в ядре."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4952
+#, no-wrap
+msgid "800041"
+msgstr "800041"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4953
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/180691[180691]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/180691[180691]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4954
+#, no-wrap
+msgid "July 22, 2008"
+msgstr "22 июля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4956
+#, no-wrap
+msgid "8.0-CURRENT after addition of man:arc4random_buf[3] and man:arc4random_uniform[3]."
+msgstr "8.0-CURRENT после добавления man:arc4random_buf[3] и man:arc4random_uniform[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4957
+#, no-wrap
+msgid "800042"
+msgstr "800042"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4958
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/181439[181439]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/181439[181439]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4959
+#, no-wrap
+msgid "August 8, 2008"
+msgstr "8 августа 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4961
+#, no-wrap
+msgid "8.0-CURRENT after addition of man:cpuctl[4]."
+msgstr "8.0-CURRENT после добавления man:cpuctl[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4962
+#, no-wrap
+msgid "800043"
+msgstr "800043"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4963
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/181694[181694]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/181694[181694]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4964
+#, no-wrap
+msgid "August 13, 2008"
+msgstr "13 августа 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4966
+#, no-wrap
+msgid "8.0-CURRENT after changing man:bpf[4] to use a single device node, instead of device cloning."
+msgstr "8.0-CURRENT после изменения man:bpf[4] для использования единого узла устройства вместо клонирования устройств."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4967
+#, no-wrap
+msgid "800044"
+msgstr "800044"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4968
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/181803[181803]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/181803[181803]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4969
+#, no-wrap
+msgid "August 17, 2008"
+msgstr "17 августа 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4971
+#, no-wrap
+msgid "8.0-CURRENT after the commit of the first step of the VIMAGE project renaming global variables to be virtualized with a `V_` prefix with macros to map them back to their global names."
+msgstr "8.0-CURRENT после внесения изменений, связанных с первым этапом проекта VIMAGE, переименованы глобальные переменные, подлежащие виртуализации, с добавлением префикса `V_` и макросов для их обратного отображения на глобальные имена."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4972
+#, no-wrap
+msgid "800045"
+msgstr "800045"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4973
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/181905[181905]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/181905[181905]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4974
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5862
+#, no-wrap
+msgid "August 20, 2008"
+msgstr "20 августа 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4976
+#, no-wrap
+msgid "8.0-CURRENT after the integration of the MPSAFE TTY layer, including changes to various drivers and utilities that interact with it."
+msgstr "8.0-CURRENT после интеграции MPSAFE TTY слоя, включая изменения в различных драйверах и утилитах, взаимодействующих с ним."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4977
+#, no-wrap
+msgid "800046"
+msgstr "800046"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4978
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/182869[182869]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/182869[182869]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4979
+#, no-wrap
+msgid "September 8, 2008"
+msgstr "8 сентября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4981
+#, no-wrap
+msgid "8.0-CURRENT after the separation of the GDT per CPU on amd64 architecture."
+msgstr "8.0-CURRENT после разделения GDT для каждого процессора на архитектуре amd64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4982
+#, no-wrap
+msgid "800047"
+msgstr "800047"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4983
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/182905[182905]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/182905[182905]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4984
+#, no-wrap
+msgid "September 10, 2008"
+msgstr "10 сентября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4986
+#, no-wrap
+msgid "8.0-CURRENT after removal of VSVTX, VSGID and VSUID."
+msgstr "8.0-CURRENT после удаления VSVTX, VSGID и VSUID."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4987
+#, no-wrap
+msgid "800048"
+msgstr "800048"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4988
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/183091[183091]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/183091[183091]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4989
+#, no-wrap
+msgid "September 16, 2008"
+msgstr "16 сентября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4991
+#, no-wrap
+msgid "8.0-CURRENT after converting the kernel NFS mount code to accept individual mount options in the man:nmount[2] `iovec`, not just one big struct nfs_args."
+msgstr "8.0-CURRENT после преобразования кода монтирования ядра NFS для поддержки отдельных опций монтирования в `iovec` man:nmount[2], а не только одной большой структуры nfs_args."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4992
+#, no-wrap
+msgid "800049"
+msgstr "800049"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4993
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/183114[183114]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/183114[183114]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4994
+#, no-wrap
+msgid "September 17, 2008"
+msgstr "17 сентября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4996
+#, no-wrap
+msgid "8.0-CURRENT after the removal of man:suser[9] and man:suser_cred[9]."
+msgstr "8.0-CURRENT после удаления man:suser[9] и man:suser_cred[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4997
+#, no-wrap
+msgid "800050"
+msgstr "800050"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4998
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/184099[184099]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/184099[184099]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:4999
+#, no-wrap
+msgid "October 20, 2008"
+msgstr "20 октября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5001
+#, no-wrap
+msgid "8.0-CURRENT after buffer cache API change."
+msgstr "8.0-CURRENT после изменения API кэша буфера."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5002
+#, no-wrap
+msgid "800051"
+msgstr "800051"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5003
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/184205[184205]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/184205[184205]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5004
+#, no-wrap
+msgid "October 23, 2008"
+msgstr "23 октября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5006
+#, no-wrap
+msgid "8.0-CURRENT after the removal of the man:MALLOC[9] and man:FREE[9] macros."
+msgstr "8.0-CURRENT после удаления макросов man:MALLOC[9] и man:FREE[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5007
+#, no-wrap
+msgid "800052"
+msgstr "800052"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5008
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/184419[184419]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/184419[184419]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5009
+#, no-wrap
+msgid "October 28, 2008"
+msgstr "28 октября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5011
+#, no-wrap
+msgid "8.0-CURRENT after the introduction of `accmode_t` and renaming of VOP_ACCESS `a_mode` argument to `a_accmode`."
+msgstr "8.0-CURRENT после введения `accmode_t` и переименования аргумента `a_mode` в `a_accmode` в VOP_ACCESS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5012
+#, no-wrap
+msgid "800053"
+msgstr "800053"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5013
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/184555[184555]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/184555[184555]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5014
+#, no-wrap
+msgid "November 2, 2008"
+msgstr "2 ноября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5016
+#, no-wrap
+msgid "8.0-CURRENT after the prototype change of man:vfs_busy[9] and the introduction of its MBF_NOWAIT and MBF_MNTLSTLOCK flags."
+msgstr "8.0-CURRENT после изменения прототипа man:vfs_busy[9] и введения флагов MBF_NOWAIT и MBF_MNTLSTLOCK."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5017
+#, no-wrap
+msgid "800054"
+msgstr "800054"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5018
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/185162[185162]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/185162[185162]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5019
+#, no-wrap
+msgid "November 22, 2008"
+msgstr "22 ноября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5021
+#, no-wrap
+msgid "8.0-CURRENT after the addition of `buf_ring`, memory barriers and ifnet functions to facilitate multiple hardware transmit queues for cards that support them, and a lockless ring-buffer implementation to enable drivers to more efficiently manage queuing of packets."
+msgstr "8.0-CURRENT после добавления `buf_ring`, барьеров памяти и функций ifnet для поддержки нескольких аппаратных очередей передачи для карт, которые их поддерживают, а также реализации кольцевого буфера без блокировок, чтобы позволить драйверам более эффективно управлять очередями пакетов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5022
+#, no-wrap
+msgid "800055"
+msgstr "800055"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5023
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/185363[185363]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/185363[185363]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5024
+#, no-wrap
+msgid "November 27, 2008"
+msgstr "27 ноября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5026
+#, no-wrap
+msgid "8.0-CURRENT after the addition of Intel(TM) Core, Core2, and Atom support to man:hwpmc[4]."
+msgstr "8.0-CURRENT после добавления поддержки Intel(TM) Core, Core2 и Atom в man:hwpmc[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5027
+#, no-wrap
+msgid "800056"
+msgstr "800056"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5028
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/185435[185435]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/185435[185435]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5029
+#, no-wrap
+msgid "November 29, 2008"
+msgstr "29 ноября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5031
+#, no-wrap
+msgid "8.0-CURRENT after the introduction of multi-/no-IPv4/v6 jails."
+msgstr "8.0-CURRENT после введения многопользовательских/без IPv4/v6 клеток."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5032
+#, no-wrap
+msgid "800057"
+msgstr "800057"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5033
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/185522[185522]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/185522[185522]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5034
+#, no-wrap
+msgid "December 1, 2008"
+msgstr "1 декабря 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5036
+#, no-wrap
+msgid "8.0-CURRENT after the switch to the ath `hal` source code."
+msgstr "8.0-CURRENT после перехода на исходный код `hal` для ath."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5037
+#, no-wrap
+msgid "800058"
+msgstr "800058"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5038
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/185968[185968]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/185968[185968]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5039
+#, no-wrap
+msgid "December 12, 2008"
+msgstr "12 декабря 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5041
+#, no-wrap
+msgid "8.0-CURRENT after the introduction of the VOP_VPTOCNP operation."
+msgstr "8.0-CURRENT после введения операции VOP_VPTOCNP."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5042
+#, no-wrap
+msgid "800059"
+msgstr "800059"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5043
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/186119[186119]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/186119[186119]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5044
+#, no-wrap
+msgid "December 15, 2008"
+msgstr "15 декабря 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5046
+#, no-wrap
+msgid "8.0-CURRENT incorporates the new arp-v2 rewrite."
+msgstr "8.0-CURRENT включает новую переработанную версию arp-v2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5047
+#, no-wrap
+msgid "800060"
+msgstr "800060"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5048
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/186344[186344]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/186344[186344]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5049
+#, no-wrap
+msgid "December 19, 2008"
+msgstr "19 декабря 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5051
+#, no-wrap
+msgid "8.0-CURRENT after the addition of makefs."
+msgstr "8.0-CURRENT после добавления makefs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5052
+#, no-wrap
+msgid "800061"
+msgstr "800061"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5053
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/187289[187289]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/187289[187289]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5054
+#, no-wrap
+msgid "January 15, 2009"
+msgstr "15 января 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5056
+#, no-wrap
+msgid "8.0-CURRENT after TCP Appropriate Byte Counting."
+msgstr "8.0-CURRENT после TCP Appropriate Byte Counting."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5057
+#, no-wrap
+msgid "800062"
+msgstr "800062"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5058
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/187830[187830]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/187830[187830]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5059
+#, no-wrap
+msgid "January 28, 2009"
+msgstr "28 января 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5061
+#, no-wrap
+msgid "8.0-CURRENT after removal of `minor()`, `minor2unit()`, `unit2minor()`, etc."
+msgstr "8.0-CURRENT после удаления `minor()`, `minor2unit()`, `unit2minor()` и т.д."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5062
+#, no-wrap
+msgid "800063"
+msgstr "800063"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5063
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/188745[188745]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/188745[188745]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5064
+#, no-wrap
+msgid "February 18, 2009"
+msgstr "18 февраля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5066
+#, no-wrap
+msgid "8.0-CURRENT after GENERIC config change to use the USB2 stack, but also the addition of man:fdevname[3]."
+msgstr "8.0-CURRENT после изменения конфигурации GENERIC для использования стека USB2, а также добавления man:fdevname[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5067
+#, no-wrap
+msgid "800064"
+msgstr "800064"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5068
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/188946[188946]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/188946[188946]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5069
+#, no-wrap
+msgid "February 23, 2009"
+msgstr "23 февраля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5071
+#, no-wrap
+msgid "8.0-CURRENT after the USB2 stack is moved to and replaces dev/usb."
+msgstr "8.0-CURRENT после переноса стека USB2 и замены dev/usb."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5072
+#, no-wrap
+msgid "800065"
+msgstr "800065"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5073
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189092[189092]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189092[189092]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5074
+#, no-wrap
+msgid "February 26, 2009"
+msgstr "26 февраля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5076
+#, no-wrap
+msgid "8.0-CURRENT after the renaming of all functions in man:libmp[3]."
+msgstr "8.0-CURRENT после переименования всех функций в man:libmp[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5077
+#, no-wrap
+msgid "800066"
+msgstr "800066"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5078
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189110[189110]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189110[189110]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5079
+#, no-wrap
+msgid "February 27, 2009"
+msgstr "27 февраля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5081
+#, no-wrap
+msgid "8.0-CURRENT after changing USB devfs handling and layout."
+msgstr "8.0-CURRENT после изменения обработки и структуры USB devfs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5082
+#, no-wrap
+msgid "800067"
+msgstr "800067"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5083
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189136[189136]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189136[189136]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5084
+#, no-wrap
+msgid "February 28, 2009"
+msgstr "28 февраля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5086
+#, no-wrap
+msgid "8.0-CURRENT after adding `getdelim()`, `getline()`, `stpncpy()`, `strnlen()`, `wcsnlen()`, `wcscasecmp()`, and `wcsncasecmp()`."
+msgstr "8.0-CURRENT после добавления `getdelim()`, `getline()`, `stpncpy()`, `strnlen()`, `wcsnlen()`, `wcscasecmp()`, and `wcsncasecmp()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5087
+#, no-wrap
+msgid "800068"
+msgstr "800068"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5088
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189276[189276]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189276[189276]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5089
+#, no-wrap
+msgid "March 2, 2009"
+msgstr "2 марта 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5091
+#, no-wrap
+msgid "8.0-CURRENT after renaming the `ushub` devclass to `uhub`."
+msgstr "8.0-CURRENT после переименования класса устройств `ushub` в `uhub`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5092
+#, no-wrap
+msgid "800069"
+msgstr "800069"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5093
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189585[189585]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189585[189585]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5094
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5099
+#, no-wrap
+msgid "March 9, 2009"
+msgstr "9 марта 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5096
+#, no-wrap
+msgid "8.0-CURRENT after libusb20.so.1 was renamed to libusb.so.1."
+msgstr "8.0-CURRENT после переименования libusb20.so.1 в libusb.so.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5097
+#, no-wrap
+msgid "800070"
+msgstr "800070"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5098
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189592[189592]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189592[189592]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5101
+#, no-wrap
+msgid "8.0-CURRENT after merging IGMPv3 and Source-Specific Multicast (SSM) to the IPv4 stack."
+msgstr "8.0-CURRENT после объединения IGMPv3 и Source-Specific Multicast (SSM) в стек IPv4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5102
+#, no-wrap
+msgid "800071"
+msgstr "800071"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5103
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189825[189825]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189825[189825]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5104
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5907
+#, no-wrap
+msgid "March 14, 2009"
+msgstr "14 марта 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5106
+#, no-wrap
+msgid "8.0-CURRENT after gcc was patched to use C99 inline semantics in c99 and gnu99 mode."
+msgstr "8.0-CURRENT после того, как gcc был исправлен для использования семантики встраивания C99 в режимах c99 и gnu99."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5107
+#, no-wrap
+msgid "800072"
+msgstr "800072"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5108
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189853[189853]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189853[189853]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5109
+#, no-wrap
+msgid "March 15, 2009"
+msgstr "March 15, 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5111
+#, no-wrap
+msgid "8.0-CURRENT after the IFF_NEEDSGIANT flag has been removed; non-MPSAFE network device drivers are no longer supported."
+msgstr "8.0-CURRENT после удаления флага IFF_NEEDSGIANT; неподдерживаемые MPSAFE драйверы сетевых устройств больше не поддерживаются."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5112
+#, no-wrap
+msgid "800073"
+msgstr "800073"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5113
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/190265[190265]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/190265[190265]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5114
+#, no-wrap
+msgid "March 18, 2009"
+msgstr "18 марта 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5116
+#, no-wrap
+msgid "8.0-CURRENT after the dynamic string token substitution has been implemented for rpath and needed paths."
+msgstr "8.0-CURRENT после реализации подстановки динамических строковых токенов для rpath и необходимых путей."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5117
+#, no-wrap
+msgid "800074"
+msgstr "800074"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5118
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/190373[190373]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/190373[190373]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5119
+#, no-wrap
+msgid "March 24, 2009"
+msgstr "24 марта 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5121
+#, no-wrap
+msgid "8.0-CURRENT after tcpdump 4.0.0 and libpcap 1.0.0 import."
+msgstr "8.0-CURRENT после импорта tcpdump 4.0.0 и libpcap 1.0.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5122
+#, no-wrap
+msgid "800075"
+msgstr "800075"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5123
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/190787[190787]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/190787[190787]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5124
+#, no-wrap
+msgid "April 6, 2009"
+msgstr "6 апреля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5126
+#, no-wrap
+msgid "8.0-CURRENT after layout of structs vnet_net, vnet_inet and vnet_ipfw has been changed."
+msgstr "8.0-CURRENT после изменения структуры структур vnet_net, vnet_inet и vnet_ipfw."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5127
+#, no-wrap
+msgid "800076"
+msgstr "800076"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5128
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/190866[190866]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/190866[190866]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5129
+#, no-wrap
+msgid "April 9, 2009"
+msgstr "9 апреля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5131
+#, no-wrap
+msgid "8.0-CURRENT after adding delay profiles in dummynet."
+msgstr "8.0-CURRENT после добавления профилей задержки в dummynet."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5132
+#, no-wrap
+msgid "800077"
+msgstr "800077"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5133
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/190914[190914]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/190914[190914]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5134
+#, no-wrap
+msgid "April 14, 2009"
+msgstr "14 апреля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5136
+#, no-wrap
+msgid "8.0-CURRENT after removing `VOP_LEASE()` and vop_vector.vop_lease."
+msgstr "8.0-CURRENT после удаления `VOP_LEASE()` и vop_vector.vop_lease."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5137
+#, no-wrap
+msgid "800078"
+msgstr "800078"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5138
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191080[191080]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191080[191080]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5139
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5144
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5149
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5912
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5917
+#, no-wrap
+msgid "April 15, 2009"
+msgstr "15 апреля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5141
+#, no-wrap
+msgid "8.0-CURRENT after struct `rt_weight` fields have been added to struct `rt_metrics` and struct `rt_metrics_lite`, changing the layout of struct `rt_metrics_lite`. A bump to RTM_VERSION was made, but backed out."
+msgstr "8.0-CURRENT после добавления полей `rt_weight` в структуры `rt_metrics` и `rt_metrics_lite`, что изменило расположение полей в структуре `rt_metrics_lite`. Версия RTM_VERSION была увеличена, но затем отменена."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5142
+#, no-wrap
+msgid "800079"
+msgstr "800079"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5143
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191117[191117]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191117[191117]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5146
+#, no-wrap
+msgid "8.0-CURRENT after struct `llentry` pointers are added to struct route and struct route_in6."
+msgstr "8.0-CURRENT после добавления указателей на структуру `llentry` в структуры `route` и `route_in6`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5147
+#, no-wrap
+msgid "800080"
+msgstr "800080"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5148
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191126[191126]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191126[191126]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5151
+#, no-wrap
+msgid "8.0-CURRENT after layout of struct inpcb has been changed."
+msgstr "8.0-CURRENT после изменения структуры inpcb."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5152
+#, no-wrap
+msgid "800081"
+msgstr "800081"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5153
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191267[191267]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191267[191267]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5154
+#, no-wrap
+msgid "April 19, 2009"
+msgstr "19 апреля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5156
+#, no-wrap
+msgid "8.0-CURRENT after the layout of struct `malloc_type` has been changed."
+msgstr "8.0-CURRENT после изменения структуры `malloc_type`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5157
+#, no-wrap
+msgid "800082"
+msgstr "800082"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5158
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191368[191368]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191368[191368]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5159
+#, no-wrap
+msgid "April 21, 2009"
+msgstr "21 апреля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5161
+#, no-wrap
+msgid "8.0-CURRENT after the layout of struct ifnet has changed, and with `if_ref()` and `if_rele()` ifnet `refcounting`."
+msgstr "8.0-CURRENT после изменения структуры struct ifnet и с `if_ref()` и `if_rele()` для подсчета ссылок (`refcounting`) ifnet."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5162
+#, no-wrap
+msgid "800083"
+msgstr "800083"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5163
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191389[191389]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191389[191389]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5164
+#, no-wrap
+msgid "April 22, 2009"
+msgstr "22 апреля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5166
+#, no-wrap
+msgid "8.0-CURRENT after the implementation of a low-level Bluetooth HCI API."
+msgstr "8.0-CURRENT после реализации низкоуровневого API HCI Bluetooth."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5167
+#, no-wrap
+msgid "800084"
+msgstr "800084"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5168
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191672[191672]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191672[191672]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5169
+#, no-wrap
+msgid "April 29, 2009"
+msgstr "29 апреля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5171
+#, no-wrap
+msgid "8.0-CURRENT after IPv6 SSM and MLDv2 changes."
+msgstr "8.0-CURRENT после изменений в IPv6 SSM и MLDv2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5172
+#, no-wrap
+msgid "800085"
+msgstr "800085"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5173
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191688[191688]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191688[191688]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5174
+#, no-wrap
+msgid "April 30, 2009"
+msgstr "30 апреля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5176
+#, no-wrap
+msgid "8.0-CURRENT after enabling support for VIMAGE kernel builds with one active image."
+msgstr "8.0-CURRENT после включения поддержки сборки ядра с VIMAGE с одним активным образом."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5177
+#, no-wrap
+msgid "800086"
+msgstr "800086"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5178
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191910[191910]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191910[191910]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5179
+#, no-wrap
+msgid "May 8, 2009"
+msgstr "8 мая 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5181
+#, no-wrap
+msgid "8.0-CURRENT after adding support for input lines of arbitrarily length in man:patch[1]."
+msgstr "8.0-CURRENT после добавления поддержки строк ввода произвольной длины в man:patch[1]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5182
+#, no-wrap
+msgid "800087"
+msgstr "800087"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5183
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191990[191990]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191990[191990]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5184
+#, no-wrap
+msgid "May 11, 2009"
+msgstr "11 мая 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5186
+#, no-wrap
+msgid "8.0-CURRENT after some VFS KPI changes. The thread argument has been removed from the FSD parts of the VFS. `VFS_*` functions do not need the context any more because it always refers to `curthread`. In some special cases, the old behavior is retained."
+msgstr "8.0-CURRENT после некоторых изменений в VFS KPI. Аргумент потока был удален из частей FSD в VFS. Функциям `VFS_*` больше не нужен контекст, так как он всегда относится к `curthread`. В некоторых особых случаях старое поведение сохранено."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5187
+#, no-wrap
+msgid "800088"
+msgstr "800088"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5188
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/192470[192470]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/192470[192470]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5189
+#, no-wrap
+msgid "May 20, 2009"
+msgstr "20 мая 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5191
+#, no-wrap
+msgid "8.0-CURRENT after net80211 monitor mode changes."
+msgstr "8.0-CURRENT после изменений режима монитора в net80211."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5192
+#, no-wrap
+msgid "800089"
+msgstr "800089"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5193
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/192649[192649]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/192649[192649]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5194
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5199
+#, no-wrap
+msgid "May 23, 2009"
+msgstr "23 мая 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5196
+#, no-wrap
+msgid "8.0-CURRENT after adding UDP control block support."
+msgstr "8.0-CURRENT после добавления поддержки блока управления UDP."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5197
+#, no-wrap
+msgid "800090"
+msgstr "800090"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5198
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/192669[192669]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/192669[192669]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5201
+#, no-wrap
+msgid "8.0-CURRENT after virtualizing interface cloning."
+msgstr "8.0-CURRENT после виртуализации клонирования интерфейсов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5202
+#, no-wrap
+msgid "800091"
+msgstr "800091"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5203
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/192895[192895]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/192895[192895]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5204
+#, no-wrap
+msgid "May 27, 2009"
+msgstr "27 мая 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5206
+#, no-wrap
+msgid "8.0-CURRENT after adding hierarchical jails and removing global securelevel."
+msgstr "8.0-CURRENT после добавления иерархических клеток и удаления глобального securelevel."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5207
+#, no-wrap
+msgid "800092"
+msgstr "800092"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5208
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/193011[193011]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/193011[193011]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5209
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5214
+#, no-wrap
+msgid "May 29, 2009"
+msgstr "29 мая 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5211
+#, no-wrap
+msgid "8.0-CURRENT after changing `sx_init_flags()` KPI. The `SX_ADAPTIVESPIN` is retired and a new `SX_NOADAPTIVE` flag is introduced to handle the reversed logic."
+msgstr "8.0-CURRENT после изменения KPI `sx_init_flags()`. `SX_ADAPTIVESPIN` упразднён, и введён новый флаг `SX_NOADAPTIVE` для обработки обратной логики."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5212
+#, no-wrap
+msgid "800093"
+msgstr "800093"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5213
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/193047[193047]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/193047[193047]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5216
+#, no-wrap
+msgid "8.0-CURRENT after adding `mnt_xflag` to struct mount."
+msgstr "8.0-CURRENT после добавления `mnt_xflag` в структуру mount."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5217
+#, no-wrap
+msgid "800094"
+msgstr "800094"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5218
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/193093[193093]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/193093[193093]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5219
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5224
+#, no-wrap
+msgid "May 30, 2009"
+msgstr "30 мая 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5221
+#, no-wrap
+msgid "8.0-CURRENT after adding man:VOP_ACCESSX[9]."
+msgstr "8.0-CURRENT после добавления man:VOP_ACCESSX[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5222
+#, no-wrap
+msgid "800095"
+msgstr "800095"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5223
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/193096[193096]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/193096[193096]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5226
+#, no-wrap
+msgid "8.0-CURRENT after changing the polling KPI. The polling handlers now return the number of packets processed. A new `IFCAP_POLLING_NOCOUNT` is also introduced to specify that the return value is not significant and the counting should be skipped."
+msgstr "8.0-CURRENT после изменения KPI для polling. Обработчики polling теперь возвращают количество обработанных пакетов. Также введена новая возможность `IFCAP_POLLING_NOCOUNT`, которая указывает, что возвращаемое значение не является значимым и подсчёт следует пропустить."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5227
+#, no-wrap
+msgid "800096"
+msgstr "800096"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5228
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/193219[193219]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/193219[193219]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5229
+#, no-wrap
+msgid "June 1, 2009"
+msgstr "1 июня 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5231
+#, no-wrap
+msgid "8.0-CURRENT after updating to the new netisr implementation and after changing the way of storing and accessing FIBs."
+msgstr "8.0-CURRENT после обновления до новой реализации netisr и после изменения способа хранения и доступа к FIB."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5232
+#, no-wrap
+msgid "800097"
+msgstr "800097"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5233
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/193731[193731]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/193731[193731]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5234
+#, no-wrap
+msgid "June 8, 2009"
+msgstr "8 июня 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5236
+#, no-wrap
+msgid "8.0-CURRENT after the introduction of vnet destructor hooks and infrastructure."
+msgstr "8.0-CURRENT после введения хуков и инфраструктуры деструктора vnet."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5238
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/194012[194012]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/194012[194012]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5239
+#, no-wrap
+msgid "June 11, 2009"
+msgstr "11 июня 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5241
+#, no-wrap
+msgid "8.0-CURRENT after the introduction of netgraph outbound to inbound path call detection and queuing, which also changed the layout of struct thread."
+msgstr "8.0-CURRENT после введения в netgraph обнаружения вызовов пути из исходящего во входящий и организации очередей, что также изменило структуру struct thread."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5242
+#, no-wrap
+msgid "800098"
+msgstr "800098"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5243
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/194210[194210]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/194210[194210]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5244
+#, no-wrap
+msgid "June 14, 2009"
+msgstr "14 июня 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5246
+#, no-wrap
+msgid "8.0-CURRENT after OpenSSL 0.9.8k import."
+msgstr "8.0-CURRENT после импорта OpenSSL 0.9.8k."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5247
+#, no-wrap
+msgid "800099"
+msgstr "800099"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5248
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/194675[194675]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/194675[194675]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5249
+#, no-wrap
+msgid "June 22, 2009"
+msgstr "22 июня 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5251
+#, no-wrap
+msgid "8.0-CURRENT after NGROUPS update and moving route virtualization into its own VImage module."
+msgstr "8.0-CURRENT после обновления NGROUPS и переноса виртуализации маршрутов в собственный модуль VImage."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5252
+#, no-wrap
+msgid "800100"
+msgstr "800100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5253
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/194920[194920]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/194920[194920]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5254
+#, no-wrap
+msgid "June 24, 2009"
+msgstr "24 июня 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5256
+#, no-wrap
+msgid "8.0-CURRENT after SYSVIPC ABI change."
+msgstr "8.0-CURRENT после изменения ABI SYSVIPC."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5257
+#, no-wrap
+msgid "800101"
+msgstr "800101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5258
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/195175[195175]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/195175[195175]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5259
+#, no-wrap
+msgid "June 29, 2009"
+msgstr "29 июня 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5261
+#, no-wrap
+msgid "8.0-CURRENT after the removal of the /dev/net/* per-interface character devices."
+msgstr "8.0-CURRENT после удаления символьных устройств /dev/net/* для каждого интерфейса."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5262
+#, no-wrap
+msgid "800102"
+msgstr "800102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5263
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/195634[195634]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/195634[195634]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5264
+#, no-wrap
+msgid "July 12, 2009"
+msgstr "12 июля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5266
+#, no-wrap
+msgid "8.0-CURRENT after padding was added to struct `sackhint`, struct tcpcb, and struct `tcpstat`."
+msgstr "8.0-CURRENT после добавления заполнения к структурам `sackhint`, `tcpcb` и `tcpstat`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5267
+#, no-wrap
+msgid "800103"
+msgstr "800103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5268
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/195654[195654]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/195654[195654]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5269
+#, no-wrap
+msgid "July 13, 2009"
+msgstr "13 июля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5271
+#, no-wrap
+msgid "8.0-CURRENT after replacing struct `tcpopt` with struct `toeopt` in the TOE driver interface to the TCP `syncache`."
+msgstr "8.0-CURRENT после замены структуры `tcpopt` на структуру `toeopt` в интерфейсе драйвера TOE к `syncache` TCP."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5272
+#, no-wrap
+msgid "800104"
+msgstr "800104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5273
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/195699[195699]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/195699[195699]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5274
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5937
+#, no-wrap
+msgid "July 14, 2009"
+msgstr "14 июля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5276
+#, no-wrap
+msgid "8.0-CURRENT after the addition of the linker-set based per-vnet allocator."
+msgstr "8.0-CURRENT после добавления распределителя на основе наборов компоновщика для каждого vnet."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5277
+#, no-wrap
+msgid "800105"
+msgstr "800105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5278
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/195767[195767]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/195767[195767]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5279
+#, no-wrap
+msgid "July 19, 2009"
+msgstr "19 июля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5281
+#, no-wrap
+msgid "8.0-CURRENT after version bump for all shared libraries that do not have symbol versioning turned on."
+msgstr "8.0-CURRENT после увеличения версии для всех разделяемых библиотек, у которых не включено управление версиями символов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5282
+#, no-wrap
+msgid "800106"
+msgstr "800106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5283
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/195852[195852]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/195852[195852]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5284
+#, no-wrap
+msgid "July 24, 2009"
+msgstr "24 июля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5286
+#, no-wrap
+msgid "8.0-CURRENT after introduction of OBJT_SG VM object type."
+msgstr "8.0-CURRENT после введения типа объекта VM OBJT_SG."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5287
+#, no-wrap
+msgid "800107"
+msgstr "800107"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5288
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/196037[196037]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/196037[196037]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5289
+#, no-wrap
+msgid "August 2, 2009"
+msgstr "2 августа 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5291
+#, no-wrap
+msgid "8.0-CURRENT after making the newbus subsystem Giant free by adding the newbus `sxlock` and 8.0-RELEASE."
+msgstr "8.0-CURRENT после освобождения подсистемы newbus от Giant путем добавления `sxlock` в newbus и 8.0-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5292
+#, no-wrap
+msgid "800108"
+msgstr "800108"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5293
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/199627[199627]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/199627[199627]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5294
+#, no-wrap
+msgid "November 21, 2009"
+msgstr "21 ноября 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5296
+#, no-wrap
+msgid "8.0-STABLE after implementing EVFILT_USER `kevent` filter."
+msgstr "8.0-STABLE после реализации фильтра `kevent` `EVFILT_USER`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5297
+#, no-wrap
+msgid "800500"
+msgstr "800500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5298
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/201749[201749]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/201749[201749]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5299
+#, no-wrap
+msgid "January 7, 2010"
+msgstr "7 января 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5301
+#, no-wrap
+msgid "8.0-STABLE after `__FreeBSD_version` bump to make `pkg_add -r` use packages-8-stable."
+msgstr "8.0-STABLE после увеличения `__FreeBSD_version`, чтобы `pkg_add -r` использовал пакеты-8-stable."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5302
+#, no-wrap
+msgid "800501"
+msgstr "800501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5303
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/202922[202922]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/202922[202922]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5304
+#, no-wrap
+msgid "January 24, 2010"
+msgstr "24 января 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5306
+#, no-wrap
+msgid "8.0-STABLE after change of the man:scandir[3] and man:alphasort[3] prototypes to conform to SUSv4."
+msgstr "8.0-STABLE после изменения прототипов man:scandir[3] и man:alphasort[3] для соответствия SUSv4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5307
+#, no-wrap
+msgid "800502"
+msgstr "800502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5308
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/203299[203299]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/203299[203299]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5309
+#, no-wrap
+msgid "January 31, 2010"
+msgstr "31 января 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5311
+#, no-wrap
+msgid "8.0-STABLE after addition of man:sigpause[2]."
+msgstr "8.0-STABLE после добавления man:sigpause[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5312
+#, no-wrap
+msgid "800503"
+msgstr "800503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5313
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/204344[204344]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/204344[204344]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5314
+#, no-wrap
+msgid "February 25, 2010"
+msgstr "25 февраля 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5316
+#, no-wrap
+msgid "8.0-STABLE after addition of SIOCGIFDESCR and SIOCSIFDESCR ioctls to network interfaces. These ioctl can be used to manipulate interface description, as inspired by OpenBSD."
+msgstr "8.0-STABLE после добавления ioctl SIOCGIFDESCR и SIOCSIFDESCR к сетевым интерфейсам. Эти ioctl могут использоваться для управления описанием интерфейса, по аналогии с OpenBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5317
+#, no-wrap
+msgid "800504"
+msgstr "800504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5318
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/204546[204546]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/204546[204546]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5319
+#, no-wrap
+msgid "March 1, 2010"
+msgstr "1 марта 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5321
+#, no-wrap
+msgid "8.0-STABLE after MFC of importing x86emu, a software emulator for real mode x86 CPU from OpenBSD."
+msgstr "8.0-STABLE после MFC импорта x86emu, программного эмулятора реального режима x86 CPU из OpenBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5322
+#, no-wrap
+msgid "800505"
+msgstr "800505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5323
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/208259[208259]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/208259[208259]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5324
+#, no-wrap
+msgid "May 18, 2010"
+msgstr "18 мая 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5326
+#, no-wrap
+msgid "8.0-STABLE after MFC of adding liblzma, xz, xzdec, and lzmainfo."
+msgstr "8.0-STABLE после MFC добавления liblzma, xz, xzdec и lzmainfo."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5327
+#, no-wrap
+msgid "801000"
+msgstr "801000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5328
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/209150[209150]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/209150[209150]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5329
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5334
+#, no-wrap
+msgid "June 14, 2010"
+msgstr "14 июня 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5331
+#, no-wrap
+msgid "8.1-RELEASE"
+msgstr "8.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5332
+#, no-wrap
+msgid "801500"
+msgstr "801500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5333
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/209146[209146]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/209146[209146]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5336
+#, no-wrap
+msgid "8.1-STABLE after 8.1-RELEASE."
+msgstr "8.1-STABLE после 8.1-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5337
+#, no-wrap
+msgid "801501"
+msgstr "801501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5338
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/214762[214762]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/214762[214762]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5339
+#, no-wrap
+msgid "November 3, 2010"
+msgstr "3 ноября 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5341
+#, no-wrap
+msgid "8.1-STABLE after KBI change in struct `sysentvec`, and implementation of PL_FLAG_SCE/SCX/EXEC/SI and `pl_siginfo` for ptrace(PT_LWPINFO) ."
+msgstr "8.1-STABLE после изменения KBI в структуре `sysentvec`, а также реализации PL_FLAG_SCE/SCX/EXEC/SI и `pl_siginfo` для ptrace(PT_LWPINFO)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5342
+#, no-wrap
+msgid "802000"
+msgstr "802000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5343
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/216639[216639]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/216639[216639]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5344
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5349
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5962
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5967
+#, no-wrap
+msgid "December 22, 2010"
+msgstr "22 декабря 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5346
+#, no-wrap
+msgid "8.2-RELEASE"
+msgstr "8.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5347
+#, no-wrap
+msgid "802500"
+msgstr "802500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5348
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/216654[216654]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/216654[216654]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5351
+#, no-wrap
+msgid "8.2-STABLE after 8.2-RELEASE."
+msgstr "8.2-STABLE после 8.2-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5352
+#, no-wrap
+msgid "802501"
+msgstr "802501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5353
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/219107[219107]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/219107[219107]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5354
+#, no-wrap
+msgid "February 28, 2011"
+msgstr "28 февраля 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5356
+#, no-wrap
+msgid "8.2-STABLE after merging DTrace changes, including support for userland tracing."
+msgstr "8.2-STABLE после объединения изменений DTrace, включая поддержку трассировки пользовательского пространства."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5357
+#, no-wrap
+msgid "802502"
+msgstr "802502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5358
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/219324[219324]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/219324[219324]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5359
+#, no-wrap
+msgid "March 6, 2011"
+msgstr "6 марта 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5361
+#, no-wrap
+msgid "8.2-STABLE after merging log2 and log2f into libm."
+msgstr "8.2-STABLE после объединения log2 и log2f в libm."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5362
+#, no-wrap
+msgid "802503"
+msgstr "802503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5363
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/221275[221275]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/221275[221275]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5364
+#, no-wrap
+msgid "May 1, 2011"
+msgstr "1 мая 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5366
+#, no-wrap
+msgid "8.2-STABLE after upgrade of the gcc to the last GPLv2 version from the FSF gcc-4_2-branch."
+msgstr "8.2-STABLE после обновления gcc до последней версии GPLv2 из ветки FSF gcc-4_2-branch."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5367
+#, no-wrap
+msgid "802504"
+msgstr "802504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5368
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/222401[222401]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/222401[222401]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5369
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5374
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5379
+#, no-wrap
+msgid "May 28, 2011"
+msgstr "28 мая 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5371
+#, no-wrap
+msgid "8.2-STABLE after introduction of the KPI and supporting infrastructure for modular congestion control."
+msgstr "8.2-STABLE после введения KPI и поддерживающей инфраструктуры для модульного управления перегрузкой."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5372
+#, no-wrap
+msgid "802505"
+msgstr "802505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5373
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/222406[222406]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/222406[222406]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5376
+#, no-wrap
+msgid "8.2-STABLE after introduction of Hhook and Khelp KPIs."
+msgstr "8.2-STABLE после введения KPIs Hhook и Khelp."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5377
+#, no-wrap
+msgid "802506"
+msgstr "802506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5378
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/222408[222408]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/222408[222408]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5381
+#, no-wrap
+msgid "8.2-STABLE after addition of OSD to struct tcpcb."
+msgstr "8.2-STABLE после добавления OSD в структуру tcpcb."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5382
+#, no-wrap
+msgid "802507"
+msgstr "802507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5383
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/222741[222741]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/222741[222741]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5384
+#, no-wrap
+msgid "June 6, 2011"
+msgstr "6 июня 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5386
+#, no-wrap
+msgid "8.2-STABLE after ZFS v28 import."
+msgstr "8.2-STABLE после импорта ZFS v28."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5387
+#, no-wrap
+msgid "802508"
+msgstr "802508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5388
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/222846[222846]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/222846[222846]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5389
+#, no-wrap
+msgid "June 8, 2011"
+msgstr "8 июня 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5391
+#, no-wrap
+msgid "8.2-STABLE after removal of the `schedtail` event handler and addition of the `sv_schedtail` method to struct `sysvec`."
+msgstr "8.2-STABLE после удаления обработчика событий `schedtail` и добавления метода `sv_schedtail` в структуру `sysvec`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5392
+#, no-wrap
+msgid "802509"
+msgstr "802509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5393
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/224017[224017]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/224017[224017]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5394
+#, no-wrap
+msgid "July 14, 2011"
+msgstr "14 июля 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5396
+#, no-wrap
+msgid "8.2-STABLE after merging the SSSE3 support into binutils."
+msgstr "8.2-STABLE после объединения поддержки SSSE3 в binutils."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5397
+#, no-wrap
+msgid "802510"
+msgstr "802510"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5398
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/224214[224214]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/224214[224214]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5401
+#, no-wrap
+msgid "8.2-STABLE after addition of RFTSIGZMB flag for man:rfork[2]."
+msgstr "8.2-STABLE после добавления флага RFTSIGZMB для man:rfork[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5402
+#, no-wrap
+msgid "802511"
+msgstr "802511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5403
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/225458[225458]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/225458[225458]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5404
+#, no-wrap
+msgid "September 9, 2011"
+msgstr "9 сентября 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5406
+#, no-wrap
+msgid "8.2-STABLE after addition of automatic detection of USB mass storage devices which do not support the no synchronize cache SCSI command."
+msgstr "8.2-STABLE после добавления автоматического обнаружения USB-накопителей, которые не поддерживают команду SCSI \"no synchronize cache\"."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5407
+#, no-wrap
+msgid "802512"
+msgstr "802512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5408
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/225470[225470]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/225470[225470]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5411
+#, no-wrap
+msgid "8.2-STABLE after merging of re-factoring of auto-quirk."
+msgstr "8.2-STABLE после объединения рефакторинга auto-quirk."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5412
+#, no-wrap
+msgid "802513"
+msgstr "802513"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5413
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/226763[226763]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/226763[226763]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5414
+#, no-wrap
+msgid "October 25, 2011"
+msgstr "25 октября 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5416
+#, no-wrap
+msgid "8.2-STABLE after merging of the MAP_PREFAULT_READ flag to man:mmap[2]."
+msgstr "8.2-STABLE после объединения флага MAP_PREFAULT_READ в man:mmap[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5417
+#, no-wrap
+msgid "802514"
+msgstr "802514"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5418
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/227573[227573]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/227573[227573]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5419
+#, no-wrap
+msgid "November 16, 2011"
+msgstr "16 ноября 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5421
+#, no-wrap
+msgid "8.2-STABLE after merging of addition of man:posix_fallocate[2] syscall."
+msgstr "8.2-STABLE после объединения добавления системного вызова man:posix_fallocate[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5422
+#, no-wrap
+msgid "802515"
+msgstr "802515"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5423
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/229725[229725]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/229725[229725]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5426
+#, no-wrap
+msgid "8.2-STABLE after merging of addition of the man:posix_fadvise[2] system call."
+msgstr "8.2-STABLE после объединения добавления системного вызова man:posix_fadvise[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5427
+#, no-wrap
+msgid "802516"
+msgstr "802516"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5428
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/230239[230239]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/230239[230239]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5431
+#, no-wrap
+msgid "8.2-STABLE after merging gperf 3.0.3"
+msgstr "8.2-STABLE после объединения gperf 3.0.3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5432
+#, no-wrap
+msgid "802517"
+msgstr "802517"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5433
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/231769[231769]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/231769[231769]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5436
+#, no-wrap
+msgid "8.2-STABLE after introduction of the new extensible man:sysctl[3] interface NET_RT_IFLISTL to query address lists."
+msgstr "8.2-STABLE после введения нового расширяемого интерфейса man:sysctl[3] NET_RT_IFLISTL для запроса списков адресов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5437
+#, no-wrap
+msgid "803000"
+msgstr "803000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5438
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/232446[232446]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/232446[232446]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5441
+#, no-wrap
+msgid "8.3-RELEASE."
+msgstr "8.3-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5442
+#, no-wrap
+msgid "803500"
+msgstr "803500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5443
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/232439[232439]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/232439[232439]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5446
+#, no-wrap
+msgid "8.3-STABLE after branching releng/8.3 (RELENG_8_3)."
+msgstr "8.3-STABLE после ветвления releng/8.3 (RELENG_8_3)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5447
+#, no-wrap
+msgid "803501"
+msgstr "803501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5448
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/247091[247091]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/247091[247091]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5451
+#, no-wrap
+msgid "8.3-STABLE after MFC of two USB fixes (rev link:https://svnweb.freebsd.org/changeset/base/246616[246616] and link:https://svnweb.freebsd.org/changeset/base/246759[246759])."
+msgstr "8.3-STABLE после слияния двух исправлений для USB (ссылки на ревизии: link:https://svnweb.freebsd.org/changeset/base/246616[246616] и link:https://svnweb.freebsd.org/changeset/base/246759[246759])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5452
+#, no-wrap
+msgid "804000"
+msgstr "804000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5453
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/248850[248850]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/248850[248850]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5454
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5459
+#, no-wrap
+msgid "March 28, 2013"
+msgstr "28 марта 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5456
+#, no-wrap
+msgid "8.4-RELEASE."
+msgstr "8.4-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5457
+#, no-wrap
+msgid "804500"
+msgstr "804500"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5458
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/248819[248819]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/248819[248819]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5461
+#, no-wrap
+msgid "8.4-STABLE after 8.4-RELEASE."
+msgstr "8.4-STABLE после 8.4-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5462
+#, no-wrap
+msgid "804501"
+msgstr "804501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5463
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/259449[259449]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/259449[259449]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5464
+#, no-wrap
+msgid "December 16, 2013"
+msgstr "16 декабря 2013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5466
+#, no-wrap
+msgid "8.4-STABLE after MFC of upstream Heimdal encoding fix."
+msgstr "8.4-STABLE после MFC исправления кодировки из вышестоящего Heimdal."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5467
+#, no-wrap
+msgid "804502"
+msgstr "804502"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5471
+#, no-wrap
+msgid "8.4-STABLE after FreeBSD-SA-14:08.tcp."
+msgstr "8.4-STABLE после FreeBSD-SA-14:08.tcp."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5472
+#, no-wrap
+msgid "804503"
+msgstr "804503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5473
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/268444[268444]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/268444[268444]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5474
+#, no-wrap
+msgid "July 9, 2014"
+msgstr "9 июля 2014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5476
+#, no-wrap
+msgid "8.4-STABLE after FreeBSD-SA-14:17.kmem."
+msgstr "8.4-STABLE после FreeBSD-SA-14:17.kmem."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5477
+#, no-wrap
+msgid "804504"
+msgstr "804504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5481
+#, no-wrap
+msgid "8.4-STABLE after FreeBSD-SA-14:18 (rev link:https://svnweb.freebsd.org/changeset/base/271305[271305])."
+msgstr "8.4-STABLE после FreeBSD-SA-14:18 (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/271305[271305])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5482
+#, no-wrap
+msgid "804505"
+msgstr "804505"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5486
+#, no-wrap
+msgid "8.4-STABLE after FreeBSD-SA-14:19 (rev link:https://svnweb.freebsd.org/changeset/base/271668[271668])."
+msgstr "8.4-STABLE после FreeBSD-SA-14:19 (ревизия link:https://svnweb.freebsd.org/changeset/base/271668[271668])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5487
+#, no-wrap
+msgid "804506"
+msgstr "804506"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5491
+#, no-wrap
+msgid "8.4-STABLE after FreeBSD-SA-14:21 (rev link:https://svnweb.freebsd.org/changeset/base/273413[273413])."
+msgstr "8.4-STABLE после FreeBSD-SA-14:21 (ссылка на ревизию:https://svnweb.freebsd.org/changeset/base/273413[273413])."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5492
+#, no-wrap
+msgid "804507"
+msgstr "804507"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5496
+#, no-wrap
+msgid "8.4-STABLE after FreeBSD-SA-14:23, FreeBSD-SA-14:24, and FreeBSD-SA-14:25."
+msgstr "8.4-STABLE после FreeBSD-SA-14:23, FreeBSD-SA-14:24 и FreeBSD-SA-14:25."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5497
+#, no-wrap
+msgid "804508"
+msgstr "804508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5501
+#, no-wrap
+msgid "8-STABLE after FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp, and FreeBSD-SA-15:05.bind."
+msgstr "8-STABLE после FreeBSD-EN-15:01.vt, FreeBSD-EN-15:02.openssl, FreeBSD-EN-15:03.freebsd-update, FreeBSD-SA-15:04.igmp и FreeBSD-SA-15:05.bind."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5502
+#, no-wrap
+msgid "804509"
+msgstr "804509"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5503
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/305736[305736]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/305736[305736]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5505
+#, no-wrap
+msgid "8-STABLE after resolving a deadlock between `device_detach()` and man:usbd_do_request_flags[9]."
+msgstr "8-STABLE после устранения взаимоблокировки между `device_detach()` и man:usbd_do_request_flags[9]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5508
+#, no-wrap
+msgid "FreeBSD 7 Versions"
+msgstr "Версии FreeBSD 7"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5511
+#, no-wrap
+msgid "FreeBSD 7 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` для FreeBSD 7"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5520
+#, no-wrap
+msgid "700000"
+msgstr "700000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5521
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/147925[147925]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/147925[147925]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5522
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6150
+#, no-wrap
+msgid "July 11, 2005"
+msgstr "11 июля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5524
+#, no-wrap
+msgid "7.0-CURRENT."
+msgstr "7.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5525
+#, no-wrap
+msgid "700001"
+msgstr "700001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5526
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/148341[148341]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/148341[148341]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5527
+#, no-wrap
+msgid "July 23, 2005"
+msgstr "23 июля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5529
+#, no-wrap
+msgid "7.0-CURRENT after bump of all shared library versions that had not been changed since RELENG_5."
+msgstr "7.0-CURRENT после увеличения версий всех общих библиотек, которые не изменялись с RELENG_5."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5530
+#, no-wrap
+msgid "700002"
+msgstr "700002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5531
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/149039[149039]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/149039[149039]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5532
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6160
+#, no-wrap
+msgid "August 13, 2005"
+msgstr "13 августа 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5534
+#, no-wrap
+msgid "7.0-CURRENT after credential argument is added to `dev_clone` event handler."
+msgstr "7.0-CURRENT после добавления аргумента учетных данных в обработчик события `dev_clone`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5535
+#, no-wrap
+msgid "700003"
+msgstr "700003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5536
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/149470[149470]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/149470[149470]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5537
+#, no-wrap
+msgid "August 25, 2005"
+msgstr "25 августа 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5539
+#, no-wrap
+msgid "7.0-CURRENT after man:memmem[3] is added to libc."
+msgstr "7.0-CURRENT после добавления man:memmem[3] в libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5540
+#, no-wrap
+msgid "700004"
+msgstr "700004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5541
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/151888[151888]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/151888[151888]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5542
+#, no-wrap
+msgid "October 30, 2005"
+msgstr "30 октября 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5544
+#, no-wrap
+msgid "7.0-CURRENT after man:solisten[9] kernel arguments are modified to accept a backlog parameter."
+msgstr "7.0-CURRENT после изменения аргументов ядра man:solisten[9] для принятия параметра backlog."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5545
+#, no-wrap
+msgid "700005"
+msgstr "700005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5546
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/152296[152296]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/152296[152296]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5547
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5552
+#, no-wrap
+msgid "November 11, 2005"
+msgstr "11 ноября 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5549
+#, no-wrap
+msgid "7.0-CURRENT after `IFP2ENADDR()` was changed to return a pointer to `IF_LLADDR()`."
+msgstr "7.0-CURRENT после изменения `IFP2ENADDR()` для возврата указателя на `IF_LLADDR()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5550
+#, no-wrap
+msgid "700006"
+msgstr "700006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5551
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/152315[152315]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/152315[152315]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5554
+#, no-wrap
+msgid "7.0-CURRENT after addition of `if_addr` member to `struct ifnet` and `IFP2ENADDR()` removal."
+msgstr "7.0-CURRENT после добавления члена `if_addr` в `struct ifnet` и удаления `IFP2ENADDR()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5555
+#, no-wrap
+msgid "700007"
+msgstr "700007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5556
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/153027[153027]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/153027[153027]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5557
+#, no-wrap
+msgid "December 2, 2005"
+msgstr "2 декабря 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5559
+#, no-wrap
+msgid "7.0-CURRENT after incorporating scripts from the `local_startup` directories into the base man:rcorder[8]."
+msgstr "7.0-CURRENT после включения скриптов из каталогов `local_startup` в базовый man:rcorder[8]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5560
+#, no-wrap
+msgid "700008"
+msgstr "700008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5561
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/153107[153107]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/153107[153107]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5562
+#, no-wrap
+msgid "December 5, 2005"
+msgstr "5 декабря 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5564
+#, no-wrap
+msgid "7.0-CURRENT after removal of MNT_NODEV mount option."
+msgstr "7.0-CURRENT после удаления опции монтирования MNT_NODEV."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5565
+#, no-wrap
+msgid "700009"
+msgstr "700009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5566
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/153519[153519]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/153519[153519]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5567
+#, no-wrap
+msgid "December 19, 2005"
+msgstr "19 декабря 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5569
+#, no-wrap
+msgid "7.0-CURRENT after ELF-64 type changes and symbol versioning."
+msgstr "7.0-CURRENT после изменений типа ELF-64 и версионирования символов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5570
+#, no-wrap
+msgid "700010"
+msgstr "700010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5571
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/153579[153579]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/153579[153579]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5572
+#, no-wrap
+msgid "December 20, 2005"
+msgstr "20 декабря 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5574
+#, no-wrap
+msgid "7.0-CURRENT after addition of `hostb` and `vgapci` drivers, addition of `pci_find_extcap()`, and changing the AGP drivers to no longer map the aperture."
+msgstr "7.0-CURRENT после добавления драйверов `hostb` и `vgapci`, добавления `pci_find_extcap()` и изменения драйверов AGP, чтобы они больше не отображали апертуру."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5575
+#, no-wrap
+msgid "700011"
+msgstr "700011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5576
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/153936[153936]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/153936[153936]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5577
+#, no-wrap
+msgid "December 31, 2005"
+msgstr "31 декабря 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5579
+#, no-wrap
+msgid "7.0-CURRENT after `tv_sec` was made `time_t` on all platforms but Alpha."
+msgstr "7.0-CURRENT после того, как `tv_sec` был изменён на `time_t` на всех платформах, кроме Alpha."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5580
+#, no-wrap
+msgid "700012"
+msgstr "700012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5581
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/154114[154114]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/154114[154114]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5582
+#, no-wrap
+msgid "January 8, 2006"
+msgstr "8 января 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5584
+#, no-wrap
+msgid "7.0-CURRENT after ldconfig_local_dirs change."
+msgstr "7.0-CURRENT после изменения ldconfig_local_dirs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5585
+#, no-wrap
+msgid "700013"
+msgstr "700013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5586
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/154269[154269]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/154269[154269]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5587
+#, no-wrap
+msgid "January 12, 2006"
+msgstr "12 января 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5589
+#, no-wrap
+msgid "7.0-CURRENT after changes to [.filename]#/etc/rc.d/abi# to support [.filename]#/compat/linux/etc/ld.so.cache# being a symlink in a read-only filesystem."
+msgstr "7.0-CURRENT после изменений в [.filename]#/etc/rc.d/abi# для поддержки [.filename]#/compat/linux/etc/ld.so.cache# в виде символьной ссылки в файловой системе только для чтения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5590
+#, no-wrap
+msgid "700014"
+msgstr "700014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5591
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/154863[154863]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/154863[154863]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5592
+#, no-wrap
+msgid "January 26, 2006"
+msgstr "26 января 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5594
+#, no-wrap
+msgid "7.0-CURRENT after pts import."
+msgstr "7.0-CURRENT после импорта pts."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5595
+#, no-wrap
+msgid "700015"
+msgstr "700015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5596
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/157144[157144]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/157144[157144]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5597
+#, no-wrap
+msgid "March 26, 2006"
+msgstr "26 марта 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5599
+#, no-wrap
+msgid "7.0-CURRENT after the introduction of version 2 of man:hwpmc[4]'s ABI."
+msgstr "7.0-CURRENT после введения версии 2 ABI man:hwpmc[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5600
+#, no-wrap
+msgid "700016"
+msgstr "700016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5601
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/157962[157962]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/157962[157962]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5602
+#, no-wrap
+msgid "April 22, 2006"
+msgstr "22 апреля 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5604
+#, no-wrap
+msgid "7.0-CURRENT after addition of man:fcloseall[3] to libc."
+msgstr "7.0-CURRENT после добавления man:fcloseall[3] в libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5605
+#, no-wrap
+msgid "700017"
+msgstr "700017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5606
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/158513[158513]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/158513[158513]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5607
+#, no-wrap
+msgid "May 13, 2006"
+msgstr "13 мая 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5609
+#, no-wrap
+msgid "7.0-CURRENT after removal of ip6fw."
+msgstr "7.0-CURRENT после удаления ip6fw."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5610
+#, no-wrap
+msgid "700018"
+msgstr "700018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5611
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/160386[160386]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/160386[160386]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5612
+#, no-wrap
+msgid "July 15, 2006"
+msgstr "15 июля 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5614
+#, no-wrap
+msgid "7.0-CURRENT after import of snd_emu10kx."
+msgstr "7.0-CURRENT после импорта snd_emu10kx."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5615
+#, no-wrap
+msgid "700019"
+msgstr "700019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5616
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/160821[160821]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/160821[160821]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5617
+#, no-wrap
+msgid "July 29, 2006"
+msgstr "29 июля 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5619
+#, no-wrap
+msgid "7.0-CURRENT after import of OpenSSL 0.9.8b."
+msgstr "7.0-CURRENT после импорта OpenSSL 0.9.8b."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5620
+#, no-wrap
+msgid "700020"
+msgstr "700020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5621
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/161931[161931]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/161931[161931]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5622
+#, no-wrap
+msgid "September 3, 2006"
+msgstr "3 сентября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5624
+#, no-wrap
+msgid "7.0-CURRENT after addition of `bus_dma_get_tag` function"
+msgstr "7.0-CURRENT после добавления функции `bus_dma_get_tag`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5625
+#, no-wrap
+msgid "700021"
+msgstr "700021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5626
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/162023[162023]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/162023[162023]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5627
+#, no-wrap
+msgid "September 4, 2006"
+msgstr "4 сентября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5629
+#, no-wrap
+msgid "7.0-CURRENT after libpcap 0.9.4 and tcpdump 3.9.4 import."
+msgstr "7.0-CURRENT после импорта libpcap 0.9.4 и tcpdump 3.9.4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5630
+#, no-wrap
+msgid "700022"
+msgstr "700022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5631
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/162170[162170]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/162170[162170]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5632
+#, no-wrap
+msgid "September 9, 2006"
+msgstr "9 сентября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5634
+#, no-wrap
+msgid "7.0-CURRENT after `dlsym` change to look for a requested symbol both in specified DSO and its implicit dependencies."
+msgstr "7.0-CURRENT после изменения `dlsym`, чтобы искать запрошенный символ как в указанном DSO, так и в его неявных зависимостях."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5635
+#, no-wrap
+msgid "700023"
+msgstr "700023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5636
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/162588[162588]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/162588[162588]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5637
+#, no-wrap
+msgid "September 23, 2006"
+msgstr "23 сентября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5639
+#, no-wrap
+msgid "7.0-CURRENT after adding new sound IOCTLs for the OSSv4 mixer API."
+msgstr "7.0-CURRENT после добавления новых звуковых IOCTL для API микшера OSSv4."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5640
+#, no-wrap
+msgid "700024"
+msgstr "700024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5641
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/162919[162919]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/162919[162919]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5642
+#, no-wrap
+msgid "September 28, 2006"
+msgstr "28 сентября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5644
+#, no-wrap
+msgid "7.0-CURRENT after import of OpenSSL 0.9.8d."
+msgstr "7.0-CURRENT после импорта OpenSSL 0.9.8d."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5645
+#, no-wrap
+msgid "700025"
+msgstr "700025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5646
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/164190[164190]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/164190[164190]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5647
+#, no-wrap
+msgid "November 11, 2006"
+msgstr "11 ноября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5649
+#, no-wrap
+msgid "7.0-CURRENT after the addition of libelf."
+msgstr "7.0-CURRENT после добавления libelf."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5650
+#, no-wrap
+msgid "700026"
+msgstr "700026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5651
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/164614[164614]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/164614[164614]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5652
+#, no-wrap
+msgid "November 26, 2006"
+msgstr "26 ноября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5654
+#, no-wrap
+msgid "7.0-CURRENT after major changes on sound sysctls."
+msgstr "7.0-CURRENT после значительных изменений в звуковых sysctls."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5655
+#, no-wrap
+msgid "700027"
+msgstr "700027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5656
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/164770[164770]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/164770[164770]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5657
+#, no-wrap
+msgid "November 30, 2006"
+msgstr "30 ноября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5659
+#, no-wrap
+msgid "7.0-CURRENT after the addition of Wi-Spy quirk."
+msgstr "7.0-CURRENT после добавления особенности Wi-Spy."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5660
+#, no-wrap
+msgid "700028"
+msgstr "700028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5661
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/165242[165242]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/165242[165242]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5662
+#, no-wrap
+msgid "December 15, 2006"
+msgstr "15 декабря 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5664
+#, no-wrap
+msgid "7.0-CURRENT after the addition of `sctp` calls to libc"
+msgstr "7.0-CURRENT после добавления вызовов `sctp` в libc"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5665
+#, no-wrap
+msgid "700029"
+msgstr "700029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5666
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/166259[166259]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/166259[166259]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5667
+#, no-wrap
+msgid "January 26, 2007"
+msgstr "26 января 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5669
+#, no-wrap
+msgid "7.0-CURRENT after the GNU man:gzip[1] implementation was replaced with a BSD licensed version ported from NetBSD."
+msgstr "7.0-CURRENT после того, как реализация GNU man:gzip[1] была заменена на версию с лицензией BSD, портированную из NetBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5670
+#, no-wrap
+msgid "700030"
+msgstr "700030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5671
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/166549[166549]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/166549[166549]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5672
+#, no-wrap
+msgid "February 7, 2007"
+msgstr "7 февраля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5674
+#, no-wrap
+msgid "7.0-CURRENT after the removal of IPIP tunnel encapsulation (VIFF_TUNNEL) from the IPv4 multicast forwarding code."
+msgstr "7.0-CURRENT после удаления инкапсуляции туннеля IPIP (VIFF_TUNNEL) из кода переадресации IPv4 multicast."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5675
+#, no-wrap
+msgid "700031"
+msgstr "700031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5676
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/166907[166907]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/166907[166907]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5677
+#, no-wrap
+msgid "February 23, 2007"
+msgstr "23 февраля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5679
+#, no-wrap
+msgid "7.0-CURRENT after the modification of `bus_setup_intr()` (newbus)."
+msgstr "7.0-CURRENT после изменения `bus_setup_intr()` (newbus)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5680
+#, no-wrap
+msgid "700032"
+msgstr "700032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5681
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/167165[167165]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/167165[167165]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5682
+#, no-wrap
+msgid "March 2, 2007"
+msgstr "2 марта 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5684
+#, no-wrap
+msgid "7.0-CURRENT after the inclusion of man:ipw[4] and man:iwi[4] firmware."
+msgstr "7.0-CURRENT после включения firmware для man:ipw[4] и man:iwi[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5685
+#, no-wrap
+msgid "700033"
+msgstr "700033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5686
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/167360[167360]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/167360[167360]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5687
+#, no-wrap
+msgid "March 9, 2007"
+msgstr "9 марта 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5689
+#, no-wrap
+msgid "7.0-CURRENT after the inclusion of ncurses wide character support."
+msgstr "7.0-CURRENT после включения поддержки широких символов ncurses."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5690
+#, no-wrap
+msgid "700034"
+msgstr "700034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5691
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/167684[167684]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/167684[167684]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5692
+#, no-wrap
+msgid "March 19, 2007"
+msgstr "19 марта 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5694
+#, no-wrap
+msgid "7.0-CURRENT after changes to how `insmntque()`, `getnewvnode()`, and `vfs_hash_insert()` work."
+msgstr "7.0-CURRENT после изменений в работе `insmntque()`, `getnewvnode()` и `vfs_hash_insert()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5695
+#, no-wrap
+msgid "700035"
+msgstr "700035"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5696
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/167906[167906]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/167906[167906]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5697
+#, no-wrap
+msgid "March 26, 2007"
+msgstr "26 марта 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5699
+#, no-wrap
+msgid "7.0-CURRENT after addition of a notify mechanism for CPU frequency changes."
+msgstr "7.0-CURRENT после добавления механизма уведомлений об изменениях частоты CPU."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5700
+#, no-wrap
+msgid "700036"
+msgstr "700036"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5701
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/168413[168413]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/168413[168413]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5702
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6270
+#, no-wrap
+msgid "April 6, 2007"
+msgstr "6 апреля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5704
+#, no-wrap
+msgid "7.0-CURRENT after import of the ZFS filesystem."
+msgstr "7.0-CURRENT после импорта файловой системы ZFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5705
+#, no-wrap
+msgid "700037"
+msgstr "700037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5706
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/168504[168504]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/168504[168504]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5707
+#, no-wrap
+msgid "April 8, 2007"
+msgstr "8 апреля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5709
+#, no-wrap
+msgid "7.0-CURRENT after addition of CAM 'SG' peripheral device, which implements a subset of Linux SCSI SG passthrough device API."
+msgstr "7.0-CURRENT после добавления периферийного устройства CAM 'SG', реализующего подмножество API сквозного устройства SCSI SG в Linux."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5710
+#, no-wrap
+msgid "700038"
+msgstr "700038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5711
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/169151[169151]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/169151[169151]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5712
+#, no-wrap
+msgid "April 30, 2007"
+msgstr "30 апреля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5714
+#, no-wrap
+msgid "7.0-CURRENT after changing man:getenv[3], man:putenv[3], man:setenv[3] and man:unsetenv[3] to be POSIX conformant."
+msgstr "7.0-CURRENT после изменения man:getenv[3], man:putenv[3], man:setenv[3] и man:unsetenv[3] для соответствия стандарту POSIX."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5715
+#, no-wrap
+msgid "700039"
+msgstr "700039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5716
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/169190[169190]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/169190[169190]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5717
+#, no-wrap
+msgid "May 1, 2007"
+msgstr "1 мая 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5719
+#, no-wrap
+msgid "7.0-CURRENT after the changes in 700038 were backed out."
+msgstr "7.0-CURRENT после отмены изменений в 700038."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5720
+#, no-wrap
+msgid "700040"
+msgstr "700040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5721
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/169453[169453]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/169453[169453]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5722
+#, no-wrap
+msgid "May 10, 2007"
+msgstr "10 мая 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5724
+#, no-wrap
+msgid "7.0-CURRENT after the addition of man:flopen[3] to libutil."
+msgstr "7.0-CURRENT после добавления man:flopen[3] в libutil."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5725
+#, no-wrap
+msgid "700041"
+msgstr "700041"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5726
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/169526[169526]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/169526[169526]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5727
+#, no-wrap
+msgid "May 13, 2007"
+msgstr "13 мая 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5729
+#, no-wrap
+msgid "7.0-CURRENT after enabling symbol versioning, and changing the default thread library to libthr."
+msgstr "7.0-CURRENT после включения версионирования символов и изменения библиотеки потоков по умолчанию на libthr."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5730
+#, no-wrap
+msgid "700042"
+msgstr "700042"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5731
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/169758[169758]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/169758[169758]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5732
+#, no-wrap
+msgid "May 19, 2007"
+msgstr "19 мая 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5734
+#, no-wrap
+msgid "7.0-CURRENT after the import of gcc 4.2.0."
+msgstr "7.0-CURRENT после импорта gcc 4.2.0."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5735
+#, no-wrap
+msgid "700043"
+msgstr "700043"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5736
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/169830[169830]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/169830[169830]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5737
+#, no-wrap
+msgid "May 21, 2007"
+msgstr "21 мая 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5739
+#, no-wrap
+msgid "7.0-CURRENT after bump of all shared library versions that had not been changed since RELENG_6."
+msgstr "7.0-CURRENT после увеличения версий всех общих библиотек, которые не изменялись с RELENG_6."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5740
+#, no-wrap
+msgid "700044"
+msgstr "700044"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5741
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/170395[170395]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/170395[170395]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5742
+#, no-wrap
+msgid "June 7, 2007"
+msgstr "7 июня 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5744
+#, no-wrap
+msgid "7.0-CURRENT after changing the argument for `vn_open()`/`VOP_OPEN()` from file descriptor index to the struct file *."
+msgstr "7.0-CURRENT после изменения аргумента для `vn_open()`/`VOP_OPEN()` с индекса файлового дескриптора на указатель на структуру file *."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5745
+#, no-wrap
+msgid "700045"
+msgstr "700045"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5746
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/170510[170510]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/170510[170510]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5747
+#, no-wrap
+msgid "June 10, 2007"
+msgstr "10 июня 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5749
+#, no-wrap
+msgid "7.0-CURRENT after changing man:pam_nologin[8] to provide an account management function instead of an authentication function to the PAM framework."
+msgstr "7.0-CURRENT после изменения man:pam_nologin[8] для предоставления функции управления учетными записями вместо функции аутентификации в рамках PAM."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5750
+#, no-wrap
+msgid "700046"
+msgstr "700046"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5751
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/170530[170530]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/170530[170530]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5752
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5757
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6290
+#, no-wrap
+msgid "June 11, 2007"
+msgstr "11 июня 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5754
+#, no-wrap
+msgid "7.0-CURRENT after updated 802.11 wireless support."
+msgstr "7.0-CURRENT после обновления поддержки беспроводных сетей 802.11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5755
+#, no-wrap
+msgid "700047"
+msgstr "700047"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5756
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/170579[170579]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/170579[170579]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5759
+#, no-wrap
+msgid "7.0-CURRENT after adding TCP LRO interface capabilities."
+msgstr "7.0-CURRENT после добавления возможностей интерфейса TCP LRO."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5760
+#, no-wrap
+msgid "700048"
+msgstr "700048"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5761
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/170613[170613]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/170613[170613]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5762
+#, no-wrap
+msgid "June 12, 2007"
+msgstr "12 июня 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5764
+#, no-wrap
+msgid "7.0-CURRENT after RFC 3678 API support added to the IPv4 stack. Legacy RFC 1724 behavior of the IP_MULTICAST_IF ioctl has now been removed; 0.0.0.0/8 may no longer be used to specify an interface index. Use struct `ipmreqn` instead."
+msgstr "7.0-CURRENT после добавления поддержки API RFC 3678 в стек IPv4. Устаревшее поведение RFC 1724 для ioctl IP_MULTICAST_IF теперь удалено; 0.0.0.0/8 больше нельзя использовать для указания индекса интерфейса. Вместо этого используйте структуру `ipmreqn`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5765
+#, no-wrap
+msgid "700049"
+msgstr "700049"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5766
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/171175[171175]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/171175[171175]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5767
+#, no-wrap
+msgid "July 3, 2007"
+msgstr "3 июля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5769
+#, no-wrap
+msgid "7.0-CURRENT after importing pf from OpenBSD 4.1"
+msgstr "7.0-CURRENT после импорта pf из OpenBSD 4.1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5771
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/171167[171167]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/171167[171167]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5774
+#, no-wrap
+msgid "7.0-CURRENT after adding IPv6 support for FAST_IPSEC, deleting KAME IPSEC, and renaming FAST_IPSEC to IPSEC."
+msgstr "7.0-CURRENT после добавления поддержки IPv6 для FAST_IPSEC, удаления KAME IPSEC и переименования FAST_IPSEC в IPSEC."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5775
+#, no-wrap
+msgid "700050"
+msgstr "700050"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5776
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/171195[171195]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/171195[171195]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5777
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5782
+#, no-wrap
+msgid "July 4, 2007"
+msgstr "4 июля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5779
+#, no-wrap
+msgid "7.0-CURRENT after converting setenv/putenv/etc. calls from traditional BSD to POSIX."
+msgstr "7.0-CURRENT после преобразования вызовов setenv/putenv/etc. из традиционного BSD в POSIX."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5780
+#, no-wrap
+msgid "700051"
+msgstr "700051"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5781
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/171211[171211]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/171211[171211]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5784
+#, no-wrap
+msgid "7.0-CURRENT after adding new mmap/lseek/etc syscalls."
+msgstr "7.0-CURRENT после добавления новых системных вызовов mmap/lseek и др."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5785
+#, no-wrap
+msgid "700052"
+msgstr "700052"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5786
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/171275[171275]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/171275[171275]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5787
+#, no-wrap
+msgid "July 6, 2007"
+msgstr "6 июля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5789
+#, no-wrap
+msgid "7.0-CURRENT after moving I4B headers to include/i4b."
+msgstr "7.0-CURRENT после перемещения заголовков I4B в include/i4b."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5790
+#, no-wrap
+msgid "700053"
+msgstr "700053"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5791
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/172394[172394]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/172394[172394]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5792
+#, no-wrap
+msgid "September 30, 2007"
+msgstr "30 сентября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5794
+#, no-wrap
+msgid "7.0-CURRENT after the addition of support for PCI domains"
+msgstr "7.0-CURRENT после добавления поддержки доменов PCI"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5795
+#, no-wrap
+msgid "700054"
+msgstr "700054"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5796
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/172988[172988]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/172988[172988]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5797
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6300
+#, no-wrap
+msgid "October 25, 2007"
+msgstr "25 октября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5799
+#, no-wrap
+msgid "7.0-STABLE after MFC of wide and single byte ctype separation."
+msgstr "7.0-STABLE после переноса изменений (MFC) разделения широких и однобайтовых ctype."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5800
+#, no-wrap
+msgid "700055"
+msgstr "700055"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5801
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/173104[173104]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/173104[173104]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5802
+#, no-wrap
+msgid "October 28, 2007"
+msgstr "28 октября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5804
+#, no-wrap
+msgid "7.0-RELEASE, and 7.0-CURRENT after ABI backwards compatibility to the FreeBSD 4/5/6 versions of the PCIOCGETCONF, PCIOCREAD and PCIOCWRITE IOCTLs was MFCed, which required the ABI of the PCIOCGETCONF IOCTL to be broken again"
+msgstr "7.0-RELEASE и 7.0-CURRENT после того, как обратная совместимость ABI с версиями FreeBSD 4/5/6 для IOCTL PCIOCGETCONF, PCIOCREAD и PCIOCWRITE была перенесена в стабильную ветку (MFC), что потребовало снова нарушить ABI IOCTL PCIOCGETCONF"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5805
+#, no-wrap
+msgid "700100"
+msgstr "700100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5806
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/174864[174864]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/174864[174864]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5807
+#, no-wrap
+msgid "December 22, 2007"
+msgstr "22 декабря 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5809
+#, no-wrap
+msgid "7.0-STABLE after 7.0-RELEASE"
+msgstr "7.0-STABLE после 7.0-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5810
+#, no-wrap
+msgid "700101"
+msgstr "700101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5811
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/176111[176111]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/176111[176111]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5814
+#, no-wrap
+msgid "7.0-STABLE after the MFC of `m_collapse()`."
+msgstr "7.0-STABLE после MFC `m_collapse()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5815
+#, no-wrap
+msgid "700102"
+msgstr "700102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5816
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/177735[177735]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/177735[177735]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5817
+#, no-wrap
+msgid "March 30, 2008"
+msgstr "30 марта 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5819
+#, no-wrap
+msgid "7.0-STABLE after the MFC of `kdb_enter_why()`."
+msgstr "7.0-STABLE после MFC `kdb_enter_why()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5820
+#, no-wrap
+msgid "700103"
+msgstr "700103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5821
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178061[178061]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178061[178061]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5824
+#, no-wrap
+msgid "7.0-STABLE after adding `l_sysid` to struct flock."
+msgstr "7.0-STABLE после добавления `l_sysid` в структуру flock."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5825
+#, no-wrap
+msgid "700104"
+msgstr "700104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5826
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178108[178108]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178108[178108]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5827
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5832
+#, no-wrap
+msgid "April 11, 2008"
+msgstr "11 апреля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5829
+#, no-wrap
+msgid "7.0-STABLE after the MFC of man:procstat[1]."
+msgstr "7.0-STABLE после MFC man:procstat[1]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5830
+#, no-wrap
+msgid "700105"
+msgstr "700105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5831
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178120[178120]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178120[178120]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5834
+#, no-wrap
+msgid "7.0-STABLE after the MFC of `umtx` features."
+msgstr "7.0-STABLE после MFC функций `umtx`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5835
+#, no-wrap
+msgid "700106"
+msgstr "700106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5836
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178225[178225]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178225[178225]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5837
+#, no-wrap
+msgid "April 15, 2008"
+msgstr "15 апреля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5839
+#, no-wrap
+msgid "7.0-STABLE after the MFC of man:write[2] support to man:psm[4]."
+msgstr "7.0-STABLE после MFC поддержки man:write[2] в man:psm[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5840
+#, no-wrap
+msgid "700107"
+msgstr "700107"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5841
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178353[178353]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178353[178353]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5844
+#, no-wrap
+msgid "7.0-STABLE after the MFC of F_DUP2FD command to man:fcntl[2]."
+msgstr "7.0-STABLE после MFC команды F_DUP2FD в man:fcntl[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5845
+#, no-wrap
+msgid "700108"
+msgstr "700108"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5846
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178783[178783]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178783[178783]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5847
+#, no-wrap
+msgid "May 5, 2008"
+msgstr "5 мая 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5849
+#, no-wrap
+msgid "7.0-STABLE after some man:lockmgr[9] changes, which makes it necessary to include [.filename]#sys/lock.h# to use man:lockmgr[9]."
+msgstr "7.0-STABLE после некоторых изменений в man:lockmgr[9], что делает необходимым включение [.filename]#sys/lock.h# для использования man:lockmgr[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5850
+#, no-wrap
+msgid "700109"
+msgstr "700109"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5851
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6334
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/179367[179367]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/179367[179367]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5852
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6335
+#, no-wrap
+msgid "May 27, 2008"
+msgstr "27 мая 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5854
+#, no-wrap
+msgid "7.0-STABLE after MFC of the man:memrchr[3] function."
+msgstr "7.0-STABLE после MFC функции man:memrchr[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5855
+#, no-wrap
+msgid "700110"
+msgstr "700110"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5856
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/181328[181328]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/181328[181328]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5857
+#, no-wrap
+msgid "August 5, 2008"
+msgstr "5 августа 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5859
+#, no-wrap
+msgid "7.0-STABLE after MFC of kernel NFS `lockd` client."
+msgstr "7.0-STABLE после MFC клиента `lockd` ядра NFS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5860
+#, no-wrap
+msgid "700111"
+msgstr "700111"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5861
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/181940[181940]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/181940[181940]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5864
+#, no-wrap
+msgid "7.0-STABLE after addition of physically contiguous jumbo frame support."
+msgstr "7.0-STABLE после добавления поддержки физически непрерывных больших кадров (jumbo frame)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5865
+#, no-wrap
+msgid "700112"
+msgstr "700112"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5866
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/182294[182294]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/182294[182294]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5867
+#, no-wrap
+msgid "August 27, 2008"
+msgstr "27 августа 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5869
+#, no-wrap
+msgid "7.0-STABLE after MFC of kernel DTrace support."
+msgstr "7.0-STABLE после переноса изменений (MFC) поддержки DTrace в ядре."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5870
+#, no-wrap
+msgid "701000"
+msgstr "701000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5871
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/185315[185315]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/185315[185315]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5872
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5877
+#, no-wrap
+msgid "November 25, 2008"
+msgstr "25 ноября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5874
+#, no-wrap
+msgid "7.1-RELEASE"
+msgstr "7.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5875
+#, no-wrap
+msgid "701100"
+msgstr "701100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5876
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/185302[185302]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/185302[185302]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5879
+#, no-wrap
+msgid "7.1-STABLE after 7.1-RELEASE."
+msgstr "7.1-STABLE после 7.1-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5880
+#, no-wrap
+msgid "701101"
+msgstr "701101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5881
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/187023[187023]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/187023[187023]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5882
+#, no-wrap
+msgid "January 10, 2009"
+msgstr "10 января 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5884
+#, no-wrap
+msgid "7.1-STABLE after man:strndup[3] merge."
+msgstr "7.1-STABLE после слияния man:strndup[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5885
+#, no-wrap
+msgid "701102"
+msgstr "701102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5886
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/187370[187370]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/187370[187370]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5887
+#, no-wrap
+msgid "January 17, 2009"
+msgstr "17 января 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5889
+#, no-wrap
+msgid "7.1-STABLE after man:cpuctl[4] support added."
+msgstr "7.1-STABLE после добавления поддержки man:cpuctl[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5890
+#, no-wrap
+msgid "701103"
+msgstr "701103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5891
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/188281[188281]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/188281[188281]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5892
+#, no-wrap
+msgid "February 7, 2009"
+msgstr "7 февраля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5894
+#, no-wrap
+msgid "7.1-STABLE after the merge of multi-/no-IPv4/v6 jails."
+msgstr "7.1-STABLE после объединения клеток с поддержкой multi-/no-IPv4/v6."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5895
+#, no-wrap
+msgid "701104"
+msgstr "701104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5896
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/188625[188625]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/188625[188625]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5897
+#, no-wrap
+msgid "February 14, 2009"
+msgstr "14 февраля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5899
+#, no-wrap
+msgid "7.1-STABLE after the store of the suspension owner in the struct mount, and introduction of vfs_susp_clean method into the struct vfsops."
+msgstr "7.1-STABLE после сохранения владельца приостановки в структуре mount и добавления метода vfs_susp_clean в структуру vfsops."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5900
+#, no-wrap
+msgid "701105"
+msgstr "701105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5901
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189740[189740]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189740[189740]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5902
+#, no-wrap
+msgid "March 12, 2009"
+msgstr "12 марта 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5904
+#, no-wrap
+msgid "7.1-STABLE after the incompatible change to the kern.ipc.shmsegs sysctl to allow allocating larger SysV shared memory segments on 64bit architectures."
+msgstr "7.1-STABLE после несовместимого изменения sysctl kern.ipc.shmsegs для выделения больших сегментов разделяемой памяти SysV на 64-битных архитектурах."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5905
+#, no-wrap
+msgid "701106"
+msgstr "701106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5906
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/189786[189786]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/189786[189786]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5909
+#, no-wrap
+msgid "7.1-STABLE after the merge of a fix for POSIX semaphore wait operations."
+msgstr "7.1-STABLE после объединения исправления для операций ожидания семафоров POSIX."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5910
+#, no-wrap
+msgid "702000"
+msgstr "702000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5911
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191099[191099]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191099[191099]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5914
+#, no-wrap
+msgid "7.2-RELEASE"
+msgstr "7.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5915
+#, no-wrap
+msgid "702100"
+msgstr "702100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5916
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/191091[191091]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/191091[191091]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5919
+#, no-wrap
+msgid "7.2-STABLE after 7.2-RELEASE."
+msgstr "7.2-STABLE после 7.2-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5920
+#, no-wrap
+msgid "702101"
+msgstr "702101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5921
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/192149[192149]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/192149[192149]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5922
+#, no-wrap
+msgid "May 15, 2009"
+msgstr "15 мая 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5924
+#, no-wrap
+msgid "7.2-STABLE after man:ichsmb[4] was changed to use left-adjusted secondary addressing to match other SMBus controller drivers."
+msgstr "7.2-STABLE после изменения man:ichsmb[4] для использования выравнивания по левому краю вторичной адресации, чтобы соответствовать другим драйверам контроллеров SMBus."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5925
+#, no-wrap
+msgid "702102"
+msgstr "702102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5926
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/193020[193020]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/193020[193020]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5927
+#, no-wrap
+msgid "May 28, 2009"
+msgstr "28 мая 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5929
+#, no-wrap
+msgid "7.2-STABLE after MFC of the man:fdopendir[3] function."
+msgstr "7.2-STABLE после слияния из ветки man функции fdopendir[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5930
+#, no-wrap
+msgid "702103"
+msgstr "702103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5931
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/193638[193638]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/193638[193638]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5932
+#, no-wrap
+msgid "June 6, 2009"
+msgstr "6 июня 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5934
+#, no-wrap
+msgid "7.2-STABLE after MFC of PmcTools."
+msgstr "7.2-STABLE после MFC PmcTools."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5935
+#, no-wrap
+msgid "702104"
+msgstr "702104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5936
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/195694[195694]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/195694[195694]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5939
+#, no-wrap
+msgid "7.2-STABLE after MFC of the man:closefrom[2] system call."
+msgstr "7.2-STABLE после MFC системного вызова man:closefrom[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5940
+#, no-wrap
+msgid "702105"
+msgstr "702105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5941
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/196006[196006]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/196006[196006]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5942
+#, no-wrap
+msgid "July 31, 2009"
+msgstr "31 июля 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5944
+#, no-wrap
+msgid "7.2-STABLE after MFC of the SYSVIPC ABI change."
+msgstr "7.2-STABLE после слияния изменения ABI SYSVIPC."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5945
+#, no-wrap
+msgid "702106"
+msgstr "702106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5946
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/197198[197198]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/197198[197198]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5947
+#, no-wrap
+msgid "September 14, 2009"
+msgstr "14 сентября 2009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5949
+#, no-wrap
+msgid "7.2-STABLE after MFC of the x86 PAT enhancements and addition of `d_mmap_single()` and the scatter/gather list VM object type."
+msgstr "7.2-STABLE после слияния изменений (MFC) улучшений PAT для x86 и добавления `d_mmap_single()` и типа объекта VM со списком scatter/gather."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5950
+#, no-wrap
+msgid "703000"
+msgstr "703000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5951
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/203740[203740]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/203740[203740]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5952
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5957
+#, no-wrap
+msgid "February 9, 2010"
+msgstr "9 февраля 2010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5954
+#, no-wrap
+msgid "7.3-RELEASE"
+msgstr "7.3-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5955
+#, no-wrap
+msgid "703100"
+msgstr "703100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5956
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/203742[203742]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/203742[203742]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5959
+#, no-wrap
+msgid "7.3-STABLE after 7.3-RELEASE."
+msgstr "7.3-STABLE после 7.3-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5960
+#, no-wrap
+msgid "704000"
+msgstr "704000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5961
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/216647[216647]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/216647[216647]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5964
+#, no-wrap
+msgid "7.4-RELEASE"
+msgstr "7.4-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5965
+#, no-wrap
+msgid "704100"
+msgstr "704100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5966
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/216658[216658]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/216658[216658]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5969
+#, no-wrap
+msgid "7.4-STABLE after 7.4-RELEASE."
+msgstr "7.4-STABLE после 7.4-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5970
+#, no-wrap
+msgid "704101"
+msgstr "704101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5971
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/221318[221318]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/221318[221318]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5972
+#, no-wrap
+msgid "May 2, 2011"
+msgstr "2 мая 2011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5973
+#, no-wrap
+msgid "7.4-STABLE after the gcc MFC in rev link:https://svnweb.freebsd.org/changeset/base/221317[221317]."
+msgstr "7.4-STABLE после MFC gcc в ревизии link:https://svnweb.freebsd.org/changeset/base/221317[221317]."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5976
+#, no-wrap
+msgid "FreeBSD 6 Versions"
+msgstr "Версии FreeBSD 6"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5979
+#, no-wrap
+msgid "FreeBSD 6 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` в FreeBSD 6"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5988
+#, no-wrap
+msgid "600000"
+msgstr "600000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5989
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/133921[133921]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/133921[133921]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5990
+#, no-wrap
+msgid "August 18, 2004"
+msgstr "18 августа 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5992
+#, no-wrap
+msgid "6.0-CURRENT"
+msgstr "6.0-CURRENT"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5993
+#, no-wrap
+msgid "600001"
+msgstr "600001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5994
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/134396[134396]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/134396[134396]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5995
+#, no-wrap
+msgid "August 27, 2004"
+msgstr "27 августа 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5997
+#, no-wrap
+msgid "6.0-CURRENT after permanently enabling PFIL_HOOKS in the kernel."
+msgstr "6.0-CURRENT после постоянного включения PFIL_HOOKS в ядре."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5998
+#, no-wrap
+msgid "600002"
+msgstr "600002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:5999
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/134514[134514]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/134514[134514]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6000
+#, no-wrap
+msgid "August 30, 2004"
+msgstr "30 августа 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6002
+#, no-wrap
+msgid "6.0-CURRENT after initial addition of `ifi_epoch` to struct `if_data`. Backed out after a few days. Do not use this value."
+msgstr "6.0-CURRENT после первоначального добавления `ifi_epoch` в структуру `if_data`. Отменено через несколько дней. Не используйте это значение."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6003
+#, no-wrap
+msgid "600003"
+msgstr "600003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6004
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/134933[134933]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/134933[134933]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6005
+#, no-wrap
+msgid "September 8, 2004"
+msgstr "8 сентября 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6007
+#, no-wrap
+msgid "6.0-CURRENT after the re-addition of the `ifi_epoch` member of struct `if_data`."
+msgstr "6.0-CURRENT после повторного добавления члена `ifi_epoch` в структуру `if_data`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6008
+#, no-wrap
+msgid "600004"
+msgstr "600004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6009
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/135920[135920]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/135920[135920]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6010
+#, no-wrap
+msgid "September 29, 2004"
+msgstr "29 сентября 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6012
+#, no-wrap
+msgid "6.0-CURRENT after addition of the struct inpcb argument to the pfil API."
+msgstr "6.0-CURRENT после добавления аргумента struct inpcb в API pfil."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6013
+#, no-wrap
+msgid "600005"
+msgstr "600005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6014
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/136172[136172]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/136172[136172]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6015
+#, no-wrap
+msgid "October 5, 2004"
+msgstr "5 октября 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6017
+#, no-wrap
+msgid "6.0-CURRENT after addition of the \"-d DESTDIR\" argument to newsyslog."
+msgstr "6.0-CURRENT после добавления аргумента \"-d DESTDIR\" в newsyslog."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6018
+#, no-wrap
+msgid "600006"
+msgstr "600006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6019
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/137192[137192]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/137192[137192]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6020
+#, no-wrap
+msgid "November 4, 2004"
+msgstr "4 ноября 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6022
+#, no-wrap
+msgid "6.0-CURRENT after addition of glibc style man:strftime[3] padding options."
+msgstr "6.0-CURRENT после добавления опций заполнения в стиле glibc для man:strftime[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6023
+#, no-wrap
+msgid "600007"
+msgstr "600007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6024
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/138760[138760]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/138760[138760]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6025
+#, no-wrap
+msgid "December 12, 2004"
+msgstr "12 декабря 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6027
+#, no-wrap
+msgid "6.0-CURRENT after addition of 802.11 framework updates."
+msgstr "6.0-CURRENT после добавления обновлений для фреймворка 802.11."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6028
+#, no-wrap
+msgid "600008"
+msgstr "600008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6029
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/140809[140809]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/140809[140809]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6030
+#, no-wrap
+msgid "January 25, 2005"
+msgstr "25 января 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6032
+#, no-wrap
+msgid "6.0-CURRENT after changes to `VOP_*VOBJECT()` functions and introduction of `MNTK_MPSAFE` flag for Giant-free filesystems."
+msgstr "6.0-CURRENT после изменений в функциях `VOP_*VOBJECT()` и введения флага `MNTK_MPSAFE` для файловых систем, работающих без Giant."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6033
+#, no-wrap
+msgid "600009"
+msgstr "600009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6034
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/141250[141250]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/141250[141250]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6035
+#, no-wrap
+msgid "February 4, 2005"
+msgstr "4 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6037
+#, no-wrap
+msgid "6.0-CURRENT after addition of the cpufreq framework and drivers."
+msgstr "6.0-CURRENT после добавления фреймворка cpufreq и драйверов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6038
+#, no-wrap
+msgid "600010"
+msgstr "600010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6039
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/141394[141394]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/141394[141394]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6040
+#, no-wrap
+msgid "February 6, 2005"
+msgstr "6 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6042
+#, no-wrap
+msgid "6.0-CURRENT after importing OpenBSD's man:nc[1]."
+msgstr "6.0-CURRENT после импорта man:nc[1] из OpenBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6043
+#, no-wrap
+msgid "600011"
+msgstr "600011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6044
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/141727[141727]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/141727[141727]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6045
+#, no-wrap
+msgid "February 12, 2005"
+msgstr "12 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6047
+#, no-wrap
+msgid "6.0-CURRENT after removing semblance of SVID2 `matherr()` support."
+msgstr "6.0-CURRENT после удаления подобия поддержки `matherr()` из SVID2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6048
+#, no-wrap
+msgid "600012"
+msgstr "600012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6049
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/141940[141940]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/141940[141940]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6050
+#, no-wrap
+msgid "February 15, 2005"
+msgstr "15 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6052
+#, no-wrap
+msgid "6.0-CURRENT after increase of default thread stacks' size."
+msgstr "6.0-CURRENT после увеличения размера стеков потоков по умолчанию."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6053
+#, no-wrap
+msgid "600013"
+msgstr "600013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6054
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/142089[142089]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/142089[142089]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6055
+#, no-wrap
+msgid "February 19, 2005"
+msgstr "19 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6057
+#, no-wrap
+msgid "6.0-CURRENT after fixes in [.filename]#<src/include/stdbool.h># and [.filename]#<src/sys/i386/include/_types.h># for using the GCC-compatibility of the Intel C/C++ compiler."
+msgstr "6.0-CURRENT после исправлений в [.filename]#<src/include/stdbool.h># и [.filename]#<src/sys/i386/include/_types.h># для обеспечения совместимости с GCC компилятора Intel C/C++."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6058
+#, no-wrap
+msgid "600014"
+msgstr "600014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6059
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/142184[142184]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/142184[142184]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6060
+#, no-wrap
+msgid "February 21, 2005"
+msgstr "21 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6062
+#, no-wrap
+msgid "6.0-CURRENT after EOVERFLOW checks in man:vswprintf[3] fixed."
+msgstr "6.0-CURRENT после исправления проверок EOVERFLOW в man:vswprintf[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6063
+#, no-wrap
+msgid "600015"
+msgstr "600015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6064
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/142501[142501]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/142501[142501]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6065
+#, no-wrap
+msgid "February 25, 2005"
+msgstr "25 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6067
+#, no-wrap
+msgid "6.0-CURRENT after changing the struct `if_data` member, `ifi_epoch`, from wall clock time to uptime."
+msgstr "6.0-CURRENT после изменения члена структуры `if_data`, `ifi_epoch`, с времени настенных часов на время работы системы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6068
+#, no-wrap
+msgid "600016"
+msgstr "600016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6069
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/142582[142582]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/142582[142582]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6070
+#, no-wrap
+msgid "February 26, 2005"
+msgstr "26 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6072
+#, no-wrap
+msgid "6.0-CURRENT after LC_CTYPE disk format changed."
+msgstr "6.0-CURRENT после изменения формата диска LC_CTYPE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6073
+#, no-wrap
+msgid "600017"
+msgstr "600017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6074
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/142683[142683]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/142683[142683]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6075
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6080
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6923
+#, no-wrap
+msgid "February 27, 2005"
+msgstr "27 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6077
+#, no-wrap
+msgid "6.0-CURRENT after NLS catalogs disk format changed."
+msgstr "6.0-CURRENT после изменения формата диска каталогов NLS."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6078
+#, no-wrap
+msgid "600018"
+msgstr "600018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6079
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/142686[142686]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/142686[142686]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6082
+#, no-wrap
+msgid "6.0-CURRENT after LC_COLLATE disk format changed."
+msgstr "6.0-CURRENT после изменения формата диска LC_COLLATE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6083
+#, no-wrap
+msgid "600019"
+msgstr "600019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6084
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/142752[142752]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/142752[142752]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6085
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6928
+#, no-wrap
+msgid "February 28, 2005"
+msgstr "28 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6087
+#, no-wrap
+msgid "Installation of `acpica` includes into /usr/include."
+msgstr "Установка `acpica` включает файлы в /usr/include."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6088
+#, no-wrap
+msgid "600020"
+msgstr "600020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6089
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/143308[143308]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/143308[143308]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6090
+#, no-wrap
+msgid "March 9, 2005"
+msgstr "9 марта 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6092
+#, no-wrap
+msgid "Addition of MSG_NOSIGNAL flag to man:send[2] API."
+msgstr "Добавление флага MSG_NOSIGNAL в API man:send[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6093
+#, no-wrap
+msgid "600021"
+msgstr "600021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6094
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/143746[143746]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/143746[143746]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6095
+#, no-wrap
+msgid "March 17, 2005"
+msgstr "17 марта 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6097
+#, no-wrap
+msgid "Addition of fields to cdevsw"
+msgstr "Добавление полей в cdevsw"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6098
+#, no-wrap
+msgid "600022"
+msgstr "600022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6099
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/143901[143901]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/143901[143901]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6100
+#, no-wrap
+msgid "March 21, 2005"
+msgstr "21 марта 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6102
+#, no-wrap
+msgid "Removed gtar from base system."
+msgstr "Удален gtar из базовой системы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6103
+#, no-wrap
+msgid "600023"
+msgstr "600023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6104
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/144980[144980]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/144980[144980]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6105
+#, no-wrap
+msgid "April 13, 2005"
+msgstr "13 апреля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6107
+#, no-wrap
+msgid "LOCAL_CREDS, LOCAL_CONNWAIT socket options added to man:unix[4]."
+msgstr "Добавлены параметры сокета LOCAL_CREDS, LOCAL_CONNWAIT в man:unix[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6108
+#, no-wrap
+msgid "600024"
+msgstr "600024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6109
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6114
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/145565[145565]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/145565[145565]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6110
+#, no-wrap
+msgid "April 19, 2005"
+msgstr "19 апреля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6112
+#, no-wrap
+msgid "man:hwpmc[4] and related tools added to 6.0-CURRENT."
+msgstr "man:hwpmc[4] и связанные инструменты добавлены в 6.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6113
+#, no-wrap
+msgid "600025"
+msgstr "600025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6115
+#, no-wrap
+msgid "April 26, 2005"
+msgstr "26 апреля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6117
+#, no-wrap
+msgid "struct `icmphdr` added to 6.0-CURRENT."
+msgstr "Структура `icmphdr` добавлена в 6.0-CURRENT."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6118
+#, no-wrap
+msgid "600026"
+msgstr "600026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6119
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/145843[145843]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/145843[145843]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6120
+#, no-wrap
+msgid "May 3, 2005"
+msgstr "3 мая 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6122
+#, no-wrap
+msgid "pf updated to 3.7."
+msgstr "pf обновлен до версии 3.7."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6123
+#, no-wrap
+msgid "600027"
+msgstr "600027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6124
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/145966[145966]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/145966[145966]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6125
+#, no-wrap
+msgid "May 6, 2005"
+msgstr "6 мая 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6127
+#, no-wrap
+msgid "Kernel libalias and `ng_nat` introduced."
+msgstr "Добавлены libalias в ядре и `ng_nat`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6128
+#, no-wrap
+msgid "600028"
+msgstr "600028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6129
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/146191[146191]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/146191[146191]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6130
+#, no-wrap
+msgid "May 13, 2005"
+msgstr "13 мая 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6132
+#, no-wrap
+msgid "POSIX man:ttyname_r[3] made available through unistd.h and libc."
+msgstr "POSIX man:ttyname_r[3], доступный через unistd.h и libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6133
+#, no-wrap
+msgid "600029"
+msgstr "600029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6134
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/146780[146780]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/146780[146780]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6135
+#, no-wrap
+msgid "May 29, 2005"
+msgstr "29 мая 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6137
+#, no-wrap
+msgid "6.0-CURRENT after libpcap updated to v0.9.1 alpha 096."
+msgstr "6.0-CURRENT после обновления libpcap до v0.9.1 alpha 096."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6138
+#, no-wrap
+msgid "600030"
+msgstr "600030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6139
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/146988[146988]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/146988[146988]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6140
+#, no-wrap
+msgid "June 5, 2005"
+msgstr "5 июня 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6142
+#, no-wrap
+msgid "6.0-CURRENT after importing NetBSD's man:if_bridge[4]."
+msgstr "6.0-CURRENT после импорта man:if_bridge[4] из NetBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6143
+#, no-wrap
+msgid "600031"
+msgstr "600031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6144
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/147256[147256]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/147256[147256]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6145
+#, no-wrap
+msgid "June 10, 2005"
+msgstr "10 июня 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6147
+#, no-wrap
+msgid "6.0-CURRENT after struct ifnet was broken out of the driver `softcs`."
+msgstr "6.0-CURRENT после того, как структура ifnet была вынесена из `softcs` драйвера."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6148
+#, no-wrap
+msgid "600032"
+msgstr "600032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6149
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/147898[147898]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/147898[147898]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6152
+#, no-wrap
+msgid "6.0-CURRENT after the import of libpcap v0.9.1."
+msgstr "6.0-CURRENT после импорта libpcap v0.9.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6153
+#, no-wrap
+msgid "600033"
+msgstr "600033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6154
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/148388[148388]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/148388[148388]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6155
+#, no-wrap
+msgid "July 25, 2005"
+msgstr "25 июля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6157
+#, no-wrap
+msgid "6.0-STABLE after bump of all shared library versions that had not been changed since RELENG_5."
+msgstr "6.0-STABLE после увеличения версий всех общих библиотек, которые не изменялись с RELENG_5."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6158
+#, no-wrap
+msgid "600034"
+msgstr "600034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6159
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/149040[149040]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/149040[149040]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6162
+#, no-wrap
+msgid "6.0-STABLE after credential argument is added to `dev_clone` event handler. 6.0-RELEASE."
+msgstr "6.0-STABLE после добавления аргумента credential в обработчик события `dev_clone`. 6.0-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6163
+#, no-wrap
+msgid "600100"
+msgstr "600100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6164
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/151958[151958]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/151958[151958]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6165
+#, no-wrap
+msgid "November 1, 2005"
+msgstr "1 ноября 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6167
+#, no-wrap
+msgid "6.0-STABLE after 6.0-RELEASE"
+msgstr "6.0-STABLE после 6.0-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6168
+#, no-wrap
+msgid "600101"
+msgstr "600101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6169
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/153601[153601]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/153601[153601]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6170
+#, no-wrap
+msgid "December 21, 2005"
+msgstr "21 декабря 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6172
+#, no-wrap
+msgid "6.0-STABLE after incorporating scripts from the `local_startup` directories into the base man:rcorder[8]."
+msgstr "6.0-STABLE после включения скриптов из каталогов `local_startup` в базовый man:rcorder[8]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6173
+#, no-wrap
+msgid "600102"
+msgstr "600102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6174
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/153912[153912]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/153912[153912]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6175
+#, no-wrap
+msgid "December 30, 2005"
+msgstr "30 декабря 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6177
+#, no-wrap
+msgid "6.0-STABLE after updating the ELF types and constants."
+msgstr "6.0-STABLE после обновления типов и констант ELF."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6178
+#, no-wrap
+msgid "600103"
+msgstr "600103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6179
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/154396[154396]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/154396[154396]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6180
+#, no-wrap
+msgid "January 15, 2006"
+msgstr "15 января 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6182
+#, no-wrap
+msgid "6.0-STABLE after MFC of man:pidfile[3] API."
+msgstr "6.0-STABLE после переноса изменений (MFC) API man:pidfile[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6183
+#, no-wrap
+msgid "600104"
+msgstr "600104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6184
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/154453[154453]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/154453[154453]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6185
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6968
+#, no-wrap
+msgid "January 17, 2006"
+msgstr "17 января 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6187
+#, no-wrap
+msgid "6.0-STABLE after MFC of ldconfig_local_dirs change."
+msgstr "6.0-STABLE после MFC изменений ldconfig_local_dirs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6188
+#, no-wrap
+msgid "600105"
+msgstr "600105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6189
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/156019[156019]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/156019[156019]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6190
+#, no-wrap
+msgid "February 26, 2006"
+msgstr "26 февраля 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6192
+#, no-wrap
+msgid "6.0-STABLE after NLS catalog support of man:csh[1]."
+msgstr "6.0-STABLE после поддержки каталога NLS в man:csh[1]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6193
+#, no-wrap
+msgid "601000"
+msgstr "601000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6194
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/158330[158330]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/158330[158330]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6195
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6200
+#, no-wrap
+msgid "May 6, 2006"
+msgstr "6 мая 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6197
+#, no-wrap
+msgid "6.1-RELEASE"
+msgstr "6.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6198
+#, no-wrap
+msgid "601100"
+msgstr "601100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6199
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/158331[158331]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/158331[158331]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6202
+#, no-wrap
+msgid "6.1-STABLE after 6.1-RELEASE."
+msgstr "6.1-STABLE после 6.1-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6203
+#, no-wrap
+msgid "601101"
+msgstr "601101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6204
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/159861[159861]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/159861[159861]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6205
+#, no-wrap
+msgid "June 22, 2006"
+msgstr "22 июня 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6207
+#, no-wrap
+msgid "6.1-STABLE after the import of `csup`."
+msgstr "6.1-STABLE после импорта `csup`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6208
+#, no-wrap
+msgid "601102"
+msgstr "601102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6209
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/160253[160253]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/160253[160253]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6210
+#, no-wrap
+msgid "July 11, 2006"
+msgstr "11 июля 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6212
+#, no-wrap
+msgid "6.1-STABLE after the man:iwi[4] update."
+msgstr "6.1-STABLE после обновления man:iwi[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6213
+#, no-wrap
+msgid "601103"
+msgstr "601103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6214
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/160429[160429]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/160429[160429]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6215
+#, no-wrap
+msgid "July 17, 2006"
+msgstr "17 июля 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6217
+#, no-wrap
+msgid "6.1-STABLE after the resolver update to BIND9, and exposure of reentrant version of `netdb` functions."
+msgstr "6.1-STABLE после обновления резолвера до BIND9 и добавления реентерабельной версии функций `netdb`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6218
+#, no-wrap
+msgid "601104"
+msgstr "601104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6219
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/161098[161098]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/161098[161098]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6220
+#, no-wrap
+msgid "August 8, 2006"
+msgstr "8 августа 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6222
+#, no-wrap
+msgid "6.1-STABLE after DSO (dynamic shared objects) support has been enabled in OpenSSL."
+msgstr "6.1-STABLE после включения поддержки DSO (динамически разделяемых объектов) в OpenSSL."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6223
+#, no-wrap
+msgid "601105"
+msgstr "601105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6224
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/161900[161900]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/161900[161900]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6225
+#, no-wrap
+msgid "September 2, 2006"
+msgstr "2 сентября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6227
+#, no-wrap
+msgid "6.1-STABLE after 802.11 fix-ups changed the API for the IEEE80211_IOC_STA_INFO ioctl."
+msgstr "6.1-STABLE после исправлений 802.11 изменил API для ioctl IEEE80211_IOC_STA_INFO."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6228
+#, no-wrap
+msgid "602000"
+msgstr "602000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6229
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/164312[164312]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/164312[164312]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6230
+#, no-wrap
+msgid "November 15, 2006"
+msgstr "15 ноября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6232
+#, no-wrap
+msgid "6.2-RELEASE"
+msgstr "6.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6233
+#, no-wrap
+msgid "602100"
+msgstr "602100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6234
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/162329[162329]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/162329[162329]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6235
+#, no-wrap
+msgid "September 15, 2006"
+msgstr "15 сентября 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6237
+#, no-wrap
+msgid "6.2-STABLE after 6.2-RELEASE."
+msgstr "6.2-STABLE после 6.2-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6238
+#, no-wrap
+msgid "602101"
+msgstr "602101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6239
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/165122[165122]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/165122[165122]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6240
+#, no-wrap
+msgid "December 12, 2006"
+msgstr "12 декабря 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6242
+#, no-wrap
+msgid "6.2-STABLE after the addition of Wi-Spy quirk."
+msgstr "6.2-STABLE после добавления особенности Wi-Spy."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6243
+#, no-wrap
+msgid "602102"
+msgstr "602102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6244
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/165596[165596]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/165596[165596]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6245
+#, no-wrap
+msgid "December 28, 2006"
+msgstr "28 декабря 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6247
+#, no-wrap
+msgid "6.2-STABLE after `pci_find_extcap()` addition."
+msgstr "6.2-STABLE после добавления `pci_find_extcap()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6248
+#, no-wrap
+msgid "602103"
+msgstr "602103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6249
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/166039[166039]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/166039[166039]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6250
+#, no-wrap
+msgid "January 16, 2007"
+msgstr "16 января 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6252
+#, no-wrap
+msgid "6.2-STABLE after MFC of `dlsym` change to look for a requested symbol both in specified DSO and its implicit dependencies."
+msgstr "6.2-STABLE после MFC изменения `dlsym` для поиска запрошенного символа как в указанном DSO, так и в его неявных зависимостях."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6253
+#, no-wrap
+msgid "602104"
+msgstr "602104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6254
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/166314[166314]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/166314[166314]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6255
+#, no-wrap
+msgid "January 28, 2007"
+msgstr "28 января 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6257
+#, no-wrap
+msgid "6.2-STABLE after MFC of man:ng_deflate[4] and man:ng_pred1[4] netgraph nodes and new compression and encryption modes for man:ng_ppp[4] node."
+msgstr "6.2-STABLE после слияния изменений (MFC) узлов netgraph man:ng_deflate[4] и man:ng_pred1[4], а также новых режимов сжатия и шифрования для узла man:ng_ppp[4]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6258
+#, no-wrap
+msgid "602105"
+msgstr "602105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6259
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/166840[166840]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/166840[166840]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6260
+#, no-wrap
+msgid "February 20, 2007"
+msgstr "20 февраля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6262
+#, no-wrap
+msgid "6.2-STABLE after MFC of BSD licensed version of man:gzip[1] ported from NetBSD."
+msgstr "6.2-STABLE после переноса (MFC) версии man:gzip[1] под лицензией BSD из NetBSD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6263
+#, no-wrap
+msgid "602106"
+msgstr "602106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6264
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/168133[168133]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/168133[168133]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6265
+#, no-wrap
+msgid "March 31, 2007"
+msgstr "31 марта 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6267
+#, no-wrap
+msgid "6.2-STABLE after MFC of PCI MSI and MSI-X support."
+msgstr "6.2-STABLE после слияния изменений (MFC) поддержки PCI MSI и MSI-X."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6268
+#, no-wrap
+msgid "602107"
+msgstr "602107"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6269
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/168438[168438]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/168438[168438]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6272
+#, no-wrap
+msgid "6.2-STABLE after MFC of ncurses 5.6 and wide character support."
+msgstr "6.2-STABLE после слияния изменений (MFC) ncurses 5.6 с поддержкой широких символов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6273
+#, no-wrap
+msgid "602108"
+msgstr "602108"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6274
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/168611[168611]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/168611[168611]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6275
+#, no-wrap
+msgid "April 11, 2007"
+msgstr "11 апреля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6277
+#, no-wrap
+msgid "6.2-STABLE after MFC of CAM 'SG' peripheral device, which implements a subset of Linux SCSI SG passthrough device API."
+msgstr "6.2-STABLE после слияния изменений (MFC) для периферийного устройства CAM 'SG', реализующего подмножество API сквозного устройства SCSI SG в Linux."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6278
+#, no-wrap
+msgid "602109"
+msgstr "602109"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6279
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/168805[168805]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/168805[168805]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6280
+#, no-wrap
+msgid "April 17, 2007"
+msgstr "17 апреля 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6282
+#, no-wrap
+msgid "6.2-STABLE after MFC of readline 5.2 patch-set 002."
+msgstr "6.2-STABLE после MFC набора исправлений readline 5.2 patch-set 002."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6283
+#, no-wrap
+msgid "602110"
+msgstr "602110"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6284
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/169222[169222]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/169222[169222]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6285
+#, no-wrap
+msgid "May 2, 2007"
+msgstr "2 мая 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6287
+#, no-wrap
+msgid "6.2-STABLE after MFC of `pmap_invalidate_cache()`, `pmap_change_attr()`, `pmap_mapbios()`, `pmap_mapdev_attr()`, and `pmap_unmapbios()` for amd64 and i386."
+msgstr "6.2-STABLE после слияния изменений (MFC) функций `pmap_invalidate_cache()`, `pmap_change_attr()`, `pmap_mapbios()`, `pmap_mapdev_attr()` и `pmap_unmapbios()` для архитектур amd64 и i386."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6288
+#, no-wrap
+msgid "602111"
+msgstr "602111"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6289
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/170556[170556]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/170556[170556]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6292
+#, no-wrap
+msgid "6.2-STABLE after MFC of BOP_BDFLUSH and caused breakage of the filesystem modules KBI."
+msgstr "6.2-STABLE после слияния изменений BOP_BDFLUSH, что привело к нарушению KBI модулей файловой системы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6293
+#, no-wrap
+msgid "602112"
+msgstr "602112"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6294
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/172284[172284]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/172284[172284]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6295
+#, no-wrap
+msgid "September 21, 2007"
+msgstr "21 сентября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6297
+#, no-wrap
+msgid "6.2-STABLE after man:libutil[3] MFC's."
+msgstr "6.2-STABLE после man:libutil[3] MFC's."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6298
+#, no-wrap
+msgid "602113"
+msgstr "602113"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6299
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/172986[172986]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/172986[172986]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6302
+#, no-wrap
+msgid "6.2-STABLE after MFC of wide and single byte ctype separation. Newly compiled binary that references to ctype.h may require a new symbol, `__mb_sb_limit`, which is not available on older systems."
+msgstr "6.2-STABLE после слияния изменений (MFC) разделения широких и однобайтовых символов ctype. Вновь скомпилированные двоичные файлы, ссылающиеся на ctype.h, могут требовать новый символ `__mb_sb_limit`, который недоступен в старых системах."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6303
+#, no-wrap
+msgid "602114"
+msgstr "602114"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6304
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/173170[173170]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/173170[173170]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6305
+#, no-wrap
+msgid "October 30, 2007"
+msgstr "30 октября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6307
+#, no-wrap
+msgid "6.2-STABLE after ctype ABI forward compatibility restored."
+msgstr "6.2-STABLE после восстановления прямой совместимости ABI ctype."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6308
+#, no-wrap
+msgid "602115"
+msgstr "602115"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6309
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/173794[173794]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/173794[173794]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6310
+#, no-wrap
+msgid "November 21, 2007"
+msgstr "21 ноября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6312
+#, no-wrap
+msgid "6.2-STABLE after back out of wide and single byte ctype separation."
+msgstr "6.2-STABLE после отмены разделения широких и однобайтовых символов ctype."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6313
+#, no-wrap
+msgid "603000"
+msgstr "603000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6314
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/173897[173897]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/173897[173897]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6315
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6320
+#, no-wrap
+msgid "November 25, 2007"
+msgstr "25 ноября 2007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6317
+#, no-wrap
+msgid "6.3-RELEASE"
+msgstr "6.3-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6318
+#, no-wrap
+msgid "603100"
+msgstr "603100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6319
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/173891[173891]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/173891[173891]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6322
+#, no-wrap
+msgid "6.3-STABLE after 6.3-RELEASE."
+msgstr "6.3-STABLE после 6.3-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6324
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/174434[174434]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/174434[174434]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6327
+#, no-wrap
+msgid "6.3-STABLE after fixing multibyte type support in bit macro."
+msgstr "6.3-STABLE после исправления поддержки многобайтовых типов в макросе bit."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6328
+#, no-wrap
+msgid "603102"
+msgstr "603102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6329
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/178459[178459]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/178459[178459]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6330
+#, no-wrap
+msgid "April 24, 2008"
+msgstr "24 апреля 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6332
+#, no-wrap
+msgid "6.3-STABLE after adding `l_sysid` to struct flock."
+msgstr "6.3-STABLE после добавления `l_sysid` в структуру flock."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6333
+#, no-wrap
+msgid "603103"
+msgstr "603103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6337
+#, no-wrap
+msgid "6.3-STABLE after MFC of the man:memrchr[3] function."
+msgstr "6.3-STABLE после MFC функции man:memrchr[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6338
+#, no-wrap
+msgid "603104"
+msgstr "603104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6339
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/179810[179810]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/179810[179810]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6340
+#, no-wrap
+msgid "June 15, 2008"
+msgstr "15 июня 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6342
+#, no-wrap
+msgid "6.3-STABLE after MFC of support for `:u` variable modifier in man:make[1]."
+msgstr "6.3-STABLE после MFC поддержки модификатора переменной `:u` в man:make[1]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6343
+#, no-wrap
+msgid "604000"
+msgstr "604000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6344
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/183583[183583]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/183583[183583]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6345
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6350
+#, no-wrap
+msgid "October 4, 2008"
+msgstr "4 октября 2008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6347
+#, no-wrap
+msgid "6.4-RELEASE"
+msgstr "6.4-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6348
+#, no-wrap
+msgid "604100"
+msgstr "604100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6349
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/183584[183584]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/183584[183584]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6351
+#, no-wrap
+msgid "6.4-STABLE after 6.4-RELEASE."
+msgstr "6.4-STABLE после 6.4-RELEASE."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6354
+#, no-wrap
+msgid "FreeBSD 5 Versions"
+msgstr "Версии FreeBSD 5"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6357
+#, no-wrap
+msgid "FreeBSD 5 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` в FreeBSD 5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6366
+#, no-wrap
+msgid "500000"
+msgstr "500000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6367
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/58009[58009]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/58009[58009]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6368
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7081
+#, no-wrap
+msgid "March 13, 2000"
+msgstr "13 марта 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6370
+#, no-wrap
+msgid "5.0-CURRENT"
+msgstr "5.0-CURRENT"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6371
+#, no-wrap
+msgid "500001"
+msgstr "500001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6372
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/59348[59348]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/59348[59348]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6373
+#, no-wrap
+msgid "April 18, 2000"
+msgstr "18 апреля 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6375
+#, no-wrap
+msgid "5.0-CURRENT after adding addition ELF header fields, and changing ELF binary branding method."
+msgstr "5.0-CURRENT после добавления дополнительных полей заголовка ELF и изменения метода маркировки ELF-бинарников."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6376
+#, no-wrap
+msgid "500002"
+msgstr "500002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6377
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/59906[59906]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/59906[59906]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6378
+#, no-wrap
+msgid "May 2, 2000"
+msgstr "2 мая 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6380
+#, no-wrap
+msgid "5.0-CURRENT after kld metadata changes."
+msgstr "5.0-CURRENT после изменений метаданных kld."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6381
+#, no-wrap
+msgid "500003"
+msgstr "500003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6382
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/60688[60688]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/60688[60688]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6383
+#, no-wrap
+msgid "May 18, 2000"
+msgstr "18 мая 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6385
+#, no-wrap
+msgid "5.0-CURRENT after buf/bio changes."
+msgstr "5.0-CURRENT после изменений в buf/bio."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6386
+#, no-wrap
+msgid "500004"
+msgstr "500004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6387
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/60936[60936]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/60936[60936]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6388
+#, no-wrap
+msgid "May 26, 2000"
+msgstr "26 мая 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6390
+#, no-wrap
+msgid "5.0-CURRENT after binutils upgrade."
+msgstr "5.0-CURRENT после обновления binutils."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6391
+#, no-wrap
+msgid "500005"
+msgstr "500005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6392
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/61221[61221]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/61221[61221]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6393
+#, no-wrap
+msgid "June 3, 2000"
+msgstr "3 июня 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6395
+#, no-wrap
+msgid "5.0-CURRENT after merging libxpg4 code into libc and after TASKQ interface introduction."
+msgstr "5.0-CURRENT после объединения кода libxpg4 с libc и после введения интерфейса TASKQ."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6396
+#, no-wrap
+msgid "500006"
+msgstr "500006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6397
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/61500[61500]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/61500[61500]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6398
+#, no-wrap
+msgid "June 10, 2000"
+msgstr "10 июня 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6400
+#, no-wrap
+msgid "5.0-CURRENT after the addition of AGP interfaces."
+msgstr "5.0-CURRENT после добавления интерфейсов AGP."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6401
+#, no-wrap
+msgid "500007"
+msgstr "500007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6402
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/62235[62235]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/62235[62235]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6403
+#, no-wrap
+msgid "June 29, 2000"
+msgstr "29 июня 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6405
+#, no-wrap
+msgid "5.0-CURRENT after Perl upgrade to 5.6.0"
+msgstr "5.0-CURRENT после обновления Perl до версии 5.6.0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6406
+#, no-wrap
+msgid "500008"
+msgstr "500008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6407
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/62764[62764]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/62764[62764]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6408
+#, no-wrap
+msgid "July 7, 2000"
+msgstr "7 июля 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6410
+#, no-wrap
+msgid "5.0-CURRENT after the update of KAME code to 2000/07 sources."
+msgstr "5.0-CURRENT после обновления кода KAME до исходников от 2000/07."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6411
+#, no-wrap
+msgid "500009"
+msgstr "500009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6412
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/63154[63154]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/63154[63154]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6413
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7106
+#, no-wrap
+msgid "July 14, 2000"
+msgstr "14 июля 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6415
+#, no-wrap
+msgid "5.0-CURRENT after `ether_ifattach()` and `ether_ifdetach()` changes."
+msgstr "5.0-CURRENT после изменений в `ether_ifattach()` и `ether_ifdetach()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6416
+#, no-wrap
+msgid "500010"
+msgstr "500010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6417
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/63265[63265]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/63265[63265]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6418
+#, no-wrap
+msgid "July 16, 2000"
+msgstr "16 июля 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6420
+#, no-wrap
+msgid "5.0-CURRENT after changing mtree defaults back to original variant, adding -L to follow symlinks."
+msgstr "5.0-CURRENT после изменения настроек mtree обратно на исходный вариант, с добавлением -L для следования по символьным ссылкам."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6421
+#, no-wrap
+msgid "500011"
+msgstr "500011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6422
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/63459[63459]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/63459[63459]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6423
+#, no-wrap
+msgid "July 18, 2000"
+msgstr "18 июля 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6425
+#, no-wrap
+msgid "5.0-CURRENT after kqueue API changed."
+msgstr "5.0-CURRENT после изменения API kqueue."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6426
+#, no-wrap
+msgid "500012"
+msgstr "500012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6427
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/65353[65353]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/65353[65353]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6428
+#, no-wrap
+msgid "September 2, 2000"
+msgstr "2 сентября 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6430
+#, no-wrap
+msgid "5.0-CURRENT after man:setproctitle[3] moved from libutil to libc."
+msgstr "5.0-CURRENT после переноса man:setproctitle[3] из libutil в libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6431
+#, no-wrap
+msgid "500013"
+msgstr "500013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6432
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/65671[65671]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/65671[65671]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6433
+#, no-wrap
+msgid "September 10, 2000"
+msgstr "10 сентября 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6435
+#, no-wrap
+msgid "5.0-CURRENT after the first SMPng commit."
+msgstr "5.0-CURRENT после первого коммита SMPng."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6436
+#, no-wrap
+msgid "500014"
+msgstr "500014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6437
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/70650[70650]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/70650[70650]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6438
+#, no-wrap
+msgid "January 4, 2001"
+msgstr "4 января 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6440
+#, no-wrap
+msgid "5.0-CURRENT after <sys/select.h> moved to <sys/selinfo.h>."
+msgstr "5.0-CURRENT после перемещения <sys/select.h> в <sys/selinfo.h>."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6441
+#, no-wrap
+msgid "500015"
+msgstr "500015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6442
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/70894[70894]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/70894[70894]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6443
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7136
+#, no-wrap
+msgid "January 10, 2001"
+msgstr "10 января 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6445
+#, no-wrap
+msgid "5.0-CURRENT after combining libgcc.a and libgcc_r.a, and associated GCC linkage changes."
+msgstr "5.0-CURRENT после объединения libgcc.a и libgcc_r.a, а также связанных изменений в компоновке GCC."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6446
+#, no-wrap
+msgid "500016"
+msgstr "500016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6447
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/71583[71583]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/71583[71583]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6448
+#, no-wrap
+msgid "January 24, 2001"
+msgstr "24 января 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6450
+#, no-wrap
+msgid "5.0-CURRENT after change allowing libc and libc_r to be linked together, deprecating -pthread option."
+msgstr "5.0-CURRENT после изменения, разрешающего совместную линковку libc и libc_r, с объявлением устаревшим параметра -pthread."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6451
+#, no-wrap
+msgid "500017"
+msgstr "500017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6452
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/72650[72650]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/72650[72650]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6453
+#, no-wrap
+msgid "February 18, 2001"
+msgstr "18 февраля 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6455
+#, no-wrap
+msgid "5.0-CURRENT after switch from struct `ucred` to struct `xucred` to stabilize kernel-exported API for mountd et al."
+msgstr "5.0-CURRENT после перехода со структуры `ucred` на структуру `xucred` для стабилизации API, экспортируемого ядром, для mountd и других."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6456
+#, no-wrap
+msgid "500018"
+msgstr "500018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6457
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/72975[72975]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/72975[72975]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6458
+#, no-wrap
+msgid "February 24, 2001"
+msgstr "24 февраля 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6460
+#, no-wrap
+msgid "5.0-CURRENT after addition of CPUTYPE make variable for controlling CPU-specific optimizations."
+msgstr "5.0-CURRENT после добавления переменной сборки CPUTYPE для управления оптимизациями под конкретный процессор."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6461
+#, no-wrap
+msgid "500019"
+msgstr "500019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6462
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/77937[77937]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/77937[77937]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6463
+#, no-wrap
+msgid "June 9, 2001"
+msgstr "9 июня 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6465
+#, no-wrap
+msgid "5.0-CURRENT after moving machine/ioctl_fd.h to sys/fdcio.h"
+msgstr "5.0-CURRENT после перемещения machine/ioctl_fd.h в sys/fdcio.h"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6466
+#, no-wrap
+msgid "500020"
+msgstr "500020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6467
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/78304[78304]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/78304[78304]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6468
+#, no-wrap
+msgid "June 15, 2001"
+msgstr "15 июня 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6470
+#, no-wrap
+msgid "5.0-CURRENT after locale names renaming."
+msgstr "5.0-CURRENT после переименования названий локалей."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6471
+#, no-wrap
+msgid "500021"
+msgstr "500021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6472
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/78632[78632]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/78632[78632]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6473
+#, no-wrap
+msgid "June 22, 2001"
+msgstr "22 июня 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6475
+#, no-wrap
+msgid "5.0-CURRENT after Bzip2 import. Also signifies removal of S/Key."
+msgstr "5.0-CURRENT после импорта Bzip2. Также означает удаление S/Key."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6476
+#, no-wrap
+msgid "500022"
+msgstr "500022"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6477
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6482
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/83435[83435]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/83435[83435]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6478
+#, no-wrap
+msgid "July 12, 2001"
+msgstr "12 июля 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6480
+#, no-wrap
+msgid "5.0-CURRENT after SSE support."
+msgstr "5.0-CURRENT после поддержки SSE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6481
+#, no-wrap
+msgid "500023"
+msgstr "500023"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6483
+#, no-wrap
+msgid "September 14, 2001"
+msgstr "14 сентября 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6485
+#, no-wrap
+msgid "5.0-CURRENT after KSE Milestone 2."
+msgstr "5.0-CURRENT после второго этапа KSE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6486
+#, no-wrap
+msgid "500024"
+msgstr "500024"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6487
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/84324[84324]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/84324[84324]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6488
+#, no-wrap
+msgid "October 1, 2001"
+msgstr "1 октября 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6490
+#, no-wrap
+msgid "5.0-CURRENT after `d_thread_t`, and moving UUCP to ports."
+msgstr "5.0-CURRENT после `d_thread_t` и перемещение UUCP в порты."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6491
+#, no-wrap
+msgid "500025"
+msgstr "500025"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6492
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/84481[84481]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/84481[84481]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6493
+#, no-wrap
+msgid "October 4, 2001"
+msgstr "4 октября 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6495
+#, no-wrap
+msgid "5.0-CURRENT after ABI change for descriptor and `creds` passing on 64 bit platforms."
+msgstr "5.0-CURRENT после изменения ABI для передачи дескрипторов и `creds` на 64-битных платформах."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6496
+#, no-wrap
+msgid "500026"
+msgstr "500026"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6497
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/84710[84710]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/84710[84710]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6498
+#, no-wrap
+msgid "October 9, 2001"
+msgstr "9 октября 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6500
+#, no-wrap
+msgid "5.0-CURRENT after moving to XFree86 4 by default for package builds, and after the new libc `strnstr()` function was added."
+msgstr "5.0-CURRENT после перехода на XFree86 4 по умолчанию для сборки пакетов и после добавления новой функции `strnstr()` в библиотеку libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6501
+#, no-wrap
+msgid "500027"
+msgstr "500027"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6502
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/84743[84743]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/84743[84743]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6503
+#, no-wrap
+msgid "October 10, 2001"
+msgstr "10 октября 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6505
+#, no-wrap
+msgid "5.0-CURRENT after the new libc `strcasestr()` function was added."
+msgstr "5.0-CURRENT после добавления новой функции `strcasestr()` в библиотеку libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6506
+#, no-wrap
+msgid "500028"
+msgstr "500028"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6507
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/87879[87879]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/87879[87879]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6508
+#, no-wrap
+msgid "December 14, 2001"
+msgstr "14 декабря 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6510
+#, no-wrap
+msgid "5.0-CURRENT after the userland components of smbfs were imported."
+msgstr "5.0-CURRENT после импорта компонентов пользовательского пространства smbfs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6515
+#, no-wrap
+msgid "5.0-CURRENT after the new C99 specific-width integer types were added."
+msgstr "5.0-CURRENT после добавления новых целочисленных типов фиксированной ширины C99."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6516
+#, no-wrap
+msgid "500029"
+msgstr "500029"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6517
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/89938[89938]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/89938[89938]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6518
+#, no-wrap
+msgid "January 29, 2002"
+msgstr "29 января 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6520
+#, no-wrap
+msgid "5.0-CURRENT after a change was made in the return value of man:sendfile[2]."
+msgstr "5.0-CURRENT после изменения возвращаемого значения man:sendfile[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6521
+#, no-wrap
+msgid "500030"
+msgstr "500030"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6522
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/90711[90711]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/90711[90711]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6523
+#, no-wrap
+msgid "February 15, 2002"
+msgstr "15 февраля 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6525
+#, no-wrap
+msgid "5.0-CURRENT after the introduction of the type `fflags_t`, which is the appropriate size for file flags."
+msgstr "5.0-CURRENT после введения типа `fflags_t`, который имеет подходящий размер для флагов файлов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6526
+#, no-wrap
+msgid "500031"
+msgstr "500031"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6527
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7180
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/91203[91203]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/91203[91203]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6528
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7181
+#, no-wrap
+msgid "February 24, 2002"
+msgstr "24 февраля 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6530
+#, no-wrap
+msgid "5.0-CURRENT after the usb structure element rename."
+msgstr "5.0-CURRENT после переименования элемента структуры usb."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6531
+#, no-wrap
+msgid "500032"
+msgstr "500032"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6532
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/92453[92453]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/92453[92453]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6533
+#, no-wrap
+msgid "March 16, 2002"
+msgstr "16 марта 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6535
+#, no-wrap
+msgid "5.0-CURRENT after the introduction of Perl 5.6.1."
+msgstr "5.0-CURRENT после внедрения Perl 5.6.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6536
+#, no-wrap
+msgid "500033"
+msgstr "500033"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6537
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/93722[93722]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/93722[93722]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6538
+#, no-wrap
+msgid "April 3, 2002"
+msgstr "3 апреля 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6540
+#, no-wrap
+msgid "5.0-CURRENT after the `sendmail_enable` man:rc.conf[5] variable was made to take the value `NONE`."
+msgstr "5.0-CURRENT после того, как переменная `sendmail_enable` из man:rc.conf[5] стала принимать значение `NONE`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6541
+#, no-wrap
+msgid "500034"
+msgstr "500034"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6542
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/95831[95831]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/95831[95831]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6543
+#, no-wrap
+msgid "April 30, 2002"
+msgstr "30 апреля 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6545
+#, no-wrap
+msgid "5.0-CURRENT after `mtx_init()` grew a third argument."
+msgstr "5.0-CURRENT после того, как `mtx_init()` получил третий аргумент."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6546
+#, no-wrap
+msgid "500035"
+msgstr "500035"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6547
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/96498[96498]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/96498[96498]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6548
+#, no-wrap
+msgid "May 13, 2002"
+msgstr "13 мая 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6550
+#, no-wrap
+msgid "5.0-CURRENT with Gcc 3.1."
+msgstr "5.0-CURRENT с Gcc 3.1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6551
+#, no-wrap
+msgid "500036"
+msgstr "500036"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6552
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/96781[96781]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/96781[96781]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6553
+#, no-wrap
+msgid "May 17, 2002"
+msgstr "17 мая 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6555
+#, no-wrap
+msgid "5.0-CURRENT without Perl in /usr/src"
+msgstr "5.0-CURRENT без Perl в /usr/src"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6556
+#, no-wrap
+msgid "500037"
+msgstr "500037"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6557
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/97516[97516]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/97516[97516]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6558
+#, no-wrap
+msgid "May 29, 2002"
+msgstr "29 мая 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6560
+#, no-wrap
+msgid "5.0-CURRENT after the addition of man:dlfunc[3]"
+msgstr "5.0-CURRENT после добавления man:dlfunc[3]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6561
+#, no-wrap
+msgid "500038"
+msgstr "500038"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6562
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/100591[100591]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/100591[100591]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6563
+#, no-wrap
+msgid "July 24, 2002"
+msgstr "24 июля 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6565
+#, no-wrap
+msgid "5.0-CURRENT after the types of some struct `sockbuf` members were changed and the structure was reordered."
+msgstr "5.0-CURRENT после изменения типов некоторых членов структуры `sockbuf` и её переупорядочивания."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6566
+#, no-wrap
+msgid "500039"
+msgstr "500039"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6567
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/102757[102757]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/102757[102757]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6568
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7236
+#, no-wrap
+msgid "September 1, 2002"
+msgstr "1 сентября 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6570
+#, no-wrap
+msgid "5.0-CURRENT after GCC 3.2.1 import. Also after headers stopped using _BSD_FOO_T_ and started using _FOO_T_DECLARED. This value can also be used as a conservative estimate of the start of man:bzip2[1] package support."
+msgstr "5.0-CURRENT после импорта GCC 3.2.1. Также после того, как заголовки перестали использовать _BSD_FOO_T_ и начали использовать _FOO_T_DECLARED. Это значение также можно использовать как консервативную оценку начала поддержки пакета man:bzip2[1]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6571
+#, no-wrap
+msgid "500040"
+msgstr "500040"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6572
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/103675[103675]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/103675[103675]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6573
+#, no-wrap
+msgid "September 20, 2002"
+msgstr "20 сентября 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6575
+#, no-wrap
+msgid "5.0-CURRENT after various changes to disk functions were made in the name of removing dependency on disklabel structure internals."
+msgstr "5.0-CURRENT после внесения различных изменений в функции работы с дисками, направленных на устранение зависимости от внутренней структуры disklabel."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6576
+#, no-wrap
+msgid "500041"
+msgstr "500041"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6577
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/104250[104250]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/104250[104250]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6578
+#, no-wrap
+msgid "October 1, 2002"
+msgstr "1 октября 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6580
+#, no-wrap
+msgid "5.0-CURRENT after the addition of man:getopt_long[3] to libc."
+msgstr "5.0-CURRENT после добавления man:getopt_long[3] в libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6581
+#, no-wrap
+msgid "500042"
+msgstr "500042"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6582
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/105178[105178]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/105178[105178]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6583
+#, no-wrap
+msgid "October 15, 2002"
+msgstr "15 октября 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6585
+#, no-wrap
+msgid "5.0-CURRENT after Binutils 2.13 upgrade, which included new FreeBSD emulation, `vec`, and output format."
+msgstr "5.0-CURRENT после обновления Binutils 2.13, которое включило новую эмуляцию FreeBSD, `vec` и формат вывода."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6586
+#, no-wrap
+msgid "500043"
+msgstr "500043"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6587
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/106289[106289]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/106289[106289]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6588
+#, no-wrap
+msgid "November 1, 2002"
+msgstr "1 ноября 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6590
+#, no-wrap
+msgid "5.0-CURRENT after adding weak pthread_XXX stubs to libc, obsoleting libXThrStub.so. 5.0-RELEASE."
+msgstr "5.0-CURRENT после добавления слабых заглушек pthread_XXX в libc, что сделало устаревшей libXThrStub.so. 5.0-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6591
+#, no-wrap
+msgid "500100"
+msgstr "500100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6592
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/109405[109405]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/109405[109405]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6593
+#, no-wrap
+msgid "January 17, 2003"
+msgstr "17 января 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6595
+#, no-wrap
+msgid "5.0-CURRENT after branching for RELENG_5_0"
+msgstr "5.0-CURRENT после ветвления для RELENG_5_0"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6596
+#, no-wrap
+msgid "500101"
+msgstr "500101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6597
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/111120[111120]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/111120[111120]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6598
+#, no-wrap
+msgid "February 19, 2003"
+msgstr "19 февраля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6600
+#, no-wrap
+msgid "<sys/dkstat.h> is empty. Do not include it."
+msgstr "<sys/dkstat.h> пустой. Не включайте его."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6601
+#, no-wrap
+msgid "500102"
+msgstr "500102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6602
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/111482[111482]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/111482[111482]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6603
+#, no-wrap
+msgid "February 25, 2003"
+msgstr "25 февраля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6605
+#, no-wrap
+msgid "5.0-CURRENT after the d_mmap_t interface change."
+msgstr "5.0-CURRENT после изменения интерфейса d_mmap_t."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6606
+#, no-wrap
+msgid "500103"
+msgstr "500103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6607
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/111540[111540]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/111540[111540]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6608
+#, no-wrap
+msgid "February 26, 2003"
+msgstr "26 февраля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6610
+#, no-wrap
+msgid "5.0-CURRENT after `taskqueue_swi` changed to run without Giant, and `taskqueue_swi_giant` added to run with Giant."
+msgstr "5.0-CURRENT после изменения `taskqueue_swi` для работы без Giant и добавления `taskqueue_swi_giant` для работы с Giant."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6611
+#, no-wrap
+msgid "500104"
+msgstr "500104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6612
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/111600[111600]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/111600[111600]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6613
+#, no-wrap
+msgid "February 27, 2003"
+msgstr "27 февраля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6615
+#, no-wrap
+msgid "`cdevsw_add()` and `cdevsw_remove()` no longer exists. Appearance of `MAJOR_AUTO` allocation facility."
+msgstr "`cdevsw_add()` и `cdevsw_remove()` больше не существуют. Появление средства выделения `MAJOR_AUTO`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6616
+#, no-wrap
+msgid "500105"
+msgstr "500105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6617
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/111864[111864]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/111864[111864]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6618
+#, no-wrap
+msgid "March 4, 2003"
+msgstr "4 марта 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6620
+#, no-wrap
+msgid "5.0-CURRENT after new cdevsw initialization method."
+msgstr "5.0-CURRENT после новой инициализации метода cdevsw."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6621
+#, no-wrap
+msgid "500106"
+msgstr "500106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6622
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/112007[112007]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/112007[112007]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6623
+#, no-wrap
+msgid "March 8, 2003"
+msgstr "8 марта 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6625
+#, no-wrap
+msgid "`devstat_add_entry()` has been replaced by `devstat_new_entry()`"
+msgstr "`devstat_add_entry()` был заменён на `devstat_new_entry()`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6626
+#, no-wrap
+msgid "500107"
+msgstr "500107"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6627
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/112288[112288]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/112288[112288]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6628
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6633
+#, no-wrap
+msgid "March 15, 2003"
+msgstr "15 марта 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6630
+#, no-wrap
+msgid "`devstat` interface change; see sys/sys/param.h 1.149"
+msgstr "Изменение интерфейса `devstat`; см. sys/sys/param.h 1.149"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6631
+#, no-wrap
+msgid "500108"
+msgstr "500108"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6632
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/112300[112300]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/112300[112300]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6635
+#, no-wrap
+msgid "Token-Ring interface changes."
+msgstr "Изменения в интерфейсе Token-Ring."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6636
+#, no-wrap
+msgid "500109"
+msgstr "500109"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6637
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/112571[112571]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/112571[112571]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6638
+#, no-wrap
+msgid "March 25, 2003"
+msgstr "25 марта 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6640
+#, no-wrap
+msgid "Addition of `vm_paddr_t`."
+msgstr "Добавление `vm_paddr_t`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6641
+#, no-wrap
+msgid "500110"
+msgstr "500110"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6642
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/112741[112741]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/112741[112741]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6643
+#, no-wrap
+msgid "March 28, 2003"
+msgstr "28 марта 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6645
+#, no-wrap
+msgid "5.0-CURRENT after man:realpath[3] has been made thread-safe"
+msgstr "5.0-CURRENT после того, как man:realpath[3] стал потокобезопасным"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6646
+#, no-wrap
+msgid "500111"
+msgstr "500111"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6647
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/113273[113273]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/113273[113273]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6648
+#, no-wrap
+msgid "April 9, 2003"
+msgstr "9 апреля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6650
+#, no-wrap
+msgid "5.0-CURRENT after man:usbhid[3] has been synced with NetBSD"
+msgstr "5.0-CURRENT после синхронизации man:usbhid[3] с NetBSD"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6651
+#, no-wrap
+msgid "500112"
+msgstr "500112"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6652
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/113597[113597]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/113597[113597]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6653
+#, no-wrap
+msgid "April 17, 2003"
+msgstr "17 апреля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6655
+#, no-wrap
+msgid "5.0-CURRENT after new NSS implementation and addition of POSIX.1 getpw*_r, getgr*_r functions"
+msgstr "5.0-CURRENT после новой реализации NSS и добавления функций POSIX.1 getpw*_r, getgr*_r"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6656
+#, no-wrap
+msgid "500113"
+msgstr "500113"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6657
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/114492[114492]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/114492[114492]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6658
+#, no-wrap
+msgid "May 2, 2003"
+msgstr "2 мая 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6660
+#, no-wrap
+msgid "5.0-CURRENT after removal of the old rc system."
+msgstr "5.0-CURRENT после удаления старой системы rc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6661
+#, no-wrap
+msgid "501000"
+msgstr "501000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6662
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/115816[115816]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/115816[115816]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6663
+#, no-wrap
+msgid "June 4, 2003"
+msgstr "4 июня 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6665
+#, no-wrap
+msgid "5.1-RELEASE."
+msgstr "5.1-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6666
+#, no-wrap
+msgid "501100"
+msgstr "501100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6667
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/115710[115710]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/115710[115710]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6668
+#, no-wrap
+msgid "June 2, 2003"
+msgstr "2 июня 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6670
+#, no-wrap
+msgid "5.1-CURRENT after branching for RELENG_5_1."
+msgstr "5.1-CURRENT после ветвления для RELENG_5_1."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6671
+#, no-wrap
+msgid "501101"
+msgstr "501101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6672
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/117025[117025]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/117025[117025]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6673
+#, no-wrap
+msgid "June 29, 2003"
+msgstr "29 июня 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6675
+#, no-wrap
+msgid "5.1-CURRENT after correcting the semantics of man:sigtimedwait[2] and man:sigwaitinfo[2]."
+msgstr "5.1-CURRENT после исправления семантики man:sigtimedwait[2] и man:sigwaitinfo[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6676
+#, no-wrap
+msgid "501102"
+msgstr "501102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6677
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/117191[117191]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/117191[117191]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6678
+#, no-wrap
+msgid "July 3, 2003"
+msgstr "3 июля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6680
+#, no-wrap
+msgid "5.1-CURRENT after adding the `lockfunc` and `lockfuncarg` fields to man:bus_dma_tag_create[9]."
+msgstr "5.1-CURRENT после добавления полей `lockfunc` и `lockfuncarg` в man:bus_dma_tag_create[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6681
+#, no-wrap
+msgid "501103"
+msgstr "501103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6682
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/118241[118241]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/118241[118241]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6683
+#, no-wrap
+msgid "July 31, 2003"
+msgstr "31 июля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6685
+#, no-wrap
+msgid "5.1-CURRENT after GCC 3.3.1-pre 20030711 snapshot integration."
+msgstr "5.1-CURRENT после интеграции снимка GCC 3.3.1-pre 20030711."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6686
+#, no-wrap
+msgid "501104"
+msgstr "501104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6687
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/118511[118511]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/118511[118511]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6688
+#, no-wrap
+msgid "August 5, 2003"
+msgstr "5 августа 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6690
+#, no-wrap
+msgid "5.1-CURRENT 3ware API changes to twe."
+msgstr "5.1-CURRENT Изменения API 3ware в twe."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6691
+#, no-wrap
+msgid "501105"
+msgstr "501105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6692
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/119021[119021]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/119021[119021]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6693
+#, no-wrap
+msgid "August 17, 2003"
+msgstr "17 августа 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6695
+#, no-wrap
+msgid "5.1-CURRENT dynamically linked /bin and /sbin support and movement of libraries to /lib."
+msgstr "5.1-CURRENT динамически связанные /bin и /sbin поддержка и перемещение библиотек в /lib."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6696
+#, no-wrap
+msgid "501106"
+msgstr "501106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6697
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/119881[119881]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/119881[119881]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6698
+#, no-wrap
+msgid "September 8, 2003"
+msgstr "8 сентября 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6700
+#, no-wrap
+msgid "5.1-CURRENT after adding kernel support for Coda 6.x."
+msgstr "5.1-CURRENT после добавления поддержки ядра для Coda 6.x."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6701
+#, no-wrap
+msgid "501107"
+msgstr "501107"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6702
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/120180[120180]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/120180[120180]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6703
+#, no-wrap
+msgid "September 17, 2003"
+msgstr "17 сентября 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6705
+#, no-wrap
+msgid "5.1-CURRENT after 16550 UART constants moved from [.filename]#<dev/sio/sioreg.h># to [.filename]#<dev/ic/ns16550.h>#. Also when libmap functionality was unconditionally supported by rtld."
+msgstr "5.1-CURRENT после того, как константы UART 16550 были перемещены из [.filename]#<dev/sio/sioreg.h># в [.filename]#<dev/ic/ns16550.h>#. Также когда функциональность libmap стала безусловно поддерживаться rtld."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6706
+#, no-wrap
+msgid "501108"
+msgstr "501108"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6707
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/120386[120386]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/120386[120386]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6708
+#, no-wrap
+msgid "September 23, 2003"
+msgstr "23 сентября 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6710
+#, no-wrap
+msgid "5.1-CURRENT after PFIL_HOOKS API update"
+msgstr "5.1-CURRENT после обновления API PFIL_HOOKS"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6711
+#, no-wrap
+msgid "501109"
+msgstr "501109"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6712
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/120503[120503]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/120503[120503]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6713
+#, no-wrap
+msgid "September 27, 2003"
+msgstr "27 сентября 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6715
+#, no-wrap
+msgid "5.1-CURRENT after adding man:kiconv[3]"
+msgstr "5.1-CURRENT после добавления man:kiconv[3]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6716
+#, no-wrap
+msgid "501110"
+msgstr "501110"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6717
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/120556[120556]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/120556[120556]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6718
+#, no-wrap
+msgid "September 28, 2003"
+msgstr "28 сентября 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6720
+#, no-wrap
+msgid "5.1-CURRENT after changing default operations for open and close in cdevsw"
+msgstr "5.1-CURRENT после изменения операций по умолчанию для open и close в cdevsw"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6721
+#, no-wrap
+msgid "501111"
+msgstr "501111"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6722
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/121125[121125]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/121125[121125]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6723
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6728
+#, no-wrap
+msgid "October 16, 2003"
+msgstr "16 октября 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6725
+#, no-wrap
+msgid "5.1-CURRENT after changed layout of cdevsw"
+msgstr "5.1-CURRENT после изменения структуры cdevsw"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6726
+#, no-wrap
+msgid "501112"
+msgstr "501112"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6727
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/121129[121129]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/121129[121129]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6730
+#, no-wrap
+msgid "5.1-CURRENT after adding kobj multiple inheritance"
+msgstr "5.1-CURRENT после добавления множественного наследования kobj"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6731
+#, no-wrap
+msgid "501113"
+msgstr "501113"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6732
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/121816[121816]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/121816[121816]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6733
+#, no-wrap
+msgid "October 31, 2003"
+msgstr "31 октября 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6735
+#, no-wrap
+msgid "5.1-CURRENT after the `if_xname` change in struct ifnet"
+msgstr "5.1-CURRENT после изменения `if_xname` в структуре ifnet"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6736
+#, no-wrap
+msgid "501114"
+msgstr "501114"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6737
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/122779[122779]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/122779[122779]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6738
+#, no-wrap
+msgid "November 16, 2003"
+msgstr "16 ноября 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6740
+#, no-wrap
+msgid "5.1-CURRENT after changing /bin and /sbin to be dynamically linked"
+msgstr "5.1-CURRENT после изменения /bin и /sbin на динамически линкуемые"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6741
+#, no-wrap
+msgid "502000"
+msgstr "502000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6742
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/123198[123198]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/123198[123198]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6743
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6753
+#, no-wrap
+msgid "December 7, 2003"
+msgstr "7 декабря 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6745
+#, no-wrap
+msgid "5.2-RELEASE"
+msgstr "5.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6746
+#, no-wrap
+msgid "502010"
+msgstr "502010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6747
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/126150[126150]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/126150[126150]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6748
+#, no-wrap
+msgid "February 23, 2004"
+msgstr "23 февраля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6750
+#, no-wrap
+msgid "5.2.1-RELEASE"
+msgstr "5.2.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6751
+#, no-wrap
+msgid "502100"
+msgstr "502100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6752
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/123196[123196]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/123196[123196]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6755
+#, no-wrap
+msgid "5.2-CURRENT after branching for RELENG_5_2"
+msgstr "5.2-CURRENT после ветвления для RELENG_5_2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6756
+#, no-wrap
+msgid "502101"
+msgstr "502101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6757
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/123677[123677]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/123677[123677]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6758
+#, no-wrap
+msgid "December 19, 2003"
+msgstr "19 декабря 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6760
+#, no-wrap
+msgid "5.2-CURRENT after `__cxa_atexit`/`__cxa_finalize` functions were added to libc."
+msgstr "5.2-CURRENT после добавления функций `__cxa_atexit`/`__cxa_finalize` в libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6761
+#, no-wrap
+msgid "502102"
+msgstr "502102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6762
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/125236[125236]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/125236[125236]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6763
+#, no-wrap
+msgid "January 30, 2004"
+msgstr "30 января 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6765
+#, no-wrap
+msgid "5.2-CURRENT after change of default thread library from libc_r to libpthread."
+msgstr "5.2-CURRENT после изменения стандартной библиотеки потоков с libc_r на libpthread."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6766
+#, no-wrap
+msgid "502103"
+msgstr "502103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6767
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/126083[126083]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/126083[126083]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6768
+#, no-wrap
+msgid "February 21, 2004"
+msgstr "21 февраля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6770
+#, no-wrap
+msgid "5.2-CURRENT after device driver API mega patch."
+msgstr "5.2-CURRENT после масштабного патча API драйверов устройств."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6771
+#, no-wrap
+msgid "502104"
+msgstr "502104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6772
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/126208[126208]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/126208[126208]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6773
+#, no-wrap
+msgid "February 25, 2004"
+msgstr "25 февраля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6775
+#, no-wrap
+msgid "5.2-CURRENT after `getopt_long_only()` addition."
+msgstr "5.2-CURRENT после добавления `getopt_long_only()`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6776
+#, no-wrap
+msgid "502105"
+msgstr "502105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6777
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/126644[126644]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/126644[126644]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6778
+#, no-wrap
+msgid "March 5, 2004"
+msgstr "5 марта 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6780
+#, no-wrap
+msgid "5.2-CURRENT after NULL is made into ((void *)0) for C, creating more warnings."
+msgstr "5.2-CURRENT после того, как NULL заменён на ((void *)0) для C, что вызывает больше предупреждений."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6781
+#, no-wrap
+msgid "502106"
+msgstr "502106"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6782
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/126757[126757]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/126757[126757]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6783
+#, no-wrap
+msgid "March 8, 2004"
+msgstr "8 марта 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6785
+#, no-wrap
+msgid "5.2-CURRENT after pf is linked to the build and install."
+msgstr "5.2-CURRENT после подключения pf к сборке и установке."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6786
+#, no-wrap
+msgid "502107"
+msgstr "502107"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6787
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/126819[126819]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/126819[126819]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6788
+#, no-wrap
+msgid "March 10, 2004"
+msgstr "10 марта 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6790
+#, no-wrap
+msgid "5.2-CURRENT after `time_t` is changed to a 64-bit value on sparc64."
+msgstr "5.2-CURRENT после изменения `time_t` на 64-битное значение на sparc64."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6791
+#, no-wrap
+msgid "502108"
+msgstr "502108"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6792
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/126891[126891]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/126891[126891]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6793
+#, no-wrap
+msgid "March 12, 2004"
+msgstr "12 марта 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6795
+#, no-wrap
+msgid "5.2-CURRENT after Intel C/C++ compiler support in some headers and man:execve[2] changes to be more strictly conforming to POSIX."
+msgstr "5.2-CURRENT после поддержки компилятора Intel C/C++ в некоторых заголовочных файлах и изменений в man:execve[2] для более строгого соответствия POSIX."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6796
+#, no-wrap
+msgid "502109"
+msgstr "502109"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6797
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/127312[127312]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/127312[127312]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6798
+#, no-wrap
+msgid "March 22, 2004"
+msgstr "22 марта 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6800
+#, no-wrap
+msgid "5.2-CURRENT after the introduction of the `bus_alloc_resource_any` API"
+msgstr "5.2-CURRENT после введения API `bus_alloc_resource_any`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6801
+#, no-wrap
+msgid "502110"
+msgstr "502110"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6802
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/127475[127475]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/127475[127475]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6803
+#, no-wrap
+msgid "March 27, 2004"
+msgstr "27 марта 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6805
+#, no-wrap
+msgid "5.2-CURRENT after the addition of UTF-8 locales"
+msgstr "5.2-CURRENT после добавления локалей UTF-8"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6806
+#, no-wrap
+msgid "502111"
+msgstr "502111"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6807
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/128144[128144]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/128144[128144]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6808
+#, no-wrap
+msgid "April 11, 2004"
+msgstr "11 апреля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6810
+#, no-wrap
+msgid "5.2-CURRENT after the removal of the man:getvfsent[3] API"
+msgstr "5.2-CURRENT после удаления API man:getvfsent[3]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6811
+#, no-wrap
+msgid "502112"
+msgstr "502112"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6812
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/128182[128182]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/128182[128182]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6813
+#, no-wrap
+msgid "April 13, 2004"
+msgstr "13 апреля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6815
+#, no-wrap
+msgid "5.2-CURRENT after the addition of the .warning directive for make."
+msgstr "5.2-CURRENT после добавления директивы .warning для make."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6816
+#, no-wrap
+msgid "502113"
+msgstr "502113"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6817
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/130057[130057]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/130057[130057]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6818
+#, no-wrap
+msgid "June 4, 2004"
+msgstr "4 июня 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6820
+#, no-wrap
+msgid "5.2-CURRENT after `ttyioctl()` was made mandatory for serial drivers."
+msgstr "5.2-CURRENT после того, как `ttyioctl()` стал обязательным для драйверов последовательных портов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6821
+#, no-wrap
+msgid "502114"
+msgstr "502114"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6822
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/130418[130418]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/130418[130418]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6823
+#, no-wrap
+msgid "June 13, 2004"
+msgstr "13 июня 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6825
+#, no-wrap
+msgid "5.2-CURRENT after import of the ALTQ framework."
+msgstr "5.2-CURRENT после импорта инфраструктуры ALTQ."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6826
+#, no-wrap
+msgid "502115"
+msgstr "502115"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6827
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/130481[130481]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/130481[130481]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6828
+#, no-wrap
+msgid "June 14, 2004"
+msgstr "14 июня 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6830
+#, no-wrap
+msgid "5.2-CURRENT after changing man:sema_timedwait[9] to return 0 on success and a non-zero error code on failure."
+msgstr "5.2-CURRENT после изменения man:sema_timedwait[9] для возврата 0 при успехе и ненулевого кода ошибки при сбое."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6831
+#, no-wrap
+msgid "502116"
+msgstr "502116"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6832
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/130585[130585]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/130585[130585]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6833
+#, no-wrap
+msgid "June 16, 2004"
+msgstr "16 июня 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6835
+#, no-wrap
+msgid "5.2-CURRENT after changing kernel `dev_t` to be pointer to struct cdev *."
+msgstr "5.2-CURRENT после изменения типа `dev_t` в ядре на указатель на структуру cdev *."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6836
+#, no-wrap
+msgid "502117"
+msgstr "502117"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6837
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/130640[130640]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/130640[130640]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6838
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6843
+#, no-wrap
+msgid "June 17, 2004"
+msgstr "17 июня 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6840
+#, no-wrap
+msgid "5.2-CURRENT after changing kernel `udev_t` to `dev_t`."
+msgstr "5.2-CURRENT после изменения ядра `udev_t` на `dev_t`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6841
+#, no-wrap
+msgid "502118"
+msgstr "502118"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6842
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/130656[130656]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/130656[130656]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6845
+#, no-wrap
+msgid "5.2-CURRENT after adding support for CLOCK_VIRTUAL and CLOCK_PROF to man:clock_gettime[2] and man:clock_getres[2]."
+msgstr "5.2-CURRENT после добавления поддержки CLOCK_VIRTUAL и CLOCK_PROF в man:clock_gettime[2] и man:clock_getres[2]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6846
+#, no-wrap
+msgid "502119"
+msgstr "502119"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6847
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/130934[130934]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/130934[130934]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6848
+#, no-wrap
+msgid "June 22, 2004"
+msgstr "22 июня 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6850
+#, no-wrap
+msgid "5.2-CURRENT after changing network interface cloning overhaul."
+msgstr "5.2-CURRENT после изменения переработки клонирования сетевых интерфейсов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6851
+#, no-wrap
+msgid "502120"
+msgstr "502120"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6852
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/131429[131429]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/131429[131429]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6853
+#, no-wrap
+msgid "July 2, 2004"
+msgstr "2 июля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6855
+#, no-wrap
+msgid "5.2-CURRENT after the update of the package tools to revision 20040629."
+msgstr "5.2-CURRENT после обновления инструментов пакетов до ревизии 20040629."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6856
+#, no-wrap
+msgid "502121"
+msgstr "502121"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6857
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/131883[131883]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/131883[131883]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6858
+#, no-wrap
+msgid "July 9, 2004"
+msgstr "9 июля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6860
+#, no-wrap
+msgid "5.2-CURRENT after marking Bluetooth code as non-i386 specific."
+msgstr "5.2-CURRENT после пометки кода Bluetooth как не специфичного для i386."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6861
+#, no-wrap
+msgid "502122"
+msgstr "502122"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6862
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/131971[131971]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/131971[131971]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6863
+#, no-wrap
+msgid "July 11, 2004"
+msgstr "11 июля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6865
+#, no-wrap
+msgid "5.2-CURRENT after the introduction of the KDB debugger framework, the conversion of DDB into a backend and the introduction of the GDB backend."
+msgstr "5.2-CURRENT после внедрения фреймворка отладчика KDB, преобразования DDB в бэкенд и добавления бэкенда GDB."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6866
+#, no-wrap
+msgid "502123"
+msgstr "502123"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6867
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/132025[132025]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/132025[132025]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6868
+#, no-wrap
+msgid "July 12, 2004"
+msgstr "12 июля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6870
+#, no-wrap
+msgid "5.2-CURRENT after change to make VFS_ROOT take a struct thread argument as does vflush. Struct `kinfo_proc` now has a user data pointer. The switch of the default X implementation to `xorg` was also made at this time."
+msgstr "5.2-CURRENT после изменения, чтобы VFS_ROOT принимал аргумент struct thread, как и vflush. Структура `kinfo_proc` теперь содержит указатель на пользовательские данные. Переключение реализации X по умолчанию на `xorg` также произошло в это время."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6871
+#, no-wrap
+msgid "502124"
+msgstr "502124"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6872
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/132597[132597]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/132597[132597]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6873
+#, no-wrap
+msgid "July 24, 2004"
+msgstr "24 июля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6875
+#, no-wrap
+msgid "5.2-CURRENT after the change to separate the way ports rc.d and legacy scripts are started."
+msgstr "5.2-CURRENT после изменения, разделяющего способ запуска rc.d портов и устаревших скриптов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6876
+#, no-wrap
+msgid "502125"
+msgstr "502125"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6877
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/132726[132726]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/132726[132726]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6878
+#, no-wrap
+msgid "July 28, 2004"
+msgstr "28 июля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6880
+#, no-wrap
+msgid "5.2-CURRENT after the backout of the previous change."
+msgstr "5.2-CURRENT после отмены предыдущего изменения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6881
+#, no-wrap
+msgid "502126"
+msgstr "502126"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6882
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/132914[132914]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/132914[132914]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6883
+#, no-wrap
+msgid "July 31, 2004"
+msgstr "31 июля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6885
+#, no-wrap
+msgid "5.2-CURRENT after the removal of `kmem_alloc_pageable()` and the import of gcc 3.4.2."
+msgstr "5.2-CURRENT после удаления `kmem_alloc_pageable()` и импорта gcc 3.4.2."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6886
+#, no-wrap
+msgid "502127"
+msgstr "502127"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6887
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/132991[132991]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/132991[132991]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6888
+#, no-wrap
+msgid "August 2, 2004"
+msgstr "2 августа 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6890
+#, no-wrap
+msgid "5.2-CURRENT after changing the UMA kernel API to allow ctors/inits to fail."
+msgstr "5.2-CURRENT после изменения UMA API ядра для разрешения ошибок в ctors/inits."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6891
+#, no-wrap
+msgid "502128"
+msgstr "502128"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6892
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/133306[133306]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/133306[133306]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6893
+#, no-wrap
+msgid "August 8, 2004"
+msgstr "8 августа 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6895
+#, no-wrap
+msgid "5.2-CURRENT after the change of the vfs_mount signature as well as global replacement of PRISON_ROOT with SUSER_ALLOWJAIL for the man:suser[9] API."
+msgstr "5.2-CURRENT после изменения сигнатуры vfs_mount, а также глобальной замены PRISON_ROOT на SUSER_ALLOWJAIL для API man:suser[9]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6896
+#, no-wrap
+msgid "503000"
+msgstr "503000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6897
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/134189[134189]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/134189[134189]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6898
+#, no-wrap
+msgid "August 23, 2004"
+msgstr "23 августа 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6900
+#, no-wrap
+msgid "5.3-BETA/RC before the pfil API change"
+msgstr "5.3-BETA/RC до изменения API pfil"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6901
+#, no-wrap
+msgid "503001"
+msgstr "503001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6902
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/135580[135580]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/135580[135580]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6903
+#, no-wrap
+msgid "September 22, 2004"
+msgstr "22 сентября 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6905
+#, no-wrap
+msgid "5.3-RELEASE"
+msgstr "5.3-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6906
+#, no-wrap
+msgid "503100"
+msgstr "503100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6907
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/136595[136595]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/136595[136595]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6908
+#, no-wrap
+msgid "October 16, 2004"
+msgstr "16 октября 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6910
+#, no-wrap
+msgid "5.3-STABLE after branching for RELENG_5_3"
+msgstr "5.3-STABLE после ветвления для RELENG_5_3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6911
+#, no-wrap
+msgid "503101"
+msgstr "503101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6912
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/138459[138459]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/138459[138459]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6913
+#, no-wrap
+msgid "December 3, 2004"
+msgstr "3 декабря 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6915
+#, no-wrap
+msgid "5.3-STABLE after addition of glibc style man:strftime[3] padding options."
+msgstr "5.3-STABLE после добавления опций заполнения man:strftime[3] в стиле glibc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6916
+#, no-wrap
+msgid "503102"
+msgstr "503102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6917
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/141788[141788]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/141788[141788]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6918
+#, no-wrap
+msgid "February 13, 2005"
+msgstr "13 февраля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6920
+#, no-wrap
+msgid "5.3-STABLE after OpenBSD's man:nc[1] import MFC."
+msgstr "5.3-STABLE после импорта man:nc[1] из OpenBSD MFC."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6921
+#, no-wrap
+msgid "503103"
+msgstr "503103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6922
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/142639[142639]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/142639[142639]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6925
+#, no-wrap
+msgid "5.4-PRERELEASE after the MFC of the fixes in [.filename]#<src/include/stdbool.h># and [.filename]#<src/sys/i386/include/_types.h># for using the GCC-compatibility of the Intel C/C++ compiler."
+msgstr "5.4-PRERELEASE после MFC исправлений в [.filename]#<src/include/stdbool.h># и [.filename]#<src/sys/i386/include/_types.h># для обеспечения совместимости с GCC компилятора Intel C/C++."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6926
+#, no-wrap
+msgid "503104"
+msgstr "503104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6927
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/142835[142835]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/142835[142835]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6930
+#, no-wrap
+msgid "5.4-PRERELEASE after the MFC of the change of `ifi_epoch` from wall clock time to uptime."
+msgstr "5.4-PRERELEASE после MFC изменения `ifi_epoch` с времени реального мира на время работы системы."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6931
+#, no-wrap
+msgid "503105"
+msgstr "503105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6932
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/143029[143029]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/143029[143029]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6933
+#, no-wrap
+msgid "March 2, 2005"
+msgstr "2 марта 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6935
+#, no-wrap
+msgid "5.4-PRERELEASE after the MFC of the fix of EOVERFLOW check in man:vswprintf[3]."
+msgstr "5.4-PRERELEASE после переноса исправления проверки EOVERFLOW в man:vswprintf[3]."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6936
+#, no-wrap
+msgid "504000"
+msgstr "504000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6937
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/144575[144575]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/144575[144575]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6938
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6943
+#, no-wrap
+msgid "April 3, 2005"
+msgstr "3 апреля 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6940
+#, no-wrap
+msgid "5.4-RELEASE."
+msgstr "5.4-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6941
+#, no-wrap
+msgid "504100"
+msgstr "504100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6942
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/144581[144581]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/144581[144581]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6945
+#, no-wrap
+msgid "5.4-STABLE after branching for RELENG_5_4"
+msgstr "5.4-STABLE после ветвления для RELENG_5_4"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6946
+#, no-wrap
+msgid "504101"
+msgstr "504101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6947
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/146105[146105]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/146105[146105]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6948
+#, no-wrap
+msgid "May 11, 2005"
+msgstr "11 мая 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6950
+#, no-wrap
+msgid "5.4-STABLE after increasing the default thread stacksizes"
+msgstr "5.4-STABLE после увеличения размеров стеков потоков по умолчанию"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6951
+#, no-wrap
+msgid "504102"
+msgstr "504102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6952
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/504101[504101]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/504101[504101]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6953
+#, no-wrap
+msgid "June 24, 2005"
+msgstr "24 июня 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6955
+#, no-wrap
+msgid "5.4-STABLE after the addition of sha256"
+msgstr "5.4-STABLE после добавления sha256"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6956
+#, no-wrap
+msgid "504103"
+msgstr "504103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6957
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/150892[150892]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/150892[150892]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6958
+#, no-wrap
+msgid "October 3, 2005"
+msgstr "3 октября 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6960
+#, no-wrap
+msgid "5.4-STABLE after the MFC of if_bridge"
+msgstr "5.4-STABLE после слияния изменений (MFC) if_bridge"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6961
+#, no-wrap
+msgid "504104"
+msgstr "504104"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6962
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/152370[152370]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/152370[152370]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6963
+#, no-wrap
+msgid "November 13, 2005"
+msgstr "13 ноября 2005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6965
+#, no-wrap
+msgid "5.4-STABLE after the MFC of bsdiff and portsnap"
+msgstr "5.4-STABLE после слияния изменений (MFC) bsdiff и portsnap"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6966
+#, no-wrap
+msgid "504105"
+msgstr "504105"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6967
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/154464[154464]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/154464[154464]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6970
+#, no-wrap
+msgid "5.4-STABLE after MFC of ldconfig_local_dirs change."
+msgstr "5.4-STABLE после MFC изменений ldconfig_local_dirs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6971
+#, no-wrap
+msgid "505000"
+msgstr "505000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6972
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/158481[158481]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/158481[158481]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6973
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6978
+#, no-wrap
+msgid "May 12, 2006"
+msgstr "12 мая 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6975
+#, no-wrap
+msgid "5.5-RELEASE."
+msgstr "5.5-RELEASE."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6976
+#, no-wrap
+msgid "505100"
+msgstr "505100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6977
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/158482[158482]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/158482[158482]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6979
+#, no-wrap
+msgid "5.5-STABLE after branching for RELENG_5_5"
+msgstr "5.5-STABLE после ветвления для RELENG_5_5"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6982
+#, no-wrap
+msgid "FreeBSD 4 Versions"
+msgstr "Версии FreeBSD 4"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6985
+#, no-wrap
+msgid "FreeBSD 4 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` в FreeBSD 4"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6994
+#, no-wrap
+msgid "400000"
+msgstr "400000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6995
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/43041[43041]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/43041[43041]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6996
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7389
+#, no-wrap
+msgid "January 22, 1999"
+msgstr "22 января 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6998
+#, no-wrap
+msgid "4.0-CURRENT after 3.4 branch"
+msgstr "4.0-CURRENT после ветки 3.4"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:6999
+#, no-wrap
+msgid "400001"
+msgstr "400001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7000
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/44177[44177]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/44177[44177]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7001
+#, no-wrap
+msgid "February 20, 1999"
+msgstr "20 февраля 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7003
+#, no-wrap
+msgid "4.0-CURRENT after change in dynamic linker handling"
+msgstr "4.0-CURRENT после изменения в обработке динамического компоновщика"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7004
+#, no-wrap
+msgid "400002"
+msgstr "400002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7005
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/44699[44699]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/44699[44699]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7006
+#, no-wrap
+msgid "March 13, 1999"
+msgstr "13 марта 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7008
+#, no-wrap
+msgid "4.0-CURRENT after C++ constructor/destructor order change"
+msgstr "4.0-CURRENT после изменения порядка конструкторов/деструкторов C++"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7009
+#, no-wrap
+msgid "400003"
+msgstr "400003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7010
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/45059[45059]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/45059[45059]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7011
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7399
+#, no-wrap
+msgid "March 27, 1999"
+msgstr "27 марта 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7013
+#, no-wrap
+msgid "4.0-CURRENT after functioning man:dladdr[3]"
+msgstr "4.0-CURRENT после функционирования man:dladdr[3]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7014
+#, no-wrap
+msgid "400004"
+msgstr "400004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7015
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/45321[45321]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/45321[45321]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7016
+#, no-wrap
+msgid "April 5, 1999"
+msgstr "5 апреля 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7018
+#, no-wrap
+msgid "4.0-CURRENT after `__deregister_frame_info` dynamic linker bug fix (also 4.0-CURRENT after EGCS 1.1.2 integration)"
+msgstr "4.0-CURRENT после исправления ошибки динамического компоновщика `__deregister_frame_info` (также 4.0-CURRENT после интеграции EGCS 1.1.2)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7019
+#, no-wrap
+msgid "400005"
+msgstr "400005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7020
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/46113[46113]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/46113[46113]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7021
+#, no-wrap
+msgid "April 27, 1999"
+msgstr "27 апреля 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7023
+#, no-wrap
+msgid "4.0-CURRENT after man:suser[9] API change (also 4.0-CURRENT after newbus)"
+msgstr "4.0-CURRENT после изменения API man:suser[9] (также 4.0-CURRENT после newbus)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7024
+#, no-wrap
+msgid "400006"
+msgstr "400006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7025
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/47640[47640]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/47640[47640]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7026
+#, no-wrap
+msgid "May 31, 1999"
+msgstr "31 мая 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7028
+#, no-wrap
+msgid "4.0-CURRENT after cdevsw registration change"
+msgstr "4.0-CURRENT после изменения регистрации cdevsw"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7029
+#, no-wrap
+msgid "400007"
+msgstr "400007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7030
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/47992[47992]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/47992[47992]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7031
+#, no-wrap
+msgid "June 17, 1999"
+msgstr "17 июня 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7033
+#, no-wrap
+msgid "4.0-CURRENT after the addition of `so_cred` for socket level credentials"
+msgstr "4.0-CURRENT после добавления `so_cred` для учётных данных на уровне сокета"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7034
+#, no-wrap
+msgid "400008"
+msgstr "400008"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7035
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/48048[48048]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/48048[48048]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7036
+#, no-wrap
+msgid "June 20, 1999"
+msgstr "20 июня 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7038
+#, no-wrap
+msgid "4.0-CURRENT after the addition of a poll syscall wrapper to libc_r"
+msgstr "4.0-CURRENT после добавления обёртки системного вызова poll в libc_r"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7039
+#, no-wrap
+msgid "400009"
+msgstr "400009"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7040
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/48936[48936]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/48936[48936]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7041
+#, no-wrap
+msgid "July 20, 1999"
+msgstr "20 июля 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7043
+#, no-wrap
+msgid "4.0-CURRENT after the change of the kernel's `dev_t` type to `struct specinfo` pointer"
+msgstr "4.0-CURRENT после изменения типа `dev_t` ядра на указатель `struct specinfo`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7044
+#, no-wrap
+msgid "400010"
+msgstr "400010"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7045
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/51649[51649]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/51649[51649]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7046
+#, no-wrap
+msgid "September 25, 1999"
+msgstr "25 сентября 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7048
+#, no-wrap
+msgid "4.0-CURRENT after fixing a hole in man:jail[2]"
+msgstr "4.0-CURRENT после исправления уязвимости в man:jail[2]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7049
+#, no-wrap
+msgid "400011"
+msgstr "400011"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7050
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/51791[51791]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/51791[51791]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7051
+#, no-wrap
+msgid "September 29, 1999"
+msgstr "29 сентября 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7053
+#, no-wrap
+msgid "4.0-CURRENT after the `sigset_t` datatype change"
+msgstr "4.0-CURRENT после изменения типа данных `sigset_t`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7054
+#, no-wrap
+msgid "400012"
+msgstr "400012"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7055
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/53164[53164]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/53164[53164]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7056
+#, no-wrap
+msgid "November 15, 1999"
+msgstr "15 ноября 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7058
+#, no-wrap
+msgid "4.0-CURRENT after the cutover to the GCC 2.95.2 compiler"
+msgstr "4.0-CURRENT после перехода на компилятор GCC 2.95.2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7059
+#, no-wrap
+msgid "400013"
+msgstr "400013"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7060
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/54123[54123]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/54123[54123]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7061
+#, no-wrap
+msgid "December 4, 1999"
+msgstr "4 декабря 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7063
+#, no-wrap
+msgid "4.0-CURRENT after adding pluggable linux-mode ioctl handlers"
+msgstr "4.0-CURRENT после добавления подключаемых обработчиков ioctl в режиме linux"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7064
+#, no-wrap
+msgid "400014"
+msgstr "400014"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7065
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/56216[56216]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/56216[56216]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7066
+#, no-wrap
+msgid "January 18, 2000"
+msgstr "18 января 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7068
+#, no-wrap
+msgid "4.0-CURRENT after importing OpenSSL"
+msgstr "4.0-CURRENT после импорта OpenSSL"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7069
+#, no-wrap
+msgid "400015"
+msgstr "400015"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7070
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/56700[56700]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/56700[56700]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7071
+#, no-wrap
+msgid "January 27, 2000"
+msgstr "27 января 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7073
+#, no-wrap
+msgid "4.0-CURRENT after the C++ ABI change in GCC 2.95.2 from -fvtable-thunks to -fno-vtable-thunks by default"
+msgstr "4.0-CURRENT после изменения ABI C++ в GCC 2.95.2 с -fvtable-thunks на -fno-vtable-thunks по умолчанию"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7074
+#, no-wrap
+msgid "400016"
+msgstr "400016"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7075
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/57529[57529]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/57529[57529]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7076
+#, no-wrap
+msgid "February 27, 2000"
+msgstr "27 февраля 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7078
+#, no-wrap
+msgid "4.0-CURRENT after importing OpenSSH"
+msgstr "4.0-CURRENT после импорта OpenSSH"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7079
+#, no-wrap
+msgid "400017"
+msgstr "400017"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7080
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/58005[58005]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/58005[58005]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7083
+#, no-wrap
+msgid "4.0-RELEASE"
+msgstr "4.0-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7084
+#, no-wrap
+msgid "400018"
+msgstr "400018"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7085
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/58170[58170]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/58170[58170]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7086
+#, no-wrap
+msgid "March 17, 2000"
+msgstr "17 марта 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7088
+#, no-wrap
+msgid "4.0-STABLE after 4.0-RELEASE"
+msgstr "4.0-STABLE после 4.0-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7089
+#, no-wrap
+msgid "400019"
+msgstr "400019"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7090
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/60047[60047]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/60047[60047]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7091
+#, no-wrap
+msgid "May 5, 2000"
+msgstr "5 мая 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7093
+#, no-wrap
+msgid "4.0-STABLE after the introduction of delayed checksums."
+msgstr "4.0-STABLE после введения отложенных контрольных сумм."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7094
+#, no-wrap
+msgid "400020"
+msgstr "400020"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7095
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/61262[61262]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/61262[61262]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7096
+#, no-wrap
+msgid "June 4, 2000"
+msgstr "4 июня 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7098
+#, no-wrap
+msgid "4.0-STABLE after merging libxpg4 code into libc."
+msgstr "4.0-STABLE после объединения кода libxpg4 в libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7099
+#, no-wrap
+msgid "400021"
+msgstr "400021"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7100
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/62820[62820]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/62820[62820]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7101
+#, no-wrap
+msgid "July 8, 2000"
+msgstr "8 июля 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7103
+#, no-wrap
+msgid "4.0-STABLE after upgrading Binutils to 2.10.0, ELF branding changes, and tcsh in the base system."
+msgstr "4.0-STABLE после обновления Binutils до 2.10.0, изменения маркировки ELF и tcsh в базовой системе."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7104
+#, no-wrap
+msgid "410000"
+msgstr "410000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7105
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/63095[63095]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/63095[63095]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7108
+#, no-wrap
+msgid "4.1-RELEASE"
+msgstr "4.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7109
+#, no-wrap
+msgid "410001"
+msgstr "410001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7110
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/64012[64012]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/64012[64012]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7111
+#, no-wrap
+msgid "July 29, 2000"
+msgstr "29 июля 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7113
+#, no-wrap
+msgid "4.1-STABLE after 4.1-RELEASE"
+msgstr "4.1-STABLE после 4.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7114
+#, no-wrap
+msgid "410002"
+msgstr "410002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7115
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/65962[65962]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/65962[65962]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7116
+#, no-wrap
+msgid "September 16, 2000"
+msgstr "16 сентября 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7118
+#, no-wrap
+msgid "4.1-STABLE after man:setproctitle[3] moved from libutil to libc."
+msgstr "4.1-STABLE после перемещения man:setproctitle[3] из libutil в libc."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7119
+#, no-wrap
+msgid "411000"
+msgstr "411000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7120
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/66336[66336]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/66336[66336]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7121
+#, no-wrap
+msgid "September 25, 2000"
+msgstr "25 сентября 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7123
+#, no-wrap
+msgid "4.1.1-RELEASE"
+msgstr "4.1.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7124
+#, no-wrap
+msgid "411001"
+msgstr "411001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7128
+#, no-wrap
+msgid "4.1.1-STABLE after 4.1.1-RELEASE"
+msgstr "4.1.1-STABLE после 4.1.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7129
+#, no-wrap
+msgid "420000"
+msgstr "420000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7130
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/68066[68066]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/68066[68066]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7131
+#, no-wrap
+msgid "October 31, 2000"
+msgstr "31 октября 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7133
+#, no-wrap
+msgid "4.2-RELEASE"
+msgstr "4.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7134
+#, no-wrap
+msgid "420001"
+msgstr "420001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7135
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/70895[70895]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/70895[70895]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7138
+#, no-wrap
+msgid "4.2-STABLE after combining libgcc.a and libgcc_r.a, and associated GCC linkage changes."
+msgstr "4.2-STABLE после объединения libgcc.a и libgcc_r.a, а также связанных изменений в компоновке GCC."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7139
+#, no-wrap
+msgid "430000"
+msgstr "430000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7140
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/73800[73800]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/73800[73800]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7141
+#, no-wrap
+msgid "March 6, 2001"
+msgstr "6 марта 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7143
+#, no-wrap
+msgid "4.3-RELEASE"
+msgstr "4.3-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7144
+#, no-wrap
+msgid "430001"
+msgstr "430001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7145
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/76779[76779]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/76779[76779]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7146
+#, no-wrap
+msgid "May 18, 2001"
+msgstr "18 мая 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7148
+#, no-wrap
+msgid "4.3-STABLE after `wint_t` introduction."
+msgstr "4.3-STABLE после введения `wint_t`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7149
+#, no-wrap
+msgid "430002"
+msgstr "430002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7150
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/80157[80157]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/80157[80157]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7151
+#, no-wrap
+msgid "July 22, 2001"
+msgstr "22 июля 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7153
+#, no-wrap
+msgid "4.3-STABLE after PCI powerstate API merge."
+msgstr "4.3-STABLE после объединения API управления состоянием питания PCI."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7154
+#, no-wrap
+msgid "440000"
+msgstr "440000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7155
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/80923[80923]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/80923[80923]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7156
+#, no-wrap
+msgid "August 1, 2001"
+msgstr "1 августа 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7158
+#, no-wrap
+msgid "4.4-RELEASE"
+msgstr "4.4-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7159
+#, no-wrap
+msgid "440001"
+msgstr "440001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7160
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/85341[85341]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/85341[85341]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7161
+#, no-wrap
+msgid "October 23, 2001"
+msgstr "23 октября 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7163
+#, no-wrap
+msgid "4.4-STABLE after `d_thread_t` introduction."
+msgstr "4.4-STABLE после введения `d_thread_t`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7164
+#, no-wrap
+msgid "440002"
+msgstr "440002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7165
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/86038[86038]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/86038[86038]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7166
+#, no-wrap
+msgid "November 4, 2001"
+msgstr "4 ноября 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7168
+#, no-wrap
+msgid "4.4-STABLE after mount structure changes (affects filesystem klds)."
+msgstr "4.4-STABLE после изменений в структуре монтирования (затрагивает модули файловых систем klds)."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7169
+#, no-wrap
+msgid "440003"
+msgstr "440003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7170
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/88130[88130]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/88130[88130]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7171
+#, no-wrap
+msgid "December 18, 2001"
+msgstr "18 декабря 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7173
+#, no-wrap
+msgid "4.4-STABLE after the userland components of smbfs were imported."
+msgstr "4.4-STABLE после импорта компонентов пользовательского пространства smbfs."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7174
+#, no-wrap
+msgid "450000"
+msgstr "450000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7175
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/88271[88271]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/88271[88271]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7176
+#, no-wrap
+msgid "December 20, 2001"
+msgstr "20 декабря 2001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7178
+#, no-wrap
+msgid "4.5-RELEASE"
+msgstr "4.5-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7179
+#, no-wrap
+msgid "450001"
+msgstr "450001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7183
+#, no-wrap
+msgid "4.5-STABLE after the usb structure element rename."
+msgstr "4.5-STABLE после переименования элемента структуры usb."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7184
+#, no-wrap
+msgid "450002"
+msgstr "450002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7185
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/92151[92151]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/92151[92151]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7186
+#, no-wrap
+msgid "March 12, 2002"
+msgstr "12 марта 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7188
+#, no-wrap
+msgid "4.5-STABLE after locale changes."
+msgstr "4.5-STABLE после изменений локали."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7189
+#, no-wrap
+msgid "450003"
+msgstr "450003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7193
+#, no-wrap
+msgid "(Never created)"
+msgstr "(Никогда не создавался)"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7194
+#, no-wrap
+msgid "450004"
+msgstr "450004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7195
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/94840[94840]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/94840[94840]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7196
+#, no-wrap
+msgid "April 16, 2002"
+msgstr "16 апреля 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7198
+#, no-wrap
+msgid "4.5-STABLE after the `sendmail_enable` man:rc.conf[5] variable was made to take the value `NONE`."
+msgstr "4.5-STABLE после того, как переменная `sendmail_enable` из man:rc.conf[5] стала принимать значение `NONE`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7199
+#, no-wrap
+msgid "450005"
+msgstr "450005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7200
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/95555[95555]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/95555[95555]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7201
+#, no-wrap
+msgid "April 27, 2002"
+msgstr "27 апреля 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7203
+#, no-wrap
+msgid "4.5-STABLE after moving to XFree86 4 by default for package builds."
+msgstr "4.5-STABLE после перехода на XFree86 4 по умолчанию для сборки пакетов."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7204
+#, no-wrap
+msgid "450006"
+msgstr "450006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7205
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/95846[95846]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/95846[95846]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7206
+#, no-wrap
+msgid "May 1, 2002"
+msgstr "1 мая 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7208
+#, no-wrap
+msgid "4.5-STABLE after accept filtering was fixed so that is no longer susceptible to an easy DoS."
+msgstr "4.5-STABLE после исправления фильтрации accept, чтобы он больше не был подвержен простой DoS-атаке."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7209
+#, no-wrap
+msgid "460000"
+msgstr "460000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7210
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/97923[97923]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/97923[97923]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7211
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7216
+#, no-wrap
+msgid "June 21, 2002"
+msgstr "21 июня 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7213
+#, no-wrap
+msgid "4.6-RELEASE"
+msgstr "4.6-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7214
+#, no-wrap
+msgid "460001"
+msgstr "460001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7215
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/98730[98730]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/98730[98730]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7218
+#, no-wrap
+msgid "4.6-STABLE man:sendfile[2] fixed to comply with documentation, not to count any headers sent against the amount of data to be sent from the file."
+msgstr "4.6-STABLE man:sendfile[2] исправлен для соответствия документации, чтобы не учитывать отправленные заголовки в объеме данных, отправляемых из файла."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7219
+#, no-wrap
+msgid "460002"
+msgstr "460002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7220
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/100366[100366]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/100366[100366]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7221
+#, no-wrap
+msgid "July 19, 2002"
+msgstr "19 июля 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7223
+#, no-wrap
+msgid "4.6.2-RELEASE"
+msgstr "4.6.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7224
+#, no-wrap
+msgid "460100"
+msgstr "460100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7225
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/98857[98857]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/98857[98857]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7226
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7231
+#, no-wrap
+msgid "June 26, 2002"
+msgstr "26 июня 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7228
+#, no-wrap
+msgid "4.6-STABLE"
+msgstr "4.6-STABLE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7229
+#, no-wrap
+msgid "460101"
+msgstr "460101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7230
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/98880[98880]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/98880[98880]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7233
+#, no-wrap
+msgid "4.6-STABLE after MFC of `sed -i`."
+msgstr "4.6-STABLE после MFC `sed -i`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7234
+#, no-wrap
+msgid "460102"
+msgstr "460102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7235
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/102759[102759]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/102759[102759]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7238
+#, no-wrap
+msgid "4.6-STABLE after MFC of many new pkg_install features from the HEAD."
+msgstr "4.6-STABLE после MFC множества новых функций pkg_install из HEAD."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7239
+#, no-wrap
+msgid "470000"
+msgstr "470000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7240
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/104655[104655]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/104655[104655]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7241
+#, no-wrap
+msgid "October 8, 2002"
+msgstr "8 октября 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7243
+#, no-wrap
+msgid "4.7-RELEASE"
+msgstr "4.7-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7244
+#, no-wrap
+msgid "470100"
+msgstr "470100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7245
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/104717[104717]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/104717[104717]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7246
+#, no-wrap
+msgid "October 9, 2002"
+msgstr "9 октября 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7248
+#, no-wrap
+msgid "4.7-STABLE"
+msgstr "4.7-STABLE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7249
+#, no-wrap
+msgid "470101"
+msgstr "470101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7250
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/106732[106732]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/106732[106732]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7251
+#, no-wrap
+msgid "November 10, 2002"
+msgstr "10 ноября 2002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7253
+#, no-wrap
+msgid "Start generated __std{in,out,err}p references rather than __sF. This changes std{in,out,err} from a compile time expression to a runtime one."
+msgstr "Начинать генерировать ссылки `__std{in,out,err}p` вместо `__sF`. Это изменяет `std{in,out,err}` с выражения времени компиляции на выражение времени выполнения."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7254
+#, no-wrap
+msgid "470102"
+msgstr "470102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7255
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/109753[109753]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/109753[109753]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7256
+#, no-wrap
+msgid "January 23, 2003"
+msgstr "23 января 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7258
+#, no-wrap
+msgid "4.7-STABLE after MFC of mbuf changes to replace `m_aux` mbufs by `m_tag`'s"
+msgstr "4.7-STABLE после MFC изменений mbuf для замены `m_aux` mbuf на `m_tag`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7259
+#, no-wrap
+msgid "470103"
+msgstr "470103"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7260
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/110887[110887]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/110887[110887]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7261
+#, no-wrap
+msgid "February 14, 2003"
+msgstr "14 февраля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7263
+#, no-wrap
+msgid "4.7-STABLE gets OpenSSL 0.9.7"
+msgstr "4.7-STABLE получает OpenSSL 0.9.7"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7264
+#, no-wrap
+msgid "480000"
+msgstr "480000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7265
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/112852[112852]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/112852[112852]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7266
+#, no-wrap
+msgid "March 30, 2003"
+msgstr "30 марта 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7268
+#, no-wrap
+msgid "4.8-RELEASE"
+msgstr "4.8-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7269
+#, no-wrap
+msgid "480100"
+msgstr "480100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7270
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/113107[113107]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/113107[113107]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7271
+#, no-wrap
+msgid "April 5, 2003"
+msgstr "5 апреля 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7273
+#, no-wrap
+msgid "4.8-STABLE"
+msgstr "4.8-STABLE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7274
+#, no-wrap
+msgid "480101"
+msgstr "480101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7275
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/115232[115232]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/115232[115232]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7276
+#, no-wrap
+msgid "May 22, 2003"
+msgstr "22 мая 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7278
+#, no-wrap
+msgid "4.8-STABLE after man:realpath[3] has been made thread-safe"
+msgstr "4.8-STABLE после того, как man:realpath[3] стал потокобезопасным"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7279
+#, no-wrap
+msgid "480102"
+msgstr "480102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7280
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/118737[118737]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/118737[118737]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7281
+#, no-wrap
+msgid "August 10, 2003"
+msgstr "10 августа 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7283
+#, no-wrap
+msgid "4.8-STABLE 3ware API changes to twe."
+msgstr "4.8-STABLE Изменения API 3ware в twe."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7284
+#, no-wrap
+msgid "490000"
+msgstr "490000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7285
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/121592[121592]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/121592[121592]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7286
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7291
+#, no-wrap
+msgid "October 27, 2003"
+msgstr "27 октября 2003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7288
+#, no-wrap
+msgid "4.9-RELEASE"
+msgstr "4.9-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7289
+#, no-wrap
+msgid "490100"
+msgstr "490100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7290
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/121593[121593]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/121593[121593]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7293
+#, no-wrap
+msgid "4.9-STABLE"
+msgstr "4.9-STABLE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7294
+#, no-wrap
+msgid "490101"
+msgstr "490101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7295
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/124264[124264]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/124264[124264]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7296
+#, no-wrap
+msgid "January 8, 2004"
+msgstr "8 января 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7298
+#, no-wrap
+msgid "4.9-STABLE after `e_sid` was added to struct `kinfo_eproc`."
+msgstr "4.9-STABLE после добавления `e_sid` в структуру `kinfo_eproc`."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7299
+#, no-wrap
+msgid "490102"
+msgstr "490102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7300
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/125417[125417]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/125417[125417]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7301
+#, no-wrap
+msgid "February 4, 2004"
+msgstr "4 февраля 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7303
+#, no-wrap
+msgid "4.9-STABLE after MFC of libmap functionality for rtld."
+msgstr "4.9-STABLE после MFC функциональности libmap для rtld."
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7304
+#, no-wrap
+msgid "491000"
+msgstr "491000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7305
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/129700[129700]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/129700[129700]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7306
+#, no-wrap
+msgid "May 25, 2004"
+msgstr "25 мая 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7308
+#, no-wrap
+msgid "4.10-RELEASE"
+msgstr "4.10-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7309
+#, no-wrap
+msgid "491100"
+msgstr "491100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7310
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/129918[129918]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/129918[129918]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7311
+#, no-wrap
+msgid "June 1, 2004"
+msgstr "1 июня 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7313
+#, no-wrap
+msgid "4.10-STABLE"
+msgstr "4.10-STABLE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7314
+#, no-wrap
+msgid "491101"
+msgstr "491101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7315
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/133506[133506]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/133506[133506]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7316
+#, no-wrap
+msgid "August 11, 2004"
+msgstr "11 августа 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7318
+#, no-wrap
+msgid "4.10-STABLE after MFC of revision 20040629 of the package tools"
+msgstr "4.10-STABLE после слияния изменения из ревизии 20040629 пакета tools"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7319
+#, no-wrap
+msgid "491102"
+msgstr "491102"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7320
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/137786[137786]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/137786[137786]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7321
+#, no-wrap
+msgid "November 16, 2004"
+msgstr "16 ноября 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7323
+#, no-wrap
+msgid "4.10-STABLE after VM fix dealing with unwiring of fictitious pages"
+msgstr "4.10-STABLE после исправления VM, связанного с обработкой размонтирования фиктивных страниц"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7324
+#, no-wrap
+msgid "492000"
+msgstr "492000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7325
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/138960[138960]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/138960[138960]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7326
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7331
+#, no-wrap
+msgid "December 17, 2004"
+msgstr "17 декабря 2004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7328
+#, no-wrap
+msgid "4.11-RELEASE"
+msgstr "4.11-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7329
+#, no-wrap
+msgid "492100"
+msgstr "492100"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7330
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/138959[138959]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/138959[138959]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7333
+#, no-wrap
+msgid "4.11-STABLE"
+msgstr "4.11-STABLE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7334
+#, no-wrap
+msgid "492101"
+msgstr "492101"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7335
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/157843[157843]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/157843[157843]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7336
+#, no-wrap
+msgid "April 18, 2006"
+msgstr "18 апреля 2006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7337
+#, no-wrap
+msgid "4.11-STABLE after adding libdata/ldconfig directories to mtree files."
+msgstr "4.11-STABLE после добавления каталогов libdata/ldconfig в файлы mtree."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7340
+#, no-wrap
+msgid "FreeBSD 3 Versions"
+msgstr "Версии FreeBSD 3"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7343
+#, no-wrap
+msgid "FreeBSD 3 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` для FreeBSD 3"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7352
+#, no-wrap
+msgid "300000"
+msgstr "300000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7353
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/22917[22917]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/22917[22917]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7354
+#, no-wrap
+msgid "February 19, 1996"
+msgstr "19 февраля 1996"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7356
+#, no-wrap
+msgid "3.0-CURRENT before man:mount[2] change"
+msgstr "3.0-CURRENT до изменения man:mount[2]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7357
+#, no-wrap
+msgid "300001"
+msgstr "300001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7358
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/36283[36283]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/36283[36283]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7359
+#, no-wrap
+msgid "September 24, 1997"
+msgstr "24 сентября 1997"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7361
+#, no-wrap
+msgid "3.0-CURRENT after man:mount[2] change"
+msgstr "3.0-CURRENT после изменения man:mount[2]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7362
+#, no-wrap
+msgid "300002"
+msgstr "300002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7363
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/36592[36592]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/36592[36592]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7364
+#, no-wrap
+msgid "June 2, 1998"
+msgstr "2 июня 1998"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7366
+#, no-wrap
+msgid "3.0-CURRENT after man:semctl[2] change"
+msgstr "3.0-CURRENT после изменения man:semctl[2]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7367
+#, no-wrap
+msgid "300003"
+msgstr "300003"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7368
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/36735[36735]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/36735[36735]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7369
+#, no-wrap
+msgid "June 7, 1998"
+msgstr "7 июня 1998"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7371
+#, no-wrap
+msgid "3.0-CURRENT after ioctl arg changes"
+msgstr "3.0-CURRENT после изменений аргументов ioctl"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7372
+#, no-wrap
+msgid "300004"
+msgstr "300004"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7373
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/38768[38768]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/38768[38768]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7374
+#, no-wrap
+msgid "September 3, 1998"
+msgstr "3 сентября 1998"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7376
+#, no-wrap
+msgid "3.0-CURRENT after ELF conversion"
+msgstr "3.0-CURRENT после преобразования в ELF"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7377
+#, no-wrap
+msgid "300005"
+msgstr "300005"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7378
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/40438[40438]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/40438[40438]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7379
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7384
+#, no-wrap
+msgid "October 16, 1998"
+msgstr "16 октября 1998"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7381
+#, no-wrap
+msgid "3.0-RELEASE"
+msgstr "3.0-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7382
+#, no-wrap
+msgid "300006"
+msgstr "300006"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7383
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/40445[40445]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/40445[40445]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7386
+#, no-wrap
+msgid "3.0-CURRENT after 3.0-RELEASE"
+msgstr "3.0-CURRENT после 3.0-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7387
+#, no-wrap
+msgid "300007"
+msgstr "300007"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7388
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/43042[43042]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/43042[43042]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7391
+#, no-wrap
+msgid "3.0-STABLE after 3/4 branch"
+msgstr "3.0-STABLE после ветвления 3/4"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7392
+#, no-wrap
+msgid "310000"
+msgstr "310000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7393
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/43807[43807]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/43807[43807]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7394
+#, no-wrap
+msgid "February 9, 1999"
+msgstr "9 февраля 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7396
+#, no-wrap
+msgid "3.1-RELEASE"
+msgstr "3.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7397
+#, no-wrap
+msgid "310001"
+msgstr "310001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7398
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/45060[45060]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/45060[45060]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7401
+#, no-wrap
+msgid "3.1-STABLE after 3.1-RELEASE"
+msgstr "3.1-STABLE после 3.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7402
+#, no-wrap
+msgid "310002"
+msgstr "310002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7403
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/45689[45689]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/45689[45689]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7404
+#, no-wrap
+msgid "April 14, 1999"
+msgstr "14 апреля 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7406
+#, no-wrap
+msgid "3.1-STABLE after C++ constructor/destructor order change"
+msgstr "3.1-STABLE после изменения порядка конструкторов/деструкторов C++"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7407
+#, no-wrap
+msgid "320000"
+msgstr "320000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7411
+#, no-wrap
+msgid "3.2-RELEASE"
+msgstr "3.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7412
+#, no-wrap
+msgid "320001"
+msgstr "320001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7413
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/46742[46742]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/46742[46742]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7414
+#, no-wrap
+msgid "May 8, 1999"
+msgstr "8 мая 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7416
+#, no-wrap
+msgid "3.2-STABLE"
+msgstr "3.2-STABLE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7417
+#, no-wrap
+msgid "320002"
+msgstr "320002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7418
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/50563[50563]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/50563[50563]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7419
+#, no-wrap
+msgid "August 29, 1999"
+msgstr "29 августа 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7421
+#, no-wrap
+msgid "3.2-STABLE after binary-incompatible IPFW and socket changes"
+msgstr "3.2-STABLE после бинарно-несовместимых изменений в IPFW и сокетах"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7422
+#, no-wrap
+msgid "330000"
+msgstr "330000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7423
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/50813[50813]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/50813[50813]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7424
+#, no-wrap
+msgid "September 2, 1999"
+msgstr "2 сентября 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7426
+#, no-wrap
+msgid "3.3-RELEASE"
+msgstr "3.3-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7427
+#, no-wrap
+msgid "330001"
+msgstr "330001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7428
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/51328[51328]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/51328[51328]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7429
+#, no-wrap
+msgid "September 16, 1999"
+msgstr "16 сентября 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7431
+#, no-wrap
+msgid "3.3-STABLE"
+msgstr "3.3-STABLE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7432
+#, no-wrap
+msgid "330002"
+msgstr "330002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7433
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/53671[53671]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/53671[53671]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7434
+#, no-wrap
+msgid "November 24, 1999"
+msgstr "24 ноября 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7436
+#, no-wrap
+msgid "3.3-STABLE after adding man:mkstemp[3] to libc"
+msgstr "3.3-STABLE после добавления man:mkstemp[3] в libc"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7437
+#, no-wrap
+msgid "340000"
+msgstr "340000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7438
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/54166[54166]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/54166[54166]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7439
+#, no-wrap
+msgid "December 5, 1999"
+msgstr "5 декабря 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7441
+#, no-wrap
+msgid "3.4-RELEASE"
+msgstr "3.4-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7442
+#, no-wrap
+msgid "340001"
+msgstr "340001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7443
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/54730[54730]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/54730[54730]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7444
+#, no-wrap
+msgid "December 17, 1999"
+msgstr "17 декабря 1999"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7446
+#, no-wrap
+msgid "3.4-STABLE"
+msgstr "3.4-STABLE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7447
+#, no-wrap
+msgid "350000"
+msgstr "350000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7448
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/61876[61876]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/61876[61876]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7449
+#, no-wrap
+msgid "June 20, 2000"
+msgstr "20 июня 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7451
+#, no-wrap
+msgid "3.5-RELEASE"
+msgstr "3.5-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7452
+#, no-wrap
+msgid "350001"
+msgstr "350001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7453
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/63043[63043]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/63043[63043]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7454
+#, no-wrap
+msgid "July 12, 2000"
+msgstr "12 июля 2000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7455
+#, no-wrap
+msgid "3.5-STABLE"
+msgstr "3.5-STABLE"
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7458
+#, no-wrap
+msgid "FreeBSD 2.2 Versions"
+msgstr "Версии FreeBSD 2.2"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7461
+#, no-wrap
+msgid "FreeBSD 2.2 `__FreeBSD_version` Values"
+msgstr "Значения `__FreeBSD_version` в FreeBSD 2.2"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7470
+#, no-wrap
+msgid "220000"
+msgstr "220000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7471
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/22918[22918]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/22918[22918]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7472
+#, no-wrap
+msgid "February 19, 1997"
+msgstr "19 февраля 1997"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7474
+#, no-wrap
+msgid "2.2-RELEASE"
+msgstr "2.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7479
+#, no-wrap
+msgid "2.2.1-RELEASE"
+msgstr "2.2.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7484
+#, no-wrap
+msgid "2.2-STABLE after 2.2.1-RELEASE"
+msgstr "2.2-STABLE после 2.2.1-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7485
+#, no-wrap
+msgid "221001"
+msgstr "221001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7486
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/24941[24941]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/24941[24941]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7487
+#, no-wrap
+msgid "April 15, 1997"
+msgstr "15 апреля 1997"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7489
+#, no-wrap
+msgid "2.2-STABLE after texinfo-3.9"
+msgstr "2.2-STABLE после texinfo-3.9"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7490
+#, no-wrap
+msgid "221002"
+msgstr "221002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7491
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/25325[25325]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/25325[25325]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7492
+#, no-wrap
+msgid "April 30, 1997"
+msgstr "30 апреля 1997"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7494
+#, no-wrap
+msgid "2.2-STABLE after top"
+msgstr "2.2-STABLE после обновления"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7495
+#, no-wrap
+msgid "222000"
+msgstr "222000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7496
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/25851[25851]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/25851[25851]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7497
+#, no-wrap
+msgid "May 16, 1997"
+msgstr "16 мая 1997"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7499
+#, no-wrap
+msgid "2.2.2-RELEASE"
+msgstr "2.2.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7500
+#, no-wrap
+msgid "222001"
+msgstr "222001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7501
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/25921[25921]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/25921[25921]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7502
+#, no-wrap
+msgid "May 19, 1997"
+msgstr "19 мая 1997"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7504
+#, no-wrap
+msgid "2.2-STABLE after 2.2.2-RELEASE"
+msgstr "2.2-STABLE после 2.2.2-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7505
+#, no-wrap
+msgid "225000"
+msgstr "225000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7506
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/30053[30053]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/30053[30053]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7507
+#, no-wrap
+msgid "October 2, 1997"
+msgstr "2 октября 1997"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7509
+#, no-wrap
+msgid "2.2.5-RELEASE"
+msgstr "2.2.5-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7510
+#, no-wrap
+msgid "225001"
+msgstr "225001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7511
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/31300[31300]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/31300[31300]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7512
+#, no-wrap
+msgid "November 20, 1997"
+msgstr "20 ноября 1997"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7514
+#, no-wrap
+msgid "2.2-STABLE after 2.2.5-RELEASE"
+msgstr "2.2-STABLE после 2.2.5-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7515
+#, no-wrap
+msgid "225002"
+msgstr "225002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7516
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/32019[32019]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/32019[32019]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7517
+#, no-wrap
+msgid "December 27, 1997"
+msgstr "27 декабря 1997"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7519
+#, no-wrap
+msgid "2.2-STABLE after ldconfig -R merge"
+msgstr "2.2-STABLE после слияния ldconfig -R"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7520
+#, no-wrap
+msgid "226000"
+msgstr "226000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7521
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/34445[34445]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/34445[34445]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7522
+#, no-wrap
+msgid "March 24, 1998"
+msgstr "24 марта 1998"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7524
+#, no-wrap
+msgid "2.2.6-RELEASE"
+msgstr "2.2.6-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7525
+#, no-wrap
+msgid "227000"
+msgstr "227000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7526
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/37803[37803]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/37803[37803]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7527
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7532
+#, no-wrap
+msgid "July 21, 1998"
+msgstr "21 июля 1998"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7529
+#, no-wrap
+msgid "2.2.7-RELEASE"
+msgstr "2.2.7-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7530
+#, no-wrap
+msgid "227001"
+msgstr "227001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7531
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/37809[37809]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/37809[37809]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7534
+#, no-wrap
+msgid "2.2-STABLE after 2.2.7-RELEASE"
+msgstr "2.2-STABLE после 2.2.7-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7535
+#, no-wrap
+msgid "227002"
+msgstr "227002"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7536
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/39489[39489]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/39489[39489]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7537
+#, no-wrap
+msgid "September 19, 1998"
+msgstr "19 сентября 1998"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7539
+#, no-wrap
+msgid "2.2-STABLE after man:semctl[2] change"
+msgstr "2.2-STABLE после изменения man:semctl[2]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7540
+#, no-wrap
+msgid "228000"
+msgstr "228000"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7541
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/41403[41403]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/41403[41403]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7542
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7547
+#, no-wrap
+msgid "November 29, 1998"
+msgstr "29 ноября 1998"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7544
+#, no-wrap
+msgid "2.2.8-RELEASE"
+msgstr "2.2.8-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7545
+#, no-wrap
+msgid "228001"
+msgstr "228001"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7546
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/41418[41418]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/41418[41418]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7548
+#, no-wrap
+msgid "2.2-STABLE after 2.2.8-RELEASE"
+msgstr "2.2-STABLE после 2.2.8-RELEASE"
+
+#. type: delimited block = 4
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7553
+msgid ""
+"Note that 2.2-STABLE sometimes identifies itself as \"2.2.5-STABLE\" after "
+"the 2.2.5-RELEASE. The pattern used to be year followed by the month, but "
+"the community decided to change it to a more straightforward major/minor "
+"system starting from 2.2. This is because the parallel development on "
+"several branches made it infeasible to classify the releases merely by their "
+"real release dates. Do not worry about old -CURRENTs; they are listed here "
+"just for reference."
+msgstr ""
+"Обратите внимание, что 2.2-STABLE иногда идентифицирует себя как \"2.2.5-"
+"STABLE\" после выпуска 2.2.5-RELEASE. Ранее использовался шаблон \"год-"
+"месяц\", но сообщество решило изменить его на более простую систему "
+"\"основной/второстепенный\", начиная с версии 2.2. Это связано с тем, что "
+"параллельная разработка нескольких веток сделала невозможным "
+"классифицировать выпуски только по датам их фактического выхода. Не "
+"беспокойтесь о старых версиях -CURRENT; они приведены здесь только для "
+"справки."
+
+#. type: Title ==
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7556
+#, no-wrap
+msgid "FreeBSD 2 Before 2.2-RELEASE Versions"
+msgstr "FreeBSD 2 Версии до 2.2-RELEASE"
+
+#. type: Block title
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7559
+#, no-wrap
+msgid "FreeBSD 2 Before 2.2-RELEASE `__FreeBSD_version` Values"
+msgstr "FreeBSD 2 До версии 2.2-RELEASE Значения `__FreeBSD_version`"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7568
+#, no-wrap
+msgid "119411"
+msgstr "119411"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7572
+#, no-wrap
+msgid "2.0-RELEASE"
+msgstr "2.0-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7573
+#, no-wrap
+msgid "199501"
+msgstr "199501"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7574
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/7153[7153]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/7153[7153]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7575
+#, no-wrap
+msgid "March 19, 1995"
+msgstr "19 марта 1995"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7577
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7582
+#, no-wrap
+msgid "2.1-CURRENT"
+msgstr "2.1-CURRENT"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7578
+#, no-wrap
+msgid "199503"
+msgstr "199503"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7579
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/7310[7310]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/7310[7310]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7580
+#, no-wrap
+msgid "March 24, 1995"
+msgstr "24 марта 1995"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7583
+#, no-wrap
+msgid "199504"
+msgstr "199504"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7584
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/7704[7704]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/7704[7704]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7585
+#, no-wrap
+msgid "April 9, 1995"
+msgstr "9 апреля 1995"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7587
+#, no-wrap
+msgid "2.0.5-RELEASE"
+msgstr "2.0.5-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7588
+#, no-wrap
+msgid "199508"
+msgstr "199508"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7589
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/10297[10297]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/10297[10297]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7590
+#, no-wrap
+msgid "August 26, 1995"
+msgstr "26 августа 1995"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7592
+#, no-wrap
+msgid "2.2-CURRENT before 2.1"
+msgstr "2.2-CURRENT до 2.1"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7593
+#, no-wrap
+msgid "199511"
+msgstr "199511"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7594
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/12189[12189]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/12189[12189]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7595
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7600
+#, no-wrap
+msgid "November 10, 1995"
+msgstr "10 ноября 1995"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7597
+#, no-wrap
+msgid "2.1.0-RELEASE"
+msgstr "2.1.0-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7598
+#, no-wrap
+msgid "199512"
+msgstr "199512"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7599
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/12196[12196]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/12196[12196]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7602
+#, no-wrap
+msgid "2.2-CURRENT before 2.1.5"
+msgstr "2.2-CURRENT до 2.1.5"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7603
+#, no-wrap
+msgid "199607"
+msgstr "199607"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7604
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/17067[17067]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/17067[17067]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7605
+#, no-wrap
+msgid "July 10, 1996"
+msgstr "10 июля 1996"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7607
+#, no-wrap
+msgid "2.1.5-RELEASE"
+msgstr "2.1.5-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7608
+#, no-wrap
+msgid "199608"
+msgstr "199608"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7609
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/17127[17127]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/17127[17127]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7610
+#, no-wrap
+msgid "July 12, 1996"
+msgstr "12 июля 1996"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7612
+#, no-wrap
+msgid "2.2-CURRENT before 2.1.6"
+msgstr "2.2-CURRENT до 2.1.6"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7613
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7618
+#, no-wrap
+msgid "199612"
+msgstr "199612"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7614
+#, no-wrap
+msgid "link:https://svnweb.freebsd.org/changeset/base/19358[19358]"
+msgstr "link:https://svnweb.freebsd.org/changeset/base/19358[19358]"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7615
+#, no-wrap
+msgid "November 15, 1996"
+msgstr "15 ноября 1996"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7617
+#, no-wrap
+msgid "2.1.6-RELEASE"
+msgstr "2.1.6-RELEASE"
+
+#. type: Table
+#: documentation/content/en/books/porters-handbook/versions/_index.adoc:7621
+#, no-wrap
+msgid "2.1.7-RELEASE"
+msgstr "2.1.7-RELEASE"
+
+#, no-wrap
+#~ msgid ""
+#~ "February 25, 2015\n"
+#~ "pass:[<!-- vale Vale.Terms = NO -->]"
+#~ msgstr ""
+#~ "25 февраля 2015 года\n"
+#~ "pass:[<!-- vale Vale.Terms = NO -->]"